From 7c5338972397eefccb640f1f727266a916584cfc Mon Sep 17 00:00:00 2001 From: Vamsi Sripathi Date: Fri, 23 Feb 2018 13:26:36 -0800 Subject: [PATCH 0001/8103] Enable TensorFlow to build with Intel MKL for optimal performance on CPU --- tools/bazel.rc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/bazel.rc b/tools/bazel.rc index 52a6241d651..137426c324b 100644 --- a/tools/bazel.rc +++ b/tools/bazel.rc @@ -18,3 +18,5 @@ build --define=grpc_no_ares=true # TODO(b/69809703): Remove once no longer required for TensorFlow to build. build --copt=-DGEMMLOWP_ALLOW_SLOW_SCALAR_FALLBACK + +build:mkl --define=using_mkl=true From 2285c7a8eccfe1cda34a4fecb9790895b908b3af Mon Sep 17 00:00:00 2001 From: Alex Glikson Date: Wed, 14 Mar 2018 13:16:03 -0400 Subject: [PATCH 0002/8103] Repo cloning and shell prompt in example readme - Added repo cloning instructions - Updated shell prompt to "$ ", so that syntax highlighting shows it correctly, and unified across the entire document --- tensorflow_serving/g3doc/serving_basic.md | 32 ++++++++++++++--------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/tensorflow_serving/g3doc/serving_basic.md b/tensorflow_serving/g3doc/serving_basic.md index 121bdee6eaa..4a4175a2f10 100644 --- a/tensorflow_serving/g3doc/serving_basic.md +++ b/tensorflow_serving/g3doc/serving_basic.md @@ -144,10 +144,18 @@ def structure and how to set up them up can be found [here](signature_defs.md). Let's run it! +First, if you haven't done so yet, clone this repository to your local machine: +```shell +$ git clone https://github.com/tensorflow/serving.git +Cloning into 'serving'... +[...] +$ cd serving +``` + Clear the export directory if it already exists: ```shell -$>rm -rf /tmp/mnist_model +$ rm -rf /tmp/mnist_model ``` If you would like to install the `tensorflow` and `tensorflow-serving-api` PIP @@ -162,8 +170,8 @@ both the Bazel and PIP options. Bazel: ```shell -$>bazel build -c opt //tensorflow_serving/example:mnist_saved_model -$>bazel-bin/tensorflow_serving/example/mnist_saved_model /tmp/mnist_model +$ bazel build -c opt //tensorflow_serving/example:mnist_saved_model +$ bazel-bin/tensorflow_serving/example/mnist_saved_model /tmp/mnist_model Training model... ... @@ -176,13 +184,13 @@ Done exporting! Or if you have `tensorflow-serving-api` installed, you can run: ```shell -python tensorflow_serving/example/mnist_saved_model.py /tmp/mnist_model +$ python tensorflow_serving/example/mnist_saved_model.py /tmp/mnist_model ``` Now let's take a look at the export directory. ```shell -$>ls /tmp/mnist_model +$ ls /tmp/mnist_model 1 ``` @@ -191,7 +199,7 @@ of the model. `FLAGS.model_version` has the default value of 1, therefore the corresponding sub-directory `1` is created. ```shell -$>ls /tmp/mnist_model/1 +$ ls /tmp/mnist_model/1 saved_model.pb variables ``` @@ -210,8 +218,8 @@ With that, your TensorFlow model is exported and ready to be loaded! If you'd like to use a locally compiled ModelServer, run the following: ```shell -$>bazel build -c opt //tensorflow_serving/model_servers:tensorflow_model_server -$>bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server --port=9000 --model_name=mnist --model_base_path=/tmp/mnist_model/ +$ bazel build -c opt //tensorflow_serving/model_servers:tensorflow_model_server +$ bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server --port=9000 --model_name=mnist --model_base_path=/tmp/mnist_model/ ``` If you'd prefer to skip compilation and install using apt-get, follow the @@ -219,7 +227,7 @@ If you'd prefer to skip compilation and install using apt-get, follow the the following command: ```shell -tensorflow_model_server --port=9000 --model_name=mnist --model_base_path=/tmp/mnist_model/ +$ tensorflow_model_server --port=9000 --model_name=mnist --model_base_path=/tmp/mnist_model/ ``` ## Test The Server @@ -232,8 +240,8 @@ requests to the server, and calculates the inference error rate. To run it with Bazel: ```shell -$>bazel build -c opt //tensorflow_serving/example:mnist_client -$>bazel-bin/tensorflow_serving/example/mnist_client --num_tests=1000 --server=localhost:9000 +$ bazel build -c opt //tensorflow_serving/example:mnist_client +$ bazel-bin/tensorflow_serving/example/mnist_client --num_tests=1000 --server=localhost:9000 ... Inference error rate: 10.5% ``` @@ -241,7 +249,7 @@ Inference error rate: 10.5% Alternatively if you installed the PIP package, run: ```shell -python tensorflow_serving/example/mnist_client.py --num_tests=1000 --server=localhost:9000 +$ python tensorflow_serving/example/mnist_client.py --num_tests=1000 --server=localhost:9000 ``` We expect around 91% accuracy for the trained Softmax model and we get From c4be2d546089f8e618c8041499f36dbd58e7fed7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 31 May 2018 18:16:31 -0400 Subject: [PATCH 0003/8103] Merged commit includes the following changes: 198788119 by gvasudevan: Fix formatting -- 198493504 by A. Unique TensorFlower: Add a java BUILD target for SessionService -- PiperOrigin-RevId: 198788119 --- tensorflow_serving/g3doc/api_rest.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/tensorflow_serving/g3doc/api_rest.md b/tensorflow_serving/g3doc/api_rest.md index 760f90c6af7..08bd9c0884e 100644 --- a/tensorflow_serving/g3doc/api_rest.md +++ b/tensorflow_serving/g3doc/api_rest.md @@ -36,7 +36,7 @@ details. In case of error, all APIs will return a JSON object in the response body with `error` as key and the error message as the value: -```json +```javascript { "error": } @@ -49,7 +49,7 @@ In case of error, all APIs will return a JSON object in the response body with The request body for the `classify` and `regress` APIs must be a JSON object formatted as follows: -```json +```javascript { // Optional: serving signature to use. // If unspecifed default serving signature is used. @@ -94,7 +94,7 @@ objects. A `classify` request returns a JSON object in the response body, formatted as follows: -```json +```javascript { "result": [ // List of class label/score pairs for first Example (in request) @@ -114,7 +114,7 @@ number. The `regress` request returns a JSON object in the response body, formatted as follows: -```json +```javascript { // One regression value for each example in the request in the same order. "result": [ , , , ...] @@ -132,7 +132,7 @@ Users of gRPC API will notice the similarity of this format with The request body for `predict` API must be JSON object formatted as follows: -```json +```javascript { // Optional: serving signature to use. // If unspecifed default serving signature is used. @@ -149,7 +149,7 @@ predict API](https://cloud.google.com/ml-engine/docs/v1/predict-request). When there is only one named input, the list items are expected to be scalars (number/string): -```json +```javascript { "instances": [ "foo", "bar", "baz" ] } @@ -157,7 +157,7 @@ When there is only one named input, the list items are expected to be scalars or lists of these primitive types. -```json +```javascript { // List of 2 tensors each of [1, 2] shape "instances": [ [[1, 2]], [[3, 4]] ] @@ -172,7 +172,7 @@ input name/tensor value pair, one for each named input. As an example, the following is a request with two instances, each with a set of three named input tensors: -```json +```javascript { "instances": [ { @@ -197,7 +197,7 @@ details on how to represent a binary (stream of bytes) value. The `predict` request returns a JSON object in response body, formatted as follows: -```json +```javascript { "predictions": [ |<(nested)list>|, ...] } @@ -232,7 +232,7 @@ JSON uses UTF-8 encoding. If you have input feature or tensor values that need to be binary (like image bytes), you *must* Base64 encode the data and encapsulate it in a JSON object having `b64` as the key as follows: -```json +```javascript { "b64": } ``` @@ -242,7 +242,7 @@ format is used to encode output response as well. A classification request with `image` (binary data) and `caption` features is shown below: -```json +```javascript { "signature_name": "classify_objects", "examples": [ @@ -269,7 +269,7 @@ values (e.g. 3.14, 1.0 etc.) these can have `NaN` and non-finite (`Infinity` and The REST API described on this page allows request/response JSON objects to have such values. This implies that requests like the following one are valid: -```json +```javascript { "example": [ { From f77debb104ea32d6421a779613d7378c18c4525d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 4 Jun 2018 14:59:14 -0400 Subject: [PATCH 0004/8103] Merged commit includes the following changes: 199170169 by A. Unique TensorFlower: Switch to tf_shared_lock in the read path of FastReadDynamicPtr. Effectively this change this should prioritize serving threads over loading threads at high load. -- PiperOrigin-RevId: 199170169 --- tensorflow_serving/util/fast_read_dynamic_ptr.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/util/fast_read_dynamic_ptr.h b/tensorflow_serving/util/fast_read_dynamic_ptr.h index cd4d62aff89..5ec0fc386ac 100644 --- a/tensorflow_serving/util/fast_read_dynamic_ptr.h +++ b/tensorflow_serving/util/fast_read_dynamic_ptr.h @@ -204,7 +204,7 @@ std::unique_ptr FastReadDynamicPtr::Update(std::unique_ptr object) { template typename FastReadDynamicPtr::ReadPtr FastReadDynamicPtr::get() const { - mutex_lock lock(mutex_); + tf_shared_lock lock(mutex_); return object_->reference(); } From 0ec8ffbb62237134fd9c782c9a88e77398ddae64 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 5 Jun 2018 01:27:09 -0400 Subject: [PATCH 0005/8103] Improved the shutdown logic; and added tests for clean shutdown. PiperOrigin-RevId: 199245142 --- .../model_servers/http_server.cc | 2 +- .../model_servers/http_server.h | 2 +- tensorflow_serving/util/net_http/client/BUILD | 2 + .../util/net_http/client/evhttp_connection.cc | 117 +++++++++++++----- .../util/net_http/client/evhttp_connection.h | 30 ++++- .../client/testing/evhttp_echo_client.cc | 4 +- .../util/net_http/server/internal/BUILD | 1 + .../net_http/server/internal/evhttp_request.h | 2 +- .../server/internal/evhttp_request_test.cc | 24 ++-- .../net_http/server/internal/evhttp_server.cc | 70 ++++++++--- .../net_http/server/internal/evhttp_server.h | 2 +- .../server/internal/evhttp_server_test.cc | 106 +++++++++++++--- .../net_http/server/internal/server_support.h | 2 +- .../util/net_http/server/public/BUILD | 4 +- .../util/net_http/server/public/httpserver.h | 2 +- ...rverinterface.h => httpserver_interface.h} | 12 +- ...interface.h => server_request_interface.h} | 8 +- .../server/testing/evhttp_echo_server.cc | 4 +- 18 files changed, 291 insertions(+), 103 deletions(-) rename tensorflow_serving/util/net_http/server/public/{httpserverinterface.h => httpserver_interface.h} (95%) rename tensorflow_serving/util/net_http/server/public/{serverrequestinterface.h => server_request_interface.h} (96%) diff --git a/tensorflow_serving/model_servers/http_server.cc b/tensorflow_serving/model_servers/http_server.cc index 0dfaa8b32d2..ad156fca7a9 100644 --- a/tensorflow_serving/model_servers/http_server.cc +++ b/tensorflow_serving/model_servers/http_server.cc @@ -25,7 +25,7 @@ limitations under the License. #include "tensorflow_serving/model_servers/server_core.h" #include "tensorflow_serving/util/net_http/server/public/httpserver.h" #include "tensorflow_serving/util/net_http/server/public/response_code_enum.h" -#include "tensorflow_serving/util/net_http/server/public/serverrequestinterface.h" +#include "tensorflow_serving/util/net_http/server/public/server_request_interface.h" #include "tensorflow_serving/util/threadpool_executor.h" namespace tensorflow { diff --git a/tensorflow_serving/model_servers/http_server.h b/tensorflow_serving/model_servers/http_server.h index daa337a76fb..5beea8a5d82 100644 --- a/tensorflow_serving/model_servers/http_server.h +++ b/tensorflow_serving/model_servers/http_server.h @@ -17,7 +17,7 @@ limitations under the License. #include -#include "tensorflow_serving/util/net_http/server/public/httpserverinterface.h" +#include "tensorflow_serving/util/net_http/server/public/httpserver_interface.h" namespace tensorflow { namespace serving { diff --git a/tensorflow_serving/util/net_http/client/BUILD b/tensorflow_serving/util/net_http/client/BUILD index e64c94c680c..8b3469cc103 100644 --- a/tensorflow_serving/util/net_http/client/BUILD +++ b/tensorflow_serving/util/net_http/client/BUILD @@ -18,8 +18,10 @@ cc_library( "evhttp_connection.h", ], deps = [ + "//tensorflow_serving/util/net_http/server/public:http_server_api", "@com_github_libevent_libevent//:libevent", "@com_google_absl//absl/base", "@com_google_absl//absl/strings", + "@com_google_absl//absl/synchronization", ], ) diff --git a/tensorflow_serving/util/net_http/client/evhttp_connection.cc b/tensorflow_serving/util/net_http/client/evhttp_connection.cc index 0d50ce23d36..3428964967c 100644 --- a/tensorflow_serving/util/net_http/client/evhttp_connection.cc +++ b/tensorflow_serving/util/net_http/client/evhttp_connection.cc @@ -25,14 +25,22 @@ namespace serving { namespace net_http { EvHTTPConnection::~EvHTTPConnection() { - if (evcon != nullptr) { - evhttp_connection_free(evcon); + if (evcon_ != nullptr) { + evhttp_connection_free(evcon_); } - if (http_uri != nullptr) { - evhttp_uri_free(http_uri); + if (http_uri_ != nullptr) { + evhttp_uri_free(http_uri_); } - event_base_free(ev_base); + event_base_free(ev_base_); +} + +// This needs be called with any async SendRequest() +void EvHTTPConnection::Terminate() { + event_base_loopexit(ev_base_, nullptr); + if (loop_exit_ != nullptr) { + loop_exit_->WaitForNotification(); + } } std::unique_ptr EvHTTPConnection::Connect( @@ -66,44 +74,35 @@ std::unique_ptr EvHTTPConnection::Connect( absl::string_view host, int port) { std::unique_ptr result(new EvHTTPConnection()); - result->ev_base = event_base_new(); - if (result->ev_base == nullptr) { + result->ev_base_ = event_base_new(); + if (result->ev_base_ == nullptr) { ABSL_RAW_LOG(ERROR, "Failed to connect : event_base_new()"); return nullptr; } // blocking call (DNS resolution) std::string host_str(host.data(), host.size()); - result->evcon = evhttp_connection_base_bufferevent_new( - result->ev_base, nullptr, nullptr, host_str.c_str(), + result->evcon_ = evhttp_connection_base_bufferevent_new( + result->ev_base_, nullptr, nullptr, host_str.c_str(), static_cast(port)); - if (result->evcon == nullptr) { + if (result->evcon_ == nullptr) { ABSL_RAW_LOG( ERROR, "Failed to connect : evhttp_connection_base_bufferevent_new()"); return nullptr; } - evhttp_connection_set_retries(result->evcon, 0); + evhttp_connection_set_retries(result->evcon_, 0); // TODO(wenboz): make this an option (default to 5s) - evhttp_connection_set_timeout(result->evcon, 5); + evhttp_connection_set_timeout(result->evcon_, 5); return result; } namespace { -void response_cb(struct evhttp_request* req, void* ctx) { - ClientResponse* response = reinterpret_cast(ctx); - - if (req == nullptr) { - // TODO(wenboz): make this a util and check safety - int errcode = EVUTIL_SOCKET_ERROR(); - ABSL_RAW_LOG(ERROR, "socket error = %s (%d)", - evutil_socket_error_to_string(errcode), errcode); - return; - } - +// Copy ev response data to ClientResponse. +void PopulateResponse(evhttp_request* req, ClientResponse* response) { response->status = evhttp_request_get_response_code(req); struct evkeyvalq* headers = evhttp_request_get_input_headers(req); @@ -150,18 +149,34 @@ evhttp_cmd_type GetMethodEnum(absl::string_view method, bool with_body) { } } -} // namespace +void ResponseDone(evhttp_request* req, void* ctx) { + ClientResponse* response = reinterpret_cast(ctx); -// Sends the request and has the connection closed -bool EvHTTPConnection::SendRequest(const ClientRequest& request, - ClientResponse* response) { - struct evhttp_request* req = evhttp_request_new(response_cb, response); if (req == nullptr) { + // TODO(wenboz): make this a util and check safety + int errcode = EVUTIL_SOCKET_ERROR(); + ABSL_RAW_LOG(ERROR, "socket error = %s (%d)", + evutil_socket_error_to_string(errcode), errcode); + return; + } + + PopulateResponse(req, response); + + if (response->done != nullptr) { + response->done(); + } +} + +// Returns false if there is any error. +bool GenerateEvRequest(evhttp_connection* evcon, const ClientRequest& request, + ClientResponse* response) { + evhttp_request* evreq = evhttp_request_new(ResponseDone, response); + if (evreq == nullptr) { ABSL_RAW_LOG(ERROR, "Failed to send request : evhttp_request_new()"); return false; } - struct evkeyvalq* output_headers = evhttp_request_get_output_headers(req); + evkeyvalq* output_headers = evhttp_request_get_output_headers(evreq); for (auto header : request.headers) { std::string key(header.first.data(), header.first.size()); std::string value(header.second.data(), header.second.size()); @@ -171,7 +186,7 @@ bool EvHTTPConnection::SendRequest(const ClientRequest& request, evhttp_add_header(output_headers, "Connection", "close"); if (!request.body.empty()) { - struct evbuffer* output_buffer = evhttp_request_get_output_buffer(req); + evbuffer* output_buffer = evhttp_request_get_output_buffer(evreq); std::string body(request.body.data(), request.body.size()); evbuffer_add(output_buffer, body.c_str(), request.body.size()); @@ -184,18 +199,56 @@ bool EvHTTPConnection::SendRequest(const ClientRequest& request, std::string uri(request.uri_path.data(), request.uri_path.size()); int r = evhttp_make_request( - evcon, req, GetMethodEnum(request.method, !request.body.empty()), + evcon, evreq, GetMethodEnum(request.method, !request.body.empty()), uri.c_str()); if (r != 0) { ABSL_RAW_LOG(ERROR, "evhttp_make_request() failed"); return false; } - event_base_dispatch(ev_base); + return true; +} + +} // namespace +// Sends the request and has the connection closed +bool EvHTTPConnection::BlockingSendRequest(const ClientRequest& request, + ClientResponse* response) { + if (!GenerateEvRequest(evcon_, request, response)) { + ABSL_RAW_LOG(ERROR, "Failed to generate the ev_request"); + return false; + } + + // inline loop blocking + event_base_dispatch(ev_base_); return true; } +bool EvHTTPConnection::SendRequest(const ClientRequest& request, + ClientResponse* response) { + if (this->executor_ == nullptr) { + ABSL_RAW_LOG(ERROR, "EventExecutor is not configured."); + return false; + } + + if (!GenerateEvRequest(evcon_, request, response)) { + ABSL_RAW_LOG(ERROR, "Failed to generate the ev_request"); + return false; + } + + executor_->Schedule([this]() { + loop_exit_.reset(new absl::Notification()); + event_base_dispatch(ev_base_); + loop_exit_->Notify(); + }); + + return true; +} + +void EvHTTPConnection::SetExecutor(std::unique_ptr executor) { + this->executor_ = std::move(executor); +} + } // namespace net_http } // namespace serving } // namespace tensorflow diff --git a/tensorflow_serving/util/net_http/client/evhttp_connection.h b/tensorflow_serving/util/net_http/client/evhttp_connection.h index 6f44b726af1..2243cc8d079 100644 --- a/tensorflow_serving/util/net_http/client/evhttp_connection.h +++ b/tensorflow_serving/util/net_http/client/evhttp_connection.h @@ -18,12 +18,14 @@ limitations under the License. #ifndef TENSORFLOW_SERVING_UTIL_NET_HTTP_CLIENT_EVHTTP_CONNECTION_H_ #define TENSORFLOW_SERVING_UTIL_NET_HTTP_CLIENT_EVHTTP_CONNECTION_H_ +#include #include #include #include #include #include "absl/strings/string_view.h" +#include "absl/synchronization/notification.h" #include "libevent/include/event2/buffer.h" #include "libevent/include/event2/bufferevent.h" @@ -32,6 +34,9 @@ limitations under the License. #include "libevent/include/event2/keyvalq_struct.h" #include "libevent/include/event2/util.h" +// TODO(wenboz): move EventExecutor to net_http/common +#include "tensorflow_serving/util/net_http/server/public/httpserver_interface.h" + namespace tensorflow { namespace serving { namespace net_http { @@ -55,6 +60,8 @@ struct ClientResponse { int status = 0; std::vector headers; std::string body; + + std::function done; // callback }; class EvHTTPConnection final { @@ -64,6 +71,9 @@ class EvHTTPConnection final { EvHTTPConnection(const EvHTTPConnection& other) = delete; EvHTTPConnection& operator=(const EvHTTPConnection& other) = delete; + // Terminates the connection. + void Terminate(); + // Returns a new connection given an absolute URL. // Always treat the URL scheme as "http" for now. // Returns nullptr if any error @@ -83,14 +93,28 @@ class EvHTTPConnection final { // Sends a request and blocks the caller till a response is received // or any error has happened. // Returns false if any error. + bool BlockingSendRequest(const ClientRequest& request, + ClientResponse* response); + + // Sends a request and returns immediately. The response will be handled + // asynchronously via the response->done callback. + // Returns false if any error in sending the request, or if the executor + // has not been configured. bool SendRequest(const ClientRequest& request, ClientResponse* response); + // Sets the executor for processing requests asynchronously. + void SetExecutor(std::unique_ptr executor); + private: EvHTTPConnection() = default; - struct event_base* ev_base; - struct evhttp_uri* http_uri; - struct evhttp_connection* evcon; + struct event_base* ev_base_; + struct evhttp_uri* http_uri_; + struct evhttp_connection* evcon_; + + std::unique_ptr executor_; + + std::unique_ptr loop_exit_; }; } // namespace net_http diff --git a/tensorflow_serving/util/net_http/client/testing/evhttp_echo_client.cc b/tensorflow_serving/util/net_http/client/testing/evhttp_echo_client.cc index 3fe804ce93e..a6846acbdc7 100644 --- a/tensorflow_serving/util/net_http/client/testing/evhttp_echo_client.cc +++ b/tensorflow_serving/util/net_http/client/testing/evhttp_echo_client.cc @@ -33,9 +33,9 @@ bool SendRequest(const char* url) { } ClientRequest request = {url, "GET", {}, nullptr}; - ClientResponse response; + ClientResponse response = {}; - if (!connection->SendRequest(request, &response)) { + if (!connection->BlockingSendRequest(request, &response)) { std::cerr << "Request failed."; return false; } diff --git a/tensorflow_serving/util/net_http/server/internal/BUILD b/tensorflow_serving/util/net_http/server/internal/BUILD index 835a1569fcb..36e12bde3c0 100644 --- a/tensorflow_serving/util/net_http/server/internal/BUILD +++ b/tensorflow_serving/util/net_http/server/internal/BUILD @@ -41,6 +41,7 @@ cc_test( "//tensorflow_serving/util/net_http/server/public:http_server", "//tensorflow_serving/util/net_http/server/public:http_server_api", "@com_google_absl//absl/memory", + "@com_google_absl//absl/synchronization", "@com_google_absl//absl/synchronization:thread_pool", ], ) diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_request.h b/tensorflow_serving/util/net_http/server/internal/evhttp_request.h index 96789103f31..7132ff1d450 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_request.h +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_request.h @@ -22,7 +22,7 @@ limitations under the License. #include #include "tensorflow_serving/util/net_http/server/internal/server_support.h" -#include "tensorflow_serving/util/net_http/server/public/serverrequestinterface.h" +#include "tensorflow_serving/util/net_http/server/public/server_request_interface.h" struct evbuffer; struct evhttp_request; diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_request_test.cc b/tensorflow_serving/util/net_http/server/internal/evhttp_request_test.cc index cb5e3ece18e..8da6b7f5d61 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_request_test.cc +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_request_test.cc @@ -25,8 +25,8 @@ limitations under the License. #include "tensorflow_serving/util/net_http/client/evhttp_connection.h" #include "tensorflow_serving/util/net_http/server/public/httpserver.h" -#include "tensorflow_serving/util/net_http/server/public/httpserverinterface.h" -#include "tensorflow_serving/util/net_http/server/public/serverrequestinterface.h" +#include "tensorflow_serving/util/net_http/server/public/httpserver_interface.h" +#include "tensorflow_serving/util/net_http/server/public/server_request_interface.h" namespace tensorflow { namespace serving { @@ -80,9 +80,9 @@ TEST_F(EvHTTPRequestTest, SimpleGETNotFound) { ASSERT_TRUE(connection != nullptr); ClientRequest request = {"/noop", "GET", {}, nullptr}; - ClientResponse response; + ClientResponse response = {}; - EXPECT_TRUE(connection->SendRequest(request, &response)); + EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); EXPECT_EQ(response.status, 404); EXPECT_FALSE(response.body.empty()); @@ -105,9 +105,9 @@ TEST_F(EvHTTPRequestTest, SimpleGETOK) { ASSERT_TRUE(connection != nullptr); ClientRequest request = {"/ok", "GET", {}, nullptr}; - ClientResponse response; + ClientResponse response = {}; - EXPECT_TRUE(connection->SendRequest(request, &response)); + EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); EXPECT_EQ(response.status, 200); EXPECT_EQ(response.body, "OK"); @@ -135,9 +135,9 @@ TEST_F(EvHTTPRequestTest, SimplePOST) { ASSERT_TRUE(connection != nullptr); ClientRequest request = {"/ok", "POST", {}, "abcde"}; - ClientResponse response; + ClientResponse response = {}; - EXPECT_TRUE(connection->SendRequest(request, &response)); + EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); EXPECT_EQ(response.status, 200); EXPECT_EQ(response.body, "abcde"); @@ -168,9 +168,9 @@ TEST_F(EvHTTPRequestTest, RequestHeaders) { {ClientRequest::HeaderKeyValue("H1", "v1"), ClientRequest::HeaderKeyValue("H2", "v2")}, nullptr}; - ClientResponse response; + ClientResponse response = {}; - EXPECT_TRUE(connection->SendRequest(request, &response)); + EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); EXPECT_EQ(response.status, 200); EXPECT_EQ(response.body, "OK"); @@ -196,9 +196,9 @@ TEST_F(EvHTTPRequestTest, ResponseHeaders) { ASSERT_TRUE(connection != nullptr); ClientRequest request = {"/ok", "GET", {}, nullptr}; - ClientResponse response; + ClientResponse response = {}; - EXPECT_TRUE(connection->SendRequest(request, &response)); + EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); for (auto keyvalue : response.headers) { if (keyvalue.first == "H1") { EXPECT_EQ(keyvalue.second, "V1"); diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc b/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc index 7c21c7d8ea6..0adb19b9228 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc @@ -218,25 +218,22 @@ bool EvHTTPServer::StartAcceptingRequests() { return false; } + IncOps(); + port_ = port; if (port_ == 0) { ResolveEphemeralPort(ev_listener_, &port_); } + IncOps(); server_options_->executor()->Schedule([this]() { - // This may race with event_base_loopexit if terminate() - // is called concurrently; and may block even after terminate() is called. - // This is to be addressed with a more rigid shutdown routine which - // will close all incoming connections after listener is deleted. ABSL_RAW_LOG(INFO, "Entering the event loop ..."); int result = event_base_dispatch(ev_base_); ABSL_RAW_LOG(INFO, "event_base_dispatch() exits with value %d", result); - DecOps(); // Unblock ~ctor + DecOps(); }); - IncOps(); - accepting_requests_.Notify(); return true; @@ -261,11 +258,13 @@ void EvHTTPServer::Terminate() { terminating_.Notify(); - // stop the listener first, which will delete ev_listener_ - evhttp_del_accept_socket(ev_http_, ev_listener_); - - int result = event_base_loopexit(ev_base_, nullptr); - ABSL_RAW_LOG(INFO, "event_base_loopexit() exits with value %d", result); + // call exit-loop from the event loop + this->EventLoopSchedule([this]() { + // Stop the listener first, which will delete ev_listener_ + // This may cause the loop to exit, so need be scheduled from within + evhttp_del_accept_socket(ev_http_, ev_listener_); + DecOps(); + }); // Current shut-down behavior: // - we don't proactively delete/close any HTTP connections as part of @@ -290,17 +289,48 @@ void EvHTTPServer::DecOps() { } void EvHTTPServer::WaitForTermination() { - absl::MutexLock l(&ops_mu_); - ops_mu_.Await(absl::Condition(+[](int64_t* count) { return *count == 0; }, - &num_pending_ops_)); + { + absl::MutexLock l(&ops_mu_); + ops_mu_.Await(absl::Condition(+[](int64_t* count) { return *count <= 1; }, + &num_pending_ops_)); + } + + int result = event_base_loopexit(ev_base_, nullptr); + ABSL_RAW_LOG(INFO, "event_base_loopexit() exits with value %d", result); + + { + absl::MutexLock l(&ops_mu_); + ops_mu_.Await(absl::Condition(+[](int64_t* count) { return *count == 0; }, + &num_pending_ops_)); + } } bool EvHTTPServer::WaitForTerminationWithTimeout(absl::Duration timeout) { - absl::MutexLock l(&ops_mu_); - return ops_mu_.AwaitWithTimeout( - absl::Condition(+[](int64_t* count) { return *count == 0; }, - &num_pending_ops_), - timeout); + bool wait_result = true; + + { + absl::MutexLock l(&ops_mu_); + wait_result = ops_mu_.AwaitWithTimeout( + absl::Condition(+[](int64_t* count) { return *count <= 1; }, + &num_pending_ops_), + timeout); + } + + if (wait_result) { + int result = event_base_loopexit(ev_base_, nullptr); + ABSL_RAW_LOG(INFO, "event_base_loopexit() exits with value %d", result); + + // This should pass immediately + { + absl::MutexLock l(&ops_mu_); + wait_result = ops_mu_.AwaitWithTimeout( + absl::Condition(+[](int64_t* count) { return *count == 0; }, + &num_pending_ops_), + timeout); + } + } + + return wait_result; } EvHTTPServer::UriHandlerInfo::UriHandlerInfo( diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_server.h b/tensorflow_serving/util/net_http/server/internal/evhttp_server.h index f5a0d13acaf..bc9d43d2f95 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_server.h +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_server.h @@ -31,7 +31,7 @@ limitations under the License. #include "tensorflow_serving/util/net_http/server/internal/evhttp_request.h" #include "tensorflow_serving/util/net_http/server/internal/server_support.h" -#include "tensorflow_serving/util/net_http/server/public/httpserverinterface.h" +#include "tensorflow_serving/util/net_http/server/public/httpserver_interface.h" struct event_base; struct evhttp; diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_server_test.cc b/tensorflow_serving/util/net_http/server/internal/evhttp_server_test.cc index a1194cabbea..06015bca985 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_server_test.cc +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_server_test.cc @@ -21,11 +21,12 @@ limitations under the License. #include "absl/memory/memory.h" #include "absl/synchronization/internal/thread_pool.h" +#include "absl/synchronization/notification.h" #include "tensorflow_serving/util/net_http/client/evhttp_connection.h" #include "tensorflow_serving/util/net_http/server/public/httpserver.h" -#include "tensorflow_serving/util/net_http/server/public/httpserverinterface.h" -#include "tensorflow_serving/util/net_http/server/public/serverrequestinterface.h" +#include "tensorflow_serving/util/net_http/server/public/httpserver_interface.h" +#include "tensorflow_serving/util/net_http/server/public/server_request_interface.h" namespace tensorflow { namespace serving { @@ -97,9 +98,9 @@ TEST_F(EvHTTPServerTest, ExactPathMatching) { ASSERT_TRUE(connection != nullptr); ClientRequest request = {"/ok?a=foo", "GET", {}, nullptr}; - ClientResponse response; + ClientResponse response = {}; - EXPECT_TRUE(connection->SendRequest(request, &response)); + EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); EXPECT_EQ(response.status, 200); EXPECT_EQ(response.body, "OK"); @@ -107,7 +108,7 @@ TEST_F(EvHTTPServerTest, ExactPathMatching) { request = {"/ok/", "GET", {}, nullptr}; response = {}; - EXPECT_TRUE(connection->SendRequest(request, &response)); + EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); EXPECT_EQ(response.status, 404); server->Terminate(); @@ -136,9 +137,9 @@ TEST_F(EvHTTPServerTest, RequestHandlerOverwriting) { ASSERT_TRUE(connection != nullptr); ClientRequest request = {"/ok", "GET", {}, nullptr}; - ClientResponse response; + ClientResponse response = {}; - EXPECT_TRUE(connection->SendRequest(request, &response)); + EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); EXPECT_EQ(response.status, 200); EXPECT_EQ(response.body, "OK2"); @@ -166,9 +167,9 @@ TEST_F(EvHTTPServerTest, SingleRequestDispather) { ASSERT_TRUE(connection != nullptr); ClientRequest request = {"/ok", "GET", {}, nullptr}; - ClientResponse response; + ClientResponse response = {}; - EXPECT_TRUE(connection->SendRequest(request, &response)); + EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); EXPECT_EQ(response.status, 200); EXPECT_EQ(response.body, "OK"); @@ -204,16 +205,16 @@ TEST_F(EvHTTPServerTest, UriPrecedesOverRequestDispather) { ASSERT_TRUE(connection != nullptr); ClientRequest request = {"/ok", "GET", {}, nullptr}; - ClientResponse response; + ClientResponse response = {}; - EXPECT_TRUE(connection->SendRequest(request, &response)); + EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); EXPECT_EQ(response.status, 200); EXPECT_EQ(response.body, "OK1"); request = {"/okxx", "GET", {}, nullptr}; response = {}; - EXPECT_TRUE(connection->SendRequest(request, &response)); + EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); EXPECT_EQ(response.status, 200); EXPECT_EQ(response.body, "OK2"); @@ -249,17 +250,94 @@ TEST_F(EvHTTPServerTest, InOrderRequestDispather) { ASSERT_TRUE(connection != nullptr); ClientRequest request = {"/ok", "GET", {}, nullptr}; - ClientResponse response; + ClientResponse response = {}; + + EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); + EXPECT_EQ(response.status, 200); + EXPECT_EQ(response.body, "OK1"); + + server->Terminate(); + server->WaitForTermination(); +} + +// Test handler interaction +TEST_F(EvHTTPServerTest, RequestHandlerInteraction) { + absl::Notification handler1_start; + auto handler1 = [&handler1_start](ServerRequestInterface* request) { + handler1_start.WaitForNotification(); + request->WriteResponseString("OK1"); + request->Reply(); + }; + + server->RegisterRequestHandler("/ok", std::move(handler1), + RequestHandlerOptions()); + + server->StartAcceptingRequests(); + + auto connection = + EvHTTPConnection::Connect("localhost", server->listen_port()); + ASSERT_TRUE(connection != nullptr); + connection->SetExecutor(absl::make_unique(4)); + + absl::Notification response_done; + ClientRequest request = {"/ok", "GET", {}, nullptr}; + ClientResponse response = {}; + response.done = [&response_done]() { response_done.Notify(); }; EXPECT_TRUE(connection->SendRequest(request, &response)); + EXPECT_FALSE( + response_done.WaitForNotificationWithTimeout(absl::Milliseconds(50))); + + handler1_start.Notify(); + response_done.WaitForNotification(); + EXPECT_EQ(response.status, 200); EXPECT_EQ(response.body, "OK1"); + connection->Terminate(); + server->Terminate(); server->WaitForTermination(); } -// TODO(wenboz): More tests on clean shutdown +// Test active-request count during shutdown +TEST_F(EvHTTPServerTest, ActiveRequestCountInShutdown) { + absl::Notification handler_enter; + absl::Notification handler_start; + auto handler = [&handler_enter, + &handler_start](ServerRequestInterface* request) { + handler_enter.Notify(); + handler_start.WaitForNotification(); + request->WriteResponseString("OK1"); + request->Reply(); + }; + + server->RegisterRequestHandler("/ok", std::move(handler), + RequestHandlerOptions()); + + server->StartAcceptingRequests(); + + auto connection = + EvHTTPConnection::Connect("localhost", server->listen_port()); + ASSERT_TRUE(connection != nullptr); + connection->SetExecutor(absl::make_unique(4)); + + ClientRequest request = {"/ok", "GET", {}, nullptr}; + ClientResponse response = {}; + + EXPECT_TRUE(connection->SendRequest(request, &response)); + handler_enter.WaitForNotification(); + + server->Terminate(); + EXPECT_FALSE(server->WaitForTerminationWithTimeout(absl::Milliseconds(50))); + + handler_start.Notify(); + EXPECT_TRUE(server->WaitForTerminationWithTimeout(absl::Milliseconds(5000))); + + connection->Terminate(); + + // response.status etc are undefined as the server is terminated +} } // namespace } // namespace net_http diff --git a/tensorflow_serving/util/net_http/server/internal/server_support.h b/tensorflow_serving/util/net_http/server/internal/server_support.h index 35092a2525d..6ccc1145d3e 100644 --- a/tensorflow_serving/util/net_http/server/internal/server_support.h +++ b/tensorflow_serving/util/net_http/server/internal/server_support.h @@ -22,7 +22,7 @@ limitations under the License. #include -#include "tensorflow_serving/util/net_http/server/public/serverrequestinterface.h" +#include "tensorflow_serving/util/net_http/server/public/server_request_interface.h" namespace tensorflow { namespace serving { diff --git a/tensorflow_serving/util/net_http/server/public/BUILD b/tensorflow_serving/util/net_http/server/public/BUILD index 895d9072de5..faa1d0f3b47 100644 --- a/tensorflow_serving/util/net_http/server/public/BUILD +++ b/tensorflow_serving/util/net_http/server/public/BUILD @@ -12,9 +12,9 @@ licenses(["notice"]) # Apache 2.0 cc_library( name = "http_server_api", hdrs = [ - "httpserverinterface.h", + "httpserver_interface.h", "response_code_enum.h", - "serverrequestinterface.h", + "server_request_interface.h", ], deps = [ "@com_google_absl//absl/strings", diff --git a/tensorflow_serving/util/net_http/server/public/httpserver.h b/tensorflow_serving/util/net_http/server/public/httpserver.h index a601f3d1a4b..bd485971539 100644 --- a/tensorflow_serving/util/net_http/server/public/httpserver.h +++ b/tensorflow_serving/util/net_http/server/public/httpserver.h @@ -24,7 +24,7 @@ limitations under the License. #include "absl/memory/memory.h" #include "tensorflow_serving/util/net_http/server/internal/evhttp_server.h" -#include "tensorflow_serving/util/net_http/server/public/httpserverinterface.h" +#include "tensorflow_serving/util/net_http/server/public/httpserver_interface.h" namespace tensorflow { namespace serving { diff --git a/tensorflow_serving/util/net_http/server/public/httpserverinterface.h b/tensorflow_serving/util/net_http/server/public/httpserver_interface.h similarity index 95% rename from tensorflow_serving/util/net_http/server/public/httpserverinterface.h rename to tensorflow_serving/util/net_http/server/public/httpserver_interface.h index 674b82b3fdb..5ddcd8a29b3 100644 --- a/tensorflow_serving/util/net_http/server/public/httpserverinterface.h +++ b/tensorflow_serving/util/net_http/server/public/httpserver_interface.h @@ -15,8 +15,8 @@ limitations under the License. // APIs for the HTTP server. -#ifndef TENSORFLOW_SERVING_UTIL_NET_HTTP_SERVER_PUBLIC_HTTPSERVERINTERFACE_H_ -#define TENSORFLOW_SERVING_UTIL_NET_HTTP_SERVER_PUBLIC_HTTPSERVERINTERFACE_H_ +#ifndef TENSORFLOW_SERVING_UTIL_NET_HTTP_SERVER_PUBLIC_HTTPSERVER_INTERFACE_H_ +#define TENSORFLOW_SERVING_UTIL_NET_HTTP_SERVER_PUBLIC_HTTPSERVER_INTERFACE_H_ #include @@ -27,14 +27,13 @@ limitations under the License. #include "absl/strings/string_view.h" #include "absl/time/time.h" -#include "tensorflow_serving/util/net_http/server/public/serverrequestinterface.h" +#include "tensorflow_serving/util/net_http/server/public/server_request_interface.h" namespace tensorflow { namespace serving { namespace net_http { -// A strictly non-blocking executor for processing I/O polling or callback -// events. +// A non-blocking executor for processing I/O polling or callback events. class EventExecutor { public: virtual ~EventExecutor() = default; @@ -56,6 +55,7 @@ class ServerOptions { ServerOptions() = default; // At least one port has to be configured. + // Port 0 will start the server using an ephemeral port. void AddPort(int port) { assert(port >= 0); ports_.emplace_back(port); @@ -173,4 +173,4 @@ class HTTPServerInterface { } // namespace serving } // namespace tensorflow -#endif // TENSORFLOW_SERVING_UTIL_NET_HTTP_SERVER_PUBLIC_HTTPSERVERINTERFACE_H_ +#endif // TENSORFLOW_SERVING_UTIL_NET_HTTP_SERVER_PUBLIC_HTTPSERVER_INTERFACE_H_ diff --git a/tensorflow_serving/util/net_http/server/public/serverrequestinterface.h b/tensorflow_serving/util/net_http/server/public/server_request_interface.h similarity index 96% rename from tensorflow_serving/util/net_http/server/public/serverrequestinterface.h rename to tensorflow_serving/util/net_http/server/public/server_request_interface.h index 12d9f69ba98..9fd0c125f1f 100644 --- a/tensorflow_serving/util/net_http/server/public/serverrequestinterface.h +++ b/tensorflow_serving/util/net_http/server/public/server_request_interface.h @@ -24,11 +24,11 @@ limitations under the License. // Streamed request/response APIs are to be added, which will introduce // additional API contract wrt the threading semantics. -#ifndef TENSORFLOW_SERVING_UTIL_NET_HTTP_SERVER_PUBLIC_SERVERREQUESTINTERFACE_H_ -#define TENSORFLOW_SERVING_UTIL_NET_HTTP_SERVER_PUBLIC_SERVERREQUESTINTERFACE_H_ +#ifndef TENSORFLOW_SERVING_UTIL_NET_HTTP_SERVER_PUBLIC_SERVER_REQUEST_INTERFACE_H_ +#define TENSORFLOW_SERVING_UTIL_NET_HTTP_SERVER_PUBLIC_SERVER_REQUEST_INTERFACE_H_ -#include #include + #include #include @@ -160,4 +160,4 @@ inline void SetContentTypeTEXT(ServerRequestInterface* request) { } // namespace serving } // namespace tensorflow -#endif // TENSORFLOW_SERVING_UTIL_NET_HTTP_SERVER_PUBLIC_SERVERREQUESTINTERFACE_H_ +#endif // TENSORFLOW_SERVING_UTIL_NET_HTTP_SERVER_PUBLIC_SERVER_REQUEST_INTERFACE_H_ diff --git a/tensorflow_serving/util/net_http/server/testing/evhttp_echo_server.cc b/tensorflow_serving/util/net_http/server/testing/evhttp_echo_server.cc index d07f6bd0bdd..bb0ba69ba56 100644 --- a/tensorflow_serving/util/net_http/server/testing/evhttp_echo_server.cc +++ b/tensorflow_serving/util/net_http/server/testing/evhttp_echo_server.cc @@ -30,8 +30,8 @@ limitations under the License. #include "absl/strings/string_view.h" #include "tensorflow_serving/util/net_http/server/public/httpserver.h" -#include "tensorflow_serving/util/net_http/server/public/httpserverinterface.h" -#include "tensorflow_serving/util/net_http/server/public/serverrequestinterface.h" +#include "tensorflow_serving/util/net_http/server/public/httpserver_interface.h" +#include "tensorflow_serving/util/net_http/server/public/server_request_interface.h" namespace { From daea4ec4892af0b54f29a81be7ebadf835af0ad5 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Tue, 5 Jun 2018 11:57:12 -0400 Subject: [PATCH 0006/8103] Fixes for https://github.com/tensorflow/serving/issues/906 - Set Bazel min ver to 0.10.0 (matches with TensorFlow). - Add additional pkgs to Docker images to fix broken build. PiperOrigin-RevId: 199304103 --- WORKSPACE | 2 +- tensorflow_serving/tools/docker/Dockerfile.devel | 4 +++- tensorflow_serving/tools/docker/Dockerfile.devel-gpu | 4 +++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 92cc0330b5a..98dc1ffff61 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -35,4 +35,4 @@ tf_serving_workspace() # Specify the minimum required bazel version. load("@org_tensorflow//tensorflow:version_check.bzl", "check_bazel_version_at_least") -check_bazel_version_at_least("0.5.4") +check_bazel_version_at_least("0.10.0") diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index eed44caa601..cecd18d61e1 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -3,11 +3,13 @@ FROM ubuntu:16.04 MAINTAINER Jeremiah Harmsen RUN apt-get update && apt-get install -y \ + automake \ build-essential \ curl \ git \ libfreetype6-dev \ libpng12-dev \ + libtool \ libzmq3-dev \ mlocate \ pkg-config \ @@ -34,7 +36,7 @@ RUN pip install mock grpcio ENV BAZELRC /root/.bazelrc # Install the most recent bazel release. -ENV BAZEL_VERSION 0.5.4 +ENV BAZEL_VERSION 0.10.0 WORKDIR / RUN mkdir /bazel && \ cd /bazel && \ diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 9e8d680411d..70113c8bdad 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -1,11 +1,13 @@ FROM nvidia/cuda:8.0-cudnn6-devel-ubuntu16.04 RUN apt-get update && apt-get install -y \ + automake \ build-essential \ curl \ git \ libfreetype6-dev \ libpng12-dev \ + libtool \ libzmq3-dev \ pkg-config \ python-dev \ @@ -56,7 +58,7 @@ RUN echo "build --spawn_strategy=standalone --genrule_strategy=standalone" \ >>/root/.bazelrc ENV BAZELRC /root/.bazelrc # Install the most recent bazel release. -ENV BAZEL_VERSION 0.5.4 +ENV BAZEL_VERSION 0.10.0 WORKDIR / RUN mkdir /bazel && \ cd /bazel && \ From f9f4faa190e3b013d66bb691ccaf8c88b8f3e5f7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 5 Jun 2018 13:44:56 -0400 Subject: [PATCH 0007/8103] Support ipv4-only hosts. Fixes https://github.com/tensorflow/serving/issues/912 PiperOrigin-RevId: 199321359 --- .../net_http/server/internal/evhttp_server.cc | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc b/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc index 0adb19b9228..f2f7770b7d3 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc @@ -210,14 +210,19 @@ bool EvHTTPServer::StartAcceptingRequests() { const int port = server_options_->ports().front(); - ev_listener_ = evhttp_bind_socket_with_handle(ev_http_, - "::", // in6addr_any - static_cast(port)); + // "::" => in6addr_any + ev_uint16_t ev_port = static_cast(port); + ev_listener_ = evhttp_bind_socket_with_handle(ev_http_, "::", ev_port); if (ev_listener_ == nullptr) { - ABSL_RAW_LOG(FATAL, "Couldn't bind to port %d", port); - return false; + // in case ipv6 is not supported, fallback to inaddr_any + ev_listener_ = evhttp_bind_socket_with_handle(ev_http_, nullptr, ev_port); + if (ev_listener_ == nullptr) { + ABSL_RAW_LOG(FATAL, "Couldn't bind to port %d", port); + return false; + } } + // Listener counts as an active operation IncOps(); port_ = port; From 4b2f5f4c0697a8b8e2b9e06499055b47ae4d462b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 6 Jun 2018 19:24:49 -0400 Subject: [PATCH 0008/8103] Merged commit includes the following changes: 199550237 by awk: Add tests for REST API calls in model server integration test. -- 199541089 by yifeif: Internal changes. -- PiperOrigin-RevId: 199550237 --- .../tensorflow_model_server_test.py | 96 ++++++++++++++++++- 1 file changed, 93 insertions(+), 3 deletions(-) diff --git a/tensorflow_serving/model_servers/tensorflow_model_server_test.py b/tensorflow_serving/model_servers/tensorflow_model_server_test.py index a81c7d9b3ac..d64460389b9 100644 --- a/tensorflow_serving/model_servers/tensorflow_model_server_test.py +++ b/tensorflow_serving/model_servers/tensorflow_model_server_test.py @@ -17,12 +17,14 @@ """Tests for tensorflow_model_server.""" import atexit +import json import os import shlex import socket import subprocess import sys import time +import urllib2 # This is a placeholder for a Google-internal import. @@ -34,18 +36,19 @@ from tensorflow.core.framework import types_pb2 from tensorflow.python.platform import flags +from tensorflow.python.saved_model import signature_constants from tensorflow_serving.apis import classification_pb2 from tensorflow_serving.apis import get_model_status_pb2 +from tensorflow_serving.apis import inference_pb2 from tensorflow_serving.apis import model_service_pb2_grpc from tensorflow_serving.apis import predict_pb2 from tensorflow_serving.apis import prediction_service_pb2 from tensorflow_serving.apis import regression_pb2 -from tensorflow_serving.apis import inference_pb2 -from tensorflow.python.saved_model import signature_constants FLAGS = flags.FLAGS RPC_TIMEOUT = 5.0 +HTTP_REST_TIMEOUT_MS = 5000 CHANNEL_WAIT_TIMEOUT = 5.0 WAIT_FOR_SERVER_READY_INT_SECS = 60 @@ -77,6 +80,16 @@ def WaitForServerReady(port): break +def CallREST(name, url, req): + """Returns HTTP response body from a REST API call.""" + print 'Sending {} request to {} with data:\n{}'.format(name, url, req) + resp = urllib2.urlopen(urllib2.Request(url, data=json.dumps(req))) + resp_data = resp.read() + print 'Received response:\n{}'.format(resp_data) + resp.close() + return resp_data + + class TensorflowModelServerTest(tf.test.TestCase): """This class defines integration test cases for tensorflow_model_server.""" @@ -123,7 +136,8 @@ def RunServer(self, model_path, batching_parameters_file='', grpc_channel_arguments='', - wait_for_server_ready=True): + wait_for_server_ready=True, + rest_api_port=None): """Run tensorflow_model_server using test config.""" print 'Starting test server...' command = os.path.join(self.binary_dir, 'tensorflow_model_server') @@ -135,6 +149,9 @@ def RunServer(self, command += ' --batching_parameters_file=' + batching_parameters_file if grpc_channel_arguments: command += ' --grpc_channel_arguments=' + grpc_channel_arguments + if rest_api_port: + command += ' --rest_api_port=' + str(rest_api_port) + command += ' --rest_api_timeout_in_ms=' + str(HTTP_REST_TIMEOUT_MS) print command self.server_proc = subprocess.Popen(shlex.split(command)) print 'Server started' @@ -500,5 +517,78 @@ def testGoodGrpcChannelArgs(self): expected_version=self._GetModelVersion( self._GetSavedModelHalfPlusThreePath())) + def testClassifyREST(self): + """Test Classify implementation over REST API.""" + model_path = self._GetSavedModelBundlePath() + + atexit.register(self.TerminateProcs) + rest_api_port = PickUnusedPort() + model_server_address = self.RunServer( + PickUnusedPort(), 'default', model_path, rest_api_port=rest_api_port) + + # Prepare request + url = 'http://{}:{}/v1/models/default:classify'.format( + model_server_address.split(':')[0], rest_api_port) + json_req = {'signature_name': 'classify_x_to_y', 'examples': [{'x': 2.0}]} + + # Send request + resp_data = None + try: + resp_data = CallREST('Classify', url, json_req) + except Exception as e: # pylint: disable=broad-except + self.fail('Request failed with error: {}'.format(e)) + + # Verify response + self.assertEquals(json.loads(resp_data), {'results': [[['', 3.0]]]}) + + def testRegressREST(self): + """Test Regress implementation over REST API.""" + model_path = self._GetSavedModelBundlePath() + + atexit.register(self.TerminateProcs) + rest_api_port = PickUnusedPort() + model_server_address = self.RunServer( + PickUnusedPort(), 'default', model_path, rest_api_port=rest_api_port) + + # Prepare request + url = 'http://{}:{}/v1/models/default:regress'.format( + model_server_address.split(':')[0], rest_api_port) + json_req = {'signature_name': 'regress_x_to_y', 'examples': [{'x': 2.0}]} + + # Send request + resp_data = None + try: + resp_data = CallREST('Regress', url, json_req) + except Exception as e: # pylint: disable=broad-except + self.fail('Request failed with error: {}'.format(e)) + + # Verify response + self.assertEquals(json.loads(resp_data), {'results': [3.0]}) + + def testPredictREST(self): + """Test Predict implementation over REST API.""" + model_path = self._GetSavedModelBundlePath() + + atexit.register(self.TerminateProcs) + rest_api_port = PickUnusedPort() + model_server_address = self.RunServer( + PickUnusedPort(), 'default', model_path, rest_api_port=rest_api_port) + + # Prepare request + url = 'http://{}:{}/v1/models/default:predict'.format( + model_server_address.split(':')[0], rest_api_port) + json_req = {'instances': [2.0, 3.0, 4.0]} + + # Send request + resp_data = None + try: + resp_data = CallREST('Predict', url, json_req) + except Exception as e: # pylint: disable=broad-except + self.fail('Request failed with error: {}'.format(e)) + + # Verify response + self.assertEquals(json.loads(resp_data), {'predictions': [3.0, 3.5, 4.0]}) + + if __name__ == '__main__': tf.test.main() From cbf0a19f561e9fa2351153a880ab9694e4cad662 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Wed, 6 Jun 2018 21:18:21 -0400 Subject: [PATCH 0009/8103] Add examples for REST API usage. PiperOrigin-RevId: 199566076 --- tensorflow_serving/g3doc/api_rest.md | 62 ++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/tensorflow_serving/g3doc/api_rest.md b/tensorflow_serving/g3doc/api_rest.md index 08bd9c0884e..8a1d7aaeefe 100644 --- a/tensorflow_serving/g3doc/api_rest.md +++ b/tensorflow_serving/g3doc/api_rest.md @@ -288,3 +288,65 @@ tokens. [proto3](https://developers.google.com/protocol-buffers/docs/proto3#json), Python [JSON](https://docs.python.org/3/library/json.html) module and JavaScript language. + +## Example + +We can use the toy +[half_plus_three](https://github.com/tensorflow/serving/tree/master/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_three/00000123) +model to see REST APIs in action. + +### Start ModelServer with REST API endpoint + +Follow [setup instructions](https://www.tensorflow.org/serving/setup) to install +TensorFlow ModelServer on your system. Then download the `half_plus_three` model +from [git repository](https://github.com/tensorflow/serving): + +```shell +$ mkdir -p /tmp/tfserving +$ cd /tmp/tfserving +$ git clone --recursive https://github.com/tensorflow/serving +``` + +Start the ModelServer with `--rest_api_port` option to export REST API endpoint: + +```shell +$ tensorflow_model_server --rest_api_port=8501 \ + --model_name=half_plus_three \ + --model_base_path=$(pwd)/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_three/ +``` + +### Do REST API calls on ModelServer + +In a different terminal, use `curl` tool to make REST API calls on the command +line. A `predict` call would look as follows: + +```shell +$ curl -d '{"instances": [1.0,2.0,5.0]}' -X POST http://localhost:8501/v1/models/half_plus_three:predict +{ + "predictions": [3.5, 4.0, 5.5] +} +``` + +And a `regress` call looks as follows: + +```shell +$ curl -d '{"signature_name": "tensorflow/serving/regress", "examples": [{"x": 1.0}, {"x": 2.0}]}' \ + -X POST http://localhost:8501/v1/models/half_plus_three:regress +{ + "results": [3.5, 4.0] +} +``` + +Note, `regress` is available on a non-default signature name and must be +specified explicitly. Incorrect request URL or body returns a HTTP error status. + +```shell +$ curl -i -d '{"instances": [1.0,5.0]}' -X POST http://localhost:8501/v1/models/half:predict +HTTP/1.1 404 Not Found +Content-Type: application/json +Date: Wed, 06 Jun 2018 23:20:12 GMT +Content-Length: 65 + +{ "error": "Servable not found for request: Latest(half)" } +$ +``` From 6823227f1279e6834b9b7f3a98faf477ce09c42d Mon Sep 17 00:00:00 2001 From: Gautam Vasudevan Date: Thu, 7 Jun 2018 17:22:21 -0400 Subject: [PATCH 0010/8103] Add a Dockerfile for easy serving PiperOrigin-RevId: 199695133 --- tensorflow_serving/tools/docker/Dockerfile | 52 ++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 tensorflow_serving/tools/docker/Dockerfile diff --git a/tensorflow_serving/tools/docker/Dockerfile b/tensorflow_serving/tools/docker/Dockerfile new file mode 100644 index 00000000000..986a697ef6c --- /dev/null +++ b/tensorflow_serving/tools/docker/Dockerfile @@ -0,0 +1,52 @@ +# Copyright 2018 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +FROM ubuntu:16.04 + +LABEL maintainer="gvasudevan@google.com" + +RUN apt-get update && apt-get install -y \ + curl \ + gnupg + +# Add TensorFlow Serving repo + +RUN echo "deb [arch=amd64] http://storage.googleapis.com/tensorflow-serving-apt stable tensorflow-model-server tensorflow-model-server-universal" | tee /etc/apt/sources.list.d/tensorflow-serving.list +# Ignore the warning about using apt-key output - we are not +ENV APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=1 +RUN curl -s https://storage.googleapis.com/tensorflow-serving-apt/tensorflow-serving.release.pub.gpg | apt-key add - + +# Get the model-server, use tensorflow-model-server-universal for older hardware +RUN apt-get update && apt-get install -y \ + tensorflow-model-server + +# Cleanup to reduce the size of the image +# See https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#run +RUN apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +#Expose ports +# gRPC +EXPOSE 8500 + +# REST +EXPOSE 8501 + +# Set where models should be stored in the container +ENV MODEL_BASE_PATH=/models +RUN mkdir -p ${MODEL_BASE_PATH} + +# The only required piece is the model name in order to differentiate endpoints +ENV MODEL_NAME=model +ENTRYPOINT tensorflow_model_server --port=8500 --rest_api_port=8501 --model_name=${MODEL_NAME} --model_base_path=${MODEL_BASE_PATH}/${MODEL_NAME} + From fc69d571a07f9b2019c947dc20b192e446f329c9 Mon Sep 17 00:00:00 2001 From: Mark Daoust Date: Fri, 8 Jun 2018 00:36:07 -0400 Subject: [PATCH 0011/8103] Add rest_api.md to leftnav PiperOrigin-RevId: 199745360 --- tensorflow_serving/g3doc/leftnav_files | 1 + 1 file changed, 1 insertion(+) diff --git a/tensorflow_serving/g3doc/leftnav_files b/tensorflow_serving/g3doc/leftnav_files index 272cbf0eba0..2c7eccc2afc 100644 --- a/tensorflow_serving/g3doc/leftnav_files +++ b/tensorflow_serving/g3doc/leftnav_files @@ -3,6 +3,7 @@ index.md architecture_overview.md setup.md serving_basic.md +api_rest.md serving_advanced.md serving_inception.md custom_servable.md From deb10de07d1739e21bedd3a409b13f2738d42737 Mon Sep 17 00:00:00 2001 From: Noah Fiedel Date: Mon, 11 Jun 2018 12:55:50 -0400 Subject: [PATCH 0012/8103] Clarify the ModelSpec API to recommend that users leave the version field unspecified for the common case. PiperOrigin-RevId: 200066733 --- tensorflow_serving/apis/model.proto | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tensorflow_serving/apis/model.proto b/tensorflow_serving/apis/model.proto index 9a0d50e7809..3a0ea1c020a 100644 --- a/tensorflow_serving/apis/model.proto +++ b/tensorflow_serving/apis/model.proto @@ -10,7 +10,13 @@ message ModelSpec { // Required servable name. string name = 1; - // Optional version. + // Optional version. Recommended to be left unset in the common case. Should + // be specified only when there is a strong version consistency requirement. + // + // When left unspecified, the system will serve the best available version. + // This is typically the latest version, though during version transitions, + // notably when serving on a fleet of instances, may be either the previous or + // new version. google.protobuf.Int64Value version = 2; // A named signature to evaluate. If unspecified, the default signature will From 503cc0c2da0c75c5f8d94be394439776771f2d5f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Jun 2018 15:43:33 -0400 Subject: [PATCH 0013/8103] Merged commit includes the following changes: 200096143 by gvasudevan: Update docker images -- PiperOrigin-RevId: 200096143 --- tensorflow_serving/g3doc/docker.md | 100 ++++++++++++++--- .../tools/docker/Dockerfile.devel | 48 +++++++-- .../tools/docker/Dockerfile.devel-gpu | 102 +++++++++++------- 3 files changed, 185 insertions(+), 65 deletions(-) diff --git a/tensorflow_serving/g3doc/docker.md b/tensorflow_serving/g3doc/docker.md index 9d248d3d4df..d3054d797b8 100644 --- a/tensorflow_serving/g3doc/docker.md +++ b/tensorflow_serving/g3doc/docker.md @@ -9,43 +9,109 @@ General installation instructions are [on the Docker site](https://docs.docker.com/installation/), but we give some quick links here: -* [OSX](https://docs.docker.com/installation/mac/): [docker toolbox](https://www.docker.com/toolbox) -* [ubuntu](https://docs.docker.com/installation/ubuntulinux/) +* [OSX](https://docs.docker.com/installation/mac/): [docker + toolbox](https://www.docker.com/toolbox) +* [Ubuntu](https://docs.docker.com/installation/ubuntulinux/) ## Which containers exist? We currently maintain the following Dockerfiles: -* [`Dockerfile.devel`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.devel), -which is a minimal VM with all of the dependencies needed to build TensorFlow -Serving. +* [`Dockerfile`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile), + which is a minimal VM with TensorFlow Serving installed. + +* [`Dockerfile.devel`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.devel), + which is a minimal VM with all of the dependencies needed to build + TensorFlow Serving. + +* [`Dockerfile.devel-gpu`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.devel), + which is a minimal VM with all of the dependencies needed to build + TensorFlow Serving with GPU support. ## Building a container -run; + +`Dockerfile`: + +```shell +docker build --pull -t $USER/tensorflow-serving . +``` + +`Dockerfile.devel`: ```shell docker build --pull -t $USER/tensorflow-serving-devel -f Dockerfile.devel . ``` +`Dockerfile.devel-gpu`: + +```shell +docker build --pull -t $USER/tensorflow-serving-devel-gpu -f Dockerfile.devel-gpu . +``` + ## Running a container -This assumes you have built the container. -`Dockerfile.devel`: Use the development container to clone and test the -TensorFlow Serving repository. +### Serving Example -Run the container; +This assumes you have built the `Dockerfile` container. + +First you will need a model. Clone the TensorFlow Serving repo. ```shell -docker run -it $USER/tensorflow-serving-devel +mkdir -p /tmp/tfserving +cd /tmp/tfserving +git clone --recursive https://github.com/tensorflow/serving ``` -Clone, configure and test Tensorflow Serving in the running container; +We will use a toy model called Half Plus Three, which will predict values 0.5\*x ++ 3 for the values we provide for prediction. + +```shell +docker run -p 8501:8501 \ +-v /tmp/tfserving/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_three:/models/half_plus_three \ +-e MODEL_NAME=half_plus_three -t $USER/tensorflow-serving & +``` + +This will run the docker container and launch the TensorFlow Serving Model +Server, bind the REST API port 8501, and map our desired model from our host to +where models are expected in the container. We also pass the name of the model +as an environment variable, which will be important when we query the model. + +To query the model using the predict API, you can run + +```shell +curl -d '{"instances": [1.0, 2.0, 5.0]}' -X POST http://localhost:8501/v1/models/half_plus_three:predict +``` + +This should return a set of values: + +```json +{ "predictions": [3.5, 4.0, 5.5] } +``` + +More information on using the RESTful API can be found [here](api_rest.md). + +### Development Example + +This assumes you have built the `Dockerfile.devel` container. + +To run the container: ```shell -git clone --recurse-submodules https://github.com/tensorflow/serving -cd serving/tensorflow -./configure -cd .. -bazel test tensorflow_serving/... +docker run -it -p 8500:8500 $USER/tensorflow-serving-devel ``` +This will pull the latest TensorFlow Serving release with a prebuilt binary and +working development environment. To test a model, from inside the container try: + +``````shell +bazel build -c opt //tensorflow_serving/example:mnist_saved_model +# train the mnist model +bazel-bin/tensorflow_serving/example/mnist_saved_model /tmp/mnist_model +# serve the model +tensorflow_model_server --port=8500 --model_name=mnist --model_base_path=/tmp/mnist_model/ & +# build the client +bazel build -c opt //tensorflow_serving/example:mnist_client +# test the client +bazel-bin/tensorflow_serving/example/mnist_client --num_tests=1000 --server=localhost:8500 +````` +`````` diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index cecd18d61e1..1d189170b7b 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -1,6 +1,19 @@ +# Copyright 2018 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. FROM ubuntu:16.04 -MAINTAINER Jeremiah Harmsen +LABEL maintainer=gvasudevan@google.com RUN apt-get update && apt-get install -y \ automake \ @@ -34,17 +47,38 @@ RUN pip install mock grpcio # Set up Bazel. -ENV BAZELRC /root/.bazelrc -# Install the most recent bazel release. -ENV BAZEL_VERSION 0.10.0 +# Running bazel inside a `docker build` command causes trouble, cf: +# https://github.com/bazelbuild/bazel/issues/134 +# The easiest solution is to set up a bazelrc file forcing --batch. +RUN echo "startup --batch" >>/etc/bazel.bazelrc +# Similarly, we need to workaround sandboxing issues: +# https://github.com/bazelbuild/bazel/issues/418 +RUN echo "build --spawn_strategy=standalone --genrule_strategy=standalone" \ + >>/etc/bazel.bazelrc +# Install a recent bazel release. +ENV BAZEL_VERSION 0.11.1 WORKDIR / RUN mkdir /bazel && \ cd /bazel && \ - curl -fSsL -O https://github.com/bazelbuild/bazel/releases/download/$BAZEL_VERSION/bazel-$BAZEL_VERSION-installer-linux-x86_64.sh && \ - curl -fSsL -o /bazel/LICENSE.txt https://raw.githubusercontent.com/bazelbuild/bazel/master/LICENSE && \ + curl -H "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36" -fSsL -O https://github.com/bazelbuild/bazel/releases/download/$BAZEL_VERSION/bazel-$BAZEL_VERSION-installer-linux-x86_64.sh && \ + curl -H "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36" -fSsL -o /bazel/LICENSE.txt https://raw.githubusercontent.com/bazelbuild/bazel/master/LICENSE && \ chmod +x bazel-*.sh && \ ./bazel-$BAZEL_VERSION-installer-linux-x86_64.sh && \ cd / && \ rm -f /bazel/bazel-$BAZEL_VERSION-installer-linux-x86_64.sh -CMD ["/bin/bash"] +# Download, build, and install TensorFlow Serving +ARG TF_SERVING_VERSION_GIT_BRANCH=r1.8 +WORKDIR /tensorflow-serving +RUN git clone --depth=1 --branch=${TF_SERVING_VERSION_GIT_BRANCH} \ + https://github.com/tensorflow/serving . + +ARG TF_SERVING_BUILD_OPTIONS="--copt=-mavx --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0" +RUN bazel build -c opt ${TF_SERVING_BUILD_OPTIONS} \ + tensorflow_serving/model_servers:tensorflow_model_server && \ + cp bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server /usr/local/bin/ && \ + bazel clean --expunge && \ + rm -rf /root/.cache +# Clean up Bazel cache when done. + +CMD ["/bin/bash"] \ No newline at end of file diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 70113c8bdad..ce0369e4986 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -1,4 +1,19 @@ -FROM nvidia/cuda:8.0-cudnn6-devel-ubuntu16.04 +# Copyright 2018 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +FROM nvidia/cuda:9.0-cudnn7-devel-ubuntu16.04 + +LABEL maintainer=gvasudevan@google.com RUN apt-get update && apt-get install -y \ automake \ @@ -9,6 +24,7 @@ RUN apt-get update && apt-get install -y \ libpng12-dev \ libtool \ libzmq3-dev \ + mlocate \ pkg-config \ python-dev \ python-numpy \ @@ -18,83 +34,87 @@ RUN apt-get update && apt-get install -y \ zip \ zlib1g-dev \ libcurl3-dev \ + openjdk-8-jdk\ + openjdk-8-jre-headless \ + wget \ && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* -RUN apt-get install python-pip python-dev build-essential - -#RUN curl -fSsL -O https://bootstrap.pypa.io/get-pip.py && \ -# python get-pip.py && \ -# rm get-pip.py - # Set up grpc -RUN pip install enum34 futures mock six && \ - pip install --pre 'protobuf>=3.0.0a3' && \ - pip install -i https://testpypi.python.org/simple --pre grpcio +RUN pip install mock grpcio # Set up Bazel. -# We need to add a custom PPA to pick up JDK8, since trusty doesn't -# have an openjdk8 backport. openjdk-r is maintained by a reliable contributor: -# Matthias Klose (https://launchpad.net/~doko). It will do until -# we either update the base image beyond 14.04 or openjdk-8 is -# finally backported to trusty; see e.g. -# https://bugs.launchpad.net/trusty-backports/+bug/1368094 -RUN add-apt-repository -y ppa:openjdk-r/ppa && \ - apt-get update && \ - apt-get install -y openjdk-8-jdk openjdk-8-jre-headless && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* - # Running bazel inside a `docker build` command causes trouble, cf: # https://github.com/bazelbuild/bazel/issues/134 # The easiest solution is to set up a bazelrc file forcing --batch. -RUN echo "startup --batch" >>/root/.bazelrc +RUN echo "startup --batch" >>/etc/bazel.bazelrc # Similarly, we need to workaround sandboxing issues: # https://github.com/bazelbuild/bazel/issues/418 RUN echo "build --spawn_strategy=standalone --genrule_strategy=standalone" \ - >>/root/.bazelrc -ENV BAZELRC /root/.bazelrc -# Install the most recent bazel release. + >>/etc/bazel.bazelrc +# Install a recent bazel release. ENV BAZEL_VERSION 0.10.0 WORKDIR / RUN mkdir /bazel && \ cd /bazel && \ - curl -fSsL -O https://github.com/bazelbuild/bazel/releases/download/$BAZEL_VERSION/bazel-$BAZEL_VERSION-installer-linux-x86_64.sh && \ - curl -fSsL -o /bazel/LICENSE https://raw.githubusercontent.com/bazelbuild/bazel/master/LICENSE && \ + curl -H "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36" -fSsL -O https://github.com/bazelbuild/bazel/releases/download/$BAZEL_VERSION/bazel-$BAZEL_VERSION-installer-linux-x86_64.sh && \ + curl -H "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36" -fSsL -o /bazel/LICENSE.txt https://raw.githubusercontent.com/bazelbuild/bazel/master/LICENSE && \ chmod +x bazel-*.sh && \ ./bazel-$BAZEL_VERSION-installer-linux-x86_64.sh && \ cd / && \ rm -f /bazel/bazel-$BAZEL_VERSION-installer-linux-x86_64.sh -# Download TensorFlow Serving -RUN git clone --recurse-submodules https://github.com/tensorflow/serving && \ - cd serving && \ - git checkout # Build TensorFlow with the CUDA configuration ENV CI_BUILD_PYTHON python ENV LD_LIBRARY_PATH /usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH ENV TF_NEED_CUDA 1 -ENV TF_CUDA_COMPUTE_CAPABILITIES=3.0,3.5,5.2,6.0,6.1 +ENV TF_CUDA_COMPUTE_CAPABILITIES=3.0,3.5,5.2,6.0,6.1,7.0 +ENV TF_CUDA_VERSION=9.0 +ENV TF_CUDNN_VERSION=7 + +# Fix paths so that CUDNN can be found: https://github.com/tensorflow/tensorflow/issues/8264 -# Fix paths so that CUDNN can be found -# See https://github.com/tensorflow/tensorflow/issues/8264 -RUN ls -lah /usr/local/cuda/lib64/* +WORKDIR / RUN mkdir /usr/lib/x86_64-linux-gnu/include/ && \ ln -s /usr/lib/x86_64-linux-gnu/include/cudnn.h /usr/lib/x86_64-linux-gnu/include/cudnn.h && \ ln -s /usr/include/cudnn.h /usr/local/cuda/include/cudnn.h && \ ln -s /usr/lib/x86_64-linux-gnu/libcudnn.so /usr/local/cuda/lib64/libcudnn.so && \ - ln -s /usr/lib/x86_64-linux-gnu/libcudnn.so.6 /usr/local/cuda/lib64/libcudnn.so.6 + ln -s /usr/lib/x86_64-linux-gnu/libcudnn.so.$TF_CUDNN_VERSION /usr/local/cuda/lib64/libcudnn.so.$TF_CUDNN_VERSION + + +# Fix paths so that NCCL can be found +ENV TF_NCCL_VERSION=2.2.12 +ENV NCCL_INSTALL_PATH=/usr/lib/nccl/ + +WORKDIR / +RUN mkdir /usr/lib/nccl && \ + mkdir /usr/lib/nccl/include/ && \ + mkdir /usr/lib/nccl/lib/ && \ + ln -s /usr/include/nccl.h /usr/lib/nccl/include/nccl.h && \ + ln -s /usr/lib/x86_64-linux-gnu/libnccl.so /usr/lib/nccl/lib/libnccl.so && \ + ln -s /usr/lib/x86_64-linux-gnu/libnccl.so.2 /usr/lib/nccl/lib/libnccl.so.2 && \ + ln -s /usr/lib/x86_64-linux-gnu/libnccl.so.$TF_NCCL_VERSION /usr/lib/nccl/lib/libnccl.so.$TF_NCCL_VERSION + +# Download, build, and install TensorFlow Serving +ARG TF_SERVING_VERSION_GIT_BRANCH=r1.7 +WORKDIR /tensorflow-serving +RUN git clone --recurse-submodules --depth=1 --branch=${TF_SERVING_VERSION_GIT_BRANCH} \ + https://github.com/tensorflow/serving . -# Build TensorFlow Serving and Install it in /usr/local/bin -WORKDIR /serving -RUN bazel build -c opt --config=cuda \ +ARG TF_SERVING_BUILD_OPTIONS="--copt=-mavx --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0" +RUN ln -s /usr/local/cuda/lib64/stubs/libcuda.so /usr/local/cuda/lib64/stubs/libcuda.so.1 && \ + LD_LIBRARY_PATH=/usr/local/cuda/lib64/stubs:${LD_LIBRARY_PATH} \ + bazel build -c opt --config=cuda \ --crosstool_top=@local_config_cuda//crosstool:toolchain \ + ${TF_SERVING_BUILD_OPTIONS} \ tensorflow_serving/model_servers:tensorflow_model_server && \ cp bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server /usr/local/bin/ && \ + rm /usr/local/cuda/lib64/stubs/libcuda.so.1 && \ bazel clean --expunge +# Clean up Bazel cache when done. -CMD ["/bin/bash"] +CMD ["/bin/bash"] \ No newline at end of file From 5a4c59e00030866a28a870cf2c4042dafcbfb6a8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Jun 2018 16:27:21 -0400 Subject: [PATCH 0014/8103] Use preferred path grpcpp/ instead of deprecated grpc++/ PiperOrigin-RevId: 200102523 --- tensorflow_serving/example/BUILD | 1 + tensorflow_serving/example/inception_client.cc | 4 ++-- tensorflow_serving/model_servers/BUILD | 3 +++ tensorflow_serving/model_servers/grpc_status_util.cc | 2 +- tensorflow_serving/model_servers/grpc_status_util.h | 2 +- tensorflow_serving/model_servers/main.cc | 10 +++++----- tensorflow_serving/model_servers/model_service_impl.h | 4 ++-- 7 files changed, 15 insertions(+), 11 deletions(-) diff --git a/tensorflow_serving/example/BUILD b/tensorflow_serving/example/BUILD index 1beb14fd976..05ca0605217 100644 --- a/tensorflow_serving/example/BUILD +++ b/tensorflow_serving/example/BUILD @@ -86,6 +86,7 @@ cc_binary( "//tensorflow_serving/apis:prediction_service_proto", "@grpc//:grpc++_unsecure", "@org_tensorflow//tensorflow/core:framework", + "@org_tensorflow//tensorflow/core:lib", "@protobuf_archive//:protobuf_lite", ], ) diff --git a/tensorflow_serving/example/inception_client.cc b/tensorflow_serving/example/inception_client.cc index f2895f2b8c9..460d1729f68 100644 --- a/tensorflow_serving/example/inception_client.cc +++ b/tensorflow_serving/example/inception_client.cc @@ -16,8 +16,8 @@ limitations under the License. #include #include -#include "grpc++/create_channel.h" -#include "grpc++/security/credentials.h" +#include "grpcpp/create_channel.h" +#include "grpcpp/security/credentials.h" #include "google/protobuf/map.h" #include "tensorflow/core/framework/tensor.h" #include "tensorflow/core/platform/types.h" diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 2d118e96a41..f72aa218965 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -281,15 +281,18 @@ cc_binary( ":grpc_status_util", ":model_service_impl", "@protobuf_archive//:cc_wkt_protos", + "@org_tensorflow//tensorflow/cc/saved_model:tag_constants", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core/platform/cloud:gcs_file_system", "@org_tensorflow//tensorflow/core/platform/hadoop:hadoop_file_system", "@org_tensorflow//tensorflow/core/platform/s3:s3_file_system", + "@org_tensorflow//tensorflow/core:protos_all_cc", "//tensorflow_serving/apis:prediction_service_proto", "//tensorflow_serving/config:model_server_config_proto", "//tensorflow_serving/core:availability_preserving_policy", "//tensorflow_serving/servables/tensorflow:multi_inference_helper", "@grpc//:grpc++_unsecure", + "//tensorflow_serving/servables/tensorflow:session_bundle_config_proto", ] + TENSORFLOW_DEPS + SUPPORTED_TENSORFLOW_OPS, ) diff --git a/tensorflow_serving/model_servers/grpc_status_util.cc b/tensorflow_serving/model_servers/grpc_status_util.cc index 5cf15060ab4..e2ecc594211 100644 --- a/tensorflow_serving/model_servers/grpc_status_util.cc +++ b/tensorflow_serving/model_servers/grpc_status_util.cc @@ -15,7 +15,7 @@ limitations under the License. #include "tensorflow_serving/model_servers/grpc_status_util.h" -#include "grpc++/support/status_code_enum.h" +#include "grpcpp/support/status_code_enum.h" namespace tensorflow { namespace serving { diff --git a/tensorflow_serving/model_servers/grpc_status_util.h b/tensorflow_serving/model_servers/grpc_status_util.h index 5e9245224f4..7fd62f4a0c7 100644 --- a/tensorflow_serving/model_servers/grpc_status_util.h +++ b/tensorflow_serving/model_servers/grpc_status_util.h @@ -16,7 +16,7 @@ limitations under the License. #ifndef TENSORFLOW_SERVING_MODEL_SERVERS_GRPC_STATUS_UTIL_H_ #define TENSORFLOW_SERVING_MODEL_SERVERS_GRPC_STATUS_UTIL_H_ -#include "grpc++/support/status.h" +#include "grpcpp/support/status.h" #include "tensorflow/core/lib/core/status.h" namespace tensorflow { diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index 6fe5420a58f..b0451158a98 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -50,12 +50,12 @@ limitations under the License. #include #include "google/protobuf/wrappers.pb.h" -#include "grpc++/security/server_credentials.h" -#include "grpc++/server.h" -#include "grpc++/server_builder.h" -#include "grpc++/server_context.h" -#include "grpc++/support/status.h" #include "grpc/grpc.h" +#include "grpcpp/security/server_credentials.h" +#include "grpcpp/server.h" +#include "grpcpp/server_builder.h" +#include "grpcpp/server_context.h" +#include "grpcpp/support/status.h" #include "tensorflow/cc/saved_model/tag_constants.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/lib/strings/numbers.h" diff --git a/tensorflow_serving/model_servers/model_service_impl.h b/tensorflow_serving/model_servers/model_service_impl.h index 6411689cee9..7778359530d 100644 --- a/tensorflow_serving/model_servers/model_service_impl.h +++ b/tensorflow_serving/model_servers/model_service_impl.h @@ -16,8 +16,8 @@ limitations under the License. #ifndef TENSORFLOW_SERVING_MODEL_SERVERS_MODEL_SERVICE_IMPL_H_ #define TENSORFLOW_SERVING_MODEL_SERVERS_MODEL_SERVICE_IMPL_H_ -#include "grpc++/server_context.h" -#include "grpc++/support/status.h" +#include "grpcpp/server_context.h" +#include "grpcpp/support/status.h" #include "tensorflow_serving/apis/model_management.pb.h" #include "tensorflow_serving/apis/model_service.grpc.pb.h" #include "tensorflow_serving/apis/model_service.pb.h" From be6753eefcfe7ef8047ec8e84cb0877163011020 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Jun 2018 18:13:24 -0400 Subject: [PATCH 0015/8103] Merged commit includes the following changes: 200121103 by awk: Updating Tensorflow archive to manually specified commit hash. TF Git commit hash: a4b390bffbcb01d8f57f25c007277d457f752a69 -- PiperOrigin-RevId: 200121103 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 98dc1ffff61..82b76d2e377 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "876f800cf9605375c4a05daf44bc280bcb85ef5b302a9c01592a828c61647574", - git_commit = "694892d4c0fba6bd4322e943f8b1483b36f1ae99", + sha256 = "7e4c1b46bf93c7ccd618c4e5c213a47c302b1c823b3f47d5b296842b8be790b5", + git_commit = "a4b390bffbcb01d8f57f25c007277d457f752a69", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e95f93fefcfe3459f7a37fc712a4dead3a973577 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Jun 2018 18:39:13 -0400 Subject: [PATCH 0016/8103] Merged commit includes the following changes: 200125787 by gvasudevan: Documentation updates -- PiperOrigin-RevId: 200125787 --- tensorflow_serving/g3doc/api_rest.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tensorflow_serving/g3doc/api_rest.md b/tensorflow_serving/g3doc/api_rest.md index 8a1d7aaeefe..2ae566cf8dd 100644 --- a/tensorflow_serving/g3doc/api_rest.md +++ b/tensorflow_serving/g3doc/api_rest.md @@ -295,7 +295,7 @@ We can use the toy [half_plus_three](https://github.com/tensorflow/serving/tree/master/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_three/00000123) model to see REST APIs in action. -### Start ModelServer with REST API endpoint +### Start ModelServer with the REST API endpoint Follow [setup instructions](https://www.tensorflow.org/serving/setup) to install TensorFlow ModelServer on your system. Then download the `half_plus_three` model @@ -304,7 +304,7 @@ from [git repository](https://github.com/tensorflow/serving): ```shell $ mkdir -p /tmp/tfserving $ cd /tmp/tfserving -$ git clone --recursive https://github.com/tensorflow/serving +$ git clone --depth=1 https://github.com/tensorflow/serving ``` Start the ModelServer with `--rest_api_port` option to export REST API endpoint: @@ -315,10 +315,10 @@ $ tensorflow_model_server --rest_api_port=8501 \ --model_base_path=$(pwd)/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_three/ ``` -### Do REST API calls on ModelServer +### Make REST API calls to ModelServer -In a different terminal, use `curl` tool to make REST API calls on the command -line. A `predict` call would look as follows: +In a different terminal, use the `curl` tool to make REST API calls. A `predict` +call would look as follows: ```shell $ curl -d '{"instances": [1.0,2.0,5.0]}' -X POST http://localhost:8501/v1/models/half_plus_three:predict @@ -338,7 +338,8 @@ $ curl -d '{"signature_name": "tensorflow/serving/regress", "examples": [{"x": 1 ``` Note, `regress` is available on a non-default signature name and must be -specified explicitly. Incorrect request URL or body returns a HTTP error status. +specified explicitly. An incorrect request URL or body returns an HTTP error +status. ```shell $ curl -i -d '{"instances": [1.0,5.0]}' -X POST http://localhost:8501/v1/models/half:predict From 143236effe7ae3ff8d87029033a0ff75e5801af9 Mon Sep 17 00:00:00 2001 From: Gautam Vasudevan Date: Mon, 11 Jun 2018 19:11:10 -0400 Subject: [PATCH 0017/8103] Documentation updates PiperOrigin-RevId: 200130740 --- tensorflow_serving/g3doc/serving_inception.md | 6 +- tensorflow_serving/g3doc/setup.md | 64 ++++++++----------- 2 files changed, 27 insertions(+), 43 deletions(-) diff --git a/tensorflow_serving/g3doc/serving_inception.md b/tensorflow_serving/g3doc/serving_inception.md index c62918f77c8..43acd972e06 100644 --- a/tensorflow_serving/g3doc/serving_inception.md +++ b/tensorflow_serving/g3doc/serving_inception.md @@ -43,10 +43,8 @@ In the running container, we clone, configure and build TensorFlow Serving example code. ```shell -root@c97d8e820ced:/# git clone -b r1.6 --recurse-submodules https://github.com/tensorflow/serving -root@c97d8e820ced:/# cd serving/tensorflow -root@c97d8e820ced:/serving/tensorflow# ./configure -root@c97d8e820ced:/serving# cd .. +root@c97d8e820ced:/# git clone -b r1.6 https://github.com/tensorflow/serving +root@c97d8e820ced:/# cd serving root@c97d8e820ced:/serving# bazel build -c opt tensorflow_serving/example/... ``` diff --git a/tensorflow_serving/g3doc/setup.md b/tensorflow_serving/g3doc/setup.md index 4f3a2ae3973..8c741cc6948 100644 --- a/tensorflow_serving/g3doc/setup.md +++ b/tensorflow_serving/g3doc/setup.md @@ -40,10 +40,12 @@ To install TensorFlow Serving dependencies, execute the following: ```shell sudo apt-get update && sudo apt-get install -y \ + automake \ build-essential \ curl \ libcurl3-dev \ git \ + libtool \ libfreetype6-dev \ libpng12-dev \ libzmq3-dev \ @@ -65,19 +67,19 @@ may need to run. ### TensorFlow Serving Python API PIP package {#pip} -To run Python client code without the need to install Bazel, you can install -the `tensorflow-serving-api` PIP package using: +To run Python client code without the need to install Bazel, you can install the +`tensorflow-serving-api` PIP package using: ```shell pip install tensorflow-serving-api ``` -Note: The TensorFlow Serving Python API -[is only published for Python 2](https://pypi.python.org/pypi/tensorflow-serving-api), -but will work for Python 3 if you either build it yourself, or download the -Python 2 version, unzip it, and copy it into your Python 3 path. There is a -[feature request](https://github.com/tensorflow/serving/issues/700) to publish -the Python 3 package as well. +Note: The TensorFlow Serving Python API [is only published for Python +2](https://pypi.python.org/pypi/tensorflow-serving-api), but will work for +Python 3 if you either build it yourself, or download the Python 2 version, +unzip it, and copy it into your Python 3 path. There is a [feature +request](https://github.com/tensorflow/serving/issues/700) to publish the Python +3 package as well. ## Installing using apt-get {#aptget} @@ -115,7 +117,8 @@ sudo apt-get remove tensorflow-model-server sudo apt-get update && sudo apt-get install tensorflow-model-server -Once installed, the binary can be invoked using the command `tensorflow_model_server`. +Once installed, the binary can be invoked using the command +`tensorflow_model_server`. You can upgrade to a newer version of tensorflow-model-server with: @@ -132,22 +135,19 @@ instructions. ### Clone the TensorFlow Serving repository ```shell -git clone --recurse-submodules https://github.com/tensorflow/serving +git clone https://github.com/tensorflow/serving cd serving ``` -`--recurse-submodules` is required to fetch TensorFlow, gRPC, and other -libraries that TensorFlow Serving depends on. Note that these instructions -will install the latest master branch of TensorFlow Serving. If you want to -install a specific branch (such as a release branch), pass `-b ` -to the `git clone` command. +Note that these instructions will install the latest master branch of TensorFlow +Serving. If you want to install a specific branch (such as a release branch), +pass `-b ` to the `git clone` command. ### Install prerequisites Follow the Prerequisites section above to install all dependencies. Consult the -[TensorFlow install instructions](https://www.tensorflow.org/install/) -if you encounter any issues with setting up TensorFlow or its dependencies. - +[TensorFlow install instructions](https://www.tensorflow.org/install/) if you +encounter any issues with setting up TensorFlow or its dependencies. ### Build @@ -173,19 +173,21 @@ To test your installation, execute: bazel test -c opt tensorflow_serving/... ``` -See the [basic tutorial](serving_basic.md) and [advanced tutorial](serving_advanced.md) -for more in-depth examples of running TensorFlow Serving. +See the [basic tutorial](serving_basic.md) and [advanced +tutorial](serving_advanced.md) for more in-depth examples of running TensorFlow +Serving. ### Optimized build {#optimized} It's possible to compile using some platform specific instruction sets (e.g. AVX) that can significantly improve performance. Wherever you see 'bazel build' in the documentation, you can add the flags `-c opt --copt=-msse4.1 ---copt=-msse4.2 --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-O3` (or some -subset of these flags). For example: +--copt=-msse4.2 --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-O3 +--cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0"` (or some subset of these flags). For +example: ```shell -bazel build -c opt --copt=-msse4.1 --copt=-msse4.2 --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-O3 tensorflow_serving/... +bazel build -c opt --copt=-msse4.1 --copt=-msse4.2 --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-O3 --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0" tensorflow_serving/... ``` Note: These instruction sets are not available on all machines, especially with @@ -193,19 +195,3 @@ older processors, so it may not work with all flags. You can try some subset of them, or revert to just the basic '-c opt' which is guaranteed to work on all machines. -### Continuous integration build - -Our [continuous integration build](http://ci.tensorflow.org/view/Serving/job/serving-master-cpu/) -using TensorFlow [ci_build](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/tools/ci_build) -infrastructure offers you simplified development using docker. All you need is -git and docker. No need to install all other dependencies manually. - -```shell -git clone --recursive https://github.com/tensorflow/serving -cd serving -CI_TENSORFLOW_SUBMODULE_PATH=tensorflow tensorflow/tensorflow/tools/ci_build/ci_build.sh CPU bazel test //tensorflow_serving/... -``` - -Note: The `serving` directory is mapped into the container. You can develop -outside the docker container (in your favourite editor) and when you run this -build it will build with your changes. From 888bcc34bf56ea9d9e0f194d5e99c3ef95e6d958 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Jun 2018 00:14:18 -0400 Subject: [PATCH 0018/8103] Merged commit includes the following changes: 200159885 by awk: Updating TensorFlow to latest green. -- 200150829 by yifeif: Internal change. -- 200147582 by yifeif: Internal changes. -- PiperOrigin-RevId: 200159885 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 82b76d2e377..069d7bb7f74 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7e4c1b46bf93c7ccd618c4e5c213a47c302b1c823b3f47d5b296842b8be790b5", - git_commit = "a4b390bffbcb01d8f57f25c007277d457f752a69", + sha256 = "3ca891c58b5fe5d449f9de22527363424e332350c4a4ba2ebcff5240a9843a6a", + git_commit = "c169282cfe03e146350d2e17f79be4bf759c4146", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a6ab64298aea7e1eac0862af1073bff40dcdc9b6 Mon Sep 17 00:00:00 2001 From: gorban Date: Tue, 12 Jun 2018 23:58:13 -0700 Subject: [PATCH 0019/8103] Make error message for input size mismatch more actionable. PiperOrigin-RevId: 200343314 --- tensorflow_serving/batching/BUILD | 1 - tensorflow_serving/servables/tensorflow/BUILD | 1 + .../servables/tensorflow/predict_util.cc | 54 +++++++++++++------ 3 files changed, 39 insertions(+), 17 deletions(-) diff --git a/tensorflow_serving/batching/BUILD b/tensorflow_serving/batching/BUILD index d057756a309..73e7212e97b 100644 --- a/tensorflow_serving/batching/BUILD +++ b/tensorflow_serving/batching/BUILD @@ -18,7 +18,6 @@ filegroup( ), ) - cc_library( name = "streaming_batch_scheduler", srcs = ["streaming_batch_scheduler.cc"], diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index ef3e651d8ac..a8e3ac79d0e 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -443,6 +443,7 @@ cc_library( "//tensorflow_serving/apis:predict_proto", "//tensorflow_serving/servables/tensorflow:util", "//tensorflow_serving/util:optional", + "@com_google_absl//absl/strings", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", "@org_tensorflow//tensorflow/contrib/session_bundle", "@org_tensorflow//tensorflow/contrib/session_bundle:signature", diff --git a/tensorflow_serving/servables/tensorflow/predict_util.cc b/tensorflow_serving/servables/tensorflow/predict_util.cc index 760c968fc7a..b141604516c 100644 --- a/tensorflow_serving/servables/tensorflow/predict_util.cc +++ b/tensorflow_serving/servables/tensorflow/predict_util.cc @@ -21,6 +21,7 @@ limitations under the License. #include #include +#include "absl/strings/str_join.h" #include "tensorflow/cc/saved_model/signature_constants.h" #include "tensorflow/contrib/session_bundle/signature.h" #include "tensorflow/core/framework/tensor.pb.h" @@ -47,13 +48,7 @@ string MapKeysToString(const google::protobuf::Map>* inputs, - std::vector* output_tensor_names, - std::vector* output_tensor_aliases) { +Status VerifySignature(const SignatureDef& signature) { if (signature.method_name() != kPredictMethodName && signature.method_name() != kClassifyMethodName && signature.method_name() != kRegressMethodName) { @@ -62,12 +57,41 @@ Status PreProcessPrediction(const SignatureDef& signature, kPredictMethodName, ", ", kClassifyMethodName, ", ", kRegressMethodName, "}. Was: ", signature.method_name())); } + return Status::OK(); +} + +template +std::vector get_map_keys(const T& proto_map) { + std::vector keys; + for (auto it : proto_map) { + keys.push_back(it.first); + } + return keys; +} - // Verify and prepare input. +Status VerifyRequestInputsSize(const SignatureDef& signature, + const PredictRequest& request) { if (request.inputs().size() != signature.inputs().size()) { - return tensorflow::Status(tensorflow::error::INVALID_ARGUMENT, - "input size does not match signature"); + return tensorflow::Status( + tensorflow::error::INVALID_ARGUMENT, + absl::StrCat( + "input size does not match signature: ", request.inputs().size(), + "!=", signature.inputs().size(), " len([", + absl::StrJoin(get_map_keys(request.inputs()), ","), "]) != len([", + absl::StrJoin(get_map_keys(signature.inputs()), ","), "])")); } + return Status::OK(); +} + +// Validate a SignatureDef to make sure it's compatible with prediction, and +// if so, populate the input and output tensor names. +Status PreProcessPrediction(const SignatureDef& signature, + const PredictRequest& request, + std::vector>* inputs, + std::vector* output_tensor_names, + std::vector* output_tensor_aliases) { + TF_RETURN_IF_ERROR(VerifySignature(signature)); + TF_RETURN_IF_ERROR(VerifyRequestInputsSize(signature, request)); for (auto& input : request.inputs()) { const string& alias = input.first; auto iter = signature.inputs().find(alias); @@ -139,10 +163,8 @@ Status PostProcessPredictionResult( Status RunPredict(const RunOptions& run_options, const MetaGraphDef& meta_graph_def, - const optional& servable_version, - Session* session, - const PredictRequest& request, - PredictResponse* response) { + const optional& servable_version, Session* session, + const PredictRequest& request, PredictResponse* response) { // Validate signatures. const string signature_name = request.model_spec().signature_name().empty() ? kDefaultServingSignatureDefKey @@ -154,8 +176,8 @@ Status RunPredict(const RunOptions& run_options, } SignatureDef signature = iter->second; - MakeModelSpec(request.model_spec().name(), signature_name, - servable_version, response->mutable_model_spec()); + MakeModelSpec(request.model_spec().name(), signature_name, servable_version, + response->mutable_model_spec()); std::vector> input_tensors; std::vector output_tensor_names; From 0346f182fea15bb643bd699d228242d8072a6fd2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Jun 2018 03:53:16 -0700 Subject: [PATCH 0020/8103] Refactor model_servers/main.cc into a lib to ease reuse in custom servers that link in additional custom ops PiperOrigin-RevId: 200367387 --- tensorflow_serving/model_servers/BUILD | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index f72aa218965..5561b025a3b 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -9,6 +9,12 @@ package( licenses(["notice"]) # Apache 2.0 +# Visibility group for clients that link in custom ops, while using the +# vanilla TensorFlow ModelServer without any other modifications. Exclusively +# for adding custom TensorFlow ops. Does not grant access to private headers +# or other implementation details. +package_group(name = "tensorflow_model_server_custom_op_clients") + filegroup( name = "all_files", srcs = glob( @@ -267,12 +273,15 @@ TENSORFLOW_DEPS = [ "//tensorflow_serving/servables/tensorflow:predict_impl", ] -cc_binary( - name = "tensorflow_model_server", +cc_library( + name = "tensorflow_model_server_main_lib", srcs = [ "main.cc", ], - visibility = ["//tensorflow_serving:internal"], + visibility = [ + ":tensorflow_model_server_custom_op_clients", + "//tensorflow_serving:internal", + ], deps = [ ":http_server", ":model_platform_types", @@ -296,6 +305,14 @@ cc_binary( ] + TENSORFLOW_DEPS + SUPPORTED_TENSORFLOW_OPS, ) +cc_binary( + name = "tensorflow_model_server", + visibility = ["//tensorflow_serving:internal"], + deps = [ + ":tensorflow_model_server_main_lib", + ], +) + py_test( name = "tensorflow_model_server_test", size = "medium", From 991ec4ea2b2dcdd776589f0c91ab8fc53f7e8716 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Wed, 13 Jun 2018 17:40:21 -0700 Subject: [PATCH 0021/8103] Update docker files to have cleaner output PiperOrigin-RevId: 200483649 --- tensorflow_serving/tools/docker/Dockerfile.devel | 5 +++-- tensorflow_serving/tools/docker/Dockerfile.devel-gpu | 7 ++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index 1d189170b7b..ae77a894ddc 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -74,10 +74,11 @@ RUN git clone --depth=1 --branch=${TF_SERVING_VERSION_GIT_BRANCH} \ https://github.com/tensorflow/serving . ARG TF_SERVING_BUILD_OPTIONS="--copt=-mavx --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0" -RUN bazel build -c opt ${TF_SERVING_BUILD_OPTIONS} \ +RUN bazel build -c opt --color=yes --curses=yes ${TF_SERVING_BUILD_OPTIONS} \ + --output_filter=DONT_MATCH_ANYTHING \ tensorflow_serving/model_servers:tensorflow_model_server && \ cp bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server /usr/local/bin/ && \ - bazel clean --expunge && \ + bazel clean --expunge --color=yes && \ rm -rf /root/.cache # Clean up Bazel cache when done. diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index ce0369e4986..e80012eacb8 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -102,19 +102,20 @@ RUN mkdir /usr/lib/nccl && \ # Download, build, and install TensorFlow Serving ARG TF_SERVING_VERSION_GIT_BRANCH=r1.7 WORKDIR /tensorflow-serving -RUN git clone --recurse-submodules --depth=1 --branch=${TF_SERVING_VERSION_GIT_BRANCH} \ +RUN git clone --depth=1 --branch=${TF_SERVING_VERSION_GIT_BRANCH} \ https://github.com/tensorflow/serving . ARG TF_SERVING_BUILD_OPTIONS="--copt=-mavx --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0" RUN ln -s /usr/local/cuda/lib64/stubs/libcuda.so /usr/local/cuda/lib64/stubs/libcuda.so.1 && \ LD_LIBRARY_PATH=/usr/local/cuda/lib64/stubs:${LD_LIBRARY_PATH} \ - bazel build -c opt --config=cuda \ + bazel build -c opt --color=yes --curses=yes --config=cuda \ + --output_filter=DONT_MATCH_ANYTHING \ --crosstool_top=@local_config_cuda//crosstool:toolchain \ ${TF_SERVING_BUILD_OPTIONS} \ tensorflow_serving/model_servers:tensorflow_model_server && \ cp bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server /usr/local/bin/ && \ rm /usr/local/cuda/lib64/stubs/libcuda.so.1 && \ - bazel clean --expunge + bazel clean --expunge --color=yes # Clean up Bazel cache when done. CMD ["/bin/bash"] \ No newline at end of file From 43c909b8ce4da878a4873b30523594d67523368e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Jun 2018 08:06:39 -0700 Subject: [PATCH 0022/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 200557616 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 069d7bb7f74..f39a81cebf2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3ca891c58b5fe5d449f9de22527363424e332350c4a4ba2ebcff5240a9843a6a", - git_commit = "c169282cfe03e146350d2e17f79be4bf759c4146", + sha256 = "f2d53ff981ccf7a2002e44bef18165f37b65c5b70c73f5616bdd2fb1d23b489d", + git_commit = "e5c17aef836f8b85591cdcae31fbb66ddcf8185a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0e3131fd6aeb2eb774f15ac3c3bce4af259bb80d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Jun 2018 10:01:26 -0700 Subject: [PATCH 0023/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 200572922 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f39a81cebf2..929ce967061 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f2d53ff981ccf7a2002e44bef18165f37b65c5b70c73f5616bdd2fb1d23b489d", - git_commit = "e5c17aef836f8b85591cdcae31fbb66ddcf8185a", + sha256 = "261ad558de3debe05694fb694f1720b4eca6eec040cdc19def921092fc884359", + git_commit = "04b7701eb0177d717b20c98d48fb6bc3ec793401", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1a549b1af262bbf04dbb3a62141b7cea6451b4c7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Jun 2018 13:02:17 -0700 Subject: [PATCH 0024/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 200604696 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 929ce967061..f9a7b304a6e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "261ad558de3debe05694fb694f1720b4eca6eec040cdc19def921092fc884359", - git_commit = "04b7701eb0177d717b20c98d48fb6bc3ec793401", + sha256 = "2ba946c212a55886ffdf315345cb65f6c91dc39a71d1d3767d7a2b4669a9e5b1", + git_commit = "c75734ab7f0ba0aef608738e18ce73847d16958a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 59ddccf123201907ea91d973ee5a828afc849745 Mon Sep 17 00:00:00 2001 From: gautamvasudevan <12356580+gautamvasudevan@users.noreply.github.com> Date: Thu, 14 Jun 2018 14:54:03 -0700 Subject: [PATCH 0025/8103] Update docker.md --- tensorflow_serving/g3doc/docker.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tensorflow_serving/g3doc/docker.md b/tensorflow_serving/g3doc/docker.md index d3054d797b8..c6858933c10 100644 --- a/tensorflow_serving/g3doc/docker.md +++ b/tensorflow_serving/g3doc/docker.md @@ -47,6 +47,13 @@ docker build --pull -t $USER/tensorflow-serving-devel -f Dockerfile.devel . ```shell docker build --pull -t $USER/tensorflow-serving-devel-gpu -f Dockerfile.devel-gpu . ``` +TIP: By default, building TensorFlow Serving from sources consumes a lot of RAM. +If RAM is an issue on your system, you may limit RAM usage by specifying +`--local_resources 2048,.5,1.0` while invoking bazel. You can use this same +mechanism to tweak the optmizations you're building TensorFlow Serving with. Ex: +`docker build --pull --build-arg TF_SERVING_BUILD_OPTIONS="--copt=-mavx +--cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0 --local_resources 2048,.5,1.0" -t +$USER/tensorflow-serving-devel -f Dockerfile.devel .` ## Running a container From 211421d607c3609e6d7bd1b78ae6029fa06dfa6c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Jun 2018 15:01:33 -0700 Subject: [PATCH 0026/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 200624780 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f9a7b304a6e..c4596e3de09 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2ba946c212a55886ffdf315345cb65f6c91dc39a71d1d3767d7a2b4669a9e5b1", - git_commit = "c75734ab7f0ba0aef608738e18ce73847d16958a", + sha256 = "2582667f984ac6cd150e1c26d0eedbce91fb82180bc47207a15bfa9f5b612cb2", + git_commit = "eefd88284ba3744a5d7f6a3a7c179bed8421b7e2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a844fbdf1020586874c7c699451fa713461906d9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Jun 2018 18:19:52 -0700 Subject: [PATCH 0027/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 200653106 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c4596e3de09..ac4e3476edb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2582667f984ac6cd150e1c26d0eedbce91fb82180bc47207a15bfa9f5b612cb2", - git_commit = "eefd88284ba3744a5d7f6a3a7c179bed8421b7e2", + sha256 = "b6ab14af636e0dabaa4cd6ba678c416cca78b1b7598258090dfd9eb0f61456c4", + git_commit = "212ba3e9ef934d0b2a3b09740bd238cda0394fad", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5aaed041a36b668f87e36a74cf12c1eca562b737 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Jun 2018 19:14:16 -0700 Subject: [PATCH 0028/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 200657765 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ac4e3476edb..718117a2a26 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b6ab14af636e0dabaa4cd6ba678c416cca78b1b7598258090dfd9eb0f61456c4", - git_commit = "212ba3e9ef934d0b2a3b09740bd238cda0394fad", + sha256 = "95088baea23dd4f3fee9024a6c67b51f4a3d4ef5d6e3240b8b60b5735f6342bb", + git_commit = "c4bc35950e23a5c35acfce9e30897bc37ce5c8b5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ed97c376fec8e6a5b2c8e610871d5ba17ac1d584 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Jun 2018 23:00:59 -0700 Subject: [PATCH 0029/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 200673092 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 718117a2a26..cdebc5920ed 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "95088baea23dd4f3fee9024a6c67b51f4a3d4ef5d6e3240b8b60b5735f6342bb", - git_commit = "c4bc35950e23a5c35acfce9e30897bc37ce5c8b5", + sha256 = "0c0752211381ade512088f80ffdb62e54d14d86d0c3a7123163a463261f7eced", + git_commit = "71ad57040b6303d2944989c2f78fa35d2a3ff103", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From cc53c5c2ebe79fa8937eea0d22521fbcd5af0826 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 15 Jun 2018 11:01:23 -0700 Subject: [PATCH 0030/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 200741853 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cdebc5920ed..2875b5b000b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0c0752211381ade512088f80ffdb62e54d14d86d0c3a7123163a463261f7eced", - git_commit = "71ad57040b6303d2944989c2f78fa35d2a3ff103", + sha256 = "425c80a3b2e421d21656c0d5f8c54f8fec0e6bd65fa22d6f9e48485a0eae064f", + git_commit = "8212404a47e17a0ad1822e520c990be1cd712e91", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c82ec1de281197ff150a6249800228ea3b48e742 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 15 Jun 2018 14:01:33 -0700 Subject: [PATCH 0031/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 200769587 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2875b5b000b..d8ea2b4adcc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "425c80a3b2e421d21656c0d5f8c54f8fec0e6bd65fa22d6f9e48485a0eae064f", - git_commit = "8212404a47e17a0ad1822e520c990be1cd712e91", + sha256 = "d36cd3f80e739aaae2ba0e3548ba615a765508a9f3582d71ec479d67b0c5e7fc", + git_commit = "9576d6d4178b9761db614448c4cec49969b02c80", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1c7436d7db7c2362efa26c9d2557df842c1ceb94 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 15 Jun 2018 15:01:35 -0700 Subject: [PATCH 0032/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 200779431 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d8ea2b4adcc..3e2e519c503 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d36cd3f80e739aaae2ba0e3548ba615a765508a9f3582d71ec479d67b0c5e7fc", - git_commit = "9576d6d4178b9761db614448c4cec49969b02c80", + sha256 = "cbaab5fc864584923a4378df7a431161aab2ca1816251d4c544eae6db27061a0", + git_commit = "c2046b32299c02d73dae4a10731b810e4cb7c58f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ccb56af0f4daabb0d7302519a8889b12269ff087 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 15 Jun 2018 17:03:22 -0700 Subject: [PATCH 0033/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 200796803 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3e2e519c503..96aed58d312 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cbaab5fc864584923a4378df7a431161aab2ca1816251d4c544eae6db27061a0", - git_commit = "c2046b32299c02d73dae4a10731b810e4cb7c58f", + sha256 = "beb5ba8897edd6695a4430a213eca940339c23084a40709e3b4d77259b0746c9", + git_commit = "79d7e11f3ea4ec13332693cdcf271bf10aad583d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 782b21c7a8822f0183b888b23f82558f6a169611 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 16 Jun 2018 14:01:48 -0700 Subject: [PATCH 0034/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 200854882 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 96aed58d312..f4a0c1fd6c0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "beb5ba8897edd6695a4430a213eca940339c23084a40709e3b4d77259b0746c9", - git_commit = "79d7e11f3ea4ec13332693cdcf271bf10aad583d", + sha256 = "028443e49575380b81c9a563be4f87ccac5f0e222bbc73a607d272f3c9fd895b", + git_commit = "6d1603622b1c3b25de0a8d342714fed271308a47", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f78654f0902ad10613da7d65c5037d325c03e602 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 17 Jun 2018 10:02:01 -0700 Subject: [PATCH 0035/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 200903227 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f4a0c1fd6c0..3b9001d3bc5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "028443e49575380b81c9a563be4f87ccac5f0e222bbc73a607d272f3c9fd895b", - git_commit = "6d1603622b1c3b25de0a8d342714fed271308a47", + sha256 = "352bc70ba7fa656f2e44b480cc149a3e62108c1facd2e6d7a1329683c21e358a", + git_commit = "ab9b1341a9d31063c9c41f197930c5395245046e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b8e79dd199b78e2c8d5f30d31aa44354e412f0f5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 17 Jun 2018 17:00:56 -0700 Subject: [PATCH 0036/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 200921812 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3b9001d3bc5..24245139f01 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "352bc70ba7fa656f2e44b480cc149a3e62108c1facd2e6d7a1329683c21e358a", - git_commit = "ab9b1341a9d31063c9c41f197930c5395245046e", + sha256 = "adb65b4751c2151ef3bed2cfbc46aceed0850c0f7e07636a89d5ae9a3ababf2e", + git_commit = "8e86dcd1c59bb3f1dc978fcb5398dd3f2f51d9ad", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3dded6ec4c01f75a4c28db3166c4f45ae462a2aa Mon Sep 17 00:00:00 2001 From: Yun Peng Date: Mon, 18 Jun 2018 17:18:19 +0200 Subject: [PATCH 0037/8103] Fix a compilation error with old gcc compiler --- .../http_rest_prediction_handler_test.cc | 24 ++++--------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/tensorflow_serving/model_servers/http_rest_prediction_handler_test.cc b/tensorflow_serving/model_servers/http_rest_prediction_handler_test.cc index d9bde80eb23..f502915c0d8 100644 --- a/tensorflow_serving/model_servers/http_rest_prediction_handler_test.cc +++ b/tensorflow_serving/model_servers/http_rest_prediction_handler_test.cc @@ -302,9 +302,7 @@ TEST_F(HttpRestPredictionHandlerTest, Predict) { "POST", absl::StrCat("/v1/models/", kTestModelName, "/versions/", kTestModelVersion1, ":predict"), - R"({ - "signature_name": "serving_default", - "instances": [3.0, 4.0]})", + R"({"signature_name": "serving_default", "instances": [3.0, 4.0]})", &headers, &output)); TF_EXPECT_OK(CompareJson(output, R"({ "predictions": [3.5, 4.0] })")); EXPECT_THAT(headers, UnorderedElementsAreArray( @@ -318,10 +316,7 @@ TEST_F(HttpRestPredictionHandlerTest, Regress) { // Query latest version. TF_EXPECT_OK(handler_.ProcessRequest( "POST", absl::StrCat("/v1/models/", kTestModelName, ":regress"), - R"({ - "signature_name": "regress_x_to_y", - "examples": [ { "x": 80.0 } ] - })", + R"({"signature_name": "regress_x_to_y", "examples": [ { "x": 80.0 } ] })", &headers, &output)); TF_EXPECT_OK(CompareJson(output, R"({ "results": [42] })")); EXPECT_THAT(headers, UnorderedElementsAreArray( @@ -332,10 +327,7 @@ TEST_F(HttpRestPredictionHandlerTest, Regress) { "POST", absl::StrCat("/v1/models/", kTestModelName, "/versions/", kTestModelVersion1, ":regress"), - R"({ - "signature_name": "regress_x_to_y", - "examples": [ { "x": 80.0 } ] - })", + R"({"signature_name": "regress_x_to_y", "examples": [ { "x": 80.0 } ] })", &headers, &output)); TF_EXPECT_OK(CompareJson(output, R"({ "results": [42] })")); EXPECT_THAT(headers, UnorderedElementsAreArray( @@ -349,10 +341,7 @@ TEST_F(HttpRestPredictionHandlerTest, Classify) { // Query latest version. TF_EXPECT_OK(handler_.ProcessRequest( "POST", absl::StrCat("/v1/models/", kTestModelName, ":classify"), - R"({ - "signature_name": "classify_x_to_y", - "examples": [ { "x": 20.0 } ] - })", + R"({"signature_name": "classify_x_to_y", "examples": [ { "x": 20.0 } ] })", &headers, &output)); TF_EXPECT_OK(CompareJson(output, R"({ "results": [[["", 12]]] })")); EXPECT_THAT(headers, UnorderedElementsAreArray( @@ -363,10 +352,7 @@ TEST_F(HttpRestPredictionHandlerTest, Classify) { "POST", absl::StrCat("/v1/models/", kTestModelName, "/versions/", kTestModelVersion1, ":classify"), - R"({ - "signature_name": "classify_x_to_y", - "examples": [ { "x": 10.0 } ] - })", + R"({"signature_name": "classify_x_to_y", "examples": [ { "x": 10.0 } ] })", &headers, &output)); TF_EXPECT_OK(CompareJson(output, R"({ "results": [[["", 7]]] })")); EXPECT_THAT(headers, UnorderedElementsAreArray( From 806a210967e684b58eeef8002b941cc58506fbc8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 18 Jun 2018 11:01:52 -0700 Subject: [PATCH 0038/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 201024367 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 24245139f01..fc06a4043b5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "adb65b4751c2151ef3bed2cfbc46aceed0850c0f7e07636a89d5ae9a3ababf2e", - git_commit = "8e86dcd1c59bb3f1dc978fcb5398dd3f2f51d9ad", + sha256 = "34a50fa8ebc3a2bfbfe48e4022df43534402a92e42664a88c7aa999c7a6cfd26", + git_commit = "ff7e6399443615675a3f1182c4f2e1850008da04", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ae921fe2601354a2807979b47230b878d67bd7da Mon Sep 17 00:00:00 2001 From: shohinighosh Date: Mon, 18 Jun 2018 13:19:18 -0700 Subject: [PATCH 0039/8103] Add details about model load failure reason to error message. PiperOrigin-RevId: 201046882 --- .../core/load_servables_fast.cc | 12 +++++++++-- .../model_servers/server_core.cc | 21 ++++++++++++------- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/tensorflow_serving/core/load_servables_fast.cc b/tensorflow_serving/core/load_servables_fast.cc index cbf482167cc..22eac659b50 100644 --- a/tensorflow_serving/core/load_servables_fast.cc +++ b/tensorflow_serving/core/load_servables_fast.cc @@ -86,8 +86,16 @@ Status ConnectSourcesWithFastInitialLoad( for (const auto& id_and_state : states_reached) { if (id_and_state.second != ServableState::ManagerState::kAvailable) { - strings::StrAppend(&message, id_and_state.first.DebugString(), - ", "); + optional maybe_state = + servable_state_monitor->GetState(id_and_state.first); + const string error_msg = + maybe_state && !maybe_state.value().health.ok() + ? " due to error: " + + maybe_state.value().health.ToString() + : ""; + strings::StrAppend(&message, "{", + id_and_state.first.DebugString(), error_msg, + "}, "); } } strings::StrAppend(&message, "}"); diff --git a/tensorflow_serving/model_servers/server_core.cc b/tensorflow_serving/model_servers/server_core.cc index f58dd2a74de..d6e466d4da4 100644 --- a/tensorflow_serving/model_servers/server_core.cc +++ b/tensorflow_serving/model_servers/server_core.cc @@ -223,12 +223,12 @@ Status UpdateModelConfigListRelativePaths( Status ServerCore::Create(Options options, std::unique_ptr* server_core) { if (options.servable_state_monitor_creator == nullptr) { - options.servable_state_monitor_creator = []( - EventBus* event_bus, - std::unique_ptr* monitor) { - monitor->reset(new ServableStateMonitor(event_bus)); - return Status::OK(); - }; + options.servable_state_monitor_creator = + [](EventBus* event_bus, + std::unique_ptr* monitor) { + monitor->reset(new ServableStateMonitor(event_bus)); + return Status::OK(); + }; } if (options.server_request_logger == nullptr) { @@ -296,7 +296,14 @@ Status ServerCore::WaitUntilModelsAvailable(const std::set& models, string message = "Some models did not become available: {"; for (const auto& id_and_state : states_reached) { if (id_and_state.second != ServableState::ManagerState::kAvailable) { - strings::StrAppend(&message, id_and_state.first.DebugString(), ", "); + optional maybe_state = + monitor->GetState(id_and_state.first); + const string error_msg = + maybe_state && !maybe_state.value().health.ok() + ? " due to error: " + maybe_state.value().health.ToString() + : ""; + strings::StrAppend(&message, "{", id_and_state.first.DebugString(), + error_msg, "}, "); } } strings::StrAppend(&message, "}"); From cdbb051bf410209cb4bdf5533cc79ae3530e8731 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 18 Jun 2018 16:01:18 -0700 Subject: [PATCH 0040/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 201075343 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fc06a4043b5..6f029c9a697 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "34a50fa8ebc3a2bfbfe48e4022df43534402a92e42664a88c7aa999c7a6cfd26", - git_commit = "ff7e6399443615675a3f1182c4f2e1850008da04", + sha256 = "c71ffb283634636991084b647d61acf1d3c7549cce390d823568f7482eb65cf2", + git_commit = "c9b218bef42e6a56b90c5b4bd7978c9f5a042ed5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9284c5cd296f73acabbf6c388f51567aaa48f5a6 Mon Sep 17 00:00:00 2001 From: shohinighosh Date: Mon, 18 Jun 2018 17:30:37 -0700 Subject: [PATCH 0041/8103] Include number of servables that failed to become available in error message. PiperOrigin-RevId: 201089493 --- tensorflow_serving/core/load_servables_fast.cc | 12 +++++++++++- tensorflow_serving/model_servers/server_core.cc | 10 +++++++++- tensorflow_serving/model_servers/server_core_test.cc | 2 +- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/tensorflow_serving/core/load_servables_fast.cc b/tensorflow_serving/core/load_servables_fast.cc index 22eac659b50..940700f7cef 100644 --- a/tensorflow_serving/core/load_servables_fast.cc +++ b/tensorflow_serving/core/load_servables_fast.cc @@ -20,6 +20,7 @@ limitations under the License. #include #include "tensorflow/core/lib/core/errors.h" +#include "tensorflow/core/lib/strings/strcat.h" #include "tensorflow_serving/core/servable_state.h" #include "tensorflow_serving/core/source.h" #include "tensorflow_serving/core/target.h" @@ -82,7 +83,16 @@ Status ConnectSourcesWithFastInitialLoad( initial_servables, ServableState::ManagerState::kAvailable, &states_reached); if (!all_servables_available) { - string message = "Some servables did not become available: {"; + const int num_unavailable_servables = std::count_if( + states_reached.begin(), states_reached.end(), + [](const std::pair& + id_and_state) { + return id_and_state.second != + ServableState::ManagerState::kAvailable; + }); + string message = + strings::StrCat(num_unavailable_servables, + " servable(s) did not become available: {"); for (const auto& id_and_state : states_reached) { if (id_and_state.second != ServableState::ManagerState::kAvailable) { diff --git a/tensorflow_serving/model_servers/server_core.cc b/tensorflow_serving/model_servers/server_core.cc index d6e466d4da4..131d76cede6 100644 --- a/tensorflow_serving/model_servers/server_core.cc +++ b/tensorflow_serving/model_servers/server_core.cc @@ -21,6 +21,7 @@ limitations under the License. #include "google/protobuf/wrappers.pb.h" #include "tensorflow/core/lib/core/stringpiece.h" #include "tensorflow/core/lib/io/path.h" +#include "tensorflow/core/lib/strings/strcat.h" #include "tensorflow/core/platform/logging.h" #include "tensorflow_serving/core/load_servables_fast.h" #include "tensorflow_serving/model_servers/model_platform_types.h" @@ -293,7 +294,14 @@ Status ServerCore::WaitUntilModelsAvailable(const std::set& models, awaited_servables, ServableState::ManagerState::kAvailable, &states_reached); if (!all_models_available) { - string message = "Some models did not become available: {"; + const int num_unavailable_models = std::count_if( + states_reached.begin(), states_reached.end(), + [](const std::pair& + id_and_state) { + return id_and_state.second != ServableState::ManagerState::kAvailable; + }); + string message = strings::StrCat(num_unavailable_models, + " model(s) did not become available: {"); for (const auto& id_and_state : states_reached) { if (id_and_state.second != ServableState::ManagerState::kAvailable) { optional maybe_state = diff --git a/tensorflow_serving/model_servers/server_core_test.cc b/tensorflow_serving/model_servers/server_core_test.cc index 961305c7fb9..20605d8c3cd 100644 --- a/tensorflow_serving/model_servers/server_core_test.cc +++ b/tensorflow_serving/model_servers/server_core_test.cc @@ -294,7 +294,7 @@ TEST_P(ServerCoreTest, ErroringModel) { Status status = ServerCore::Create(std::move(options), &server_core); EXPECT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), - ::testing::HasSubstr("Some servables did not become available")); + ::testing::HasSubstr("1 servable(s) did not become available")); } TEST_P(ServerCoreTest, IllegalReconfigurationToCustomConfig) { From 8c02afa7dbb6ba78b7e5578b6d2ca030c3299665 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 18 Jun 2018 18:00:54 -0700 Subject: [PATCH 0042/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 201093161 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6f029c9a697..894b411ed32 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c71ffb283634636991084b647d61acf1d3c7549cce390d823568f7482eb65cf2", - git_commit = "c9b218bef42e6a56b90c5b4bd7978c9f5a042ed5", + sha256 = "ac70ee04ec0ca3174536cb311b76be3378c41aa71aba944764cc90e24b82d29b", + git_commit = "ef483add4baaf48e0e2bee200338a05f2cca5f08", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e6fc246316db78d6aeba9f88804e85e079af1341 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 19 Jun 2018 11:02:20 -0700 Subject: [PATCH 0043/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 201205408 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 894b411ed32..c026c88b6a7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ac70ee04ec0ca3174536cb311b76be3378c41aa71aba944764cc90e24b82d29b", - git_commit = "ef483add4baaf48e0e2bee200338a05f2cca5f08", + sha256 = "5546cd23a14e95496323a3b0558a3ab4146d88e4854c309a4bc877f614bcb2c5", + git_commit = "ced4fddc0400fedce8ba15fb9a3e6e765ddda757", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b3ebe2d57949fef83ce28edc63e620d86eb9b049 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 19 Jun 2018 13:03:00 -0700 Subject: [PATCH 0044/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 201226670 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c026c88b6a7..b2da25b1fd3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5546cd23a14e95496323a3b0558a3ab4146d88e4854c309a4bc877f614bcb2c5", - git_commit = "ced4fddc0400fedce8ba15fb9a3e6e765ddda757", + sha256 = "4765af1f86383fc4002650f6b4e563bd88632effae4cba95e6dcba32d6a4af3b", + git_commit = "9d2abd2ace95e6e352ba1292cc38c77b7bd1adc7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ef29c2ae3ad9f586823c39610de8f34320418603 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 19 Jun 2018 19:01:42 -0700 Subject: [PATCH 0045/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 201281409 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b2da25b1fd3..549cd18541a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4765af1f86383fc4002650f6b4e563bd88632effae4cba95e6dcba32d6a4af3b", - git_commit = "9d2abd2ace95e6e352ba1292cc38c77b7bd1adc7", + sha256 = "aa3bc9d6d45168f50d5e119ef896e5010cab92a52d0e9b57d5713602aa69585f", + git_commit = "a0d3f63176fd9c74f431d9510c1728ce4c61ebcc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 41a8fac387c3acfe0c506b0ca4dd838a97efdcd8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 19 Jun 2018 22:01:59 -0700 Subject: [PATCH 0046/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 201296220 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 549cd18541a..6cb2c794959 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "aa3bc9d6d45168f50d5e119ef896e5010cab92a52d0e9b57d5713602aa69585f", - git_commit = "a0d3f63176fd9c74f431d9510c1728ce4c61ebcc", + sha256 = "2997800708705960134a2ff96961d672577aa69f54400a11cc58e8205c450d55", + git_commit = "86f27ac6c46ddebce1ba28215f7bde5c30b5114e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 192842f58aad131ee9a88e790b954ba083ba6d24 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Tue, 19 Jun 2018 23:00:20 -0700 Subject: [PATCH 0047/8103] Internal changes PiperOrigin-RevId: 201300540 --- tensorflow_serving/model_servers/main.cc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index b0451158a98..ff652d23d0d 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -375,6 +375,7 @@ int main(int argc, char** argv) { string platform_config_file = ""; string model_config_file; string grpc_channel_arguments = ""; + bool enable_model_warmup = true; std::vector flag_list = { tensorflow::Flag("port", &port, "Port to listen on for gRPC API"), tensorflow::Flag("rest_api_port", &http_options.port, @@ -439,7 +440,11 @@ int main(int argc, char** argv) { tensorflow::Flag("grpc_channel_arguments", &grpc_channel_arguments, "A comma separated list of arguments to be passed to " "the grpc server. (e.g. " - "grpc.max_connection_age_ms=2000)")}; + "grpc.max_connection_age_ms=2000)"), + tensorflow::Flag("enable_model_warmup", &enable_model_warmup, + "Enables model warmup, which triggers lazy " + "initializations (such as TF optimizations) at load " + "time, to reduce first request latency.")}; string usage = tensorflow::Flags::Usage(argv[0], flag_list); const bool parse_result = tensorflow::Flags::Parse(&argc, argv, flag_list); @@ -496,6 +501,7 @@ int main(int argc, char** argv) { for (const string& tag : tags) { *session_bundle_config.add_saved_model_tags() = tag; } + session_bundle_config.set_enable_model_warmup(enable_model_warmup); options.platform_config_map = CreateTensorFlowPlatformConfigMap( session_bundle_config, use_saved_model); } else { From a8e58a806275a86e56d69a66d5a69eddb8cc5094 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Jun 2018 03:02:03 -0700 Subject: [PATCH 0048/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 201325251 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6cb2c794959..bfdb91b6298 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2997800708705960134a2ff96961d672577aa69f54400a11cc58e8205c450d55", - git_commit = "86f27ac6c46ddebce1ba28215f7bde5c30b5114e", + sha256 = "a9edb77895c46ac784fbe57ba1ab7a47ac1596278bbafe7532e679d766bb2a1f", + git_commit = "39ea5a7044a16b868e38717b358c46d6e3191373", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From eeda7713f12be04a47b2facdb15f98a089a25eaf Mon Sep 17 00:00:00 2001 From: awk Date: Wed, 20 Jun 2018 12:31:28 -0700 Subject: [PATCH 0049/8103] Internal Change PiperOrigin-RevId: 201396576 --- tensorflow_serving/tools/docker/Dockerfile | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile b/tensorflow_serving/tools/docker/Dockerfile index 986a697ef6c..ddf453781bd 100644 --- a/tensorflow_serving/tools/docker/Dockerfile +++ b/tensorflow_serving/tools/docker/Dockerfile @@ -19,16 +19,13 @@ RUN apt-get update && apt-get install -y \ curl \ gnupg -# Add TensorFlow Serving repo - -RUN echo "deb [arch=amd64] http://storage.googleapis.com/tensorflow-serving-apt stable tensorflow-model-server tensorflow-model-server-universal" | tee /etc/apt/sources.list.d/tensorflow-serving.list -# Ignore the warning about using apt-key output - we are not -ENV APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=1 -RUN curl -s https://storage.googleapis.com/tensorflow-serving-apt/tensorflow-serving.release.pub.gpg | apt-key add - - -# Get the model-server, use tensorflow-model-server-universal for older hardware -RUN apt-get update && apt-get install -y \ - tensorflow-model-server +# Install TF Serving pkg. +ARG TF_SERVING_VERSION=1.8.0 +# Use tensorflow-model-server-universal for older hardware +ARG TF_SERVING_PKGNAME=tensorflow-model-server +RUN curl -LO https://storage.googleapis.com/tensorflow-serving-apt/pool/${TF_SERVING_PKGNAME}-${TF_SERVING_VERSION}/t/${TF_SERVING_PKGNAME}/${TF_SERVING_PKGNAME}_${TF_SERVING_VERSION}_all.deb ; \ + dpkg -i ${TF_SERVING_PKGNAME}_${TF_SERVING_VERSION}_all.deb ; \ + rm ${TF_SERVING_PKGNAME}_${TF_SERVING_VERSION}_all.deb # Cleanup to reduce the size of the image # See https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#run @@ -49,4 +46,3 @@ RUN mkdir -p ${MODEL_BASE_PATH} # The only required piece is the model name in order to differentiate endpoints ENV MODEL_NAME=model ENTRYPOINT tensorflow_model_server --port=8500 --rest_api_port=8501 --model_name=${MODEL_NAME} --model_base_path=${MODEL_BASE_PATH}/${MODEL_NAME} - From 029578acb7f1a43a7c333f1ad2abe1dfbccab6ba Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Wed, 20 Jun 2018 12:46:30 -0700 Subject: [PATCH 0050/8103] Support building Python3-compatible PIP packages Fixes #700 PiperOrigin-RevId: 201398700 --- tensorflow_serving/g3doc/setup.md | 7 ---- .../tools/pip_package/build_pip_package.sh | 2 +- tensorflow_serving/tools/pip_package/setup.py | 38 +++++++++++++++++-- 3 files changed, 36 insertions(+), 11 deletions(-) diff --git a/tensorflow_serving/g3doc/setup.md b/tensorflow_serving/g3doc/setup.md index 8c741cc6948..52633be4123 100644 --- a/tensorflow_serving/g3doc/setup.md +++ b/tensorflow_serving/g3doc/setup.md @@ -74,13 +74,6 @@ To run Python client code without the need to install Bazel, you can install the pip install tensorflow-serving-api ``` -Note: The TensorFlow Serving Python API [is only published for Python -2](https://pypi.python.org/pypi/tensorflow-serving-api), but will work for -Python 3 if you either build it yourself, or download the Python 2 version, -unzip it, and copy it into your Python 3 path. There is a [feature -request](https://github.com/tensorflow/serving/issues/700) to publish the Python -3 package as well. - ## Installing using apt-get {#aptget} ### Available binaries diff --git a/tensorflow_serving/tools/pip_package/build_pip_package.sh b/tensorflow_serving/tools/pip_package/build_pip_package.sh index 90b904176d4..b1307d77779 100755 --- a/tensorflow_serving/tools/pip_package/build_pip_package.sh +++ b/tensorflow_serving/tools/pip_package/build_pip_package.sh @@ -53,7 +53,7 @@ function main() { pushd "${TMPDIR}" echo $(date) : "=== Building wheel" - python setup.py bdist_wheel # >/dev/null + python setup.py bdist_wheel --universal # >/dev/null mkdir -p "${DEST}" cp dist/* "${DEST}" popd diff --git a/tensorflow_serving/tools/pip_package/setup.py b/tensorflow_serving/tools/pip_package/setup.py index a00da3d0333..2ef86912dc2 100644 --- a/tensorflow_serving/tools/pip_package/setup.py +++ b/tensorflow_serving/tools/pip_package/setup.py @@ -11,11 +11,23 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -"""Package Setup script for the TensorFlow Serving Python API. +"""TensorFlow Serving Python API. + +TensorFlow Serving is a flexible, high-performance serving system for machine +learning models, designed for production environments.TensorFlow Serving makes +it easy to deploy new algorithms and experiments, while keeping the same server +architecture and APIs. TensorFlow Serving provides out-of-the-box integration +with TensorFlow models, but can be easily extended to serve other types of +models and data. + +This package contains the TensorFlow Serving Python APIs. """ + from setuptools import find_packages from setuptools import setup +DOCLINES = __doc__.split('\n') + # Set when releasing a new version of TensorFlow Serving (e.g. 1.0.0). _VERSION = 'undefined' @@ -30,9 +42,29 @@ author='Google Inc.', author_email='tensorflow-serving-dev@googlegroups.com', packages=find_packages(), - description='TensorFlow Serving API libraries', + description=DOCLINES[0], + long_description='\n'.join(DOCLINES[2:]), license='Apache 2.0', - url='http://tensorflow.org/deploy/tfserve', + url='http://tensorflow.org/serving', keywords='tensorflow serving machine learning api libraries', install_requires=REQUIRED_PACKAGES, + classifiers=[ + 'Development Status :: 5 - Production/Stable', + 'Intended Audience :: Developers', + 'Intended Audience :: Education', + 'Intended Audience :: Science/Research', + 'License :: OSI Approved :: Apache Software License', + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', + 'Topic :: Scientific/Engineering', + 'Topic :: Scientific/Engineering :: Mathematics', + 'Topic :: Scientific/Engineering :: Artificial Intelligence', + 'Topic :: Software Development', + 'Topic :: Software Development :: Libraries', + 'Topic :: Software Development :: Libraries :: Python Modules', + ], ) From 70239d53c30e0fb3eeceb068d92f5ed27f019f72 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Jun 2018 16:02:08 -0700 Subject: [PATCH 0051/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 201433480 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bfdb91b6298..e6584c3dd2a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a9edb77895c46ac784fbe57ba1ab7a47ac1596278bbafe7532e679d766bb2a1f", - git_commit = "39ea5a7044a16b868e38717b358c46d6e3191373", + sha256 = "f43bb1e09defadf347721d3abe040cc6440efb4510b664712af2b25f51038621", + git_commit = "4e012d227833c02e3864c7d8b2a22b707f0fc22f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0e161040a36161e59cfe06aef3a04042508e2d93 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Jun 2018 17:01:33 -0700 Subject: [PATCH 0052/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 201442537 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e6584c3dd2a..93c85d4ad62 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f43bb1e09defadf347721d3abe040cc6440efb4510b664712af2b25f51038621", - git_commit = "4e012d227833c02e3864c7d8b2a22b707f0fc22f", + sha256 = "1375305bd8239dfd8fa21f4b0cf3eaae6abac5b60b274514b29d1c41c71ea7e8", + git_commit = "2eff4fe42b16d93f22eb4ddb0dadd60079ef240d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ca896c9ebd6245a5522d5cd7455d6ee091e545f0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Jun 2018 18:01:04 -0700 Subject: [PATCH 0053/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 201450519 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 93c85d4ad62..d4f2bfeb441 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1375305bd8239dfd8fa21f4b0cf3eaae6abac5b60b274514b29d1c41c71ea7e8", - git_commit = "2eff4fe42b16d93f22eb4ddb0dadd60079ef240d", + sha256 = "b62875ce53979fd105c60e59babceac39626fc237eb5c6e12fda24e2ea2f6acb", + git_commit = "181110371dac5939f8d009de08a65e51340d591f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ec0a2b9a680366bf8eb5a654449c68de9fe5356a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Jun 2018 22:02:09 -0700 Subject: [PATCH 0054/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 201470469 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d4f2bfeb441..7953df02c73 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b62875ce53979fd105c60e59babceac39626fc237eb5c6e12fda24e2ea2f6acb", - git_commit = "181110371dac5939f8d009de08a65e51340d591f", + sha256 = "c10bce329d72632d8cc67d9ae6316eaa96ab53432ed300d4c0f21e8343645b61", + git_commit = "57eadf97b79eee8c011c2bd3e12e97c843a7d8a3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 93d88daf687804efa9cd62c3e2df06d9fddb780c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Jun 2018 01:02:00 -0700 Subject: [PATCH 0055/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 201484822 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7953df02c73..757725c014c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c10bce329d72632d8cc67d9ae6316eaa96ab53432ed300d4c0f21e8343645b61", - git_commit = "57eadf97b79eee8c011c2bd3e12e97c843a7d8a3", + sha256 = "248cc7a88fbc45397543d4f2687ac682043273f27e10014ab740e51665249e0a", + git_commit = "a8c59ba450a958a1d6a1754ad1fd7476fcac3532", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 94e3861b59ad78ebe499b7e84579b1bb19e50f70 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Jun 2018 10:02:49 -0700 Subject: [PATCH 0056/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 201542145 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 757725c014c..ba0030d90e6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "248cc7a88fbc45397543d4f2687ac682043273f27e10014ab740e51665249e0a", - git_commit = "a8c59ba450a958a1d6a1754ad1fd7476fcac3532", + sha256 = "c16dcd6bef3913b177b88ac689ca4c62d58afe49717dd75b71c813143bb1c52c", + git_commit = "86e11d29dc76a09ff8bbc0b426ca78c98946bf23", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 65a6f30dafcb92acb76b1d4f047cb98fcacfad44 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Jun 2018 11:03:30 -0700 Subject: [PATCH 0057/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 201552878 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ba0030d90e6..c137bd12e81 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c16dcd6bef3913b177b88ac689ca4c62d58afe49717dd75b71c813143bb1c52c", - git_commit = "86e11d29dc76a09ff8bbc0b426ca78c98946bf23", + sha256 = "84b3efb2869b49a72ce1c42eddca12af9446b81f60f581684feea3969bca8fce", + git_commit = "0a67d9fec18b68001ed6185230ae00f5399540fa", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 10b647f127191ee2e37584ec501752c387874162 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Jun 2018 14:01:42 -0700 Subject: [PATCH 0058/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 201582106 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c137bd12e81..fa5321296ae 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "84b3efb2869b49a72ce1c42eddca12af9446b81f60f581684feea3969bca8fce", - git_commit = "0a67d9fec18b68001ed6185230ae00f5399540fa", + sha256 = "618ffa50e5dabad0d3da2669556fefe1e27f3a831a625672a61b6e414b793d4b", + git_commit = "5cfa4f6ef7f40825eedf30317dfdd619b50c4f7d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8eb1ed13a0aca471ed517be83cf277e63c80cc4a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Jun 2018 19:02:28 -0700 Subject: [PATCH 0059/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 201624665 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fa5321296ae..c9a12aa4172 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "618ffa50e5dabad0d3da2669556fefe1e27f3a831a625672a61b6e414b793d4b", - git_commit = "5cfa4f6ef7f40825eedf30317dfdd619b50c4f7d", + sha256 = "2b13bf421d38def93ee308bb8cb134e12ddb21d2fd065b06a2ae6db0e0af9a2c", + git_commit = "f0d4b2440b20eb8fbfdfeb8a0e2bc60fc989b9c6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4000791ae00bd5b48da7e3873726b010c9fe81fa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Jun 2018 23:03:53 -0700 Subject: [PATCH 0060/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 201640632 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c9a12aa4172..df95dbb8736 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2b13bf421d38def93ee308bb8cb134e12ddb21d2fd065b06a2ae6db0e0af9a2c", - git_commit = "f0d4b2440b20eb8fbfdfeb8a0e2bc60fc989b9c6", + sha256 = "fb4908beb718699adbaed55790a49d3b96cbbad392bfa3f74c1077e6172fdff3", + git_commit = "359f53686c87ee76e80353c32a3d22cfb1cf0989", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 71ea77cb6450a8398c2dcccbf31020d70a90fbee Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Jun 2018 11:01:36 -0700 Subject: [PATCH 0061/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 201710289 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index df95dbb8736..2b5516bf02a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fb4908beb718699adbaed55790a49d3b96cbbad392bfa3f74c1077e6172fdff3", - git_commit = "359f53686c87ee76e80353c32a3d22cfb1cf0989", + sha256 = "576bb0920b3f91293482df74b9a44feca336d84172b408c38c553d462185e3a1", + git_commit = "82a8b1b30f4d2eff5ae17839a118f5e8e83d81a2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4feda41bf4da913a5411e13b0fd6ed82dae2f7d7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Jun 2018 12:01:47 -0700 Subject: [PATCH 0062/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 201720264 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2b5516bf02a..bedaef68bdc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "576bb0920b3f91293482df74b9a44feca336d84172b408c38c553d462185e3a1", - git_commit = "82a8b1b30f4d2eff5ae17839a118f5e8e83d81a2", + sha256 = "25adf1650c5ed25c9cae552463265358492599da5266ca624e5278d7adb4a502", + git_commit = "63558e1444f8913f78543604bef47ccdac1db1f6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 97d7bb6ad75da0b1285fe1c2eb01ac6e097c3d30 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Jun 2018 13:01:06 -0700 Subject: [PATCH 0063/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 201728696 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bedaef68bdc..4d111ddf15b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "25adf1650c5ed25c9cae552463265358492599da5266ca624e5278d7adb4a502", - git_commit = "63558e1444f8913f78543604bef47ccdac1db1f6", + sha256 = "70bd8ef324ef0d56ec83824fc44cbdf6149766b6360762fcf5b9f7a1d1653148", + git_commit = "6cab66afb642aeea6f3e10e7b537b47737a601ab", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7cf980557b4c684ea5c76d85f62a5028f7c3f0fb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Jun 2018 15:02:01 -0700 Subject: [PATCH 0064/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 201747067 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4d111ddf15b..93cecf1e2d4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "70bd8ef324ef0d56ec83824fc44cbdf6149766b6360762fcf5b9f7a1d1653148", - git_commit = "6cab66afb642aeea6f3e10e7b537b47737a601ab", + sha256 = "c6664f480873da51efe54293f60c78f549433456034d5262e468ef3588a5adfa", + git_commit = "efdc23321b8038d2dfc3ac4da058b00de3c15059", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d9cda86875d70254c74f2978316cf17739895eda Mon Sep 17 00:00:00 2001 From: shohinighosh Date: Fri, 22 Jun 2018 16:20:19 -0700 Subject: [PATCH 0065/8103] Regenerate Model Service python proto files PiperOrigin-RevId: 201757996 --- tensorflow_serving/apis/BUILD | 15 +- tensorflow_serving/apis/model_service_pb2.py | 184 +++++------------- .../apis/model_service_pb2_grpc.py | 56 ++++-- tensorflow_serving/config/BUILD | 4 + tensorflow_serving/sources/storage_path/BUILD | 7 + 5 files changed, 115 insertions(+), 151 deletions(-) diff --git a/tensorflow_serving/apis/BUILD b/tensorflow_serving/apis/BUILD index fb9c83ba68d..6efae87eb0e 100644 --- a/tensorflow_serving/apis/BUILD +++ b/tensorflow_serving/apis/BUILD @@ -212,6 +212,16 @@ serving_proto_library( ], ) +serving_proto_library_py( + name = "model_management_proto_py_pb2", + srcs = ["model_management.proto"], + proto_library = "model_management_proto", + deps = [ + "//tensorflow_serving/config:model_server_config_proto_py_pb2", + "//tensorflow_serving/util:status_proto_py_pb2", + ], +) + serving_proto_library( name = "get_model_status_proto", srcs = ["get_model_status.proto"], @@ -253,7 +263,10 @@ py_library( "model_service_pb2_grpc.py", ], srcs_version = "PY2AND3", - deps = [":get_model_status_proto_py_pb2"], + deps = [ + ":get_model_status_proto_py_pb2", + ":model_management_proto_py_pb2", + ], ) serving_go_grpc_library( diff --git a/tensorflow_serving/apis/model_service_pb2.py b/tensorflow_serving/apis/model_service_pb2.py index 5c8787abd70..76f1d606cb2 100644 --- a/tensorflow_serving/apis/model_service_pb2.py +++ b/tensorflow_serving/apis/model_service_pb2.py @@ -30,153 +30,61 @@ from tensorflow_serving.apis import get_model_status_pb2 as tensorflow__serving_dot_apis_dot_get__model__status__pb2 - +from tensorflow_serving.apis import model_management_pb2 as tensorflow__serving_dot_apis_dot_model__management__pb2 DESCRIPTOR = _descriptor.FileDescriptor( - name='tensorflow_serving/apis/model_service.proto', - package='tensorflow.serving', - syntax='proto3', - serialized_pb=_b('\n+tensorflow_serving/apis/model_service.proto\x12\x12tensorflow.serving\x1a.tensorflow_serving/apis/get_model_status.proto2w\n\x0cModelService\x12g\n\x0eGetModelStatus\x12).tensorflow.serving.GetModelStatusRequest\x1a*.tensorflow.serving.GetModelStatusResponseB\x03\xf8\x01\x01\x62\x06proto3') - , - dependencies=[tensorflow__serving_dot_apis_dot_get__model__status__pb2.DESCRIPTOR,]) -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - - + name='tensorflow_serving/apis/model_service.proto', + package='tensorflow.serving', + syntax='proto3', + serialized_pb=_b( + '\n+tensorflow_serving/apis/model_service.proto\x12\x12tensorflow.serving\x1a.tensorflow_serving/apis/get_model_status.proto\x1a.tensorflow_serving/apis/model_management.proto2\xe7\x01\n\x0cModelService\x12g\n\x0eGetModelStatus\x12).tensorflow.serving.GetModelStatusRequest\x1a*.tensorflow.serving.GetModelStatusResponse\x12n\n\x19HandleReloadConfigRequest\x12\'.tensorflow.serving.ReloadConfigRequest\x1a(.tensorflow.serving.ReloadConfigResponseB\x03\xf8\x01\x01\x62\x06proto3' + ), + dependencies=[ + tensorflow__serving_dot_apis_dot_get__model__status__pb2.DESCRIPTOR, + tensorflow__serving_dot_apis_dot_model__management__pb2.DESCRIPTOR, + ]) +_sym_db.RegisterFileDescriptor(DESCRIPTOR) DESCRIPTOR.has_options = True DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\370\001\001')) -try: - # THESE ELEMENTS WILL BE DEPRECATED. - # Please use the generated *_pb2_grpc.py files instead. - import grpc - from grpc.framework.common import cardinality - from grpc.framework.interfaces.face import utilities as face_utilities - from grpc.beta import implementations as beta_implementations - from grpc.beta import interfaces as beta_interfaces - - - class ModelServiceStub(object): - """ModelService provides access to information about model versions - that have been handled by the model server. - """ - - def __init__(self, channel): - """Constructor. - - Args: - channel: A grpc.Channel. - """ - self.GetModelStatus = channel.unary_unary( - '/tensorflow.serving.ModelService/GetModelStatus', - request_serializer=tensorflow__serving_dot_apis_dot_get__model__status__pb2.GetModelStatusRequest.SerializeToString, - response_deserializer=tensorflow__serving_dot_apis_dot_get__model__status__pb2.GetModelStatusResponse.FromString, - ) - - - class ModelServiceServicer(object): - """ModelService provides access to information about model versions - that have been handled by the model server. - """ - - def GetModelStatus(self, request, context): - """Gets status of model. If the ModelSpec in the request does not specify - version, information about all versions of the model will be returned. If - the ModelSpec in the request does specify a version, the status of only - that version will be returned. - """ - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def add_ModelServiceServicer_to_server(servicer, server): - rpc_method_handlers = { - 'GetModelStatus': grpc.unary_unary_rpc_method_handler( - servicer.GetModelStatus, - request_deserializer=tensorflow__serving_dot_apis_dot_get__model__status__pb2.GetModelStatusRequest.FromString, - response_serializer=tensorflow__serving_dot_apis_dot_get__model__status__pb2.GetModelStatusResponse.SerializeToString, +_MODELSERVICE = _descriptor.ServiceDescriptor( + name='ModelService', + full_name='tensorflow.serving.ModelService', + file=DESCRIPTOR, + index=0, + options=None, + serialized_start=164, + serialized_end=395, + methods=[ + _descriptor.MethodDescriptor( + name='GetModelStatus', + full_name='tensorflow.serving.ModelService.GetModelStatus', + index=0, + containing_service=None, + input_type=tensorflow__serving_dot_apis_dot_get__model__status__pb2. + _GETMODELSTATUSREQUEST, + output_type=tensorflow__serving_dot_apis_dot_get__model__status__pb2. + _GETMODELSTATUSRESPONSE, + options=None, ), - } - generic_handler = grpc.method_handlers_generic_handler( - 'tensorflow.serving.ModelService', rpc_method_handlers) - server.add_generic_rpc_handlers((generic_handler,)) - - - class BetaModelServiceServicer(object): - """The Beta API is deprecated for 0.15.0 and later. - - It is recommended to use the GA API (classes and functions in this - file not marked beta) for all further purposes. This class was generated - only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0.""" - """ModelService provides access to information about model versions - that have been handled by the model server. - """ - def GetModelStatus(self, request, context): - """Gets status of model. If the ModelSpec in the request does not specify - version, information about all versions of the model will be returned. If - the ModelSpec in the request does specify a version, the status of only - that version will be returned. - """ - context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) - - - class BetaModelServiceStub(object): - """The Beta API is deprecated for 0.15.0 and later. - - It is recommended to use the GA API (classes and functions in this - file not marked beta) for all further purposes. This class was generated - only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0.""" - """ModelService provides access to information about model versions - that have been handled by the model server. - """ - def GetModelStatus(self, request, timeout, metadata=None, with_call=False, protocol_options=None): - """Gets status of model. If the ModelSpec in the request does not specify - version, information about all versions of the model will be returned. If - the ModelSpec in the request does specify a version, the status of only - that version will be returned. - """ - raise NotImplementedError() - GetModelStatus.future = None - - - def beta_create_ModelService_server(servicer, pool=None, pool_size=None, default_timeout=None, maximum_timeout=None): - """The Beta API is deprecated for 0.15.0 and later. - - It is recommended to use the GA API (classes and functions in this - file not marked beta) for all further purposes. This function was - generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0""" - request_deserializers = { - ('tensorflow.serving.ModelService', 'GetModelStatus'): tensorflow__serving_dot_apis_dot_get__model__status__pb2.GetModelStatusRequest.FromString, - } - response_serializers = { - ('tensorflow.serving.ModelService', 'GetModelStatus'): tensorflow__serving_dot_apis_dot_get__model__status__pb2.GetModelStatusResponse.SerializeToString, - } - method_implementations = { - ('tensorflow.serving.ModelService', 'GetModelStatus'): face_utilities.unary_unary_inline(servicer.GetModelStatus), - } - server_options = beta_implementations.server_options(request_deserializers=request_deserializers, response_serializers=response_serializers, thread_pool=pool, thread_pool_size=pool_size, default_timeout=default_timeout, maximum_timeout=maximum_timeout) - return beta_implementations.server(method_implementations, options=server_options) - + _descriptor.MethodDescriptor( + name='HandleReloadConfigRequest', + full_name= + 'tensorflow.serving.ModelService.HandleReloadConfigRequest', + index=1, + containing_service=None, + input_type=tensorflow__serving_dot_apis_dot_model__management__pb2. + _RELOADCONFIGREQUEST, + output_type=tensorflow__serving_dot_apis_dot_model__management__pb2. + _RELOADCONFIGRESPONSE, + options=None, + ), + ]) +_sym_db.RegisterServiceDescriptor(_MODELSERVICE) - def beta_create_ModelService_stub(channel, host=None, metadata_transformer=None, pool=None, pool_size=None): - """The Beta API is deprecated for 0.15.0 and later. +DESCRIPTOR.services_by_name['ModelService'] = _MODELSERVICE - It is recommended to use the GA API (classes and functions in this - file not marked beta) for all further purposes. This function was - generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0""" - request_serializers = { - ('tensorflow.serving.ModelService', 'GetModelStatus'): tensorflow__serving_dot_apis_dot_get__model__status__pb2.GetModelStatusRequest.SerializeToString, - } - response_deserializers = { - ('tensorflow.serving.ModelService', 'GetModelStatus'): tensorflow__serving_dot_apis_dot_get__model__status__pb2.GetModelStatusResponse.FromString, - } - cardinalities = { - 'GetModelStatus': cardinality.Cardinality.UNARY_UNARY, - } - stub_options = beta_implementations.stub_options(host=host, metadata_transformer=metadata_transformer, request_serializers=request_serializers, response_deserializers=response_deserializers, thread_pool=pool, thread_pool_size=pool_size) - return beta_implementations.dynamic_stub(channel, 'tensorflow.serving.ModelService', cardinalities, options=stub_options) -except ImportError: - pass # @@protoc_insertion_point(module_scope) diff --git a/tensorflow_serving/apis/model_service_pb2_grpc.py b/tensorflow_serving/apis/model_service_pb2_grpc.py index a44c7c7f53a..44c578b8648 100644 --- a/tensorflow_serving/apis/model_service_pb2_grpc.py +++ b/tensorflow_serving/apis/model_service_pb2_grpc.py @@ -18,15 +18,14 @@ # python -m grpc.tools.protoc --python_out=. --grpc_python_out=. -I. tensorflow_serving/apis/model_service.proto import grpc -from grpc.framework.common import cardinality -from grpc.framework.interfaces.face import utilities as face_utilities -import tensorflow_serving.apis.get_model_status_pb2 as tensorflow__serving_dot_apis_dot_get__model__status__pb2 +from tensorflow_serving.apis import get_model_status_pb2 as tensorflow__serving_dot_apis_dot_get__model__status__pb2 +from tensorflow_serving.apis import model_management_pb2 as tensorflow__serving_dot_apis_dot_model__management__pb2 class ModelServiceStub(object): - """ModelService provides access to information about model versions - that have been handled by the model server. + """ModelService provides methods to query and update the state of the server, + e.g. which models/versions are being served. """ def __init__(self, channel): @@ -40,11 +39,20 @@ def __init__(self, channel): request_serializer=tensorflow__serving_dot_apis_dot_get__model__status__pb2.GetModelStatusRequest.SerializeToString, response_deserializer=tensorflow__serving_dot_apis_dot_get__model__status__pb2.GetModelStatusResponse.FromString, ) + self.HandleReloadConfigRequest = channel.unary_unary( + '/tensorflow.serving.ModelService/HandleReloadConfigRequest', + request_serializer= + tensorflow__serving_dot_apis_dot_model__management__pb2. + ReloadConfigRequest.SerializeToString, + response_deserializer= + tensorflow__serving_dot_apis_dot_model__management__pb2. + ReloadConfigResponse.FromString, + ) class ModelServiceServicer(object): - """ModelService provides access to information about model versions - that have been handled by the model server. + """ModelService provides methods to query and update the state of the server, + e.g. which models/versions are being served. """ def GetModelStatus(self, request, context): @@ -57,14 +65,38 @@ def GetModelStatus(self, request, context): context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') + def HandleReloadConfigRequest(self, request, context): + """Reloads the set of served models. The new config supersedes the old one, + so if a model is omitted from the new config it will be unloaded and no + longer served. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + def add_ModelServiceServicer_to_server(servicer, server): rpc_method_handlers = { - 'GetModelStatus': grpc.unary_unary_rpc_method_handler( - servicer.GetModelStatus, - request_deserializer=tensorflow__serving_dot_apis_dot_get__model__status__pb2.GetModelStatusRequest.FromString, - response_serializer=tensorflow__serving_dot_apis_dot_get__model__status__pb2.GetModelStatusResponse.SerializeToString, - ), + 'GetModelStatus': + grpc.unary_unary_rpc_method_handler( + servicer.GetModelStatus, + request_deserializer= + tensorflow__serving_dot_apis_dot_get__model__status__pb2. + GetModelStatusRequest.FromString, + response_serializer= + tensorflow__serving_dot_apis_dot_get__model__status__pb2. + GetModelStatusResponse.SerializeToString, + ), + 'HandleReloadConfigRequest': + grpc.unary_unary_rpc_method_handler( + servicer.HandleReloadConfigRequest, + request_deserializer= + tensorflow__serving_dot_apis_dot_model__management__pb2. + ReloadConfigRequest.FromString, + response_serializer= + tensorflow__serving_dot_apis_dot_model__management__pb2. + ReloadConfigResponse.SerializeToString, + ), } generic_handler = grpc.method_handlers_generic_handler( 'tensorflow.serving.ModelService', rpc_method_handlers) diff --git a/tensorflow_serving/config/BUILD b/tensorflow_serving/config/BUILD index 84dfe5364f6..1aa58c360cd 100644 --- a/tensorflow_serving/config/BUILD +++ b/tensorflow_serving/config/BUILD @@ -37,6 +37,10 @@ serving_proto_library_py( name = "model_server_config_proto_py_pb2", srcs = ["model_server_config.proto"], proto_library = "model_server_config_proto", + deps = [ + ":logging_config_proto_py_pb2", + "//tensorflow_serving/sources/storage_path:file_system_storage_path_source_proto_py_pb2", + ], ) serving_proto_library( diff --git a/tensorflow_serving/sources/storage_path/BUILD b/tensorflow_serving/sources/storage_path/BUILD index 6106cbc55a2..7a294ddeccc 100644 --- a/tensorflow_serving/sources/storage_path/BUILD +++ b/tensorflow_serving/sources/storage_path/BUILD @@ -38,6 +38,7 @@ cc_library( ) load("//tensorflow_serving:serving.bzl", "serving_proto_library") +load("//tensorflow_serving:serving.bzl", "serving_proto_library_py") serving_proto_library( name = "static_storage_path_source_proto", @@ -88,6 +89,12 @@ serving_proto_library( visibility = ["//visibility:public"], ) +serving_proto_library_py( + name = "file_system_storage_path_source_proto_py_pb2", + srcs = ["file_system_storage_path_source.proto"], + proto_library = "file_system_storage_path_source_proto", +) + cc_test( name = "file_system_storage_path_source_test", srcs = From b02225653ab7ddff70e789590ca396a04d88e7fc Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Fri, 22 Jun 2018 16:57:55 -0700 Subject: [PATCH 0066/8103] Update docker instructions to reference pre-built images PiperOrigin-RevId: 201762569 --- tensorflow_serving/g3doc/docker.md | 125 +++++++++++++++++------------ 1 file changed, 75 insertions(+), 50 deletions(-) diff --git a/tensorflow_serving/g3doc/docker.md b/tensorflow_serving/g3doc/docker.md index c6858933c10..1e84c194b51 100644 --- a/tensorflow_serving/g3doc/docker.md +++ b/tensorflow_serving/g3doc/docker.md @@ -1,7 +1,7 @@ # Using TensorFlow Serving via Docker -This directory contains Dockerfiles to make it easy to get up and running with -TensorFlow Serving via [Docker](http://www.docker.com/). +One of the easiest ways to get started using TensorFlow Serving is via +[Docker](http://www.docker.com/). ## Installing Docker @@ -13,69 +13,44 @@ quick links here: toolbox](https://www.docker.com/toolbox) * [Ubuntu](https://docs.docker.com/installation/ubuntulinux/) -## Which containers exist? +## Getting started -We currently maintain the following Dockerfiles: - -* [`Dockerfile`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile), - which is a minimal VM with TensorFlow Serving installed. - -* [`Dockerfile.devel`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.devel), - which is a minimal VM with all of the dependencies needed to build - TensorFlow Serving. - -* [`Dockerfile.devel-gpu`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.devel), - which is a minimal VM with all of the dependencies needed to build - TensorFlow Serving with GPU support. - -## Building a container - -`Dockerfile`: - -```shell -docker build --pull -t $USER/tensorflow-serving . -``` +### Pulling an image -`Dockerfile.devel`: +Once you have Docker installed, you can pull the latest TensorFlow Serving +docker image by running: ```shell -docker build --pull -t $USER/tensorflow-serving-devel -f Dockerfile.devel . +docker pull tensorflow/serving ``` -`Dockerfile.devel-gpu`: +This will pull down an minimal Docker image with TensorFlow Serving installed. +See the Docker Hub [tensorflow/serving +repo](http://hub.docker.com/r/tensorflow/serving/tags/) for other versions of +images you can pull. -```shell -docker build --pull -t $USER/tensorflow-serving-devel-gpu -f Dockerfile.devel-gpu . -``` -TIP: By default, building TensorFlow Serving from sources consumes a lot of RAM. -If RAM is an issue on your system, you may limit RAM usage by specifying -`--local_resources 2048,.5,1.0` while invoking bazel. You can use this same -mechanism to tweak the optmizations you're building TensorFlow Serving with. Ex: -`docker build --pull --build-arg TF_SERVING_BUILD_OPTIONS="--copt=-mavx ---cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0 --local_resources 2048,.5,1.0" -t -$USER/tensorflow-serving-devel -f Dockerfile.devel .` +### Serving example -## Running a container +Once you have pulled the serving image, you can try serving an example model. -### Serving Example +We will use a toy model called `Half Plus Three`, which will predict values `0.5 +* x + 3` for the values we provide for prediction. -This assumes you have built the `Dockerfile` container. - -First you will need a model. Clone the TensorFlow Serving repo. +To get this model, first clone the TensorFlow Serving repo. ```shell mkdir -p /tmp/tfserving cd /tmp/tfserving -git clone --recursive https://github.com/tensorflow/serving +git clone --depth=1 https://github.com/tensorflow/serving ``` -We will use a toy model called Half Plus Three, which will predict values 0.5\*x -+ 3 for the values we provide for prediction. +Next, run the TensorFlow Serving container pointing it to this model and opening +the REST API port (8501): ```shell docker run -p 8501:8501 \ -v /tmp/tfserving/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_three:/models/half_plus_three \ --e MODEL_NAME=half_plus_three -t $USER/tensorflow-serving & +-e MODEL_NAME=half_plus_three -t tensorflow/serving & ``` This will run the docker container and launch the TensorFlow Serving Model @@ -97,11 +72,62 @@ This should return a set of values: More information on using the RESTful API can be found [here](api_rest.md). -### Development Example +## What Dockerfiles do you maintain? + +We currently maintain the following Dockerfiles: + +* [`Dockerfile`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile), + which is a minimal VM with TensorFlow Serving installed. + +* [`Dockerfile.devel`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.devel), + which is a minimal VM with all of the dependencies needed to build + TensorFlow Serving. + +* [`Dockerfile.devel-gpu`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.devel), + which is a minimal VM with all of the dependencies needed to build + TensorFlow Serving with GPU support. + +### Building a container from a Dockerfile + +`Dockerfile`: + +```shell +docker build --pull -t $USER/tensorflow-serving . +``` + +`Dockerfile.devel`: + +```shell +docker build --pull -t $USER/tensorflow-serving-devel -f Dockerfile.devel . +``` + +`Dockerfile.devel-gpu`: + +```shell +docker build --pull -t $USER/tensorflow-serving-devel-gpu -f Dockerfile.devel-gpu . +``` + +TIP: Before attempting to build an image, check the Docker Hub +[tensorflow/serving repo](http://hub.docker.com/r/tensorflow/serving/tags/) to +make sure an image that meets your needs doesn't already exist. + +By default, building TensorFlow Serving from sources consumes a lot of RAM. If +RAM is an issue on your system, you may limit RAM usage by specifying +`--local_resources 2048,.5,1.0` while invoking bazel. You can use this same +mechanism to tweak the optmizations you're building TensorFlow Serving with. For +example: + +```shell +docker build --pull --build-arg TF_SERVING_BUILD_OPTIONS="--copt=-mavx \ +--cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0 --local_resources 2048,.5,1.0" -t \ +$USER/tensorflow-serving-devel -f Dockerfile.devel . +``` + +### Running a container This assumes you have built the `Dockerfile.devel` container. -To run the container: +To run the container opening the gRPC port (8500): ```shell docker run -it -p 8500:8500 $USER/tensorflow-serving-devel @@ -110,7 +136,7 @@ docker run -it -p 8500:8500 $USER/tensorflow-serving-devel This will pull the latest TensorFlow Serving release with a prebuilt binary and working development environment. To test a model, from inside the container try: -``````shell +```shell bazel build -c opt //tensorflow_serving/example:mnist_saved_model # train the mnist model bazel-bin/tensorflow_serving/example/mnist_saved_model /tmp/mnist_model @@ -120,5 +146,4 @@ tensorflow_model_server --port=8500 --model_name=mnist --model_base_path=/tmp/mn bazel build -c opt //tensorflow_serving/example:mnist_client # test the client bazel-bin/tensorflow_serving/example/mnist_client --num_tests=1000 --server=localhost:8500 -````` -`````` +``` From f7d670d309f60757b115420257bb976a3d907bcf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Jun 2018 17:02:17 -0700 Subject: [PATCH 0067/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 201763038 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 93cecf1e2d4..16b840b6fc9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c6664f480873da51efe54293f60c78f549433456034d5262e468ef3588a5adfa", - git_commit = "efdc23321b8038d2dfc3ac4da058b00de3c15059", + sha256 = "8a2141420b2717b6fa29cf4ec817f4f1342e5f5e14a4ae7085dba1fd26cc9618", + git_commit = "56357d0cb4340d8eefd05358efc3a7077783c480", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1624a7d48573c4351410f07ebb9f63bbc6d8f1f2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Jun 2018 18:00:32 -0700 Subject: [PATCH 0068/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 201768700 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 16b840b6fc9..d2e3c055fe1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8a2141420b2717b6fa29cf4ec817f4f1342e5f5e14a4ae7085dba1fd26cc9618", - git_commit = "56357d0cb4340d8eefd05358efc3a7077783c480", + sha256 = "1ebdd494ebbe6fe42c7b215921ab2789403a06098f6fa6f3a64958ba55ffc649", + git_commit = "f5bbc489418cd892201aa4a9e28f72477cc01437", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 54d6422c7cabc9791346fab8d791ff4a20d9eab6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Jun 2018 22:00:34 -0700 Subject: [PATCH 0069/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 201782463 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d2e3c055fe1..c35dbd9b229 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1ebdd494ebbe6fe42c7b215921ab2789403a06098f6fa6f3a64958ba55ffc649", - git_commit = "f5bbc489418cd892201aa4a9e28f72477cc01437", + sha256 = "6a27266c834114feb960af3530d70a8cac38bf5d7968f1b74c5902b7953925a6", + git_commit = "078ae78fcac2f9c9cb79663052221a20a1dcd274", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6eae772e7aa00a5e889d6558ea2033f8655ec552 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 23 Jun 2018 00:05:00 -0700 Subject: [PATCH 0070/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 201787775 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c35dbd9b229..1af09ba7f5d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6a27266c834114feb960af3530d70a8cac38bf5d7968f1b74c5902b7953925a6", - git_commit = "078ae78fcac2f9c9cb79663052221a20a1dcd274", + sha256 = "0d04e526cd8087b7968bc045fb2d9f8cb6becb5bf78d866ea6f15e0726bb5103", + git_commit = "c1d223de41838e9d387a48137c76ea39d3b38f3f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From cd6c376e4f5e97e67714d46ee8aa4a03f2ccbb15 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 23 Jun 2018 16:02:58 -0700 Subject: [PATCH 0071/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 201826384 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1af09ba7f5d..20239c1ac25 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0d04e526cd8087b7968bc045fb2d9f8cb6becb5bf78d866ea6f15e0726bb5103", - git_commit = "c1d223de41838e9d387a48137c76ea39d3b38f3f", + sha256 = "98c9b87b27f9fc234658a303357122bdd6af6a0223614fa255a72c7a0e08f3f5", + git_commit = "cb401f09be5b816e704a70babc0facad63e84636", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 93d47c92e1cc81d6af4399f7ecadb96aae4ee6b5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 24 Jun 2018 11:01:20 -0700 Subject: [PATCH 0072/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 201871857 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 20239c1ac25..7b12de6f0a7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "98c9b87b27f9fc234658a303357122bdd6af6a0223614fa255a72c7a0e08f3f5", - git_commit = "cb401f09be5b816e704a70babc0facad63e84636", + sha256 = "08399dca7e3e8422ea9fbad8e29232d7564e0bfd321afbd67e4228444e07aad1", + git_commit = "f202958ee2d5177a474e3d107fdbf0c83174d099", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 104ee7abd2180671b2c1fd5c8bbab55b0759ce80 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Jun 2018 10:01:12 -0700 Subject: [PATCH 0073/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 201970828 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7b12de6f0a7..ff416b66bb4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "08399dca7e3e8422ea9fbad8e29232d7564e0bfd321afbd67e4228444e07aad1", - git_commit = "f202958ee2d5177a474e3d107fdbf0c83174d099", + sha256 = "a03ef9bc7e4bdebfd1dd9fd055385f25a7f085c351c34752da73a43faa52cd5a", + git_commit = "b10d0badd870cee6bccf454679c4f617598ae7f2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3319033cdd3ee27fd6c9a1079a7edc2c53c367ce Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Jun 2018 11:01:35 -0700 Subject: [PATCH 0074/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 201982457 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ff416b66bb4..0904ba3932b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a03ef9bc7e4bdebfd1dd9fd055385f25a7f085c351c34752da73a43faa52cd5a", - git_commit = "b10d0badd870cee6bccf454679c4f617598ae7f2", + sha256 = "cfb4b534c01bd253e502f847bcabd34ab0041e5c31a2db26bd57e9768470b549", + git_commit = "34c4d7dd230acf9ec6d94937cf3bfc17be516c98", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0f1fa0b4ef63ec65b324c8b777e687f556770b84 Mon Sep 17 00:00:00 2001 From: awk Date: Mon, 25 Jun 2018 11:17:39 -0700 Subject: [PATCH 0075/8103] Account for difference between semantic and python (PEP 440) versioning specificiation. Notably 1.9.0-rc2 is valid in the semantic versioning scheme, for python/pip an equivalent one would be 1.9.0rc2 (note lack of hypen for python versioning). See this for more detals: https://www.python.org/dev/peps/pep-0440/#semantic-versioning PiperOrigin-RevId: 201985820 --- tensorflow_serving/tools/pip_package/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/tools/pip_package/setup.py b/tensorflow_serving/tools/pip_package/setup.py index 2ef86912dc2..78fff31b683 100644 --- a/tensorflow_serving/tools/pip_package/setup.py +++ b/tensorflow_serving/tools/pip_package/setup.py @@ -38,7 +38,7 @@ setup( name='tensorflow-serving-api', - version=_VERSION, + version=_VERSION.replace('-', ''), author='Google Inc.', author_email='tensorflow-serving-dev@googlegroups.com', packages=find_packages(), From d77c9768e33e1207ac8757cff56b9ed9a53f8765 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Jun 2018 15:01:43 -0700 Subject: [PATCH 0076/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202025282 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0904ba3932b..cc187454f76 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cfb4b534c01bd253e502f847bcabd34ab0041e5c31a2db26bd57e9768470b549", - git_commit = "34c4d7dd230acf9ec6d94937cf3bfc17be516c98", + sha256 = "2cbabe41789f3ba8db923436736efff2563d156e4d5688f671eaa9f910786950", + git_commit = "9590c4c32dd4346ea5c35673336f5912c6072bf2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7a2063234d490d7fe4274ba26cc5488d4f042111 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Jun 2018 19:01:29 -0700 Subject: [PATCH 0077/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202059256 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cc187454f76..dad84da586b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2cbabe41789f3ba8db923436736efff2563d156e4d5688f671eaa9f910786950", - git_commit = "9590c4c32dd4346ea5c35673336f5912c6072bf2", + sha256 = "eb9fff34137a1805b7acab92040aed066f68a950b5e37bca1a30eb6964bcaa1f", + git_commit = "23578c72e63c18f0e70623b17b9a7346b3a1bd51", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 69467acf04eac55cdd15ed0a6b5e1eb1606459a0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Jun 2018 23:02:12 -0700 Subject: [PATCH 0078/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202078572 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dad84da586b..6be19d8b21b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eb9fff34137a1805b7acab92040aed066f68a950b5e37bca1a30eb6964bcaa1f", - git_commit = "23578c72e63c18f0e70623b17b9a7346b3a1bd51", + sha256 = "0059424fa8135a3a47a99d625fe0dc0254fd2f677685727e0e8d9c3b0c6875f8", + git_commit = "d398b2d8441b45bcdf5f6782c2aa701e59ec947b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 38603365dfa2f5b7f7b830beb45863fbf71f492f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Jun 2018 00:02:15 -0700 Subject: [PATCH 0079/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202082815 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6be19d8b21b..eabb64d99e7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0059424fa8135a3a47a99d625fe0dc0254fd2f677685727e0e8d9c3b0c6875f8", - git_commit = "d398b2d8441b45bcdf5f6782c2aa701e59ec947b", + sha256 = "37be726949fa50a4cacb84937421ff02c331b41465d3123ab18bde1f3cd708b0", + git_commit = "fb3ce0467766a8e91f1da0ad7ada7c24fde7a73a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a8d1fc943333d784c6f75c1bf9cd8c38634a5e9e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Jun 2018 10:01:54 -0700 Subject: [PATCH 0080/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202145987 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index eabb64d99e7..3f8f83d873f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "37be726949fa50a4cacb84937421ff02c331b41465d3123ab18bde1f3cd708b0", - git_commit = "fb3ce0467766a8e91f1da0ad7ada7c24fde7a73a", + sha256 = "e82194e17c58d38dd03e9089259ab05de7655c39e240843c9c6cf85f789f1275", + git_commit = "2006c384f9793dbf27b0928d011e37d4413f7925", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1d6a2b37a4dd4dc77e7bf97a2c4ff0c454f0372b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Jun 2018 13:01:22 -0700 Subject: [PATCH 0081/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202179116 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3f8f83d873f..e6b067e56b9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e82194e17c58d38dd03e9089259ab05de7655c39e240843c9c6cf85f789f1275", - git_commit = "2006c384f9793dbf27b0928d011e37d4413f7925", + sha256 = "2745f2aaea5e2699095a95dea88e4c38f226e4105c64b0b4e1670c071a9d0b3e", + git_commit = "1721ecc4f2ecd8358f0f94dbabae5efef9e6f04f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 62f0bffcb32c293a267d8e211afad7982f9adf5a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Jun 2018 14:09:41 -0700 Subject: [PATCH 0082/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202191103 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e6b067e56b9..6ccb16b43dc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2745f2aaea5e2699095a95dea88e4c38f226e4105c64b0b4e1670c071a9d0b3e", - git_commit = "1721ecc4f2ecd8358f0f94dbabae5efef9e6f04f", + sha256 = "384aad513dfabc0649e86d4ae6aecdfb95de8e8367807bfee14470e1cf3a40d6", + git_commit = "37c79b0d807e12067bc0d732e074a829757adb05", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6d0800fecd31db34d95ff712048c970a78b34ad8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Jun 2018 15:01:32 -0700 Subject: [PATCH 0083/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202200413 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6ccb16b43dc..1111514bc51 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "384aad513dfabc0649e86d4ae6aecdfb95de8e8367807bfee14470e1cf3a40d6", - git_commit = "37c79b0d807e12067bc0d732e074a829757adb05", + sha256 = "bdc220d2cb1ec560f938fc7747c7ff7ad368a56eaee89127b9f296c6efe7aafa", + git_commit = "1843f39c11e42751837c62acfb74e1fe697353ef", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a1ad877dbbd1193c2b95ac13c4bc847575606c15 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Jun 2018 16:02:13 -0700 Subject: [PATCH 0084/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202211407 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1111514bc51..19541c8ce5c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bdc220d2cb1ec560f938fc7747c7ff7ad368a56eaee89127b9f296c6efe7aafa", - git_commit = "1843f39c11e42751837c62acfb74e1fe697353ef", + sha256 = "ad74fcbe3ef44c5af79e15f108df9bac5eb3da7ccd63e5a34f2b13ce74e3c9bd", + git_commit = "4ffe972db9074a81805b2ab5396daa9dd79661b0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ca209c2de5cc24f330616a05c545dad975458b3c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Jun 2018 17:02:16 -0700 Subject: [PATCH 0085/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202221210 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 19541c8ce5c..d4fbb1e9a83 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ad74fcbe3ef44c5af79e15f108df9bac5eb3da7ccd63e5a34f2b13ce74e3c9bd", - git_commit = "4ffe972db9074a81805b2ab5396daa9dd79661b0", + sha256 = "81fbbcfa047f785035a3268bc7d15ca906d29af14ff0227bf3b61fe7805cd9c3", + git_commit = "44a1f241bca223c99bf51fd1d744e79aa271d52f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 892194b3996f24301c74f1fd15d2fd59a595dda6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Jun 2018 19:01:35 -0700 Subject: [PATCH 0086/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202235606 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d4fbb1e9a83..316ae40900c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "81fbbcfa047f785035a3268bc7d15ca906d29af14ff0227bf3b61fe7805cd9c3", - git_commit = "44a1f241bca223c99bf51fd1d744e79aa271d52f", + sha256 = "7a9a38f60b2845687b5c7aea56438e0b7196a32912d8fdfdc76a1504d82ce335", + git_commit = "30fa62a85c7e1653d4cd39d4a8dcc9cfe8e07bc8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From dfd2a180e164a7a8b8bb4fee157f9c46ffb4e00e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Jun 2018 00:03:32 -0700 Subject: [PATCH 0087/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202260618 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 316ae40900c..39079f59028 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7a9a38f60b2845687b5c7aea56438e0b7196a32912d8fdfdc76a1504d82ce335", - git_commit = "30fa62a85c7e1653d4cd39d4a8dcc9cfe8e07bc8", + sha256 = "62b2516f16a7ebd35cbc62b2a4da2bfea7159bf06c5ad5bbe9f3e93cec46a46f", + git_commit = "91780a3a338b09ef89f5f04ab8e683b9756b4bf0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 39c03155b3f8023db95a4b806806720c33b3a01c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Jun 2018 01:02:30 -0700 Subject: [PATCH 0088/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202266192 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 39079f59028..be6ae4e7a51 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "62b2516f16a7ebd35cbc62b2a4da2bfea7159bf06c5ad5bbe9f3e93cec46a46f", - git_commit = "91780a3a338b09ef89f5f04ab8e683b9756b4bf0", + sha256 = "896b9c888113f342f658d108597cc7a788dcbc4c48475aa8e000b1a66435a744", + git_commit = "4292085f549afc7d7e9ac5dc517b2bab45c79ad3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0013f181129829b6e962ec385b4b79230d8e6dc7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Jun 2018 12:00:50 -0700 Subject: [PATCH 0089/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202346947 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index be6ae4e7a51..a68f571a40a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "896b9c888113f342f658d108597cc7a788dcbc4c48475aa8e000b1a66435a744", - git_commit = "4292085f549afc7d7e9ac5dc517b2bab45c79ad3", + sha256 = "97bb29ff97898815b04b886df61c99d53c0837ec88347b01029930f5669dd521", + git_commit = "917a872be989967a5e55832dc867f96bf7961888", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8f3002c11cb0c65264a728643fffa759e6f34751 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Jun 2018 13:01:20 -0700 Subject: [PATCH 0090/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202355633 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a68f571a40a..472e033ab61 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "97bb29ff97898815b04b886df61c99d53c0837ec88347b01029930f5669dd521", - git_commit = "917a872be989967a5e55832dc867f96bf7961888", + sha256 = "53b17b6da39274fddde886de9808fc76b082c8001eecf9d9ac35bdcf8d112391", + git_commit = "85cb8d48b7ad8a7587bc9a52d2198b027677bd13", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0b7735fac7171ccc9480e2686aef30e289722635 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Jun 2018 15:01:43 -0700 Subject: [PATCH 0091/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202376119 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 472e033ab61..337bf9f2733 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "53b17b6da39274fddde886de9808fc76b082c8001eecf9d9ac35bdcf8d112391", - git_commit = "85cb8d48b7ad8a7587bc9a52d2198b027677bd13", + sha256 = "0dbfb6f11a24b27c7458a7eb42619d80ba9df8be5a5eefbf9ff4483281da6465", + git_commit = "94d3380b3c5e8ebbd094851d91067885f976d7cf", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 45e2ca2cb42974f19fbcfee77d67aa02cc49bea5 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Wed, 27 Jun 2018 15:29:52 -0700 Subject: [PATCH 0092/8103] Update docker images Fixes #952 PiperOrigin-RevId: 202381080 --- .../tools/docker/Dockerfile.devel | 4 +-- .../tools/docker/Dockerfile.devel-gpu | 27 +++++++++++-------- third_party/libevent.BUILD | 2 +- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index ae77a894ddc..ea179ca96f1 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -68,12 +68,12 @@ RUN mkdir /bazel && \ rm -f /bazel/bazel-$BAZEL_VERSION-installer-linux-x86_64.sh # Download, build, and install TensorFlow Serving -ARG TF_SERVING_VERSION_GIT_BRANCH=r1.8 +ARG TF_SERVING_VERSION_GIT_BRANCH=master WORKDIR /tensorflow-serving RUN git clone --depth=1 --branch=${TF_SERVING_VERSION_GIT_BRANCH} \ https://github.com/tensorflow/serving . -ARG TF_SERVING_BUILD_OPTIONS="--copt=-mavx --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0" +ARG TF_SERVING_BUILD_OPTIONS="--copt=-mavx --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0 --verbose_failures" RUN bazel build -c opt --color=yes --curses=yes ${TF_SERVING_BUILD_OPTIONS} \ --output_filter=DONT_MATCH_ANYTHING \ tensorflow_serving/model_servers:tensorflow_model_server && \ diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index e80012eacb8..05c92bae461 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -15,6 +15,10 @@ FROM nvidia/cuda:9.0-cudnn7-devel-ubuntu16.04 LABEL maintainer=gvasudevan@google.com +# Install NCCL +ENV NCCL_VERSION=2.2.12-1+cuda9.0 +RUN echo "deb http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1604/x86_64 /" > /etc/apt/sources.list.d/nvidia-ml.list + RUN apt-get update && apt-get install -y \ automake \ build-essential \ @@ -24,6 +28,8 @@ RUN apt-get update && apt-get install -y \ libpng12-dev \ libtool \ libzmq3-dev \ + libnccl2=${NCCL_VERSION} \ + libnccl-dev=${NCCL_VERSION} \ mlocate \ pkg-config \ python-dev \ @@ -56,7 +62,7 @@ RUN echo "startup --batch" >>/etc/bazel.bazelrc RUN echo "build --spawn_strategy=standalone --genrule_strategy=standalone" \ >>/etc/bazel.bazelrc # Install a recent bazel release. -ENV BAZEL_VERSION 0.10.0 +ENV BAZEL_VERSION 0.11.1 WORKDIR / RUN mkdir /bazel && \ cd /bazel && \ @@ -67,7 +73,6 @@ RUN mkdir /bazel && \ cd / && \ rm -f /bazel/bazel-$BAZEL_VERSION-installer-linux-x86_64.sh - # Build TensorFlow with the CUDA configuration ENV CI_BUILD_PYTHON python ENV LD_LIBRARY_PATH /usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH @@ -91,21 +96,21 @@ ENV TF_NCCL_VERSION=2.2.12 ENV NCCL_INSTALL_PATH=/usr/lib/nccl/ WORKDIR / -RUN mkdir /usr/lib/nccl && \ - mkdir /usr/lib/nccl/include/ && \ - mkdir /usr/lib/nccl/lib/ && \ - ln -s /usr/include/nccl.h /usr/lib/nccl/include/nccl.h && \ - ln -s /usr/lib/x86_64-linux-gnu/libnccl.so /usr/lib/nccl/lib/libnccl.so && \ - ln -s /usr/lib/x86_64-linux-gnu/libnccl.so.2 /usr/lib/nccl/lib/libnccl.so.2 && \ - ln -s /usr/lib/x86_64-linux-gnu/libnccl.so.$TF_NCCL_VERSION /usr/lib/nccl/lib/libnccl.so.$TF_NCCL_VERSION +RUN mkdir -p ${NCCL_INSTALL_PATH} && \ + mkdir ${NCCL_INSTALL_PATH}include/ && \ + mkdir ${NCCL_INSTALL_PATH}lib/ && \ + ln -s /usr/include/nccl.h ${NCCL_INSTALL_PATH}include/nccl.h && \ + ln -s /usr/lib/x86_64-linux-gnu/libnccl.so ${NCCL_INSTALL_PATH}lib/libnccl.so && \ + ln -s /usr/lib/x86_64-linux-gnu/libnccl.so.2 ${NCCL_INSTALL_PATH}lib/libnccl.so.2 && \ + ln -s /usr/lib/x86_64-linux-gnu/libnccl.so.$TF_NCCL_VERSION ${NCCL_INSTALL_PATH}lib/libnccl.so.$TF_NCCL_VERSION # Download, build, and install TensorFlow Serving -ARG TF_SERVING_VERSION_GIT_BRANCH=r1.7 +ARG TF_SERVING_VERSION_GIT_BRANCH=master WORKDIR /tensorflow-serving RUN git clone --depth=1 --branch=${TF_SERVING_VERSION_GIT_BRANCH} \ https://github.com/tensorflow/serving . -ARG TF_SERVING_BUILD_OPTIONS="--copt=-mavx --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0" +ARG TF_SERVING_BUILD_OPTIONS="--copt=-mavx --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0 --verbose_failures" RUN ln -s /usr/local/cuda/lib64/stubs/libcuda.so /usr/local/cuda/lib64/stubs/libcuda.so.1 && \ LD_LIBRARY_PATH=/usr/local/cuda/lib64/stubs:${LD_LIBRARY_PATH} \ bazel build -c opt --color=yes --curses=yes --config=cuda \ diff --git a/third_party/libevent.BUILD b/third_party/libevent.BUILD index 33551a921f2..27e0ef2fadd 100644 --- a/third_party/libevent.BUILD +++ b/third_party/libevent.BUILD @@ -59,7 +59,7 @@ genrule( "cp -R $$(pwd)/external/com_github_libevent_libevent/* $$TMP_DIR", "cd $$TMP_DIR", "./autogen.sh", - "./configure --prefix=$$INSTALL_DIR --enable-shared=no --disable-openssl", + "./configure --prefix=$$INSTALL_DIR CFLAGS=-fPIC CXXFLAGS=-fPIC --enable-shared=no --disable-openssl", "make install", "rm -rf $$TMP_DIR", ]), From a632060aa0415836d601a37d7f9b43469b868696 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Jun 2018 20:01:12 -0700 Subject: [PATCH 0093/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202412071 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 337bf9f2733..0f60087f0cb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0dbfb6f11a24b27c7458a7eb42619d80ba9df8be5a5eefbf9ff4483281da6465", - git_commit = "94d3380b3c5e8ebbd094851d91067885f976d7cf", + sha256 = "70249f8579449dacdfa6b6c4f9f2e559d556e77c9ec405ebbe74a265f09ad326", + git_commit = "6929e91e74a33a3a7c7ce309af923d47c6ff81a5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3a9813434a0f797805dca28141b54df7a342174e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Jun 2018 22:02:30 -0700 Subject: [PATCH 0094/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202421519 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0f60087f0cb..b2d108688e7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "70249f8579449dacdfa6b6c4f9f2e559d556e77c9ec405ebbe74a265f09ad326", - git_commit = "6929e91e74a33a3a7c7ce309af923d47c6ff81a5", + sha256 = "199b94b66afec46315a3a95907db592e0c129ade789c9d4dc728d8183c35a421", + git_commit = "7df94b6013941b18704601198e594350c219a3b6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 466e290cd5326d3bac56acc03d19d71af7a1277c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Jun 2018 23:01:27 -0700 Subject: [PATCH 0095/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202425634 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b2d108688e7..c13d32eeb96 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "199b94b66afec46315a3a95907db592e0c129ade789c9d4dc728d8183c35a421", - git_commit = "7df94b6013941b18704601198e594350c219a3b6", + sha256 = "245157ec8b1ad4dffc15147753b2f25ee6a103a925a3bc458dddf4d92c2e2273", + git_commit = "8ad1cfc2b17ce3735abf852fd4e0d6b9eef16f91", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d347bbc107689666dc01c2ba0abc3d13e4b9bc0c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Jun 2018 00:03:07 -0700 Subject: [PATCH 0096/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202429969 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c13d32eeb96..79bfd44ef9b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "245157ec8b1ad4dffc15147753b2f25ee6a103a925a3bc458dddf4d92c2e2273", - git_commit = "8ad1cfc2b17ce3735abf852fd4e0d6b9eef16f91", + sha256 = "8629733b25d6799d98731ca6fe5f8e229519971c399fdc5f7b95341475af8211", + git_commit = "51ddb66cdf1444998827e03c4b5f592841ee6255", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2dcdcfcfdaea9ca2a975be08f2396e1c43d593b6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Jun 2018 13:06:29 -0700 Subject: [PATCH 0097/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202530386 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 79bfd44ef9b..26cdb4216b3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8629733b25d6799d98731ca6fe5f8e229519971c399fdc5f7b95341475af8211", - git_commit = "51ddb66cdf1444998827e03c4b5f592841ee6255", + sha256 = "06663aa03fe37776cc7fa74b628c89159ec3a42e7866067245f8188d64608d62", + git_commit = "762773b6aac6f7d56f15890265bdf25cead63cc0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1fddcac52da76cf62ec1ec8a4bc4661eb2bbd98b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Jun 2018 14:02:41 -0700 Subject: [PATCH 0098/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202539436 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 26cdb4216b3..6033701d932 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "06663aa03fe37776cc7fa74b628c89159ec3a42e7866067245f8188d64608d62", - git_commit = "762773b6aac6f7d56f15890265bdf25cead63cc0", + sha256 = "88324ad9379eae4fdb2aefb8e0d6c7cd0dc748b44daa5cc96ffd9415705c00c3", + git_commit = "9752b117ff63f204c4975cad52b5aab5c1f5e9a9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c945dc50c33b88e2016b268751706bd8a9ae1c4c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Jun 2018 15:01:27 -0700 Subject: [PATCH 0099/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202549988 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6033701d932..7fa2172630a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "88324ad9379eae4fdb2aefb8e0d6c7cd0dc748b44daa5cc96ffd9415705c00c3", - git_commit = "9752b117ff63f204c4975cad52b5aab5c1f5e9a9", + sha256 = "10fc71888c4196f060cb1dede09850c9c4fb0032b25049e545aa3c7f904575d6", + git_commit = "fd68c7348bdde4ce8edde1839d6901470e0b4685", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 96812841eb603503b9a294e3a8f6db3aae1b402a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Jun 2018 16:01:22 -0700 Subject: [PATCH 0100/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202561058 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7fa2172630a..cb278ded120 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "10fc71888c4196f060cb1dede09850c9c4fb0032b25049e545aa3c7f904575d6", - git_commit = "fd68c7348bdde4ce8edde1839d6901470e0b4685", + sha256 = "c2b0b89ee463cc550e704cc7dddf514d2f4a2ef18787d2e88b7b899fa0c18689", + git_commit = "f9b93bf58085b1bd06fa9c3741bc4b7f29ec74cc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 945571181458a3f7e0e917c89b35344774aa5519 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Jun 2018 17:02:20 -0700 Subject: [PATCH 0101/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202570910 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cb278ded120..7ca2a9dc8c7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c2b0b89ee463cc550e704cc7dddf514d2f4a2ef18787d2e88b7b899fa0c18689", - git_commit = "f9b93bf58085b1bd06fa9c3741bc4b7f29ec74cc", + sha256 = "efda82a4c8e5613359392ca918e23e58be7e7c96bdf40fb3a88a959cc575cfa4", + git_commit = "237a31921bd316e76e37c108f5224f8ef3049d07", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0b30f00bb3495ff3fbefff267f4ddfc5eefc2ddc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Jun 2018 18:01:13 -0700 Subject: [PATCH 0102/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202578033 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7ca2a9dc8c7..a5b669081c8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "efda82a4c8e5613359392ca918e23e58be7e7c96bdf40fb3a88a959cc575cfa4", - git_commit = "237a31921bd316e76e37c108f5224f8ef3049d07", + sha256 = "d108afa23855031c45f0e9055d144f6cfab7146a0ee56249ced4f2db58e203d4", + git_commit = "e1752a41621acb348afc7b5f686f05e8ced892b7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d181f257862983079098f0fd85fb0fff1418a179 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Jun 2018 20:02:20 -0700 Subject: [PATCH 0103/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202588408 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a5b669081c8..41f04f38f74 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d108afa23855031c45f0e9055d144f6cfab7146a0ee56249ced4f2db58e203d4", - git_commit = "e1752a41621acb348afc7b5f686f05e8ced892b7", + sha256 = "7987776f4f8cafcb36d12b0d2190ea422f44ab7e84e8764e34f6f6c768eda259", + git_commit = "bcf0acfbd0d6a4027957bae343143c78b5522687", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e92a051a28f3242394146cc7da8924f0ab9ea172 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Jun 2018 23:00:39 -0700 Subject: [PATCH 0104/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202601394 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 41f04f38f74..af4c965eb54 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7987776f4f8cafcb36d12b0d2190ea422f44ab7e84e8764e34f6f6c768eda259", - git_commit = "bcf0acfbd0d6a4027957bae343143c78b5522687", + sha256 = "848783a969fc7d9a1ea41905ef005a57279d8890afd2bc35f8db82c0be701c49", + git_commit = "c676a9680a66181598ad4321ed371a965f04ee2d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d444f280eb8cebf886069a00f6bb02db05c6e723 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 29 Jun 2018 00:01:14 -0700 Subject: [PATCH 0105/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202605461 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index af4c965eb54..c951b874d74 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "848783a969fc7d9a1ea41905ef005a57279d8890afd2bc35f8db82c0be701c49", - git_commit = "c676a9680a66181598ad4321ed371a965f04ee2d", + sha256 = "478a35a3872b598ddd13d101f300b8542c7de7bdf9627fe8f0a0c2b1c91ef42f", + git_commit = "b7300de4ef75bdd9373bccc4ae5b98135a70287b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 16623e024d85644313cf18e8a8f3e498ef8cdada Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 29 Jun 2018 11:04:55 -0700 Subject: [PATCH 0106/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202674571 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c951b874d74..c8eb4b84c59 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "478a35a3872b598ddd13d101f300b8542c7de7bdf9627fe8f0a0c2b1c91ef42f", - git_commit = "b7300de4ef75bdd9373bccc4ae5b98135a70287b", + sha256 = "8aabad090cca5d461e0f3425980686b4141e59fc76f0fe92129239be7df21641", + git_commit = "12891cb26e71b24fedaecb4d0278e34ec23c6a0f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 10e1f8e02e9395cf7a5926f35ddf67f0c69d3ac3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 29 Jun 2018 13:01:40 -0700 Subject: [PATCH 0107/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202694266 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c8eb4b84c59..aa095ed1d36 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8aabad090cca5d461e0f3425980686b4141e59fc76f0fe92129239be7df21641", - git_commit = "12891cb26e71b24fedaecb4d0278e34ec23c6a0f", + sha256 = "1cc80f6ade8bdc2950d916321b806176a44f8c932393e42b7ec4b5847832df43", + git_commit = "01c36c3d7b3e230c865e71d67e138a8dc765e7a6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f1bf7cd31d91aef54564d08abfab2941ac8389d6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 29 Jun 2018 15:02:20 -0700 Subject: [PATCH 0108/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202713390 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index aa095ed1d36..4a81a0488a3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1cc80f6ade8bdc2950d916321b806176a44f8c932393e42b7ec4b5847832df43", - git_commit = "01c36c3d7b3e230c865e71d67e138a8dc765e7a6", + sha256 = "c2d7b16fd088450a3671fb469a687b3587658fd663ae571fb1e539d439f33f75", + git_commit = "5ac1bd7836e0f1a4d3b02f9538c4277914c8e5f5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 35d93f08c230abce501c83457f665128e5e92e95 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Fri, 29 Jun 2018 15:18:00 -0700 Subject: [PATCH 0109/8103] Internal changes PiperOrigin-RevId: 202716057 --- tensorflow_serving/tools/pip_package/BUILD | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/tensorflow_serving/tools/pip_package/BUILD b/tensorflow_serving/tools/pip_package/BUILD index d2313b95663..50bc4363437 100644 --- a/tensorflow_serving/tools/pip_package/BUILD +++ b/tensorflow_serving/tools/pip_package/BUILD @@ -8,14 +8,19 @@ sh_binary( data = [ "setup.py", - # Scripts. + # Python scripts needed for the Python TF Serving API + "//tensorflow_serving/apis:classification_proto_py_pb2", "//tensorflow_serving/apis:get_model_metadata_proto_py_pb2", + "//tensorflow_serving/apis:get_model_status_proto_py_pb2", + "//tensorflow_serving/apis:inference_proto_py_pb2", "//tensorflow_serving/apis:input_proto_py_pb2", + "//tensorflow_serving/apis:model_management_proto_py_pb2", "//tensorflow_serving/apis:model_proto_py_pb2", - "//tensorflow_serving/apis:predict_proto_py_pb2", + "//tensorflow_serving/apis:model_service_proto_py_pb2", + "//tensorflow_serving/apis:prediction_log_proto_py_pb2", "//tensorflow_serving/apis:prediction_service_proto_py_pb2", - "//tensorflow_serving/apis:classification_proto_py_pb2", - "//tensorflow_serving/apis:inference_proto_py_pb2", + "//tensorflow_serving/apis:predict_proto_py_pb2", "//tensorflow_serving/apis:regression_proto_py_pb2", + "//tensorflow_serving/apis:session_service_proto_py_pb2", ], ) From 95faeb7ceeca3192fa09664337a0a922bb5fa1cc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 29 Jun 2018 16:01:04 -0700 Subject: [PATCH 0110/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202722060 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4a81a0488a3..d416fb2cfbe 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c2d7b16fd088450a3671fb469a687b3587658fd663ae571fb1e539d439f33f75", - git_commit = "5ac1bd7836e0f1a4d3b02f9538c4277914c8e5f5", + sha256 = "c3b78441ce13b45a4899e507ed7b861b4797de22d200dddc6b234764208419bf", + git_commit = "fa073923010552a19f3f0db47d1fd74a8ce6f221", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8fbac2862f70368c0769237620dd338f66daba0e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 29 Jun 2018 18:03:49 -0700 Subject: [PATCH 0111/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 202736218 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d416fb2cfbe..98e8c6805bb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c3b78441ce13b45a4899e507ed7b861b4797de22d200dddc6b234764208419bf", - git_commit = "fa073923010552a19f3f0db47d1fd74a8ce6f221", + sha256 = "59ac56e43b7fb7fac327893856a3b13b894ce9bc989c2575776fe7e67522b01e", + git_commit = "bfcfad55b7b3fa4a1093fa748d4241f9457b2a84", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b8564c0a6a9c3145b555d8be25823f40d3322c09 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 2 Jul 2018 13:04:44 -0700 Subject: [PATCH 0112/8103] Merged commit includes the following changes: 202999366 by yifeif: Internal change. -- 202998738 by A. Unique TensorFlower: Updating TensorFlow to latest green. -- 202989921 by A. Unique TensorFlower: Updating TensorFlow to latest green. -- 202958789 by A. Unique TensorFlower: Updating TensorFlow to latest green. -- 202902368 by A. Unique TensorFlower: Updating TensorFlow to latest green. -- 202876685 by A. Unique TensorFlower: Internal change -- PiperOrigin-RevId: 202999366 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 98e8c6805bb..3914b62f7b3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "59ac56e43b7fb7fac327893856a3b13b894ce9bc989c2575776fe7e67522b01e", - git_commit = "bfcfad55b7b3fa4a1093fa748d4241f9457b2a84", + sha256 = "508cac0c04cc71acbf9ea90d343802df7cc24b54b59df7bf04af474be46af7db", + git_commit = "2f7609d95dca150903574c131ac1c72533fd592e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5adb5ed5c061cd48ae2f448eb83c64c1b165d0fd Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Mon, 2 Jul 2018 13:39:49 -0700 Subject: [PATCH 0113/8103] Update docker instructions to simplify process using Docker Hub PiperOrigin-RevId: 203004750 --- tensorflow_serving/g3doc/docker.md | 73 +++++++++++++++++------ tensorflow_serving/tools/docker/README.md | 2 + 2 files changed, 58 insertions(+), 17 deletions(-) diff --git a/tensorflow_serving/g3doc/docker.md b/tensorflow_serving/g3doc/docker.md index 1e84c194b51..af62fc15de6 100644 --- a/tensorflow_serving/g3doc/docker.md +++ b/tensorflow_serving/g3doc/docker.md @@ -13,9 +13,9 @@ quick links here: toolbox](https://www.docker.com/toolbox) * [Ubuntu](https://docs.docker.com/installation/ubuntulinux/) -## Getting started +## Serving with Docker -### Pulling an image +### Pulling a serving image Once you have Docker installed, you can pull the latest TensorFlow Serving docker image by running: @@ -25,6 +25,7 @@ docker pull tensorflow/serving ``` This will pull down an minimal Docker image with TensorFlow Serving installed. + See the Docker Hub [tensorflow/serving repo](http://hub.docker.com/r/tensorflow/serving/tags/) for other versions of images you can pull. @@ -72,7 +73,54 @@ This should return a set of values: More information on using the RESTful API can be found [here](api_rest.md). -## What Dockerfiles do you maintain? +## Developing with Docker + +### Pulling a development image + +For a development environment where you can build TensorFlow Serving, you can +try: + +```shell +docker pull tensorflow/serving:latest-devel +``` + +For a development environment where you can build TensorFlow Serving with GPU +support, use: + +```shell +docker pull tensorflow/serving:latest-devel-gpu +``` + +See the Docker Hub [tensorflow/serving +repo](http://hub.docker.com/r/tensorflow/serving/tags/) for other versions of +images you can pull. + +### Development example + +After pulling one of the development Docker images, you can run it while opening +the gRPC port (8500): + +```shell +docker run -it -p 8500:8500 tensorflow/serving:latest-devel +``` + +#### Testing the development environment + +To test a model, from inside the container try: + +```shell +bazel build -c opt //tensorflow_serving/example:mnist_saved_model +# train the mnist model +bazel-bin/tensorflow_serving/example/mnist_saved_model /tmp/mnist_model +# serve the model +tensorflow_model_server --port=8500 --model_name=mnist --model_base_path=/tmp/mnist_model/ & +# build the client +bazel build -c opt //tensorflow_serving/example:mnist_client +# test the client +bazel-bin/tensorflow_serving/example/mnist_client --num_tests=1000 --server=localhost:8500 +``` + +## Dockerfiles We currently maintain the following Dockerfiles: @@ -89,6 +137,9 @@ We currently maintain the following Dockerfiles: ### Building a container from a Dockerfile +If you'd like to build your own Docker image from a Dockerfile, you can do so by +running the Docker build command: + `Dockerfile`: ```shell @@ -133,17 +184,5 @@ To run the container opening the gRPC port (8500): docker run -it -p 8500:8500 $USER/tensorflow-serving-devel ``` -This will pull the latest TensorFlow Serving release with a prebuilt binary and -working development environment. To test a model, from inside the container try: - -```shell -bazel build -c opt //tensorflow_serving/example:mnist_saved_model -# train the mnist model -bazel-bin/tensorflow_serving/example/mnist_saved_model /tmp/mnist_model -# serve the model -tensorflow_model_server --port=8500 --model_name=mnist --model_base_path=/tmp/mnist_model/ & -# build the client -bazel build -c opt //tensorflow_serving/example:mnist_client -# test the client -bazel-bin/tensorflow_serving/example/mnist_client --num_tests=1000 --server=localhost:8500 -``` +From here, you can follow the instructions for [testing a devlopment +environment](#testing-the-development-environment). diff --git a/tensorflow_serving/tools/docker/README.md b/tensorflow_serving/tools/docker/README.md index 9044902b842..914aaa49866 100644 --- a/tensorflow_serving/tools/docker/README.md +++ b/tensorflow_serving/tools/docker/README.md @@ -1 +1,3 @@ Files for using the [Docker](http://www.docker.com) container system. +Please see [Docker instructions](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/g3doc/docker.md) +for more info. From ded398a7ff76dcebfb1eaa7bcf0b932e818fb510 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Mon, 2 Jul 2018 13:40:01 -0700 Subject: [PATCH 0114/8103] Update min bazel version PiperOrigin-RevId: 203004776 --- WORKSPACE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WORKSPACE b/WORKSPACE index 3914b62f7b3..1fc05c8fbc8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -35,4 +35,4 @@ tf_serving_workspace() # Specify the minimum required bazel version. load("@org_tensorflow//tensorflow:version_check.bzl", "check_bazel_version_at_least") -check_bazel_version_at_least("0.10.0") +check_bazel_version_at_least("0.11.1") From 5aa51283474fe03227d21af25f460c223459c207 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 2 Jul 2018 15:01:43 -0700 Subject: [PATCH 0115/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203018440 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1fc05c8fbc8..dbb92c7bec3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "508cac0c04cc71acbf9ea90d343802df7cc24b54b59df7bf04af474be46af7db", - git_commit = "2f7609d95dca150903574c131ac1c72533fd592e", + sha256 = "66c1447e5dcbce7e532f42ebe2cdeb6e73e4e9d2d08bdbae796448455e64ec6f", + git_commit = "b390be62ad0514f4fd3347b9db3446c84e08a38e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 02c1ef9eb1b9d86ce61dd8a476c08f31000acbe0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 2 Jul 2018 16:02:24 -0700 Subject: [PATCH 0116/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203028222 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dbb92c7bec3..8ce247a2a8e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "66c1447e5dcbce7e532f42ebe2cdeb6e73e4e9d2d08bdbae796448455e64ec6f", - git_commit = "b390be62ad0514f4fd3347b9db3446c84e08a38e", + sha256 = "2d74e469d04660561bbd76a2830babc05b17a05f444f272255fde1a1fc765259", + git_commit = "71671437c0a6d36bc0f2b5ff0c1003cf76f57cf5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 734c8f2f128f0d2d798946c9089fe795a88731dc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 2 Jul 2018 17:01:22 -0700 Subject: [PATCH 0117/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203036614 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8ce247a2a8e..5e388b0709d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2d74e469d04660561bbd76a2830babc05b17a05f444f272255fde1a1fc765259", - git_commit = "71671437c0a6d36bc0f2b5ff0c1003cf76f57cf5", + sha256 = "d9f1180a297b8ebe632900cb623dbd2075a14babc9da6fb56aa34f28780eef94", + git_commit = "16a965c5c9a64ef82ccfcb849dd61e6aad00d10e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c965c497a73d0190e28d5723b7282f64f38cb983 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 2 Jul 2018 19:00:52 -0700 Subject: [PATCH 0118/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203049507 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5e388b0709d..40bc6e50fcc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d9f1180a297b8ebe632900cb623dbd2075a14babc9da6fb56aa34f28780eef94", - git_commit = "16a965c5c9a64ef82ccfcb849dd61e6aad00d10e", + sha256 = "c6508d7e31e15662db82ef70a16cd6834239ca452d4c85a744dda54f61488971", + git_commit = "1b27fba59957714db61af5b8da9a7bc5f05604c1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b4a9b5d004eb297eb8565f3184181273d6114eb6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 2 Jul 2018 20:01:04 -0700 Subject: [PATCH 0119/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203054467 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 40bc6e50fcc..319dca5cdfc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c6508d7e31e15662db82ef70a16cd6834239ca452d4c85a744dda54f61488971", - git_commit = "1b27fba59957714db61af5b8da9a7bc5f05604c1", + sha256 = "084301a516f963c7f816a2f735a5389e34695f25a3c295cda350a361e0fbb90d", + git_commit = "575db18083d5437fd7a87ccf3414303498911bb1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 43da570d4bf74e75900869864a8196483e82a498 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 2 Jul 2018 21:07:51 -0700 Subject: [PATCH 0120/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203060461 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 319dca5cdfc..c3ed27d89ff 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "084301a516f963c7f816a2f735a5389e34695f25a3c295cda350a361e0fbb90d", - git_commit = "575db18083d5437fd7a87ccf3414303498911bb1", + sha256 = "abaa89ef3120e90d96e23f878c96c66782ed3d888de86155b7cb33c27ecd7b07", + git_commit = "519487fb313a31701fd31e67c0ceb6eae8ea9225", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 20384c435afb8370a6b4b66c66cdd44067381cda Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 3 Jul 2018 12:01:32 -0700 Subject: [PATCH 0121/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203161339 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c3ed27d89ff..d0ecd056731 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "abaa89ef3120e90d96e23f878c96c66782ed3d888de86155b7cb33c27ecd7b07", - git_commit = "519487fb313a31701fd31e67c0ceb6eae8ea9225", + sha256 = "ac24e83a9022c3693fd086b2afbb679f2877211e30811a1a1548cba40cbe473a", + git_commit = "376dd18b8a42a04990b08c1e6ec0b61e35d32d97", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6024f38cb15865a5cb4cf20c2827d855968e58fe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 3 Jul 2018 13:03:46 -0700 Subject: [PATCH 0122/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203170747 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d0ecd056731..491eefe7236 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ac24e83a9022c3693fd086b2afbb679f2877211e30811a1a1548cba40cbe473a", - git_commit = "376dd18b8a42a04990b08c1e6ec0b61e35d32d97", + sha256 = "9a3497729057eea7bb0d8153ff1052ca115d011c2a3b0227daff28c2bb29ab9b", + git_commit = "64b76357c5e9869e461575dbbad38914a8a922dd", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2996cf4824a2d638e403550745ea4241a3876615 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 3 Jul 2018 15:02:46 -0700 Subject: [PATCH 0123/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203189053 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 491eefe7236..8ba01d7fb9d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9a3497729057eea7bb0d8153ff1052ca115d011c2a3b0227daff28c2bb29ab9b", - git_commit = "64b76357c5e9869e461575dbbad38914a8a922dd", + sha256 = "c57eb4182aa36192dd90214db496b6a6a3bffa6cb9921a3982995fcf37b48fd4", + git_commit = "5059323fc2692cbeb677cc6731e40e3cd3d3f99d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c6ba782857bd260ee7ebedac73a205ef861785a5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 3 Jul 2018 16:00:58 -0700 Subject: [PATCH 0124/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203197893 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8ba01d7fb9d..ce26227061c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c57eb4182aa36192dd90214db496b6a6a3bffa6cb9921a3982995fcf37b48fd4", - git_commit = "5059323fc2692cbeb677cc6731e40e3cd3d3f99d", + sha256 = "21b4baef4aaf1b842e2bc88e95019042cd7e82add06f1e9e27c3ba6d35fecd4f", + git_commit = "769027d2413d1a8ed351f1bc62ea2681076ddbd3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8df31781ef9f620136569019ffad1446db8a1168 Mon Sep 17 00:00:00 2001 From: awk Date: Tue, 3 Jul 2018 17:16:59 -0700 Subject: [PATCH 0125/8103] Internal change. PiperOrigin-RevId: 203208044 --- tensorflow_serving/tools/docker/Dockerfile.devel | 15 ++++++++++----- .../tools/docker/Dockerfile.devel-gpu | 15 ++++++++++----- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index ea179ca96f1..e9138fd5908 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -13,7 +13,12 @@ # limitations under the License. FROM ubuntu:16.04 +ARG TF_SERVING_VERSION_GIT_BRANCH=master +ARG TF_SERVING_VERSION_GIT_COMMIT=head + LABEL maintainer=gvasudevan@google.com +LABEL tensorflow_serving_github_branchtag=${TF_SERVING_VERSION_GIT_BRANCH} +LABEL tensorflow_serving_github_commit=${TF_SERVING_VERSION_GIT_COMMIT} RUN apt-get update && apt-get install -y \ automake \ @@ -67,12 +72,12 @@ RUN mkdir /bazel && \ cd / && \ rm -f /bazel/bazel-$BAZEL_VERSION-installer-linux-x86_64.sh -# Download, build, and install TensorFlow Serving -ARG TF_SERVING_VERSION_GIT_BRANCH=master +# Download TF Serving sources (optionally at specific commit). WORKDIR /tensorflow-serving -RUN git clone --depth=1 --branch=${TF_SERVING_VERSION_GIT_BRANCH} \ - https://github.com/tensorflow/serving . +RUN git clone --depth=1 --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tensorflow/serving . +RUN if [ "${TF_SERVING_VERSION_GIT_COMMIT}" != "head" ]; then git checkout ${TF_SERVING_VERSION_GIT_COMMIT} ; fi +# Build, and install TensorFlow Serving ARG TF_SERVING_BUILD_OPTIONS="--copt=-mavx --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0 --verbose_failures" RUN bazel build -c opt --color=yes --curses=yes ${TF_SERVING_BUILD_OPTIONS} \ --output_filter=DONT_MATCH_ANYTHING \ @@ -82,4 +87,4 @@ RUN bazel build -c opt --color=yes --curses=yes ${TF_SERVING_BUILD_OPTIONS} \ rm -rf /root/.cache # Clean up Bazel cache when done. -CMD ["/bin/bash"] \ No newline at end of file +CMD ["/bin/bash"] diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 05c92bae461..70d0940fdb6 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -13,7 +13,12 @@ # limitations under the License. FROM nvidia/cuda:9.0-cudnn7-devel-ubuntu16.04 +ARG TF_SERVING_VERSION_GIT_BRANCH=master +ARG TF_SERVING_VERSION_GIT_COMMIT=head + LABEL maintainer=gvasudevan@google.com +LABEL tensorflow_serving_github_branchtag=${TF_SERVING_VERSION_GIT_BRANCH} +LABEL tensorflow_serving_github_commit=${TF_SERVING_VERSION_GIT_COMMIT} # Install NCCL ENV NCCL_VERSION=2.2.12-1+cuda9.0 @@ -104,12 +109,12 @@ RUN mkdir -p ${NCCL_INSTALL_PATH} && \ ln -s /usr/lib/x86_64-linux-gnu/libnccl.so.2 ${NCCL_INSTALL_PATH}lib/libnccl.so.2 && \ ln -s /usr/lib/x86_64-linux-gnu/libnccl.so.$TF_NCCL_VERSION ${NCCL_INSTALL_PATH}lib/libnccl.so.$TF_NCCL_VERSION -# Download, build, and install TensorFlow Serving -ARG TF_SERVING_VERSION_GIT_BRANCH=master +# Download TF Serving sources (optionally at specific commit). WORKDIR /tensorflow-serving -RUN git clone --depth=1 --branch=${TF_SERVING_VERSION_GIT_BRANCH} \ - https://github.com/tensorflow/serving . +RUN git clone --depth=1 --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tensorflow/serving . +RUN if [ "${TF_SERVING_VERSION_GIT_COMMIT}" != "head" ]; then git checkout ${TF_SERVING_VERSION_GIT_COMMIT} ; fi +# Build, and install TensorFlow Serving ARG TF_SERVING_BUILD_OPTIONS="--copt=-mavx --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0 --verbose_failures" RUN ln -s /usr/local/cuda/lib64/stubs/libcuda.so /usr/local/cuda/lib64/stubs/libcuda.so.1 && \ LD_LIBRARY_PATH=/usr/local/cuda/lib64/stubs:${LD_LIBRARY_PATH} \ @@ -123,4 +128,4 @@ RUN ln -s /usr/local/cuda/lib64/stubs/libcuda.so /usr/local/cuda/lib64/stubs/lib bazel clean --expunge --color=yes # Clean up Bazel cache when done. -CMD ["/bin/bash"] \ No newline at end of file +CMD ["/bin/bash"] From b0e66448095e0ee73b18191f6817ef837968171a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 3 Jul 2018 18:02:17 -0700 Subject: [PATCH 0126/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203212503 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ce26227061c..973237ac504 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "21b4baef4aaf1b842e2bc88e95019042cd7e82add06f1e9e27c3ba6d35fecd4f", - git_commit = "769027d2413d1a8ed351f1bc62ea2681076ddbd3", + sha256 = "447d4be283627b70a4edfe50359bb977f101ebc078f29297877a89ab8df0b022", + git_commit = "63f617e825fb3ce509e1102b442f56c039de6944", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d09ccfcb0e0e9be08a8c381256eb227fed6a17eb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 3 Jul 2018 19:01:47 -0700 Subject: [PATCH 0127/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203217063 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 973237ac504..32eb1dc3a49 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "447d4be283627b70a4edfe50359bb977f101ebc078f29297877a89ab8df0b022", - git_commit = "63f617e825fb3ce509e1102b442f56c039de6944", + sha256 = "3bf7e6f44484f98eecb8362c97b0de357a0c152b1fd702ada221d596e63f6b96", + git_commit = "b2fe2a874bade4782aaca5c44bf29e7ff6c39200", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 093624380dd4131568f559352c1d84c778e1b8bf Mon Sep 17 00:00:00 2001 From: olston Date: Wed, 4 Jul 2018 07:04:51 -0700 Subject: [PATCH 0128/8103] Minor cleanup: Convert TF_CHECK_OKs to TF_ASSERT_OK in some unit tests. PiperOrigin-RevId: 203276528 --- tensorflow_serving/core/basic_manager_test.cc | 100 +++++++++--------- .../core/dynamic_source_router_test.cc | 2 +- .../hashmap/hashmap_source_adapter_test.cc | 2 +- .../servables/tensorflow/classifier_test.cc | 2 +- .../servables/tensorflow/regressor_test.cc | 26 ++--- 5 files changed, 66 insertions(+), 66 deletions(-) diff --git a/tensorflow_serving/core/basic_manager_test.cc b/tensorflow_serving/core/basic_manager_test.cc index 5e8817851fe..3578fa832d9 100644 --- a/tensorflow_serving/core/basic_manager_test.cc +++ b/tensorflow_serving/core/basic_manager_test.cc @@ -104,7 +104,7 @@ class BasicManagerTest : public ::testing::TestWithParam { for (const char* servable_name : {kServableName, kServableName2}) { for (int i = 1; i <= kNumVersionsPerServable; ++i) { const ServableId id = {servable_name, i}; - TF_CHECK_OK(basic_manager_->ManageServable(CreateServable(id))); + TF_ASSERT_OK(basic_manager_->ManageServable(CreateServable(id))); basic_manager_->LoadServable( id, [](const Status& status) { TF_ASSERT_OK(status); }); loaded_servables.insert(id); @@ -152,7 +152,7 @@ TEST_P(BasicManagerTest, ServableHandleNotFoundMissingVersion) { TEST_P(BasicManagerTest, ServableHandleLatest) { const ServableId id = {kServableName, kNumVersionsPerServable + 1}; - TF_CHECK_OK(basic_manager_->ManageServable(CreateServable(id))); + TF_ASSERT_OK(basic_manager_->ManageServable(CreateServable(id))); basic_manager_->LoadServable( id, [](const Status& status) { TF_ASSERT_OK(status); }); WaitUntilServableManagerStateIsOneOf( @@ -174,7 +174,7 @@ TEST_P(BasicManagerTest, AlreadyManagedError) { // Tests the case where the latest version of a servable available is 0. TEST_P(BasicManagerTest, ServableHandleLatestVersionIsZero) { const ServableId id = {kServableName3, 1}; - TF_CHECK_OK(basic_manager_->ManageServable(CreateServable(id))); + TF_ASSERT_OK(basic_manager_->ManageServable(CreateServable(id))); basic_manager_->LoadServable( id, [](const Status& status) { TF_ASSERT_OK(status); }); WaitUntilServableManagerStateIsOneOf( @@ -195,7 +195,7 @@ TEST_P(BasicManagerTest, StopManagingUnknownId) { TEST_P(BasicManagerTest, StopManagingActiveServable) { const ServableId id = {kServableName3, 1}; - TF_CHECK_OK(basic_manager_->ManageServable(CreateServable(id))); + TF_ASSERT_OK(basic_manager_->ManageServable(CreateServable(id))); basic_manager_->LoadServable( id, [](const Status& status) { TF_EXPECT_OK(status); }); WaitUntilServableManagerStateIsOneOf( @@ -205,7 +205,7 @@ TEST_P(BasicManagerTest, StopManagingActiveServable) { TEST_P(BasicManagerTest, StopManagingDisabledServable) { const ServableId id = {kServableName3, 1}; - TF_CHECK_OK(basic_manager_->ManageServable(CreateServable(id))); + TF_ASSERT_OK(basic_manager_->ManageServable(CreateServable(id))); basic_manager_->LoadServable( id, [](const Status& status) { TF_EXPECT_OK(status); }); WaitUntilServableManagerStateIsOneOf( @@ -230,7 +230,7 @@ TEST_P(BasicManagerTest, DontStopManagingOnError) { const ServableId id = {kServableName, 7}; const Status error_status = errors::Internal("An error."); std::unique_ptr loader(new FakeLoader(7, error_status)); - TF_CHECK_OK(basic_manager_->ManageServable({id, std::move(loader)})); + TF_ASSERT_OK(basic_manager_->ManageServable({id, std::move(loader)})); basic_manager_->LoadServable(id, [error_status](const Status& status) { EXPECT_EQ(error_status, status); }); @@ -262,7 +262,7 @@ TEST_P(BasicManagerTest, UpdateServingMapServableHandleLatest) { // manager, as opposed to kServableName which already has 2 loaded. const ServableId id0 = {kServableName3, 0}; // Servable is int64 with value 0. - TF_CHECK_OK(basic_manager_->ManageServable(CreateServable(id0))); + TF_ASSERT_OK(basic_manager_->ManageServable(CreateServable(id0))); basic_manager_->LoadServable( id0, [](const Status& status) { TF_ASSERT_OK(status); }); WaitUntilServableManagerStateIsOneOf( @@ -278,7 +278,7 @@ TEST_P(BasicManagerTest, UpdateServingMapServableHandleLatest) { .WillByDefault(Return(Status::OK())); ON_CALL(*notify_to_unload, Load()).WillByDefault(Return(Status::OK())); const ServableId id1 = {kServableName3, 1}; - TF_CHECK_OK(basic_manager_->ManageServable( + TF_ASSERT_OK(basic_manager_->ManageServable( {id1, std::unique_ptr(notify_to_unload)})); basic_manager_->LoadServable( id1, [](const Status& status) { TF_ASSERT_OK(status); }); @@ -342,7 +342,7 @@ TEST_P(BasicManagerTest, ListAvailableServableIds) { const ServableId id = {kServableName, 7}; std::unique_ptr loader( new FakeLoader(7, errors::Internal("An error."))); - TF_CHECK_OK(basic_manager_->ManageServable( + TF_ASSERT_OK(basic_manager_->ManageServable( CreateServableData(id, std::move(loader)))); basic_manager_->LoadServable(id, [](const Status& status) { EXPECT_EQ(errors::Internal("An error."), status); @@ -389,7 +389,7 @@ TEST_P(BasicManagerTest, GetAvailableServableHandles) { const ServableId id = {kServableName, 7}; std::unique_ptr loader( new FakeLoader(7, errors::Internal("An error."))); - TF_CHECK_OK(basic_manager_->ManageServable( + TF_ASSERT_OK(basic_manager_->ManageServable( CreateServableData(id, std::move(loader)))); basic_manager_->LoadServable(id, [](const Status& status) { EXPECT_EQ(errors::Internal("An error."), status); @@ -497,7 +497,7 @@ TEST_P(BasicManagerTest, MultipleManageCallsUsesFirstServable) { // erroneous servable. TEST_P(BasicManagerTest, ErroneousServable) { const ServableId id = {kServableName, 3}; - TF_CHECK_OK(basic_manager_->ManageServable( + TF_ASSERT_OK(basic_manager_->ManageServable( ServableData>(id, errors::Unknown("error")))); ServableHandle handle; @@ -516,7 +516,7 @@ TEST_P(BasicManagerTest, ErroneousServable) { // thread, and not a request thread. TEST_P(BasicManagerTest, DestructOnNonServingThread) { const ServableId id = {kServableName, 7}; - TF_CHECK_OK(basic_manager_->ManageServable( + TF_ASSERT_OK(basic_manager_->ManageServable( CreateServableData(id, std::unique_ptr(new FakeLoader(7))))); basic_manager_->LoadServable( id, [](const Status& status) { TF_ASSERT_OK(status); }); @@ -567,7 +567,7 @@ TEST_P(BasicManagerTest, AdditionalState) { TEST_P(BasicManagerTest, NoAdditionalState) { const ServableId id = {kServableName, 3}; - TF_CHECK_OK(basic_manager_->ManageServable(CreateServable(id))); + TF_ASSERT_OK(basic_manager_->ManageServable(CreateServable(id))); // Will return nullptr when there is no metadata set. EXPECT_EQ(nullptr, basic_manager_->GetAdditionalServableState(id)); @@ -585,7 +585,7 @@ TEST_P(BasicManagerTest, OutOfOrderLoadServable) { TEST_P(BasicManagerTest, MultipleLoadServables) { const ServableId id = {kServableName, 3}; - TF_CHECK_OK(basic_manager_->ManageServable(CreateServable(id))); + TF_ASSERT_OK(basic_manager_->ManageServable(CreateServable(id))); basic_manager_->LoadServable( id, [](const Status& status) { TF_ASSERT_OK(status); }); WaitUntilServableManagerStateIsOneOf( @@ -599,7 +599,7 @@ TEST_P(BasicManagerTest, MultipleLoadServables) { TEST_P(BasicManagerTest, MultipleUnloadServables) { const ServableId id = {kServableName, 3}; - TF_CHECK_OK(basic_manager_->ManageServable(CreateServable(id))); + TF_ASSERT_OK(basic_manager_->ManageServable(CreateServable(id))); basic_manager_->LoadServable( id, [](const Status& status) { TF_ASSERT_OK(status); }); WaitUntilServableManagerStateIsOneOf( @@ -627,7 +627,7 @@ TEST_P(BasicManagerTest, UnloadWithoutManage) { TEST_P(BasicManagerTest, UnloadWithoutLoad) { const ServableId id = {kServableName, 3}; - TF_CHECK_OK(basic_manager_->ManageServable(CreateServable(id))); + TF_ASSERT_OK(basic_manager_->ManageServable(CreateServable(id))); basic_manager_->UnloadServable(id, [](const Status& status) { EXPECT_FALSE(status.ok()); EXPECT_EQ(error::FAILED_PRECONDITION, status.code()); @@ -637,7 +637,7 @@ TEST_P(BasicManagerTest, UnloadWithoutLoad) { TEST_P(BasicManagerTest, EventBusErroneousVersion) { const ServableId id = {kServableName, 3}; - TF_CHECK_OK(basic_manager_->ManageServable( + TF_ASSERT_OK(basic_manager_->ManageServable( ServableData>(id, errors::Unknown("error")))); const ServableState expected_published_state = { @@ -650,7 +650,7 @@ TEST_P(BasicManagerTest, EventBusErrorOnLoad) { const ServableId id = {kServableName, 7}; std::unique_ptr loader( new FakeLoader(7, errors::Internal("Error on load."))); - TF_CHECK_OK(basic_manager_->ManageServable({id, std::move(loader)})); + TF_ASSERT_OK(basic_manager_->ManageServable({id, std::move(loader)})); const ServableState start_state = {id, ServableState::ManagerState::kStart, Status::OK()}; @@ -670,7 +670,7 @@ TEST_P(BasicManagerTest, EventBusErrorOnLoad) { TEST_P(BasicManagerTest, EventBusServableLifecycle) { const ServableId id = {kServableName, 7}; test_util::MockLoader* loader = new NiceMock(); - TF_CHECK_OK( + TF_ASSERT_OK( basic_manager_->ManageServable({id, std::unique_ptr(loader)})); const ServableState start_state = {id, ServableState::ManagerState::kStart, @@ -749,7 +749,7 @@ TEST_P(BasicManagerTest, NoEventBus) { const ServableId id = {kServableName, 7}; std::unique_ptr loader(new FakeLoader(7)); - TF_CHECK_OK(manager->ManageServable({id, std::move(loader)})); + TF_ASSERT_OK(manager->ManageServable({id, std::move(loader)})); manager->LoadServable(id, [](const Status& status) { TF_ASSERT_OK(status); }); manager->UnloadServable(id, [](const Status& status) { TF_ASSERT_OK(status); }); @@ -765,7 +765,7 @@ TEST_P(BasicManagerTest, LoadsThenUnloads) { const ServableId id = {kServableName3, i}; servables.insert(id); load_executor.Schedule([this, id, &servables]() { - TF_CHECK_OK(basic_manager_->ManageServable(CreateServable(id))); + TF_ASSERT_OK(basic_manager_->ManageServable(CreateServable(id))); basic_manager_->LoadServable( id, [](const Status& status) { TF_ASSERT_OK(status); }); }); @@ -799,7 +799,7 @@ TEST_P(BasicManagerTest, InterleavedLoadsAndUnloads) { for (int i = 0; i < 20; ++i) { executor.Schedule([this, i]() { const ServableId id = {kServableName3, i}; - TF_CHECK_OK(basic_manager_->ManageServable(CreateServable(id))); + TF_ASSERT_OK(basic_manager_->ManageServable(CreateServable(id))); Notification load_done; basic_manager_->LoadServable(id, [&load_done](const Status& status) { TF_ASSERT_OK(status); @@ -840,14 +840,14 @@ TEST_F(SetNumLoadThreadsBasicManagerTest, ThreadPoolSwapped) { }; const ServableId id0 = {kServableName3, 0}; - TF_CHECK_OK(basic_manager_->ManageServable(CreateServable(id0))); + TF_ASSERT_OK(basic_manager_->ManageServable(CreateServable(id0))); basic_manager_->LoadServable(id0, load_done_fn); manager_test_access.SetNumLoadThreads(0); EXPECT_EQ(0, manager_test_access.num_load_threads()); const ServableId id1 = {kServableName3, 1}; - TF_CHECK_OK(basic_manager_->ManageServable(CreateServable(id1))); + TF_ASSERT_OK(basic_manager_->ManageServable(CreateServable(id1))); basic_manager_->LoadServable(id1, load_done_fn); // Force the manager to finish before deleting the notifications. @@ -868,7 +868,7 @@ TEST_F(SetNumLoadThreadsBasicManagerTest, ThreadPoolsNotAliveSimultaneously) { }; const ServableId id0 = {kServableName3, 0}; - TF_CHECK_OK(basic_manager_->ManageServable(CreateServable(id0))); + TF_ASSERT_OK(basic_manager_->ManageServable(CreateServable(id0))); Notification notify_for_setting; Notification continue_load; basic_manager_->LoadServable(id0, [&](const Status& status) { @@ -888,7 +888,7 @@ TEST_F(SetNumLoadThreadsBasicManagerTest, ThreadPoolsNotAliveSimultaneously) { executor.Schedule([&]() { const ServableId id1 = {kServableName3, 1}; - TF_CHECK_OK(basic_manager_->ManageServable(CreateServable(id1))); + TF_ASSERT_OK(basic_manager_->ManageServable(CreateServable(id1))); continue_load.Notify(); basic_manager_->LoadServable( id1, [&](const Status& status) { data_race_fn(status); }); @@ -913,7 +913,7 @@ TEST_F(SetNumLoadThreadsBasicManagerTest, FastLoad) { for (int i = 0; i < 20; ++i) { executor.Schedule([this, i]() { const ServableId id = {kServableName3, i}; - TF_CHECK_OK(basic_manager_->ManageServable(CreateServable(id))); + TF_ASSERT_OK(basic_manager_->ManageServable(CreateServable(id))); basic_manager_->LoadServable( id, [](const Status& status) { TF_ASSERT_OK(status); }); // We don't wait for load to be done here because we want to test that @@ -973,7 +973,7 @@ TEST_P(FlushFileSystemCachesTest, Load) { // flushed if flush_filesystem_caches_ is true. FlushDetectingFileSystem::flushed.store(false); const ServableId id0 = {kServableName3, 0}; - TF_CHECK_OK(basic_manager_->ManageServable(CreateServable(id0))); + TF_ASSERT_OK(basic_manager_->ManageServable(CreateServable(id0))); basic_manager_->LoadServable(id0, [&](const Status& status) { TF_ASSERT_OK(status); EXPECT_EQ(flush_filesystem_caches_, @@ -984,7 +984,7 @@ TEST_P(FlushFileSystemCachesTest, Load) { manager_test_access.SetNumLoadThreads(2); FlushDetectingFileSystem::flushed.store(false); const ServableId id1 = {kServableName3, 1}; - TF_CHECK_OK(basic_manager_->ManageServable(CreateServable(id1))); + TF_ASSERT_OK(basic_manager_->ManageServable(CreateServable(id1))); basic_manager_->LoadServable(id1, [&](const Status& status) { TF_ASSERT_OK(status); EXPECT_FALSE(FlushDetectingFileSystem::flushed.load()); @@ -994,7 +994,7 @@ TEST_P(FlushFileSystemCachesTest, Load) { manager_test_access.SetNumLoadThreads(1); FlushDetectingFileSystem::flushed.store(false); const ServableId id2 = {kServableName3, 2}; - TF_CHECK_OK(basic_manager_->ManageServable(CreateServable(id2))); + TF_ASSERT_OK(basic_manager_->ManageServable(CreateServable(id2))); basic_manager_->LoadServable(id2, [&](const Status& status) { TF_ASSERT_OK(status); EXPECT_EQ(flush_filesystem_caches_, @@ -1045,7 +1045,7 @@ TEST_P(BasicManagerTest, ConcurrentLoadsOnlyOneSucceeds) { TEST_P(BasicManagerTest, ConcurrentUnloadsOnlyOneSucceeds) { const ServableId id = {kServableName3, 0}; - TF_CHECK_OK(basic_manager_->ManageServable(CreateServable(id))); + TF_ASSERT_OK(basic_manager_->ManageServable(CreateServable(id))); basic_manager_->LoadServable( id, [](const Status& status) { TF_ASSERT_OK(status); }); // At this point, all loads may not have completed, so we wait for them. @@ -1096,7 +1096,7 @@ TEST_P(BasicManagerTest, ConcurrentUnloadsOnlyOneSucceeds) { TEST_P(BasicManagerTest, RetryOnLoadErrorFinallySucceeds) { const ServableId id = {kServableName, 7}; test_util::MockLoader* loader = new NiceMock(); - TF_CHECK_OK( + TF_ASSERT_OK( basic_manager_->ManageServable({id, std::unique_ptr(loader)})); EXPECT_CALL(*loader, Load()) .WillOnce(Return(errors::Internal("Load error."))) @@ -1108,7 +1108,7 @@ TEST_P(BasicManagerTest, RetryOnLoadErrorFinallySucceeds) { TEST_P(BasicManagerTest, RetryOnLoadErrorFinallyFails) { const ServableId id = {kServableName, 7}; test_util::MockLoader* loader = new NiceMock(); - TF_CHECK_OK( + TF_ASSERT_OK( basic_manager_->ManageServable({id, std::unique_ptr(loader)})); EXPECT_CALL(*loader, Load()) .WillRepeatedly(Return(errors::Internal("Load error."))); @@ -1121,7 +1121,7 @@ TEST_P(BasicManagerTest, RetryOnLoadErrorFinallyFails) { TEST_P(BasicManagerTest, RetryOnLoadErrorCancelledLoad) { const ServableId id = {kServableName, 7}; test_util::MockLoader* loader = new NiceMock(); - TF_CHECK_OK( + TF_ASSERT_OK( basic_manager_->ManageServable({id, std::unique_ptr(loader)})); Notification load_called; @@ -1149,7 +1149,7 @@ TEST_P(BasicManagerTest, RetryOnLoadErrorCancelledLoad) { TEST_P(BasicManagerTest, LoadAfterCancelledLoad) { const ServableId id = {kServableName, 7}; test_util::MockLoader* loader = new NiceMock(); - TF_CHECK_OK( + TF_ASSERT_OK( basic_manager_->ManageServable({id, std::unique_ptr(loader)})); Notification load_called; @@ -1191,7 +1191,7 @@ TEST(NonParameterizedBasicManagerTest, PreLoadHook) { const ServableId id = {kServableName, 7}; test_util::MockLoader* loader = new NiceMock(); - TF_CHECK_OK(manager->ManageServable({id, std::unique_ptr(loader)})); + TF_ASSERT_OK(manager->ManageServable({id, std::unique_ptr(loader)})); bool pre_load_hook_called = false; EXPECT_CALL(mock_pre_load_hook, Call(id)).WillOnce(InvokeWithoutArgs([&]() { @@ -1286,7 +1286,7 @@ TEST_F(ResourceConstrainedBasicManagerTest, ConcurrentLoads) { for (int i = 0; i < kNumLoaders; ++i) { std::unique_ptr loader(new BarrierLoader(&barrier)); const ServableId id = {"barrier", i}; - TF_CHECK_OK(basic_manager_->ManageServable( + TF_ASSERT_OK(basic_manager_->ManageServable( CreateServableData(id, std::move(loader)))); basic_manager_->LoadServable( id, [](const Status& status) { TF_EXPECT_OK(status); }); @@ -1306,7 +1306,7 @@ TEST_F(ResourceConstrainedBasicManagerTest, InsufficientResources) { return Status::OK(); })); EXPECT_CALL(*hogging_loader, Load()).WillOnce(Return(Status::OK())); - TF_CHECK_OK(basic_manager_->ManageServable( + TF_ASSERT_OK(basic_manager_->ManageServable( CreateServableData(hogging_id, std::unique_ptr(hogging_loader)))); Notification hogging_loaded; basic_manager_->LoadServable(hogging_id, @@ -1324,7 +1324,7 @@ TEST_F(ResourceConstrainedBasicManagerTest, InsufficientResources) { *estimate = CreateResourceQuantity(1); return Status::OK(); })); - TF_CHECK_OK(basic_manager_->ManageServable(CreateServableData( + TF_ASSERT_OK(basic_manager_->ManageServable(CreateServableData( rejected_id, std::unique_ptr(rejected_loader)))); Notification rejection_received; Status rejected_status; @@ -1359,7 +1359,7 @@ TEST_F(ResourceConstrainedBasicManagerTest, ResourcesReleasedIfLoadFails) { })); EXPECT_CALL(*failing_loader, Load()) .WillOnce(Return(errors::Unknown("Load failure"))); - TF_CHECK_OK(basic_manager_->ManageServable( + TF_ASSERT_OK(basic_manager_->ManageServable( CreateServableData(failing_id, std::unique_ptr(failing_loader)))); Notification failing_failed; basic_manager_->LoadServable(failing_id, @@ -1381,7 +1381,7 @@ TEST_F(ResourceConstrainedBasicManagerTest, ResourcesReleasedIfLoadFails) { return Status::OK(); })); EXPECT_CALL(*succeeding_loader, Load()).WillOnce(Return(Status::OK())); - TF_CHECK_OK(basic_manager_->ManageServable(CreateServableData( + TF_ASSERT_OK(basic_manager_->ManageServable(CreateServableData( succeeding_id, std::unique_ptr(succeeding_loader)))); basic_manager_->LoadServable( succeeding_id, [](const Status& status) { TF_EXPECT_OK(status); }); @@ -1409,7 +1409,7 @@ TEST_F(ResourceConstrainedBasicManagerTest, })) .RetiresOnSaturation(); } - TF_CHECK_OK(basic_manager_->ManageServable(CreateServableData( + TF_ASSERT_OK(basic_manager_->ManageServable(CreateServableData( overestimating_id, std::unique_ptr(overestimating_loader)))); Notification overestimating_loaded; basic_manager_->LoadServable(overestimating_id, @@ -1431,7 +1431,7 @@ TEST_F(ResourceConstrainedBasicManagerTest, return Status::OK(); })); EXPECT_CALL(*succeeding_loader, Load()).WillOnce(Return(Status::OK())); - TF_CHECK_OK(basic_manager_->ManageServable(CreateServableData( + TF_ASSERT_OK(basic_manager_->ManageServable(CreateServableData( succeeding_id, std::unique_ptr(succeeding_loader)))); basic_manager_->LoadServable( succeeding_id, [](const Status& status) { TF_EXPECT_OK(status); }); @@ -1447,7 +1447,7 @@ TEST_F(ResourceConstrainedBasicManagerTest, ResourcesReleasedAfterUnload) { })); Notification load_done; EXPECT_CALL(*unloading_loader, Load()).WillOnce(Return(Status::OK())); - TF_CHECK_OK(basic_manager_->ManageServable(CreateServableData( + TF_ASSERT_OK(basic_manager_->ManageServable(CreateServableData( unloading_id, std::unique_ptr(unloading_loader)))); basic_manager_->LoadServable(unloading_id, [&load_done](const Status& status) { @@ -1483,7 +1483,7 @@ TEST_F(ResourceConstrainedBasicManagerTest, ResourcesReleasedAfterUnload) { return Status::OK(); })); EXPECT_CALL(*succeeding_loader, Load()).WillOnce(Return(Status::OK())); - TF_CHECK_OK(basic_manager_->ManageServable(CreateServableData( + TF_ASSERT_OK(basic_manager_->ManageServable(CreateServableData( succeeding_id, std::unique_ptr(succeeding_loader)))); basic_manager_->LoadServable( succeeding_id, [](const Status& status) { TF_EXPECT_OK(status); }); @@ -1508,7 +1508,7 @@ TEST_F(ResourceConstrainedBasicManagerTest, FirstLoadDeniedSecondOneApproved) { })); // Load won't be called because resources are not enough to load it. EXPECT_CALL(*denied_loader, Load()).Times(0); - TF_CHECK_OK(basic_manager_->ManageServable( + TF_ASSERT_OK(basic_manager_->ManageServable( CreateServableData(denied_id, std::unique_ptr(denied_loader)))); // A second loader that succeeds. @@ -1520,7 +1520,7 @@ TEST_F(ResourceConstrainedBasicManagerTest, FirstLoadDeniedSecondOneApproved) { *estimate = CreateResourceQuantity(10); return Status::OK(); })); - TF_CHECK_OK(basic_manager_->ManageServable(CreateServableData( + TF_ASSERT_OK(basic_manager_->ManageServable(CreateServableData( succeeding_id, std::unique_ptr(succeeding_loader)))); Status denied_load_status; @@ -1572,7 +1572,7 @@ TEST_F(ResourceConstrainedBasicManagerTest, EventBusErrorOnEstimateResources) { test_util::MockLoader* loader = new NiceMock; EXPECT_CALL(*loader, EstimateResources(_)) .WillOnce(Return(errors::Internal("Error on estimate resources."))); - TF_CHECK_OK(basic_manager_->ManageServable( + TF_ASSERT_OK(basic_manager_->ManageServable( CreateServableData(id, std::unique_ptr(loader)))); basic_manager_->LoadServable( id, [](const Status& status) { EXPECT_FALSE(status.ok()); }); @@ -1611,7 +1611,7 @@ TEST(EstimateResourcesRetriedTest, Succeeds) { .WillOnce(Return(errors::Internal("Error on estimate resources."))) .WillOnce(Return(Status::OK())); EXPECT_CALL(*loader, Load()).WillRepeatedly(Return(Status::OK())); - TF_CHECK_OK(basic_manager->ManageServable( + TF_ASSERT_OK(basic_manager->ManageServable( CreateServableData(id, std::unique_ptr(loader)))); basic_manager->LoadServable( id, [](const Status& status) { EXPECT_TRUE(status.ok()); }); @@ -1647,7 +1647,7 @@ TEST(EstimateResourcesRetriedTest, Fails) { .WillOnce(Return(errors::Internal("Error on estimate resources."))) .WillOnce(Return(errors::Internal("Error on estimate resources."))) .WillRepeatedly(Return(Status::OK())); - TF_CHECK_OK(basic_manager->ManageServable( + TF_ASSERT_OK(basic_manager->ManageServable( CreateServableData(id, std::unique_ptr(loader)))); basic_manager->LoadServable( id, [](const Status& status) { EXPECT_FALSE(status.ok()); }); diff --git a/tensorflow_serving/core/dynamic_source_router_test.cc b/tensorflow_serving/core/dynamic_source_router_test.cc index d875de79a33..29a16755709 100644 --- a/tensorflow_serving/core/dynamic_source_router_test.cc +++ b/tensorflow_serving/core/dynamic_source_router_test.cc @@ -125,7 +125,7 @@ TEST(DynamicSourceRouterTest, Reconfigure) { router->SetAspiredVersions("bar", {ServableData({"bar", 7}, "data")}); - TF_CHECK_OK(router->UpdateRoutes({{"bar", 0}})); + TF_ASSERT_OK(router->UpdateRoutes({{"bar", 0}})); // Now, the routes of "foo" and "bar" should be swapped. EXPECT_CALL(*targets[1], SetAspiredVersions( diff --git a/tensorflow_serving/servables/hashmap/hashmap_source_adapter_test.cc b/tensorflow_serving/servables/hashmap/hashmap_source_adapter_test.cc index 3b67e6ce05a..2f1e218a2c4 100644 --- a/tensorflow_serving/servables/hashmap/hashmap_source_adapter_test.cc +++ b/tensorflow_serving/servables/hashmap/hashmap_source_adapter_test.cc @@ -54,7 +54,7 @@ Status WriteHashmapToFile(const HashmapSourceAdapterConfig::Format format, const string& key = entry.first; const string& value = entry.second; const string line = strings::StrCat(key, ",", value, "\n"); - TF_CHECK_OK(file->Append(line)); + TF_RETURN_IF_ERROR(file->Append(line)); } break; } diff --git a/tensorflow_serving/servables/tensorflow/classifier_test.cc b/tensorflow_serving/servables/tensorflow/classifier_test.cc index 05f564f6d66..4dc7df9a3cf 100644 --- a/tensorflow_serving/servables/tensorflow/classifier_test.cc +++ b/tensorflow_serving/servables/tensorflow/classifier_test.cc @@ -305,7 +305,7 @@ class ClassifierTest : public ::testing::TestWithParam { Status Create() { if (UseSavedModel()) { std::unique_ptr saved_model(new SavedModelBundle); - TF_CHECK_OK(internal::ConvertSessionBundleToSavedModelBundle( + TF_RETURN_IF_ERROR(internal::ConvertSessionBundleToSavedModelBundle( *bundle_, saved_model.get())); return CreateClassifierFromSavedModelBundle( GetRunOptions(), std::move(saved_model), &classifier_); diff --git a/tensorflow_serving/servables/tensorflow/regressor_test.cc b/tensorflow_serving/servables/tensorflow/regressor_test.cc index 98bf2a5eb5a..0d6ace4463e 100644 --- a/tensorflow_serving/servables/tensorflow/regressor_test.cc +++ b/tensorflow_serving/servables/tensorflow/regressor_test.cc @@ -256,7 +256,7 @@ class RegressorTest : public ::testing::TestWithParam { Status Create() { if (UseSavedModel()) { std::unique_ptr saved_model(new SavedModelBundle); - TF_CHECK_OK(internal::ConvertSessionBundleToSavedModelBundle( + TF_RETURN_IF_ERROR(internal::ConvertSessionBundleToSavedModelBundle( *bundle_, saved_model.get())); return CreateRegressorFromSavedModelBundle( GetRunOptions(), std::move(saved_model), ®ressor_); @@ -301,7 +301,7 @@ TEST_P(RegressorTest, BasicExampleList) { // Test RunRegress if (UseSavedModel()) { std::unique_ptr saved_model(new SavedModelBundle); - TF_CHECK_OK(internal::ConvertSessionBundleToSavedModelBundle( + TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( *bundle_, saved_model.get())); RegressionResponse response; TF_ASSERT_OK(RunRegress(GetRunOptions(), saved_model->meta_graph_def, {}, @@ -334,7 +334,7 @@ TEST_P(RegressorTest, BasicExampleListWithContext) { // Test RunRegress if (UseSavedModel()) { std::unique_ptr saved_model(new SavedModelBundle); - TF_CHECK_OK(internal::ConvertSessionBundleToSavedModelBundle( + TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( *bundle_, saved_model.get())); RegressionResponse response; TF_ASSERT_OK(RunRegress(GetRunOptions(), saved_model->meta_graph_def, {}, @@ -378,7 +378,7 @@ TEST_P(RegressorTest, ValidNamedSignature) { // Test RunRegress if (UseSavedModel()) { std::unique_ptr saved_model(new SavedModelBundle); - TF_CHECK_OK(internal::ConvertSessionBundleToSavedModelBundle( + TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( *bundle_, saved_model.get())); RegressionResponse response; TF_ASSERT_OK(RunRegress(GetRunOptions(), saved_model->meta_graph_def, {}, @@ -420,7 +420,7 @@ TEST_P(RegressorTest, InvalidNamedSignature) { // Test RunRegress if (UseSavedModel()) { std::unique_ptr saved_model(new SavedModelBundle); - TF_CHECK_OK(internal::ConvertSessionBundleToSavedModelBundle( + TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( *bundle_, saved_model.get())); RegressionResponse response; const Status status = @@ -451,7 +451,7 @@ TEST_P(RegressorTest, MalformedOutputs) { EXPECT_EQ(::tensorflow::error::INVALID_ARGUMENT, status.code()) << status; // Test RunRegress std::unique_ptr saved_model(new SavedModelBundle); - TF_CHECK_OK(internal::ConvertSessionBundleToSavedModelBundle( + TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( *bundle_, saved_model.get())); RegressionResponse response; status = RunRegress(GetRunOptions(), saved_model->meta_graph_def, {}, @@ -471,7 +471,7 @@ TEST_P(RegressorTest, EmptyInput) { // Test RunRegress if (UseSavedModel()) { std::unique_ptr saved_model(new SavedModelBundle); - TF_CHECK_OK(internal::ConvertSessionBundleToSavedModelBundle( + TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( *bundle_, saved_model.get())); RegressionResponse response; const Status status = @@ -493,7 +493,7 @@ TEST_P(RegressorTest, EmptyExampleList) { // Test RunRegress if (UseSavedModel()) { std::unique_ptr saved_model(new SavedModelBundle); - TF_CHECK_OK(internal::ConvertSessionBundleToSavedModelBundle( + TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( *bundle_, saved_model.get())); RegressionResponse response; const Status status = @@ -518,7 +518,7 @@ TEST_P(RegressorTest, EmptyExampleListWithContext) { // Test RunRegress if (UseSavedModel()) { std::unique_ptr saved_model(new SavedModelBundle); - TF_CHECK_OK(internal::ConvertSessionBundleToSavedModelBundle( + TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( *bundle_, saved_model.get())); RegressionResponse response; const Status status = @@ -551,7 +551,7 @@ TEST_P(RegressorTest, RunsFails) { // Test RunRegress if (UseSavedModel()) { std::unique_ptr saved_model(new SavedModelBundle); - TF_CHECK_OK(internal::ConvertSessionBundleToSavedModelBundle( + TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( *bundle_, saved_model.get())); RegressionResponse response; const Status status = @@ -587,7 +587,7 @@ TEST_P(RegressorTest, UnexpectedOutputTensorSize) { .WillOnce(::testing::DoAll(::testing::SetArgPointee<4>(outputs), ::testing::Return(Status::OK()))); std::unique_ptr saved_model(new SavedModelBundle); - TF_CHECK_OK(internal::ConvertSessionBundleToSavedModelBundle( + TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( *bundle_, saved_model.get())); RegressionResponse response; const Status status = @@ -625,7 +625,7 @@ TEST_P(RegressorTest, UnexpectedOutputTensorType) { .WillOnce(::testing::DoAll(::testing::SetArgPointee<4>(outputs), ::testing::Return(Status::OK()))); std::unique_ptr saved_model(new SavedModelBundle); - TF_CHECK_OK(internal::ConvertSessionBundleToSavedModelBundle( + TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( *bundle_, saved_model.get())); RegressionResponse response; const Status status = @@ -663,7 +663,7 @@ TEST_P(RegressorTest, MissingRegressionSignature) { // Test RunRegress if (UseSavedModel()) { std::unique_ptr saved_model(new SavedModelBundle); - TF_CHECK_OK(internal::ConvertSessionBundleToSavedModelBundle( + TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( *bundle_, saved_model.get())); RegressionResponse response; const Status status = From 3e1484af7d8d067d1e4a411db0812f2f3fb05683 Mon Sep 17 00:00:00 2001 From: olston Date: Fri, 6 Jul 2018 10:25:49 -0700 Subject: [PATCH 0129/8103] Remove error suppression (.IgnoreError()). PiperOrigin-RevId: 203494652 --- .../core/aspired_versions_manager.cc | 15 ++++++-- tensorflow_serving/core/basic_manager.cc | 34 ++++++++++--------- tensorflow_serving/core/basic_manager.h | 2 +- tensorflow_serving/core/basic_manager_test.cc | 26 ++++++++------ tensorflow_serving/core/static_manager.h | 17 ++++------ .../file_system_storage_path_source.cc | 5 ++- 6 files changed, 56 insertions(+), 43 deletions(-) diff --git a/tensorflow_serving/core/aspired_versions_manager.cc b/tensorflow_serving/core/aspired_versions_manager.cc index f3293581876..6938fb0641b 100644 --- a/tensorflow_serving/core/aspired_versions_manager.cc +++ b/tensorflow_serving/core/aspired_versions_manager.cc @@ -382,9 +382,18 @@ void AspiredVersionsManager::FlushServables() { state_snapshot.state == LoaderHarness::State::kDisabled || state_snapshot.state == LoaderHarness::State::kError) && !state_snapshot.additional_state->is_aspired) { - VLOG(1) << "Removing " << state_snapshot.id << "from BasicManager"; - // TODO(b/35997855): Don't just ignore the ::tensorflow::Status object! - basic_manager_->StopManagingServable(state_snapshot.id).IgnoreError(); + const Status status = + basic_manager_->StopManagingServable(state_snapshot.id); + if (status.ok()) { + VLOG(1) << "Removed " << state_snapshot.id << "from BasicManager"; + } else { + // This scenario is likely a bug, perhaps a race (either here in + // AspiredVersionsManager, or in BasicManager). We'll wind up retrying + // StopManagingServable() on the next FlushServables() call, so just + // log the error and move on for now. + LOG(ERROR) << "Error removing " << state_snapshot.id + << "from BasicManager: " << status << " will retry later"; + } } } } diff --git a/tensorflow_serving/core/basic_manager.cc b/tensorflow_serving/core/basic_manager.cc index 13f0214593a..523f2b3c441 100644 --- a/tensorflow_serving/core/basic_manager.cc +++ b/tensorflow_serving/core/basic_manager.cc @@ -248,33 +248,37 @@ BasicManager::~BasicManager() { } unload_executor_.reset(); - UnloadAllServables(); + const Status unload_status = UnloadAllServables(); + if (!unload_status.ok()) { + LOG(ERROR) << "Error unloading all servables in BasicManager destructor: " + << unload_status; + } } -void BasicManager::UnloadAllServables() { +Status BasicManager::UnloadAllServables() { LOG(INFO) << "Unload all remaining servables in the manager."; + Status status = Status::OK(); { mutex_lock l(mu_); for (auto it = managed_map_.begin(); it != managed_map_.end(); ++it) { LoaderHarness* const harness = it->second.get(); if (harness->state() == LoaderHarness::State::kReady) { - // TODO(b/35997855): Don't just ignore the ::tensorflow::Status object! - harness->UnloadRequested().IgnoreError(); - harness->StartQuiescing().IgnoreError(); - harness->DoneQuiescing().IgnoreError(); - harness->Unload().IgnoreError(); + status.Update(harness->UnloadRequested()); + status.Update(harness->StartQuiescing()); + status.Update(harness->DoneQuiescing()); + status.Update(harness->Unload()); } if (harness->state() == LoaderHarness::State::kQuiescing) { - // TODO(b/35997855): Don't just ignore the ::tensorflow::Status object! - harness->DoneQuiescing().IgnoreError(); - harness->Unload().IgnoreError(); + status.Update(harness->DoneQuiescing()); + status.Update(harness->Unload()); } if (harness->state() == LoaderHarness::State::kQuiesced) { - // TODO(b/35997855): Don't just ignore the ::tensorflow::Status object! - harness->Unload().IgnoreError(); + status.Update(harness->Unload()); } } } + + return status; } std::vector BasicManager::ListAvailableServableIds() const { @@ -688,10 +692,8 @@ Status BasicManager::ApproveUnload(LoaderHarness* harness) { Status BasicManager::ReserveResources(LoaderHarness* harness, mutex_lock* mu_lock) { while (true) { - // TODO(b/35997855): Don't just ignore the ::tensorflow::Status object! - resource_tracker_ - ->RecomputeUsedResources(GetLoadersCurrentlyUsingResources()) - .IgnoreError(); + TF_RETURN_IF_ERROR(resource_tracker_->RecomputeUsedResources( + GetLoadersCurrentlyUsingResources())); bool resources_reserved; // We retry reserving resources because it may involve transiently failing // operations like file-reads. diff --git a/tensorflow_serving/core/basic_manager.h b/tensorflow_serving/core/basic_manager.h index eb9eee55c90..7919c14b522 100644 --- a/tensorflow_serving/core/basic_manager.h +++ b/tensorflow_serving/core/basic_manager.h @@ -375,7 +375,7 @@ class BasicManager : public Manager { Status ExecuteUnload(LoaderHarness* harness) LOCKS_EXCLUDED(mu_); // Unloads all the managed servables. - void UnloadAllServables() LOCKS_EXCLUDED(mu_); + Status UnloadAllServables() LOCKS_EXCLUDED(mu_); // Updates the serving map by copying servables from the managed map, which // are ready to be served. diff --git a/tensorflow_serving/core/basic_manager_test.cc b/tensorflow_serving/core/basic_manager_test.cc index 3578fa832d9..23708c18f0b 100644 --- a/tensorflow_serving/core/basic_manager_test.cc +++ b/tensorflow_serving/core/basic_manager_test.cc @@ -474,18 +474,23 @@ TEST_P(BasicManagerTest, GetManagedServableStateSnapshotsWithAdditionalState) { TEST_P(BasicManagerTest, MultipleManageCallsUsesFirstServable) { const ServableId id = {kServableName, 1}; - std::unique_ptr first_loader( + + // Servable 'id' is already managed, so further ManageServable() calls should + // fail (and not affect the status of the already-managed servable). + std::unique_ptr first_ignored_loader( new FakeLoader(1, errors::Internal("An error."))); + EXPECT_FALSE(basic_manager_ + ->ManageServable( + CreateServableData(id, std::move(first_ignored_loader))) + .ok()); - basic_manager_ - ->ManageServable(CreateServableData(id, std::move(first_loader))) - .IgnoreError(); - // Different servable returned. - std::unique_ptr second_loader( + // Same thing, but this time using a loader for a different servable version. + std::unique_ptr second_ignored_loader( new FakeLoader(2, errors::Internal("An error."))); - basic_manager_ - ->ManageServable(CreateServableData(id, std::move(second_loader))) - .IgnoreError(); + EXPECT_FALSE(basic_manager_ + ->ManageServable( + CreateServableData(id, std::move(second_ignored_loader))) + .ok()); ServableHandle handle; TF_ASSERT_OK(basic_manager_->GetServableHandle( @@ -539,7 +544,7 @@ TEST_P(BasicManagerTest, DestructOnNonServingThread) { WaitUntilServableManagerStateIsOneOf( servable_state_monitor_, id, {ServableState::ManagerState::kEnd}); // TODO(b/35997855): Don't just ignore this status! - basic_manager_->StopManagingServable(id).IgnoreError(); + TF_ASSERT_OK(basic_manager_->StopManagingServable(id)); // The servable has been deleted in this thread if there is no // thread-pool for load/unload. if (thread_pool_sizes_.num_load_threads == 0) { @@ -1015,6 +1020,7 @@ TEST_P(BasicManagerTest, ConcurrentLoadsOnlyOneSucceeds) { kNumThreads); for (int i = 0; i < 4; ++i) { load_executor.Schedule([this, id, i, &statuses, &status_mu]() { + // (Suppress a possible "this servable is already managed" error.) basic_manager_->ManageServable(CreateServable(id)).IgnoreError(); basic_manager_->LoadServable( id, [i, &statuses, &status_mu](const Status& status) { diff --git a/tensorflow_serving/core/static_manager.h b/tensorflow_serving/core/static_manager.h index f0f21809f40..bdd2f05618c 100644 --- a/tensorflow_serving/core/static_manager.h +++ b/tensorflow_serving/core/static_manager.h @@ -66,16 +66,13 @@ Status StaticManagerBuilder::AddServable(const ServableId& id, TF_RETURN_IF_ERROR(health_); DCHECK(basic_manager_ != nullptr); - // TODO(b/35997855): Don't just ignore the ::tensorflow::Status object! - basic_manager_ - ->ManageServable(CreateServableData( - id, std::unique_ptr(new SimpleLoader( - [&servable](std::unique_ptr* const returned_servable) { - *returned_servable = std::move(servable); - return Status::OK(); - }, - SimpleLoader::EstimateNoResources())))) - .IgnoreError(); + TF_RETURN_IF_ERROR(basic_manager_->ManageServable(CreateServableData( + id, std::unique_ptr(new SimpleLoader( + [&servable](std::unique_ptr* const returned_servable) { + *returned_servable = std::move(servable); + return Status::OK(); + }, + SimpleLoader::EstimateNoResources()))))); Status load_status; Notification load_done; basic_manager_->LoadServable(id, [&](const Status& status) { diff --git a/tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc b/tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc index 582503a3ec9..ea49918fcdd 100644 --- a/tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc +++ b/tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc @@ -336,9 +336,8 @@ Status FileSystemStoragePathSource::UpdateConfig( } if (aspired_versions_callback_) { - // TODO(b/35997855): Don't just ignore the ::tensorflow::Status object! - UnaspireServables(GetDeletedServables(config_, normalized_config)) - .IgnoreError(); + TF_RETURN_IF_ERROR( + UnaspireServables(GetDeletedServables(config_, normalized_config))); } config_ = normalized_config; From bc4b5478ef78b3c06d5cf41ea83129ec1b29f3e8 Mon Sep 17 00:00:00 2001 From: awk Date: Fri, 6 Jul 2018 14:24:00 -0700 Subject: [PATCH 0130/8103] Set LD_LIBRARY_PATH environment for the whole container, as opposed to just the compile line. This allows binaries (e.g. ModelServer) to run on shell in subsequent commands. Set --crosstool_top globally for all "cuda" compiles. PiperOrigin-RevId: 203524449 --- tensorflow_serving/tools/docker/Dockerfile.devel-gpu | 9 ++++----- tools/bazel.rc | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 70d0940fdb6..b2be38ad5ef 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -109,6 +109,9 @@ RUN mkdir -p ${NCCL_INSTALL_PATH} && \ ln -s /usr/lib/x86_64-linux-gnu/libnccl.so.2 ${NCCL_INSTALL_PATH}lib/libnccl.so.2 && \ ln -s /usr/lib/x86_64-linux-gnu/libnccl.so.$TF_NCCL_VERSION ${NCCL_INSTALL_PATH}lib/libnccl.so.$TF_NCCL_VERSION +RUN ln -s /usr/local/cuda/lib64/stubs/libcuda.so /usr/local/cuda/lib64/stubs/libcuda.so.1 +ENV LD_LIBRARY_PATH=/usr/local/cuda/lib64/stubs:${LD_LIBRARY_PATH} + # Download TF Serving sources (optionally at specific commit). WORKDIR /tensorflow-serving RUN git clone --depth=1 --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tensorflow/serving . @@ -116,15 +119,11 @@ RUN if [ "${TF_SERVING_VERSION_GIT_COMMIT}" != "head" ]; then git checkout ${TF_ # Build, and install TensorFlow Serving ARG TF_SERVING_BUILD_OPTIONS="--copt=-mavx --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0 --verbose_failures" -RUN ln -s /usr/local/cuda/lib64/stubs/libcuda.so /usr/local/cuda/lib64/stubs/libcuda.so.1 && \ - LD_LIBRARY_PATH=/usr/local/cuda/lib64/stubs:${LD_LIBRARY_PATH} \ - bazel build -c opt --color=yes --curses=yes --config=cuda \ +RUN bazel build -c opt --color=yes --curses=yes --config=cuda \ --output_filter=DONT_MATCH_ANYTHING \ - --crosstool_top=@local_config_cuda//crosstool:toolchain \ ${TF_SERVING_BUILD_OPTIONS} \ tensorflow_serving/model_servers:tensorflow_model_server && \ cp bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server /usr/local/bin/ && \ - rm /usr/local/cuda/lib64/stubs/libcuda.so.1 && \ bazel clean --expunge --color=yes # Clean up Bazel cache when done. diff --git a/tools/bazel.rc b/tools/bazel.rc index 0facf32eb07..e95641094f7 100644 --- a/tools/bazel.rc +++ b/tools/bazel.rc @@ -1,4 +1,4 @@ -build:cuda --crosstool_top=@org_tensorflow//third_party/gpus/crosstool +build:cuda --crosstool_top=@local_config_cuda//crosstool:toolchain build:cuda --define=using_cuda=true --define=using_cuda_nvcc=true build --action_env PYTHON_BIN_PATH="/usr/bin/python" From 94bb0dc0e04fb2b459201761ef9a6d8b33e0c92b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 6 Jul 2018 17:02:14 -0700 Subject: [PATCH 0131/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203542407 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 32eb1dc3a49..a54611ff908 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3bf7e6f44484f98eecb8362c97b0de357a0c152b1fd702ada221d596e63f6b96", - git_commit = "b2fe2a874bade4782aaca5c44bf29e7ff6c39200", + sha256 = "c6f1fbd442c8454d7a77fb7bf5fa15fd64fc4594df329e329ee058e6e51c9ee7", + git_commit = "d64754c5c768f26b6a95b350cfd8c7ded2590dc9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b53af25f94448d3ec72c8530eaaba3c459166f30 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 6 Jul 2018 20:03:14 -0700 Subject: [PATCH 0132/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203554499 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a54611ff908..8c45624e2d2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c6f1fbd442c8454d7a77fb7bf5fa15fd64fc4594df329e329ee058e6e51c9ee7", - git_commit = "d64754c5c768f26b6a95b350cfd8c7ded2590dc9", + sha256 = "09c2e22a1686a7dcd34a95fda541fc77a3e899ef6bc2e1401bfb3a15359115c2", + git_commit = "3a8b3f585b0562a9f4913373a12b0e92cddf1589", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2c3d62164629b766e6eab74aa8d4123561403c37 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 7 Jul 2018 22:01:37 -0700 Subject: [PATCH 0133/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203633015 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8c45624e2d2..509ab3ca712 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "09c2e22a1686a7dcd34a95fda541fc77a3e899ef6bc2e1401bfb3a15359115c2", - git_commit = "3a8b3f585b0562a9f4913373a12b0e92cddf1589", + sha256 = "c650743c6e12791511649fa4cd5683eead8821a38024884f8a14a8821ffc413e", + git_commit = "2d4a76a3df4cb9c4466de3b27adc0c0217d2e59f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d159094d98697a3a6b0f6d3cb06bc2ac3245c6d1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 7 Jul 2018 23:01:23 -0700 Subject: [PATCH 0134/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203635634 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 509ab3ca712..8f7fdaa8f99 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c650743c6e12791511649fa4cd5683eead8821a38024884f8a14a8821ffc413e", - git_commit = "2d4a76a3df4cb9c4466de3b27adc0c0217d2e59f", + sha256 = "44fc63ae05c002820d93a16b00d23856dd1eab567dadf603333c291e470fb5ce", + git_commit = "35287be3bb7daa0448af064f5d005a25201d6853", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ebb92d618e63cd40b819ad4738553227a7c01987 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 8 Jul 2018 19:02:52 -0700 Subject: [PATCH 0135/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203696249 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8f7fdaa8f99..2436cbe3d21 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "44fc63ae05c002820d93a16b00d23856dd1eab567dadf603333c291e470fb5ce", - git_commit = "35287be3bb7daa0448af064f5d005a25201d6853", + sha256 = "81d7f2af76ad85a08c956878489bea594232cf3c341a1513d253f644009d2bcb", + git_commit = "216887dfab11e3f76b79abb1d4ff04ab5382f509", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fb5f5af0ebd89ecbc9cadee1820e803372a82e99 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 8 Jul 2018 21:01:32 -0700 Subject: [PATCH 0136/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203703853 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2436cbe3d21..462575505ea 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "81d7f2af76ad85a08c956878489bea594232cf3c341a1513d253f644009d2bcb", - git_commit = "216887dfab11e3f76b79abb1d4ff04ab5382f509", + sha256 = "a6d4b2d2f10acd113cda007bbc82dd7a28a3b454e07d1e072b525a2ff91a7add", + git_commit = "c1ce428a4499ad38916dd512f56a364859c9edd3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4f83092ffe81f304bea11f23403b1a8c581419be Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 8 Jul 2018 22:01:31 -0700 Subject: [PATCH 0137/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203707547 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 462575505ea..be61cd620cf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a6d4b2d2f10acd113cda007bbc82dd7a28a3b454e07d1e072b525a2ff91a7add", - git_commit = "c1ce428a4499ad38916dd512f56a364859c9edd3", + sha256 = "aa32163a453cd244b525335085ebdd62fdada3c0e437ab337a9db9d23e6ef916", + git_commit = "ff83809afa9062e77809d2b65ffbaee3c0045241", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3fad29032d13db070932db3aee2c3bc4d2c09040 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 9 Jul 2018 00:01:54 -0700 Subject: [PATCH 0138/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203715312 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index be61cd620cf..ebe6fc0cc94 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "aa32163a453cd244b525335085ebdd62fdada3c0e437ab337a9db9d23e6ef916", - git_commit = "ff83809afa9062e77809d2b65ffbaee3c0045241", + sha256 = "003a15a1d8e18236756efb7521b915b66641d0d9329fa48b4853c19bd7fa9aff", + git_commit = "caf711b6be448d46354e0cbef23989fa837efcf7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 56cb3bfca7a3d9a5e7bd22e3d205619cb5233380 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 9 Jul 2018 04:01:50 -0700 Subject: [PATCH 0139/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203740725 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ebe6fc0cc94..eac4f222dd3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "003a15a1d8e18236756efb7521b915b66641d0d9329fa48b4853c19bd7fa9aff", - git_commit = "caf711b6be448d46354e0cbef23989fa837efcf7", + sha256 = "904de830c89d36f11a269ce591366c5fe85879a1c1c5342b8f52513fa3bb0a10", + git_commit = "955e356e4c69d3fce4ac2bac5966671e964f9627", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 661497dc5cd73ce2f1589b44a21bf8f40dba4384 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 9 Jul 2018 05:02:01 -0700 Subject: [PATCH 0140/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203747122 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index eac4f222dd3..a5b39cff02f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "904de830c89d36f11a269ce591366c5fe85879a1c1c5342b8f52513fa3bb0a10", - git_commit = "955e356e4c69d3fce4ac2bac5966671e964f9627", + sha256 = "f4a6dd6558e887533803ff4e69c141342eab3f63370e9a336f41fe0d6c12efad", + git_commit = "0063183a62f69c2523a3982c70d72e231428fb60", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From bcea6bd3407d544d4780062510083bba1498acab Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 9 Jul 2018 06:01:40 -0700 Subject: [PATCH 0141/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203752715 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a5b39cff02f..e7c51d8e849 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f4a6dd6558e887533803ff4e69c141342eab3f63370e9a336f41fe0d6c12efad", - git_commit = "0063183a62f69c2523a3982c70d72e231428fb60", + sha256 = "89205c94a7e406feacf3440b6842a3080934124afe82d1bca2491fbf5d148d43", + git_commit = "75a80aa3aa32fa12b74387b67f3d73aca532fc89", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6f2f7efb7c21189cce82977ea6a653dec429bd35 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 9 Jul 2018 09:01:56 -0700 Subject: [PATCH 0142/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203773867 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e7c51d8e849..c37178e4531 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "89205c94a7e406feacf3440b6842a3080934124afe82d1bca2491fbf5d148d43", - git_commit = "75a80aa3aa32fa12b74387b67f3d73aca532fc89", + sha256 = "e6071ad1c7dd1540bc7e802e4b42bc4f194887f58cea3f5cfa94f40468e505f6", + git_commit = "501c2851492bf30ba72f65516eb892e46800122c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 85c64324e65f356d0d90e69406c7b8a40a56407f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 9 Jul 2018 10:01:54 -0700 Subject: [PATCH 0143/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203783089 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c37178e4531..469d598e721 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e6071ad1c7dd1540bc7e802e4b42bc4f194887f58cea3f5cfa94f40468e505f6", - git_commit = "501c2851492bf30ba72f65516eb892e46800122c", + sha256 = "79235dd706307d70c58a84a04123cd161e1a830a7ef126e0e58a25e3889b2a93", + git_commit = "fdcb7ca61fc5b974c46998da87225357fff14354", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2b23fe159925e06aff3de385bb40abf815772326 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 9 Jul 2018 11:03:25 -0700 Subject: [PATCH 0144/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203794477 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 469d598e721..4958c4554ba 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "79235dd706307d70c58a84a04123cd161e1a830a7ef126e0e58a25e3889b2a93", - git_commit = "fdcb7ca61fc5b974c46998da87225357fff14354", + sha256 = "92e12a288157cd1469475ef3ac0142cb1769a2718a63aad532989eb8688602f0", + git_commit = "f83a382e87ca09e8f688515a9549c81d0f46554a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f439e0c3204c73d90f6c2a1f38cc3ad9deb1f01d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 9 Jul 2018 12:04:39 -0700 Subject: [PATCH 0145/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203806171 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4958c4554ba..a1d8b3b7218 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "92e12a288157cd1469475ef3ac0142cb1769a2718a63aad532989eb8688602f0", - git_commit = "f83a382e87ca09e8f688515a9549c81d0f46554a", + sha256 = "894b9dbb7a1b2496c4e61ac64794013f2f8af5b252d1a864f4d465a4d6bc817c", + git_commit = "bcf7e315b4031b3c355af12ca2a4961bcd25c248", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ace5043685782e390c0187d0e028d5ecc24dd725 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 9 Jul 2018 13:01:03 -0700 Subject: [PATCH 0146/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203814947 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a1d8b3b7218..1b7caa29928 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "894b9dbb7a1b2496c4e61ac64794013f2f8af5b252d1a864f4d465a4d6bc817c", - git_commit = "bcf7e315b4031b3c355af12ca2a4961bcd25c248", + sha256 = "87fff40de58f95f6a00bd13c2897c275588c67e9d008e5a8e449c38cdb33cdca", + git_commit = "90e66f2aa1015496c8f8e9be573ef83f542a2ad0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9eabd254f150c7b7b5cc3ae40cbd2a99b2132536 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 9 Jul 2018 14:01:28 -0700 Subject: [PATCH 0147/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203825019 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1b7caa29928..2f3bb7b9d3c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "87fff40de58f95f6a00bd13c2897c275588c67e9d008e5a8e449c38cdb33cdca", - git_commit = "90e66f2aa1015496c8f8e9be573ef83f542a2ad0", + sha256 = "ff8de8cc96e4a37f388a25b608d6cff377057ca2bb6326ffa97dd815f70bd7ed", + git_commit = "d7a62212b80905950a30823dd7946769a8a91035", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ac36792292b1f724d4725f63cc846564c8441a83 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 9 Jul 2018 15:05:57 -0700 Subject: [PATCH 0148/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203836791 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2f3bb7b9d3c..c2432ab3226 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ff8de8cc96e4a37f388a25b608d6cff377057ca2bb6326ffa97dd815f70bd7ed", - git_commit = "d7a62212b80905950a30823dd7946769a8a91035", + sha256 = "13ec50b8ed43ba47f55fa56dcadd681ef443ae06edd201e0d593c1d042fa4824", + git_commit = "5781fb40963754712fef09b4f6574f2f15841626", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 43ee32e20684087e64f1285c704f8d63b6523a19 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 9 Jul 2018 16:00:49 -0700 Subject: [PATCH 0149/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203847020 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c2432ab3226..e98af858e04 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "13ec50b8ed43ba47f55fa56dcadd681ef443ae06edd201e0d593c1d042fa4824", - git_commit = "5781fb40963754712fef09b4f6574f2f15841626", + sha256 = "10d90cb0958d8e7a9927a2fabfba6d8a226459edfd4e2e483f918992e15cf910", + git_commit = "3656bb80c0e2a0066f7fb8aafb48f10f821da301", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ad08500cb2ccf978377088d2a90b19ce973f0096 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 9 Jul 2018 17:01:46 -0700 Subject: [PATCH 0150/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203856573 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e98af858e04..0c3aaeaf54e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "10d90cb0958d8e7a9927a2fabfba6d8a226459edfd4e2e483f918992e15cf910", - git_commit = "3656bb80c0e2a0066f7fb8aafb48f10f821da301", + sha256 = "b4dae52fbc82113ca35a195b127a79111e58e7d0cb99b98b2b4a7cefc0314730", + git_commit = "bc2674d09efbd87ae81ae41b81f1d152f37fac2a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6e6696291fbe29e32e9c5efd2c112f21b4162577 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 9 Jul 2018 18:01:47 -0700 Subject: [PATCH 0151/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203864704 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0c3aaeaf54e..6350681d50f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b4dae52fbc82113ca35a195b127a79111e58e7d0cb99b98b2b4a7cefc0314730", - git_commit = "bc2674d09efbd87ae81ae41b81f1d152f37fac2a", + sha256 = "1bcb2af581a702def8b28a1db2864e7198c7e7a97cdecf1f4ca216bebc55c723", + git_commit = "855d2a723c24ce69ee993144c16506dbef12ed69", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From da4d29bb4427e209e46131863de9ee127e70e858 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 9 Jul 2018 19:01:38 -0700 Subject: [PATCH 0152/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203871063 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6350681d50f..e394f1f3f9a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1bcb2af581a702def8b28a1db2864e7198c7e7a97cdecf1f4ca216bebc55c723", - git_commit = "855d2a723c24ce69ee993144c16506dbef12ed69", + sha256 = "44d02ef2acfaa155a0a79f9f930fd85d2055db19a9dc37bf0b02735ab76cfe00", + git_commit = "c13703f297e639a38de852639e91aeb7fc5bbe60", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2870e901bca4fe15adf1b8cc17e62f4d8c89d5ef Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 9 Jul 2018 20:01:54 -0700 Subject: [PATCH 0153/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203876182 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e394f1f3f9a..54704bd35d3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "44d02ef2acfaa155a0a79f9f930fd85d2055db19a9dc37bf0b02735ab76cfe00", - git_commit = "c13703f297e639a38de852639e91aeb7fc5bbe60", + sha256 = "315b06fb1dc63d30c617a1e6d0da563239b22aa2df0222c9dd900a30d289effa", + git_commit = "ec9afb15c41ac368c037ca3eb18fb567d229dda2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From af5b9ec275e32194c2037695e581f6578bf34c0e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 9 Jul 2018 21:01:55 -0700 Subject: [PATCH 0154/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203881369 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 54704bd35d3..1940f9f326f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "315b06fb1dc63d30c617a1e6d0da563239b22aa2df0222c9dd900a30d289effa", - git_commit = "ec9afb15c41ac368c037ca3eb18fb567d229dda2", + sha256 = "272ad518362d2fe56236edcaaa916b8a2886de7e0cc115b6cd8a268a7420e30b", + git_commit = "f107486df76159924f59b8d6f3f87246e84f4cd3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 22da5028aae860c8e915a05973a5ca11decb7981 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 9 Jul 2018 23:01:43 -0700 Subject: [PATCH 0155/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203891313 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1940f9f326f..1fd0455a8c7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "272ad518362d2fe56236edcaaa916b8a2886de7e0cc115b6cd8a268a7420e30b", - git_commit = "f107486df76159924f59b8d6f3f87246e84f4cd3", + sha256 = "98239f8bfaff07a87c63290e1107c54407129d2429923c2653f45e78a055e6b0", + git_commit = "c59bb780ebd1674ab34dd96d193c71698682ed4d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6c63b3e0ef35a105257e4e66a972d0429c4da067 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 10 Jul 2018 04:01:00 -0700 Subject: [PATCH 0156/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203922271 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1fd0455a8c7..9251fc0ef43 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "98239f8bfaff07a87c63290e1107c54407129d2429923c2653f45e78a055e6b0", - git_commit = "c59bb780ebd1674ab34dd96d193c71698682ed4d", + sha256 = "3bb0a6f12bd5719682eb630f9a9ceeb329ea8985de9cae58a10995aef6bd7a56", + git_commit = "47dea684efa41981e10299c2737317c504ce41af", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 39434d5c9c121ac308651b160fafabd72c72afa4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 10 Jul 2018 07:00:40 -0700 Subject: [PATCH 0157/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203939930 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9251fc0ef43..b1a4fb2ea3d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3bb0a6f12bd5719682eb630f9a9ceeb329ea8985de9cae58a10995aef6bd7a56", - git_commit = "47dea684efa41981e10299c2737317c504ce41af", + sha256 = "c60cf2b9bec7af17279e8bf068a15d31f47f091f5979078d64ce64438d9e8740", + git_commit = "8955c28d591983d47fb08ff9049efdf4830b9aed", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 08aaa6ec6b7ac1fc95d7a540fa4c66efb24c3e4c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 10 Jul 2018 08:01:06 -0700 Subject: [PATCH 0158/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203947075 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b1a4fb2ea3d..81df5dd8678 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c60cf2b9bec7af17279e8bf068a15d31f47f091f5979078d64ce64438d9e8740", - git_commit = "8955c28d591983d47fb08ff9049efdf4830b9aed", + sha256 = "ea671774cf1d4fe6e3fc7c8127c184ba1899e33f4eee0fb5b4e0dacf3b3edaac", + git_commit = "70592a563e7d9bf116c21f87e2a535141e25a362", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 03a23384fd38b9bc2c735626e2034ace9c86696e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 10 Jul 2018 09:01:16 -0700 Subject: [PATCH 0159/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203955312 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 81df5dd8678..6a59a833d31 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ea671774cf1d4fe6e3fc7c8127c184ba1899e33f4eee0fb5b4e0dacf3b3edaac", - git_commit = "70592a563e7d9bf116c21f87e2a535141e25a362", + sha256 = "e489868395c288410ec279430bb6048b21c4324254626347da0302d225ebbb19", + git_commit = "4125012a146fafbe029b7e06c586a3865e0edb71", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 356988d05f5466f3b9b2ebd679e7fd41f0561a11 Mon Sep 17 00:00:00 2001 From: Yuchao Dai <3407450+icyblade@users.noreply.github.com> Date: Wed, 11 Jul 2018 00:55:16 +0800 Subject: [PATCH 0160/8103] minor doc fix minor doc fix --- tensorflow_serving/g3doc/docker.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/g3doc/docker.md b/tensorflow_serving/g3doc/docker.md index af62fc15de6..46a8b7bfdb2 100644 --- a/tensorflow_serving/g3doc/docker.md +++ b/tensorflow_serving/g3doc/docker.md @@ -34,8 +34,8 @@ images you can pull. Once you have pulled the serving image, you can try serving an example model. -We will use a toy model called `Half Plus Three`, which will predict values `0.5 -* x + 3` for the values we provide for prediction. +We will use a toy model called `Half Plus Three`, which will predict values `0.5 * x + 3` +for the values we provide for prediction. To get this model, first clone the TensorFlow Serving repo. From 432f5e87f834d77370851fac20b0d2e4a3119bde Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 10 Jul 2018 10:02:58 -0700 Subject: [PATCH 0161/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203965628 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6a59a833d31..dfe0b04266f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e489868395c288410ec279430bb6048b21c4324254626347da0302d225ebbb19", - git_commit = "4125012a146fafbe029b7e06c586a3865e0edb71", + sha256 = "950cbb6a1863fb96e35eb14550e2dd30dfc32b6ff1b8638324b9dc2dacc32660", + git_commit = "8a6ef2cb4f98bacc1f821f60c21914b4bd5faaef", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c7154ce442e61714789b281d42a79c25401a0902 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 10 Jul 2018 11:01:04 -0700 Subject: [PATCH 0162/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203976743 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dfe0b04266f..ddd38331d8f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "950cbb6a1863fb96e35eb14550e2dd30dfc32b6ff1b8638324b9dc2dacc32660", - git_commit = "8a6ef2cb4f98bacc1f821f60c21914b4bd5faaef", + sha256 = "a17675d1c8116b03ce9800fd2fc52e0b688471741be03ce87580e9979ebcf18c", + git_commit = "7aeb0807b6293067534655709977861b2fec529b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 96c196f2068b38ef55a149b8d0f6fdf0b1ecd56d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 10 Jul 2018 12:01:18 -0700 Subject: [PATCH 0163/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203987502 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ddd38331d8f..9f408f53642 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a17675d1c8116b03ce9800fd2fc52e0b688471741be03ce87580e9979ebcf18c", - git_commit = "7aeb0807b6293067534655709977861b2fec529b", + sha256 = "46fda28520c0391410c69a11fc4c71e6f36b72df0a14984540ae66e8f05df838", + git_commit = "42e8b4ff55956845932fa6589d561caada860d58", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 09ae30b2971880b8f1790a12dda86ff4e8d391be Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 10 Jul 2018 13:01:20 -0700 Subject: [PATCH 0164/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 203996773 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9f408f53642..2164ee7dbe6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "46fda28520c0391410c69a11fc4c71e6f36b72df0a14984540ae66e8f05df838", - git_commit = "42e8b4ff55956845932fa6589d561caada860d58", + sha256 = "fababf1717b56901d8ca8a41064873b8ea1764c2ce98ea290edd3686ebea1c4c", + git_commit = "5278b8509e2cd1b2847315db46fc0f958824cfce", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 36970cd30c439052dc95369c0842a2f9508a0380 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 10 Jul 2018 14:03:30 -0700 Subject: [PATCH 0165/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204008220 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2164ee7dbe6..6f468a75703 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fababf1717b56901d8ca8a41064873b8ea1764c2ce98ea290edd3686ebea1c4c", - git_commit = "5278b8509e2cd1b2847315db46fc0f958824cfce", + sha256 = "dbcbe0c093a516fa2cdba08368ea17655a52f7a945c63a1c7546d8e021e2e081", + git_commit = "ccbbd4484a29fb3ee7d0d67abcebafdb48c9059b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From eb4d2d07f89da3583697c99cad6521f572f3cc6c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 10 Jul 2018 15:01:19 -0700 Subject: [PATCH 0166/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204018786 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6f468a75703..71a9f45a735 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dbcbe0c093a516fa2cdba08368ea17655a52f7a945c63a1c7546d8e021e2e081", - git_commit = "ccbbd4484a29fb3ee7d0d67abcebafdb48c9059b", + sha256 = "dc23058a575fe5c0f35adb4f62d4e8fbdb6eefd8cee31c6b2de1e577e37da278", + git_commit = "e7fb6f5f0e1745f6140e0add84e931e4786e8269", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From af20bb3b23998aef4042abe8753767bc9a7a39c4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 10 Jul 2018 16:01:02 -0700 Subject: [PATCH 0167/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204029089 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 71a9f45a735..b5daf60b077 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dc23058a575fe5c0f35adb4f62d4e8fbdb6eefd8cee31c6b2de1e577e37da278", - git_commit = "e7fb6f5f0e1745f6140e0add84e931e4786e8269", + sha256 = "7e7c3f719868f444039a9401d770a748e9e328d50ceec62965d8511f18dc96af", + git_commit = "91377140e5b3e0c632f073139b98466bb0e83e22", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3073dc8ee06f58b4a7d2525df176f19eade97f0f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 10 Jul 2018 17:02:07 -0700 Subject: [PATCH 0168/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204038433 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b5daf60b077..d09bb214e6f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7e7c3f719868f444039a9401d770a748e9e328d50ceec62965d8511f18dc96af", - git_commit = "91377140e5b3e0c632f073139b98466bb0e83e22", + sha256 = "aceccc35cd21fb61695ee283e51aedd9231465fa697f49971876164fe9debd6f", + git_commit = "92dcc2e87d3c7895c6a42491b70d003cc52d1cec", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5e5fcd8793f569773a9be4e7c25cebc87c43af8d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 10 Jul 2018 18:02:45 -0700 Subject: [PATCH 0169/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204046441 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d09bb214e6f..7ae24f8dcfb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "aceccc35cd21fb61695ee283e51aedd9231465fa697f49971876164fe9debd6f", - git_commit = "92dcc2e87d3c7895c6a42491b70d003cc52d1cec", + sha256 = "30500afb9d946f492f6b04a94de2efefbf8351fcf3fed1c0e635caca999422f9", + git_commit = "b96954c367b24ad9c0614b1b7d0d9c36582e88d8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 84578da8b3c574fa3a6b024173c337cfa6be1e7c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 10 Jul 2018 21:02:34 -0700 Subject: [PATCH 0170/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204062486 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7ae24f8dcfb..7402e7eb631 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "30500afb9d946f492f6b04a94de2efefbf8351fcf3fed1c0e635caca999422f9", - git_commit = "b96954c367b24ad9c0614b1b7d0d9c36582e88d8", + sha256 = "b4b28c090f3f867760c0303454d6d4a76d761e0607ab7169816105a9bcf38e74", + git_commit = "b9827002dc5ab01b183773c4dc5551e04058357a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1ef759b0b56d763833b7c884408a14779e1842a5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 10 Jul 2018 22:01:38 -0700 Subject: [PATCH 0171/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204067185 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7402e7eb631..b9a0ea624a1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b4b28c090f3f867760c0303454d6d4a76d761e0607ab7169816105a9bcf38e74", - git_commit = "b9827002dc5ab01b183773c4dc5551e04058357a", + sha256 = "6c3656b5683bc970de3a48278fd1536e436d58226cd3029bbf3400bab5ad94ea", + git_commit = "b58937d54c5b01b4f986328ead1b088a1f1ded05", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6d9202799709e0f7ca57ecaa3818d101c5af1f79 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 10 Jul 2018 23:02:54 -0700 Subject: [PATCH 0172/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204071855 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b9a0ea624a1..7725e06de04 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6c3656b5683bc970de3a48278fd1536e436d58226cd3029bbf3400bab5ad94ea", - git_commit = "b58937d54c5b01b4f986328ead1b088a1f1ded05", + sha256 = "1cf8f54b97909a9808e4b5c6be8d1c12b4a08e58f608594096ca34f9187a1c55", + git_commit = "f351e5ef6b36e96e633be2ebd9e1286b500fbce4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 59f424902ade20fe971d8b7fa14c3411296bb051 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 11 Jul 2018 00:02:12 -0700 Subject: [PATCH 0173/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204076325 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7725e06de04..7770049ca3d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1cf8f54b97909a9808e4b5c6be8d1c12b4a08e58f608594096ca34f9187a1c55", - git_commit = "f351e5ef6b36e96e633be2ebd9e1286b500fbce4", + sha256 = "ed5f60f40d3247a3444b7d7909f6c9efec998d87cf0723c0d3e8204c1677845c", + git_commit = "edc511fd696053f2c34f49003fe2eeb05fb7d7de", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3be8bae77f39ee1eedaae37803259a5778746664 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 11 Jul 2018 03:03:34 -0700 Subject: [PATCH 0174/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204096196 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7770049ca3d..5b66c4c5e2c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ed5f60f40d3247a3444b7d7909f6c9efec998d87cf0723c0d3e8204c1677845c", - git_commit = "edc511fd696053f2c34f49003fe2eeb05fb7d7de", + sha256 = "bf985b20e7e9ed7213d8e3654de9efea7c29e29c90459aae6d1ccb36ca8de845", + git_commit = "95cfd8b3d9697775804889fe994cc934b7273b51", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From da75aa5d10c176171c74f0ef1f3db0b9799343fd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 11 Jul 2018 05:03:08 -0700 Subject: [PATCH 0175/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204106123 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5b66c4c5e2c..83499f5f569 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bf985b20e7e9ed7213d8e3654de9efea7c29e29c90459aae6d1ccb36ca8de845", - git_commit = "95cfd8b3d9697775804889fe994cc934b7273b51", + sha256 = "076ea9a61204e6773c9942b5527cc192821fd00a60fc54a7d300901deb5c8145", + git_commit = "b50e7b980c983beab90e62f6013aa3dc2f50ac7f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ee2bc6b7c3a5e92d6f9341069386ff5251a61b9e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 11 Jul 2018 06:01:53 -0700 Subject: [PATCH 0176/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204111617 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 83499f5f569..d1b88163737 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "076ea9a61204e6773c9942b5527cc192821fd00a60fc54a7d300901deb5c8145", - git_commit = "b50e7b980c983beab90e62f6013aa3dc2f50ac7f", + sha256 = "d75568078034f1e60cce8cae0a09066084e68bf330dbcdffcc27884c7b409fde", + git_commit = "ab39198aceb641d7be631ba85091a4139edf203f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 986045459044b8b26d5600bdcf64164e6275b93a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 11 Jul 2018 07:01:07 -0700 Subject: [PATCH 0177/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204117954 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d1b88163737..f7fa6f75f27 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d75568078034f1e60cce8cae0a09066084e68bf330dbcdffcc27884c7b409fde", - git_commit = "ab39198aceb641d7be631ba85091a4139edf203f", + sha256 = "62657c65ef341a9549cf28a5f156087ab630216b81387e12c96c8381245d40e3", + git_commit = "91b5fcd19611789313c8f29c05ee8661ae2bfcb4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e7045164a627efa187829c4a0defabd7fc8781cb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 11 Jul 2018 08:02:17 -0700 Subject: [PATCH 0178/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204124961 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f7fa6f75f27..9e07669a4d3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "62657c65ef341a9549cf28a5f156087ab630216b81387e12c96c8381245d40e3", - git_commit = "91b5fcd19611789313c8f29c05ee8661ae2bfcb4", + sha256 = "2d73ee1d4bd4b66a5a58c1fbac972d1a6996c5c25abc04010c4eb0f5230dc781", + git_commit = "104adcbeb228e78c79785536a7ecd5fcd32fdf91", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f74b6697ab10339dfc30945193c118fe2f94c960 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 11 Jul 2018 10:01:18 -0700 Subject: [PATCH 0179/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204142178 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9e07669a4d3..f80056536fc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2d73ee1d4bd4b66a5a58c1fbac972d1a6996c5c25abc04010c4eb0f5230dc781", - git_commit = "104adcbeb228e78c79785536a7ecd5fcd32fdf91", + sha256 = "85c56efe238c74953d54cad794fa7872540315fecd59e574c2cf878e171df38b", + git_commit = "2b884c20b59820c3e51d658021d8eef605652cc3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 36c9bdae0b28d3a2d164718d47ab0d4d74ef7faa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 11 Jul 2018 11:01:35 -0700 Subject: [PATCH 0180/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204153043 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f80056536fc..c48c82ac1f6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "85c56efe238c74953d54cad794fa7872540315fecd59e574c2cf878e171df38b", - git_commit = "2b884c20b59820c3e51d658021d8eef605652cc3", + sha256 = "7c792bde65faa6a307a2b72e67c4bf8d004f3f60ad4e9cce11b51612be46e920", + git_commit = "5c33f184ada71279d22304fa6a480fe5600c097a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b861cad2c05a4e19da80ac43180ffc91f2f817c9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 11 Jul 2018 12:02:14 -0700 Subject: [PATCH 0181/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204164144 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c48c82ac1f6..1d9a460d0a7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7c792bde65faa6a307a2b72e67c4bf8d004f3f60ad4e9cce11b51612be46e920", - git_commit = "5c33f184ada71279d22304fa6a480fe5600c097a", + sha256 = "38bbeb052c051ccb62225eb673af63b3773d0b58e9d983b909ce93cf18f38dc7", + git_commit = "135e419e780423a888ddd45e479129493336c52b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 54ac56c6fa87a84c79cc40052b0d0f14e25d79b7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 11 Jul 2018 13:02:03 -0700 Subject: [PATCH 0182/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204173375 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1d9a460d0a7..6cc08342009 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "38bbeb052c051ccb62225eb673af63b3773d0b58e9d983b909ce93cf18f38dc7", - git_commit = "135e419e780423a888ddd45e479129493336c52b", + sha256 = "a1176f93f21758d9846a729ebf60631440a68467fc94db70cfa33656c489f1ad", + git_commit = "2e9e45201adcd65634ee88f58309002c4fdd95e6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 10a24601e66d98f49e70375ba735043cec5fbc26 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 11 Jul 2018 14:01:50 -0700 Subject: [PATCH 0183/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204184289 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6cc08342009..cad724bc46a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a1176f93f21758d9846a729ebf60631440a68467fc94db70cfa33656c489f1ad", - git_commit = "2e9e45201adcd65634ee88f58309002c4fdd95e6", + sha256 = "c30e1bb4bf3a005954a54f9cc7ee58cbd8b735c70250a2b8f5f71ed00a25bbe7", + git_commit = "ae1056ea22c8462668e168741fae1b456c9155d9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 14afbf891011fffac04923a65b01d8eecb0bfc71 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 11 Jul 2018 15:02:05 -0700 Subject: [PATCH 0184/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204195915 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cad724bc46a..a51bffa4b38 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c30e1bb4bf3a005954a54f9cc7ee58cbd8b735c70250a2b8f5f71ed00a25bbe7", - git_commit = "ae1056ea22c8462668e168741fae1b456c9155d9", + sha256 = "c19b5a53a72ca07cf28410ce1329ca4b51bfa86f2c13c1ce0697cb183ba0be72", + git_commit = "1b896792223fb50affa59a96ecea490dd722211a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From aeaf42c753c36154325576ec51796e587a0ebcde Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 11 Jul 2018 16:05:21 -0700 Subject: [PATCH 0185/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204206822 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a51bffa4b38..123a6e7d996 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c19b5a53a72ca07cf28410ce1329ca4b51bfa86f2c13c1ce0697cb183ba0be72", - git_commit = "1b896792223fb50affa59a96ecea490dd722211a", + sha256 = "7a9ed35a1d29e2a4a8276c4bc14307d0330bb280ef88ca2a3cdaebebde6542e4", + git_commit = "f2fa55c8d2f94bd186fc6c47b8ce00fb87c22aaf", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 70626070e49ae18620f0dd9a922fc7e9f1d0ee40 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 11 Jul 2018 17:02:25 -0700 Subject: [PATCH 0186/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204216027 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 123a6e7d996..81d4dbeeb53 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7a9ed35a1d29e2a4a8276c4bc14307d0330bb280ef88ca2a3cdaebebde6542e4", - git_commit = "f2fa55c8d2f94bd186fc6c47b8ce00fb87c22aaf", + sha256 = "dff54839ed3291e63a2282762c843e278717ef102985e1d6b09756fa3779214a", + git_commit = "72e0e3d383321d160c5ae7bffcf66bed726d8a62", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 75c6d91c748db3f7244431994b6c26cdcceb6efc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 11 Jul 2018 18:02:14 -0700 Subject: [PATCH 0187/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204223760 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 81d4dbeeb53..9edaa2963f3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dff54839ed3291e63a2282762c843e278717ef102985e1d6b09756fa3779214a", - git_commit = "72e0e3d383321d160c5ae7bffcf66bed726d8a62", + sha256 = "bec660a52ca8018bae003cd78c5402c4e5879f84192a24a7cebc0867a7c22afd", + git_commit = "4d04403a3d84959a354aeda4338511aaad714cda", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3cd934519470c8f25d6303bca5cdb0b70060b0c6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 11 Jul 2018 19:01:45 -0700 Subject: [PATCH 0188/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204229359 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9edaa2963f3..5b870748cfa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bec660a52ca8018bae003cd78c5402c4e5879f84192a24a7cebc0867a7c22afd", - git_commit = "4d04403a3d84959a354aeda4338511aaad714cda", + sha256 = "6eb51f9f4ab2acafa0a22eda0b6d87e855773ac6fc05ef756bf0aec8037f3466", + git_commit = "5574d6041a5a5d91c4be3449d7a456a146da4c0e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3c94f2746d5bffc20aaf339a1e2b409ce7412689 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 11 Jul 2018 20:02:01 -0700 Subject: [PATCH 0189/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204233896 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5b870748cfa..f0ca58c0e1f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6eb51f9f4ab2acafa0a22eda0b6d87e855773ac6fc05ef756bf0aec8037f3466", - git_commit = "5574d6041a5a5d91c4be3449d7a456a146da4c0e", + sha256 = "7500977546a89e92430b3559f895f19f22b0a683ddd54fcc51045529fbb6b2eb", + git_commit = "4ddcd6999a68335daf225fbd170d70f3d733b74f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 861e35776b18d9f6b8c95b43cea1c77050e6f7f8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 11 Jul 2018 21:02:35 -0700 Subject: [PATCH 0190/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204238905 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f0ca58c0e1f..62738546092 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7500977546a89e92430b3559f895f19f22b0a683ddd54fcc51045529fbb6b2eb", - git_commit = "4ddcd6999a68335daf225fbd170d70f3d733b74f", + sha256 = "b121ece1ba51b408bee9dc47aec6a262a45ef38e6caedd3fa0ada602e2de82af", + git_commit = "26cd1d1d0630489709e300b72a67d08d50faaf6c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0c4cc3f95a58149941d4c5cc8dfcd21305790365 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 11 Jul 2018 22:01:31 -0700 Subject: [PATCH 0191/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204243084 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 62738546092..f1863ef9487 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b121ece1ba51b408bee9dc47aec6a262a45ef38e6caedd3fa0ada602e2de82af", - git_commit = "26cd1d1d0630489709e300b72a67d08d50faaf6c", + sha256 = "1f64bf3d8c50b2dbea010d1ff9d05a0705b31fdd026e230f85eda3ccdd0f6c11", + git_commit = "80fb8679ab14ba3d180e8eb22da11509a15b9219", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 67ec84ae4327e2d1f1513a9128833c3f18d55cfa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 12 Jul 2018 03:02:44 -0700 Subject: [PATCH 0192/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204269545 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f1863ef9487..6cca8c1ecce 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1f64bf3d8c50b2dbea010d1ff9d05a0705b31fdd026e230f85eda3ccdd0f6c11", - git_commit = "80fb8679ab14ba3d180e8eb22da11509a15b9219", + sha256 = "80d6fe8a2d6173de2637b10ce1301d082c01c8d6c0c4b723402146d03373269a", + git_commit = "2b57d8d521fff37529d375e702fb2cd9ac2b36eb", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 187b9783f40d3a9b9fac586eb4cfb1393038cfce Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 12 Jul 2018 05:02:30 -0700 Subject: [PATCH 0193/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204281581 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6cca8c1ecce..b4ff8231d1f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "80d6fe8a2d6173de2637b10ce1301d082c01c8d6c0c4b723402146d03373269a", - git_commit = "2b57d8d521fff37529d375e702fb2cd9ac2b36eb", + sha256 = "6b4aae6de5a5a560f8228b9eef243ef3419c858ed2e3a620c505cfe917099c36", + git_commit = "eccc1d4c102b1b3b03b98dbc362f799cb540a1da", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 722ff2a3e6f9bd42e638d9db80c519646ec78b93 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 12 Jul 2018 07:02:55 -0700 Subject: [PATCH 0194/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204293444 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b4ff8231d1f..70ce99b4eb8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6b4aae6de5a5a560f8228b9eef243ef3419c858ed2e3a620c505cfe917099c36", - git_commit = "eccc1d4c102b1b3b03b98dbc362f799cb540a1da", + sha256 = "0dd328c63c7f7b27f44854333cdfa46c6827f020aac876523ec35cf5b40578d3", + git_commit = "b8ff1c197ddb8642ff50b876cfecdb6741777fab", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0b57165aa5d33691b8a3d4a1d8c345fc3ac31fe2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 12 Jul 2018 08:02:26 -0700 Subject: [PATCH 0195/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204300375 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 70ce99b4eb8..71ddb52cd48 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0dd328c63c7f7b27f44854333cdfa46c6827f020aac876523ec35cf5b40578d3", - git_commit = "b8ff1c197ddb8642ff50b876cfecdb6741777fab", + sha256 = "b792b0e40232f9e0d22bb9f5eeeb648fb7ce841d479f78e24cf5ede9281893d0", + git_commit = "4665633c5f3fcd98de8c4cab909c8ac64c28ed0f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4a60617b04c362ad9aec2ed34b86711325458994 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 12 Jul 2018 10:01:15 -0700 Subject: [PATCH 0196/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204316968 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 71ddb52cd48..2bcd050b73f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b792b0e40232f9e0d22bb9f5eeeb648fb7ce841d479f78e24cf5ede9281893d0", - git_commit = "4665633c5f3fcd98de8c4cab909c8ac64c28ed0f", + sha256 = "3e2fdd8742e05546f7ce8e14c66ea1e0a537ec3a55e1b1385ca8195114d4ce4c", + git_commit = "34a1b6780b55764802cd490e50481d4d2ed8355c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d4b0de9fec871e83e481dc431247da34071d201f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 12 Jul 2018 11:02:29 -0700 Subject: [PATCH 0197/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204328314 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2bcd050b73f..0ac09b8b5ac 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3e2fdd8742e05546f7ce8e14c66ea1e0a537ec3a55e1b1385ca8195114d4ce4c", - git_commit = "34a1b6780b55764802cd490e50481d4d2ed8355c", + sha256 = "f7e989a58ef848249618d6e0c51b8a59e10724c9458e8b1d0bf0911410d67abf", + git_commit = "61fbae09afbdc225e2a603ee9045f6f298e802c3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 39c0112030a26ae7149bca87a0ff8fa20daa8897 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 12 Jul 2018 12:02:29 -0700 Subject: [PATCH 0198/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204339172 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0ac09b8b5ac..b2cf6ce66ad 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f7e989a58ef848249618d6e0c51b8a59e10724c9458e8b1d0bf0911410d67abf", - git_commit = "61fbae09afbdc225e2a603ee9045f6f298e802c3", + sha256 = "bf0935f85736e928b796aa74d47c50d7894fa978a32c4a28b9f5b42551499d7b", + git_commit = "f8ce8dc04f569b3bbd1ac7cc9e358a651530990d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a617fc640d5662f2dfe22f88e35dbb888e9519c1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 12 Jul 2018 13:00:46 -0700 Subject: [PATCH 0199/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204348773 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b2cf6ce66ad..d5dc3ac858b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bf0935f85736e928b796aa74d47c50d7894fa978a32c4a28b9f5b42551499d7b", - git_commit = "f8ce8dc04f569b3bbd1ac7cc9e358a651530990d", + sha256 = "5f380de3c79e8e0dbee32331a8e1e8e637bf8fda8594e881429593f8d0ecc088", + git_commit = "c35bd2e9d3d9311bc7fb0f2463869faf1a8a7b50", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d22b30322555c1baa6f43791cd974521bb5b27d4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 12 Jul 2018 14:01:29 -0700 Subject: [PATCH 0200/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204359438 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d5dc3ac858b..545f308b40b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5f380de3c79e8e0dbee32331a8e1e8e637bf8fda8594e881429593f8d0ecc088", - git_commit = "c35bd2e9d3d9311bc7fb0f2463869faf1a8a7b50", + sha256 = "b1cb3334cd18fb9baa6c9328cc31dc7dd8da09b77184ac3df021a2de6fc63300", + git_commit = "39d5c4770a397e98ba30102924bae0de2f0c8b5a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 75caa5518a3b6704a02637bc47c534bc2d0c88e9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 12 Jul 2018 15:02:09 -0700 Subject: [PATCH 0201/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204370977 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 545f308b40b..e2f0f208351 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b1cb3334cd18fb9baa6c9328cc31dc7dd8da09b77184ac3df021a2de6fc63300", - git_commit = "39d5c4770a397e98ba30102924bae0de2f0c8b5a", + sha256 = "c7c475096ca9cdf5de1339967407fa514bcb2055d43e09de4e55195725d2c8c8", + git_commit = "c61c7f1ea6a5e6aa0af19eb21d03b351031d944c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 539533de20cee8b9efe0d9cb86a8aa369fa51985 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 12 Jul 2018 16:02:20 -0700 Subject: [PATCH 0202/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204381481 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e2f0f208351..15fc3e1d140 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c7c475096ca9cdf5de1339967407fa514bcb2055d43e09de4e55195725d2c8c8", - git_commit = "c61c7f1ea6a5e6aa0af19eb21d03b351031d944c", + sha256 = "19a17383f7a5389f9ace36e98ea302070a43b1de396dbb2568238cf015520561", + git_commit = "4297b9d492327072c0d64b7243925eba192fe028", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From aa4d0c81777f7e66566512065771ef3985203eba Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 12 Jul 2018 17:00:49 -0700 Subject: [PATCH 0203/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204390824 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 15fc3e1d140..83653cf57cb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "19a17383f7a5389f9ace36e98ea302070a43b1de396dbb2568238cf015520561", - git_commit = "4297b9d492327072c0d64b7243925eba192fe028", + sha256 = "4f1df96142e1acad22cca9a3b73a213d5cc4af742eedeff4889e56f97fda156c", + git_commit = "fde3f09e3080a28b9a06ee219474957ba149a20d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7662f03977f41d0d19065febf9d3bd40b64848e0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 12 Jul 2018 18:02:46 -0700 Subject: [PATCH 0204/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204399262 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 83653cf57cb..c3d15d3f325 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4f1df96142e1acad22cca9a3b73a213d5cc4af742eedeff4889e56f97fda156c", - git_commit = "fde3f09e3080a28b9a06ee219474957ba149a20d", + sha256 = "b4d0859e4dc090f03bcf0646bd32010ccb64bffd47da0d6b3faf8db80f2890ea", + git_commit = "aace1be4dae9ec2a1d49f26783ae9cedcd9edc27", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e6e224cdc823f9ce306b11eff46f0d0fd60f0e69 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 12 Jul 2018 19:01:48 -0700 Subject: [PATCH 0205/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204405524 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c3d15d3f325..f6f3a2e5aa1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b4d0859e4dc090f03bcf0646bd32010ccb64bffd47da0d6b3faf8db80f2890ea", - git_commit = "aace1be4dae9ec2a1d49f26783ae9cedcd9edc27", + sha256 = "246a5c49fd730154479785f60b3ddf45aa74669fb6b0764dc14998b0eb14e209", + git_commit = "6468c599d4b3b5c6fa94d171c1ba6b4254286c23", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 524f1bf87d39be3b0ba212b30aa82f899a09adb1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 12 Jul 2018 20:01:54 -0700 Subject: [PATCH 0206/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204410272 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f6f3a2e5aa1..6565a3e4750 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "246a5c49fd730154479785f60b3ddf45aa74669fb6b0764dc14998b0eb14e209", - git_commit = "6468c599d4b3b5c6fa94d171c1ba6b4254286c23", + sha256 = "4c08fb4079b95b4606c1886b3d54df39c24fff4f46eccef67ab2959c1c05d0ea", + git_commit = "445d26cf708b8e430549997573633a4dd1dc18fe", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ee9a712aa8d40acb767695349b9ba095292b3d0d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 12 Jul 2018 21:02:23 -0700 Subject: [PATCH 0207/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204415630 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6565a3e4750..668dc737ec0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4c08fb4079b95b4606c1886b3d54df39c24fff4f46eccef67ab2959c1c05d0ea", - git_commit = "445d26cf708b8e430549997573633a4dd1dc18fe", + sha256 = "fdad89e0420c2228b12e98daaad745749af790470a67cb69b18e17eb0f90f894", + git_commit = "59bfc71a71df63c2859e17179a0d375e4bb96fb0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 47a155718d898de13ae3955fe18b130e4de5c2d4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 12 Jul 2018 22:01:46 -0700 Subject: [PATCH 0208/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204420099 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 668dc737ec0..f095edd2644 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fdad89e0420c2228b12e98daaad745749af790470a67cb69b18e17eb0f90f894", - git_commit = "59bfc71a71df63c2859e17179a0d375e4bb96fb0", + sha256 = "54db81e56903c644401c4790e48b3341bab9606579554f061e90ce696794b260", + git_commit = "385bb78761489cfa6d6808f239fe884152e71653", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3fb34c810fc78f83d2ba00faacbf39427ad32383 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 13 Jul 2018 00:02:07 -0700 Subject: [PATCH 0209/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204428458 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f095edd2644..8119cdc5016 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "54db81e56903c644401c4790e48b3341bab9606579554f061e90ce696794b260", - git_commit = "385bb78761489cfa6d6808f239fe884152e71653", + sha256 = "85b556b41e50f50fe60a1b30f3544331a286eee7d9875c76c171ff58e94c641d", + git_commit = "1b765165987f5277e294251c118f321166c70932", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a908190dc0bb18e7ff94dc107e8e06b0f73a15a4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 13 Jul 2018 02:00:59 -0700 Subject: [PATCH 0210/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204439223 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8119cdc5016..fb88a5d13fa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "85b556b41e50f50fe60a1b30f3544331a286eee7d9875c76c171ff58e94c641d", - git_commit = "1b765165987f5277e294251c118f321166c70932", + sha256 = "6872cad1fcceccac564b670c794aa0afff8d80c6aba8406ebe091f9008ebf3fd", + git_commit = "9be83d3d6e7d1e61d7c3cc4160d214c633665751", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e05174344b4b0a96cb978f48cd0371e2b3ca0f30 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 13 Jul 2018 04:01:24 -0700 Subject: [PATCH 0211/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204451030 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fb88a5d13fa..69e7b6128e5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6872cad1fcceccac564b670c794aa0afff8d80c6aba8406ebe091f9008ebf3fd", - git_commit = "9be83d3d6e7d1e61d7c3cc4160d214c633665751", + sha256 = "9d4b76598c52f836a0cb0088d2052d0c08545f0633194adb956bc0fa72736fca", + git_commit = "e438b192d27f2881e9c627166d73a4fdafcfeb7d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9d7338cb305e507919b48b969f0d2c522fbc12d2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 13 Jul 2018 07:02:05 -0700 Subject: [PATCH 0212/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204466130 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 69e7b6128e5..852be921378 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9d4b76598c52f836a0cb0088d2052d0c08545f0633194adb956bc0fa72736fca", - git_commit = "e438b192d27f2881e9c627166d73a4fdafcfeb7d", + sha256 = "f0bd64b4f856e9d7f5eec0a9d7cf5cca194f3b869042cbf9657d2c4565c93d6c", + git_commit = "895a7667884545a68480eb91916a5a23c2852308", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0a1ca3ebf1777deedf80dc3522d574b8093f48c9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 13 Jul 2018 09:02:17 -0700 Subject: [PATCH 0213/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204479083 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 852be921378..e637c59bc95 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f0bd64b4f856e9d7f5eec0a9d7cf5cca194f3b869042cbf9657d2c4565c93d6c", - git_commit = "895a7667884545a68480eb91916a5a23c2852308", + sha256 = "d996beedefa870e9caf4ad07e18c62c10128dfcf7cfdd4de1e1a860580299a6c", + git_commit = "bef6212a1a69610053b713557d79f8a358eebdb7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5a21bbd53e0d5c545bc216a18a4bb55e9b108a3d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 13 Jul 2018 10:01:14 -0700 Subject: [PATCH 0214/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204487025 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e637c59bc95..3f6b710e2be 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d996beedefa870e9caf4ad07e18c62c10128dfcf7cfdd4de1e1a860580299a6c", - git_commit = "bef6212a1a69610053b713557d79f8a358eebdb7", + sha256 = "96585481d7dfdf21a2a9ad313484389d35724583c163da2a510583c97e9f8df8", + git_commit = "23e26ec2a7521c924b2a9fc435c04761f97fe6ba", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a84bbd340e1eee8d46765b373fd9c9d6591a4688 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 13 Jul 2018 11:01:44 -0700 Subject: [PATCH 0215/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204497301 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3f6b710e2be..08d339fce16 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "96585481d7dfdf21a2a9ad313484389d35724583c163da2a510583c97e9f8df8", - git_commit = "23e26ec2a7521c924b2a9fc435c04761f97fe6ba", + sha256 = "eeb2fb68811ae83050667eef8309d30f9514a0a4abd29ed88bcee340b659eba1", + git_commit = "feba399acb6f3c89ed5cd2602c454c179fcb792b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f98a007293e9a64ed6b7647d81247741091e2d6e Mon Sep 17 00:00:00 2001 From: awk Date: Fri, 13 Jul 2018 11:50:57 -0700 Subject: [PATCH 0216/8103] Add new tool bazel_in_docker.sh to do bazel builds in (hermetic) container, while writing final artifacts back to host where the source resides. This allows users to use local host to keep the source (and use their IDEs/tools) for development. This needs Bazel 0.15.0 (older versions dont seem to work with Docker bind mounts). Update the required version. Drop --depth from git clone (adds 2MB to disk) and add remote upstream so users can fetch and sync to HEAD easily. PiperOrigin-RevId: 204505517 --- WORKSPACE | 2 +- .../tools/docker/Dockerfile.devel | 7 +- .../tools/docker/Dockerfile.devel-gpu | 7 +- tools/bazel_in_docker.sh | 81 +++++++++++++++++++ 4 files changed, 90 insertions(+), 7 deletions(-) create mode 100755 tools/bazel_in_docker.sh diff --git a/WORKSPACE b/WORKSPACE index 08d339fce16..e25589f8416 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -35,4 +35,4 @@ tf_serving_workspace() # Specify the minimum required bazel version. load("@org_tensorflow//tensorflow:version_check.bzl", "check_bazel_version_at_least") -check_bazel_version_at_least("0.11.1") +check_bazel_version_at_least("0.15.0") diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index e9138fd5908..6f5182a719c 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -60,8 +60,8 @@ RUN echo "startup --batch" >>/etc/bazel.bazelrc # https://github.com/bazelbuild/bazel/issues/418 RUN echo "build --spawn_strategy=standalone --genrule_strategy=standalone" \ >>/etc/bazel.bazelrc -# Install a recent bazel release. -ENV BAZEL_VERSION 0.11.1 +# Need >= 0.15.0 so bazel compiles work with docker bind mounts. +ENV BAZEL_VERSION 0.15.0 WORKDIR / RUN mkdir /bazel && \ cd /bazel && \ @@ -74,7 +74,8 @@ RUN mkdir /bazel && \ # Download TF Serving sources (optionally at specific commit). WORKDIR /tensorflow-serving -RUN git clone --depth=1 --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tensorflow/serving . +RUN git clone --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tensorflow/serving . +RUN git remote add upstream https://github.com/tensorflow/serving.git RUN if [ "${TF_SERVING_VERSION_GIT_COMMIT}" != "head" ]; then git checkout ${TF_SERVING_VERSION_GIT_COMMIT} ; fi # Build, and install TensorFlow Serving diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index b2be38ad5ef..7927077a2b6 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -66,8 +66,8 @@ RUN echo "startup --batch" >>/etc/bazel.bazelrc # https://github.com/bazelbuild/bazel/issues/418 RUN echo "build --spawn_strategy=standalone --genrule_strategy=standalone" \ >>/etc/bazel.bazelrc -# Install a recent bazel release. -ENV BAZEL_VERSION 0.11.1 +# Need >= 0.15.0 so bazel compiles work with docker bind mounts. +ENV BAZEL_VERSION 0.15.0 WORKDIR / RUN mkdir /bazel && \ cd /bazel && \ @@ -114,7 +114,8 @@ ENV LD_LIBRARY_PATH=/usr/local/cuda/lib64/stubs:${LD_LIBRARY_PATH} # Download TF Serving sources (optionally at specific commit). WORKDIR /tensorflow-serving -RUN git clone --depth=1 --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tensorflow/serving . +RUN git clone --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tensorflow/serving . +RUN git remote add upstream https://github.com/tensorflow/serving.git RUN if [ "${TF_SERVING_VERSION_GIT_COMMIT}" != "head" ]; then git checkout ${TF_SERVING_VERSION_GIT_COMMIT} ; fi # Build, and install TensorFlow Serving diff --git a/tools/bazel_in_docker.sh b/tools/bazel_in_docker.sh new file mode 100755 index 00000000000..a7991f3ff78 --- /dev/null +++ b/tools/bazel_in_docker.sh @@ -0,0 +1,81 @@ +#!/bin/bash +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +# +# Script to run bazel and do builds in a docker container. +# +# Useful to do builds in a hermetic (docker) environment. The script sets +# up the correct user/group names and docker bind mounts to allow build +# a source tree. +# +# Typical usage (to build from lastest upstream source): +# $ git clone https://github.com/tensorflow/serving.git +# $ cd serving +# $ bazel_in_docker.sh bazel build -c opt tensorflow_serving/model_servers:tensorflow_model_server +# + +set -e + +function usage() { + local progname=$(basename $0) + echo "Usage:" + echo " ${progname} [-d ] [args ...]" + echo "" + echo "Examples:" + echo " ${progname} bazel build -c opt tensorflow_serving/model_servers:tensorflow_model_server" + echo " ${progname} bazel test tensorflow_serving/..." + echo " ${progname} -d tensorflow/serving:latest-devel bazel version" + exit 1 +} + +function get_switch_user_cmd() { + local uid=$(id -u) + local gid=$(id -g) + local username=$(id -n -u) + local groupname=$(id -n -g) + local cmdline="groupadd -f ${groupname} && groupmod -o -g ${gid} ${groupname}" + cmdline+="; id -u ${username} &>/dev/null || useradd ${username} && usermod -o -u ${uid} -g ${gid} ${username}" + cmdline+="; chroot --userspec=${username} / " + echo "${cmdline}" +} + +function get_bazel_cmd() { + echo "cd $(pwd); TEST_TMPDIR=.cache" +} + +(( $# < 1 )) && usage +[[ "$1" = "-"* ]] && [[ "$1" != "-d" ]] && usage + +IMAGE="tensorflow/serving:nightly-devel" +[[ "$1" = "-d" ]] && IMAGE=$2 && shift 2 || true +[[ "${IMAGE}" = "" ]] && usage + +RUN_OPTS=(--rm -it) +if [[ "$1" = "bazel" ]]; then + CMD="sh -c '$(get_bazel_cmd) $@'" + RUN_OPTS+=("-v $(pwd):$(pwd)") +else + CMD="$@" +fi +[[ "${CMD}" = "" ]] && usage +[[ ! -x $(command -v docker) ]] && echo "ERROR: 'docker' command missing from PATH." && usage + +echo "== Pulling docker image: ${IMAGE}" +if ! docker pull ${IMAGE} ; then + echo "WARNING: Failed to docker pull image ${IMAGE}" +fi + +echo "== Running cmd: ${CMD}" +docker run ${RUN_OPTS[@]} ${IMAGE} bash -c "$(get_switch_user_cmd) ${CMD}" From 3fdc9d312c1ab5a62d1ceacdfc435a6789582be6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 13 Jul 2018 12:03:08 -0700 Subject: [PATCH 0217/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204507267 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e25589f8416..994dec617c3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eeb2fb68811ae83050667eef8309d30f9514a0a4abd29ed88bcee340b659eba1", - git_commit = "feba399acb6f3c89ed5cd2602c454c179fcb792b", + sha256 = "0f86e8248e41535beaddf15b25704a905fabb3a574a5ffb33c12ca682cd70bf8", + git_commit = "b5b5cc0e248b6fbd5025765f592a43af158a1cb2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 01ea36b337073ed3e6949d078c7e742373321d70 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Fri, 13 Jul 2018 12:12:37 -0700 Subject: [PATCH 0218/8103] Minor documentation updates and fix docker gpu build Fixes #987 PiperOrigin-RevId: 204508857 --- tensorflow_serving/g3doc/docker.md | 19 ++++++++++++------- .../tools/docker/Dockerfile.devel-gpu | 8 ++++---- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/tensorflow_serving/g3doc/docker.md b/tensorflow_serving/g3doc/docker.md index 46a8b7bfdb2..a3209582f94 100644 --- a/tensorflow_serving/g3doc/docker.md +++ b/tensorflow_serving/g3doc/docker.md @@ -6,12 +6,14 @@ One of the easiest ways to get started using TensorFlow Serving is via ## Installing Docker General installation instructions are -[on the Docker site](https://docs.docker.com/installation/), but we give some -quick links here: +[on the Docker site](https://docs.docker.com/install/), but we give some quick +links here: -* [OSX](https://docs.docker.com/installation/mac/): [docker - toolbox](https://www.docker.com/toolbox) -* [Ubuntu](https://docs.docker.com/installation/ubuntulinux/) +* [Docker for macOS](https://docs.docker.com/docker-for-mac/install/) +* [Docker for Windows](https://docs.docker.com/docker-for-windows/install/) + for Windows 10 Pro or later +* [Docker Toolbox](https://docs.docker.com/toolbox/) for much older versions + of macOS, or versions of Windows before Windows 10 Pro ## Serving with Docker @@ -65,6 +67,9 @@ To query the model using the predict API, you can run curl -d '{"instances": [1.0, 2.0, 5.0]}' -X POST http://localhost:8501/v1/models/half_plus_three:predict ``` +NOTE: Older versions of Windows and other systems without curl can download it +[here](https://curl.haxx.se/download.html). + This should return a set of values: ```json @@ -184,5 +189,5 @@ To run the container opening the gRPC port (8500): docker run -it -p 8500:8500 $USER/tensorflow-serving-devel ``` -From here, you can follow the instructions for [testing a devlopment -environment](#testing-the-development-environment). +From here, you can follow the instructions for +[testing a development environment](#testing-the-development-environment). diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 7927077a2b6..c269bd4f56d 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -109,9 +109,6 @@ RUN mkdir -p ${NCCL_INSTALL_PATH} && \ ln -s /usr/lib/x86_64-linux-gnu/libnccl.so.2 ${NCCL_INSTALL_PATH}lib/libnccl.so.2 && \ ln -s /usr/lib/x86_64-linux-gnu/libnccl.so.$TF_NCCL_VERSION ${NCCL_INSTALL_PATH}lib/libnccl.so.$TF_NCCL_VERSION -RUN ln -s /usr/local/cuda/lib64/stubs/libcuda.so /usr/local/cuda/lib64/stubs/libcuda.so.1 -ENV LD_LIBRARY_PATH=/usr/local/cuda/lib64/stubs:${LD_LIBRARY_PATH} - # Download TF Serving sources (optionally at specific commit). WORKDIR /tensorflow-serving RUN git clone --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tensorflow/serving . @@ -120,11 +117,14 @@ RUN if [ "${TF_SERVING_VERSION_GIT_COMMIT}" != "head" ]; then git checkout ${TF_ # Build, and install TensorFlow Serving ARG TF_SERVING_BUILD_OPTIONS="--copt=-mavx --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0 --verbose_failures" -RUN bazel build -c opt --color=yes --curses=yes --config=cuda \ +RUN ln -s /usr/local/cuda/lib64/stubs/libcuda.so /usr/local/cuda/lib64/stubs/libcuda.so.1 && \ + LD_LIBRARY_PATH=/usr/local/cuda/lib64/stubs:${LD_LIBRARY_PATH} \ + bazel build -c opt --color=yes --curses=yes --config=cuda \ --output_filter=DONT_MATCH_ANYTHING \ ${TF_SERVING_BUILD_OPTIONS} \ tensorflow_serving/model_servers:tensorflow_model_server && \ cp bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server /usr/local/bin/ && \ + rm /usr/local/cuda/lib64/stubs/libcuda.so.1 && \ bazel clean --expunge --color=yes # Clean up Bazel cache when done. From b616ec6b04404c06e7008d6eb51572a39feddbb1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 13 Jul 2018 13:02:07 -0700 Subject: [PATCH 0219/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204515394 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 994dec617c3..9043f38afb9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0f86e8248e41535beaddf15b25704a905fabb3a574a5ffb33c12ca682cd70bf8", - git_commit = "b5b5cc0e248b6fbd5025765f592a43af158a1cb2", + sha256 = "bf68e3f0305dbda0c987812e70dd74605e937ef4389a4b1d1fd9a182daca3ce5", + git_commit = "284666848ed9abe59dd3e25d4128e54ed1570532", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From acf0fb79d1606cbc44c4667c4a1a2db6e2ef3c1b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 13 Jul 2018 14:01:44 -0700 Subject: [PATCH 0220/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204524617 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9043f38afb9..aa7052f1d64 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bf68e3f0305dbda0c987812e70dd74605e937ef4389a4b1d1fd9a182daca3ce5", - git_commit = "284666848ed9abe59dd3e25d4128e54ed1570532", + sha256 = "bd3ee35e9c8cd7bf5fc61c225c9c72c97ffbfb0851cc030d5dcd21107a3975c4", + git_commit = "4277f432f0a677d2b73f7640e34abdca7b261b82", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 72edc451d4166b4e3e022b1e242046e2bfdd8c4c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 13 Jul 2018 15:01:00 -0700 Subject: [PATCH 0221/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204534052 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index aa7052f1d64..f17879d0c12 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bd3ee35e9c8cd7bf5fc61c225c9c72c97ffbfb0851cc030d5dcd21107a3975c4", - git_commit = "4277f432f0a677d2b73f7640e34abdca7b261b82", + sha256 = "6560900da86d42ef9de5fde0d54ad15e3223a31d112409071756341e3b25edd8", + git_commit = "4a00a658050e105fca6304f4e73d15b383f472c7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6ff5d9f80ef4ae7b69af2e114fed969c163d6c47 Mon Sep 17 00:00:00 2001 From: awk Date: Fri, 13 Jul 2018 15:14:26 -0700 Subject: [PATCH 0222/8103] Fix erroneous formatting of numbers that are larger than 6 digits. Such numbers are converted to scientific notation (by StrCat()). The code suffixed such numbers with '.0' yielding invalid numbers. As an example before this fix, 9000000 would get string converted (incorrectly) to 9e+06.0 instead of 9e+06 -- the latter is correct. Similarly .00003 gets converted incorrectly to 3e-5.0 instead of 3e-5 Fixes https://github.com/tensorflow/serving/issues/989 PiperOrigin-RevId: 204536301 --- tensorflow_serving/util/json_tensor.cc | 16 ++++++++----- tensorflow_serving/util/json_tensor_test.cc | 26 +++++++++++++++++++++ 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/tensorflow_serving/util/json_tensor.cc b/tensorflow_serving/util/json_tensor.cc index 4e5b824c0b7..f62f9621f0d 100644 --- a/tensorflow_serving/util/json_tensor.cc +++ b/tensorflow_serving/util/json_tensor.cc @@ -700,12 +700,16 @@ bool WriteDecimal(RapidJsonWriter* writer, dtype val) { string decimal_str; if (std::isfinite(val)) { decimal_str = absl::StrCat(val); - // Add trailing '.0' for whole numbers. StrCat() formats whole numbers - // without one. This can lead to lists containing mix of decimal and - // whole numbers -- making it difficult for consumers to pick the - // correct type to store these numbers (note, JSON does not have - // metadata to describe types. These are inferred from the tokens). - if (decimal_str.find('.') == string::npos) { + // Add trailing '.0' for whole numbers and those not in scientific notation. + // StrCat() formats numbers in six-digit (printf "%g"), numbers like 9000000 + // and .00003 get written as 9e+06 and 3e-05 (scientific notation). + // + // Not adding '.0' can lead to lists containing mix of decimal and whole + // numbers -- making it difficult for consumers to pick the correct type to + // store these numbers (note, JSON does not have metadata to describe types. + // These are inferred from the tokens). + if (decimal_str.find('.') == string::npos && + decimal_str.find('e') == string::npos) { absl::StrAppend(&decimal_str, ".0"); } } else if (std::isnan(val)) { diff --git a/tensorflow_serving/util/json_tensor_test.cc b/tensorflow_serving/util/json_tensor_test.cc index 68e64a56922..16136d808da 100644 --- a/tensorflow_serving/util/json_tensor_test.cc +++ b/tensorflow_serving/util/json_tensor_test.cc @@ -546,6 +546,32 @@ TEST(JsontensorTest, FromJsonSingleBytesTensor) { ]})")); } +// Tests StrCat() six-digit precision float output is correctly +// represented in the final (output) JSON string. +TEST(JsontensorTest, FromJsonSingleFloatTensorSixDigitPrecision) { + TensorMap tensormap; + ASSERT_TRUE(TextFormat::ParseFromString(R"( + dtype: DT_FLOAT + tensor_shape { + dim { size: 2 } + dim { size: 2 } + } + float_val: 9000000 + float_val: 999999 + float_val: .0003 + float_val: .00003 + )", + &tensormap["float_tensor"])); + + string json; + TF_EXPECT_OK(MakeJsonFromTensors(tensormap, &json)); + TF_EXPECT_OK(CompareJsonAllValuesAsStrings(json, R"({ + "predictions": [ + [9e+06, 999999.0], + [0.0003, 3e-05] + ]})")); +} + TEST(JsontensorTest, FromJsonSingleFloatTensorNonFinite) { TensorMap tensormap; ASSERT_TRUE(TextFormat::ParseFromString(R"( From 992ce67656062d77e6f48dedec58b8c0f3bf0457 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 13 Jul 2018 16:03:39 -0700 Subject: [PATCH 0223/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204542996 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f17879d0c12..951c2e8ae24 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6560900da86d42ef9de5fde0d54ad15e3223a31d112409071756341e3b25edd8", - git_commit = "4a00a658050e105fca6304f4e73d15b383f472c7", + sha256 = "3e46b6856ee4ceee562f9794940314ab1b8f19e6d0d3371c13eae6e42f4fa299", + git_commit = "46955b5704964c076caf9ac05221793d07cb95f8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 38614d1c51611ad5b39d9a000c8ce52471e11809 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 13 Jul 2018 17:02:56 -0700 Subject: [PATCH 0224/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204550599 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 951c2e8ae24..ec4cdbf5a8d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3e46b6856ee4ceee562f9794940314ab1b8f19e6d0d3371c13eae6e42f4fa299", - git_commit = "46955b5704964c076caf9ac05221793d07cb95f8", + sha256 = "db8a806f8416430b3cbf32b7be1dfc3668c6e287b98900e033f6e318f1db5db2", + git_commit = "88a87310753f3d73c926fd9162cc871ec0a4440e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c96165bc4596cc742d4f4c46fcbfce7b2b8b632d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 13 Jul 2018 18:01:19 -0700 Subject: [PATCH 0225/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204556054 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ec4cdbf5a8d..c3ec862fa90 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "db8a806f8416430b3cbf32b7be1dfc3668c6e287b98900e033f6e318f1db5db2", - git_commit = "88a87310753f3d73c926fd9162cc871ec0a4440e", + sha256 = "ab48bda3707e682756e74655a9d70eee497829e9d1cd6177c523f2d2451b04ac", + git_commit = "9b792c16ebdf6837e70b570a9a30e4dcb394f237", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a36397635a451686cb385cbd3c145a1f082f7555 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 13 Jul 2018 19:01:37 -0700 Subject: [PATCH 0226/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204560071 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c3ec862fa90..f08b74f0aa7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ab48bda3707e682756e74655a9d70eee497829e9d1cd6177c523f2d2451b04ac", - git_commit = "9b792c16ebdf6837e70b570a9a30e4dcb394f237", + sha256 = "c3e53b656d53d9747e44e8573b68224976d237b85901c3be9bcac8dc1a02b160", + git_commit = "4424e3270e4056ef7318fbdd83727cb93bec6858", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0471a27e65b786ac9f0bb3a9882dfba7f82c61c5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 13 Jul 2018 20:01:04 -0700 Subject: [PATCH 0227/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204563105 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f08b74f0aa7..888b110a566 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c3e53b656d53d9747e44e8573b68224976d237b85901c3be9bcac8dc1a02b160", - git_commit = "4424e3270e4056ef7318fbdd83727cb93bec6858", + sha256 = "9286193ab884140e8e4c1f0ec9e0e22173461eee8bd993222799ce836f82104a", + git_commit = "a25dbac5ee56e03f4b475c443aa58cf2f7160f52", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9af806ff831b05e158f2789b6ce2d2e87468e20a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 13 Jul 2018 21:01:38 -0700 Subject: [PATCH 0228/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204566639 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 888b110a566..24ad9befc05 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9286193ab884140e8e4c1f0ec9e0e22173461eee8bd993222799ce836f82104a", - git_commit = "a25dbac5ee56e03f4b475c443aa58cf2f7160f52", + sha256 = "6061251b8efa8cd0e2b1dd8e8a0e9e9ff20798406faeaa4454b20d7f7fbb3cd0", + git_commit = "274cce5990ff279e2ce293ae9ce1c1d0445d3242", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b29519fe0a6a1108db92b885c50c263ebace160b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 13 Jul 2018 22:01:20 -0700 Subject: [PATCH 0229/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204569433 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 24ad9befc05..96805b14673 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6061251b8efa8cd0e2b1dd8e8a0e9e9ff20798406faeaa4454b20d7f7fbb3cd0", - git_commit = "274cce5990ff279e2ce293ae9ce1c1d0445d3242", + sha256 = "367fb3feff5ae24bc7ae40d2dcc321936268a64cac06274987b267c5f684cb28", + git_commit = "88b656acd480f6956894e3bb8c8f0c52fe033bc4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 124b09bf06c2b174ae875b64d50daf6a4dd6b57b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 14 Jul 2018 01:02:10 -0700 Subject: [PATCH 0230/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204577610 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 96805b14673..504c5bb6745 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "367fb3feff5ae24bc7ae40d2dcc321936268a64cac06274987b267c5f684cb28", - git_commit = "88b656acd480f6956894e3bb8c8f0c52fe033bc4", + sha256 = "2efb94654ea42ff9d4b8b00e98aa60295e4cf2a9df58a1998e87708b4f8e869a", + git_commit = "8aa4179ffae2d0a3724a70bea32ce35e2d88751a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f24347244e5f425bc5e27f48b03db650f1062b24 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 14 Jul 2018 02:01:22 -0700 Subject: [PATCH 0231/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204580636 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 504c5bb6745..76cdcadfd85 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2efb94654ea42ff9d4b8b00e98aa60295e4cf2a9df58a1998e87708b4f8e869a", - git_commit = "8aa4179ffae2d0a3724a70bea32ce35e2d88751a", + sha256 = "9dd5135a3d781baf2067221a1937965b6868466b4d8fdac0724044503da885ed", + git_commit = "e21702f871fe849b09e726f9d42eff0e6d5a44d8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From cb9eb3e11f813933a61181fdf34a398e7c53409b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 14 Jul 2018 03:01:59 -0700 Subject: [PATCH 0232/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204583303 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 76cdcadfd85..39e317fbaea 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9dd5135a3d781baf2067221a1937965b6868466b4d8fdac0724044503da885ed", - git_commit = "e21702f871fe849b09e726f9d42eff0e6d5a44d8", + sha256 = "7643e5c488010a356698c193ac7adf91cb17c46521f0f2284bf84ba35995ec8d", + git_commit = "ee9a16b2032c8cb96180b0e81fbae3076b54a883", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6695885b7a599d688dac8e62fa6759dc9c37fc26 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 14 Jul 2018 10:01:38 -0700 Subject: [PATCH 0233/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204599291 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 39e317fbaea..a260f8e8ee5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7643e5c488010a356698c193ac7adf91cb17c46521f0f2284bf84ba35995ec8d", - git_commit = "ee9a16b2032c8cb96180b0e81fbae3076b54a883", + sha256 = "193bd699889b5b512458e7e16585b38dd1fa6e18f10a6813bc9168d4dcd37ff3", + git_commit = "85aae3795775bf648d2e8baa56331f952d12e3e0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 148719d27a44cac0e2d443dfd3d8e562e4577ed7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 14 Jul 2018 14:01:38 -0700 Subject: [PATCH 0234/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204608412 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a260f8e8ee5..bd0bdcbe4e9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "193bd699889b5b512458e7e16585b38dd1fa6e18f10a6813bc9168d4dcd37ff3", - git_commit = "85aae3795775bf648d2e8baa56331f952d12e3e0", + sha256 = "d83615646d18e7debc7408d55c60053c04f37f115d1ff641b2b1279bfefdf434", + git_commit = "fe7d1d9447a31562acb26aad7a9ffca60686c38a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ba2a1018d191768ce6279861b852ff8ab2ebb30b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 15 Jul 2018 12:02:06 -0700 Subject: [PATCH 0235/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204660790 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bd0bdcbe4e9..b259ea209f0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d83615646d18e7debc7408d55c60053c04f37f115d1ff641b2b1279bfefdf434", - git_commit = "fe7d1d9447a31562acb26aad7a9ffca60686c38a", + sha256 = "90ce4564f77e9a351d1ba2e480ac1a91b8dafe1f5f837c7e644eaa8e8696fdb8", + git_commit = "e6ce9ea5a156873c5b927e99d8935e32122538b9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 69e0e6bfa299ac8851578b2899f73d6b3c350142 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 15 Jul 2018 14:01:55 -0700 Subject: [PATCH 0236/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204665334 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b259ea209f0..d62e8e79031 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "90ce4564f77e9a351d1ba2e480ac1a91b8dafe1f5f837c7e644eaa8e8696fdb8", - git_commit = "e6ce9ea5a156873c5b927e99d8935e32122538b9", + sha256 = "33a8c756df3098ef8b02291086a54f7a39233918204b54ef86c392fa5b25bf08", + git_commit = "e5945c00148186808e337b4946cf0fa6460f6803", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b13a399081b5cec0196478f709adb926d64ce178 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 15 Jul 2018 17:02:16 -0700 Subject: [PATCH 0237/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204672252 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d62e8e79031..d5166f3ec04 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "33a8c756df3098ef8b02291086a54f7a39233918204b54ef86c392fa5b25bf08", - git_commit = "e5945c00148186808e337b4946cf0fa6460f6803", + sha256 = "046e133bf62e3a4dcf3397e4d8ca563f2908613182a740ef7f546504a531bf8a", + git_commit = "6c3c766dcabff3b5fa41dbfd491c9e8062a77b07", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5c7aab9d4b862d4356cd1542a8e21bc99a5726a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=BE=A4?= Date: Mon, 16 Jul 2018 09:34:29 +0800 Subject: [PATCH 0238/8103] Add support for Python 3 while also compatible with Python 2.7 Since Python 3 has dropped `xrange()`, we should always use `range()` in the future. Signed-off-by: Liu Qun --- tensorflow_serving/example/mnist_saved_model.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/example/mnist_saved_model.py b/tensorflow_serving/example/mnist_saved_model.py index 579410e14c1..47be32ea1f6 100644 --- a/tensorflow_serving/example/mnist_saved_model.py +++ b/tensorflow_serving/example/mnist_saved_model.py @@ -13,7 +13,7 @@ # limitations under the License. # ============================================================================== -#!/usr/bin/env python2.7 +#!/usr/bin/env python r"""Train and export a simple Softmax Regression TensorFlow model. The model is from the TensorFlow "MNIST For ML Beginner" tutorial. This program @@ -72,7 +72,7 @@ def main(_): train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy) values, indices = tf.nn.top_k(y, 10) table = tf.contrib.lookup.index_to_string_table_from_tensor( - tf.constant([str(i) for i in xrange(10)])) + tf.constant([str(i) for i in range(10)])) prediction_classes = table.lookup(tf.to_int64(indices)) for _ in range(FLAGS.training_iteration): batch = mnist.train.next_batch(50) From 6657a5ad366df2ddc9588b6fb43453bb5b78a796 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 15 Jul 2018 21:01:58 -0700 Subject: [PATCH 0239/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204684156 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d5166f3ec04..a370425b950 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "046e133bf62e3a4dcf3397e4d8ca563f2908613182a740ef7f546504a531bf8a", - git_commit = "6c3c766dcabff3b5fa41dbfd491c9e8062a77b07", + sha256 = "5c66e2d6c81d1798d1d3607caf3e89c5c4aeabec607f0c9b4eaeb70501c48b42", + git_commit = "eadcdf91aa9e8ba6a196791ee349fd3474ffab76", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e073e55060dd8189ff4b08fb3ad5e9a9dd15260f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 16 Jul 2018 04:00:57 -0700 Subject: [PATCH 0240/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204717363 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a370425b950..6292554d550 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5c66e2d6c81d1798d1d3607caf3e89c5c4aeabec607f0c9b4eaeb70501c48b42", - git_commit = "eadcdf91aa9e8ba6a196791ee349fd3474ffab76", + sha256 = "d7da842e96ef2feb353d6036c1cadf8b495023184c26d764da4ccbe1852319b9", + git_commit = "5f173dbf165991306f9327ee2499dc4321c40e94", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4f3e15ab3e3d43ea764102c0535b160f3b517563 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 16 Jul 2018 07:01:17 -0700 Subject: [PATCH 0241/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204735778 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6292554d550..2fab99a588b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d7da842e96ef2feb353d6036c1cadf8b495023184c26d764da4ccbe1852319b9", - git_commit = "5f173dbf165991306f9327ee2499dc4321c40e94", + sha256 = "c1ea4901928e1b8281719f32d6083423c52c3b0f0e090c7cc396ef77991e4277", + git_commit = "5c6d6eb67c76c33022908c447033c5e7f9b4f10e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4eb87fea11e09681177d2cc3bcd1903035478263 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 16 Jul 2018 08:01:27 -0700 Subject: [PATCH 0242/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204742276 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2fab99a588b..8c6d05131bd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c1ea4901928e1b8281719f32d6083423c52c3b0f0e090c7cc396ef77991e4277", - git_commit = "5c6d6eb67c76c33022908c447033c5e7f9b4f10e", + sha256 = "cf154564c40bab942438a284a12d8f37c271bce64c03d70e214e8f58dcfb4287", + git_commit = "d4f5f85e677b9efe0397c92a64b4d114d03e3a36", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fa4e00e09400f7f21f628d9ab8680173b0f82dff Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 16 Jul 2018 09:01:57 -0700 Subject: [PATCH 0243/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204750264 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8c6d05131bd..11f7fe47f41 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cf154564c40bab942438a284a12d8f37c271bce64c03d70e214e8f58dcfb4287", - git_commit = "d4f5f85e677b9efe0397c92a64b4d114d03e3a36", + sha256 = "6e32cbf3b765c49d635797f6993e11ee48711a12af45272284327f1e9789e36f", + git_commit = "e3aa44ec207bfdc798e26e92a38e80c3f9c5453b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f58fc3455f2db31a8eed80784f833499868985e3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 16 Jul 2018 10:00:56 -0700 Subject: [PATCH 0244/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204759467 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 11f7fe47f41..bfeca4adc06 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6e32cbf3b765c49d635797f6993e11ee48711a12af45272284327f1e9789e36f", - git_commit = "e3aa44ec207bfdc798e26e92a38e80c3f9c5453b", + sha256 = "d744f69e493cd81efad77fbffd6efe9c91fe641114ad8767b0528670d3d2ede7", + git_commit = "74fce066580ca286b2c776a64ab624f12a473b28", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 42c9dd3e8a7f5d0fe88a029ea8afb976f7df6742 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 16 Jul 2018 11:01:21 -0700 Subject: [PATCH 0245/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204770488 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bfeca4adc06..28df2b9d07c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d744f69e493cd81efad77fbffd6efe9c91fe641114ad8767b0528670d3d2ede7", - git_commit = "74fce066580ca286b2c776a64ab624f12a473b28", + sha256 = "69eaa59dfaf33c307a13f27bdab14bcea718f5f6e3d63ca445aa76de93f2eaa1", + git_commit = "c067242a12b8a0cc0cc9996e2a3e1eed7de4f53b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3e9fb78327ed8cc76050661681da030e5504ad59 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 16 Jul 2018 12:01:47 -0700 Subject: [PATCH 0246/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204781691 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 28df2b9d07c..235f66c2b97 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "69eaa59dfaf33c307a13f27bdab14bcea718f5f6e3d63ca445aa76de93f2eaa1", - git_commit = "c067242a12b8a0cc0cc9996e2a3e1eed7de4f53b", + sha256 = "6c48f04661a5793c2912640218c812bfcdb1bff7b59eb9810c74dd5a1387ca67", + git_commit = "374c5c6739f9487bf6006d046a3b5ad90c4f2d37", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a6adc4b2fab55a6f86f6ff1b2524c966b0d3bb1c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 16 Jul 2018 13:01:19 -0700 Subject: [PATCH 0247/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204791652 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 235f66c2b97..107490aba63 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6c48f04661a5793c2912640218c812bfcdb1bff7b59eb9810c74dd5a1387ca67", - git_commit = "374c5c6739f9487bf6006d046a3b5ad90c4f2d37", + sha256 = "a5e122cede34bd56f546de13fea61143f96d918ea3b10db0606416fbb5e022be", + git_commit = "814f9ccd9b34a828f93d33eee6265e0cac07095a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1fe25b20f5709e513460958d69b45ff9bfcb2daf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 16 Jul 2018 14:00:59 -0700 Subject: [PATCH 0248/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204802829 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 107490aba63..557a513ac09 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a5e122cede34bd56f546de13fea61143f96d918ea3b10db0606416fbb5e022be", - git_commit = "814f9ccd9b34a828f93d33eee6265e0cac07095a", + sha256 = "cee8a4098f57b4449ba9e4f583eac6e97bb656ef6c202986c70a4923f739af64", + git_commit = "f5a7bea2b78c8a8b4b76060978369c3436b60b55", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1df0f10596991e0ae8076417c73eac931c01a56d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 16 Jul 2018 15:04:31 -0700 Subject: [PATCH 0249/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204813910 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 557a513ac09..2b3f89310b0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cee8a4098f57b4449ba9e4f583eac6e97bb656ef6c202986c70a4923f739af64", - git_commit = "f5a7bea2b78c8a8b4b76060978369c3436b60b55", + sha256 = "975e51ade2750110a7470586cfb29abae1392567905bb405c6050d0508a50712", + git_commit = "f8f0d7f000349ab573f0d912c37ebc3675cc6154", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7b3f3be5220f9fe33b00ab30a4c00e7b09685f53 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 16 Jul 2018 16:01:25 -0700 Subject: [PATCH 0250/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204823228 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2b3f89310b0..174adfabde7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "975e51ade2750110a7470586cfb29abae1392567905bb405c6050d0508a50712", - git_commit = "f8f0d7f000349ab573f0d912c37ebc3675cc6154", + sha256 = "421ef812055041a9fc2892da976bd915011445265b3a97015ca0fd2a99697b55", + git_commit = "b027ac978f6ed03b634fde2a5ee3fa20d766921e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 468b88c0ded97fe9c72da57c2c921bf63e25c66f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 16 Jul 2018 17:02:03 -0700 Subject: [PATCH 0251/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204832297 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 174adfabde7..e8e953f39b2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "421ef812055041a9fc2892da976bd915011445265b3a97015ca0fd2a99697b55", - git_commit = "b027ac978f6ed03b634fde2a5ee3fa20d766921e", + sha256 = "75ae5bc851de1d526287587020d418657ca383743d4c73b9a80891d5bbc3fcbb", + git_commit = "4310aa0d37c40a1841a321de8dcbb9e87f6ca2b2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From addaa3d19ddedf08074a73e9dfa99ec90c552aaf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 16 Jul 2018 18:00:35 -0700 Subject: [PATCH 0252/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204839726 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e8e953f39b2..34b1e1e28bc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "75ae5bc851de1d526287587020d418657ca383743d4c73b9a80891d5bbc3fcbb", - git_commit = "4310aa0d37c40a1841a321de8dcbb9e87f6ca2b2", + sha256 = "7c376b100ba824010b97a30d038e982fb3b68ff2cc5b20f9ae53a523ec92d4a1", + git_commit = "2c442d26f36a0f167685fd31b9ecdb4e290c2b29", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c8b67473ae8e7b1d38649abf401ff96ff19689cb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 16 Jul 2018 19:00:39 -0700 Subject: [PATCH 0253/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204845220 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 34b1e1e28bc..a3b77e38e11 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7c376b100ba824010b97a30d038e982fb3b68ff2cc5b20f9ae53a523ec92d4a1", - git_commit = "2c442d26f36a0f167685fd31b9ecdb4e290c2b29", + sha256 = "cf181354a871a7bf6b3ad856a6867c543ca64cf6bd7dafc8d787769603e31884", + git_commit = "d8f3425e5b054dff01b5ece80e8c8a101c4ed816", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From af964e1cf7d5d102367575bba526c331e43323b2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 16 Jul 2018 20:00:51 -0700 Subject: [PATCH 0254/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204849493 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a3b77e38e11..7e142e1d966 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cf181354a871a7bf6b3ad856a6867c543ca64cf6bd7dafc8d787769603e31884", - git_commit = "d8f3425e5b054dff01b5ece80e8c8a101c4ed816", + sha256 = "2bc9d853fa043c4d49e4f1b1d2d86c21888e8e030e21390d4cc71beb93f5a7c4", + git_commit = "1a2af489b1087eb22ec76863867e4e397e453e34", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b0a1e88a55172db6ddf99aff1801744cd6d8bb73 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 16 Jul 2018 23:02:12 -0700 Subject: [PATCH 0255/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204862396 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7e142e1d966..7c22416f6d5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2bc9d853fa043c4d49e4f1b1d2d86c21888e8e030e21390d4cc71beb93f5a7c4", - git_commit = "1a2af489b1087eb22ec76863867e4e397e453e34", + sha256 = "610c306a3ef2b67249a2564a997db340ac5d294880cb6eb6cd834c695e7ac655", + git_commit = "a013474eae601ae27c406e6c8da34ef762e8f762", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7b3289e175c0305edc278302079b2038ebb26183 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 17 Jul 2018 00:01:15 -0700 Subject: [PATCH 0256/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204866395 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7c22416f6d5..4aac968b6fe 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "610c306a3ef2b67249a2564a997db340ac5d294880cb6eb6cd834c695e7ac655", - git_commit = "a013474eae601ae27c406e6c8da34ef762e8f762", + sha256 = "52646fb83906f6728f98363ced2da91c20c9b860f8cbb4a9daf50a5d3fed0581", + git_commit = "c091185930eee5a3f87cfbe5e367a3cfc8b717e8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6ad8da6fa677b0816714e7a6dc0562ba797b508f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 17 Jul 2018 06:01:17 -0700 Subject: [PATCH 0257/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204899235 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4aac968b6fe..eb969441337 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "52646fb83906f6728f98363ced2da91c20c9b860f8cbb4a9daf50a5d3fed0581", - git_commit = "c091185930eee5a3f87cfbe5e367a3cfc8b717e8", + sha256 = "b63943c0cb619eecb6ad96a3290b5909bc311e7de4a486ba530a9cb6bf583a6a", + git_commit = "2bdc5f12a1e66fd851e2621889c743c3b8da65e5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1c62a35aa135e9989cf45cebe6932520555c0ef5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 17 Jul 2018 09:01:16 -0700 Subject: [PATCH 0258/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204919245 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index eb969441337..3146c7db06e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b63943c0cb619eecb6ad96a3290b5909bc311e7de4a486ba530a9cb6bf583a6a", - git_commit = "2bdc5f12a1e66fd851e2621889c743c3b8da65e5", + sha256 = "7254eba0ad9830548b3731f4608bef2f1848b6da7d9024ae3ad1df48dffa0681", + git_commit = "d51aff27ac2123fd7093b685be8b0e5200f95029", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b2d57ba243353d7a0d12bcd1635e1ddb0bdf37f1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 17 Jul 2018 10:01:53 -0700 Subject: [PATCH 0259/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204928260 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3146c7db06e..7b3a2d786f2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7254eba0ad9830548b3731f4608bef2f1848b6da7d9024ae3ad1df48dffa0681", - git_commit = "d51aff27ac2123fd7093b685be8b0e5200f95029", + sha256 = "defb46b9710847dc1f93b4a29b65bf568efe3d7d254b6887e4d2b95998b6b3c4", + git_commit = "97b1ef3ee8432d9a3bf664d367377028e95e0e1f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3f7199ed35a1238184cac661000840e41478bc49 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 17 Jul 2018 11:01:05 -0700 Subject: [PATCH 0260/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204938485 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7b3a2d786f2..24d0d07f950 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "defb46b9710847dc1f93b4a29b65bf568efe3d7d254b6887e4d2b95998b6b3c4", - git_commit = "97b1ef3ee8432d9a3bf664d367377028e95e0e1f", + sha256 = "b94283c9871b4a88ed419c00b6708986a8a34d08994928482435dc0334b22ce9", + git_commit = "e6d3562263d4e54764e7321655ea56dddfb1dfd1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 169e79a69880ac1945bdeab2f9b8b5bb1781204b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 17 Jul 2018 12:00:49 -0700 Subject: [PATCH 0261/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204950515 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 24d0d07f950..b580f45be75 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b94283c9871b4a88ed419c00b6708986a8a34d08994928482435dc0334b22ce9", - git_commit = "e6d3562263d4e54764e7321655ea56dddfb1dfd1", + sha256 = "8204c19a4b45ad518af7ce842d89ab3aa79899f1690d9d303c8de281a5a7089c", + git_commit = "6e5a78bb634ce772fe0522693d93642fb203ef54", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2b3d33750176e726fb7d4ee45d8e8b1a1a66e925 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 17 Jul 2018 13:01:36 -0700 Subject: [PATCH 0262/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204960127 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b580f45be75..81750d5116a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8204c19a4b45ad518af7ce842d89ab3aa79899f1690d9d303c8de281a5a7089c", - git_commit = "6e5a78bb634ce772fe0522693d93642fb203ef54", + sha256 = "29abab3005b251d5d9a6c948546c61f1ff09c15d526f34fdc86434d2c7686406", + git_commit = "bc13af4b9f2a76b6424af63da7f88aac4602c0cb", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 63873285feea7eb9191c4ba574af07e63bce9694 Mon Sep 17 00:00:00 2001 From: Derek Hao Hu Date: Tue, 17 Jul 2018 13:36:45 -0700 Subject: [PATCH 0263/8103] Fix an incorrect link to Dockerfile.devel-gpu --- tensorflow_serving/g3doc/docker.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tensorflow_serving/g3doc/docker.md b/tensorflow_serving/g3doc/docker.md index a3209582f94..dc4bc2cd23c 100644 --- a/tensorflow_serving/g3doc/docker.md +++ b/tensorflow_serving/g3doc/docker.md @@ -9,10 +9,10 @@ General installation instructions are [on the Docker site](https://docs.docker.com/install/), but we give some quick links here: -* [Docker for macOS](https://docs.docker.com/docker-for-mac/install/) -* [Docker for Windows](https://docs.docker.com/docker-for-windows/install/) +* [Docker for macOS](https://docs.docker.com/docker-for-mac/install/) +* [Docker for Windows](https://docs.docker.com/docker-for-windows/install/) for Windows 10 Pro or later -* [Docker Toolbox](https://docs.docker.com/toolbox/) for much older versions +* [Docker Toolbox](https://docs.docker.com/toolbox/) for much older versions of macOS, or versions of Windows before Windows 10 Pro ## Serving with Docker @@ -129,14 +129,14 @@ bazel-bin/tensorflow_serving/example/mnist_client --num_tests=1000 --server=loca We currently maintain the following Dockerfiles: -* [`Dockerfile`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile), +* [`Dockerfile`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile), which is a minimal VM with TensorFlow Serving installed. -* [`Dockerfile.devel`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.devel), +* [`Dockerfile.devel`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.devel), which is a minimal VM with all of the dependencies needed to build TensorFlow Serving. -* [`Dockerfile.devel-gpu`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.devel), +* [`Dockerfile.devel-gpu`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.devel-gpu), which is a minimal VM with all of the dependencies needed to build TensorFlow Serving with GPU support. From f97cee5cf4676da3c7108c84cb257be375e781f3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 17 Jul 2018 14:01:51 -0700 Subject: [PATCH 0264/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204970237 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 81750d5116a..68ab8ead14f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "29abab3005b251d5d9a6c948546c61f1ff09c15d526f34fdc86434d2c7686406", - git_commit = "bc13af4b9f2a76b6424af63da7f88aac4602c0cb", + sha256 = "b748b4264f4ff445bcbc2253a155f4b0fed17844b6d73a55ccff8df200721daa", + git_commit = "176ae62c10832459eba5809cc9dab35fd78f67a8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3406d10ba6596f8427e357bc241583a578db510d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 17 Jul 2018 15:01:20 -0700 Subject: [PATCH 0265/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204981045 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 68ab8ead14f..22010d2fbe3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b748b4264f4ff445bcbc2253a155f4b0fed17844b6d73a55ccff8df200721daa", - git_commit = "176ae62c10832459eba5809cc9dab35fd78f67a8", + sha256 = "e4bc5c6ae73889da6c510b1b7c63c7b029e9adb06b177461bca15f2013769abc", + git_commit = "c9fdfab3781bd55cf3d981b98982a1e8122de8d2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a4a9461a11d7bb0706c6a4d1fd605d0d4d087cf2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 17 Jul 2018 16:01:58 -0700 Subject: [PATCH 0266/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 204991249 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 22010d2fbe3..a5f5a591aa6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e4bc5c6ae73889da6c510b1b7c63c7b029e9adb06b177461bca15f2013769abc", - git_commit = "c9fdfab3781bd55cf3d981b98982a1e8122de8d2", + sha256 = "c9621af03502fa23a097c603d0731f60ec5095755318af7f04a0f11a5b97337d", + git_commit = "cba4d6527c5b64eea86de15cf9a78f0ac0c39af9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b16d34129468e30571bb725dd8c9a66cb905f8ea Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 17 Jul 2018 17:03:49 -0700 Subject: [PATCH 0267/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205000821 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a5f5a591aa6..2507f887e91 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c9621af03502fa23a097c603d0731f60ec5095755318af7f04a0f11a5b97337d", - git_commit = "cba4d6527c5b64eea86de15cf9a78f0ac0c39af9", + sha256 = "1b58c7417683c730841c122e362895e6f1b2a8a17b1b24b9cbb08a706e0868bc", + git_commit = "a27d4153ec557ee25411206aab922abb79c0b5cc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b8ee86eaff5a6f04323cbf21a85a00c376e6f00f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 17 Jul 2018 18:03:01 -0700 Subject: [PATCH 0268/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205008258 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2507f887e91..2542bfcc0a4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1b58c7417683c730841c122e362895e6f1b2a8a17b1b24b9cbb08a706e0868bc", - git_commit = "a27d4153ec557ee25411206aab922abb79c0b5cc", + sha256 = "380f176a3ddbec37bba662e57f3d4d9beead0b607f02f73a0be129ed7f01a2ba", + git_commit = "1662a105497e60d002e101161987cbbd48ba06c6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d9d962cf95c725f58a062b3292754cc2e5b0d093 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 17 Jul 2018 19:01:29 -0700 Subject: [PATCH 0269/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205013678 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2542bfcc0a4..3f514efe149 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "380f176a3ddbec37bba662e57f3d4d9beead0b607f02f73a0be129ed7f01a2ba", - git_commit = "1662a105497e60d002e101161987cbbd48ba06c6", + sha256 = "4b161835e775889f78c0c6a6788d547554a55b9dfbd1bc94b90e4d853bced25d", + git_commit = "9ecd9a48843a21ea0afc68ecaed454a31b5d20d5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f5ac65f690c874798d36cf6aad29d0597b8b9e25 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 17 Jul 2018 20:01:40 -0700 Subject: [PATCH 0270/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205017717 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3f514efe149..741f02b058f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4b161835e775889f78c0c6a6788d547554a55b9dfbd1bc94b90e4d853bced25d", - git_commit = "9ecd9a48843a21ea0afc68ecaed454a31b5d20d5", + sha256 = "cbf6b57b05bf42f848329f44366feab271a25f87d936761b3f896382880e6df1", + git_commit = "9c74fa8bdac008beee196a6497a47e65a4ae7577", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d2eb08d749ffa3df3058aa8974d8d8f30ed8a585 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 17 Jul 2018 21:01:56 -0700 Subject: [PATCH 0271/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205022122 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 741f02b058f..fb596eaa8da 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cbf6b57b05bf42f848329f44366feab271a25f87d936761b3f896382880e6df1", - git_commit = "9c74fa8bdac008beee196a6497a47e65a4ae7577", + sha256 = "ae695cfb14ecf6e5b7ced9c21729d55d1ac876e86651d9464f65140988895a46", + git_commit = "527a5eb1759d682810f8155b9767bcc7984d3b3e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e7cce25afd7b2f108385ada2689dea8a698797c3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 17 Jul 2018 22:01:35 -0700 Subject: [PATCH 0272/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205026239 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fb596eaa8da..4f40d6bbeca 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ae695cfb14ecf6e5b7ced9c21729d55d1ac876e86651d9464f65140988895a46", - git_commit = "527a5eb1759d682810f8155b9767bcc7984d3b3e", + sha256 = "fb522eaf67fa65d7328f9c1c0a0ca4de3636bb6a4058c09db926f694c72838b9", + git_commit = "81161f9d9987a8eb70793d95048c20be34292859", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From dde4775b24b998c5c11ba8fa76516fa748bf4f8e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 17 Jul 2018 23:01:42 -0700 Subject: [PATCH 0273/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205029876 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4f40d6bbeca..6306c3afafd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fb522eaf67fa65d7328f9c1c0a0ca4de3636bb6a4058c09db926f694c72838b9", - git_commit = "81161f9d9987a8eb70793d95048c20be34292859", + sha256 = "d1e729b7b8099b6d22ba7146782ddf43b02918898ab449a4e8706bac61277265", + git_commit = "aa15692e54390cf3967d51bc60acf5f783df9c08", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f7c6a0b3bc7a13828e3d0794e3084cb55564403c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 18 Jul 2018 00:02:03 -0700 Subject: [PATCH 0274/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205033706 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6306c3afafd..7beb1d37d03 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d1e729b7b8099b6d22ba7146782ddf43b02918898ab449a4e8706bac61277265", - git_commit = "aa15692e54390cf3967d51bc60acf5f783df9c08", + sha256 = "80244c390ef8af94ddc54b3066b33b5d9b2a5bb6cb0a8cae55477314c5acdec3", + git_commit = "f1de0ddd55dcae6237ea7d21ccddcc6467a6cf8b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5b2a0e298cc00f134a1fcb3c6e7fdd6b498a535f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 18 Jul 2018 01:02:06 -0700 Subject: [PATCH 0275/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205038904 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7beb1d37d03..db19bd90aea 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "80244c390ef8af94ddc54b3066b33b5d9b2a5bb6cb0a8cae55477314c5acdec3", - git_commit = "f1de0ddd55dcae6237ea7d21ccddcc6467a6cf8b", + sha256 = "227085853c4629c679a29f6b0d156650142de2720d68b33f735aaf5ede4e3a60", + git_commit = "5d6aec5318fba138bdf47ff0fbee035dc4d6e04a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 746a7a8b86da7608a9645b9fb5fe1132b35e65ab Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 18 Jul 2018 02:04:15 -0700 Subject: [PATCH 0276/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205044527 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index db19bd90aea..2e3eff37245 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "227085853c4629c679a29f6b0d156650142de2720d68b33f735aaf5ede4e3a60", - git_commit = "5d6aec5318fba138bdf47ff0fbee035dc4d6e04a", + sha256 = "85fabc8d48d0b76812843ce467f1817072075acab039c4216c18417823199f7c", + git_commit = "3a576d3a2847cce68c4c4565f8a1124d7421ca3e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fb7c5defe70a5f454809dc46a947fd470294b67d Mon Sep 17 00:00:00 2001 From: ynqa Date: Wed, 18 Jul 2018 09:40:37 +0900 Subject: [PATCH 0277/8103] Add util for get model status --- tensorflow_serving/tools/pip_package/BUILD | 1 + .../tools/pip_package/build_pip_package.sh | 13 +++++++++++++ tensorflow_serving/tools/pip_package/setup.py | 1 + 3 files changed, 15 insertions(+) diff --git a/tensorflow_serving/tools/pip_package/BUILD b/tensorflow_serving/tools/pip_package/BUILD index 50bc4363437..df4cbe6ea7e 100644 --- a/tensorflow_serving/tools/pip_package/BUILD +++ b/tensorflow_serving/tools/pip_package/BUILD @@ -22,5 +22,6 @@ sh_binary( "//tensorflow_serving/apis:predict_proto_py_pb2", "//tensorflow_serving/apis:regression_proto_py_pb2", "//tensorflow_serving/apis:session_service_proto_py_pb2", + "//tensorflow_serving/util:status_proto_py_pb2", ], ) diff --git a/tensorflow_serving/tools/pip_package/build_pip_package.sh b/tensorflow_serving/tools/pip_package/build_pip_package.sh index b1307d77779..e7cc489b046 100755 --- a/tensorflow_serving/tools/pip_package/build_pip_package.sh +++ b/tensorflow_serving/tools/pip_package/build_pip_package.sh @@ -34,6 +34,8 @@ function main() { echo $(date) : "=== Using tmpdir: ${TMPDIR}" mkdir -p ${TMPDIR}/tensorflow_serving/apis + mkdir -p ${TMPDIR}/tensorflow_serving/util + mkdir -p ${TMPDIR}/tensorflow/core/lib/core echo "Adding python files" cp bazel-genfiles/tensorflow_serving/apis/*_pb2.py \ @@ -44,9 +46,20 @@ function main() { cp bazel-serving/tensorflow_serving/apis/*_grpc.py \ "${TMPDIR}/tensorflow_serving/apis" + + cp bazel-genfiles/tensorflow_serving/util/*_pb2.py \ + "${TMPDIR}/tensorflow_serving/util" + + cp bazel-genfiles/external/org_tensorflow/tensorflow/core/lib/core/*.py \ + "${TMPDIR}/tensorflow/core/lib/core" touch "${TMPDIR}/tensorflow_serving/apis/__init__.py" + touch "${TMPDIR}/tensorflow_serving/util/__init__.py" touch "${TMPDIR}/tensorflow_serving/__init__.py" + touch "${TMPDIR}/tensorflow/__init__.py" + touch "${TMPDIR}/tensorflow/core/__init__.py" + touch "${TMPDIR}/tensorflow/core/lib/__init__.py" + touch "${TMPDIR}/tensorflow/core/lib/core/__init__.py" echo "Adding package setup files" cp ${PIP_SRC_DIR}/setup.py "${TMPDIR}" diff --git a/tensorflow_serving/tools/pip_package/setup.py b/tensorflow_serving/tools/pip_package/setup.py index 78fff31b683..051ea45bdcc 100644 --- a/tensorflow_serving/tools/pip_package/setup.py +++ b/tensorflow_serving/tools/pip_package/setup.py @@ -34,6 +34,7 @@ REQUIRED_PACKAGES = [ 'tensorflow>=1.2.0,<2', 'grpcio>=1.0<2', + 'protobuf==3.6.0', ] setup( From 69064521b072ae38079ad398eade6d8323bc7486 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 18 Jul 2018 04:00:54 -0700 Subject: [PATCH 0278/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205056841 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2e3eff37245..018aae44624 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "85fabc8d48d0b76812843ce467f1817072075acab039c4216c18417823199f7c", - git_commit = "3a576d3a2847cce68c4c4565f8a1124d7421ca3e", + sha256 = "20be7c9f382646b04ab33a769aa0d01e8faf6656ffd3f9634ff9375f3c0b6c79", + git_commit = "ff791a7fde3605493bef70de8a9c9779541daf66", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8b844700e5252ed1fda78fc02da183270969d69d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 18 Jul 2018 08:01:47 -0700 Subject: [PATCH 0279/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205078856 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 018aae44624..6941f310ccc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "20be7c9f382646b04ab33a769aa0d01e8faf6656ffd3f9634ff9375f3c0b6c79", - git_commit = "ff791a7fde3605493bef70de8a9c9779541daf66", + sha256 = "198028de6530055c9619ac30997bcefd4c729d015b5ac180ce56f03711c98cc2", + git_commit = "a46c9ab4419402182c34404f0f57c1f7b6b51858", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 38225956f678a198835f111f5e9122e66716fe11 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 18 Jul 2018 09:02:03 -0700 Subject: [PATCH 0280/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205086207 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6941f310ccc..9b09b5f05c4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "198028de6530055c9619ac30997bcefd4c729d015b5ac180ce56f03711c98cc2", - git_commit = "a46c9ab4419402182c34404f0f57c1f7b6b51858", + sha256 = "18b59bff4e72863e0aca5081f7799c6f5594332bca31f7dd80b01b06e4630a90", + git_commit = "9b3a29889f6533b2f3c8cba6eba9e2d653712750", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9ab6ad8e5cda4dce9d83b7dfc8717a9b6f575fd6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 18 Jul 2018 10:01:59 -0700 Subject: [PATCH 0281/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205094261 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9b09b5f05c4..6a7280360e1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "18b59bff4e72863e0aca5081f7799c6f5594332bca31f7dd80b01b06e4630a90", - git_commit = "9b3a29889f6533b2f3c8cba6eba9e2d653712750", + sha256 = "b07d74581b7b4b065902a03cc736e6ee4cd9d116ec91d0c1fc60e8c6cd494a9b", + git_commit = "b78e0da14d29d7e9d3b51a7b633c960baacd710c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5b78ebf5ecb123574d7414822088ce5998b6b0f8 Mon Sep 17 00:00:00 2001 From: ynqa Date: Thu, 19 Jul 2018 02:29:20 +0900 Subject: [PATCH 0282/8103] Add config, sources --- tensorflow_serving/tools/pip_package/BUILD | 4 ++++ .../tools/pip_package/build_pip_package.sh | 11 +++++++++++ 2 files changed, 15 insertions(+) diff --git a/tensorflow_serving/tools/pip_package/BUILD b/tensorflow_serving/tools/pip_package/BUILD index df4cbe6ea7e..c1300e869ad 100644 --- a/tensorflow_serving/tools/pip_package/BUILD +++ b/tensorflow_serving/tools/pip_package/BUILD @@ -22,6 +22,10 @@ sh_binary( "//tensorflow_serving/apis:predict_proto_py_pb2", "//tensorflow_serving/apis:regression_proto_py_pb2", "//tensorflow_serving/apis:session_service_proto_py_pb2", + "//tensorflow_serving/config:log_collector_config_proto_py_pb2", + "//tensorflow_serving/config:logging_config_proto_py_pb2", + "//tensorflow_serving/config:model_server_config_proto_py_pb2", + "//tensorflow_serving/sources/storage_path:file_system_storage_path_source_proto_py_pb2", "//tensorflow_serving/util:status_proto_py_pb2", ], ) diff --git a/tensorflow_serving/tools/pip_package/build_pip_package.sh b/tensorflow_serving/tools/pip_package/build_pip_package.sh index e7cc489b046..eac75ca6226 100755 --- a/tensorflow_serving/tools/pip_package/build_pip_package.sh +++ b/tensorflow_serving/tools/pip_package/build_pip_package.sh @@ -34,6 +34,8 @@ function main() { echo $(date) : "=== Using tmpdir: ${TMPDIR}" mkdir -p ${TMPDIR}/tensorflow_serving/apis + mkdir -p ${TMPDIR}/tensorflow_serving/config + mkdir -p ${TMPDIR}/tensorflow_serving/sources/storage_path mkdir -p ${TMPDIR}/tensorflow_serving/util mkdir -p ${TMPDIR}/tensorflow/core/lib/core @@ -46,7 +48,13 @@ function main() { cp bazel-serving/tensorflow_serving/apis/*_grpc.py \ "${TMPDIR}/tensorflow_serving/apis" + + cp bazel-genfiles/tensorflow_serving/config/*_pb2.py \ + "${TMPDIR}/tensorflow_serving/config" + cp bazel-genfiles/tensorflow_serving/sources/storage_path/*_pb2.py \ + "${TMPDIR}/tensorflow_serving/sources/storage_path" + cp bazel-genfiles/tensorflow_serving/util/*_pb2.py \ "${TMPDIR}/tensorflow_serving/util" @@ -54,6 +62,9 @@ function main() { "${TMPDIR}/tensorflow/core/lib/core" touch "${TMPDIR}/tensorflow_serving/apis/__init__.py" + touch "${TMPDIR}/tensorflow_serving/config/__init__.py" + touch "${TMPDIR}/tensorflow_serving/sources/__init__.py" + touch "${TMPDIR}/tensorflow_serving/sources/storage_path/__init__.py" touch "${TMPDIR}/tensorflow_serving/util/__init__.py" touch "${TMPDIR}/tensorflow_serving/__init__.py" touch "${TMPDIR}/tensorflow/__init__.py" From f5d43c579bcdaa9f35f751fe845a8c2e3f2b1ee7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 18 Jul 2018 11:03:46 -0700 Subject: [PATCH 0283/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205104291 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6a7280360e1..79ba215a150 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b07d74581b7b4b065902a03cc736e6ee4cd9d116ec91d0c1fc60e8c6cd494a9b", - git_commit = "b78e0da14d29d7e9d3b51a7b633c960baacd710c", + sha256 = "256437808acb38c48bdfa9530dfffbec6af623710dfde7da56fbe0fa2f41fa56", + git_commit = "bc8fd55cac9f10716b92883b83a36d54a1d7047b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2b299fa53962075ff1a3b445ac5917acb400c64f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 18 Jul 2018 12:03:00 -0700 Subject: [PATCH 0284/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205114404 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 79ba215a150..29f23cecff7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "256437808acb38c48bdfa9530dfffbec6af623710dfde7da56fbe0fa2f41fa56", - git_commit = "bc8fd55cac9f10716b92883b83a36d54a1d7047b", + sha256 = "b81db71d18e87a503ab98b7b869cac09a24b30f13b846031775992e6b385b3f8", + git_commit = "b062b8e92376012383fe55ceb660d83af08a8686", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ac2e041f563f63432ce678e3065a3471e640b3f2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 18 Jul 2018 13:00:40 -0700 Subject: [PATCH 0285/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205122790 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 29f23cecff7..7ab1a5bbec2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b81db71d18e87a503ab98b7b869cac09a24b30f13b846031775992e6b385b3f8", - git_commit = "b062b8e92376012383fe55ceb660d83af08a8686", + sha256 = "c315afcd9b8e95a3ccda590041190c7002fa95f8ec8b956515d16d4d75efba1a", + git_commit = "b7ff2af8639077fba995251be90e65cc30a610ff", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b395fbc66ba053846b9bf8fc993a778bcbba1bb8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 18 Jul 2018 14:01:56 -0700 Subject: [PATCH 0286/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205132708 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7ab1a5bbec2..56d2374159c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c315afcd9b8e95a3ccda590041190c7002fa95f8ec8b956515d16d4d75efba1a", - git_commit = "b7ff2af8639077fba995251be90e65cc30a610ff", + sha256 = "bb80c4d20fd57a3a7000a417eb2fda33b6e0dcf0d8d120fdb02d3a24aa0284cf", + git_commit = "f836031f97d4b2ef2160f71332ee9c96a20ce84a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 77a46527fd40866cb4e889ebced8df41048d42fd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 18 Jul 2018 15:02:22 -0700 Subject: [PATCH 0287/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205143174 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 56d2374159c..04aef9b7fd1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bb80c4d20fd57a3a7000a417eb2fda33b6e0dcf0d8d120fdb02d3a24aa0284cf", - git_commit = "f836031f97d4b2ef2160f71332ee9c96a20ce84a", + sha256 = "1186eddbd5595d7311d7453b1aac87274df750bc4ecb263e56c8204a40a3e696", + git_commit = "4ca04537c0d1d75ea37944aa3bb2dc749428031a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1909f8c88dfe8138f6366fdd5b6e97609dc116dc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 18 Jul 2018 16:01:53 -0700 Subject: [PATCH 0288/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205153103 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 04aef9b7fd1..edf8cfa9fe3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1186eddbd5595d7311d7453b1aac87274df750bc4ecb263e56c8204a40a3e696", - git_commit = "4ca04537c0d1d75ea37944aa3bb2dc749428031a", + sha256 = "d027d65965a1e495d2f1ddfd3c6e712f3353de87efbf5d198a361d661ac166e4", + git_commit = "0bac40657d2f7d5f879cbaa7f5d4f14c41a3d585", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1ed224dc3a9d8f9d40b4b81860c4810ab2fab6e1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 18 Jul 2018 17:02:01 -0700 Subject: [PATCH 0289/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205162100 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index edf8cfa9fe3..56a0fc8a264 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d027d65965a1e495d2f1ddfd3c6e712f3353de87efbf5d198a361d661ac166e4", - git_commit = "0bac40657d2f7d5f879cbaa7f5d4f14c41a3d585", + sha256 = "cae40f739daef19e314327b5abdca2f7af6fb2a191d5095db6cd19d762139003", + git_commit = "5a78e98e877bdca794ffd9e5c4f00da5d2e7ee7d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 895e12fdb2616e939f4a954a23a82cac2fe83b94 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 18 Jul 2018 18:02:02 -0700 Subject: [PATCH 0290/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205169337 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 56a0fc8a264..bbaf371706f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cae40f739daef19e314327b5abdca2f7af6fb2a191d5095db6cd19d762139003", - git_commit = "5a78e98e877bdca794ffd9e5c4f00da5d2e7ee7d", + sha256 = "a333ad750899461e8eba6e6c071b6a3d935e851ab7c61811ce1f415b9d3f527c", + git_commit = "ff222c19fd642a6001ef8ba0ba7a823f37886a5d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8ccb8f48dddc7d7d9972c364ffe97c5e79aa8c32 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 18 Jul 2018 19:02:09 -0700 Subject: [PATCH 0291/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205174700 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bbaf371706f..cef5fed70e1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a333ad750899461e8eba6e6c071b6a3d935e851ab7c61811ce1f415b9d3f527c", - git_commit = "ff222c19fd642a6001ef8ba0ba7a823f37886a5d", + sha256 = "31eddae9f4e08e20639b577acadd03cc7ffc177c8178a597196163678ba16bf6", + git_commit = "e6fb3baeed99543b3ffd22522c30b08c94835e15", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2de6e24d7eda21caae767421f5153f076302d1d5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 18 Jul 2018 20:02:57 -0700 Subject: [PATCH 0292/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205178841 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cef5fed70e1..2adab662e78 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "31eddae9f4e08e20639b577acadd03cc7ffc177c8178a597196163678ba16bf6", - git_commit = "e6fb3baeed99543b3ffd22522c30b08c94835e15", + sha256 = "d01afdfb2fc99b091ec86f8366aab3f78b71a0b4959c53c401eb7e1046cb9098", + git_commit = "a84859ad52d2cff7cb5b7d6f98086f28c85a14c9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e401c514345e9bbed14cc2e4f825cec562fa4d2a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 18 Jul 2018 21:01:48 -0700 Subject: [PATCH 0293/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205183018 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2adab662e78..d3c730abfe4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d01afdfb2fc99b091ec86f8366aab3f78b71a0b4959c53c401eb7e1046cb9098", - git_commit = "a84859ad52d2cff7cb5b7d6f98086f28c85a14c9", + sha256 = "c491c1f3e7cfc8b72d2b78560f435e0098fcd67e275ff15baa208c2c411324b2", + git_commit = "996b078c45879ad0ea6ee56f58fcbeb6c03c3246", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6738b7b4464fe598720588b3de0c9c26c5e5ba74 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 18 Jul 2018 22:01:34 -0700 Subject: [PATCH 0294/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205186678 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d3c730abfe4..71e9d138b25 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c491c1f3e7cfc8b72d2b78560f435e0098fcd67e275ff15baa208c2c411324b2", - git_commit = "996b078c45879ad0ea6ee56f58fcbeb6c03c3246", + sha256 = "0aa8c1d82e750146682ed1e8fcf55abaf5080a0dbbc962c690f574ffa34c0558", + git_commit = "874de86fe803823589d6b1c1e2dbe4adc5d3408c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c20260f83600b6238cf3d0ec79725c17ce30f63d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 19 Jul 2018 02:01:09 -0700 Subject: [PATCH 0295/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205205916 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 71e9d138b25..5a732d88463 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0aa8c1d82e750146682ed1e8fcf55abaf5080a0dbbc962c690f574ffa34c0558", - git_commit = "874de86fe803823589d6b1c1e2dbe4adc5d3408c", + sha256 = "b6c634829898cbf369869eced70430554d6bf28e400e3ea9312b0a297bd3671d", + git_commit = "c818bf016d4b48838d943338fd0c8581ab95ada1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 52088246ae0a53c8234f94b133d244d7a1d8c3c3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 19 Jul 2018 05:02:42 -0700 Subject: [PATCH 0296/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205222886 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5a732d88463..796000353a2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b6c634829898cbf369869eced70430554d6bf28e400e3ea9312b0a297bd3671d", - git_commit = "c818bf016d4b48838d943338fd0c8581ab95ada1", + sha256 = "054b3855145417a6e943b18141038819f48d6a1a6266cf286e54aee154b7c8fd", + git_commit = "dbf10397ed25001f03ed0eac879e328f625fe0d1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 38b642cf320500a6adb326587f055aeda626fd2c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 19 Jul 2018 06:03:29 -0700 Subject: [PATCH 0297/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205228430 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 796000353a2..9fcbb93ab6c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "054b3855145417a6e943b18141038819f48d6a1a6266cf286e54aee154b7c8fd", - git_commit = "dbf10397ed25001f03ed0eac879e328f625fe0d1", + sha256 = "9773b3c2d3cbf13817b79b6722e571db5b777f58e966d3b56b9b7710250812c2", + git_commit = "68353db31b981057d612a46571ee244a2aca6840", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2266bbf929b0dd739fc49cd313a9c9ecc52cc0ef Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 19 Jul 2018 07:01:56 -0700 Subject: [PATCH 0298/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205234078 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9fcbb93ab6c..0ed34a79b3c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9773b3c2d3cbf13817b79b6722e571db5b777f58e966d3b56b9b7710250812c2", - git_commit = "68353db31b981057d612a46571ee244a2aca6840", + sha256 = "ab932ca1c89ba977c01bd9006a9f4240fbe7f3fc5b10274cfd32b2a6ff727ebd", + git_commit = "4e3b7baca38aa93657272b2e80128d0552247f87", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ae1f761d707e0ec1053e82ae714f2e1fac5491db Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 19 Jul 2018 08:02:40 -0700 Subject: [PATCH 0299/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205241322 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0ed34a79b3c..71798f638f0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ab932ca1c89ba977c01bd9006a9f4240fbe7f3fc5b10274cfd32b2a6ff727ebd", - git_commit = "4e3b7baca38aa93657272b2e80128d0552247f87", + sha256 = "95a11cc578d86cc1648abe592f4c65e91c18710e38f5132c4cb222533c03812e", + git_commit = "cb299834dbe8469f8b54c129e6831e42eed399a2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 23f1523e923e38236300b60c677729e7ad6d28cb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 19 Jul 2018 09:02:38 -0700 Subject: [PATCH 0300/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205249274 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 71798f638f0..60510565e9c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "95a11cc578d86cc1648abe592f4c65e91c18710e38f5132c4cb222533c03812e", - git_commit = "cb299834dbe8469f8b54c129e6831e42eed399a2", + sha256 = "75616a2ca230857ea3b0b471792ea17dc1cb698534b8eccb9e54066441285baf", + git_commit = "6f0e971c30654b02e3ed2f1bc4d3f09b584668e7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2587fcdb248b013034749c3a4d5c6df530b96a0f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 19 Jul 2018 10:04:18 -0700 Subject: [PATCH 0301/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205257994 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 60510565e9c..35301ad2fec 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "75616a2ca230857ea3b0b471792ea17dc1cb698534b8eccb9e54066441285baf", - git_commit = "6f0e971c30654b02e3ed2f1bc4d3f09b584668e7", + sha256 = "f66e1c26bec348a95386e791bda1a3984f6fd72641fc4fd649bbe3301b540d7b", + git_commit = "a5fcf4a3c0f999dec3501b23b0c6f5e5d1ff9c38", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2c0e61ff519c46d5a6d268a9595571ed9538b0cc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 19 Jul 2018 11:02:03 -0700 Subject: [PATCH 0302/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205267965 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 35301ad2fec..98de85a92d5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f66e1c26bec348a95386e791bda1a3984f6fd72641fc4fd649bbe3301b540d7b", - git_commit = "a5fcf4a3c0f999dec3501b23b0c6f5e5d1ff9c38", + sha256 = "b24d8d3eb34c09d4573070647bf5b69c2841aca82f0673ace73202d35e1ca6ca", + git_commit = "9dfa333cc8e78b9a533562448d67d48ec568622d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b93179cc749036392a92e67e2642d0a1396d98aa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 19 Jul 2018 12:04:22 -0700 Subject: [PATCH 0303/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205278843 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 98de85a92d5..63a426e4a37 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b24d8d3eb34c09d4573070647bf5b69c2841aca82f0673ace73202d35e1ca6ca", - git_commit = "9dfa333cc8e78b9a533562448d67d48ec568622d", + sha256 = "26e4bfb56c3e6bd8d5441db019a137f5eb99e950a1dced60b8cf4cf4550fc724", + git_commit = "8571b4f3d2d06caefd8f714d7ea98a3701ea3a96", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c931851bcb1ad804b768cf46eac1683f5cf1a478 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 19 Jul 2018 13:02:07 -0700 Subject: [PATCH 0304/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205287779 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 63a426e4a37..4a6ed1cf4f4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "26e4bfb56c3e6bd8d5441db019a137f5eb99e950a1dced60b8cf4cf4550fc724", - git_commit = "8571b4f3d2d06caefd8f714d7ea98a3701ea3a96", + sha256 = "e39fed7b4462aeeb70c966c8c68b1ba9aadd8c93c04932b03ae584c9ea1f633d", + git_commit = "0399e0cf13deaed9fb9e6dcf1af2c378579e817e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ceca1276367fd9fa9ea7bd8558b0a76c6ce070e2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 19 Jul 2018 14:04:28 -0700 Subject: [PATCH 0305/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205298068 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4a6ed1cf4f4..04a8fd000a6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e39fed7b4462aeeb70c966c8c68b1ba9aadd8c93c04932b03ae584c9ea1f633d", - git_commit = "0399e0cf13deaed9fb9e6dcf1af2c378579e817e", + sha256 = "b4e4e7d90546f825588ce6505d785d35574071a5e0b7cb2d30e48165936328b3", + git_commit = "58fdd0dfce6d4c71fa7d381190987ccad33da0b6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9f98cb10371f778963f4edd016bb4eace006e682 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 19 Jul 2018 15:01:40 -0700 Subject: [PATCH 0306/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205308214 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 04a8fd000a6..8c8ecdea569 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b4e4e7d90546f825588ce6505d785d35574071a5e0b7cb2d30e48165936328b3", - git_commit = "58fdd0dfce6d4c71fa7d381190987ccad33da0b6", + sha256 = "6c7fc5f7ef084d3b3a683b0828d64700928a15ef038e7a053aa5c39ed4e2cd7c", + git_commit = "6e02d79ba0179a23679e65b31405c591726bc552", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 452a6be734f607187e95f881d693827e828577f1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 19 Jul 2018 16:03:25 -0700 Subject: [PATCH 0307/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205317991 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8c8ecdea569..415d6e0ad50 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6c7fc5f7ef084d3b3a683b0828d64700928a15ef038e7a053aa5c39ed4e2cd7c", - git_commit = "6e02d79ba0179a23679e65b31405c591726bc552", + sha256 = "2fd4c66e4aa23f4a2cee836f36f1bf8796b6700d4afe7ae5824806e72f8a2b24", + git_commit = "de98d59491fa55455f0e2ba4313cf0d65ef979c6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From bcfd365617ff28047e6009caa80de09587d89f46 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 19 Jul 2018 17:02:34 -0700 Subject: [PATCH 0308/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205326716 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 415d6e0ad50..a9a6e0140ad 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2fd4c66e4aa23f4a2cee836f36f1bf8796b6700d4afe7ae5824806e72f8a2b24", - git_commit = "de98d59491fa55455f0e2ba4313cf0d65ef979c6", + sha256 = "d4e9ac5e2572e193721ff400bb09d958edc602d7e0ac8802c99ea3560dc72d90", + git_commit = "8f130ff5b021efb94946ed9deb1341890763fd3f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a4240a45964d513f6ad882f807dfb53173b34eba Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 19 Jul 2018 18:00:50 -0700 Subject: [PATCH 0309/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205333823 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a9a6e0140ad..3575d48f803 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d4e9ac5e2572e193721ff400bb09d958edc602d7e0ac8802c99ea3560dc72d90", - git_commit = "8f130ff5b021efb94946ed9deb1341890763fd3f", + sha256 = "49735974f164a0e9d58a1d5d5ae8d6ed7a20fe18df4bec29bd67d5cb159011ec", + git_commit = "90ec1ab915907ae94ac1d212611b460a68d8c98f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 93f33a02796abad88a5fa65901e97574219e11f2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 19 Jul 2018 19:02:17 -0700 Subject: [PATCH 0310/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205339381 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3575d48f803..ec55f9f0be2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "49735974f164a0e9d58a1d5d5ae8d6ed7a20fe18df4bec29bd67d5cb159011ec", - git_commit = "90ec1ab915907ae94ac1d212611b460a68d8c98f", + sha256 = "caa3eb94a8c47dce5b0d5fa60c543fdbdaf6f8b2c177a1fedf9356fdc639df85", + git_commit = "77c7b1112210beb3f0752f206bfa519f22aaf5c6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 02a5b6020fb82b0eb44b93f288f7f0c47e71c330 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 19 Jul 2018 20:02:35 -0700 Subject: [PATCH 0311/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205343364 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ec55f9f0be2..f685ca0842b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "caa3eb94a8c47dce5b0d5fa60c543fdbdaf6f8b2c177a1fedf9356fdc639df85", - git_commit = "77c7b1112210beb3f0752f206bfa519f22aaf5c6", + sha256 = "92f5fc4ee29ce7f274185fffac68053b938812d99fc7fab7c86e3087f290b303", + git_commit = "3a56de02398b61226924955c6ee4297a4ecb5d45", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 62f9ab2aa937de6aabe94a53156b81043de43e5b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 19 Jul 2018 21:03:25 -0700 Subject: [PATCH 0312/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205347514 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f685ca0842b..8d22d08f95f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "92f5fc4ee29ce7f274185fffac68053b938812d99fc7fab7c86e3087f290b303", - git_commit = "3a56de02398b61226924955c6ee4297a4ecb5d45", + sha256 = "95dba80ef4c660b9a3ed6a2ef0e03d8ef1e69a8b03311312c3667eca0566d6e5", + git_commit = "db308efbf4e95a7362fde90d35447091349b548e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a80402392c06892e3a8600e9194dcea5b367ee37 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 20 Jul 2018 00:02:02 -0700 Subject: [PATCH 0313/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205359086 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8d22d08f95f..be863bf44e6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "95dba80ef4c660b9a3ed6a2ef0e03d8ef1e69a8b03311312c3667eca0566d6e5", - git_commit = "db308efbf4e95a7362fde90d35447091349b548e", + sha256 = "db785cdcfaea5600976ede4309c8aad4ca37d67cd83e23bd1763b0fa64a04aca", + git_commit = "ee5271968e17b1bc0b852b0285dad4a38e1a97a0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 55253eceb216bf2115e4da860192d6d2c3497dd4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 20 Jul 2018 03:01:12 -0700 Subject: [PATCH 0314/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205373389 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index be863bf44e6..8eb81b0d6d4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "db785cdcfaea5600976ede4309c8aad4ca37d67cd83e23bd1763b0fa64a04aca", - git_commit = "ee5271968e17b1bc0b852b0285dad4a38e1a97a0", + sha256 = "f5a418d26452db95c153bdde38d605180f20caf53247f2ec9738124d64fee8f0", + git_commit = "6533c5a8ade658568a82c3c7bb9d1368a641c0a3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 13423e79ca4a491a075b8449fde4beb5db1dedd4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 20 Jul 2018 05:01:17 -0700 Subject: [PATCH 0315/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205382190 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8eb81b0d6d4..a8c0d900f28 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f5a418d26452db95c153bdde38d605180f20caf53247f2ec9738124d64fee8f0", - git_commit = "6533c5a8ade658568a82c3c7bb9d1368a641c0a3", + sha256 = "07677c4ca86437f5b992413bd3a2d44605b6f2fcdb82c090529fac250bd1e374", + git_commit = "78909bf81e99e705f74930e2ef9687c6e30dcbf6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 877337d4a07e3df55b7dc36b3b6be1f1edc0075e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 20 Jul 2018 06:02:40 -0700 Subject: [PATCH 0316/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205386967 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a8c0d900f28..f11bdfbe6ce 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "07677c4ca86437f5b992413bd3a2d44605b6f2fcdb82c090529fac250bd1e374", - git_commit = "78909bf81e99e705f74930e2ef9687c6e30dcbf6", + sha256 = "7034e470f1f3724310df42750bb4e4443c1d47f938b99df2af3d4eaed8457f82", + git_commit = "a641057c719aa95175a9ad3f9e26044f0c31416e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d0d0e637dd3d81a63f180cdaed9b58375d311ea6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 20 Jul 2018 10:04:20 -0700 Subject: [PATCH 0317/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205413281 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f11bdfbe6ce..54576d58631 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7034e470f1f3724310df42750bb4e4443c1d47f938b99df2af3d4eaed8457f82", - git_commit = "a641057c719aa95175a9ad3f9e26044f0c31416e", + sha256 = "353a4eb1eda2f1ae9edc471353ae06745da5df2c59569d381b3901869fdc758b", + git_commit = "75ca1d8df21cd4c7904ceecb12c0cfc268da361f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d124e899e1eadefa0458954f8efe305b79579daf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 20 Jul 2018 11:03:33 -0700 Subject: [PATCH 0318/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205423144 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 54576d58631..740d41ddfda 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "353a4eb1eda2f1ae9edc471353ae06745da5df2c59569d381b3901869fdc758b", - git_commit = "75ca1d8df21cd4c7904ceecb12c0cfc268da361f", + sha256 = "5ff79dd37daa2169accd7983dbb563bb91ee48a168098e2b6b6af7276918d4d0", + git_commit = "f965075fca32a41b544f8101a94641f6d322f1ec", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3f1d7d08c483d656a3439d1a0a9a3ded41c68068 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 20 Jul 2018 12:04:16 -0700 Subject: [PATCH 0319/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205432985 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 740d41ddfda..47e7ce2eb28 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5ff79dd37daa2169accd7983dbb563bb91ee48a168098e2b6b6af7276918d4d0", - git_commit = "f965075fca32a41b544f8101a94641f6d322f1ec", + sha256 = "54ee16fc8f771ed39421265b714aae6fe3d76dfd9523fa5d9cc93b832e158da3", + git_commit = "41b93403ac8148bd880c749165c40840ddb95b44", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d2f5a830424def9586aa6ad4ab933080b3997deb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 20 Jul 2018 13:02:20 -0700 Subject: [PATCH 0320/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205440769 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 47e7ce2eb28..f704cecc160 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "54ee16fc8f771ed39421265b714aae6fe3d76dfd9523fa5d9cc93b832e158da3", - git_commit = "41b93403ac8148bd880c749165c40840ddb95b44", + sha256 = "6007fe2496a65639b89de8835c0125884179e3e3ac90bce20250230684f9fc7c", + git_commit = "9f8256a61fcd44eeef7c0bf41c9bb4fddc505ae0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b153d43f956a468bf6a72ca6bd708cdb257f2d08 Mon Sep 17 00:00:00 2001 From: olston Date: Fri, 20 Jul 2018 13:15:29 -0700 Subject: [PATCH 0321/8103] Adds to the inference proto a way to query model versions by string labels, rather than version numbers. (The model server does not yet interpret these labels.) PiperOrigin-RevId: 205442653 --- tensorflow_serving/apis/model.proto | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/tensorflow_serving/apis/model.proto b/tensorflow_serving/apis/model.proto index 3a0ea1c020a..9c6427fe7d6 100644 --- a/tensorflow_serving/apis/model.proto +++ b/tensorflow_serving/apis/model.proto @@ -10,14 +10,23 @@ message ModelSpec { // Required servable name. string name = 1; - // Optional version. Recommended to be left unset in the common case. Should - // be specified only when there is a strong version consistency requirement. + // Optional choice of which version of the model to use. + // + // Recommended to be left unset in the common case. Should be specified only + // when there is a strong version consistency requirement. // // When left unspecified, the system will serve the best available version. // This is typically the latest version, though during version transitions, // notably when serving on a fleet of instances, may be either the previous or // new version. - google.protobuf.Int64Value version = 2; + oneof version_choice { + // Use this specific version number. + google.protobuf.Int64Value version = 2; + + // Use the version associated with the given label. + // EXPERIMENTAL. DO NOT USE AT THIS TIME. + string version_label = 4; + } // A named signature to evaluate. If unspecified, the default signature will // be used. From 012e0b992d4b6ff003e0bc02226681ae526c9059 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Fri, 20 Jul 2018 15:06:10 -0700 Subject: [PATCH 0322/8103] Remove old bazel workarounds PiperOrigin-RevId: 205460242 --- tensorflow_serving/tools/docker/Dockerfile.devel | 14 +++----------- .../tools/docker/Dockerfile.devel-gpu | 14 +++----------- 2 files changed, 6 insertions(+), 22 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index 6f5182a719c..eb09b96511c 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -52,14 +52,6 @@ RUN pip install mock grpcio # Set up Bazel. -# Running bazel inside a `docker build` command causes trouble, cf: -# https://github.com/bazelbuild/bazel/issues/134 -# The easiest solution is to set up a bazelrc file forcing --batch. -RUN echo "startup --batch" >>/etc/bazel.bazelrc -# Similarly, we need to workaround sandboxing issues: -# https://github.com/bazelbuild/bazel/issues/418 -RUN echo "build --spawn_strategy=standalone --genrule_strategy=standalone" \ - >>/etc/bazel.bazelrc # Need >= 0.15.0 so bazel compiles work with docker bind mounts. ENV BAZEL_VERSION 0.15.0 WORKDIR / @@ -74,9 +66,9 @@ RUN mkdir /bazel && \ # Download TF Serving sources (optionally at specific commit). WORKDIR /tensorflow-serving -RUN git clone --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tensorflow/serving . -RUN git remote add upstream https://github.com/tensorflow/serving.git -RUN if [ "${TF_SERVING_VERSION_GIT_COMMIT}" != "head" ]; then git checkout ${TF_SERVING_VERSION_GIT_COMMIT} ; fi +RUN git clone --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tensorflow/serving . && \ + git remote add upstream https://github.com/tensorflow/serving.git && \ + if [ "${TF_SERVING_VERSION_GIT_COMMIT}" != "head" ]; then git checkout ${TF_SERVING_VERSION_GIT_COMMIT} ; fi # Build, and install TensorFlow Serving ARG TF_SERVING_BUILD_OPTIONS="--copt=-mavx --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0 --verbose_failures" diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index c269bd4f56d..c2539aabb46 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -58,14 +58,6 @@ RUN pip install mock grpcio # Set up Bazel. -# Running bazel inside a `docker build` command causes trouble, cf: -# https://github.com/bazelbuild/bazel/issues/134 -# The easiest solution is to set up a bazelrc file forcing --batch. -RUN echo "startup --batch" >>/etc/bazel.bazelrc -# Similarly, we need to workaround sandboxing issues: -# https://github.com/bazelbuild/bazel/issues/418 -RUN echo "build --spawn_strategy=standalone --genrule_strategy=standalone" \ - >>/etc/bazel.bazelrc # Need >= 0.15.0 so bazel compiles work with docker bind mounts. ENV BAZEL_VERSION 0.15.0 WORKDIR / @@ -111,9 +103,9 @@ RUN mkdir -p ${NCCL_INSTALL_PATH} && \ # Download TF Serving sources (optionally at specific commit). WORKDIR /tensorflow-serving -RUN git clone --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tensorflow/serving . -RUN git remote add upstream https://github.com/tensorflow/serving.git -RUN if [ "${TF_SERVING_VERSION_GIT_COMMIT}" != "head" ]; then git checkout ${TF_SERVING_VERSION_GIT_COMMIT} ; fi +RUN git clone --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tensorflow/serving . && \ + git remote add upstream https://github.com/tensorflow/serving.git && \ + if [ "${TF_SERVING_VERSION_GIT_COMMIT}" != "head" ]; then git checkout ${TF_SERVING_VERSION_GIT_COMMIT} ; fi # Build, and install TensorFlow Serving ARG TF_SERVING_BUILD_OPTIONS="--copt=-mavx --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0 --verbose_failures" From a6a8c4f469fc50f44c2cefeb8ad456073ba9bf92 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 20 Jul 2018 16:02:21 -0700 Subject: [PATCH 0323/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205468220 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f704cecc160..55343366472 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6007fe2496a65639b89de8835c0125884179e3e3ac90bce20250230684f9fc7c", - git_commit = "9f8256a61fcd44eeef7c0bf41c9bb4fddc505ae0", + sha256 = "ec14efae700f2fdae22b3df0a79b416334026a8aac299b75af220c331a927369", + git_commit = "21662e6c28a7b5ceaf1636be0c1f2a2ea57da08f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From bb8973373442464f9f1ce3dba6296c046fc81f9d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 20 Jul 2018 17:03:59 -0700 Subject: [PATCH 0324/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205475705 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 55343366472..7b9b86e6a7f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ec14efae700f2fdae22b3df0a79b416334026a8aac299b75af220c331a927369", - git_commit = "21662e6c28a7b5ceaf1636be0c1f2a2ea57da08f", + sha256 = "d818e2439b5eba592823b2dcc362cb69d63ba93f261625986cfb2addf1c57c5a", + git_commit = "8741006018326350467fe86785d98963ff9e983e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3c4f4c6d299f196d32feda5e0c76297865a15311 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 20 Jul 2018 18:01:56 -0700 Subject: [PATCH 0325/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205481145 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7b9b86e6a7f..bd9ed638a9b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d818e2439b5eba592823b2dcc362cb69d63ba93f261625986cfb2addf1c57c5a", - git_commit = "8741006018326350467fe86785d98963ff9e983e", + sha256 = "94f10ac14b1eea602bd70e079f4bf05a8a8bac0ccfa21ceeb69d6353f10716e0", + git_commit = "9dbbea7a4327cd694ccff1f9edf6ae1af4329362", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 31e160abaa7c8ac1b88d529677cff2a03f629e55 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 20 Jul 2018 19:02:03 -0700 Subject: [PATCH 0326/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205485022 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bd9ed638a9b..bb875912c37 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "94f10ac14b1eea602bd70e079f4bf05a8a8bac0ccfa21ceeb69d6353f10716e0", - git_commit = "9dbbea7a4327cd694ccff1f9edf6ae1af4329362", + sha256 = "952747e2f2168961e6356ce378dce212c4ea9094295b608330cdec11e0dcb816", + git_commit = "5c15427443506d4beafc8223fbe665024191464a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b32e71fab98995c54c1ec4c1ef9af98a1c5138de Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 20 Jul 2018 20:02:08 -0700 Subject: [PATCH 0327/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205487902 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bb875912c37..81fc908ab48 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "952747e2f2168961e6356ce378dce212c4ea9094295b608330cdec11e0dcb816", - git_commit = "5c15427443506d4beafc8223fbe665024191464a", + sha256 = "92c3eea3c89c9c94fd6c425d4671128cd40f08e66cb844cbed01aa919dfeb0e5", + git_commit = "a8f3646377af20101b180a5f64df3f0066a9653b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From bef09d808dabc16b60450ef203f40a74e452d76e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 21 Jul 2018 00:02:02 -0700 Subject: [PATCH 0328/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205499029 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 81fc908ab48..4df994d896f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "92c3eea3c89c9c94fd6c425d4671128cd40f08e66cb844cbed01aa919dfeb0e5", - git_commit = "a8f3646377af20101b180a5f64df3f0066a9653b", + sha256 = "2f8e755935a22dc4cdc9f98add53f567e623bbad8ab407be7715d9d3b86504d7", + git_commit = "3153ebe72a5dd5c5848122ddc3c883aab14b5cf1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a278c1127793738f3761decc6e9029b39869b4f0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 21 Jul 2018 01:02:01 -0700 Subject: [PATCH 0329/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205501887 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4df994d896f..c3f2f2b9f7e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2f8e755935a22dc4cdc9f98add53f567e623bbad8ab407be7715d9d3b86504d7", - git_commit = "3153ebe72a5dd5c5848122ddc3c883aab14b5cf1", + sha256 = "b217cfcb5910372ae679da9ec7b136106de3431f195dfe25e5732d5aef058336", + git_commit = "19354d18bb2ce412409f4d79ec4fa23dd9057d8b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d276ecf5285f38adae85dafe2f159774a816a359 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 21 Jul 2018 02:00:51 -0700 Subject: [PATCH 0330/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205504735 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c3f2f2b9f7e..d8c1333a501 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b217cfcb5910372ae679da9ec7b136106de3431f195dfe25e5732d5aef058336", - git_commit = "19354d18bb2ce412409f4d79ec4fa23dd9057d8b", + sha256 = "75a7278f13879e2000d12fbf6f9d7d29248f33e54efa17fd91612d8edb523bd4", + git_commit = "dae7a75734f2137aae7130e064fab9dfcb799c45", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e55b37f5fbd5224a5beb7a0e87d5eb3d3bf0830e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 21 Jul 2018 12:02:00 -0700 Subject: [PATCH 0331/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205528411 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d8c1333a501..fc5acc683e6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "75a7278f13879e2000d12fbf6f9d7d29248f33e54efa17fd91612d8edb523bd4", - git_commit = "dae7a75734f2137aae7130e064fab9dfcb799c45", + sha256 = "2a6049b83b53b28f5bfd7b6ac6df778df97ae2635e914a75002aae69758a4e10", + git_commit = "aa5d3126ced57f8117678bb1cb5cc41e2a72eb9a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 68153c3a62cf2acac02eb6f9c449b07cdec2f867 Mon Sep 17 00:00:00 2001 From: Derek Hao Hu Date: Sat, 21 Jul 2018 12:28:57 -0700 Subject: [PATCH 0332/8103] Undo formatting change --- tensorflow_serving/g3doc/docker.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tensorflow_serving/g3doc/docker.md b/tensorflow_serving/g3doc/docker.md index dc4bc2cd23c..bac59ef82be 100644 --- a/tensorflow_serving/g3doc/docker.md +++ b/tensorflow_serving/g3doc/docker.md @@ -9,10 +9,10 @@ General installation instructions are [on the Docker site](https://docs.docker.com/install/), but we give some quick links here: -* [Docker for macOS](https://docs.docker.com/docker-for-mac/install/) -* [Docker for Windows](https://docs.docker.com/docker-for-windows/install/) +* [Docker for macOS](https://docs.docker.com/docker-for-mac/install/) +* [Docker for Windows](https://docs.docker.com/docker-for-windows/install/) for Windows 10 Pro or later -* [Docker Toolbox](https://docs.docker.com/toolbox/) for much older versions +* [Docker Toolbox](https://docs.docker.com/toolbox/) for much older versions of macOS, or versions of Windows before Windows 10 Pro ## Serving with Docker @@ -129,14 +129,14 @@ bazel-bin/tensorflow_serving/example/mnist_client --num_tests=1000 --server=loca We currently maintain the following Dockerfiles: -* [`Dockerfile`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile), +* [`Dockerfile`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile), which is a minimal VM with TensorFlow Serving installed. -* [`Dockerfile.devel`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.devel), +* [`Dockerfile.devel`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.devel), which is a minimal VM with all of the dependencies needed to build TensorFlow Serving. -* [`Dockerfile.devel-gpu`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.devel-gpu), +* [`Dockerfile.devel-gpu`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.devel-gpu), which is a minimal VM with all of the dependencies needed to build TensorFlow Serving with GPU support. From acc5024bce735e3f109cfdd53736b586514561aa Mon Sep 17 00:00:00 2001 From: Derek Hao Hu Date: Sat, 21 Jul 2018 12:29:50 -0700 Subject: [PATCH 0333/8103] Update formatting --- tensorflow_serving/g3doc/docker.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tensorflow_serving/g3doc/docker.md b/tensorflow_serving/g3doc/docker.md index bac59ef82be..7dd1e52e1a3 100644 --- a/tensorflow_serving/g3doc/docker.md +++ b/tensorflow_serving/g3doc/docker.md @@ -9,10 +9,10 @@ General installation instructions are [on the Docker site](https://docs.docker.com/install/), but we give some quick links here: -* [Docker for macOS](https://docs.docker.com/docker-for-mac/install/) -* [Docker for Windows](https://docs.docker.com/docker-for-windows/install/) +* [Docker for macOS](https://docs.docker.com/docker-for-mac/install/) +* [Docker for Windows](https://docs.docker.com/docker-for-windows/install/) for Windows 10 Pro or later -* [Docker Toolbox](https://docs.docker.com/toolbox/) for much older versions +* [Docker Toolbox](https://docs.docker.com/toolbox/) for much older versions of macOS, or versions of Windows before Windows 10 Pro ## Serving with Docker @@ -129,14 +129,14 @@ bazel-bin/tensorflow_serving/example/mnist_client --num_tests=1000 --server=loca We currently maintain the following Dockerfiles: -* [`Dockerfile`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile), +* [`Dockerfile`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile), which is a minimal VM with TensorFlow Serving installed. * [`Dockerfile.devel`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.devel), which is a minimal VM with all of the dependencies needed to build TensorFlow Serving. -* [`Dockerfile.devel-gpu`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.devel-gpu), +* [`Dockerfile.devel-gpu`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.devel-gpu), which is a minimal VM with all of the dependencies needed to build TensorFlow Serving with GPU support. From 204015832d6bba12d3750eef0813302835ec4b1e Mon Sep 17 00:00:00 2001 From: Derek Hao Hu Date: Sat, 21 Jul 2018 12:30:37 -0700 Subject: [PATCH 0334/8103] One more space... --- tensorflow_serving/g3doc/docker.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/g3doc/docker.md b/tensorflow_serving/g3doc/docker.md index 7dd1e52e1a3..634e67789af 100644 --- a/tensorflow_serving/g3doc/docker.md +++ b/tensorflow_serving/g3doc/docker.md @@ -136,7 +136,7 @@ We currently maintain the following Dockerfiles: which is a minimal VM with all of the dependencies needed to build TensorFlow Serving. -* [`Dockerfile.devel-gpu`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.devel-gpu), +* [`Dockerfile.devel-gpu`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.devel-gpu), which is a minimal VM with all of the dependencies needed to build TensorFlow Serving with GPU support. From f26ad1a111f699772fe4be208fa5f99c28a97a95 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 21 Jul 2018 15:02:29 -0700 Subject: [PATCH 0335/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205535376 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fc5acc683e6..7ecd5fe4b66 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2a6049b83b53b28f5bfd7b6ac6df778df97ae2635e914a75002aae69758a4e10", - git_commit = "aa5d3126ced57f8117678bb1cb5cc41e2a72eb9a", + sha256 = "5d20dda8c5b7cf8c322cb0fe41dfa0fc3c6a133e87a0d3fe320b97c28a06f828", + git_commit = "2279279fd15369e361a02fb09a1df41e08a34aae", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5ac3546e545cf72dd6bd154b05ab1086c75e20fe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 22 Jul 2018 00:01:56 -0700 Subject: [PATCH 0336/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205555013 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7ecd5fe4b66..c1cd0cb2312 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5d20dda8c5b7cf8c322cb0fe41dfa0fc3c6a133e87a0d3fe320b97c28a06f828", - git_commit = "2279279fd15369e361a02fb09a1df41e08a34aae", + sha256 = "90fef7da9bbd54a8daa1bd9a66a67ac7048f3b173e0a39551775ab9ffbc0e9e0", + git_commit = "f31939d24e3c544933b98ef48fac9ccac5679e05", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 767869f987f8c033bb7e779d0151d8c9a4a3a963 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 22 Jul 2018 02:01:48 -0700 Subject: [PATCH 0337/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205560947 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c1cd0cb2312..b91c3426ef0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "90fef7da9bbd54a8daa1bd9a66a67ac7048f3b173e0a39551775ab9ffbc0e9e0", - git_commit = "f31939d24e3c544933b98ef48fac9ccac5679e05", + sha256 = "4ea39db9ce16bf935a58f74aa148b0fac8bc36eed5c9b4c082d4242ac03d19e5", + git_commit = "88e560d6fadc1cf23519b00a9de5ed7c973536fd", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From edecf79c5ec90c976746db03313513244eb98bff Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 22 Jul 2018 15:02:17 -0700 Subject: [PATCH 0338/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205591539 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b91c3426ef0..ff8af56cd98 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4ea39db9ce16bf935a58f74aa148b0fac8bc36eed5c9b4c082d4242ac03d19e5", - git_commit = "88e560d6fadc1cf23519b00a9de5ed7c973536fd", + sha256 = "22b636ae61dbb36436769f4fb1ddef89980d9dc6c77396fcada4b2c857009c4b", + git_commit = "012f97121441f936b5262b98e2ca488c0c92422f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b4b7307c58b962a009d7f6299bf3aa9d5a79e51a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 22 Jul 2018 18:00:56 -0700 Subject: [PATCH 0339/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205599242 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ff8af56cd98..3a950643371 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "22b636ae61dbb36436769f4fb1ddef89980d9dc6c77396fcada4b2c857009c4b", - git_commit = "012f97121441f936b5262b98e2ca488c0c92422f", + sha256 = "9bcd414a3805df6e1586e62203b69ec34c3e07897165f9a5b26d88fe30e3880d", + git_commit = "89e06304aad35bfb019a8c10f39fc1ead83e0f99", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 62d3c321f008735efc6eaffe8b0f7a74589e721c Mon Sep 17 00:00:00 2001 From: Burkhard Neidecker-Lutz Date: Mon, 23 Jul 2018 14:11:51 +0200 Subject: [PATCH 0340/8103] Adding support for secure channel to modelserver --- tensorflow_serving/model_servers/BUILD | 6 +- tensorflow_serving/model_servers/main.cc | 83 +++++++++++++++++++++++- 2 files changed, 83 insertions(+), 6 deletions(-) diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 5561b025a3b..e3dd3c29fd0 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -197,7 +197,7 @@ cc_library( "//tensorflow_serving/apis:model_management_proto", "//tensorflow_serving/apis:model_service_proto", "//tensorflow_serving/util:status_util", - "@grpc//:grpc++_unsecure", + "@grpc//:grpc++", ], ) @@ -209,7 +209,7 @@ cc_library( "//visibility:public", ], deps = [ - "@grpc//:grpc++_unsecure", + "@grpc//:grpc++", "@org_tensorflow//tensorflow/core:lib", ], ) @@ -300,7 +300,7 @@ cc_library( "//tensorflow_serving/config:model_server_config_proto", "//tensorflow_serving/core:availability_preserving_policy", "//tensorflow_serving/servables/tensorflow:multi_inference_helper", - "@grpc//:grpc++_unsecure", + "@grpc//:grpc++", "//tensorflow_serving/servables/tensorflow:session_bundle_config_proto", ] + TENSORFLOW_DEPS + SUPPORTED_TENSORFLOW_OPS, ) diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index ff652d23d0d..c6b10899434 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -44,6 +44,8 @@ limitations under the License. // To override the default batching parameters: --batching_parameters_file #include +#include +#include #include #include #include @@ -295,13 +297,13 @@ struct HttpServerOptions { void RunServer(int port, std::unique_ptr core, bool use_saved_model, const string& grpc_channel_arguments, - const HttpServerOptions& http_options) { + const HttpServerOptions& http_options, + std::shared_ptr creds) { // "0.0.0.0" is the way to listen on localhost in gRPC. const string server_address = "0.0.0.0:" + std::to_string(port); tensorflow::serving::ModelServiceImpl model_service(core.get()); PredictionServiceImpl prediction_service(core.get(), use_saved_model); ServerBuilder builder; - std::shared_ptr creds = InsecureServerCredentials(); builder.AddListeningPort(server_address, creds); builder.RegisterService(&model_service); builder.RegisterService(&prediction_service); @@ -352,6 +354,22 @@ tensorflow::serving::PlatformConfigMap ParsePlatformConfigMap( return platform_config_map; } +tensorflow::Status readkey( const tensorflow::string& filename, tensorflow::string& data ) +{ + std::ifstream file(filename.c_str (), std::ios::in); + + if (file.is_open()) { + std::stringstream ss; + ss << file.rdbuf (); + + file.close (); + + data = ss.str (); + return tensorflow::Status::OK(); + } + return tensorflow::errors::InvalidArgument("Cannot read file: '", filename, "'"); +} + } // namespace int main(int argc, char** argv) { @@ -364,6 +382,9 @@ int main(int argc, char** argv) { float per_process_gpu_memory_fraction = 0; tensorflow::string batching_parameters_file; tensorflow::string model_name = "default"; + tensorflow::string server_key_path; + tensorflow::string server_cert_path; + tensorflow::string custom_root_path; tensorflow::int32 file_system_poll_wait_seconds = 1; bool flush_filesystem_caches = true; tensorflow::string model_base_path; @@ -374,6 +395,8 @@ int main(int argc, char** argv) { tensorflow::int64 tensorflow_session_parallelism = 0; string platform_config_file = ""; string model_config_file; + bool client_verify; + std::shared_ptr creds; string grpc_channel_arguments = ""; bool enable_model_warmup = true; std::vector flag_list = { @@ -423,6 +446,17 @@ int main(int argc, char** argv) { "Tensorflow session. Auto-configured by default." "Note that this option is ignored if " "--platform_config_file is non-empty."), + tensorflow::Flag("server_key", &server_key_path, + "path to private server key for SSL, " + "implies using SSL to connect"), + tensorflow::Flag("server_cert", &server_cert_path, + "path to public server certificate for SSL, " + "implies using SSL to connect"), + tensorflow::Flag("custom_ca", &custom_root_path, + "path to custom certificate authorities for SSL, " + "implies using SSL to connect"), + tensorflow::Flag("client_verify", &client_verify, + "When using SSL, require a valid client certificate"), tensorflow::Flag("platform_config_file", &platform_config_file, "If non-empty, read an ascii PlatformConfigMap protobuf " "from the supplied file name, and use that platform " @@ -457,6 +491,49 @@ int main(int argc, char** argv) { std::cout << "unknown argument: " << argv[1] << "\n" << usage; } + if (server_key_path.size() > 0 && server_cert_path.size() > 0) { + tensorflow::string key; + tensorflow::string cert; + tensorflow::string root; + + TF_CHECK_OK(readkey(server_cert_path, cert)); + TF_CHECK_OK(readkey(server_key_path, key)); + + grpc::SslServerCredentialsOptions sslOps(client_verify == true ? + GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY: + GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE); + + if (client_verify == true) { + sslOps.force_client_auth = true; + } + + if (custom_root_path.size() > 0) { + TF_CHECK_OK(readkey ( custom_root_path, root)); + sslOps.pem_root_certs = root; + } + + grpc::SslServerCredentialsOptions::PemKeyCertPair keycert = + { + key, + cert + }; + + sslOps.pem_key_cert_pairs.push_back (keycert); + + creds = grpc::SslServerCredentials(sslOps); + + } else { + if (! server_key_path.empty() && server_cert_path.empty()) { + std::cout << "When you specify --server_key you must specify --server_cert as well"; + return -1; + } + if (server_key_path.empty() && ! server_cert_path.empty()) { + std::cout << "When you specify --server_cert you must specify --server_key as well"; + return -1; + } + creds = InsecureServerCredentials(); + } + // For ServerCore Options, we leave servable_state_monitor_creator unspecified // so the default servable_state_monitor_creator will be used. ServerCore::Options options; @@ -518,7 +595,7 @@ int main(int argc, char** argv) { std::unique_ptr core; TF_CHECK_OK(ServerCore::Create(std::move(options), &core)); RunServer(port, std::move(core), use_saved_model, grpc_channel_arguments, - http_options); + http_options, creds); return 0; } From dce04bf0dff93cb66bd16eb0482eb03680637530 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 23 Jul 2018 08:00:58 -0700 Subject: [PATCH 0341/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205661288 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3a950643371..f528b9dd8db 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9bcd414a3805df6e1586e62203b69ec34c3e07897165f9a5b26d88fe30e3880d", - git_commit = "89e06304aad35bfb019a8c10f39fc1ead83e0f99", + sha256 = "a9f140a8137fb8cd489cefb2ab1543e1a8091cc527c34f76618704cd5930add8", + git_commit = "21d0205916eded7e2bf2f26e43dd41b2f86cba3f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a13f0254fae68a3209679433605f51102cc7102e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 23 Jul 2018 09:02:16 -0700 Subject: [PATCH 0342/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205669358 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f528b9dd8db..a4b19efc8fa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a9f140a8137fb8cd489cefb2ab1543e1a8091cc527c34f76618704cd5930add8", - git_commit = "21d0205916eded7e2bf2f26e43dd41b2f86cba3f", + sha256 = "b4ffd5c966457a175c967322ab5c573db2d95bc3e9532026a8511b2840e3fa7f", + git_commit = "32fe0302b0cf02d6cc3ae6cf67b233ad65c74bfe", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 79bbe5a20589cd12ade934cddbdcfca2459fa032 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 23 Jul 2018 10:03:33 -0700 Subject: [PATCH 0343/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205678828 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a4b19efc8fa..d1d26d3106e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b4ffd5c966457a175c967322ab5c573db2d95bc3e9532026a8511b2840e3fa7f", - git_commit = "32fe0302b0cf02d6cc3ae6cf67b233ad65c74bfe", + sha256 = "bfab88c5609e504fd018288e52d2b92d18318d4e4c6636c5015bc9e1c2cc0abe", + git_commit = "efb8a6d2f89bdb307c23ea393df8701e61bedf9a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c49677226f0615ed602e7ef372e89fe2e0f83c3e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 23 Jul 2018 11:01:49 -0700 Subject: [PATCH 0344/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205689646 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d1d26d3106e..e23268e80df 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bfab88c5609e504fd018288e52d2b92d18318d4e4c6636c5015bc9e1c2cc0abe", - git_commit = "efb8a6d2f89bdb307c23ea393df8701e61bedf9a", + sha256 = "41bb72178355381f23358a696f1ef01859ae2706b2bf3b501526c5ac8b2bb8dd", + git_commit = "bbc2c3f1c82fb3987134019e11dbd055a623d395", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fd60be23868cd34f46b5c97e5aa296f110c8d08b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 23 Jul 2018 12:02:36 -0700 Subject: [PATCH 0345/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205700481 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e23268e80df..2c7379674c1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "41bb72178355381f23358a696f1ef01859ae2706b2bf3b501526c5ac8b2bb8dd", - git_commit = "bbc2c3f1c82fb3987134019e11dbd055a623d395", + sha256 = "b02c1e9cebf86019030f5ea9654006fb96ae211e1681354b5836927fba3fa2e9", + git_commit = "97a0da7cd265d25a1b2caf2e6e344694bb795a1c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 813ceedf70c627218041b94c85328e782f02e120 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 23 Jul 2018 12:57:56 -0700 Subject: [PATCH 0346/8103] Change ServerRequestLogger::Update to only create new and delete old loggers if needed. This method will not create or delete any loggers if the config does not change. PiperOrigin-RevId: 205709389 --- tensorflow_serving/core/BUILD | 10 ++ .../core/proto_serialization.cc | 34 +++++ tensorflow_serving/core/proto_serialization.h | 35 +++++ .../core/server_request_logger.cc | 125 +++++++++++++----- .../core/server_request_logger.h | 43 ++++-- .../core/server_request_logger_test.cc | 84 +++++++++++- .../core/test_util/mock_request_logger.h | 16 ++- 7 files changed, 299 insertions(+), 48 deletions(-) create mode 100644 tensorflow_serving/core/proto_serialization.cc create mode 100644 tensorflow_serving/core/proto_serialization.h diff --git a/tensorflow_serving/core/BUILD b/tensorflow_serving/core/BUILD index b11ab0895a4..cac792f79db 100644 --- a/tensorflow_serving/core/BUILD +++ b/tensorflow_serving/core/BUILD @@ -798,6 +798,15 @@ cc_test( ], ) +cc_library( + name = "proto_serialization", + srcs = ["proto_serialization.cc"], + hdrs = ["proto_serialization.h"], + deps = [ + "@org_tensorflow//tensorflow/core:lib", + ], +) + cc_library( name = "server_request_logger", srcs = ["server_request_logger.cc"], @@ -806,6 +815,7 @@ cc_library( "//visibility:public", ], deps = [ + ":proto_serialization", ":request_logger", "//tensorflow_serving/apis:model_proto", "//tensorflow_serving/config:logging_config_proto", diff --git a/tensorflow_serving/core/proto_serialization.cc b/tensorflow_serving/core/proto_serialization.cc new file mode 100644 index 00000000000..f56e88254cf --- /dev/null +++ b/tensorflow_serving/core/proto_serialization.cc @@ -0,0 +1,34 @@ +/* Copyright 2016 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow_serving/core/proto_serialization.h" +#include "tensorflow/core/platform/logging.h" + +namespace tensorflow { +namespace serving { + +bool SerializeToStringDeterministic(const protobuf::MessageLite& msg, + string* result) { + DCHECK_LE(msg.ByteSizeLong(), static_cast(INT_MAX)); + const int size = static_cast(msg.ByteSizeLong()); + *result = string(size, '\0'); + protobuf::io::ArrayOutputStream array_stream(&(*result)[0], size); + protobuf::io::CodedOutputStream output_stream(&array_stream); + output_stream.SetSerializationDeterministic(true); + msg.SerializeWithCachedSizes(&output_stream); + return !output_stream.HadError() && size == output_stream.ByteCount(); +} + +} // namespace serving +} // namespace tensorflow diff --git a/tensorflow_serving/core/proto_serialization.h b/tensorflow_serving/core/proto_serialization.h new file mode 100644 index 00000000000..6b99790dbc7 --- /dev/null +++ b/tensorflow_serving/core/proto_serialization.h @@ -0,0 +1,35 @@ +/* Copyright 2016 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_SERVING_CORE_PROTO_SERIALIZATION_H_ +#define TENSORFLOW_SERVING_CORE_PROTO_SERIALIZATION_H_ + +#include "tensorflow/core/platform/protobuf.h" + +namespace tensorflow { +namespace serving { + +// Wrapper around protocol buffer serialization that requests deterministic +// serialization, in particular for Map fields, which serialize in a random +// order by default. Returns true on success. +// Serialization is guaranteed to be deterministic for a given binary only. +// See the following for more details: +// https://github.com/google/protobuf/blob/a1bb147e96b6f74db6cdf3c3fcb00492472dbbfa/src/google/protobuf/io/coded_stream.h#L834 +bool SerializeToStringDeterministic(const protobuf::MessageLite& msg, + string* result); + +} // namespace serving +} // namespace tensorflow + +#endif // TENSORFLOW_SERVING_CORE_PROTO_SERIALIZATION_H_ diff --git a/tensorflow_serving/core/server_request_logger.cc b/tensorflow_serving/core/server_request_logger.cc index 4c135682c6e..6217bd61d4b 100644 --- a/tensorflow_serving/core/server_request_logger.cc +++ b/tensorflow_serving/core/server_request_logger.cc @@ -20,52 +20,113 @@ limitations under the License. #include "tensorflow/core/platform/macros.h" #include "tensorflow_serving/apis/model.pb.h" #include "tensorflow_serving/core/logging.pb.h" +#include "tensorflow_serving/core/proto_serialization.h" namespace tensorflow { namespace serving { +namespace { + +// Validate the logging config map. For now only check for duplicate filename +// prefixes and emit warnings. +Status ValidateLoggingConfigMap( + const std::map& logging_config_map) { + std::set filename_prefixes; + for (const auto& model_and_logging_config : logging_config_map) { + const string& filename_prefix = + model_and_logging_config.second.log_collector_config() + .filename_prefix(); + if (!gtl::InsertIfNotPresent(&filename_prefixes, filename_prefix)) { + // Each model's logs are supposed to be separated from each other, + // though there could be systems which can distinguish based on the + // model-spec in the logging proto, so we issue only a warning. + LOG(WARNING) << "Duplicate LogCollectorConfig::filename_prefix(): " + << filename_prefix << ". Possibly a misconfiguration."; + } + } + return Status::OK(); +} + +} // namespace + // static Status ServerRequestLogger::Create( - const std::function*)>& - request_logger_creator, + LoggerCreator request_logger_creator, std::unique_ptr* server_request_logger) { - server_request_logger->reset(new ServerRequestLogger(request_logger_creator)); + server_request_logger->reset( + new ServerRequestLogger(std::move(request_logger_creator))); return Status::OK(); } -ServerRequestLogger::ServerRequestLogger( - const std::function*)>& - request_logger_creator) - : request_logger_map_( - std::unique_ptr(new RequestLoggerMap())), - request_logger_creator_(request_logger_creator) {} +ServerRequestLogger::ServerRequestLogger(LoggerCreator request_logger_creator) + : request_logger_creator_(std::move(request_logger_creator)) {} + +Status ServerRequestLogger::FindOrCreateLogger( + const LoggingConfig& config, + StringToUniqueRequestLoggerMap* new_config_to_logger_map, + RequestLogger** result) { + string serialized_config; + if (!SerializeToStringDeterministic(config, &serialized_config)) { + return errors::InvalidArgument("Cannot serialize config."); + } + + auto find_new_it = new_config_to_logger_map->find(serialized_config); + if (find_new_it != new_config_to_logger_map->end()) { + // The logger is already in new_config_to_logger_map, simply return it. + *result = find_new_it->second.get(); + return Status::OK(); + } + + auto find_old_it = config_to_logger_map_.find(serialized_config); + if (find_old_it != config_to_logger_map_.end()) { + // The logger is in old_config_to_logger_map. Move it to + // new_config_to_logger_map, erase the entry in config_to_logger_map_ and + // return the logger. + *result = find_old_it->second.get(); + new_config_to_logger_map->emplace( + std::make_pair(serialized_config, std::move(find_old_it->second))); + config_to_logger_map_.erase(find_old_it); + return Status::OK(); + } + + // The logger does not exist. Create a new logger, insert it into + // new_config_to_logger_map and return it. + std::unique_ptr logger; + TF_RETURN_IF_ERROR(request_logger_creator_(config, &logger)); + *result = logger.get(); + new_config_to_logger_map->emplace( + std::make_pair(serialized_config, std::move(logger))); + return Status::OK(); +} Status ServerRequestLogger::Update( const std::map& logging_config_map) { if (!logging_config_map.empty() && !request_logger_creator_) { return errors::InvalidArgument("No request-logger-creator provided."); } - std::set filename_prefixes; - std::unique_ptr request_logger_map(new RequestLoggerMap()); + TF_RETURN_IF_ERROR(ValidateLoggingConfigMap(logging_config_map)); + + // Those new maps will only contain loggers from logging_config_map and + // replace the current versions further down. + std::unique_ptr new_model_to_logger_map( + new StringToRequestLoggerMap()); + StringToUniqueRequestLoggerMap new_config_to_logger_map; + + mutex_lock l(update_mu_); + for (const auto& model_and_logging_config : logging_config_map) { - auto& request_logger = - (*request_logger_map)[model_and_logging_config.first]; - const string& filename_prefix = - model_and_logging_config.second.log_collector_config() - .filename_prefix(); - if (!gtl::InsertIfNotPresent(&filename_prefixes, filename_prefix)) { - // Each model's logs are supposed to be separated from each other, though - // there could be systems which can distinguish based on the model-spec - // in the logging proto, so we issue only a warning. - LOG(WARNING) << "Duplicate LogCollectorConfig::filename_prefix(): " - << filename_prefix << ". Possibly a misconfiguration."; - } - TF_RETURN_IF_ERROR(request_logger_creator_(model_and_logging_config.second, - &request_logger)); + RequestLogger* logger; + TF_RETURN_IF_ERROR(FindOrCreateLogger(model_and_logging_config.second, + &new_config_to_logger_map, &logger)); + const string& model_name = model_and_logging_config.first; + new_model_to_logger_map->emplace(std::make_pair(model_name, logger)); } - request_logger_map_.Update(std::move(request_logger_map)); + + model_to_logger_map_.Update(std::move(new_model_to_logger_map)); + // Any remaining loggers in config_to_logger_map_ will not be needed anymore + // and destructed at this point. + config_to_logger_map_ = std::move(new_config_to_logger_map); + return Status::OK(); } @@ -73,13 +134,13 @@ Status ServerRequestLogger::Log(const google::protobuf::Message& request, const google::protobuf::Message& response, const LogMetadata& log_metadata) { const string& model_name = log_metadata.model_spec().name(); - auto request_logger_map = request_logger_map_.get(); - if (request_logger_map->empty()) { + auto model_to_logger_map = model_to_logger_map_.get(); + if (!model_to_logger_map || model_to_logger_map->empty()) { VLOG(2) << "Request logger map is empty."; return Status::OK(); } - auto found_it = request_logger_map->find(model_name); - if (found_it == request_logger_map->end()) { + auto found_it = model_to_logger_map->find(model_name); + if (found_it == model_to_logger_map->end()) { VLOG(2) << "Cannot find request-logger for model: " << model_name; return Status::OK(); } diff --git a/tensorflow_serving/core/server_request_logger.h b/tensorflow_serving/core/server_request_logger.h index e337978ef30..8ac7f630d69 100644 --- a/tensorflow_serving/core/server_request_logger.h +++ b/tensorflow_serving/core/server_request_logger.h @@ -38,15 +38,15 @@ namespace serving { // sampling config. class ServerRequestLogger { public: + using LoggerCreator = std::function*)>; // Creates the ServerRequestLogger based on a custom request_logger_creator // method. // // You can create an empty ServerRequestLogger with an empty // request_logger_creator. static Status Create( - const std::function*)>& - request_logger_creator, + LoggerCreator request_logger_creator, std::unique_ptr* server_request_logger); virtual ~ServerRequestLogger() = default; @@ -65,20 +65,37 @@ class ServerRequestLogger { const LogMetadata& log_metadata); protected: - explicit ServerRequestLogger( - const std::function*)>& - request_logger_creator); + explicit ServerRequestLogger(LoggerCreator request_logger_creator); private: - // A map from model_name to its corresponding RequestLogger. - using RequestLoggerMap = + using StringToRequestLoggerMap = std::unordered_map; + using StringToUniqueRequestLoggerMap = std::unordered_map>; - FastReadDynamicPtr request_logger_map_; - std::function*)> - request_logger_creator_; + // Find a logger for config in either config_to_logger_map_ or + // new_config_to_logger_map. If the logger was found in + // config_to_logger_map_ move it to new_config_to_logger_map and erase the + // entry from config_to_logger_map_. If such a logger does not exist, + // create a new logger and insert it into new_config_to_logger_map. Return the + // logger in result. + Status FindOrCreateLogger( + const LoggingConfig& config, + StringToUniqueRequestLoggerMap* new_config_to_logger_map, + RequestLogger** result); + + // Mutex to ensure concurrent calls to Update() are serialized. + mutable mutex update_mu_; + // A map from serialized model config to its corresponding RequestLogger. + // If two models have the same logging config, they will share the + // RequestLogger. + // This is only used during calls to Update(). + StringToUniqueRequestLoggerMap config_to_logger_map_; + + // A map from model_name to its corresponding RequestLogger. + // The RequestLoggers are owned by config_to_logger_map_. + FastReadDynamicPtr model_to_logger_map_; + + LoggerCreator request_logger_creator_; }; } // namespace serving diff --git a/tensorflow_serving/core/server_request_logger_test.cc b/tensorflow_serving/core/server_request_logger_test.cc index 36821516acd..28920f8fdba 100644 --- a/tensorflow_serving/core/server_request_logger_test.cc +++ b/tensorflow_serving/core/server_request_logger_test.cc @@ -70,10 +70,15 @@ class ServerRequestLoggerTest : public ::testing::Test { const string& filename_prefix = logging_config.log_collector_config().filename_prefix(); log_collector_map_[filename_prefix] = new FakeLogCollector(); + increment_created_logger_counter(); + auto logger_destruction_notifier = [this]() { + increment_deleted_logger_counter(); + }; auto mock_request_logger = std::unique_ptr>( new NiceMock( - logging_config, log_collector_map_[filename_prefix])); + logging_config, log_collector_map_[filename_prefix], + logger_destruction_notifier)); ON_CALL(*mock_request_logger, CreateLogMessage(_, _, _, _)) .WillByDefault(Invoke([&](const google::protobuf::Message& actual_request, const google::protobuf::Message& actual_response, @@ -89,6 +94,29 @@ class ServerRequestLoggerTest : public ::testing::Test { &server_request_logger_)); } + void increment_created_logger_counter() { + mutex_lock l(m_); + created_logger_counter_++; + } + + int created_logger_counter() const { + mutex_lock sl(m_); + return created_logger_counter_; + } + + void increment_deleted_logger_counter() { + mutex_lock l(m_); + deleted_logger_counter_++; + } + + int deleted_logger_counter() const { + mutex_lock sl(m_); + return deleted_logger_counter_; + } + + mutable mutex m_; + int created_logger_counter_ = 0; + int deleted_logger_counter_ = 0; std::unordered_map log_collector_map_; std::unique_ptr server_request_logger_; }; @@ -139,6 +167,60 @@ TEST_F(ServerRequestLoggerTest, MultipleModels) { EXPECT_EQ(1, log_collector_map_["/file/model1"]->collect_count()); } +TEST_F(ServerRequestLoggerTest, CreateAndDeleteLogger) { + std::map model_logging_configs; + model_logging_configs.insert(CreateLoggingConfigForModel("model0")); + TF_ASSERT_OK(server_request_logger_->Update(model_logging_configs)); + EXPECT_EQ(1, created_logger_counter()); + EXPECT_EQ(0, deleted_logger_counter()); + + model_logging_configs.clear(); + TF_ASSERT_OK(server_request_logger_->Update(model_logging_configs)); + EXPECT_EQ(1, created_logger_counter()); + EXPECT_EQ(1, deleted_logger_counter()); +} + +TEST_F(ServerRequestLoggerTest, CreateAndModifyLogger) { + std::map model_logging_configs; + model_logging_configs.insert(CreateLoggingConfigForModel("model0")); + TF_ASSERT_OK(server_request_logger_->Update(model_logging_configs)); + EXPECT_EQ(1, created_logger_counter()); + EXPECT_EQ(0, deleted_logger_counter()); + + model_logging_configs["model0"].mutable_sampling_config()->set_sampling_rate( + 0.17); + + TF_ASSERT_OK(server_request_logger_->Update(model_logging_configs)); + EXPECT_EQ(2, created_logger_counter()); + EXPECT_EQ(1, deleted_logger_counter()); +} + +TEST_F(ServerRequestLoggerTest, SameConfigForTwoModelsCreatesOneLogger) { + std::map model_logging_configs; + std::pair model_and_config1 = + CreateLoggingConfigForModel("model"); + std::pair model_and_config2 = { + "model2", model_and_config1.second}; + model_logging_configs.insert(model_and_config1); + model_logging_configs.insert(model_and_config2); + TF_ASSERT_OK(server_request_logger_->Update(model_logging_configs)); + + EXPECT_EQ(1, created_logger_counter()); + EXPECT_EQ(0, deleted_logger_counter()); +} + +TEST_F(ServerRequestLoggerTest, MultipleUpdatesSingleCreation) { + std::map model_logging_configs; + model_logging_configs.insert(CreateLoggingConfigForModel("model0")); + model_logging_configs.insert(CreateLoggingConfigForModel("model1")); + for (int i = 0; i < 100; i++) { + TF_ASSERT_OK(server_request_logger_->Update(model_logging_configs)); + } + + EXPECT_EQ(2, created_logger_counter()); + EXPECT_EQ(0, deleted_logger_counter()); +} + } // namespace } // namespace serving } // namespace tensorflow diff --git a/tensorflow_serving/core/test_util/mock_request_logger.h b/tensorflow_serving/core/test_util/mock_request_logger.h index be7590cb0bd..922681c6ba7 100644 --- a/tensorflow_serving/core/test_util/mock_request_logger.h +++ b/tensorflow_serving/core/test_util/mock_request_logger.h @@ -32,14 +32,26 @@ class MockRequestLogger : public RequestLogger { // Unfortunately NiceMock doesn't support ctors with move-only types, so we // have to do this workaround. MockRequestLogger(const LoggingConfig& logging_config, - LogCollector* log_collector) + LogCollector* log_collector, + std::function notify_destruction = + std::function()) : RequestLogger(logging_config, - std::unique_ptr(log_collector)) {} + std::unique_ptr(log_collector)), + notify_destruction_(std::move(notify_destruction)) {} + + virtual ~MockRequestLogger() { + if (notify_destruction_) { + notify_destruction_(); + } + } MOCK_METHOD4(CreateLogMessage, Status(const google::protobuf::Message& request, const google::protobuf::Message& response, const LogMetadata& log_metadata, std::unique_ptr* log)); + + private: + std::function notify_destruction_; }; } // namespace serving From 7628e05270940fcd4a6175254df281b3f44cea61 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 23 Jul 2018 13:03:21 -0700 Subject: [PATCH 0347/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205710333 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2c7379674c1..de7fe8667e8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b02c1e9cebf86019030f5ea9654006fb96ae211e1681354b5836927fba3fa2e9", - git_commit = "97a0da7cd265d25a1b2caf2e6e344694bb795a1c", + sha256 = "53898d81ab2a3bd83d6e43eb93607a5bad3ae8f33e72c17b24cf346f62c282cd", + git_commit = "5f4ebb000057d2c0c76ef856526d374648958d86", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 009d6a934568ca3e428070348b0bc89059f31b23 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Mon, 23 Jul 2018 13:17:40 -0700 Subject: [PATCH 0348/8103] Add version output to model server binary Fixes #995 PiperOrigin-RevId: 205712728 --- tensorflow_serving/model_servers/BUILD | 2 ++ tensorflow_serving/model_servers/main.cc | 13 +++++-- tensorflow_serving/model_servers/version.h | 40 ++++++++++++++++++++++ 3 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 tensorflow_serving/model_servers/version.h diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 5561b025a3b..c4240142205 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -278,6 +278,7 @@ cc_library( srcs = [ "main.cc", ], + hdrs = ["version.h"], visibility = [ ":tensorflow_model_server_custom_op_clients", "//tensorflow_serving:internal", @@ -290,6 +291,7 @@ cc_library( ":grpc_status_util", ":model_service_impl", "@protobuf_archive//:cc_wkt_protos", + "@org_tensorflow//tensorflow/c:c_api", "@org_tensorflow//tensorflow/cc/saved_model:tag_constants", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core/platform/cloud:gcs_file_system", diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index ff652d23d0d..c9f52b453ab 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -56,6 +56,7 @@ limitations under the License. #include "grpcpp/server_builder.h" #include "grpcpp/server_context.h" #include "grpcpp/support/status.h" +#include "tensorflow/c/c_api.h" #include "tensorflow/cc/saved_model/tag_constants.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/lib/strings/numbers.h" @@ -76,6 +77,7 @@ limitations under the License. #include "tensorflow_serving/model_servers/model_service_impl.h" #include "tensorflow_serving/model_servers/platform_config_util.h" #include "tensorflow_serving/model_servers/server_core.h" +#include "tensorflow_serving/model_servers/version.h" #include "tensorflow_serving/servables/tensorflow/classification_service.h" #include "tensorflow_serving/servables/tensorflow/get_model_metadata_impl.h" #include "tensorflow_serving/servables/tensorflow/multi_inference_helper.h" @@ -376,6 +378,7 @@ int main(int argc, char** argv) { string model_config_file; string grpc_channel_arguments = ""; bool enable_model_warmup = true; + bool display_version = false; std::vector flag_list = { tensorflow::Flag("port", &port, "Port to listen on for gRPC API"), tensorflow::Flag("rest_api_port", &http_options.port, @@ -444,10 +447,16 @@ int main(int argc, char** argv) { tensorflow::Flag("enable_model_warmup", &enable_model_warmup, "Enables model warmup, which triggers lazy " "initializations (such as TF optimizations) at load " - "time, to reduce first request latency.")}; - + "time, to reduce first request latency."), + tensorflow::Flag("version", &display_version, "Display version")}; string usage = tensorflow::Flags::Usage(argv[0], flag_list); const bool parse_result = tensorflow::Flags::Parse(&argc, argv, flag_list); + if (parse_result && display_version) { + std::cout << "TensorFlow ModelServer: " << TF_MODELSERVER_VERSION_STRING + << "\n" + << "TensorFlow Library: " << TF_Version() << "\n"; + return 0; + } if (!parse_result || (model_base_path.empty() && model_config_file.empty())) { std::cout << usage; return -1; diff --git a/tensorflow_serving/model_servers/version.h b/tensorflow_serving/model_servers/version.h new file mode 100644 index 00000000000..5aa5b868cb8 --- /dev/null +++ b/tensorflow_serving/model_servers/version.h @@ -0,0 +1,40 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_SERVING_MODEL_SERVERS_VERSION_H_ +#define TENSORFLOW_SERVING_MODEL_SERVERS_VERSION_H_ + +// TF Serving Model Server uses semantic versioning, see http://semver.org/. + +#define TF_MODELSERVER_MAJOR_VERSION 1 +#define TF_MODELSERVER_MINOR_VERSION 10 +#define TF_MODELSERVER_PATCH_VERSION 0 + +// TF_MODELSERVER_VERSION_SUFFIX is non-empty for pre-releases +// (e.g. "-alpha", "-alpha.1", "-beta", "-rc", "-rc.1") +#define TF_MODELSERVER_VERSION_SUFFIX "-dev" + +#define TF_MODELSERVER_STR_HELPER(x) #x +#define TF_MODELSERVER_STR(x) TF_MODELSERVER_STR_HELPER(x) + +// e.g. "0.5.0" or "0.6.0-alpha". +// clang-format off +#define TF_MODELSERVER_VERSION_STRING \ + (TF_MODELSERVER_STR(TF_MODELSERVER_MAJOR_VERSION) "." TF_MODELSERVER_STR( \ + TF_MODELSERVER_MINOR_VERSION) "." TF_MODELSERVER_STR( \ + TF_MODELSERVER_PATCH_VERSION) TF_MODELSERVER_VERSION_SUFFIX) +// clang-format on + +#endif // TENSORFLOW_SERVING_MODEL_SERVERS_VERSION_H_ From 6e337ecdb9d12a995cb91cb08abe0177f7954ebf Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Mon, 23 Jul 2018 13:52:43 -0700 Subject: [PATCH 0349/8103] Internal Change PiperOrigin-RevId: 205718389 --- .github/ISSUE_TEMPLATE/bug_report.md | 42 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 36 +++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000000..3f06bd8686b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,42 @@ +--- +name: Bug Report +about: Create a report to help us improve TensorFlow Serving + +--- + +Please go to Stack Overflow for help and support: + +https://stackoverflow.com/questions/tagged/tensorflow-serving + +If you open a GitHub issue, here is our policy: + +1. It must be a bug, a feature request, or a significant problem with + documentation (for small docs fixes please send a PR instead). +2. The form below must be filled out. + +**Here's why we have that policy**: TensorFlow developers respond to issues. +We want to focus on work that benefits the whole community, e.g., fixing bugs +and adding features. Support only helps individuals. GitHub also notifies +thousands of people when issues are filed. We want them to see you communicating +an interesting problem, rather than being redirected to Stack Overflow. + +------------------------ + +### System information +- **OS Platform and Distribution (e.g., Linux Ubuntu 16.04)**: +- **TensorFlow Serving installed from (source or binary)**: +- **TensorFlow Serving version**: + +### Describe the problem +Describe the problem clearly here. Be sure to convey here why it's a bug in +TensorFlow Serving. + +### Exact Steps to Reproduce +Please include all steps necessary for someone to reproduce this issue on their +own machine. If not, skip this section. + +### Source code / logs +Include any logs or source code that would be helpful to diagnose the problem. +If including tracebacks, please include the full traceback. Large logs and files +should be attached. Try to provide a reproducible test case that is the bare +minimum necessary to generate the problem. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000000..26aabcfa49e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,36 @@ +--- +name: Feature request +about: Suggest an idea for TensorFlow Serving + +--- + +Please go to Stack Overflow for help and support: + +https://stackoverflow.com/questions/tagged/tensorflow-serving + +If you open a GitHub issue, here is our policy: + +1. It must be a bug, a feature request, or a significant problem with +documentation (for small docs fixes please send a PR instead). +2. The form below must be filled out. + +**Here's why we have that policy**: TensorFlow developers respond to issues. +We want to focus on work that benefits the whole community, e.g., fixing bugs +and adding features. Support only helps individuals. GitHub also notifies +thousands of people when issues are filed. We want them to see you communicating +an interesting problem, rather than being redirected to Stack Overflow. + +------------------------ +### Describe the problem the feature is intended to solve +A clear and concise description of what the problem is. Ex. I'm always +frustrated when [...] + +### Describe the solution +A clear and concise description of what you want to happen. + +### Describe alternatives you've considered +A clear and concise description of any alternative solutions or features you've +considered. + +### Additional context +Add any other context or screenshots about the feature request here. From edd61c53bf75e83a7eca46e230c3b61a4a12e4c7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 23 Jul 2018 14:01:47 -0700 Subject: [PATCH 0350/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205720060 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index de7fe8667e8..ed68aa241b8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "53898d81ab2a3bd83d6e43eb93607a5bad3ae8f33e72c17b24cf346f62c282cd", - git_commit = "5f4ebb000057d2c0c76ef856526d374648958d86", + sha256 = "17d494619ef2f5f480dc0c0bbbe25ade4150195c83a99b38d39085a2e60d2282", + git_commit = "31c3d55ec5b509142df00268611438ff52f3794a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5865ca8530e6c55893736a94eec9010e9491a923 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 23 Jul 2018 15:01:37 -0700 Subject: [PATCH 0351/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205730525 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ed68aa241b8..f6e472e04dc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "17d494619ef2f5f480dc0c0bbbe25ade4150195c83a99b38d39085a2e60d2282", - git_commit = "31c3d55ec5b509142df00268611438ff52f3794a", + sha256 = "6daee10c61c09ec87b0d74e86ec74e6a244e11af63c22baed014f5d9f69cc263", + git_commit = "5e7807be1c709f55f5643e7993bba04d2ba72ea6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3abfd1e64789a6c82647f33b2a180717b6cbafc9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 23 Jul 2018 16:01:20 -0700 Subject: [PATCH 0352/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205740255 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f6e472e04dc..7883d26b809 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6daee10c61c09ec87b0d74e86ec74e6a244e11af63c22baed014f5d9f69cc263", - git_commit = "5e7807be1c709f55f5643e7993bba04d2ba72ea6", + sha256 = "b955bd24707d768cb6e332e6f672a83f7f0e0b4adc53cf78199d8fd85202a7fd", + git_commit = "cf94a46c34f8568608d78b77e9a1c4369ebcafa2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c2fe6eb82a841c31f3408e1e6e270d18d142e7b9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 23 Jul 2018 17:03:25 -0700 Subject: [PATCH 0353/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205749509 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7883d26b809..d64d300e4d5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b955bd24707d768cb6e332e6f672a83f7f0e0b4adc53cf78199d8fd85202a7fd", - git_commit = "cf94a46c34f8568608d78b77e9a1c4369ebcafa2", + sha256 = "edbd59b8a9b71d2f8a5fea4d8ad1a5da548703bbc4bc573cd38c810839d33b29", + git_commit = "9affd713580f5f6cf81511c82e1d94bcd3c84e32", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3d80d3ea2930cc24bb04a88dcd763a074373f3fd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 23 Jul 2018 18:00:51 -0700 Subject: [PATCH 0354/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205756694 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d64d300e4d5..6684016e3dd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "edbd59b8a9b71d2f8a5fea4d8ad1a5da548703bbc4bc573cd38c810839d33b29", - git_commit = "9affd713580f5f6cf81511c82e1d94bcd3c84e32", + sha256 = "d8bd7b652f9039af79fac6a35637eb85fd59e6573048c0e2fb4b4252d5ff99b5", + git_commit = "6218750b0616e6b7cf14196b04549b2842f3dd99", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 75bdf3dbfb7f0b009b2665d6a5b7393736e95431 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 23 Jul 2018 19:01:05 -0700 Subject: [PATCH 0355/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205762434 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6684016e3dd..fc6f3284b85 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d8bd7b652f9039af79fac6a35637eb85fd59e6573048c0e2fb4b4252d5ff99b5", - git_commit = "6218750b0616e6b7cf14196b04549b2842f3dd99", + sha256 = "79e888b81221391d217dca773e49c3a3e06f2b0fb88f0890b1790fd6f5df0f21", + git_commit = "dcf568a4e297bb70a74ed5665b924077b9cb650a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1aa78335c5054e2ca6dbc6a5e79600b9688d84a5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 23 Jul 2018 20:01:05 -0700 Subject: [PATCH 0356/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205766627 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fc6f3284b85..0ddfab50091 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "79e888b81221391d217dca773e49c3a3e06f2b0fb88f0890b1790fd6f5df0f21", - git_commit = "dcf568a4e297bb70a74ed5665b924077b9cb650a", + sha256 = "a1a2c202f018f24e52791beae567d3e40c2440eebc078f2686fdd0547e4cd2d8", + git_commit = "efe370fcb367efd069c8166120858492dffa9a33", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 600e68579b8d015d9c6775fb3e259593b9718ec6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 23 Jul 2018 21:01:52 -0700 Subject: [PATCH 0357/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205771323 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0ddfab50091..6bd651e6eb1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a1a2c202f018f24e52791beae567d3e40c2440eebc078f2686fdd0547e4cd2d8", - git_commit = "efe370fcb367efd069c8166120858492dffa9a33", + sha256 = "c652ec21a96d30e19119dddd40d2bb464d50563ef44c55050ab3a22f807d44a9", + git_commit = "438eae1515d6b49e6d0578874657fb80459ef8e8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7ddbc61690de86d88e13fa43395f7d07e3cfd19c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 23 Jul 2018 22:02:42 -0700 Subject: [PATCH 0358/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205775859 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6bd651e6eb1..a16af5c045f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c652ec21a96d30e19119dddd40d2bb464d50563ef44c55050ab3a22f807d44a9", - git_commit = "438eae1515d6b49e6d0578874657fb80459ef8e8", + sha256 = "2e6f7773d461f40614bf02114b0da9d90b4f841fa5ecadc7a4e6a95b2d2679f4", + git_commit = "7fe6d775bb4a3f1dcc6484cab3dae1563dac6b42", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 604a0df06652f6a4055b96ea111db051092d4e9a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 23 Jul 2018 23:05:26 -0700 Subject: [PATCH 0359/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205780615 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a16af5c045f..9b7e78edd9f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2e6f7773d461f40614bf02114b0da9d90b4f841fa5ecadc7a4e6a95b2d2679f4", - git_commit = "7fe6d775bb4a3f1dcc6484cab3dae1563dac6b42", + sha256 = "0a17aa41de52d482c05d9f760aeeb3f1fe425143d0d17d38a199e26157b92127", + git_commit = "12f51c2873354577dcea167823d5a4c4dee5dbce", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f3635bd799a775804db9011634190ce924029fe7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 24 Jul 2018 00:46:17 -0700 Subject: [PATCH 0360/8103] Expose proto serialization publicly, to avoid code duplication in tensorflow_serving. PiperOrigin-RevId: 205788702 --- tensorflow_serving/core/BUILD | 10 ------ .../core/proto_serialization.cc | 34 ------------------ tensorflow_serving/core/proto_serialization.h | 35 ------------------- .../core/server_request_logger.cc | 2 +- 4 files changed, 1 insertion(+), 80 deletions(-) delete mode 100644 tensorflow_serving/core/proto_serialization.cc delete mode 100644 tensorflow_serving/core/proto_serialization.h diff --git a/tensorflow_serving/core/BUILD b/tensorflow_serving/core/BUILD index cac792f79db..b11ab0895a4 100644 --- a/tensorflow_serving/core/BUILD +++ b/tensorflow_serving/core/BUILD @@ -798,15 +798,6 @@ cc_test( ], ) -cc_library( - name = "proto_serialization", - srcs = ["proto_serialization.cc"], - hdrs = ["proto_serialization.h"], - deps = [ - "@org_tensorflow//tensorflow/core:lib", - ], -) - cc_library( name = "server_request_logger", srcs = ["server_request_logger.cc"], @@ -815,7 +806,6 @@ cc_library( "//visibility:public", ], deps = [ - ":proto_serialization", ":request_logger", "//tensorflow_serving/apis:model_proto", "//tensorflow_serving/config:logging_config_proto", diff --git a/tensorflow_serving/core/proto_serialization.cc b/tensorflow_serving/core/proto_serialization.cc deleted file mode 100644 index f56e88254cf..00000000000 --- a/tensorflow_serving/core/proto_serialization.cc +++ /dev/null @@ -1,34 +0,0 @@ -/* Copyright 2016 Google Inc. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#include "tensorflow_serving/core/proto_serialization.h" -#include "tensorflow/core/platform/logging.h" - -namespace tensorflow { -namespace serving { - -bool SerializeToStringDeterministic(const protobuf::MessageLite& msg, - string* result) { - DCHECK_LE(msg.ByteSizeLong(), static_cast(INT_MAX)); - const int size = static_cast(msg.ByteSizeLong()); - *result = string(size, '\0'); - protobuf::io::ArrayOutputStream array_stream(&(*result)[0], size); - protobuf::io::CodedOutputStream output_stream(&array_stream); - output_stream.SetSerializationDeterministic(true); - msg.SerializeWithCachedSizes(&output_stream); - return !output_stream.HadError() && size == output_stream.ByteCount(); -} - -} // namespace serving -} // namespace tensorflow diff --git a/tensorflow_serving/core/proto_serialization.h b/tensorflow_serving/core/proto_serialization.h deleted file mode 100644 index 6b99790dbc7..00000000000 --- a/tensorflow_serving/core/proto_serialization.h +++ /dev/null @@ -1,35 +0,0 @@ -/* Copyright 2016 Google Inc. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_SERVING_CORE_PROTO_SERIALIZATION_H_ -#define TENSORFLOW_SERVING_CORE_PROTO_SERIALIZATION_H_ - -#include "tensorflow/core/platform/protobuf.h" - -namespace tensorflow { -namespace serving { - -// Wrapper around protocol buffer serialization that requests deterministic -// serialization, in particular for Map fields, which serialize in a random -// order by default. Returns true on success. -// Serialization is guaranteed to be deterministic for a given binary only. -// See the following for more details: -// https://github.com/google/protobuf/blob/a1bb147e96b6f74db6cdf3c3fcb00492472dbbfa/src/google/protobuf/io/coded_stream.h#L834 -bool SerializeToStringDeterministic(const protobuf::MessageLite& msg, - string* result); - -} // namespace serving -} // namespace tensorflow - -#endif // TENSORFLOW_SERVING_CORE_PROTO_SERIALIZATION_H_ diff --git a/tensorflow_serving/core/server_request_logger.cc b/tensorflow_serving/core/server_request_logger.cc index 6217bd61d4b..f3e3fd196d7 100644 --- a/tensorflow_serving/core/server_request_logger.cc +++ b/tensorflow_serving/core/server_request_logger.cc @@ -17,10 +17,10 @@ limitations under the License. #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/lib/gtl/map_util.h" +#include "tensorflow/core/lib/strings/proto_serialization.h" #include "tensorflow/core/platform/macros.h" #include "tensorflow_serving/apis/model.pb.h" #include "tensorflow_serving/core/logging.pb.h" -#include "tensorflow_serving/core/proto_serialization.h" namespace tensorflow { namespace serving { From c177cf79e3869438fc62f3c91abba36ada716e0e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 24 Jul 2018 02:02:26 -0700 Subject: [PATCH 0361/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205795708 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9b7e78edd9f..a1cc777c0b6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0a17aa41de52d482c05d9f760aeeb3f1fe425143d0d17d38a199e26157b92127", - git_commit = "12f51c2873354577dcea167823d5a4c4dee5dbce", + sha256 = "dbdd9b67c62d4be1b4fa7740518a9653d9696c38a610398e5f266c209b97fee7", + git_commit = "fca1561b9d5932f940cf89e03128cf197547bed2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 792eb852fb5e9afdbaa9930c45d876556e1749b8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 24 Jul 2018 03:00:48 -0700 Subject: [PATCH 0362/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205801286 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a1cc777c0b6..8eaec9d1901 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dbdd9b67c62d4be1b4fa7740518a9653d9696c38a610398e5f266c209b97fee7", - git_commit = "fca1561b9d5932f940cf89e03128cf197547bed2", + sha256 = "eff98d3251ea3452e1d2d1fb7340d1148f2a330d66d31e5039b65862d5b41903", + git_commit = "33035bb79b6ecb408ef83cee5fc3e52ce058f39f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b5d90c7537762dd379536b106d879c22db1a1688 Mon Sep 17 00:00:00 2001 From: Burkhard Neidecker-Lutz Date: Tue, 24 Jul 2018 12:13:38 +0200 Subject: [PATCH 0363/8103] Change secure channel config over to ssl_config protobuf --- tensorflow_serving/config/BUILD | 8 ++ tensorflow_serving/config/ssl_config.proto | 16 ++++ tensorflow_serving/model_servers/BUILD | 1 + tensorflow_serving/model_servers/main.cc | 104 ++++++++------------- 4 files changed, 63 insertions(+), 66 deletions(-) create mode 100644 tensorflow_serving/config/ssl_config.proto diff --git a/tensorflow_serving/config/BUILD b/tensorflow_serving/config/BUILD index 1aa58c360cd..21c198ef4e7 100644 --- a/tensorflow_serving/config/BUILD +++ b/tensorflow_serving/config/BUILD @@ -87,3 +87,11 @@ serving_proto_library_py( ":log_collector_config_proto_py_pb2", ], ) + +serving_proto_library( + name = "ssl_config_proto", + srcs = ["ssl_config.proto"], + cc_api_version = 2, + deps = [ + ], +) diff --git a/tensorflow_serving/config/ssl_config.proto b/tensorflow_serving/config/ssl_config.proto new file mode 100644 index 00000000000..0e51cd61a20 --- /dev/null +++ b/tensorflow_serving/config/ssl_config.proto @@ -0,0 +1,16 @@ +syntax = "proto3"; + +package tensorflow.serving; +option cc_enable_arenas = true; + +// Configuration for a secure gRPC channel +message SSLConfig { + // private server key for SSL + string server_key = 1; + // public server certificate + string server_cert = 2; + // custom certificate authority + string custom_ca = 3; + // valid client certificate required ? + bool client_verify = 4; +}; diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index e3dd3c29fd0..ccf5b8b0c6f 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -298,6 +298,7 @@ cc_library( "@org_tensorflow//tensorflow/core:protos_all_cc", "//tensorflow_serving/apis:prediction_service_proto", "//tensorflow_serving/config:model_server_config_proto", + "//tensorflow_serving/config:ssl_config_proto", "//tensorflow_serving/core:availability_preserving_policy", "//tensorflow_serving/servables/tensorflow:multi_inference_helper", "@grpc//:grpc++", diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index c6b10899434..3deb4679f5c 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -71,6 +71,7 @@ limitations under the License. #include "tensorflow_serving/apis/prediction_service.grpc.pb.h" #include "tensorflow_serving/apis/prediction_service.pb.h" #include "tensorflow_serving/config/model_server_config.pb.h" +#include "tensorflow_serving/config/ssl_config.pb.h" #include "tensorflow_serving/core/availability_preserving_policy.h" #include "tensorflow_serving/model_servers/grpc_status_util.h" #include "tensorflow_serving/model_servers/http_server.h" @@ -101,6 +102,7 @@ using tensorflow::serving::ModelServerConfig; using tensorflow::serving::ServableState; using tensorflow::serving::ServerCore; using tensorflow::serving::SessionBundleConfig; +using tensorflow::serving::SSLConfig; using tensorflow::serving::TensorflowClassificationServiceImpl; using tensorflow::serving::TensorflowPredictor; using tensorflow::serving::TensorflowRegressionServiceImpl; @@ -354,20 +356,42 @@ tensorflow::serving::PlatformConfigMap ParsePlatformConfigMap( return platform_config_map; } -tensorflow::Status readkey( const tensorflow::string& filename, tensorflow::string& data ) +// Parses an ascii SSLConfig protobuf from 'file'. +SSLConfig ParseSSLConfig( + const string& file) { + SSLConfig ssl_config; + TF_CHECK_OK(ParseProtoTextFile(file, &ssl_config)); + return ssl_config; +} + +// If 'ssl_config_file' is non-empty, build secure server credentials otherwise insecure channel +std::shared_ptr BuildServerCredentialsFromSSLConfigFile(const string &ssl_config_file) { - std::ifstream file(filename.c_str (), std::ios::in); + if (ssl_config_file.empty()) { + return InsecureServerCredentials(); + } else { + SSLConfig ssl_config = ParseSSLConfig(ssl_config_file); - if (file.is_open()) { - std::stringstream ss; - ss << file.rdbuf (); + grpc::SslServerCredentialsOptions sslOps(ssl_config.client_verify() ? + GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY: + GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE); - file.close (); + sslOps.force_client_auth = ssl_config.client_verify(); - data = ss.str (); - return tensorflow::Status::OK(); + if (ssl_config.custom_ca().size() > 0) { + sslOps.pem_root_certs = ssl_config.custom_ca(); } - return tensorflow::errors::InvalidArgument("Cannot read file: '", filename, "'"); + + grpc::SslServerCredentialsOptions::PemKeyCertPair keycert = + { + ssl_config.server_key(), + ssl_config.server_cert() + }; + + sslOps.pem_key_cert_pairs.push_back(keycert); + + return grpc::SslServerCredentials(sslOps); + } } } // namespace @@ -382,9 +406,6 @@ int main(int argc, char** argv) { float per_process_gpu_memory_fraction = 0; tensorflow::string batching_parameters_file; tensorflow::string model_name = "default"; - tensorflow::string server_key_path; - tensorflow::string server_cert_path; - tensorflow::string custom_root_path; tensorflow::int32 file_system_poll_wait_seconds = 1; bool flush_filesystem_caches = true; tensorflow::string model_base_path; @@ -394,8 +415,8 @@ int main(int argc, char** argv) { // thread pools will be auto configured. tensorflow::int64 tensorflow_session_parallelism = 0; string platform_config_file = ""; + string ssl_config_file = ""; string model_config_file; - bool client_verify; std::shared_ptr creds; string grpc_channel_arguments = ""; bool enable_model_warmup = true; @@ -446,17 +467,9 @@ int main(int argc, char** argv) { "Tensorflow session. Auto-configured by default." "Note that this option is ignored if " "--platform_config_file is non-empty."), - tensorflow::Flag("server_key", &server_key_path, - "path to private server key for SSL, " - "implies using SSL to connect"), - tensorflow::Flag("server_cert", &server_cert_path, - "path to public server certificate for SSL, " - "implies using SSL to connect"), - tensorflow::Flag("custom_ca", &custom_root_path, - "path to custom certificate authorities for SSL, " - "implies using SSL to connect"), - tensorflow::Flag("client_verify", &client_verify, - "When using SSL, require a valid client certificate"), + tensorflow::Flag("ssl_config_file", &ssl_config_file, + "If non-empty, read an ascii SSLConfig protobuf from " + "the supplied file name and set up a secure gRPC channel"), tensorflow::Flag("platform_config_file", &platform_config_file, "If non-empty, read an ascii PlatformConfigMap protobuf " "from the supplied file name, and use that platform " @@ -491,48 +504,7 @@ int main(int argc, char** argv) { std::cout << "unknown argument: " << argv[1] << "\n" << usage; } - if (server_key_path.size() > 0 && server_cert_path.size() > 0) { - tensorflow::string key; - tensorflow::string cert; - tensorflow::string root; - - TF_CHECK_OK(readkey(server_cert_path, cert)); - TF_CHECK_OK(readkey(server_key_path, key)); - - grpc::SslServerCredentialsOptions sslOps(client_verify == true ? - GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY: - GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE); - - if (client_verify == true) { - sslOps.force_client_auth = true; - } - - if (custom_root_path.size() > 0) { - TF_CHECK_OK(readkey ( custom_root_path, root)); - sslOps.pem_root_certs = root; - } - - grpc::SslServerCredentialsOptions::PemKeyCertPair keycert = - { - key, - cert - }; - - sslOps.pem_key_cert_pairs.push_back (keycert); - - creds = grpc::SslServerCredentials(sslOps); - - } else { - if (! server_key_path.empty() && server_cert_path.empty()) { - std::cout << "When you specify --server_key you must specify --server_cert as well"; - return -1; - } - if (server_key_path.empty() && ! server_cert_path.empty()) { - std::cout << "When you specify --server_cert you must specify --server_key as well"; - return -1; - } - creds = InsecureServerCredentials(); - } + creds = BuildServerCredentialsFromSSLConfigFile(ssl_config_file); // For ServerCore Options, we leave servable_state_monitor_creator unspecified // so the default servable_state_monitor_creator will be used. From 9c78811fb1cf6e7e7ebc05d946277a69e6fc3d35 Mon Sep 17 00:00:00 2001 From: Burkhard Neidecker-Lutz Date: Tue, 24 Jul 2018 12:22:10 +0200 Subject: [PATCH 0364/8103] Removed unused includes --- tensorflow_serving/model_servers/main.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index 3deb4679f5c..32615381a25 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -44,8 +44,6 @@ limitations under the License. // To override the default batching parameters: --batching_parameters_file #include -#include -#include #include #include #include From c56e711a55a4cf26dc7003b54dc067acd05c212b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 24 Jul 2018 05:01:07 -0700 Subject: [PATCH 0365/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205811216 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8eaec9d1901..99cd0c2346a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eff98d3251ea3452e1d2d1fb7340d1148f2a330d66d31e5039b65862d5b41903", - git_commit = "33035bb79b6ecb408ef83cee5fc3e52ce058f39f", + sha256 = "00c7af80aeed32d18ed2788c5f8d209ceaed5d8af8f8ce0c671d29c2d0a19d25", + git_commit = "c21078f527023e3074b63109fb768413f82a8f8f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9930859fe62179de4aaed88a3e61fd9e8ae1f63f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 24 Jul 2018 09:00:58 -0700 Subject: [PATCH 0366/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205836643 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 99cd0c2346a..d23b7decc2c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "00c7af80aeed32d18ed2788c5f8d209ceaed5d8af8f8ce0c671d29c2d0a19d25", - git_commit = "c21078f527023e3074b63109fb768413f82a8f8f", + sha256 = "e9acff5c3e70eab9419fd91739af106865c9d6afaa2f71cb6a25e8d59fa9d444", + git_commit = "226831aab92a395a26824a08caa9d43f0c3d604e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 88c289291fc2c03866426d480d09ed87ccfff5db Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 24 Jul 2018 10:01:35 -0700 Subject: [PATCH 0367/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205845864 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d23b7decc2c..157242b12e3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e9acff5c3e70eab9419fd91739af106865c9d6afaa2f71cb6a25e8d59fa9d444", - git_commit = "226831aab92a395a26824a08caa9d43f0c3d604e", + sha256 = "f8ed3e3de03c9598fb67a6923ce22eb292f57dfaae0aaf3bfda5a078c5cc4eba", + git_commit = "1b33df1814e35015953c7cba392ba2a7387ce875", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 844b751d6325ef294b806d7549eb79eddafeb132 Mon Sep 17 00:00:00 2001 From: gautamvasudevan <12356580+gautamvasudevan@users.noreply.github.com> Date: Tue, 24 Jul 2018 10:22:51 -0700 Subject: [PATCH 0368/8103] Update build_pip_package.sh --- tensorflow_serving/tools/pip_package/build_pip_package.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/tools/pip_package/build_pip_package.sh b/tensorflow_serving/tools/pip_package/build_pip_package.sh index eac75ca6226..2833fc64613 100755 --- a/tensorflow_serving/tools/pip_package/build_pip_package.sh +++ b/tensorflow_serving/tools/pip_package/build_pip_package.sh @@ -51,7 +51,7 @@ function main() { cp bazel-genfiles/tensorflow_serving/config/*_pb2.py \ "${TMPDIR}/tensorflow_serving/config" - + cp bazel-genfiles/tensorflow_serving/sources/storage_path/*_pb2.py \ "${TMPDIR}/tensorflow_serving/sources/storage_path" From 528929314828e422f57f09e876d7703d5cf0fe50 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 24 Jul 2018 11:01:43 -0700 Subject: [PATCH 0369/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205856331 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 157242b12e3..e4df0d07969 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f8ed3e3de03c9598fb67a6923ce22eb292f57dfaae0aaf3bfda5a078c5cc4eba", - git_commit = "1b33df1814e35015953c7cba392ba2a7387ce875", + sha256 = "37884b08f60d98f26b8c671d430ebd7e90555d4543fddc1430575b6e71c50caf", + git_commit = "a45ffbd9b5c7d8fdaae6e41432f916639bdbe305", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4d16ddda7e2454b583a24b1279d711895ad47109 Mon Sep 17 00:00:00 2001 From: olston Date: Tue, 24 Jul 2018 12:02:46 -0700 Subject: [PATCH 0370/8103] Have the Model Server interpret specific hard-coded model version labels "stable" and "canary" as the smallest and largest version#, respectively. PiperOrigin-RevId: 205867960 --- tensorflow_serving/core/basic_manager.cc | 37 ++++++-- tensorflow_serving/core/basic_manager_test.cc | 9 ++ tensorflow_serving/core/caching_manager.cc | 11 ++- tensorflow_serving/core/caching_manager.h | 11 ++- .../core/caching_manager_test.cc | 78 ++++++++++++++-- tensorflow_serving/core/manager.h | 49 ++++++++-- .../model_servers/server_core.cc | 35 ++++++-- .../model_servers/server_core.h | 15 +++- .../model_servers/server_core_test.cc | 89 +++++++++++++++++++ .../test_util/server_core_test_util.cc | 3 + 10 files changed, 302 insertions(+), 35 deletions(-) diff --git a/tensorflow_serving/core/basic_manager.cc b/tensorflow_serving/core/basic_manager.cc index 523f2b3c441..95a5cb964e1 100644 --- a/tensorflow_serving/core/basic_manager.cc +++ b/tensorflow_serving/core/basic_manager.cc @@ -60,9 +60,12 @@ struct BasicManager::ServingMap::EqRequest { if (lhs.version != rhs.version) { return false; } - // Even if there is a small probability that version checking can eliminate - // string checking, we should do that since O(string_equality) >> - // O(version_equality) + if (lhs.auto_version_policy != rhs.auto_version_policy) { + return false; + } + // Even if there is a small probability that version & policy checking can + // eliminate string checking, we should do that since O(string_equality) >> + // O(version_equality) + O(policy_equality). if (lhs.name != rhs.name) { return false; } @@ -87,7 +90,12 @@ struct BasicManager::ServingMap::HashRequest { return std::hash()(request.version.value()) * 0x9E3779B97F4A7C13; // (sqrt(5) - 1)/2 as a binary fraction. } else { - return 0xDECAFCAFFE; + switch (request.auto_version_policy) { + case ServableRequest::AutoVersionPolicy::kEarliest: + return 0x01234CAFFE; + case ServableRequest::AutoVersionPolicy::kLatest: + return 0xDECAFCAFFE; + } } }(); // Using version_hash as the seed here to combine the hashes. @@ -141,8 +149,8 @@ BasicManager::ServingMap::GetAvailableUntypedServableHandles() const { std::shared_ptr handles_map = handles_map_.get(); for (const auto& handle : *handles_map) { const ServableRequest& request = handle.first; - // If the entry is the one for the latest request, skip it. We would already - // get it from the entry which has the specific request. + // If the entry is one of the auto-versioned request ones, skip it. We would + // already get it from the entry which has the specific request. if (!request.version) { continue; } @@ -180,12 +188,23 @@ void BasicManager::ServingMap::Update(const ManagedMap& managed_map) { } std::unique_ptr new_handles_map(new HandlesMap()); + auto prev_iter = sorted_available_map.end(); for (auto iter = sorted_available_map.begin(); iter != sorted_available_map.end(); ++iter) { std::shared_ptr harness = iter->second; new_handles_map->emplace(ServableRequest::FromId(harness->id()), harness); - // If this is the last harness in the stream, add it again to the - // handles_map, marking it as the latest for that stream. + + // If this is the first harness in the stream for a given servable name, add + // it again to the handles_map, marking it as the earliest for that stream. + if (prev_iter == sorted_available_map.end() || + prev_iter->second->id().name != harness->id().name) { + const ServableRequest earliest_request = + ServableRequest::Earliest(harness->id().name); + new_handles_map->emplace(earliest_request, harness); + } + + // If this is the last harness in the stream for a given servable name, add + // it again to the handles_map, marking it as the latest for that stream. const auto next_iter = std::next(iter); if (next_iter == sorted_available_map.end() || next_iter->second->id().name != harness->id().name) { @@ -193,6 +212,8 @@ void BasicManager::ServingMap::Update(const ManagedMap& managed_map) { ServableRequest::Latest(harness->id().name); new_handles_map->emplace(latest_request, harness); } + + prev_iter = iter; } // This blocks until the last handle given out by the old handles map is diff --git a/tensorflow_serving/core/basic_manager_test.cc b/tensorflow_serving/core/basic_manager_test.cc index 23708c18f0b..0c3630a677d 100644 --- a/tensorflow_serving/core/basic_manager_test.cc +++ b/tensorflow_serving/core/basic_manager_test.cc @@ -150,6 +150,15 @@ TEST_P(BasicManagerTest, ServableHandleNotFoundMissingVersion) { EXPECT_EQ(error::NOT_FOUND, status.code()); } +TEST_P(BasicManagerTest, ServableHandleEarliest) { + ASSERT_GT(kNumVersionsPerServable, 1); + ServableHandle handle; + const Status status = basic_manager_->GetServableHandle( + ServableRequest::Earliest(kServableName), &handle); + TF_ASSERT_OK(status); + EXPECT_EQ(1, *handle); +} + TEST_P(BasicManagerTest, ServableHandleLatest) { const ServableId id = {kServableName, kNumVersionsPerServable + 1}; TF_ASSERT_OK(basic_manager_->ManageServable(CreateServable(id))); diff --git a/tensorflow_serving/core/caching_manager.cc b/tensorflow_serving/core/caching_manager.cc index 3856c50ba7b..e69ad18ccef 100644 --- a/tensorflow_serving/core/caching_manager.cc +++ b/tensorflow_serving/core/caching_manager.cc @@ -68,8 +68,10 @@ Status CachingManager::GetUntypedServableHandle( } // Since there is no explicit version in the request, get the latest from the // loader-factory. - const int64 latest_version = loader_factory_->GetLatestVersion(request.name); - return GetUntypedServableHandleForId({request.name, latest_version}, handle); + const int64 policy_dictated_version = loader_factory_->GetServableVersion( + request.name, request.auto_version_policy); + return GetUntypedServableHandleForId({request.name, policy_dictated_version}, + handle); } Status CachingManager::GetUntypedServableHandleForId( @@ -211,8 +213,9 @@ ServableData> PathPrefixLoaderFactory::CreateLoader( return adapter_->AdaptOneVersion({id, servable_path}); } -int64 PathPrefixLoaderFactory::GetLatestVersion( - const string& servable_name) const { +int64 PathPrefixLoaderFactory::GetServableVersion( + const string& servable_name, + ServableRequest::AutoVersionPolicy policy) const { return 0; } diff --git a/tensorflow_serving/core/caching_manager.h b/tensorflow_serving/core/caching_manager.h index eef6dd09483..c387ef0483d 100644 --- a/tensorflow_serving/core/caching_manager.h +++ b/tensorflow_serving/core/caching_manager.h @@ -90,8 +90,11 @@ class CachingManager : public Manager { virtual ServableData> CreateLoader( const ServableId& servable_id) = 0; - /// Returns the latest version corresponding to the servable name. - virtual int64 GetLatestVersion(const string& servable_name) const = 0; + /// Returns a version corresponding to the servable name, for the given + /// policy. + virtual int64 GetServableVersion( + const string& servable_name, + ServableRequest::AutoVersionPolicy policy) const = 0; }; static Status Create(Options options, @@ -170,7 +173,9 @@ class PathPrefixLoaderFactory : public CachingManager::LoaderFactory { ServableData> CreateLoader( const ServableId& id) override; - int64 GetLatestVersion(const string& servable_name) const override; + int64 GetServableVersion( + const string& servable_name, + ServableRequest::AutoVersionPolicy policy) const override; private: // The prefix of the path to the servables. diff --git a/tensorflow_serving/core/caching_manager_test.cc b/tensorflow_serving/core/caching_manager_test.cc index 4126a36b35b..b59cd27a88c 100644 --- a/tensorflow_serving/core/caching_manager_test.cc +++ b/tensorflow_serving/core/caching_manager_test.cc @@ -71,11 +71,23 @@ class StringLoaderFactory : public CachingManager::LoaderFactory { return ServableData>(id, std::move(loader)); } - // Returns the latest version corresponding to the servable name. - int64 GetLatestVersion(const string& request_name) const override { - // Increment the current latest version until a maximum of 42. + // Returns the earliest/latest version corresponding to the servable name. + int64 GetServableVersion( + const string& request_name, + ServableRequest::AutoVersionPolicy policy) const override { mutex_lock l(mu_); - return latest_version_; + switch (policy) { + case ServableRequest::AutoVersionPolicy::kEarliest: + return earliest_version_; + case ServableRequest::AutoVersionPolicy::kLatest: + return latest_version_; + } + } + + // Update the earliest available version. + void set_earliest_version(int64 version) { + mutex_lock l(mu_); + earliest_version_ = version; } // Update the latest available version. @@ -91,9 +103,12 @@ class StringLoaderFactory : public CachingManager::LoaderFactory { } private: - // Used to protect updates to the latest_version_. + // Used to protect updates to 'earliest_version_' and 'latest_version_'. mutable mutex mu_; + // The current earliest version. + int64 earliest_version_ GUARDED_BY(mu_) = 0; + // The current latest version. int64 latest_version_ GUARDED_BY(mu_) = 0; @@ -121,8 +136,10 @@ class ErrorLoaderFactory : public CachingManager::LoaderFactory { return ServableData>(id, std::move(loader)); } - int64 GetLatestVersion(const string& request_name) const override { - // A simple "latest" interpretation that always returns version 42. + int64 GetServableVersion( + const string& request_name, + ServableRequest::AutoVersionPolicy policy) const override { + // A simple policy interpretation that always returns version 42. return 42; } @@ -239,6 +256,18 @@ TEST_P(CachingManagerTest, ServableHandleMultipleRequests) { } } +// Tests functionality when the version corresponding to the "earliest" needs to +// be newly managed and loaded by the manager. +TEST_P(CachingManagerTest, ServableHandleSingleRequestEarliest) { + string_loader_factory_->set_earliest_version(30); + ServableHandle handle; + TF_ASSERT_OK(manager_->GetServableHandle( + ServableRequest::Earliest({kServableName}), &handle)); + EXPECT_EQ("kServableName-30", *handle); + const ServableId id = {kServableName, 30}; + EXPECT_EQ(id, handle.id()); +} + // Tests functionality when the version corresponding to the "latest" needs to // be newly managed and loaded by the manager. TEST_P(CachingManagerTest, ServableHandleSingleRequestLatest) { @@ -251,6 +280,36 @@ TEST_P(CachingManagerTest, ServableHandleSingleRequestLatest) { EXPECT_EQ(id, handle.id()); } +// Tests functionality when the version corresponding to the "earliest" is +// already managed and loaded by the caching-manager. +TEST_P(CachingManagerTest, ServableHandleMultipleRequestsEarliest) { + const ServableId id = {kServableName, 42}; + { + // Make an explicit request for version 42. + ServableHandle handle; + TF_ASSERT_OK( + manager_->GetServableHandle(ServableRequest::FromId(id), &handle)); + EXPECT_EQ("kServableName-42", *handle); + EXPECT_EQ(id, handle.id()); + // We expect a new loader to be created for this request. + EXPECT_EQ(1, string_loader_factory_->num_loaders_dispensed()); + // Update the earliest available version. + string_loader_factory_->set_earliest_version(42); + } + { + // Now request for the earliest. The returned handle should have an id + // corresponding to version 42. + ServableHandle handle; + TF_ASSERT_OK(manager_->GetServableHandle( + ServableRequest::Earliest({kServableName}), &handle)); + EXPECT_EQ("kServableName-42", *handle); + EXPECT_EQ(id, handle.id()); + // We do not expect a new loader to be created for this request, since it is + // identical to the previous request. + EXPECT_EQ(1, string_loader_factory_->num_loaders_dispensed()); + } +} + // Tests functionality when the version corresponding to the "latest" is // already managed and loaded by the caching-manager. TEST_P(CachingManagerTest, ServableHandleMultipleRequestsLatest) { @@ -533,7 +592,10 @@ TEST(PathPrefixLoaderFactoryTest, Basic) { TF_ASSERT_OK(loader->Load()); EXPECT_EQ("prefix/servable_name/suffix", *loader->servable().get()); - EXPECT_EQ(0, factory.GetLatestVersion("blah")); + EXPECT_EQ(0, factory.GetServableVersion( + "blah", ServableRequest::AutoVersionPolicy::kEarliest)); + EXPECT_EQ(0, factory.GetServableVersion( + "blah", ServableRequest::AutoVersionPolicy::kLatest)); } TEST(PathPrefixLoaderFactoryTest, VersionOtherThanZeroYieldsError) { diff --git a/tensorflow_serving/core/manager.h b/tensorflow_serving/core/manager.h index 4436818bf91..9622f4207d3 100644 --- a/tensorflow_serving/core/manager.h +++ b/tensorflow_serving/core/manager.h @@ -34,22 +34,41 @@ namespace tensorflow { namespace serving { /// A query for a specific loaded servable object. The request can either -/// specify a specific version number, or simply opt to use the latest loaded -/// version. +/// specify a specific version number, or simply opt to use the earliest or +/// latest loaded version. struct ServableRequest { // Initialization factories, for convenience and readability. static ServableRequest Specific(const string& name, const int64 version); + static ServableRequest Earliest(const string& name); static ServableRequest Latest(const string& name); static ServableRequest FromId(const ServableId& id); // The name of a servable stream. string name; - // The version number to use. If unset, the largest loaded version is used. + // An optional specific version number to use. optional version; + // How to choose a version number automatically, if 'version' is left unset. + enum class AutoVersionPolicy { + // Choose the loaded version with the smallest version number. + kEarliest, + + // Choose the loaded version with the largest version number. + kLatest, + }; + AutoVersionPolicy auto_version_policy = AutoVersionPolicy::kLatest; + // Emits a string representation; for logging and debugging use only. string DebugString() const; + + //////// + // Legacy constructors. Do not use in new code. + ServableRequest() = default; + ServableRequest(const string& name_in, const optional& version_in) + : name(name_in), + version(version_in), + auto_version_policy(AutoVersionPolicy::kLatest) {} }; /// Manager is responsible for loading, unloading, lookup and lifetime @@ -102,11 +121,24 @@ class Manager { inline ServableRequest ServableRequest::Specific(const string& name, const int64 version) { - return ServableRequest{name, version}; + ServableRequest request; + request.name = name; + request.version = version; + return request; +} + +inline ServableRequest ServableRequest::Earliest(const string& name) { + ServableRequest request; + request.name = name; + request.auto_version_policy = AutoVersionPolicy::kEarliest; + return request; } inline ServableRequest ServableRequest::Latest(const string& name) { - return ServableRequest{name, nullopt}; + ServableRequest request; + request.name = name; + request.auto_version_policy = AutoVersionPolicy::kLatest; + return request; } inline ServableRequest ServableRequest::FromId(const ServableId& id) { @@ -118,7 +150,12 @@ inline string ServableRequest::DebugString() const { if (version) { return strings::StrCat("Specific(", name, ", ", version.value(), ")"); } else { - return strings::StrCat("Latest(", name, ")"); + switch (auto_version_policy) { + case AutoVersionPolicy::kEarliest: + return strings::StrCat("Earliest(", name, ")"); + case AutoVersionPolicy::kLatest: + return strings::StrCat("Latest(", name, ")"); + } } } diff --git a/tensorflow_serving/model_servers/server_core.cc b/tensorflow_serving/model_servers/server_core.cc index 131d76cede6..94f90387cf0 100644 --- a/tensorflow_serving/model_servers/server_core.cc +++ b/tensorflow_serving/model_servers/server_core.cc @@ -217,6 +217,9 @@ Status UpdateModelConfigListRelativePaths( } // namespace +constexpr char ServerCore::kStableVersionLabel[]; +constexpr char ServerCore::kCanaryVersionLabel[]; + // ************************************************************************ // Public Methods. // ************************************************************************ @@ -693,11 +696,33 @@ Status ServerCore::ServableRequestFromModelSpec( if (model_spec.name().empty()) { return errors::InvalidArgument("ModelSpec has no name specified."); } - if (model_spec.has_version()) { - *servable_request = ServableRequest::Specific(model_spec.name(), - model_spec.version().value()); - } else { - *servable_request = ServableRequest::Latest(model_spec.name()); + + switch (model_spec.version_choice_case()) { + case ModelSpec::kVersion: { + *servable_request = ServableRequest::Specific( + model_spec.name(), model_spec.version().value()); + break; + } + case ModelSpec::kVersionLabel: { + if (!options_.allow_version_labels) { + return errors::InvalidArgument( + "ModelSpec has 'version_label' set, but it is not currently " + "allowed by the server."); + } + if (model_spec.version_label() == kStableVersionLabel) { + *servable_request = ServableRequest::Earliest(model_spec.name()); + } else if (model_spec.version_label() == kCanaryVersionLabel) { + *servable_request = ServableRequest::Latest(model_spec.name()); + } else { + return errors::InvalidArgument(strings::StrCat( + "Unrecognized version label: ", model_spec.version_label())); + } + break; + } + case ModelSpec::VERSION_CHOICE_NOT_SET: { + *servable_request = ServableRequest::Latest(model_spec.name()); + break; + } } return Status::OK(); } diff --git a/tensorflow_serving/model_servers/server_core.h b/tensorflow_serving/model_servers/server_core.h index 419f9744a50..df864fddfa5 100644 --- a/tensorflow_serving/model_servers/server_core.h +++ b/tensorflow_serving/model_servers/server_core.h @@ -140,6 +140,11 @@ class ServerCore : public Manager { // adapters to the manager. CustomModelConfigLoader custom_model_config_loader; + // Whether to permit incoming ModelSpec requests to use the 'version_label' + // field. + // TODO(b/65245500): Flip the default to true. + bool allow_version_labels = false; + // Logger used for logging requests hitting the server. std::unique_ptr server_request_logger; @@ -182,13 +187,21 @@ class ServerCore : public Manager { return servable_state_monitor_.get(); } - /// Returns a ServableHandle given a ServableRequest. Returns error if no such + // Model version labels ServerCore recognizes. + static constexpr char kStableVersionLabel[] = "stable"; + static constexpr char kCanaryVersionLabel[] = "canary"; + + /// Returns a ServableHandle given a ModelSpec. Returns error if no such /// Servable is available -- e.g. not yet loaded, has been quiesced/unloaded, /// etc. Callers may assume that an OK status indicates a non-null handle. /// /// IMPORTANT: The caller should only hold on to a handle for a short time, /// for example for the duration of a single request. Holding a handle for a /// long period of time will prevent servable loading and unloading. + /// + /// If 'options_.allow_version_labels==true', recognizes two specific model + /// version labels -- "stable" and "canary" -- and resolves them to the + /// smallest and largest available version, respectively. template Status GetServableHandle(const ModelSpec& model_spec, ServableHandle* const handle) { diff --git a/tensorflow_serving/model_servers/server_core_test.cc b/tensorflow_serving/model_servers/server_core_test.cc index 20605d8c3cd..5e1430a8076 100644 --- a/tensorflow_serving/model_servers/server_core_test.cc +++ b/tensorflow_serving/model_servers/server_core_test.cc @@ -635,6 +635,95 @@ TEST_P(ServerCoreTest, RequestLoggingOn) { EXPECT_EQ(1, log_collector_map[test_util::kTestModelName]->collect_count()); } +TEST_P(ServerCoreTest, ModelSpecMultipleVersionsAvailable) { + ModelServerConfig two_version_config = + GetTestModelServerConfigForFakePlatform(); + SwitchToHalfPlusTwoWith2Versions(&two_version_config); + ServerCore::Options server_core_options = GetDefaultOptions(); + server_core_options.allow_version_labels = true; + std::unique_ptr server_core; + TF_ASSERT_OK(CreateServerCore(two_version_config, + std::move(server_core_options), &server_core)); + + // Wait until both versions of the servable have been loaded. + for (const int64 version : + {test_util::kTestModelVersion, test_util::kTestModelLargerVersion}) { + const auto servable_id = ServableId{test_util::kTestModelName, version}; + test_util::WaitUntilServableManagerStateIsOneOf( + *server_core->servable_state_monitor(), servable_id, + {ServableState::ManagerState::kAvailable}); + } + + // Do not specify any version number; we should be given the latest version. + { + ModelSpec model_spec; + model_spec.set_name(test_util::kTestModelName); + ServableHandle servable_handle; + TF_ASSERT_OK( + server_core->GetServableHandle(model_spec, &servable_handle)); + EXPECT_EQ( + (ServableId{test_util::kTestModelName, + test_util::kTestModelLargerVersion /* larger version */}), + servable_handle.id()); + } + + // Use ModelSpec::version to request a specific version number. + { + ModelSpec model_spec; + model_spec.set_name(test_util::kTestModelName); + model_spec.mutable_version()->set_value(test_util::kTestModelVersion); + ServableHandle servable_handle; + TF_ASSERT_OK( + server_core->GetServableHandle(model_spec, &servable_handle)); + EXPECT_EQ( + (ServableId{test_util::kTestModelName, test_util::kTestModelVersion}), + servable_handle.id()); + } + + // Use ModelSpec::version_label to request the version labeled "stable". + { + ModelSpec model_spec; + model_spec.set_name(test_util::kTestModelName); + model_spec.set_version_label(ServerCore::kStableVersionLabel); + ServableHandle servable_handle; + TF_ASSERT_OK( + server_core->GetServableHandle(model_spec, &servable_handle)); + EXPECT_EQ((ServableId{test_util::kTestModelName, + test_util::kTestModelVersion /* smaller version */}), + servable_handle.id()); + } + + // Use ModelSpec::version_label to request the version labeled "canary". + { + ModelSpec model_spec; + model_spec.set_name(test_util::kTestModelName); + model_spec.set_version_label(ServerCore::kCanaryVersionLabel); + ServableHandle servable_handle; + TF_ASSERT_OK( + server_core->GetServableHandle(model_spec, &servable_handle)); + EXPECT_EQ( + (ServableId{test_util::kTestModelName, + test_util::kTestModelLargerVersion /* larger version */}), + servable_handle.id()); + } +} + +TEST_P(ServerCoreTest, ModelSpecVersionLabelsNotAllowed) { + ServerCore::Options server_core_options = GetDefaultOptions(); + server_core_options.allow_version_labels = false; + std::unique_ptr server_core; + TF_ASSERT_OK(CreateServerCore(GetTestModelServerConfigForFakePlatform(), + std::move(server_core_options), &server_core)); + + ModelSpec model_spec; + model_spec.set_name(test_util::kTestModelName); + model_spec.set_version_label(ServerCore::kStableVersionLabel); + ServableHandle servable_handle; + EXPECT_FALSE( + server_core->GetServableHandle(model_spec, &servable_handle) + .ok()); +} + INSTANTIATE_TEST_CASE_P( TestType, ServerCoreTest, ::testing::Combine( diff --git a/tensorflow_serving/model_servers/test_util/server_core_test_util.cc b/tensorflow_serving/model_servers/test_util/server_core_test_util.cc index 464b5e02ba5..ddb19f6cf66 100644 --- a/tensorflow_serving/model_servers/test_util/server_core_test_util.cc +++ b/tensorflow_serving/model_servers/test_util/server_core_test_util.cc @@ -116,6 +116,9 @@ void ServerCoreTest::SwitchToHalfPlusTwoWith2Versions( auto model = config->mutable_model_config_list()->mutable_config(0); model->set_base_path(test_util::TestSrcDirPath( "/servables/tensorflow/testdata/half_plus_two_2_versions")); + // Request loading both versions simultaneously. + model->clear_model_version_policy(); + model->mutable_model_version_policy()->mutable_all(); if (PrefixPathsWithURIScheme()) { model->set_base_path(io::CreateURI("file", "", model->base_path())); } From f6a30bc6844b8ae3459859d3368fefc246286348 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 24 Jul 2018 13:03:32 -0700 Subject: [PATCH 0371/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205877470 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e4df0d07969..b2808a94699 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "37884b08f60d98f26b8c671d430ebd7e90555d4543fddc1430575b6e71c50caf", - git_commit = "a45ffbd9b5c7d8fdaae6e41432f916639bdbe305", + sha256 = "84dfd9c48eec30c24d4a9561b67ea6fe079569943dadbb4a6a4f0306f1177f16", + git_commit = "eb1ee5a245327b509dfb929d2dbbef90cd3299a5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 54850adf4f4f0e4a032662682fce433e283862c6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 24 Jul 2018 14:01:22 -0700 Subject: [PATCH 0372/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205887165 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b2808a94699..0d70de6eff7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "84dfd9c48eec30c24d4a9561b67ea6fe079569943dadbb4a6a4f0306f1177f16", - git_commit = "eb1ee5a245327b509dfb929d2dbbef90cd3299a5", + sha256 = "0e6d548392de8ecb89cb8ff872df245611f4047e5579867052fc678680038722", + git_commit = "e2f8d4a8bdfc4e3970cacc89a6b184297205a1cc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f4656b8966471a72dd1b4b929d1dc2b0f1310629 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 24 Jul 2018 15:01:13 -0700 Subject: [PATCH 0373/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205897670 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0d70de6eff7..b21d47a88c7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0e6d548392de8ecb89cb8ff872df245611f4047e5579867052fc678680038722", - git_commit = "e2f8d4a8bdfc4e3970cacc89a6b184297205a1cc", + sha256 = "8479628d7a9b911a494c876669ff9ec95222523f92bed4e168867204a1d9a2c3", + git_commit = "76e8f7b7fdf89b131e0406022129d5dde6b89e40", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 848ad0835ddf295b91319ca0258829b14df153f6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 24 Jul 2018 16:01:28 -0700 Subject: [PATCH 0374/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205907576 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b21d47a88c7..c259100ab4c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8479628d7a9b911a494c876669ff9ec95222523f92bed4e168867204a1d9a2c3", - git_commit = "76e8f7b7fdf89b131e0406022129d5dde6b89e40", + sha256 = "80bf4de62d874d4a0fc8bec9e725dcd242a8ed84fd80f7baf1702033aae07ea2", + git_commit = "779b789cc02ba1466da46158359c3132ef04c3ab", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c88634ccbb12c421ad555e0015e4d85c90a7a79a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 24 Jul 2018 17:03:56 -0700 Subject: [PATCH 0375/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205916808 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c259100ab4c..52984688b81 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "80bf4de62d874d4a0fc8bec9e725dcd242a8ed84fd80f7baf1702033aae07ea2", - git_commit = "779b789cc02ba1466da46158359c3132ef04c3ab", + sha256 = "58fea3d8d4736cc09e685c18051618121237e1df35a021d050a312ebfc24aa78", + git_commit = "55c5f1289845649ee6e13bd90bc51e113f74c143", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 50fd34bdf644f95fee95996f10aa98de955315f9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 24 Jul 2018 18:00:59 -0700 Subject: [PATCH 0376/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205923644 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 52984688b81..6bb1896814c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "58fea3d8d4736cc09e685c18051618121237e1df35a021d050a312ebfc24aa78", - git_commit = "55c5f1289845649ee6e13bd90bc51e113f74c143", + sha256 = "e7a8a7cc4297c6260f66c4396e147f2e7913b38babed0e9daa673cc3fa42a116", + git_commit = "4c161d7306eb934232e3fe65de2c31c3bb7cf875", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 39dcdd2aab78a0c07419518ea42fe45cbcc00431 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 24 Jul 2018 19:01:12 -0700 Subject: [PATCH 0377/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205928984 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6bb1896814c..beb34587ed3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e7a8a7cc4297c6260f66c4396e147f2e7913b38babed0e9daa673cc3fa42a116", - git_commit = "4c161d7306eb934232e3fe65de2c31c3bb7cf875", + sha256 = "b0ee12b60b7de9160a5b29cc13e3fee2f724834613be769fe00a0b4ecc1932f5", + git_commit = "d2f3441c0c3d552293f5c64784261e267653484b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7a21fa5207fcca9d9ea231b06e3124c9770f1cf4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 24 Jul 2018 20:02:16 -0700 Subject: [PATCH 0378/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205933293 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index beb34587ed3..f5337b4a142 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b0ee12b60b7de9160a5b29cc13e3fee2f724834613be769fe00a0b4ecc1932f5", - git_commit = "d2f3441c0c3d552293f5c64784261e267653484b", + sha256 = "ac6174442ae2fa5c8ea6f956f3693e0c1652bf8d9d4fa692245f534171923285", + git_commit = "a5a4bb31c43bfef94bf8998ce07766f1597a7a02", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 003916f733cd1f0481aacd13bc11db26ea811d63 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 24 Jul 2018 23:01:39 -0700 Subject: [PATCH 0379/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205945306 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f5337b4a142..bc57957de88 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ac6174442ae2fa5c8ea6f956f3693e0c1652bf8d9d4fa692245f534171923285", - git_commit = "a5a4bb31c43bfef94bf8998ce07766f1597a7a02", + sha256 = "dd7e71d59e4e38ecda50de9f57e5e38b67f08fcf298d223e11ecf4e86a713b7c", + git_commit = "3f454e4060d855f43eebe0cdc27d8c24f906d430", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6d77d12ad26d0c603b5ab6d848e89ef296c872bb Mon Sep 17 00:00:00 2001 From: Burkhard Neidecker-Lutz Date: Wed, 25 Jul 2018 09:37:21 +0200 Subject: [PATCH 0380/8103] Coding style cleanups for secure channel --- tensorflow_serving/model_servers/main.cc | 34 ++++++++++++------------ 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index 32615381a25..c3bc95ddbeb 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -367,29 +367,29 @@ std::shared_ptr BuildServerCredentialsFromSSLConfigFile { if (ssl_config_file.empty()) { return InsecureServerCredentials(); - } else { - SSLConfig ssl_config = ParseSSLConfig(ssl_config_file); + } - grpc::SslServerCredentialsOptions sslOps(ssl_config.client_verify() ? - GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY: - GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE); + SSLConfig ssl_config = ParseSSLConfig(ssl_config_file); - sslOps.force_client_auth = ssl_config.client_verify(); + grpc::SslServerCredentialsOptions ssl_ops(ssl_config.client_verify() ? + GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY: + GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE); - if (ssl_config.custom_ca().size() > 0) { - sslOps.pem_root_certs = ssl_config.custom_ca(); - } + ssl_ops.force_client_auth = ssl_config.client_verify(); - grpc::SslServerCredentialsOptions::PemKeyCertPair keycert = - { - ssl_config.server_key(), - ssl_config.server_cert() - }; + if (ssl_config.custom_ca().size() > 0) { + ssl_ops.pem_root_certs = ssl_config.custom_ca(); + } - sslOps.pem_key_cert_pairs.push_back(keycert); + grpc::SslServerCredentialsOptions::PemKeyCertPair keycert = + { + ssl_config.server_key(), + ssl_config.server_cert() + }; - return grpc::SslServerCredentials(sslOps); - } + ssl_ops.pem_key_cert_pairs.push_back(keycert); + + return grpc::SslServerCredentials(ssl_ops); } } // namespace From 2a8347a9ca025125487574d651f04b9d9545ed30 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 25 Jul 2018 08:02:06 -0700 Subject: [PATCH 0381/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 205993667 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bc57957de88..cdffea0d5fc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dd7e71d59e4e38ecda50de9f57e5e38b67f08fcf298d223e11ecf4e86a713b7c", - git_commit = "3f454e4060d855f43eebe0cdc27d8c24f906d430", + sha256 = "6e61348768039af9c397b8583721375b2e28e7fc4e601747d8c6e404935b3af5", + git_commit = "2952ff32b21332e9a01cd522bc6e38fd7af55ce6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From cb809198a56deeb2a65b14240c44a2ff49218cea Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 25 Jul 2018 09:03:22 -0700 Subject: [PATCH 0382/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206001322 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cdffea0d5fc..df741899ce0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6e61348768039af9c397b8583721375b2e28e7fc4e601747d8c6e404935b3af5", - git_commit = "2952ff32b21332e9a01cd522bc6e38fd7af55ce6", + sha256 = "42a739171b36bc824649e14607a738a21f7c3b7dead4f6da7920b72e6f1473ce", + git_commit = "b3771feab49e2122164737a860341727d08c2d8c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 45e27e12652bcf826fe7452b62b794ca0bfc3ced Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 25 Jul 2018 11:01:56 -0700 Subject: [PATCH 0383/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206020807 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index df741899ce0..26212e62921 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "42a739171b36bc824649e14607a738a21f7c3b7dead4f6da7920b72e6f1473ce", - git_commit = "b3771feab49e2122164737a860341727d08c2d8c", + sha256 = "08e4835e3f40031a63316584b921b08e6a2051fd99940c93a748572c44502baa", + git_commit = "0ff2abfaf7f418d0547eaa0cf9ee0a32b32fb490", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 42d02a9024652cb434afbfcf71d1eb6756ef72df Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 25 Jul 2018 12:09:52 -0700 Subject: [PATCH 0384/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206033183 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 26212e62921..2f9101e353c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "08e4835e3f40031a63316584b921b08e6a2051fd99940c93a748572c44502baa", - git_commit = "0ff2abfaf7f418d0547eaa0cf9ee0a32b32fb490", + sha256 = "72f2b1f89b06948d2feb6180acbe599c6768d767a1c0304f188cc21dd70dc6fd", + git_commit = "8c6782ec4ed12dcdda1fdf8cb45ba8afbf62a61f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7daeea3a8e2197c54d752663ed7b001654cdfad3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 25 Jul 2018 13:01:29 -0700 Subject: [PATCH 0385/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206040484 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2f9101e353c..46999a3848f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "72f2b1f89b06948d2feb6180acbe599c6768d767a1c0304f188cc21dd70dc6fd", - git_commit = "8c6782ec4ed12dcdda1fdf8cb45ba8afbf62a61f", + sha256 = "247f0f1a93809ab470208c5687c5fc4657c3a0e9f1e14ae612ccfe2f45d705e7", + git_commit = "c46418aa28d754cce838a12a10a29e1b87328ed0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ce382aeb104b5ed61e9ee8a1c452fe32be357dd0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 25 Jul 2018 14:02:18 -0700 Subject: [PATCH 0386/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206050619 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 46999a3848f..d0648239f17 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "247f0f1a93809ab470208c5687c5fc4657c3a0e9f1e14ae612ccfe2f45d705e7", - git_commit = "c46418aa28d754cce838a12a10a29e1b87328ed0", + sha256 = "23219ac6f5c947e14a5d1c18cbdc14b54294f23bbf17c2c6fca2abe08ee6416c", + git_commit = "856e2bf7af3ae28a93ede51423c368f7b7e04c8a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4cbac38c307ea11527d0e45a3b18fd41f1b67601 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Wed, 25 Jul 2018 14:03:45 -0700 Subject: [PATCH 0387/8103] Update docker files PiperOrigin-RevId: 206050867 --- .../tools/docker/Dockerfile.devel | 12 ++-- .../tools/docker/Dockerfile.devel-gpu | 57 +++++++++++-------- 2 files changed, 38 insertions(+), 31 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index eb09b96511c..c752ff30f93 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -25,33 +25,31 @@ RUN apt-get update && apt-get install -y \ build-essential \ curl \ git \ + libcurl3-dev \ libfreetype6-dev \ libpng12-dev \ libtool \ libzmq3-dev \ mlocate \ + openjdk-8-jdk\ + openjdk-8-jre-headless \ pkg-config \ python-dev \ python-numpy \ python-pip \ software-properties-common \ swig \ + wget \ zip \ zlib1g-dev \ - libcurl3-dev \ - openjdk-8-jdk\ - openjdk-8-jre-headless \ - wget \ && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* # Set up grpc - RUN pip install mock grpcio -# Set up Bazel. - +# Set up Bazel # Need >= 0.15.0 so bazel compiles work with docker bind mounts. ENV BAZEL_VERSION 0.15.0 WORKDIR / diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index c2539aabb46..a8c1d54ca8a 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -11,7 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -FROM nvidia/cuda:9.0-cudnn7-devel-ubuntu16.04 +FROM nvidia/cuda:9.0-base-ubuntu16.04 ARG TF_SERVING_VERSION_GIT_BRANCH=master ARG TF_SERVING_VERSION_GIT_COMMIT=head @@ -20,44 +20,55 @@ LABEL maintainer=gvasudevan@google.com LABEL tensorflow_serving_github_branchtag=${TF_SERVING_VERSION_GIT_BRANCH} LABEL tensorflow_serving_github_commit=${TF_SERVING_VERSION_GIT_COMMIT} -# Install NCCL -ENV NCCL_VERSION=2.2.12-1+cuda9.0 -RUN echo "deb http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1604/x86_64 /" > /etc/apt/sources.list.d/nvidia-ml.list +ENV NCCL_VERSION=2.2.13 +ENV CUDNN_VERSION=7.1.4.18 -RUN apt-get update && apt-get install -y \ +RUN apt-get update && apt-get install -y --no-install-recommends \ automake \ build-essential \ + cuda-command-line-tools-9-0 \ + cuda-cublas-dev-9-0 \ + cuda-cudart-dev-9-0 \ + cuda-cufft-dev-9-0 \ + cuda-curand-dev-9-0 \ + cuda-cusolver-dev-9-0 \ + cuda-cusparse-dev-9-0 \ curl \ git \ libfreetype6-dev \ libpng12-dev \ libtool \ + libcudnn7=${CUDNN_VERSION}-1+cuda9.0 \ + libcudnn7-dev=${CUDNN_VERSION}-1+cuda9.0 \ + libcurl3-dev \ + libnccl2=${NCCL_VERSION}-1+cuda9.0 \ + libnccl-dev=${NCCL_VERSION}-1+cuda9.0 \ libzmq3-dev \ - libnccl2=${NCCL_VERSION} \ - libnccl-dev=${NCCL_VERSION} \ mlocate \ + openjdk-8-jdk\ + openjdk-8-jre-headless \ pkg-config \ python-dev \ python-numpy \ python-pip \ software-properties-common \ swig \ + unzip \ + wget \ zip \ zlib1g-dev \ - libcurl3-dev \ - openjdk-8-jdk\ - openjdk-8-jre-headless \ - wget \ && \ apt-get clean && \ - rm -rf /var/lib/apt/lists/* + rm -rf /var/lib/apt/lists/* && \ + find /usr/local/cuda-9.0/lib64/ -type f -name 'lib*_static.a' -not -name 'libcudart_static.a' -delete && \ + rm /usr/lib/x86_64-linux-gnu/libcudnn_static_v7.a # Set up grpc +RUN pip --no-cache-dir install \ + mock \ + grpcio -RUN pip install mock grpcio - -# Set up Bazel. - +# Set up Bazel # Need >= 0.15.0 so bazel compiles work with docker bind mounts. ENV BAZEL_VERSION 0.15.0 WORKDIR / @@ -79,27 +90,25 @@ ENV TF_CUDA_VERSION=9.0 ENV TF_CUDNN_VERSION=7 # Fix paths so that CUDNN can be found: https://github.com/tensorflow/tensorflow/issues/8264 - WORKDIR / RUN mkdir /usr/lib/x86_64-linux-gnu/include/ && \ ln -s /usr/lib/x86_64-linux-gnu/include/cudnn.h /usr/lib/x86_64-linux-gnu/include/cudnn.h && \ ln -s /usr/include/cudnn.h /usr/local/cuda/include/cudnn.h && \ ln -s /usr/lib/x86_64-linux-gnu/libcudnn.so /usr/local/cuda/lib64/libcudnn.so && \ - ln -s /usr/lib/x86_64-linux-gnu/libcudnn.so.$TF_CUDNN_VERSION /usr/local/cuda/lib64/libcudnn.so.$TF_CUDNN_VERSION + ln -s /usr/lib/x86_64-linux-gnu/libcudnn.so.${TF_CUDNN_VERSION} /usr/local/cuda/lib64/libcudnn.so.${TF_CUDNN_VERSION} - -# Fix paths so that NCCL can be found -ENV TF_NCCL_VERSION=2.2.12 +# NCCL 2.x +ENV TF_NCCL_VERSION=2 ENV NCCL_INSTALL_PATH=/usr/lib/nccl/ +# Fix paths so that NCCL can be found WORKDIR / RUN mkdir -p ${NCCL_INSTALL_PATH} && \ mkdir ${NCCL_INSTALL_PATH}include/ && \ mkdir ${NCCL_INSTALL_PATH}lib/ && \ ln -s /usr/include/nccl.h ${NCCL_INSTALL_PATH}include/nccl.h && \ ln -s /usr/lib/x86_64-linux-gnu/libnccl.so ${NCCL_INSTALL_PATH}lib/libnccl.so && \ - ln -s /usr/lib/x86_64-linux-gnu/libnccl.so.2 ${NCCL_INSTALL_PATH}lib/libnccl.so.2 && \ - ln -s /usr/lib/x86_64-linux-gnu/libnccl.so.$TF_NCCL_VERSION ${NCCL_INSTALL_PATH}lib/libnccl.so.$TF_NCCL_VERSION + ln -s /usr/lib/x86_64-linux-gnu/libnccl.so.${TF_NCCL_VERSION} ${NCCL_INSTALL_PATH}lib/libnccl.so.${TF_NCCL_VERSION} # Download TF Serving sources (optionally at specific commit). WORKDIR /tensorflow-serving @@ -120,4 +129,4 @@ RUN ln -s /usr/local/cuda/lib64/stubs/libcuda.so /usr/local/cuda/lib64/stubs/lib bazel clean --expunge --color=yes # Clean up Bazel cache when done. -CMD ["/bin/bash"] +CMD ["/bin/bash"] \ No newline at end of file From 1d8dbb77ed97ce9ef90d5eb044cb1dcbc1ce95a7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 25 Jul 2018 15:01:53 -0700 Subject: [PATCH 0388/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206061171 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d0648239f17..75e657e2a54 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "23219ac6f5c947e14a5d1c18cbdc14b54294f23bbf17c2c6fca2abe08ee6416c", - git_commit = "856e2bf7af3ae28a93ede51423c368f7b7e04c8a", + sha256 = "e3f3706d8452933ed2f8494418ba7bc5fc620661512c7fb042b4c7182e177901", + git_commit = "7bbd69fd16d4e97afd417786c1ee2fff27d92703", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e70b9a5b324bdb068e49887107720ff7ac384c96 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Wed, 25 Jul 2018 15:37:39 -0700 Subject: [PATCH 0389/8103] Internal change PiperOrigin-RevId: 206067181 --- .github/ISSUE_TEMPLATE/issue_template.md | 36 ++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/issue_template.md diff --git a/.github/ISSUE_TEMPLATE/issue_template.md b/.github/ISSUE_TEMPLATE/issue_template.md new file mode 100644 index 00000000000..eef94d2e145 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/issue_template.md @@ -0,0 +1,36 @@ +Please go to Stack Overflow for help and support: + +https://stackoverflow.com/questions/tagged/tensorflow-serving + +If you open a GitHub issue, here is our policy: + +1. It must be a bug, a feature request, or a significant problem with + documentation (for small docs fixes please send a PR instead). +2. The form below must be filled out. + +**Here's why we have that policy**: TensorFlow developers respond to issues. +We want to focus on work that benefits the whole community, e.g., fixing bugs +and adding features. Support only helps individuals. GitHub also notifies +thousands of people when issues are filed. We want them to see you communicating +an interesting problem, rather than being redirected to Stack Overflow. + +------------------------ + +### System information +- **OS Platform and Distribution (e.g., Linux Ubuntu 16.04)**: +- **TensorFlow Serving installed from (source or binary)**: +- **TensorFlow Serving version**: + +### Describe the problem +Describe the problem clearly here. Be sure to convey here why it's a bug in +TensorFlow Serving. + +### Exact Steps to Reproduce +Please include all steps necessary for someone to reproduce this issue on their +own machine. If not, skip this section. + +### Source code / logs +Include any logs or source code that would be helpful to diagnose the problem. +If including tracebacks, please include the full traceback. Large logs and files +should be attached. Try to provide a reproducible test case that is the bare +minimum necessary to generate the problem. From 555625e8138188fc6ebe6136baaa18571aeb7490 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 25 Jul 2018 16:02:29 -0700 Subject: [PATCH 0390/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206071146 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 75e657e2a54..6232e04d5b4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e3f3706d8452933ed2f8494418ba7bc5fc620661512c7fb042b4c7182e177901", - git_commit = "7bbd69fd16d4e97afd417786c1ee2fff27d92703", + sha256 = "07ac6636b4094aa6ceaecd569449b38138f483ea4ec958d02537be307023abe9", + git_commit = "89bcc80f1b62c5d87486f074b569a750336c24a1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 486e3174180540d7a4f301d178541d0c6ae76bb1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 25 Jul 2018 17:01:49 -0700 Subject: [PATCH 0391/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206080011 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6232e04d5b4..d9d41e1ab11 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "07ac6636b4094aa6ceaecd569449b38138f483ea4ec958d02537be307023abe9", - git_commit = "89bcc80f1b62c5d87486f074b569a750336c24a1", + sha256 = "5b10a4678c951b9b5d8f6c0fda4c54f460b9390f3a569473567039d834ddd29c", + git_commit = "7ff06d70e5fbe1f28034541a56b17a02f8735b20", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c90023aa4b53d7febc25d6ae76f7809af2492e4e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 25 Jul 2018 18:01:37 -0700 Subject: [PATCH 0392/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206087086 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d9d41e1ab11..b7c412dd575 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5b10a4678c951b9b5d8f6c0fda4c54f460b9390f3a569473567039d834ddd29c", - git_commit = "7ff06d70e5fbe1f28034541a56b17a02f8735b20", + sha256 = "439028b2b0b1915440cf93fb15f861568382895e2aaacd276a30bc7ff572c9f7", + git_commit = "773ee806ceb1feab77ac02f424814eb4ab503170", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 51e62016af0ffa68234e851fe43c27a4f0b055fc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 25 Jul 2018 19:03:41 -0700 Subject: [PATCH 0393/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206092767 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b7c412dd575..fd0cf4626ab 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "439028b2b0b1915440cf93fb15f861568382895e2aaacd276a30bc7ff572c9f7", - git_commit = "773ee806ceb1feab77ac02f424814eb4ab503170", + sha256 = "23d5ac1363bf4ad933a43ddbec9d4a2ba280a93d334344107e94dbefc659b820", + git_commit = "59305b118a9ed56d733b414e8ee1a272dc66466a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b4a83934e0988581724e546af138903ca58ab8c0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 25 Jul 2018 20:01:15 -0700 Subject: [PATCH 0394/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206096532 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fd0cf4626ab..b51585e3f05 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "23d5ac1363bf4ad933a43ddbec9d4a2ba280a93d334344107e94dbefc659b820", - git_commit = "59305b118a9ed56d733b414e8ee1a272dc66466a", + sha256 = "dba13c0048976b2762c6bc19c8f527d361ac50bfbbe7890539dca6f671277560", + git_commit = "5d92abe1e426b85ef549a8ce811628d708f7d914", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 074604f36fe1c2b8e8aa41b1c369ce9f4eb278a0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 25 Jul 2018 23:01:16 -0700 Subject: [PATCH 0395/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206108745 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b51585e3f05..15feebf33bc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dba13c0048976b2762c6bc19c8f527d361ac50bfbbe7890539dca6f671277560", - git_commit = "5d92abe1e426b85ef549a8ce811628d708f7d914", + sha256 = "a1af119dbec7cbf5ac8a74c91fe48061dd3f65b2e0f2e10d78df0cccf38a247a", + git_commit = "15b155e929f2eb3e30c1194fa9afc1ea40e330a4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 30c7c6a7ae3802d235ed75033bd5334eaad930a2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 26 Jul 2018 00:01:44 -0700 Subject: [PATCH 0396/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206112470 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 15feebf33bc..28b473efcf5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a1af119dbec7cbf5ac8a74c91fe48061dd3f65b2e0f2e10d78df0cccf38a247a", - git_commit = "15b155e929f2eb3e30c1194fa9afc1ea40e330a4", + sha256 = "d1e06319392764fd250eeb57abb2fc1df54bb410a9674b189e2819fffc29e0d1", + git_commit = "700a6698e634391cf96a314f378a8de973b49995", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e26d22b68dd1ee746ed1abfb73e5975e31c6d65e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 26 Jul 2018 01:02:02 -0700 Subject: [PATCH 0397/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206117470 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 28b473efcf5..bbf774b7094 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d1e06319392764fd250eeb57abb2fc1df54bb410a9674b189e2819fffc29e0d1", - git_commit = "700a6698e634391cf96a314f378a8de973b49995", + sha256 = "f536cd60feba26584beb768627a852101243993a913237d5ce92fa31fc126467", + git_commit = "33879661ed221167f3987bcc2fdc5298986d29fb", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 86dd328e8dd939cf761115a4e98b5f378d2c6d5c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 26 Jul 2018 02:03:39 -0700 Subject: [PATCH 0398/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206123644 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bbf774b7094..9d2d7996ae3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f536cd60feba26584beb768627a852101243993a913237d5ce92fa31fc126467", - git_commit = "33879661ed221167f3987bcc2fdc5298986d29fb", + sha256 = "c9c8615bc5478caad783aafeb1551f4a0f794d18128221668d882de37f78086c", + git_commit = "b1dc68e816e2bf6b8acd3651077c890f2f2f3b7b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5043c1a68ed4be139f0afd5c094b9ab756aa13fb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 26 Jul 2018 03:01:29 -0700 Subject: [PATCH 0399/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206129922 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9d2d7996ae3..b5533da378e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c9c8615bc5478caad783aafeb1551f4a0f794d18128221668d882de37f78086c", - git_commit = "b1dc68e816e2bf6b8acd3651077c890f2f2f3b7b", + sha256 = "acc8668520bc500b20b7392de382bcd55703befc8180782054e63482e36ce90e", + git_commit = "e5cc33df74ec4f761da26c87bb785edfa3fb8280", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b5399c6b1e314d29d52812b9b5f1a56999f2992c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 26 Jul 2018 04:01:18 -0700 Subject: [PATCH 0400/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206134612 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b5533da378e..c95b230a4bc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "acc8668520bc500b20b7392de382bcd55703befc8180782054e63482e36ce90e", - git_commit = "e5cc33df74ec4f761da26c87bb785edfa3fb8280", + sha256 = "5b4ec0875ca4969c6666fd285cc23012e3d00362832b36210ab94cb9f051a02e", + git_commit = "939237af1479cf61a7c16ad4a1ead521da65a3a6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 725c4e75a4b3119a2b5b29050dcfbe5838408569 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 26 Jul 2018 07:03:01 -0700 Subject: [PATCH 0401/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206152321 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c95b230a4bc..9da7b53e881 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5b4ec0875ca4969c6666fd285cc23012e3d00362832b36210ab94cb9f051a02e", - git_commit = "939237af1479cf61a7c16ad4a1ead521da65a3a6", + sha256 = "b2c84c9c274802b97122b6bd600733525819b3dd8a3d07177e1d0406ae588ebc", + git_commit = "38bdd18f4babf01178f13509578d7fc85cf05f51", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b291ab32ed6141ccc2b128a8d43226f232cbcbf7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 26 Jul 2018 08:02:06 -0700 Subject: [PATCH 0402/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206159184 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9da7b53e881..5137c7b609d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b2c84c9c274802b97122b6bd600733525819b3dd8a3d07177e1d0406ae588ebc", - git_commit = "38bdd18f4babf01178f13509578d7fc85cf05f51", + sha256 = "21ced0e0e175f5f928fb1661004d9ca330ccf343336a1a879d1b2b85388d89d9", + git_commit = "6d71d3fc659b317a38586f71ae94410ad3261f55", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a76ed617bb664bd6b7e7cbd7158a9037390a4a24 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 26 Jul 2018 10:01:37 -0700 Subject: [PATCH 0403/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206175946 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5137c7b609d..6d3126a0c14 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "21ced0e0e175f5f928fb1661004d9ca330ccf343336a1a879d1b2b85388d89d9", - git_commit = "6d71d3fc659b317a38586f71ae94410ad3261f55", + sha256 = "a804d4c51fcfdb6fe5685d7f7f1e5de515e46fc11b21e7c69b0b884fd8eb9468", + git_commit = "bb46cc3bf2f08fc67594828197f554c7d46db6db", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7676a0a99f1f6691d42ea89323a8777aeb40deb1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 26 Jul 2018 11:01:19 -0700 Subject: [PATCH 0404/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206186733 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6d3126a0c14..bc888753fc3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a804d4c51fcfdb6fe5685d7f7f1e5de515e46fc11b21e7c69b0b884fd8eb9468", - git_commit = "bb46cc3bf2f08fc67594828197f554c7d46db6db", + sha256 = "0d7eb6d120434da244f385c035f1f196484078c3cb8f6a799ad6dd171ab49c9d", + git_commit = "86cffb1d9201f8072cef3eb13ef0dc524e0f4535", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5f5a1bc404c8425f300bdcb757dd7f2e3a7dec1a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 26 Jul 2018 12:01:56 -0700 Subject: [PATCH 0405/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206197784 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bc888753fc3..59b34517409 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0d7eb6d120434da244f385c035f1f196484078c3cb8f6a799ad6dd171ab49c9d", - git_commit = "86cffb1d9201f8072cef3eb13ef0dc524e0f4535", + sha256 = "054e7f5e107b2ff9242a92fc1a90d08d66a20dadb5a7198befad6d126d86e24a", + git_commit = "6e658c0a5ca77677a954a34fb98f241c592c970d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 585abd7a7783eca04dce303221919e71a8921faa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 26 Jul 2018 13:02:01 -0700 Subject: [PATCH 0406/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206206899 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 59b34517409..1c61fa4b88b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "054e7f5e107b2ff9242a92fc1a90d08d66a20dadb5a7198befad6d126d86e24a", - git_commit = "6e658c0a5ca77677a954a34fb98f241c592c970d", + sha256 = "6b24eda4278cd2b3f76dee4291718c22aa0d9d2763edd8ceae9268121f9523c6", + git_commit = "b4cc9c34195e0fd557f56ceda29bd4830833ffbb", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8f00a8f2f837c725650c67edac4b01104d542abd Mon Sep 17 00:00:00 2001 From: olston Date: Thu, 26 Jul 2018 13:09:14 -0700 Subject: [PATCH 0407/8103] Use the regular gRPC library in open-source instead of grpc_unsecure. This is to unblock https://github.com/tensorflow/serving/pull/1011. PiperOrigin-RevId: 206208226 --- tensorflow_serving/example/BUILD | 2 +- tensorflow_serving/model_servers/BUILD | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tensorflow_serving/example/BUILD b/tensorflow_serving/example/BUILD index 05ca0605217..823309d11b7 100644 --- a/tensorflow_serving/example/BUILD +++ b/tensorflow_serving/example/BUILD @@ -84,7 +84,7 @@ cc_binary( ], deps = [ "//tensorflow_serving/apis:prediction_service_proto", - "@grpc//:grpc++_unsecure", + "@grpc//:grpc++", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", "@protobuf_archive//:protobuf_lite", diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index c4240142205..2187ba44a32 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -197,7 +197,7 @@ cc_library( "//tensorflow_serving/apis:model_management_proto", "//tensorflow_serving/apis:model_service_proto", "//tensorflow_serving/util:status_util", - "@grpc//:grpc++_unsecure", + "@grpc//:grpc++", ], ) @@ -209,7 +209,7 @@ cc_library( "//visibility:public", ], deps = [ - "@grpc//:grpc++_unsecure", + "@grpc//:grpc++", "@org_tensorflow//tensorflow/core:lib", ], ) @@ -302,7 +302,7 @@ cc_library( "//tensorflow_serving/config:model_server_config_proto", "//tensorflow_serving/core:availability_preserving_policy", "//tensorflow_serving/servables/tensorflow:multi_inference_helper", - "@grpc//:grpc++_unsecure", + "@grpc//:grpc++", "//tensorflow_serving/servables/tensorflow:session_bundle_config_proto", ] + TENSORFLOW_DEPS + SUPPORTED_TENSORFLOW_OPS, ) From 6fde546a352da83c0c5df65e0ef042d50e8d8440 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 26 Jul 2018 14:03:51 -0700 Subject: [PATCH 0408/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206217501 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1c61fa4b88b..dec0671890a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6b24eda4278cd2b3f76dee4291718c22aa0d9d2763edd8ceae9268121f9523c6", - git_commit = "b4cc9c34195e0fd557f56ceda29bd4830833ffbb", + sha256 = "9c22fa55f029e3f49cc43384ab4577d36d7072006e3d0c7f31c12aef0910e985", + git_commit = "63563579653c1f0829d460eef5f05963111e08f0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d4cd56f9f0d5f5bbfeafbb104efbd7677902c3b7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 26 Jul 2018 15:00:35 -0700 Subject: [PATCH 0409/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206227205 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dec0671890a..bc03ea8b34e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9c22fa55f029e3f49cc43384ab4577d36d7072006e3d0c7f31c12aef0910e985", - git_commit = "63563579653c1f0829d460eef5f05963111e08f0", + sha256 = "8b3f865b07082fd2f51f8b64d8b5d2ced7a4564a4c1a0218d04ab8e6eff571bd", + git_commit = "1a306c949565bfc2649ccc91780bfee44e010f68", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f771d92db95af22ab12bc244c057ed0d1bd2d1d1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 26 Jul 2018 16:02:10 -0700 Subject: [PATCH 0410/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206237128 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bc03ea8b34e..42499f66113 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8b3f865b07082fd2f51f8b64d8b5d2ced7a4564a4c1a0218d04ab8e6eff571bd", - git_commit = "1a306c949565bfc2649ccc91780bfee44e010f68", + sha256 = "3e2a3df4d68a1c2e47395bd94e793b82654a571f34bb41964ade09899baf9bff", + git_commit = "46332e1cd5fc5ca3edd5587d7e5bf1ad9c3baa92", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c000bd0e00d278b2935f76b0b38b4aecb7f41599 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 26 Jul 2018 17:03:09 -0700 Subject: [PATCH 0411/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206245934 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 42499f66113..a0e25e8458f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3e2a3df4d68a1c2e47395bd94e793b82654a571f34bb41964ade09899baf9bff", - git_commit = "46332e1cd5fc5ca3edd5587d7e5bf1ad9c3baa92", + sha256 = "fcf13862b28dfc548b90c9035effcec0d41103b5ebea14eef0d424826a0672e7", + git_commit = "4e0c5685af914684a77177002e4265a721c3e0ff", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b997bf253c6c654c4af53e5cfb091ec2fd702ce2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 26 Jul 2018 18:02:40 -0700 Subject: [PATCH 0412/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206252779 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a0e25e8458f..0c84c8e0f9a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fcf13862b28dfc548b90c9035effcec0d41103b5ebea14eef0d424826a0672e7", - git_commit = "4e0c5685af914684a77177002e4265a721c3e0ff", + sha256 = "368c1c4335d008b1e04b985bfc485e20a1fe7582139d472e4a61cb411b9828bd", + git_commit = "4009f82f71f0421e4ed1f50d38e9105074062d1e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 12684ccf13154a30636e98dd40d616abfeb09a0e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 26 Jul 2018 19:02:15 -0700 Subject: [PATCH 0413/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206258241 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0c84c8e0f9a..9bd881fd3b9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "368c1c4335d008b1e04b985bfc485e20a1fe7582139d472e4a61cb411b9828bd", - git_commit = "4009f82f71f0421e4ed1f50d38e9105074062d1e", + sha256 = "8cba14f872cf590d7aa1f357a8b3419453a480489e17f75691e5e63fd9349a7c", + git_commit = "21d94be838f7a7917f072e5ec0bbe6e3593177b9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 76dd17383213dc211b9b581b381898dc0f662cbf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 26 Jul 2018 20:02:21 -0700 Subject: [PATCH 0414/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206262412 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9bd881fd3b9..dd60083b5b9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8cba14f872cf590d7aa1f357a8b3419453a480489e17f75691e5e63fd9349a7c", - git_commit = "21d94be838f7a7917f072e5ec0bbe6e3593177b9", + sha256 = "c2708a39738e7dcd03b6002ce1e000970be05f0de99070dcc8ff19fccaaae548", + git_commit = "65c2baa72da17a3c20d230863c4fe975e88444d6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1fee386251c0a505019cb390d5d79993f1bfbb60 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 26 Jul 2018 21:02:23 -0700 Subject: [PATCH 0415/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206266619 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dd60083b5b9..7055504f077 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c2708a39738e7dcd03b6002ce1e000970be05f0de99070dcc8ff19fccaaae548", - git_commit = "65c2baa72da17a3c20d230863c4fe975e88444d6", + sha256 = "7511a631d97628101203be5ffb60988e29c1e47fb7bad68269895ecdb3ab511a", + git_commit = "82293a9cb0606b4dfbe45fc4e2f4aa8778ff7e9a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From cb57c6aadb8725ad99e32060a8c315fef3ad5b11 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 26 Jul 2018 22:02:10 -0700 Subject: [PATCH 0416/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206270495 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7055504f077..076c87868ea 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7511a631d97628101203be5ffb60988e29c1e47fb7bad68269895ecdb3ab511a", - git_commit = "82293a9cb0606b4dfbe45fc4e2f4aa8778ff7e9a", + sha256 = "e025d07f35b15734100c370a77e3c473ea09df94dba7e623ed67642b66848b34", + git_commit = "19defc68c99483049e14ec18718cb037f1ca050b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 84999eb922b85e02208735aebac32831e24b1fd9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 27 Jul 2018 01:01:28 -0700 Subject: [PATCH 0417/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206282480 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 076c87868ea..0b53c6d18eb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e025d07f35b15734100c370a77e3c473ea09df94dba7e623ed67642b66848b34", - git_commit = "19defc68c99483049e14ec18718cb037f1ca050b", + sha256 = "97c6b1d34b7caa3c26a7f07add08b763adaf621b00d6b99568d6a29d41c7d15f", + git_commit = "21fbc78e69b3e79f883161601f1ccc62be42a06e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 64816af160e33325ef2c450e8db0add7d6264f3f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 27 Jul 2018 02:01:54 -0700 Subject: [PATCH 0418/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206288101 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0b53c6d18eb..fa7c4b9bd58 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "97c6b1d34b7caa3c26a7f07add08b763adaf621b00d6b99568d6a29d41c7d15f", - git_commit = "21fbc78e69b3e79f883161601f1ccc62be42a06e", + sha256 = "b00779ec66bb2e8dde85a5e4ef334f918dda92be78a0606a471fe50df78507a4", + git_commit = "4af0e25bfe0791f0ec3e9262c8d5051415bf026e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fa853df037d9267b8df929d250a77fa098bbabd1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 27 Jul 2018 04:01:54 -0700 Subject: [PATCH 0419/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206298773 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fa7c4b9bd58..0f95e05c7db 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b00779ec66bb2e8dde85a5e4ef334f918dda92be78a0606a471fe50df78507a4", - git_commit = "4af0e25bfe0791f0ec3e9262c8d5051415bf026e", + sha256 = "be3445bd1fda19638105b8b3506da45dd461a1432c6decc4f58903077170a9d9", + git_commit = "dc437d53a395438070739c3d509fa0c21b3bffbb", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 690d4f9aa9ca787a3a6d9b0ae3e8e232d2732b41 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 27 Jul 2018 10:00:56 -0700 Subject: [PATCH 0420/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206331810 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0f95e05c7db..32d41d2bdf3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "be3445bd1fda19638105b8b3506da45dd461a1432c6decc4f58903077170a9d9", - git_commit = "dc437d53a395438070739c3d509fa0c21b3bffbb", + sha256 = "24fac8badc90dca93c3eb4fe4abab7ff409c0cffa56f377b0955c6f3f7bc0c36", + git_commit = "375c023d307a74d32f222486bb2fdd3ba96c92da", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ba1539e3afa14784345e233f0660b07a8536e453 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 27 Jul 2018 11:01:20 -0700 Subject: [PATCH 0421/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206341416 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 32d41d2bdf3..ab7be370340 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "24fac8badc90dca93c3eb4fe4abab7ff409c0cffa56f377b0955c6f3f7bc0c36", - git_commit = "375c023d307a74d32f222486bb2fdd3ba96c92da", + sha256 = "1072cedc6c29d2546032d85c453bbdfb77adece6a8625a3f72ae5d7e761a0b1f", + git_commit = "96c5b537c331011bccafd87d3f90c870c777f349", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 52ff24de9a0da84aba6065ca41c9fc060a301391 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Fri, 27 Jul 2018 11:19:10 -0700 Subject: [PATCH 0422/8103] Add GPU serving Docker image, change source of binary PiperOrigin-RevId: 206344761 --- tensorflow_serving/tools/docker/Dockerfile | 25 ++++------- .../tools/docker/Dockerfile.gpu | 45 +++++++++++++++++++ 2 files changed, 53 insertions(+), 17 deletions(-) create mode 100644 tensorflow_serving/tools/docker/Dockerfile.gpu diff --git a/tensorflow_serving/tools/docker/Dockerfile b/tensorflow_serving/tools/docker/Dockerfile index ddf453781bd..f64b0a89007 100644 --- a/tensorflow_serving/tools/docker/Dockerfile +++ b/tensorflow_serving/tools/docker/Dockerfile @@ -11,28 +11,19 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -FROM ubuntu:16.04 -LABEL maintainer="gvasudevan@google.com" +ARG TF_SERVING_VERSION=latest +ARG TF_SERVING_BUILD_IMAGE=tensorflow/serving:${TF_SERVING_VERSION}-devel -RUN apt-get update && apt-get install -y \ - curl \ - gnupg +FROM ${TF_SERVING_BUILD_IMAGE} as build_image +FROM ubuntu:16.04 -# Install TF Serving pkg. -ARG TF_SERVING_VERSION=1.8.0 -# Use tensorflow-model-server-universal for older hardware -ARG TF_SERVING_PKGNAME=tensorflow-model-server -RUN curl -LO https://storage.googleapis.com/tensorflow-serving-apt/pool/${TF_SERVING_PKGNAME}-${TF_SERVING_VERSION}/t/${TF_SERVING_PKGNAME}/${TF_SERVING_PKGNAME}_${TF_SERVING_VERSION}_all.deb ; \ - dpkg -i ${TF_SERVING_PKGNAME}_${TF_SERVING_VERSION}_all.deb ; \ - rm ${TF_SERVING_PKGNAME}_${TF_SERVING_VERSION}_all.deb +LABEL maintainer="gvasudevan@google.com" -# Cleanup to reduce the size of the image -# See https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#run -RUN apt-get clean && \ - rm -rf /var/lib/apt/lists/* +# Install TF Serving pkg +COPY --from=build_image /usr/local/bin/tensorflow_model_server /usr/bin/tensorflow_model_server -#Expose ports +# Expose ports # gRPC EXPOSE 8500 diff --git a/tensorflow_serving/tools/docker/Dockerfile.gpu b/tensorflow_serving/tools/docker/Dockerfile.gpu new file mode 100644 index 00000000000..e7730919fd7 --- /dev/null +++ b/tensorflow_serving/tools/docker/Dockerfile.gpu @@ -0,0 +1,45 @@ +# Copyright 2018 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +ARG TF_SERVING_VERSION=latest +ARG TF_SERVING_BUILD_IMAGE=tensorflow/serving:${TF_SERVING_VERSION}-devel-gpu + +FROM ${TF_SERVING_BUILD_IMAGE} as build_image +FROM nvidia/cuda:9.0-cudnn7-runtime-ubuntu16.04 + +LABEL maintainer="gvasudevan@google.com" + +RUN apt-get update && apt-get install -y --no-install-recommends \ + libgomp1 \ + && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +# Install TF Serving GPU pkg +COPY --from=build_image /usr/local/bin/tensorflow_model_server /usr/bin/tensorflow_model_server + +# Expose ports +# gRPC +EXPOSE 8500 + +# REST +EXPOSE 8501 + +# Set where models should be stored in the container +ENV MODEL_BASE_PATH=/models +RUN mkdir -p ${MODEL_BASE_PATH} + +# The only required piece is the model name in order to differentiate endpoints +ENV MODEL_NAME=model +ENTRYPOINT tensorflow_model_server --port=8500 --rest_api_port=8501 --model_name=${MODEL_NAME} --model_base_path=${MODEL_BASE_PATH}/${MODEL_NAME} From 69711cdff9fa2f03f64447968df94c99da4956d7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 27 Jul 2018 12:03:08 -0700 Subject: [PATCH 0423/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206352086 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ab7be370340..2dd4b78f7bc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1072cedc6c29d2546032d85c453bbdfb77adece6a8625a3f72ae5d7e761a0b1f", - git_commit = "96c5b537c331011bccafd87d3f90c870c777f349", + sha256 = "dda09b59f3b29d4d694274418477918d4de70310cda6d9cf1ffd674dbe714b49", + git_commit = "85a265031bbd61f5924cdbfdc316df6979883581", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c9ad70b2bc6a7a002c21b95bad5525bd3db4f784 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 27 Jul 2018 13:01:34 -0700 Subject: [PATCH 0424/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206360706 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2dd4b78f7bc..c4d87ce4fdc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dda09b59f3b29d4d694274418477918d4de70310cda6d9cf1ffd674dbe714b49", - git_commit = "85a265031bbd61f5924cdbfdc316df6979883581", + sha256 = "0781b0c36f3129f404997fdd8069023e5f3a640648d5e8443b5f594b42fee866", + git_commit = "ae7eb76ced31bc3806e22fe087874fa88273b324", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8cef9b6460a3d34f7101f0cba04783f4136498e3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 27 Jul 2018 14:02:09 -0700 Subject: [PATCH 0425/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206370113 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c4d87ce4fdc..6c56398c298 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0781b0c36f3129f404997fdd8069023e5f3a640648d5e8443b5f594b42fee866", - git_commit = "ae7eb76ced31bc3806e22fe087874fa88273b324", + sha256 = "c4002d373a13459b477cdf8cac1c3b5c2ea010719934baf12042491f6e4c9d2a", + git_commit = "ab9f0a628f61fcb19b6b09cb51bf05ff8c702a80", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7094f4eca5f51d296836e714d1e10e9d4cb08128 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 27 Jul 2018 15:01:58 -0700 Subject: [PATCH 0426/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206379529 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6c56398c298..63cfd61b5d8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c4002d373a13459b477cdf8cac1c3b5c2ea010719934baf12042491f6e4c9d2a", - git_commit = "ab9f0a628f61fcb19b6b09cb51bf05ff8c702a80", + sha256 = "27f8ac3f699a7aac01f821f2f0ccf147381025526ba03e63f2245ab49afa5034", + git_commit = "388d0d860110a19a9d133fe4de85f8f6fa060cde", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d56a67388d3b3981a55e4f745e6bf723962a6133 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 27 Jul 2018 16:02:04 -0700 Subject: [PATCH 0427/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206388466 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 63cfd61b5d8..b2d81df6609 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "27f8ac3f699a7aac01f821f2f0ccf147381025526ba03e63f2245ab49afa5034", - git_commit = "388d0d860110a19a9d133fe4de85f8f6fa060cde", + sha256 = "8c6ccc7c3b1c91b508b255a33e233989dd0bf0673ed0e9dfa75b7d6ac5334967", + git_commit = "2beb3a9d8b9df294e7635cc23d195a76fd78de79", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1375c4941e3d0984b64a95661e3b89109869eb6b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 27 Jul 2018 18:02:00 -0700 Subject: [PATCH 0428/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206401754 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b2d81df6609..cd1b2822c79 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8c6ccc7c3b1c91b508b255a33e233989dd0bf0673ed0e9dfa75b7d6ac5334967", - git_commit = "2beb3a9d8b9df294e7635cc23d195a76fd78de79", + sha256 = "0313428e7d5f01054be2521518a3d2b00b2aef985afc3579da9bf2c89ccb1e7a", + git_commit = "13a9453aa3c9deccb0bccd7805fb1c34004a5525", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a807d3e28fffa55a6202d43b2c462a729d8e6c3c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 27 Jul 2018 19:01:46 -0700 Subject: [PATCH 0429/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206405770 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cd1b2822c79..a64ea25312d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0313428e7d5f01054be2521518a3d2b00b2aef985afc3579da9bf2c89ccb1e7a", - git_commit = "13a9453aa3c9deccb0bccd7805fb1c34004a5525", + sha256 = "d64e9cb62e069f071ac544fafff24471b5d652a209501faa14307d67579ffdb8", + git_commit = "3aa0bd836e295674a5d071861c98f5f3c2c5e2cf", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3e25d5d34875050840df4f56aec7d3c3c835202e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 27 Jul 2018 21:02:27 -0700 Subject: [PATCH 0430/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206411649 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a64ea25312d..96a7fedb017 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d64e9cb62e069f071ac544fafff24471b5d652a209501faa14307d67579ffdb8", - git_commit = "3aa0bd836e295674a5d071861c98f5f3c2c5e2cf", + sha256 = "47f009b02dfa6df6ffb5b0111c8e40d0705b6790de09f3b6ebe3e63c0b1a4f34", + git_commit = "919e59cc49ada3d529e080ee8eebaaec7f621844", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 09994a8e9143055ffbdccf863a2286f80436619d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 27 Jul 2018 23:02:00 -0700 Subject: [PATCH 0431/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206416696 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 96a7fedb017..95dcd05d04a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "47f009b02dfa6df6ffb5b0111c8e40d0705b6790de09f3b6ebe3e63c0b1a4f34", - git_commit = "919e59cc49ada3d529e080ee8eebaaec7f621844", + sha256 = "0fbd8051dd2c411df4e5743bb6b80b634eac75fe57abf5c93bf4f2fdc2022bb6", + git_commit = "e3095dc262bfdda08d01fce105680515a3d1a7f4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9ca33543549858e720f799b54e4e53f5bec611fb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 28 Jul 2018 09:02:02 -0700 Subject: [PATCH 0432/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206441760 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 95dcd05d04a..f5764fcc5da 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0fbd8051dd2c411df4e5743bb6b80b634eac75fe57abf5c93bf4f2fdc2022bb6", - git_commit = "e3095dc262bfdda08d01fce105680515a3d1a7f4", + sha256 = "ee5d247dd6db604b9145a9da571f0e37707e663cffcc5e6329089ceae096b0c0", + git_commit = "bf12134843638748c5541aed1dbb8647ebf504fd", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 96437cd31884f406774f73ac44fe6e67be551446 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 28 Jul 2018 19:02:12 -0700 Subject: [PATCH 0433/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206462517 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f5764fcc5da..b2f39231acb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ee5d247dd6db604b9145a9da571f0e37707e663cffcc5e6329089ceae096b0c0", - git_commit = "bf12134843638748c5541aed1dbb8647ebf504fd", + sha256 = "376f11a081854d3facd31d5ad077d9d94bedc63aee6e9e9fc6413d4843c9be96", + git_commit = "2ee2fee11391952ee9e73c66ee99f265d924e15a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c3d84d421049b414d0107e1233bb6885f7a03407 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 29 Jul 2018 02:02:05 -0700 Subject: [PATCH 0434/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206478959 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b2f39231acb..ed6a7541178 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "376f11a081854d3facd31d5ad077d9d94bedc63aee6e9e9fc6413d4843c9be96", - git_commit = "2ee2fee11391952ee9e73c66ee99f265d924e15a", + sha256 = "692e18054929f79745cd05b8ec50858ef776e2f645d4533e0845b575f0df15a1", + git_commit = "cde1c8e835f7fdfbb3ab8a4c8a01edb3a7e569aa", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e7bafadffb9ced3d69c4eaacb32150291f4f3fa5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 29 Jul 2018 12:02:06 -0700 Subject: [PATCH 0435/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206500994 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ed6a7541178..0bc3771310f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "692e18054929f79745cd05b8ec50858ef776e2f645d4533e0845b575f0df15a1", - git_commit = "cde1c8e835f7fdfbb3ab8a4c8a01edb3a7e569aa", + sha256 = "a2e9725bdeb1ab0203ed9b2408ad60e7d25fd6f9d60aaf6025b20f6f427a4c7a", + git_commit = "760ee14c6ce7f7cafb2b66619430e2d45d140c35", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d27175a2d403077d8ac7f496c970b6a4837aa8dd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 29 Jul 2018 15:02:03 -0700 Subject: [PATCH 0436/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206507132 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0bc3771310f..6aa6c34e267 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a2e9725bdeb1ab0203ed9b2408ad60e7d25fd6f9d60aaf6025b20f6f427a4c7a", - git_commit = "760ee14c6ce7f7cafb2b66619430e2d45d140c35", + sha256 = "ccadfa771e232278fafdba47b7484653f2619280bf1d9238936b2ebbc72c4041", + git_commit = "fd5050232b62e8d9c7b7a205c60b4e19071dee55", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c33e01fb918f7b1494bf3d00e384696bc401f138 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 29 Jul 2018 17:04:57 -0700 Subject: [PATCH 0437/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206512233 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6aa6c34e267..81609f75077 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ccadfa771e232278fafdba47b7484653f2619280bf1d9238936b2ebbc72c4041", - git_commit = "fd5050232b62e8d9c7b7a205c60b4e19071dee55", + sha256 = "ada940223789d78af94a226648f6565ad97dfbdacbb6b5896c814d40b9da383f", + git_commit = "e7475504094b3018973740df470d2c9ee73a4fd5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 95777e303f9f414e4c83b1f2b79a89482a0d8b4c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 30 Jul 2018 02:01:55 -0700 Subject: [PATCH 0438/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206544859 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 81609f75077..146b2738090 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ada940223789d78af94a226648f6565ad97dfbdacbb6b5896c814d40b9da383f", - git_commit = "e7475504094b3018973740df470d2c9ee73a4fd5", + sha256 = "bfe388b1a3d6dcc8e99aebdaca6670ff1d7a69c145f71bb6142e22036a6acc7c", + git_commit = "9e0b05bbc4bb88d1b34fb2147429dc4ad7bd25cd", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c9f9bc24719b38ffe2db2dcabf869b4d10968c84 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 30 Jul 2018 04:02:14 -0700 Subject: [PATCH 0439/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206557491 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 146b2738090..1bb8b957848 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bfe388b1a3d6dcc8e99aebdaca6670ff1d7a69c145f71bb6142e22036a6acc7c", - git_commit = "9e0b05bbc4bb88d1b34fb2147429dc4ad7bd25cd", + sha256 = "35e4eec30da57e868895423a442481b18d86fbe2cdea662bb27e887fad73f9cd", + git_commit = "333f9c03950a1b6afb8a902b2dc3d883be490b86", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0c4ff3e00ee9a0769f60be2012572b59655dfffc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 30 Jul 2018 09:05:47 -0700 Subject: [PATCH 0440/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206591230 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1bb8b957848..d52c1af317d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "35e4eec30da57e868895423a442481b18d86fbe2cdea662bb27e887fad73f9cd", - git_commit = "333f9c03950a1b6afb8a902b2dc3d883be490b86", + sha256 = "5d1aea6ac56d8a6ab9df0b3afe0735a07337b42b3e2992c16ff25c49c0fe4b82", + git_commit = "0ec10b4e78f0e6e89fad502683b9e7283b0c43bc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2e7e752f590cd7d2b5f139031760738c5d78854f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 30 Jul 2018 10:02:12 -0700 Subject: [PATCH 0441/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206599935 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d52c1af317d..584a9889dd5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5d1aea6ac56d8a6ab9df0b3afe0735a07337b42b3e2992c16ff25c49c0fe4b82", - git_commit = "0ec10b4e78f0e6e89fad502683b9e7283b0c43bc", + sha256 = "8be684278b0825006ef26a7dbf989df19775571f4d2466af21aac247d7e0d1ea", + git_commit = "bae59bf4e55fbbe89a668b3809fa3183e281e2b9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1e7446922045421811785c055c8cb98028ed2da8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 30 Jul 2018 11:02:05 -0700 Subject: [PATCH 0442/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206611405 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 584a9889dd5..99efb5f66de 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8be684278b0825006ef26a7dbf989df19775571f4d2466af21aac247d7e0d1ea", - git_commit = "bae59bf4e55fbbe89a668b3809fa3183e281e2b9", + sha256 = "ce685db61b378754dbf00f9bb6a3494a76e95bbf9f32f84b5673b920dd4d0197", + git_commit = "0301533e35aac90387ef3aba71add1f2da35e3ef", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From aa35cfdb24016f6d88f82c53d45c8ce9fa550499 Mon Sep 17 00:00:00 2001 From: awk Date: Mon, 30 Jul 2018 11:07:54 -0700 Subject: [PATCH 0443/8103] Switch from beta to GA gRPC API. PiperOrigin-RevId: 206612637 --- tensorflow_serving/apis/BUILD | 5 +- .../apis/prediction_service_pb2.py | 313 ++++-------------- .../apis/prediction_service_pb2_grpc.py | 139 ++++++++ .../example/inception_client.py | 9 +- tensorflow_serving/example/mnist_client.py | 9 +- .../tensorflow_model_server_test.py | 39 +-- .../tensorflow_model_server_test_client.py | 9 +- 7 files changed, 230 insertions(+), 293 deletions(-) create mode 100644 tensorflow_serving/apis/prediction_service_pb2_grpc.py diff --git a/tensorflow_serving/apis/BUILD b/tensorflow_serving/apis/BUILD index 6efae87eb0e..b483c5d9d67 100644 --- a/tensorflow_serving/apis/BUILD +++ b/tensorflow_serving/apis/BUILD @@ -178,7 +178,10 @@ serving_proto_library( py_library( name = "prediction_service_proto_py_pb2", - srcs = ["prediction_service_pb2.py"], + srcs = [ + "prediction_service_pb2.py", + "prediction_service_pb2_grpc.py", + ], srcs_version = "PY2AND3", deps = [ ":classification_proto_py_pb2", diff --git a/tensorflow_serving/apis/prediction_service_pb2.py b/tensorflow_serving/apis/prediction_service_pb2.py index a522541e9d9..16d79da857c 100644 --- a/tensorflow_serving/apis/prediction_service_pb2.py +++ b/tensorflow_serving/apis/prediction_service_pb2.py @@ -43,267 +43,72 @@ serialized_pb=_b('\n0tensorflow_serving/apis/prediction_service.proto\x12\x12tensorflow.serving\x1a,tensorflow_serving/apis/classification.proto\x1a\x30tensorflow_serving/apis/get_model_metadata.proto\x1a\'tensorflow_serving/apis/inference.proto\x1a%tensorflow_serving/apis/predict.proto\x1a(tensorflow_serving/apis/regression.proto2\xfc\x03\n\x11PredictionService\x12\x61\n\x08\x43lassify\x12).tensorflow.serving.ClassificationRequest\x1a*.tensorflow.serving.ClassificationResponse\x12X\n\x07Regress\x12%.tensorflow.serving.RegressionRequest\x1a&.tensorflow.serving.RegressionResponse\x12R\n\x07Predict\x12\".tensorflow.serving.PredictRequest\x1a#.tensorflow.serving.PredictResponse\x12g\n\x0eMultiInference\x12).tensorflow.serving.MultiInferenceRequest\x1a*.tensorflow.serving.MultiInferenceResponse\x12m\n\x10GetModelMetadata\x12+.tensorflow.serving.GetModelMetadataRequest\x1a,.tensorflow.serving.GetModelMetadataResponseB\x03\xf8\x01\x01\x62\x06proto3') , dependencies=[tensorflow__serving_dot_apis_dot_classification__pb2.DESCRIPTOR,tensorflow__serving_dot_apis_dot_get__model__metadata__pb2.DESCRIPTOR,tensorflow__serving_dot_apis_dot_inference__pb2.DESCRIPTOR,tensorflow__serving_dot_apis_dot_predict__pb2.DESCRIPTOR,tensorflow__serving_dot_apis_dot_regression__pb2.DESCRIPTOR,]) -_sym_db.RegisterFileDescriptor(DESCRIPTOR) +_sym_db.RegisterFileDescriptor(DESCRIPTOR) DESCRIPTOR.has_options = True DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\370\001\001')) -try: - # THESE ELEMENTS WILL BE DEPRECATED. - # Please use the generated *_pb2_grpc.py files instead. - import grpc - from grpc.framework.common import cardinality - from grpc.framework.interfaces.face import utilities as face_utilities - from grpc.beta import implementations as beta_implementations - from grpc.beta import interfaces as beta_interfaces - - - class PredictionServiceStub(object): - """open source marker; do not remove - PredictionService provides access to machine-learned models loaded by - model_servers. - """ - - def __init__(self, channel): - """Constructor. - - Args: - channel: A grpc.Channel. - """ - self.Classify = channel.unary_unary( - '/tensorflow.serving.PredictionService/Classify', - request_serializer=tensorflow__serving_dot_apis_dot_classification__pb2.ClassificationRequest.SerializeToString, - response_deserializer=tensorflow__serving_dot_apis_dot_classification__pb2.ClassificationResponse.FromString, - ) - self.Regress = channel.unary_unary( - '/tensorflow.serving.PredictionService/Regress', - request_serializer=tensorflow__serving_dot_apis_dot_regression__pb2.RegressionRequest.SerializeToString, - response_deserializer=tensorflow__serving_dot_apis_dot_regression__pb2.RegressionResponse.FromString, - ) - self.Predict = channel.unary_unary( - '/tensorflow.serving.PredictionService/Predict', - request_serializer=tensorflow__serving_dot_apis_dot_predict__pb2.PredictRequest.SerializeToString, - response_deserializer=tensorflow__serving_dot_apis_dot_predict__pb2.PredictResponse.FromString, - ) - self.MultiInference = channel.unary_unary( - '/tensorflow.serving.PredictionService/MultiInference', - request_serializer=tensorflow__serving_dot_apis_dot_inference__pb2.MultiInferenceRequest.SerializeToString, - response_deserializer=tensorflow__serving_dot_apis_dot_inference__pb2.MultiInferenceResponse.FromString, - ) - self.GetModelMetadata = channel.unary_unary( - '/tensorflow.serving.PredictionService/GetModelMetadata', - request_serializer=tensorflow__serving_dot_apis_dot_get__model__metadata__pb2.GetModelMetadataRequest.SerializeToString, - response_deserializer=tensorflow__serving_dot_apis_dot_get__model__metadata__pb2.GetModelMetadataResponse.FromString, - ) - - - class PredictionServiceServicer(object): - """open source marker; do not remove - PredictionService provides access to machine-learned models loaded by - model_servers. - """ - - def Classify(self, request, context): - """Classify. - """ - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def Regress(self, request, context): - """Regress. - """ - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def Predict(self, request, context): - """Predict -- provides access to loaded TensorFlow model. - """ - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def MultiInference(self, request, context): - """MultiInference API for multi-headed models. - """ - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def GetModelMetadata(self, request, context): - """GetModelMetadata - provides access to metadata for loaded models. - """ - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - - def add_PredictionServiceServicer_to_server(servicer, server): - rpc_method_handlers = { - 'Classify': grpc.unary_unary_rpc_method_handler( - servicer.Classify, - request_deserializer=tensorflow__serving_dot_apis_dot_classification__pb2.ClassificationRequest.FromString, - response_serializer=tensorflow__serving_dot_apis_dot_classification__pb2.ClassificationResponse.SerializeToString, - ), - 'Regress': grpc.unary_unary_rpc_method_handler( - servicer.Regress, - request_deserializer=tensorflow__serving_dot_apis_dot_regression__pb2.RegressionRequest.FromString, - response_serializer=tensorflow__serving_dot_apis_dot_regression__pb2.RegressionResponse.SerializeToString, - ), - 'Predict': grpc.unary_unary_rpc_method_handler( - servicer.Predict, - request_deserializer=tensorflow__serving_dot_apis_dot_predict__pb2.PredictRequest.FromString, - response_serializer=tensorflow__serving_dot_apis_dot_predict__pb2.PredictResponse.SerializeToString, - ), - 'MultiInference': grpc.unary_unary_rpc_method_handler( - servicer.MultiInference, - request_deserializer=tensorflow__serving_dot_apis_dot_inference__pb2.MultiInferenceRequest.FromString, - response_serializer=tensorflow__serving_dot_apis_dot_inference__pb2.MultiInferenceResponse.SerializeToString, - ), - 'GetModelMetadata': grpc.unary_unary_rpc_method_handler( - servicer.GetModelMetadata, - request_deserializer=tensorflow__serving_dot_apis_dot_get__model__metadata__pb2.GetModelMetadataRequest.FromString, - response_serializer=tensorflow__serving_dot_apis_dot_get__model__metadata__pb2.GetModelMetadataResponse.SerializeToString, - ), - } - generic_handler = grpc.method_handlers_generic_handler( - 'tensorflow.serving.PredictionService', rpc_method_handlers) - server.add_generic_rpc_handlers((generic_handler,)) - - - class BetaPredictionServiceServicer(object): - """The Beta API is deprecated for 0.15.0 and later. - - It is recommended to use the GA API (classes and functions in this - file not marked beta) for all further purposes. This class was generated - only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0.""" - """open source marker; do not remove - PredictionService provides access to machine-learned models loaded by - model_servers. - """ - def Classify(self, request, context): - """Classify. - """ - context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) - def Regress(self, request, context): - """Regress. - """ - context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) - def Predict(self, request, context): - """Predict -- provides access to loaded TensorFlow model. - """ - context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) - def MultiInference(self, request, context): - """MultiInference API for multi-headed models. - """ - context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) - def GetModelMetadata(self, request, context): - """GetModelMetadata - provides access to metadata for loaded models. - """ - context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) - - - class BetaPredictionServiceStub(object): - """The Beta API is deprecated for 0.15.0 and later. - - It is recommended to use the GA API (classes and functions in this - file not marked beta) for all further purposes. This class was generated - only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0.""" - """open source marker; do not remove - PredictionService provides access to machine-learned models loaded by - model_servers. - """ - def Classify(self, request, timeout, metadata=None, with_call=False, protocol_options=None): - """Classify. - """ - raise NotImplementedError() - Classify.future = None - def Regress(self, request, timeout, metadata=None, with_call=False, protocol_options=None): - """Regress. - """ - raise NotImplementedError() - Regress.future = None - def Predict(self, request, timeout, metadata=None, with_call=False, protocol_options=None): - """Predict -- provides access to loaded TensorFlow model. - """ - raise NotImplementedError() - Predict.future = None - def MultiInference(self, request, timeout, metadata=None, with_call=False, protocol_options=None): - """MultiInference API for multi-headed models. - """ - raise NotImplementedError() - MultiInference.future = None - def GetModelMetadata(self, request, timeout, metadata=None, with_call=False, protocol_options=None): - """GetModelMetadata - provides access to metadata for loaded models. - """ - raise NotImplementedError() - GetModelMetadata.future = None - - - def beta_create_PredictionService_server(servicer, pool=None, pool_size=None, default_timeout=None, maximum_timeout=None): - """The Beta API is deprecated for 0.15.0 and later. - - It is recommended to use the GA API (classes and functions in this - file not marked beta) for all further purposes. This function was - generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0""" - request_deserializers = { - ('tensorflow.serving.PredictionService', 'Classify'): tensorflow__serving_dot_apis_dot_classification__pb2.ClassificationRequest.FromString, - ('tensorflow.serving.PredictionService', 'GetModelMetadata'): tensorflow__serving_dot_apis_dot_get__model__metadata__pb2.GetModelMetadataRequest.FromString, - ('tensorflow.serving.PredictionService', 'MultiInference'): tensorflow__serving_dot_apis_dot_inference__pb2.MultiInferenceRequest.FromString, - ('tensorflow.serving.PredictionService', 'Predict'): tensorflow__serving_dot_apis_dot_predict__pb2.PredictRequest.FromString, - ('tensorflow.serving.PredictionService', 'Regress'): tensorflow__serving_dot_apis_dot_regression__pb2.RegressionRequest.FromString, - } - response_serializers = { - ('tensorflow.serving.PredictionService', 'Classify'): tensorflow__serving_dot_apis_dot_classification__pb2.ClassificationResponse.SerializeToString, - ('tensorflow.serving.PredictionService', 'GetModelMetadata'): tensorflow__serving_dot_apis_dot_get__model__metadata__pb2.GetModelMetadataResponse.SerializeToString, - ('tensorflow.serving.PredictionService', 'MultiInference'): tensorflow__serving_dot_apis_dot_inference__pb2.MultiInferenceResponse.SerializeToString, - ('tensorflow.serving.PredictionService', 'Predict'): tensorflow__serving_dot_apis_dot_predict__pb2.PredictResponse.SerializeToString, - ('tensorflow.serving.PredictionService', 'Regress'): tensorflow__serving_dot_apis_dot_regression__pb2.RegressionResponse.SerializeToString, - } - method_implementations = { - ('tensorflow.serving.PredictionService', 'Classify'): face_utilities.unary_unary_inline(servicer.Classify), - ('tensorflow.serving.PredictionService', 'GetModelMetadata'): face_utilities.unary_unary_inline(servicer.GetModelMetadata), - ('tensorflow.serving.PredictionService', 'MultiInference'): face_utilities.unary_unary_inline(servicer.MultiInference), - ('tensorflow.serving.PredictionService', 'Predict'): face_utilities.unary_unary_inline(servicer.Predict), - ('tensorflow.serving.PredictionService', 'Regress'): face_utilities.unary_unary_inline(servicer.Regress), - } - server_options = beta_implementations.server_options(request_deserializers=request_deserializers, response_serializers=response_serializers, thread_pool=pool, thread_pool_size=pool_size, default_timeout=default_timeout, maximum_timeout=maximum_timeout) - return beta_implementations.server(method_implementations, options=server_options) - - def beta_create_PredictionService_stub(channel, host=None, metadata_transformer=None, pool=None, pool_size=None): - """The Beta API is deprecated for 0.15.0 and later. +_PREDICTIONSERVICE = _descriptor.ServiceDescriptor( + name='PredictionService', + full_name='tensorflow.serving.PredictionService', + file=DESCRIPTOR, + index=0, + options=None, + serialized_start=291, + serialized_end=799, + methods=[ + _descriptor.MethodDescriptor( + name='Classify', + full_name='tensorflow.serving.PredictionService.Classify', + index=0, + containing_service=None, + input_type=tensorflow__serving_dot_apis_dot_classification__pb2._CLASSIFICATIONREQUEST, + output_type=tensorflow__serving_dot_apis_dot_classification__pb2._CLASSIFICATIONRESPONSE, + options=None, + ), + _descriptor.MethodDescriptor( + name='Regress', + full_name='tensorflow.serving.PredictionService.Regress', + index=1, + containing_service=None, + input_type=tensorflow__serving_dot_apis_dot_regression__pb2._REGRESSIONREQUEST, + output_type=tensorflow__serving_dot_apis_dot_regression__pb2._REGRESSIONRESPONSE, + options=None, + ), + _descriptor.MethodDescriptor( + name='Predict', + full_name='tensorflow.serving.PredictionService.Predict', + index=2, + containing_service=None, + input_type=tensorflow__serving_dot_apis_dot_predict__pb2._PREDICTREQUEST, + output_type=tensorflow__serving_dot_apis_dot_predict__pb2._PREDICTRESPONSE, + options=None, + ), + _descriptor.MethodDescriptor( + name='MultiInference', + full_name='tensorflow.serving.PredictionService.MultiInference', + index=3, + containing_service=None, + input_type=tensorflow__serving_dot_apis_dot_inference__pb2._MULTIINFERENCEREQUEST, + output_type=tensorflow__serving_dot_apis_dot_inference__pb2._MULTIINFERENCERESPONSE, + options=None, + ), + _descriptor.MethodDescriptor( + name='GetModelMetadata', + full_name='tensorflow.serving.PredictionService.GetModelMetadata', + index=4, + containing_service=None, + input_type=tensorflow__serving_dot_apis_dot_get__model__metadata__pb2._GETMODELMETADATAREQUEST, + output_type=tensorflow__serving_dot_apis_dot_get__model__metadata__pb2._GETMODELMETADATARESPONSE, + options=None, + ), +]) +_sym_db.RegisterServiceDescriptor(_PREDICTIONSERVICE) + +DESCRIPTOR.services_by_name['PredictionService'] = _PREDICTIONSERVICE - It is recommended to use the GA API (classes and functions in this - file not marked beta) for all further purposes. This function was - generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0""" - request_serializers = { - ('tensorflow.serving.PredictionService', 'Classify'): tensorflow__serving_dot_apis_dot_classification__pb2.ClassificationRequest.SerializeToString, - ('tensorflow.serving.PredictionService', 'GetModelMetadata'): tensorflow__serving_dot_apis_dot_get__model__metadata__pb2.GetModelMetadataRequest.SerializeToString, - ('tensorflow.serving.PredictionService', 'MultiInference'): tensorflow__serving_dot_apis_dot_inference__pb2.MultiInferenceRequest.SerializeToString, - ('tensorflow.serving.PredictionService', 'Predict'): tensorflow__serving_dot_apis_dot_predict__pb2.PredictRequest.SerializeToString, - ('tensorflow.serving.PredictionService', 'Regress'): tensorflow__serving_dot_apis_dot_regression__pb2.RegressionRequest.SerializeToString, - } - response_deserializers = { - ('tensorflow.serving.PredictionService', 'Classify'): tensorflow__serving_dot_apis_dot_classification__pb2.ClassificationResponse.FromString, - ('tensorflow.serving.PredictionService', 'GetModelMetadata'): tensorflow__serving_dot_apis_dot_get__model__metadata__pb2.GetModelMetadataResponse.FromString, - ('tensorflow.serving.PredictionService', 'MultiInference'): tensorflow__serving_dot_apis_dot_inference__pb2.MultiInferenceResponse.FromString, - ('tensorflow.serving.PredictionService', 'Predict'): tensorflow__serving_dot_apis_dot_predict__pb2.PredictResponse.FromString, - ('tensorflow.serving.PredictionService', 'Regress'): tensorflow__serving_dot_apis_dot_regression__pb2.RegressionResponse.FromString, - } - cardinalities = { - 'Classify': cardinality.Cardinality.UNARY_UNARY, - 'GetModelMetadata': cardinality.Cardinality.UNARY_UNARY, - 'MultiInference': cardinality.Cardinality.UNARY_UNARY, - 'Predict': cardinality.Cardinality.UNARY_UNARY, - 'Regress': cardinality.Cardinality.UNARY_UNARY, - } - stub_options = beta_implementations.stub_options(host=host, metadata_transformer=metadata_transformer, request_serializers=request_serializers, response_deserializers=response_deserializers, thread_pool=pool, thread_pool_size=pool_size) - return beta_implementations.dynamic_stub(channel, 'tensorflow.serving.PredictionService', cardinalities, options=stub_options) -except ImportError: - pass # @@protoc_insertion_point(module_scope) diff --git a/tensorflow_serving/apis/prediction_service_pb2_grpc.py b/tensorflow_serving/apis/prediction_service_pb2_grpc.py new file mode 100644 index 00000000000..082f94a39a0 --- /dev/null +++ b/tensorflow_serving/apis/prediction_service_pb2_grpc.py @@ -0,0 +1,139 @@ +# Copyright 2016 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +# source: tensorflow_serving/apis/prediction_service.proto +# To regenerate run +# python -m grpc.tools.protoc --python_out=. --grpc_python_out=. -I. tensorflow_serving/apis/prediction_service.proto +import grpc + +from tensorflow_serving.apis import classification_pb2 as tensorflow__serving_dot_apis_dot_classification__pb2 +from tensorflow_serving.apis import get_model_metadata_pb2 as tensorflow__serving_dot_apis_dot_get__model__metadata__pb2 +from tensorflow_serving.apis import inference_pb2 as tensorflow__serving_dot_apis_dot_inference__pb2 +from tensorflow_serving.apis import predict_pb2 as tensorflow__serving_dot_apis_dot_predict__pb2 +from tensorflow_serving.apis import regression_pb2 as tensorflow__serving_dot_apis_dot_regression__pb2 + + +class PredictionServiceStub(object): + """open source marker; do not remove + PredictionService provides access to machine-learned models loaded by + model_servers. + """ + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.Classify = channel.unary_unary( + '/tensorflow.serving.PredictionService/Classify', + request_serializer=tensorflow__serving_dot_apis_dot_classification__pb2.ClassificationRequest.SerializeToString, + response_deserializer=tensorflow__serving_dot_apis_dot_classification__pb2.ClassificationResponse.FromString, + ) + self.Regress = channel.unary_unary( + '/tensorflow.serving.PredictionService/Regress', + request_serializer=tensorflow__serving_dot_apis_dot_regression__pb2.RegressionRequest.SerializeToString, + response_deserializer=tensorflow__serving_dot_apis_dot_regression__pb2.RegressionResponse.FromString, + ) + self.Predict = channel.unary_unary( + '/tensorflow.serving.PredictionService/Predict', + request_serializer=tensorflow__serving_dot_apis_dot_predict__pb2.PredictRequest.SerializeToString, + response_deserializer=tensorflow__serving_dot_apis_dot_predict__pb2.PredictResponse.FromString, + ) + self.MultiInference = channel.unary_unary( + '/tensorflow.serving.PredictionService/MultiInference', + request_serializer=tensorflow__serving_dot_apis_dot_inference__pb2.MultiInferenceRequest.SerializeToString, + response_deserializer=tensorflow__serving_dot_apis_dot_inference__pb2.MultiInferenceResponse.FromString, + ) + self.GetModelMetadata = channel.unary_unary( + '/tensorflow.serving.PredictionService/GetModelMetadata', + request_serializer=tensorflow__serving_dot_apis_dot_get__model__metadata__pb2.GetModelMetadataRequest.SerializeToString, + response_deserializer=tensorflow__serving_dot_apis_dot_get__model__metadata__pb2.GetModelMetadataResponse.FromString, + ) + + +class PredictionServiceServicer(object): + """open source marker; do not remove + PredictionService provides access to machine-learned models loaded by + model_servers. + """ + + def Classify(self, request, context): + """Classify. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Regress(self, request, context): + """Regress. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Predict(self, request, context): + """Predict -- provides access to loaded TensorFlow model. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def MultiInference(self, request, context): + """MultiInference API for multi-headed models. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetModelMetadata(self, request, context): + """GetModelMetadata - provides access to metadata for loaded models. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_PredictionServiceServicer_to_server(servicer, server): + rpc_method_handlers = { + 'Classify': grpc.unary_unary_rpc_method_handler( + servicer.Classify, + request_deserializer=tensorflow__serving_dot_apis_dot_classification__pb2.ClassificationRequest.FromString, + response_serializer=tensorflow__serving_dot_apis_dot_classification__pb2.ClassificationResponse.SerializeToString, + ), + 'Regress': grpc.unary_unary_rpc_method_handler( + servicer.Regress, + request_deserializer=tensorflow__serving_dot_apis_dot_regression__pb2.RegressionRequest.FromString, + response_serializer=tensorflow__serving_dot_apis_dot_regression__pb2.RegressionResponse.SerializeToString, + ), + 'Predict': grpc.unary_unary_rpc_method_handler( + servicer.Predict, + request_deserializer=tensorflow__serving_dot_apis_dot_predict__pb2.PredictRequest.FromString, + response_serializer=tensorflow__serving_dot_apis_dot_predict__pb2.PredictResponse.SerializeToString, + ), + 'MultiInference': grpc.unary_unary_rpc_method_handler( + servicer.MultiInference, + request_deserializer=tensorflow__serving_dot_apis_dot_inference__pb2.MultiInferenceRequest.FromString, + response_serializer=tensorflow__serving_dot_apis_dot_inference__pb2.MultiInferenceResponse.SerializeToString, + ), + 'GetModelMetadata': grpc.unary_unary_rpc_method_handler( + servicer.GetModelMetadata, + request_deserializer=tensorflow__serving_dot_apis_dot_get__model__metadata__pb2.GetModelMetadataRequest.FromString, + response_serializer=tensorflow__serving_dot_apis_dot_get__model__metadata__pb2.GetModelMetadataResponse.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'tensorflow.serving.PredictionService', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) diff --git a/tensorflow_serving/example/inception_client.py b/tensorflow_serving/example/inception_client.py index 84cc89e95a5..0a7e0eefe17 100644 --- a/tensorflow_serving/example/inception_client.py +++ b/tensorflow_serving/example/inception_client.py @@ -22,11 +22,11 @@ # This is a placeholder for a Google-internal import. -from grpc.beta import implementations +import grpc import tensorflow as tf from tensorflow_serving.apis import predict_pb2 -from tensorflow_serving.apis import prediction_service_pb2 +from tensorflow_serving.apis import prediction_service_pb2_grpc tf.app.flags.DEFINE_string('server', 'localhost:9000', @@ -36,9 +36,8 @@ def main(_): - host, port = FLAGS.server.split(':') - channel = implementations.insecure_channel(host, int(port)) - stub = prediction_service_pb2.beta_create_PredictionService_stub(channel) + channel = grpc.insecure_channel(FLAGS.server) + stub = prediction_service_pb2_grpc.PredictionServiceStub(channel) # Send request with open(FLAGS.image, 'rb') as f: # See prediction_service.proto for gRPC request/response details. diff --git a/tensorflow_serving/example/mnist_client.py b/tensorflow_serving/example/mnist_client.py index 947f7c49b03..592969d6552 100644 --- a/tensorflow_serving/example/mnist_client.py +++ b/tensorflow_serving/example/mnist_client.py @@ -32,12 +32,12 @@ # This is a placeholder for a Google-internal import. -from grpc.beta import implementations +import grpc import numpy import tensorflow as tf from tensorflow_serving.apis import predict_pb2 -from tensorflow_serving.apis import prediction_service_pb2 +from tensorflow_serving.apis import prediction_service_pb2_grpc import mnist_input_data @@ -137,9 +137,8 @@ def do_inference(hostport, work_dir, concurrency, num_tests): IOError: An error occurred processing test data set. """ test_data_set = mnist_input_data.read_data_sets(work_dir).test - host, port = hostport.split(':') - channel = implementations.insecure_channel(host, int(port)) - stub = prediction_service_pb2.beta_create_PredictionService_stub(channel) + channel = grpc.insecure_channel(hostport) + stub = prediction_service_pb2_grpc.PredictionServiceStub(channel) result_counter = _ResultCounter(num_tests, concurrency) for _ in range(num_tests): request = predict_pb2.PredictRequest() diff --git a/tensorflow_serving/model_servers/tensorflow_model_server_test.py b/tensorflow_serving/model_servers/tensorflow_model_server_test.py index d64460389b9..0d89e78c4d5 100644 --- a/tensorflow_serving/model_servers/tensorflow_model_server_test.py +++ b/tensorflow_serving/model_servers/tensorflow_model_server_test.py @@ -29,9 +29,6 @@ # This is a placeholder for a Google-internal import. import grpc -from grpc.beta import implementations -from grpc.beta import interfaces as beta_interfaces -from grpc.framework.interfaces.face import face import tensorflow as tf from tensorflow.core.framework import types_pb2 @@ -42,7 +39,7 @@ from tensorflow_serving.apis import inference_pb2 from tensorflow_serving.apis import model_service_pb2_grpc from tensorflow_serving.apis import predict_pb2 -from tensorflow_serving.apis import prediction_service_pb2 +from tensorflow_serving.apis import prediction_service_pb2_grpc from tensorflow_serving.apis import regression_pb2 FLAGS = flags.FLAGS @@ -70,12 +67,12 @@ def WaitForServerReady(port): try: # Send empty request to missing model - channel = implementations.insecure_channel('localhost', port) - stub = prediction_service_pb2.beta_create_PredictionService_stub(channel) + channel = grpc.insecure_channel('localhost:{}'.format(port)) + stub = prediction_service_pb2_grpc.PredictionServiceStub(channel) stub.Predict(request, RPC_TIMEOUT) - except face.AbortionError as error: + except grpc.RpcError as error: # Missing model error will have details containing 'Servable' - if 'Servable' in error.details: + if 'Servable' in error.details(): print 'Server is ready' break @@ -199,9 +196,8 @@ def VerifyPredictRequest(self, if specify_output: request.output_filter.append('y') # Send request - host, port = model_server_address.split(':') - channel = implementations.insecure_channel(host, int(port)) - stub = prediction_service_pb2.beta_create_PredictionService_stub(channel) + channel = grpc.insecure_channel(model_server_address) + stub = prediction_service_pb2_grpc.PredictionServiceStub(channel) result = stub.Predict(request, RPC_TIMEOUT) # 5 secs timeout # Verify response self.assertTrue('y' in result.outputs) @@ -313,9 +309,8 @@ def testClassify(self): example.features.feature['x'].float_list.value.extend([2.0]) # Send request - host, port = model_server_address.split(':') - channel = implementations.insecure_channel(host, int(port)) - stub = prediction_service_pb2.beta_create_PredictionService_stub(channel) + channel = grpc.insecure_channel(model_server_address) + stub = prediction_service_pb2_grpc.PredictionServiceStub(channel) result = stub.Classify(request, RPC_TIMEOUT) # 5 secs timeout # Verify response self.assertEquals(1, len(result.result.classifications)) @@ -345,9 +340,8 @@ def testRegress(self): example.features.feature['x'].float_list.value.extend([2.0]) # Send request - host, port = model_server_address.split(':') - channel = implementations.insecure_channel(host, int(port)) - stub = prediction_service_pb2.beta_create_PredictionService_stub(channel) + channel = grpc.insecure_channel(model_server_address) + stub = prediction_service_pb2_grpc.PredictionServiceStub(channel) result = stub.Regress(request, RPC_TIMEOUT) # 5 secs timeout # Verify response self.assertEquals(1, len(result.result.regressions)) @@ -381,9 +375,8 @@ def testMultiInference(self): example.features.feature['x'].float_list.value.extend([2.0]) # Send request - host, port = model_server_address.split(':') - channel = implementations.insecure_channel(host, int(port)) - stub = prediction_service_pb2.beta_create_PredictionService_stub(channel) + channel = grpc.insecure_channel(model_server_address) + stub = prediction_service_pb2_grpc.PredictionServiceStub(channel) result = stub.MultiInference(request, RPC_TIMEOUT) # 5 secs timeout # Verify response @@ -451,13 +444,13 @@ def _TestBadModel(self): model_server_address = self.RunServer(PickUnusedPort(), 'default', model_path, wait_for_server_ready=False) - with self.assertRaises(face.AbortionError) as error: + with self.assertRaises(grpc.RpcError) as ectxt: self.VerifyPredictRequest( model_server_address, expected_output=3.0, expected_version=self._GetModelVersion(model_path), signature_name='') - self.assertIs(beta_interfaces.StatusCode.FAILED_PRECONDITION, - error.exception.code) + self.assertIs(grpc.StatusCode.FAILED_PRECONDITION, + ectxt.exception.code()) def _TestBadModelUpconvertedSavedModel(self): """Test Predict against a bad upconverted SavedModel model export.""" diff --git a/tensorflow_serving/model_servers/tensorflow_model_server_test_client.py b/tensorflow_serving/model_servers/tensorflow_model_server_test_client.py index 1ab70c99e04..f5bcb972036 100644 --- a/tensorflow_serving/model_servers/tensorflow_model_server_test_client.py +++ b/tensorflow_serving/model_servers/tensorflow_model_server_test_client.py @@ -19,13 +19,13 @@ # This is a placeholder for a Google-internal import. -from grpc.beta import implementations +import grpc import tensorflow as tf from tensorflow.core.framework import types_pb2 from tensorflow.python.platform import flags from tensorflow_serving.apis import predict_pb2 -from tensorflow_serving.apis import prediction_service_pb2 +from tensorflow_serving.apis import prediction_service_pb2_grpc tf.app.flags.DEFINE_string('server', 'localhost:8500', @@ -41,9 +41,8 @@ def main(_): request.inputs['x'].float_val.append(2.0) request.output_filter.append('y') # Send request - host, port = FLAGS.server.split(':') - channel = implementations.insecure_channel(host, int(port)) - stub = prediction_service_pb2.beta_create_PredictionService_stub(channel) + channel = grpc.insecure_channel(FLAGS.server) + stub = prediction_service_pb2_grpc.PredictionServiceStub(channel) print stub.Predict(request, 5.0) # 5 secs timeout From bdd7a320f424378fdf7267cf4e327a413ad8eb2e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 30 Jul 2018 12:01:55 -0700 Subject: [PATCH 0444/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206622534 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 99efb5f66de..c046af1165b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ce685db61b378754dbf00f9bb6a3494a76e95bbf9f32f84b5673b920dd4d0197", - git_commit = "0301533e35aac90387ef3aba71add1f2da35e3ef", + sha256 = "356e8ecd7a6b7d72f46d195c15767f968249f3bccfa609f73319f736a11e9f10", + git_commit = "b3df17e99995cce2c0c3c7a84d6d113a8965b36a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e805d1b1fa2dc7eb47e913d3f35f391946102e01 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 30 Jul 2018 13:01:05 -0700 Subject: [PATCH 0445/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206631860 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c046af1165b..b1d17179b2c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "356e8ecd7a6b7d72f46d195c15767f968249f3bccfa609f73319f736a11e9f10", - git_commit = "b3df17e99995cce2c0c3c7a84d6d113a8965b36a", + sha256 = "52967dc1f10f41ed4548c0931c8321a0cbc3d82a08963948567ba7a87a31fe41", + git_commit = "ee6d76a4a4b548bb1bca918ae250a6ab5fcdbf6a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 88ad2c62de3eb63846289534dfab500db1b2fb6b Mon Sep 17 00:00:00 2001 From: awk Date: Mon, 30 Jul 2018 13:24:48 -0700 Subject: [PATCH 0446/8103] Internal change. PiperOrigin-RevId: 206635850 --- tensorflow_serving/tools/docker/Dockerfile | 5 +++++ tensorflow_serving/tools/docker/Dockerfile.gpu | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/tensorflow_serving/tools/docker/Dockerfile b/tensorflow_serving/tools/docker/Dockerfile index f64b0a89007..f97c510f620 100644 --- a/tensorflow_serving/tools/docker/Dockerfile +++ b/tensorflow_serving/tools/docker/Dockerfile @@ -18,7 +18,12 @@ ARG TF_SERVING_BUILD_IMAGE=tensorflow/serving:${TF_SERVING_VERSION}-devel FROM ${TF_SERVING_BUILD_IMAGE} as build_image FROM ubuntu:16.04 +ARG TF_SERVING_VERSION_GIT_BRANCH=master +ARG TF_SERVING_VERSION_GIT_COMMIT=head + LABEL maintainer="gvasudevan@google.com" +LABEL tensorflow_serving_github_branchtag=${TF_SERVING_VERSION_GIT_BRANCH} +LABEL tensorflow_serving_github_commit=${TF_SERVING_VERSION_GIT_COMMIT} # Install TF Serving pkg COPY --from=build_image /usr/local/bin/tensorflow_model_server /usr/bin/tensorflow_model_server diff --git a/tensorflow_serving/tools/docker/Dockerfile.gpu b/tensorflow_serving/tools/docker/Dockerfile.gpu index e7730919fd7..2d2a018a123 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.gpu @@ -18,7 +18,12 @@ ARG TF_SERVING_BUILD_IMAGE=tensorflow/serving:${TF_SERVING_VERSION}-devel-gpu FROM ${TF_SERVING_BUILD_IMAGE} as build_image FROM nvidia/cuda:9.0-cudnn7-runtime-ubuntu16.04 +ARG TF_SERVING_VERSION_GIT_BRANCH=master +ARG TF_SERVING_VERSION_GIT_COMMIT=head + LABEL maintainer="gvasudevan@google.com" +LABEL tensorflow_serving_github_branchtag=${TF_SERVING_VERSION_GIT_BRANCH} +LABEL tensorflow_serving_github_commit=${TF_SERVING_VERSION_GIT_COMMIT} RUN apt-get update && apt-get install -y --no-install-recommends \ libgomp1 \ From e37493403bd4127a1dacd6a060376b8e232777aa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 30 Jul 2018 14:02:07 -0700 Subject: [PATCH 0447/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206642523 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b1d17179b2c..2338b02ba3d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "52967dc1f10f41ed4548c0931c8321a0cbc3d82a08963948567ba7a87a31fe41", - git_commit = "ee6d76a4a4b548bb1bca918ae250a6ab5fcdbf6a", + sha256 = "cf8f6751fbc34fa679991f06daebac3d2a9a272d642a58d6b17b1cbed1b906b7", + git_commit = "cfd9cc499c895135b88e69980a65d215ddb589e9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 00bd862fb303a83b94b2350e0349f647eae41caa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 30 Jul 2018 15:00:42 -0700 Subject: [PATCH 0448/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206652732 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2338b02ba3d..1d8c1e2db56 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cf8f6751fbc34fa679991f06daebac3d2a9a272d642a58d6b17b1cbed1b906b7", - git_commit = "cfd9cc499c895135b88e69980a65d215ddb589e9", + sha256 = "2fdf60b35f50ba1e6a668d93b4973c883d0f7e6c172e2508645e71e3cff0c7a5", + git_commit = "a64995e97e14e4c84282003e14356092a0912cf5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ff748ace486894ec8cc1beafa3ea1b1dc988d98d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 30 Jul 2018 16:02:26 -0700 Subject: [PATCH 0449/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206663278 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1d8c1e2db56..0e64d139dbe 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2fdf60b35f50ba1e6a668d93b4973c883d0f7e6c172e2508645e71e3cff0c7a5", - git_commit = "a64995e97e14e4c84282003e14356092a0912cf5", + sha256 = "e8845d448f84be457866d75e51d77555f454501a160a179a8d9f505bd1c04ae7", + git_commit = "f017a9b9b400e65e7d616675beb46fea24f8bb2a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From cff73650c2d085e2cc1223be9f2b6f4509aa998b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 30 Jul 2018 17:02:02 -0700 Subject: [PATCH 0450/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206672069 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0e64d139dbe..1f6f291861b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e8845d448f84be457866d75e51d77555f454501a160a179a8d9f505bd1c04ae7", - git_commit = "f017a9b9b400e65e7d616675beb46fea24f8bb2a", + sha256 = "df8792d49a0d699cf9e38514eec040763e77fb1f930b84c701ce9057a96eed52", + git_commit = "11b2a0beb55e14eb094b1a76952950bb314dad9f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 59d0e1d6ee25af7567d12a80bf03918431e7ae3d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 30 Jul 2018 18:02:51 -0700 Subject: [PATCH 0451/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206680959 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1f6f291861b..0798d2f3052 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "df8792d49a0d699cf9e38514eec040763e77fb1f930b84c701ce9057a96eed52", - git_commit = "11b2a0beb55e14eb094b1a76952950bb314dad9f", + sha256 = "63a041d3f55b6cf98231a9e5388d2c99337942d35c1f04d60114e2c2ddd61070", + git_commit = "934b722bff332f51973d9a9d0f65c69a51292406", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d87ce08e3013f92350d2ac394762dc2dcfef9718 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 30 Jul 2018 19:01:39 -0700 Subject: [PATCH 0452/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206687354 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0798d2f3052..4f7063cc0d2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "63a041d3f55b6cf98231a9e5388d2c99337942d35c1f04d60114e2c2ddd61070", - git_commit = "934b722bff332f51973d9a9d0f65c69a51292406", + sha256 = "7f50aa0113bac6496d89d416eccb919dc27acd8a1544c508557e9b7c8ac09810", + git_commit = "145161509a5a1fa4bc7efeeb04561f50b400c61a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4a2ed76063a75698d265278bac5afe5481f588ee Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 30 Jul 2018 20:02:04 -0700 Subject: [PATCH 0453/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206692852 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4f7063cc0d2..2a76bd3ff52 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7f50aa0113bac6496d89d416eccb919dc27acd8a1544c508557e9b7c8ac09810", - git_commit = "145161509a5a1fa4bc7efeeb04561f50b400c61a", + sha256 = "c1af2e0883326b39da6a4fac49d3bda2accc45e1d1515d8ac2bb4296398b017d", + git_commit = "92d16b85f9fc38348207047704c66aaeefb75bdf", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6fc29494c2906bb6108a286db53b70c4f0b77b81 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Mon, 30 Jul 2018 20:39:24 -0700 Subject: [PATCH 0454/8103] Add half_plus_two CPU and GPU models to testdata PiperOrigin-RevId: 206696543 --- .../00000123/saved_model.pb | Bin 0 -> 9337 bytes .../variables/variables.data-00000-of-00001 | Bin 0 -> 12 bytes .../00000123/variables/variables.index | Bin 0 -> 151 bytes .../00000123/saved_model.pb | Bin 0 -> 9337 bytes .../variables/variables.data-00000-of-00001 | Bin 0 -> 12 bytes .../00000123/variables/variables.index | Bin 0 -> 151 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu/00000123/saved_model.pb create mode 100644 tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu/00000123/variables/variables.data-00000-of-00001 create mode 100644 tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu/00000123/variables/variables.index create mode 100644 tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_gpu/00000123/saved_model.pb create mode 100644 tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_gpu/00000123/variables/variables.data-00000-of-00001 create mode 100644 tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_gpu/00000123/variables/variables.index diff --git a/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu/00000123/saved_model.pb b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu/00000123/saved_model.pb new file mode 100644 index 0000000000000000000000000000000000000000..c79ebe01c240863890d2048ebee5da046c93a90a GIT binary patch literal 9337 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 literal 0 HcmV?d00001 diff --git a/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu/00000123/variables/variables.data-00000-of-00001 b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu/00000123/variables/variables.data-00000-of-00001 new file mode 100644 index 0000000000000000000000000000000000000000..15b75d6ef6bffc336d138d923badb3928b8c4c13 GIT binary patch literal 12 RcmZQzV6bOkU~m8;2LJ>^0RR91 literal 0 HcmV?d00001 diff --git a/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu/00000123/variables/variables.index b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu/00000123/variables/variables.index new file mode 100644 index 0000000000000000000000000000000000000000..7ec9fb4fe2dd21d0a6c324aecd7658fc37cf2326 GIT binary patch literal 151 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 QYMkk2F*B#R!zwfX7m*=}5dZ)H literal 0 HcmV?d00001 diff --git a/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_gpu/00000123/variables/variables.data-00000-of-00001 b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_gpu/00000123/variables/variables.data-00000-of-00001 new file mode 100644 index 0000000000000000000000000000000000000000..15b75d6ef6bffc336d138d923badb3928b8c4c13 GIT binary patch literal 12 RcmZQzV6bOkU~m8;2LJ>^0RR91 literal 0 HcmV?d00001 diff --git a/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_gpu/00000123/variables/variables.index b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_gpu/00000123/variables/variables.index new file mode 100644 index 0000000000000000000000000000000000000000..7ec9fb4fe2dd21d0a6c324aecd7658fc37cf2326 GIT binary patch literal 151 zcmZQzVB=tvV&Y(AVB}8ZU=(7|U@>L0P?u+5 Date: Mon, 30 Jul 2018 21:02:29 -0700 Subject: [PATCH 0455/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206698376 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2a76bd3ff52..3635c1d3687 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c1af2e0883326b39da6a4fac49d3bda2accc45e1d1515d8ac2bb4296398b017d", - git_commit = "92d16b85f9fc38348207047704c66aaeefb75bdf", + sha256 = "7a98e62cfcbdefe00f15c0bfa7783d8fb36bdcf08ec4ce047198450139841124", + git_commit = "52e1c34fe192e1e44905c65041e316e82b17e1ae", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 70d40c7990ad28be3372b50f451ab29546f4fb60 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 31 Jul 2018 00:02:03 -0700 Subject: [PATCH 0456/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206712473 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3635c1d3687..7cd46fdd99f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7a98e62cfcbdefe00f15c0bfa7783d8fb36bdcf08ec4ce047198450139841124", - git_commit = "52e1c34fe192e1e44905c65041e316e82b17e1ae", + sha256 = "174dcd52e10e3b8b476c98420c9bc2c96864085b13abb1c5bfaca297f776bda3", + git_commit = "78f58629ae4a47a799e88da7a78ecfcb6a6115cc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7b82f3774cb579bf45acd8a74d02c17220d20968 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 31 Jul 2018 03:02:17 -0700 Subject: [PATCH 0457/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206731620 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7cd46fdd99f..2b4b050cb0d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "174dcd52e10e3b8b476c98420c9bc2c96864085b13abb1c5bfaca297f776bda3", - git_commit = "78f58629ae4a47a799e88da7a78ecfcb6a6115cc", + sha256 = "6cd7fa6c9f08b0299d9a34c3438534fec487b9993ec89dc56595ee7b2a55b4ab", + git_commit = "3a1df26a25aa1b5fc7b897c0187c982c07f98368", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1d296d154dd745b3fdca16b56b741b05f7f61524 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 31 Jul 2018 06:02:09 -0700 Subject: [PATCH 0458/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206747973 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2b4b050cb0d..a1e38a6d681 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6cd7fa6c9f08b0299d9a34c3438534fec487b9993ec89dc56595ee7b2a55b4ab", - git_commit = "3a1df26a25aa1b5fc7b897c0187c982c07f98368", + sha256 = "20f7e19e9323f2f34ae353873affbb18e81f6fb12c6fffd6f0446d3797820a00", + git_commit = "3bec2640dcbd251f4eb2517d9ae7d8909886375d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 55e7bd3e3994f4a95af409cce5f2d7c722198791 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 31 Jul 2018 07:02:06 -0700 Subject: [PATCH 0459/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206754474 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a1e38a6d681..99d8b4ddee1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "20f7e19e9323f2f34ae353873affbb18e81f6fb12c6fffd6f0446d3797820a00", - git_commit = "3bec2640dcbd251f4eb2517d9ae7d8909886375d", + sha256 = "2a2aa7506f2ce37be80f908352f44ffeb12af5354fc1a4723b0fc4a989230056", + git_commit = "2826d123a017bc5f1a2cc7b969e275c5a63c326c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 94b8d9bc0aed5b1e575d705f1ac28d60ed41fd9e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 31 Jul 2018 09:04:04 -0700 Subject: [PATCH 0460/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206770210 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 99d8b4ddee1..729dd26a206 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2a2aa7506f2ce37be80f908352f44ffeb12af5354fc1a4723b0fc4a989230056", - git_commit = "2826d123a017bc5f1a2cc7b969e275c5a63c326c", + sha256 = "36ae3552fe02546c4e13a70e01b21d3541ce7e387b4c4d0f36ab52df26dd3bf4", + git_commit = "217dd20c5e945bafb1748f56a0cde079ced89764", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d32d331a2ef00b2d6d184115069d121948d42e80 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 31 Jul 2018 10:02:00 -0700 Subject: [PATCH 0461/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206779574 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 729dd26a206..8439179a032 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "36ae3552fe02546c4e13a70e01b21d3541ce7e387b4c4d0f36ab52df26dd3bf4", - git_commit = "217dd20c5e945bafb1748f56a0cde079ced89764", + sha256 = "aefd58cffccff9ce6fc3eb02ea4efe395ac7417f21929e96661aff69630b1bd3", + git_commit = "5efec22b566d2ab656f83eb30858cfadac384c2c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a7ca24fc3a6c50bcbac0ceb865c84b421c2eb851 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 31 Jul 2018 11:01:30 -0700 Subject: [PATCH 0462/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206791013 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8439179a032..462ca043b8d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "aefd58cffccff9ce6fc3eb02ea4efe395ac7417f21929e96661aff69630b1bd3", - git_commit = "5efec22b566d2ab656f83eb30858cfadac384c2c", + sha256 = "7e958ee8a0b6e6efbec60465715a6ed800d274a5a30410552c96359da8a04c49", + git_commit = "3fa30255c57b807c3f4b92c7f34c77e8128e911f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d80434cf95808cab226a4de1228af0e3793e7f79 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 31 Jul 2018 12:14:19 -0700 Subject: [PATCH 0463/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206804739 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 462ca043b8d..38d803c6843 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7e958ee8a0b6e6efbec60465715a6ed800d274a5a30410552c96359da8a04c49", - git_commit = "3fa30255c57b807c3f4b92c7f34c77e8128e911f", + sha256 = "ec5877a8c44499cf05f9c8e1db5b8c1ae42d979e6e4d3db63d2dc4bf37122d26", + git_commit = "ccb4f10afbb5865bbc983a651e0041253f367311", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3906402a4b2a0a6ce49489e5fc75b6aed55a2d1d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 31 Jul 2018 13:52:28 -0700 Subject: [PATCH 0464/8103] Change logging behavior to VLOG so that downstream clients using this library don't get INFO log spew. PiperOrigin-RevId: 206821092 --- tensorflow_serving/core/static_source_router.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tensorflow_serving/core/static_source_router.h b/tensorflow_serving/core/static_source_router.h index 6aea4805773..62c96c68234 100644 --- a/tensorflow_serving/core/static_source_router.h +++ b/tensorflow_serving/core/static_source_router.h @@ -82,14 +82,14 @@ int StaticSourceRouter::Route(const StringPiece servable_name, const std::vector>& versions) { for (int i = 0; i < routes_except_default_.size(); ++i) { if (str_util::StrContains(servable_name, routes_except_default_[i])) { - LOG(INFO) << "Routing servable(s) from stream " << servable_name - << " to route " << i; + VLOG(2) << "Routing servable(s) from stream " << servable_name + << " to route " << i; return i; } } // None of the substrings matched, so return the "default" Nth route. - LOG(INFO) << "Routing servable(s) from stream " << servable_name - << " to default route " << routes_except_default_.size(); + VLOG(2) << "Routing servable(s) from stream " << servable_name + << " to default route " << routes_except_default_.size(); return routes_except_default_.size(); } From c560a02086c924caf1bcce84f8392637ec27216d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 31 Jul 2018 15:01:56 -0700 Subject: [PATCH 0465/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206833809 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 38d803c6843..b30f934d14e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ec5877a8c44499cf05f9c8e1db5b8c1ae42d979e6e4d3db63d2dc4bf37122d26", - git_commit = "ccb4f10afbb5865bbc983a651e0041253f367311", + sha256 = "79fe17b80050fb409e3c8c4ee591a457ebe70f13f3117a9b81e8f7b36a59f190", + git_commit = "cc2b782a43e59fff4a6d563d0c4a863cfbb21b2c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7909540225e9178e126f7edcbe6b0694c04d4843 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 31 Jul 2018 16:01:22 -0700 Subject: [PATCH 0466/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206843943 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b30f934d14e..76b38e7780f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "79fe17b80050fb409e3c8c4ee591a457ebe70f13f3117a9b81e8f7b36a59f190", - git_commit = "cc2b782a43e59fff4a6d563d0c4a863cfbb21b2c", + sha256 = "e56aad3c07d9a46a1d35e80625b501c678881d06cb66febee55ab6d042a0092a", + git_commit = "f29635ccb73337d20b9f3e79b5d7917ae2bb56cc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ef5f89836d0227d1f5ea357be4fa8b72256a08c5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 31 Jul 2018 17:08:21 -0700 Subject: [PATCH 0467/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206854243 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 76b38e7780f..b1957091487 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e56aad3c07d9a46a1d35e80625b501c678881d06cb66febee55ab6d042a0092a", - git_commit = "f29635ccb73337d20b9f3e79b5d7917ae2bb56cc", + sha256 = "044d80827229ac6cc5f7854707d9cd6c949edcfdfc70f2648fc31a06fb84a578", + git_commit = "28f0c8e37bd99b43d6d9597cf995f5f8e26f1056", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 101730f8ea8218955a02e0474d1d7e643cba1263 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 31 Jul 2018 18:32:36 -0700 Subject: [PATCH 0468/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206863611 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b1957091487..fc3d89360c5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "044d80827229ac6cc5f7854707d9cd6c949edcfdfc70f2648fc31a06fb84a578", - git_commit = "28f0c8e37bd99b43d6d9597cf995f5f8e26f1056", + sha256 = "32baf657dd8fc8b6e39932addcd7a235c43b46fe25d92033ca1dffde1c24a250", + git_commit = "9cfd11c98cd5460bc61bdd67d77c5f563c656d4c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1bcc01132df0cc835a9d3388ee6fce65d2f2fbe9 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Tue, 31 Jul 2018 18:45:11 -0700 Subject: [PATCH 0469/8103] Internal change PiperOrigin-RevId: 206864789 --- tensorflow_serving/tools/docker/Dockerfile.devel | 7 +++++-- tensorflow_serving/tools/docker/Dockerfile.devel-gpu | 7 ++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index c752ff30f93..707047ee63a 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -69,9 +69,12 @@ RUN git clone --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tenso if [ "${TF_SERVING_VERSION_GIT_COMMIT}" != "head" ]; then git checkout ${TF_SERVING_VERSION_GIT_COMMIT} ; fi # Build, and install TensorFlow Serving -ARG TF_SERVING_BUILD_OPTIONS="--copt=-mavx --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0 --verbose_failures" -RUN bazel build -c opt --color=yes --curses=yes ${TF_SERVING_BUILD_OPTIONS} \ +ARG TF_SERVING_BUILD_OPTIONS="--copt=-mavx --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0" +ARG TF_SERVING_BAZEL_OPTIONS="--verbose_failures --local_resources=4096,1.0,1.0" +RUN bazel build -c opt --color=yes --curses=yes \ + ${TF_SERVING_BAZEL_OPTIONS} \ --output_filter=DONT_MATCH_ANYTHING \ + ${TF_SERVING_BUILD_OPTIONS} \ tensorflow_serving/model_servers:tensorflow_model_server && \ cp bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server /usr/local/bin/ && \ bazel clean --expunge --color=yes && \ diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index a8c1d54ca8a..901d9f89cb4 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -110,6 +110,9 @@ RUN mkdir -p ${NCCL_INSTALL_PATH} && \ ln -s /usr/lib/x86_64-linux-gnu/libnccl.so ${NCCL_INSTALL_PATH}lib/libnccl.so && \ ln -s /usr/lib/x86_64-linux-gnu/libnccl.so.${TF_NCCL_VERSION} ${NCCL_INSTALL_PATH}lib/libnccl.so.${TF_NCCL_VERSION} +# Set TMP for nvidia build environment +ENV TMP="/tmp" + # Download TF Serving sources (optionally at specific commit). WORKDIR /tensorflow-serving RUN git clone --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tensorflow/serving . && \ @@ -117,10 +120,12 @@ RUN git clone --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tenso if [ "${TF_SERVING_VERSION_GIT_COMMIT}" != "head" ]; then git checkout ${TF_SERVING_VERSION_GIT_COMMIT} ; fi # Build, and install TensorFlow Serving -ARG TF_SERVING_BUILD_OPTIONS="--copt=-mavx --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0 --verbose_failures" +ARG TF_SERVING_BUILD_OPTIONS="--copt=-mavx --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0" +ARG TF_SERVING_BAZEL_OPTIONS="--verbose_failures --local_resources=4096,1.0,1.0" RUN ln -s /usr/local/cuda/lib64/stubs/libcuda.so /usr/local/cuda/lib64/stubs/libcuda.so.1 && \ LD_LIBRARY_PATH=/usr/local/cuda/lib64/stubs:${LD_LIBRARY_PATH} \ bazel build -c opt --color=yes --curses=yes --config=cuda \ + ${TF_SERVING_BAZEL_OPTIONS} \ --output_filter=DONT_MATCH_ANYTHING \ ${TF_SERVING_BUILD_OPTIONS} \ tensorflow_serving/model_servers:tensorflow_model_server && \ From 303309180efcc9404e7f714620e71e040e1f4658 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 31 Jul 2018 19:47:07 -0700 Subject: [PATCH 0470/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206869418 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fc3d89360c5..9c42d206a71 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "32baf657dd8fc8b6e39932addcd7a235c43b46fe25d92033ca1dffde1c24a250", - git_commit = "9cfd11c98cd5460bc61bdd67d77c5f563c656d4c", + sha256 = "afc2827496346adc00e9ec8d922b9688f1fb791d1682f73fd5252c25ef8a45f0", + git_commit = "ffc9be66bc1503ec12f10f43ff622d9193062e97", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5c20271cbff1c1876f7f0e8d79d7ad85d137d01a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 31 Jul 2018 20:22:29 -0700 Subject: [PATCH 0471/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206872246 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9c42d206a71..5931415a037 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "afc2827496346adc00e9ec8d922b9688f1fb791d1682f73fd5252c25ef8a45f0", - git_commit = "ffc9be66bc1503ec12f10f43ff622d9193062e97", + sha256 = "e199649fd89bfb9a75bb4cc5452017f409e8dd8ee25ac12c4edb8a38f2f7b23d", + git_commit = "54f4fc66ecfe09e00db2369b6bfbaf3384d3fc69", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3ab8b8a12521027afd4c47b4097d80b5d1072fbc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 31 Jul 2018 23:04:54 -0700 Subject: [PATCH 0472/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206883968 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5931415a037..73ec4e0257f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e199649fd89bfb9a75bb4cc5452017f409e8dd8ee25ac12c4edb8a38f2f7b23d", - git_commit = "54f4fc66ecfe09e00db2369b6bfbaf3384d3fc69", + sha256 = "0e725d5aa7694e5be067e79bcb0debcfda46e2ed0b16a71bb41bf143ede4ad6c", + git_commit = "209efdd2bcc4d7f0d5aeda77fb11f04c37d484e6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7b860fafb88aeb5f75ae8931d513c7f4b20437d2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 1 Aug 2018 00:01:19 -0700 Subject: [PATCH 0473/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206887536 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 73ec4e0257f..2713b767023 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0e725d5aa7694e5be067e79bcb0debcfda46e2ed0b16a71bb41bf143ede4ad6c", - git_commit = "209efdd2bcc4d7f0d5aeda77fb11f04c37d484e6", + sha256 = "eff002fb1f32cf4d1559845fa5814ac4f229e6af03eae9baaf6b17bf5899fbb3", + git_commit = "92279f8bfa6ce2124439aabfa6db84d722dc2b66", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0eba6ec9c7bafc679a495d2f6b2c23ccb23d6cf5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 1 Aug 2018 01:04:14 -0700 Subject: [PATCH 0474/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206893032 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2713b767023..9722a32e39e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eff002fb1f32cf4d1559845fa5814ac4f229e6af03eae9baaf6b17bf5899fbb3", - git_commit = "92279f8bfa6ce2124439aabfa6db84d722dc2b66", + sha256 = "3cf67d871a4fbf5fa1e39e559a681a74f60f2dbbcf679d8a7ec6780fe5302d2f", + git_commit = "26ba623dccacfb2f913951e12089a8340e6a11ac", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 71017519331040e54daa711fc8ea383c79b10913 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 1 Aug 2018 02:00:45 -0700 Subject: [PATCH 0475/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206898125 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9722a32e39e..5decd2b1e03 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3cf67d871a4fbf5fa1e39e559a681a74f60f2dbbcf679d8a7ec6780fe5302d2f", - git_commit = "26ba623dccacfb2f913951e12089a8340e6a11ac", + sha256 = "53ac43334a96f1788c5ece4a207e480c8d90379d4a1ec3485247368c8c801ad9", + git_commit = "abd645085b1dd1496df847b05a1934d471a2f2c0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 68057fb7ec873fd3915875b6c35b3eb3232fe69c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 1 Aug 2018 07:02:58 -0700 Subject: [PATCH 0476/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206923749 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5decd2b1e03..0ee2070a991 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "53ac43334a96f1788c5ece4a207e480c8d90379d4a1ec3485247368c8c801ad9", - git_commit = "abd645085b1dd1496df847b05a1934d471a2f2c0", + sha256 = "1dbc85c060193de41570dc55150ef8de8d4fa11dddb4ce7e4b8fc309e763392a", + git_commit = "ad72f89ca9a92fdae4ae5147ed5bbe42b49adce0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 386384f34d5fea06a5d5e8a0340ff6a956fa75c0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 1 Aug 2018 09:02:16 -0700 Subject: [PATCH 0477/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206936855 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0ee2070a991..72b19ceb81a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1dbc85c060193de41570dc55150ef8de8d4fa11dddb4ce7e4b8fc309e763392a", - git_commit = "ad72f89ca9a92fdae4ae5147ed5bbe42b49adce0", + sha256 = "009a1e8836f886e80f93fa78791bd0c9457e94a748f787d15f69ec0c1b0077d0", + git_commit = "25567a1204f78a8d48d17edc45828db170162001", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From edfbd91b16f315b5b6211657e3116dc833c86e48 Mon Sep 17 00:00:00 2001 From: Prashanth Reddy Basani Date: Wed, 1 Aug 2018 11:05:59 -0500 Subject: [PATCH 0478/8103] Changed closing bracket in encoding binary values --- tensorflow_serving/g3doc/api_rest.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/g3doc/api_rest.md b/tensorflow_serving/g3doc/api_rest.md index 2ae566cf8dd..8b8b04635fa 100644 --- a/tensorflow_serving/g3doc/api_rest.md +++ b/tensorflow_serving/g3doc/api_rest.md @@ -254,7 +254,7 @@ shown below: "image": { "b64": "YXdlc29tZSBpbWFnZSBieXRlcw==" }, "caption": "mountains" } - } + ] } ``` From 6e5306d3ab2670c87504c337534ad51533b3875d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 1 Aug 2018 10:02:39 -0700 Subject: [PATCH 0479/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206945742 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 72b19ceb81a..aa27e5d3310 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "009a1e8836f886e80f93fa78791bd0c9457e94a748f787d15f69ec0c1b0077d0", - git_commit = "25567a1204f78a8d48d17edc45828db170162001", + sha256 = "ad6e97f449b61cc7e2473e4b90a24754e72f85bfa978f619142f181fb308d114", + git_commit = "338df0b07d8c7e99d93cad4e171ac23c3cf3d696", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d310d2259970e64496516bfdf3c47e42623b2433 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 1 Aug 2018 11:01:56 -0700 Subject: [PATCH 0480/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206956511 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index aa27e5d3310..60811cbe1c9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ad6e97f449b61cc7e2473e4b90a24754e72f85bfa978f619142f181fb308d114", - git_commit = "338df0b07d8c7e99d93cad4e171ac23c3cf3d696", + sha256 = "7fdfe9085e610b900c4ba7a15ded92ebb62ecc2659b0205ebb87744de21cfd59", + git_commit = "0589444f3dc6d6c13db26e93854b93b8cc7ca4e0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b40d56eb3fe937ea7ba2b9206690f43fe856030f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 1 Aug 2018 12:01:42 -0700 Subject: [PATCH 0481/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206967513 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 60811cbe1c9..1118734bd8a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7fdfe9085e610b900c4ba7a15ded92ebb62ecc2659b0205ebb87744de21cfd59", - git_commit = "0589444f3dc6d6c13db26e93854b93b8cc7ca4e0", + sha256 = "2082b3864d430036cf48d67ad3a4889eae4ed24037fe37871688a4c5891c385e", + git_commit = "5fe530e976be6649f07c254adb3b5236c8b664d7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3e212671b8006f28f6a88690df521012ac81bff5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 1 Aug 2018 13:04:16 -0700 Subject: [PATCH 0482/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206978523 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1118734bd8a..2f183c40610 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2082b3864d430036cf48d67ad3a4889eae4ed24037fe37871688a4c5891c385e", - git_commit = "5fe530e976be6649f07c254adb3b5236c8b664d7", + sha256 = "323e2ac521fc4577815df083a5b626190098bc39c18da61c0412838c5db34fdb", + git_commit = "9fb82adad07d2f7dc2a72d9a85ef5c2a55abfe0e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ef3ffceacde28d1dc0821db288fd575ee457bc9e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 1 Aug 2018 14:01:32 -0700 Subject: [PATCH 0483/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 206988181 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2f183c40610..1f15c518677 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "323e2ac521fc4577815df083a5b626190098bc39c18da61c0412838c5db34fdb", - git_commit = "9fb82adad07d2f7dc2a72d9a85ef5c2a55abfe0e", + sha256 = "e5536956b4b861b6e3807db1a96106a4e5a9b9ffc907922e59f718aef296057c", + git_commit = "c709503f31fa9be07c5ee62ed1eb7fb29c2aaa73", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f605cadbc48e0c8af4c25bbed275a07cbe3b1d0a Mon Sep 17 00:00:00 2001 From: awk Date: Wed, 1 Aug 2018 14:17:18 -0700 Subject: [PATCH 0484/8103] Add notes about binary encoding string values that represent binary data as opposed to normal strings. PiperOrigin-RevId: 206991253 --- tensorflow_serving/g3doc/api_rest.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/g3doc/api_rest.md b/tensorflow_serving/g3doc/api_rest.md index 2ae566cf8dd..5294556e4d6 100644 --- a/tensorflow_serving/g3doc/api_rest.md +++ b/tensorflow_serving/g3doc/api_rest.md @@ -222,7 +222,7 @@ unsupported. [TF Data Type](https://www.tensorflow.org/versions/r1.1/programmers_guide/dims_types#data_types) | [JSON Value](http://json.org/) | JSON example | Notes ------------------------------------------------------------------------------------------------ | ------------------------------ | ---------------------------------- | ----- DT_BOOL | true, false | *true, false* | -DT_STRING | string | *"Hello World!"* | +DT_STRING | string | *"Hello World!"* | If `DT_STRING` represents binary bytes (e.g. serialized image bytes or protobuf), encode these in Base64. See [Encoding binary values](#encoding-binary-values) for more info. DT_INT8, DT_UINT8, DT_INT16, DT_INT32, DT_UINT32, DT_INT64, DT_UINT64 | number | *1, -10, 0* | JSON value will be a decimal number. DT_FLOAT, DT_DOUBLE | number | *1.1, -10.0, 0, `NaN`, `Infinity`* | JSON value will be a number or one of the special token values - `NaN`, `Infinity`, and `-Infinity`. See [JSON conformance](#json-conformance) for more info. Exponent notation is also accepted. From 61e9c0eaa56a75caae6529b635579650460e039c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 1 Aug 2018 15:05:09 -0700 Subject: [PATCH 0485/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207000620 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1f15c518677..d201454e186 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e5536956b4b861b6e3807db1a96106a4e5a9b9ffc907922e59f718aef296057c", - git_commit = "c709503f31fa9be07c5ee62ed1eb7fb29c2aaa73", + sha256 = "1d3e8c149eaffd9fcbdef7f2a0d804984f8731dded4398564f6300527bdc15ca", + git_commit = "96a7a06a6262fc74f9c5350f8a1c93c4f1161321", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d7ec4af2810378d3c6077db0020be5321dd3c560 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 1 Aug 2018 16:05:49 -0700 Subject: [PATCH 0486/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207010940 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d201454e186..c2dadf2fe08 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1d3e8c149eaffd9fcbdef7f2a0d804984f8731dded4398564f6300527bdc15ca", - git_commit = "96a7a06a6262fc74f9c5350f8a1c93c4f1161321", + sha256 = "5b7bca2e9e6108b7b22b58a19976650f740a1fb14db4fb0fe5e81893b154c5ef", + git_commit = "52dc7286bda07a53b4bc6e5ca17ff22fc5d72af5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 903f81d6e2b760f402bd5c586bf3bdf907e85206 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 1 Aug 2018 17:01:22 -0700 Subject: [PATCH 0487/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207019885 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c2dadf2fe08..5dce7b56125 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5b7bca2e9e6108b7b22b58a19976650f740a1fb14db4fb0fe5e81893b154c5ef", - git_commit = "52dc7286bda07a53b4bc6e5ca17ff22fc5d72af5", + sha256 = "2cc1ec5fc782491ee2d5a7aacc338c581b453195178faf18e63524397db63c39", + git_commit = "bed00207976a70370cb6e3615c7ad56a5547cf45", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c2e0ac946832ea4962adc0cf142a30046b290978 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 1 Aug 2018 18:01:27 -0700 Subject: [PATCH 0488/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207027541 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5dce7b56125..cd5d47495b4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2cc1ec5fc782491ee2d5a7aacc338c581b453195178faf18e63524397db63c39", - git_commit = "bed00207976a70370cb6e3615c7ad56a5547cf45", + sha256 = "61681b961f51982503d328a651c07a393f5ffc28e0ec7373fe95f21b01068cf1", + git_commit = "7dda474c941c8ec5a341dd0d82bfd5ce7c720b21", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 91d0832e9b808950abeefafd7ef504b295e4d1cf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 1 Aug 2018 19:02:31 -0700 Subject: [PATCH 0489/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207033457 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cd5d47495b4..8ac410931a6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "61681b961f51982503d328a651c07a393f5ffc28e0ec7373fe95f21b01068cf1", - git_commit = "7dda474c941c8ec5a341dd0d82bfd5ce7c720b21", + sha256 = "bb6609ab8f56cd9dc9c19b8214b507da63812f383b8caede32d8b58f67d19a4d", + git_commit = "6e1714de56291165106fd9bee270ada964b34f88", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f67f03f9ea3f244fb32b0a415c26049e3284b33b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 1 Aug 2018 20:03:36 -0700 Subject: [PATCH 0490/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207037649 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8ac410931a6..32bcda8f870 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bb6609ab8f56cd9dc9c19b8214b507da63812f383b8caede32d8b58f67d19a4d", - git_commit = "6e1714de56291165106fd9bee270ada964b34f88", + sha256 = "d2360b479557313766278dac60dc30c059e89ae2d43937ef68cc282934a707fd", + git_commit = "07ef0a28a9ddb5b661c38f383fecd2b3c239468d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f09ac028d7b4cc204b7c5fafbb54bedacdb600df Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 1 Aug 2018 21:02:14 -0700 Subject: [PATCH 0491/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207042385 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 32bcda8f870..669bbdd8dbf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d2360b479557313766278dac60dc30c059e89ae2d43937ef68cc282934a707fd", - git_commit = "07ef0a28a9ddb5b661c38f383fecd2b3c239468d", + sha256 = "3b2feb3bd5fdd8b23821f2adc1dd78fa2d1f23083cfa5dd788c712a555ab26f1", + git_commit = "3379bae787d73d6db67d66a284bd1a076b2cbdba", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 99681f768547ad65b4644642cc6bc839976d11ae Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 Aug 2018 00:04:58 -0700 Subject: [PATCH 0492/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207054990 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 669bbdd8dbf..8d0cb159e2d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3b2feb3bd5fdd8b23821f2adc1dd78fa2d1f23083cfa5dd788c712a555ab26f1", - git_commit = "3379bae787d73d6db67d66a284bd1a076b2cbdba", + sha256 = "e2daa8f695bb76daff0619b74b1beb07956061f1551b623f6921a9574ab743f9", + git_commit = "fc8118a853c26f0773145f2f1a3fba2fc968ea73", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f5b76dfa43917fb22922920f03771a814ba905d1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 Aug 2018 01:02:38 -0700 Subject: [PATCH 0493/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207059715 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8d0cb159e2d..54af44cdd4b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e2daa8f695bb76daff0619b74b1beb07956061f1551b623f6921a9574ab743f9", - git_commit = "fc8118a853c26f0773145f2f1a3fba2fc968ea73", + sha256 = "508354770bab4764b280965b48f39a088b554b77d1c1953e2714adc84ce7f54f", + git_commit = "dec56abc7034bf4180479c16cfc5109aa843a82e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 243ffdd218badd5eb04f01d9ab0247bf5b3a0296 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 Aug 2018 04:02:13 -0700 Subject: [PATCH 0494/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207077366 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 54af44cdd4b..815f2f53e28 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "508354770bab4764b280965b48f39a088b554b77d1c1953e2714adc84ce7f54f", - git_commit = "dec56abc7034bf4180479c16cfc5109aa843a82e", + sha256 = "6de9bb6f3cc597111ac2e6b682086b3f0e9b67ddb621a051fc7d3f0270a00b87", + git_commit = "1c8a34641982294a72053304f0ece2efcbc866dd", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 15cd96b4e32815be06ebe5f9dfae88b814b4ff1b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 Aug 2018 05:01:08 -0700 Subject: [PATCH 0495/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207081648 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 815f2f53e28..a2e0433958f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6de9bb6f3cc597111ac2e6b682086b3f0e9b67ddb621a051fc7d3f0270a00b87", - git_commit = "1c8a34641982294a72053304f0ece2efcbc866dd", + sha256 = "d36b9b89415432bc9b9fab7c035c9250868c85dd7e6814da65469235df4a0f02", + git_commit = "03061e4cbfc8128e632536eee0af1ebad922b5ba", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 56233b36752a1f841a9fdd5bc6409bc198e946f4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 Aug 2018 06:01:07 -0700 Subject: [PATCH 0496/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207086969 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a2e0433958f..0029b546d1a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d36b9b89415432bc9b9fab7c035c9250868c85dd7e6814da65469235df4a0f02", - git_commit = "03061e4cbfc8128e632536eee0af1ebad922b5ba", + sha256 = "1245251a7604e342131806aa2fb74cd8fe44d065dec94fcb18ab71b66c0d25fc", + git_commit = "cfccb2ad59e2f22055daf5c9de6f1ca0586c9643", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1920c1aa6e2f671f2d8f98900d148b5167078194 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 Aug 2018 07:01:43 -0700 Subject: [PATCH 0497/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207093180 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0029b546d1a..2466621095f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1245251a7604e342131806aa2fb74cd8fe44d065dec94fcb18ab71b66c0d25fc", - git_commit = "cfccb2ad59e2f22055daf5c9de6f1ca0586c9643", + sha256 = "5847a41dfc630a5a004ac5461a755f5a33f7c259410ba9ce158e290b2fd962ad", + git_commit = "142cb17be1c024839cd972071b2f9665c87ed5f1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8213dfa233b4dbb4f8bc738b3d1d30a9289d81d6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 Aug 2018 11:05:29 -0700 Subject: [PATCH 0498/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207129980 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2466621095f..1b2e99e440f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5847a41dfc630a5a004ac5461a755f5a33f7c259410ba9ce158e290b2fd962ad", - git_commit = "142cb17be1c024839cd972071b2f9665c87ed5f1", + sha256 = "65d7112fc4fe9cf1424e908414784c52526210aa5d64cf3bc6a599ada34b5a93", + git_commit = "cd329bd1ec2fd348191b38ba6866b0dacf9d0596", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 40ad4b5628f7830a9adf34f485a26c6e1441156b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 Aug 2018 12:00:43 -0700 Subject: [PATCH 0499/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207140826 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1b2e99e440f..d0076a44394 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "65d7112fc4fe9cf1424e908414784c52526210aa5d64cf3bc6a599ada34b5a93", - git_commit = "cd329bd1ec2fd348191b38ba6866b0dacf9d0596", + sha256 = "36c028653a7fefdcfdb59e4f2fdd971de4466523a4e7c65c4180f47999d2c290", + git_commit = "4238e0f19cbbaea96a2a37f432f97fda584189ba", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d4a9c64339c579c3100df3ae3b79709902871aeb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 Aug 2018 13:04:08 -0700 Subject: [PATCH 0500/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207150835 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d0076a44394..624a6e33fdc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "36c028653a7fefdcfdb59e4f2fdd971de4466523a4e7c65c4180f47999d2c290", - git_commit = "4238e0f19cbbaea96a2a37f432f97fda584189ba", + sha256 = "4d79142837ba9df743bfbc83af4fca76b3bff43e99305ee89229245f6979f857", + git_commit = "1a13c4f2a0b4491ae3003ff0a400d5d8cb521c4a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 177937114bda52394b0e3b699912248c8b0e85d8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 Aug 2018 14:11:28 -0700 Subject: [PATCH 0501/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207162425 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 624a6e33fdc..f0d02cae852 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4d79142837ba9df743bfbc83af4fca76b3bff43e99305ee89229245f6979f857", - git_commit = "1a13c4f2a0b4491ae3003ff0a400d5d8cb521c4a", + sha256 = "53779e4a6a4c0404519515d4c964e84f8e5165fc1729fa0510a482b87f50ec1a", + git_commit = "8ec17cff881923fe3ff26b7de812cf0b2d21cd07", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e7f1b1c49de8f1ebcc6ca3bf9801695fdd2b0dfa Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Thu, 2 Aug 2018 14:11:40 -0700 Subject: [PATCH 0502/8103] Internal changes PiperOrigin-RevId: 207162468 --- .github/ISSUE_TEMPLATE/feature_request.md | 36 ------------------- .github/ISSUE_TEMPLATE/issue_template.md | 36 ------------------- .../bug_report.md => issue_template.md} | 27 ++++++++++---- 3 files changed, 20 insertions(+), 79 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md delete mode 100644 .github/ISSUE_TEMPLATE/issue_template.md rename .github/{ISSUE_TEMPLATE/bug_report.md => issue_template.md} (68%) diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index 26aabcfa49e..00000000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for TensorFlow Serving - ---- - -Please go to Stack Overflow for help and support: - -https://stackoverflow.com/questions/tagged/tensorflow-serving - -If you open a GitHub issue, here is our policy: - -1. It must be a bug, a feature request, or a significant problem with -documentation (for small docs fixes please send a PR instead). -2. The form below must be filled out. - -**Here's why we have that policy**: TensorFlow developers respond to issues. -We want to focus on work that benefits the whole community, e.g., fixing bugs -and adding features. Support only helps individuals. GitHub also notifies -thousands of people when issues are filed. We want them to see you communicating -an interesting problem, rather than being redirected to Stack Overflow. - ------------------------- -### Describe the problem the feature is intended to solve -A clear and concise description of what the problem is. Ex. I'm always -frustrated when [...] - -### Describe the solution -A clear and concise description of what you want to happen. - -### Describe alternatives you've considered -A clear and concise description of any alternative solutions or features you've -considered. - -### Additional context -Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/issue_template.md b/.github/ISSUE_TEMPLATE/issue_template.md deleted file mode 100644 index eef94d2e145..00000000000 --- a/.github/ISSUE_TEMPLATE/issue_template.md +++ /dev/null @@ -1,36 +0,0 @@ -Please go to Stack Overflow for help and support: - -https://stackoverflow.com/questions/tagged/tensorflow-serving - -If you open a GitHub issue, here is our policy: - -1. It must be a bug, a feature request, or a significant problem with - documentation (for small docs fixes please send a PR instead). -2. The form below must be filled out. - -**Here's why we have that policy**: TensorFlow developers respond to issues. -We want to focus on work that benefits the whole community, e.g., fixing bugs -and adding features. Support only helps individuals. GitHub also notifies -thousands of people when issues are filed. We want them to see you communicating -an interesting problem, rather than being redirected to Stack Overflow. - ------------------------- - -### System information -- **OS Platform and Distribution (e.g., Linux Ubuntu 16.04)**: -- **TensorFlow Serving installed from (source or binary)**: -- **TensorFlow Serving version**: - -### Describe the problem -Describe the problem clearly here. Be sure to convey here why it's a bug in -TensorFlow Serving. - -### Exact Steps to Reproduce -Please include all steps necessary for someone to reproduce this issue on their -own machine. If not, skip this section. - -### Source code / logs -Include any logs or source code that would be helpful to diagnose the problem. -If including tracebacks, please include the full traceback. Large logs and files -should be attached. Try to provide a reproducible test case that is the bare -minimum necessary to generate the problem. diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/issue_template.md similarity index 68% rename from .github/ISSUE_TEMPLATE/bug_report.md rename to .github/issue_template.md index 3f06bd8686b..bf2500004fa 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/issue_template.md @@ -1,9 +1,3 @@ ---- -name: Bug Report -about: Create a report to help us improve TensorFlow Serving - ---- - Please go to Stack Overflow for help and support: https://stackoverflow.com/questions/tagged/tensorflow-serving @@ -20,7 +14,26 @@ and adding features. Support only helps individuals. GitHub also notifies thousands of people when issues are filed. We want them to see you communicating an interesting problem, rather than being redirected to Stack Overflow. ------------------------- +----------------------- +## Feature Request +If this is a feature request, please fill out the following form in full: + +### Describe the problem the feature is intended to solve +A clear and concise description of what the problem is. Ex. I'm always +frustrated when [...] + +### Describe the solution +A clear and concise description of what you want to happen. + +### Describe alternatives you've considered +A clear and concise description of any alternative solutions or features you've +considered. + +### Additional context +Add any other context or screenshots about the feature request here. + +## Bug Report +If this is a bug report, please fill out the following form in full: ### System information - **OS Platform and Distribution (e.g., Linux Ubuntu 16.04)**: From f1e33715403d2674d1a968181275c5b4db2f6338 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 Aug 2018 15:07:05 -0700 Subject: [PATCH 0503/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207172742 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f0d02cae852..847fc141538 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "53779e4a6a4c0404519515d4c964e84f8e5165fc1729fa0510a482b87f50ec1a", - git_commit = "8ec17cff881923fe3ff26b7de812cf0b2d21cd07", + sha256 = "fcc3791b27ce0f985e5da348f882e258ca25c9003e3cd15ac9d639875ff897da", + git_commit = "b42e7926f78dcb14fdb2169d106fc7a923acca78", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5bd88e01b357fd874b00b13726e45d4c03a09959 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Thu, 2 Aug 2018 15:46:00 -0700 Subject: [PATCH 0504/8103] Internal change PiperOrigin-RevId: 207179369 --- tensorflow_serving/tools/docker/Dockerfile.devel | 3 ++- tensorflow_serving/tools/docker/Dockerfile.devel-gpu | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index 707047ee63a..84b9548947c 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -70,7 +70,8 @@ RUN git clone --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tenso # Build, and install TensorFlow Serving ARG TF_SERVING_BUILD_OPTIONS="--copt=-mavx --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0" -ARG TF_SERVING_BAZEL_OPTIONS="--verbose_failures --local_resources=4096,1.0,1.0" +ARG TF_SERVING_BAZEL_OPTIONS="--verbose_failures" + RUN bazel build -c opt --color=yes --curses=yes \ ${TF_SERVING_BAZEL_OPTIONS} \ --output_filter=DONT_MATCH_ANYTHING \ diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 901d9f89cb4..25649bd7a2f 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -121,7 +121,7 @@ RUN git clone --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tenso # Build, and install TensorFlow Serving ARG TF_SERVING_BUILD_OPTIONS="--copt=-mavx --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0" -ARG TF_SERVING_BAZEL_OPTIONS="--verbose_failures --local_resources=4096,1.0,1.0" +ARG TF_SERVING_BAZEL_OPTIONS="--verbose_failures" RUN ln -s /usr/local/cuda/lib64/stubs/libcuda.so /usr/local/cuda/lib64/stubs/libcuda.so.1 && \ LD_LIBRARY_PATH=/usr/local/cuda/lib64/stubs:${LD_LIBRARY_PATH} \ bazel build -c opt --color=yes --curses=yes --config=cuda \ From 0c1259b723d91fc02e166656ab0e55bd760b37cf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 Aug 2018 16:01:27 -0700 Subject: [PATCH 0505/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207181765 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 847fc141538..d8bd95c42b6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fcc3791b27ce0f985e5da348f882e258ca25c9003e3cd15ac9d639875ff897da", - git_commit = "b42e7926f78dcb14fdb2169d106fc7a923acca78", + sha256 = "3048d3ec75aee1ac5e0fc614cc82b12fed9dcc11f125a1016edbab206c888504", + git_commit = "a12135ff5f8cb786608c1caf3460efd61f32c4c5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d3571a3c8aeffe64bb42fce84e6bb37825dfe168 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 Aug 2018 17:06:33 -0700 Subject: [PATCH 0506/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207191732 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d8bd95c42b6..3a6de1702cc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3048d3ec75aee1ac5e0fc614cc82b12fed9dcc11f125a1016edbab206c888504", - git_commit = "a12135ff5f8cb786608c1caf3460efd61f32c4c5", + sha256 = "c20c3017d3b1f1efe65b8ae98b5f25ec515f8b6e78f7523f12aa1322a2d2ad89", + git_commit = "4bc5c6c77daea8d5e60c22732b56495a0cd6c681", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a972d5685c3392e43b947aa31b2ebaaf2e6808d5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 Aug 2018 18:07:36 -0700 Subject: [PATCH 0507/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207199585 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3a6de1702cc..5476faa1176 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c20c3017d3b1f1efe65b8ae98b5f25ec515f8b6e78f7523f12aa1322a2d2ad89", - git_commit = "4bc5c6c77daea8d5e60c22732b56495a0cd6c681", + sha256 = "66677ae791a6ee5fd61e2d9aa7bf944cfeb88b65fb7533f55f27a955c5a8b5d7", + git_commit = "294766e34ddfa801878f58560d088b07841bea26", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From cdb7e3ff4d762312341729d6be3c755bde32673e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 Aug 2018 19:14:39 -0700 Subject: [PATCH 0508/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207205981 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5476faa1176..ab84ca7d3b9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "66677ae791a6ee5fd61e2d9aa7bf944cfeb88b65fb7533f55f27a955c5a8b5d7", - git_commit = "294766e34ddfa801878f58560d088b07841bea26", + sha256 = "e89a366afe007471553c47c72e177cb583618eac7a05ed26f6f733ac177fa42f", + git_commit = "200fa71857e1b0f2e15a36331b4e7737e701262d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d739b472fa05e734b5b07420e4681bafd21a7fd9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 Aug 2018 20:01:34 -0700 Subject: [PATCH 0509/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207209296 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ab84ca7d3b9..4ee5801ded5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e89a366afe007471553c47c72e177cb583618eac7a05ed26f6f733ac177fa42f", - git_commit = "200fa71857e1b0f2e15a36331b4e7737e701262d", + sha256 = "26937d656c954a6242622c0ca81f2ff45a8aef821f197af2aca5f5f6790a1f35", + git_commit = "2d3819668d8c3ab99cd09a769ffb7b76e453fd8f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 157183e39d05fa52fc2fdf4629c1bb516f8d8926 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 Aug 2018 22:02:02 -0700 Subject: [PATCH 0510/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207218399 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4ee5801ded5..e7a0ceef1df 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "26937d656c954a6242622c0ca81f2ff45a8aef821f197af2aca5f5f6790a1f35", - git_commit = "2d3819668d8c3ab99cd09a769ffb7b76e453fd8f", + sha256 = "a4923413e7cfd7a476b5ac6c3e24b8c2be24f8a909656e37b3345bf23b765b49", + git_commit = "eecadedbaae7b938e8a80dfb60c52679bcbf7196", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e90b7324110a4f22b8bc2b8ce8b59631c1ebdef0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 Aug 2018 23:03:06 -0700 Subject: [PATCH 0511/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207222713 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e7a0ceef1df..a2b325963ae 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a4923413e7cfd7a476b5ac6c3e24b8c2be24f8a909656e37b3345bf23b765b49", - git_commit = "eecadedbaae7b938e8a80dfb60c52679bcbf7196", + sha256 = "d95b6e0e76694ac093b10e118b49196c3b9b57c0d0f5be0f4eab503a6924cacb", + git_commit = "493d7588172bcf476309b3954db342839ca37872", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f3fcbae28bed72d0423044cad366ffda0f061431 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 3 Aug 2018 04:02:27 -0700 Subject: [PATCH 0512/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207247564 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a2b325963ae..2afe39b442b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d95b6e0e76694ac093b10e118b49196c3b9b57c0d0f5be0f4eab503a6924cacb", - git_commit = "493d7588172bcf476309b3954db342839ca37872", + sha256 = "ed6a3bc589ccec55a76ccb88e32305752cec393e360788d219a6147fb7b2cf7c", + git_commit = "f74a3af20bb24b1de199e50bf9b2a405090a6666", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 11139e2f40de691efd90bce453869f1fcef10e92 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 3 Aug 2018 06:01:17 -0700 Subject: [PATCH 0513/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207255640 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2afe39b442b..de1b1d07e44 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ed6a3bc589ccec55a76ccb88e32305752cec393e360788d219a6147fb7b2cf7c", - git_commit = "f74a3af20bb24b1de199e50bf9b2a405090a6666", + sha256 = "066e1b5f0d778c169b8fbdec6e7f80066e26e723f0fab1609f748126c39d3c68", + git_commit = "37b48fac2c365c49373467abf5fc58c4678e700e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 86bb2e283cef69817133c6eb66116981d04f2914 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 3 Aug 2018 07:01:29 -0700 Subject: [PATCH 0514/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207261177 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index de1b1d07e44..636ea2f228e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "066e1b5f0d778c169b8fbdec6e7f80066e26e723f0fab1609f748126c39d3c68", - git_commit = "37b48fac2c365c49373467abf5fc58c4678e700e", + sha256 = "813ecf42fb52b12fbc6f9eeb1c0e1627f8996b5bb5e79d522cfe56dd49fb9b06", + git_commit = "b2933c618260edc039fb8a7e2dce4d2e185f0892", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 53f22e4c57f18575e26ce0c5cf3174715069b673 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 3 Aug 2018 10:02:47 -0700 Subject: [PATCH 0515/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207282305 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 636ea2f228e..b366b3b7a0f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "813ecf42fb52b12fbc6f9eeb1c0e1627f8996b5bb5e79d522cfe56dd49fb9b06", - git_commit = "b2933c618260edc039fb8a7e2dce4d2e185f0892", + sha256 = "a4a8b7e12a0833254fa52c6ba402a2dec29f993ad85e97f025c3d33fdfd4379b", + git_commit = "5f13e7017e059b234a1d66e704122ddae2d1a2cb", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1b62e2e5d1800a0e1ce856e96ef29a5e80e0962b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 3 Aug 2018 11:03:37 -0700 Subject: [PATCH 0516/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207292450 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b366b3b7a0f..f7b16d1c79d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a4a8b7e12a0833254fa52c6ba402a2dec29f993ad85e97f025c3d33fdfd4379b", - git_commit = "5f13e7017e059b234a1d66e704122ddae2d1a2cb", + sha256 = "b6771d446ff6b02f22d39068e71db0f91b4674b09d483a6fc8e698e7c7507951", + git_commit = "c828bd5e2414ae0c9d3033eee91a36c44324d3ad", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 535821151b9ea03464050e6f19690ece5a26be81 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Fri, 3 Aug 2018 11:47:39 -0700 Subject: [PATCH 0517/8103] Internal change PiperOrigin-RevId: 207300092 --- tensorflow_serving/tools/docker/Dockerfile.devel | 3 ++- tensorflow_serving/tools/docker/Dockerfile.devel-gpu | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index 84b9548947c..b3e0161c784 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -70,10 +70,11 @@ RUN git clone --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tenso # Build, and install TensorFlow Serving ARG TF_SERVING_BUILD_OPTIONS="--copt=-mavx --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0" -ARG TF_SERVING_BAZEL_OPTIONS="--verbose_failures" +ARG TF_SERVING_BAZEL_OPTIONS="" RUN bazel build -c opt --color=yes --curses=yes \ ${TF_SERVING_BAZEL_OPTIONS} \ + --verbose_failures \ --output_filter=DONT_MATCH_ANYTHING \ ${TF_SERVING_BUILD_OPTIONS} \ tensorflow_serving/model_servers:tensorflow_model_server && \ diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 25649bd7a2f..6d784f531a2 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -121,11 +121,12 @@ RUN git clone --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tenso # Build, and install TensorFlow Serving ARG TF_SERVING_BUILD_OPTIONS="--copt=-mavx --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0" -ARG TF_SERVING_BAZEL_OPTIONS="--verbose_failures" +ARG TF_SERVING_BAZEL_OPTIONS="" RUN ln -s /usr/local/cuda/lib64/stubs/libcuda.so /usr/local/cuda/lib64/stubs/libcuda.so.1 && \ LD_LIBRARY_PATH=/usr/local/cuda/lib64/stubs:${LD_LIBRARY_PATH} \ bazel build -c opt --color=yes --curses=yes --config=cuda \ ${TF_SERVING_BAZEL_OPTIONS} \ + --verbose_failures \ --output_filter=DONT_MATCH_ANYTHING \ ${TF_SERVING_BUILD_OPTIONS} \ tensorflow_serving/model_servers:tensorflow_model_server && \ From 9234ff630c0e7cf1c13da7fc6978404d3e55a6d2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 3 Aug 2018 12:01:48 -0700 Subject: [PATCH 0518/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207302294 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f7b16d1c79d..4fe1bba9c17 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b6771d446ff6b02f22d39068e71db0f91b4674b09d483a6fc8e698e7c7507951", - git_commit = "c828bd5e2414ae0c9d3033eee91a36c44324d3ad", + sha256 = "21dd1e8c8e98aee06756437443f345bcc4614ea7fe4b11e9308d3f30cd629e4c", + git_commit = "8653ae60ec3f9ac9b6f9913830c38f656b1b6a1f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5c806796db04b26c879a069454ab024c0b24d710 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 3 Aug 2018 13:01:51 -0700 Subject: [PATCH 0519/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207311182 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4fe1bba9c17..84ccf239350 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "21dd1e8c8e98aee06756437443f345bcc4614ea7fe4b11e9308d3f30cd629e4c", - git_commit = "8653ae60ec3f9ac9b6f9913830c38f656b1b6a1f", + sha256 = "fff79447eaaa639f3fba6536e4d1db93c421c2ee647587c7f89caa626aeff29c", + git_commit = "dd45704d092dac87575b8ce39013f91f4f213dc0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e55b52c2ea12de786a976def9bb2e6fd1d0c4f02 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 3 Aug 2018 14:01:18 -0700 Subject: [PATCH 0520/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207320344 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 84ccf239350..0b07e62bae3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fff79447eaaa639f3fba6536e4d1db93c421c2ee647587c7f89caa626aeff29c", - git_commit = "dd45704d092dac87575b8ce39013f91f4f213dc0", + sha256 = "68d13973f187d72aa3022a9883f0e7acf88ae4307801c382e0ee132d34c7f034", + git_commit = "249e639d634b26d1684d0df14ab6933feeba83a3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 29f21ca8d9ab3c2aa31e5ae252cf46354489bec0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 3 Aug 2018 15:01:12 -0700 Subject: [PATCH 0521/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207329704 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0b07e62bae3..3edaa1d3959 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "68d13973f187d72aa3022a9883f0e7acf88ae4307801c382e0ee132d34c7f034", - git_commit = "249e639d634b26d1684d0df14ab6933feeba83a3", + sha256 = "42b31a7e76454b385e334d190e26362c97b89dea4d974887d47a2ecc68dcd3d6", + git_commit = "d4830a56b4d2dbbe3c54ad0090be645d3b314f45", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 59e25ffa9b62a65058b5f868708d07ceb6c14d35 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 3 Aug 2018 16:01:04 -0700 Subject: [PATCH 0522/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207338762 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3edaa1d3959..833332ca57e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "42b31a7e76454b385e334d190e26362c97b89dea4d974887d47a2ecc68dcd3d6", - git_commit = "d4830a56b4d2dbbe3c54ad0090be645d3b314f45", + sha256 = "feca59845faec19b2fbabceeaef460da9f43543021927676d909988a3941aee1", + git_commit = "5a5e42e5756987e5f0525379ab75d00c81b70d00", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ca6bf66aa74a5edcd4a417f734cdcbfbdbac5222 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 3 Aug 2018 17:02:40 -0700 Subject: [PATCH 0523/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207347941 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 833332ca57e..fa81143716b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "feca59845faec19b2fbabceeaef460da9f43543021927676d909988a3941aee1", - git_commit = "5a5e42e5756987e5f0525379ab75d00c81b70d00", + sha256 = "069c8119e1b4b93d58982c6e2f506c63953cf207b9efd573a0ba8bdd6171388e", + git_commit = "8cd7135ea19fc184c873a1ba1463ff4b77f3c7ad", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 178a711b8e5028e03912063769e682c678aa0629 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 3 Aug 2018 18:02:01 -0700 Subject: [PATCH 0524/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207353790 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fa81143716b..fb49f6f7824 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "069c8119e1b4b93d58982c6e2f506c63953cf207b9efd573a0ba8bdd6171388e", - git_commit = "8cd7135ea19fc184c873a1ba1463ff4b77f3c7ad", + sha256 = "44c43b57bdefaaaacc20028edb4a874228b5828d03c30d13bbccff07f58ccb77", + git_commit = "66dd14547dd9edb4eba13d22361ddad4a1cd3353", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2d42e6d631d2e9153e6f95f2fbdf0010281e788d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 3 Aug 2018 19:03:49 -0700 Subject: [PATCH 0525/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207358135 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fb49f6f7824..324300205da 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "44c43b57bdefaaaacc20028edb4a874228b5828d03c30d13bbccff07f58ccb77", - git_commit = "66dd14547dd9edb4eba13d22361ddad4a1cd3353", + sha256 = "caa8740c8e659c8c0ef5e5ef11e84605ee8f4ee8dfaddbbf1b1fd2546bb0f754", + git_commit = "ea5b1e4b5e3f1f8682c18f6ad09af45eb17f415d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 74784821c1d188775b1a07523a683b8b29ce24d6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 3 Aug 2018 20:01:00 -0700 Subject: [PATCH 0526/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207361441 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 324300205da..a4d91d4d1c3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "caa8740c8e659c8c0ef5e5ef11e84605ee8f4ee8dfaddbbf1b1fd2546bb0f754", - git_commit = "ea5b1e4b5e3f1f8682c18f6ad09af45eb17f415d", + sha256 = "5482a68d5f8bd2cb2eeee6c34624c5e541d12e11e6f6d9a15cf45515d6e22a3f", + git_commit = "3afa81aaf863b6d154a13c9c05f6806326580ea7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c7543764bd1fc9c41876604af162c8f3119036ff Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 3 Aug 2018 21:01:44 -0700 Subject: [PATCH 0527/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207364770 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a4d91d4d1c3..164c8a24592 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5482a68d5f8bd2cb2eeee6c34624c5e541d12e11e6f6d9a15cf45515d6e22a3f", - git_commit = "3afa81aaf863b6d154a13c9c05f6806326580ea7", + sha256 = "2b24081dcd8df2db3b3d1731dc901648d4a425bf1e42a8167b93a8f4e65dd39b", + git_commit = "f9acd38eb687208dcee8622510b9a611e51d21a4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 56f0104ddec475cd8cefa96019d8623b0b88adc5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 4 Aug 2018 04:02:18 -0700 Subject: [PATCH 0528/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207386452 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 164c8a24592..fbaef46d7e1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2b24081dcd8df2db3b3d1731dc901648d4a425bf1e42a8167b93a8f4e65dd39b", - git_commit = "f9acd38eb687208dcee8622510b9a611e51d21a4", + sha256 = "d9ce5bbf5bc46b32f72954ec5c4529876e29118f44c8ab89a138cca936160a38", + git_commit = "c54f0cb8b5f53ae0da6561f1a385b006cf76142c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0adf991148e79ba6f9a6082f10366b42eec233af Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 4 Aug 2018 09:01:54 -0700 Subject: [PATCH 0529/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207398055 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fbaef46d7e1..75c705f2509 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d9ce5bbf5bc46b32f72954ec5c4529876e29118f44c8ab89a138cca936160a38", - git_commit = "c54f0cb8b5f53ae0da6561f1a385b006cf76142c", + sha256 = "db28eba8ed94b7bd4ea0526c4b8df5c95e9398798ecb7b751dd86c442be051ee", + git_commit = "3a41e5363530f058cb2b57cf0add09931ec788b2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8678a754a1f02fcf4a0ad43f4ea9344adcc6d8c5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 4 Aug 2018 15:01:38 -0700 Subject: [PATCH 0530/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207411537 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 75c705f2509..234acf019f4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "db28eba8ed94b7bd4ea0526c4b8df5c95e9398798ecb7b751dd86c442be051ee", - git_commit = "3a41e5363530f058cb2b57cf0add09931ec788b2", + sha256 = "136f4a82b61ee32ee260e3e682c75c22b8cdbcf6f0deb61fbff9f8e7d191487f", + git_commit = "cb80a1ed9fafc9274f031adca4ec5b754ac93f2a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 53e432115160a610554562daa90b01f189fa39a2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 5 Aug 2018 04:02:23 -0700 Subject: [PATCH 0531/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207444277 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 234acf019f4..b9ebbf439cc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "136f4a82b61ee32ee260e3e682c75c22b8cdbcf6f0deb61fbff9f8e7d191487f", - git_commit = "cb80a1ed9fafc9274f031adca4ec5b754ac93f2a", + sha256 = "05b7eadfc52cd1e4c2d9c0a71fd5348a18b69abc4f923e31e39292b7a7f1a41b", + git_commit = "c42013f103ab8f6588cff1a8e59bc1ef81435bcc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b696a225ac1dc0bb3d3aeb1c0c8c4165332f5eb7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 6 Aug 2018 00:02:11 -0700 Subject: [PATCH 0532/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207497976 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b9ebbf439cc..3f09bf9a79f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "05b7eadfc52cd1e4c2d9c0a71fd5348a18b69abc4f923e31e39292b7a7f1a41b", - git_commit = "c42013f103ab8f6588cff1a8e59bc1ef81435bcc", + sha256 = "e2d697f536cf710ea1579c1eb3465df8ab5563e1e09216114570397ae77e3407", + git_commit = "91f75c8ca776f058d5cb7eb01b5c8e537256507b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 826c329759ded293adc88fc7656bbd33c91f321f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 6 Aug 2018 04:02:44 -0700 Subject: [PATCH 0533/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207521791 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3f09bf9a79f..b15d78481c8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e2d697f536cf710ea1579c1eb3465df8ab5563e1e09216114570397ae77e3407", - git_commit = "91f75c8ca776f058d5cb7eb01b5c8e537256507b", + sha256 = "53c49ce8ce28aacb921b951aab84f04a61f11a8a7bed7676ed1efc534682a09f", + git_commit = "e70f94ee089abbb9eb70361b5cdef55aa9beb18b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a95978f55a2f8e09ac8d9aa61ab35c23da5e5b1f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 6 Aug 2018 09:02:49 -0700 Subject: [PATCH 0534/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207553345 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b15d78481c8..01ea4b88b13 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "53c49ce8ce28aacb921b951aab84f04a61f11a8a7bed7676ed1efc534682a09f", - git_commit = "e70f94ee089abbb9eb70361b5cdef55aa9beb18b", + sha256 = "926df228a3827903c74e5febb5dbb321276aeff8305760470df4449542be0ec0", + git_commit = "2b8df9f4064d5cf21786ebc9da4d800233d1afa6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 67af1349e6ed47ab9c56335112c00a64e4c63d33 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 6 Aug 2018 10:00:41 -0700 Subject: [PATCH 0535/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207561938 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 01ea4b88b13..6561ddae306 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "926df228a3827903c74e5febb5dbb321276aeff8305760470df4449542be0ec0", - git_commit = "2b8df9f4064d5cf21786ebc9da4d800233d1afa6", + sha256 = "b025d91835d7c0da304d2ee64303814cdbd5ed5e6206f45e6e65806a3ef2c8a2", + git_commit = "291f29b794bd0b782f4d8717bd29bda206060457", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From dda62179ebc32ee6f63fc8b621d398a1647cd858 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 6 Aug 2018 11:02:09 -0700 Subject: [PATCH 0536/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207573133 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6561ddae306..64b3c05df2e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b025d91835d7c0da304d2ee64303814cdbd5ed5e6206f45e6e65806a3ef2c8a2", - git_commit = "291f29b794bd0b782f4d8717bd29bda206060457", + sha256 = "203ab03b356de10408d4455cc2f6fb6aa337e7c57238f99d19ddf40e6fa99bbb", + git_commit = "643eec88fa70f4c0a7bee59cfb7eaacb1ddb415c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7b60860b3c9d3df9f741ac5a4517f72e598a16bf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 6 Aug 2018 12:01:38 -0700 Subject: [PATCH 0537/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207584110 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 64b3c05df2e..f74e560b392 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "203ab03b356de10408d4455cc2f6fb6aa337e7c57238f99d19ddf40e6fa99bbb", - git_commit = "643eec88fa70f4c0a7bee59cfb7eaacb1ddb415c", + sha256 = "002df6a6c0889c7e3daea13566e76d790aedb3c9633a066940621b43419365a8", + git_commit = "915cf10d4bcbb51f079f6841aeaf876b430a920b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9053805e8cd728c4dfbeaef05e1505fab9171c1a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 6 Aug 2018 13:01:45 -0700 Subject: [PATCH 0538/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207593400 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f74e560b392..fb7050c4ea2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "002df6a6c0889c7e3daea13566e76d790aedb3c9633a066940621b43419365a8", - git_commit = "915cf10d4bcbb51f079f6841aeaf876b430a920b", + sha256 = "35412aae2adabbed7395a322b31070ec36783754ee5be070b966696a0ae45741", + git_commit = "1282e2b6fbb5f3ce9745402922a84291786ec62d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 110845a40a6670067aa7cc24ed889ea829999063 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 6 Aug 2018 14:01:54 -0700 Subject: [PATCH 0539/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207603607 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fb7050c4ea2..7b6547672e9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "35412aae2adabbed7395a322b31070ec36783754ee5be070b966696a0ae45741", - git_commit = "1282e2b6fbb5f3ce9745402922a84291786ec62d", + sha256 = "dc4bffeb38b8df736a4bea125df8535905f61134679eb7d3445c6fd8d47a0382", + git_commit = "598f043fee12daf711cd65f36487483c722a489d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ab1372b0a2537cde1d4597f7468dce9bcbdc0ee5 Mon Sep 17 00:00:00 2001 From: awk Date: Mon, 6 Aug 2018 14:18:35 -0700 Subject: [PATCH 0540/8103] o Restructure test to start one model server for every unique variation of model server flags (model name, path and other params). This results in majority of the tests (all predict/ classify/regress over grpc and rest) sharing the same server and executing faster. This change shaves off ~15-20 seconds in overall test run. o Add retry for REST API calls. PiperOrigin-RevId: 207606701 --- .../tensorflow_model_server_test.py | 267 +++++++++--------- 1 file changed, 138 insertions(+), 129 deletions(-) diff --git a/tensorflow_serving/model_servers/tensorflow_model_server_test.py b/tensorflow_serving/model_servers/tensorflow_model_server_test.py index 0d89e78c4d5..4312a86d928 100644 --- a/tensorflow_serving/model_servers/tensorflow_model_server_test.py +++ b/tensorflow_serving/model_servers/tensorflow_model_server_test.py @@ -77,23 +77,111 @@ def WaitForServerReady(port): break -def CallREST(name, url, req): +def CallREST(name, url, req, max_attempts=60): """Returns HTTP response body from a REST API call.""" - print 'Sending {} request to {} with data:\n{}'.format(name, url, req) - resp = urllib2.urlopen(urllib2.Request(url, data=json.dumps(req))) - resp_data = resp.read() - print 'Received response:\n{}'.format(resp_data) - resp.close() - return resp_data + for attempt in range(max_attempts): + try: + print 'Attempt {}: Sending {} request to {} with data:\n{}'.format( + attempt, name, url, req) + resp = urllib2.urlopen(urllib2.Request(url, data=json.dumps(req))) + resp_data = resp.read() + print 'Received response:\n{}'.format(resp_data) + resp.close() + return resp_data + except Exception as e: # pylint: disable=broad-except + print 'Failed attempt {}. Error: {}'.format(attempt, e) + if attempt == max_attempts - 1: + raise + print 'Retrying...' + time.sleep(1) class TensorflowModelServerTest(tf.test.TestCase): """This class defines integration test cases for tensorflow_model_server.""" - def __TestSrcDirPath(self, relative_path=''): + @staticmethod + def __TestSrcDirPath(relative_path=''): return os.path.join(os.environ['TEST_SRCDIR'], 'tf_serving/tensorflow_serving', relative_path) + @staticmethod + def GetArgsKey(*args, **kwargs): + return args + tuple(sorted(kwargs.items())) + + # Maps string key -> 2-tuple of 'host:port' string. + model_servers_dict = {} + + @staticmethod + def RunServer(model_name, + model_path, + model_config_file=None, + batching_parameters_file=None, + grpc_channel_arguments='', + wait_for_server_ready=True, + pipe=None): + """Run tensorflow_model_server using test config. + + A unique instance of server is started for each set of arguments. + If called with same arguments, handle to an existing server is + returned. + + Args: + model_name: Name of model. + model_path: Path to model. + model_config_file: Path to model config file. + batching_parameters_file: Path to batching parameters. + grpc_channel_arguments: Custom gRPC args for server. + wait_for_server_ready: Wait for gRPC port to be ready. + pipe: subpipe.PIPE object to read stderr from server. + + Returns: + 3-tuple (, , ). + + Raises: + ValueError: when both model_path and config_file is empty. + """ + args_key = TensorflowModelServerTest.GetArgsKey(**locals()) + if args_key in TensorflowModelServerTest.model_servers_dict: + return TensorflowModelServerTest.model_servers_dict[args_key] + port = PickUnusedPort() + rest_api_port = PickUnusedPort() + print('Starting test server on port: {} for model_name: ' + '{}/model_config_file: {}'.format(port, model_name, + model_config_file)) + command = os.path.join( + TensorflowModelServerTest.__TestSrcDirPath('model_servers'), + 'tensorflow_model_server') + command += ' --port=' + str(port) + command += ' --rest_api_port=' + str(rest_api_port) + command += ' --rest_api_timeout_in_ms=' + str(HTTP_REST_TIMEOUT_MS) + + if model_config_file: + command += ' --model_config_file=' + model_config_file + elif model_path: + command += ' --model_name=' + model_name + command += ' --model_base_path=' + model_path + else: + raise ValueError('Both model_config_file and model_path cannot be empty!') + + if batching_parameters_file: + command += ' --enable_batching' + command += ' --batching_parameters_file=' + batching_parameters_file + if grpc_channel_arguments: + command += ' --grpc_channel_arguments=' + grpc_channel_arguments + print command + proc = subprocess.Popen(shlex.split(command), stderr=pipe) + atexit.register(proc.kill) + print 'Server started' + if wait_for_server_ready: + WaitForServerReady(port) + hostports = ( + proc, + 'localhost:' + str(port), + 'localhost:' + str(rest_api_port), + ) + TensorflowModelServerTest.model_servers_dict[args_key] = hostports + return hostports + def __BuildModelConfigFile(self): """Write a config file to disk for use in tests. @@ -111,8 +199,8 @@ def __BuildModelConfigFile(self): def setUp(self): """Sets up integration test parameters.""" - self.binary_dir = self.__TestSrcDirPath('model_servers') - self.testdata_dir = self.__TestSrcDirPath('servables/tensorflow/testdata') + self.testdata_dir = TensorflowModelServerTest.__TestSrcDirPath( + 'servables/tensorflow/testdata') self.temp_dir = tf.test.get_temp_dir() self.server_proc = None self.__BuildModelConfigFile() @@ -121,59 +209,6 @@ def tearDown(self): """Deletes created configuration file.""" os.remove(self._GetGoodModelConfigFile()) - def TerminateProcs(self): - """Terminate all processes.""" - print 'Terminating all processes...' - if self.server_proc is not None: - self.server_proc.terminate() - - def RunServer(self, - port, - model_name, - model_path, - batching_parameters_file='', - grpc_channel_arguments='', - wait_for_server_ready=True, - rest_api_port=None): - """Run tensorflow_model_server using test config.""" - print 'Starting test server...' - command = os.path.join(self.binary_dir, 'tensorflow_model_server') - command += ' --port=' + str(port) - command += ' --model_name=' + model_name - command += ' --model_base_path=' + model_path - if batching_parameters_file: - command += ' --enable_batching' - command += ' --batching_parameters_file=' + batching_parameters_file - if grpc_channel_arguments: - command += ' --grpc_channel_arguments=' + grpc_channel_arguments - if rest_api_port: - command += ' --rest_api_port=' + str(rest_api_port) - command += ' --rest_api_timeout_in_ms=' + str(HTTP_REST_TIMEOUT_MS) - print command - self.server_proc = subprocess.Popen(shlex.split(command)) - print 'Server started' - if wait_for_server_ready: - WaitForServerReady(port) - return 'localhost:' + str(port) - - def RunServerWithModelConfigFile(self, - port, - model_config_file, - pipe=None, - wait_for_server_ready=True): - """Run tensorflow_model_server using test config.""" - print 'Starting test server...' - command = os.path.join(self.binary_dir, 'tensorflow_model_server') - command += ' --port=' + str(port) - command += ' --model_config_file=' + model_config_file - - print command - self.server_proc = subprocess.Popen(shlex.split(command), stderr=pipe) - print 'Server started' - if wait_for_server_ready: - WaitForServerReady(port) - return 'localhost:' + str(port) - def VerifyPredictRequest(self, model_server_address, expected_output, @@ -273,10 +308,8 @@ def _VerifyModelSpec(self, def testGetModelStatus(self): """Test ModelService.GetModelStatus implementation.""" model_path = self._GetSavedModelBundlePath() - - atexit.register(self.TerminateProcs) - model_server_address = self.RunServer(PickUnusedPort(), 'default', - model_path) + model_server_address = TensorflowModelServerTest.RunServer( + 'default', model_path)[1] print 'Sending GetModelStatus request...' # Send request @@ -294,10 +327,8 @@ def testGetModelStatus(self): def testClassify(self): """Test PredictionService.Classify implementation.""" model_path = self._GetSavedModelBundlePath() - - atexit.register(self.TerminateProcs) - model_server_address = self.RunServer(PickUnusedPort(), 'default', - model_path) + model_server_address = TensorflowModelServerTest.RunServer( + 'default', model_path)[1] print 'Sending Classify request...' # Prepare request @@ -325,10 +356,8 @@ def testClassify(self): def testRegress(self): """Test PredictionService.Regress implementation.""" model_path = self._GetSavedModelBundlePath() - - atexit.register(self.TerminateProcs) - model_server_address = self.RunServer(PickUnusedPort(), 'default', - model_path) + model_server_address = TensorflowModelServerTest.RunServer( + 'default', model_path)[1] print 'Sending Regress request...' # Prepare request @@ -354,12 +383,8 @@ def testRegress(self): def testMultiInference(self): """Test PredictionService.MultiInference implementation.""" model_path = self._GetSavedModelBundlePath() - enable_batching = False - - atexit.register(self.TerminateProcs) - model_server_address = self.RunServer(PickUnusedPort(), 'default', - model_path, - enable_batching) + model_server_address = TensorflowModelServerTest.RunServer( + 'default', model_path)[1] print 'Sending MultiInference request...' # Prepare request @@ -392,22 +417,23 @@ def testMultiInference(self): request.tasks[i].model_spec.signature_name, self._GetModelVersion(model_path)) - def _TestPredict(self, - model_path, - batching_parameters_file='', - signature_name= - signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY): + def _TestPredict( + self, + model_path, + batching_parameters_file=None, + signature_name=signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY): """Helper method to test prediction. Args: model_path: Path to the model on disk. - batching_parameters_file: Batching parameters file to use (if left empty, + batching_parameters_file: Batching parameters file to use (if None batching is not enabled). signature_name: Signature name to expect in the PredictResponse. """ - atexit.register(self.TerminateProcs) - model_server_address = self.RunServer(PickUnusedPort(), 'default', - model_path, batching_parameters_file) + model_server_address = TensorflowModelServerTest.RunServer( + 'default', + model_path, + batching_parameters_file=batching_parameters_file)[1] expected_version = self._GetModelVersion(model_path) self.VerifyPredictRequest(model_server_address, expected_output=3.0, expected_version=expected_version, @@ -435,15 +461,13 @@ def testPredictUpconvertedSavedModel(self): def _TestBadModel(self): """Helper method to test against a bad model export.""" - atexit.register(self.TerminateProcs) # Both SessionBundle and SavedModel use the same bad model path, but in the # case of SavedModel, the export will get up-converted to a SavedModel. # As the bad model will prevent the server from becoming ready, we set the # wait_for_server_ready param to False to avoid blocking/timing out. model_path = os.path.join(self.testdata_dir, 'bad_half_plus_two'), - model_server_address = self.RunServer(PickUnusedPort(), 'default', - model_path, - wait_for_server_ready=False) + model_server_address = TensorflowModelServerTest.RunServer( + 'default', model_path, wait_for_server_ready=False)[1] with self.assertRaises(grpc.RpcError) as ectxt: self.VerifyPredictRequest( model_server_address, expected_output=3.0, @@ -458,9 +482,8 @@ def _TestBadModelUpconvertedSavedModel(self): def testGoodModelConfig(self): """Test server configuration from file works with valid configuration.""" - atexit.register(self.TerminateProcs) - model_server_address = self.RunServerWithModelConfigFile( - PickUnusedPort(), self._GetGoodModelConfigFile()) + model_server_address = TensorflowModelServerTest.RunServer( + None, None, model_config_file=self._GetGoodModelConfigFile())[1] self.VerifyPredictRequest( model_server_address, model_name='half_plus_two', expected_output=3.0, @@ -482,27 +505,25 @@ def testGoodModelConfig(self): def testBadModelConfig(self): """Test server model configuration from file fails for invalid file.""" - atexit.register(self.TerminateProcs) - self.RunServerWithModelConfigFile( - PickUnusedPort(), - self._GetBadModelConfigFile(), + proc = TensorflowModelServerTest.RunServer( + None, + None, + model_config_file=self._GetBadModelConfigFile(), pipe=subprocess.PIPE, - wait_for_server_ready=False) + wait_for_server_ready=False)[0] error_message = ( 'Invalid protobuf file: \'%s\'') % self._GetBadModelConfigFile() - self.assertNotEqual(self.server_proc.stderr, None) - self.assertGreater(self.server_proc.stderr.read().find(error_message), -1) + self.assertNotEqual(proc.stderr, None) + self.assertGreater(proc.stderr.read().find(error_message), -1) def testGoodGrpcChannelArgs(self): """Test server starts with grpc_channel_arguments specified.""" - atexit.register(self.TerminateProcs) - model_server_address = self.RunServer( - PickUnusedPort(), + model_server_address = TensorflowModelServerTest.RunServer( 'default', self._GetSavedModelBundlePath(), grpc_channel_arguments= - 'grpc.max_connection_age_ms=2000,grpc.lb_policy_name=grpclb') + 'grpc.max_connection_age_ms=2000,grpc.lb_policy_name=grpclb')[1] self.VerifyPredictRequest( model_server_address, expected_output=3.0, @@ -513,15 +534,11 @@ def testGoodGrpcChannelArgs(self): def testClassifyREST(self): """Test Classify implementation over REST API.""" model_path = self._GetSavedModelBundlePath() - - atexit.register(self.TerminateProcs) - rest_api_port = PickUnusedPort() - model_server_address = self.RunServer( - PickUnusedPort(), 'default', model_path, rest_api_port=rest_api_port) + host, port = TensorflowModelServerTest.RunServer('default', + model_path)[2].split(':') # Prepare request - url = 'http://{}:{}/v1/models/default:classify'.format( - model_server_address.split(':')[0], rest_api_port) + url = 'http://{}:{}/v1/models/default:classify'.format(host, port) json_req = {'signature_name': 'classify_x_to_y', 'examples': [{'x': 2.0}]} # Send request @@ -537,15 +554,11 @@ def testClassifyREST(self): def testRegressREST(self): """Test Regress implementation over REST API.""" model_path = self._GetSavedModelBundlePath() - - atexit.register(self.TerminateProcs) - rest_api_port = PickUnusedPort() - model_server_address = self.RunServer( - PickUnusedPort(), 'default', model_path, rest_api_port=rest_api_port) + host, port = TensorflowModelServerTest.RunServer('default', + model_path)[2].split(':') # Prepare request - url = 'http://{}:{}/v1/models/default:regress'.format( - model_server_address.split(':')[0], rest_api_port) + url = 'http://{}:{}/v1/models/default:regress'.format(host, port) json_req = {'signature_name': 'regress_x_to_y', 'examples': [{'x': 2.0}]} # Send request @@ -561,15 +574,11 @@ def testRegressREST(self): def testPredictREST(self): """Test Predict implementation over REST API.""" model_path = self._GetSavedModelBundlePath() - - atexit.register(self.TerminateProcs) - rest_api_port = PickUnusedPort() - model_server_address = self.RunServer( - PickUnusedPort(), 'default', model_path, rest_api_port=rest_api_port) + host, port = TensorflowModelServerTest.RunServer('default', + model_path)[2].split(':') # Prepare request - url = 'http://{}:{}/v1/models/default:predict'.format( - model_server_address.split(':')[0], rest_api_port) + url = 'http://{}:{}/v1/models/default:predict'.format(host, port) json_req = {'instances': [2.0, 3.0, 4.0]} # Send request From bc36ed149fcc327c14db647275686e17fc1f9b9d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 6 Aug 2018 15:01:23 -0700 Subject: [PATCH 0541/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207614551 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7b6547672e9..c4fac4f1a08 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dc4bffeb38b8df736a4bea125df8535905f61134679eb7d3445c6fd8d47a0382", - git_commit = "598f043fee12daf711cd65f36487483c722a489d", + sha256 = "a435a51112f3f81acb4e2b46c0d1e4667d7cd44e019dda2c582ef1b9bd4eb6e9", + git_commit = "410094f7d392f3c0a384aa5caa310d9452ef6587", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 40612ed4ac2c68b7cc604a2b9f8a28c4b64e812a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 6 Aug 2018 16:03:04 -0700 Subject: [PATCH 0542/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207624876 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c4fac4f1a08..78e77e9580c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a435a51112f3f81acb4e2b46c0d1e4667d7cd44e019dda2c582ef1b9bd4eb6e9", - git_commit = "410094f7d392f3c0a384aa5caa310d9452ef6587", + sha256 = "dc1eeb78461ac83abd2670c9db48951ff6e4c23f36ed892aa2e3188731e93088", + git_commit = "9eacf865fac500480f3c2708539e6c6893f2a36a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c9d7dcaafe9e5f513abdaf2764c33ac18120ab14 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 6 Aug 2018 17:01:50 -0700 Subject: [PATCH 0543/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207633740 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 78e77e9580c..4d8aeb521b6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dc1eeb78461ac83abd2670c9db48951ff6e4c23f36ed892aa2e3188731e93088", - git_commit = "9eacf865fac500480f3c2708539e6c6893f2a36a", + sha256 = "f2703419c9810dabdccf6c87f920934cef2d6630f1abf8f22a8740497e57d7e3", + git_commit = "a802075bf3a54b1d3acf6dfca65ba902befd7bb2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0e79c4c17b1279091d81f79a8d315391c0ed9031 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 6 Aug 2018 18:02:05 -0700 Subject: [PATCH 0544/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207641616 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4d8aeb521b6..4c377a9cd90 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f2703419c9810dabdccf6c87f920934cef2d6630f1abf8f22a8740497e57d7e3", - git_commit = "a802075bf3a54b1d3acf6dfca65ba902befd7bb2", + sha256 = "39b6ff6a9926d724ba0024057074b62a6b9deab46649b481972d6ee91640da48", + git_commit = "c9a4414100e4b802ef25ffd5b87a86c7113dfbdf", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a342b95e514a59acd319c6b4aac8c516ea20c0c1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 6 Aug 2018 19:01:03 -0700 Subject: [PATCH 0545/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207647456 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4c377a9cd90..a5690fb4af2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "39b6ff6a9926d724ba0024057074b62a6b9deab46649b481972d6ee91640da48", - git_commit = "c9a4414100e4b802ef25ffd5b87a86c7113dfbdf", + sha256 = "ac911c5f9eed1830123f0b3983b1b67a04237154cb744d56f7aae20a1b2c49c7", + git_commit = "56a82b00f461dc8bc2b3e8e63fa768144795a7b2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4d65a13b487ee2cc9c06b8550dd14604edbba873 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 6 Aug 2018 20:01:56 -0700 Subject: [PATCH 0546/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207651884 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a5690fb4af2..4bf42914ccb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ac911c5f9eed1830123f0b3983b1b67a04237154cb744d56f7aae20a1b2c49c7", - git_commit = "56a82b00f461dc8bc2b3e8e63fa768144795a7b2", + sha256 = "05d755abff7bdcfa3cfb5e513e828aecaf405f411c4ded812eda8ae180ad7795", + git_commit = "29b8358f51e2da1df50bc6b896f360994bc5eacf", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 271b014308f16e0549a27f2ef54853a43e06e711 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 6 Aug 2018 21:04:20 -0700 Subject: [PATCH 0547/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207656913 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4bf42914ccb..ab371e929e0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "05d755abff7bdcfa3cfb5e513e828aecaf405f411c4ded812eda8ae180ad7795", - git_commit = "29b8358f51e2da1df50bc6b896f360994bc5eacf", + sha256 = "67ac2c0df7f154449fb1f36229abaf708f6593109220c6f7972c5fdde5b17bb1", + git_commit = "69c6ec9c6f4aa3300833d48a9713403e52078007", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 89e5dc6b33ca7b19e3970d5e5943fe5343320d1c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 6 Aug 2018 22:01:26 -0700 Subject: [PATCH 0548/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207660863 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ab371e929e0..7efe8d1c6c0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "67ac2c0df7f154449fb1f36229abaf708f6593109220c6f7972c5fdde5b17bb1", - git_commit = "69c6ec9c6f4aa3300833d48a9713403e52078007", + sha256 = "d98e4c35ce6aec683889068faa84be81a9731352342863c1c2b52a08508ef48a", + git_commit = "7585a44b0164e234ad6b6c3b99632fb28b7023e8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1284ef6ccd31ed0b373878bf3f2d560d264490ee Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 Aug 2018 00:01:20 -0700 Subject: [PATCH 0549/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207668994 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7efe8d1c6c0..588ae904836 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d98e4c35ce6aec683889068faa84be81a9731352342863c1c2b52a08508ef48a", - git_commit = "7585a44b0164e234ad6b6c3b99632fb28b7023e8", + sha256 = "a0d0fc5edf7d88c599bd97302aa4c4bd3c808e6e27711a9618c4c9e99f8d4721", + git_commit = "bd3f56b6adcc5303e5fff36bb64c9ef5e0195baf", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 01e8b411371e6c34c9703f5a66ddb50278d6459b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 Aug 2018 01:04:14 -0700 Subject: [PATCH 0550/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207674650 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 588ae904836..6f9afb50633 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a0d0fc5edf7d88c599bd97302aa4c4bd3c808e6e27711a9618c4c9e99f8d4721", - git_commit = "bd3f56b6adcc5303e5fff36bb64c9ef5e0195baf", + sha256 = "9804187b1ad2ceea865cee1fec260c5de2282a6776d72506b04f3876281dd9cd", + git_commit = "f055fb23b726baef93b887d378f4539ad524146f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From bc0cf7875ba12ff126642e45e09265f373d4dd6f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 Aug 2018 02:01:15 -0700 Subject: [PATCH 0551/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207680131 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6f9afb50633..437c00216c3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9804187b1ad2ceea865cee1fec260c5de2282a6776d72506b04f3876281dd9cd", - git_commit = "f055fb23b726baef93b887d378f4539ad524146f", + sha256 = "ea649260aa7b338360e44c19053fd8e54701b200898b9e5f443868a218333a76", + git_commit = "3160e12b38fefdae961737a0d8fb0a7993ca4c50", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8555d887e5b2f379616d933c3a78d796fd84cbbb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 Aug 2018 03:01:54 -0700 Subject: [PATCH 0552/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207687330 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 437c00216c3..01c25d84693 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ea649260aa7b338360e44c19053fd8e54701b200898b9e5f443868a218333a76", - git_commit = "3160e12b38fefdae961737a0d8fb0a7993ca4c50", + sha256 = "9289b7b0d0bc7bc596a1693d6cef833061acd6fa631be3cc6e096326e2221b92", + git_commit = "256183b62e60ce8814c62bdd84e265ed22166969", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0e25111d1db7ab1e7fb02dda68d8d1e54e8dcad1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 Aug 2018 04:02:44 -0700 Subject: [PATCH 0553/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207692634 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 01c25d84693..159d29ecfbb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9289b7b0d0bc7bc596a1693d6cef833061acd6fa631be3cc6e096326e2221b92", - git_commit = "256183b62e60ce8814c62bdd84e265ed22166969", + sha256 = "9d1fa75b06f0ffb2faf85a3e22b3d584f1257cf6274417558021e94295ea3aba", + git_commit = "f126d1d812ae54e3912f50743dd0ed6cfa7f6dfb", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f858fe604e7ba0da12ba8918b5b069bce37029cb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 Aug 2018 05:01:39 -0700 Subject: [PATCH 0554/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207697229 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 159d29ecfbb..2eeca1cee43 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9d1fa75b06f0ffb2faf85a3e22b3d584f1257cf6274417558021e94295ea3aba", - git_commit = "f126d1d812ae54e3912f50743dd0ed6cfa7f6dfb", + sha256 = "a74375c00da9f01764955073f29b0ab45b37a1f140981e59b39c0c16abb1f8a7", + git_commit = "aed8f42bafabf11c5d92ce4109a5e0408b31f9c5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 81317123ac9a6c2aa6cdf7626e67a68b407ce9a6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 Aug 2018 09:02:26 -0700 Subject: [PATCH 0555/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207723858 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2eeca1cee43..aaf4b296a29 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a74375c00da9f01764955073f29b0ab45b37a1f140981e59b39c0c16abb1f8a7", - git_commit = "aed8f42bafabf11c5d92ce4109a5e0408b31f9c5", + sha256 = "7fe02cd327acca9ce84c36dc9cf44eb62825f3caee62fa41febe07a2ce90eb18", + git_commit = "a1a370cb8b8ef43996a275b64ada81f9cb32e743", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6e8da5ddfc2cda1529bf85f8485a1eda354b2cc9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 Aug 2018 10:01:36 -0700 Subject: [PATCH 0556/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207733250 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index aaf4b296a29..4b59f9e5c9b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7fe02cd327acca9ce84c36dc9cf44eb62825f3caee62fa41febe07a2ce90eb18", - git_commit = "a1a370cb8b8ef43996a275b64ada81f9cb32e743", + sha256 = "2db6b1a4e0fce7a898e4593153a73b00edbcbe1c47a2348ba0ce1353e7e1242a", + git_commit = "7f666bb652063874134ed60b77edb4ddc85ec488", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 596f8d85a85d081ab48e2be23fb9a295485d393b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 Aug 2018 11:01:04 -0700 Subject: [PATCH 0557/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207744984 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4b59f9e5c9b..46368e54235 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2db6b1a4e0fce7a898e4593153a73b00edbcbe1c47a2348ba0ce1353e7e1242a", - git_commit = "7f666bb652063874134ed60b77edb4ddc85ec488", + sha256 = "3b1f5c89a92a19e8abbd225167a1ccf875a0e2d799a977715b4eca63f2dfa59b", + git_commit = "7446059bc9066b47ee1d1dc0abaa826f39a13aac", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 199145beaa5f6f6a222127e32c409eb88ef0a88b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 Aug 2018 12:03:39 -0700 Subject: [PATCH 0558/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207756504 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 46368e54235..1b991d56a24 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3b1f5c89a92a19e8abbd225167a1ccf875a0e2d799a977715b4eca63f2dfa59b", - git_commit = "7446059bc9066b47ee1d1dc0abaa826f39a13aac", + sha256 = "a8d6a067d80bd1b08263546cba2803abf077f45f3d3a49bd08a1410e29de1d9d", + git_commit = "f545b67f8e250a03e01f1926e1c2429696a7246f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 80ca0d2ba4b9240a58d5351a06b228fcdedac376 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 Aug 2018 13:01:24 -0700 Subject: [PATCH 0559/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207765124 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1b991d56a24..ac54f83a3e2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a8d6a067d80bd1b08263546cba2803abf077f45f3d3a49bd08a1410e29de1d9d", - git_commit = "f545b67f8e250a03e01f1926e1c2429696a7246f", + sha256 = "552cc6ed4290c9381a99619e94e0d76ff96be815b109d2d2fe43b594c64f7b43", + git_commit = "c3d1f4bc30c2cc5e0999ac2b0f04d41d607cb1fe", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 46c58ec82bc77ac7898bb8990584d5384485c62c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 Aug 2018 14:02:37 -0700 Subject: [PATCH 0560/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207775442 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ac54f83a3e2..64f7ae632cb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "552cc6ed4290c9381a99619e94e0d76ff96be815b109d2d2fe43b594c64f7b43", - git_commit = "c3d1f4bc30c2cc5e0999ac2b0f04d41d607cb1fe", + sha256 = "3b7169ce8dc465ef8138859379660b4725f068b15ec201cb20f5b25b884abd14", + git_commit = "2e2486adedb5164b82b0c2fcb8b1d27f987c1428", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From aee9b07888c8429b2b437a783128977a05b1990f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 Aug 2018 15:02:22 -0700 Subject: [PATCH 0561/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207786289 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 64f7ae632cb..cae4f087882 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3b7169ce8dc465ef8138859379660b4725f068b15ec201cb20f5b25b884abd14", - git_commit = "2e2486adedb5164b82b0c2fcb8b1d27f987c1428", + sha256 = "dd2fab72e6c92a8cb62263b00605a7cbdc732e85c604c64f603af98e37d28acc", + git_commit = "452f995e2c23cbd67c14b15b678bb3a352212633", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1634e437e462563c35b78008032225a13c4cee8b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 Aug 2018 16:02:02 -0700 Subject: [PATCH 0562/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207796393 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cae4f087882..fb85eb9784c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dd2fab72e6c92a8cb62263b00605a7cbdc732e85c604c64f603af98e37d28acc", - git_commit = "452f995e2c23cbd67c14b15b678bb3a352212633", + sha256 = "8c4d4cd14e6d5d055278b130af86827d5b4956aa9825137991ba42dd5726e439", + git_commit = "ff8f6371d9670101b5dfc5eb8cef118547d78dcc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3055cc5d2187971540d5978a3baf070e43c3b44a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 Aug 2018 17:01:58 -0700 Subject: [PATCH 0563/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207805785 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fb85eb9784c..e771c5cbd39 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8c4d4cd14e6d5d055278b130af86827d5b4956aa9825137991ba42dd5726e439", - git_commit = "ff8f6371d9670101b5dfc5eb8cef118547d78dcc", + sha256 = "1939ad6f1110c9dde93cadb1478bcd3f324e82147e1b4639b807aaa4e7634010", + git_commit = "0cae77919613b15ec5ba4db167966ba21e969fd8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 74b53602e4ba2a71f27d28913c823bb6285a7bc6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 Aug 2018 18:01:24 -0700 Subject: [PATCH 0564/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207813466 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e771c5cbd39..29bf1520c8e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1939ad6f1110c9dde93cadb1478bcd3f324e82147e1b4639b807aaa4e7634010", - git_commit = "0cae77919613b15ec5ba4db167966ba21e969fd8", + sha256 = "9c9a5149eb3e682d94c4905b9f55d1658b78a3f199b3ef353b63b6c6e31a1b62", + git_commit = "75ee9f5e9bc04c312363d9c0836dd9c3851ead64", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 591682a77d564843a5ecfa19ed743846bf250963 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 Aug 2018 19:01:43 -0700 Subject: [PATCH 0565/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207819462 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 29bf1520c8e..c2e505eb680 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9c9a5149eb3e682d94c4905b9f55d1658b78a3f199b3ef353b63b6c6e31a1b62", - git_commit = "75ee9f5e9bc04c312363d9c0836dd9c3851ead64", + sha256 = "3cdbdf3a9792cb2b045e7a9e2d93e77f715c2d62bc52c9454bee750c44d567b5", + git_commit = "9febcf6927f07ef04febe6625e0a0fff47ad4d3c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 81958802d80471ed64b441a1767fc7ef8b383d4b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 Aug 2018 20:04:46 -0700 Subject: [PATCH 0566/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207824058 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c2e505eb680..0afd370a6aa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3cdbdf3a9792cb2b045e7a9e2d93e77f715c2d62bc52c9454bee750c44d567b5", - git_commit = "9febcf6927f07ef04febe6625e0a0fff47ad4d3c", + sha256 = "6044ed81dd0438882b87337a3f8bdfeab1fb625d8e57208567c062dfde64fa7f", + git_commit = "be9e098112284611a68b2d4b332f8029d9cbffac", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3e208ce25de827f8c1cf48d2b68312f79fafdfd5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 Aug 2018 21:01:03 -0700 Subject: [PATCH 0567/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207828303 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0afd370a6aa..84e808a1a94 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6044ed81dd0438882b87337a3f8bdfeab1fb625d8e57208567c062dfde64fa7f", - git_commit = "be9e098112284611a68b2d4b332f8029d9cbffac", + sha256 = "f46594bb6551d3068a6001829702170a38b6a00768bee572284d7297a70be81f", + git_commit = "38e507f7666f6be34e6eb58bac3fb9140544f925", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 119cb9666f79e32f0488bde52530569e9924c90e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 Aug 2018 22:01:53 -0700 Subject: [PATCH 0568/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207832752 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 84e808a1a94..ccae9b29d4e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f46594bb6551d3068a6001829702170a38b6a00768bee572284d7297a70be81f", - git_commit = "38e507f7666f6be34e6eb58bac3fb9140544f925", + sha256 = "c7cae5cb7cd2a62a2262215dbea8d1cf3db5de9a8f7610008947a2be578cc4d4", + git_commit = "35847b960fe59c0e2e5371db55041a62b65dbb37", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2a5e8d19bc0ab2fd1bac3a07f9b6b2bf07a2b36a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 Aug 2018 00:01:31 -0700 Subject: [PATCH 0569/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207840734 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ccae9b29d4e..35e23e29623 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c7cae5cb7cd2a62a2262215dbea8d1cf3db5de9a8f7610008947a2be578cc4d4", - git_commit = "35847b960fe59c0e2e5371db55041a62b65dbb37", + sha256 = "766ecf10a08d412c9765b430c4e7b6d83692c10f579f7ada2fa8c2d956cf3043", + git_commit = "9c161fa8e869dd8e982a0b38ee540f251f52c3ab", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6d7ed80538f9ddc711b1fdfa00c750342ecc7bb0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 Aug 2018 01:01:40 -0700 Subject: [PATCH 0570/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207845814 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 35e23e29623..de57a05170d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "766ecf10a08d412c9765b430c4e7b6d83692c10f579f7ada2fa8c2d956cf3043", - git_commit = "9c161fa8e869dd8e982a0b38ee540f251f52c3ab", + sha256 = "6edc9c25ede3c152332b55ca5f25ca4400f46c12ad7f40f0d4b5b678f12f32c3", + git_commit = "2abc4f0fb7fa464a6aa97df91ec5cd1097197376", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5bcb390e195727fe5b8bbc5c19f18538f84f158a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 Aug 2018 02:01:14 -0700 Subject: [PATCH 0571/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207851179 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index de57a05170d..a4424fe97c5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6edc9c25ede3c152332b55ca5f25ca4400f46c12ad7f40f0d4b5b678f12f32c3", - git_commit = "2abc4f0fb7fa464a6aa97df91ec5cd1097197376", + sha256 = "9c775a8eb7406582dd6ad241a83776f168773948bf3945ca7b43c06397e6a2c1", + git_commit = "cf9d596881ea4ce2c95a5fe6bbac34e322a2b0ea", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3d83f2ecbd64ddc62c28ac68ded236cb1c66739f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 Aug 2018 03:01:35 -0700 Subject: [PATCH 0572/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207858203 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a4424fe97c5..7b3036ec4fa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9c775a8eb7406582dd6ad241a83776f168773948bf3945ca7b43c06397e6a2c1", - git_commit = "cf9d596881ea4ce2c95a5fe6bbac34e322a2b0ea", + sha256 = "01ef647dc6fe61c4ae689c3ce5615914abda56df0ee1dab29278a027e7c82ffe", + git_commit = "cedefe895e53bd38a624feb55f950cb4a3679de6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fa0010a7a49e126bb850399d115a7dde374e7118 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 Aug 2018 04:01:45 -0700 Subject: [PATCH 0573/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207863171 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7b3036ec4fa..1fc7681b64d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "01ef647dc6fe61c4ae689c3ce5615914abda56df0ee1dab29278a027e7c82ffe", - git_commit = "cedefe895e53bd38a624feb55f950cb4a3679de6", + sha256 = "55d4f7ca8c1db95a2f38371727dfa94d2d6a868ee4a1ff7c9f4e62928fe9c390", + git_commit = "de537122fbd1a49a44bd71e3a24c7b4d4d23c24c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f8a607a11035732c3a3287cdd1ce2cb46856459b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 Aug 2018 05:03:08 -0700 Subject: [PATCH 0574/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207867619 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1fc7681b64d..3f19bdba775 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "55d4f7ca8c1db95a2f38371727dfa94d2d6a868ee4a1ff7c9f4e62928fe9c390", - git_commit = "de537122fbd1a49a44bd71e3a24c7b4d4d23c24c", + sha256 = "9bb45fb21503db5b71ac0971b9399629b37456ad6cace93c38f4d135b764b0be", + git_commit = "15f1fa14a3fd4b63e18539836f6036fef024fce7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a173809f40b81299a79663d757a02ba201381e97 Mon Sep 17 00:00:00 2001 From: awk Date: Wed, 8 Aug 2018 07:00:36 -0700 Subject: [PATCH 0575/8103] Add old/beta gRPC API signature and route it to GA gRPC API. This prevents breaking existing clients, along with a warning that in (near) furture the old API will be removed. PiperOrigin-RevId: 207878049 --- .../apis/prediction_service_pb2.py | 22 +- tensorflow_serving/model_servers/BUILD | 21 + .../tensorflow_model_server_beta_grpc_test.py | 380 ++++++++++++++++++ 3 files changed, 421 insertions(+), 2 deletions(-) create mode 100644 tensorflow_serving/model_servers/tensorflow_model_server_beta_grpc_test.py diff --git a/tensorflow_serving/apis/prediction_service_pb2.py b/tensorflow_serving/apis/prediction_service_pb2.py index 16d79da857c..0fa8ef05083 100644 --- a/tensorflow_serving/apis/prediction_service_pb2.py +++ b/tensorflow_serving/apis/prediction_service_pb2.py @@ -12,11 +12,15 @@ # See the License for the specific language governing permissions and # limitations under the License. # ============================================================================== -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: tensorflow_serving/apis/prediction_service.proto +# # To regenerate run # python -m grpc.tools.protoc --python_out=. --grpc_python_out=. -I. tensorflow_serving/apis/prediction_service.proto +### @@AUTOGENERATED SECTION STARTS HERE@@ + +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: tensorflow_serving/apis/prediction_service.proto + import sys _b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) from google.protobuf import descriptor as _descriptor @@ -112,3 +116,17 @@ DESCRIPTOR.services_by_name['PredictionService'] = _PREDICTIONSERVICE # @@protoc_insertion_point(module_scope) + +### @@AUTOGENERATED SECTION ENDS HERE@@ + + +def beta_create_PredictionService_stub(channel): + import warnings + from tensorflow_serving.apis import prediction_service_pb2_grpc + warnings.simplefilter('default') + warnings.warn( + 'beta_create_PredictionService_stub() method is deprecated. ' + 'This method will be removed in near future versions of TF ' + 'Serving. Please switch to GA gRPC API in ' + 'prediction_service_pb2_grpc.', DeprecationWarning) + return prediction_service_pb2_grpc.PredictionServiceStub(channel._channel) diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index b47c698e74b..d67e8ed1429 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -343,6 +343,27 @@ py_test( ], ) +py_test( + name = "tensorflow_model_server_beta_grpc_test", + size = "medium", + srcs = ["tensorflow_model_server_beta_grpc_test.py"], + data = [ + ":tensorflow_model_server", + "@org_tensorflow//tensorflow/cc/saved_model:saved_model_half_plus_two", + #"//tensorflow_serving/servables/tensorflow/testdata:batching_config.txt", + "//tensorflow_serving/servables/tensorflow/testdata:good_model_config.txt", + "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_three/00000123/assets/foo.txt", + "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_three/00000123/saved_model.pb", + "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_three/00000123/variables/variables.data-00000-of-00001", + "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_three/00000123/variables/variables.index", + ], + tags = ["notsan"], + deps = [ + "//tensorflow_serving/apis:prediction_service_proto_py_pb2", + "@org_tensorflow//tensorflow:tensorflow_py", + ], +) + py_binary( name = "tensorflow_model_server_test_client", srcs = ["tensorflow_model_server_test_client.py"], diff --git a/tensorflow_serving/model_servers/tensorflow_model_server_beta_grpc_test.py b/tensorflow_serving/model_servers/tensorflow_model_server_beta_grpc_test.py new file mode 100644 index 00000000000..00a9b32fb39 --- /dev/null +++ b/tensorflow_serving/model_servers/tensorflow_model_server_beta_grpc_test.py @@ -0,0 +1,380 @@ +# Copyright 2016 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +#!/usr/bin/env python2.7 +"""Minimal sanity tests for tensorflow_model_server with beta gRPC APIs.""" + +import atexit +import os +import shlex +import socket +import subprocess +import sys +import time + +# This is a placeholder for a Google-internal import. + +from grpc.beta import implementations +import tensorflow as tf + +from tensorflow.core.framework import types_pb2 +from tensorflow.python.platform import flags +from tensorflow.python.saved_model import signature_constants +from tensorflow_serving.apis import classification_pb2 +from tensorflow_serving.apis import inference_pb2 +from tensorflow_serving.apis import predict_pb2 +from tensorflow_serving.apis import prediction_service_pb2 +from tensorflow_serving.apis import regression_pb2 + +FLAGS = flags.FLAGS + +RPC_TIMEOUT = 5.0 +CHANNEL_WAIT_TIMEOUT = 5.0 +WAIT_FOR_SERVER_READY_INT_SECS = 60 + + +def PickUnusedPort(): + s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) + s.bind(('', 0)) + port = s.getsockname()[1] + s.close() + return port + + +def WaitForServerReady(port): + """Waits for a server on the localhost to become ready.""" + for _ in range(0, WAIT_FOR_SERVER_READY_INT_SECS): + time.sleep(1) + request = predict_pb2.PredictRequest() + request.model_spec.name = 'intentionally_missing_model' + + try: + # Send empty request to missing model + channel = implementations.insecure_channel('localhost', port) + stub = prediction_service_pb2.beta_create_PredictionService_stub(channel) + stub.Predict(request, RPC_TIMEOUT) + except Exception as e: # pylint: disable=broad-except + # Missing model error will have details containing 'Servable' + if 'Servable' in e.details(): + print 'Server is ready' + break + + +class TensorflowModelServerTest(tf.test.TestCase): + """This class defines integration test cases for tensorflow_model_server.""" + + @staticmethod + def __TestSrcDirPath(relative_path=''): + return os.path.join(os.environ['TEST_SRCDIR'], + 'tf_serving/tensorflow_serving', relative_path) + + @staticmethod + def GetArgsKey(*args, **kwargs): + return args + tuple(sorted(kwargs.items())) + + # Maps string key -> 2-tuple of 'host:port' string. + model_servers_dict = {} + + @staticmethod + def RunServer(model_name, + model_path, + model_config_file=None, + batching_parameters_file=None, + grpc_channel_arguments='', + wait_for_server_ready=True, + pipe=None): + """Run tensorflow_model_server using test config. + + A unique instance of server is started for each set of arguments. + If called with same arguments, handle to an existing server is + returned. + + Args: + model_name: Name of model. + model_path: Path to model. + model_config_file: Path to model config file. + batching_parameters_file: Path to batching parameters. + grpc_channel_arguments: Custom gRPC args for server. + wait_for_server_ready: Wait for gRPC port to be ready. + pipe: subpipe.PIPE object to read stderr from server. + + Returns: + 3-tuple (, , ). + + Raises: + ValueError: when both model_path and config_file is empty. + """ + args_key = TensorflowModelServerTest.GetArgsKey(**locals()) + if args_key in TensorflowModelServerTest.model_servers_dict: + return TensorflowModelServerTest.model_servers_dict[args_key] + port = PickUnusedPort() + print('Starting test server on port: {} for model_name: ' + '{}/model_config_file: {}'.format(port, model_name, + model_config_file)) + command = os.path.join( + TensorflowModelServerTest.__TestSrcDirPath('model_servers'), + 'tensorflow_model_server') + command += ' --port=' + str(port) + + if model_config_file: + command += ' --model_config_file=' + model_config_file + elif model_path: + command += ' --model_name=' + model_name + command += ' --model_base_path=' + model_path + else: + raise ValueError('Both model_config_file and model_path cannot be empty!') + + if batching_parameters_file: + command += ' --enable_batching' + command += ' --batching_parameters_file=' + batching_parameters_file + if grpc_channel_arguments: + command += ' --grpc_channel_arguments=' + grpc_channel_arguments + print command + proc = subprocess.Popen(shlex.split(command), stderr=pipe) + atexit.register(proc.kill) + print 'Server started' + if wait_for_server_ready: + WaitForServerReady(port) + hostports = (proc, 'localhost:' + str(port), None) + TensorflowModelServerTest.model_servers_dict[args_key] = hostports + return hostports + + def __BuildModelConfigFile(self): + """Write a config file to disk for use in tests. + + Substitutes placeholder for test directory with test directory path + in the configuration template file and writes it out to another file + used by the test. + """ + with open(self._GetGoodModelConfigTemplate(), 'r') as template_file: + config = template_file.read().replace('${TEST_HALF_PLUS_TWO_DIR}', + self._GetSavedModelBundlePath()) + config = config.replace('${TEST_HALF_PLUS_THREE_DIR}', + self._GetSavedModelHalfPlusThreePath()) + with open(self._GetGoodModelConfigFile(), 'w') as config_file: + config_file.write(config) + + def setUp(self): + """Sets up integration test parameters.""" + self.testdata_dir = TensorflowModelServerTest.__TestSrcDirPath( + 'servables/tensorflow/testdata') + self.temp_dir = tf.test.get_temp_dir() + self.server_proc = None + self.__BuildModelConfigFile() + + def tearDown(self): + """Deletes created configuration file.""" + os.remove(self._GetGoodModelConfigFile()) + + def _MakeStub(self, hostport): + """Returns a gRPC stub using beta gRPC API.""" + host, port = hostport.split(':') + channel = implementations.insecure_channel(host, int(port)) + return prediction_service_pb2.beta_create_PredictionService_stub(channel) + + def VerifyPredictRequest(self, + model_server_address, + expected_output, + expected_version, + model_name='default', + specify_output=True, + signature_name= + signature_constants. + DEFAULT_SERVING_SIGNATURE_DEF_KEY): + """Send PredictionService.Predict request and verify output.""" + print 'Sending Predict request...' + # Prepare request + request = predict_pb2.PredictRequest() + request.model_spec.name = model_name + request.inputs['x'].dtype = types_pb2.DT_FLOAT + request.inputs['x'].float_val.append(2.0) + dim = request.inputs['x'].tensor_shape.dim.add() + dim.size = 1 + + if specify_output: + request.output_filter.append('y') + # Send request + result = self._MakeStub(model_server_address).Predict(request, RPC_TIMEOUT) + + # Verify response + self.assertTrue('y' in result.outputs) + self.assertIs(types_pb2.DT_FLOAT, result.outputs['y'].dtype) + self.assertEquals(1, len(result.outputs['y'].float_val)) + self.assertEquals(expected_output, result.outputs['y'].float_val[0]) + self._VerifyModelSpec(result.model_spec, request.model_spec.name, + signature_name, expected_version) + + def _GetSavedModelBundlePath(self): + """Returns a path to a model in SavedModel format.""" + return os.path.join(os.environ['TEST_SRCDIR'], 'tf_serving/external/org_tensorflow/tensorflow/', + 'cc/saved_model/testdata/half_plus_two') + + def _GetModelVersion(self, model_path): + """Returns version of SavedModel/SessionBundle in given path. + + This method assumes there is exactly one directory with an 'int' valued + directory name under `model_path`. + + Args: + model_path: A string representing path to the SavedModel/SessionBundle. + + Returns: + version of SavedModel/SessionBundle in given path. + """ + return int(os.listdir(model_path)[0]) + + def _GetSavedModelHalfPlusThreePath(self): + """Returns a path to a half_plus_three model in SavedModel format.""" + return os.path.join(self.testdata_dir, 'saved_model_half_plus_three') + + def _GetSessionBundlePath(self): + """Returns a path to a model in SessionBundle format.""" + return os.path.join(self.testdata_dir, 'half_plus_two') + + def _GetGoodModelConfigTemplate(self): + """Returns a path to a working configuration file template.""" + return os.path.join(self.testdata_dir, 'good_model_config.txt') + + def _GetGoodModelConfigFile(self): + """Returns a path to a working configuration file.""" + return os.path.join(self.temp_dir, 'good_model_config.conf') + + def _VerifyModelSpec(self, + actual_model_spec, + exp_model_name, + exp_signature_name, + exp_version): + """Verifies model_spec matches expected model name, signature, version. + + Args: + actual_model_spec: An instance of ModelSpec proto. + exp_model_name: A string that represents expected model name. + exp_signature_name: A string that represents expected signature. + exp_version: An integer that represents expected version. + + Returns: + None. + """ + self.assertEquals(actual_model_spec.name, exp_model_name) + self.assertEquals(actual_model_spec.signature_name, exp_signature_name) + self.assertEquals(actual_model_spec.version.value, exp_version) + + def testClassify(self): + """Test PredictionService.Classify implementation.""" + model_path = self._GetSavedModelBundlePath() + model_server_address = TensorflowModelServerTest.RunServer( + 'default', model_path)[1] + + print 'Sending Classify request...' + # Prepare request + request = classification_pb2.ClassificationRequest() + request.model_spec.name = 'default' + request.model_spec.signature_name = 'classify_x_to_y' + + example = request.input.example_list.examples.add() + example.features.feature['x'].float_list.value.extend([2.0]) + + # Send request + result = self._MakeStub(model_server_address).Classify(request, RPC_TIMEOUT) + + # Verify response + self.assertEquals(1, len(result.result.classifications)) + self.assertEquals(1, len(result.result.classifications[0].classes)) + expected_output = 3.0 + self.assertEquals(expected_output, + result.result.classifications[0].classes[0].score) + self._VerifyModelSpec(result.model_spec, request.model_spec.name, + request.model_spec.signature_name, + self._GetModelVersion(model_path)) + + def testRegress(self): + """Test PredictionService.Regress implementation.""" + model_path = self._GetSavedModelBundlePath() + model_server_address = TensorflowModelServerTest.RunServer( + 'default', model_path)[1] + + print 'Sending Regress request...' + # Prepare request + request = regression_pb2.RegressionRequest() + request.model_spec.name = 'default' + request.model_spec.signature_name = 'regress_x_to_y' + + example = request.input.example_list.examples.add() + example.features.feature['x'].float_list.value.extend([2.0]) + + # Send request + result = self._MakeStub(model_server_address).Regress(request, RPC_TIMEOUT) + + # Verify response + self.assertEquals(1, len(result.result.regressions)) + expected_output = 3.0 + self.assertEquals(expected_output, result.result.regressions[0].value) + self._VerifyModelSpec(result.model_spec, request.model_spec.name, + request.model_spec.signature_name, + self._GetModelVersion(model_path)) + + def testMultiInference(self): + """Test PredictionService.MultiInference implementation.""" + model_path = self._GetSavedModelBundlePath() + model_server_address = TensorflowModelServerTest.RunServer( + 'default', model_path)[1] + + print 'Sending MultiInference request...' + # Prepare request + request = inference_pb2.MultiInferenceRequest() + request.tasks.add().model_spec.name = 'default' + request.tasks[0].model_spec.signature_name = 'regress_x_to_y' + request.tasks[0].method_name = 'tensorflow/serving/regress' + request.tasks.add().model_spec.name = 'default' + request.tasks[1].model_spec.signature_name = 'classify_x_to_y' + request.tasks[1].method_name = 'tensorflow/serving/classify' + + example = request.input.example_list.examples.add() + example.features.feature['x'].float_list.value.extend([2.0]) + + # Send request + result = self._MakeStub(model_server_address).MultiInference( + request, RPC_TIMEOUT) + + # Verify response + self.assertEquals(2, len(result.results)) + expected_output = 3.0 + self.assertEquals(expected_output, + result.results[0].regression_result.regressions[0].value) + self.assertEquals(expected_output, result.results[ + 1].classification_result.classifications[0].classes[0].score) + for i in xrange(2): + self._VerifyModelSpec(result.results[i].model_spec, + request.tasks[i].model_spec.name, + request.tasks[i].model_spec.signature_name, + self._GetModelVersion(model_path)) + + def testPredict(self): + """Test PredictionService.Predict implementation with SavedModel.""" + model_path = self._GetSavedModelBundlePath() + model_server_address = TensorflowModelServerTest.RunServer( + 'default', model_path)[1] + expected_version = self._GetModelVersion(model_path) + signature_name = signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY + self.VerifyPredictRequest(model_server_address, expected_output=3.0, + expected_version=expected_version, + signature_name=signature_name) + self.VerifyPredictRequest( + model_server_address, expected_output=3.0, specify_output=False, + expected_version=expected_version, signature_name=signature_name) + + +if __name__ == '__main__': + tf.test.main() From 72f47975d98b352359e27d555c0be9d234948429 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 Aug 2018 09:01:09 -0700 Subject: [PATCH 0576/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207892694 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3f19bdba775..e75412eb51b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9bb45fb21503db5b71ac0971b9399629b37456ad6cace93c38f4d135b764b0be", - git_commit = "15f1fa14a3fd4b63e18539836f6036fef024fce7", + sha256 = "3f0c9c7bc850a344a75fe9fa0e6c3d2a67891649ee92889cb5ee416c09b37f75", + git_commit = "a26e1ef08db82be225837b6323fb45062c56caf2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ae28a133d5d942b8bcddee0f668ef1892adaedce Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 Aug 2018 10:03:16 -0700 Subject: [PATCH 0577/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207902745 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e75412eb51b..84bc1ffa1cf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3f0c9c7bc850a344a75fe9fa0e6c3d2a67891649ee92889cb5ee416c09b37f75", - git_commit = "a26e1ef08db82be225837b6323fb45062c56caf2", + sha256 = "694b6987ba9dc8fcb03cf2762bd7569f1681b513d786159d75ecc0375cd1a74a", + git_commit = "7b0760feae2b0a291b28d7304952b4cf32e8f5a1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5becf2d7c5ba66f6f2d2a2bc7e8f872bc6df5a40 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 Aug 2018 11:01:08 -0700 Subject: [PATCH 0578/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207913399 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 84bc1ffa1cf..88186db5aa0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "694b6987ba9dc8fcb03cf2762bd7569f1681b513d786159d75ecc0375cd1a74a", - git_commit = "7b0760feae2b0a291b28d7304952b4cf32e8f5a1", + sha256 = "d1078301eeeaca204a50984a5268093ac38b660decfa8b591d9b7c88e3634729", + git_commit = "152c5563ca2474ec9394442086e53b26b41e0773", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 580296a8efb633954c346774bbd8d458823800ae Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 Aug 2018 12:01:06 -0700 Subject: [PATCH 0579/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207923780 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 88186db5aa0..77a11d382bb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d1078301eeeaca204a50984a5268093ac38b660decfa8b591d9b7c88e3634729", - git_commit = "152c5563ca2474ec9394442086e53b26b41e0773", + sha256 = "6bf3204b011a2139c2918f3533b733cbac6bfe67ff8f6b89a380906f215a8429", + git_commit = "4a4ae62c75f1de3455c3adea96802d22c7e986e3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b58c82a09630bdae0c18859d59cbeb838c01b294 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 Aug 2018 13:01:19 -0700 Subject: [PATCH 0580/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207932620 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 77a11d382bb..c48e4afa9fa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6bf3204b011a2139c2918f3533b733cbac6bfe67ff8f6b89a380906f215a8429", - git_commit = "4a4ae62c75f1de3455c3adea96802d22c7e986e3", + sha256 = "98d3585632ebb594b719c63dade5d673e22ec16c39c0fb73b0acd020c05aad3c", + git_commit = "42b61fbd380a7b6c3912e5a91ff09738ace7073c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6264241bce9944c5ae23c93a6d6176e98710719d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 Aug 2018 14:01:25 -0700 Subject: [PATCH 0581/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207941868 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c48e4afa9fa..4bb9d65f5fa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "98d3585632ebb594b719c63dade5d673e22ec16c39c0fb73b0acd020c05aad3c", - git_commit = "42b61fbd380a7b6c3912e5a91ff09738ace7073c", + sha256 = "637a87e27d826596413285e88c0608f4ca7b9fc3ea1503bd6b2644ae44e64d5e", + git_commit = "054b0463ebd748b7fe41e5ac22337c8df0ed9821", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 31481c7dfc074cac0ec0303c20b5926505e936fb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 Aug 2018 15:01:51 -0700 Subject: [PATCH 0582/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207951706 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4bb9d65f5fa..4b0f881eb41 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "637a87e27d826596413285e88c0608f4ca7b9fc3ea1503bd6b2644ae44e64d5e", - git_commit = "054b0463ebd748b7fe41e5ac22337c8df0ed9821", + sha256 = "e40549385c4c15e9fdb1436fb67158e997670b9c53ef016857d0bc2b9019a6f8", + git_commit = "99ae68bba52bb6338af06f37bb104128d7af6fb4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f5e2bbcd22e62dbc78d491acfb11e35d3b34013f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 Aug 2018 16:01:32 -0700 Subject: [PATCH 0583/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207961453 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4b0f881eb41..532ae8cfcc2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e40549385c4c15e9fdb1436fb67158e997670b9c53ef016857d0bc2b9019a6f8", - git_commit = "99ae68bba52bb6338af06f37bb104128d7af6fb4", + sha256 = "d1039b16052fa2cb639ed013a9826533d5a55e05f72706a561ff8525319a06b2", + git_commit = "8f283eaa394147437bb85aa81b375cc37cb9fab4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 78dfb79cf6c007c31e4d20979abe38fecc955b84 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 Aug 2018 17:02:34 -0700 Subject: [PATCH 0584/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207970313 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 532ae8cfcc2..985e59a9f1e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d1039b16052fa2cb639ed013a9826533d5a55e05f72706a561ff8525319a06b2", - git_commit = "8f283eaa394147437bb85aa81b375cc37cb9fab4", + sha256 = "b2f7a82b0ad8f6b336edccaad53077627743c5be401dd8ac2a58c1247efa9eb4", + git_commit = "643d809b50127682bf5ef70b8871f929183d5a10", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 80d1e7177b6749758f7c075ed5e3922fe035cd1c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 Aug 2018 18:01:45 -0700 Subject: [PATCH 0585/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 207977325 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 985e59a9f1e..df97e2e8fde 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b2f7a82b0ad8f6b336edccaad53077627743c5be401dd8ac2a58c1247efa9eb4", - git_commit = "643d809b50127682bf5ef70b8871f929183d5a10", + sha256 = "8b2c1adc1820658e1863e51c5306643fc4082c8c4c5f475e31a5e3c0817dcb5f", + git_commit = "aacb29a4ab88f9fa27c3301977e7f2cc289a3976", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2decee2ffff5e13a27fca668ebd0941372d7f4de Mon Sep 17 00:00:00 2001 From: olston Date: Thu, 9 Aug 2018 17:19:11 -0700 Subject: [PATCH 0586/8103] Add [Classify/Regress/etc.]WithModelSpec() methods, which enable passing a different model spec than the one embedded in an incoming RPC request. PiperOrigin-RevId: 208137642 --- .../model_servers/get_model_status_impl.cc | 12 ++++++-- .../model_servers/get_model_status_impl.h | 6 ++++ .../get_model_status_impl_test.cc | 19 ++++++++++++ .../tensorflow/classification_service.cc | 14 +++++++-- .../tensorflow/classification_service.h | 8 +++++ .../tensorflow/classification_service_test.cc | 22 ++++++++++++++ .../tensorflow/get_model_metadata_impl.cc | 29 ++++++++++++------- .../tensorflow/get_model_metadata_impl.h | 7 +++++ .../get_model_metadata_impl_test.cc | 22 ++++++++++++++ .../tensorflow/multi_inference_helper.cc | 11 +++++-- .../tensorflow/multi_inference_helper.h | 7 +++++ .../tensorflow/multi_inference_helper_test.cc | 22 ++++++++++++++ .../servables/tensorflow/predict_impl.cc | 13 +++++++-- .../servables/tensorflow/predict_impl.h | 7 +++++ .../servables/tensorflow/predict_impl_test.cc | 22 ++++++++++++++ .../tensorflow/regression_service.cc | 14 +++++++-- .../servables/tensorflow/regression_service.h | 8 +++++ .../tensorflow/regression_service_test.cc | 22 ++++++++++++++ 18 files changed, 242 insertions(+), 23 deletions(-) diff --git a/tensorflow_serving/model_servers/get_model_status_impl.cc b/tensorflow_serving/model_servers/get_model_status_impl.cc index 4580bd96f37..813e7119627 100644 --- a/tensorflow_serving/model_servers/get_model_status_impl.cc +++ b/tensorflow_serving/model_servers/get_model_status_impl.cc @@ -68,13 +68,19 @@ Status GetModelStatusImpl::GetModelStatus(ServerCore* core, if (!request.has_model_spec()) { return tensorflow::errors::InvalidArgument("Missing ModelSpec"); } + return GetModelStatusWithModelSpec(core, request.model_spec(), request, + response); +} - const string& model_name = request.model_spec().name(); +Status GetModelStatusImpl::GetModelStatusWithModelSpec( + ServerCore* core, const ModelSpec& model_spec, + const GetModelStatusRequest& request, GetModelStatusResponse* response) { + const string& model_name = model_spec.name(); const ServableStateMonitor& monitor = *core->servable_state_monitor(); - if (request.model_spec().has_version()) { + if (model_spec.has_version()) { // Only gets status for specified version of specified model. - const int64 version = request.model_spec().version().value(); + const int64 version = model_spec.version().value(); const ServableId id = {model_name, version}; const optional opt_servable_state = monitor.GetState(id); if (!opt_servable_state) { diff --git a/tensorflow_serving/model_servers/get_model_status_impl.h b/tensorflow_serving/model_servers/get_model_status_impl.h index af4743a0727..a814dc685cd 100644 --- a/tensorflow_serving/model_servers/get_model_status_impl.h +++ b/tensorflow_serving/model_servers/get_model_status_impl.h @@ -32,6 +32,12 @@ class GetModelStatusImpl { static Status GetModelStatus(ServerCore* core, const GetModelStatusRequest& request, GetModelStatusResponse* response); + + // Like GetModelStatus(), but uses 'model_spec' instead of the one embedded in + // 'request'. + static Status GetModelStatusWithModelSpec( + ServerCore* core, const ModelSpec& model_spec, + const GetModelStatusRequest& request, GetModelStatusResponse* response); }; } // namespace serving diff --git a/tensorflow_serving/model_servers/get_model_status_impl_test.cc b/tensorflow_serving/model_servers/get_model_status_impl_test.cc index f36cb152c51..9f8a22ce3ca 100644 --- a/tensorflow_serving/model_servers/get_model_status_impl_test.cc +++ b/tensorflow_serving/model_servers/get_model_status_impl_test.cc @@ -172,6 +172,25 @@ TEST_F(GetModelStatusImplTest, SingleVersionSuccess) { EXPECT_EQ("", response.model_version_status(0).status().error_message()); } +// Verifies that GetModelStatusWithModelSpec() uses the model spec override +// rather than the one in the request. +TEST_F(GetModelStatusImplTest, ModelSpecOverride) { + GetModelStatusRequest request; + request.mutable_model_spec()->set_name(kTestModelName); + auto model_spec_override = + test_util::CreateProto("name: \"nonexistent_model\""); + + GetModelStatusResponse response; + EXPECT_NE( + tensorflow::error::NOT_FOUND, + GetModelStatusImpl::GetModelStatus(GetServerCore(), request, &response) + .code()); + EXPECT_EQ(tensorflow::error::NOT_FOUND, + GetModelStatusImpl::GetModelStatusWithModelSpec( + GetServerCore(), model_spec_override, request, &response) + .code()); +} + } // namespace } // namespace serving } // namespace tensorflow diff --git a/tensorflow_serving/servables/tensorflow/classification_service.cc b/tensorflow_serving/servables/tensorflow/classification_service.cc index 9d377c194d8..767280560f1 100644 --- a/tensorflow_serving/servables/tensorflow/classification_service.cc +++ b/tensorflow_serving/servables/tensorflow/classification_service.cc @@ -32,16 +32,24 @@ namespace serving { Status TensorflowClassificationServiceImpl::Classify( const RunOptions& run_options, ServerCore* core, const ClassificationRequest& request, ClassificationResponse* response) { - TRACELITERAL("TensorflowClassificationServiceImpl::Classify"); // Verify Request Metadata and create a ServableRequest if (!request.has_model_spec()) { return tensorflow::Status(tensorflow::error::INVALID_ARGUMENT, "Missing ModelSpec"); } + return ClassifyWithModelSpec(run_options, core, request.model_spec(), request, + response); +} + +Status TensorflowClassificationServiceImpl::ClassifyWithModelSpec( + const RunOptions& run_options, ServerCore* core, + const ModelSpec& model_spec, const ClassificationRequest& request, + ClassificationResponse* response) { + TRACELITERAL("TensorflowClassificationServiceImpl::ClassifyWithModelSpec"); + ServableHandle saved_model_bundle; - TF_RETURN_IF_ERROR( - core->GetServableHandle(request.model_spec(), &saved_model_bundle)); + TF_RETURN_IF_ERROR(core->GetServableHandle(model_spec, &saved_model_bundle)); return RunClassify(run_options, saved_model_bundle->meta_graph_def, saved_model_bundle.id().version, saved_model_bundle->session.get(), request, response); diff --git a/tensorflow_serving/servables/tensorflow/classification_service.h b/tensorflow_serving/servables/tensorflow/classification_service.h index 9e2dab45c4c..94ee3159150 100644 --- a/tensorflow_serving/servables/tensorflow/classification_service.h +++ b/tensorflow_serving/servables/tensorflow/classification_service.h @@ -31,6 +31,14 @@ class TensorflowClassificationServiceImpl { static Status Classify(const RunOptions& run_options, ServerCore* core, const ClassificationRequest& request, ClassificationResponse* response); + + // Like Classify(), but uses 'model_spec' instead of the one embedded in + // 'request'. + static Status ClassifyWithModelSpec(const RunOptions& run_options, + ServerCore* core, + const ModelSpec& model_spec, + const ClassificationRequest& request, + ClassificationResponse* response); }; } // namespace serving diff --git a/tensorflow_serving/servables/tensorflow/classification_service_test.cc b/tensorflow_serving/servables/tensorflow/classification_service_test.cc index 03b13e02786..86c012d7500 100644 --- a/tensorflow_serving/servables/tensorflow/classification_service_test.cc +++ b/tensorflow_serving/servables/tensorflow/classification_service_test.cc @@ -168,6 +168,28 @@ TEST_F(ClassificationServiceTest, ClassificationSuccess) { "}")); } +// Verifies that ClassifyWithModelSpec() uses the model spec override rather +// than the one in the request. +TEST_F(ClassificationServiceTest, ModelSpecOverride) { + auto request = test_util::CreateProto( + "model_spec {" + " name: \"test_model\"" + "}"); + auto model_spec_override = + test_util::CreateProto("name: \"nonexistent_model\""); + + ClassificationResponse response; + EXPECT_NE(tensorflow::error::NOT_FOUND, + TensorflowClassificationServiceImpl::Classify( + RunOptions(), server_core_.get(), request, &response) + .code()); + EXPECT_EQ(tensorflow::error::NOT_FOUND, + TensorflowClassificationServiceImpl::ClassifyWithModelSpec( + RunOptions(), server_core_.get(), model_spec_override, request, + &response) + .code()); +} + } // namespace } // namespace serving } // namespace tensorflow diff --git a/tensorflow_serving/servables/tensorflow/get_model_metadata_impl.cc b/tensorflow_serving/servables/tensorflow/get_model_metadata_impl.cc index 508a71f2106..bc960b7c2ba 100644 --- a/tensorflow_serving/servables/tensorflow/get_model_metadata_impl.cc +++ b/tensorflow_serving/servables/tensorflow/get_model_metadata_impl.cc @@ -35,10 +35,6 @@ namespace { const string kSignatureDef = "signature_def"; Status ValidateGetModelMetadataRequest(const GetModelMetadataRequest& request) { - if (!request.has_model_spec()) { - return tensorflow::Status(tensorflow::error::INVALID_ARGUMENT, - "Missing ModelSpec"); - } if (request.metadata_field_size() == 0) { return tensorflow::Status( tensorflow::error::INVALID_ARGUMENT, @@ -53,19 +49,19 @@ Status ValidateGetModelMetadataRequest(const GetModelMetadataRequest& request) { return tensorflow::Status::OK(); } -Status SavedModelGetSignatureDef(ServerCore* core, +Status SavedModelGetSignatureDef(ServerCore* core, const ModelSpec& model_spec, const GetModelMetadataRequest& request, GetModelMetadataResponse* response) { ServableHandle bundle; - TF_RETURN_IF_ERROR(core->GetServableHandle(request.model_spec(), &bundle)); + TF_RETURN_IF_ERROR(core->GetServableHandle(model_spec, &bundle)); SignatureDefMap signature_def_map; for (const auto& signature : bundle->meta_graph_def.signature_def()) { (*signature_def_map.mutable_signature_def())[signature.first] = signature.second; } - auto model_spec = response->mutable_model_spec(); - model_spec->set_name(bundle.id().name); - model_spec->mutable_version()->set_value(bundle.id().version); + auto response_model_spec = response->mutable_model_spec(); + response_model_spec->set_name(bundle.id().name); + response_model_spec->mutable_version()->set_value(bundle.id().version); (*response->mutable_metadata())[kSignatureDef].PackFrom(signature_def_map); return tensorflow::Status::OK(); @@ -76,10 +72,23 @@ Status SavedModelGetSignatureDef(ServerCore* core, Status GetModelMetadataImpl::GetModelMetadata( ServerCore* core, const GetModelMetadataRequest& request, GetModelMetadataResponse* response) { + if (!request.has_model_spec()) { + return tensorflow::Status(tensorflow::error::INVALID_ARGUMENT, + "Missing ModelSpec"); + } + return GetModelMetadataWithModelSpec(core, request.model_spec(), request, + response); +} + +Status GetModelMetadataImpl::GetModelMetadataWithModelSpec( + ServerCore* core, const ModelSpec& model_spec, + const GetModelMetadataRequest& request, + GetModelMetadataResponse* response) { TF_RETURN_IF_ERROR(ValidateGetModelMetadataRequest(request)); for (const auto& metadata_field : request.metadata_field()) { if (metadata_field == kSignatureDef) { - TF_RETURN_IF_ERROR(SavedModelGetSignatureDef(core, request, response)); + TF_RETURN_IF_ERROR( + SavedModelGetSignatureDef(core, model_spec, request, response)); } else { return tensorflow::errors::InvalidArgument( "MetadataField %s is not supported", metadata_field); diff --git a/tensorflow_serving/servables/tensorflow/get_model_metadata_impl.h b/tensorflow_serving/servables/tensorflow/get_model_metadata_impl.h index c5cd7d0cae1..6981778935a 100644 --- a/tensorflow_serving/servables/tensorflow/get_model_metadata_impl.h +++ b/tensorflow_serving/servables/tensorflow/get_model_metadata_impl.h @@ -28,6 +28,13 @@ class GetModelMetadataImpl { static Status GetModelMetadata(ServerCore* core, const GetModelMetadataRequest& request, GetModelMetadataResponse* response); + + // Like GetModelMetadata(), but uses 'model_spec' instead of the one embedded + // in 'request'. + static Status GetModelMetadataWithModelSpec( + ServerCore* core, const ModelSpec& model_spec, + const GetModelMetadataRequest& request, + GetModelMetadataResponse* response); }; } // namespace serving diff --git a/tensorflow_serving/servables/tensorflow/get_model_metadata_impl_test.cc b/tensorflow_serving/servables/tensorflow/get_model_metadata_impl_test.cc index e0f993ccb74..ac761108e4b 100644 --- a/tensorflow_serving/servables/tensorflow/get_model_metadata_impl_test.cc +++ b/tensorflow_serving/servables/tensorflow/get_model_metadata_impl_test.cc @@ -207,6 +207,28 @@ TEST_P(GetModelMetadataImplTest, ReturnsSignaturesForValidModel) { kDefaultServingSignatureDefKey))); } +// Verifies that GetModelMetadataWithModelSpec() uses the model spec override +// rather than the one in the request. +TEST_P(GetModelMetadataImplTest, ModelSpecOverride) { + auto request = test_util::CreateProto( + "model_spec {" + " name: \"test_model\"" + "}"); + request.add_metadata_field(kSignatureDef); + auto model_spec_override = + test_util::CreateProto("name: \"nonexistent_model\""); + + GetModelMetadataResponse response; + EXPECT_NE(tensorflow::error::NOT_FOUND, + GetModelMetadataImpl::GetModelMetadata(GetServerCore(), request, + &response) + .code()); + EXPECT_EQ(tensorflow::error::NOT_FOUND, + GetModelMetadataImpl::GetModelMetadataWithModelSpec( + GetServerCore(), model_spec_override, request, &response) + .code()); +} + // Test all ClassifierTest test cases with both SessionBundle and SavedModel. INSTANTIATE_TEST_CASE_P(UseSavedModel, GetModelMetadataImplTest, ::testing::Bool()); diff --git a/tensorflow_serving/servables/tensorflow/multi_inference_helper.cc b/tensorflow_serving/servables/tensorflow/multi_inference_helper.cc index a2beaaa00b2..3090ec771fe 100644 --- a/tensorflow_serving/servables/tensorflow/multi_inference_helper.cc +++ b/tensorflow_serving/servables/tensorflow/multi_inference_helper.cc @@ -38,9 +38,16 @@ Status RunMultiInferenceWithServerCore(const RunOptions& run_options, ServerCore* core, const MultiInferenceRequest& request, MultiInferenceResponse* response) { + return RunMultiInferenceWithServerCoreWithModelSpec( + run_options, core, GetModelSpecFromRequest(request), request, response); +} + +Status RunMultiInferenceWithServerCoreWithModelSpec( + const RunOptions& run_options, ServerCore* core, + const ModelSpec& model_spec, const MultiInferenceRequest& request, + MultiInferenceResponse* response) { ServableHandle bundle; - TF_RETURN_IF_ERROR( - core->GetServableHandle(GetModelSpecFromRequest(request), &bundle)); + TF_RETURN_IF_ERROR(core->GetServableHandle(model_spec, &bundle)); return RunMultiInference(run_options, bundle->meta_graph_def, bundle.id().version, bundle->session.get(), diff --git a/tensorflow_serving/servables/tensorflow/multi_inference_helper.h b/tensorflow_serving/servables/tensorflow/multi_inference_helper.h index 729ca8aae9d..9f31026a5f5 100644 --- a/tensorflow_serving/servables/tensorflow/multi_inference_helper.h +++ b/tensorflow_serving/servables/tensorflow/multi_inference_helper.h @@ -31,6 +31,13 @@ Status RunMultiInferenceWithServerCore(const RunOptions& run_options, const MultiInferenceRequest& request, MultiInferenceResponse* response); +// Like RunMultiInferenceWithServerCore(), but uses 'model_spec' instead of the +// one(s) embedded in 'request'. +Status RunMultiInferenceWithServerCoreWithModelSpec( + const RunOptions& run_options, ServerCore* core, + const ModelSpec& model_spec, const MultiInferenceRequest& request, + MultiInferenceResponse* response); + } // namespace serving } // namespace tensorflow diff --git a/tensorflow_serving/servables/tensorflow/multi_inference_helper_test.cc b/tensorflow_serving/servables/tensorflow/multi_inference_helper_test.cc index a925bc62683..b2a3e15f2ee 100644 --- a/tensorflow_serving/servables/tensorflow/multi_inference_helper_test.cc +++ b/tensorflow_serving/servables/tensorflow/multi_inference_helper_test.cc @@ -284,6 +284,28 @@ TEST_F(MultiInferenceTest, RegressAndClassifySignaturesTest) { EXPECT_THAT(response, test_util::EqualsProto(expected_response)); } +// Verifies that RunMultiInferenceWithServerCoreWithModelSpec() uses the model +// spec override rather than the one in the request. +TEST_F(MultiInferenceTest, ModelSpecOverride) { + MultiInferenceRequest request; + AddInput({{"x", 2}}, &request); + PopulateTask("regress_x_to_y", kRegressMethodName, servable_version_, + request.add_tasks()); + auto model_spec_override = + test_util::CreateProto("name: \"nonexistent_model\""); + + MultiInferenceResponse response; + EXPECT_NE(tensorflow::error::NOT_FOUND, + RunMultiInferenceWithServerCore(RunOptions(), GetServerCore(), + request, &response) + .code()); + EXPECT_EQ(tensorflow::error::NOT_FOUND, + RunMultiInferenceWithServerCoreWithModelSpec( + RunOptions(), GetServerCore(), model_spec_override, request, + &response) + .code()); +} + } // namespace } // namespace serving } // namespace tensorflow diff --git a/tensorflow_serving/servables/tensorflow/predict_impl.cc b/tensorflow_serving/servables/tensorflow/predict_impl.cc index 8c6d7405a97..fd02d15d452 100644 --- a/tensorflow_serving/servables/tensorflow/predict_impl.cc +++ b/tensorflow_serving/servables/tensorflow/predict_impl.cc @@ -135,14 +135,23 @@ Status TensorflowPredictor::Predict(const RunOptions& run_options, return tensorflow::Status(tensorflow::error::INVALID_ARGUMENT, "Missing ModelSpec"); } + return PredictWithModelSpec(run_options, core, request.model_spec(), request, + response); +} + +Status TensorflowPredictor::PredictWithModelSpec(const RunOptions& run_options, + ServerCore* core, + const ModelSpec& model_spec, + const PredictRequest& request, + PredictResponse* response) { if (use_saved_model_) { ServableHandle bundle; - TF_RETURN_IF_ERROR(core->GetServableHandle(request.model_spec(), &bundle)); + TF_RETURN_IF_ERROR(core->GetServableHandle(model_spec, &bundle)); return RunPredict(run_options, bundle->meta_graph_def, bundle.id().version, bundle->session.get(), request, response); } ServableHandle bundle; - TF_RETURN_IF_ERROR(core->GetServableHandle(request.model_spec(), &bundle)); + TF_RETURN_IF_ERROR(core->GetServableHandle(model_spec, &bundle)); return SessionBundlePredict(run_options, bundle->meta_graph_def, bundle.id().version, request, response, bundle->session.get()); diff --git a/tensorflow_serving/servables/tensorflow/predict_impl.h b/tensorflow_serving/servables/tensorflow/predict_impl.h index 38bf7398156..d61ddc62aa1 100644 --- a/tensorflow_serving/servables/tensorflow/predict_impl.h +++ b/tensorflow_serving/servables/tensorflow/predict_impl.h @@ -33,6 +33,13 @@ class TensorflowPredictor { Status Predict(const RunOptions& run_options, ServerCore* core, const PredictRequest& request, PredictResponse* response); + // Like Predict(), but uses 'model_spec' instead of the one embedded in + // 'request'. + Status PredictWithModelSpec(const RunOptions& run_options, ServerCore* core, + const ModelSpec& model_spec, + const PredictRequest& request, + PredictResponse* response); + private: // If use_saved_model_ is true, a SavedModelBundle handle will be retrieved // from the ServerCore and the new SavedModel SignatureDef format will be diff --git a/tensorflow_serving/servables/tensorflow/predict_impl_test.cc b/tensorflow_serving/servables/tensorflow/predict_impl_test.cc index 6a5f330f361..0c83d3cea33 100644 --- a/tensorflow_serving/servables/tensorflow/predict_impl_test.cc +++ b/tensorflow_serving/servables/tensorflow/predict_impl_test.cc @@ -484,6 +484,28 @@ TEST_P(PredictImplTest, PredictionWithCustomizedSignatures) { EXPECT_THAT(response, test_util::EqualsProto(expected_incr_counter_by)); } +// Verifies that PredictWithModelSpec() uses the model spec override rather than +// the one in the request. +TEST_P(PredictImplTest, ModelSpecOverride) { + auto request = test_util::CreateProto( + "model_spec {" + " name: \"test_model\"" + "}"); + auto model_spec_override = + test_util::CreateProto("name: \"nonexistent_model\""); + + TensorflowPredictor predictor(GetParam()); + PredictResponse response; + EXPECT_NE(tensorflow::error::NOT_FOUND, + predictor.Predict(RunOptions(), GetServerCore(), request, &response) + .code()); + EXPECT_EQ(tensorflow::error::NOT_FOUND, + predictor + .PredictWithModelSpec(RunOptions(), GetServerCore(), + model_spec_override, request, &response) + .code()); +} + // Test all PredictImplTest test cases with both SessionBundle and SavedModel. INSTANTIATE_TEST_CASE_P(UseSavedModel, PredictImplTest, ::testing::Bool()); diff --git a/tensorflow_serving/servables/tensorflow/regression_service.cc b/tensorflow_serving/servables/tensorflow/regression_service.cc index 5602daeb787..9306015e42a 100644 --- a/tensorflow_serving/servables/tensorflow/regression_service.cc +++ b/tensorflow_serving/servables/tensorflow/regression_service.cc @@ -30,16 +30,24 @@ namespace serving { Status TensorflowRegressionServiceImpl::Regress( const RunOptions& run_options, ServerCore* core, const RegressionRequest& request, RegressionResponse* response) { - TRACELITERAL("TensorflowRegressionServiceImpl::Regress"); // Verify Request Metadata and create a ServableRequest if (!request.has_model_spec()) { return tensorflow::Status(tensorflow::error::INVALID_ARGUMENT, "Missing ModelSpec"); } + return RegressWithModelSpec(run_options, core, request.model_spec(), request, + response); +} + +Status TensorflowRegressionServiceImpl::RegressWithModelSpec( + const RunOptions& run_options, ServerCore* core, + const ModelSpec& model_spec, const RegressionRequest& request, + RegressionResponse* response) { + TRACELITERAL("TensorflowRegressionServiceImpl::RegressWithModelSpec"); + ServableHandle saved_model_bundle; - TF_RETURN_IF_ERROR( - core->GetServableHandle(request.model_spec(), &saved_model_bundle)); + TF_RETURN_IF_ERROR(core->GetServableHandle(model_spec, &saved_model_bundle)); return RunRegress(run_options, saved_model_bundle->meta_graph_def, saved_model_bundle.id().version, saved_model_bundle->session.get(), request, response); diff --git a/tensorflow_serving/servables/tensorflow/regression_service.h b/tensorflow_serving/servables/tensorflow/regression_service.h index 52770357949..f9f154f60c1 100644 --- a/tensorflow_serving/servables/tensorflow/regression_service.h +++ b/tensorflow_serving/servables/tensorflow/regression_service.h @@ -31,6 +31,14 @@ class TensorflowRegressionServiceImpl final { static Status Regress(const RunOptions& run_options, ServerCore* core, const RegressionRequest& request, RegressionResponse* response); + + // Like Regress(), but uses 'model_spec' instead of the one embedded in + // 'request'. + static Status RegressWithModelSpec(const RunOptions& run_options, + ServerCore* core, + const ModelSpec& model_spec, + const RegressionRequest& request, + RegressionResponse* response); }; } // namespace serving diff --git a/tensorflow_serving/servables/tensorflow/regression_service_test.cc b/tensorflow_serving/servables/tensorflow/regression_service_test.cc index f6bdc8a6fc4..37b6ec4a643 100644 --- a/tensorflow_serving/servables/tensorflow/regression_service_test.cc +++ b/tensorflow_serving/servables/tensorflow/regression_service_test.cc @@ -167,6 +167,28 @@ TEST_F(RegressionServiceTest, RegressionSuccess) { "}")); } +// Verifies that RegressWithModelSpec() uses the model spec override rather than +// the one in the request. +TEST_F(RegressionServiceTest, ModelSpecOverride) { + auto request = test_util::CreateProto( + "model_spec {" + " name: \"test_model\"" + "}"); + auto model_spec_override = + test_util::CreateProto("name: \"nonexistent_model\""); + + RegressionResponse response; + EXPECT_NE(tensorflow::error::NOT_FOUND, + TensorflowRegressionServiceImpl::Regress( + RunOptions(), server_core_.get(), request, &response) + .code()); + EXPECT_EQ(tensorflow::error::NOT_FOUND, + TensorflowRegressionServiceImpl::RegressWithModelSpec( + RunOptions(), server_core_.get(), model_spec_override, request, + &response) + .code()); +} + } // namespace } // namespace serving } // namespace tensorflow From 2cad85d68e6e387976a1b80a45e4461856f7a187 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 10 Aug 2018 09:01:14 -0700 Subject: [PATCH 0587/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208216862 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index df97e2e8fde..22c2dff9e35 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8b2c1adc1820658e1863e51c5306643fc4082c8c4c5f475e31a5e3c0817dcb5f", - git_commit = "aacb29a4ab88f9fa27c3301977e7f2cc289a3976", + sha256 = "fb7a526f29c92797f245c5ac6b95b7224c4d927010d2b4a8764f76cca57a8fe6", + git_commit = "56e4ea405d13125a3dcb6459019a83d12330bf84", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 98cf813610f6710bda6344cf567f9ad3e9315872 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 10 Aug 2018 11:01:12 -0700 Subject: [PATCH 0588/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208236025 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 22c2dff9e35..02fc9eb373c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fb7a526f29c92797f245c5ac6b95b7224c4d927010d2b4a8764f76cca57a8fe6", - git_commit = "56e4ea405d13125a3dcb6459019a83d12330bf84", + sha256 = "f62adeb2282e81c313077f1f033026b86d64c0b5aa373c08e577743c0e760f20", + git_commit = "9e6122e6ed1940909558086a5bb4ec3b1e0d71c2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8b4c1f3af19b1927ea8228dbb42d3f4787a0da47 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 10 Aug 2018 12:01:24 -0700 Subject: [PATCH 0589/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208246313 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 02fc9eb373c..b724f86c608 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f62adeb2282e81c313077f1f033026b86d64c0b5aa373c08e577743c0e760f20", - git_commit = "9e6122e6ed1940909558086a5bb4ec3b1e0d71c2", + sha256 = "0a4ac9ee67806b110ec54279f932b6bf0b33944971e765aa9230387dfca8f24f", + git_commit = "729caa48a34683cd38bb14c48bb63e8cddc88d60", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7eddd91f21cf36cb8fd9269d4a75bf51ecd7d3e9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 10 Aug 2018 13:02:46 -0700 Subject: [PATCH 0590/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208255033 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b724f86c608..2a7b81b822c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0a4ac9ee67806b110ec54279f932b6bf0b33944971e765aa9230387dfca8f24f", - git_commit = "729caa48a34683cd38bb14c48bb63e8cddc88d60", + sha256 = "45794fc5e8c52eac52f60cfa8dcfa042580d421935ae79eb65484d01d5e5328e", + git_commit = "d2bec062040bfa083195c06deef56981c6f0f946", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5b945a6824ccdfdcb9eaec34df9332d406c9bb0d Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Fri, 10 Aug 2018 13:44:56 -0700 Subject: [PATCH 0591/8103] Add GPU serving instructions to Docker instructions PiperOrigin-RevId: 208261230 --- tensorflow_serving/g3doc/docker.md | 132 ++++++++++++++++++++++++++--- 1 file changed, 120 insertions(+), 12 deletions(-) diff --git a/tensorflow_serving/g3doc/docker.md b/tensorflow_serving/g3doc/docker.md index 634e67789af..6b0bf44b9f5 100644 --- a/tensorflow_serving/g3doc/docker.md +++ b/tensorflow_serving/g3doc/docker.md @@ -28,16 +28,16 @@ docker pull tensorflow/serving This will pull down an minimal Docker image with TensorFlow Serving installed. -See the Docker Hub [tensorflow/serving -repo](http://hub.docker.com/r/tensorflow/serving/tags/) for other versions of -images you can pull. +See the Docker Hub +[tensorflow/serving repo](http://hub.docker.com/r/tensorflow/serving/tags/) for +other versions of images you can pull. ### Serving example Once you have pulled the serving image, you can try serving an example model. -We will use a toy model called `Half Plus Three`, which will predict values `0.5 * x + 3` -for the values we provide for prediction. +We will use a toy model called `Half Plus Two`, which generates `0.5 * x + 2` +for the values of `x` we provide for prediction. To get this model, first clone the TensorFlow Serving repo. @@ -52,8 +52,10 @@ the REST API port (8501): ```shell docker run -p 8501:8501 \ --v /tmp/tfserving/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_three:/models/half_plus_three \ --e MODEL_NAME=half_plus_three -t tensorflow/serving & +--mount type=bind,\ +source=/tmp/tfserving/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu,\ +target=/models/half_plus_two \ +-e MODEL_NAME=half_plus_two -t tensorflow/serving & ``` This will run the docker container and launch the TensorFlow Serving Model @@ -64,7 +66,7 @@ as an environment variable, which will be important when we query the model. To query the model using the predict API, you can run ```shell -curl -d '{"instances": [1.0, 2.0, 5.0]}' -X POST http://localhost:8501/v1/models/half_plus_three:predict +curl -d '{"instances": [1.0, 2.0, 5.0]}' -X POST http://localhost:8501/v1/models/half_plus_two:predict ``` NOTE: Older versions of Windows and other systems without curl can download it @@ -73,7 +75,100 @@ NOTE: Older versions of Windows and other systems without curl can download it This should return a set of values: ```json -{ "predictions": [3.5, 4.0, 5.5] } +{ "predictions": [2.5, 3.0, 4.5] } +``` + +More information on using the RESTful API can be found [here](api_rest.md). + +## Serving with Docker using your GPU + +### Install nvidia-docker + +Before serving with a GPU, in addition to +[installing Docker](#installing_docker), you will need: + +* Up-to-date [NVIDIA drivers](http://www.nvidia.com/drivers) for your system +* `nvidia-docker`: You can follow the + [installation instructions here](https://github.com/NVIDIA/nvidia-docker#quick-start) + +### Pulling a GPU serving image + +Once you have `nvidia-docker` installed, you can pull the latest TensorFlow +Serving GPU docker image by running: + +```shell +docker pull tensorflow/serving:latest-gpu +``` + +This will pull down an minimal Docker image with TensorFlow Serving built for +running on GPUs installed. + +See the Docker Hub +[tensorflow/serving repo](http://hub.docker.com/r/tensorflow/serving/tags/) for +other versions of images you can pull. + +### GPU Serving example + +Once you have pulled the GPU serving image, you can try serving an example +model. + +We will use a toy model called `Half Plus Two`, which generates `0.5 * x + 2` +for the values of `x` we provide for prediction. This model will have ops bound +to the GPU device, and will not run on the CPU. + +To get this model, first clone the TensorFlow Serving repo. + +```shell +mkdir -p /tmp/tfserving +cd /tmp/tfserving +git clone --depth=1 https://github.com/tensorflow/serving +``` + +Next, run the TensorFlow Serving container pointing it to this model and opening +the REST API port (8501): + +```shell +docker run --runtime=nvidia -p 8501:8501 \ +--mount type=bind,\ +source=/tmp/tfserving/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_gpu,\ +target=/models/half_plus_two \ +-e MODEL_NAME=half_plus_two -t tensorflow/serving:latest-gpu & +``` + +This will run the docker container with the GPU build and launch the TensorFlow +Serving Model Server, bind the REST API port 8501, and map our desired model +from our host to where models are expected in the container. We also pass the +name of the model as an environment variable, which will be important when we +query the model. + +TIP: Before querying the model, be sure to wait till you see a message like the +following, indicating that the server is ready to receive requests: + +```shell +2018-07-27 00:07:20.773693: I tensorflow_serving/model_servers/main.cc:333] +Exporting HTTP/REST API at:localhost:8501 ... +``` + +To query the model using the predict API, you can run + +```shell +$ curl -d '{"instances": [1.0, 2.0, 5.0]}' -X POST http://localhost:8501/v1/models/half_plus_three:predict +``` + +NOTE: Older versions of Windows and other systems without curl can download it +[here](https://curl.haxx.se/download.html). + +This should return a set of values: + +```json +{ "predictions": [2.5, 3.0, 4.5] } +``` + +TIP: Trying to run the GPU model on a machine without a GPU or without a working +GPU build of TensorFlow Model Server will result in an error that looks like: + +```shell +Cannot assign a device for operation 'a': Operation was explicitly assigned to /device:GPU:0 ``` More information on using the RESTful API can be found [here](api_rest.md). @@ -96,9 +191,9 @@ support, use: docker pull tensorflow/serving:latest-devel-gpu ``` -See the Docker Hub [tensorflow/serving -repo](http://hub.docker.com/r/tensorflow/serving/tags/) for other versions of -images you can pull. +See the Docker Hub +[tensorflow/serving repo](http://hub.docker.com/r/tensorflow/serving/tags/) for +other versions of images you can pull. ### Development example @@ -132,6 +227,10 @@ We currently maintain the following Dockerfiles: * [`Dockerfile`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile), which is a minimal VM with TensorFlow Serving installed. +* [`Dockerfile.gpu`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile), + which is a minimal VM with TensorFlow Serving with GPU support to be used + with `nvidia-docker`. + * [`Dockerfile.devel`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.devel), which is a minimal VM with all of the dependencies needed to build TensorFlow Serving. @@ -151,6 +250,12 @@ running the Docker build command: docker build --pull -t $USER/tensorflow-serving . ``` +`Dockerfile.gpu`: + +```shell +docker build --pull -t $USER/tensorflow-serving-gpu -f Dockerfile.gpu . +``` + `Dockerfile.devel`: ```shell @@ -189,5 +294,8 @@ To run the container opening the gRPC port (8500): docker run -it -p 8500:8500 $USER/tensorflow-serving-devel ``` +TIP: If you're running a GPU image, be sure to run using the NVIDIA runtime +[`--runtime=nvidia`](https://github.com/NVIDIA/nvidia-docker#quick-start). + From here, you can follow the instructions for [testing a development environment](#testing-the-development-environment). From 14cf6dfb1f911057765852c8bfdb5cb335e040f9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 10 Aug 2018 14:01:27 -0700 Subject: [PATCH 0592/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208263738 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2a7b81b822c..5c56a7e807e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "45794fc5e8c52eac52f60cfa8dcfa042580d421935ae79eb65484d01d5e5328e", - git_commit = "d2bec062040bfa083195c06deef56981c6f0f946", + sha256 = "533a2e6e88f8d336ba504f73dfd58b6b6b43356f85632f5fde76da507b9ee50d", + git_commit = "e35dc3ad3a0536a0fdacec50ec8aea95e5c087da", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 70a402cca6aeffb8320a068e486eec5d6f03ebb0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 10 Aug 2018 15:01:32 -0700 Subject: [PATCH 0593/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208273865 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5c56a7e807e..a6b92c4c0aa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "533a2e6e88f8d336ba504f73dfd58b6b6b43356f85632f5fde76da507b9ee50d", - git_commit = "e35dc3ad3a0536a0fdacec50ec8aea95e5c087da", + sha256 = "d90fd5dbff74f06b53c8c7101de84f5b4d5ead57c8408ed040dbb39f4269899f", + git_commit = "db294c86cc299d5fc8c5cbf089b07e59723a4664", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b02b67226ddb6331e8219548d40b8f8ce9246726 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 10 Aug 2018 16:01:09 -0700 Subject: [PATCH 0594/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208283058 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a6b92c4c0aa..0c62bd681fa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d90fd5dbff74f06b53c8c7101de84f5b4d5ead57c8408ed040dbb39f4269899f", - git_commit = "db294c86cc299d5fc8c5cbf089b07e59723a4664", + sha256 = "5804f956d4797f3bc2b7841d532f83967ec8302583c065c2e99ba53645ec91ff", + git_commit = "3d0edd130c137088d7815e1f3e67719d05fd9ab1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From be6d01404687c09e3921233846a331bfac08137c Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Fri, 10 Aug 2018 16:23:54 -0700 Subject: [PATCH 0595/8103] Update Release Notes PiperOrigin-RevId: 208286522 --- RELEASE.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/RELEASE.md b/RELEASE.md index 2afa7bd3357..7c71d34790a 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,3 +1,34 @@ +# Release 1.10.0 + +# Major Features and Improvements + +* No major features or improvements. + +## Breaking Changes + +* TensorFlow Serving API now uses gRPC's GA release. The beta gRPC API has been deprecated, and will be removed in a future version of TensorFlow Serving. Please update your gRPC client code ([sample](https://github.com/tensorflow/serving/commit/aa35cfdb24016f6d88f82c53d45c8ce9fa550499#diff-e7d756a12c65a8b5ac90229b23523023)) +* Docker images for GPU are built against NCCL 2.2, in following with Tensorflow 1.10. + +## Bug Fixes and Other Changes + +* Built against TensorFlow 1.10. +* Added GPU serving Docker image. +* Repo cloning and shell prompt in example readme. +* Updated Docker instructions. +* Updated min Bazel version (0.15.0). +* Convert TF_CHECK_OKs to TF_ASSERT_OK in some unit tests. +* Remove error suppression (.IgnoreError()) from BasicManager. +* Add new bazel_in_docker.sh tool for doing hermetic bazel builds. +* Fix erroneous formatting of numbers in REST API output that are larger than 6 digits. +* Add support for Python 3 while also compatible with Python 2.7 in mnist_saved_model.py. +* Fix an incorrect link to Dockerfile.devel-gpu. +* Add util for get model status. +* Adding support for secure channel to ModelServer. +* Add version output to model server binary. +* Change ServerRequestLogger::Update to only create new and delete old loggers if needed. +* Have the Model Server interpret specific hard-coded model version labels "stable" and "canary" as the smallest and largest version#, respectively. +* Add half_plus_two CPU and GPU models to test data. + # Release 0.4.0 Initial release of TensorFlow Serving. From 6c8ec3116767d54638b6bffaf0b9edfdbb1cdc5c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 10 Aug 2018 17:01:41 -0700 Subject: [PATCH 0596/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208291693 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0c62bd681fa..92617e5ce99 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5804f956d4797f3bc2b7841d532f83967ec8302583c065c2e99ba53645ec91ff", - git_commit = "3d0edd130c137088d7815e1f3e67719d05fd9ab1", + sha256 = "a3fb1e5058953de6606c8bd8f8bc4390d10a3e0011fcd5af45dd74b20093c4a2", + git_commit = "bdc3b303f1ba5b22cac1df0b605ad0e0c45421f1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fbab3da1e9c690bbcba82c5b9fb5ff994e39206b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 10 Aug 2018 18:31:12 -0700 Subject: [PATCH 0597/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208300802 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 92617e5ce99..697665620e5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a3fb1e5058953de6606c8bd8f8bc4390d10a3e0011fcd5af45dd74b20093c4a2", - git_commit = "bdc3b303f1ba5b22cac1df0b605ad0e0c45421f1", + sha256 = "d9bd385b9b41cc6318c6af63edb20cd633b0c6962e4d0fa9ebd880cad2dbfd5c", + git_commit = "8cfc0a152c4022b17d7d9b286c4cff726f78f7fd", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5502c1be412550978b42997e6270ae65d74a0fbc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 10 Aug 2018 19:56:26 -0700 Subject: [PATCH 0598/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208305562 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 697665620e5..28786eb37f9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d9bd385b9b41cc6318c6af63edb20cd633b0c6962e4d0fa9ebd880cad2dbfd5c", - git_commit = "8cfc0a152c4022b17d7d9b286c4cff726f78f7fd", + sha256 = "90c04dc725a45eebfae545a1b5e9cd5ec1fe102f1b7a3cf8b0e68c3d5a7fdd82", + git_commit = "fe7430adaa3b51ad17a1f8d0aed0fc7018b1a416", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d748ce57a75243dfa0b02cffe8f6d58ab730f4bb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 10 Aug 2018 20:25:13 -0700 Subject: [PATCH 0599/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208307171 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 28786eb37f9..e3ce42c77aa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "90c04dc725a45eebfae545a1b5e9cd5ec1fe102f1b7a3cf8b0e68c3d5a7fdd82", - git_commit = "fe7430adaa3b51ad17a1f8d0aed0fc7018b1a416", + sha256 = "5ad673ba96ece98564e0685e2f6b9f75dc4df2f169bdf91adc93ea700adae2d5", + git_commit = "349f9e65fb1c50f57dad53920eb95999fec6b8c2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2ed08fb5e063bb57fc64d98db9e8597d26e52322 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 10 Aug 2018 23:01:19 -0700 Subject: [PATCH 0600/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208314650 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e3ce42c77aa..c34df5ea68b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5ad673ba96ece98564e0685e2f6b9f75dc4df2f169bdf91adc93ea700adae2d5", - git_commit = "349f9e65fb1c50f57dad53920eb95999fec6b8c2", + sha256 = "a79e38a02c14d9fd92bcde1de70f4fb99420cc60cc80ec618acbbc6eebeb88ea", + git_commit = "054b3961f76a12bc8b722af708982949b4e951cf", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8afc4ddc2b8cacbf816070c60fb2d36ec0d4b4c4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 11 Aug 2018 00:01:51 -0700 Subject: [PATCH 0601/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208317356 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c34df5ea68b..e0e857e1dd9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a79e38a02c14d9fd92bcde1de70f4fb99420cc60cc80ec618acbbc6eebeb88ea", - git_commit = "054b3961f76a12bc8b722af708982949b4e951cf", + sha256 = "8aeb19957aeeaf0380e420f0aa56b6e5a93ac6085f84b0d30bde956b3f4fa6e4", + git_commit = "a8e78e2e617b6ca10f4878fe99fdf43ddedfa7c6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 93ba723667d93378a429e13baeb7811a7333a422 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 11 Aug 2018 01:05:00 -0700 Subject: [PATCH 0602/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208321128 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e0e857e1dd9..b78dd11eec1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8aeb19957aeeaf0380e420f0aa56b6e5a93ac6085f84b0d30bde956b3f4fa6e4", - git_commit = "a8e78e2e617b6ca10f4878fe99fdf43ddedfa7c6", + sha256 = "628c0e41397ec806d62dd16d70f9997375d0cff751869b46996cdb01ed07a272", + git_commit = "c160ce2191d41ce7108465004c7b1846aa703ddc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e4ac461ca821d009d99aff3fe461c4916879ca53 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 11 Aug 2018 04:01:31 -0700 Subject: [PATCH 0603/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208330400 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b78dd11eec1..93fc4eb8a85 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "628c0e41397ec806d62dd16d70f9997375d0cff751869b46996cdb01ed07a272", - git_commit = "c160ce2191d41ce7108465004c7b1846aa703ddc", + sha256 = "7036ac08d0f541ca6cdfcf1e135d19832a133aa29b9b35704b68fbf3b3935b11", + git_commit = "3b061fce8b9a1c867f2798d51b5375ea3a03b385", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f79a1001ca9bb169aca17ff6b6b62639d07b8718 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 11 Aug 2018 11:01:10 -0700 Subject: [PATCH 0604/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208345659 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 93fc4eb8a85..56d51914685 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7036ac08d0f541ca6cdfcf1e135d19832a133aa29b9b35704b68fbf3b3935b11", - git_commit = "3b061fce8b9a1c867f2798d51b5375ea3a03b385", + sha256 = "caf787284c77d877158a685fe1b3d711179d049b132287191a25fed0d948192e", + git_commit = "d3b03f86d38ee8da9000f94344ef51b9ff76a790", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 350554814820caec7a1d5169a075f07eb1e83693 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 11 Aug 2018 12:01:14 -0700 Subject: [PATCH 0605/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208347688 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 56d51914685..720d816cb7f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "caf787284c77d877158a685fe1b3d711179d049b132287191a25fed0d948192e", - git_commit = "d3b03f86d38ee8da9000f94344ef51b9ff76a790", + sha256 = "1391479356f637d41d24c3fc93d3f7fc7a8f3979dae80ea5359f5455b0631cbf", + git_commit = "937ae7fc1852a9396393130c232b1a8231648345", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 05770758a20b4cd263bec3383e6000915f883ca0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 11 Aug 2018 14:01:14 -0700 Subject: [PATCH 0606/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208352205 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 720d816cb7f..1aac5c479d5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1391479356f637d41d24c3fc93d3f7fc7a8f3979dae80ea5359f5455b0631cbf", - git_commit = "937ae7fc1852a9396393130c232b1a8231648345", + sha256 = "21a73bb996a1567a126d467727cb05de91d8ba27565eeaa4675a960318a28dc8", + git_commit = "af25771f4418db658ad4b40a635ea5f2a4c2bbe6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 63b813e60250a7a56fe2b69dfe0f99dfd9eba258 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 11 Aug 2018 15:01:24 -0700 Subject: [PATCH 0607/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208354593 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1aac5c479d5..27fa9f35fe6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "21a73bb996a1567a126d467727cb05de91d8ba27565eeaa4675a960318a28dc8", - git_commit = "af25771f4418db658ad4b40a635ea5f2a4c2bbe6", + sha256 = "687098c97028f124d2e93475d6aa3499acef77f6b089a616659722bcb255b8ce", + git_commit = "ebfa84016deceb3a1d01aabed292d369e5e872e4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 95811a39ea22e78cf74870c76b13bbd57f062e1a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 11 Aug 2018 16:02:20 -0700 Subject: [PATCH 0608/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208356838 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 27fa9f35fe6..9d5c245cc9d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "687098c97028f124d2e93475d6aa3499acef77f6b089a616659722bcb255b8ce", - git_commit = "ebfa84016deceb3a1d01aabed292d369e5e872e4", + sha256 = "e6b7a471bc48f714e6fee462ac57e506a32410697126845441d37af793ea2d30", + git_commit = "d2981e0f61f5da46b2ab90a0779842565db43519", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d24459900a3cd4a09a68f52d477aa9e306ef0ab9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 11 Aug 2018 17:02:28 -0700 Subject: [PATCH 0609/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208358843 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9d5c245cc9d..87e5b6916d3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e6b7a471bc48f714e6fee462ac57e506a32410697126845441d37af793ea2d30", - git_commit = "d2981e0f61f5da46b2ab90a0779842565db43519", + sha256 = "5b27079c75168bbd85eea498811687c6aa350962e5a3e5d232f724a4bdb37c8f", + git_commit = "d8802756db92bbf032c1d8ee6fbed1aaf873c8fa", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 67700dc62c6aaf3e1b0d40c64de0aded7874fe5f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 11 Aug 2018 21:02:03 -0700 Subject: [PATCH 0610/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208367423 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 87e5b6916d3..04605f8cecc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5b27079c75168bbd85eea498811687c6aa350962e5a3e5d232f724a4bdb37c8f", - git_commit = "d8802756db92bbf032c1d8ee6fbed1aaf873c8fa", + sha256 = "24aa469ce4a03e40d34c973056b0b06f85c40f44d6a15a5e3c53b49728267a0d", + git_commit = "b21590d65ba849d97db0f2e02cff0c874ae562cc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 481638c5b400e133c57536eafba7b7eff5e82ead Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 12 Aug 2018 03:01:05 -0700 Subject: [PATCH 0611/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208382634 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 04605f8cecc..5d180caed0b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "24aa469ce4a03e40d34c973056b0b06f85c40f44d6a15a5e3c53b49728267a0d", - git_commit = "b21590d65ba849d97db0f2e02cff0c874ae562cc", + sha256 = "fd94aa51b4a1e94f588280abfd792d97c616f307485651cf7c60145524791b3e", + git_commit = "1a22b0b982fa1a953651b98af8f3cd30542048fd", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9f206ababbb04ffe72138666e9676b9ffed78e2b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 12 Aug 2018 18:01:55 -0700 Subject: [PATCH 0612/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208417071 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5d180caed0b..d6cc835f21b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fd94aa51b4a1e94f588280abfd792d97c616f307485651cf7c60145524791b3e", - git_commit = "1a22b0b982fa1a953651b98af8f3cd30542048fd", + sha256 = "46198e3760ba10eff26f3b1e925864cca3193dc0320dffe6e85ab3c028460c3c", + git_commit = "087190246b95dc4c188f630ca90880a12e39b557", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a8cce12501566e600a78becdd02e107d86093deb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 13 Aug 2018 04:02:08 -0700 Subject: [PATCH 0613/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208457843 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d6cc835f21b..0a7a2e438ff 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "46198e3760ba10eff26f3b1e925864cca3193dc0320dffe6e85ab3c028460c3c", - git_commit = "087190246b95dc4c188f630ca90880a12e39b557", + sha256 = "de05a226223cba1b240b7e865e8ba562ffac107ea4d685d34fe0d8c69fd09274", + git_commit = "4dc13f1aa7bdfb9fc21fc0fc4961c69cb8cb1d20", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 18d20bc54fbf86bbcc0fda4a43cce0bbc98cb965 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 13 Aug 2018 05:02:25 -0700 Subject: [PATCH 0614/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208463066 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0a7a2e438ff..faa7c6b0772 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "de05a226223cba1b240b7e865e8ba562ffac107ea4d685d34fe0d8c69fd09274", - git_commit = "4dc13f1aa7bdfb9fc21fc0fc4961c69cb8cb1d20", + sha256 = "c21ddc95eaa676f203c6a9adf02f8abd41161aaa1ffc792603e6ac6bdfc8a726", + git_commit = "9b44e8bd7b116503f9f1fe605d8ff43ef6ee132e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d59ea2087e8ee9f15f7b16d182d5538e3f3b86e9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 13 Aug 2018 06:01:47 -0700 Subject: [PATCH 0615/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208468556 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index faa7c6b0772..de114d668b3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c21ddc95eaa676f203c6a9adf02f8abd41161aaa1ffc792603e6ac6bdfc8a726", - git_commit = "9b44e8bd7b116503f9f1fe605d8ff43ef6ee132e", + sha256 = "6892e19906841a670c4f3aee51e2b7bb7db799394da21427c559bb7f67b6e37e", + git_commit = "2c623eaa7c0dca79d126247393a68d285baeb7f0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8f7ec5f125126773586a9076ddef60e78cd8492e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 13 Aug 2018 10:01:56 -0700 Subject: [PATCH 0616/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208497605 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index de114d668b3..3cbf0207be6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6892e19906841a670c4f3aee51e2b7bb7db799394da21427c559bb7f67b6e37e", - git_commit = "2c623eaa7c0dca79d126247393a68d285baeb7f0", + sha256 = "a6dcc4232f3a05cd95c4aa4a9a7cdb7f075d79f57c35f39586eed3c6aee488e6", + git_commit = "0a60da0a19aed7df4da25876e93c645f26f640c4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b419b4591d45692d03258ef1fe1d32db9eb0e349 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 13 Aug 2018 11:01:10 -0700 Subject: [PATCH 0617/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208508623 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3cbf0207be6..b92fe5e27ff 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a6dcc4232f3a05cd95c4aa4a9a7cdb7f075d79f57c35f39586eed3c6aee488e6", - git_commit = "0a60da0a19aed7df4da25876e93c645f26f640c4", + sha256 = "a416357f28743aada3fcf1bb13b3664186c80d98343fb3b37f89ddbb9558fdc5", + git_commit = "bc89890f52a00b6094f2c49ec76a7264680beb8c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b814ea3b541a324ecf3c606308c903ee3cce78fb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 13 Aug 2018 12:02:45 -0700 Subject: [PATCH 0618/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208519993 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b92fe5e27ff..93b36028f39 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a416357f28743aada3fcf1bb13b3664186c80d98343fb3b37f89ddbb9558fdc5", - git_commit = "bc89890f52a00b6094f2c49ec76a7264680beb8c", + sha256 = "30bef00e5ae10dd96712df331e88a81863545387757ab9d84b581cd5bcaa1a01", + git_commit = "dfa844ac95d07ce9584fc841a931aad65d3b4ac8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 153e75ab838c252b3a8f66824754dd4f30519601 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 13 Aug 2018 13:01:24 -0700 Subject: [PATCH 0619/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208529105 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 93b36028f39..64ed15c29aa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "30bef00e5ae10dd96712df331e88a81863545387757ab9d84b581cd5bcaa1a01", - git_commit = "dfa844ac95d07ce9584fc841a931aad65d3b4ac8", + sha256 = "f22fcd537a87a5dbb2ad474e8b904b8cd4f50a890b60c365cc7a69b255d9c086", + git_commit = "881f58d20cc159817eadefa6f8e1b7d87c85d01f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b2d2b87d67ec065ae1e4df4ca5b36c151d6457f6 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Mon, 13 Aug 2018 13:40:51 -0700 Subject: [PATCH 0620/8103] Update docker builds PiperOrigin-RevId: 208535314 --- .../tools/docker/Dockerfile.devel | 21 ++++++++++++------- .../tools/docker/Dockerfile.devel-gpu | 19 ++++++++++------- tools/bazel_in_docker.sh | 5 +++-- 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index b3e0161c784..a264cbd4695 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -11,7 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -FROM ubuntu:16.04 +FROM ubuntu:16.04 as base_build ARG TF_SERVING_VERSION_GIT_BRANCH=master ARG TF_SERVING_VERSION_GIT_COMMIT=head @@ -46,8 +46,12 @@ RUN apt-get update && apt-get install -y \ apt-get clean && \ rm -rf /var/lib/apt/lists/* -# Set up grpc -RUN pip install mock grpcio +RUN pip --no-cache-dir install \ + mock \ + grpcio \ + h5py \ + keras_applications \ + keras_preprocessing # Set up Bazel # Need >= 0.15.0 so bazel compiles work with docker bind mounts. @@ -68,6 +72,8 @@ RUN git clone --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tenso git remote add upstream https://github.com/tensorflow/serving.git && \ if [ "${TF_SERVING_VERSION_GIT_COMMIT}" != "head" ]; then git checkout ${TF_SERVING_VERSION_GIT_COMMIT} ; fi + +FROM base_build as binary_build # Build, and install TensorFlow Serving ARG TF_SERVING_BUILD_OPTIONS="--copt=-mavx --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0" ARG TF_SERVING_BAZEL_OPTIONS="" @@ -78,9 +84,10 @@ RUN bazel build -c opt --color=yes --curses=yes \ --output_filter=DONT_MATCH_ANYTHING \ ${TF_SERVING_BUILD_OPTIONS} \ tensorflow_serving/model_servers:tensorflow_model_server && \ - cp bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server /usr/local/bin/ && \ - bazel clean --expunge --color=yes && \ - rm -rf /root/.cache -# Clean up Bazel cache when done. + cp bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server /usr/local/bin/ +FROM binary_build as clean_build +# Clean up Bazel cache when done. +RUN bazel clean --expunge --color=yes && \ + rm -rf /root/.cache CMD ["/bin/bash"] diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 6d784f531a2..1b2128b54ac 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -11,7 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -FROM nvidia/cuda:9.0-base-ubuntu16.04 +FROM nvidia/cuda:9.0-base-ubuntu16.04 as base_build ARG TF_SERVING_VERSION_GIT_BRANCH=master ARG TF_SERVING_VERSION_GIT_COMMIT=head @@ -63,10 +63,12 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ find /usr/local/cuda-9.0/lib64/ -type f -name 'lib*_static.a' -not -name 'libcudart_static.a' -delete && \ rm /usr/lib/x86_64-linux-gnu/libcudnn_static_v7.a -# Set up grpc -RUN pip --no-cache-dir install \ +RUN pip --no-cache-dir install \ mock \ - grpcio + grpcio \ + h5py \ + keras_applications \ + keras_preprocessing # Set up Bazel # Need >= 0.15.0 so bazel compiles work with docker bind mounts. @@ -119,6 +121,7 @@ RUN git clone --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tenso git remote add upstream https://github.com/tensorflow/serving.git && \ if [ "${TF_SERVING_VERSION_GIT_COMMIT}" != "head" ]; then git checkout ${TF_SERVING_VERSION_GIT_COMMIT} ; fi +FROM base_build as binary_build # Build, and install TensorFlow Serving ARG TF_SERVING_BUILD_OPTIONS="--copt=-mavx --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0" ARG TF_SERVING_BAZEL_OPTIONS="" @@ -131,8 +134,10 @@ RUN ln -s /usr/local/cuda/lib64/stubs/libcuda.so /usr/local/cuda/lib64/stubs/lib ${TF_SERVING_BUILD_OPTIONS} \ tensorflow_serving/model_servers:tensorflow_model_server && \ cp bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server /usr/local/bin/ && \ - rm /usr/local/cuda/lib64/stubs/libcuda.so.1 && \ - bazel clean --expunge --color=yes -# Clean up Bazel cache when done. + rm /usr/local/cuda/lib64/stubs/libcuda.so.1 +FROM binary_build as clean_build +# Clean up Bazel cache when done. +RUN bazel clean --expunge --color=yes && \ + rm -rf /root/.cache CMD ["/bin/bash"] \ No newline at end of file diff --git a/tools/bazel_in_docker.sh b/tools/bazel_in_docker.sh index a7991f3ff78..3f2155aa700 100755 --- a/tools/bazel_in_docker.sh +++ b/tools/bazel_in_docker.sh @@ -62,13 +62,14 @@ IMAGE="tensorflow/serving:nightly-devel" [[ "$1" = "-d" ]] && IMAGE=$2 && shift 2 || true [[ "${IMAGE}" = "" ]] && usage -RUN_OPTS=(--rm -it) -if [[ "$1" = "bazel" ]]; then +RUN_OPTS=(--rm -it --network=host) +if [[ "$1" = "bazel"* ]]; then CMD="sh -c '$(get_bazel_cmd) $@'" RUN_OPTS+=("-v $(pwd):$(pwd)") else CMD="$@" fi + [[ "${CMD}" = "" ]] && usage [[ ! -x $(command -v docker) ]] && echo "ERROR: 'docker' command missing from PATH." && usage From 181865e8dce3d7787f70ffd09e66bb601fb3d1b4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 13 Aug 2018 14:01:43 -0700 Subject: [PATCH 0621/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208538586 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 64ed15c29aa..b4f8a52fb4b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f22fcd537a87a5dbb2ad474e8b904b8cd4f50a890b60c365cc7a69b255d9c086", - git_commit = "881f58d20cc159817eadefa6f8e1b7d87c85d01f", + sha256 = "b7fec2ece23709b981a8e64b043a7f7efd04d9e9036b834ddfedeb63c5ba4460", + git_commit = "81494bc9081f871434b5b2fb6e04bc45a330972f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 75c544865d17866ce32d4f0f4286eb459b598e8f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 13 Aug 2018 15:01:23 -0700 Subject: [PATCH 0622/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208548605 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b4f8a52fb4b..191a6c871f7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b7fec2ece23709b981a8e64b043a7f7efd04d9e9036b834ddfedeb63c5ba4460", - git_commit = "81494bc9081f871434b5b2fb6e04bc45a330972f", + sha256 = "397fba100632d6cf3e5d33b65a34044c81ab380382fad936af2cf875e0cea55c", + git_commit = "de5c8358e831d050bd45d9eaaa1b186513c7ef85", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 57e4fb75f03cd4a108fac18bcde56df32a11bbe2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 13 Aug 2018 16:02:22 -0700 Subject: [PATCH 0623/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208559126 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 191a6c871f7..dda3ef9d431 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "397fba100632d6cf3e5d33b65a34044c81ab380382fad936af2cf875e0cea55c", - git_commit = "de5c8358e831d050bd45d9eaaa1b186513c7ef85", + sha256 = "630e35e1846208af99fb8ec82031e153e106895245d3ff13af8552a07d8b0ea7", + git_commit = "e9002c077f14b8048c48e9670879fbe3fb7801e9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8a6dc8e2fa9376ede07797f1018393635fb901c0 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Mon, 13 Aug 2018 16:32:49 -0700 Subject: [PATCH 0624/8103] Update Inception tutorial PiperOrigin-RevId: 208563882 --- tensorflow_serving/example/inception_k8s.yaml | 12 +- .../example/inception_saved_model.py | 5 +- tensorflow_serving/g3doc/serving_inception.md | 221 +++++++++++------- 3 files changed, 137 insertions(+), 101 deletions(-) diff --git a/tensorflow_serving/example/inception_k8s.yaml b/tensorflow_serving/example/inception_k8s.yaml index c45c5334ef3..b380cad495c 100644 --- a/tensorflow_serving/example/inception_k8s.yaml +++ b/tensorflow_serving/example/inception_k8s.yaml @@ -27,14 +27,8 @@ spec: containers: - name: inception-container image: gcr.io/tensorflow-serving/inception - command: - - /bin/sh - - -c - args: - - serving/bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server - --port=9000 --model_name=inception --model_base_path=serving/inception-export ports: - - containerPort: 9000 + - containerPort: 8500 --- apiVersion: v1 kind: Service @@ -44,8 +38,8 @@ metadata: name: inception-service spec: ports: - - port: 9000 - targetPort: 9000 + - port: 8500 + targetPort: 8500 selector: app: inception-server type: LoadBalancer diff --git a/tensorflow_serving/example/inception_saved_model.py b/tensorflow_serving/example/inception_saved_model.py index 5224d368baf..0ce19d04eb3 100644 --- a/tensorflow_serving/example/inception_saved_model.py +++ b/tensorflow_serving/example/inception_saved_model.py @@ -153,8 +153,6 @@ def export(): method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME )) - legacy_init_op = tf.group( - tf.tables_initializer(), name='legacy_init_op') builder.add_meta_graph_and_variables( sess, [tf.saved_model.tag_constants.SERVING], signature_def_map={ @@ -164,7 +162,8 @@ def export(): DEFAULT_SERVING_SIGNATURE_DEF_KEY: classification_signature, }, - legacy_init_op=legacy_init_op) + main_op=tf.tables_initializer(), + strip_default_attrs=True) builder.save() print('Successfully exported model to %s' % FLAGS.output_dir) diff --git a/tensorflow_serving/g3doc/serving_inception.md b/tensorflow_serving/g3doc/serving_inception.md index 43acd972e06..5c9056a13b6 100644 --- a/tensorflow_serving/g3doc/serving_inception.md +++ b/tensorflow_serving/g3doc/serving_inception.md @@ -11,106 +11,123 @@ To learn more about TensorFlow Serving, we recommend To learn more about TensorFlow Inception model, we recommend [Inception in TensorFlow](https://github.com/tensorflow/models/tree/master/research/inception). -- [Part 0](#part_0_create_a_docker_image) shows how to create a TensorFlow - Serving Docker image for deployment -- [Part 1](#part_1_run_in_local_docker_container) shows how to run the image - in local containers. +- [Part 1](#part_1_export_the_inception_model) shows how to export the + Inception model +- [Part 1](#part_2_run_in_local_docker_container) shows how to run the local + Docker serving image - [Part 2](#part_2_deploy_in_kubernetes) shows how to deploy in Kubernetes. -## Part 0: Create a Docker image +## Part 1: Export the Inception model -Please refer to [Using TensorFlow Serving via Docker](docker.md) for details -about building a TensorFlow Serving Docker image. +Before getting started, first [install Docker](docker.md#installing-docker) -### Run container +### Clone Tensorflow Serving -We build a based image `$USER/tensorflow-serving-devel` using -[Dockerfile.devel](https://github.com/tensorflow/serving/tree/master/tensorflow_serving/tools/docker/Dockerfile.devel). -And then start a container locally using the built image. +First we want to clone the TensorFlow Serving source to our local machine: ```shell -$ docker build --pull -t $USER/tensorflow-serving-devel -f tensorflow_serving/tools/docker/Dockerfile.devel . -$ docker run --name=inception_container -it $USER/tensorflow-serving-devel +git clone https://github.com/tensorflow/serving +cd serving ``` -### Clone, configure, and build TensorFlow Serving in a container +Clear our local models directory in case we already have one + +```shell +rm -rf ./models/inception +``` + +### Build TensorFlow Serving Inception model exporter + +Next, we will build the Inception model exporter using a docker container. Note: All `bazel build` commands below use the standard `-c opt` flag. To further optimize the build, refer to the -[instructions here](setup.md#optimized). - -In the running container, we clone, configure and build TensorFlow Serving -example code. +[instructions here](setup.md#optimized-build). ```shell -root@c97d8e820ced:/# git clone -b r1.6 https://github.com/tensorflow/serving -root@c97d8e820ced:/# cd serving -root@c97d8e820ced:/serving# bazel build -c opt tensorflow_serving/example/... +tools/bazel_in_docker.sh bazel build -c opt \ + tensorflow_serving/example:inception_saved_model ``` -Next we can either install a TensorFlow ModelServer with apt-get using the -[instructions here](setup.md#aptget), or build a ModelServer binary using: +### Export Inception model + +With the inception model built, we run +[inception_saved_model.py](https://github.com/tensorflow/serving/tree/master/tensorflow_serving/example/inception_saved_model.py) +to export the Inception model using the released +[Inception model training checkpoint](http://download.tensorflow.org/models/image/imagenet/inception-v3-2016-03-01.tar.gz). +Instead of training from scratch, we use the readily available checkpoints of +well trained variables to restore the inference graph and export it directly. ```shell -root@c97d8e820ced:/serving# bazel build -c opt tensorflow_serving/model_servers:tensorflow_model_server +curl -O http://download.tensorflow.org/models/image/imagenet/inception-v3-2016-03-01.tar.gz +tar xzf inception-v3-2016-03-01.tar.gz ``` -The rest of this tutorial assumes you compiled the ModelServer locally, in which -case the command to run it is -`bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server`. If however -you installed the ModelServer using apt-get, simply replace that command with -`tensorflow_model_server`. +We can verify we have the checkpoint: -### Export Inception model in container +```console +$ ls inception-v3 +README.txt checkpoint model.ckpt-157585 +``` -In the running container, we run -[inception_saved_model.py](https://github.com/tensorflow/serving/tree/master/tensorflow_serving/example/inception_saved_model.py) -to export the inception model using the released -[Inception model training checkpoint](http://download.tensorflow.org/models/image/imagenet/inception-v3-2016-03-01.tar.gz). -Instead of training from scratch, we use the readily available checkpoints -of well trained variables to restore the inference graph and export it -directly. +Now let's export the Inception model: ```shell -root@c97d8e820ced:/serving# curl -O http://download.tensorflow.org/models/image/imagenet/inception-v3-2016-03-01.tar.gz -root@c97d8e820ced:/serving# tar xzf inception-v3-2016-03-01.tar.gz -root@c97d8e820ced:/serving# ls inception-v3 -README.txt checkpoint model.ckpt-157585 -root@c97d8e820ced:/serving# bazel-bin/tensorflow_serving/example/inception_saved_model --checkpoint_dir=inception-v3 --output_dir=/tmp/inception-export +tools/bazel_in_docker.sh \ + bazel-bin/tensorflow_serving/example/inception_saved_model \ + --checkpoint_dir=inception-v3 --output_dir=models/inception +``` + +This should result in output like: + +```console Successfully loaded model from inception-v3/model.ckpt-157585 at step=157585. -Successfully exported model to /tmp/inception-export -root@c97d8e820ced:/serving# ls /tmp/inception-export +Exporting trained moedl to models/inception/1 +Successfully exported model to models/inception +$ ls models/inception 1 -root@c97d8e820ced:/serving# [Ctrl-p] + [Ctrl-q] ``` +## Part 2: Run in local Docker container + ### Commit image for deployment -Note that we detach from the container at the end of above instructions -instead of terminating it, as we want to [commit](https://docs.docker.com/engine/reference/commandline/commit/) -all changes to a new image `$USER/inception_serving` for Kubernetes deployment. +Now we want to take a serving image and +[commit](https://docs.docker.com/engine/reference/commandline/commit/) all +changes to a new image `$USER/inception_serving` for Kubernetes deployment. + +First we run a serving image, but change the entry point to just run `bash`: ```shell -$ docker commit inception_container $USER/inception_serving -$ docker stop inception_container +docker run -d --name serving_base tensorflow/serving ``` -## Part 1: Run in local Docker container +Next, we copy the Inception model data to the container's model folder: -Let's test the serving workflow locally using the built image. +```shell +docker cp models/inception serving_base:/models/inception +``` + +Finally we commit the container to serving the Inception model: ```shell -$ docker run -it $USER/inception_serving +docker commit --change "ENV MODEL_NAME inception" serving_base \ + $USER/inception_serving +``` + +Now let's stop the serving base container + +```shell +docker kill serving_base ``` ### Start the server -Run the [gRPC]( http://www.grpc.io/) `tensorflow_model_server` in the container. +Now let's start the container with the Inception model so it's ready for +serving, exposing the gRPC port 8500: ```shell -root@f07eec53fd95:/# cd serving -root@f07eec53fd95:/serving# bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server --port=9000 --model_name=inception --model_base_path=/tmp/inception-export &> inception_log & -[1] 45 +docker run -p 8500:8500 -t $USER/inception_serving & ``` ### Query the server @@ -120,8 +137,19 @@ The client sends an image specified by the command line parameter to the server over gRPC for classification into human readable descriptions of the [ImageNet](http://www.image-net.org/) categories. +Note: We leave it as an exercise to the reader to find an image of a cat on the +Internet. + ```shell -root@f07eec53fd95:/serving# bazel-bin/tensorflow_serving/example/inception_client --server=localhost:9000 --image=/path/to/my_cat_image.jpg +tools/bazel_in_docker.sh bazel build -c opt \ + tensorflow_serving/example:inception_client +tools/bazel_in_docker.sh bazel-bin/tensorflow_serving/example/inception_client \ + --server=127.0.0.1:8500 --image=local/path/to/my_cat_image.jpg +``` + +This should result in output like: + +```console outputs { key: "classes" value { @@ -160,13 +188,11 @@ outputs { float_val: 3.93207240105 } } - -root@f07eec53fd95:/serving# exit ``` It works! The server successfully classifies your cat image! -## Part 2: Deploy in Kubernetes +## Part 3: Deploy in Kubernetes In this section we use the container image built in Part 0 to deploy a serving cluster with [Kubernetes](http://kubernetes.io) in the @@ -180,7 +206,7 @@ Here we assume you have created and logged in a `tensorflow-serving`. ```shell -$ gcloud auth login --project tensorflow-serving +gcloud auth login --project tensorflow-serving ``` ### Create a container cluster @@ -191,6 +217,11 @@ for service deployment. ```shell $ gcloud container clusters create inception-serving-cluster --num-nodes 5 +``` + +Which should output something like: + +```console Creating cluster inception-serving-cluster...done. Created [https://container.googleapis.com/v1/projects/tensorflow-serving/zones/us-central1-f/clusters/inception-serving-cluster]. kubeconfig entry generated for inception-serving-cluster. @@ -202,8 +233,13 @@ Set the default cluster for gcloud container command and pass cluster credentials to [kubectl](http://kubernetes.io/docs/user-guide/kubectl-overview/). ```shell -$ gcloud config set container/cluster inception-serving-cluster -$ gcloud container clusters get-credentials inception-serving-cluster +gcloud config set container/cluster inception-serving-cluster +gcloud container clusters get-credentials inception-serving-cluster +``` + +which should result in: + +```console Fetching cluster endpoint and auth data. kubeconfig entry generated for inception-serving-cluster. ``` @@ -218,13 +254,13 @@ First we tag the `$USER/inception_serving` image using the Container Registry format and our project name, ```shell -$ docker tag $USER/inception_serving gcr.io/tensorflow-serving/inception +docker tag $USER/inception_serving gcr.io/tensorflow-serving/inception ``` Next we push the image to the Registry, ```shell -$ gcloud docker -- push gcr.io/tensorflow-serving/inception +gcloud docker -- push gcr.io/tensorflow-serving/inception ``` ### Create Kubernetes Deployment and Service @@ -241,20 +277,25 @@ We create them using the example Kubernetes config [inception_k8s.yaml](https://github.com/tensorflow/serving/tree/master/tensorflow_serving/example/inception_k8s.yaml). ```shell -$ kubectl create -f tensorflow_serving/example/inception_k8s.yaml +kubectl create -f tensorflow_serving/example/inception_k8s.yaml +``` + +With output: + +```console deployment "inception-deployment" created service "inception-service" created ``` To view status of the deployment and pods: -```shell +```console $ kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE inception-deployment 3 3 3 3 5s ``` -```shell +```console $ kubectl get pods NAME READY STATUS RESTARTS AGE inception-deployment-bbcbc 1/1 Running 0 10s @@ -264,32 +305,32 @@ inception-deployment-t1uep 1/1 Running 0 10s To view status of the service: -```shell +```console $ kubectl get services NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE -inception-service 10.239.240.227 104.155.184.157 9000/TCP 1m +inception-service 10.239.240.227 104.155.184.157 8500/TCP 1m ``` It can take a while for everything to be up and running. -```shell +```console $ kubectl describe service inception-service -Name: inception-service -Namespace: default -Labels: run=inception-service -Selector: run=inception-service -Type: LoadBalancer -IP: 10.239.240.227 -LoadBalancer Ingress: 104.155.184.157 -Port: 9000/TCP -NodePort: 30334/TCP -Endpoints: -Session Affinity: None +Name: inception-service +Namespace: default +Labels: run=inception-service +Selector: run=inception-service +Type: LoadBalancer +IP: 10.239.240.227 +LoadBalancer Ingress: 104.155.184.157 +Port: 8500/TCP +NodePort: 30334/TCP +Endpoints: +Session Affinity: None Events: - FirstSeen LastSeen Count From SubobjectPath Type Reason Message - --------- -------- ----- ---- ------------- -------- ------ ------- - 1m 1m 1 {service-controller } Normal CreatingLoadBalancer Creating load balancer - 1m 1m 1 {service-controller } Normal CreatedLoadBalancer Created load balancer + FirstSeen LastSeen Count From SubobjectPath Type Reason Message + --------- -------- ----- ---- ------------- -------- ------ ------- + 1m 1m 1 {service-controller } Normal CreatingLoadBalancer Creating load balancer + 1m 1m 1 {service-controller } Normal CreatedLoadBalancer Created load balancer ``` The service external IP address is listed next to LoadBalancer Ingress. @@ -298,8 +339,10 @@ The service external IP address is listed next to LoadBalancer Ingress. We can now query the service at its external address from our local host. -```shell -$ bazel-bin/tensorflow_serving/example/inception_client --server=104.155.184.157:9000 --image=/path/to/my_cat_image.jpg +```console +$ tools/bazel_in_docker.sh \ + bazel-bin/tensorflow_serving/example/inception_client \ + --server=104.155.184.157:8500 --image=local/path/to/my_cat_image.jpg outputs { key: "classes" value { From 2dd65ff8905ea7a5544f6d0e3b47ed71badbc865 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 13 Aug 2018 17:01:56 -0700 Subject: [PATCH 0625/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208568235 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dda3ef9d431..c8d70c5c520 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "630e35e1846208af99fb8ec82031e153e106895245d3ff13af8552a07d8b0ea7", - git_commit = "e9002c077f14b8048c48e9670879fbe3fb7801e9", + sha256 = "b87abe099f820c450120e1346c95ab34e90947ca1bb171419f7082cf7d0ad225", + git_commit = "8202d1c154d21a42ee7343f2bcab64c909c95c76", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From dff879b7fcacd7fd0ba6a3baac7c88cf832736b6 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Mon, 13 Aug 2018 17:08:01 -0700 Subject: [PATCH 0626/8103] Update setup and serving tutorials PiperOrigin-RevId: 208569082 --- .../example/mnist_saved_model.py | 4 +- tensorflow_serving/g3doc/docker.md | 15 +- tensorflow_serving/g3doc/serving_advanced.md | 88 +++++--- tensorflow_serving/g3doc/serving_basic.md | 124 ++++++----- tensorflow_serving/g3doc/setup.md | 199 +++++++++--------- 5 files changed, 235 insertions(+), 195 deletions(-) diff --git a/tensorflow_serving/example/mnist_saved_model.py b/tensorflow_serving/example/mnist_saved_model.py index a841b54fe58..4397d38ae8f 100644 --- a/tensorflow_serving/example/mnist_saved_model.py +++ b/tensorflow_serving/example/mnist_saved_model.py @@ -127,7 +127,6 @@ def main(_): outputs={'scores': tensor_info_y}, method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME)) - legacy_init_op = tf.group(tf.tables_initializer(), name='legacy_init_op') builder.add_meta_graph_and_variables( sess, [tf.saved_model.tag_constants.SERVING], signature_def_map={ @@ -136,7 +135,8 @@ def main(_): tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: classification_signature, }, - legacy_init_op=legacy_init_op) + main_op=tf.tables_initializer(), + strip_default_attrs=True) builder.save() diff --git a/tensorflow_serving/g3doc/docker.md b/tensorflow_serving/g3doc/docker.md index 6b0bf44b9f5..5d2395a2d27 100644 --- a/tensorflow_serving/g3doc/docker.md +++ b/tensorflow_serving/g3doc/docker.md @@ -272,16 +272,17 @@ TIP: Before attempting to build an image, check the Docker Hub [tensorflow/serving repo](http://hub.docker.com/r/tensorflow/serving/tags/) to make sure an image that meets your needs doesn't already exist. -By default, building TensorFlow Serving from sources consumes a lot of RAM. If -RAM is an issue on your system, you may limit RAM usage by specifying -`--local_resources 2048,.5,1.0` while invoking bazel. You can use this same -mechanism to tweak the optmizations you're building TensorFlow Serving with. For -example: +Building from sources consumes a lot of RAM. If RAM is an issue on your system, +you may limit RAM usage by specifying `--local_resources=2048,.5,1.0` while +invoking Bazel. See the +[Bazel docs](https://docs.bazel.build/versions/master/user-manual.html#flag--local_resources) +for more information. You can use this same mechanism to tweak the optmizations +you're building TensorFlow Serving with. For example: ```shell docker build --pull --build-arg TF_SERVING_BUILD_OPTIONS="--copt=-mavx \ ---cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0 --local_resources 2048,.5,1.0" -t \ -$USER/tensorflow-serving-devel -f Dockerfile.devel . + --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0 --local_resources 2048,.5,1.0" -t \ + $USER/tensorflow-serving-devel -f Dockerfile.devel . ``` ### Running a container diff --git a/tensorflow_serving/g3doc/serving_advanced.md b/tensorflow_serving/g3doc/serving_advanced.md index c76c366d970..b910ab36277 100644 --- a/tensorflow_serving/g3doc/serving_advanced.md +++ b/tensorflow_serving/g3doc/serving_advanced.md @@ -31,32 +31,48 @@ This tutorial steps through the following tasks: 4. Serve request with TensorFlow Serving `ServerCore`. 5. Run and test the service. -Before getting started, please complete the -[prerequisites](setup.md#prerequisites). +Before getting started, first [install Docker](docker.md#installing-docker) Note: All `bazel build` commands below use the standard `-c opt` flag. To -further optimize the build, refer to the [instructions -here](setup.md#optimized). +further optimize the build, refer to the +[instructions here](setup.md#optimized-build). -## Train And Export TensorFlow Model +## Train and export TensorFlow Model + +First, if you haven't done so yet, clone this repository to your local machine: + +```shell +git clone https://github.com/tensorflow/serving.git +cd serving +``` Clear the export directory if it already exists: ```shell -$>rm -rf /tmp/mnist_model +rm -rf ./models +``` + +Build the mnist trainer: + +```shell +tools/bazel_in_docker.sh bazel build -c opt \ + tensorflow_serving/example:mnist_saved_model ``` Train (with 100 iterations) and export the first version of model: ```shell -$>bazel build -c opt //tensorflow_serving/example:mnist_saved_model -$>bazel-bin/tensorflow_serving/example/mnist_saved_model --training_iteration=100 --model_version=1 /tmp/mnist_model +tools/bazel_in_docker.sh \ + bazel-bin/tensorflow_serving/example/mnist_saved_model \ + --training_iteration=100 --model_version=1 models/mnist ``` Train (with 2000 iterations) and export the second version of model: ```shell -$>bazel-bin/tensorflow_serving/example/mnist_saved_model --training_iteration=2000 --model_version=2 /tmp/mnist_model +tools/bazel_in_docker.sh \ + bazel-bin/tensorflow_serving/example/mnist_saved_model \ + --training_iteration=2000 --model_version=2 models/mnist ``` As you can see in `mnist_saved_model.py`, the training and exporting is done the @@ -68,8 +84,8 @@ expect the latter to achieve better classification accuracy due to more intensive training. You should see training data for each training run in your `mnist_model` directory: -```shell -$>ls /tmp/mnist_model +```console +$ ls models/mnist_model 1 2 ``` @@ -259,28 +275,46 @@ To put all these into the context of this tutorial: `PredictRequest` to real tensor names and bind values to tensors. * Runs inference. -## Test and Run The Server +## Test and run the server -Copy the first version of the export to the monitored folder and start the -server. +Copy the first version of the export to the monitored folder: ```shell -$>mkdir /tmp/monitored -$>cp -r /tmp/mnist_model/1 /tmp/monitored -$>bazel build -c opt //tensorflow_serving/model_servers:tensorflow_model_server -$>bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server --enable_batching --port=9000 --model_name=mnist --model_base_path=/tmp/monitored +mkdir models/monitored +cp -r models/mnist/1 models/monitored +``` + +Then start the server: + +```shell +docker run -p 8500:8500 \ + --mount type=bind,source=$(pwd)/models/monitored,target=/models/mnist \ + -t --entrypoint=tensorflow_model_server tensorflow/serving --enable_batching \ + --port=8500 --model_name=mnist --model_base_path=/models/mnist & ``` The server will emit log messages every one second that say "Aspiring version for servable ...", which means it has found the export, and is tracking its continued existence. -Run the test with `--concurrency=10`. This will send concurrent requests to the -server and thus trigger your batching logic. +First let's build the client: + +```shell +tools/bazel_in_docker.sh bazel build -c opt \ + tensorflow_serving/example:mnist_client +``` + +Now run the test with `--concurrency=10`. This will send concurrent requests to +the server and thus trigger your batching logic. ```shell -$>bazel build -c opt //tensorflow_serving/example:mnist_client -$>bazel-bin/tensorflow_serving/example/mnist_client --num_tests=1000 --server=localhost:9000 --concurrency=10 +tools/bazel_in_docker.sh bazel-bin/tensorflow_serving/example/mnist_client \ + --num_tests=1000 --server=127.0.0.1:8500 --concurrency=10 +``` + +Which results in output that looks like: + +```console ... Inference error rate: 13.1% ``` @@ -289,8 +323,14 @@ Then we copy the second version of the export to the monitored folder and re-run the test: ```shell -$>cp -r /tmp/mnist_model/2 /tmp/monitored -$>bazel-bin/tensorflow_serving/example/mnist_client --num_tests=1000 --server=localhost:9000 --concurrency=10 +cp -r models/mnist/2 models/monitored +tools/build_in_docker bazel-bin/tensorflow_serving/example/mnist_client \ + --num_tests=1000 --server=127.0.0.1:8500 --concurrency=10 +``` + +Which results in output that looks like: + +```console ... Inference error rate: 9.5% ``` diff --git a/tensorflow_serving/g3doc/serving_basic.md b/tensorflow_serving/g3doc/serving_basic.md index 9a5458c03dc..5931f809f5c 100644 --- a/tensorflow_serving/g3doc/serving_basic.md +++ b/tensorflow_serving/g3doc/serving_basic.md @@ -18,20 +18,19 @@ The code for this tutorial consists of two parts: [mnist_saved_model.py](https://github.com/tensorflow/serving/tree/master/tensorflow_serving/example/mnist_saved_model.py), that trains and exports the model. -* A ModelServer binary which can be either installed using apt-get, or - compiled from a C++ file +* A ModelServer binary which can be either installed using Apt, or compiled + from a C++ file ([main.cc](https://github.com/tensorflow/serving/tree/master/tensorflow_serving/model_servers/main.cc)). The TensorFlow Serving ModelServer discovers new exported models and runs a [gRPC](http://www.grpc.io) service for serving them. -Before getting started, please complete the -[prerequisites](setup.md#prerequisites). +Before getting started, first [install Docker](docker.md#installing-docker) Note: All `bazel build` commands below use the standard `-c opt` flag. To -further optimize the build, refer to the [instructions -here](setup.md#optimized). +further optimize the build, refer to the +[instructions here](setup.md#optimized-build). -## Train And Export TensorFlow Model +## Train and export TensorFlow model As you can see in `mnist_saved_model.py`, the training is done the same way it is in the @@ -145,50 +144,61 @@ def structure and how to set up them up can be found [here](signature_defs.md). Let's run it! First, if you haven't done so yet, clone this repository to your local machine: + ```shell -$ git clone https://github.com/tensorflow/serving.git -Cloning into 'serving'... -[...] -$ cd serving +git clone https://github.com/tensorflow/serving.git +cd serving ``` Clear the export directory if it already exists: ```shell -$ rm -rf /tmp/mnist_model +rm -rf models/mnist ``` If you would like to install the `tensorflow` and `tensorflow-serving-api` PIP packages, you can run all Python code (export and client) using a simple -`python` command. To install the PIP package, follow the [instructions -here](setup.md#pip). It's also possible to use Bazel to build the necessary -dependencies and run all code without installing those packages. The rest of the -codelab will have instructions for both the Bazel and PIP options. +`python` command. To install the PIP package, follow the +[instructions here](setup.md#tensorflow-serving-python-api-pip-package). It's +also possible to use Bazel to build the necessary dependencies and run all code +without installing those packages. The rest of the codelab will have +instructions for both the Bazel and PIP options. -Bazel: +* **PIP**: -```shell -$ bazel build -c opt //tensorflow_serving/example:mnist_saved_model -$ bazel-bin/tensorflow_serving/example/mnist_saved_model /tmp/mnist_model + ```shell + python tensorflow_serving/example/mnist_saved_model.py models/mnist + ``` + +* **Bazel**: + + ```shell + tools/build_in_docker.sh bazel build -c opt tensorflow_serving/example:mnist_saved_model + tools/build_in_docker.sh bazel-bin/tensorflow_serving/example/mnist_saved_model models/mnist + ``` + + TIP: Building from sources consumes a lot of RAM. If RAM is an issue on your + system, you may limit RAM usage by specifying + `--local_resources=2048,.5,1.0` while invoking Bazel. See the + [Bazel docs](https://docs.bazel.build/versions/master/user-manual.html#flag--local_resources) + for more information. + +This should result in output that looks like: + +```console Training model... ... Done training! -Exporting trained model to /tmp/mnist_model +Exporting trained model to models/mnist Done exporting! ``` -Or if you have `tensorflow-serving-api` installed, you can run: - -```shell -$ python tensorflow_serving/example/mnist_saved_model.py /tmp/mnist_model -``` - Now let's take a look at the export directory. -```shell -$ ls /tmp/mnist_model +```console +$ ls models/mnist 1 ``` @@ -196,8 +206,8 @@ As mentioned above, a sub-directory will be created for exporting each version of the model. `FLAGS.model_version` has the default value of 1, therefore the corresponding sub-directory `1` is created. -```shell -$ ls /tmp/mnist_model/1 +```console +$ ls models/mnist/1 saved_model.pb variables ``` @@ -211,45 +221,45 @@ Each version sub-directory contains the following files: With that, your TensorFlow model is exported and ready to be loaded! -## Load Exported Model With Standard TensorFlow ModelServer - -If you'd like to use a locally compiled ModelServer, run the following: - -```shell -$ bazel build -c opt //tensorflow_serving/model_servers:tensorflow_model_server -$ bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server --port=9000 --model_name=mnist --model_base_path=/tmp/mnist_model/ -``` +## Load exported model with standard TensorFlow ModelServer -If you'd prefer to skip compilation and install using apt-get, follow the -[instructions here](setup.md#aptget). Then run the server with the following -command: +Use a Docker serving image to easily load the model for serving: ```shell -$ tensorflow_model_server --port=9000 --model_name=mnist --model_base_path=/tmp/mnist_model/ +docker run -p 8500:8500 \ +--mount type=bind,source=$(pwd)/models/mnist,target=/models/mnist \ +-e MODEL_NAME=mnist -t tensorflow/serving & ``` -## Test The Server +## Test the server We can use the provided [mnist_client](https://github.com/tensorflow/serving/tree/master/tensorflow_serving/example/mnist_client.py) utility to test the server. The client downloads MNIST test data, sends them as requests to the server, and calculates the inference error rate. -To run it with Bazel: +* **PIP**: -```shell -$ bazel build -c opt //tensorflow_serving/example:mnist_client -$ bazel-bin/tensorflow_serving/example/mnist_client --num_tests=1000 --server=localhost:9000 -... -Inference error rate: 10.5% -``` + ```shell + python tensorflow_serving/example/mnist_client.py --num_tests=1000 --server=127.0.0.1:8500 + ``` -Alternatively if you installed the PIP package, run: +* **Bazel**: -```shell -$ python tensorflow_serving/example/mnist_client.py --num_tests=1000 --server=localhost:9000 + ```shell + tools/bazel_in_docker.sh bazel build -c opt \ + tensorflow_serving/example:mnist_client + tools/bazel_in_docker.sh bazel-bin/tensorflow_serving/example/mnist_client \ + --num_tests=1000 --server=127.0.0.1:8500 + ``` + +This should output something like + +```console + ... + Inference error rate: 11.13% ``` -We expect around 91% accuracy for the trained Softmax model and we get -10.5% inference error rate for the first 1000 test images. This confirms that -the server loads and runs the trained model successfully! +We expect around 90% accuracy for the trained Softmax model and we get 11% +inference error rate for the first 1000 test images. This confirms that the +server loads and runs the trained model successfully! diff --git a/tensorflow_serving/g3doc/setup.md b/tensorflow_serving/g3doc/setup.md index 52633be4123..c3c818b8f64 100644 --- a/tensorflow_serving/g3doc/setup.md +++ b/tensorflow_serving/g3doc/setup.md @@ -1,82 +1,16 @@ # Installation -## Prerequisites +## Installing ModelServer -To compile and use TensorFlow Serving, you need to set up some prerequisites. +### Installing using Docker -### Bazel (only if compiling source code) +The easiest and most straight-forward way of using TensorFlow Serving is via +[Docker images](docker.md). We highly recommend this route unless you have +specific needs that are not addressed by running in a container. -TensorFlow Serving requires Bazel 0.5.4 or higher. You can find the Bazel -installation instructions [here](http://bazel.build/docs/install.html). +### Installing using APT -If you have the prerequisites for Bazel, those instructions consist of the -following steps: - -1. Download the relevant binary from - [here](https://github.com/bazelbuild/bazel/releases). Let's say you - downloaded bazel-0.5.4-installer-linux-x86_64.sh. You would execute: - -
-    cd ~/Downloads
-    chmod +x bazel-0.5.4-installer-linux-x86_64.sh
-    ./bazel-0.5.4-installer-linux-x86_64.sh --user
-    
- -2. Set up your environment. Put this in your ~/.bashrc. - -
-    export PATH="$PATH:$HOME/bin"
-    
- -### gRPC - -Our tutorials use [gRPC](http://www.grpc.io) (1.0.0 or higher) as our RPC -framework. You can find the installation instructions -[here](https://github.com/grpc/grpc/tree/master/src/python/grpcio). - -### Packages - -To install TensorFlow Serving dependencies, execute the following: - -```shell -sudo apt-get update && sudo apt-get install -y \ - automake \ - build-essential \ - curl \ - libcurl3-dev \ - git \ - libtool \ - libfreetype6-dev \ - libpng12-dev \ - libzmq3-dev \ - pkg-config \ - python-dev \ - python-numpy \ - python-pip \ - software-properties-common \ - swig \ - zip \ - zlib1g-dev -``` - -The list of packages needed to build TensorFlow changes over time, so if you -encounter any issues, refer TensorFlow's [build -instructions](https://www.tensorflow.org/install/install_sources). Pay -particular attention to `apt-get install` and `pip install` commands which you -may need to run. - -### TensorFlow Serving Python API PIP package {#pip} - -To run Python client code without the need to install Bazel, you can install the -`tensorflow-serving-api` PIP package using: - -```shell -pip install tensorflow-serving-api -``` - -## Installing using apt-get {#aptget} - -### Available binaries +#### Available binaries The TensorFlow Serving ModelServer binary is available in two variants: @@ -90,67 +24,92 @@ not all machines out there. Use this if `tensorflow-model-server` does not work for you. Note that the binary name is the same for both packages, so if you already installed tensorflow-model-server, you should first uninstall it using + + ```shell -sudo apt-get remove tensorflow-model-server +apt-get remove tensorflow-model-server ``` -### Installing the ModelServer + -1. Add TensorFlow Serving distribution URI as a package source (one time setup) +#### Installation -
-    echo "deb [arch=amd64] http://storage.googleapis.com/tensorflow-serving-apt stable tensorflow-model-server tensorflow-model-server-universal" | sudo tee /etc/apt/sources.list.d/tensorflow-serving.list
+1.  Add TensorFlow Serving distribution URI as a package source (one time setup)
 
+    ```shell
+    echo "deb [arch=amd64] http://storage.googleapis.com/tensorflow-serving-apt stable tensorflow-model-server tensorflow-model-server-universal" | sudo tee /etc/apt/sources.list.d/tensorflow-serving.list && \
     curl https://storage.googleapis.com/tensorflow-serving-apt/tensorflow-serving.release.pub.gpg | sudo apt-key add -
-    
+ ``` 2. Install and update TensorFlow ModelServer -
-    sudo apt-get update && sudo apt-get install tensorflow-model-server
-    
+ -Once installed, the binary can be invoked using the command -`tensorflow_model_server`. + ```shell + apt-get install tensorflow-model-server + ``` + + + + Once installed, the binary can be invoked using the command + `tensorflow_model_server`. You can upgrade to a newer version of tensorflow-model-server with: + + ```shell -sudo apt-get upgrade tensorflow-model-server +apt-get upgrade tensorflow-model-server ``` + + Note: In the above commands, replace tensorflow-model-server with tensorflow-model-server-universal if your processor does not support AVX instructions. -## Installing from source +## Building from source + +The recommended approach to building from source is to use Docker. The +TensorFlow Serving Docker development images encapsulate all the dependencies +you need to build your own version of TensorFlow Serving. + +For a listing of what these dependencies are, see the TensorFlow Serving +Development Dockerfiles +[[CPU](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.devel), +[GPU](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.devel-gpu)]. -### Clone the TensorFlow Serving repository +Note: Currently we only support building binaries that run on Linux. + +#### Installing Docker + +General installation instructions are +[on the Docker site](https://docs.docker.com/install/). + +#### Clone the build script + +After installing Docker, we need to get the source we want to build from. We +will use Git to clone the master branch of TensorFlow Serving: ```shell -git clone https://github.com/tensorflow/serving +git clone https://github.com/tensorflow/serving.git cd serving ``` -Note that these instructions will install the latest master branch of TensorFlow -Serving. If you want to install a specific branch (such as a release branch), -pass `-b ` to the `git clone` command. - -### Install prerequisites - -Follow the Prerequisites section above to install all dependencies. Consult the -[TensorFlow install instructions](https://www.tensorflow.org/install/) if you -encounter any issues with setting up TensorFlow or its dependencies. +#### Build -### Build +In order to build in a hermetic environment with all dependencies taken care of, +we will use the `bazel_in_docker.sh` script. This script passes build commands +through to a Docker container. By default, the script will build with the latest +nightly Docker development image. -TensorFlow Serving uses Bazel to build. Use Bazel commands to build individual -targets or the entire source tree. +TensorFlow Serving uses Bazel as its build tool. You can use Bazel commands to +build individual targets or the entire source tree. To build the entire tree, execute: ```shell -bazel build -c opt tensorflow_serving/... +tools/bazel_in_docker.sh bazel build -c opt tensorflow_serving/... ``` Binaries are placed in the bazel-bin directory, and can be run using a command @@ -160,17 +119,37 @@ like: bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server ``` -To test your installation, execute: +To test your build, execute: ```shell -bazel test -c opt tensorflow_serving/... +tools/bazel_in_docker.sh bazel test -c opt tensorflow_serving/... ``` See the [basic tutorial](serving_basic.md) and [advanced tutorial](serving_advanced.md) for more in-depth examples of running TensorFlow Serving. -### Optimized build {#optimized} +##### Building specific versions of TensorFlow Serving + +If you want to build from a specific branch (such as a release branch), pass `-b +` to the `git clone` command. + +We will also want to match the build environment for that branch of code, by +passing the `bazel_in_docker.sh` script the Docker development image we'd like +to use. + +For example, to build version 1.10 of TensorFlow Serving: + +```console +$ git clone -b r1.10 https://github.com/tensorflow/serving.git +... +$ cd serving +$ tools/bazel_in_docker.sh -d tensorflow/serving:1.10-devel \ + bazel build -c opt tensorflow_serving/... +... +``` + +##### Optimized build It's possible to compile using some platform specific instruction sets (e.g. AVX) that can significantly improve performance. Wherever you see 'bazel build' @@ -180,7 +159,9 @@ in the documentation, you can add the flags `-c opt --copt=-msse4.1 example: ```shell -bazel build -c opt --copt=-msse4.1 --copt=-msse4.2 --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-O3 --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0" tensorflow_serving/... +tools/bazel_in_docker.sh bazel build -c opt --copt=-msse4.1 --copt=-msse4.2 \ + --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-O3 \ + --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0" tensorflow_serving/... ``` Note: These instruction sets are not available on all machines, especially with @@ -188,3 +169,11 @@ older processors, so it may not work with all flags. You can try some subset of them, or revert to just the basic '-c opt' which is guaranteed to work on all machines. +## TensorFlow Serving Python API PIP package + +To run Python client code without the need to build the API, you can install the +`tensorflow-serving-api` PIP package using: + +```shell +pip install tensorflow-serving-api +``` From 20ba4a228de03da7d8fff0ed53d4147ea0cab501 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 13 Aug 2018 18:03:13 -0700 Subject: [PATCH 0627/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208575742 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c8d70c5c520..2ac470c6139 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b87abe099f820c450120e1346c95ab34e90947ca1bb171419f7082cf7d0ad225", - git_commit = "8202d1c154d21a42ee7343f2bcab64c909c95c76", + sha256 = "bc21c41b9de1c1ac000e524fca5bb615a46dcf6160096066ae8b892ed82c5906", + git_commit = "f77a5d0df0023b1c72e6fad453fbda2770e10b3d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f9f9eca4dc718ac41768e4f6a4eb6d1178028a91 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 13 Aug 2018 19:01:12 -0700 Subject: [PATCH 0628/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208581068 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2ac470c6139..7b4ba192563 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bc21c41b9de1c1ac000e524fca5bb615a46dcf6160096066ae8b892ed82c5906", - git_commit = "f77a5d0df0023b1c72e6fad453fbda2770e10b3d", + sha256 = "edc08a7de8af0fa577d28d4be473ee15289bf76566d7269e9520a6510ae12333", + git_commit = "ab755c94beffc0531ca24b157858b3a10d10f397", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2be87899b4586b3c7b6c1f262f7cd76492617caa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 13 Aug 2018 20:01:09 -0700 Subject: [PATCH 0629/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208585496 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7b4ba192563..a3fe53ed8b2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "edc08a7de8af0fa577d28d4be473ee15289bf76566d7269e9520a6510ae12333", - git_commit = "ab755c94beffc0531ca24b157858b3a10d10f397", + sha256 = "8144de95a88a228740d9a73bcf084c7a0e33e9e0a132f8572e1b9b77fef3eeb5", + git_commit = "5326a7fb028d6a66286e9e929dc9454c12e81522", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e490fdf91ba7189c91022bfdc2ad20fa61af1224 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 13 Aug 2018 23:01:17 -0700 Subject: [PATCH 0630/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208598033 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a3fe53ed8b2..221812cf632 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8144de95a88a228740d9a73bcf084c7a0e33e9e0a132f8572e1b9b77fef3eeb5", - git_commit = "5326a7fb028d6a66286e9e929dc9454c12e81522", + sha256 = "c4d26819a12cbb47ed219d86222f4f325a464120c87dba80fdc6595c0b68f8ad", + git_commit = "e447ae4759317156d31a9421290716f0ffbffcd8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From dba6f4f251ecfe0d23841d0075f92d242c9f744a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 14 Aug 2018 01:02:22 -0700 Subject: [PATCH 0631/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208607030 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 221812cf632..6a4ddf07402 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c4d26819a12cbb47ed219d86222f4f325a464120c87dba80fdc6595c0b68f8ad", - git_commit = "e447ae4759317156d31a9421290716f0ffbffcd8", + sha256 = "7319d4f521a8d6933a5f26faf66ab09706e7cd91b219d93e333de767281314be", + git_commit = "cb53bfaf48588962f5799391d3a7a411dda72b49", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From caa381b8c2a2d592321958b02a2cb9a18b8cafd2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 14 Aug 2018 04:03:44 -0700 Subject: [PATCH 0632/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208624738 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6a4ddf07402..ac4879a9cae 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7319d4f521a8d6933a5f26faf66ab09706e7cd91b219d93e333de767281314be", - git_commit = "cb53bfaf48588962f5799391d3a7a411dda72b49", + sha256 = "1b51915db86c95ef44a47e55875c942e4e6c74bed3f78cef48d6d80961f875f1", + git_commit = "9b05ad3798e011202c8a0f094a6507855a0a9f2d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 179fc3dc1fcaccb2b41ecfeb43351e134f826248 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 14 Aug 2018 09:02:16 -0700 Subject: [PATCH 0633/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208655037 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ac4879a9cae..b922992bc02 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1b51915db86c95ef44a47e55875c942e4e6c74bed3f78cef48d6d80961f875f1", - git_commit = "9b05ad3798e011202c8a0f094a6507855a0a9f2d", + sha256 = "29968ffa4c0a727f3ebd6d1f5dc0abd15c85ad20c39631820a451f8078209fef", + git_commit = "62db4ac8780f37db2a9c5d18faa755e58e6a0403", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e76667f2b7b04a16a7ed2139896306bd54b20ded Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 14 Aug 2018 10:05:43 -0700 Subject: [PATCH 0634/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208665063 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b922992bc02..19e5b43e891 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "29968ffa4c0a727f3ebd6d1f5dc0abd15c85ad20c39631820a451f8078209fef", - git_commit = "62db4ac8780f37db2a9c5d18faa755e58e6a0403", + sha256 = "fcc834349449314377ec2830c23a3ecd3b9343a11f79a44e5e3c68b6a14aeb40", + git_commit = "01267485b63d440eb9f3b4061d8e8ceaad5bca79", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 30a958ae7bfcc8f01508ae0583ec02f9b711ec2b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 14 Aug 2018 11:01:30 -0700 Subject: [PATCH 0635/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208676066 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 19e5b43e891..55bc20924a2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fcc834349449314377ec2830c23a3ecd3b9343a11f79a44e5e3c68b6a14aeb40", - git_commit = "01267485b63d440eb9f3b4061d8e8ceaad5bca79", + sha256 = "f7fda27a6292ae806b03a50706265c124f12c1465753abf5fcc972e66b6ff934", + git_commit = "1eb7db417a39b846d7679346e6a5b219224156ad", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 22d930ccd234f589c572cc0b962c5cc1ee1d60f2 Mon Sep 17 00:00:00 2001 From: saeta Date: Tue, 14 Aug 2018 11:09:24 -0700 Subject: [PATCH 0636/8103] Internal-only change. PiperOrigin-RevId: 208677792 --- tensorflow_serving/model_servers/BUILD | 26 +++- tensorflow_serving/model_servers/main.cc | 125 +----------------- .../model_servers/prediction_service_impl.cc | 117 ++++++++++++++++ .../model_servers/prediction_service_impl.h | 62 +++++++++ 4 files changed, 205 insertions(+), 125 deletions(-) create mode 100644 tensorflow_serving/model_servers/prediction_service_impl.cc create mode 100644 tensorflow_serving/model_servers/prediction_service_impl.h diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index d67e8ed1429..aa9cdabb19f 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -201,6 +201,27 @@ cc_library( ], ) +cc_library( + name = "prediction_service_impl", + srcs = ["prediction_service_impl.cc"], + hdrs = ["prediction_service_impl.h"], + visibility = [ + "//visibility:public", + ], + deps = [ + ":grpc_status_util", + ":server_core", + "//tensorflow_serving/apis:prediction_service_proto", + "//tensorflow_serving/servables/tensorflow:classification_service", + "//tensorflow_serving/servables/tensorflow:get_model_metadata_impl", + "//tensorflow_serving/servables/tensorflow:multi_inference_helper", + "//tensorflow_serving/servables/tensorflow:predict_impl", + "//tensorflow_serving/servables/tensorflow:regression_service", + "//tensorflow_serving/util:status_util", + "@grpc//:grpc++", + ], +) + cc_library( name = "grpc_status_util", srcs = ["grpc_status_util.cc"], @@ -287,10 +308,12 @@ cc_library( ":http_server", ":model_platform_types", ":platform_config_util", + ":prediction_service_impl", ":server_core", ":grpc_status_util", ":model_service_impl", "@protobuf_archive//:cc_wkt_protos", + "@grpc//:grpc++", "@org_tensorflow//tensorflow/c:c_api", "@org_tensorflow//tensorflow/cc/saved_model:tag_constants", "@org_tensorflow//tensorflow/core:lib", @@ -298,12 +321,9 @@ cc_library( "@org_tensorflow//tensorflow/core/platform/hadoop:hadoop_file_system", "@org_tensorflow//tensorflow/core/platform/s3:s3_file_system", "@org_tensorflow//tensorflow/core:protos_all_cc", - "//tensorflow_serving/apis:prediction_service_proto", "//tensorflow_serving/config:model_server_config_proto", "//tensorflow_serving/config:ssl_config_proto", "//tensorflow_serving/core:availability_preserving_policy", - "//tensorflow_serving/servables/tensorflow:multi_inference_helper", - "@grpc//:grpc++", "//tensorflow_serving/servables/tensorflow:session_bundle_config_proto", ] + TENSORFLOW_DEPS + SUPPORTED_TENSORFLOW_OPS, ) diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index ef879ad8805..f679f29199b 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -67,8 +67,6 @@ limitations under the License. #include "tensorflow/core/platform/types.h" #include "tensorflow/core/protobuf/config.pb.h" #include "tensorflow/core/util/command_line_flags.h" -#include "tensorflow_serving/apis/prediction_service.grpc.pb.h" -#include "tensorflow_serving/apis/prediction_service.pb.h" #include "tensorflow_serving/config/model_server_config.pb.h" #include "tensorflow_serving/config/ssl_config.pb.h" #include "tensorflow_serving/core/availability_preserving_policy.h" @@ -77,13 +75,9 @@ limitations under the License. #include "tensorflow_serving/model_servers/model_platform_types.h" #include "tensorflow_serving/model_servers/model_service_impl.h" #include "tensorflow_serving/model_servers/platform_config_util.h" +#include "tensorflow_serving/model_servers/prediction_service_impl.h" #include "tensorflow_serving/model_servers/server_core.h" #include "tensorflow_serving/model_servers/version.h" -#include "tensorflow_serving/servables/tensorflow/classification_service.h" -#include "tensorflow_serving/servables/tensorflow/get_model_metadata_impl.h" -#include "tensorflow_serving/servables/tensorflow/multi_inference_helper.h" -#include "tensorflow_serving/servables/tensorflow/predict_impl.h" -#include "tensorflow_serving/servables/tensorflow/regression_service.h" #include "tensorflow_serving/servables/tensorflow/session_bundle_config.pb.h" namespace grpc { @@ -96,33 +90,16 @@ using tensorflow::serving::AspiredVersionsManager; using tensorflow::serving::AvailabilityPreservingPolicy; using tensorflow::serving::BatchingParameters; using tensorflow::serving::EventBus; -using tensorflow::serving::FileSystemStoragePathSourceConfig; -using tensorflow::serving::GetModelMetadataImpl; using tensorflow::serving::ModelServerConfig; using tensorflow::serving::ServableState; using tensorflow::serving::ServerCore; using tensorflow::serving::SessionBundleConfig; using tensorflow::serving::SSLConfig; -using tensorflow::serving::TensorflowClassificationServiceImpl; -using tensorflow::serving::TensorflowPredictor; -using tensorflow::serving::TensorflowRegressionServiceImpl; using tensorflow::serving::UniquePtrWithDeps; using grpc::InsecureServerCredentials; using grpc::Server; using grpc::ServerBuilder; -using grpc::ServerContext; -using tensorflow::serving::ClassificationRequest; -using tensorflow::serving::ClassificationResponse; -using tensorflow::serving::GetModelMetadataRequest; -using tensorflow::serving::GetModelMetadataResponse; -using tensorflow::serving::MultiInferenceRequest; -using tensorflow::serving::MultiInferenceResponse; -using tensorflow::serving::PredictRequest; -using tensorflow::serving::PredictResponse; -using tensorflow::serving::RegressionRequest; -using tensorflow::serving::RegressionResponse; -using tensorflow::serving::PredictionService; namespace { @@ -173,103 +150,6 @@ ProtoType ReadProtoFromFile(const string& file) { return proto; } -int DeadlineToTimeoutMillis(const gpr_timespec deadline) { - return gpr_time_to_millis( - gpr_time_sub(gpr_convert_clock_type(deadline, GPR_CLOCK_MONOTONIC), - gpr_now(GPR_CLOCK_MONOTONIC))); -} - -class PredictionServiceImpl final : public PredictionService::Service { - public: - explicit PredictionServiceImpl(ServerCore* core, bool use_saved_model) - : core_(core), - predictor_(new TensorflowPredictor(use_saved_model)), - use_saved_model_(use_saved_model) {} - - grpc::Status Predict(ServerContext* context, const PredictRequest* request, - PredictResponse* response) override { - tensorflow::RunOptions run_options = tensorflow::RunOptions(); - // By default, this is infinite which is the same default as RunOptions. - run_options.set_timeout_in_ms( - DeadlineToTimeoutMillis(context->raw_deadline())); - const grpc::Status status = tensorflow::serving::ToGRPCStatus( - predictor_->Predict(run_options, core_, *request, response)); - if (!status.ok()) { - VLOG(1) << "Predict failed: " << status.error_message(); - } - return status; - } - - grpc::Status GetModelMetadata(ServerContext* context, - const GetModelMetadataRequest* request, - GetModelMetadataResponse* response) override { - if (!use_saved_model_) { - return tensorflow::serving::ToGRPCStatus( - tensorflow::errors::InvalidArgument( - "GetModelMetadata API is only available when use_saved_model is " - "set to true")); - } - const grpc::Status status = tensorflow::serving::ToGRPCStatus( - GetModelMetadataImpl::GetModelMetadata(core_, *request, response)); - if (!status.ok()) { - VLOG(1) << "GetModelMetadata failed: " << status.error_message(); - } - return status; - } - - grpc::Status Classify(ServerContext* context, - const ClassificationRequest* request, - ClassificationResponse* response) override { - tensorflow::RunOptions run_options = tensorflow::RunOptions(); - // By default, this is infinite which is the same default as RunOptions. - run_options.set_timeout_in_ms( - DeadlineToTimeoutMillis(context->raw_deadline())); - const grpc::Status status = tensorflow::serving::ToGRPCStatus( - TensorflowClassificationServiceImpl::Classify(run_options, core_, - *request, response)); - if (!status.ok()) { - VLOG(1) << "Classify request failed: " << status.error_message(); - } - return status; - } - - grpc::Status Regress(ServerContext* context, const RegressionRequest* request, - RegressionResponse* response) override { - tensorflow::RunOptions run_options = tensorflow::RunOptions(); - // By default, this is infinite which is the same default as RunOptions. - run_options.set_timeout_in_ms( - DeadlineToTimeoutMillis(context->raw_deadline())); - const grpc::Status status = tensorflow::serving::ToGRPCStatus( - TensorflowRegressionServiceImpl::Regress(run_options, core_, *request, - response)); - if (!status.ok()) { - VLOG(1) << "Regress request failed: " << status.error_message(); - } - return status; - } - - grpc::Status MultiInference(ServerContext* context, - const MultiInferenceRequest* request, - MultiInferenceResponse* response) override { - tensorflow::RunOptions run_options = tensorflow::RunOptions(); - // By default, this is infinite which is the same default as RunOptions. - run_options.set_timeout_in_ms( - DeadlineToTimeoutMillis(context->raw_deadline())); - const grpc::Status status = - tensorflow::serving::ToGRPCStatus(RunMultiInferenceWithServerCore( - run_options, core_, *request, response)); - if (!status.ok()) { - VLOG(1) << "MultiInference request failed: " << status.error_message(); - } - return status; - } - - private: - ServerCore* core_; - std::unique_ptr predictor_; - bool use_saved_model_; -}; - // gRPC Channel Arguments to be passed from command line to gRPC ServerBuilder. struct GrpcChannelArgument { string key; @@ -304,7 +184,8 @@ void RunServer(int port, std::unique_ptr core, bool use_saved_model, // "0.0.0.0" is the way to listen on localhost in gRPC. const string server_address = "0.0.0.0:" + std::to_string(port); tensorflow::serving::ModelServiceImpl model_service(core.get()); - PredictionServiceImpl prediction_service(core.get(), use_saved_model); + tensorflow::serving::PredictionServiceImpl prediction_service( + core.get(), use_saved_model); ServerBuilder builder; builder.AddListeningPort(server_address, creds); builder.RegisterService(&model_service); diff --git a/tensorflow_serving/model_servers/prediction_service_impl.cc b/tensorflow_serving/model_servers/prediction_service_impl.cc new file mode 100644 index 00000000000..b347d39eb9b --- /dev/null +++ b/tensorflow_serving/model_servers/prediction_service_impl.cc @@ -0,0 +1,117 @@ +/* Copyright 2018 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow_serving/model_servers/prediction_service_impl.h" +#include "grpc/grpc.h" +#include "tensorflow_serving/model_servers/grpc_status_util.h" +#include "tensorflow_serving/servables/tensorflow/classification_service.h" +#include "tensorflow_serving/servables/tensorflow/get_model_metadata_impl.h" +#include "tensorflow_serving/servables/tensorflow/multi_inference_helper.h" +#include "tensorflow_serving/servables/tensorflow/regression_service.h" + +namespace tensorflow { +namespace serving { + +namespace { + +int DeadlineToTimeoutMillis(const gpr_timespec deadline) { + return gpr_time_to_millis( + gpr_time_sub(gpr_convert_clock_type(deadline, GPR_CLOCK_MONOTONIC), + gpr_now(GPR_CLOCK_MONOTONIC))); +} + +} // namespace + +::grpc::Status PredictionServiceImpl::Predict(::grpc::ServerContext *context, + const PredictRequest *request, + PredictResponse *response) { + tensorflow::RunOptions run_options = tensorflow::RunOptions(); + run_options.set_timeout_in_ms( + DeadlineToTimeoutMillis(context->raw_deadline())); + + const ::grpc::Status status = + ToGRPCStatus(predictor_->Predict(run_options, core_, *request, response)); + + if (!status.ok()) { + VLOG(1) << "Predict failed: " << status.error_message(); + } + return status; +} + +::grpc::Status PredictionServiceImpl::GetModelMetadata( + ::grpc::ServerContext *context, const GetModelMetadataRequest *request, + GetModelMetadataResponse *response) { + if (!use_saved_model_) { + return ToGRPCStatus( + errors::InvalidArgument("GetModelMetadata API is only available when " + "use_saved_model is set to true")); + } + const ::grpc::Status status = ToGRPCStatus( + GetModelMetadataImpl::GetModelMetadata(core_, *request, response)); + if (!status.ok()) { + VLOG(1) << "GetModelMetadata failed: " << status.error_message(); + } + return status; +} + +::grpc::Status PredictionServiceImpl::Classify( + ::grpc::ServerContext *context, const ClassificationRequest *request, + ClassificationResponse *response) { + tensorflow::RunOptions run_options = tensorflow::RunOptions(); + // By default, this is infinite which is the same default as RunOptions. + run_options.set_timeout_in_ms( + DeadlineToTimeoutMillis(context->raw_deadline())); + const ::grpc::Status status = + ToGRPCStatus(TensorflowClassificationServiceImpl::Classify( + run_options, core_, *request, response)); + if (!status.ok()) { + VLOG(1) << "Classify request failed: " << status.error_message(); + } + return status; +} + +::grpc::Status PredictionServiceImpl::Regress(::grpc::ServerContext *context, + const RegressionRequest *request, + RegressionResponse *response) { + tensorflow::RunOptions run_options = tensorflow::RunOptions(); + // By default, this is infinite which is the same default as RunOptions. + run_options.set_timeout_in_ms( + DeadlineToTimeoutMillis(context->raw_deadline())); + const ::grpc::Status status = + ToGRPCStatus(TensorflowRegressionServiceImpl::Regress( + run_options, core_, *request, response)); + if (!status.ok()) { + VLOG(1) << "Regress request failed: " << status.error_message(); + } + return status; +} + +::grpc::Status PredictionServiceImpl::MultiInference( + ::grpc::ServerContext *context, const MultiInferenceRequest *request, + MultiInferenceResponse *response) { + tensorflow::RunOptions run_options = tensorflow::RunOptions(); + // By default, this is infinite which is the same default as RunOptions. + run_options.set_timeout_in_ms( + DeadlineToTimeoutMillis(context->raw_deadline())); + const ::grpc::Status status = ToGRPCStatus( + RunMultiInferenceWithServerCore(run_options, core_, *request, response)); + if (!status.ok()) { + VLOG(1) << "MultiInference request failed: " << status.error_message(); + } + return status; +} + +} // namespace serving +} // namespace tensorflow diff --git a/tensorflow_serving/model_servers/prediction_service_impl.h b/tensorflow_serving/model_servers/prediction_service_impl.h new file mode 100644 index 00000000000..e23436df41c --- /dev/null +++ b/tensorflow_serving/model_servers/prediction_service_impl.h @@ -0,0 +1,62 @@ +/* Copyright 2018 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_SERVING_MODEL_SERVERS_PREDICTION_SERVICE_IMPL_H_ +#define TENSORFLOW_SERVING_MODEL_SERVERS_PREDICTION_SERVICE_IMPL_H_ + +#include "tensorflow_serving/apis/prediction_service.grpc.pb.h" +#include "tensorflow_serving/model_servers/server_core.h" +#include "tensorflow_serving/servables/tensorflow/predict_impl.h" + +namespace tensorflow { +namespace serving { + +class PredictionServiceImpl final : public PredictionService::Service { + public: + explicit PredictionServiceImpl(ServerCore* core, bool use_saved_model) + : core_(core), + predictor_(new TensorflowPredictor(use_saved_model)), + use_saved_model_(use_saved_model) {} + + ::grpc::Status Predict(::grpc::ServerContext* context, + const PredictRequest* request, + PredictResponse* response) override; + + ::grpc::Status GetModelMetadata(::grpc::ServerContext* context, + const GetModelMetadataRequest* request, + GetModelMetadataResponse* response) override; + + ::grpc::Status Classify(::grpc::ServerContext* context, + const ClassificationRequest* request, + ClassificationResponse* response) override; + + ::grpc::Status Regress(::grpc::ServerContext* context, + const RegressionRequest* request, + RegressionResponse* response) override; + + ::grpc::Status MultiInference(::grpc::ServerContext* context, + const MultiInferenceRequest* request, + MultiInferenceResponse* response) override; + + private: + ServerCore* core_; + std::unique_ptr predictor_; + const bool use_saved_model_; +}; + +} // namespace serving +} // namespace tensorflow + +#endif // TENSORFLOW_SERVING_MODEL_SERVERS_PREDICTION_SERVICE_IMPL_H_ From 30d313b48a8011ecd1a07d08ea66b7ca0dc0daec Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 14 Aug 2018 12:02:19 -0700 Subject: [PATCH 0637/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208687551 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 55bc20924a2..d6da2b75729 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f7fda27a6292ae806b03a50706265c124f12c1465753abf5fcc972e66b6ff934", - git_commit = "1eb7db417a39b846d7679346e6a5b219224156ad", + sha256 = "4f51f8474d5242635e7f460d624e4f18d055ff3b0fe83c95b585bf76c335dfbd", + git_commit = "f397a0f3d02c6a01c5c21991eb153c82847c1ce5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7a3e36cd98e8f4e5554fb276c688f418e9e38b44 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 14 Aug 2018 13:02:54 -0700 Subject: [PATCH 0638/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208697426 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d6da2b75729..d3226698a2f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4f51f8474d5242635e7f460d624e4f18d055ff3b0fe83c95b585bf76c335dfbd", - git_commit = "f397a0f3d02c6a01c5c21991eb153c82847c1ce5", + sha256 = "90ef0d0fe64cbd7c471fc45cd799ef6672c226168d288292cfdcc26676701891", + git_commit = "425b62a344f18c875f6f024b36ae37749cb00feb", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2a3f866d21a2883b4a25fb7153b9847bcc9c39ef Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 14 Aug 2018 14:01:57 -0700 Subject: [PATCH 0639/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208708489 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d3226698a2f..30f1506b913 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "90ef0d0fe64cbd7c471fc45cd799ef6672c226168d288292cfdcc26676701891", - git_commit = "425b62a344f18c875f6f024b36ae37749cb00feb", + sha256 = "0b981bc99b7279efda9385fd1fe29297d9e7be01a091f9c1d450c8333c671076", + git_commit = "a1df092d60e2c2e6fa0e2de668224b536892c244", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fc8c5301125903a3e2ddc8b743f78f0d539bf61b Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Tue, 14 Aug 2018 14:53:44 -0700 Subject: [PATCH 0640/8103] Keep pypi package from overwriting TF package PiperOrigin-RevId: 208718607 --- tensorflow_serving/tools/pip_package/build_pip_package.sh | 8 -------- tensorflow_serving/tools/pip_package/setup.py | 2 +- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/tensorflow_serving/tools/pip_package/build_pip_package.sh b/tensorflow_serving/tools/pip_package/build_pip_package.sh index 2833fc64613..2fba7336489 100755 --- a/tensorflow_serving/tools/pip_package/build_pip_package.sh +++ b/tensorflow_serving/tools/pip_package/build_pip_package.sh @@ -37,7 +37,6 @@ function main() { mkdir -p ${TMPDIR}/tensorflow_serving/config mkdir -p ${TMPDIR}/tensorflow_serving/sources/storage_path mkdir -p ${TMPDIR}/tensorflow_serving/util - mkdir -p ${TMPDIR}/tensorflow/core/lib/core echo "Adding python files" cp bazel-genfiles/tensorflow_serving/apis/*_pb2.py \ @@ -58,19 +57,12 @@ function main() { cp bazel-genfiles/tensorflow_serving/util/*_pb2.py \ "${TMPDIR}/tensorflow_serving/util" - cp bazel-genfiles/external/org_tensorflow/tensorflow/core/lib/core/*.py \ - "${TMPDIR}/tensorflow/core/lib/core" - touch "${TMPDIR}/tensorflow_serving/apis/__init__.py" touch "${TMPDIR}/tensorflow_serving/config/__init__.py" touch "${TMPDIR}/tensorflow_serving/sources/__init__.py" touch "${TMPDIR}/tensorflow_serving/sources/storage_path/__init__.py" touch "${TMPDIR}/tensorflow_serving/util/__init__.py" touch "${TMPDIR}/tensorflow_serving/__init__.py" - touch "${TMPDIR}/tensorflow/__init__.py" - touch "${TMPDIR}/tensorflow/core/__init__.py" - touch "${TMPDIR}/tensorflow/core/lib/__init__.py" - touch "${TMPDIR}/tensorflow/core/lib/core/__init__.py" echo "Adding package setup files" cp ${PIP_SRC_DIR}/setup.py "${TMPDIR}" diff --git a/tensorflow_serving/tools/pip_package/setup.py b/tensorflow_serving/tools/pip_package/setup.py index 051ea45bdcc..f68d4fed340 100644 --- a/tensorflow_serving/tools/pip_package/setup.py +++ b/tensorflow_serving/tools/pip_package/setup.py @@ -34,7 +34,7 @@ REQUIRED_PACKAGES = [ 'tensorflow>=1.2.0,<2', 'grpcio>=1.0<2', - 'protobuf==3.6.0', + 'protobuf>=3.6.0', ] setup( From 5ab680f972d9f2d31c59967019f12130ff7c49d2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 14 Aug 2018 15:04:20 -0700 Subject: [PATCH 0641/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208720660 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 30f1506b913..49afc0616ca 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0b981bc99b7279efda9385fd1fe29297d9e7be01a091f9c1d450c8333c671076", - git_commit = "a1df092d60e2c2e6fa0e2de668224b536892c244", + sha256 = "e1184a43681709e361d45a35a3872868f1c76923783663f8aac3cd76ad8dd817", + git_commit = "af827be63a9d8aff06a438ac9769a6ff6870c60d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5882db73e2e7f48d5faf162e5f1653362dd7ff70 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 14 Aug 2018 16:00:41 -0700 Subject: [PATCH 0642/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208730843 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 49afc0616ca..536a1eb55e9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e1184a43681709e361d45a35a3872868f1c76923783663f8aac3cd76ad8dd817", - git_commit = "af827be63a9d8aff06a438ac9769a6ff6870c60d", + sha256 = "54de46d7fe4bc038b86c90cc69a01424bb29b8e2da426a8f2177e521d1ae0d4c", + git_commit = "f8c946ceb9fcacd93c2640c65b1a5b74a38002f8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From cb3165767a7898f44ee5ff18605801b7d0ec4cbe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 14 Aug 2018 17:03:04 -0700 Subject: [PATCH 0643/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208741053 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 536a1eb55e9..115075c4ffd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "54de46d7fe4bc038b86c90cc69a01424bb29b8e2da426a8f2177e521d1ae0d4c", - git_commit = "f8c946ceb9fcacd93c2640c65b1a5b74a38002f8", + sha256 = "3268be3688ac8052c80326264b3b630140cfc07ffa1447e0d92db5a792982cd1", + git_commit = "513b1441b406572bf6435a3af28803d8c00217ec", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1d3d822d81a53ed5ec834808f4f0b519263cb657 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 14 Aug 2018 18:03:01 -0700 Subject: [PATCH 0644/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208749216 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 115075c4ffd..f193dd9b8bf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3268be3688ac8052c80326264b3b630140cfc07ffa1447e0d92db5a792982cd1", - git_commit = "513b1441b406572bf6435a3af28803d8c00217ec", + sha256 = "70e880bf519bc0383a17715132fd59473fb9ce84b601cc0ff4db9b975db569ed", + git_commit = "1200245073e531c11f56bdf6581dc9e8df8e0597", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4f70186fa3927b09704ec7a6748621cad8d6ba92 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 14 Aug 2018 19:05:01 -0700 Subject: [PATCH 0645/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208755732 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f193dd9b8bf..5226e1a8375 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "70e880bf519bc0383a17715132fd59473fb9ce84b601cc0ff4db9b975db569ed", - git_commit = "1200245073e531c11f56bdf6581dc9e8df8e0597", + sha256 = "4682ff5aa2494903faba23e49d40c00342edb060c1385c1ad805edc031190b1b", + git_commit = "63a49c712edd3b2ee990a9f98b766b24190d3ccb", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 10bb649af1f1b9e96ca33cbbec6e731aadbc886e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 14 Aug 2018 20:00:57 -0700 Subject: [PATCH 0646/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208759577 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5226e1a8375..9f5cc8b3936 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4682ff5aa2494903faba23e49d40c00342edb060c1385c1ad805edc031190b1b", - git_commit = "63a49c712edd3b2ee990a9f98b766b24190d3ccb", + sha256 = "12938771bd513a7d5d3d8f38f7b1a172e17d0f12b9e6ff5438587b7620fb6ea1", + git_commit = "94ba1c4f0eccd234b4e0e5b504ddf1803067f1bc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From dd01360e49048fadf172f6c2edd87039b4b88241 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 14 Aug 2018 21:02:45 -0700 Subject: [PATCH 0647/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208764383 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9f5cc8b3936..ac69f1d80ca 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "12938771bd513a7d5d3d8f38f7b1a172e17d0f12b9e6ff5438587b7620fb6ea1", - git_commit = "94ba1c4f0eccd234b4e0e5b504ddf1803067f1bc", + sha256 = "dd641350fec19730554ef93ef49b1cd772b5a4f693926ee3d5e412f57c3ab38e", + git_commit = "c2399dbe405eb8cbdbe0451336f46c6085d9a3c5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From bcbe2ca921206ec0907e265706e13b2be3e6e296 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 14 Aug 2018 22:00:45 -0700 Subject: [PATCH 0648/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208768511 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ac69f1d80ca..65a727a83af 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dd641350fec19730554ef93ef49b1cd772b5a4f693926ee3d5e412f57c3ab38e", - git_commit = "c2399dbe405eb8cbdbe0451336f46c6085d9a3c5", + sha256 = "58ae7143f23fe3e0acea623d48bdc47579804c7b8a199f00e7fed7c7b38ea5a4", + git_commit = "d955bd55bb6138e908fe047152a1e1ac3f278aa9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a8cea24d47c124c3e5883205f195913ca297682d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 14 Aug 2018 23:00:55 -0700 Subject: [PATCH 0649/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208772503 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 65a727a83af..3ecbf9f8417 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "58ae7143f23fe3e0acea623d48bdc47579804c7b8a199f00e7fed7c7b38ea5a4", - git_commit = "d955bd55bb6138e908fe047152a1e1ac3f278aa9", + sha256 = "fffdfd26ce20e1513ac4e3b43c021f7b45f79728602e82f45b276396fe1029aa", + git_commit = "d4b8e21ef9ac66d5871f37303218f47e40a1a02c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From af7f70b09eb8d7b0df1eeee4f02dd678d33b53f3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 15 Aug 2018 00:04:10 -0700 Subject: [PATCH 0650/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208776904 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3ecbf9f8417..63f40d62e27 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fffdfd26ce20e1513ac4e3b43c021f7b45f79728602e82f45b276396fe1029aa", - git_commit = "d4b8e21ef9ac66d5871f37303218f47e40a1a02c", + sha256 = "f14c426ade8997a0a6a2e0c300fd061b4fd045b9afddc7fc9608a120b050e594", + git_commit = "d623bc479174079134fc5341ca99b2491d0afce7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From eb5eb897e1f74f0e2fdc44a263f0525145ac140a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 15 Aug 2018 01:00:53 -0700 Subject: [PATCH 0651/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208781448 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 63f40d62e27..707b0a70405 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f14c426ade8997a0a6a2e0c300fd061b4fd045b9afddc7fc9608a120b050e594", - git_commit = "d623bc479174079134fc5341ca99b2491d0afce7", + sha256 = "e32ae702bb38c28133595ccc0cdfd89eb1ec81556e6c3b072ecbcbd75f84d3d7", + git_commit = "1695fed253042122df6d678671f050745b78b09c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c5202bc9133b30a1627bf92b3cc62fc3f53b9269 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 15 Aug 2018 03:03:00 -0700 Subject: [PATCH 0652/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208794025 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 707b0a70405..022b04e0514 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e32ae702bb38c28133595ccc0cdfd89eb1ec81556e6c3b072ecbcbd75f84d3d7", - git_commit = "1695fed253042122df6d678671f050745b78b09c", + sha256 = "f30a565f475827f3d409c7a0b4c0813010fd274d9de8c2871c687d23677b1661", + git_commit = "690c4e577921fbd9574da601b53c1f11b828621d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c5e1fd95be700ccd65e5b9f42c290e3804e4d365 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 15 Aug 2018 04:02:19 -0700 Subject: [PATCH 0653/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208798630 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 022b04e0514..a7b20bf8ea9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f30a565f475827f3d409c7a0b4c0813010fd274d9de8c2871c687d23677b1661", - git_commit = "690c4e577921fbd9574da601b53c1f11b828621d", + sha256 = "c008abd20acd39bf6a93c36d42a3f457fbfe4d5c2e799a3d598ff332e2fd4dee", + git_commit = "3437fba39d5bca77fd7627aad15ba76fb75f5731", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fb5c951bd5b75ac9bdaa96058cf287454773b086 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 15 Aug 2018 06:02:13 -0700 Subject: [PATCH 0654/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208807429 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a7b20bf8ea9..76425a6a4f0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c008abd20acd39bf6a93c36d42a3f457fbfe4d5c2e799a3d598ff332e2fd4dee", - git_commit = "3437fba39d5bca77fd7627aad15ba76fb75f5731", + sha256 = "d9660996a6a2d3a1e628d9af45218cf7d04da58edc34f11cfa98772aab57d72f", + git_commit = "bf23e5f0f6e75a35521b7765da9863dbc24d8a71", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a2e6608d2d179401608f159f02423f8838f9f932 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 15 Aug 2018 12:02:29 -0700 Subject: [PATCH 0655/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208859330 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 76425a6a4f0..e567dc6c461 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d9660996a6a2d3a1e628d9af45218cf7d04da58edc34f11cfa98772aab57d72f", - git_commit = "bf23e5f0f6e75a35521b7765da9863dbc24d8a71", + sha256 = "00ad2a7858eb404401a866f8949f0eada07e21218eba644bc0d610c47a9ba541", + git_commit = "5f3650f3d3b2306ee8a5360384e052f6a76b778e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From bb541a548dd6a5c028b20890d81e7c18ff7fca68 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 15 Aug 2018 13:02:43 -0700 Subject: [PATCH 0656/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208868225 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e567dc6c461..5c674759128 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "00ad2a7858eb404401a866f8949f0eada07e21218eba644bc0d610c47a9ba541", - git_commit = "5f3650f3d3b2306ee8a5360384e052f6a76b778e", + sha256 = "cfef1683922a2183608ad16ab45c8b66f857967324a1219728af0886e39592ff", + git_commit = "982be2b71d08cda624c3d95dfee31271e9829170", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8b567e2d1e011d1d3c1ffca6cc7a4d8ba79c29b0 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Wed, 15 Aug 2018 13:04:44 -0700 Subject: [PATCH 0657/8103] Improve documentation for setting up with GPU support PiperOrigin-RevId: 208868501 --- tensorflow_serving/g3doc/setup.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tensorflow_serving/g3doc/setup.md b/tensorflow_serving/g3doc/setup.md index c3c818b8f64..68351234ca5 100644 --- a/tensorflow_serving/g3doc/setup.md +++ b/tensorflow_serving/g3doc/setup.md @@ -8,6 +8,9 @@ The easiest and most straight-forward way of using TensorFlow Serving is via [Docker images](docker.md). We highly recommend this route unless you have specific needs that are not addressed by running in a container. +TIP: This is also the easiest way to get TensorFlow Serving working with [GPU +support](docker.md#serving-with-docker-using-your-gpu). + ### Installing using APT #### Available binaries @@ -169,6 +172,13 @@ older processors, so it may not work with all flags. You can try some subset of them, or revert to just the basic '-c opt' which is guaranteed to work on all machines. +##### Building with GPU Support + +In order to build a custom version of TensorFlow Serving with GPU support, we +recommend either building with the [provided Docker images](docker.md#developing-with-docker), or +following the approach in the +[GPU Dockerfile](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.devel-gpu). + ## TensorFlow Serving Python API PIP package To run Python client code without the need to build the API, you can install the From 5df98696736aa45b9fc7851b0c83348aa12dea5c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 15 Aug 2018 14:00:50 -0700 Subject: [PATCH 0658/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208878130 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5c674759128..f3ecaa52d49 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cfef1683922a2183608ad16ab45c8b66f857967324a1219728af0886e39592ff", - git_commit = "982be2b71d08cda624c3d95dfee31271e9829170", + sha256 = "6827420940a48275cf1e47e9bfd6c39a19b519fa40a2c0a0343bf54f0935e929", + git_commit = "d2875ea71373d05c645587a83dd870fa8a0ec070", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5a6936324059fcdfedeb2ac9f5f1d53544bbc8ef Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 15 Aug 2018 15:01:02 -0700 Subject: [PATCH 0659/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208889231 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f3ecaa52d49..bd0141ce219 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6827420940a48275cf1e47e9bfd6c39a19b519fa40a2c0a0343bf54f0935e929", - git_commit = "d2875ea71373d05c645587a83dd870fa8a0ec070", + sha256 = "2a8d5dd452adb3aeb6ca6aff0192ba2c8f64f5ac917f084bc45d6d8f8f7a82c6", + git_commit = "b4e6098db6e707bccdb3ea9027365ddd9b38fb72", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From aed1ae7e406d511e648709239411fcd0681b5ac0 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Wed, 15 Aug 2018 15:10:39 -0700 Subject: [PATCH 0660/8103] Update docker images PiperOrigin-RevId: 208891157 --- tensorflow_serving/tools/docker/Dockerfile.devel | 13 ++++++++----- .../tools/docker/Dockerfile.devel-gpu | 13 ++++++++----- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index a264cbd4695..ee09daa58ce 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -35,8 +35,6 @@ RUN apt-get update && apt-get install -y \ openjdk-8-jre-headless \ pkg-config \ python-dev \ - python-numpy \ - python-pip \ software-properties-common \ swig \ wget \ @@ -46,12 +44,17 @@ RUN apt-get update && apt-get install -y \ apt-get clean && \ rm -rf /var/lib/apt/lists/* +RUN curl -fSsL -O https://bootstrap.pypa.io/get-pip.py && \ + python get-pip.py && \ + rm get-pip.py + RUN pip --no-cache-dir install \ - mock \ grpcio \ h5py \ - keras_applications \ - keras_preprocessing + keras_applications==1.0.4 \ + keras_preprocessing==1.0.2 \ + mock \ + numpy==1.14.5 # Set up Bazel # Need >= 0.15.0 so bazel compiles work with docker bind mounts. diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 1b2128b54ac..c87c88f6f8a 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -49,8 +49,6 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ openjdk-8-jre-headless \ pkg-config \ python-dev \ - python-numpy \ - python-pip \ software-properties-common \ swig \ unzip \ @@ -63,12 +61,17 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ find /usr/local/cuda-9.0/lib64/ -type f -name 'lib*_static.a' -not -name 'libcudart_static.a' -delete && \ rm /usr/lib/x86_64-linux-gnu/libcudnn_static_v7.a +RUN curl -fSsL -O https://bootstrap.pypa.io/get-pip.py && \ + python get-pip.py && \ + rm get-pip.py + RUN pip --no-cache-dir install \ - mock \ grpcio \ h5py \ - keras_applications \ - keras_preprocessing + keras_applications==1.0.4 \ + keras_preprocessing==1.0.2 \ + mock \ + numpy==1.14.5 # Set up Bazel # Need >= 0.15.0 so bazel compiles work with docker bind mounts. From bc589540de96052b57a2a23ac05d245ab1123fed Mon Sep 17 00:00:00 2001 From: Vamsi Sripathi Date: Wed, 15 Aug 2018 15:26:42 -0700 Subject: [PATCH 0661/8103] Rearrange the MKL build config options --- tools/bazel.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/bazel.rc b/tools/bazel.rc index 137426c324b..ed1a59866a2 100644 --- a/tools/bazel.rc +++ b/tools/bazel.rc @@ -1,6 +1,8 @@ build:cuda --crosstool_top=@org_tensorflow//third_party/gpus/crosstool build:cuda --define=using_cuda=true --define=using_cuda_nvcc=true +build:mkl --define=using_mkl=true + build --force_python=py2 build --python2_path=/usr/bin/python @@ -18,5 +20,3 @@ build --define=grpc_no_ares=true # TODO(b/69809703): Remove once no longer required for TensorFlow to build. build --copt=-DGEMMLOWP_ALLOW_SLOW_SCALAR_FALLBACK - -build:mkl --define=using_mkl=true From 5037a95f7ef193255472e1906b31a25baac527df Mon Sep 17 00:00:00 2001 From: awk Date: Wed, 15 Aug 2018 15:51:52 -0700 Subject: [PATCH 0662/8103] Refactor main server creation to a library for reuse. PiperOrigin-RevId: 208898044 --- tensorflow_serving/model_servers/BUILD | 29 +- tensorflow_serving/model_servers/main.cc | 376 +++------------------ tensorflow_serving/model_servers/server.cc | 316 +++++++++++++++++ tensorflow_serving/model_servers/server.h | 96 ++++++ 4 files changed, 475 insertions(+), 342 deletions(-) create mode 100644 tensorflow_serving/model_servers/server.cc create mode 100644 tensorflow_serving/model_servers/server.h diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index aa9cdabb19f..1f80af3a51e 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -295,15 +295,12 @@ TENSORFLOW_DEPS = [ ] cc_library( - name = "tensorflow_model_server_main_lib", + name = "server_lib", srcs = [ - "main.cc", - ], - hdrs = ["version.h"], - visibility = [ - ":tensorflow_model_server_custom_op_clients", - "//tensorflow_serving:internal", + "server.cc", ], + hdrs = ["server.h"], + visibility = ["//visibility:public"], deps = [ ":http_server", ":model_platform_types", @@ -318,6 +315,7 @@ cc_library( "@org_tensorflow//tensorflow/cc/saved_model:tag_constants", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core/platform/cloud:gcs_file_system", + "@com_google_absl//absl/memory", "@org_tensorflow//tensorflow/core/platform/hadoop:hadoop_file_system", "@org_tensorflow//tensorflow/core/platform/s3:s3_file_system", "@org_tensorflow//tensorflow/core:protos_all_cc", @@ -328,6 +326,23 @@ cc_library( ] + TENSORFLOW_DEPS + SUPPORTED_TENSORFLOW_OPS, ) +cc_library( + name = "tensorflow_model_server_main_lib", + srcs = [ + "main.cc", + ], + hdrs = ["version.h"], + visibility = [ + ":tensorflow_model_server_custom_op_clients", + "//tensorflow_serving:internal", + ], + deps = [ + ":server_lib", + "@org_tensorflow//tensorflow/c:c_api", + "@org_tensorflow//tensorflow/core:lib", + ], +) + cc_binary( name = "tensorflow_model_server", visibility = ["//tensorflow_serving:internal"], diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index f679f29199b..3bc94d7398e 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -43,297 +43,57 @@ limitations under the License. // To enable batching (default disabled): --enable_batching // To override the default batching parameters: --batching_parameters_file -#include #include -#include -#include #include -#include "google/protobuf/wrappers.pb.h" -#include "grpc/grpc.h" -#include "grpcpp/security/server_credentials.h" -#include "grpcpp/server.h" -#include "grpcpp/server_builder.h" -#include "grpcpp/server_context.h" -#include "grpcpp/support/status.h" #include "tensorflow/c/c_api.h" -#include "tensorflow/cc/saved_model/tag_constants.h" #include "tensorflow/core/lib/core/status.h" -#include "tensorflow/core/lib/strings/numbers.h" -#include "tensorflow/core/lib/strings/str_util.h" -#include "tensorflow/core/platform/env.h" #include "tensorflow/core/platform/init_main.h" -#include "tensorflow/core/platform/protobuf.h" -#include "tensorflow/core/platform/types.h" -#include "tensorflow/core/protobuf/config.pb.h" #include "tensorflow/core/util/command_line_flags.h" -#include "tensorflow_serving/config/model_server_config.pb.h" -#include "tensorflow_serving/config/ssl_config.pb.h" -#include "tensorflow_serving/core/availability_preserving_policy.h" -#include "tensorflow_serving/model_servers/grpc_status_util.h" -#include "tensorflow_serving/model_servers/http_server.h" -#include "tensorflow_serving/model_servers/model_platform_types.h" -#include "tensorflow_serving/model_servers/model_service_impl.h" -#include "tensorflow_serving/model_servers/platform_config_util.h" -#include "tensorflow_serving/model_servers/prediction_service_impl.h" -#include "tensorflow_serving/model_servers/server_core.h" +#include "tensorflow_serving/model_servers/server.h" #include "tensorflow_serving/model_servers/version.h" -#include "tensorflow_serving/servables/tensorflow/session_bundle_config.pb.h" - -namespace grpc { -class ServerCompletionQueue; -} // namespace grpc - -using tensorflow::string; -using tensorflow::serving::AspiredVersionPolicy; -using tensorflow::serving::AspiredVersionsManager; -using tensorflow::serving::AvailabilityPreservingPolicy; -using tensorflow::serving::BatchingParameters; -using tensorflow::serving::EventBus; -using tensorflow::serving::ModelServerConfig; -using tensorflow::serving::ServableState; -using tensorflow::serving::ServerCore; -using tensorflow::serving::SessionBundleConfig; -using tensorflow::serving::SSLConfig; -using tensorflow::serving::UniquePtrWithDeps; - -using grpc::InsecureServerCredentials; -using grpc::Server; -using grpc::ServerBuilder; - -namespace { - -tensorflow::Status ParseProtoTextFile(const string& file, - google::protobuf::Message* message) { - std::unique_ptr file_data; - TF_RETURN_IF_ERROR( - tensorflow::Env::Default()->NewReadOnlyMemoryRegionFromFile(file, - &file_data)); - string file_data_str(static_cast(file_data->data()), - file_data->length()); - if (tensorflow::protobuf::TextFormat::ParseFromString(file_data_str, - message)) { - return tensorflow::Status::OK(); - } else { - return tensorflow::errors::InvalidArgument("Invalid protobuf file: '", file, - "'"); - } -} - -tensorflow::Status LoadCustomModelConfig( - const ::google::protobuf::Any& any, - EventBus* servable_event_bus, - UniquePtrWithDeps* manager) { - LOG(FATAL) // Crash ok - << "ModelServer does not yet support custom model config."; -} - -ModelServerConfig BuildSingleModelConfig(const string& model_name, - const string& model_base_path) { - ModelServerConfig config; - LOG(INFO) << "Building single TensorFlow model file config: " - << " model_name: " << model_name - << " model_base_path: " << model_base_path; - tensorflow::serving::ModelConfig* single_model = - config.mutable_model_config_list()->add_config(); - single_model->set_name(model_name); - single_model->set_base_path(model_base_path); - single_model->set_model_platform( - tensorflow::serving::kTensorFlowModelPlatform); - return config; -} - -template -ProtoType ReadProtoFromFile(const string& file) { - ProtoType proto; - TF_CHECK_OK(ParseProtoTextFile(file, &proto)); - return proto; -} - -// gRPC Channel Arguments to be passed from command line to gRPC ServerBuilder. -struct GrpcChannelArgument { - string key; - string value; -}; - -// Parses a comma separated list of gRPC channel arguments into list of -// ChannelArgument. -std::vector parseGrpcChannelArgs( - const string& channel_arguments_str) { - const std::vector channel_arguments = - tensorflow::str_util::Split(channel_arguments_str, ","); - std::vector result; - for (const string& channel_argument : channel_arguments) { - const std::vector key_val = - tensorflow::str_util::Split(channel_argument, "="); - result.push_back({key_val[0], key_val[1]}); - } - return result; -} - -struct HttpServerOptions { - tensorflow::int32 port; - tensorflow::int32 num_threads; - tensorflow::int32 timeout_in_ms; -}; - -void RunServer(int port, std::unique_ptr core, bool use_saved_model, - const string& grpc_channel_arguments, - const HttpServerOptions& http_options, - std::shared_ptr creds) { - // "0.0.0.0" is the way to listen on localhost in gRPC. - const string server_address = "0.0.0.0:" + std::to_string(port); - tensorflow::serving::ModelServiceImpl model_service(core.get()); - tensorflow::serving::PredictionServiceImpl prediction_service( - core.get(), use_saved_model); - ServerBuilder builder; - builder.AddListeningPort(server_address, creds); - builder.RegisterService(&model_service); - builder.RegisterService(&prediction_service); - builder.SetMaxMessageSize(tensorflow::kint32max); - const std::vector channel_arguments = - parseGrpcChannelArgs(grpc_channel_arguments); - for (GrpcChannelArgument channel_argument : channel_arguments) { - // gRPC accept arguments of two types, int and string. We will attempt to - // parse each arg as int and pass it on as such if successful. Otherwise we - // will pass it as a string. gRPC will log arguments that were not accepted. - tensorflow::int32 value; - if (tensorflow::strings::safe_strto32(channel_argument.value, &value)) { - builder.AddChannelArgument(channel_argument.key, value); - } else { - builder.AddChannelArgument(channel_argument.key, channel_argument.value); - } - } - std::unique_ptr server(builder.BuildAndStart()); - LOG(INFO) << "Running ModelServer at " << server_address << " ..."; - - if (http_options.port != 0) { - if (http_options.port != port) { - const string server_address = - "localhost:" + std::to_string(http_options.port); - auto http_server = - CreateAndStartHttpServer(http_options.port, http_options.num_threads, - http_options.timeout_in_ms, core.get()); - if (http_server != nullptr) { - LOG(INFO) << "Exporting HTTP/REST API at:" << server_address << " ..."; - http_server->WaitForTermination(); - } else { - LOG(ERROR) << "Failed to start HTTP Server at " << server_address; - } - } else { - LOG(ERROR) << "--rest_api_port cannot be same as --port. " - << "Please use a different port for HTTP/REST API. " - << "Skipped exporting HTTP/REST API."; - } - } - server->Wait(); -} - -// Parses an ascii PlatformConfigMap protobuf from 'file'. -tensorflow::serving::PlatformConfigMap ParsePlatformConfigMap( - const string& file) { - tensorflow::serving::PlatformConfigMap platform_config_map; - TF_CHECK_OK(ParseProtoTextFile(file, &platform_config_map)); - return platform_config_map; -} - -// Parses an ascii SSLConfig protobuf from 'file'. -SSLConfig ParseSSLConfig(const string& file) { - SSLConfig ssl_config; - TF_CHECK_OK(ParseProtoTextFile(file, &ssl_config)); - return ssl_config; -} - -// If 'ssl_config_file' is non-empty, build secure server credentials otherwise -// insecure channel -std::shared_ptr -BuildServerCredentialsFromSSLConfigFile(const string& ssl_config_file) { - if (ssl_config_file.empty()) { - return InsecureServerCredentials(); - } - - SSLConfig ssl_config = ParseSSLConfig(ssl_config_file); - - grpc::SslServerCredentialsOptions ssl_ops( - ssl_config.client_verify() - ? GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY - : GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE); - - ssl_ops.force_client_auth = ssl_config.client_verify(); - - if (ssl_config.custom_ca().size() > 0) { - ssl_ops.pem_root_certs = ssl_config.custom_ca(); - } - - grpc::SslServerCredentialsOptions::PemKeyCertPair keycert = { - ssl_config.server_key(), ssl_config.server_cert()}; - - ssl_ops.pem_key_cert_pairs.push_back(keycert); - - return grpc::SslServerCredentials(ssl_ops); -} - -} // namespace int main(int argc, char** argv) { - tensorflow::int32 port = 8500; - HttpServerOptions http_options; - http_options.port = 0; - http_options.num_threads = 4 * tensorflow::port::NumSchedulableCPUs(); - http_options.timeout_in_ms = 30000; // 30 seconds. - bool enable_batching = false; - float per_process_gpu_memory_fraction = 0; - tensorflow::string batching_parameters_file; - tensorflow::string model_name = "default"; - tensorflow::int32 file_system_poll_wait_seconds = 1; - bool flush_filesystem_caches = true; - tensorflow::string model_base_path; - const bool use_saved_model = true; - tensorflow::string saved_model_tags = tensorflow::kSavedModelTagServe; - // Tensorflow session parallelism of zero means that both inter and intra op - // thread pools will be auto configured. - tensorflow::int64 tensorflow_session_parallelism = 0; - string platform_config_file = ""; - string ssl_config_file = ""; - string model_config_file; - std::shared_ptr creds; - string grpc_channel_arguments = ""; - bool enable_model_warmup = true; + tensorflow::serving::main::Server::Options options; bool display_version = false; std::vector flag_list = { - tensorflow::Flag("port", &port, "Port to listen on for gRPC API"), - tensorflow::Flag("rest_api_port", &http_options.port, + tensorflow::Flag("port", &options.grpc_port, + "Port to listen on for gRPC API"), + tensorflow::Flag("rest_api_port", &options.http_port, "Port to listen on for HTTP/REST API. If set to zero " "HTTP/REST API will not be exported. This port must be " "different than the one specified in --port."), - tensorflow::Flag("rest_api_num_threads", &http_options.num_threads, + tensorflow::Flag("rest_api_num_threads", &options.http_num_threads, "Number of threads for HTTP/REST API processing. If not " "set, will be auto set based on number of CPUs."), - tensorflow::Flag("rest_api_timeout_in_ms", &http_options.timeout_in_ms, + tensorflow::Flag("rest_api_timeout_in_ms", &options.http_timeout_in_ms, "Timeout for HTTP/REST API calls."), - tensorflow::Flag("enable_batching", &enable_batching, "enable batching"), - tensorflow::Flag("batching_parameters_file", &batching_parameters_file, + tensorflow::Flag("enable_batching", &options.enable_batching, + "enable batching"), + tensorflow::Flag("batching_parameters_file", + &options.batching_parameters_file, "If non-empty, read an ascii BatchingParameters " "protobuf from the supplied file name and use the " "contained values instead of the defaults."), - tensorflow::Flag("model_config_file", &model_config_file, + tensorflow::Flag("model_config_file", &options.model_config_file, "If non-empty, read an ascii ModelServerConfig " "protobuf from the supplied file name, and serve the " "models in that file. This config file can be used to " "specify multiple models to serve and other advanced " "parameters including non-default version policy. (If " "used, --model_name, --model_base_path are ignored.)"), - tensorflow::Flag("model_name", &model_name, + tensorflow::Flag("model_name", &options.model_name, "name of model (ignored " "if --model_config_file flag is set"), - tensorflow::Flag("model_base_path", &model_base_path, + tensorflow::Flag("model_base_path", &options.model_base_path, "path to export (ignored if --model_config_file flag " "is set, otherwise required)"), tensorflow::Flag("file_system_poll_wait_seconds", - &file_system_poll_wait_seconds, + &options.file_system_poll_wait_seconds, "interval in seconds between each poll of the file " "system for new model version"), - tensorflow::Flag("flush_filesystem_caches", &flush_filesystem_caches, + tensorflow::Flag("flush_filesystem_caches", + &options.flush_filesystem_caches, "If true (the default), filesystem caches will be " "flushed after the initial load of all servables, and " "after each subsequent individual servable reload (if " @@ -342,119 +102,65 @@ int main(int argc, char** argv) { "of cache misses if model files are accessed after " "servables are loaded."), tensorflow::Flag("tensorflow_session_parallelism", - &tensorflow_session_parallelism, + &options.tensorflow_session_parallelism, "Number of threads to use for running a " "Tensorflow session. Auto-configured by default." "Note that this option is ignored if " "--platform_config_file is non-empty."), tensorflow::Flag( - "ssl_config_file", &ssl_config_file, + "ssl_config_file", &options.ssl_config_file, "If non-empty, read an ascii SSLConfig protobuf from " "the supplied file name and set up a secure gRPC channel"), - tensorflow::Flag("platform_config_file", &platform_config_file, + tensorflow::Flag("platform_config_file", &options.platform_config_file, "If non-empty, read an ascii PlatformConfigMap protobuf " "from the supplied file name, and use that platform " "config instead of the Tensorflow platform. (If used, " "--enable_batching is ignored.)"), tensorflow::Flag( - "per_process_gpu_memory_fraction", &per_process_gpu_memory_fraction, + "per_process_gpu_memory_fraction", + &options.per_process_gpu_memory_fraction, "Fraction that each process occupies of the GPU memory space " "the value is between 0.0 and 1.0 (with 0.0 as the default) " "If 1.0, the server will allocate all the memory when the server " "starts, If 0.0, Tensorflow will automatically select a value."), - tensorflow::Flag("saved_model_tags", &saved_model_tags, + tensorflow::Flag("saved_model_tags", &options.saved_model_tags, "Comma-separated set of tags corresponding to the meta " "graph def to load from SavedModel."), - tensorflow::Flag("grpc_channel_arguments", &grpc_channel_arguments, + tensorflow::Flag("grpc_channel_arguments", + &options.grpc_channel_arguments, "A comma separated list of arguments to be passed to " "the grpc server. (e.g. " "grpc.max_connection_age_ms=2000)"), - tensorflow::Flag("enable_model_warmup", &enable_model_warmup, + tensorflow::Flag("enable_model_warmup", &options.enable_model_warmup, "Enables model warmup, which triggers lazy " "initializations (such as TF optimizations) at load " "time, to reduce first request latency."), tensorflow::Flag("version", &display_version, "Display version")}; - string usage = tensorflow::Flags::Usage(argv[0], flag_list); - const bool parse_result = tensorflow::Flags::Parse(&argc, argv, flag_list); - if (parse_result && display_version) { + + const auto& usage = tensorflow::Flags::Usage(argv[0], flag_list); + if (!tensorflow::Flags::Parse(&argc, argv, flag_list)) { + std::cout << usage; + return -1; + } + + if (display_version) { std::cout << "TensorFlow ModelServer: " << TF_MODELSERVER_VERSION_STRING << "\n" << "TensorFlow Library: " << TF_Version() << "\n"; return 0; } - if (!parse_result || (model_base_path.empty() && model_config_file.empty())) { - std::cout << usage; - return -1; - } + tensorflow::port::InitMain(argv[0], &argc, &argv); if (argc != 1) { std::cout << "unknown argument: " << argv[1] << "\n" << usage; } - creds = BuildServerCredentialsFromSSLConfigFile(ssl_config_file); - - // For ServerCore Options, we leave servable_state_monitor_creator unspecified - // so the default servable_state_monitor_creator will be used. - ServerCore::Options options; - - // model server config - if (model_config_file.empty()) { - options.model_server_config = - BuildSingleModelConfig(model_name, model_base_path); - } else { - options.model_server_config = - ReadProtoFromFile(model_config_file); - } - - if (platform_config_file.empty()) { - SessionBundleConfig session_bundle_config; - // Batching config - if (enable_batching) { - BatchingParameters* batching_parameters = - session_bundle_config.mutable_batching_parameters(); - if (batching_parameters_file.empty()) { - batching_parameters->mutable_thread_pool_name()->set_value( - "model_server_batch_threads"); - } else { - *batching_parameters = - ReadProtoFromFile(batching_parameters_file); - } - } else if (!batching_parameters_file.empty()) { - LOG(FATAL) // Crash ok - << "You supplied --batching_parameters_file without " - "--enable_batching"; - } - - session_bundle_config.mutable_session_config() - ->mutable_gpu_options() - ->set_per_process_gpu_memory_fraction(per_process_gpu_memory_fraction); - session_bundle_config.mutable_session_config() - ->set_intra_op_parallelism_threads(tensorflow_session_parallelism); - session_bundle_config.mutable_session_config() - ->set_inter_op_parallelism_threads(tensorflow_session_parallelism); - const std::vector tags = - tensorflow::str_util::Split(saved_model_tags, ","); - for (const string& tag : tags) { - *session_bundle_config.add_saved_model_tags() = tag; - } - session_bundle_config.set_enable_model_warmup(enable_model_warmup); - options.platform_config_map = CreateTensorFlowPlatformConfigMap( - session_bundle_config, use_saved_model); - } else { - options.platform_config_map = ParsePlatformConfigMap(platform_config_file); + tensorflow::serving::main::Server server; + const auto& status = server.BuildAndStart(options); + if (!status.ok()) { + std::cout << "Failed to start server. Error: " << status << "\n"; + return -1; } - - options.custom_model_config_loader = &LoadCustomModelConfig; - - options.aspired_version_policy = - std::unique_ptr(new AvailabilityPreservingPolicy); - options.file_system_poll_wait_seconds = file_system_poll_wait_seconds; - options.flush_filesystem_caches = flush_filesystem_caches; - - std::unique_ptr core; - TF_CHECK_OK(ServerCore::Create(std::move(options), &core)); - RunServer(port, std::move(core), use_saved_model, grpc_channel_arguments, - http_options, creds); - + server.WaitForTermination(); return 0; } diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc new file mode 100644 index 00000000000..4b654f2520e --- /dev/null +++ b/tensorflow_serving/model_servers/server.cc @@ -0,0 +1,316 @@ +/* Copyright 2016 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow_serving/model_servers/server.h" + +#include +#include +#include +#include +#include + +#include "google/protobuf/wrappers.pb.h" +#include "grpc/grpc.h" +#include "grpcpp/security/server_credentials.h" +#include "grpcpp/server_builder.h" +#include "grpcpp/server_context.h" +#include "grpcpp/support/status.h" +#include "absl/memory/memory.h" +#include "tensorflow/c/c_api.h" +#include "tensorflow/cc/saved_model/tag_constants.h" +#include "tensorflow/core/lib/strings/numbers.h" +#include "tensorflow/core/lib/strings/str_util.h" +#include "tensorflow/core/platform/env.h" +#include "tensorflow/core/platform/protobuf.h" +#include "tensorflow/core/protobuf/config.pb.h" +#include "tensorflow_serving/config/model_server_config.pb.h" +#include "tensorflow_serving/config/ssl_config.pb.h" +#include "tensorflow_serving/core/availability_preserving_policy.h" +#include "tensorflow_serving/model_servers/grpc_status_util.h" +#include "tensorflow_serving/model_servers/model_platform_types.h" +#include "tensorflow_serving/model_servers/platform_config_util.h" +#include "tensorflow_serving/model_servers/server_core.h" +#include "tensorflow_serving/servables/tensorflow/session_bundle_config.pb.h" + +namespace tensorflow { +namespace serving { +namespace main { + +namespace { + +tensorflow::Status ParseProtoTextFile(const string& file, + google::protobuf::Message* message) { + std::unique_ptr file_data; + TF_RETURN_IF_ERROR( + tensorflow::Env::Default()->NewReadOnlyMemoryRegionFromFile(file, + &file_data)); + string file_data_str(static_cast(file_data->data()), + file_data->length()); + if (tensorflow::protobuf::TextFormat::ParseFromString(file_data_str, + message)) { + return tensorflow::Status::OK(); + } else { + return tensorflow::errors::InvalidArgument("Invalid protobuf file: '", file, + "'"); + } +} + +tensorflow::Status LoadCustomModelConfig( + const ::google::protobuf::Any& any, + EventBus* servable_event_bus, + UniquePtrWithDeps* manager) { + LOG(FATAL) // Crash ok + << "ModelServer does not yet support custom model config."; +} + +ModelServerConfig BuildSingleModelConfig(const string& model_name, + const string& model_base_path) { + ModelServerConfig config; + LOG(INFO) << "Building single TensorFlow model file config: " + << " model_name: " << model_name + << " model_base_path: " << model_base_path; + tensorflow::serving::ModelConfig* single_model = + config.mutable_model_config_list()->add_config(); + single_model->set_name(model_name); + single_model->set_base_path(model_base_path); + single_model->set_model_platform( + tensorflow::serving::kTensorFlowModelPlatform); + return config; +} + +template +ProtoType ReadProtoFromFile(const string& file) { + ProtoType proto; + TF_CHECK_OK(ParseProtoTextFile(file, &proto)); + return proto; +} + +// gRPC Channel Arguments to be passed from command line to gRPC ServerBuilder. +struct GrpcChannelArgument { + string key; + string value; +}; + +// Parses a comma separated list of gRPC channel arguments into list of +// ChannelArgument. +std::vector parseGrpcChannelArgs( + const string& channel_arguments_str) { + const std::vector channel_arguments = + tensorflow::str_util::Split(channel_arguments_str, ","); + std::vector result; + for (const string& channel_argument : channel_arguments) { + const std::vector key_val = + tensorflow::str_util::Split(channel_argument, "="); + result.push_back({key_val[0], key_val[1]}); + } + return result; +} + +// Parses an ascii PlatformConfigMap protobuf from 'file'. +tensorflow::serving::PlatformConfigMap ParsePlatformConfigMap( + const string& file) { + tensorflow::serving::PlatformConfigMap platform_config_map; + TF_CHECK_OK(ParseProtoTextFile(file, &platform_config_map)); + return platform_config_map; +} + +// Parses an ascii SSLConfig protobuf from 'file'. +SSLConfig ParseSSLConfig(const string& file) { + SSLConfig ssl_config; + TF_CHECK_OK(ParseProtoTextFile(file, &ssl_config)); + return ssl_config; +} + +// If 'ssl_config_file' is non-empty, build secure server credentials otherwise +// insecure channel +std::shared_ptr<::grpc::ServerCredentials> +BuildServerCredentialsFromSSLConfigFile(const string& ssl_config_file) { + if (ssl_config_file.empty()) { + return ::grpc::InsecureServerCredentials(); + } + + SSLConfig ssl_config = ParseSSLConfig(ssl_config_file); + + ::grpc::SslServerCredentialsOptions ssl_ops( + ssl_config.client_verify() + ? GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY + : GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE); + + ssl_ops.force_client_auth = ssl_config.client_verify(); + + if (ssl_config.custom_ca().size() > 0) { + ssl_ops.pem_root_certs = ssl_config.custom_ca(); + } + + ::grpc::SslServerCredentialsOptions::PemKeyCertPair keycert = { + ssl_config.server_key(), ssl_config.server_cert()}; + + ssl_ops.pem_key_cert_pairs.push_back(keycert); + + return ::grpc::SslServerCredentials(ssl_ops); +} + +} // namespace + +Server::Options::Options() + : model_name("default"), + saved_model_tags(tensorflow::kSavedModelTagServe) {} + +Server::~Server() { WaitForTermination(); } + +Status Server::BuildAndStart(const Options& server_options) { + const bool use_saved_model = true; + + if (server_options.grpc_port == 0) { + return errors::InvalidArgument("server_options.grpc_port is not set."); + } + + if (server_options.model_base_path.empty() && + server_options.model_config_file.empty()) { + return errors::InvalidArgument( + "Both server_options.model_base_path and " + "server_options.model_config_file are empty!"); + } + + // For ServerCore Options, we leave servable_state_monitor_creator unspecified + // so the default servable_state_monitor_creator will be used. + ServerCore::Options options; + + // model server config + if (server_options.model_config_file.empty()) { + options.model_server_config = BuildSingleModelConfig( + server_options.model_name, server_options.model_base_path); + } else { + options.model_server_config = + ReadProtoFromFile(server_options.model_config_file); + } + + if (server_options.platform_config_file.empty()) { + SessionBundleConfig session_bundle_config; + // Batching config + if (server_options.enable_batching) { + BatchingParameters* batching_parameters = + session_bundle_config.mutable_batching_parameters(); + if (server_options.batching_parameters_file.empty()) { + batching_parameters->mutable_thread_pool_name()->set_value( + "model_server_batch_threads"); + } else { + *batching_parameters = ReadProtoFromFile( + server_options.batching_parameters_file); + } + } else if (!server_options.batching_parameters_file.empty()) { + return errors::InvalidArgument( + "server_options.batching_parameters_file is set without setting " + "server_options.enable_batching to true."); + } + + session_bundle_config.mutable_session_config() + ->mutable_gpu_options() + ->set_per_process_gpu_memory_fraction( + server_options.per_process_gpu_memory_fraction); + session_bundle_config.mutable_session_config() + ->set_intra_op_parallelism_threads( + server_options.tensorflow_session_parallelism); + session_bundle_config.mutable_session_config() + ->set_inter_op_parallelism_threads( + server_options.tensorflow_session_parallelism); + const std::vector tags = + tensorflow::str_util::Split(server_options.saved_model_tags, ","); + for (const string& tag : tags) { + *session_bundle_config.add_saved_model_tags() = tag; + } + session_bundle_config.set_enable_model_warmup( + server_options.enable_model_warmup); + options.platform_config_map = CreateTensorFlowPlatformConfigMap( + session_bundle_config, use_saved_model); + } else { + options.platform_config_map = + ParsePlatformConfigMap(server_options.platform_config_file); + } + + options.custom_model_config_loader = &LoadCustomModelConfig; + options.aspired_version_policy = + std::unique_ptr(new AvailabilityPreservingPolicy); + options.file_system_poll_wait_seconds = + server_options.file_system_poll_wait_seconds; + options.flush_filesystem_caches = server_options.flush_filesystem_caches; + + TF_RETURN_IF_ERROR(ServerCore::Create(std::move(options), &server_core_)); + + // 0.0.0.0" is the way to listen on localhost in gRPC. + const string server_address = + "0.0.0.0:" + std::to_string(server_options.grpc_port); + model_service_ = absl::make_unique(server_core_.get()); + prediction_service_ = absl::make_unique( + server_core_.get(), use_saved_model); + ::grpc::ServerBuilder builder; + builder.AddListeningPort( + server_address, + BuildServerCredentialsFromSSLConfigFile(server_options.ssl_config_file)); + builder.RegisterService(model_service_.get()); + builder.RegisterService(prediction_service_.get()); + builder.SetMaxMessageSize(tensorflow::kint32max); + const std::vector channel_arguments = + parseGrpcChannelArgs(server_options.grpc_channel_arguments); + for (GrpcChannelArgument channel_argument : channel_arguments) { + // gRPC accept arguments of two types, int and string. We will attempt to + // parse each arg as int and pass it on as such if successful. Otherwise we + // will pass it as a string. gRPC will log arguments that were not accepted. + tensorflow::int32 value; + if (tensorflow::strings::safe_strto32(channel_argument.value, &value)) { + builder.AddChannelArgument(channel_argument.key, value); + } else { + builder.AddChannelArgument(channel_argument.key, channel_argument.value); + } + } + grpc_server_ = builder.BuildAndStart(); + if (grpc_server_ == nullptr) { + return errors::InvalidArgument("Failed to BuildAndStart gRPC server"); + } + LOG(INFO) << "Running gRPC ModelServer at " << server_address << " ..."; + + if (server_options.http_port != 0) { + if (server_options.http_port != server_options.grpc_port) { + const string server_address = + "localhost:" + std::to_string(server_options.http_port); + http_server_ = CreateAndStartHttpServer( + server_options.http_port, server_options.http_num_threads, + server_options.http_timeout_in_ms, server_core_.get()); + if (http_server_ != nullptr) { + LOG(INFO) << "Exporting HTTP/REST API at:" << server_address << " ..."; + } else { + LOG(ERROR) << "Failed to start HTTP Server at " << server_address; + } + } else { + LOG(ERROR) << "server_options.http_port cannot be same as grpc_port. " + << "Please use a different port for HTTP/REST API. " + << "Skipped exporting HTTP/REST API."; + } + } + return Status::OK(); +} + +void Server::WaitForTermination() { + if (http_server_ != nullptr) { + http_server_->WaitForTermination(); + } + if (grpc_server_ != nullptr) { + grpc_server_->Wait(); + } +} + +} // namespace main +} // namespace serving +} // namespace tensorflow diff --git a/tensorflow_serving/model_servers/server.h b/tensorflow_serving/model_servers/server.h new file mode 100644 index 00000000000..ebc5c7be4b6 --- /dev/null +++ b/tensorflow_serving/model_servers/server.h @@ -0,0 +1,96 @@ +/* Copyright 2018 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_SERVING_MODEL_SERVERS_SERVER_H_ +#define TENSORFLOW_SERVING_MODEL_SERVERS_SERVER_H_ + +#include + +#include "grpcpp/server.h" +#include "tensorflow/core/lib/core/status.h" +#include "tensorflow/core/platform/cpu_info.h" +#include "tensorflow/core/platform/types.h" +#include "tensorflow_serving/model_servers/http_server.h" +#include "tensorflow_serving/model_servers/model_service_impl.h" +#include "tensorflow_serving/model_servers/prediction_service_impl.h" +#include "tensorflow_serving/model_servers/server_core.h" + +namespace tensorflow { +namespace serving { +namespace main { + +class Server { + public: + struct Options { + // + // gRPC Server options + // + tensorflow::int32 grpc_port = 8500; + tensorflow::string grpc_channel_arguments; + + // + // HTTP Server options. + // + tensorflow::int32 http_port = 0; + tensorflow::int32 http_num_threads = 4.0 * port::NumSchedulableCPUs(); + tensorflow::int32 http_timeout_in_ms = 30000; // 30 seconds. + + // + // Model Server options. + // + bool enable_batching = false; + float per_process_gpu_memory_fraction = 0; + tensorflow::string batching_parameters_file; + tensorflow::string model_name; + tensorflow::int32 file_system_poll_wait_seconds = 1; + bool flush_filesystem_caches = true; + tensorflow::string model_base_path; + tensorflow::string saved_model_tags; + // Tensorflow session parallelism of zero means that both inter and intra op + // thread pools will be auto configured. + tensorflow::int64 tensorflow_session_parallelism = 0; + tensorflow::string platform_config_file; + tensorflow::string ssl_config_file; + string model_config_file; + bool enable_model_warmup = true; + + Options(); + }; + + // Blocks the current thread waiting for servers (if any) + // started as part of BuildAndStart() call. + ~Server(); + + // Build and start gRPC (and optionally HTTP) server, to be ready to + // accept and process new requests over gRPC (and optionally HTTP/REST). + Status BuildAndStart(const Options& server_options); + + // Wait for servers started in BuildAndStart() above to terminate. + // This will block the current thread until termination is successful. + void WaitForTermination(); + + private: + std::unique_ptr server_core_; + std::unique_ptr model_service_; + std::unique_ptr prediction_service_; + std::unique_ptr<::grpc::Server> grpc_server_; + std::unique_ptr http_server_; +}; + +} // namespace main +} // namespace serving +} // namespace tensorflow + +#endif // TENSORFLOW_SERVING_MODEL_SERVERS_SERVER_H_ From a609f199d751edc4df4850b4e79207032112f8a3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 15 Aug 2018 16:02:39 -0700 Subject: [PATCH 0663/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208899578 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bd0141ce219..aae055eac2c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2a8d5dd452adb3aeb6ca6aff0192ba2c8f64f5ac917f084bc45d6d8f8f7a82c6", - git_commit = "b4e6098db6e707bccdb3ea9027365ddd9b38fb72", + sha256 = "76eb3ac252315f24342b90b1c09d62a6bef66669956606ca5cb9cff8a4af6a18", + git_commit = "c632892f722eda3de923850e23bfc371f898a8d1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5e6148b75a84f87add329d2fa4f477e272372e82 Mon Sep 17 00:00:00 2001 From: Vamsi Sripathi Date: Wed, 15 Aug 2018 16:13:36 -0700 Subject: [PATCH 0664/8103] Match the MKL build config as described at https://github.com/tensorflow/tensorflow/blob/master/tools/bazel.rc --- tools/bazel.rc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/bazel.rc b/tools/bazel.rc index 4e40bf163cf..9954a2eb30f 100644 --- a/tools/bazel.rc +++ b/tools/bazel.rc @@ -1,7 +1,11 @@ build:cuda --crosstool_top=@local_config_cuda//crosstool:toolchain build:cuda --define=using_cuda=true --define=using_cuda_nvcc=true +# Please note that MKL on MacOS or windows is still not supported. +# If you would like to use a local MKL instead of downloading, please set the +# environment variable "TF_MKL_ROOT" every time before build. build:mkl --define=using_mkl=true +build:mkl -c opt build --action_env PYTHON_BIN_PATH="/usr/bin/python" build --define PYTHON_BIN_PATH=/usr/bin/python From c2fa2a896d34e3d69d78911549ab8a069fbc1467 Mon Sep 17 00:00:00 2001 From: Vamsi Sripathi Date: Wed, 15 Aug 2018 16:21:53 -0700 Subject: [PATCH 0665/8103] Add open-source MKL-DNN build option --- tools/bazel.rc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/bazel.rc b/tools/bazel.rc index 9954a2eb30f..10bcec750e3 100644 --- a/tools/bazel.rc +++ b/tools/bazel.rc @@ -7,6 +7,10 @@ build:cuda --define=using_cuda=true --define=using_cuda_nvcc=true build:mkl --define=using_mkl=true build:mkl -c opt +# This config option is used to enable MKL-DNN open source library only, +# without depending on MKL binary version. +build:mkl_open_source_only --define=using_mkl_dnn_only=true + build --action_env PYTHON_BIN_PATH="/usr/bin/python" build --define PYTHON_BIN_PATH=/usr/bin/python From 77cec6f1dc9a86b8ec574a2d6e55c3e2fa8b8e39 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 15 Aug 2018 17:01:00 -0700 Subject: [PATCH 0666/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208908713 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index aae055eac2c..008d02ebbd7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "76eb3ac252315f24342b90b1c09d62a6bef66669956606ca5cb9cff8a4af6a18", - git_commit = "c632892f722eda3de923850e23bfc371f898a8d1", + sha256 = "96cacbbe83518cf53e85f27649394924e7da9a0bab77e02669e71f4e83b99924", + git_commit = "82820a6b6263525781a16c9d5fbf745d3f24ebd7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d94ace0f511d4a4d2cf50df4bd1df9cdab82454f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 15 Aug 2018 18:03:32 -0700 Subject: [PATCH 0667/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208916769 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 008d02ebbd7..cd592741a13 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "96cacbbe83518cf53e85f27649394924e7da9a0bab77e02669e71f4e83b99924", - git_commit = "82820a6b6263525781a16c9d5fbf745d3f24ebd7", + sha256 = "e8907c5ba55393f388382ad26f865eba1547a8823e73055c3fbad81340c7a1b8", + git_commit = "a10219e1de775ca16281f1b597f7bf4d60d0585f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a3befc7eff035167ad855a83369610c89477d52a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 15 Aug 2018 19:03:03 -0700 Subject: [PATCH 0668/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208922188 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cd592741a13..3d027a2a9e5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e8907c5ba55393f388382ad26f865eba1547a8823e73055c3fbad81340c7a1b8", - git_commit = "a10219e1de775ca16281f1b597f7bf4d60d0585f", + sha256 = "9df5a41042d34c87e106d17d78fbc739aba2b7e114511e23ef12ec72226885e1", + git_commit = "9cf868e4c7da07174b21863cd2afcc5abc80e5ad", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From db07fd92b9fe27382f2193de8307278b0729c72f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 15 Aug 2018 20:02:57 -0700 Subject: [PATCH 0669/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208926225 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3d027a2a9e5..3293d735884 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9df5a41042d34c87e106d17d78fbc739aba2b7e114511e23ef12ec72226885e1", - git_commit = "9cf868e4c7da07174b21863cd2afcc5abc80e5ad", + sha256 = "689f6d77bd10aaef8f33fdd312a81b08394b45c4482e4a151e620dc0824183d8", + git_commit = "4e0c56e16da47e57083414c735be0a9640dc7f3e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e6a796a401b4dbea7c4b5c756c980f36084a2d2f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 15 Aug 2018 21:02:56 -0700 Subject: [PATCH 0670/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208930825 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3293d735884..40702a09209 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "689f6d77bd10aaef8f33fdd312a81b08394b45c4482e4a151e620dc0824183d8", - git_commit = "4e0c56e16da47e57083414c735be0a9640dc7f3e", + sha256 = "32b2c7b205c4d5247f1d9a9f12bffa46c5fa6637283f04707fdbd05d9a5d5889", + git_commit = "6c3e1f4bc803f2dc8a804f4f15ada0eda6c90a18", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9ceb1d61d05df977db595067f1425db33301698c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 15 Aug 2018 22:00:46 -0700 Subject: [PATCH 0671/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208934781 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 40702a09209..25dc7f32eab 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "32b2c7b205c4d5247f1d9a9f12bffa46c5fa6637283f04707fdbd05d9a5d5889", - git_commit = "6c3e1f4bc803f2dc8a804f4f15ada0eda6c90a18", + sha256 = "d71dbd0c3921ea22bd4e1c11ec7f21b73ba46e5baf39e867b5adc358aa53344b", + git_commit = "ff6525acf1bdf8afe65f4fd93047669f08f5e061", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From df9140bc2ea68ee3e659acd84bc7baa010ab684f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 16 Aug 2018 02:02:28 -0700 Subject: [PATCH 0672/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208952592 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 25dc7f32eab..edf2c87aeb3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d71dbd0c3921ea22bd4e1c11ec7f21b73ba46e5baf39e867b5adc358aa53344b", - git_commit = "ff6525acf1bdf8afe65f4fd93047669f08f5e061", + sha256 = "822c362630d5852216bec3a20d584840421bd3b3b8792ba8e64e3b3b417f36de", + git_commit = "70861ee77fb5d0f7e389d00050b9acd6c5b0f851", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 946bd337485bacaf41ad81160d02917ffea18d51 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 16 Aug 2018 03:05:14 -0700 Subject: [PATCH 0673/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208958551 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index edf2c87aeb3..59469950e61 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "822c362630d5852216bec3a20d584840421bd3b3b8792ba8e64e3b3b417f36de", - git_commit = "70861ee77fb5d0f7e389d00050b9acd6c5b0f851", + sha256 = "1439809e01c5b5339d7469ddd7fc727be47b0d0c2e14d0cc8daa45cbca7fe486", + git_commit = "49c6df68f66550eca4a1ff0894a2cc562943507e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e792ff6c893699c249506941ea0848539f83a8e6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 16 Aug 2018 04:03:02 -0700 Subject: [PATCH 0674/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208962684 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 59469950e61..05c4bd1df31 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1439809e01c5b5339d7469ddd7fc727be47b0d0c2e14d0cc8daa45cbca7fe486", - git_commit = "49c6df68f66550eca4a1ff0894a2cc562943507e", + sha256 = "9ee6239dcfb245caefb9cd1d112772528860808be4537830859f888b06628a46", + git_commit = "3f08f82a7c896d357262a47eda8df80b778a2672", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 20cbf6e9203c6ecc6a429a15281410e7980a8280 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 16 Aug 2018 08:00:47 -0700 Subject: [PATCH 0675/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208984091 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 05c4bd1df31..c7745ee722b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9ee6239dcfb245caefb9cd1d112772528860808be4537830859f888b06628a46", - git_commit = "3f08f82a7c896d357262a47eda8df80b778a2672", + sha256 = "70e94a0ef27d39bfe9e57a1b7691a8d352b35d91e28b2a2481ca67c2afb431af", + git_commit = "938b9a40787028c58fb548fa6ada8c0dd8180f35", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8d65634bb2183f06ad7408860989c62cc0ec58c6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 16 Aug 2018 09:03:02 -0700 Subject: [PATCH 0676/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 208991898 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c7745ee722b..519ae84f461 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "70e94a0ef27d39bfe9e57a1b7691a8d352b35d91e28b2a2481ca67c2afb431af", - git_commit = "938b9a40787028c58fb548fa6ada8c0dd8180f35", + sha256 = "1cd365ed4a5e7677de59361054d2a2759a55bf233d410a754526ad4318612fe2", + git_commit = "afcf8a0ca10bb618f0a259952a82738fd267348f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 75b400e9bf28fda05ffb1c0facab9e4f3c14c4f4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 16 Aug 2018 11:03:14 -0700 Subject: [PATCH 0677/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209012596 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 519ae84f461..f9256afbbc5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1cd365ed4a5e7677de59361054d2a2759a55bf233d410a754526ad4318612fe2", - git_commit = "afcf8a0ca10bb618f0a259952a82738fd267348f", + sha256 = "f697fcf74b7de083ef4d7c6dc19ce3ea7501d008946a018173e47f7236fc711b", + git_commit = "6be42eea4700f1ff35923cee01f170c6dd48184c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6454be3463cacc82cba9ace7116f902a0f5d59af Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 16 Aug 2018 12:05:55 -0700 Subject: [PATCH 0678/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209023539 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f9256afbbc5..ba591d2909b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f697fcf74b7de083ef4d7c6dc19ce3ea7501d008946a018173e47f7236fc711b", - git_commit = "6be42eea4700f1ff35923cee01f170c6dd48184c", + sha256 = "d46707abe611ceed9ce9cb7b994d766d7dc9184c3052eff3e80c4b765f915d32", + git_commit = "394db95965e1d745f08b4eeb550878ddc175af15", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b48a635c7488c9d7d569a7429b682f71c4ef2fce Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 16 Aug 2018 13:02:34 -0700 Subject: [PATCH 0679/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209032333 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ba591d2909b..4d9e4c29249 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d46707abe611ceed9ce9cb7b994d766d7dc9184c3052eff3e80c4b765f915d32", - git_commit = "394db95965e1d745f08b4eeb550878ddc175af15", + sha256 = "f3bdecaf363dd870ab0cad84af0ab08b00c6e971c2b8e444c5482e0c01d949dc", + git_commit = "e4371880b1a50f7b23b2375c9c7c7fcd2dcf1a5b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From add048971040c4c76b71c576e543a31987b8457a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 16 Aug 2018 14:08:05 -0700 Subject: [PATCH 0680/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209044339 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4d9e4c29249..21b4a4a6dfd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f3bdecaf363dd870ab0cad84af0ab08b00c6e971c2b8e444c5482e0c01d949dc", - git_commit = "e4371880b1a50f7b23b2375c9c7c7fcd2dcf1a5b", + sha256 = "03a7beb49028f71a343717df85642fcfcb91a3d64fa6fbd9d29d965554403fc4", + git_commit = "ce3ad57dd94f5b0c16b96768dc2acfca3db5f5ee", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 87405f70a0b659647647d7a38136ff0619874c98 Mon Sep 17 00:00:00 2001 From: awk Date: Thu, 16 Aug 2018 14:12:08 -0700 Subject: [PATCH 0681/8103] Internal change. PiperOrigin-RevId: 209045131 --- tensorflow_serving/model_servers/BUILD | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 1f80af3a51e..fbfc26bbca5 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -314,10 +314,7 @@ cc_library( "@org_tensorflow//tensorflow/c:c_api", "@org_tensorflow//tensorflow/cc/saved_model:tag_constants", "@org_tensorflow//tensorflow/core:lib", - "@org_tensorflow//tensorflow/core/platform/cloud:gcs_file_system", "@com_google_absl//absl/memory", - "@org_tensorflow//tensorflow/core/platform/hadoop:hadoop_file_system", - "@org_tensorflow//tensorflow/core/platform/s3:s3_file_system", "@org_tensorflow//tensorflow/core:protos_all_cc", "//tensorflow_serving/config:model_server_config_proto", "//tensorflow_serving/config:ssl_config_proto", @@ -340,6 +337,9 @@ cc_library( ":server_lib", "@org_tensorflow//tensorflow/c:c_api", "@org_tensorflow//tensorflow/core:lib", + "@org_tensorflow//tensorflow/core/platform/cloud:gcs_file_system", + "@org_tensorflow//tensorflow/core/platform/hadoop:hadoop_file_system", + "@org_tensorflow//tensorflow/core/platform/s3:s3_file_system", ], ) From dd142d4d2a0f49bed31d4e3487492bb04aae6fc9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 16 Aug 2018 15:13:13 -0700 Subject: [PATCH 0682/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209056739 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 21b4a4a6dfd..734a008db65 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "03a7beb49028f71a343717df85642fcfcb91a3d64fa6fbd9d29d965554403fc4", - git_commit = "ce3ad57dd94f5b0c16b96768dc2acfca3db5f5ee", + sha256 = "045f75753287c399375ce3189c6d79576ab2c1a892d8a9be755a60f21b758e1d", + git_commit = "d43820b9eff0cc863de2bbfb142afe92bf5afd00", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 679f2c185b019a75d5dbbb0f60c7c754b1fe1464 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 16 Aug 2018 16:04:23 -0700 Subject: [PATCH 0683/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209066500 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 734a008db65..d86b5f8996a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "045f75753287c399375ce3189c6d79576ab2c1a892d8a9be755a60f21b758e1d", - git_commit = "d43820b9eff0cc863de2bbfb142afe92bf5afd00", + sha256 = "e65318fef2e7091f5408de25c48ddf46ff581af4f465135e606abb46d302dc5e", + git_commit = "985cbd7ff220795abc4a50839144c177924d469c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ff36a502879a0129477b76fef89432b65990d646 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 16 Aug 2018 17:03:02 -0700 Subject: [PATCH 0684/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209075273 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d86b5f8996a..583f9f73019 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e65318fef2e7091f5408de25c48ddf46ff581af4f465135e606abb46d302dc5e", - git_commit = "985cbd7ff220795abc4a50839144c177924d469c", + sha256 = "b68913ad99b18a0dfe3884744e6e3b26172ad3ca7d99ba09491b63dbf8554430", + git_commit = "af8cf15167ff97b561b78b4ceace37bb6794bd37", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 59616be43a576025cbf329f20de60851ccc612a0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 16 Aug 2018 18:01:10 -0700 Subject: [PATCH 0685/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209082331 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 583f9f73019..d265e260344 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b68913ad99b18a0dfe3884744e6e3b26172ad3ca7d99ba09491b63dbf8554430", - git_commit = "af8cf15167ff97b561b78b4ceace37bb6794bd37", + sha256 = "ceab20a6b17fe08a794feb691905ab7ac95b7ce863246f1f02f5efa693e87385", + git_commit = "363839e5b53ce42758a5127084e319583b5f3c48", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 18bd166a55bf06ba9c7be7951b8d6af783dfc789 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 16 Aug 2018 19:05:10 -0700 Subject: [PATCH 0686/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209088552 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d265e260344..70c574a8e5e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ceab20a6b17fe08a794feb691905ab7ac95b7ce863246f1f02f5efa693e87385", - git_commit = "363839e5b53ce42758a5127084e319583b5f3c48", + sha256 = "30a432623b6da8b5558404f0f0e3d48ec03006b3e71bcb88548e754f95fe9f7c", + git_commit = "3e96a135d9650c91e307d1d56c81e5a37078cada", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8f72a362a1d86d26c83f61fc97f75b348a668f2a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 16 Aug 2018 20:10:25 -0700 Subject: [PATCH 0687/8103] Add a note re gRPC port to the Docker documentation PiperOrigin-RevId: 209093377 --- tensorflow_serving/g3doc/docker.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tensorflow_serving/g3doc/docker.md b/tensorflow_serving/g3doc/docker.md index 5d2395a2d27..a64047ccbe0 100644 --- a/tensorflow_serving/g3doc/docker.md +++ b/tensorflow_serving/g3doc/docker.md @@ -63,6 +63,9 @@ Server, bind the REST API port 8501, and map our desired model from our host to where models are expected in the container. We also pass the name of the model as an environment variable, which will be important when we query the model. +Note that if you wanted to use the gRPC API, you should instead bind to port +8500. + To query the model using the predict API, you can run ```shell From ec41c4d649bc6733295645952232727f43765f6b Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Thu, 16 Aug 2018 21:51:09 -0700 Subject: [PATCH 0688/8103] Update docker instructions PiperOrigin-RevId: 209100895 --- tensorflow_serving/g3doc/docker.md | 172 ++++++++++++++---- tensorflow_serving/g3doc/serving_inception.md | 2 +- 2 files changed, 133 insertions(+), 41 deletions(-) diff --git a/tensorflow_serving/g3doc/docker.md b/tensorflow_serving/g3doc/docker.md index a64047ccbe0..e7b554b8bda 100644 --- a/tensorflow_serving/g3doc/docker.md +++ b/tensorflow_serving/g3doc/docker.md @@ -32,19 +32,112 @@ See the Docker Hub [tensorflow/serving repo](http://hub.docker.com/r/tensorflow/serving/tags/) for other versions of images you can pull. +### Running a serving image + +The serving images (both CPU and GPU) have the following properties: + +* Port 8500 exposed for gRPC +* Port 8501 exposed for the REST API +* Optional environment variable `MODEL_NAME` (defaults to `model`) +* Optional environment variable `MODEL_BASE_PATH` (defaults to `/models`) + +When the serving image runs ModelServer, it runs it as follows: + +```shell +tensorflow_model_server --port=8500 --rest_api_port=8501 \ + --model_name=${MODEL_NAME} --model_base_path=${MODEL_BASE_PATH}/${MODEL_NAME} +``` + +To serve with Docker, you'll need: + +* An open port on your host to serve on +* A SavedModel to serve +* A name for your model that your client will refer to + +What you'll do is +[run the Docker](https://docs.docker.com/engine/reference/run/) container, +[publish](https://docs.docker.com/engine/reference/commandline/run/#publish-or-expose-port--p---expose) +the container's ports to your host's ports, and mounting your host's path to the +SavedModel to where the container expects models. + +Let's look at an example: + +```shell +docker run -p 8501:8501 \ + --mount type=bind,source=/path/to/my_model/,target=/models/my_model \ + -e MODEL_NAME=my_model -t tensorflow/serving +``` + +In this case, we've started a Docker container, published the REST API port 8501 +to our host's port 8501, and taken a model we named `my_model` and bound it to +the default model base path (`${MODEL_BASE_PATH}/${MODEL_NAME}` = +`/models/my_model`). Finally, we've filled in the environment variable +`MODEL_NAME` with `my_model`, and left `MODEL_BASE_PATH` to its default value. + +This will run in the container: + +```shell +tensorflow_model_server --port=8500 --rest_api_port=8501 \ + --model_name=my_model --model_base_path=/models/my_model +``` + +If we wanted to publish the gRPC port, we would use `-p 8500:8500`. You can have +both gRPC and REST API ports open at the same time, or choose to only open one +or the other. + +### Creating your own serving image + +If you want a serving image that has your model built into the container, you +can create your own image. + +First run a serving image as a daemon: + +```shell +docker run -d --name serving_base tensorflow/serving +``` + +Next, copy your SavedModel to the container's model folder: + +```shell +docker cp models/ serving_base:/models/ +``` + +Finally, commit the container that's serving your model by changing `MODEL_NAME` +to match your model's name `': + +```shell +docker commit --change "ENV MODEL_NAME " serving_base +``` + +You can now stop `serving_base` + +```shell +docker kill serving_base +``` + +This will leave you with a Docker image called `` that you can +deploy and will load your model for serving on startup. + ### Serving example -Once you have pulled the serving image, you can try serving an example model. +Let's run through a full example where we load a SavedModel and call it via the +REST API. First pull the serving image: + +```shell +docker pull tensorflow/serving +``` + +This will pull the latest TensorFlow Serving image with ModelServer installed. -We will use a toy model called `Half Plus Two`, which generates `0.5 * x + 2` -for the values of `x` we provide for prediction. +Next, we will use a toy model called `Half Plus Two`, which generates `0.5 * x + +2` for the values of `x` we provide for prediction. To get this model, first clone the TensorFlow Serving repo. ```shell mkdir -p /tmp/tfserving cd /tmp/tfserving -git clone --depth=1 https://github.com/tensorflow/serving +git clone https://github.com/tensorflow/serving ``` Next, run the TensorFlow Serving container pointing it to this model and opening @@ -52,10 +145,10 @@ the REST API port (8501): ```shell docker run -p 8501:8501 \ ---mount type=bind,\ -source=/tmp/tfserving/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu,\ -target=/models/half_plus_two \ --e MODEL_NAME=half_plus_two -t tensorflow/serving & + --mount type=bind,\ + source=/tmp/tfserving/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu,\ + target=/models/half_plus_two \ + -e MODEL_NAME=half_plus_two -t tensorflow/serving & ``` This will run the docker container and launch the TensorFlow Serving Model @@ -63,13 +156,11 @@ Server, bind the REST API port 8501, and map our desired model from our host to where models are expected in the container. We also pass the name of the model as an environment variable, which will be important when we query the model. -Note that if you wanted to use the gRPC API, you should instead bind to port -8500. - To query the model using the predict API, you can run ```shell -curl -d '{"instances": [1.0, 2.0, 5.0]}' -X POST http://localhost:8501/v1/models/half_plus_two:predict +curl -d '{"instances": [1.0, 2.0, 5.0]}' \ + -X POST http://localhost:8501/v1/models/half_plus_two:predict ``` NOTE: Older versions of Windows and other systems without curl can download it @@ -94,37 +185,36 @@ Before serving with a GPU, in addition to * `nvidia-docker`: You can follow the [installation instructions here](https://github.com/NVIDIA/nvidia-docker#quick-start) -### Pulling a GPU serving image +### Running a GPU serving image -Once you have `nvidia-docker` installed, you can pull the latest TensorFlow -Serving GPU docker image by running: +Running a GPU serving image is identical to running a CPU image. For more +details, see [running a serving image](#running-a-serving-image). -```shell -docker pull tensorflow/serving:latest-gpu -``` +### GPU Serving example -This will pull down an minimal Docker image with TensorFlow Serving built for -running on GPUs installed. +Let's run through a full example where we load a model with GPU-bound ops and +call it via the REST API. -See the Docker Hub -[tensorflow/serving repo](http://hub.docker.com/r/tensorflow/serving/tags/) for -other versions of images you can pull. +First install [`nvidia-docker`](#install-nvidia-docker). Next you can pull the +latest TensorFlow Serving GPU docker image by running: -### GPU Serving example +```shell +docker pull tensorflow/serving:latest-gpu +``` -Once you have pulled the GPU serving image, you can try serving an example -model. +This will pull down an minimal Docker image with ModelServer built for running +on GPUs installed. -We will use a toy model called `Half Plus Two`, which generates `0.5 * x + 2` -for the values of `x` we provide for prediction. This model will have ops bound -to the GPU device, and will not run on the CPU. +Next, we will use a toy model called `Half Plus Two`, which generates `0.5 * x + +2` for the values of `x` we provide for prediction. This model will have ops +bound to the GPU device, and will not run on the CPU. To get this model, first clone the TensorFlow Serving repo. ```shell mkdir -p /tmp/tfserving cd /tmp/tfserving -git clone --depth=1 https://github.com/tensorflow/serving +git clone https://github.com/tensorflow/serving ``` Next, run the TensorFlow Serving container pointing it to this model and opening @@ -132,17 +222,17 @@ the REST API port (8501): ```shell docker run --runtime=nvidia -p 8501:8501 \ ---mount type=bind,\ -source=/tmp/tfserving/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_gpu,\ -target=/models/half_plus_two \ --e MODEL_NAME=half_plus_two -t tensorflow/serving:latest-gpu & + --mount type=bind,\ + source=/tmp/tfserving/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_gpu,\ + target=/models/half_plus_two \ + -e MODEL_NAME=half_plus_two -t tensorflow/serving:latest-gpu & ``` -This will run the docker container with the GPU build and launch the TensorFlow -Serving Model Server, bind the REST API port 8501, and map our desired model -from our host to where models are expected in the container. We also pass the -name of the model as an environment variable, which will be important when we -query the model. +This will run the docker container with the `nvidia-docker` runtime, launch the +TensorFlow Serving Model Server, bind the REST API port 8501, and map our +desired model from our host to where models are expected in the container. We +also pass the name of the model as an environment variable, which will be +important when we query the model. TIP: Before querying the model, be sure to wait till you see a message like the following, indicating that the server is ready to receive requests: @@ -155,7 +245,8 @@ Exporting HTTP/REST API at:localhost:8501 ... To query the model using the predict API, you can run ```shell -$ curl -d '{"instances": [1.0, 2.0, 5.0]}' -X POST http://localhost:8501/v1/models/half_plus_three:predict +$ curl -d '{"instances": [1.0, 2.0, 5.0]}' \ + -X POST http://localhost:8501/v1/models/half_plus_three:predict ``` NOTE: Older versions of Windows and other systems without curl can download it @@ -212,6 +303,7 @@ docker run -it -p 8500:8500 tensorflow/serving:latest-devel To test a model, from inside the container try: ```shell +# build the exporter bazel build -c opt //tensorflow_serving/example:mnist_saved_model # train the mnist model bazel-bin/tensorflow_serving/example/mnist_saved_model /tmp/mnist_model diff --git a/tensorflow_serving/g3doc/serving_inception.md b/tensorflow_serving/g3doc/serving_inception.md index 5c9056a13b6..5d662190543 100644 --- a/tensorflow_serving/g3doc/serving_inception.md +++ b/tensorflow_serving/g3doc/serving_inception.md @@ -96,7 +96,7 @@ Now we want to take a serving image and [commit](https://docs.docker.com/engine/reference/commandline/commit/) all changes to a new image `$USER/inception_serving` for Kubernetes deployment. -First we run a serving image, but change the entry point to just run `bash`: +First we run a serving image as a daemon: ```shell docker run -d --name serving_base tensorflow/serving From 7453a6181a09b0e5bfee7e9598340dd15ee67573 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 16 Aug 2018 22:03:31 -0700 Subject: [PATCH 0689/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209101710 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 70c574a8e5e..8adda273d96 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "30a432623b6da8b5558404f0f0e3d48ec03006b3e71bcb88548e754f95fe9f7c", - git_commit = "3e96a135d9650c91e307d1d56c81e5a37078cada", + sha256 = "eaca6f569c255614e8991a53c00dbf65b164103e3ca9222573630d19a01b3262", + git_commit = "439d8c4809139b163853fe87e8c5cdaba5d832eb", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 49b19ef9d8ec29c00e3a39f9537acdc2214e5d58 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 17 Aug 2018 00:02:37 -0700 Subject: [PATCH 0690/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209109199 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8adda273d96..67adb3b27f9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eaca6f569c255614e8991a53c00dbf65b164103e3ca9222573630d19a01b3262", - git_commit = "439d8c4809139b163853fe87e8c5cdaba5d832eb", + sha256 = "c5f3b583ddf78cc410f189cec367d1720e6c7c06f4fc3eb0661413ef91c1b92d", + git_commit = "7e9286a92e244f9cd2e351421c1a639fc57f19f1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8e38e0b9c1428e1d0691cadc79e81bdd0ec3ecca Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 17 Aug 2018 01:00:47 -0700 Subject: [PATCH 0691/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209114093 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 67adb3b27f9..222e2bf650e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c5f3b583ddf78cc410f189cec367d1720e6c7c06f4fc3eb0661413ef91c1b92d", - git_commit = "7e9286a92e244f9cd2e351421c1a639fc57f19f1", + sha256 = "acfd9503378a47f8b7796377cbac3330aa13fc1d2ee453807b13028d11d59247", + git_commit = "467ab9d9c6081cebbd47d3978dac956b5b575b96", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 10fd0fa6d32728451f431d59f8dfb64965a50603 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 17 Aug 2018 04:02:38 -0700 Subject: [PATCH 0692/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209130332 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 222e2bf650e..f6704d228a7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "acfd9503378a47f8b7796377cbac3330aa13fc1d2ee453807b13028d11d59247", - git_commit = "467ab9d9c6081cebbd47d3978dac956b5b575b96", + sha256 = "222ce46ae296c701aeb1651aef8e22968ac9e806aaf2a9eef1c05186cf2f63cc", + git_commit = "fa90b3f9173ef315f98416c52a74fc669de60454", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1fcd2de0b04e5645b14a755af35d29111d156fbf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 17 Aug 2018 06:02:44 -0700 Subject: [PATCH 0693/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209138683 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f6704d228a7..12dd66ad54f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "222ce46ae296c701aeb1651aef8e22968ac9e806aaf2a9eef1c05186cf2f63cc", - git_commit = "fa90b3f9173ef315f98416c52a74fc669de60454", + sha256 = "493cbfb31c11bee0746fc2679b45582124280ae1425204b7d77e6dd52644b2be", + git_commit = "97ad4337bcadba3e8fb025906a2a46ea0224e457", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1b738ee170eb501089158d8d99b67151907eeba3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 17 Aug 2018 10:04:03 -0700 Subject: [PATCH 0694/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209164671 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 12dd66ad54f..94bec648b56 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "493cbfb31c11bee0746fc2679b45582124280ae1425204b7d77e6dd52644b2be", - git_commit = "97ad4337bcadba3e8fb025906a2a46ea0224e457", + sha256 = "c72df4e36bbbc8936b778c73269ae0f4673f45a3c5f5493341deede04f969e77", + git_commit = "74c0381978748b3704da43288bb1169d532221b1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 701d5adeb9c635f95520fa9f00eaa68500566a3a Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Fri, 17 Aug 2018 10:12:45 -0700 Subject: [PATCH 0695/8103] Update docker serving image to include ca-certificates Fixes #1022 PiperOrigin-RevId: 209165998 --- tensorflow_serving/tools/docker/Dockerfile | 6 ++++++ tensorflow_serving/tools/docker/Dockerfile.devel | 3 ++- tensorflow_serving/tools/docker/Dockerfile.devel-gpu | 1 + tensorflow_serving/tools/docker/Dockerfile.gpu | 1 + 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile b/tensorflow_serving/tools/docker/Dockerfile index f97c510f620..f2ee814d577 100644 --- a/tensorflow_serving/tools/docker/Dockerfile +++ b/tensorflow_serving/tools/docker/Dockerfile @@ -25,6 +25,12 @@ LABEL maintainer="gvasudevan@google.com" LABEL tensorflow_serving_github_branchtag=${TF_SERVING_VERSION_GIT_BRANCH} LABEL tensorflow_serving_github_commit=${TF_SERVING_VERSION_GIT_COMMIT} +RUN apt-get update && apt-get install -y --no-install-recommends \ + ca-certificates \ + && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + # Install TF Serving pkg COPY --from=build_image /usr/local/bin/tensorflow_model_server /usr/bin/tensorflow_model_server diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index ee09daa58ce..b2a81565054 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -20,9 +20,10 @@ LABEL maintainer=gvasudevan@google.com LABEL tensorflow_serving_github_branchtag=${TF_SERVING_VERSION_GIT_BRANCH} LABEL tensorflow_serving_github_commit=${TF_SERVING_VERSION_GIT_COMMIT} -RUN apt-get update && apt-get install -y \ +RUN apt-get update && apt-get install -y --no-install-recommends \ automake \ build-essential \ + ca-certificates \ curl \ git \ libcurl3-dev \ diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index c87c88f6f8a..78752610730 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -26,6 +26,7 @@ ENV CUDNN_VERSION=7.1.4.18 RUN apt-get update && apt-get install -y --no-install-recommends \ automake \ build-essential \ + ca-certificates \ cuda-command-line-tools-9-0 \ cuda-cublas-dev-9-0 \ cuda-cudart-dev-9-0 \ diff --git a/tensorflow_serving/tools/docker/Dockerfile.gpu b/tensorflow_serving/tools/docker/Dockerfile.gpu index 2d2a018a123..51356f959ea 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.gpu @@ -27,6 +27,7 @@ LABEL tensorflow_serving_github_commit=${TF_SERVING_VERSION_GIT_COMMIT} RUN apt-get update && apt-get install -y --no-install-recommends \ libgomp1 \ + ca-certificates \ && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* From 8b6d5306f7bbcd3026b54db23b83cf47e95d7357 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 17 Aug 2018 12:02:45 -0700 Subject: [PATCH 0696/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209185330 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 94bec648b56..7593372689f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c72df4e36bbbc8936b778c73269ae0f4673f45a3c5f5493341deede04f969e77", - git_commit = "74c0381978748b3704da43288bb1169d532221b1", + sha256 = "47581b55a38eb3085ae2980cc0aadef23d1688d87c4e38267568dbb215661aed", + git_commit = "fe48d9189c74e05be21e928a445a006bcd4a13f8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1fff82b9a801c88c00ff4eb2a350759396ad26ca Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Fri, 17 Aug 2018 12:15:39 -0700 Subject: [PATCH 0697/8103] Fix typos PiperOrigin-RevId: 209187379 --- tensorflow_serving/g3doc/serving_inception.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/g3doc/serving_inception.md b/tensorflow_serving/g3doc/serving_inception.md index 5d662190543..06013268f79 100644 --- a/tensorflow_serving/g3doc/serving_inception.md +++ b/tensorflow_serving/g3doc/serving_inception.md @@ -13,9 +13,9 @@ To learn more about TensorFlow Inception model, we recommend - [Part 1](#part_1_export_the_inception_model) shows how to export the Inception model -- [Part 1](#part_2_run_in_local_docker_container) shows how to run the local +- [Part 2](#part_2_run_in_local_docker_container) shows how to run the local Docker serving image -- [Part 2](#part_2_deploy_in_kubernetes) shows how to deploy in Kubernetes. +- [Part 3](#part_3_deploy_in_kubernetes) shows how to deploy in Kubernetes. ## Part 1: Export the Inception model From a52e8181144a5d6acc96b3d57328c7f49f113ea9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 17 Aug 2018 13:09:17 -0700 Subject: [PATCH 0698/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209194838 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7593372689f..7f233554984 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "47581b55a38eb3085ae2980cc0aadef23d1688d87c4e38267568dbb215661aed", - git_commit = "fe48d9189c74e05be21e928a445a006bcd4a13f8", + sha256 = "ec87ee873fb6990c65a2f8addf7ecd03009f802928ef59e81417c29726c3b64b", + git_commit = "fe12159e60258d0b6cae9b580e248b22e80f3f7b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 87e32bb386f156fe208df633c1a7f489b57464e1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 17 Aug 2018 15:00:37 -0700 Subject: [PATCH 0699/8103] Fix the reference to the old file name. PiperOrigin-RevId: 209212508 --- tensorflow_serving/example/mnist_saved_model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/example/mnist_saved_model.py b/tensorflow_serving/example/mnist_saved_model.py index 4397d38ae8f..c554f55a0e3 100644 --- a/tensorflow_serving/example/mnist_saved_model.py +++ b/tensorflow_serving/example/mnist_saved_model.py @@ -45,7 +45,7 @@ def main(_): if len(sys.argv) < 2 or sys.argv[-1].startswith('-'): - print('Usage: mnist_export.py [--training_iteration=x] ' + print('Usage: mnist_saved_model.py [--training_iteration=x] ' '[--model_version=y] export_dir') sys.exit(-1) if FLAGS.training_iteration <= 0: From 946ddbdb9bb6008414fb4ad4b3ae1c42f4c3c1c3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 17 Aug 2018 15:02:36 -0700 Subject: [PATCH 0700/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209212799 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7f233554984..5a1c38e247c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ec87ee873fb6990c65a2f8addf7ecd03009f802928ef59e81417c29726c3b64b", - git_commit = "fe12159e60258d0b6cae9b580e248b22e80f3f7b", + sha256 = "91af0fdd058c36329e4546a6f3811bc9839c287cc71b2f49e22d704f05d51d16", + git_commit = "3aed7858222043ca16d177b50d949a9fc3447ba1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 89860ffea812d73860d87e37b04f4e5de56d5137 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 17 Aug 2018 16:03:07 -0700 Subject: [PATCH 0701/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209221439 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5a1c38e247c..4901fc784ec 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "91af0fdd058c36329e4546a6f3811bc9839c287cc71b2f49e22d704f05d51d16", - git_commit = "3aed7858222043ca16d177b50d949a9fc3447ba1", + sha256 = "e5dd238887274534387e4840003a2f6d23dcc0540ef80e1e13ff1951197c537f", + git_commit = "e2a0700bbf90f0738e43fbc29ec758adc364347c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 95c3d9a6305f685d0c5fd2337486fc7f5ae70f28 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 17 Aug 2018 17:05:09 -0700 Subject: [PATCH 0702/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209229489 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4901fc784ec..8c60eaaaa69 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e5dd238887274534387e4840003a2f6d23dcc0540ef80e1e13ff1951197c537f", - git_commit = "e2a0700bbf90f0738e43fbc29ec758adc364347c", + sha256 = "952ab0332bbfc9a01894baac085273f4240a222cfb0a01840a34e68311b0906c", + git_commit = "32e6e608f6329fda19f9eec560a634725303a749", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ff90f6af5e516aa541dd3af085c6b027027a18ef Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 17 Aug 2018 18:03:36 -0700 Subject: [PATCH 0703/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209234879 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8c60eaaaa69..a8759b89a4e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "952ab0332bbfc9a01894baac085273f4240a222cfb0a01840a34e68311b0906c", - git_commit = "32e6e608f6329fda19f9eec560a634725303a749", + sha256 = "4428c997a8af7d8c3e144b78034c6b13f87830b4ddbe4e0f5b7f66140ab76aa8", + git_commit = "e6970f5560de8277fe2ca212d703bc08a3494860", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3fe2a39c7fa5ee2a6595cef3e505d3fed164fa2d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 17 Aug 2018 19:02:43 -0700 Subject: [PATCH 0704/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209238558 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a8759b89a4e..daa84fc4c49 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4428c997a8af7d8c3e144b78034c6b13f87830b4ddbe4e0f5b7f66140ab76aa8", - git_commit = "e6970f5560de8277fe2ca212d703bc08a3494860", + sha256 = "7543db0f446cf1eaf7854e6a3ff411413b5ef9e6318cfb9e7a24d356272bd10f", + git_commit = "fd1957d8f6ed223bdc424f0bfbe6bab01a43c828", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 047734413c6acde585b5b96f02cd6a3562466b99 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 17 Aug 2018 21:01:23 -0700 Subject: [PATCH 0705/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209244752 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index daa84fc4c49..b86a25d62cc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7543db0f446cf1eaf7854e6a3ff411413b5ef9e6318cfb9e7a24d356272bd10f", - git_commit = "fd1957d8f6ed223bdc424f0bfbe6bab01a43c828", + sha256 = "0888001325ce506e2bbd5ba5a1791f6eb9dcaa8b62774c4eea7d79cc82f71e24", + git_commit = "b7c242475c3d6e38ae864ae06f937c1b29c0a494", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 66fb737ab66e416cf0ff61ee7309f724365d710a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 18 Aug 2018 00:01:44 -0700 Subject: [PATCH 0706/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209252876 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b86a25d62cc..9c934553b8c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0888001325ce506e2bbd5ba5a1791f6eb9dcaa8b62774c4eea7d79cc82f71e24", - git_commit = "b7c242475c3d6e38ae864ae06f937c1b29c0a494", + sha256 = "ba7ac0982922e3e835474741449485a6b555c2f53d4dae007e7e3f3fe4d428fd", + git_commit = "39b17f9d56d6b9a02a30bfa24ac9e15ab37ca761", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9133d09cfc7612524017cbc1ac604cb092480295 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 18 Aug 2018 01:05:22 -0700 Subject: [PATCH 0707/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209256393 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9c934553b8c..8f62bec2395 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ba7ac0982922e3e835474741449485a6b555c2f53d4dae007e7e3f3fe4d428fd", - git_commit = "39b17f9d56d6b9a02a30bfa24ac9e15ab37ca761", + sha256 = "3f9c4369e25ec17ec3efb1e788702fa546e31e01862655c25d037f2f3b55c9b0", + git_commit = "115f66386f3662a6f10aceaefb2faf12543826b3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 31a3a735d28be44dcf32f426b1d42a30d2f681cd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 18 Aug 2018 03:01:24 -0700 Subject: [PATCH 0708/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209263314 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8f62bec2395..9de1acd461e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3f9c4369e25ec17ec3efb1e788702fa546e31e01862655c25d037f2f3b55c9b0", - git_commit = "115f66386f3662a6f10aceaefb2faf12543826b3", + sha256 = "3eb3f02a3c18c372477fb693cdb965a82883e88402800524405ea70b8bb21dba", + git_commit = "1340ed99328939f7a8744249b975b06be10f326b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From eb871e9928bd4848e67657af6999c627510ce027 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 18 Aug 2018 04:01:17 -0700 Subject: [PATCH 0709/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209265561 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9de1acd461e..096914403f0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3eb3f02a3c18c372477fb693cdb965a82883e88402800524405ea70b8bb21dba", - git_commit = "1340ed99328939f7a8744249b975b06be10f326b", + sha256 = "9f7edb9ba85640ff31c22cd958446403e3d7ca410e17491d21393a7c8c3b2df1", + git_commit = "a6d62ffea3526457defffaeefa818f944a6fabd0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a570baa6030487dfa6b77637ffd80a41e6a741e2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 18 Aug 2018 13:01:29 -0700 Subject: [PATCH 0710/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209285595 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 096914403f0..6b9057e1b4e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9f7edb9ba85640ff31c22cd958446403e3d7ca410e17491d21393a7c8c3b2df1", - git_commit = "a6d62ffea3526457defffaeefa818f944a6fabd0", + sha256 = "06f8d31640e964d63b8f52392b39dac2a29f8a26f56efb51e9ef0d9afa3667a0", + git_commit = "5b63ee85acc0676a35252c50014a178b55aabaa4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 305b0db596bedea354cafbe00ad1670f734fc182 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 18 Aug 2018 15:01:09 -0700 Subject: [PATCH 0711/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209289986 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6b9057e1b4e..33680053bea 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "06f8d31640e964d63b8f52392b39dac2a29f8a26f56efb51e9ef0d9afa3667a0", - git_commit = "5b63ee85acc0676a35252c50014a178b55aabaa4", + sha256 = "b9dc83cd0cc528d087dcf53529bf7728c07dfe51c8ae201b95558781cf56fad3", + git_commit = "424ce99f4357515f0f9e57b7a087194cf46134d6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 46984414244af1fa67b23b837b70a9ed74ea9cee Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 18 Aug 2018 21:01:12 -0700 Subject: [PATCH 0712/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209302666 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 33680053bea..ba4c257cec3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b9dc83cd0cc528d087dcf53529bf7728c07dfe51c8ae201b95558781cf56fad3", - git_commit = "424ce99f4357515f0f9e57b7a087194cf46134d6", + sha256 = "f607444403877fb9ff5b54e0b25db1a31107f18ae948b1fc260ef64a137285a0", + git_commit = "51100a8de57ef53e36a8a9f5a9829cbd33fbed04", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b9d09c4905c718026a27135f95f6d058f6d9c65a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 19 Aug 2018 02:01:17 -0700 Subject: [PATCH 0713/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209315060 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ba4c257cec3..3cc69a3e7da 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f607444403877fb9ff5b54e0b25db1a31107f18ae948b1fc260ef64a137285a0", - git_commit = "51100a8de57ef53e36a8a9f5a9829cbd33fbed04", + sha256 = "93edfc1280a0a60d20aadec5e3ab506faf2d1e61ab42fa2155bc4231bd5c5ebb", + git_commit = "47c368bcc8d717ec6624d33152784338b99f6dea", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b2a2ce9d2ed80256c255861bc667a4e4262cc7b6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 19 Aug 2018 04:01:22 -0700 Subject: [PATCH 0714/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209319809 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3cc69a3e7da..cd1c455f315 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "93edfc1280a0a60d20aadec5e3ab506faf2d1e61ab42fa2155bc4231bd5c5ebb", - git_commit = "47c368bcc8d717ec6624d33152784338b99f6dea", + sha256 = "c6b9567fc9aa5a7e00b658db0823e8ec69a17988d56b3c2c6e91148cc2b80869", + git_commit = "36554abcb58bb673153e585a5995ccf9674f31c9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7a12726feab6ac977bdc5b5c75d075e9fd46017e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 Aug 2018 04:01:12 -0700 Subject: [PATCH 0715/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209393642 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cd1c455f315..5a277ec900c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c6b9567fc9aa5a7e00b658db0823e8ec69a17988d56b3c2c6e91148cc2b80869", - git_commit = "36554abcb58bb673153e585a5995ccf9674f31c9", + sha256 = "9aad0e67463acc25571eae852fbd0288ee80b10836d83b7850e3b10d0d13b483", + git_commit = "8c111ec9196836617cc93dfeff0567ca37e81eeb", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3f6285d226420f6abdf1edbf4c333c86ffac4b4b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 Aug 2018 07:01:21 -0700 Subject: [PATCH 0716/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209410842 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5a277ec900c..642210da9b5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9aad0e67463acc25571eae852fbd0288ee80b10836d83b7850e3b10d0d13b483", - git_commit = "8c111ec9196836617cc93dfeff0567ca37e81eeb", + sha256 = "6bec9b95459ab0a2051428d12b4a4a8f575f0d3830413246fd31d2f3c230be4e", + git_commit = "94b1f7a8bcdffcafa196f58df6c3714492729696", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e349b43d767aaee27a72619caef25fd4affd0a75 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 Aug 2018 09:01:43 -0700 Subject: [PATCH 0717/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209426726 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 642210da9b5..b69f195656a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6bec9b95459ab0a2051428d12b4a4a8f575f0d3830413246fd31d2f3c230be4e", - git_commit = "94b1f7a8bcdffcafa196f58df6c3714492729696", + sha256 = "c7aeeb91ae4cfac39f739e97a062685e11fdf73dade0a3e1ce465692277d518d", + git_commit = "f32afcd244beb255060c3d489f117289a3496efc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 063c334a98a5af4bfb7072a0e69e15c9b39bce43 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 Aug 2018 10:01:23 -0700 Subject: [PATCH 0718/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209435699 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b69f195656a..a149816fd13 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c7aeeb91ae4cfac39f739e97a062685e11fdf73dade0a3e1ce465692277d518d", - git_commit = "f32afcd244beb255060c3d489f117289a3496efc", + sha256 = "876f4dc67fb48e233029744ce871d6e68b39db49640eee54041d4e1b96c849ab", + git_commit = "c7d36f4fb2e074f76c7a5869d96b9067bead6909", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1f22a5e4440f9ec60e7ad3f5f72a4778dbe4e426 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Mon, 20 Aug 2018 10:29:11 -0700 Subject: [PATCH 0719/8103] Add unzip to devel package PiperOrigin-RevId: 209441638 --- tensorflow_serving/tools/docker/Dockerfile.devel | 1 + 1 file changed, 1 insertion(+) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index b2a81565054..334c8233642 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -38,6 +38,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ python-dev \ software-properties-common \ swig \ + unzip \ wget \ zip \ zlib1g-dev \ From 6e25209d4cb6e0b8c0693c0940c5e4e8241e4a26 Mon Sep 17 00:00:00 2001 From: olston Date: Mon, 20 Aug 2018 10:30:07 -0700 Subject: [PATCH 0720/8103] Correct half_plus_two -> half_plus_three in docker.md. PiperOrigin-RevId: 209441832 --- tensorflow_serving/g3doc/docker.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/g3doc/docker.md b/tensorflow_serving/g3doc/docker.md index e7b554b8bda..e5ab7b6ad17 100644 --- a/tensorflow_serving/g3doc/docker.md +++ b/tensorflow_serving/g3doc/docker.md @@ -246,7 +246,7 @@ To query the model using the predict API, you can run ```shell $ curl -d '{"instances": [1.0, 2.0, 5.0]}' \ - -X POST http://localhost:8501/v1/models/half_plus_three:predict + -X POST http://localhost:8501/v1/models/half_plus_two:predict ``` NOTE: Older versions of Windows and other systems without curl can download it From 928c5f19708275b4dd0c2e4f6e3f670bde1929f4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 Aug 2018 11:01:14 -0700 Subject: [PATCH 0721/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209448213 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a149816fd13..3629c4fb793 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "876f4dc67fb48e233029744ce871d6e68b39db49640eee54041d4e1b96c849ab", - git_commit = "c7d36f4fb2e074f76c7a5869d96b9067bead6909", + sha256 = "fd6b6ebd91629f753bd07263526e27237cf2257ec4bfffa771801073c52e0534", + git_commit = "82a0d16be35eda128792b2aacca938fc459dee43", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b3531270d2a7eea4aeb3167184eebce77f2af3bb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 Aug 2018 12:01:03 -0700 Subject: [PATCH 0722/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209459701 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3629c4fb793..466fe24788a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fd6b6ebd91629f753bd07263526e27237cf2257ec4bfffa771801073c52e0534", - git_commit = "82a0d16be35eda128792b2aacca938fc459dee43", + sha256 = "c21d51632e1eaa0cf9d1c5b7f3896fae2970ed615c84e754b20b0216628fd908", + git_commit = "ab15e1eb4e974cf4c37a8e75547bf49b26c9d85d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7bafd9c0ef8879c86def2de0bedc17dbed4a3102 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 Aug 2018 13:01:55 -0700 Subject: [PATCH 0723/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209469391 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 466fe24788a..99a520a0887 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c21d51632e1eaa0cf9d1c5b7f3896fae2970ed615c84e754b20b0216628fd908", - git_commit = "ab15e1eb4e974cf4c37a8e75547bf49b26c9d85d", + sha256 = "63af3f24a372206533f73cb08e8e9a32dcf8a90d77b22daf84993ec6d675a3f9", + git_commit = "1a6d7f5acd50ed23c38f14e11e563f771a596656", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6122d0c22726288f3d5e08fab90c90bc772f2b42 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Mon, 20 Aug 2018 13:21:47 -0700 Subject: [PATCH 0724/8103] Default development Dockerfiles to produce a more optimized ModelServer PiperOrigin-RevId: 209472456 --- tensorflow_serving/g3doc/docker.md | 71 +++++++++++++++++++ .../tools/docker/Dockerfile.devel | 4 +- .../tools/docker/Dockerfile.devel-gpu | 5 +- 3 files changed, 78 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/g3doc/docker.md b/tensorflow_serving/g3doc/docker.md index e5ab7b6ad17..03addd7e39b 100644 --- a/tensorflow_serving/g3doc/docker.md +++ b/tensorflow_serving/g3doc/docker.md @@ -395,3 +395,74 @@ TIP: If you're running a GPU image, be sure to run using the NVIDIA runtime From here, you can follow the instructions for [testing a development environment](#testing-the-development-environment). + +### Building an optimized serving binary + +When running TensorFlow Serving's ModelServer, you may notice a log message that +looks like this: + +```console +I external/org_tensorflow/tensorflow/core/platform/cpu_feature_guard.cc:141] +Your CPU supports instructions that this TensorFlow binary was not compiled to +use: AVX2 FMA +``` + +This indicates that your ModelServer binary isn't fully optimized for the CPU +its running on. Depending on the model you are serving, further optimizations +may not be necessary. However, building an optimized binary is straight-forward. + +When building a Docker image from the provided `Dockerfile.devel` or +`Dockerfile.devel-gpu` files, the ModelServer binary will be built with the flag +`-march=native`. This will cause Bazel to build a ModelServer binary with all of +the CPU optimizations the host you're building the Docker image on supports. + +To create a serving image that's fully optimized for your host, simply: + +1. Clone the TensorFlow Serving project + + ```shell + git clone https://github.com/tensorflow/serving + cd serving + ``` + +2. Build an image with an optimized ModelServer + + * For CPU: + + ```shell + docker build --pull -t $USER/tensorflow-serving-devel \ + -f tools/docker/Dockerfile.devel . + ``` + + * For GPU: ` + + ```shell + docker build --pull -t $USER/tensorflow-serving-devel-gpu \ + -f tools/docker/Dockerfile.devel-gpu . + ``` + +3. Build a serving image with the development image as a base + + * For CPU: + + ```shell + docker build -t $USER/tensorflow-serving \ + --build-arg TF_SERVING_BUILD_IMAGE=$USER/tensorflow-serving-devel \ + -f tools/docker/Dockerfile . + ``` + + Your new optimized Docker image is now `$USER/tensorflow-serving`, which + you can [use](#running-a-serving-image) just as you would the standard + `tensorflow/serving:latest` image. + + * For GPU: + + ```shell + docker build -t $USER/tensorflow-serving-gpu \ + --build-arg TF_SERVING_BUILD_IMAGE=$USER/tensorflow-serving-devel-gpu \ + -f tools/docker/Dockerfile.gpu . + ``` + + Your new optimized Docker image is now `$USER/tensorflow-serving-gpu`, + which you can [use](#running-a-gpu-serving-image) just as you would the + standard `tensorflow/serving:latest-gpu` image. diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index 334c8233642..cf8e42f5fa7 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -80,8 +80,10 @@ RUN git clone --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tenso FROM base_build as binary_build # Build, and install TensorFlow Serving -ARG TF_SERVING_BUILD_OPTIONS="--copt=-mavx --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0" +ARG TF_SERVING_BUILD_OPTIONS="--copt=-march=native --host_copt=-march=native --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0" +RUN echo "Building with build options: ${TF_SERVING_BUILD_OPTIONS}" ARG TF_SERVING_BAZEL_OPTIONS="" +RUN echo "Building with Bazel options: ${TF_SERVING_BAZEL_OPTIONS}" RUN bazel build -c opt --color=yes --curses=yes \ ${TF_SERVING_BAZEL_OPTIONS} \ diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 78752610730..fd207eb2bb4 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -127,8 +127,11 @@ RUN git clone --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tenso FROM base_build as binary_build # Build, and install TensorFlow Serving -ARG TF_SERVING_BUILD_OPTIONS="--copt=-mavx --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0" +ARG TF_SERVING_BUILD_OPTIONS="--copt=-march=native --host_copt=-march=native --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0" +RUN echo "Building with build options: ${TF_SERVING_BUILD_OPTIONS}" ARG TF_SERVING_BAZEL_OPTIONS="" +RUN echo "Building with Bazel options: ${TF_SERVING_BAZEL_OPTIONS}" + RUN ln -s /usr/local/cuda/lib64/stubs/libcuda.so /usr/local/cuda/lib64/stubs/libcuda.so.1 && \ LD_LIBRARY_PATH=/usr/local/cuda/lib64/stubs:${LD_LIBRARY_PATH} \ bazel build -c opt --color=yes --curses=yes --config=cuda \ From 715942d586d4ab1bd86668280bd90f758ac053ad Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 Aug 2018 14:01:51 -0700 Subject: [PATCH 0725/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209479375 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 99a520a0887..c0fd78e9535 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "63af3f24a372206533f73cb08e8e9a32dcf8a90d77b22daf84993ec6d675a3f9", - git_commit = "1a6d7f5acd50ed23c38f14e11e563f771a596656", + sha256 = "69165300d416eadd14ccfbbd653baa97042211e88d768609055ea377dbefbfab", + git_commit = "600caf99897e82cd0db8665acca5e7630ec1a292", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 659788f4603debb8b1c43d6a8df3ecd0171998ae Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 Aug 2018 15:01:15 -0700 Subject: [PATCH 0726/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209490489 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c0fd78e9535..62e2b3eb2ca 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "69165300d416eadd14ccfbbd653baa97042211e88d768609055ea377dbefbfab", - git_commit = "600caf99897e82cd0db8665acca5e7630ec1a292", + sha256 = "a8eda758b9b3df15b9effb67dfe41a1f15c263d141be9b053c1b956e63d3f64e", + git_commit = "e8894bdcda6c7fb899939406ff4f320d2c59b208", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 569b55fd5865404651c241a90785158c89e41c8a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 Aug 2018 16:05:08 -0700 Subject: [PATCH 0727/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209502117 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 62e2b3eb2ca..0c94aec055c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a8eda758b9b3df15b9effb67dfe41a1f15c263d141be9b053c1b956e63d3f64e", - git_commit = "e8894bdcda6c7fb899939406ff4f320d2c59b208", + sha256 = "39d92d98819c1eb0e3cbc91e415fdc625a73d19e200db75d5f58b51e901c09a8", + git_commit = "135bd2714387eb5285fc9c621d9a8dc042d5f435", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5c3945bf4c56488680ea9dfadb2342756eff7966 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 Aug 2018 17:00:52 -0700 Subject: [PATCH 0728/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209510969 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0c94aec055c..8b04f3b072e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "39d92d98819c1eb0e3cbc91e415fdc625a73d19e200db75d5f58b51e901c09a8", - git_commit = "135bd2714387eb5285fc9c621d9a8dc042d5f435", + sha256 = "afbcbe6edcc1a0263c740492b8a5ea4d5d4b6ff18da98a793b9553090c2d8854", + git_commit = "0697105430de742c038b3101507cf0788a8434e4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7240368c6252019b03da8a8f75909081b5a42226 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 Aug 2018 18:01:22 -0700 Subject: [PATCH 0729/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209518990 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8b04f3b072e..25a57535bf8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "afbcbe6edcc1a0263c740492b8a5ea4d5d4b6ff18da98a793b9553090c2d8854", - git_commit = "0697105430de742c038b3101507cf0788a8434e4", + sha256 = "0fb43316c9ba6f8da399901cc29a81ebc9151811f82aaaabc9d56746b8052404", + git_commit = "a0e76ce73c5f095fc61e06c19ff8e653cfd2965c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 41e60bcf6b576de508294817ab29c04f5c23b697 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Mon, 20 Aug 2018 18:34:06 -0700 Subject: [PATCH 0730/8103] Update optimization flags recommendations PiperOrigin-RevId: 209522738 --- tensorflow_serving/g3doc/setup.md | 29 ++++++++++++------- .../tools/docker/Dockerfile.devel | 2 +- .../tools/docker/Dockerfile.devel-gpu | 2 +- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/tensorflow_serving/g3doc/setup.md b/tensorflow_serving/g3doc/setup.md index 68351234ca5..02014a6f2de 100644 --- a/tensorflow_serving/g3doc/setup.md +++ b/tensorflow_serving/g3doc/setup.md @@ -155,22 +155,31 @@ $ tools/bazel_in_docker.sh -d tensorflow/serving:1.10-devel \ ##### Optimized build It's possible to compile using some platform specific instruction sets (e.g. -AVX) that can significantly improve performance. Wherever you see 'bazel build' -in the documentation, you can add the flags `-c opt --copt=-msse4.1 ---copt=-msse4.2 --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-O3 ---cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0"` (or some subset of these flags). For -example: +AVX) that may significantly improve performance. Wherever you see 'bazel build' +in the documentation, simply add the flags you want. + +To optimize for all instruction sets your processor supports, you can use the +`--copt=-march=native` option. + +For example: ```shell -tools/bazel_in_docker.sh bazel build -c opt --copt=-msse4.1 --copt=-msse4.2 \ - --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-O3 \ +tools/bazel_in_docker.sh bazel build -c opt --copt=-march=native --copt=-O3 \ --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0" tensorflow_serving/... ``` +For specific instruction sets: + +Instruction Set | Flags +--------------- | ---------------- +AVX | `--copt=mavx` +AVX2 | `--copt=mavx2` +FMA | `--copt=mfma` +SSE 4.1 | `--copt=msse4.1` +SSE 4.2 | `--copt=msse4.2` + Note: These instruction sets are not available on all machines, especially with -older processors, so it may not work with all flags. You can try some subset of -them, or revert to just the basic '-c opt' which is guaranteed to work on all -machines. +older processors. Use `--copt=-march=native` if you're unsure what you need. ##### Building with GPU Support diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index cf8e42f5fa7..36f0fd5e81c 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -80,7 +80,7 @@ RUN git clone --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tenso FROM base_build as binary_build # Build, and install TensorFlow Serving -ARG TF_SERVING_BUILD_OPTIONS="--copt=-march=native --host_copt=-march=native --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0" +ARG TF_SERVING_BUILD_OPTIONS="--copt=-march=native --host_copt=-march=native --copt=-O3 --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0" RUN echo "Building with build options: ${TF_SERVING_BUILD_OPTIONS}" ARG TF_SERVING_BAZEL_OPTIONS="" RUN echo "Building with Bazel options: ${TF_SERVING_BAZEL_OPTIONS}" diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index fd207eb2bb4..b60367ef3be 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -127,7 +127,7 @@ RUN git clone --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tenso FROM base_build as binary_build # Build, and install TensorFlow Serving -ARG TF_SERVING_BUILD_OPTIONS="--copt=-march=native --host_copt=-march=native --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0" +ARG TF_SERVING_BUILD_OPTIONS="--copt=-march=native --host_copt=-march=native --copt=-O3 --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0" RUN echo "Building with build options: ${TF_SERVING_BUILD_OPTIONS}" ARG TF_SERVING_BAZEL_OPTIONS="" RUN echo "Building with Bazel options: ${TF_SERVING_BAZEL_OPTIONS}" From c69f5fc2639fc3965336d8d79a0fbdc84e159894 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 Aug 2018 19:06:02 -0700 Subject: [PATCH 0731/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209525370 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 25a57535bf8..0a0f2b87ea0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0fb43316c9ba6f8da399901cc29a81ebc9151811f82aaaabc9d56746b8052404", - git_commit = "a0e76ce73c5f095fc61e06c19ff8e653cfd2965c", + sha256 = "d4a93694c5cbf910cda771a438c37b0fd3480f008ed585c9c4db6d4016906f68", + git_commit = "c5f27df3a5375ae75657e28d5f598e98e9ab1cc7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 609515fde6abbada64d3b43650c4ab2fd0e2a84d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 Aug 2018 20:02:15 -0700 Subject: [PATCH 0732/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209529568 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0a0f2b87ea0..c0c2a2f7bea 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d4a93694c5cbf910cda771a438c37b0fd3480f008ed585c9c4db6d4016906f68", - git_commit = "c5f27df3a5375ae75657e28d5f598e98e9ab1cc7", + sha256 = "9b84726ebf32387831b55dc63c251f5e9e541c41ff6602da30a268a038036fad", + git_commit = "a2a561e7e8305734e75492be961b28197c07c261", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 934c547f6b77703f90d13b6368380453c098946c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 Aug 2018 21:02:23 -0700 Subject: [PATCH 0733/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209534560 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c0c2a2f7bea..ffe9eca539e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9b84726ebf32387831b55dc63c251f5e9e541c41ff6602da30a268a038036fad", - git_commit = "a2a561e7e8305734e75492be961b28197c07c261", + sha256 = "9d150f46df7763ba87af9f115d24330142070b4d1de2d0757632b1c80716a5c8", + git_commit = "49115abfd39d30506679d9fdc572ccd2f7c22dbe", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 08fbc57b98945df25f243382eca66ef29d9dc03d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 Aug 2018 22:01:08 -0700 Subject: [PATCH 0734/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209538855 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ffe9eca539e..8c490626487 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9d150f46df7763ba87af9f115d24330142070b4d1de2d0757632b1c80716a5c8", - git_commit = "49115abfd39d30506679d9fdc572ccd2f7c22dbe", + sha256 = "911bf840a91d833b304a38d5b74852e7399b327173d51dd86dccc49c3bff754e", + git_commit = "7de22654844a41575a30cd1ce3a522abd0516fde", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 45010962d664b633577ca9402a11a65dd09c5bf3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 Aug 2018 23:01:13 -0700 Subject: [PATCH 0735/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209543217 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8c490626487..bda4dd6e96f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "911bf840a91d833b304a38d5b74852e7399b327173d51dd86dccc49c3bff754e", - git_commit = "7de22654844a41575a30cd1ce3a522abd0516fde", + sha256 = "8d338fbb301afee04f8d685b96d78a7a30e8e193283fcc8cfd1ba75f71ab0516", + git_commit = "1fae2683be3ada987b8f487e96f62b4451df4393", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c35928810db3819d6f8f40be9c7de161c73109ae Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 Aug 2018 01:01:17 -0700 Subject: [PATCH 0736/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209553461 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bda4dd6e96f..fdd3f0bcb0f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8d338fbb301afee04f8d685b96d78a7a30e8e193283fcc8cfd1ba75f71ab0516", - git_commit = "1fae2683be3ada987b8f487e96f62b4451df4393", + sha256 = "c58af0e243684187ef28101e5a61c00d004ac99c5149fb1b3114bea7a4c0c7b4", + git_commit = "4a8d62a17657d3178990d8d19283a2de3828b0f5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e1bb847f7ab7b6e66c1d35d14dd3cd24f257f352 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 Aug 2018 02:01:20 -0700 Subject: [PATCH 0737/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209559952 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fdd3f0bcb0f..42ee60cfcf6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c58af0e243684187ef28101e5a61c00d004ac99c5149fb1b3114bea7a4c0c7b4", - git_commit = "4a8d62a17657d3178990d8d19283a2de3828b0f5", + sha256 = "6882237aa2decafd66805aa3df1c32e0c391ad045e710c1686129dc162140e45", + git_commit = "eaef34c40f2acba3e47b3d630325633a5391d36a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3925f861f9e5fe10bb63d689b1fc52ac01c34b58 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 Aug 2018 03:01:45 -0700 Subject: [PATCH 0738/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209567477 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 42ee60cfcf6..65bff241109 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6882237aa2decafd66805aa3df1c32e0c391ad045e710c1686129dc162140e45", - git_commit = "eaef34c40f2acba3e47b3d630325633a5391d36a", + sha256 = "422e940fc2132525a5c9e90aafefda12b1d55f7e87cb4a62c67a6dfd91aa221a", + git_commit = "8d0588485b243166e75fdb94ba2d1bb4f9778ad9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b1223bfafe327248a7d4fff71103fbb381d4fe5c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 Aug 2018 04:01:40 -0700 Subject: [PATCH 0739/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209572442 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 65bff241109..db1e36dc8e1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "422e940fc2132525a5c9e90aafefda12b1d55f7e87cb4a62c67a6dfd91aa221a", - git_commit = "8d0588485b243166e75fdb94ba2d1bb4f9778ad9", + sha256 = "1852e7bb31d95b7d01c6b2f6c0c30f95ab0555fb83399ddafb8f7811e91e9703", + git_commit = "fd833e87f150a8963de906593f0b0071cd962fcb", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 63e08dade13edd6d49fd405b1f8aa7f4edac8c6d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 Aug 2018 08:02:16 -0700 Subject: [PATCH 0740/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209595539 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index db1e36dc8e1..b8ee36e7b69 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1852e7bb31d95b7d01c6b2f6c0c30f95ab0555fb83399ddafb8f7811e91e9703", - git_commit = "fd833e87f150a8963de906593f0b0071cd962fcb", + sha256 = "a1ef29c4f0d3797aba8a7111032edd8560baf4b643729725d1e8ce51c9b3bb3b", + git_commit = "eac93feb41361045c246e6c86621ec9f362d8ef3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0f40550949c22e132cdf9be834ef35ccf73aadb3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 Aug 2018 09:00:31 -0700 Subject: [PATCH 0741/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209603479 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b8ee36e7b69..6b94f79f673 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a1ef29c4f0d3797aba8a7111032edd8560baf4b643729725d1e8ce51c9b3bb3b", - git_commit = "eac93feb41361045c246e6c86621ec9f362d8ef3", + sha256 = "b47949daba8153602d45386828aa59c17733114d52e29bc38151267ecff77407", + git_commit = "aeab291563b0b4cc75c0f5fc73610a6595780570", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fbc7fff99192e7a349c2eb2052bf67a055da0a50 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 Aug 2018 10:01:55 -0700 Subject: [PATCH 0742/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209612811 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6b94f79f673..ff920fcb96b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b47949daba8153602d45386828aa59c17733114d52e29bc38151267ecff77407", - git_commit = "aeab291563b0b4cc75c0f5fc73610a6595780570", + sha256 = "8bcba06343cd4420491c7614048dd2a3684af914f81028d7f35a53989c7f826d", + git_commit = "9f59beb67643953d87e7673fa0000cc775562693", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 67b85adbb087dca3630ae6beda3ad8ca011c4b74 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 Aug 2018 11:01:14 -0700 Subject: [PATCH 0743/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209624218 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ff920fcb96b..478f3e6bf27 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8bcba06343cd4420491c7614048dd2a3684af914f81028d7f35a53989c7f826d", - git_commit = "9f59beb67643953d87e7673fa0000cc775562693", + sha256 = "285e8db7f0cd0b5180f3e821e7f412a1813c5573e331ce9d3138a8578ab80454", + git_commit = "fe2826658b758f9a27f9b7a05f8f2e4689bfc5bc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0c4f3c8792ef36515dbdc251d74454988f4641f8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 Aug 2018 12:04:08 -0700 Subject: [PATCH 0744/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209635989 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 478f3e6bf27..2dc093c00e1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "285e8db7f0cd0b5180f3e821e7f412a1813c5573e331ce9d3138a8578ab80454", - git_commit = "fe2826658b758f9a27f9b7a05f8f2e4689bfc5bc", + sha256 = "f1bd4bb8c9cf9dadadb30ac92059f96f3b3aab49944d269c5553fbe360d62831", + git_commit = "c72c36145b01ba71b88731843fc36914f721a0e8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e20af46635df7ded0c79ec886833042f50174484 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 Aug 2018 13:04:07 -0700 Subject: [PATCH 0745/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209645776 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2dc093c00e1..b51d67654d4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f1bd4bb8c9cf9dadadb30ac92059f96f3b3aab49944d269c5553fbe360d62831", - git_commit = "c72c36145b01ba71b88731843fc36914f721a0e8", + sha256 = "ab91251297daac4a507cfd4003d9ac16a2ea128988eda1a61ca51012a8b5ba67", + git_commit = "81d90de884ad6005e57e0d7d333e8476659d00c2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8d7791ccc9597234f84994e847146fcd3c2bf6d1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 Aug 2018 14:01:38 -0700 Subject: [PATCH 0746/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209655351 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b51d67654d4..e0a30314b58 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ab91251297daac4a507cfd4003d9ac16a2ea128988eda1a61ca51012a8b5ba67", - git_commit = "81d90de884ad6005e57e0d7d333e8476659d00c2", + sha256 = "05979e628d8b4b77e218a8e259ad911b050f9bb880176a7fa78f05ded55c8f8e", + git_commit = "fce0a4eaab4b2dfa59ffed3a3d11bb0c82d98263", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From de869c4f2f0449021b4421106b127782471d9093 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 Aug 2018 15:00:52 -0700 Subject: [PATCH 0747/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209666113 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e0a30314b58..1a2c6262adb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "05979e628d8b4b77e218a8e259ad911b050f9bb880176a7fa78f05ded55c8f8e", - git_commit = "fce0a4eaab4b2dfa59ffed3a3d11bb0c82d98263", + sha256 = "8f56efcd9eb04885f0292692a1e162ecfbca5ca08ffa4261d757fbe46f48fc8d", + git_commit = "3f24f93c2a32b2eae8951e5b272c3b647c5b9611", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a5b7cfd0e57dcf8af9b6210ef25006f2eb647aad Mon Sep 17 00:00:00 2001 From: awk Date: Tue, 21 Aug 2018 15:02:21 -0700 Subject: [PATCH 0748/8103] Add support to express input and output tensors of Predict request in columnar format. This allows expressing named input (or output) tensors that do not have the same 0-th dimension. This change implements the proposal outline here: https://github.com/tensorflow/serving/issues/1047#issuecomment-413369670 Fixes #1047 PiperOrigin-RevId: 209666367 --- tensorflow_serving/g3doc/api_rest.md | 110 ++++++-- .../http_rest_prediction_handler.cc | 5 +- .../http_rest_prediction_handler_test.cc | 11 + .../tensorflow_model_server_test.py | 20 ++ tensorflow_serving/util/json_tensor.cc | 188 ++++++++++--- tensorflow_serving/util/json_tensor.h | 125 +++++++-- tensorflow_serving/util/json_tensor_test.cc | 259 +++++++++++++++--- 7 files changed, 577 insertions(+), 141 deletions(-) diff --git a/tensorflow_serving/g3doc/api_rest.md b/tensorflow_serving/g3doc/api_rest.md index 6925ebdb69d..1d18759eaa5 100644 --- a/tensorflow_serving/g3doc/api_rest.md +++ b/tensorflow_serving/g3doc/api_rest.md @@ -134,30 +134,35 @@ The request body for `predict` API must be JSON object formatted as follows: ```javascript { - // Optional: serving signature to use. + // (Optional) Serving signature to use. // If unspecifed default serving signature is used. "signature_name": , - // List of tensors (each element must be of same shape and type) - "instances": [ |<(nested)list>|, ... ] + // Input Tensors in row ("instances") or columnar ("inputs") format. + // A request can have either of them but NOT both. + "instances": |<(nested)list>| + "inputs": |<(nested)list>| } ``` -This format is similar to `PredictRequest` proto of gRPC API and the [CMLE -predict API](https://cloud.google.com/ml-engine/docs/v1/predict-request). +#### Specifying input tensors in row format. + +This format is similar to `PredictRequest` proto of gRPC API and the +[CMLE predict API](https://cloud.google.com/ml-engine/docs/v1/predict-request). +Use this format if all named input tensors have the **same 0-th dimension**. If +they don't, use the columnar format described later below. -When there is only one named input, the list items are expected to be scalars -(number/string): +In the row format, inputs are keyed to **instances** key in the JSON request. + +When there is only one named input, specify the value of **instances** key to be +the value of the input: ```javascript { + // List of 3 scalar tensors. "instances": [ "foo", "bar", "baz" ] } -``` -or lists of these primitive types. - -```javascript { // List of 2 tensors each of [1, 2] shape "instances": [ [[1, 2]], [[3, 4]] ] @@ -176,41 +181,96 @@ tensors: { "instances": [ { - "tag": ["foo"] - "signal": [1, 2, 3, 4, 5] + "tag": "foo", + "signal": [1, 2, 3, 4, 5], "sensor": [[1, 2], [3, 4]] }, { - "tag": ["bar"] - "signal": [3, 4, 1, 2, 5]] + "tag": "bar", + "signal": [3, 4, 1, 2, 5]], "sensor": [[4, 5], [6, 8]] - }, + } ] } ``` -See the [Encoding binary values](#encoding-binary-values) section below for -details on how to represent a binary (stream of bytes) value. +Note, each named input ("tag", "signal", "sensor") is implicitly assumed have +same 0-th dimension (*two* in above example, as there are *two* objects in the +*instances* list). If you have named inputs that have different 0-th dimension, +use the columnar format described below. + +#### Specifying input tensors in column format. + +Use this format to specify your input tensors, if individual named inputs do not +have the same 0-th dimension or you want a more compact representation. This +format is similar to the `inputs` field of the gRPC +[`Predict`](https://github.com/tensorflow/serving/blob/a52e8181144a5d6acc96b3d57328c7f49f113ea9/tensorflow_serving/apis/predict.proto#L21) +request. + +In the columnar format, inputs are keyed to **inputs** key in the JSON request. + +The value for **inputs** key can either a single input tensor or a map of input +name to tensors (listed in their natural nested form). Each input can have +arbitrary shape and need not share the/ same 0-th dimension (aka batch size) as +required by the row format described above. + +Columnar representation of the previous example is as follows: + +```javascript +{ + "inputs": { + "tag": ["foo", "bar"], + "signal": [[1, 2, 3, 4, 5], [3, 4, 1, 2, 5]], + "sensor": [[[1, 2], [3, 4]], [[4, 5], [6, 8]]] + } +} +``` + +Note, **inputs** is a JSON object and not a list like **instances** (used in the +row representation). Also, all the named inputs are specified together, as +opposed to unrolling them into individual rows done in the row format described +previously. This makes the representation compact (but maybe less readable). ### Response format -The `predict` request returns a JSON object in response body, formatted as -follows: +The `predict` request returns a JSON object in response body. + +A request in [row format](#specifying-input-tensors-in-row-format) has response +formatted as follows: ```javascript { - "predictions": [ |<(nested)list>|, ...] + "predictions": |<(nested)list>| } ``` If the output of the model contains only one named tensor, we omit the name and `predictions` key maps to a list of scalar or list values. If the model outputs multiple named tensors, we output a list of objects instead, similar to the -request format mentioned above. +request in row-format mentioned above. -Named tensors that have `_bytes` as a suffix in their name are considered to -have binary values. Such values are encoded differently as described in the -[encoding binary values](#encoding-binary-values) section below. +A request in [columnar format](#specifying-input-tensors-in-column-format) has +response formatted as follows: + +```javascript +{ + "outputs": |<(nested)list>| +} +``` + +If the output of the model contains only one named tensor, we omit the name and +`outputs` key maps to a list of scalar or list values. If the model outputs +multiple named tensors, we output an object instead. Each key of this object +corresponds to a named output tensor. The format is similar to the request in +column format mentioned above. + +#### Output of binary values + +TensorFlow does not distinguish between non-binary and binary strings. All are +`DT_STRING` type. Named tensors that have **`_bytes`** as a suffix in their name +are considered to have binary values. Such values are encoded differently as +described in the [encoding binary values](#encoding-binary-values) section +below. ## JSON mapping diff --git a/tensorflow_serving/model_servers/http_rest_prediction_handler.cc b/tensorflow_serving/model_servers/http_rest_prediction_handler.cc index 5274627f228..2e54ca79609 100644 --- a/tensorflow_serving/model_servers/http_rest_prediction_handler.cc +++ b/tensorflow_serving/model_servers/http_rest_prediction_handler.cc @@ -158,18 +158,19 @@ Status HttpRestPredictionHandler::ProcessPredictRequest( request.mutable_model_spec()->mutable_version()->set_value( model_version.value()); } + JsonPredictRequestFormat format; TF_RETURN_IF_ERROR(FillPredictRequestFromJson( request_body, [this, &request](const string& sig, ::google::protobuf::Map* map) { return this->GetInfoMap(request.model_spec(), sig, map); }, - &request)); + &request, &format)); PredictResponse response; TF_RETURN_IF_ERROR( predictor_->Predict(run_options_, core_, request, &response)); - TF_RETURN_IF_ERROR(MakeJsonFromTensors(response.outputs(), output)); + TF_RETURN_IF_ERROR(MakeJsonFromTensors(response.outputs(), format, output)); return Status::OK(); } diff --git a/tensorflow_serving/model_servers/http_rest_prediction_handler_test.cc b/tensorflow_serving/model_servers/http_rest_prediction_handler_test.cc index f502915c0d8..c79475fa7fb 100644 --- a/tensorflow_serving/model_servers/http_rest_prediction_handler_test.cc +++ b/tensorflow_serving/model_servers/http_rest_prediction_handler_test.cc @@ -307,6 +307,17 @@ TEST_F(HttpRestPredictionHandlerTest, Predict) { TF_EXPECT_OK(CompareJson(output, R"({ "predictions": [3.5, 4.0] })")); EXPECT_THAT(headers, UnorderedElementsAreArray( (HeaderList){{"Content-Type", "application/json"}})); + + // Query specific versions with explicit signature_name and columnar inputs. + TF_EXPECT_OK(handler_.ProcessRequest( + "POST", + absl::StrCat("/v1/models/", kTestModelName, "/versions/", + kTestModelVersion1, ":predict"), + R"({"signature_name": "serving_default", "inputs": [3.0, 4.0]})", + &headers, &output)); + TF_EXPECT_OK(CompareJson(output, R"({ "outputs": [3.5, 4.0] })")); + EXPECT_THAT(headers, UnorderedElementsAreArray( + (HeaderList){{"Content-Type", "application/json"}})); } TEST_F(HttpRestPredictionHandlerTest, Regress) { diff --git a/tensorflow_serving/model_servers/tensorflow_model_server_test.py b/tensorflow_serving/model_servers/tensorflow_model_server_test.py index 4312a86d928..2cf1aeda6a5 100644 --- a/tensorflow_serving/model_servers/tensorflow_model_server_test.py +++ b/tensorflow_serving/model_servers/tensorflow_model_server_test.py @@ -591,6 +591,26 @@ def testPredictREST(self): # Verify response self.assertEquals(json.loads(resp_data), {'predictions': [3.0, 3.5, 4.0]}) + def testPredictColumnarREST(self): + """Test Predict implementation over REST API with columnar inputs.""" + model_path = self._GetSavedModelBundlePath() + host, port = TensorflowModelServerTest.RunServer('default', + model_path)[2].split(':') + + # Prepare request + url = 'http://{}:{}/v1/models/default:predict'.format(host, port) + json_req = {'inputs': [2.0, 3.0, 4.0]} + + # Send request + resp_data = None + try: + resp_data = CallREST('Predict', url, json_req) + except Exception as e: # pylint: disable=broad-except + self.fail('Request failed with error: {}'.format(e)) + + # Verify response + self.assertEquals(json.loads(resp_data), {'outputs': [3.0, 3.5, 4.0]}) + if __name__ == '__main__': tf.test.main() diff --git a/tensorflow_serving/util/json_tensor.cc b/tensorflow_serving/util/json_tensor.cc index f62f9621f0d..e9505fa789f 100644 --- a/tensorflow_serving/util/json_tensor.cc +++ b/tensorflow_serving/util/json_tensor.cc @@ -45,17 +45,27 @@ namespace { // Signature name is keyed off this in the JSON request object. constexpr char kPredictRequestSignatureKey[] = "signature_name"; -// All tensors are keyed off this in the JSON request object. +// All tensors are keyed off this in the JSON request object, +// when request format is JsonPredictRequestFormat::kRow. constexpr char kPredictRequestInstancesKey[] = "instances"; +// All tensors are keyed off this in the JSON request object, +// when request format is JsonPredictRequestFormat::kColumnar. +constexpr char kPredictRequestInputsKey[] = "inputs"; + // All examples are keyed off this in the JSON request object. constexpr char kClassifyRegressRequestContextKey[] = "context"; // All examples are keyed off this in the JSON request object. constexpr char kClassifyRegressRequestExamplesKey[] = "examples"; -// All tensors are keyed off this in the JSON response object. -constexpr char kPredictResponseKey[] = "predictions"; +// All tensors are keyed off this in the JSON response object, +// when request format is JsonPredictRequestFormat::kRow. +constexpr char kPredictResponsePredictionsKey[] = "predictions"; + +// All tensors are keyed off this in the JSON response object, +// when request format is JsonPredictRequestFormat::kColumnar +constexpr char kPredictResponseOutputsKey[] = "outputs"; // All classification/regression results are keyed off this // in the JSON response object. @@ -133,8 +143,8 @@ Status Base64FormatError(const rapidjson::Value& val) { Status FormatError(const rapidjson::Value& val) { return errors::InvalidArgument( "JSON Value: ", JsonValueToString(val), - " not formatted correctly. Expecting object with 'instances' key and a " - "list/array as the value."); + " not formatted correctly. Expecting object with 'instances' or 'input'" + " key and a list/array or object as the value respectively."); } Status FormatSignatureError(const rapidjson::Value& val) { @@ -399,32 +409,10 @@ Status FillSignature(const rapidjson::Document& doc, return Status::OK(); } -} // namespace - -Status FillPredictRequestFromJson( - const absl::string_view json, - const std::function*)>& - get_tensorinfo_map, - PredictRequest* request) { - rapidjson::Document doc; - TF_RETURN_IF_ERROR(ParseJson(json, &doc)); - TF_RETURN_IF_ERROR(FillSignature(doc, request)); - - ::google::protobuf::Map tensorinfo_map; - const string& signame = request->model_spec().signature_name(); - TF_RETURN_IF_ERROR(get_tensorinfo_map(signame, &tensorinfo_map)); - if (tensorinfo_map.empty()) { - return errors::InvalidArgument("Failed to get input map for signature: ", - signame.empty() ? "DEFAULT" : signame); - } - - // Fill in tensors from (required) "instances" key. - auto itr = doc.FindMember(kPredictRequestInstancesKey); - if (itr == doc.MemberEnd()) return FormatError(doc); - if (!itr->value.IsArray()) return FormatError(doc); - if (!itr->value.Capacity()) return FormatError(doc); - +Status FillTensorMapFromInstancesList( + const rapidjson::Value::MemberIterator& itr, + const ::google::protobuf::Map& tensorinfo_map, + ::google::protobuf::Map* tensor_map) { // "instances" array can either be a plain list or list of objects (for named // tensors) but not a mix of both. Each object must have one key for each // named tensor. @@ -448,7 +436,6 @@ Status FillPredictRequestFromJson( // Each element must yield one tensor of same shape and size. All elements get // batched into one tensor with the first dimension equal to the number of // elements in the instances array. - auto* tensor_map = request->mutable_inputs(); tensor_map->clear(); ::google::protobuf::Map size_map; ::google::protobuf::Map shape_map; @@ -508,9 +495,94 @@ Status FillPredictRequestFromJson( for (const auto& d : shape.dim()) output_shape->add_dim()->set_size(d.size()); } + return Status::OK(); } +Status FillTensorMapFromInputsMap( + const rapidjson::Value::MemberIterator& itr, + const ::google::protobuf::Map& tensorinfo_map, + ::google::protobuf::Map* tensor_map) { + // "inputs" key can hold a value that is one of the following: + // - a list or base64 object (when there is only one named input) + // - a object of key->value pairs (when there are multiple named inputs) + const rapidjson::Value& val = itr->value; + if (!val.IsObject() || IsValBase64Object(val)) { + if (tensorinfo_map.size() > 1) { + return errors::InvalidArgument( + "inputs is a plain value/list, but expecting an object as multiple " + "input tensors required as per tensorinfo_map"); + } + + auto* tensor = &(*tensor_map)[tensorinfo_map.begin()->first]; + tensor->set_dtype(tensorinfo_map.begin()->second.dtype()); + GetDenseTensorShape(val, tensor->mutable_tensor_shape()); + int unused_size = 0; + TF_RETURN_IF_ERROR(FillTensorProto(val, 0 /* level */, tensor->dtype(), + &unused_size, tensor)); + } else { + for (const auto& kv : tensorinfo_map) { + const auto& name = kv.first; + auto item = val.FindMember(name.c_str()); + if (item == val.MemberEnd()) { + return errors::InvalidArgument("Missing named input: ", name, + " in 'inputs' object."); + } + const auto dtype = kv.second.dtype(); + auto* tensor = &(*tensor_map)[name]; + tensor->set_dtype(dtype); + tensor->mutable_tensor_shape()->Clear(); + GetDenseTensorShape(item->value, tensor->mutable_tensor_shape()); + int unused_size = 0; + TF_RETURN_IF_ERROR(FillTensorProto(item->value, 0 /* level */, dtype, + &unused_size, tensor)); + } + } + return Status::OK(); +} + +} // namespace + +Status FillPredictRequestFromJson( + const absl::string_view json, + const std::function*)>& + get_tensorinfo_map, + PredictRequest* request, JsonPredictRequestFormat* format) { + rapidjson::Document doc; + *format = JsonPredictRequestFormat::kInvalid; + TF_RETURN_IF_ERROR(ParseJson(json, &doc)); + TF_RETURN_IF_ERROR(FillSignature(doc, request)); + + ::google::protobuf::Map tensorinfo_map; + const string& signame = request->model_spec().signature_name(); + TF_RETURN_IF_ERROR(get_tensorinfo_map(signame, &tensorinfo_map)); + if (tensorinfo_map.empty()) { + return errors::InvalidArgument("Failed to get input map for signature: ", + signame.empty() ? "DEFAULT" : signame); + } + + // + // Fill in tensors from either "instances" or "inputs" key. + // + auto itr_instances = doc.FindMember(kPredictRequestInstancesKey); + auto itr_inputs = doc.FindMember(kPredictRequestInputsKey); + if (itr_instances != doc.MemberEnd()) { + if (itr_inputs != doc.MemberEnd()) return FormatError(doc); + if (!itr_instances->value.IsArray()) return FormatError(doc); + if (!itr_instances->value.Capacity()) return FormatError(doc); + *format = JsonPredictRequestFormat::kRow; + return FillTensorMapFromInstancesList(itr_instances, tensorinfo_map, + request->mutable_inputs()); + } else if (itr_inputs != doc.MemberEnd()) { + if (itr_instances != doc.MemberEnd()) return FormatError(doc); + *format = JsonPredictRequestFormat::kColumnar; + return FillTensorMapFromInputsMap(itr_inputs, tensorinfo_map, + request->mutable_inputs()); + } + return errors::InvalidArgument("Missing 'inputs' or 'instances' key"); +} + namespace { bool IsFeatureOfKind(const Feature& feature, Feature::KindCase kind) { @@ -808,14 +880,8 @@ Status AddTensorValues(const TensorProto& tensor, bool string_as_bytes, int dim, return Status::OK(); } -} // namespace - -Status MakeJsonFromTensors(const ::google::protobuf::Map& tensor_map, - string* json) { - if (tensor_map.empty()) { - return errors::InvalidArgument("Cannot convert empty tensor map to JSON"); - } - +Status MakeRowFormatJsonFromTensors( + const ::google::protobuf::Map& tensor_map, string* json) { // Verify if each named tensor has same first dimension. The first dimension // is the batchsize and for an output to be consistent, all named tensors must // be batched to the same size. @@ -847,7 +913,7 @@ Status MakeJsonFromTensors(const ::google::protobuf::Map& t rapidjson::StringBuffer buffer; rapidjson::PrettyWriter writer(buffer); writer.StartObject(); - writer.Key(kPredictResponseKey); + writer.Key(kPredictResponsePredictionsKey); writer.StartArray(); const bool elements_are_objects = tensor_map.size() > 1; for (int item = 0; item < batch_size; item++) { @@ -871,6 +937,46 @@ Status MakeJsonFromTensors(const ::google::protobuf::Map& t return Status::OK(); } +Status MakeColumnarFormatJsonFromTensors( + const ::google::protobuf::Map& tensor_map, string* json) { + rapidjson::StringBuffer buffer; + rapidjson::PrettyWriter writer(buffer); + writer.StartObject(); + writer.Key(kPredictResponseOutputsKey); + const bool elements_are_objects = tensor_map.size() > 1; + if (elements_are_objects) writer.StartObject(); + for (const auto& kv : tensor_map) { + const auto& name = kv.first; + const auto& tensor = kv.second; + if (elements_are_objects) writer.Key(name.c_str()); + int unused_offset = 0; + TF_RETURN_IF_ERROR(AddTensorValues(tensor, IsNamedTensorBytes(name, tensor), + 0, &writer, &unused_offset)); + } + if (elements_are_objects) writer.EndObject(); + writer.EndObject(); + json->assign(buffer.GetString()); + return Status::OK(); +} + +} // namespace + +Status MakeJsonFromTensors(const ::google::protobuf::Map& tensor_map, + JsonPredictRequestFormat format, string* json) { + if (tensor_map.empty()) { + return errors::InvalidArgument("Cannot convert empty tensor map to JSON"); + } + + switch (format) { + case JsonPredictRequestFormat::kInvalid: + return errors::InvalidArgument("Invalid request format"); + case JsonPredictRequestFormat::kRow: + return MakeRowFormatJsonFromTensors(tensor_map, json); + case JsonPredictRequestFormat::kColumnar: + return MakeColumnarFormatJsonFromTensors(tensor_map, json); + } +} + Status MakeJsonFromClassificationResult(const ClassificationResult& result, string* json) { if (result.classifications_size() == 0) { diff --git a/tensorflow_serving/util/json_tensor.h b/tensorflow_serving/util/json_tensor.h index e57ad91a7cb..1c5f77d5c3e 100644 --- a/tensorflow_serving/util/json_tensor.h +++ b/tensorflow_serving/util/json_tensor.h @@ -30,6 +30,14 @@ limitations under the License. namespace tensorflow { namespace serving { +// Format of input tensors in predict request. +// See comments for FillPredictRequestFromJson() below for more details. +enum class JsonPredictRequestFormat { + kInvalid, + kRow, + kColumnar, +}; + // Fills PredictRequest proto from a JSON object. // // `json` string is parsed to create TensorProtos based on the type map returned @@ -47,15 +55,20 @@ namespace serving { // // { // "signature_name": -// "instances": [ |<(nested)list>|, ... ] +// ("instances"|"inputs"): [ |<(nested)list>|, ... ] // } // // The "signature_name" is *optional* (if not specified, default serving -// signature is used). The "instances" represents list of tensors (read -// further on the formatting of these tensors below). Any other keys in the -// top-level JSON object are ignored. +// signature is used). The "instances" or "inputs" represents list of tensors +// (read further on the formatting of these tensors below). Any other keys in +// the top-level JSON object are ignored. // -// === Notes on formatting of "instances" in the JSON === +// "instances" is used to format input tensors in "row" format and "inputs" +// is used to format them in "columnar" format. The former is easy to read +// but requires all inputs to have same 0-th dimension whereas the latter +// can represent input tensors with varying sizes. +// +// === Notes on formatting of "instances" (row format) in the JSON === // // The "instances" represents a list of tensors (all of same shape+type), and // this function builds a stack of these tensors (represented as tensor). If the @@ -78,7 +91,7 @@ namespace serving { // { // "instances": [ "foo", "bar", "baz" ] // } -// j +// // { // "instances": [ [[1, 2]], [[3], [4]] ] // } @@ -91,15 +104,15 @@ namespace serving { // { // "instances": [ // { -// "tag": ["foo"] -// "signal": [1, 2, 3, 4, 5] +// "tag": ["foo"], +// "signal": [1, 2, 3, 4, 5], // "sensor": [[1, 2], [3, 4]] // }, // { -// "tag": ["bar"] -// "signal": [3, 4, 1, 2, 5]] +// "tag": ["bar"], +// "signal": [3, 4, 1, 2, 5], // "sensor": [[4, 5], [6, 8]] -// }, +// } // ] // } // @@ -110,12 +123,31 @@ namespace serving { // { // "instances": [ { "b64" : "aGVsbG8=" }, { "b64": "d29ybGQ=" } ] // } +// +// === Notes on formatting of "inputs" (columnar format) in the JSON === +// +// The value for "inputs" key is either a single input tensor or a map +// of input name to tensor values. Each input can have arbitrary shape +// and need not share the same 0-th dimension as required by the row +// format described above. +// +// This format is similar to the `inputs` field in request proto of +// gRPC Predict API. And compact compared to the row format +// +// A sample (compare this to "instances" above) is as follows: +// { +// "inputs": { +// "tag": ["foo", "bar"], +// "signal": [1, 2, 3, 4, 5, 3, 4, 1, 2, 4], +// "sensor": [[1, 2], [3, 4], [4, 5], [6, 8]] +// } +// } tensorflow::Status FillPredictRequestFromJson( const absl::string_view json, const std::function*)>& get_tensorinfo_map, - PredictRequest* request); + PredictRequest* request, JsonPredictRequestFormat* format); // Fills ClassificationRequest proto from a JSON object. // @@ -167,33 +199,66 @@ tensorflow::Status FillRegressionRequestFromJson(const absl::string_view json, // // `tensor_map` contains a map of name/alias tensor names (as it appears in the // TensorFlow graph) to tensor protos. The output `json` string is JSON object -// containing all the tensors represented by these tensor protos. The first -// dimension in each of these tensors is assumed to be the "batch" size and it -// is expected that all tensors have the *same* batch size -- otherwise we -// return an error, and the contents of output `json` should not be used. +// containing all the tensors represented by these tensor protos. The +// composition of output JSON depends on `format` (read further for details). // -// Tensors appear as list (with "batch" size elements) keyed by "predictions" -// in the JSON object: -// -// { -// "predictions": [ |<(nested)list>|, ...] -// } -// -// If `tensor_map` contains only one key/named tensor, the "predictions" key -// contains a array of or <(nested)list> otherwise it is an array of -// JSON objects. See comments for MakeTensorsFromJson() above for formatting -// details (and unit-test of examples). +// In case of error the contents of output `json` should not be used. // // Tensors containing binary data (e.g. image bytes) are base64 encoded in the // JSON object. The name/alias for these tensors MUST have "_bytes" as suffix, // to ensure JSON has correct (base64) encoding, otherwise the resulting JSON // may not represent the output correctly and/or may not be parsable. // -// Note, this formatting is similar to CMLE predict API: -// https://cloud.google.com/ml-engine/docs/v1/predict-request#response-body +// Formatting when `format` is `kRow`: +// +// Tensors appear as list (with "batch" size elements) keyed by "predictions" +// in the JSON object: +// +// { +// "predictions": [ |<(nested)list>|, ...] +// } +// +// If `tensor_map` contains only one key/named tensor, the "predictions" key +// contains a array of or <(nested)list> otherwise it is an array of +// JSON objects. See comments for FillPredictRequestFromJson() above for +// formatting details (and unit-test of examples). +// +// The first dimension in each of these tensors is assumed to be the "batch" +// size and it is expected that all tensors have the *same* batch size -- +// otherwise we return an error. +// +// Note, this formatting is similar to CMLE predict API: +// https://cloud.google.com/ml-engine/docs/v1/predict-request#response-body +// +// Formatting when `format` is `kColumnar` +// +// Tensors appear as list (when there is only one named output) or as a JSON +// object, with one key-value pair for each named input, keyed by "outputs" +// in the JSON object. +// +// Unlike `kRow` format (see above) each named tensor can have different first +// dimension. This format is compact and matches closely with the response +// proto of the gRPC predict API. +// +// Only one named output: +// { +// "outputs": [ |<(nested)list> ] +// } +// +// Multiple named output: +// { +// "outputs": { +// "named_output_foo": [ |<(nested)list> ], +// "named_output_bar": [ |<(nested)list> ], +// ... +// } +// } +// +// See comments for FillPredictRequestFromJson() above for formatting details +// (and unit-test of examples). tensorflow::Status MakeJsonFromTensors( const ::google::protobuf::Map& tensor_map, - string* json); + JsonPredictRequestFormat format, string* json); // Make JSON object from ClassificationResult proto. // diff --git a/tensorflow_serving/util/json_tensor_test.cc b/tensorflow_serving/util/json_tensor_test.cc index 16136d808da..2b4197f39be 100644 --- a/tensorflow_serving/util/json_tensor_test.cc +++ b/tensorflow_serving/util/json_tensor_test.cc @@ -57,13 +57,15 @@ TEST(JsontensorTest, SingleUnnamedTensor) { TextFormat::ParseFromString("dtype: DT_INT32", &infomap["default"])); PredictRequest req; + JsonPredictRequestFormat format; TF_EXPECT_OK(FillPredictRequestFromJson(R"( { "instances": [[1,2],[3,4],[5,6]] })", - getmap(infomap), &req)); + getmap(infomap), &req, &format)); auto tmap = req.inputs(); EXPECT_EQ(tmap.size(), 1); + EXPECT_EQ(format, JsonPredictRequestFormat::kRow); EXPECT_THAT(tmap["default"], EqualsProto(R"( dtype: DT_INT32 tensor_shape { @@ -85,15 +87,17 @@ TEST(JsontensorTest, SingleUnnamedTensorWithSignature) { TextFormat::ParseFromString("dtype: DT_INT32", &infomap["default"])); PredictRequest req; + JsonPredictRequestFormat format; TF_EXPECT_OK(FillPredictRequestFromJson(R"( { "signature_name": "predict_images", "instances": [[1,2]] })", - getmap(infomap), &req)); + getmap(infomap), &req, &format)); EXPECT_EQ(req.model_spec().signature_name(), "predict_images"); auto tmap = req.inputs(); EXPECT_EQ(tmap.size(), 1); + EXPECT_EQ(format, JsonPredictRequestFormat::kRow); EXPECT_THAT(tmap["default"], EqualsProto(R"( dtype: DT_INT32 tensor_shape { @@ -113,12 +117,14 @@ TEST(JsontensorTest, TensorFromNonNullTerminatedBuffer) { // Note, last character is a 'X' to for non-null termination. const string jsonstr = R"({"instances": [[1,2],[3,4],[5,6]]}X)"; PredictRequest req; + JsonPredictRequestFormat format; TF_EXPECT_OK(FillPredictRequestFromJson( // Process over a buffer that is not null terminated. absl::string_view(jsonstr.data(), jsonstr.length() - 1), getmap(infomap), - &req)); + &req, &format)); auto tmap = req.inputs(); EXPECT_EQ(tmap.size(), 1); + EXPECT_EQ(format, JsonPredictRequestFormat::kRow); EXPECT_THAT(tmap["default"], EqualsProto(R"( dtype: DT_INT32 tensor_shape { @@ -140,13 +146,15 @@ TEST(JsontensorTest, SingleUnnamedTensorBase64Scalars) { TextFormat::ParseFromString("dtype: DT_STRING", &infomap["default"])); PredictRequest req; + JsonPredictRequestFormat format; TF_EXPECT_OK(FillPredictRequestFromJson(R"( { "instances": [ { "b64" : "aGVsbG8=" }, { "b64": "d29ybGQ=" } ] })", - getmap(infomap), &req)); + getmap(infomap), &req, &format)); auto tmap = req.inputs(); EXPECT_EQ(tmap.size(), 1); + EXPECT_EQ(format, JsonPredictRequestFormat::kRow); EXPECT_THAT(tmap["default"], EqualsProto(R"( dtype: DT_STRING tensor_shape { @@ -163,13 +171,15 @@ TEST(JsontensorTest, SingleUnnamedTensorBase64Lists) { TextFormat::ParseFromString("dtype: DT_STRING", &infomap["default"])); PredictRequest req; + JsonPredictRequestFormat format; TF_EXPECT_OK(FillPredictRequestFromJson(R"( { "instances": [ [{ "b64" : "aGVsbG8=" }], [{ "b64": "d29ybGQ=" }] ] })", - getmap(infomap), &req)); + getmap(infomap), &req, &format)); auto tmap = req.inputs(); EXPECT_EQ(tmap.size(), 1); + EXPECT_EQ(format, JsonPredictRequestFormat::kRow); EXPECT_THAT(tmap["default"], EqualsProto(R"( dtype: DT_STRING tensor_shape { @@ -187,6 +197,7 @@ TEST(JsontensorTest, SingleNamedTensorBase64) { TextFormat::ParseFromString("dtype: DT_STRING", &infomap["default"])); PredictRequest req; + JsonPredictRequestFormat format; TF_EXPECT_OK(FillPredictRequestFromJson(R"( { "instances": [ @@ -195,9 +206,10 @@ TEST(JsontensorTest, SingleNamedTensorBase64) { } ] })", - getmap(infomap), &req)); + getmap(infomap), &req, &format)); auto tmap = req.inputs(); EXPECT_EQ(tmap.size(), 1); + EXPECT_EQ(format, JsonPredictRequestFormat::kRow); EXPECT_THAT(tmap["default"], EqualsProto(R"( dtype: DT_STRING tensor_shape { @@ -222,6 +234,7 @@ TEST(JsontensorTest, MultipleNamedTensor) { TextFormat::ParseFromString("dtype: DT_FLOAT", &infomap["float_tensor"])); PredictRequest req; + JsonPredictRequestFormat format; TF_EXPECT_OK(FillPredictRequestFromJson(R"( { "instances": [ @@ -237,10 +250,11 @@ TEST(JsontensorTest, MultipleNamedTensor) { } ] })", - getmap(infomap), &req)); + getmap(infomap), &req, &format)); auto tmap = req.inputs(); EXPECT_EQ(tmap.size(), 3); + EXPECT_EQ(format, JsonPredictRequestFormat::kRow); EXPECT_THAT(tmap["int_tensor"], EqualsProto(R"( dtype: DT_INT32 tensor_shape { @@ -283,14 +297,128 @@ TEST(JsontensorTest, MultipleNamedTensor) { )")); } +TEST(JsontensorTest, SingleUnnamedTensorColumnarFormat) { + TensorInfoMap infomap; + ASSERT_TRUE( + TextFormat::ParseFromString("dtype: DT_INT32", &infomap["int_tensor"])); + + PredictRequest req; + JsonPredictRequestFormat format; + TF_EXPECT_OK(FillPredictRequestFromJson(R"( + { + "inputs": { + "int_tensor": [[[1,2],[3,4],[5,6]]] + } + })", + getmap(infomap), &req, &format)); + auto tmap = req.inputs(); + EXPECT_EQ(tmap.size(), 1); + EXPECT_EQ(format, JsonPredictRequestFormat::kColumnar); + EXPECT_THAT(tmap["int_tensor"], EqualsProto(R"( + dtype: DT_INT32 + tensor_shape { + dim { size: 1 } + dim { size: 3 } + dim { size: 2 } + } + int_val: 1 + int_val: 2 + int_val: 3 + int_val: 4 + int_val: 5 + int_val: 6 + )")); + + // + // Skip explicitly specifying named input. + // + req.Clear(); + TF_EXPECT_OK(FillPredictRequestFromJson(R"( + { + "inputs": [[[1,2],[3,4],[5,6]]] + })", + getmap(infomap), &req, &format)); + auto tmap2 = req.inputs(); + EXPECT_EQ(tmap2.size(), 1); + EXPECT_EQ(format, JsonPredictRequestFormat::kColumnar); + EXPECT_THAT(tmap2["int_tensor"], EqualsProto(R"( + dtype: DT_INT32 + tensor_shape { + dim { size: 1 } + dim { size: 3 } + dim { size: 2 } + } + int_val: 1 + int_val: 2 + int_val: 3 + int_val: 4 + int_val: 5 + int_val: 6 + )")); +} + +TEST(JsontensorTest, MultipleNamedTensorColumnarFormat) { + TensorInfoMap infomap; + + // 3 named tensors with different types. + ASSERT_TRUE( + TextFormat::ParseFromString("dtype: DT_INT32", &infomap["int_tensor"])); + ASSERT_TRUE( + TextFormat::ParseFromString("dtype: DT_STRING", &infomap["str_tensor"])); + ASSERT_TRUE( + TextFormat::ParseFromString("dtype: DT_STRING", &infomap["bin_tensor"])); + + PredictRequest req; + JsonPredictRequestFormat format; + TF_EXPECT_OK(FillPredictRequestFromJson(R"( + { + "inputs": { + "int_tensor": [[[1,2],[3,4],[5,6]]], + "str_tensor": ["foo", "bar"], + "bin_tensor": { "b64" : "aGVsbG8=" } + } + })", + getmap(infomap), &req, &format)); + + auto tmap = req.inputs(); + EXPECT_EQ(tmap.size(), 3); + EXPECT_EQ(format, JsonPredictRequestFormat::kColumnar); + EXPECT_THAT(tmap["int_tensor"], EqualsProto(R"( + dtype: DT_INT32 + tensor_shape { + dim { size: 1 } + dim { size: 3 } + dim { size: 2 } + } + int_val: 1 + int_val: 2 + int_val: 3 + int_val: 4 + int_val: 5 + int_val: 6 + )")); + EXPECT_THAT(tmap["str_tensor"], EqualsProto(R"( + dtype: DT_STRING + tensor_shape { dim { size: 2 } } + string_val: "foo" + string_val: "bar" + )")); + EXPECT_THAT(tmap["bin_tensor"], EqualsProto(R"( + dtype: DT_STRING + tensor_shape {} + string_val: "hello" + )")); +} + TEST(JsontensorTest, SingleUnnamedTensorErrors) { TensorInfoMap infomap; ASSERT_TRUE( TextFormat::ParseFromString("dtype: DT_INT32", &infomap["default"])); PredictRequest req; + JsonPredictRequestFormat format; Status status; - status = FillPredictRequestFromJson("", getmap(infomap), &req); + status = FillPredictRequestFromJson("", getmap(infomap), &req, &format); ASSERT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("document is empty")); @@ -299,15 +427,24 @@ TEST(JsontensorTest, SingleUnnamedTensorErrors) { "signature_name": 5, "instances": [[1,2],[3,4],[5,6,7]] })", - getmap(infomap), &req); + getmap(infomap), &req, &format); ASSERT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("must be a string value")); + status = FillPredictRequestFromJson(R"( + { + "instances": [[1,2],[3,4],[5,6,7]], + "inputs": [[1,2],[3,4],[5,6,7]] + })", + getmap(infomap), &req, &format); + ASSERT_TRUE(errors::IsInvalidArgument(status)); + EXPECT_THAT(status.error_message(), HasSubstr("not formatted correctly")); + status = FillPredictRequestFromJson(R"( { "instances": [[1,2],[3,4],[5,6,7]] })", - getmap(infomap), &req); + getmap(infomap), &req, &format); ASSERT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("Expecting tensor size")); @@ -315,7 +452,7 @@ TEST(JsontensorTest, SingleUnnamedTensorErrors) { { "instances": [[1,2],[3,4],[[5,6]]] })", - getmap(infomap), &req); + getmap(infomap), &req, &format); ASSERT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("Expecting shape")); @@ -323,7 +460,7 @@ TEST(JsontensorTest, SingleUnnamedTensorErrors) { { "instances": [1, [1]] })", - getmap(infomap), &req); + getmap(infomap), &req, &format); ASSERT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("Expecting shape")); @@ -331,7 +468,7 @@ TEST(JsontensorTest, SingleUnnamedTensorErrors) { { "instances": [[1,2],["a", "b"]] })", - getmap(infomap), &req); + getmap(infomap), &req, &format); ASSERT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("not of expected type")); @@ -340,7 +477,7 @@ TEST(JsontensorTest, SingleUnnamedTensorErrors) { status = FillPredictRequestFromJson( absl::Substitute(R"({ "instances": [$0] })", std::numeric_limits::max()), - getmap(infomap), &req); + getmap(infomap), &req, &format); ASSERT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("out of range for float")); } @@ -355,6 +492,7 @@ TEST(JsontensorTest, MultipleNamedTensorErrors) { TextFormat::ParseFromString("dtype: DT_STRING", &infomap["str_tensor"])); PredictRequest req; + JsonPredictRequestFormat format; Status status; // Different shapes across int_tensor instances. status = FillPredictRequestFromJson(R"( @@ -370,7 +508,7 @@ TEST(JsontensorTest, MultipleNamedTensorErrors) { } ] })", - getmap(infomap), &req); + getmap(infomap), &req, &format); ASSERT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("Expecting shape")); @@ -389,7 +527,7 @@ TEST(JsontensorTest, MultipleNamedTensorErrors) { } ] })", - getmap(infomap), &req); + getmap(infomap), &req, &format); ASSERT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("Expecting tensor size")); @@ -410,7 +548,7 @@ TEST(JsontensorTest, MultipleNamedTensorErrors) { } ] })", - getmap(infomap), &req); + getmap(infomap), &req, &format); ASSERT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("Expecting object but got list")); @@ -430,7 +568,7 @@ TEST(JsontensorTest, MultipleNamedTensorErrors) { } ] })", - getmap(infomap), &req); + getmap(infomap), &req, &format); ASSERT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("Expecting value/list but got object")); @@ -496,10 +634,18 @@ TEST(JsontensorTest, FromJsonSingleTensor) { &tensormap["int_tensor"])); string json; - TF_EXPECT_OK(MakeJsonFromTensors(tensormap, &json)); + TF_EXPECT_OK( + MakeJsonFromTensors(tensormap, JsonPredictRequestFormat::kRow, &json)); TF_EXPECT_OK(CompareJson(json, R"({ "predictions": [[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 0], [1, 2]] ]})")); + + json.clear(); + TF_EXPECT_OK(MakeJsonFromTensors(tensormap, + JsonPredictRequestFormat::kColumnar, &json)); + TF_EXPECT_OK(CompareJson(json, R"({ + "outputs": [[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 0], [1, 2]] + ]})")); } TEST(JsontensorTest, FromJsonSingleScalarTensor) { @@ -518,8 +664,14 @@ TEST(JsontensorTest, FromJsonSingleScalarTensor) { &tensormap["int_tensor"])); string json; - TF_EXPECT_OK(MakeJsonFromTensors(tensormap, &json)); + TF_EXPECT_OK( + MakeJsonFromTensors(tensormap, JsonPredictRequestFormat::kRow, &json)); TF_EXPECT_OK(CompareJson(json, R"({ "predictions": [1, 2, 3, 4, 5] })")); + + json.clear(); + TF_EXPECT_OK(MakeJsonFromTensors(tensormap, + JsonPredictRequestFormat::kColumnar, &json)); + TF_EXPECT_OK(CompareJson(json, R"({ "outputs": [1, 2, 3, 4, 5] })")); } TEST(JsontensorTest, FromJsonSingleBytesTensor) { @@ -538,7 +690,8 @@ TEST(JsontensorTest, FromJsonSingleBytesTensor) { &tensormap["str_tensor_bytes"])); string json; - TF_EXPECT_OK(MakeJsonFromTensors(tensormap, &json)); + TF_EXPECT_OK( + MakeJsonFromTensors(tensormap, JsonPredictRequestFormat::kRow, &json)); TF_EXPECT_OK(CompareJson(json, R"({ "predictions": [ [{"b64": "aGVsbG8="}, {"b64": "d29ybGQ="}], @@ -564,7 +717,8 @@ TEST(JsontensorTest, FromJsonSingleFloatTensorSixDigitPrecision) { &tensormap["float_tensor"])); string json; - TF_EXPECT_OK(MakeJsonFromTensors(tensormap, &json)); + TF_EXPECT_OK( + MakeJsonFromTensors(tensormap, JsonPredictRequestFormat::kRow, &json)); TF_EXPECT_OK(CompareJsonAllValuesAsStrings(json, R"({ "predictions": [ [9e+06, 999999.0], @@ -588,7 +742,8 @@ TEST(JsontensorTest, FromJsonSingleFloatTensorNonFinite) { &tensormap["float_tensor"])); string json; - TF_EXPECT_OK(MakeJsonFromTensors(tensormap, &json)); + TF_EXPECT_OK( + MakeJsonFromTensors(tensormap, JsonPredictRequestFormat::kRow, &json)); TF_EXPECT_OK(CompareJsonAllValuesAsStrings(json, R"({ "predictions": [ [NaN, Infinity], @@ -601,7 +756,8 @@ TEST(JsontensorTest, FromJsonSingleTensorErrors) { string json; Status status; - status = MakeJsonFromTensors(tensormap, &json); + status = + MakeJsonFromTensors(tensormap, JsonPredictRequestFormat::kRow, &json); ASSERT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("empty tensor map")); @@ -614,7 +770,8 @@ TEST(JsontensorTest, FromJsonSingleTensorErrors) { scomplex_val: 2.0 )", &tensormap["tensor"])); - status = MakeJsonFromTensors(tensormap, &json); + status = + MakeJsonFromTensors(tensormap, JsonPredictRequestFormat::kRow, &json); ASSERT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("tensor type: complex64")); @@ -623,7 +780,8 @@ TEST(JsontensorTest, FromJsonSingleTensorErrors) { int_val: 1 )", &tensormap["tensor"])); - status = MakeJsonFromTensors(tensormap, &json); + status = + MakeJsonFromTensors(tensormap, JsonPredictRequestFormat::kRow, &json); ASSERT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("no shape information")); } @@ -700,24 +858,38 @@ TEST(JsontensorTest, FromJsonMultipleNamedTensors) { &tensormap["str_tensor_bytes"])); string json; - TF_EXPECT_OK(MakeJsonFromTensors(tensormap, &json)); + TF_EXPECT_OK( + MakeJsonFromTensors(tensormap, JsonPredictRequestFormat::kRow, &json)); TF_EXPECT_OK(CompareJson(json, R"({ "predictions": [ - { - "double_scalar_tensor": 8.0, - "float_tensor": [1.0], - "int_tensor": [[1, 2], [3, 4], [5, 6]], - "str_tensor": ["foo", "bar"], - "str_tensor_bytes": [ {"b64": "aGVsbG8="}, {"b64": "d29ybGQ="} ] - }, - { - "double_scalar_tensor": 9.0, - "float_tensor": [2.0], - "int_tensor": [[7, 8], [9, 0], [1, 2]], - "str_tensor": ["baz", "bat"], - "str_tensor_bytes": [ {"b64": "dGY="}, {"b64": "c2VydmluZw=="} ] - } + { + "double_scalar_tensor": 8.0, + "float_tensor": [1.0], + "int_tensor": [[1, 2], [3, 4], [5, 6]], + "str_tensor": ["foo", "bar"], + "str_tensor_bytes": [ {"b64": "aGVsbG8="}, {"b64": "d29ybGQ="} ] + }, + { + "double_scalar_tensor": 9.0, + "float_tensor": [2.0], + "int_tensor": [[7, 8], [9, 0], [1, 2]], + "str_tensor": ["baz", "bat"], + "str_tensor_bytes": [ {"b64": "dGY="}, {"b64": "c2VydmluZw=="} ] + } ]})")); + + json.clear(); + TF_EXPECT_OK(MakeJsonFromTensors(tensormap, + JsonPredictRequestFormat::kColumnar, &json)); + TF_EXPECT_OK(CompareJson(json, R"({ + "outputs": { + "double_scalar_tensor": [8.0, 9.0], + "float_tensor": [[1.0], [2.0]], + "int_tensor": [[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 0], [1, 2]]], + "str_tensor": [["foo", "bar"], ["baz", "bat"]], + "str_tensor_bytes": [[{"b64": "aGVsbG8="}, {"b64": "d29ybGQ="}], + [{"b64": "dGY="}, {"b64": "c2VydmluZw=="}]] + }})")); } TEST(JsontensorTest, FromJsonMultipleNamedTensorsErrors) { @@ -750,7 +922,8 @@ TEST(JsontensorTest, FromJsonMultipleNamedTensorsErrors) { &tensormap["str_tensor"])); string json; - const auto& status = MakeJsonFromTensors(tensormap, &json); + const auto& status = + MakeJsonFromTensors(tensormap, JsonPredictRequestFormat::kRow, &json); ASSERT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("inconsistent batch size")); } @@ -1001,7 +1174,7 @@ TYPED_TEST(ClassifyRegressRequestTest, JsonErrors) { })", &req); ASSERT_TRUE(errors::IsInvalidArgument(status)); - EXPECT_THAT(status.error_message(), HasSubstr("list/array as the value")); + EXPECT_THAT(status.error_message(), HasSubstr("list/array")); req.Clear(); status = this->FillRequest(R"( From 16ca551f4d0f6aab14345b7caed1673d555648a9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 Aug 2018 16:01:49 -0700 Subject: [PATCH 0749/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209676286 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1a2c6262adb..be7fd8f0932 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8f56efcd9eb04885f0292692a1e162ecfbca5ca08ffa4261d757fbe46f48fc8d", - git_commit = "3f24f93c2a32b2eae8951e5b272c3b647c5b9611", + sha256 = "3c0e565aa9aa26102cc6413433092714e4ee5f7a58cfc22557471b364b535779", + git_commit = "0f02f05913e03889bbcb85e71a6d005a8519bfb9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 79616f6fd9fbefc7e4aa5f4f41891c1b83de4f03 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 Aug 2018 17:02:25 -0700 Subject: [PATCH 0750/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209685647 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index be7fd8f0932..806a814f23c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3c0e565aa9aa26102cc6413433092714e4ee5f7a58cfc22557471b364b535779", - git_commit = "0f02f05913e03889bbcb85e71a6d005a8519bfb9", + sha256 = "cad272fd707b05c8a55db3b080d7e09c87e13d3b687ff963f926fa58e851e26a", + git_commit = "62fcb03449c13281935a154e3ea7c11614ffb678", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2a016670cc623708c80cac94afb55c41d9b807eb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 Aug 2018 18:01:54 -0700 Subject: [PATCH 0751/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209693666 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 806a814f23c..244ad20834c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cad272fd707b05c8a55db3b080d7e09c87e13d3b687ff963f926fa58e851e26a", - git_commit = "62fcb03449c13281935a154e3ea7c11614ffb678", + sha256 = "56dc59dd0d4f6586ae0efa9deedce314ab8f3a0e8367b90937812d51321420d6", + git_commit = "95d718a8a41370f31ccb3b32aaac7fd00b0291e4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4900774dc8d4ab9949b02753a52883651abeaa25 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 Aug 2018 19:04:14 -0700 Subject: [PATCH 0752/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209700023 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 244ad20834c..641e4b3240f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "56dc59dd0d4f6586ae0efa9deedce314ab8f3a0e8367b90937812d51321420d6", - git_commit = "95d718a8a41370f31ccb3b32aaac7fd00b0291e4", + sha256 = "a0b80cd40ab4c3bb978f140ec9c463c276476b312c8d4a44771fe89d93074815", + git_commit = "d432bd4203e6f255f07c34eea1cc1e2f7e4e4d5c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0f4c727225865d119160a9e204edc738b509966d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 Aug 2018 20:01:01 -0700 Subject: [PATCH 0753/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209703988 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 641e4b3240f..300d49a7159 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a0b80cd40ab4c3bb978f140ec9c463c276476b312c8d4a44771fe89d93074815", - git_commit = "d432bd4203e6f255f07c34eea1cc1e2f7e4e4d5c", + sha256 = "9e80d4ee52c641b577f99f5158a4f411583ab2c0013f12c6f20650a8aacb1b23", + git_commit = "34f07dc58afcbddf3c4387cdf7c49ebb5aacf4dd", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From be44580d2056b84141ed5e2e2c7d2d4a1ca913d4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 Aug 2018 21:03:06 -0700 Subject: [PATCH 0754/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209708752 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 300d49a7159..3a148b3ea14 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9e80d4ee52c641b577f99f5158a4f411583ab2c0013f12c6f20650a8aacb1b23", - git_commit = "34f07dc58afcbddf3c4387cdf7c49ebb5aacf4dd", + sha256 = "7776558985dc61465623c048324e882d265c706ce1ff966ff681e1c8dc270af8", + git_commit = "ba9501e0a6c457a0bb051760bf9312d31c6211bf", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 68b7f829369d0a09927d02ff5ca0375deb27597a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 Aug 2018 22:00:59 -0700 Subject: [PATCH 0755/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209712998 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3a148b3ea14..52df75011c7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7776558985dc61465623c048324e882d265c706ce1ff966ff681e1c8dc270af8", - git_commit = "ba9501e0a6c457a0bb051760bf9312d31c6211bf", + sha256 = "a38133cf8ed84319b080ebcce975a51375644e510fc72a7975c523a0602e0268", + git_commit = "b18cbef5772abd61d841b2b765f3a203f8616f2e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f5bce8af913631c7e351c00f795057ae5570163c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 22 Aug 2018 02:00:52 -0700 Subject: [PATCH 0756/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209731825 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 52df75011c7..aa2b82a2b27 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a38133cf8ed84319b080ebcce975a51375644e510fc72a7975c523a0602e0268", - git_commit = "b18cbef5772abd61d841b2b765f3a203f8616f2e", + sha256 = "6bb27fd0e59db94c89b45fd263e274e23e368ab57cb88a537871633d0825e2db", + git_commit = "05f8ea8e9522a3027d4f3f7a54d716bfafed427a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2c6c941a829c2be572374635c39f5fd74b963a73 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 22 Aug 2018 03:03:53 -0700 Subject: [PATCH 0757/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209738910 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index aa2b82a2b27..d4352bfb8bb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6bb27fd0e59db94c89b45fd263e274e23e368ab57cb88a537871633d0825e2db", - git_commit = "05f8ea8e9522a3027d4f3f7a54d716bfafed427a", + sha256 = "9e7ff49d0a337c6dcff434e49b90d82ce114c2c9b3f33a4af83833905648d010", + git_commit = "54c69432c2eb8b138102390cd716047b5d692071", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6ee0465990ccd7ce8e78957e692c4b9683247a63 Mon Sep 17 00:00:00 2001 From: olston Date: Wed, 22 Aug 2018 05:40:44 -0700 Subject: [PATCH 0758/8103] Enable model version labels in the model server. PiperOrigin-RevId: 209751560 --- tensorflow_serving/model_servers/server_core.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tensorflow_serving/model_servers/server_core.h b/tensorflow_serving/model_servers/server_core.h index df864fddfa5..027b8023394 100644 --- a/tensorflow_serving/model_servers/server_core.h +++ b/tensorflow_serving/model_servers/server_core.h @@ -142,8 +142,7 @@ class ServerCore : public Manager { // Whether to permit incoming ModelSpec requests to use the 'version_label' // field. - // TODO(b/65245500): Flip the default to true. - bool allow_version_labels = false; + bool allow_version_labels = true; // Logger used for logging requests hitting the server. std::unique_ptr server_request_logger; From 18145b9a9ca3e7b01a11c5f6ca700233fa8e0c1c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 22 Aug 2018 06:01:13 -0700 Subject: [PATCH 0759/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209753234 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d4352bfb8bb..642c3d8ad10 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9e7ff49d0a337c6dcff434e49b90d82ce114c2c9b3f33a4af83833905648d010", - git_commit = "54c69432c2eb8b138102390cd716047b5d692071", + sha256 = "39a8146962f52ef696ab565992bb4b1c920d91d4e8a64e575c4aa7a66c5aa4c3", + git_commit = "ce40173f61c79af05dcd0e0330cdb80bb179585d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b80e70725ded567b1fc205fc53e8828a1d468ec1 Mon Sep 17 00:00:00 2001 From: awk Date: Wed, 22 Aug 2018 10:57:00 -0700 Subject: [PATCH 0760/8103] Add build status badges for continuous+nightly builds. PiperOrigin-RevId: 209792937 --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1e628c212cf..092a2870a1f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,9 @@ # TensorFlow Serving -![Build Status](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges/ubuntu.png) +![Ubuntu Build Status](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges/ubuntu.svg) +![Ubuntu TF Head Build Status](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges/ubuntu-tf-head.svg) +![Docker CPU Nightly Build Status](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges/docker-cpu-nightly.svg) +![Docker GPU Nightly Build Status](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges/docker-gpu-nightly.svg) TensorFlow Serving is an open-source software library for serving machine learning models. It deals with the *inference* aspect of machine From 6ee910b5c8e1cec3be176bab141d56223459076b Mon Sep 17 00:00:00 2001 From: awk Date: Wed, 22 Aug 2018 11:30:22 -0700 Subject: [PATCH 0761/8103] Remove status of "TF Head" build. Existing "Ubuntu Build" provides enough signal on the state of the gitrepo. PiperOrigin-RevId: 209799778 --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 092a2870a1f..9a8b4b57dd8 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ # TensorFlow Serving ![Ubuntu Build Status](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges/ubuntu.svg) -![Ubuntu TF Head Build Status](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges/ubuntu-tf-head.svg) ![Docker CPU Nightly Build Status](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges/docker-cpu-nightly.svg) ![Docker GPU Nightly Build Status](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges/docker-gpu-nightly.svg) From a57f16b9c7e0b9f369472ee51548ded54a07d2ad Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 22 Aug 2018 12:01:12 -0700 Subject: [PATCH 0762/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209805263 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 642c3d8ad10..2d66ea2fd96 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "39a8146962f52ef696ab565992bb4b1c920d91d4e8a64e575c4aa7a66c5aa4c3", - git_commit = "ce40173f61c79af05dcd0e0330cdb80bb179585d", + sha256 = "eb21824e33823ec1f4bf02f27aa6d87b854d29823ee91cdc901e244749a563c8", + git_commit = "792a367350318a8d695dd626fe1e32a07b1023e1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2abf703f1f4f624d7bd704c16b4e9779d460a1a0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 22 Aug 2018 12:09:20 -0700 Subject: [PATCH 0763/8103] Replaced calls to tensorflow::StringPiece::ToString with string conversions. That is, instances of sp.ToString() are replaced with string(sp). This will allow tensorflow::StringPiece::ToString to be removed, which is necessary before it can be replaced with absl::string_view. PiperOrigin-RevId: 209806694 --- tensorflow_serving/model_servers/server_core_test.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/model_servers/server_core_test.cc b/tensorflow_serving/model_servers/server_core_test.cc index 5e1430a8076..b7bd0eb96eb 100644 --- a/tensorflow_serving/model_servers/server_core_test.cc +++ b/tensorflow_serving/model_servers/server_core_test.cc @@ -199,8 +199,8 @@ class RelativePathsServerCoreTest : public ServerCoreTest { ModelConfig& relative = *result.mutable_model_config_list()->mutable_config(0); relative.set_name(strings::StrCat(model_name, "_relative")); - const string dirname = Dirname(relative.base_path()).ToString(); - const string basename = Basename(relative.base_path()).ToString(); + const string dirname(Dirname(relative.base_path())); + const string basename(Basename(relative.base_path())); CHECK(!dirname.empty()); CHECK(!basename.empty()); relative.set_base_path(basename); From 7a6e9d06b4d6c99a38b3d31c9569c055a0ba257c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 22 Aug 2018 13:00:34 -0700 Subject: [PATCH 0764/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209814898 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2d66ea2fd96..1be22db46d3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eb21824e33823ec1f4bf02f27aa6d87b854d29823ee91cdc901e244749a563c8", - git_commit = "792a367350318a8d695dd626fe1e32a07b1023e1", + sha256 = "5c613580d70f75fe542c7565d9f142a0b5bf0bc7e3e203adbd024733df6e8a64", + git_commit = "36e475ce4d0a3565a81329641e2a95152eb9ebc6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b39feb2696a79be00cfade140ed6d327d3867dd8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 22 Aug 2018 14:01:14 -0700 Subject: [PATCH 0765/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209825089 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1be22db46d3..47af92a1949 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5c613580d70f75fe542c7565d9f142a0b5bf0bc7e3e203adbd024733df6e8a64", - git_commit = "36e475ce4d0a3565a81329641e2a95152eb9ebc6", + sha256 = "df228eda215577d63d8baecf355730ebdad1e64dec70eef40e7e1ba33dfc88dd", + git_commit = "d45904a6165857a58ce5a82a20bdd38a5d00c5ec", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f8a4c99d6e6382a3bb65d13d30b2528b2913a8c8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 22 Aug 2018 15:01:50 -0700 Subject: [PATCH 0766/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209836354 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 47af92a1949..b38b111ed82 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "df228eda215577d63d8baecf355730ebdad1e64dec70eef40e7e1ba33dfc88dd", - git_commit = "d45904a6165857a58ce5a82a20bdd38a5d00c5ec", + sha256 = "27da89dff35e3690b2834ef4c4618496a9879b9f58cbfc45049990c5a89057d6", + git_commit = "21cdc5b13e3eeb873f92648f229ad29b3b7b1129", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b6af27214c9d85a406b86029ab1be0509722d45e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 22 Aug 2018 16:00:52 -0700 Subject: [PATCH 0767/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209845959 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b38b111ed82..0c67250c90a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "27da89dff35e3690b2834ef4c4618496a9879b9f58cbfc45049990c5a89057d6", - git_commit = "21cdc5b13e3eeb873f92648f229ad29b3b7b1129", + sha256 = "2e1281068c850fe9992d2c246512f0fd59f2722318a581e39033720c17cfd880", + git_commit = "b56e4377687b95014fa8dadc8e99192484fa79a0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e33204e95bb7b543ff13a902146cdd1596948140 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 22 Aug 2018 17:06:52 -0700 Subject: [PATCH 0768/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209856090 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0c67250c90a..3fc5a7cf587 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2e1281068c850fe9992d2c246512f0fd59f2722318a581e39033720c17cfd880", - git_commit = "b56e4377687b95014fa8dadc8e99192484fa79a0", + sha256 = "bd99b8cb02b1ec0cc0ec05325f8e8234de250132330342da36317e3d3be71ed4", + git_commit = "73c7768904554b5b2b6420556b52bfaf43453423", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a98201b50fff1fb2aebb409ae96c6c1e7c98287b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 22 Aug 2018 18:13:42 -0700 Subject: [PATCH 0769/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209863960 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3fc5a7cf587..142bc44da0a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bd99b8cb02b1ec0cc0ec05325f8e8234de250132330342da36317e3d3be71ed4", - git_commit = "73c7768904554b5b2b6420556b52bfaf43453423", + sha256 = "2e11aa4c765506edef77389851471a64287cd0053f54375ff7171973455c4afc", + git_commit = "4f8d296f5f7e149973ce0cda526eb808f4e9b5db", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2215e7eb3a1751623445a0d79d777db59c7de50b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 22 Aug 2018 19:30:28 -0700 Subject: [PATCH 0770/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209870287 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 142bc44da0a..d9459b308ac 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2e11aa4c765506edef77389851471a64287cd0053f54375ff7171973455c4afc", - git_commit = "4f8d296f5f7e149973ce0cda526eb808f4e9b5db", + sha256 = "6e2736c57d32df3baccb4e5a59326df6773ed5219235f9edab784e53697945ef", + git_commit = "b7b3f571728898c6d822aa1252d20bced15b989d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 628702e1de1fa3d679369e9546e7d74fa91154d3 Mon Sep 17 00:00:00 2001 From: awk Date: Wed, 22 Aug 2018 20:35:05 -0700 Subject: [PATCH 0771/8103] Rename class from HttpRestPredictionHandler -> HttpRestApiHandler, so it be used to for additional REST API methods and not be limited to just prediction APIs. This class is mostly a router from HTTP endpoints to internal worker classes, and is expected to stay small even as other REST API endpoints get added. PiperOrigin-RevId: 209874946 --- tensorflow_serving/model_servers/BUILD | 14 +++++------ ...on_handler.cc => http_rest_api_handler.cc} | 20 ++++++++-------- ...tion_handler.h => http_rest_api_handler.h} | 16 ++++++------- ..._test.cc => http_rest_api_handler_test.cc} | 24 +++++++++---------- .../model_servers/http_server.cc | 8 +++---- 5 files changed, 41 insertions(+), 41 deletions(-) rename tensorflow_serving/model_servers/{http_rest_prediction_handler.cc => http_rest_api_handler.cc} (92%) rename tensorflow_serving/model_servers/{http_rest_prediction_handler.h => http_rest_api_handler.h} (88%) rename tensorflow_serving/model_servers/{http_rest_prediction_handler_test.cc => http_rest_api_handler_test.cc} (95%) diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index fbfc26bbca5..44ae85b1d27 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -157,12 +157,12 @@ cc_test( ) cc_test( - name = "http_rest_prediction_handler_test", + name = "http_rest_api_handler_test", size = "medium", - srcs = ["http_rest_prediction_handler_test.cc"], + srcs = ["http_rest_api_handler_test.cc"], data = ["@org_tensorflow//tensorflow/cc/saved_model:saved_model_half_plus_two"], deps = [ - ":http_rest_prediction_handler", + ":http_rest_api_handler", ":model_platform_types", ":platform_config_util", ":server_core", @@ -241,7 +241,7 @@ cc_library( hdrs = ["http_server.h"], visibility = ["//tensorflow_serving:internal"], deps = [ - ":http_rest_prediction_handler", + ":http_rest_api_handler", ":server_core", "//tensorflow_serving/util:threadpool_executor", "//tensorflow_serving/util/net_http/server/public:http_server", @@ -254,9 +254,9 @@ cc_library( ) cc_library( - name = "http_rest_prediction_handler", - srcs = ["http_rest_prediction_handler.cc"], - hdrs = ["http_rest_prediction_handler.h"], + name = "http_rest_api_handler", + srcs = ["http_rest_api_handler.cc"], + hdrs = ["http_rest_api_handler.h"], visibility = ["//visibility:public"], deps = [ ":server_core", diff --git a/tensorflow_serving/model_servers/http_rest_prediction_handler.cc b/tensorflow_serving/model_servers/http_rest_api_handler.cc similarity index 92% rename from tensorflow_serving/model_servers/http_rest_prediction_handler.cc rename to tensorflow_serving/model_servers/http_rest_api_handler.cc index 2e54ca79609..25dab960217 100644 --- a/tensorflow_serving/model_servers/http_rest_prediction_handler.cc +++ b/tensorflow_serving/model_servers/http_rest_api_handler.cc @@ -13,7 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. ==============================================================================*/ -#include "tensorflow_serving/model_servers/http_rest_prediction_handler.h" +#include "tensorflow_serving/model_servers/http_rest_api_handler.h" #include @@ -39,10 +39,10 @@ namespace serving { using tensorflow::serving::ServerCore; using tensorflow::serving::TensorflowPredictor; -const char* const HttpRestPredictionHandler::kPathRegex = "(?i)/v1/.*"; +const char* const HttpRestApiHandler::kPathRegex = "(?i)/v1/.*"; -HttpRestPredictionHandler::HttpRestPredictionHandler( - const RunOptions& run_options, ServerCore* core) +HttpRestApiHandler::HttpRestApiHandler(const RunOptions& run_options, + ServerCore* core) : run_options_(run_options), core_(core), predictor_(new TensorflowPredictor(true /* use_saved_model */)), @@ -50,7 +50,7 @@ HttpRestPredictionHandler::HttpRestPredictionHandler( R"((?i)/v1/models/([^/:]+)(?:/versions/(\d+))?:(classify|regress|predict))") { } -HttpRestPredictionHandler::~HttpRestPredictionHandler() {} +HttpRestApiHandler::~HttpRestApiHandler() {} namespace { @@ -68,7 +68,7 @@ void FillJsonErrorMsg(const string& errmsg, string* output) { } // namespace -Status HttpRestPredictionHandler::ProcessRequest( +Status HttpRestApiHandler::ProcessRequest( const absl::string_view http_method, const absl::string_view request_path, const absl::string_view request_body, std::vector>* headers, string* output) { @@ -109,7 +109,7 @@ Status HttpRestPredictionHandler::ProcessRequest( return status; } -Status HttpRestPredictionHandler::ProcessClassifyRequest( +Status HttpRestApiHandler::ProcessClassifyRequest( const absl::string_view model_name, const absl::optional& model_version, const absl::string_view request_body, string* output) { @@ -129,7 +129,7 @@ Status HttpRestPredictionHandler::ProcessClassifyRequest( return Status::OK(); } -Status HttpRestPredictionHandler::ProcessRegressRequest( +Status HttpRestApiHandler::ProcessRegressRequest( const absl::string_view model_name, const absl::optional& model_version, const absl::string_view request_body, string* output) { @@ -148,7 +148,7 @@ Status HttpRestPredictionHandler::ProcessRegressRequest( return Status::OK(); } -Status HttpRestPredictionHandler::ProcessPredictRequest( +Status HttpRestApiHandler::ProcessPredictRequest( const absl::string_view model_name, const absl::optional& model_version, const absl::string_view request_body, string* output) { @@ -174,7 +174,7 @@ Status HttpRestPredictionHandler::ProcessPredictRequest( return Status::OK(); } -Status HttpRestPredictionHandler::GetInfoMap( +Status HttpRestApiHandler::GetInfoMap( const ModelSpec& model_spec, const string& signature_name, ::google::protobuf::Map* infomap) { ServableHandle bundle; diff --git a/tensorflow_serving/model_servers/http_rest_prediction_handler.h b/tensorflow_serving/model_servers/http_rest_api_handler.h similarity index 88% rename from tensorflow_serving/model_servers/http_rest_prediction_handler.h rename to tensorflow_serving/model_servers/http_rest_api_handler.h index d3ad10184ed..deec9c68107 100644 --- a/tensorflow_serving/model_servers/http_rest_prediction_handler.h +++ b/tensorflow_serving/model_servers/http_rest_api_handler.h @@ -12,8 +12,8 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ==============================================================================*/ -#ifndef TENSORFLOW_SERVING_MODEL_SERVERS_HTTP_REST_PREDICTION_HANDLER_H_ -#define TENSORFLOW_SERVING_MODEL_SERVERS_HTTP_REST_PREDICTION_HANDLER_H_ +#ifndef TENSORFLOW_SERVING_MODEL_SERVERS_HTTP_REST_API_HANDLER_H_ +#define TENSORFLOW_SERVING_MODEL_SERVERS_HTTP_REST_API_HANDLER_H_ #include #include @@ -37,7 +37,7 @@ class ServerCore; class TensorflowPredictor; class ModelSpec; -// HttpRestPredictionHandler handles HTTP/REST APIs of TF serving. +// HttpRestApiHandler handles HTTP/REST APIs of TF serving. // // Currently supported APIs are as follows: // @@ -57,7 +57,7 @@ class ModelSpec; // method. // // This class is thread safe. -class HttpRestPredictionHandler { +class HttpRestApiHandler { public: // Returns a regex that captures all API paths handled by this handler. // Typical use of this method is to register request paths with underlying @@ -65,11 +65,11 @@ class HttpRestPredictionHandler { static const char* const kPathRegex; // API calls are configured to timeout after `run_optons.timeout_in_ms`. - // `core` is not owned and is expected to outlive HttpRestPredictionHandler + // `core` is not owned and is expected to outlive HttpRestApiHandler // instance. - HttpRestPredictionHandler(const RunOptions& run_options, ServerCore* core); + HttpRestApiHandler(const RunOptions& run_options, ServerCore* core); - ~HttpRestPredictionHandler(); + ~HttpRestApiHandler(); // Process a HTTP request. // @@ -111,4 +111,4 @@ class HttpRestPredictionHandler { } // namespace serving } // namespace tensorflow -#endif // TENSORFLOW_SERVING_MODEL_SERVERS_HTTP_REST_PREDICTION_HANDLER_H_ +#endif // TENSORFLOW_SERVING_MODEL_SERVERS_HTTP_REST_API_HANDLER_H_ diff --git a/tensorflow_serving/model_servers/http_rest_prediction_handler_test.cc b/tensorflow_serving/model_servers/http_rest_api_handler_test.cc similarity index 95% rename from tensorflow_serving/model_servers/http_rest_prediction_handler_test.cc rename to tensorflow_serving/model_servers/http_rest_api_handler_test.cc index c79475fa7fb..668132d917f 100644 --- a/tensorflow_serving/model_servers/http_rest_prediction_handler_test.cc +++ b/tensorflow_serving/model_servers/http_rest_api_handler_test.cc @@ -13,7 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. ==============================================================================*/ -#include "tensorflow_serving/model_servers/http_rest_prediction_handler.h" +#include "tensorflow_serving/model_servers/http_rest_api_handler.h" #include #include @@ -56,7 +56,7 @@ constexpr int kTestModelVersion1 = 123; using HeaderList = std::vector>; -class HttpRestPredictionHandlerTest : public ::testing::Test { +class HttpRestApiHandlerTest : public ::testing::Test { public: static void SetUpTestCase() { TF_ASSERT_OK(CreateServerCore(&server_core_)); @@ -75,7 +75,7 @@ class HttpRestPredictionHandlerTest : public ::testing::Test { static void TearDownTestCase() { server_core_.reset(); } protected: - HttpRestPredictionHandlerTest() : handler_(RunOptions(), GetServerCore()) {} + HttpRestApiHandlerTest() : handler_(RunOptions(), GetServerCore()) {} static Status CreateServerCore(std::unique_ptr* server_core) { ModelServerConfig config; @@ -131,13 +131,13 @@ class HttpRestPredictionHandlerTest : public ::testing::Test { ServerCore* GetServerCore() { return server_core_.get(); } - HttpRestPredictionHandler handler_; + HttpRestApiHandler handler_; private: static std::unique_ptr server_core_; }; -std::unique_ptr HttpRestPredictionHandlerTest::server_core_; +std::unique_ptr HttpRestApiHandlerTest::server_core_; Status CompareJson(const string& json1, const string& json2) { rapidjson::Document doc1; @@ -159,13 +159,13 @@ Status CompareJson(const string& json1, const string& json2) { return Status::OK(); } -TEST_F(HttpRestPredictionHandlerTest, kPathRegex) { +TEST_F(HttpRestApiHandlerTest, kPathRegex) { EXPECT_TRUE(RE2::FullMatch("/v1/models", handler_.kPathRegex)); EXPECT_FALSE(RE2::FullMatch("/statuspage", handler_.kPathRegex)); EXPECT_FALSE(RE2::FullMatch("/index", handler_.kPathRegex)); } -TEST_F(HttpRestPredictionHandlerTest, UnsupportedApiCalls) { +TEST_F(HttpRestApiHandlerTest, UnsupportedApiCalls) { HeaderList headers; string output; Status status; @@ -224,7 +224,7 @@ TEST_F(HttpRestPredictionHandlerTest, UnsupportedApiCalls) { EXPECT_THAT(status.error_message(), HasSubstr("Failed to convert version")); } -TEST_F(HttpRestPredictionHandlerTest, PredictModelNameVersionErrors) { +TEST_F(HttpRestApiHandlerTest, PredictModelNameVersionErrors) { HeaderList headers; string output; Status status; @@ -247,7 +247,7 @@ TEST_F(HttpRestPredictionHandlerTest, PredictModelNameVersionErrors) { EXPECT_TRUE(errors::IsNotFound(status)); } -TEST_F(HttpRestPredictionHandlerTest, PredictRequestErrors) { +TEST_F(HttpRestApiHandlerTest, PredictRequestErrors) { HeaderList headers; string output; Status status; @@ -274,7 +274,7 @@ TEST_F(HttpRestPredictionHandlerTest, PredictRequestErrors) { EXPECT_THAT(status.error_message(), HasSubstr("not of expected type: float")); } -TEST_F(HttpRestPredictionHandlerTest, Predict) { +TEST_F(HttpRestApiHandlerTest, Predict) { HeaderList headers; string output; Status status; @@ -320,7 +320,7 @@ TEST_F(HttpRestPredictionHandlerTest, Predict) { (HeaderList){{"Content-Type", "application/json"}})); } -TEST_F(HttpRestPredictionHandlerTest, Regress) { +TEST_F(HttpRestApiHandlerTest, Regress) { HeaderList headers; string output; Status status; @@ -345,7 +345,7 @@ TEST_F(HttpRestPredictionHandlerTest, Regress) { (HeaderList){{"Content-Type", "application/json"}})); } -TEST_F(HttpRestPredictionHandlerTest, Classify) { +TEST_F(HttpRestApiHandlerTest, Classify) { HeaderList headers; string output; Status status; diff --git a/tensorflow_serving/model_servers/http_server.cc b/tensorflow_serving/model_servers/http_server.cc index ad156fca7a9..4f4ad460516 100644 --- a/tensorflow_serving/model_servers/http_server.cc +++ b/tensorflow_serving/model_servers/http_server.cc @@ -20,7 +20,7 @@ limitations under the License. #include "re2/re2.h" #include "tensorflow/core/platform/env.h" #include "tensorflow/core/platform/logging.h" -#include "tensorflow_serving/model_servers/http_rest_prediction_handler.h" +#include "tensorflow_serving/model_servers/http_rest_api_handler.h" #include "tensorflow_serving/model_servers/http_server.h" #include "tensorflow_serving/model_servers/server_core.h" #include "tensorflow_serving/util/net_http/server/public/httpserver.h" @@ -93,10 +93,10 @@ class RequestExecutor final : public net_http::EventExecutor { class RestApiRequestDispatcher { public: RestApiRequestDispatcher(int timeout_in_ms, ServerCore* core) - : regex_(HttpRestPredictionHandler::kPathRegex) { + : regex_(HttpRestApiHandler::kPathRegex) { RunOptions run_options = RunOptions(); run_options.set_timeout_in_ms(timeout_in_ms); - handler_.reset(new HttpRestPredictionHandler(run_options, core)); + handler_.reset(new HttpRestApiHandler(run_options, core)); } net_http::RequestHandler Dispatch(net_http::ServerRequestInterface* req) { @@ -141,7 +141,7 @@ class RestApiRequestDispatcher { } const RE2 regex_; - std::unique_ptr handler_; + std::unique_ptr handler_; }; } // namespace From 7f58faa3c60fc6a216570bd6a863b92ac0507ab6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 22 Aug 2018 20:46:17 -0700 Subject: [PATCH 0772/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209875736 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d9459b308ac..117bfcc35a5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6e2736c57d32df3baccb4e5a59326df6773ed5219235f9edab784e53697945ef", - git_commit = "b7b3f571728898c6d822aa1252d20bced15b989d", + sha256 = "66d3197c7c7a7647c43daac022347e64c9a148e40f8612f74bf8eb6c552450f5", + git_commit = "8db22dc063e6a6bb16b4676e53446987dac99a49", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5c2407bb6f8bff1cc6aae0ba5c941d69ab1a70f3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 22 Aug 2018 21:59:00 -0700 Subject: [PATCH 0773/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209880622 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 117bfcc35a5..46269ac1332 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "66d3197c7c7a7647c43daac022347e64c9a148e40f8612f74bf8eb6c552450f5", - git_commit = "8db22dc063e6a6bb16b4676e53446987dac99a49", + sha256 = "6a7776a42ad061ce31cc6450fd178a91b9c638b8cded47ba461c9e8fe171f892", + git_commit = "abd64d680b9afa37e8c0a7ce5504c1f7c1a81fbc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 050c5d981298e9edaf7d999a89d9df7bd19877b1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 22 Aug 2018 22:49:31 -0700 Subject: [PATCH 0774/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209884317 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 46269ac1332..53ad119eea5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6a7776a42ad061ce31cc6450fd178a91b9c638b8cded47ba461c9e8fe171f892", - git_commit = "abd64d680b9afa37e8c0a7ce5504c1f7c1a81fbc", + sha256 = "ca4ee52b6f40188bed0642775af4eec844a73be99339b7a17cdd4d4154b9217f", + git_commit = "9599449ed686c3660eb628708146d1f94fcb94eb", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9187f8dbaa3e401fcaa4d4f9bbc3a2fbc9038490 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 Aug 2018 01:03:07 -0700 Subject: [PATCH 0775/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209894876 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 53ad119eea5..01a0ddb41c0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ca4ee52b6f40188bed0642775af4eec844a73be99339b7a17cdd4d4154b9217f", - git_commit = "9599449ed686c3660eb628708146d1f94fcb94eb", + sha256 = "560bfa94e5868f201351e88132daedd6d196772d6e8b16bf35344eebf7e2fd30", + git_commit = "5306e10929e8b5aa05c49d32d4a147ca9786ddfa", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3bc0c719011fe71f701be9b3d1775e75ed8911a1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 Aug 2018 02:00:47 -0700 Subject: [PATCH 0776/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209900704 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 01a0ddb41c0..913c172ddf6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "560bfa94e5868f201351e88132daedd6d196772d6e8b16bf35344eebf7e2fd30", - git_commit = "5306e10929e8b5aa05c49d32d4a147ca9786ddfa", + sha256 = "62814dce69573bc89bca948df7e9c09ceaadf3fc41076bb2400b8787add6fa18", + git_commit = "2455e694e97f2d5101481a8df0e0a9906a69c150", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c9335fae6213a6f20fda84e9d717abd12dee3309 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 Aug 2018 04:07:30 -0700 Subject: [PATCH 0777/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209913796 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 913c172ddf6..02a0faa69d5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "62814dce69573bc89bca948df7e9c09ceaadf3fc41076bb2400b8787add6fa18", - git_commit = "2455e694e97f2d5101481a8df0e0a9906a69c150", + sha256 = "d59a05b9183cd4d184b40def248c4e230ace42113f0135611cb3c82c45892e33", + git_commit = "d2c36c1b3e84e4e29c2853aa421ada45ff5fd396", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9f5d75b47d0ed4a28793e5640d992683a6d37524 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 Aug 2018 08:02:09 -0700 Subject: [PATCH 0778/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209936141 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 02a0faa69d5..60c6cd6eefb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d59a05b9183cd4d184b40def248c4e230ace42113f0135611cb3c82c45892e33", - git_commit = "d2c36c1b3e84e4e29c2853aa421ada45ff5fd396", + sha256 = "c80e6fefb57b4cd60af4b353a4a2e3d1a2ba237a6d34d5e1d25da48f5d1965ec", + git_commit = "9289302ad3d7941ddb9ce2d0dff56b333cbcf208", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 13b8ca571e9fa02cccca0b8689ed710079494c78 Mon Sep 17 00:00:00 2001 From: tianyapiaozi Date: Fri, 24 Aug 2018 00:05:45 +0800 Subject: [PATCH 0779/8103] Add missing dependency to tensorflow-serving-api build_pip_package --- tensorflow_serving/tools/pip_package/BUILD | 1 + tensorflow_serving/tools/pip_package/build_pip_package.sh | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/tensorflow_serving/tools/pip_package/BUILD b/tensorflow_serving/tools/pip_package/BUILD index c1300e869ad..8450f821fba 100644 --- a/tensorflow_serving/tools/pip_package/BUILD +++ b/tensorflow_serving/tools/pip_package/BUILD @@ -27,5 +27,6 @@ sh_binary( "//tensorflow_serving/config:model_server_config_proto_py_pb2", "//tensorflow_serving/sources/storage_path:file_system_storage_path_source_proto_py_pb2", "//tensorflow_serving/util:status_proto_py_pb2", + "//tensorflow_serving/core:logging_proto_py_pb2", ], ) diff --git a/tensorflow_serving/tools/pip_package/build_pip_package.sh b/tensorflow_serving/tools/pip_package/build_pip_package.sh index 2fba7336489..48d9e1184ce 100755 --- a/tensorflow_serving/tools/pip_package/build_pip_package.sh +++ b/tensorflow_serving/tools/pip_package/build_pip_package.sh @@ -35,6 +35,7 @@ function main() { echo $(date) : "=== Using tmpdir: ${TMPDIR}" mkdir -p ${TMPDIR}/tensorflow_serving/apis mkdir -p ${TMPDIR}/tensorflow_serving/config + mkdir -p ${TMPDIR}/tensorflow_serving/core mkdir -p ${TMPDIR}/tensorflow_serving/sources/storage_path mkdir -p ${TMPDIR}/tensorflow_serving/util @@ -51,6 +52,9 @@ function main() { cp bazel-genfiles/tensorflow_serving/config/*_pb2.py \ "${TMPDIR}/tensorflow_serving/config" + cp bazel-genfiles/tensorflow_serving/core/*_pb2.py \ + "${TMPDIR}/tensorflow_serving/core" + cp bazel-genfiles/tensorflow_serving/sources/storage_path/*_pb2.py \ "${TMPDIR}/tensorflow_serving/sources/storage_path" @@ -59,6 +63,7 @@ function main() { touch "${TMPDIR}/tensorflow_serving/apis/__init__.py" touch "${TMPDIR}/tensorflow_serving/config/__init__.py" + touch "${TMPDIR}/tensorflow_serving/core/__init__.py" touch "${TMPDIR}/tensorflow_serving/sources/__init__.py" touch "${TMPDIR}/tensorflow_serving/sources/storage_path/__init__.py" touch "${TMPDIR}/tensorflow_serving/util/__init__.py" From a94542b30d56a0f6ff9d53c4b2f75643b076d6e5 Mon Sep 17 00:00:00 2001 From: Feisan Date: Thu, 23 Aug 2018 10:27:41 -0700 Subject: [PATCH 0780/8103] Meet Alpine Linux requirements for mktemp mktemp TEMPLATE must end with XXXXXX in Alpine Linux % docker run --rm -it alpine:3.6 /bin/sh / # mktemp -d -t libevent.XXXXX mktemp: Invalid argument / # mktemp -d -t libevent.XXXXXX /tmp/libevent.jKecLG / # mktemp --help BusyBox v1.26.2 (2017-11-23 08:40:54 GMT) multi-call binary. Usage: mktemp [-dt] [-p DIR] [TEMPLATE] Create a temporary file with name based on TEMPLATE and print its name. TEMPLATE must end with XXXXXX (e.g. [/dir/]nameXXXXXX). Without TEMPLATE, -t tmp.XXXXXX is assumed. -d Make directory, not file -q Fail silently on errors -t Prepend base directory name to TEMPLATE -p DIR Use DIR as a base directory (implies -t) -u Do not create anything; print a name Base directory is: -p DIR, else $TMPDIR, else /tmp --- third_party/libevent.BUILD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third_party/libevent.BUILD b/third_party/libevent.BUILD index 27e0ef2fadd..4083384e512 100644 --- a/third_party/libevent.BUILD +++ b/third_party/libevent.BUILD @@ -54,7 +54,7 @@ genrule( outs = include_files + lib_files, cmd = "\n".join([ "export INSTALL_DIR=$$(pwd)/$(@D)/libevent", - "export TMP_DIR=$$(mktemp -d -t libevent.XXXXX)", + "export TMP_DIR=$$(mktemp -d -t libevent.XXXXXX)", "mkdir -p $$TMP_DIR", "cp -R $$(pwd)/external/com_github_libevent_libevent/* $$TMP_DIR", "cd $$TMP_DIR", From 1c42822bc130c30393aeb679607a37857e10480c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 Aug 2018 11:02:03 -0700 Subject: [PATCH 0781/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209964879 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 60c6cd6eefb..0730480cbb4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c80e6fefb57b4cd60af4b353a4a2e3d1a2ba237a6d34d5e1d25da48f5d1965ec", - git_commit = "9289302ad3d7941ddb9ce2d0dff56b333cbcf208", + sha256 = "bc6c2e31b0b69f5f16ff1b59ab43213dcacb9e58881ef60dda6fedc3f7fd32f5", + git_commit = "5da5e8af4650287c9dcde8869ac1158d79c1415f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b4168deff0277aab2ae0fc2ae05d3c5365ba5c40 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 Aug 2018 12:05:48 -0700 Subject: [PATCH 0782/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209976364 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0730480cbb4..6e1ef0ccd35 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bc6c2e31b0b69f5f16ff1b59ab43213dcacb9e58881ef60dda6fedc3f7fd32f5", - git_commit = "5da5e8af4650287c9dcde8869ac1158d79c1415f", + sha256 = "301ee7db6322a18e10222c8e747f03e2d590acd02825b9078d8ebefc41cc8567", + git_commit = "d232dee9f9efab16608e0f08ab82c1f51aff78a0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6f46c7a60c3b07dc7d43c16399619d582ac47fb3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 Aug 2018 13:00:35 -0700 Subject: [PATCH 0783/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209984345 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6e1ef0ccd35..0a2e25ab3a9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "301ee7db6322a18e10222c8e747f03e2d590acd02825b9078d8ebefc41cc8567", - git_commit = "d232dee9f9efab16608e0f08ab82c1f51aff78a0", + sha256 = "868232548e988a5cd3a79c98a044957b8e54d8ad57b5e9a0c77f2c7cfb8c1c55", + git_commit = "51f4489bbbb27956532b09ad7995ba70b0c4f8ce", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 43f2ffcb850ebd43b71296fd9b2e52eef745bdb9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 Aug 2018 14:01:53 -0700 Subject: [PATCH 0784/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 209995175 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0a2e25ab3a9..c07fc180aea 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "868232548e988a5cd3a79c98a044957b8e54d8ad57b5e9a0c77f2c7cfb8c1c55", - git_commit = "51f4489bbbb27956532b09ad7995ba70b0c4f8ce", + sha256 = "d28bdf2ff27a1076b944b68b262940af47d99e4616ef22863ce3f8581a7d39e5", + git_commit = "ca0a848d3673eeb4f6c3f1794b51c64e731fb12c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4ee579df5d6920b8e446bb49ebb0727c847c7734 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 Aug 2018 15:02:35 -0700 Subject: [PATCH 0785/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210006923 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c07fc180aea..9f362b927a0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d28bdf2ff27a1076b944b68b262940af47d99e4616ef22863ce3f8581a7d39e5", - git_commit = "ca0a848d3673eeb4f6c3f1794b51c64e731fb12c", + sha256 = "8007bdeb7ea52a28013da4256a577ba85cf903a25786575f6bf9707565506029", + git_commit = "c0d88a5b6c81fc4651cdb9678c6bc9608139e256", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 613df25e2a7a3e8a10458dfeb0c52b578fb9e4a2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 Aug 2018 16:01:18 -0700 Subject: [PATCH 0786/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210016839 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9f362b927a0..c03255d79d4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8007bdeb7ea52a28013da4256a577ba85cf903a25786575f6bf9707565506029", - git_commit = "c0d88a5b6c81fc4651cdb9678c6bc9608139e256", + sha256 = "c34839df0915daf98872c4c3f45379d3e358463af26f72fb241bb52cc1164534", + git_commit = "f06551280b27f7fb4e06c4d7ff5fe8e3fd606a9a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2afa7a64f1de827d7ce4e0b9ab7cad8bb8c8beba Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 Aug 2018 17:02:01 -0700 Subject: [PATCH 0787/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210026153 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c03255d79d4..48b4c6ba42d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c34839df0915daf98872c4c3f45379d3e358463af26f72fb241bb52cc1164534", - git_commit = "f06551280b27f7fb4e06c4d7ff5fe8e3fd606a9a", + sha256 = "9d1a511db78ffc1238b4b1805779e755a0fbaa86bb2106843eef9ff293a007e4", + git_commit = "3dd67a1e399505a297bbdd58440b06855c92a35d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 92d37935f165b6070ec104a33afe7a81ebfed756 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 Aug 2018 18:00:54 -0700 Subject: [PATCH 0788/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210033704 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 48b4c6ba42d..23b965cd3f4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9d1a511db78ffc1238b4b1805779e755a0fbaa86bb2106843eef9ff293a007e4", - git_commit = "3dd67a1e399505a297bbdd58440b06855c92a35d", + sha256 = "58a2f8a03ba10269b27f3a26bcea14b23de0beb2f8d8def0447d91856f254946", + git_commit = "516fb9bd3459b25cf10bb75d0d567b64a29ca4b1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 859fe9ffd667c846267b75a6cf23428bff056c61 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 Aug 2018 19:01:44 -0700 Subject: [PATCH 0789/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210039159 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 23b965cd3f4..d570636adee 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "58a2f8a03ba10269b27f3a26bcea14b23de0beb2f8d8def0447d91856f254946", - git_commit = "516fb9bd3459b25cf10bb75d0d567b64a29ca4b1", + sha256 = "04b030f777d9161d28448fb284822bec2ea79705f265cf11255e2aa54d585890", + git_commit = "b38d6575ef8d2cdfcfb1ef22a09743087c00d451", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8872b892a41a36d0b34dd60a7b84c9f43b48fa66 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 Aug 2018 20:00:58 -0700 Subject: [PATCH 0790/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210043179 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d570636adee..c04a0791a7a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "04b030f777d9161d28448fb284822bec2ea79705f265cf11255e2aa54d585890", - git_commit = "b38d6575ef8d2cdfcfb1ef22a09743087c00d451", + sha256 = "536fd4b92f091f15b583657f522734b46be523e831788512a4570036f24c5def", + git_commit = "9a2dab1f73a8cd765f22b67809f4c7d20f343fab", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0d19556aa265d04b572fc0cbd1a23bd36b8c74e5 Mon Sep 17 00:00:00 2001 From: ebrevdo Date: Thu, 23 Aug 2018 20:06:00 -0700 Subject: [PATCH 0791/8103] Directly import tensor.proto.h (the transitive import will be removed from tensor.h soon) We plan to remove the import variant.h from tensor.h; and variant.h brings in a lot of transitive imports (including protos like tensor.proto.h). To prepare, we're updating folks who this will break. PiperOrigin-RevId: 210043667 --- tensorflow_serving/servables/tensorflow/BUILD | 2 ++ tensorflow_serving/servables/tensorflow/predict_impl.h | 1 + 2 files changed, 3 insertions(+) diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index a8e3ac79d0e..b710cf87633 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -429,6 +429,8 @@ cc_library( "//tensorflow_serving/model_servers:server_core", "//tensorflow_serving/servables/tensorflow:util", "@org_tensorflow//tensorflow/cc/saved_model:loader", + "@org_tensorflow//tensorflow/core:lib", + "@org_tensorflow//tensorflow/core:protos_all_cc", ], ) diff --git a/tensorflow_serving/servables/tensorflow/predict_impl.h b/tensorflow_serving/servables/tensorflow/predict_impl.h index d61ddc62aa1..9c9bc3e8bb2 100644 --- a/tensorflow_serving/servables/tensorflow/predict_impl.h +++ b/tensorflow_serving/servables/tensorflow/predict_impl.h @@ -16,6 +16,7 @@ limitations under the License. #ifndef TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_PREDICT_IMPL_H_ #define TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_PREDICT_IMPL_H_ +#include "tensorflow/core/framework/tensor.pb.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/protobuf/config.pb.h" #include "tensorflow_serving/apis/predict.pb.h" From e337e2d1fef1429aa1bb5fcd1ebecd3cedf05107 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 Aug 2018 21:01:15 -0700 Subject: [PATCH 0792/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210047695 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c04a0791a7a..bd5a7606d0d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "536fd4b92f091f15b583657f522734b46be523e831788512a4570036f24c5def", - git_commit = "9a2dab1f73a8cd765f22b67809f4c7d20f343fab", + sha256 = "e0864aa3f3ba9aa9c2b024fc7b04e3bd41b194092f8eaafc10076b778ede53a2", + git_commit = "2bcf90f28b6a71a13468f9deb1fcbb2867fb89ee", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9c8d600e3916b5ddd42df9221ce8674f68731d91 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 Aug 2018 23:01:20 -0700 Subject: [PATCH 0793/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210055731 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bd5a7606d0d..8b0ad272a4f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e0864aa3f3ba9aa9c2b024fc7b04e3bd41b194092f8eaafc10076b778ede53a2", - git_commit = "2bcf90f28b6a71a13468f9deb1fcbb2867fb89ee", + sha256 = "ddd14296ea9ec8532ca4bb7b45ea4ad2768458651bd6cd20709efd23f34ef677", + git_commit = "e24b629d348bb5c4ecf87bacb325a4f1d1e03b4f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6574ebabf0d70a2ef0fcda3dff570e1d6567f91f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Aug 2018 00:01:31 -0700 Subject: [PATCH 0794/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210059511 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8b0ad272a4f..18dba2a1816 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ddd14296ea9ec8532ca4bb7b45ea4ad2768458651bd6cd20709efd23f34ef677", - git_commit = "e24b629d348bb5c4ecf87bacb325a4f1d1e03b4f", + sha256 = "8aa23b9feb66d96d0d2ae0d6216abb34a12f33922ed03ad059949ae9cab3df60", + git_commit = "b06b33cd8c6007f3aa78d2026a12f0d9fb12b274", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 31ff828a8de7f658976ab31cabd1c789ef62d717 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Aug 2018 01:03:53 -0700 Subject: [PATCH 0795/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210064831 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 18dba2a1816..720d6862875 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8aa23b9feb66d96d0d2ae0d6216abb34a12f33922ed03ad059949ae9cab3df60", - git_commit = "b06b33cd8c6007f3aa78d2026a12f0d9fb12b274", + sha256 = "f369a54060c2b16bcd94d545fc7b0321de28056b4d7b8754eb68e19b2b31b465", + git_commit = "0a1b9ed01e48092f4167e366cf7496c2b111ef6d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 531d2166ca1fdada1451090d2414d883f7f188c1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Aug 2018 02:01:35 -0700 Subject: [PATCH 0796/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210069954 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 720d6862875..43392261555 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f369a54060c2b16bcd94d545fc7b0321de28056b4d7b8754eb68e19b2b31b465", - git_commit = "0a1b9ed01e48092f4167e366cf7496c2b111ef6d", + sha256 = "197c07d3579ba33f4dc79373feb7d5688345755e2d9b29415e0b1998812eb552", + git_commit = "70ef6c3e50037b39f2c033317721eef1cbde2004", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ec981857e3418693b4043fa42161f72209ec131b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Aug 2018 03:02:13 -0700 Subject: [PATCH 0797/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210075301 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 43392261555..daa6e6221c3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "197c07d3579ba33f4dc79373feb7d5688345755e2d9b29415e0b1998812eb552", - git_commit = "70ef6c3e50037b39f2c033317721eef1cbde2004", + sha256 = "3bddd664641e3d90a072cf4d5c71b218b7491da31aed5cef590f771321e78bfc", + git_commit = "4969242f7da3fae4780521df3ca9bfe047264f84", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 46848ea142754e61003a3675d3d5b6e393bae2dd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Aug 2018 04:01:40 -0700 Subject: [PATCH 0798/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210079614 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index daa6e6221c3..c302e5daa61 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3bddd664641e3d90a072cf4d5c71b218b7491da31aed5cef590f771321e78bfc", - git_commit = "4969242f7da3fae4780521df3ca9bfe047264f84", + sha256 = "e35e55b9c81703afa295d2fa8d59c26968a591175b01725b13a2f80451f77a7f", + git_commit = "6455940ac7c4ed38b9da42373084c7a2cf39bd80", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7d47fddb060ed87bc46a89c4b69ade4041a8d3e8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Aug 2018 05:02:23 -0700 Subject: [PATCH 0799/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210083951 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c302e5daa61..b98e4e693a5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e35e55b9c81703afa295d2fa8d59c26968a591175b01725b13a2f80451f77a7f", - git_commit = "6455940ac7c4ed38b9da42373084c7a2cf39bd80", + sha256 = "ef9db592e63af7a8d9bcd0e527db7f83d706a12193e25e12972c0fa6075a045b", + git_commit = "2f2141f504f7584e2ac3b6115249e7b190bdeb02", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7bf91376df6c2b37067d0725741e92d813ef7bfe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Aug 2018 06:02:04 -0700 Subject: [PATCH 0800/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210088160 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b98e4e693a5..54e5d554d5b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ef9db592e63af7a8d9bcd0e527db7f83d706a12193e25e12972c0fa6075a045b", - git_commit = "2f2141f504f7584e2ac3b6115249e7b190bdeb02", + sha256 = "a8abc94e2500573b1b45507a6288c7b5b5142bfa6bfecf768560d325cab4c078", + git_commit = "5b495e1623997357b1cdfb0e7e1ae17ec825feac", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4da1586d136efbb2a1114d96f9b21afb1d4e24c9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Aug 2018 09:01:47 -0700 Subject: [PATCH 0801/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210105879 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 54e5d554d5b..3c3bfdc60c1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a8abc94e2500573b1b45507a6288c7b5b5142bfa6bfecf768560d325cab4c078", - git_commit = "5b495e1623997357b1cdfb0e7e1ae17ec825feac", + sha256 = "973dbbb4fa486381f05bbff4963e3c9646e2357d12e670c90f05ee6cec445531", + git_commit = "925cae2cc51f419d36b3438e693cced27b72799d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ec95c42e25c0fdcd5e17e0dcfb87a4f79596b150 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Aug 2018 10:03:35 -0700 Subject: [PATCH 0802/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210114079 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3c3bfdc60c1..666fb172bb1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "973dbbb4fa486381f05bbff4963e3c9646e2357d12e670c90f05ee6cec445531", - git_commit = "925cae2cc51f419d36b3438e693cced27b72799d", + sha256 = "95856afdd1aad3f80f3bb186d12ae86463c7829844496c15bc202255a2bbf353", + git_commit = "3e6ed48b1aa06f6ddcb43b001a8fec1e7b46d82e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 559f2f35cd27f0e02ba28e7a2650fd1139f83f19 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Aug 2018 11:02:04 -0700 Subject: [PATCH 0803/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210124035 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 666fb172bb1..4c822ccf1f7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "95856afdd1aad3f80f3bb186d12ae86463c7829844496c15bc202255a2bbf353", - git_commit = "3e6ed48b1aa06f6ddcb43b001a8fec1e7b46d82e", + sha256 = "b6144a4549a2ad506f6aeff4f5efeba5240c9ae9a8dc67c0e7df624118fed8d0", + git_commit = "ccb120b4371e059cf8b3e2ff84cb8475932362fe", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From efb1dc99cd19c7fd176bf63b1731c9030207b79b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Aug 2018 11:20:19 -0700 Subject: [PATCH 0804/8103] Removed redundant std::string -> string conversions. PiperOrigin-RevId: 210127626 --- tensorflow_serving/core/aspired_versions_manager.cc | 6 +++--- tensorflow_serving/core/aspired_versions_manager_test.cc | 2 +- tensorflow_serving/core/dynamic_source_router.h | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tensorflow_serving/core/aspired_versions_manager.cc b/tensorflow_serving/core/aspired_versions_manager.cc index 6938fb0641b..b5e1059ecf3 100644 --- a/tensorflow_serving/core/aspired_versions_manager.cc +++ b/tensorflow_serving/core/aspired_versions_manager.cc @@ -240,7 +240,7 @@ void AspiredVersionsManager::EnqueueAspiredVersionsRequest( mutex_lock l(pending_aspired_versions_requests_mu_); VLOG(1) << "Enqueueing aspired versions request: " << ServableVersionsDebugString(versions); - pending_aspired_versions_requests_[std::string(servable_name)] = + pending_aspired_versions_requests_[string(servable_name)] = std::move(versions); } } @@ -260,7 +260,7 @@ void AspiredVersionsManager::ProcessAspiredVersionsRequest( std::set current_aspired_versions; const std::vector> state_snapshots = basic_manager_->GetManagedServableStateSnapshots( - std::string(servable_name)); + string(servable_name)); for (const ServableStateSnapshot state_snapshot : state_snapshots) { if (state_snapshot.additional_state->is_aspired) { current_aspired_versions.insert(state_snapshot.id.version); @@ -309,7 +309,7 @@ bool AspiredVersionsManager::ContainsAnyReaspiredVersions( const std::vector>>& versions) const { const std::vector> state_snapshots = basic_manager_->GetManagedServableStateSnapshots( - std::string(servable_name)); + string(servable_name)); const std::set version_numbers = GetVersionNumbers(versions); for (const ServableStateSnapshot& state_snapshot : state_snapshots) { if (!state_snapshot.additional_state->is_aspired && diff --git a/tensorflow_serving/core/aspired_versions_manager_test.cc b/tensorflow_serving/core/aspired_versions_manager_test.cc index 95f48f5cada..e216e5f3061 100644 --- a/tensorflow_serving/core/aspired_versions_manager_test.cc +++ b/tensorflow_serving/core/aspired_versions_manager_test.cc @@ -569,7 +569,7 @@ TEST_P(AspiredVersionsManagerTest, ManagerPrefersUnloadOverLoad) { for (const auto& servable_aspired : servable_aspired_list) { std::vector>> aspired_versions; for (int i = servable_aspired.start; i <= servable_aspired.end; ++i) { - const ServableId id = {std::string(servable_aspired.name), i}; + const ServableId id = {string(servable_aspired.name), i}; aspired_versions.push_back(CreateAspiredVersion(id)); } manager_->GetAspiredVersionsCallback()(servable_aspired.name, diff --git a/tensorflow_serving/core/dynamic_source_router.h b/tensorflow_serving/core/dynamic_source_router.h index aa36f0acef8..4fc4c4a4a79 100644 --- a/tensorflow_serving/core/dynamic_source_router.h +++ b/tensorflow_serving/core/dynamic_source_router.h @@ -107,7 +107,7 @@ int DynamicSourceRouter::Route( const StringPiece servable_name, const std::vector>& versions) { mutex_lock l(routes_mu_); - auto it = routes_.find(std::string(servable_name)); + auto it = routes_.find(string(servable_name)); if (it == routes_.end()) { LOG(INFO) << "Routing servable(s) from stream " << servable_name << " to default output port " << num_output_ports_ - 1; From 81823bc22c4175c44aa7a27762e1ce29b4e6d4ee Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Aug 2018 12:04:18 -0700 Subject: [PATCH 0805/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210135188 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4c822ccf1f7..3b91c3b3848 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b6144a4549a2ad506f6aeff4f5efeba5240c9ae9a8dc67c0e7df624118fed8d0", - git_commit = "ccb120b4371e059cf8b3e2ff84cb8475932362fe", + sha256 = "dbe2984f633af9ebcef3b7ac223bbdddf6f7e88ec2516a5b521627c0f9047ce1", + git_commit = "8925649d62ae24a2c34f74b69ac95a1bed369b44", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4315f48c70d27ad816ca29b7f960aa0cd40dfc06 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Aug 2018 13:01:34 -0700 Subject: [PATCH 0806/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210142936 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3b91c3b3848..39c255c46d7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dbe2984f633af9ebcef3b7ac223bbdddf6f7e88ec2516a5b521627c0f9047ce1", - git_commit = "8925649d62ae24a2c34f74b69ac95a1bed369b44", + sha256 = "a0a6f08e259b384e86230abb87f3aa86b4b13e1f40f3277819612d4a0eddc63a", + git_commit = "1b2d917a597bfde092ab62a15413aa3eba54f259", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 504ff7248228c7a298668725e7fce69c4093fe87 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Fri, 24 Aug 2018 13:40:59 -0700 Subject: [PATCH 0807/8103] Update bazel.rc PiperOrigin-RevId: 210148896 --- tools/bazel.rc | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/tools/bazel.rc b/tools/bazel.rc index 10bcec750e3..cc64156f1bc 100644 --- a/tools/bazel.rc +++ b/tools/bazel.rc @@ -1,3 +1,8 @@ +# Optimizations used for TF Serving release builds. +build:release --copt=-mavx +build:release --copt=-msse4.2 + +# Options used to build with CUDA. build:cuda --crosstool_top=@local_config_cuda//crosstool:toolchain build:cuda --define=using_cuda=true --define=using_cuda_nvcc=true @@ -5,20 +10,27 @@ build:cuda --define=using_cuda=true --define=using_cuda_nvcc=true # If you would like to use a local MKL instead of downloading, please set the # environment variable "TF_MKL_ROOT" every time before build. build:mkl --define=using_mkl=true -build:mkl -c opt # This config option is used to enable MKL-DNN open source library only, # without depending on MKL binary version. build:mkl_open_source_only --define=using_mkl_dnn_only=true +# Processor native optimizations (depends on build host capabilities). +build:nativeopt --copt=-march=native +build:nativeopt --host_copt=-march=native +build:nativeopt --copt=-O3 + build --action_env PYTHON_BIN_PATH="/usr/bin/python" build --define PYTHON_BIN_PATH=/usr/bin/python -build --spawn_strategy=standalone --genrule_strategy=standalone -test --spawn_strategy=standalone --genrule_strategy=standalone -run --spawn_strategy=standalone --genrule_strategy=standalone +build --spawn_strategy=standalone +build --genrule_strategy=standalone build --define=grpc_no_ares=true -# TODO(b/69809703): Remove once no longer required for TensorFlow to build. -build --copt=-DGEMMLOWP_ALLOW_SLOW_SCALAR_FALLBACK +build -c opt + +# Adding --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0" creates parity with TF +# compilation options. It also addresses memory use due to +# copy-on-write semantics of std::strings of the older ABI. +build --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0 \ No newline at end of file From 86f4f02d4cc55b9529a324e86be5b23e1ada5a41 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Aug 2018 14:00:48 -0700 Subject: [PATCH 0808/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210152249 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 39c255c46d7..40c55e6902f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a0a6f08e259b384e86230abb87f3aa86b4b13e1f40f3277819612d4a0eddc63a", - git_commit = "1b2d917a597bfde092ab62a15413aa3eba54f259", + sha256 = "d512c30f1c9183ee9cff0ba761cfda4cc7b54522855310e6c9bd54a9ac123916", + git_commit = "a9e0c06a87857f73fdfc375abf7c69a2c28d87bf", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b25e38af351c82bed5bd44312030dd3aed328dbd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Aug 2018 15:01:51 -0700 Subject: [PATCH 0809/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210162761 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 40c55e6902f..72acc96f75f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d512c30f1c9183ee9cff0ba761cfda4cc7b54522855310e6c9bd54a9ac123916", - git_commit = "a9e0c06a87857f73fdfc375abf7c69a2c28d87bf", + sha256 = "4700d3285cdfcb98718df8adc472276244e8987759ddca62bc02e5be58ba6b0a", + git_commit = "73ef9a2f8ad8c1ae6ccab29a45034214e4cf0801", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1a6fc09b4d5e8c5fd4a9fa4a0b020990e0fbb977 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Fri, 24 Aug 2018 15:29:59 -0700 Subject: [PATCH 0810/8103] Update implementation of optimization flags PiperOrigin-RevId: 210167619 --- tensorflow_serving/g3doc/setup.md | 33 +++++++++---------- .../tools/docker/Dockerfile.devel | 4 +-- .../tools/docker/Dockerfile.devel-gpu | 4 +-- 3 files changed, 20 insertions(+), 21 deletions(-) diff --git a/tensorflow_serving/g3doc/setup.md b/tensorflow_serving/g3doc/setup.md index 02014a6f2de..8bd2f0714a0 100644 --- a/tensorflow_serving/g3doc/setup.md +++ b/tensorflow_serving/g3doc/setup.md @@ -154,29 +154,28 @@ $ tools/bazel_in_docker.sh -d tensorflow/serving:1.10-devel \ ##### Optimized build -It's possible to compile using some platform specific instruction sets (e.g. -AVX) that may significantly improve performance. Wherever you see 'bazel build' -in the documentation, simply add the flags you want. - -To optimize for all instruction sets your processor supports, you can use the -`--copt=-march=native` option. +If you'd like to apply generally recommended optimizations, including utilizing +platform-specific instruction sets for your processor, you can add +`--config=nativeopt` to Bazel build commands when building TensorFlow Serving. For example: ```shell -tools/bazel_in_docker.sh bazel build -c opt --copt=-march=native --copt=-O3 \ - --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0" tensorflow_serving/... +tools/bazel_in_docker.sh bazel build --config=nativeopt tensorflow_serving/... ``` -For specific instruction sets: - -Instruction Set | Flags ---------------- | ---------------- -AVX | `--copt=mavx` -AVX2 | `--copt=mavx2` -FMA | `--copt=mfma` -SSE 4.1 | `--copt=msse4.1` -SSE 4.2 | `--copt=msse4.2` +It's also possible to compile using specific instruction sets (e.g. AVX). +Wherever you see `bazel build` in the documentation, simply add the +corresponding flag: + +Instruction Set | Flags +-------------------------- | ---------------------- +AVX | `--copt=mavx` +AVX2 | `--copt=mavx2` +FMA | `--copt=mfma` +SSE 4.1 | `--copt=msse4.1` +SSE 4.2 | `--copt=msse4.2` +All supported by processor | `--copt=-march=native` Note: These instruction sets are not available on all machines, especially with older processors. Use `--copt=-march=native` if you're unsure what you need. diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index 36f0fd5e81c..f8ee65082c6 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -80,12 +80,12 @@ RUN git clone --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tenso FROM base_build as binary_build # Build, and install TensorFlow Serving -ARG TF_SERVING_BUILD_OPTIONS="--copt=-march=native --host_copt=-march=native --copt=-O3 --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0" +ARG TF_SERVING_BUILD_OPTIONS="--config=nativeopt" RUN echo "Building with build options: ${TF_SERVING_BUILD_OPTIONS}" ARG TF_SERVING_BAZEL_OPTIONS="" RUN echo "Building with Bazel options: ${TF_SERVING_BAZEL_OPTIONS}" -RUN bazel build -c opt --color=yes --curses=yes \ +RUN bazel build --color=yes --curses=yes \ ${TF_SERVING_BAZEL_OPTIONS} \ --verbose_failures \ --output_filter=DONT_MATCH_ANYTHING \ diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index b60367ef3be..29c58decccb 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -127,14 +127,14 @@ RUN git clone --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tenso FROM base_build as binary_build # Build, and install TensorFlow Serving -ARG TF_SERVING_BUILD_OPTIONS="--copt=-march=native --host_copt=-march=native --copt=-O3 --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0" +ARG TF_SERVING_BUILD_OPTIONS="--config=nativeopt" RUN echo "Building with build options: ${TF_SERVING_BUILD_OPTIONS}" ARG TF_SERVING_BAZEL_OPTIONS="" RUN echo "Building with Bazel options: ${TF_SERVING_BAZEL_OPTIONS}" RUN ln -s /usr/local/cuda/lib64/stubs/libcuda.so /usr/local/cuda/lib64/stubs/libcuda.so.1 && \ LD_LIBRARY_PATH=/usr/local/cuda/lib64/stubs:${LD_LIBRARY_PATH} \ - bazel build -c opt --color=yes --curses=yes --config=cuda \ + bazel build --color=yes --curses=yes --config=cuda \ ${TF_SERVING_BAZEL_OPTIONS} \ --verbose_failures \ --output_filter=DONT_MATCH_ANYTHING \ From 521391a5b8167c8e9e82ed08c6955fddbbfccb1d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Aug 2018 16:01:42 -0700 Subject: [PATCH 0811/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210172454 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 72acc96f75f..fcaf0697011 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4700d3285cdfcb98718df8adc472276244e8987759ddca62bc02e5be58ba6b0a", - git_commit = "73ef9a2f8ad8c1ae6ccab29a45034214e4cf0801", + sha256 = "3e1a1d0d3a1d43734ba6b2eff7b8efbca193bae4c3b9669d884bebc1aba58858", + git_commit = "d8dc2a1cd23db7a6b15083f14042bab272756ae2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c54caf05f01dcc9f5ef7b862fe8e3fcc27755043 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Aug 2018 17:01:29 -0700 Subject: [PATCH 0812/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210180873 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fcaf0697011..e212ab558f1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3e1a1d0d3a1d43734ba6b2eff7b8efbca193bae4c3b9669d884bebc1aba58858", - git_commit = "d8dc2a1cd23db7a6b15083f14042bab272756ae2", + sha256 = "418aabe7395793a93840387db5f62ac6017f46084fc2939e8e844942ca1cf4c5", + git_commit = "6d7261ef22835dc51fb157bdb1db349fd26d8f86", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 96238474635ebefa382d2eefe6bf79f2159fd7fe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Aug 2018 18:01:40 -0700 Subject: [PATCH 0813/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210187039 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e212ab558f1..280e9fefba8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "418aabe7395793a93840387db5f62ac6017f46084fc2939e8e844942ca1cf4c5", - git_commit = "6d7261ef22835dc51fb157bdb1db349fd26d8f86", + sha256 = "b96da931c559c73a2d778197f788d2af0950aa9ded634ae8acad4740fa524e78", + git_commit = "392ee7aa0b6557ffb1b9261328dd4f533de700d0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fc6a19f30353b7509c42452ccd22c187700526af Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Aug 2018 19:01:51 -0700 Subject: [PATCH 0814/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210191416 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 280e9fefba8..1da6b104c32 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b96da931c559c73a2d778197f788d2af0950aa9ded634ae8acad4740fa524e78", - git_commit = "392ee7aa0b6557ffb1b9261328dd4f533de700d0", + sha256 = "ccdf86e4f5bc47caed047793ff854b944cf64420fcfb06593860aef9165887aa", + git_commit = "7805e23c8416fe4ccccb48c37199a5631bee6d51", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8ace8e52d9c2430ead7f03b57b49ca8b8e1eb88f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Aug 2018 20:01:29 -0700 Subject: [PATCH 0815/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210194697 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1da6b104c32..158232d1efb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ccdf86e4f5bc47caed047793ff854b944cf64420fcfb06593860aef9165887aa", - git_commit = "7805e23c8416fe4ccccb48c37199a5631bee6d51", + sha256 = "d2fb2d1ac39b99b96210703837b2c4fafcc70f571fc2d5b62ec93ab67911ed93", + git_commit = "5afcc0fa269f9b41f1aecd029f4e3ebea35a420b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7d36cb4bddf0fcb7e52d3f22048265f7d955ad66 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Aug 2018 21:02:40 -0700 Subject: [PATCH 0816/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210198019 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 158232d1efb..230f1bf2fe0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d2fb2d1ac39b99b96210703837b2c4fafcc70f571fc2d5b62ec93ab67911ed93", - git_commit = "5afcc0fa269f9b41f1aecd029f4e3ebea35a420b", + sha256 = "abf22cc08af8667600c9068bea01362a983334f2e8d4afbd19f437426a4723a7", + git_commit = "ca94990804cf5326c0f6f46d75c96e0f0e240366", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a4726c2bc87cedea661853857d20155c4936143d Mon Sep 17 00:00:00 2001 From: naurril Date: Fri, 24 Aug 2018 23:43:06 +0800 Subject: [PATCH 0817/8103] update guide doc for custom source --- tensorflow_serving/g3doc/custom_source.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tensorflow_serving/g3doc/custom_source.md b/tensorflow_serving/g3doc/custom_source.md index fcef94d3408..8b45db41efc 100644 --- a/tensorflow_serving/g3doc/custom_source.md +++ b/tensorflow_serving/g3doc/custom_source.md @@ -56,7 +56,8 @@ loaded. simple way: it periodically inspects the file system (doing an `ls`, essentially), and if it finds one or more paths that look like servable versions it determines which one is the latest version and invokes the callback -with a list of size one containing just that version. So, at any given time +with a list of size one containing just that version +(under the default configuration). So, at any given time `FileSystemStoragePathSource` requests at most one servable to be loaded, and its implementation takes advantage of the idempotence of the callback to keep itself stateless (there is no harm in invoking the callback repeatedly with the From a7ba38cc7756e49faafcee4ac4766550d457f06b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 25 Aug 2018 01:01:09 -0700 Subject: [PATCH 0818/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210208499 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 230f1bf2fe0..00e89eee136 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "abf22cc08af8667600c9068bea01362a983334f2e8d4afbd19f437426a4723a7", - git_commit = "ca94990804cf5326c0f6f46d75c96e0f0e240366", + sha256 = "5ca4f60bc11aa92aa7d2d895a6f281f7459cf376608651dd9efe533aee507e44", + git_commit = "90209afabc187da3ef7157352eea3b901c84e03d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8742e31add40b16c25b4081a270b89d6575a04aa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 25 Aug 2018 04:01:02 -0700 Subject: [PATCH 0819/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210216276 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 00e89eee136..c5dfb2670b0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5ca4f60bc11aa92aa7d2d895a6f281f7459cf376608651dd9efe533aee507e44", - git_commit = "90209afabc187da3ef7157352eea3b901c84e03d", + sha256 = "dfb6266b1f838690f0a32dde905d56d897a96daad394b593308ceaa0f7733c57", + git_commit = "5c86ae3c8487e776cc2f32c8a99410e729a3ddaf", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d19eded86bb369e27b15b6ec003ad21a5c530ee9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 25 Aug 2018 08:01:11 -0700 Subject: [PATCH 0820/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210224900 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c5dfb2670b0..0af4c3849af 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dfb6266b1f838690f0a32dde905d56d897a96daad394b593308ceaa0f7733c57", - git_commit = "5c86ae3c8487e776cc2f32c8a99410e729a3ddaf", + sha256 = "380de766d224788bf9b8b8924c773d9728ea90f1095e983f9b22049e160d9f7d", + git_commit = "941da3f759fa7232e11603e49744788d2e86bf1c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From cfb8fd0d7ea76d8daec7a5aed0aa9fe31d8bccc9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 25 Aug 2018 22:00:38 -0700 Subject: [PATCH 0821/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210256024 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0af4c3849af..eaa4e5c81b3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "380de766d224788bf9b8b8924c773d9728ea90f1095e983f9b22049e160d9f7d", - git_commit = "941da3f759fa7232e11603e49744788d2e86bf1c", + sha256 = "a1a9797017c029954003eac2597a30ae43452cc6316eba69ff10655a0ce87001", + git_commit = "0850044c3481fcea6e95122f63db760a53772b40", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f2f7310ce5efa48f4b6d439b724ce6e28a904555 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 25 Aug 2018 23:00:42 -0700 Subject: [PATCH 0822/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210258134 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index eaa4e5c81b3..64d310d4d0e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a1a9797017c029954003eac2597a30ae43452cc6316eba69ff10655a0ce87001", - git_commit = "0850044c3481fcea6e95122f63db760a53772b40", + sha256 = "513d91ae17e33f28749ab2a01aeed8b821378c79c54f5b559367ec0a459b239a", + git_commit = "8a05bdf333f34603b33c0f3a029e023deb27ae04", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0505c66e84fb0119789462482c9482f2a96ee8cb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 26 Aug 2018 04:02:50 -0700 Subject: [PATCH 0823/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210271455 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 64d310d4d0e..8015002019e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "513d91ae17e33f28749ab2a01aeed8b821378c79c54f5b559367ec0a459b239a", - git_commit = "8a05bdf333f34603b33c0f3a029e023deb27ae04", + sha256 = "88bd504e671d35d3ea6ce4ccc236fdaa45c793e47ef7ba85032d187271da40c5", + git_commit = "09792df012c22622324f085f46edde33006c7355", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From faf425fc6a9b4289025dd55968bfaf793f2877f1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 27 Aug 2018 00:02:43 -0700 Subject: [PATCH 0824/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210322561 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8015002019e..86b7e929951 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "88bd504e671d35d3ea6ce4ccc236fdaa45c793e47ef7ba85032d187271da40c5", - git_commit = "09792df012c22622324f085f46edde33006c7355", + sha256 = "568d2b23a340fde1ea4449aea7f7d9092df3c5fb81310a786538a0d0ade67fb0", + git_commit = "7bccde15ce0dd29dce62092a5e9d48ffdc772963", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ed26c2dbb224fd511a61f8f160c0234355e17deb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 27 Aug 2018 01:05:10 -0700 Subject: [PATCH 0825/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210328210 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 86b7e929951..4459acf2922 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "568d2b23a340fde1ea4449aea7f7d9092df3c5fb81310a786538a0d0ade67fb0", - git_commit = "7bccde15ce0dd29dce62092a5e9d48ffdc772963", + sha256 = "f9d1155114a641ac8aff909e87ba295bca8c5e0931021babb9ea3e67cc13730c", + git_commit = "632e3d66334ac3718a0fd41524c7dfc499363cab", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From bc9ba538091c01fd530e2d25579fa5bf2c79820c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 27 Aug 2018 05:03:10 -0700 Subject: [PATCH 0826/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210350983 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4459acf2922..2a34ab1d178 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f9d1155114a641ac8aff909e87ba295bca8c5e0931021babb9ea3e67cc13730c", - git_commit = "632e3d66334ac3718a0fd41524c7dfc499363cab", + sha256 = "831e11f2fd20fe86904290a778d50471a201fb5c64c9a21d186e66df1de0ff17", + git_commit = "e2c6ec9e86dd86e0dd56e0f11302a5bf5d9ed440", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3949246baf3f46418405060572d368bab37c5c4f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 27 Aug 2018 10:04:54 -0700 Subject: [PATCH 0827/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210384280 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2a34ab1d178..4687b793b3d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "831e11f2fd20fe86904290a778d50471a201fb5c64c9a21d186e66df1de0ff17", - git_commit = "e2c6ec9e86dd86e0dd56e0f11302a5bf5d9ed440", + sha256 = "fab899945b586a3298de40905c7ee6ab007c71a5d518b09e447cb02c27e915ff", + git_commit = "514f65a0cab6fb98bba6d69904ba930ff1c46247", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7eed3addf5d004b341c46b0fab37fc6569666ccc Mon Sep 17 00:00:00 2001 From: ebrevdo Date: Mon, 27 Aug 2018 10:48:34 -0700 Subject: [PATCH 0828/8103] Directly import tensor.proto.h (the transitive import will be removed from tensor.h soon) We plan to remove the import variant.h from tensor.h; and variant.h brings in a lot of transitive imports (including protos like tensor.proto.h). To prepare, we're updating folks who this will break. PiperOrigin-RevId: 210392614 --- .../servables/tensorflow/saved_model_warmup_test.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/tensorflow_serving/servables/tensorflow/saved_model_warmup_test.cc b/tensorflow_serving/servables/tensorflow/saved_model_warmup_test.cc index 5b99db28f93..33d8f1d36b9 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_warmup_test.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_warmup_test.cc @@ -23,6 +23,7 @@ limitations under the License. #include "tensorflow/contrib/session_bundle/signature.h" #include "tensorflow/core/example/example.pb.h" #include "tensorflow/core/example/feature.pb.h" +#include "tensorflow/core/framework/tensor.pb.h" #include "tensorflow/core/framework/tensor_shape.pb.h" #include "tensorflow/core/lib/core/status_test_util.h" #include "tensorflow/core/lib/io/path.h" From a39704f6f70b0f037934a4ed6e6d741d1b0a3d9d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 27 Aug 2018 11:01:10 -0700 Subject: [PATCH 0829/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210394881 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4687b793b3d..fd562d95288 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fab899945b586a3298de40905c7ee6ab007c71a5d518b09e447cb02c27e915ff", - git_commit = "514f65a0cab6fb98bba6d69904ba930ff1c46247", + sha256 = "e9d7982998900d19c60cbca7b52256f3cac93cbdf3bff3421432eba61ae902a2", + git_commit = "176781dca8a310095d00658679a9e4b132bc92a7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6fde93a61a3750f044c89c3062563ea845f80a2c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 27 Aug 2018 12:03:09 -0700 Subject: [PATCH 0830/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210406684 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fd562d95288..83fe1c1b09a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e9d7982998900d19c60cbca7b52256f3cac93cbdf3bff3421432eba61ae902a2", - git_commit = "176781dca8a310095d00658679a9e4b132bc92a7", + sha256 = "5e300742e37de2bc973fb6ca31f302f36ba9f8de3d688c50d2ced72373f0d974", + git_commit = "dfa007e4562fb85fd5320a0c7ca8a00e50e8b34d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4d95749853741edf3331d913261cedabf21370d4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 27 Aug 2018 15:00:39 -0700 Subject: [PATCH 0831/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210437609 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 83fe1c1b09a..8974f98f3b5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5e300742e37de2bc973fb6ca31f302f36ba9f8de3d688c50d2ced72373f0d974", - git_commit = "dfa007e4562fb85fd5320a0c7ca8a00e50e8b34d", + sha256 = "16e880a41763313a6f35c2cbce9ba40e8b36282eebf502d81e8247f519b89018", + git_commit = "3b4df1b62c5b2c1302ebf23a9040cc749f0dd23d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From cfa6f891835b5087b2ddfed3d4fb2ef79c366d5e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 27 Aug 2018 16:04:54 -0700 Subject: [PATCH 0832/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210448571 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8974f98f3b5..7f033ef836e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "16e880a41763313a6f35c2cbce9ba40e8b36282eebf502d81e8247f519b89018", - git_commit = "3b4df1b62c5b2c1302ebf23a9040cc749f0dd23d", + sha256 = "07f70764bbbcaa992ff8ba396b10567b27d9afddb8723d8a4f9f785a50b734ef", + git_commit = "ab8e195d2e0978c21234a5632d4fabf47535eda1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 976b5856ee752e49bbea2485caabb7875ab92655 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 27 Aug 2018 17:02:43 -0700 Subject: [PATCH 0833/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210457512 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7f033ef836e..e4750f6cf31 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "07f70764bbbcaa992ff8ba396b10567b27d9afddb8723d8a4f9f785a50b734ef", - git_commit = "ab8e195d2e0978c21234a5632d4fabf47535eda1", + sha256 = "332e2e0ca4bfe6c6741f2476ae9f0d2508471ead815718e9ec86b1c812115615", + git_commit = "3455a9c6dd79c4030f8c1cf06316fffe1795577e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From adbf44d3a5e3f938176a63f4d2d1c328d025a108 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 27 Aug 2018 18:02:02 -0700 Subject: [PATCH 0834/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210464671 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e4750f6cf31..d0ad57173c1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "332e2e0ca4bfe6c6741f2476ae9f0d2508471ead815718e9ec86b1c812115615", - git_commit = "3455a9c6dd79c4030f8c1cf06316fffe1795577e", + sha256 = "f828b794d66096ecfe270f987f280de205ca28e5465c1e007a78f3fa19063060", + git_commit = "34870d54c0e1b505212da6ace722c6d9f9e8891b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4e1a26819865a7a07458d719e7001944d6ec4077 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 27 Aug 2018 19:01:04 -0700 Subject: [PATCH 0835/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210475410 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d0ad57173c1..e208565ac14 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f828b794d66096ecfe270f987f280de205ca28e5465c1e007a78f3fa19063060", - git_commit = "34870d54c0e1b505212da6ace722c6d9f9e8891b", + sha256 = "a2a851f89757c2c14307b6ef895cba2f2494ae26987b729c9cc39dfa9894db8a", + git_commit = "4a596512be206b28120acd3253d022042fa2ce6d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 82997fbdd52bf21bb0aa0304a1858c592a86866a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 27 Aug 2018 20:00:51 -0700 Subject: [PATCH 0836/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210480709 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e208565ac14..9191053b1bc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a2a851f89757c2c14307b6ef895cba2f2494ae26987b729c9cc39dfa9894db8a", - git_commit = "4a596512be206b28120acd3253d022042fa2ce6d", + sha256 = "9dbc17b72adb492337d31b5b884f62b14dec6413e2059605e120cdd7ba83124c", + git_commit = "c4156ee08bed83ce54ab14a606af498dc8ebdbe6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6bcce8bba540ad115eaafef0751609056fdaee21 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 27 Aug 2018 22:01:55 -0700 Subject: [PATCH 0837/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210489481 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9191053b1bc..6739233ac44 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9dbc17b72adb492337d31b5b884f62b14dec6413e2059605e120cdd7ba83124c", - git_commit = "c4156ee08bed83ce54ab14a606af498dc8ebdbe6", + sha256 = "1acd56d020612b1b9e4f74d8d395cd423242cf8c1396fcafc4c6c7971dd6434f", + git_commit = "52ed16ca14cd2db0cba1a33ff6f2d70f56a1bb0e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3eb9e1f82a7e8049d2a7814b1368f3bcfc23076d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 27 Aug 2018 23:01:56 -0700 Subject: [PATCH 0838/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210493488 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6739233ac44..d7efe382f19 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1acd56d020612b1b9e4f74d8d395cd423242cf8c1396fcafc4c6c7971dd6434f", - git_commit = "52ed16ca14cd2db0cba1a33ff6f2d70f56a1bb0e", + sha256 = "61b3d15ac4a82330c4a778488d161245567aa746d765893db4d1b4eb63aba37f", + git_commit = "41948f588ba2852ebae712358117ffa86e32a24b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f1e033e95b267c03463019a7aa807f6230dd397f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 28 Aug 2018 01:02:45 -0700 Subject: [PATCH 0839/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210502178 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d7efe382f19..e827a4dbff6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "61b3d15ac4a82330c4a778488d161245567aa746d765893db4d1b4eb63aba37f", - git_commit = "41948f588ba2852ebae712358117ffa86e32a24b", + sha256 = "c8db7af9b9665e44d03e06bd9e60dd796af48f6347d33cc06a0899b80e701c78", + git_commit = "5da18c4078341b88750507e2e0f3fce9d3ed58e8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 75c1d9c7ef73ec1d10560a18bc149ace70a79f5f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 28 Aug 2018 03:01:16 -0700 Subject: [PATCH 0840/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210513792 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e827a4dbff6..41e2a65c15e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c8db7af9b9665e44d03e06bd9e60dd796af48f6347d33cc06a0899b80e701c78", - git_commit = "5da18c4078341b88750507e2e0f3fce9d3ed58e8", + sha256 = "fdf2d3f967cf1dd7546a74bc61093a71473c91515de12d02c5032922f225ad27", + git_commit = "a6ebb9294a8eb848bcba46905d5f71ccf0da1a18", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1e68cdf8139fe362b1b620e0165f78414fb4e061 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 28 Aug 2018 04:01:32 -0700 Subject: [PATCH 0841/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210518475 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 41e2a65c15e..fe3e4e4e309 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fdf2d3f967cf1dd7546a74bc61093a71473c91515de12d02c5032922f225ad27", - git_commit = "a6ebb9294a8eb848bcba46905d5f71ccf0da1a18", + sha256 = "2ad6485e728c8f73ad8648ec87ff2e08c393f2ad96495aa90277cf88269164a0", + git_commit = "5045a71675fd198b5ae322593ec47ea4327ad348", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c0c66489d9839df11b0c85f91221d36ea8559134 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 28 Aug 2018 09:01:40 -0700 Subject: [PATCH 0842/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210548942 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fe3e4e4e309..d2082c352c9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2ad6485e728c8f73ad8648ec87ff2e08c393f2ad96495aa90277cf88269164a0", - git_commit = "5045a71675fd198b5ae322593ec47ea4327ad348", + sha256 = "fe006f69ef1ee1378ccd614528dea64aa378672b5fe9fa346ddff979bcaccf16", + git_commit = "5656c3db01c8d98758c0edeb6934dbd4698f39d1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 00e459f1604c40c073cbb9cb92d72cb6a88be9cd Mon Sep 17 00:00:00 2001 From: awk Date: Tue, 28 Aug 2018 09:34:53 -0700 Subject: [PATCH 0843/8103] Add new REST API to get status of models known to the ModelServer. The API is accessible via GET method on following URL: http://host:port/v1/models/${MODEL_NAME}[/versions/${MODEL_VERSION}] This closely mirrors `GetModelService.GetModelStatus` gRPC API. If no ${MODEL_VERSION} is specified, status for all versions of the model are returned. PiperOrigin-RevId: 210554222 --- .../apis/get_model_status.proto | 3 +- tensorflow_serving/g3doc/api_rest.md | 100 ++++++++++++------ tensorflow_serving/model_servers/BUILD | 1 + .../model_servers/http_rest_api_handler.cc | 49 ++++++++- .../model_servers/http_rest_api_handler.h | 24 +++-- .../http_rest_api_handler_test.cc | 58 ++++++++-- .../tensorflow_model_server_test.py | 47 ++++++-- tensorflow_serving/util/status.proto | 4 +- 8 files changed, 221 insertions(+), 65 deletions(-) diff --git a/tensorflow_serving/apis/get_model_status.proto b/tensorflow_serving/apis/get_model_status.proto index f683abfa7b8..535eb9acb68 100644 --- a/tensorflow_serving/apis/get_model_status.proto +++ b/tensorflow_serving/apis/get_model_status.proto @@ -63,5 +63,6 @@ message ModelVersionStatus { // Response for ModelStatusRequest on successful run. message GetModelStatusResponse { // Version number and status information for applicable model version(s). - repeated ModelVersionStatus model_version_status = 1; + repeated ModelVersionStatus model_version_status = 1 + [json_name = "model_version_status"]; } diff --git a/tensorflow_serving/g3doc/api_rest.md b/tensorflow_serving/g3doc/api_rest.md index 1d18759eaa5..fcf2cbc59d4 100644 --- a/tensorflow_serving/g3doc/api_rest.md +++ b/tensorflow_serving/g3doc/api_rest.md @@ -1,33 +1,9 @@ # RESTful API -In addition to [gRPC -APIs](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/apis/prediction_service.proto) -TensorFlow ModelServer also supports RESTful APIs for classification, regression -and prediction on TensorFlow models. This page describes these API endpoints and -format of request/response involved in using them. - -TensorFlow ModelServer running on `host:port` accepts following REST API -requests: - -``` -POST http://host:port/: - -URI: /v1/models/${MODEL_NAME}[/versions/${MODEL_VERSION}] -VERB: classify|regress|predict -``` - -`/versions/${MODEL_VERSION}` is optional. If omitted the latest version is used. - -This API closely follows the gRPC version of -[`PredictionService`](https://github.com/tensorflow/serving/blob/5369880e9143aa00d586ee536c12b04e945a977c/tensorflow_serving/apis/prediction_service.proto#L15) -API. - -Examples of request URLs: - -``` -http://host:port/v1/models/iris:classify -http://host:port/v1/models/mnist/versions/314:predict -``` +In addition to +[gRPC APIs](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/apis/prediction_service.proto) +TensorFlow ModelServer also supports RESTful APIs. This page describes these API +endpoints and an end-to-end [example](#example) on usage. The request and response is a JSON object. The composition of this object depends on the request type or verb. See the API specific sections below for @@ -42,8 +18,41 @@ In case of error, all APIs will return a JSON object in the response body with } ``` +## Model status API + +This API closely follows the +[`ModelService.GetModelStatus`](https://github.com/tensorflow/serving/blob/5369880e9143aa00d586ee536c12b04e945a977c/tensorflow_serving/apis/model_service.proto#L17) +gRPC API. It returns the status of a model in the ModelServer. + +### URL + +``` +GET http://host:port/v1/models/${MODEL_NAME}[/versions/${MODEL_VERSION}] +``` + +`/versions/${MODEL_VERSION}` is optional. If omitted status for all versions is +returned in the response. + +### Response format + +If successful, returns a JSON representation of +[`GetModelStatusResponse`](https://github.com/tensorflow/serving/blob/5369880e9143aa00d586ee536c12b04e945a977c/tensorflow_serving/apis/get_model_status.proto#L64) +protobuf. + ## Classify and Regress API +This API closely follows the `Classify` and `Regress` methods of +[`PredictionService`](https://github.com/tensorflow/serving/blob/5369880e9143aa00d586ee536c12b04e945a977c/tensorflow_serving/apis/prediction_service.proto#L15) +gRPC API. + +### URL + +``` +POST http://host:port/v1/models/${MODEL_NAME}[/versions/${MODEL_VERSION}]:(classify|regress) +``` + +`/versions/${MODEL_VERSION}` is optional. If omitted the latest version is used. + ### Request format The request body for the `classify` and `regress` APIs must be a JSON object @@ -128,6 +137,18 @@ Users of gRPC API will notice the similarity of this format with ## Predict API +This API closely follows the +[`PredictionService.Predict`](https://github.com/tensorflow/serving/blob/5369880e9143aa00d586ee536c12b04e945a977c/tensorflow_serving/apis/prediction_service.proto#L23) +gRPC API. + +### URL + +``` +POST http://host:port/v1/models/${MODEL_NAME}[/versions/${MODEL_VERSION}]:predict +``` + +`/versions/${MODEL_VERSION}` is optional. If omitted the latest version is used. + ### Request format The request body for `predict` API must be JSON object formatted as follows: @@ -377,8 +398,27 @@ $ tensorflow_model_server --rest_api_port=8501 \ ### Make REST API calls to ModelServer -In a different terminal, use the `curl` tool to make REST API calls. A `predict` -call would look as follows: +In a different terminal, use the `curl` tool to make REST API calls. + +Get status of the model as follows: + +``` +$ curl http://localhost:8501/v1/models/half_plus_three +{ + "model_version_status": [ + { + "version": "123", + "state": "AVAILABLE", + "status": { + "error_code": "OK", + "error_message": "" + } + } + ] +} +``` + +A `predict` call would look as follows: ```shell $ curl -d '{"instances": [1.0,2.0,5.0]}' -X POST http://localhost:8501/v1/models/half_plus_three:predict diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 44ae85b1d27..3aabb9d57db 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -259,6 +259,7 @@ cc_library( hdrs = ["http_rest_api_handler.h"], visibility = ["//visibility:public"], deps = [ + ":get_model_status_impl", ":server_core", "//tensorflow_serving/apis:model_proto", "//tensorflow_serving/apis:predict_proto", diff --git a/tensorflow_serving/model_servers/http_rest_api_handler.cc b/tensorflow_serving/model_servers/http_rest_api_handler.cc index 25dab960217..620ac0d935d 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler.cc +++ b/tensorflow_serving/model_servers/http_rest_api_handler.cc @@ -17,9 +17,11 @@ limitations under the License. #include +#include "google/protobuf/util/json_util.h" #include "absl/strings/escaping.h" #include "absl/strings/numbers.h" #include "absl/strings/str_cat.h" +#include "absl/strings/str_replace.h" #include "absl/time/time.h" #include "tensorflow/cc/saved_model/loader.h" #include "tensorflow/cc/saved_model/signature_constants.h" @@ -27,6 +29,7 @@ limitations under the License. #include "tensorflow_serving/apis/model.pb.h" #include "tensorflow_serving/apis/predict.pb.h" #include "tensorflow_serving/core/servable_handle.h" +#include "tensorflow_serving/model_servers/get_model_status_impl.h" #include "tensorflow_serving/model_servers/server_core.h" #include "tensorflow_serving/servables/tensorflow/classification_service.h" #include "tensorflow_serving/servables/tensorflow/predict_impl.h" @@ -36,6 +39,8 @@ limitations under the License. namespace tensorflow { namespace serving { +using protobuf::util::JsonPrintOptions; +using protobuf::util::MessageToJsonString; using tensorflow::serving::ServerCore; using tensorflow::serving::TensorflowPredictor; @@ -47,8 +52,9 @@ HttpRestApiHandler::HttpRestApiHandler(const RunOptions& run_options, core_(core), predictor_(new TensorflowPredictor(true /* use_saved_model */)), prediction_api_regex_( - R"((?i)/v1/models/([^/:]+)(?:/versions/(\d+))?:(classify|regress|predict))") { -} + R"((?i)/v1/models/([^/:]+)(?:/versions/(\d+))?:(classify|regress|predict))"), + modelstatus_api_regex_( + R"((?i)/v1/models(?:/([^/:]+))?(?:/versions/(\d+))?)") {} HttpRestApiHandler::~HttpRestApiHandler() {} @@ -102,7 +108,12 @@ Status HttpRestApiHandler::ProcessRequest( status = ProcessPredictRequest(model_name, model_version, request_body, output); } + } else if (http_method == "GET" && + RE2::FullMatch(string(request_path), modelstatus_api_regex_, + &model_name, &model_version_str)) { + status = ProcessModelStatusRequest(model_name, model_version_str, output); } + if (!status.ok()) { FillJsonErrorMsg(status.error_message(), output); } @@ -174,6 +185,40 @@ Status HttpRestApiHandler::ProcessPredictRequest( return Status::OK(); } +Status HttpRestApiHandler::ProcessModelStatusRequest( + const absl::string_view model_name, + const absl::string_view model_version_str, string* output) { + GetModelStatusRequest request; + // We do not yet support returning status of all models + // to be in-sync with the gRPC GetModelStatus API. + if (model_name.empty()) { + return errors::InvalidArgument("Missing model name in request."); + } + request.mutable_model_spec()->set_name(string(model_name)); + if (!model_version_str.empty()) { + int64 version; + if (!absl::SimpleAtoi(model_version_str, &version)) { + return errors::InvalidArgument( + "Failed to convert version: ", model_version_str, " to numeric."); + } + request.mutable_model_spec()->mutable_version()->set_value(version); + } + + GetModelStatusResponse response; + TF_RETURN_IF_ERROR( + GetModelStatusImpl::GetModelStatus(core_, request, &response)); + JsonPrintOptions opts; + opts.add_whitespace = true; + opts.always_print_primitive_fields = true; + // Note this is protobuf::util::Status (not TF Status) object. + const auto& status = MessageToJsonString(response, output, opts); + if (!status.ok()) { + return errors::Internal("Failed to convert proto to json. Error: ", + status.ToString()); + } + return Status::OK(); +} + Status HttpRestApiHandler::GetInfoMap( const ModelSpec& model_spec, const string& signature_name, ::google::protobuf::Map* infomap) { diff --git a/tensorflow_serving/model_servers/http_rest_api_handler.h b/tensorflow_serving/model_servers/http_rest_api_handler.h index deec9c68107..c319a3c7624 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler.h +++ b/tensorflow_serving/model_servers/http_rest_api_handler.h @@ -41,15 +41,18 @@ class ModelSpec; // // Currently supported APIs are as follows: // -// o Predict +// o Inference - Classify/Regress/Predict // -// Paths: -// /v1/models/:predict (uses 'latest' version of the model). -// /v1/models//versions/:predict +// POST /v1/models/:(classify|regress|predict) +// POST /v1/models//versions/:(classify|regress|predict) // -// Request/Response format: -// https://cloud.google.com/ml-engine/docs/v1/predict-request +// o Model status // +// GET /v1/models/ (status of all versions) +// GET /v1/models//versions/ (status of specific version) +// +// The API is documented here: +// tensorflow_serving/g3doc/api_rest.md // // Users of this class should typically create one instance of it at process // startup, register paths defined by kPathRegex with the in-process HTTP @@ -73,10 +76,6 @@ class HttpRestApiHandler { // Process a HTTP request. // - // If `http_method` (e.g. POST) and `request_path` (e.g. /v1/models/m:predict) - // match one of the supported APIs, the body (JSON object) is processed and - // response (JSON object) is returned in `output` along with output `headers`. - // // In case of errors, the `headers` and `output` are still relevant as they // contain detailed error messages, that can be relayed back to the client. Status ProcessRequest(const absl::string_view http_method, @@ -98,7 +97,9 @@ class HttpRestApiHandler { const absl::optional& model_version, const absl::string_view request_body, string* output); - + Status ProcessModelStatusRequest(const absl::string_view model_name, + const absl::string_view model_version_str, + string* output); Status GetInfoMap(const ModelSpec& model_spec, const string& signature_name, ::google::protobuf::Map* infomap); @@ -106,6 +107,7 @@ class HttpRestApiHandler { ServerCore* core_; std::unique_ptr predictor_; const RE2 prediction_api_regex_; + const RE2 modelstatus_api_regex_; }; } // namespace serving diff --git a/tensorflow_serving/model_servers/http_rest_api_handler_test.cc b/tensorflow_serving/model_servers/http_rest_api_handler_test.cc index 668132d917f..15b2c5001c8 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler_test.cc +++ b/tensorflow_serving/model_servers/http_rest_api_handler_test.cc @@ -179,22 +179,12 @@ TEST_F(HttpRestApiHandlerTest, UnsupportedApiCalls) { status = handler_.ProcessRequest("GET", "/v1/models", "", &headers, &output); EXPECT_TRUE(errors::IsInvalidArgument(status)); - EXPECT_THAT(status.error_message(), HasSubstr("Malformed request")); + EXPECT_THAT(status.error_message(), HasSubstr("Missing model name")); status = handler_.ProcessRequest("POST", "/v1/models", "", &headers, &output); EXPECT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("Malformed request")); - status = - handler_.ProcessRequest("GET", "/v1/models/foo", "", &headers, &output); - EXPECT_TRUE(errors::IsInvalidArgument(status)); - EXPECT_THAT(status.error_message(), HasSubstr("Malformed request")); - - status = handler_.ProcessRequest("GET", "/v1/models/foo/version/50", "", - &headers, &output); - EXPECT_TRUE(errors::IsInvalidArgument(status)); - EXPECT_THAT(status.error_message(), HasSubstr("Malformed request")); - status = handler_.ProcessRequest("GET", "/v1/models/foo:predict", "", &headers, &output); EXPECT_TRUE(errors::IsInvalidArgument(status)); @@ -370,6 +360,52 @@ TEST_F(HttpRestApiHandlerTest, Classify) { (HeaderList){{"Content-Type", "application/json"}})); } +TEST_F(HttpRestApiHandlerTest, GetStatus) { + HeaderList headers; + string output; + Status status; + + // Get status for all versions. + TF_EXPECT_OK(handler_.ProcessRequest( + "GET", absl::StrCat("/v1/models/", kTestModelName), "", &headers, + &output)); + EXPECT_THAT(headers, UnorderedElementsAreArray( + (HeaderList){{"Content-Type", "application/json"}})); + TF_EXPECT_OK(CompareJson(output, R"({ + "model_version_status": [ + { + "version": "123", + "state": "AVAILABLE", + "status": { + "error_code": "OK", + "error_message": "" + } + } + ] + })")); + + // Get status of specific version. + TF_EXPECT_OK( + handler_.ProcessRequest("GET", + absl::StrCat("/v1/models/", kTestModelName, + "/versions/", kTestModelVersion1), + "", &headers, &output)); + EXPECT_THAT(headers, UnorderedElementsAreArray( + (HeaderList){{"Content-Type", "application/json"}})); + TF_EXPECT_OK(CompareJson(output, R"({ + "model_version_status": [ + { + "version": "123", + "state": "AVAILABLE", + "status": { + "error_code": "OK", + "error_message": "" + } + } + ] + })")); +} + } // namespace } // namespace serving } // namespace tensorflow diff --git a/tensorflow_serving/model_servers/tensorflow_model_server_test.py b/tensorflow_serving/model_servers/tensorflow_model_server_test.py index 2cf1aeda6a5..e0a24919329 100644 --- a/tensorflow_serving/model_servers/tensorflow_model_server_test.py +++ b/tensorflow_serving/model_servers/tensorflow_model_server_test.py @@ -77,13 +77,15 @@ def WaitForServerReady(port): break -def CallREST(name, url, req, max_attempts=60): +def CallREST(url, req, max_attempts=60): """Returns HTTP response body from a REST API call.""" for attempt in range(max_attempts): try: - print 'Attempt {}: Sending {} request to {} with data:\n{}'.format( - attempt, name, url, req) - resp = urllib2.urlopen(urllib2.Request(url, data=json.dumps(req))) + print 'Attempt {}: Sending request to {} with data:\n{}'.format( + attempt, url, req) + resp = urllib2.urlopen( + urllib2.Request( + url, data=json.dumps(req) if req is not None else None)) resp_data = resp.read() print 'Received response:\n{}'.format(resp_data) resp.close() @@ -544,7 +546,7 @@ def testClassifyREST(self): # Send request resp_data = None try: - resp_data = CallREST('Classify', url, json_req) + resp_data = CallREST(url, json_req) except Exception as e: # pylint: disable=broad-except self.fail('Request failed with error: {}'.format(e)) @@ -564,7 +566,7 @@ def testRegressREST(self): # Send request resp_data = None try: - resp_data = CallREST('Regress', url, json_req) + resp_data = CallREST(url, json_req) except Exception as e: # pylint: disable=broad-except self.fail('Request failed with error: {}'.format(e)) @@ -584,7 +586,7 @@ def testPredictREST(self): # Send request resp_data = None try: - resp_data = CallREST('Predict', url, json_req) + resp_data = CallREST(url, json_req) except Exception as e: # pylint: disable=broad-except self.fail('Request failed with error: {}'.format(e)) @@ -604,13 +606,42 @@ def testPredictColumnarREST(self): # Send request resp_data = None try: - resp_data = CallREST('Predict', url, json_req) + resp_data = CallREST(url, json_req) except Exception as e: # pylint: disable=broad-except self.fail('Request failed with error: {}'.format(e)) # Verify response self.assertEquals(json.loads(resp_data), {'outputs': [3.0, 3.5, 4.0]}) + def testGetStatusREST(self): + """Test ModelStatus implementation over REST API with columnar inputs.""" + model_path = self._GetSavedModelBundlePath() + host, port = TensorflowModelServerTest.RunServer('default', + model_path)[2].split(':') + + # Prepare request + url = 'http://{}:{}/v1/models/default'.format(host, port) + + # Send request + resp_data = None + try: + resp_data = CallREST(url, None) + except Exception as e: # pylint: disable=broad-except + self.fail('Request failed with error: {}'.format(e)) + + # Verify response + self.assertEquals( + json.loads(resp_data), { + 'model_version_status': [{ + 'version': '123', + 'state': 'AVAILABLE', + 'status': { + 'error_code': 'OK', + 'error_message': '' + } + }] + }) + if __name__ == '__main__': tf.test.main() diff --git a/tensorflow_serving/util/status.proto b/tensorflow_serving/util/status.proto index 1b27b0cdf14..8588c780226 100644 --- a/tensorflow_serving/util/status.proto +++ b/tensorflow_serving/util/status.proto @@ -10,8 +10,8 @@ package tensorflow.serving; // third_party/tensorflow/core/lib/core/status.h. message StatusProto { // Error code. - error.Code error_code = 1; + error.Code error_code = 1 [json_name = "error_code"]; // Error message. Will only be set if an error was encountered. - string error_message = 2; + string error_message = 2 [json_name = "error_message"]; } From 2ff899f3f8e1616e8289d8145479bce84581865d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 28 Aug 2018 10:01:11 -0700 Subject: [PATCH 0844/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210558462 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d2082c352c9..1decb10a480 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fe006f69ef1ee1378ccd614528dea64aa378672b5fe9fa346ddff979bcaccf16", - git_commit = "5656c3db01c8d98758c0edeb6934dbd4698f39d1", + sha256 = "b140362bee0ef9d2b31f640f40d8aa7bd1f317883ed8a4bba9afedfaeee7dda5", + git_commit = "2cb954e5441605c8668d2aecbf12e324a07b3c89", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 62f5e863d094d65a9027596f5774c7dafd289cdd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 28 Aug 2018 12:01:45 -0700 Subject: [PATCH 0845/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210580715 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1decb10a480..21cd134aa9f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b140362bee0ef9d2b31f640f40d8aa7bd1f317883ed8a4bba9afedfaeee7dda5", - git_commit = "2cb954e5441605c8668d2aecbf12e324a07b3c89", + sha256 = "bb03416cb5dc25fc78a2911c56aa4f061a059b86713a160546dc5cb2eb672485", + git_commit = "d8f64b90e6f0bfec5135bdf99e42b8fdaf53788d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 04a0c42a426751ad06622c13d63018fdc9ee3740 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 28 Aug 2018 15:02:01 -0700 Subject: [PATCH 0846/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210613226 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 21cd134aa9f..e9f75f31806 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bb03416cb5dc25fc78a2911c56aa4f061a059b86713a160546dc5cb2eb672485", - git_commit = "d8f64b90e6f0bfec5135bdf99e42b8fdaf53788d", + sha256 = "d9f54a14203798a8032de1c79cb63a269b125accb5d4a746e5ba3226a817d08b", + git_commit = "f8d9f1f2f0843dc9cc5d0c68e2f4460ce19f2d73", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f18b5f864a4f94437372496056c6e97e9f06ed01 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 28 Aug 2018 16:04:24 -0700 Subject: [PATCH 0847/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210624649 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e9f75f31806..5a9392021c5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d9f54a14203798a8032de1c79cb63a269b125accb5d4a746e5ba3226a817d08b", - git_commit = "f8d9f1f2f0843dc9cc5d0c68e2f4460ce19f2d73", + sha256 = "f2d43e624a8cbec2bb5cee18874bde2c265024156dff658be771b8cec78c5e23", + git_commit = "af94082f0bb8d665cf20aaa5f86b207e176dd4e0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 08011348e830850469e94668946efee34a29e236 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 28 Aug 2018 17:03:56 -0700 Subject: [PATCH 0848/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210634179 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5a9392021c5..40d1ca29783 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f2d43e624a8cbec2bb5cee18874bde2c265024156dff658be771b8cec78c5e23", - git_commit = "af94082f0bb8d665cf20aaa5f86b207e176dd4e0", + sha256 = "a13a30bd244f96082742c6c28c841fed37a66d97ff747a97a2aa84b5d80d70f8", + git_commit = "6729cd7d1c07e547298fa2a02d1e36390dc62f0a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8e6064d52834eda8fac5dc0f5427b04cab6fbe56 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 28 Aug 2018 18:02:03 -0700 Subject: [PATCH 0849/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210642123 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 40d1ca29783..a4492a17046 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a13a30bd244f96082742c6c28c841fed37a66d97ff747a97a2aa84b5d80d70f8", - git_commit = "6729cd7d1c07e547298fa2a02d1e36390dc62f0a", + sha256 = "174dd6289f7d7b728beb76bfec6e97a06adbac28987362581d772130f6e71607", + git_commit = "de25baba51a7369bbdc5fd8051af0e9deb6a268d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e71994c4c10735897ff5def7dd81c31d2598d2fe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 28 Aug 2018 19:00:44 -0700 Subject: [PATCH 0850/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210648215 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a4492a17046..b5ff658c09b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "174dd6289f7d7b728beb76bfec6e97a06adbac28987362581d772130f6e71607", - git_commit = "de25baba51a7369bbdc5fd8051af0e9deb6a268d", + sha256 = "5d15b8578e4c1da994b405b20f1f859ad04b2f47ac33147c27354b9cf0fe4096", + git_commit = "6eabd59b16c8eb873d7dc5bb8c5fe55677290844", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a80ccf920f8c61a3bcbc26321d0db70e76168d6c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 28 Aug 2018 20:02:07 -0700 Subject: [PATCH 0851/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210652892 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b5ff658c09b..3a16a2de4f5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5d15b8578e4c1da994b405b20f1f859ad04b2f47ac33147c27354b9cf0fe4096", - git_commit = "6eabd59b16c8eb873d7dc5bb8c5fe55677290844", + sha256 = "a1adb5455589814da477625909247c392ae4fd802bae7ce12c5943122f5db3e0", + git_commit = "2e7352e57c541908cd700bb0fe53a04b456392c9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 793eacdb567203151720deb8e2c8c040d1d0912d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 28 Aug 2018 21:02:59 -0700 Subject: [PATCH 0852/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210657772 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3a16a2de4f5..8263864a7a2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a1adb5455589814da477625909247c392ae4fd802bae7ce12c5943122f5db3e0", - git_commit = "2e7352e57c541908cd700bb0fe53a04b456392c9", + sha256 = "746dacc6f774ccbf97be3aa3944974be807a8858746d0d5e11bf62149a8ab41f", + git_commit = "20d5683b826be03776978af3b8108fc3b5dc9cb8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 00cf15902bc67e2cca3d6a35b476e9d4fa872110 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 28 Aug 2018 22:01:36 -0700 Subject: [PATCH 0853/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210662340 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8263864a7a2..960c112270c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "746dacc6f774ccbf97be3aa3944974be807a8858746d0d5e11bf62149a8ab41f", - git_commit = "20d5683b826be03776978af3b8108fc3b5dc9cb8", + sha256 = "5ca1443116b24507861b7662ac88e6ffa08dc80f64bb65371ea9cf825ec1da37", + git_commit = "3d35a07179d4d38d0cabac4415c550f1cbce00c0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6485cc66f3f21de74b5b1cc3c0d545a9ce384fb5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 28 Aug 2018 23:02:36 -0700 Subject: [PATCH 0854/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210667027 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 960c112270c..d768e6f40ee 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5ca1443116b24507861b7662ac88e6ffa08dc80f64bb65371ea9cf825ec1da37", - git_commit = "3d35a07179d4d38d0cabac4415c550f1cbce00c0", + sha256 = "b2ad6233df0b849ae23ad78d493df4374ba30fd81b45f317f022e2486f0ec3b1", + git_commit = "c010fec6abbe2039febe285ea35de52923eb6d75", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a9d57f23591c45dba06e8e8586428028605015aa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 29 Aug 2018 03:03:02 -0700 Subject: [PATCH 0855/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210692176 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d768e6f40ee..49678ae055e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b2ad6233df0b849ae23ad78d493df4374ba30fd81b45f317f022e2486f0ec3b1", - git_commit = "c010fec6abbe2039febe285ea35de52923eb6d75", + sha256 = "6e44e305caa6a7e99e282fff67e258f1435d5f8ae5a5e06c31344c26cadf286e", + git_commit = "47dee5ba29ac71b1d4f323be96ae17dd77a05b0d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 019615e8be92d89fd984c2d208e8aba3639eb3b1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 29 Aug 2018 04:01:33 -0700 Subject: [PATCH 0856/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210697925 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 49678ae055e..2db56e8b3cd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6e44e305caa6a7e99e282fff67e258f1435d5f8ae5a5e06c31344c26cadf286e", - git_commit = "47dee5ba29ac71b1d4f323be96ae17dd77a05b0d", + sha256 = "35b09aada84bbb1b8f559ed2a3e5989d0c2f2f2f2c87d4918f39ae2aa2153c59", + git_commit = "5792a67de9a069660c3c409e650058256c221d2b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ea6ee42945b59e7445476cac1e128d5ee6f842e3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 29 Aug 2018 07:01:30 -0700 Subject: [PATCH 0857/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210714741 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2db56e8b3cd..ef409d6ec85 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "35b09aada84bbb1b8f559ed2a3e5989d0c2f2f2f2c87d4918f39ae2aa2153c59", - git_commit = "5792a67de9a069660c3c409e650058256c221d2b", + sha256 = "7fc467d9246065e72701d269e695c1615a95d2390c1a818935ba9fd13e896b01", + git_commit = "8dfb7532f8278e53a86a847ba6aa9c441f7b021b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4ff21656c867870518db52ec01787f15ff3b4663 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 29 Aug 2018 09:02:23 -0700 Subject: [PATCH 0858/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210730081 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ef409d6ec85..f985c2d2466 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7fc467d9246065e72701d269e695c1615a95d2390c1a818935ba9fd13e896b01", - git_commit = "8dfb7532f8278e53a86a847ba6aa9c441f7b021b", + sha256 = "73e39bbb069f456db3201a8ccecb5c19e8e36e3ea667c05e1a2a779304caef73", + git_commit = "d5d02f078ff8d5f4c5541c9281e1a0e027ce9f0c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 98db92a18908b2574ddf6ced6bd4238794f57f15 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 29 Aug 2018 10:00:54 -0700 Subject: [PATCH 0859/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210739779 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f985c2d2466..67999c0bd85 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "73e39bbb069f456db3201a8ccecb5c19e8e36e3ea667c05e1a2a779304caef73", - git_commit = "d5d02f078ff8d5f4c5541c9281e1a0e027ce9f0c", + sha256 = "560c8b4100a01bb7b76f66ca03db539acceaf5d9c5dcee851c1610bdaafe4373", + git_commit = "97fb9a9c7c72c405a790eea698a91654d5184fed", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a84406e0211f1012a566742b8ae06800cf75183b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 29 Aug 2018 11:01:30 -0700 Subject: [PATCH 0860/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210751790 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 67999c0bd85..4c7d77042e2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "560c8b4100a01bb7b76f66ca03db539acceaf5d9c5dcee851c1610bdaafe4373", - git_commit = "97fb9a9c7c72c405a790eea698a91654d5184fed", + sha256 = "f11ea35f9e0b5fced36638640a54165dbfa9bdc0d77384c3155b9c2371b9aea7", + git_commit = "8a22fa7037332fc6066459ce8c6fabcd77c6ece4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 606157884a9714d965434ba9fa49d0f9ce0d7490 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 29 Aug 2018 12:00:48 -0700 Subject: [PATCH 0861/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210763533 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4c7d77042e2..45aee44d258 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f11ea35f9e0b5fced36638640a54165dbfa9bdc0d77384c3155b9c2371b9aea7", - git_commit = "8a22fa7037332fc6066459ce8c6fabcd77c6ece4", + sha256 = "0a048f721da3d68951209ed766b907a7eaa97fe7b02e6d28061503399dc9af20", + git_commit = "287e82b5624c4ad0f1c81c16127e68ed03b1140e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 87b41d6ccfedbcba58b7281864c486c84fc74d3b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 29 Aug 2018 14:01:27 -0700 Subject: [PATCH 0862/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210785368 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 45aee44d258..038e8340248 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0a048f721da3d68951209ed766b907a7eaa97fe7b02e6d28061503399dc9af20", - git_commit = "287e82b5624c4ad0f1c81c16127e68ed03b1140e", + sha256 = "b0d1181cbd7c60844b21592b23f23d8cbeeaf52794b30ee8296b068d7eb55609", + git_commit = "52773e6765649b9963985c81fc0612742ffac73b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f49a37dd8059ffdfb374051abbd2fa2e2373a94b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 29 Aug 2018 15:02:15 -0700 Subject: [PATCH 0863/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210797415 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 038e8340248..d7b3311e8d0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b0d1181cbd7c60844b21592b23f23d8cbeeaf52794b30ee8296b068d7eb55609", - git_commit = "52773e6765649b9963985c81fc0612742ffac73b", + sha256 = "87e9019caee938ce7e8c60e619fd4c57acd483ee6c5c29010fdc8329689b1ae9", + git_commit = "91c7cd5676624d8c364d7dc56bb50300bb9d210c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 84ba561caa3fd063189b1e7faf21da8fba505cc5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 29 Aug 2018 16:01:08 -0700 Subject: [PATCH 0864/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210808778 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d7b3311e8d0..5861eca96a0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "87e9019caee938ce7e8c60e619fd4c57acd483ee6c5c29010fdc8329689b1ae9", - git_commit = "91c7cd5676624d8c364d7dc56bb50300bb9d210c", + sha256 = "16cd8c7b8f23223ba4bac37ecf639ef564d7f9e7d70a4e596ec35ac9131bb394", + git_commit = "82491c0930922ee6f8675e0953d6a2a1ef8b9fe5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 824534cbbd5f7089a593b04f77cf6e6174c8e3a3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 29 Aug 2018 17:01:32 -0700 Subject: [PATCH 0865/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210818742 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5861eca96a0..a47fb42308c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "16cd8c7b8f23223ba4bac37ecf639ef564d7f9e7d70a4e596ec35ac9131bb394", - git_commit = "82491c0930922ee6f8675e0953d6a2a1ef8b9fe5", + sha256 = "f85410897a043b00ed743e5337624b91a62e2fbe9b9315f28d1e2cd6458ce1c7", + git_commit = "d68dabb6ce90f19f83f9e3cbf6c88eeaf88b8e35", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 24fcfa3a88b6f2ed4dd3a31538419869e6edb38a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 29 Aug 2018 18:00:52 -0700 Subject: [PATCH 0866/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210827189 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a47fb42308c..c1e28893dd4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f85410897a043b00ed743e5337624b91a62e2fbe9b9315f28d1e2cd6458ce1c7", - git_commit = "d68dabb6ce90f19f83f9e3cbf6c88eeaf88b8e35", + sha256 = "cfe0de74c7394b051d92c543298f190142804fc188de69babeac7f3d7724e2dc", + git_commit = "7c0da47bbebbac39cc36aa56708c4b7d17fad608", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a7bb9040dbde180c2bb752e7b2894563f0cdc4f5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 29 Aug 2018 19:10:24 -0700 Subject: [PATCH 0867/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210834551 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c1e28893dd4..90a39b085c0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cfe0de74c7394b051d92c543298f190142804fc188de69babeac7f3d7724e2dc", - git_commit = "7c0da47bbebbac39cc36aa56708c4b7d17fad608", + sha256 = "bbb0439ecaa6d9267a5c37274061bed70818cbb97878793133bfa12904acc492", + git_commit = "fb65d4ce8dbc06452df11891facc654076891488", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3a1f065f4f66700d03665643acacec6c09028ba5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 29 Aug 2018 20:09:47 -0700 Subject: [PATCH 0868/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210840420 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 90a39b085c0..17a345dd938 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bbb0439ecaa6d9267a5c37274061bed70818cbb97878793133bfa12904acc492", - git_commit = "fb65d4ce8dbc06452df11891facc654076891488", + sha256 = "4b347b7cc32554ff9d0c54e94c978cca023e02f3da716b24ada747de6c715660", + git_commit = "b7c2e7872c737dd87e48469fc977237819cb8809", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d8a29663608b1f303276b84832654427d336b63c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 29 Aug 2018 22:03:14 -0700 Subject: [PATCH 0869/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210849745 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 17a345dd938..8d6e334bb33 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4b347b7cc32554ff9d0c54e94c978cca023e02f3da716b24ada747de6c715660", - git_commit = "b7c2e7872c737dd87e48469fc977237819cb8809", + sha256 = "15b3a1b28915eb8776b6bd0d4de81960ec5161658232027be3b7b4f4ee70e11a", + git_commit = "729e39b1a4f0f7a6b3e35a04bf8bbba5e921862b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3fcbe9b0d6a067d7fd6d9e96062c7c9b22199e24 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 29 Aug 2018 23:00:39 -0700 Subject: [PATCH 0870/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210854342 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8d6e334bb33..576fc0c2a07 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "15b3a1b28915eb8776b6bd0d4de81960ec5161658232027be3b7b4f4ee70e11a", - git_commit = "729e39b1a4f0f7a6b3e35a04bf8bbba5e921862b", + sha256 = "ccae1932d7dc1de68067f4545bcca7a1f682b2b15b59c24114fc16b592c03904", + git_commit = "3e4ded0232e00341f3b9ba3299dc8c7cb2a9d62f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f9d6463448dd1ca8dabb29b13f883b4f0d31676b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 Aug 2018 01:00:40 -0700 Subject: [PATCH 0871/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210864386 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 576fc0c2a07..f44df221c43 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ccae1932d7dc1de68067f4545bcca7a1f682b2b15b59c24114fc16b592c03904", - git_commit = "3e4ded0232e00341f3b9ba3299dc8c7cb2a9d62f", + sha256 = "96737b754aca25e782eb1f76c3fa1bd600c8c3fc5a9c0117a1e5d4717c405935", + git_commit = "c74d0aeecac3f969f07d67763de6a48755db1844", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a4ab6b156a0c47956005b996da87fcbbb67bdef3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 Aug 2018 02:07:43 -0700 Subject: [PATCH 0872/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210871994 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f44df221c43..f74e869d8fd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "96737b754aca25e782eb1f76c3fa1bd600c8c3fc5a9c0117a1e5d4717c405935", - git_commit = "c74d0aeecac3f969f07d67763de6a48755db1844", + sha256 = "4c3420ac71156c3be7382f116a05ed94e08ae390a58d4b73d77bc41ec4a3619c", + git_commit = "d004f08ee6102b2081a4ae14420e9eb76b1eb669", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9ba4d6272e160b33a221b937c991e50cc63021b4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 Aug 2018 03:07:30 -0700 Subject: [PATCH 0873/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210879339 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f74e869d8fd..7e7730eb34b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4c3420ac71156c3be7382f116a05ed94e08ae390a58d4b73d77bc41ec4a3619c", - git_commit = "d004f08ee6102b2081a4ae14420e9eb76b1eb669", + sha256 = "26dedf8083e82dc10703053a4d5f9d5ca65d96d1bbea0ed516c4c072ba3e1bae", + git_commit = "c73d4e56eb2ac66e8fb519cbe83c5f7bddbfc80a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From dfc9137287909f31060726ad1ec6969c7ff690a4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 Aug 2018 05:02:00 -0700 Subject: [PATCH 0874/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210890467 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7e7730eb34b..7a9790139ba 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "26dedf8083e82dc10703053a4d5f9d5ca65d96d1bbea0ed516c4c072ba3e1bae", - git_commit = "c73d4e56eb2ac66e8fb519cbe83c5f7bddbfc80a", + sha256 = "78b037d4dab3be4aa22cc5d970a207624d026d4e5c11b035eeef7dcb298726fa", + git_commit = "ea31ddf21bd23532e272aa29c0a9ba09feeb84e8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9d1e51f8c17e94ed8dfec3adb1b5ed1d498a9f0a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 Aug 2018 06:03:03 -0700 Subject: [PATCH 0875/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210897025 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7a9790139ba..6aa5478ec83 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "78b037d4dab3be4aa22cc5d970a207624d026d4e5c11b035eeef7dcb298726fa", - git_commit = "ea31ddf21bd23532e272aa29c0a9ba09feeb84e8", + sha256 = "d3722b510b26ba7d0577f2623a0ddfe44846a3631507463b0669c0e2c9923622", + git_commit = "8032d9f79e2ed5ccdae642257da21a989965c8cf", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ba297f243b7f1797819a5bd5870ba724dfa619d0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 Aug 2018 07:26:24 -0700 Subject: [PATCH 0876/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210906669 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6aa5478ec83..22e6a37e494 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d3722b510b26ba7d0577f2623a0ddfe44846a3631507463b0669c0e2c9923622", - git_commit = "8032d9f79e2ed5ccdae642257da21a989965c8cf", + sha256 = "521d264981d32cfd83666b0a90e556a456dc1ca1b09fd716c28f9aa6215e41eb", + git_commit = "63be4a65a1ba37848d3bfbe72ea2b60184d9979e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f03052b1862965d29973ef8474c011efcf4f0765 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 Aug 2018 10:01:24 -0700 Subject: [PATCH 0877/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210929579 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 22e6a37e494..23a65e59fe0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "521d264981d32cfd83666b0a90e556a456dc1ca1b09fd716c28f9aa6215e41eb", - git_commit = "63be4a65a1ba37848d3bfbe72ea2b60184d9979e", + sha256 = "5553baf555e395bede300021dc84dedc3a3322e4e946679d371f272c7968a687", + git_commit = "e8e0b926cfdd25e1235507a4c7636d7d8d478692", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 79e90cd1e625e529a31d6e9c4c264e97ee87d269 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 Aug 2018 11:21:29 -0700 Subject: [PATCH 0878/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210946384 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 23a65e59fe0..043b5936813 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5553baf555e395bede300021dc84dedc3a3322e4e946679d371f272c7968a687", - git_commit = "e8e0b926cfdd25e1235507a4c7636d7d8d478692", + sha256 = "18526d6fe22fbf79a3190f99f3b2666053155a9150a8ed2fa6b3b828f689a8fa", + git_commit = "35bae087dce1e88c66007907f9e1b6b5b2958f10", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c1759f5f794cd437e78e3b3eede936f4c6a76a21 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 Aug 2018 13:01:52 -0700 Subject: [PATCH 0879/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210964552 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 043b5936813..d476bdf436a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "18526d6fe22fbf79a3190f99f3b2666053155a9150a8ed2fa6b3b828f689a8fa", - git_commit = "35bae087dce1e88c66007907f9e1b6b5b2958f10", + sha256 = "17320d0334f7e9404aa766385090187c7f4ff70040c0694c286eeec4b3971090", + git_commit = "4d0d8c35f06c31706aca55aac9d68e2bd731082b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1fc9349de5793eed9df7fc6eaa54e7fee446460b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 Aug 2018 14:10:59 -0700 Subject: [PATCH 0880/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210977583 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d476bdf436a..db7e9ef32c5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "17320d0334f7e9404aa766385090187c7f4ff70040c0694c286eeec4b3971090", - git_commit = "4d0d8c35f06c31706aca55aac9d68e2bd731082b", + sha256 = "c0a09fa3033c4125093e0401a2074280b496b0114ab3cdbfff382171e58d4f05", + git_commit = "36a27b54060bc345b7fe28133912bee7e6fe3191", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From dda90065e13b7367350d6f581e31905d6ce48cbe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 Aug 2018 16:09:45 -0700 Subject: [PATCH 0881/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 210999519 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index db7e9ef32c5..58c68aae20c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c0a09fa3033c4125093e0401a2074280b496b0114ab3cdbfff382171e58d4f05", - git_commit = "36a27b54060bc345b7fe28133912bee7e6fe3191", + sha256 = "c54f4c407090cc1cf519aa1a88589c83a11cfc9f85495d0f6812256a106247dd", + git_commit = "d340f4700ec1eceb2011d1d5620633c60a12da48", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b7b710aa57e7463bf54b0dffcb5c917accbbdb43 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 Aug 2018 17:07:31 -0700 Subject: [PATCH 0882/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211008596 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 58c68aae20c..e642dc94473 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c54f4c407090cc1cf519aa1a88589c83a11cfc9f85495d0f6812256a106247dd", - git_commit = "d340f4700ec1eceb2011d1d5620633c60a12da48", + sha256 = "b8afc465c86a3043490eaa0e1870377ece842f3bda831e9e226f7216c94937eb", + git_commit = "de05ebe296d83607ca0ab1803bd8eed6afa7f74f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f60626c79d211e4b4558fd97ff2631b0aaf19c8d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 Aug 2018 18:02:12 -0700 Subject: [PATCH 0883/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211015405 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e642dc94473..ac1907cd679 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b8afc465c86a3043490eaa0e1870377ece842f3bda831e9e226f7216c94937eb", - git_commit = "de05ebe296d83607ca0ab1803bd8eed6afa7f74f", + sha256 = "64d9969f20d7881b0c1fc1e97572176886d30f1d0425e55b9d03509c3ecd3f20", + git_commit = "9d5b6e6627b04abbfecb5c7a95576e70f29dd7cf", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4860ad828e7655d405a137c357ae068ddbde4be3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 Aug 2018 19:04:53 -0700 Subject: [PATCH 0884/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211021634 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ac1907cd679..56aa2955e2c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "64d9969f20d7881b0c1fc1e97572176886d30f1d0425e55b9d03509c3ecd3f20", - git_commit = "9d5b6e6627b04abbfecb5c7a95576e70f29dd7cf", + sha256 = "a79f330515356d1e102b0808b390f692163f9c94d3ef4ced35f7fc621beb2e84", + git_commit = "efe922e25f30af02d02ecfff0e4f207245e642d7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5cbe9e9335403e2b17b72240dca303915148885f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 Aug 2018 20:01:21 -0700 Subject: [PATCH 0885/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211025361 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 56aa2955e2c..35fac2705f2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a79f330515356d1e102b0808b390f692163f9c94d3ef4ced35f7fc621beb2e84", - git_commit = "efe922e25f30af02d02ecfff0e4f207245e642d7", + sha256 = "ff197ee8b2074b55737d27cb820b511ac6a686318e88cddbf118b6d863ad0d69", + git_commit = "25be987034e268f682abefad6bd86458a981e567", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b28f34f7ae2726c8d70e72030a4e6fbb7124532c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 Aug 2018 21:01:44 -0700 Subject: [PATCH 0886/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211030060 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 35fac2705f2..d47b0254f69 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ff197ee8b2074b55737d27cb820b511ac6a686318e88cddbf118b6d863ad0d69", - git_commit = "25be987034e268f682abefad6bd86458a981e567", + sha256 = "75cc6ebed86f2f3cf77d12abde993fdd2fcb4b4643ef993ceb52d74e5a9ce8d9", + git_commit = "ae1be44b4fe27f88fc16bc1507f771ca038dc0c1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3fd5bc20874204e4c7ad2496887b50bbfb1ed4be Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 Aug 2018 22:02:11 -0700 Subject: [PATCH 0887/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211034869 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d47b0254f69..775508a82a7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "75cc6ebed86f2f3cf77d12abde993fdd2fcb4b4643ef993ceb52d74e5a9ce8d9", - git_commit = "ae1be44b4fe27f88fc16bc1507f771ca038dc0c1", + sha256 = "d664482e0cd56d16d82259b49ec63da82eab5e1f52903df4ce164eab2030fbcb", + git_commit = "348367a88e02a9e1750738b11a8e0784b2eb6b65", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 77c646c4c7d64336f7f80246c23ed060a7a02f37 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 31 Aug 2018 00:02:22 -0700 Subject: [PATCH 0888/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211042744 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 775508a82a7..99f419d0f4f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d664482e0cd56d16d82259b49ec63da82eab5e1f52903df4ce164eab2030fbcb", - git_commit = "348367a88e02a9e1750738b11a8e0784b2eb6b65", + sha256 = "79505538f4937fd1a48f3188cc6bbea19805dcd60eafdb3bc5822aa9666bfa11", + git_commit = "cb9443831283c2366e3dd91001db6362d6594f66", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7083e427e34bfb2cac0f28ac8a61d1d15ac8ef9f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 31 Aug 2018 01:06:48 -0700 Subject: [PATCH 0889/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211047977 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 99f419d0f4f..96a447efe61 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "79505538f4937fd1a48f3188cc6bbea19805dcd60eafdb3bc5822aa9666bfa11", - git_commit = "cb9443831283c2366e3dd91001db6362d6594f66", + sha256 = "3762968f7968455cef62518056164dc00b68aa46be2a2ece3741e29f92fce297", + git_commit = "702d0f8d8a72075531c6016f2d6fc6d936cee95e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a4ab74b7d90772c5974b0d72b3844e28826d258e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 31 Aug 2018 04:05:09 -0700 Subject: [PATCH 0890/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211065383 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 96a447efe61..b39ff2a6d75 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3762968f7968455cef62518056164dc00b68aa46be2a2ece3741e29f92fce297", - git_commit = "702d0f8d8a72075531c6016f2d6fc6d936cee95e", + sha256 = "843e643cedf480ae750e1de559b629b98d89f31762ff58d8f8b62930d55895f7", + git_commit = "9357b2558adc13c479c8edb66c5002c5c6ec3664", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 489c6c2c5561dc953856c57ba1a128874e4b2a09 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 31 Aug 2018 07:00:41 -0700 Subject: [PATCH 0891/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211079529 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b39ff2a6d75..0729b2cd4b3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "843e643cedf480ae750e1de559b629b98d89f31762ff58d8f8b62930d55895f7", - git_commit = "9357b2558adc13c479c8edb66c5002c5c6ec3664", + sha256 = "116a9187cda8334c590a64b467dc6735c55953cf21ed514192e28a877dd2b8e8", + git_commit = "1251e8c6cee24d9a295c63fa2362b03deef4396b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d575b29613f4a6015b624b774539568d77b7146b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 31 Aug 2018 09:01:43 -0700 Subject: [PATCH 0892/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211092679 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0729b2cd4b3..0d6ae923479 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "116a9187cda8334c590a64b467dc6735c55953cf21ed514192e28a877dd2b8e8", - git_commit = "1251e8c6cee24d9a295c63fa2362b03deef4396b", + sha256 = "dff12e457f3d2d2a398c89a52dca24286caa57bccf681f13c09463fb5aa35327", + git_commit = "371a8dd2e1e18fd35f07ac230c52a471d90d3538", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 65458cce8497a1b062b1ad66b4580c9bc22a660a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 31 Aug 2018 10:05:10 -0700 Subject: [PATCH 0893/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211101314 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0d6ae923479..c1c44806ff5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dff12e457f3d2d2a398c89a52dca24286caa57bccf681f13c09463fb5aa35327", - git_commit = "371a8dd2e1e18fd35f07ac230c52a471d90d3538", + sha256 = "8f0b1c83e6fac712cd53d1ea9c081c4482a12f2429a4e426a894c94274fb0178", + git_commit = "30ebb9b712b2008525944deb47dee8b653f522a3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From bf2534c2a80b7e185f53a415d6f686c066e21398 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 31 Aug 2018 11:02:53 -0700 Subject: [PATCH 0894/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211111559 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c1c44806ff5..1a040196310 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8f0b1c83e6fac712cd53d1ea9c081c4482a12f2429a4e426a894c94274fb0178", - git_commit = "30ebb9b712b2008525944deb47dee8b653f522a3", + sha256 = "c009c64c35ff16a75ba941ad0cafaaeb111be8bda561d6f208a2478f0ca6fd85", + git_commit = "4b3089eadf5f07609b45a0c8b4fe627b9e4767ef", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 408740f01a0e5c16b6f1c98d67977ef1f70a3127 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 31 Aug 2018 12:05:07 -0700 Subject: [PATCH 0895/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211122437 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1a040196310..c7cebc83018 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c009c64c35ff16a75ba941ad0cafaaeb111be8bda561d6f208a2478f0ca6fd85", - git_commit = "4b3089eadf5f07609b45a0c8b4fe627b9e4767ef", + sha256 = "a5c451af31ee5b00ac2a5fb3adae662443f4464cff4f5ad9acc19aa2809348db", + git_commit = "d28a348791cf411dda8053f3cdbdd62852b1e029", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 13d30b67a29ca5bd1a031c7c29ea2f84bf46aa73 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 31 Aug 2018 13:01:55 -0700 Subject: [PATCH 0896/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211131001 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c7cebc83018..e9d0273cfe5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a5c451af31ee5b00ac2a5fb3adae662443f4464cff4f5ad9acc19aa2809348db", - git_commit = "d28a348791cf411dda8053f3cdbdd62852b1e029", + sha256 = "11bdf19c284b9f5f8f58ed303c066e19ddec3e1603faae0e8d44b376ccd58a98", + git_commit = "e894ca7c736c58a8e4c71f0c3f1b1f0c327fa924", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3ebfad0e46cbd9c2890f1cc2e7c719f39c2ed0c3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 31 Aug 2018 14:01:53 -0700 Subject: [PATCH 0897/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211140391 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e9d0273cfe5..faff0aa807e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "11bdf19c284b9f5f8f58ed303c066e19ddec3e1603faae0e8d44b376ccd58a98", - git_commit = "e894ca7c736c58a8e4c71f0c3f1b1f0c327fa924", + sha256 = "221f817b48b32d39813c09af7a541efcf45733ed423e27ef971532aa4c26e80c", + git_commit = "804a3a6afc2ea7ad23b690b8c61ca0ae8b08cf51", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From addcf85629f8e7efdb4b40cad60797cf95a59a26 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 31 Aug 2018 15:02:33 -0700 Subject: [PATCH 0898/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211150256 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index faff0aa807e..62b067ae693 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "221f817b48b32d39813c09af7a541efcf45733ed423e27ef971532aa4c26e80c", - git_commit = "804a3a6afc2ea7ad23b690b8c61ca0ae8b08cf51", + sha256 = "e79b2f26b142d254a455114bb34750bddfc5f4c436f3bc0da2d0dbaa7b581904", + git_commit = "9d1ff68c97b97da3d28042751e055e296dcb007a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6f28b24f0a263d1c15241b6391796d57a5a7e8f5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 31 Aug 2018 16:05:58 -0700 Subject: [PATCH 0899/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211159441 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 62b067ae693..cb88dba7e52 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e79b2f26b142d254a455114bb34750bddfc5f4c436f3bc0da2d0dbaa7b581904", - git_commit = "9d1ff68c97b97da3d28042751e055e296dcb007a", + sha256 = "ec5d91bc74b1ddbe3c9ca017fe912bf79695939b6f15a52c5ece76de16e1dbc5", + git_commit = "609af0d56125cf6f6e58252ba71ac89338a6e024", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0ed45735eefd83cc315785905011c381e16811eb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 31 Aug 2018 17:02:55 -0700 Subject: [PATCH 0900/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211166367 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cb88dba7e52..e9837705212 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ec5d91bc74b1ddbe3c9ca017fe912bf79695939b6f15a52c5ece76de16e1dbc5", - git_commit = "609af0d56125cf6f6e58252ba71ac89338a6e024", + sha256 = "763b7260902ccd60137e739c1836ffc23202fe9d821bf3655ec3cb68bdab8f41", + git_commit = "ebd70d7b0286cb0aa74f7af1b0e7aa58998bf63e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f0da853d12aa729ef2e5a59136f4f46f41ae010b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 31 Aug 2018 18:23:47 -0700 Subject: [PATCH 0901/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211173793 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e9837705212..f8bdf0fd365 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "763b7260902ccd60137e739c1836ffc23202fe9d821bf3655ec3cb68bdab8f41", - git_commit = "ebd70d7b0286cb0aa74f7af1b0e7aa58998bf63e", + sha256 = "bb158aade0f2402d79259ac1fe02e7ca880b11c6e4fc49bae77f16281896f60d", + git_commit = "3e03b4946b05e5ebb5158ec360f120e05c82febd", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 64b70e54bb852fa416574f304f88ae1669758800 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 31 Aug 2018 19:05:29 -0700 Subject: [PATCH 0902/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211176461 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f8bdf0fd365..4aec5211209 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bb158aade0f2402d79259ac1fe02e7ca880b11c6e4fc49bae77f16281896f60d", - git_commit = "3e03b4946b05e5ebb5158ec360f120e05c82febd", + sha256 = "4bfcbd2fc957c24cd6b26209f8350b7f5051dea1162f0c78a6599b32044aec8d", + git_commit = "1bc856ba29bd57378d5c1ca08afc255460597f7f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4ba5da9ea7153d29283e7a5d50a95616c9a51a96 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 31 Aug 2018 20:01:44 -0700 Subject: [PATCH 0903/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211179017 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4aec5211209..028ad1d61fc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4bfcbd2fc957c24cd6b26209f8350b7f5051dea1162f0c78a6599b32044aec8d", - git_commit = "1bc856ba29bd57378d5c1ca08afc255460597f7f", + sha256 = "977d5e01e0ff34d14c0d48be48d85a05c1149e2247612a2aa3034f5e5bef24a8", + git_commit = "c8cdf3b963754ff50ce1238f0eb114787fbe21cf", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3b37e0a2a02405657caa606497d96d63a46420c3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 31 Aug 2018 21:01:54 -0700 Subject: [PATCH 0904/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211182228 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 028ad1d61fc..389d5e6db09 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "977d5e01e0ff34d14c0d48be48d85a05c1149e2247612a2aa3034f5e5bef24a8", - git_commit = "c8cdf3b963754ff50ce1238f0eb114787fbe21cf", + sha256 = "daad106a957b6bf48bfc9bff485873b3846bb8460c845371ecd3a92944cd7caf", + git_commit = "68452bed16ce2cfee8f962e5abef92d27fb0796f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8c6b50b27e0ef2e13d99a26998f3c2183c6b1e0e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 31 Aug 2018 22:05:27 -0700 Subject: [PATCH 0905/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211185271 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 389d5e6db09..6cebeaf4c91 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "daad106a957b6bf48bfc9bff485873b3846bb8460c845371ecd3a92944cd7caf", - git_commit = "68452bed16ce2cfee8f962e5abef92d27fb0796f", + sha256 = "6c31477f9cd811adb3abfb8b4d508e8738e2ed6f0e8eba7e81ed109460484786", + git_commit = "6212e1cc22fb20a526833172945fa542cdaa9451", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1036ffa03723929c92d6a1cebc1b99f6ea3ec5a0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 1 Sep 2018 00:02:01 -0700 Subject: [PATCH 0906/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211189621 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6cebeaf4c91..23272f65e1c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6c31477f9cd811adb3abfb8b4d508e8738e2ed6f0e8eba7e81ed109460484786", - git_commit = "6212e1cc22fb20a526833172945fa542cdaa9451", + sha256 = "bbe4057c2174281f6bab7a76644ca557d1cc17c6f9b91e5479960952a7a90467", + git_commit = "9d76f6b2d0de14c03db97e36f8c51632d58701da", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0b46d9f7f396091a4351403cc2135085e19cc518 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 1 Sep 2018 01:01:49 -0700 Subject: [PATCH 0907/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211192635 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 23272f65e1c..7c47b209227 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bbe4057c2174281f6bab7a76644ca557d1cc17c6f9b91e5479960952a7a90467", - git_commit = "9d76f6b2d0de14c03db97e36f8c51632d58701da", + sha256 = "5098b055c96192e41b62cb3cd14ba5a15a7733eb048c9c3c6855eeb9d42ec963", + git_commit = "1f9f6878e52454ce761975309a1d0040b9f6deb2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1f9f88225e57a10159ffa331cbb951f807523f99 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 1 Sep 2018 04:01:19 -0700 Subject: [PATCH 0908/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211200782 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7c47b209227..038e8fe78c2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5098b055c96192e41b62cb3cd14ba5a15a7733eb048c9c3c6855eeb9d42ec963", - git_commit = "1f9f6878e52454ce761975309a1d0040b9f6deb2", + sha256 = "ea84c8cad2eeaa96cf1709db9a3ee89ee6a63837f5817bfb54a9851a7a70e520", + git_commit = "c904352fb66b3699f5949c58c7eb664a91b7033e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f899b03312da7357b1be78096fa5863b58b5e96b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 1 Sep 2018 07:01:13 -0700 Subject: [PATCH 0909/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211209265 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 038e8fe78c2..6b493ef8c9a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ea84c8cad2eeaa96cf1709db9a3ee89ee6a63837f5817bfb54a9851a7a70e520", - git_commit = "c904352fb66b3699f5949c58c7eb664a91b7033e", + sha256 = "79753e346e5e03a7174132db3a86ef2d63a4915f1364fffb9774db983c4f1a7e", + git_commit = "dcbd97c2939ddbfadf9e21f1c0e6aa720b9154d6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5758ba3b22b8e1f2059574d7c509cdb4ecb35518 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 1 Sep 2018 08:01:43 -0700 Subject: [PATCH 0910/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211211166 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6b493ef8c9a..7f578a2bb24 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "79753e346e5e03a7174132db3a86ef2d63a4915f1364fffb9774db983c4f1a7e", - git_commit = "dcbd97c2939ddbfadf9e21f1c0e6aa720b9154d6", + sha256 = "cb349392e1b51bdb922a032eb6825af750803947fc6667d90efd06f862e9c475", + git_commit = "543bc6a8b98e8d08ce9c25dcafe629e124f266eb", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e1a1d7437b1ca14c91db7fc2ee1d75a6115c61f2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 1 Sep 2018 16:01:07 -0700 Subject: [PATCH 0911/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211231509 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7f578a2bb24..0ec01e4f16d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cb349392e1b51bdb922a032eb6825af750803947fc6667d90efd06f862e9c475", - git_commit = "543bc6a8b98e8d08ce9c25dcafe629e124f266eb", + sha256 = "b23d31c2ad4bf99265aa56afd6762e8bef68992f4298330bcc78777dfecbe366", + git_commit = "052d46699111d10c00449f1f9e7e26c6b5488f74", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b0b2039803c0695ee26842b3a3dea8187770c87b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 2 Sep 2018 04:02:29 -0700 Subject: [PATCH 0912/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211262324 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0ec01e4f16d..4a8f410f66b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b23d31c2ad4bf99265aa56afd6762e8bef68992f4298330bcc78777dfecbe366", - git_commit = "052d46699111d10c00449f1f9e7e26c6b5488f74", + sha256 = "b1dc10a633ead1cfbba48dcba38beda3ccc680728b53946fcc375d72b6060f56", + git_commit = "201be3d514d7239aa19496dba4dd0c85303b03f1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 767b070a6c1391669fd79e74aa1d3d39916fdf08 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 2 Sep 2018 18:01:55 -0700 Subject: [PATCH 0913/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211294882 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4a8f410f66b..0755ef23dce 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b1dc10a633ead1cfbba48dcba38beda3ccc680728b53946fcc375d72b6060f56", - git_commit = "201be3d514d7239aa19496dba4dd0c85303b03f1", + sha256 = "556fe997b1e73f99e33d081d320ff912a170bb55582f5e7bdc920328d1ca83de", + git_commit = "655b2afc50a0ee07e80a7e28363e853d2fac97cc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From cd9f43999f5fdebc56e9904d6a062b3ffbf36389 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 3 Sep 2018 03:10:29 -0700 Subject: [PATCH 0914/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211331648 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0755ef23dce..be61f6ced0a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "556fe997b1e73f99e33d081d320ff912a170bb55582f5e7bdc920328d1ca83de", - git_commit = "655b2afc50a0ee07e80a7e28363e853d2fac97cc", + sha256 = "ccb74ca1c7490dc3943e8d87b1718a8af05f39294acdb96a15c4f0e7e31a2163", + git_commit = "2eb12b5212e318da24d516db2e6fc3c277c79d97", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 796934b6d42f3b82e87bc3b9cd3202793d464242 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 3 Sep 2018 07:03:01 -0700 Subject: [PATCH 0915/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211351934 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index be61f6ced0a..85d9bff401d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ccb74ca1c7490dc3943e8d87b1718a8af05f39294acdb96a15c4f0e7e31a2163", - git_commit = "2eb12b5212e318da24d516db2e6fc3c277c79d97", + sha256 = "508177d54be002cfd9be74735ee10bd44c6bd61f5f38051a108db86c17d05fd2", + git_commit = "50411a6b9344e4a7584468a94d19155089411459", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 32d02910d084285d91a5df4e99f3124d3f56f225 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 3 Sep 2018 16:04:58 -0700 Subject: [PATCH 0916/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211384717 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 85d9bff401d..ea1e7d093ff 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "508177d54be002cfd9be74735ee10bd44c6bd61f5f38051a108db86c17d05fd2", - git_commit = "50411a6b9344e4a7584468a94d19155089411459", + sha256 = "392b80923175f88ba39d4b35e2f8d3e0175c3ba2d558bfe4d7a0822d27405171", + git_commit = "ec357afc00c8fb0e9c99754afd78d47fc0ab2116", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 19f91483c07f8c600fe0c7703bc5266b4cf4a1c4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 3 Sep 2018 19:04:54 -0700 Subject: [PATCH 0917/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211394512 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ea1e7d093ff..917d11af1a2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "392b80923175f88ba39d4b35e2f8d3e0175c3ba2d558bfe4d7a0822d27405171", - git_commit = "ec357afc00c8fb0e9c99754afd78d47fc0ab2116", + sha256 = "67b521fef81c7623dc2f0bccefcf10ff911c5dbbd26ec848af2003f231a0f234", + git_commit = "0bdb4dd6b67d5bfa91f688e57cb293a617cb4b45", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e5b426f5fe4f5a64158ecab3ade2274ac5e65638 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 3 Sep 2018 23:02:44 -0700 Subject: [PATCH 0918/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211408480 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 917d11af1a2..0d111b26341 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "67b521fef81c7623dc2f0bccefcf10ff911c5dbbd26ec848af2003f231a0f234", - git_commit = "0bdb4dd6b67d5bfa91f688e57cb293a617cb4b45", + sha256 = "2e32d2a7d64431370484b8ce272d93312e800d85ab24fe0c1b52d489b88bac7f", + git_commit = "c1385b0ddf823a6eabee865cc90e5d6147691add", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ec17093e779ed874f3ea5b0a4086eaac8d33f667 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 4 Sep 2018 04:01:49 -0700 Subject: [PATCH 0919/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211434220 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0d111b26341..54559d90a76 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2e32d2a7d64431370484b8ce272d93312e800d85ab24fe0c1b52d489b88bac7f", - git_commit = "c1385b0ddf823a6eabee865cc90e5d6147691add", + sha256 = "258c2a0676761d99cc45098ac920c490cc28c16765af1ab4e5397d7b196d5575", + git_commit = "d45cd10714906326ab1e27a82260a8dc56028671", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0461c8ff1377640cec52cef614e6d9a9a447e792 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 4 Sep 2018 05:02:17 -0700 Subject: [PATCH 0920/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211438961 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 54559d90a76..e40111ec4ec 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "258c2a0676761d99cc45098ac920c490cc28c16765af1ab4e5397d7b196d5575", - git_commit = "d45cd10714906326ab1e27a82260a8dc56028671", + sha256 = "defe22c33535e00ab36d44a89ad60a85a2c11e627530e76bb421d431de922c19", + git_commit = "1c3d02eb3594e9d92cd26562e797142ee34505b2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 057f47fa3d6deb781f2f93d28fe39111d05d6802 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 4 Sep 2018 09:14:28 -0700 Subject: [PATCH 0921/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211467049 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e40111ec4ec..2bd75f9b761 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "defe22c33535e00ab36d44a89ad60a85a2c11e627530e76bb421d431de922c19", - git_commit = "1c3d02eb3594e9d92cd26562e797142ee34505b2", + sha256 = "ee92862ba5a52286b96e663e09f963571ca9914f623624a290244b6b40802027", + git_commit = "70550f8e2914d3ff677b72db53437e4433ea7250", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4792a91aac7979156fe2806102885bfbc62090e6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 4 Sep 2018 11:01:34 -0700 Subject: [PATCH 0922/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211486592 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2bd75f9b761..b58aaf5952d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ee92862ba5a52286b96e663e09f963571ca9914f623624a290244b6b40802027", - git_commit = "70550f8e2914d3ff677b72db53437e4433ea7250", + sha256 = "bba884f9a6e406b3d892d8f5fbd72d18c78ac79cfbd11ada3a70ee8d3a489f2f", + git_commit = "102e0de242eccb2ac4664761183a7771b0a7c7af", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0aec0b6fa260586c49aed6d6cdce7f2f98cf6a06 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 4 Sep 2018 12:10:02 -0700 Subject: [PATCH 0923/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211499990 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b58aaf5952d..5a437d1a1b8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bba884f9a6e406b3d892d8f5fbd72d18c78ac79cfbd11ada3a70ee8d3a489f2f", - git_commit = "102e0de242eccb2ac4664761183a7771b0a7c7af", + sha256 = "84f3bc9c2d2fc0283cfa6ead55bc8d8add7ba7092200c0211a6060baba1c6f6d", + git_commit = "965e3b0ca01ed7cc951131454b38ab638ff44fbf", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 02e249bfaf545bae353a7204cc6588353957b021 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 4 Sep 2018 13:02:37 -0700 Subject: [PATCH 0924/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211508655 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5a437d1a1b8..672ac8175c1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "84f3bc9c2d2fc0283cfa6ead55bc8d8add7ba7092200c0211a6060baba1c6f6d", - git_commit = "965e3b0ca01ed7cc951131454b38ab638ff44fbf", + sha256 = "c4527f6cd20b22d13b3f39d971a2c09d9dd500384ffd4ec192e95ae439bb70c3", + git_commit = "2fcec016cec1ec70ba715c9b2f4c759c71eaafca", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3432435a3066a956ef3aaa1187c8c971f627bd08 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 4 Sep 2018 14:03:18 -0700 Subject: [PATCH 0925/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211520459 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 672ac8175c1..731708c6647 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c4527f6cd20b22d13b3f39d971a2c09d9dd500384ffd4ec192e95ae439bb70c3", - git_commit = "2fcec016cec1ec70ba715c9b2f4c759c71eaafca", + sha256 = "e79a711dd46dcf814c3bf89028cb4e5f13a60e3053c2b3d0ce758bbcacf8b054", + git_commit = "1a25a8e610db416225e4e7373337a0f47dd6e87e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From efe0dcc195fa954719b0becd7796780271f0755f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 4 Sep 2018 15:12:55 -0700 Subject: [PATCH 0926/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211533217 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 731708c6647..f0154343d5e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e79a711dd46dcf814c3bf89028cb4e5f13a60e3053c2b3d0ce758bbcacf8b054", - git_commit = "1a25a8e610db416225e4e7373337a0f47dd6e87e", + sha256 = "22d92c7388da697a8a5f80333c60dc426c7b654c6abd73091ae7ea71d535e9bb", + git_commit = "9bea7a8aa991b63f7349514a5a2dc0d04d261f8f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f102847f6175def9dbdf764860b87c19402afafa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 4 Sep 2018 16:01:43 -0700 Subject: [PATCH 0927/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211541602 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f0154343d5e..646140368c9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "22d92c7388da697a8a5f80333c60dc426c7b654c6abd73091ae7ea71d535e9bb", - git_commit = "9bea7a8aa991b63f7349514a5a2dc0d04d261f8f", + sha256 = "db5410655b50c4e90cb20c949059ef99d898b05c2a139a9bb274931ae95f0d8a", + git_commit = "ee24255e3dddae6c1d1cf44f6cf800883015fc8e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a82d19ecb368ca127c1fdb1b73b5a0e48fd22510 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 4 Sep 2018 17:01:25 -0700 Subject: [PATCH 0928/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211551681 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 646140368c9..9129341d15f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "db5410655b50c4e90cb20c949059ef99d898b05c2a139a9bb274931ae95f0d8a", - git_commit = "ee24255e3dddae6c1d1cf44f6cf800883015fc8e", + sha256 = "a4c83682ea4ee1a41a7a4cbcc451841829202e549c93916c26692a0baa08d6ae", + git_commit = "0065d3389a63a529469dc71e950c66da2ebdbc24", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4c050355376e813fc4cda4e0e5f75dd194fd90d4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 4 Sep 2018 18:04:12 -0700 Subject: [PATCH 0929/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211559626 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9129341d15f..d59635d52b5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a4c83682ea4ee1a41a7a4cbcc451841829202e549c93916c26692a0baa08d6ae", - git_commit = "0065d3389a63a529469dc71e950c66da2ebdbc24", + sha256 = "cedefc034347f7509bfafc840deefd75ac47658ecb14a7a4a0c8d737a693f98e", + git_commit = "964c1dfcc9e55fbaf9e31efd310385b6fe2563d7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 016de6d1a5a7911ca2320277cdb6f595b5db7bbc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 4 Sep 2018 19:01:31 -0700 Subject: [PATCH 0930/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211565612 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d59635d52b5..0d8deec677c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cedefc034347f7509bfafc840deefd75ac47658ecb14a7a4a0c8d737a693f98e", - git_commit = "964c1dfcc9e55fbaf9e31efd310385b6fe2563d7", + sha256 = "6359d695667ea4ba2d9e2d288a5e2e41ff84a10db7411778bee8df2697ab25eb", + git_commit = "f3ee2c74e9e3a79266503f5c4275c919303fd568", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d653708f79802cd809166c9817451fabd6586069 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 4 Sep 2018 20:01:48 -0700 Subject: [PATCH 0931/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211569967 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0d8deec677c..cf3823424fc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6359d695667ea4ba2d9e2d288a5e2e41ff84a10db7411778bee8df2697ab25eb", - git_commit = "f3ee2c74e9e3a79266503f5c4275c919303fd568", + sha256 = "e54a6a559570daa0723f1b3f1ae74e61d22074c7c5f0aaa1ec359925a2699f11", + git_commit = "d046dd6501af0ca7d90a6ce7611dfe23a99aa781", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From cba12f7158ad171601dceb32e2c6790574f7741b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 4 Sep 2018 22:01:30 -0700 Subject: [PATCH 0932/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211578437 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cf3823424fc..5152c72cf4b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e54a6a559570daa0723f1b3f1ae74e61d22074c7c5f0aaa1ec359925a2699f11", - git_commit = "d046dd6501af0ca7d90a6ce7611dfe23a99aa781", + sha256 = "2757d1deea4671d0a2b8c1f6d1c4b56c49ceadf7ae1a7f77db8a987d818d2d2c", + git_commit = "e9332539bea372f6dbe6ef185f9d8b1f3b6e1fe2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fe7a579535cf07effd01174a6846cd889cc961c5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 4 Sep 2018 23:01:37 -0700 Subject: [PATCH 0933/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211582586 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5152c72cf4b..faa660328a4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2757d1deea4671d0a2b8c1f6d1c4b56c49ceadf7ae1a7f77db8a987d818d2d2c", - git_commit = "e9332539bea372f6dbe6ef185f9d8b1f3b6e1fe2", + sha256 = "2db50d83a79523ae06b033e1b343f807cedc9c6644dbd1df99b25c2a1db19b43", + git_commit = "220a546cfae7459abf7d0e4c50bb9848fa69ff53", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9bd81700f00f85fc558bb0d5fb6d903723be7d35 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Sep 2018 00:04:04 -0700 Subject: [PATCH 0934/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211586976 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index faa660328a4..b8abe5c50a5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2db50d83a79523ae06b033e1b343f807cedc9c6644dbd1df99b25c2a1db19b43", - git_commit = "220a546cfae7459abf7d0e4c50bb9848fa69ff53", + sha256 = "e99fdcae59b66fea030b010b91df9853c21043cfda4b633530eb8903f8307db0", + git_commit = "606ece2a394943e92890b82e53337cb91a749513", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 610de223ca4a2e8f247b1c6a03254343c6943910 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Sep 2018 01:08:22 -0700 Subject: [PATCH 0935/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211593082 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b8abe5c50a5..cfb04c3db6a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e99fdcae59b66fea030b010b91df9853c21043cfda4b633530eb8903f8307db0", - git_commit = "606ece2a394943e92890b82e53337cb91a749513", + sha256 = "be85f607afc8ec247c0bee3cb38d699b99c45136bd32d1d98d841850db266590", + git_commit = "6b89e9ffc991e0683cecd7a62e04cdf4a8c88356", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 39416dc62c9c0fb8269a448f720a85785da6c72d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Sep 2018 02:10:22 -0700 Subject: [PATCH 0936/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211599422 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cfb04c3db6a..74c6a2592b2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "be85f607afc8ec247c0bee3cb38d699b99c45136bd32d1d98d841850db266590", - git_commit = "6b89e9ffc991e0683cecd7a62e04cdf4a8c88356", + sha256 = "134a72c5f41069beb6daea42a02d186ce8cddde75a45b99852b06b739a8f91da", + git_commit = "bd8df09cbd43c7244b4b66c62531eae557c1c468", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8e7ffdcfaa97b40a0835f38d692af99dfa808cc2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Sep 2018 03:02:56 -0700 Subject: [PATCH 0937/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211604404 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 74c6a2592b2..8838ccc6465 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "134a72c5f41069beb6daea42a02d186ce8cddde75a45b99852b06b739a8f91da", - git_commit = "bd8df09cbd43c7244b4b66c62531eae557c1c468", + sha256 = "ce66f8658fff7a530a370c6db6c21254eb2ef26074f6d202565e0f69c89a940d", + git_commit = "f15e8613aa42f7f2b1439c652a465438553df219", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 87a38df91146f6e429407b0c47d635b794835072 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Sep 2018 08:00:58 -0700 Subject: [PATCH 0938/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211634227 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8838ccc6465..d9c687c6cf4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ce66f8658fff7a530a370c6db6c21254eb2ef26074f6d202565e0f69c89a940d", - git_commit = "f15e8613aa42f7f2b1439c652a465438553df219", + sha256 = "31aed9383158813c4eaf54fa03aeaf5ad245d3774cd9b53eb9e55095e628cea3", + git_commit = "ffaab58cad72e177ada0e7d1d3724de63032928d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8cf48898a04b0ed2d327f6e612a19e19751be9c7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Sep 2018 09:01:04 -0700 Subject: [PATCH 0939/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211641979 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d9c687c6cf4..9ef0966bd33 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "31aed9383158813c4eaf54fa03aeaf5ad245d3774cd9b53eb9e55095e628cea3", - git_commit = "ffaab58cad72e177ada0e7d1d3724de63032928d", + sha256 = "6676622b0a33e6534d280d9231bbd5a5e4aa708f4c673bcd38796b74c67bc962", + git_commit = "1f96f9d350726b06a9f44aebcb4c1df54693894a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 415ef29f86b3d0baf458fe8d58246eb328c9dc4d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Sep 2018 10:50:41 -0700 Subject: [PATCH 0940/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211659890 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9ef0966bd33..6899760f202 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6676622b0a33e6534d280d9231bbd5a5e4aa708f4c673bcd38796b74c67bc962", - git_commit = "1f96f9d350726b06a9f44aebcb4c1df54693894a", + sha256 = "7ca21074ac5e51fdcd0f40e7beb9b450e12f22e3ebcd32d6f1fc0cc233ff979e", + git_commit = "11548e0ab987ec3935b1dfb87753c4bbe95f6ad1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6ae1d325e44969b903c6a5b687a7c40ad52267eb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Sep 2018 11:36:18 -0700 Subject: [PATCH 0941/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211668438 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6899760f202..f240f05da9a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7ca21074ac5e51fdcd0f40e7beb9b450e12f22e3ebcd32d6f1fc0cc233ff979e", - git_commit = "11548e0ab987ec3935b1dfb87753c4bbe95f6ad1", + sha256 = "81abc724589545c1cc67774a23c19f551fad5daeaa5c46f01d94a51e26f9bd3a", + git_commit = "6aa8abbb17c06fbaeb9cc4396e58b6cfc33d177f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fd894cd843a3baa4fd604485e2d2686f4c65a37c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Sep 2018 12:09:45 -0700 Subject: [PATCH 0942/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211674601 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f240f05da9a..1d16a5d8a8d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "81abc724589545c1cc67774a23c19f551fad5daeaa5c46f01d94a51e26f9bd3a", - git_commit = "6aa8abbb17c06fbaeb9cc4396e58b6cfc33d177f", + sha256 = "50c854e696badb7555196b1389c7cfcb4f8d2baf04c79fcd824c5d623830b285", + git_commit = "d3a63ee12b1c8910cf71e87a81e59f998144ce36", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 29b11b8a2233cea0f8b6d0e6a0fa7faaf52bb7d6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Sep 2018 12:50:57 -0700 Subject: [PATCH 0943/8103] Removed a dependency on absl internal pkgs. PiperOrigin-RevId: 211681731 --- .../util/net_http/internal/BUILD | 20 ++++ .../net_http/internal/fixed_thread_pool.h | 95 +++++++++++++++++++ .../util/net_http/server/internal/BUILD | 4 +- .../server/internal/evhttp_request_test.cc | 10 +- .../server/internal/evhttp_server_test.cc | 14 +-- 5 files changed, 129 insertions(+), 14 deletions(-) create mode 100644 tensorflow_serving/util/net_http/internal/BUILD create mode 100644 tensorflow_serving/util/net_http/internal/fixed_thread_pool.h diff --git a/tensorflow_serving/util/net_http/internal/BUILD b/tensorflow_serving/util/net_http/internal/BUILD new file mode 100644 index 00000000000..6fd24462311 --- /dev/null +++ b/tensorflow_serving/util/net_http/internal/BUILD @@ -0,0 +1,20 @@ +# Description: shared code for net_http + +package( + default_visibility = [ + "//tensorflow_serving:internal", + ], + features = ["-layering_check"], +) + +licenses(["notice"]) # Apache 2.0 + +cc_library( + name = "fixed_thread_pool", + testonly = 1, + hdrs = ["fixed_thread_pool.h"], + deps = [ + "@com_google_absl//absl/base:core_headers", + "@com_google_absl//absl/synchronization", + ], +) diff --git a/tensorflow_serving/util/net_http/internal/fixed_thread_pool.h b/tensorflow_serving/util/net_http/internal/fixed_thread_pool.h new file mode 100644 index 00000000000..cc6844030fa --- /dev/null +++ b/tensorflow_serving/util/net_http/internal/fixed_thread_pool.h @@ -0,0 +1,95 @@ +/* Copyright 2018 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_SERVING_UTIL_NET_HTTP_INTERNAL_FIXED_THREAD_POOL_H_ +#define TENSORFLOW_SERVING_UTIL_NET_HTTP_INTERNAL_FIXED_THREAD_POOL_H_ + +#include +#include +#include +#include // NOLINT(build/c++11) +#include + +#include "absl/base/thread_annotations.h" +#include "absl/synchronization/mutex.h" + +namespace tensorflow { +namespace serving { +namespace net_http { + +// A simple fixed-size ThreadPool implementation for tests. +// The initial version is copied from +// absl/synchronization/internal/thread_pool.h +class FixedThreadPool { + public: + explicit FixedThreadPool(int num_threads) { + for (int i = 0; i < num_threads; ++i) { + threads_.push_back(std::thread(&FixedThreadPool::WorkLoop, this)); + } + } + + FixedThreadPool(const FixedThreadPool &) = delete; + FixedThreadPool &operator=(const FixedThreadPool &) = delete; + + ~FixedThreadPool() { + { + absl::MutexLock l(&mu_); + for (int i = 0; i < threads_.size(); ++i) { + queue_.push(nullptr); // Shutdown signal. + } + } + for (auto &t : threads_) { + t.join(); + } + } + + // Schedule a function to be run on a ThreadPool thread immediately. + void Schedule(std::function func) { + assert(func != nullptr); + absl::MutexLock l(&mu_); + queue_.push(std::move(func)); + } + + private: + bool WorkAvailable() const EXCLUSIVE_LOCKS_REQUIRED(mu_) { + return !queue_.empty(); + } + + void WorkLoop() { + while (true) { + std::function func; + { + absl::MutexLock l(&mu_); + mu_.Await(absl::Condition(this, &FixedThreadPool::WorkAvailable)); + func = std::move(queue_.front()); + queue_.pop(); + } + if (func == nullptr) { // Shutdown signal. + break; + } + func(); + } + } + + absl::Mutex mu_; + std::queue> queue_ GUARDED_BY(mu_); + std::vector threads_; +}; + +} // namespace net_http +} // namespace serving +} // namespace tensorflow + +#endif // TENSORFLOW_SERVING_UTIL_NET_HTTP_INTERNAL_FIXED_THREAD_POOL_H_ diff --git a/tensorflow_serving/util/net_http/server/internal/BUILD b/tensorflow_serving/util/net_http/server/internal/BUILD index 36e12bde3c0..68cec983960 100644 --- a/tensorflow_serving/util/net_http/server/internal/BUILD +++ b/tensorflow_serving/util/net_http/server/internal/BUILD @@ -38,11 +38,11 @@ cc_test( ":evhttp_server", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/util/net_http/client:evhttp_client", + "//tensorflow_serving/util/net_http/internal:fixed_thread_pool", "//tensorflow_serving/util/net_http/server/public:http_server", "//tensorflow_serving/util/net_http/server/public:http_server_api", "@com_google_absl//absl/memory", "@com_google_absl//absl/synchronization", - "@com_google_absl//absl/synchronization:thread_pool", ], ) @@ -54,9 +54,9 @@ cc_test( ":evhttp_server", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/util/net_http/client:evhttp_client", + "//tensorflow_serving/util/net_http/internal:fixed_thread_pool", "//tensorflow_serving/util/net_http/server/public:http_server", "//tensorflow_serving/util/net_http/server/public:http_server_api", "@com_google_absl//absl/memory", - "@com_google_absl//absl/synchronization:thread_pool", ], ) diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_request_test.cc b/tensorflow_serving/util/net_http/server/internal/evhttp_request_test.cc index 8da6b7f5d61..4275e1bd435 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_request_test.cc +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_request_test.cc @@ -21,9 +21,9 @@ limitations under the License. #include #include "absl/memory/memory.h" -#include "absl/synchronization/internal/thread_pool.h" #include "tensorflow_serving/util/net_http/client/evhttp_connection.h" +#include "tensorflow_serving/util/net_http/internal/fixed_thread_pool.h" #include "tensorflow_serving/util/net_http/server/public/httpserver.h" #include "tensorflow_serving/util/net_http/server/public/httpserver_interface.h" #include "tensorflow_serving/util/net_http/server/public/server_request_interface.h" @@ -33,16 +33,16 @@ namespace serving { namespace net_http { namespace { -class ThreadPool final : public EventExecutor { +class MyExecutor final : public EventExecutor { public: - explicit ThreadPool(int num_threads) : thread_pool_(num_threads) {} + explicit MyExecutor(int num_threads) : thread_pool_(num_threads) {} void Schedule(std::function fn) override { thread_pool_.Schedule(fn); } private: - absl::synchronization_internal::ThreadPool thread_pool_; + FixedThreadPool thread_pool_; }; class EvHTTPRequestTest : public ::testing::Test { @@ -63,7 +63,7 @@ class EvHTTPRequestTest : public ::testing::Test { void InitServer() { auto options = absl::make_unique(); options->AddPort(0); - options->SetExecutor(absl::make_unique(4)); + options->SetExecutor(absl::make_unique(4)); server = CreateEvHTTPServer(std::move(options)); diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_server_test.cc b/tensorflow_serving/util/net_http/server/internal/evhttp_server_test.cc index 06015bca985..ffb9c20fc21 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_server_test.cc +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_server_test.cc @@ -20,10 +20,10 @@ limitations under the License. #include #include "absl/memory/memory.h" -#include "absl/synchronization/internal/thread_pool.h" #include "absl/synchronization/notification.h" #include "tensorflow_serving/util/net_http/client/evhttp_connection.h" +#include "tensorflow_serving/util/net_http/internal/fixed_thread_pool.h" #include "tensorflow_serving/util/net_http/server/public/httpserver.h" #include "tensorflow_serving/util/net_http/server/public/httpserver_interface.h" #include "tensorflow_serving/util/net_http/server/public/server_request_interface.h" @@ -33,16 +33,16 @@ namespace serving { namespace net_http { namespace { -class ThreadPool final : public EventExecutor { +class MyExecutor final : public EventExecutor { public: - explicit ThreadPool(int num_threads) : thread_pool_(num_threads) {} + explicit MyExecutor(int num_threads) : thread_pool_(num_threads) {} void Schedule(std::function fn) override { thread_pool_.Schedule(fn); } private: - absl::synchronization_internal::ThreadPool thread_pool_; + FixedThreadPool thread_pool_; }; class EvHTTPServerTest : public ::testing::Test { @@ -63,7 +63,7 @@ class EvHTTPServerTest : public ::testing::Test { void InitServer() { auto options = absl::make_unique(); options->AddPort(0); - options->SetExecutor(absl::make_unique(4)); + options->SetExecutor(absl::make_unique(4)); server = CreateEvHTTPServer(std::move(options)); @@ -277,7 +277,7 @@ TEST_F(EvHTTPServerTest, RequestHandlerInteraction) { auto connection = EvHTTPConnection::Connect("localhost", server->listen_port()); ASSERT_TRUE(connection != nullptr); - connection->SetExecutor(absl::make_unique(4)); + connection->SetExecutor(absl::make_unique(4)); absl::Notification response_done; ClientRequest request = {"/ok", "GET", {}, nullptr}; @@ -320,7 +320,7 @@ TEST_F(EvHTTPServerTest, ActiveRequestCountInShutdown) { auto connection = EvHTTPConnection::Connect("localhost", server->listen_port()); ASSERT_TRUE(connection != nullptr); - connection->SetExecutor(absl::make_unique(4)); + connection->SetExecutor(absl::make_unique(4)); ClientRequest request = {"/ok", "GET", {}, nullptr}; ClientResponse response = {}; From d6604e5fa20444ecd77fe7ad6d74364c65d999b0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Sep 2018 16:04:09 -0700 Subject: [PATCH 0944/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211716173 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1d16a5d8a8d..357cc137d9f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "50c854e696badb7555196b1389c7cfcb4f8d2baf04c79fcd824c5d623830b285", - git_commit = "d3a63ee12b1c8910cf71e87a81e59f998144ce36", + sha256 = "1c705e7d5654fa8880f4967510429d573d9e2f0f1c549ab54e876e9b29cecd62", + git_commit = "75390d4c3568358ea81a072b0ccc94071022c38d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 62caf6ac3cbb1ec20c2d924c77d339a2ecd84387 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Sep 2018 17:14:03 -0700 Subject: [PATCH 0945/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211726395 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 357cc137d9f..7e4b79a83fd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1c705e7d5654fa8880f4967510429d573d9e2f0f1c549ab54e876e9b29cecd62", - git_commit = "75390d4c3568358ea81a072b0ccc94071022c38d", + sha256 = "d6d404aea187323a25fef9f3b014bc26b3bd2b92976c217b123609007a6d668e", + git_commit = "7dfc0756439aede05ec471193780a4de9f61874e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 01d6787a40e27fee8f190a9171e27fece23b9a62 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Sep 2018 18:03:17 -0700 Subject: [PATCH 0946/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211732092 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7e4b79a83fd..7f76a392cfe 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d6d404aea187323a25fef9f3b014bc26b3bd2b92976c217b123609007a6d668e", - git_commit = "7dfc0756439aede05ec471193780a4de9f61874e", + sha256 = "7bcea7442dc315dd71dfd2c97a77a7fe4d03108e8f1618b8b9592f4d54e02902", + git_commit = "e7b37766f53d5d9d976f2ba3046d3df3333c8ebb", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 84df5e441404f042bf4f7c1665d2273a03e95f46 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Sep 2018 19:13:32 -0700 Subject: [PATCH 0947/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211738687 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7f76a392cfe..489048ab41d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7bcea7442dc315dd71dfd2c97a77a7fe4d03108e8f1618b8b9592f4d54e02902", - git_commit = "e7b37766f53d5d9d976f2ba3046d3df3333c8ebb", + sha256 = "30e39eacf50bcfe51c28a2f462aed40cedbc83cee275e96dbdc7819e3b1f9006", + git_commit = "ad5c0c4d091c93ef65e91c55cb4df065d0c7a989", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fd3a557a9b84ef802c21ad4ffd73515acd33722b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Sep 2018 22:04:00 -0700 Subject: [PATCH 0948/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211751527 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 489048ab41d..108982eebbc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "30e39eacf50bcfe51c28a2f462aed40cedbc83cee275e96dbdc7819e3b1f9006", - git_commit = "ad5c0c4d091c93ef65e91c55cb4df065d0c7a989", + sha256 = "81dcd29adcc980078a777ec44a022efacaa9870f47e584643a9ce68f0fbc0a79", + git_commit = "f4ae136265d3d3116a008b98ccf21d0791b878fd", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c6a2f522285edb92243392b50f51849be800b312 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Sep 2018 22:12:05 -0700 Subject: [PATCH 0949/8103] No public changes. PiperOrigin-RevId: 211752273 --- tensorflow_serving/util/net_http/client/BUILD | 3 +-- tensorflow_serving/util/net_http/client/testing/BUILD | 5 +---- tensorflow_serving/util/net_http/internal/BUILD | 3 +-- tensorflow_serving/util/net_http/server/internal/BUILD | 5 +++-- tensorflow_serving/util/net_http/server/public/BUILD | 2 +- tensorflow_serving/util/net_http/server/testing/BUILD | 6 ++---- tensorflow_serving/util/net_http/socket/testing/BUILD | 5 +---- 7 files changed, 10 insertions(+), 19 deletions(-) diff --git a/tensorflow_serving/util/net_http/client/BUILD b/tensorflow_serving/util/net_http/client/BUILD index 8b3469cc103..aef1f876ac4 100644 --- a/tensorflow_serving/util/net_http/client/BUILD +++ b/tensorflow_serving/util/net_http/client/BUILD @@ -2,9 +2,8 @@ package( default_visibility = [ - "//tensorflow_serving:internal", + "//tensorflow_serving/util/net_http:__subpackages__", ], - features = ["-layering_check"], ) licenses(["notice"]) # Apache 2.0 diff --git a/tensorflow_serving/util/net_http/client/testing/BUILD b/tensorflow_serving/util/net_http/client/testing/BUILD index d98fd2a7855..7eab2c74567 100644 --- a/tensorflow_serving/util/net_http/client/testing/BUILD +++ b/tensorflow_serving/util/net_http/client/testing/BUILD @@ -1,10 +1,7 @@ # Description: net_http/client/testing package( - default_visibility = [ - "//tensorflow_serving:internal", - ], - features = ["-layering_check"], + default_visibility = ["//visibility:private"], ) licenses(["notice"]) # Apache 2.0 diff --git a/tensorflow_serving/util/net_http/internal/BUILD b/tensorflow_serving/util/net_http/internal/BUILD index 6fd24462311..b3fc8fd9785 100644 --- a/tensorflow_serving/util/net_http/internal/BUILD +++ b/tensorflow_serving/util/net_http/internal/BUILD @@ -2,9 +2,8 @@ package( default_visibility = [ - "//tensorflow_serving:internal", + "//tensorflow_serving/util/net_http:__subpackages__", ], - features = ["-layering_check"], ) licenses(["notice"]) # Apache 2.0 diff --git a/tensorflow_serving/util/net_http/server/internal/BUILD b/tensorflow_serving/util/net_http/server/internal/BUILD index 68cec983960..60fa455f9cb 100644 --- a/tensorflow_serving/util/net_http/server/internal/BUILD +++ b/tensorflow_serving/util/net_http/server/internal/BUILD @@ -2,9 +2,8 @@ package( default_visibility = [ - "//tensorflow_serving:internal", + "//tensorflow_serving/util/net_http:__subpackages__", ], - features = ["-layering_check"], ) licenses(["notice"]) # Apache 2.0 @@ -34,6 +33,7 @@ cc_test( name = "evhttp_server_test", size = "medium", srcs = ["evhttp_server_test.cc"], + features = ["-layering_check"], deps = [ ":evhttp_server", "//tensorflow_serving/core/test_util:test_main", @@ -50,6 +50,7 @@ cc_test( name = "evhttp_request_test", size = "medium", srcs = ["evhttp_request_test.cc"], + features = ["-layering_check"], deps = [ ":evhttp_server", "//tensorflow_serving/core/test_util:test_main", diff --git a/tensorflow_serving/util/net_http/server/public/BUILD b/tensorflow_serving/util/net_http/server/public/BUILD index faa1d0f3b47..c6a75b8f615 100644 --- a/tensorflow_serving/util/net_http/server/public/BUILD +++ b/tensorflow_serving/util/net_http/server/public/BUILD @@ -3,8 +3,8 @@ package( default_visibility = [ "//tensorflow_serving:internal", + "//tensorflow_serving/util/net_http:__subpackages__", ], - features = ["-layering_check"], ) licenses(["notice"]) # Apache 2.0 diff --git a/tensorflow_serving/util/net_http/server/testing/BUILD b/tensorflow_serving/util/net_http/server/testing/BUILD index fff8ca0e3af..c65901c2482 100644 --- a/tensorflow_serving/util/net_http/server/testing/BUILD +++ b/tensorflow_serving/util/net_http/server/testing/BUILD @@ -1,10 +1,7 @@ # Description: net_http/server/testing package( - default_visibility = [ - "//tensorflow_serving:internal", - ], - features = ["-layering_check"], + default_visibility = ["//visibility:private"], ) licenses(["notice"]) # Apache 2.0 @@ -14,6 +11,7 @@ cc_binary( srcs = ["evhttp_echo_server.cc"], deps = [ "//tensorflow_serving/util/net_http/server/public:http_server", + "//tensorflow_serving/util/net_http/server/public:http_server_api", "@com_google_absl//absl/memory", "@com_google_absl//absl/strings", ], diff --git a/tensorflow_serving/util/net_http/socket/testing/BUILD b/tensorflow_serving/util/net_http/socket/testing/BUILD index b71754fbbb4..fd1a6e50c9c 100644 --- a/tensorflow_serving/util/net_http/socket/testing/BUILD +++ b/tensorflow_serving/util/net_http/socket/testing/BUILD @@ -1,10 +1,7 @@ # Description: net_http/socket testing utils package( - default_visibility = [ - "//tensorflow_serving:internal", - ], - features = ["-layering_check"], + default_visibility = ["//visibility:private"], ) licenses(["notice"]) # Apache 2.0 From 6a56f825c951be384be5e01c3a27d2ba33da255b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Sep 2018 00:04:44 -0700 Subject: [PATCH 0950/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211759707 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 108982eebbc..4f23e4bcceb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "81dcd29adcc980078a777ec44a022efacaa9870f47e584643a9ce68f0fbc0a79", - git_commit = "f4ae136265d3d3116a008b98ccf21d0791b878fd", + sha256 = "a224a1e113b049de432263d3e069304b53de4b07d1e184b9ddc05bd0c63a719f", + git_commit = "830c8a480a4a65540e60b638cd73b50801408c9b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e425afab84191cefe51439be056eb97cb5136277 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Sep 2018 02:03:59 -0700 Subject: [PATCH 0951/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211770533 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4f23e4bcceb..cd05be9433e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a224a1e113b049de432263d3e069304b53de4b07d1e184b9ddc05bd0c63a719f", - git_commit = "830c8a480a4a65540e60b638cd73b50801408c9b", + sha256 = "2256a739b81025424bb41275234decdb514ede413b815bf558262b179fe8719d", + git_commit = "c200cecbec679cc9dbb219fd06663232f18470ff", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9eeda670ab0164504f8d7ae0161dd8ac0f1f76f7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Sep 2018 03:03:36 -0700 Subject: [PATCH 0952/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211776885 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cd05be9433e..e2e55c7e104 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2256a739b81025424bb41275234decdb514ede413b815bf558262b179fe8719d", - git_commit = "c200cecbec679cc9dbb219fd06663232f18470ff", + sha256 = "456e41b65e51d13d9f7f29f536c4b1d3ec90648b80a3068f01e4d5307042c575", + git_commit = "3b34d4fa50f421022a8eb83f51660d22862557d2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fcc871fb50f8d95288fdc51843824c4d9a162aef Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Sep 2018 08:01:05 -0700 Subject: [PATCH 0953/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211807982 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e2e55c7e104..4125e01325c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "456e41b65e51d13d9f7f29f536c4b1d3ec90648b80a3068f01e4d5307042c575", - git_commit = "3b34d4fa50f421022a8eb83f51660d22862557d2", + sha256 = "bff271b8cab44c1c2084493a8b8c83f79a0aa73b94be93d6da800b1129c8d0d8", + git_commit = "973780717983b2ee1f4f52b5ab1f8595e6ba4a05", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e745f6e688206653ab5c44b7ca234c80904f5c65 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Sep 2018 09:01:43 -0700 Subject: [PATCH 0954/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211816021 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4125e01325c..651b06f5b8c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bff271b8cab44c1c2084493a8b8c83f79a0aa73b94be93d6da800b1129c8d0d8", - git_commit = "973780717983b2ee1f4f52b5ab1f8595e6ba4a05", + sha256 = "2ad22dc7c18cafe156fb565267aeec4a271d91767c9de5478339928006d9e7f2", + git_commit = "04f3ddac5b69c85558657db5c1b409059716fdb7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 477709c33d3133e26f7faafce81cb751c216acf1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Sep 2018 10:02:21 -0700 Subject: [PATCH 0955/8103] Update setup/serving tutorial. PiperOrigin-RevId: 211824638 --- tensorflow_serving/g3doc/serving_basic.md | 80 ++++++++++++----------- 1 file changed, 43 insertions(+), 37 deletions(-) diff --git a/tensorflow_serving/g3doc/serving_basic.md b/tensorflow_serving/g3doc/serving_basic.md index 5931f809f5c..9b1bbab683a 100644 --- a/tensorflow_serving/g3doc/serving_basic.md +++ b/tensorflow_serving/g3doc/serving_basic.md @@ -82,43 +82,49 @@ sub-directory under the given path. You can add meta graph and variables to the builder using `SavedModelBuilder.add_meta_graph_and_variables()` with the following arguments: -* `sess` is the TensorFlow session that holds the trained model you are - exporting. - -* `tags` is the set of tags with which to save the meta graph. In this case, - since we intend to use the graph in serving, we use the `serve` tag from - predefined SavedModel tag constants. For more details, see [tag_constants.py](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/saved_model/tag_constants.py) - and [related TensorFlow API documentation](https://www.tensorflow.org/api_docs/python/tf/saved_model/tag_constants). - -* `signature_def_map` specifies the map of user-supplied key for a - **signature** to a tensorflow::SignatureDef to add to the meta graph. - Signature specifies what type of model is being exported, and the - input/output tensors to bind to when running inference. - - The special signature key `serving_default` specifies the default serving - signature. The default serving signature def key, along with other constants - related to signatures, are defined as part of SavedModel signature constants. - For more details, see [signature_constants.py](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/saved_model/signature_constants.py) - and related [TensorFlow 1.0 API documentation](https://www.tensorflow.org/api_docs/python/tf/saved_model/signature_constants). - - Further, to help build signature defs easily, the SavedModel API provides - [signature def utils](https://www.tensorflow.org/api_docs/python/tf/saved_model/signature_def_utils). - Specifically, in the `mnist_saved_model.py` code snippet above, we use - `signature_def_utils.build_signature_def()` to build `predict_signature` and - `classification_signature`. - - As an example for how `predict_signature` is defined, the util takes the - following arguments: - - * `inputs={'images': tensor_info_x}` specifies the input tensor info. - - * `outputs={'scores': tensor_info_y}` specifies the scores tensor info. - - * `method_name` is the method used for the inference. For Prediction - requests, it should be set to `tensorflow/serving/predict`. For other - method names, see [signature_constants.py](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/saved_model/signature_constants.py) - and related [TensorFlow 1.0 API documentation](https://www.tensorflow.org/api_docs/python/tf/saved_model/signature_constants). - +* `sess` is the TensorFlow session that holds the trained model you are + exporting. + +* `tags` is the set of tags with which to save the meta graph. In this case, + since we intend to use the graph in serving, we use the `serve` tag from + predefined SavedModel tag constants. For more details, see + [tag_constants.py](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/saved_model/tag_constants.py) + and + [related TensorFlow API documentation](https://www.tensorflow.org/api_docs/python/tf/saved_model/tag_constants). + +* `signature_def_map` specifies the map of user-supplied key for a + **signature** to a tensorflow::SignatureDef to add to the meta graph. + Signature specifies what type of model is being exported, and the + input/output tensors to bind to when running inference. + + The special signature key `serving_default` specifies the default serving + signature. The default serving signature def key, along with other constants + related to signatures, are defined as part of SavedModel signature + constants. For more details, see + [signature_constants.py](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/saved_model/signature_constants.py) + and related + [TensorFlow 1.0 API documentation](https://www.tensorflow.org/api_docs/python/tf/saved_model/signature_constants). + + Further, to help build signature defs easily, the SavedModel API provides + [signature def utils](https://www.tensorflow.org/api_docs/python/tf/saved_model/signature_def_utils). + Specifically, in the original + [mnist_saved_model.py](https://github.com/tensorflow/serving/tree/master/tensorflow_serving/example/mnist_saved_model.py) + file, we use `signature_def_utils.build_signature_def()` to build + `predict_signature` and `classification_signature`. + + As an example for how `predict_signature` is defined, the util takes the + following arguments: + + * `inputs={'images': tensor_info_x}` specifies the input tensor info. + + * `outputs={'scores': tensor_info_y}` specifies the scores tensor info. + + * `method_name` is the method used for the inference. For Prediction + requests, it should be set to `tensorflow/serving/predict`. For other + method names, see + [signature_constants.py](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/saved_model/signature_constants.py) + and related + [TensorFlow 1.0 API documentation](https://www.tensorflow.org/api_docs/python/tf/saved_model/signature_constants). Note that `tensor_info_x` and `tensor_info_y` have the structure of `tensorflow::TensorInfo` protocol buffer defined [here](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/protobuf/meta_graph.proto). From 7bf6c5c3bd0ecf91dc9a3130207dfc17faa5c43f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Sep 2018 10:16:43 -0700 Subject: [PATCH 0956/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211827236 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 651b06f5b8c..106b34e8a2f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2ad22dc7c18cafe156fb565267aeec4a271d91767c9de5478339928006d9e7f2", - git_commit = "04f3ddac5b69c85558657db5c1b409059716fdb7", + sha256 = "bdfad5eaffaabc6a8dab8cf5afe6060dac3bbf97085c290014970eb17b681ffe", + git_commit = "bfff3425e0938c6bcc635edce2673252c4762a99", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6e95b6f920a104f8ef4d47bbf6744df5f623021e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Sep 2018 11:03:42 -0700 Subject: [PATCH 0957/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211835339 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 106b34e8a2f..ceacbdef4e7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bdfad5eaffaabc6a8dab8cf5afe6060dac3bbf97085c290014970eb17b681ffe", - git_commit = "bfff3425e0938c6bcc635edce2673252c4762a99", + sha256 = "fee60857d756e552d10d1f0fd95e0dcefffb52e9215be895e3b08c78694f4ca9", + git_commit = "84f091dff8e1bcd93ac2d69d2cc11faca3790ac9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 801603e21acf324d9b2458853e92d7ceb9394b64 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Sep 2018 12:04:09 -0700 Subject: [PATCH 0958/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211845834 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ceacbdef4e7..fe7c019492a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fee60857d756e552d10d1f0fd95e0dcefffb52e9215be895e3b08c78694f4ca9", - git_commit = "84f091dff8e1bcd93ac2d69d2cc11faca3790ac9", + sha256 = "d74acd681399d0e34351293482b5e0c91ec969dd25af813c93bc4635752ebb0f", + git_commit = "ca5952670d98b568fa4ac671cf2310d78474c525", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4b838c8e0f3906755f920c2c118aa4e9ab61bc08 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Sep 2018 13:05:43 -0700 Subject: [PATCH 0959/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211855469 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fe7c019492a..88941564652 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d74acd681399d0e34351293482b5e0c91ec969dd25af813c93bc4635752ebb0f", - git_commit = "ca5952670d98b568fa4ac671cf2310d78474c525", + sha256 = "a4d069bb6e3eb0b26cb807cb78484cfcd95e90d60fea6ab4abbe75ef235136f5", + git_commit = "de284aecef2ce73c0236a223c1df1995c23395b9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f57166fae400a52ffed4acc658c3e0a622070e85 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Sep 2018 14:05:06 -0700 Subject: [PATCH 0960/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211865752 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 88941564652..a067579f4b6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a4d069bb6e3eb0b26cb807cb78484cfcd95e90d60fea6ab4abbe75ef235136f5", - git_commit = "de284aecef2ce73c0236a223c1df1995c23395b9", + sha256 = "802c1f724bef046ef31a0429ae702d8680a6fd98141d5ac71145b496bc00a5df", + git_commit = "1aabc8beacd27b5577c72329310ce309f2e45eca", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 585e0668ecf6e6c8b61b2bff5c4fdbb32991ec08 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Thu, 6 Sep 2018 14:36:01 -0700 Subject: [PATCH 0961/8103] Improve support for supplying additional arguments to docker serving containers PiperOrigin-RevId: 211871368 --- tensorflow_serving/g3doc/docker.md | 16 ++++++++++++++++ tensorflow_serving/tools/docker/Dockerfile | 11 ++++++++++- tensorflow_serving/tools/docker/Dockerfile.gpu | 11 ++++++++++- 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/g3doc/docker.md b/tensorflow_serving/g3doc/docker.md index 03addd7e39b..d681334193d 100644 --- a/tensorflow_serving/g3doc/docker.md +++ b/tensorflow_serving/g3doc/docker.md @@ -85,6 +85,22 @@ If we wanted to publish the gRPC port, we would use `-p 8500:8500`. You can have both gRPC and REST API ports open at the same time, or choose to only open one or the other. +#### Passing additional arguments + +`tensorflow_model_server` supports many additional arguments that you could pass +to the serving docker containers. For example, if we wanted to pass a model +config file instead of specifying the model name, we could do the following: + +```shell +docker run -p 8500:8500 8501:8501 \ + --mount type=bind,source=/path/to/my_model/,target=/models/my_model \ + --mount type=bind,source=/path/to/my/models.config,target=/models/models.config \ + -t tensorflow/serving --model_config_file=/models/models.config +``` + +This approach works for any of the other command line arguments that +`tensorflow_model_server` supports. + ### Creating your own serving image If you want a serving image that has your model built into the container, you diff --git a/tensorflow_serving/tools/docker/Dockerfile b/tensorflow_serving/tools/docker/Dockerfile index f2ee814d577..4ba889cb93c 100644 --- a/tensorflow_serving/tools/docker/Dockerfile +++ b/tensorflow_serving/tools/docker/Dockerfile @@ -47,4 +47,13 @@ RUN mkdir -p ${MODEL_BASE_PATH} # The only required piece is the model name in order to differentiate endpoints ENV MODEL_NAME=model -ENTRYPOINT tensorflow_model_server --port=8500 --rest_api_port=8501 --model_name=${MODEL_NAME} --model_base_path=${MODEL_BASE_PATH}/${MODEL_NAME} + +# Create a script that runs the model server so we can use environment variables +# while also passing in arguments from the docker command line +RUN echo '#!/bin/bash \n\n\ +tensorflow_model_server --port=8500 --rest_api_port=8501 \ +--model_name=${MODEL_NAME} --model_base_path=${MODEL_BASE_PATH}/${MODEL_NAME} \ +"$@"' > /usr/bin/tf_serving_entrypoint.sh \ +&& chmod +x /usr/bin/tf_serving_entrypoint.sh + +ENTRYPOINT ["/usr/bin/tf_serving_entrypoint.sh"] diff --git a/tensorflow_serving/tools/docker/Dockerfile.gpu b/tensorflow_serving/tools/docker/Dockerfile.gpu index 51356f959ea..2c159273f44 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.gpu @@ -48,4 +48,13 @@ RUN mkdir -p ${MODEL_BASE_PATH} # The only required piece is the model name in order to differentiate endpoints ENV MODEL_NAME=model -ENTRYPOINT tensorflow_model_server --port=8500 --rest_api_port=8501 --model_name=${MODEL_NAME} --model_base_path=${MODEL_BASE_PATH}/${MODEL_NAME} + +# Create a script that runs the model server so we can use environment variables +# while also passing in arguments from the docker command line +RUN echo '#!/bin/bash \n\n\ +tensorflow_model_server --port=8500 --rest_api_port=8501 \ +--model_name=${MODEL_NAME} --model_base_path=${MODEL_BASE_PATH}/${MODEL_NAME} \ +"$@"' > /usr/bin/tf_serving_entrypoint.sh \ +&& chmod +x /usr/bin/tf_serving_entrypoint.sh + +ENTRYPOINT ["/usr/bin/tf_serving_entrypoint.sh"] From e05ea631223e62381a1475359fc48dfd43804638 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Sep 2018 15:04:02 -0700 Subject: [PATCH 0962/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211876048 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a067579f4b6..d5fcdbabf6f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "802c1f724bef046ef31a0429ae702d8680a6fd98141d5ac71145b496bc00a5df", - git_commit = "1aabc8beacd27b5577c72329310ce309f2e45eca", + sha256 = "6aa2be7255158f583ee45eaf84cfb803d2dc94d17a2b9e6a970907ce096210d9", + git_commit = "0c6c46dad147769f4b09b9a92e04630bcca82e74", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 26c2a2b6d808de07243360e6cd64b61baac8a558 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Sep 2018 16:00:53 -0700 Subject: [PATCH 0963/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211885354 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d5fcdbabf6f..08424d5f0d5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6aa2be7255158f583ee45eaf84cfb803d2dc94d17a2b9e6a970907ce096210d9", - git_commit = "0c6c46dad147769f4b09b9a92e04630bcca82e74", + sha256 = "fef386ecbac661a2040e16e42b36513fa37e63c9a1875b1fdf259e23aee4cd93", + git_commit = "d76deb208280b36b74b0e240d65e797d93c82722", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e0f7807f6f30031c1af9494253fe01ede136a017 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Sep 2018 17:34:06 -0700 Subject: [PATCH 0964/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211898174 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 08424d5f0d5..da5d602c945 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fef386ecbac661a2040e16e42b36513fa37e63c9a1875b1fdf259e23aee4cd93", - git_commit = "d76deb208280b36b74b0e240d65e797d93c82722", + sha256 = "cd446a048ea31696265857e91c31ff620346fc8dc191b996b250acda60024017", + git_commit = "c4df798540b83026ccc74d69da38960e43af8f55", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4f607276820df4f1e3047599cf7f47bbb94a8418 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Sep 2018 18:26:17 -0700 Subject: [PATCH 0965/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211903571 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index da5d602c945..2cb014a8ff3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cd446a048ea31696265857e91c31ff620346fc8dc191b996b250acda60024017", - git_commit = "c4df798540b83026ccc74d69da38960e43af8f55", + sha256 = "a3f68d10d1fd1864af708b2d0856999b919d5adc6be6bf799f1f49d43c210d35", + git_commit = "3995a2949ed789dd740786e909730850eb176aea", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 71e0fdc3cf96b62d6a441ab6bde33db3a302e6c3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Sep 2018 19:04:32 -0700 Subject: [PATCH 0966/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211906966 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2cb014a8ff3..aa6afbea3d1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a3f68d10d1fd1864af708b2d0856999b919d5adc6be6bf799f1f49d43c210d35", - git_commit = "3995a2949ed789dd740786e909730850eb176aea", + sha256 = "de0bbc945ceb130a4d9409114b6e6d3c75a187edf2383a52e70034986d917f69", + git_commit = "ed343f4a05ee16f3b354f647d89f21505ea45912", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ea2f74638eaad4af7fd9f913f7efeb51bf252858 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Sep 2018 20:01:37 -0700 Subject: [PATCH 0967/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211911688 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index aa6afbea3d1..b6ac557d318 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "de0bbc945ceb130a4d9409114b6e6d3c75a187edf2383a52e70034986d917f69", - git_commit = "ed343f4a05ee16f3b354f647d89f21505ea45912", + sha256 = "a3fb1e5d563fbbd613dd24bb12dd4ffa79e188ce8a430bb498e215260ca50a54", + git_commit = "ed7dcd42076afe778e3ead8f86708cabd4e8ce10", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 39feefff7642811b407e3e003c2e3bb71fce777f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Sep 2018 23:04:05 -0700 Subject: [PATCH 0968/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211927274 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b6ac557d318..7c480dabb8c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a3fb1e5d563fbbd613dd24bb12dd4ffa79e188ce8a430bb498e215260ca50a54", - git_commit = "ed7dcd42076afe778e3ead8f86708cabd4e8ce10", + sha256 = "2a3af912e0b038837d8750b980cc1aadc847097fb07f12552a8395c05ad60eca", + git_commit = "debd66dae1c9a49d36ea006c97facf06b4ac25cb", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 16359a128f6a35de51d1547e2d0b38efed336783 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Sep 2018 03:01:45 -0700 Subject: [PATCH 0969/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211948620 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7c480dabb8c..7e7dd8761c7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2a3af912e0b038837d8750b980cc1aadc847097fb07f12552a8395c05ad60eca", - git_commit = "debd66dae1c9a49d36ea006c97facf06b4ac25cb", + sha256 = "db3330f22700e7222840504ef10fbf8897b1f4a8706c9b1fda350a954026a8dd", + git_commit = "424de2b5279bf3779c27a39403f94281f3460543", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f00da019ef0e94d6f40de32334e10332f8ebfcf4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Sep 2018 04:01:06 -0700 Subject: [PATCH 0970/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211953370 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7e7dd8761c7..765a0e373ef 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "db3330f22700e7222840504ef10fbf8897b1f4a8706c9b1fda350a954026a8dd", - git_commit = "424de2b5279bf3779c27a39403f94281f3460543", + sha256 = "6e7a0d95999cb9f1920c989dbcf45a50785ae5a966248d71c8bb7f60261c7ef5", + git_commit = "c5267a54a63a08234a0314888f6cfe842647a73b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ed57ffa6420b0680411d2728900af6b5e1bc9ca9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Sep 2018 05:01:32 -0700 Subject: [PATCH 0971/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211958066 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 765a0e373ef..809f0df0ff0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6e7a0d95999cb9f1920c989dbcf45a50785ae5a966248d71c8bb7f60261c7ef5", - git_commit = "c5267a54a63a08234a0314888f6cfe842647a73b", + sha256 = "a7082a0cf83bdbc947570068194e80920e82997b26851429bd5d1cd5f03f1f3f", + git_commit = "40ec9e8e740feec53e9a096da7079bbc9e392604", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From de60f8b53e787349ac90392caa5d601400393d6b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Sep 2018 08:02:08 -0700 Subject: [PATCH 0972/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211976822 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 809f0df0ff0..597315886f1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a7082a0cf83bdbc947570068194e80920e82997b26851429bd5d1cd5f03f1f3f", - git_commit = "40ec9e8e740feec53e9a096da7079bbc9e392604", + sha256 = "6a1254038f26fdb31f53ebfad6dfc3213255032d0df4901c78b7ac73ab9fd157", + git_commit = "4588361b6a5b48aad1ead88755d2afef38605af5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 62d667fec7f82ff4734caca0302215942e685e62 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Sep 2018 10:08:59 -0700 Subject: [PATCH 0973/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 211993071 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 597315886f1..5ffadcf81ff 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6a1254038f26fdb31f53ebfad6dfc3213255032d0df4901c78b7ac73ab9fd157", - git_commit = "4588361b6a5b48aad1ead88755d2afef38605af5", + sha256 = "66091c3db31c884fdfb44be943f18d19966a966d3dfcf2d7f8399ac391de9b55", + git_commit = "afb966c4316a60823b584add5cec023d88a88887", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5aeda013ebe5c3c41291103e0ee1c33903786475 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Sep 2018 11:01:26 -0700 Subject: [PATCH 0974/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212002304 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5ffadcf81ff..39751833c6b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "66091c3db31c884fdfb44be943f18d19966a966d3dfcf2d7f8399ac391de9b55", - git_commit = "afb966c4316a60823b584add5cec023d88a88887", + sha256 = "35340d8345d1e17f4e30f60068e75db3c8e4681fadd287dd627b05178058cdc8", + git_commit = "9a96685ec3b9ea4c50b1e8739daa15f870167110", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fca3e7324a08b0ae2f552702f418683de66d730a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Sep 2018 12:01:35 -0700 Subject: [PATCH 0975/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212013472 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 39751833c6b..e9928ea7c6a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "35340d8345d1e17f4e30f60068e75db3c8e4681fadd287dd627b05178058cdc8", - git_commit = "9a96685ec3b9ea4c50b1e8739daa15f870167110", + sha256 = "ced4d23fc7b6231312fc7227f5054d64ba48219017e56de8206de66aa21ae8bb", + git_commit = "dfd6aba381a7867906ba2d173c1720bb38dec6a8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 172ac756f60a89c24e42afcd6f86ed654e8d266a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Sep 2018 13:01:31 -0700 Subject: [PATCH 0976/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212022530 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e9928ea7c6a..10485d84d90 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ced4d23fc7b6231312fc7227f5054d64ba48219017e56de8206de66aa21ae8bb", - git_commit = "dfd6aba381a7867906ba2d173c1720bb38dec6a8", + sha256 = "edd886982f0c8c1c68f470ca62a046797fbda0d8582f2e5eee3056f7963dc89c", + git_commit = "0a375d94b6fd4c3cd0bd5d0a301b3acc65b96d78", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From da6eb048886286e4d03d71bba5a2f9379ce16c9d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Sep 2018 14:01:46 -0700 Subject: [PATCH 0977/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212031812 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 10485d84d90..aab857d9d30 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "edd886982f0c8c1c68f470ca62a046797fbda0d8582f2e5eee3056f7963dc89c", - git_commit = "0a375d94b6fd4c3cd0bd5d0a301b3acc65b96d78", + sha256 = "b5221c041acd1b3e81f4c679ff59b36d92d53c4473877e36de77e46cc41441be", + git_commit = "eb71a1a3afbbe21407b2149d7adc4efa9e557b24", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5aa39dc77346921ffb30b6866b9633b7bc160190 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Sep 2018 15:09:21 -0700 Subject: [PATCH 0978/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212043310 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index aab857d9d30..e79b588c4c1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b5221c041acd1b3e81f4c679ff59b36d92d53c4473877e36de77e46cc41441be", - git_commit = "eb71a1a3afbbe21407b2149d7adc4efa9e557b24", + sha256 = "b7cfd3e028ff3e922032432130adbe7756c59bdd1d4301ddb1d44e3af0c87443", + git_commit = "e421c553ea533c508c7fa117d65a4d92d2146e99", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From cef8c3af3271b48324e514ac58790d59a74679bb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Sep 2018 16:02:18 -0700 Subject: [PATCH 0979/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212051309 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e79b588c4c1..8e041912505 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b7cfd3e028ff3e922032432130adbe7756c59bdd1d4301ddb1d44e3af0c87443", - git_commit = "e421c553ea533c508c7fa117d65a4d92d2146e99", + sha256 = "ae4d0dfe6a5e3a49c88b4ecab40f062263ee12a2d7af42c0931cb9a9bb1ce7d6", + git_commit = "0fa21fcfa1ff9ced6b2a2f8a293558ad8845e1d5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4afe9522063f935ce3cdbd0399d2520fa0a96c9f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Sep 2018 17:14:56 -0700 Subject: [PATCH 0980/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212061932 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8e041912505..0b222a8943f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ae4d0dfe6a5e3a49c88b4ecab40f062263ee12a2d7af42c0931cb9a9bb1ce7d6", - git_commit = "0fa21fcfa1ff9ced6b2a2f8a293558ad8845e1d5", + sha256 = "dda9424d068c3cf335cfa35b31511d430872d99a83a87f999aa67b3c3d65e3bd", + git_commit = "39b2fb7cfef489424fead18ec5174d8e8b2a9a1a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 08ee5ac35960ddcfb869b552e5c0e0455d63246e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Sep 2018 18:08:59 -0700 Subject: [PATCH 0981/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212067887 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0b222a8943f..702259cb394 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dda9424d068c3cf335cfa35b31511d430872d99a83a87f999aa67b3c3d65e3bd", - git_commit = "39b2fb7cfef489424fead18ec5174d8e8b2a9a1a", + sha256 = "0c9d182b73f8f062aecf3ed217063dacd27354cddee21aa42e198fc4a7f04fda", + git_commit = "35c38c92d0fcb458047282f1e87146ae38c21b57", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5782ff145e402710825448954bcc85dc98564676 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Sep 2018 19:02:44 -0700 Subject: [PATCH 0982/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212072111 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 702259cb394..0787efd040c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0c9d182b73f8f062aecf3ed217063dacd27354cddee21aa42e198fc4a7f04fda", - git_commit = "35c38c92d0fcb458047282f1e87146ae38c21b57", + sha256 = "a713356d288a25c16c7f7a723a51222ed38803f158243bb184dafd0485c747da", + git_commit = "3ea43a044e7515388ecf322437b08f4ced5674aa", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 580d539ac56c7ff776dd0c720a88f65e736aedee Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Sep 2018 20:03:12 -0700 Subject: [PATCH 0983/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212076263 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0787efd040c..6ad0889c686 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a713356d288a25c16c7f7a723a51222ed38803f158243bb184dafd0485c747da", - git_commit = "3ea43a044e7515388ecf322437b08f4ced5674aa", + sha256 = "4cf359fb13337612453693a48be7f0d233fcf7c7aef7c70323c64ab976aed52e", + git_commit = "4fd48f57cd1dcd960bea1757e1c59032db66b3d0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e001585eda2cde4273985a9b0cd0891148bad689 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Sep 2018 21:02:31 -0700 Subject: [PATCH 0984/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212079846 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6ad0889c686..0c91c1b38ce 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4cf359fb13337612453693a48be7f0d233fcf7c7aef7c70323c64ab976aed52e", - git_commit = "4fd48f57cd1dcd960bea1757e1c59032db66b3d0", + sha256 = "5c0195bfc3ad250850076dd2e3e461c15cc1c240841da773540c681e7e43f889", + git_commit = "e970a022ef6a3602dd5c9ea15afa96a2291880b1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ac622601b8c316898dc9ba6e4f4d82429dd5a5c0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 8 Sep 2018 00:01:54 -0700 Subject: [PATCH 0985/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212089073 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0c91c1b38ce..ba47e064c88 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5c0195bfc3ad250850076dd2e3e461c15cc1c240841da773540c681e7e43f889", - git_commit = "e970a022ef6a3602dd5c9ea15afa96a2291880b1", + sha256 = "b8365ac644c3e48bad99cd1a2f1bf418636ea84af2e716c1fa287abf60b95569", + git_commit = "8284401718fedc0c5ae1cdf19ea399efcca6c03f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 32b0043653a40432357e39da8c556871ee8afecd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 8 Sep 2018 03:04:17 -0700 Subject: [PATCH 0986/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212101953 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ba47e064c88..134d0deb777 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b8365ac644c3e48bad99cd1a2f1bf418636ea84af2e716c1fa287abf60b95569", - git_commit = "8284401718fedc0c5ae1cdf19ea399efcca6c03f", + sha256 = "0efef03b8d8ffaae1168a8e0a057adb8426c5651c5e270489a3df74915e367de", + git_commit = "bfead6061a6f10c5a3e5d05f8a946443fb9a3218", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 560ef53600b7edd7a4ef162240946e9c30004e69 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 8 Sep 2018 11:01:28 -0700 Subject: [PATCH 0987/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212124553 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 134d0deb777..ba2faa61f43 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0efef03b8d8ffaae1168a8e0a057adb8426c5651c5e270489a3df74915e367de", - git_commit = "bfead6061a6f10c5a3e5d05f8a946443fb9a3218", + sha256 = "c841822a8141aa0ae14a0428fa5beee5114322fb8ee035087f6d944848d59a22", + git_commit = "a6bb25c05c15e39d04baf6dac30200db367e1ef2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From bc3ed835122ef9624e0f1f2576604cbf1801583f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 8 Sep 2018 12:01:07 -0700 Subject: [PATCH 0988/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212127323 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ba2faa61f43..2c88ca7916b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c841822a8141aa0ae14a0428fa5beee5114322fb8ee035087f6d944848d59a22", - git_commit = "a6bb25c05c15e39d04baf6dac30200db367e1ef2", + sha256 = "2e885d1f71536b2bb87f82ae8ac18f48d3549d05a659dcb059ea9f9ce8fa0b71", + git_commit = "31c1d228b15d6bcda2d6bd2172605d3a5f7d2be8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From af60fc5ee9b3a55c7bbeb618b535f522f0bb417f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 8 Sep 2018 16:01:10 -0700 Subject: [PATCH 0989/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212138702 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2c88ca7916b..4113d785c67 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2e885d1f71536b2bb87f82ae8ac18f48d3549d05a659dcb059ea9f9ce8fa0b71", - git_commit = "31c1d228b15d6bcda2d6bd2172605d3a5f7d2be8", + sha256 = "71b098f38f9979a5511195f4b1e427cf6b7f6754c596c5946659f03b0864fe69", + git_commit = "1bf545492596f1d3dbaf1485de500116a2d2a25b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 542ba1d9793eb407a7ff3c35d4c5cf48b27113da Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 9 Sep 2018 03:04:03 -0700 Subject: [PATCH 0990/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212168313 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4113d785c67..1938131b7f1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "71b098f38f9979a5511195f4b1e427cf6b7f6754c596c5946659f03b0864fe69", - git_commit = "1bf545492596f1d3dbaf1485de500116a2d2a25b", + sha256 = "bb2b03cb9dd1f06075cc939512c25bf0763c5fd8eafffcc82afb51401e566675", + git_commit = "a3776a234f555213aafcf41f49a42a8a9448c4ac", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 48b342483f10bfc68d658940e5096d1509c78709 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 9 Sep 2018 04:03:16 -0700 Subject: [PATCH 0991/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212170719 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1938131b7f1..ae08fe7aed4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bb2b03cb9dd1f06075cc939512c25bf0763c5fd8eafffcc82afb51401e566675", - git_commit = "a3776a234f555213aafcf41f49a42a8a9448c4ac", + sha256 = "4c4f233129d3c1d03d0edf62d5e4400277c921b104de6679f0fd5fdf983640ab", + git_commit = "b4d89565fcd73b4f2c4d6aa1ff159006795674b5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a6033281826e514a613ea430f8affda2c3a805fc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 9 Sep 2018 09:04:12 -0700 Subject: [PATCH 0992/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212181176 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ae08fe7aed4..1c978595756 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4c4f233129d3c1d03d0edf62d5e4400277c921b104de6679f0fd5fdf983640ab", - git_commit = "b4d89565fcd73b4f2c4d6aa1ff159006795674b5", + sha256 = "4632c84430f2db5fe4a3110340976365a522291242dc58419cee3e4c4894d7b8", + git_commit = "d31f360e1574553ed23b8d483512a2065ac426eb", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 822955c0271d45b039b96abb1c132c1ee339892c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 9 Sep 2018 12:03:04 -0700 Subject: [PATCH 0993/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212188443 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1c978595756..c9c37d98729 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4632c84430f2db5fe4a3110340976365a522291242dc58419cee3e4c4894d7b8", - git_commit = "d31f360e1574553ed23b8d483512a2065ac426eb", + sha256 = "7b13849ed29083b280ce35f5f8742ea94718b736de5f8378cddcf336a85d5257", + git_commit = "b40ace8f28315431e3435647ce39cc7b24c20bfd", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7eda38803233a93930822c6d75d2f3c2a34f99cf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 9 Sep 2018 13:03:27 -0700 Subject: [PATCH 0994/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212190779 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c9c37d98729..2c85fc7a039 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7b13849ed29083b280ce35f5f8742ea94718b736de5f8378cddcf336a85d5257", - git_commit = "b40ace8f28315431e3435647ce39cc7b24c20bfd", + sha256 = "2aa23e6ffaf6b56a186bb70e7a2912b01b3950f2454783bf2ac1148e5beaae71", + git_commit = "515a7f3ccb96b8f1224c4b93e942b81942c4e3d2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d1ee6c95ae30ce3fe54c04d7747277c6e0462875 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 9 Sep 2018 21:00:51 -0700 Subject: [PATCH 0995/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212211703 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2c85fc7a039..4fdce816a52 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2aa23e6ffaf6b56a186bb70e7a2912b01b3950f2454783bf2ac1148e5beaae71", - git_commit = "515a7f3ccb96b8f1224c4b93e942b81942c4e3d2", + sha256 = "dfa3bead60bf4ff2ab24eb56109ae678f2e2d30301865807214ccdd0c9756153", + git_commit = "551123bba011a50a925f27b5f22c49c898bcd978", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4aebdac7b605ca0d32a92b682e199a1a8db96286 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 9 Sep 2018 22:01:34 -0700 Subject: [PATCH 0996/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212215148 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4fdce816a52..d527265151f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dfa3bead60bf4ff2ab24eb56109ae678f2e2d30301865807214ccdd0c9756153", - git_commit = "551123bba011a50a925f27b5f22c49c898bcd978", + sha256 = "ad475bf2ed9c0ac8a6b11ee820111a6e4a830cb396f80fe62c4d98d51d2af445", + git_commit = "5d62202cb1491cf97f0cd34a9c7b0d691984ff5b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 87178f4326c6831dc848281ce3af0260b14a10e7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Sep 2018 03:10:33 -0700 Subject: [PATCH 0997/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212240938 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d527265151f..b3c6d940b8b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ad475bf2ed9c0ac8a6b11ee820111a6e4a830cb396f80fe62c4d98d51d2af445", - git_commit = "5d62202cb1491cf97f0cd34a9c7b0d691984ff5b", + sha256 = "f6db3c73dea7e15c8bb55927ec321d38fc504b43e6c8e4ca871877aded85ebcb", + git_commit = "7624156f03549e1822969d9eb2395b9357f74aa7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 451ec886a8b57bb2f09f85c36fac310b6a735e6c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Sep 2018 08:03:46 -0700 Subject: [PATCH 0998/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212267805 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b3c6d940b8b..2561e81b3c1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f6db3c73dea7e15c8bb55927ec321d38fc504b43e6c8e4ca871877aded85ebcb", - git_commit = "7624156f03549e1822969d9eb2395b9357f74aa7", + sha256 = "44383f008e95f4a703329a09219a8e7c3bd069cd08977118e9a971331de2a3c4", + git_commit = "192e842e78475310ae0a36287570a1edcb2fbdaf", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9ac983387a766be12ab937117936e03176a40030 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Sep 2018 09:05:04 -0700 Subject: [PATCH 0999/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212276437 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2561e81b3c1..41da2532375 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "44383f008e95f4a703329a09219a8e7c3bd069cd08977118e9a971331de2a3c4", - git_commit = "192e842e78475310ae0a36287570a1edcb2fbdaf", + sha256 = "c928f3140743a44527753fe0f50a6e7be409049f9fe0a76b45a3ed8e399605f8", + git_commit = "7ede7c78a1e1fccd6f2c083dad4e2629dfd43714", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 60b50213aeb2e3ac80fa924ca8247e6cf3888052 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Sep 2018 10:15:14 -0700 Subject: [PATCH 1000/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212287576 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 41da2532375..4af6baa08d4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c928f3140743a44527753fe0f50a6e7be409049f9fe0a76b45a3ed8e399605f8", - git_commit = "7ede7c78a1e1fccd6f2c083dad4e2629dfd43714", + sha256 = "5181962db52e35db62ced03ed404589d9ce2b60a613ad71c17092dec61e062bc", + git_commit = "73fd552491252494f71ec1fbf39daa5b41a48749", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e2b0209fd99a3b1f900b2a6ffa704f56a3fb3750 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Sep 2018 11:05:22 -0700 Subject: [PATCH 1001/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212297455 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4af6baa08d4..d2b40225f73 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5181962db52e35db62ced03ed404589d9ce2b60a613ad71c17092dec61e062bc", - git_commit = "73fd552491252494f71ec1fbf39daa5b41a48749", + sha256 = "916e053618318d7bc036702a4a53d88e0b64d1e99402a7fb28340106024be592", + git_commit = "7d3884bb87dc02c4548f55749f3d6db1b8364ddc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5ecbb7f80f7291a77ccaf93de541265d0bded180 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Sep 2018 12:14:12 -0700 Subject: [PATCH 1002/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212310115 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d2b40225f73..3882f187d58 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "916e053618318d7bc036702a4a53d88e0b64d1e99402a7fb28340106024be592", - git_commit = "7d3884bb87dc02c4548f55749f3d6db1b8364ddc", + sha256 = "0c60c0ea469dfc011aa72c72d50f363c7d74bde7337ffeb6859d47a1a28e390c", + git_commit = "c5b14b334e89b9bcb0fd0199481318b8fdd65762", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 95cc2db53bb80f1db2bfd090d5948fc341b8f7d8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Sep 2018 16:20:58 -0700 Subject: [PATCH 1003/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212354955 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3882f187d58..457427c69e6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0c60c0ea469dfc011aa72c72d50f363c7d74bde7337ffeb6859d47a1a28e390c", - git_commit = "c5b14b334e89b9bcb0fd0199481318b8fdd65762", + sha256 = "dc87bae34a0618aacdb1de0028432ed7557add31d007e0776ed49f7b662d2c06", + git_commit = "6951e0646d7dc8931b6cbe4388dcc3921249d462", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From be6dee0a9c854e065ee04a77990998a5f9a6a9b9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Sep 2018 17:03:25 -0700 Subject: [PATCH 1004/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212361929 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 457427c69e6..42b2919d684 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dc87bae34a0618aacdb1de0028432ed7557add31d007e0776ed49f7b662d2c06", - git_commit = "6951e0646d7dc8931b6cbe4388dcc3921249d462", + sha256 = "29d9ae0a7abe1e0d10aae553143153acca81c6924ec4ff58deb11d7dd5880e90", + git_commit = "7b8ffbe4c1da2c53551645fd023df577c43fa16c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ea22956b5a67ab604cd90baf541b46f1e8668b4e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Sep 2018 18:03:58 -0700 Subject: [PATCH 1005/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212370769 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 42b2919d684..0bf36c67254 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "29d9ae0a7abe1e0d10aae553143153acca81c6924ec4ff58deb11d7dd5880e90", - git_commit = "7b8ffbe4c1da2c53551645fd023df577c43fa16c", + sha256 = "8ff45e6d9ba86e01fd079ebd6647e1d3b51a3edc73f01653863d51814eadcee6", + git_commit = "c277998e9f82660b1573fd5587780a97db761a65", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 015bc811f90a359cd947e866a4d661c16bbdcfc8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Sep 2018 19:03:18 -0700 Subject: [PATCH 1006/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212377198 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0bf36c67254..184ad98a20f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8ff45e6d9ba86e01fd079ebd6647e1d3b51a3edc73f01653863d51814eadcee6", - git_commit = "c277998e9f82660b1573fd5587780a97db761a65", + sha256 = "2570ecdc4d4cdcb3e8db0f4a071b6fa9f316250572cf57236f248d37c4a168ee", + git_commit = "de683c50d039676e36b6a718e4cc7ed2170a8a2f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From af94db7562273bcc400c4c92ccb1524f92e5d6e1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Sep 2018 20:01:35 -0700 Subject: [PATCH 1007/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212381983 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 184ad98a20f..a944f9e8a05 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2570ecdc4d4cdcb3e8db0f4a071b6fa9f316250572cf57236f248d37c4a168ee", - git_commit = "de683c50d039676e36b6a718e4cc7ed2170a8a2f", + sha256 = "edd53526a1d48f0baa7583b35a88edde2bef5fe69247cc0819ae5a9dde9a3906", + git_commit = "497715e0a9bbb3c844a1902e319778cc30819f77", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ef96e40486618eddb4c1a1dd7a2af5de9df1a47f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Sep 2018 21:02:08 -0700 Subject: [PATCH 1008/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212387383 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a944f9e8a05..cc63293adf7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "edd53526a1d48f0baa7583b35a88edde2bef5fe69247cc0819ae5a9dde9a3906", - git_commit = "497715e0a9bbb3c844a1902e319778cc30819f77", + sha256 = "d89b58c81940981a2c39fd74ca3f38df9954bc521cc8e04e816bbd460d7c23a6", + git_commit = "e6830cdb06efe6f4cea2e4f30aa98f66ee1b305a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2cadf873a4b16959e3a4af2ce5cdc61a8ac83917 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Sep 2018 22:03:31 -0700 Subject: [PATCH 1009/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212392457 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cc63293adf7..8780e30ac8f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d89b58c81940981a2c39fd74ca3f38df9954bc521cc8e04e816bbd460d7c23a6", - git_commit = "e6830cdb06efe6f4cea2e4f30aa98f66ee1b305a", + sha256 = "bc8369084cf5ecc9c8b6400cde71a5a9179ac6b7e7acc42c96bfa714f7c51a42", + git_commit = "786ebb25ea3cd5d69d04bf63838d8dfbf13e6e37", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 33a482789cb21110b118074a0be2c9e990bc8122 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Sep 2018 23:02:09 -0700 Subject: [PATCH 1010/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212397062 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8780e30ac8f..4a68e6cd663 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bc8369084cf5ecc9c8b6400cde71a5a9179ac6b7e7acc42c96bfa714f7c51a42", - git_commit = "786ebb25ea3cd5d69d04bf63838d8dfbf13e6e37", + sha256 = "2a0649bdbb3f7e9035e5c3957e48cc062607873a17eb4574ef588cf0c6d4636b", + git_commit = "34ef46ca948440fa034c7b29cf1a516750eb02d3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ffeed6eb6c027e28316a92aee1a23491fb2f8d02 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Sep 2018 01:02:55 -0700 Subject: [PATCH 1011/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212408136 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4a68e6cd663..f8d7471a936 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2a0649bdbb3f7e9035e5c3957e48cc062607873a17eb4574ef588cf0c6d4636b", - git_commit = "34ef46ca948440fa034c7b29cf1a516750eb02d3", + sha256 = "364d7820d67a3bbe8f70298a62dc3a9ef90dcb02765e10f6195fd9532a50f894", + git_commit = "5375f8c48b3087512f7593cf699346cc0b30a27b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b0848ceb5899f4d659e5c50f50a425b7f25345f5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Sep 2018 02:03:11 -0700 Subject: [PATCH 1012/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212414374 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f8d7471a936..49073d804b3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "364d7820d67a3bbe8f70298a62dc3a9ef90dcb02765e10f6195fd9532a50f894", - git_commit = "5375f8c48b3087512f7593cf699346cc0b30a27b", + sha256 = "eb6aa93de433118244c2d77e4b12e331de8e1500b6ffbd7ae0549d68ed5f437d", + git_commit = "45965cfd8b54fb113275ffdaced5366e28aa3553", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 594e3b5e14bd4a849ebb4f8da34ac7028335c8e0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Sep 2018 03:04:00 -0700 Subject: [PATCH 1013/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212422623 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 49073d804b3..cd82bbc6e73 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eb6aa93de433118244c2d77e4b12e331de8e1500b6ffbd7ae0549d68ed5f437d", - git_commit = "45965cfd8b54fb113275ffdaced5366e28aa3553", + sha256 = "83bb2cd5ddbbb76154176d9e5b1f2ef87551fbb7edfafba5a72a0452453de365", + git_commit = "e18f84a394bcbde62b344a3b32e8d8fd248fea58", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5ba47a414595688bfd1d7bf7ec0b0dc2f9a8e5e2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Sep 2018 07:03:17 -0700 Subject: [PATCH 1014/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212445147 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cd82bbc6e73..646430756ed 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "83bb2cd5ddbbb76154176d9e5b1f2ef87551fbb7edfafba5a72a0452453de365", - git_commit = "e18f84a394bcbde62b344a3b32e8d8fd248fea58", + sha256 = "30f4306aaa027b05413a3e8e0f92e9aa195afa886ee6db2f90e639691a6ce7ff", + git_commit = "9fd56039064871a736bb7cff398b2a8e08454bee", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2687c942ed58311164346976944eebddabbd037b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Sep 2018 08:01:28 -0700 Subject: [PATCH 1015/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212452323 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 646430756ed..64c193b6420 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "30f4306aaa027b05413a3e8e0f92e9aa195afa886ee6db2f90e639691a6ce7ff", - git_commit = "9fd56039064871a736bb7cff398b2a8e08454bee", + sha256 = "45051e35fb3db64f2ba34968218fab2386fe85b5a11f2a0178f5fe959206f679", + git_commit = "87d440506547d5c549261922c268aa55badf0bc4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From bcd011082f02cf16d3a2506d9011905aa562f8f3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Sep 2018 10:04:23 -0700 Subject: [PATCH 1016/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212471439 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 64c193b6420..0f0ea0488d6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "45051e35fb3db64f2ba34968218fab2386fe85b5a11f2a0178f5fe959206f679", - git_commit = "87d440506547d5c549261922c268aa55badf0bc4", + sha256 = "10e6381c89cf09e432adb4ad7cf96e65093b73a404081fdd0bcdb3b780144619", + git_commit = "58a42a0e23466a47d636b097b5d665016e9837aa", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b319d8e6b04bbe8ab0dfe294bbc73100f26abe0a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Sep 2018 11:00:59 -0700 Subject: [PATCH 1017/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212482740 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0f0ea0488d6..42704a944aa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "10e6381c89cf09e432adb4ad7cf96e65093b73a404081fdd0bcdb3b780144619", - git_commit = "58a42a0e23466a47d636b097b5d665016e9837aa", + sha256 = "2d917a495f4ac66d70502db1049a722694fe683d7d7f8c317e5ea83f616a6321", + git_commit = "36568a821a13379b79d74586ff20bdd3e0da102b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fc7cf10c5100781ab55c6a4ff20f67c0df517850 Mon Sep 17 00:00:00 2001 From: awk Date: Tue, 11 Sep 2018 11:10:09 -0700 Subject: [PATCH 1018/8103] Add link to actual test logs. PiperOrigin-RevId: 212484783 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9a8b4b57dd8..a6637e03f42 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # TensorFlow Serving -![Ubuntu Build Status](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges/ubuntu.svg) +[![Ubuntu Build Status](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges/ubuntu.svg)](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges/ubuntu.html) ![Docker CPU Nightly Build Status](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges/docker-cpu-nightly.svg) ![Docker GPU Nightly Build Status](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges/docker-gpu-nightly.svg) From 95d1641de2e11bc68a3c5772dbc3a4db4cf7840b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Sep 2018 12:02:09 -0700 Subject: [PATCH 1019/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212494468 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 42704a944aa..8dbbe40cc86 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2d917a495f4ac66d70502db1049a722694fe683d7d7f8c317e5ea83f616a6321", - git_commit = "36568a821a13379b79d74586ff20bdd3e0da102b", + sha256 = "a693d8034c6008980b2cf650d33ea0d467884ba6ac69f1c2e99b794c46dffe4d", + git_commit = "36d7b12357df667dcd427c070e21779ed83f4ec9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d54d5fddcf84a712719b28f921c5bca7fd9ac650 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Sep 2018 14:01:44 -0700 Subject: [PATCH 1020/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212515979 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8dbbe40cc86..4cbc9111d94 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a693d8034c6008980b2cf650d33ea0d467884ba6ac69f1c2e99b794c46dffe4d", - git_commit = "36d7b12357df667dcd427c070e21779ed83f4ec9", + sha256 = "ba8d3787449c5f54c295bfa4a7c4ff92010f8b6fcadbb240f2695d9fa81c4455", + git_commit = "418c7258687166fc79a04f5a8c903c782a8ad295", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c1d814468826501e0d847d1331a540b67177c149 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Sep 2018 15:03:12 -0700 Subject: [PATCH 1021/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212528386 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4cbc9111d94..34df76ab316 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ba8d3787449c5f54c295bfa4a7c4ff92010f8b6fcadbb240f2695d9fa81c4455", - git_commit = "418c7258687166fc79a04f5a8c903c782a8ad295", + sha256 = "e0f7e82187211baa58f6bbfb0f37741256cca02254fb4779570572b52eb21de8", + git_commit = "b40ab8d8a024bb934f25ebc3f5260b64c5816ef5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e8691d9503570ba5b3a5025d083c304638ff8e7c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Sep 2018 16:03:31 -0700 Subject: [PATCH 1022/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212540011 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 34df76ab316..5b0ba960f6c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e0f7e82187211baa58f6bbfb0f37741256cca02254fb4779570572b52eb21de8", - git_commit = "b40ab8d8a024bb934f25ebc3f5260b64c5816ef5", + sha256 = "50bbe3ae0d9ee6e966deac2c11e2af31ece5d076b985f223d01b087853736841", + git_commit = "ba650a5c989106330519dbde0de368f580435a8b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0842bbe3e5923750f831947b822ba2b07af1092b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Sep 2018 17:03:51 -0700 Subject: [PATCH 1023/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212550380 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5b0ba960f6c..a041f0c778f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "50bbe3ae0d9ee6e966deac2c11e2af31ece5d076b985f223d01b087853736841", - git_commit = "ba650a5c989106330519dbde0de368f580435a8b", + sha256 = "61be8bc475417ad7203c06c742ca047642c273456e86122ed3eb3d37dd02d749", + git_commit = "7020d8752554fd54530e2fe799b55d3c0b895696", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d4bf7499c72f47a7e2622cbd2f39778ac1625ba5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Sep 2018 20:03:21 -0700 Subject: [PATCH 1024/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212570696 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a041f0c778f..c3403560dc3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "61be8bc475417ad7203c06c742ca047642c273456e86122ed3eb3d37dd02d749", - git_commit = "7020d8752554fd54530e2fe799b55d3c0b895696", + sha256 = "ca772d8ff3c7e3847bf4a67c97cca3d1df3e9094af67397d67b014e5bb5d3a34", + git_commit = "210b4d82cf699ca5e97d9075cd987539571b66e5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 365411f78998c7c8937678ddbe9d6ce6a8812142 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Sep 2018 21:01:36 -0700 Subject: [PATCH 1025/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212575703 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c3403560dc3..67944fdf2e2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ca772d8ff3c7e3847bf4a67c97cca3d1df3e9094af67397d67b014e5bb5d3a34", - git_commit = "210b4d82cf699ca5e97d9075cd987539571b66e5", + sha256 = "c53d6cb22ac46e1d3c8be793f4f4105418341265dba63a4de651c71be8b31bfc", + git_commit = "cadd6b42bf6b01c2668420463b0986acd7fd9009", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fcf81db484f9449a293d1a8a81cb0403859ba803 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Sep 2018 23:01:51 -0700 Subject: [PATCH 1026/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212585208 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 67944fdf2e2..895f4e88d5e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c53d6cb22ac46e1d3c8be793f4f4105418341265dba63a4de651c71be8b31bfc", - git_commit = "cadd6b42bf6b01c2668420463b0986acd7fd9009", + sha256 = "f76af7423c200cd901d785246642162640b79cbfc40149c6e756175282b2be97", + git_commit = "6a21e1386e3e68cf752af861b9b1b950bda8a130", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3dbe1c54d5cb6c97aba51cfc6801989c49153736 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Sep 2018 00:01:39 -0700 Subject: [PATCH 1027/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212589648 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 895f4e88d5e..a9163cc34c7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f76af7423c200cd901d785246642162640b79cbfc40149c6e756175282b2be97", - git_commit = "6a21e1386e3e68cf752af861b9b1b950bda8a130", + sha256 = "82a06cdec112c759b5f5458354e227004ec7b4b8370d737c5cc8781f3f13e059", + git_commit = "4b2763e6c8e13ff0f8ab699fc7d370fffac1b5f2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 11eddc2479683c1200b9523cb27f1ff578f602e2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Sep 2018 01:02:14 -0700 Subject: [PATCH 1028/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212595503 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a9163cc34c7..897a3f0430d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "82a06cdec112c759b5f5458354e227004ec7b4b8370d737c5cc8781f3f13e059", - git_commit = "4b2763e6c8e13ff0f8ab699fc7d370fffac1b5f2", + sha256 = "d58ef3f0831f6963e32bba3d0197838e21dd03ca4d893eb932632011dacc45a1", + git_commit = "a5d649045cf60f8b3dde5ba1ff86285c4bcc1695", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d860ad0625b7e6b7cd6e7d6a050c1e0b741b230c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Sep 2018 02:02:26 -0700 Subject: [PATCH 1029/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212601477 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 897a3f0430d..3d51b58b186 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d58ef3f0831f6963e32bba3d0197838e21dd03ca4d893eb932632011dacc45a1", - git_commit = "a5d649045cf60f8b3dde5ba1ff86285c4bcc1695", + sha256 = "6addf82de520151d31d5ffa5093f238aad8d49e0b60e61b50e09c17b565d2816", + git_commit = "4c936f1b220676d0d427f5f38b4111cfb9011b5a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e752fd34f43f42a92acb5618b91318fe38d6359a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Sep 2018 03:02:23 -0700 Subject: [PATCH 1030/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212608107 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3d51b58b186..a40e4c9dad3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6addf82de520151d31d5ffa5093f238aad8d49e0b60e61b50e09c17b565d2816", - git_commit = "4c936f1b220676d0d427f5f38b4111cfb9011b5a", + sha256 = "4fb995acc053c145f3164929f76d64817a92bfa1fb879d227dfd48a6500cf553", + git_commit = "5fe902531ec790ebd25618b7070b5094930f522e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0bb0b12ca5a1594a2ad2215c673cbdacd6297006 Mon Sep 17 00:00:00 2001 From: "joshua.horowitz" Date: Wed, 12 Sep 2018 10:57:10 -0400 Subject: [PATCH 1031/8103] Updated documentation to reflect script name change --- tensorflow_serving/g3doc/serving_advanced.md | 2 +- tensorflow_serving/g3doc/serving_basic.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tensorflow_serving/g3doc/serving_advanced.md b/tensorflow_serving/g3doc/serving_advanced.md index b910ab36277..56f5c75d878 100644 --- a/tensorflow_serving/g3doc/serving_advanced.md +++ b/tensorflow_serving/g3doc/serving_advanced.md @@ -324,7 +324,7 @@ the test: ```shell cp -r models/mnist/2 models/monitored -tools/build_in_docker bazel-bin/tensorflow_serving/example/mnist_client \ +tools/bazel_in_docker.sh bazel-bin/tensorflow_serving/example/mnist_client \ --num_tests=1000 --server=127.0.0.1:8500 --concurrency=10 ``` diff --git a/tensorflow_serving/g3doc/serving_basic.md b/tensorflow_serving/g3doc/serving_basic.md index 9b1bbab683a..0210c5d9a34 100644 --- a/tensorflow_serving/g3doc/serving_basic.md +++ b/tensorflow_serving/g3doc/serving_basic.md @@ -179,8 +179,8 @@ instructions for both the Bazel and PIP options. * **Bazel**: ```shell - tools/build_in_docker.sh bazel build -c opt tensorflow_serving/example:mnist_saved_model - tools/build_in_docker.sh bazel-bin/tensorflow_serving/example/mnist_saved_model models/mnist + tools/bazel_in_docker.sh bazel build -c opt tensorflow_serving/example:mnist_saved_model + tools/bazel_in_docker.sh bazel-bin/tensorflow_serving/example/mnist_saved_model models/mnist ``` TIP: Building from sources consumes a lot of RAM. If RAM is an issue on your From 392af46c93d45eaf8647c67d75304ab2da74182d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Sep 2018 10:03:07 -0700 Subject: [PATCH 1032/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212657857 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a40e4c9dad3..f02ce89a092 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4fb995acc053c145f3164929f76d64817a92bfa1fb879d227dfd48a6500cf553", - git_commit = "5fe902531ec790ebd25618b7070b5094930f522e", + sha256 = "7799bc5a15cef8f2f864a58f0bfd731917e8b6caa5f6471afab4866494d91ae2", + git_commit = "9333978b4b08e4b3fdc7f63ec0873a7e00dcc4b7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ff6ccc09ef691010a355695bb0b0cf609e08ebcf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Sep 2018 11:04:45 -0700 Subject: [PATCH 1033/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212669336 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f02ce89a092..7e5ef5bb135 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7799bc5a15cef8f2f864a58f0bfd731917e8b6caa5f6471afab4866494d91ae2", - git_commit = "9333978b4b08e4b3fdc7f63ec0873a7e00dcc4b7", + sha256 = "5a2940675950e492a8b36a4af55ce80c0097edfdb752a7b587f7df4455035118", + git_commit = "37ddb13ece32500bf87af5d8b8493be1c77781de", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2151e7cdaae1cc0ac1f3a7ac14ae61b1bbcf9070 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Sep 2018 12:03:20 -0700 Subject: [PATCH 1034/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212679965 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7e5ef5bb135..03b8fe8af1c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5a2940675950e492a8b36a4af55ce80c0097edfdb752a7b587f7df4455035118", - git_commit = "37ddb13ece32500bf87af5d8b8493be1c77781de", + sha256 = "280a44369b916cb6d0993f60d1f5ae18136a92433ecb631aa035fab22cc4c536", + git_commit = "10b52cdc92976523e6aa443f83f25a2d7404883f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d859d948b601281b13437b20d367da610ef68c04 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Sep 2018 13:03:02 -0700 Subject: [PATCH 1035/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212689717 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 03b8fe8af1c..cd7c3dbcf8f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "280a44369b916cb6d0993f60d1f5ae18136a92433ecb631aa035fab22cc4c536", - git_commit = "10b52cdc92976523e6aa443f83f25a2d7404883f", + sha256 = "f72696842be8d9e2f093eb567b674eba3c77b5351bcc25464f7f0f9983308101", + git_commit = "9c270922715306efefce848b87dee3690cdddd27", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 021efbd3281aa815cab0b35eab6d6d25249c12d4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Sep 2018 13:39:22 -0700 Subject: [PATCH 1036/8103] Prometheus exporter for TF metrics. Metrics are exported via HTTP server on a new endpoint (defaults to `/monitoring/prometheus/metrics`) that Prometheus can use to scrape from. This change adds: o `MonitoringConfig` proto to configure monitoring. o `--monitoring_config_file` command line flag to pass config. PiperOrigin-RevId: 212695523 --- tensorflow_serving/config/BUILD | 9 + .../config/monitoring_config.proto | 19 ++ tensorflow_serving/model_servers/BUILD | 5 +- .../model_servers/http_server.cc | 49 ++++- .../model_servers/http_server.h | 4 +- tensorflow_serving/model_servers/main.cc | 6 +- tensorflow_serving/model_servers/server.cc | 9 +- tensorflow_serving/model_servers/server.h | 1 + .../tensorflow_model_server_test.py | 30 +++ .../servables/tensorflow/testdata/BUILD | 1 + .../tensorflow/testdata/monitoring_config.txt | 4 + tensorflow_serving/util/BUILD | 24 +++ .../util/prometheus_exporter.cc | 188 ++++++++++++++++++ tensorflow_serving/util/prometheus_exporter.h | 49 +++++ .../util/prometheus_exporter_test.cc | 146 ++++++++++++++ 15 files changed, 539 insertions(+), 5 deletions(-) create mode 100644 tensorflow_serving/config/monitoring_config.proto create mode 100644 tensorflow_serving/servables/tensorflow/testdata/monitoring_config.txt create mode 100644 tensorflow_serving/util/prometheus_exporter.cc create mode 100644 tensorflow_serving/util/prometheus_exporter.h create mode 100644 tensorflow_serving/util/prometheus_exporter_test.cc diff --git a/tensorflow_serving/config/BUILD b/tensorflow_serving/config/BUILD index 21c198ef4e7..60be85c9ef1 100644 --- a/tensorflow_serving/config/BUILD +++ b/tensorflow_serving/config/BUILD @@ -88,6 +88,15 @@ serving_proto_library_py( ], ) +serving_proto_library( + name = "monitoring_config_proto", + srcs = ["monitoring_config.proto"], + cc_api_version = 2, + java_api_version = 2, + deps = [ + ], +) + serving_proto_library( name = "ssl_config_proto", srcs = ["ssl_config.proto"], diff --git a/tensorflow_serving/config/monitoring_config.proto b/tensorflow_serving/config/monitoring_config.proto new file mode 100644 index 00000000000..9da3700de46 --- /dev/null +++ b/tensorflow_serving/config/monitoring_config.proto @@ -0,0 +1,19 @@ +syntax = "proto3"; + +package tensorflow.serving; +option cc_enable_arenas = true; + +// Configuration for Prometheus monitoring. +message PrometheusConfig { + // Whether to expose Prometheus metrics. + bool enable = 1; + + // The endpoint to expose Prometheus metrics. + // If not specified, PrometheusExporter::kPrometheusPath value is used. + string path = 2; +} + +// Configuration for monitoring. +message MonitoringConfig { + PrometheusConfig prometheus_config = 1; +} diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 3aabb9d57db..a6d6eb06d99 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -243,10 +243,11 @@ cc_library( deps = [ ":http_rest_api_handler", ":server_core", + "//tensorflow_serving/config:monitoring_config_proto", + "//tensorflow_serving/util:prometheus_exporter", "//tensorflow_serving/util:threadpool_executor", "//tensorflow_serving/util/net_http/server/public:http_server", "//tensorflow_serving/util/net_http/server/public:http_server_api", - "@com_google_absl//absl/memory", "@com_google_absl//absl/strings", "@com_googlesource_code_re2//:re2", "@org_tensorflow//tensorflow/core:lib", @@ -318,6 +319,7 @@ cc_library( "@com_google_absl//absl/memory", "@org_tensorflow//tensorflow/core:protos_all_cc", "//tensorflow_serving/config:model_server_config_proto", + "//tensorflow_serving/config:monitoring_config_proto", "//tensorflow_serving/config:ssl_config_proto", "//tensorflow_serving/core:availability_preserving_policy", "//tensorflow_serving/servables/tensorflow:session_bundle_config_proto", @@ -366,6 +368,7 @@ py_test( "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two/00000123/export.data-00000-of-00001", "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two/00000123/export.index", "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two/00000123/export.meta", + "//tensorflow_serving/servables/tensorflow/testdata:monitoring_config.txt", "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_three/00000123/assets/foo.txt", "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_three/00000123/saved_model.pb", "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_three/00000123/variables/variables.data-00000-of-00001", diff --git a/tensorflow_serving/model_servers/http_server.cc b/tensorflow_serving/model_servers/http_server.cc index 4f4ad460516..584b5db541d 100644 --- a/tensorflow_serving/model_servers/http_server.cc +++ b/tensorflow_serving/model_servers/http_server.cc @@ -14,8 +14,10 @@ limitations under the License. ==============================================================================*/ #include +#include #include "absl/strings/str_cat.h" +#include "absl/strings/str_format.h" #include "absl/strings/string_view.h" #include "re2/re2.h" #include "tensorflow/core/platform/env.h" @@ -26,6 +28,7 @@ limitations under the License. #include "tensorflow_serving/util/net_http/server/public/httpserver.h" #include "tensorflow_serving/util/net_http/server/public/response_code_enum.h" #include "tensorflow_serving/util/net_http/server/public/server_request_interface.h" +#include "tensorflow_serving/util/prometheus_exporter.h" #include "tensorflow_serving/util/threadpool_executor.h" namespace tensorflow { @@ -79,6 +82,35 @@ net_http::HTTPStatusCode ToHTTPStatusCode(const Status& status) { } } +void ProcessPrometheusRequest(PrometheusExporter* exporter, + const PrometheusConfig& prometheus_config, + net_http::ServerRequestInterface* req) { + std::vector> headers; + headers.push_back({"Content-Type", "text/plain"}); + string output; + Status status; + // Check if url matches the path. + if (req->uri_path() != prometheus_config.path()) { + output = absl::StrFormat("Unexpected path: %s. Should be %s", + req->uri_path(), prometheus_config.path()); + status = Status(error::Code::INVALID_ARGUMENT, output); + } else { + status = exporter->GeneratePage(&output); + } + const net_http::HTTPStatusCode http_status = ToHTTPStatusCode(status); + // Note: we add headers+output for non successful status too, in case the + // output contains details about the error (e.g. error messages). + for (const auto& kv : headers) { + req->OverwriteResponseHeader(kv.first, kv.second); + } + req->WriteResponseString(output); + if (http_status != net_http::HTTPStatusCode::OK) { + VLOG(1) << "Error Processing prometheus metrics request. Error: " + << status.ToString(); + } + req->ReplyWithStatus(http_status); +} + class RequestExecutor final : public net_http::EventExecutor { public: explicit RequestExecutor(int num_threads) @@ -147,7 +179,8 @@ class RestApiRequestDispatcher { } // namespace std::unique_ptr CreateAndStartHttpServer( - int port, int num_threads, int timeout_in_ms, ServerCore* core) { + int port, int num_threads, int timeout_in_ms, + const MonitoringConfig& monitoring_config, ServerCore* core) { auto options = absl::make_unique(); options->AddPort(static_cast(port)); options->SetExecutor(absl::make_unique(num_threads)); @@ -157,6 +190,20 @@ std::unique_ptr CreateAndStartHttpServer( return nullptr; } + // Register handler for prometheus metric endpoint. + if (monitoring_config.prometheus_config().enable()) { + std::shared_ptr exporter = + std::make_shared(); + net_http::RequestHandlerOptions prometheus_request_options; + PrometheusConfig prometheus_config = monitoring_config.prometheus_config(); + server->RegisterRequestHandler( + monitoring_config.prometheus_config().path(), + [exporter, prometheus_config](net_http::ServerRequestInterface* req) { + ProcessPrometheusRequest(exporter.get(), prometheus_config, req); + }, + prometheus_request_options); + } + std::shared_ptr dispatcher = std::make_shared(timeout_in_ms, core); net_http::RequestHandlerOptions handler_options; diff --git a/tensorflow_serving/model_servers/http_server.h b/tensorflow_serving/model_servers/http_server.h index 5beea8a5d82..f346ff45383 100644 --- a/tensorflow_serving/model_servers/http_server.h +++ b/tensorflow_serving/model_servers/http_server.h @@ -17,6 +17,7 @@ limitations under the License. #include +#include "tensorflow_serving/config/monitoring_config.pb.h" #include "tensorflow_serving/util/net_http/server/public/httpserver_interface.h" namespace tensorflow { @@ -30,7 +31,8 @@ class ServerCore; // // The returned server is in a state of accepting new requests. std::unique_ptr CreateAndStartHttpServer( - int port, int num_threads, int timeout_in_ms, ServerCore* core); + int port, int num_threads, int timeout_in_ms, + const MonitoringConfig& monitoring_config, ServerCore* core); } // namespace serving } // namespace tensorflow diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index 3bc94d7398e..4ba9e2c05e3 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -135,7 +135,11 @@ int main(int argc, char** argv) { "Enables model warmup, which triggers lazy " "initializations (such as TF optimizations) at load " "time, to reduce first request latency."), - tensorflow::Flag("version", &display_version, "Display version")}; + tensorflow::Flag("version", &display_version, "Display version"), + tensorflow::Flag( + "monitoring_config_file", &options.monitoring_config_file, + "If non-empty, read an ascii MonitoringConfig protobuf from " + "the supplied file name")}; const auto& usage = tensorflow::Flags::Usage(argv[0], flag_list); if (!tensorflow::Flags::Parse(&argc, argv, flag_list)) { diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index 4b654f2520e..92178d55255 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -36,6 +36,7 @@ limitations under the License. #include "tensorflow/core/platform/protobuf.h" #include "tensorflow/core/protobuf/config.pb.h" #include "tensorflow_serving/config/model_server_config.pb.h" +#include "tensorflow_serving/config/monitoring_config.pb.h" #include "tensorflow_serving/config/ssl_config.pb.h" #include "tensorflow_serving/core/availability_preserving_policy.h" #include "tensorflow_serving/model_servers/grpc_status_util.h" @@ -285,9 +286,15 @@ Status Server::BuildAndStart(const Options& server_options) { if (server_options.http_port != server_options.grpc_port) { const string server_address = "localhost:" + std::to_string(server_options.http_port); + MonitoringConfig monitoring_config; + if (!server_options.monitoring_config_file.empty()) { + monitoring_config = ReadProtoFromFile( + server_options.monitoring_config_file); + } http_server_ = CreateAndStartHttpServer( server_options.http_port, server_options.http_num_threads, - server_options.http_timeout_in_ms, server_core_.get()); + server_options.http_timeout_in_ms, monitoring_config, + server_core_.get()); if (http_server_ != nullptr) { LOG(INFO) << "Exporting HTTP/REST API at:" << server_address << " ..."; } else { diff --git a/tensorflow_serving/model_servers/server.h b/tensorflow_serving/model_servers/server.h index ebc5c7be4b6..eae27d6a978 100644 --- a/tensorflow_serving/model_servers/server.h +++ b/tensorflow_serving/model_servers/server.h @@ -65,6 +65,7 @@ class Server { tensorflow::string ssl_config_file; string model_config_file; bool enable_model_warmup = true; + tensorflow::string monitoring_config_file; Options(); }; diff --git a/tensorflow_serving/model_servers/tensorflow_model_server_test.py b/tensorflow_serving/model_servers/tensorflow_model_server_test.py index e0a24919329..090ca0f4245 100644 --- a/tensorflow_serving/model_servers/tensorflow_model_server_test.py +++ b/tensorflow_serving/model_servers/tensorflow_model_server_test.py @@ -117,6 +117,7 @@ def GetArgsKey(*args, **kwargs): def RunServer(model_name, model_path, model_config_file=None, + monitoring_config_file=None, batching_parameters_file=None, grpc_channel_arguments='', wait_for_server_ready=True, @@ -131,6 +132,7 @@ def RunServer(model_name, model_name: Name of model. model_path: Path to model. model_config_file: Path to model config file. + monitoring_config_file: Path to the monitoring config file. batching_parameters_file: Path to batching parameters. grpc_channel_arguments: Custom gRPC args for server. wait_for_server_ready: Wait for gRPC port to be ready. @@ -165,6 +167,9 @@ def RunServer(model_name, else: raise ValueError('Both model_config_file and model_path cannot be empty!') + if monitoring_config_file: + command += ' --monitoring_config_file=' + monitoring_config_file + if batching_parameters_file: command += ' --enable_batching' command += ' --batching_parameters_file=' + batching_parameters_file @@ -287,6 +292,10 @@ def _GetBatchingParametersFile(self): """Returns a path to a batching configuration file.""" return os.path.join(self.testdata_dir, 'batching_config.txt') + def _GetMonitoringConfigFile(self): + """Returns a path to a monitoring configuration file.""" + return os.path.join(self.testdata_dir, 'monitoring_config.txt') + def _VerifyModelSpec(self, actual_model_spec, exp_model_name, @@ -642,6 +651,27 @@ def testGetStatusREST(self): }] }) + def testPrometheusEndpoint(self): + """Test ModelStatus implementation over REST API with columnar inputs.""" + model_path = self._GetSavedModelBundlePath() + host, port = TensorflowModelServerTest.RunServer( + 'default', + model_path, + monitoring_config_file=self._GetMonitoringConfigFile())[2].split(':') + + # Prepare request + url = 'http://{}:{}/monitoring/prometheus/metrics'.format(host, port) + + # Send request + resp_data = None + try: + resp_data = CallREST(url, None) + except Exception as e: # pylint: disable=broad-except + self.fail('Request failed with error: {}'.format(e)) + + # Verify that there should be some metric type information. + self.assertIn('# TYPE', resp_data) + if __name__ == '__main__': tf.test.main() diff --git a/tensorflow_serving/servables/tensorflow/testdata/BUILD b/tensorflow_serving/servables/tensorflow/testdata/BUILD index b2520bafea9..0ed3e6fe0fc 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/BUILD +++ b/tensorflow_serving/servables/tensorflow/testdata/BUILD @@ -86,4 +86,5 @@ exports_files([ "good_model_config.txt", "bad_model_config.txt", "batching_config.txt", + "monitoring_config.txt", ]) diff --git a/tensorflow_serving/servables/tensorflow/testdata/monitoring_config.txt b/tensorflow_serving/servables/tensorflow/testdata/monitoring_config.txt new file mode 100644 index 00000000000..3ae0fa2b3b9 --- /dev/null +++ b/tensorflow_serving/servables/tensorflow/testdata/monitoring_config.txt @@ -0,0 +1,4 @@ +prometheus_config: { + enable: true, + path: "/monitoring/prometheus/metrics" +} diff --git a/tensorflow_serving/util/BUILD b/tensorflow_serving/util/BUILD index afb0e21b2a8..5db01916af3 100644 --- a/tensorflow_serving/util/BUILD +++ b/tensorflow_serving/util/BUILD @@ -62,6 +62,18 @@ cc_library( ], ) +cc_library( + name = "prometheus_exporter", + srcs = ["prometheus_exporter.cc"], + hdrs = ["prometheus_exporter.h"], + deps = [ + "@com_google_absl//absl/strings", + "@com_google_absl//absl/strings:str_format", + "@com_googlesource_code_re2//:re2", + "@org_tensorflow//tensorflow/core:lib", + ], +) + ############################################################################### # Internal targets ############################################################################### @@ -87,6 +99,18 @@ cc_test( ], ) +cc_test( + name = "prometheus_exporter_test", + size = "small", + srcs = ["prometheus_exporter_test.cc"], + deps = [ + ":prometheus_exporter", + "//tensorflow_serving/core/test_util:test_main", + "@com_google_absl//absl/strings", + "@org_tensorflow//tensorflow/core:lib", + ], +) + cc_test( name = "event_bus_test", size = "small", diff --git a/tensorflow_serving/util/prometheus_exporter.cc b/tensorflow_serving/util/prometheus_exporter.cc new file mode 100644 index 00000000000..78268d9fb1c --- /dev/null +++ b/tensorflow_serving/util/prometheus_exporter.cc @@ -0,0 +1,188 @@ +/* Copyright 2018 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow_serving/util/prometheus_exporter.h" + +#include "absl/strings/match.h" +#include "absl/strings/str_cat.h" +#include "absl/strings/str_format.h" +#include "absl/strings/str_join.h" +#include "re2/re2.h" + +namespace tensorflow { +namespace serving { + +namespace { + +string SanitizeLabelValue(const string& value) { + // Backslash and double quote have to be escaped. + string new_value = value; + // Replace \ with \\. + RE2::GlobalReplace(&new_value, "\\\\", "\\\\\\\\"); + // Replace " with \". + RE2::GlobalReplace(&new_value, "\"", "\\\\\""); + return new_value; +} + +string SanatizeLabelName(const string& name) { + // Valid format: [a-zA-Z_][a-zA-Z0-9_]* + string new_name = name; + RE2::GlobalReplace(&new_name, "[^a-zA-Z0-9]", "_"); + if (RE2::FullMatch(new_name, "^[0-9].*")) { + // Start with 0-9, prepend a underscore. + new_name = absl::StrCat("_", new_name); + } + return new_name; +} + +string GetPrometheusMetricName( + const monitoring::MetricDescriptor& metric_descriptor) { + // Valid format: [a-zA-Z_:][a-zA-Z0-9_:]* + string new_name = metric_descriptor.name; + RE2::GlobalReplace(&new_name, "[^a-zA-Z0-9_]", ":"); + if (RE2::FullMatch(new_name, "^[0-9].*")) { + // Start with 0-9, prepend a underscore. + new_name = absl::StrCat("_", new_name); + } + return new_name; +} + +void SerializeHistogram(const monitoring::MetricDescriptor& metric_descriptor, + const monitoring::PointSet& point_set, + std::vector* lines) { + // For a metric name NAME, we should output: + // NAME_bucket{le=b1} x1 + // NAME_bucket{le=b2} x2 + // NAME_bucket{le=b3} x3 ... + // NAME_sum xsum + // NAME_count xcount + string prom_metric_name = GetPrometheusMetricName(metric_descriptor); + // Type definition line. + lines->push_back(absl::StrFormat("# TYPE %s histogram", prom_metric_name)); + for (const auto& point : point_set.points) { + // Each points has differnet label values. + std::vector labels = {}; + labels.reserve(point->labels.size()); + for (const auto& label : point->labels) { + labels.push_back(absl::StrFormat("%s=\"%s\"", + SanatizeLabelName(label.name), + SanitizeLabelValue(label.value))); + } + int64 cumulative_count = 0; + string bucket_prefix = + absl::StrCat(prom_metric_name, "_bucket{", absl::StrJoin(labels, ",")); + if (!labels.empty()) { + absl::StrAppend(&bucket_prefix, ","); + } + // One bucket per line, last one should be le="Inf". + for (int i = 0; i < point->histogram_value.bucket_size(); i++) { + cumulative_count += point->histogram_value.bucket(i); + string bucket_limit = + (i < point->histogram_value.bucket_size() - 1) + ? absl::StrCat(point->histogram_value.bucket_limit(i)) + : "+Inf"; + lines->push_back(absl::StrCat( + bucket_prefix, absl::StrFormat("le=\"%s\"} ", bucket_limit), + cumulative_count)); + } + // _sum and _count. + lines->push_back(absl::StrCat(prom_metric_name, "_sum{", + absl::StrJoin(labels, ","), "} ", + point->histogram_value.sum())); + lines->push_back(absl::StrCat(prom_metric_name, "_count{", + absl::StrJoin(labels, ","), "} ", + cumulative_count)); + } +} + +void SerializeScalar(const monitoring::MetricDescriptor& metric_descriptor, + const monitoring::PointSet& point_set, + std::vector* lines) { + // A counter or gauge metric. + // The format should be: + // NAME{label=value,label=value} x time + string prom_metric_name = GetPrometheusMetricName(metric_descriptor); + string metric_type_str = "untyped"; + if (metric_descriptor.metric_kind == monitoring::MetricKind::kCumulative) { + metric_type_str = "counter"; + } else if (metric_descriptor.metric_kind == monitoring::MetricKind::kGauge) { + metric_type_str = "gauge"; + } + // Type definition line. + lines->push_back( + absl::StrFormat("# TYPE %s %s", prom_metric_name, metric_type_str)); + for (const auto& point : point_set.points) { + // Each points has differnet label values. + string name_bracket = absl::StrCat(prom_metric_name, "{"); + std::vector labels = {}; + labels.reserve(point->labels.size()); + for (const auto& label : point->labels) { + labels.push_back(absl::StrFormat("%s=\"%s\"", + SanatizeLabelName(label.name), + SanitizeLabelValue(label.value))); + } + lines->push_back(absl::StrCat(name_bracket, absl::StrJoin(labels, ","), + absl::StrFormat("} %d", point->int64_value))); + } +} + +void SerializeMetric(const monitoring::MetricDescriptor& metric_descriptor, + const monitoring::PointSet& point_set, + std::vector* lines) { + if (metric_descriptor.value_type == monitoring::ValueType::kHistogram) { + SerializeHistogram(metric_descriptor, point_set, lines); + } else { + SerializeScalar(metric_descriptor, point_set, lines); + } +} + +} // namespace + +const char* const PrometheusExporter::kPrometheusPath = + "/monitoring/prometheus/metrics"; + +PrometheusExporter::PrometheusExporter() + : collection_registry_(monitoring::CollectionRegistry::Default()) {} + +Status PrometheusExporter::GeneratePage(string* http_page) { + if (http_page == nullptr) { + return Status(error::Code::INVALID_ARGUMENT, "Http page pointer is null"); + } + monitoring::CollectionRegistry::CollectMetricsOptions collect_options; + collect_options.collect_metric_descriptors = true; + const std::unique_ptr collected_metrics = + collection_registry_->CollectMetrics(collect_options); + + const auto& descriptor_map = collected_metrics->metric_descriptor_map; + const auto& metric_map = collected_metrics->point_set_map; + + std::vector lines; + for (const auto& name_and_metric_descriptor : descriptor_map) { + const string& metric_name = name_and_metric_descriptor.first; + auto metric_iterator = metric_map.find(metric_name); + if (metric_iterator == metric_map.end()) { + // Not found. + continue; + } + SerializeMetric(*name_and_metric_descriptor.second, + *(metric_iterator->second), &lines); + } + *http_page = absl::StrJoin(lines, "\n"); + absl::StrAppend(http_page, "\n"); + return Status::OK(); +} + +} // namespace serving +} // namespace tensorflow diff --git a/tensorflow_serving/util/prometheus_exporter.h b/tensorflow_serving/util/prometheus_exporter.h new file mode 100644 index 00000000000..1d485771e37 --- /dev/null +++ b/tensorflow_serving/util/prometheus_exporter.h @@ -0,0 +1,49 @@ +/* Copyright 2018 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_SERVING_UTIL_PROMETHEUS_EXPORTER_H_ +#define TENSORFLOW_SERVING_UTIL_PROMETHEUS_EXPORTER_H_ + +#include + +#include "tensorflow/core/lib/core/status.h" +#include "tensorflow/core/lib/monitoring/collected_metrics.h" +#include "tensorflow/core/lib/monitoring/collection_registry.h" + +namespace tensorflow { +namespace serving { + +// Exports metrics in Prometheus monitoring format. +class PrometheusExporter { + public: + // Default path to expose the metrics. + static const char* const kPrometheusPath; + + PrometheusExporter(); + + // Generates text page in Prometheus format: + // https://prometheus.io/docs/instrumenting/exposition_formats/#text-format-example + // If an error status returned, http_page is unchanged. + Status GeneratePage(string* http_page); + + private: + // The metrics registry. + monitoring::CollectionRegistry* collection_registry_; +}; + +} // namespace serving +} // namespace tensorflow + +#endif // TENSORFLOW_SERVING_UTIL_PROMETHEUS_EXPORTER_H_ diff --git a/tensorflow_serving/util/prometheus_exporter_test.cc b/tensorflow_serving/util/prometheus_exporter_test.cc new file mode 100644 index 00000000000..18d4d82ff3f --- /dev/null +++ b/tensorflow_serving/util/prometheus_exporter_test.cc @@ -0,0 +1,146 @@ +/* Copyright 2018 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow_serving/util/prometheus_exporter.h" + +#include +#include "absl/strings/str_cat.h" +#include "absl/strings/str_join.h" +#include "tensorflow/core/lib/monitoring/counter.h" +#include "tensorflow/core/lib/monitoring/gauge.h" +#include "tensorflow/core/lib/monitoring/sampler.h" + +namespace tensorflow { +namespace serving { +namespace { + +TEST(PrometheusExporterTest, Counter) { + auto exporter = absl::make_unique(); + auto counter = absl::WrapUnique( + monitoring::Counter<1>::New("/test/path/total", "A counter.", "name")); + counter->GetCell("abc")->IncrementBy(2); + + string http_page; + Status status = exporter->GeneratePage(&http_page); + + string expected_result = absl::StrJoin( + {"# TYPE :test:path:total counter", ":test:path:total{name=\"abc\"} 2"}, + "\n"); + absl::StrAppend(&expected_result, "\n"); + EXPECT_EQ(http_page, expected_result); +} + +TEST(PrometheusExporterTest, Gauge) { + auto exporter = absl::make_unique(); + auto gauge = absl::WrapUnique(monitoring::Gauge::New( + "/test/path/gague", "A gauge", "x", "y")); + gauge->GetCell("abc", "def")->Set(5); + + string http_page; + Status status = exporter->GeneratePage(&http_page); + string expected_result = + absl::StrJoin({"# TYPE :test:path:gague gauge", + ":test:path:gague{x=\"abc\",y=\"def\"} 5"}, + "\n"); + absl::StrAppend(&expected_result, "\n"); + EXPECT_EQ(http_page, expected_result); +} + +TEST(PrometheusExporterTest, Histogram) { + auto exporter = absl::make_unique(); + auto histogram = absl::WrapUnique(monitoring::Sampler<1>::New( + {"/test/path/histogram", "A histogram.", "status"}, + monitoring::Buckets::Exponential(1, 2, 10))); + histogram->GetCell("good")->Add(2); + histogram->GetCell("good")->Add(20); + histogram->GetCell("good")->Add(200); + + string http_page; + Status status = exporter->GeneratePage(&http_page); + string expected_result = absl::StrJoin( + {"# TYPE :test:path:histogram histogram", + ":test:path:histogram_bucket{status=\"good\",le=\"1\"} 0", + ":test:path:histogram_bucket{status=\"good\",le=\"2\"} 0", + ":test:path:histogram_bucket{status=\"good\",le=\"4\"} 1", + ":test:path:histogram_bucket{status=\"good\",le=\"8\"} 1", + ":test:path:histogram_bucket{status=\"good\",le=\"16\"} 1", + ":test:path:histogram_bucket{status=\"good\",le=\"32\"} 2", + ":test:path:histogram_bucket{status=\"good\",le=\"64\"} 2", + ":test:path:histogram_bucket{status=\"good\",le=\"128\"} 2", + ":test:path:histogram_bucket{status=\"good\",le=\"256\"} 3", + ":test:path:histogram_bucket{status=\"good\",le=\"512\"} 3", + ":test:path:histogram_bucket{status=\"good\",le=\"+Inf\"} 3", + ":test:path:histogram_sum{status=\"good\"} 222", + ":test:path:histogram_count{status=\"good\"} 3"}, + "\n"); + absl::StrAppend(&expected_result, "\n"); + EXPECT_EQ(http_page, expected_result); +} + +TEST(PrometheusExporterTest, SanitizeLabelValue) { + auto exporter = absl::make_unique(); + auto counter = absl::WrapUnique( + monitoring::Counter<1>::New("/test/path/total", "A counter.", "name")); + // label value: "abc\" + counter->GetCell("\"abc\\\"")->IncrementBy(2); + + string http_page; + Status status = exporter->GeneratePage(&http_page); + + string expected_result = + absl::StrJoin({"# TYPE :test:path:total counter", + ":test:path:total{name=\"\\\"abc\\\\\\\"\"} 2"}, + "\n"); + absl::StrAppend(&expected_result, "\n"); + EXPECT_EQ(http_page, expected_result); +} + +TEST(PrometheusExporterTest, SanitizeLabelName) { + auto exporter = absl::make_unique(); + auto counter = absl::WrapUnique(monitoring::Counter<1>::New( + "/test/path/total", "A counter.", "my-name+1")); + counter->GetCell("abc")->IncrementBy(2); + + string http_page; + Status status = exporter->GeneratePage(&http_page); + + string expected_result = + absl::StrJoin({"# TYPE :test:path:total counter", + ":test:path:total{my_name_1=\"abc\"} 2"}, + "\n"); + absl::StrAppend(&expected_result, "\n"); + EXPECT_EQ(http_page, expected_result); +} + +TEST(PrometheusExporterTest, SanitizeMetricName) { + auto exporter = absl::make_unique(); + auto counter = absl::WrapUnique( + monitoring::Counter<1>::New("0/path-total_count", "A counter.", "name")); + counter->GetCell("abc")->IncrementBy(2); + + string http_page; + Status status = exporter->GeneratePage(&http_page); + + string expected_result = + absl::StrJoin({"# TYPE _0:path:total_count counter", + "_0:path:total_count{name=\"abc\"} 2"}, + "\n"); + absl::StrAppend(&expected_result, "\n"); + EXPECT_EQ(http_page, expected_result); +} + +} // namespace +} // namespace serving +} // namespace tensorflow From 6c81fc47631ae6971faa9db4c3122e4229508203 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Sep 2018 14:01:58 -0700 Subject: [PATCH 1037/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212699113 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cd7c3dbcf8f..5f10729bc0f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f72696842be8d9e2f093eb567b674eba3c77b5351bcc25464f7f0f9983308101", - git_commit = "9c270922715306efefce848b87dee3690cdddd27", + sha256 = "e7f9df131d614a0e016fcd4797000e253514cd374be38bbb1580bfa99b00f084", + git_commit = "3fb474713b27552eba1943bb4172e54ad2dd13bc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 69d24c2da5acca67eb394ade0b33bd5df279858f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Sep 2018 15:01:52 -0700 Subject: [PATCH 1038/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212710151 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5f10729bc0f..96283fafe87 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e7f9df131d614a0e016fcd4797000e253514cd374be38bbb1580bfa99b00f084", - git_commit = "3fb474713b27552eba1943bb4172e54ad2dd13bc", + sha256 = "5b0a0b4a137931995ba78247f7c6ed5a1452feda14e5894ef2e3b7caf84d4501", + git_commit = "1d95b20a4ebad65c82ea34084f5277241a484f4f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ab37a188283423603276bd70d4fc5aecff1cc170 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Sep 2018 16:01:46 -0700 Subject: [PATCH 1039/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212720006 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 96283fafe87..e261c45b1f5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5b0a0b4a137931995ba78247f7c6ed5a1452feda14e5894ef2e3b7caf84d4501", - git_commit = "1d95b20a4ebad65c82ea34084f5277241a484f4f", + sha256 = "bef9e7edf9fa4cdcb2d4b0c5692b71ba3955bffd28f738db53f6db13f9ec1520", + git_commit = "ce73fa866f421ca9da4763b3d6128a0724265e8c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 52e71f33cd59e25223d2d061c9fc15eafebc09ee Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Sep 2018 17:02:04 -0700 Subject: [PATCH 1040/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212729436 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e261c45b1f5..8fb1bb2224e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bef9e7edf9fa4cdcb2d4b0c5692b71ba3955bffd28f738db53f6db13f9ec1520", - git_commit = "ce73fa866f421ca9da4763b3d6128a0724265e8c", + sha256 = "1d0b942447e73d2d4d2f6fd05ceab142bf39afc5473b266a9bffaaeffdfd2365", + git_commit = "2f1f2679dfb4175270defd3ddf176ee8fa9e8c41", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c5b194976efae67dc881acecce87b876dd351889 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Sep 2018 18:03:25 -0700 Subject: [PATCH 1041/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212737361 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8fb1bb2224e..d1324b70eee 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1d0b942447e73d2d4d2f6fd05ceab142bf39afc5473b266a9bffaaeffdfd2365", - git_commit = "2f1f2679dfb4175270defd3ddf176ee8fa9e8c41", + sha256 = "fa4400c7dceee2240c2c869a69a04662da37b22842403f86e38c632bdda3b84c", + git_commit = "eff48d062f3a6c6e4f709a1f92b4ccf2c64d300c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 52e12c79643d32e696f669c49699f8b13cd3e6b3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Sep 2018 19:02:37 -0700 Subject: [PATCH 1042/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212743167 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d1324b70eee..1daeaebe9e4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fa4400c7dceee2240c2c869a69a04662da37b22842403f86e38c632bdda3b84c", - git_commit = "eff48d062f3a6c6e4f709a1f92b4ccf2c64d300c", + sha256 = "f8b89e448be241f5c5d4041944d25a4088ba28b4174a91a6d11909876fc37019", + git_commit = "30b711b07570b12c8880532aede428503c35e310", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8464406a6a31070ee167ac3ff2b6bc2a2469695b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Sep 2018 20:02:03 -0700 Subject: [PATCH 1043/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212747456 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1daeaebe9e4..9c9557b4e53 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f8b89e448be241f5c5d4041944d25a4088ba28b4174a91a6d11909876fc37019", - git_commit = "30b711b07570b12c8880532aede428503c35e310", + sha256 = "36785de9da4a3bd447adb9c3beeaddd7025e948e74a81db8c0cead57ef340ecd", + git_commit = "28ede9ed7caee0ce2731d95cc0eb9aff7f360105", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a20446e540ba43f0b413e794bbcf6e37f713a0aa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Sep 2018 22:01:39 -0700 Subject: [PATCH 1044/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212757852 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9c9557b4e53..3f394ac5f41 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "36785de9da4a3bd447adb9c3beeaddd7025e948e74a81db8c0cead57ef340ecd", - git_commit = "28ede9ed7caee0ce2731d95cc0eb9aff7f360105", + sha256 = "0309d3582125790810969e069e3b38aa5a8a46a84b81896f446d79d16296652e", + git_commit = "f4d8442e13356ab645446c9f4a9b3b6cedddcd63", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b3d29acec8a188476ef8b97e28ab29285305e3d4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Sep 2018 23:01:23 -0700 Subject: [PATCH 1045/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212762175 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3f394ac5f41..cd58d0286ae 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0309d3582125790810969e069e3b38aa5a8a46a84b81896f446d79d16296652e", - git_commit = "f4d8442e13356ab645446c9f4a9b3b6cedddcd63", + sha256 = "1020b244233ace572495a7bd503b65678ac42edf293170967b6bebd931a1c2d5", + git_commit = "725dfe9cd0eef3f4b858eaeda38728813c99a210", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1cd638e9d141ca4ead550ad8f57c701c999671c1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Sep 2018 00:01:07 -0700 Subject: [PATCH 1046/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212766308 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cd58d0286ae..17d9dbbb725 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1020b244233ace572495a7bd503b65678ac42edf293170967b6bebd931a1c2d5", - git_commit = "725dfe9cd0eef3f4b858eaeda38728813c99a210", + sha256 = "caae8b27d2934ca5f185ac2960da6921e38a06ed0b200fc78a8f30acdefc2645", + git_commit = "845aaec5ec2191f2708247a09d9bad37f012f536", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6c5f5354cb76abf135db221b9bf0a5324bf7107b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Sep 2018 01:01:14 -0700 Subject: [PATCH 1047/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212771831 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 17d9dbbb725..c5f0d7f7e48 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "caae8b27d2934ca5f185ac2960da6921e38a06ed0b200fc78a8f30acdefc2645", - git_commit = "845aaec5ec2191f2708247a09d9bad37f012f536", + sha256 = "ccee689613527cec02b221ee3064c2d3c90e8829725cb02fddc4806f39a673f8", + git_commit = "626bc997c28e1dfeaa85041e6c5a057fec7e0a02", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From afa44590b095ab33d394b8e48fee71c624f913d0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Sep 2018 02:03:12 -0700 Subject: [PATCH 1048/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212777630 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c5f0d7f7e48..2c59b46e269 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ccee689613527cec02b221ee3064c2d3c90e8829725cb02fddc4806f39a673f8", - git_commit = "626bc997c28e1dfeaa85041e6c5a057fec7e0a02", + sha256 = "0bcd1376598a2641f20a8c118b0aee3d181b4778c968300c2d225db37745a007", + git_commit = "7f3938deb393f7688cd364b630afdd9338460299", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0933a0b3baf8445c6fc08b92c4aaed295d260af8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Sep 2018 03:01:50 -0700 Subject: [PATCH 1049/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212783403 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2c59b46e269..a1b54af6873 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0bcd1376598a2641f20a8c118b0aee3d181b4778c968300c2d225db37745a007", - git_commit = "7f3938deb393f7688cd364b630afdd9338460299", + sha256 = "4291a6d1ed37c3d35e456b3c415ffd54e1c40ac2e061e844068e2cf9f5274591", + git_commit = "567de999ae29a2cfb30132f82178006fe5688d6b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3b43b99305110d5f0f57f11bac74dd2a063357cf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Sep 2018 05:02:15 -0700 Subject: [PATCH 1050/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212795268 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a1b54af6873..c5e87b2126b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4291a6d1ed37c3d35e456b3c415ffd54e1c40ac2e061e844068e2cf9f5274591", - git_commit = "567de999ae29a2cfb30132f82178006fe5688d6b", + sha256 = "4e170f7964967edfafc75cb884394c7fa4f0e6b1f3f9d268f83f9343c37457a6", + git_commit = "da02a441f4a96ddb47579a52fbbf50d501d72b53", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5d994f9b0b425e002f680d812bba41dd32e0e646 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Sep 2018 09:03:25 -0700 Subject: [PATCH 1051/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212821680 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c5e87b2126b..7901aae7af8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4e170f7964967edfafc75cb884394c7fa4f0e6b1f3f9d268f83f9343c37457a6", - git_commit = "da02a441f4a96ddb47579a52fbbf50d501d72b53", + sha256 = "e5ba62f4eb1cccf72b8824e7dc10b4e40769d0d6e15d7de119f0862ad116b48b", + git_commit = "226cc7c47e2df8682b384aef5c54836948caecb3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 91327a31524ef4ebec03c319fc7d352535941678 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Sep 2018 10:01:09 -0700 Subject: [PATCH 1052/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212830065 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7901aae7af8..48a0283e86e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e5ba62f4eb1cccf72b8824e7dc10b4e40769d0d6e15d7de119f0862ad116b48b", - git_commit = "226cc7c47e2df8682b384aef5c54836948caecb3", + sha256 = "3040fb9bac0c7f394938aa5af0f14c548f18689ffae2c815f1d980ffa016497d", + git_commit = "a4bf3d0935570762e9d60eb917d8f42be7e398b4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fcf94e92043792fa534abb2663b39a2cf691bf4e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Sep 2018 11:03:05 -0700 Subject: [PATCH 1053/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212841996 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 48a0283e86e..6c101932fe0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3040fb9bac0c7f394938aa5af0f14c548f18689ffae2c815f1d980ffa016497d", - git_commit = "a4bf3d0935570762e9d60eb917d8f42be7e398b4", + sha256 = "272d763e4b0f92f393651f0d13a590c255d59f57116fa2dc912697a2f20b4902", + git_commit = "609a84774dfdbf6b54d91f70bed07f8d01f87a66", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 39f31e9a12a855ee0399efc1d05e33e8c73ce402 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Sep 2018 12:01:45 -0700 Subject: [PATCH 1054/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212853221 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6c101932fe0..791a4f71578 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "272d763e4b0f92f393651f0d13a590c255d59f57116fa2dc912697a2f20b4902", - git_commit = "609a84774dfdbf6b54d91f70bed07f8d01f87a66", + sha256 = "2ef072df2190892969cddfe5c227e3d9e11a1a8f496db18a8bd856863d8bab7c", + git_commit = "2f886d17f1990da418366bd093a09fb01fe5e777", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 566aaec15be8abe5c338a69b8b45800263e350f6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Sep 2018 13:01:44 -0700 Subject: [PATCH 1055/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212863473 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 791a4f71578..bb8fe310080 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2ef072df2190892969cddfe5c227e3d9e11a1a8f496db18a8bd856863d8bab7c", - git_commit = "2f886d17f1990da418366bd093a09fb01fe5e777", + sha256 = "47d888b47765e314e59ffa1d0ea0ecabb3e70432a200c795f938222ec6bea9c1", + git_commit = "0fbeac58e098cf0ac8e131617ebb6780e10c9606", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4f804f4915b0fe1f54d62c6b684588449e87628e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Sep 2018 14:01:43 -0700 Subject: [PATCH 1056/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212873736 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bb8fe310080..820c1ca5dfd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "47d888b47765e314e59ffa1d0ea0ecabb3e70432a200c795f938222ec6bea9c1", - git_commit = "0fbeac58e098cf0ac8e131617ebb6780e10c9606", + sha256 = "ffcbe213a401eac43688b3a2e616bbb809ef7a148b2d2751f3c30111ad63a2d0", + git_commit = "f2c23922fc4d977a4fbe4d2353f7b14231d63f6b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 134e12ba6ae3cfc3d93dff497d3e298355f2aa32 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Sep 2018 15:02:23 -0700 Subject: [PATCH 1057/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212885150 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 820c1ca5dfd..f01854e36ae 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ffcbe213a401eac43688b3a2e616bbb809ef7a148b2d2751f3c30111ad63a2d0", - git_commit = "f2c23922fc4d977a4fbe4d2353f7b14231d63f6b", + sha256 = "cdc985fec5b3211bcfc0a790ce1fa32c4d18260db2123b8686f7b6ef251828ca", + git_commit = "490e46f29dba0254fa69385d4235ab26854868c8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2919db2162ea4d0c8a5b95d012a0b1b62e1ea7bd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Sep 2018 16:01:59 -0700 Subject: [PATCH 1058/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212895235 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f01854e36ae..54d7a1886b2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cdc985fec5b3211bcfc0a790ce1fa32c4d18260db2123b8686f7b6ef251828ca", - git_commit = "490e46f29dba0254fa69385d4235ab26854868c8", + sha256 = "21983341f3759604baade5de1799ad5986017f91c4b177c1eceb2c4d009edaa5", + git_commit = "fb50c8e9a3cb2ccfac9cf4a847d5841cba80b524", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From dd0092eb9ea69fd2c285cf62b1e3bbd02d729d28 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Sep 2018 17:02:04 -0700 Subject: [PATCH 1059/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212903289 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 54d7a1886b2..1e3abf59017 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "21983341f3759604baade5de1799ad5986017f91c4b177c1eceb2c4d009edaa5", - git_commit = "fb50c8e9a3cb2ccfac9cf4a847d5841cba80b524", + sha256 = "89fb6996c0c39bd34ef0f56fb54d0b309e38347db820d1c9fb8accbfcdc7d086", + git_commit = "4292b8107175b3c3223f65c75b3ca091bd0604ec", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3efb33cc88e8cb59748db67e0e26fb95d4cc3f54 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Sep 2018 18:02:26 -0700 Subject: [PATCH 1060/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212910593 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1e3abf59017..fee7dc4ce88 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "89fb6996c0c39bd34ef0f56fb54d0b309e38347db820d1c9fb8accbfcdc7d086", - git_commit = "4292b8107175b3c3223f65c75b3ca091bd0604ec", + sha256 = "9f6ecd645f67ddca6a815413f5054f20205ed47b3352e26d7f6e950511143cee", + git_commit = "4b42a284683416ab6159f32c903321af9dc9a591", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e00ca9e5f904f2d2d2ed7b87ee571e460f15617a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Sep 2018 19:01:31 -0700 Subject: [PATCH 1061/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212916312 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fee7dc4ce88..87e9c330fb6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9f6ecd645f67ddca6a815413f5054f20205ed47b3352e26d7f6e950511143cee", - git_commit = "4b42a284683416ab6159f32c903321af9dc9a591", + sha256 = "2035fc035bbafa2373b98d4860a6ed42062342625ec49eabec9d6fe29156390a", + git_commit = "2e11d827d656a671757d386881e925c97f0b3d9c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From bacb76c053fecb6b068f30f6ed84cebee87a9b95 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Sep 2018 20:02:41 -0700 Subject: [PATCH 1062/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212921274 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 87e9c330fb6..8b506e73754 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2035fc035bbafa2373b98d4860a6ed42062342625ec49eabec9d6fe29156390a", - git_commit = "2e11d827d656a671757d386881e925c97f0b3d9c", + sha256 = "d92c2fd29d7cc4bc8db7fd8d9b2630c9681d73ec8bf922d8688010dfe32de2d7", + git_commit = "1831ef73ba693ba7f27a3ecb391b47601e6a3758", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3ac64d4a709a205c32f0d248b719bf17b42869d4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Sep 2018 21:01:16 -0700 Subject: [PATCH 1063/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212926157 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8b506e73754..1d8f15c03f3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d92c2fd29d7cc4bc8db7fd8d9b2630c9681d73ec8bf922d8688010dfe32de2d7", - git_commit = "1831ef73ba693ba7f27a3ecb391b47601e6a3758", + sha256 = "2e3757c0b6f7f138616fcb88771fa8f1971ed9a82cbb74315f80afaa34db0f01", + git_commit = "6dd278831a62be829ce6f15039e5b6b368b3727c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3744f5eeb6320b5884d2313f4e4bf4195138ca8b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Sep 2018 22:00:59 -0700 Subject: [PATCH 1064/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212930711 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1d8f15c03f3..234471b2319 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2e3757c0b6f7f138616fcb88771fa8f1971ed9a82cbb74315f80afaa34db0f01", - git_commit = "6dd278831a62be829ce6f15039e5b6b368b3727c", + sha256 = "62866acea2b922d9cab40e5e7ee3763cf063b7cbd4c43f85451e8f08ee52b16a", + git_commit = "40010e6287980f63158807aef163276ed1cce272", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b74b28759a88f5d8c9c0e75d3529d4f33a353337 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Sep 2018 01:02:06 -0700 Subject: [PATCH 1065/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212943795 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 234471b2319..07d05852866 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "62866acea2b922d9cab40e5e7ee3763cf063b7cbd4c43f85451e8f08ee52b16a", - git_commit = "40010e6287980f63158807aef163276ed1cce272", + sha256 = "e06d80808ca8d326f004bdd0649d095c774832cc8545c36d28b1bba80bf1d573", + git_commit = "b43aeb053ec440ea5205a09c229339c10a962af4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8aa3a5b5a4ade9725a6e3b58b0ac3e42981a2815 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Sep 2018 03:01:35 -0700 Subject: [PATCH 1066/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212955992 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 07d05852866..580b27da800 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e06d80808ca8d326f004bdd0649d095c774832cc8545c36d28b1bba80bf1d573", - git_commit = "b43aeb053ec440ea5205a09c229339c10a962af4", + sha256 = "f2e07ac37c8b3253eee200c5c464e947b8d66608078b6c0d59c467cc148754f9", + git_commit = "3a2276ced02b217596080fb34654d2dce5069f81", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 281c665b2eaed9836da313b720611019a1a12c31 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Sep 2018 04:01:35 -0700 Subject: [PATCH 1067/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212960722 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 580b27da800..ed1e005e30e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f2e07ac37c8b3253eee200c5c464e947b8d66608078b6c0d59c467cc148754f9", - git_commit = "3a2276ced02b217596080fb34654d2dce5069f81", + sha256 = "70f3bd92f552c5773a779f3350d96d59955908ff63a76808cff0c7d7a2d335ec", + git_commit = "54cbee5d034af8693aa39cc5877c3dfcd62d3740", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fdf23de9993c0fef83ce5a4029cd2ed8582039a8 Mon Sep 17 00:00:00 2001 From: awk Date: Fri, 14 Sep 2018 07:44:08 -0700 Subject: [PATCH 1068/8103] Add missing include. PiperOrigin-RevId: 212981021 --- tensorflow_serving/util/BUILD | 1 + tensorflow_serving/util/prometheus_exporter_test.cc | 1 + 2 files changed, 2 insertions(+) diff --git a/tensorflow_serving/util/BUILD b/tensorflow_serving/util/BUILD index 5db01916af3..effbe76307d 100644 --- a/tensorflow_serving/util/BUILD +++ b/tensorflow_serving/util/BUILD @@ -106,6 +106,7 @@ cc_test( deps = [ ":prometheus_exporter", "//tensorflow_serving/core/test_util:test_main", + "@com_google_absl//absl/memory", "@com_google_absl//absl/strings", "@org_tensorflow//tensorflow/core:lib", ], diff --git a/tensorflow_serving/util/prometheus_exporter_test.cc b/tensorflow_serving/util/prometheus_exporter_test.cc index 18d4d82ff3f..847449753c2 100644 --- a/tensorflow_serving/util/prometheus_exporter_test.cc +++ b/tensorflow_serving/util/prometheus_exporter_test.cc @@ -16,6 +16,7 @@ limitations under the License. #include "tensorflow_serving/util/prometheus_exporter.h" #include +#include "absl/memory/memory.h" #include "absl/strings/str_cat.h" #include "absl/strings/str_join.h" #include "tensorflow/core/lib/monitoring/counter.h" From e006c0d1cba8143a5cbd2b973db095bb38cd1c23 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Sep 2018 08:01:38 -0700 Subject: [PATCH 1069/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212982985 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ed1e005e30e..31979cf32de 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "70f3bd92f552c5773a779f3350d96d59955908ff63a76808cff0c7d7a2d335ec", - git_commit = "54cbee5d034af8693aa39cc5877c3dfcd62d3740", + sha256 = "fcb22e15d6e214ed923256400f3786b43617c8d27ec8a23b328268058f2b15be", + git_commit = "3c283b598f2de0376dfaf63ed50c4625abbf6e03", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f429a4fa1253c3c2a60d9e0fc4a1dfb468eec8de Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Sep 2018 10:01:36 -0700 Subject: [PATCH 1070/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 212999262 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 31979cf32de..0d2330e1734 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fcb22e15d6e214ed923256400f3786b43617c8d27ec8a23b328268058f2b15be", - git_commit = "3c283b598f2de0376dfaf63ed50c4625abbf6e03", + sha256 = "f7e6ddc0276fa5cee1cc91ffbb4020d307262ccddf7d0924f05056e2f6c0fa1c", + git_commit = "6aebb0866718cae2c921e875f3fd74573ee9acc8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 85bd884276dea025c58135fa44f09088383afc6f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Sep 2018 11:07:42 -0700 Subject: [PATCH 1071/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213011415 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0d2330e1734..9de47842fa1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f7e6ddc0276fa5cee1cc91ffbb4020d307262ccddf7d0924f05056e2f6c0fa1c", - git_commit = "6aebb0866718cae2c921e875f3fd74573ee9acc8", + sha256 = "11b848213893a2c4dc953393bc6ceac527c0702f00cc5d7af2f06d3527209cdf", + git_commit = "82e4edc50fb146dbf006cd81aaac6d01f40533a6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fa5e16e749c50aa0d5704a27be5ad5c6b2e79e59 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Sep 2018 12:03:51 -0700 Subject: [PATCH 1072/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213020999 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9de47842fa1..70f688c3046 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "11b848213893a2c4dc953393bc6ceac527c0702f00cc5d7af2f06d3527209cdf", - git_commit = "82e4edc50fb146dbf006cd81aaac6d01f40533a6", + sha256 = "3bf35edc0e7e1b7c336cdd5901e8b37761f23761479186df997f984e6d07ddb8", + git_commit = "81a063287a0449cfe2f20a82c036146d6e9356f9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e55c3c52b23a94a260f04b647a1dfea6c07b3784 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Sep 2018 13:04:33 -0700 Subject: [PATCH 1073/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213030150 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 70f688c3046..af469c75f3a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3bf35edc0e7e1b7c336cdd5901e8b37761f23761479186df997f984e6d07ddb8", - git_commit = "81a063287a0449cfe2f20a82c036146d6e9356f9", + sha256 = "93a677cc317b8959626d00d054fdd35b762ddcd15116575820b806ac7e496e54", + git_commit = "39f50af5634b8a4d2132b57bad2152308a0fd41c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 55e4b10a037afec05c885d58079de0cd080f82f9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Sep 2018 14:02:28 -0700 Subject: [PATCH 1074/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213039433 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index af469c75f3a..8e7d44ac1a8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "93a677cc317b8959626d00d054fdd35b762ddcd15116575820b806ac7e496e54", - git_commit = "39f50af5634b8a4d2132b57bad2152308a0fd41c", + sha256 = "0416550b511441d460640a25922b89d7b771413a38589eaa360bf05d93feb8a2", + git_commit = "91fa9ad89589b7d20200bb19cf3c271d71fa3bdc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 87ad8dd798442bd3da6b568648780a65c201df10 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Sep 2018 15:01:03 -0700 Subject: [PATCH 1075/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213049707 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8e7d44ac1a8..2dcd2ddd231 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0416550b511441d460640a25922b89d7b771413a38589eaa360bf05d93feb8a2", - git_commit = "91fa9ad89589b7d20200bb19cf3c271d71fa3bdc", + sha256 = "92627f8ac222dbf74c0ca3751e28ad045d93f5228f039fd4d1176ca28e734779", + git_commit = "19d66a950e2091bb598c6a2d375e14208f5773b2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 35ab1b8d994f83d88cfdb60132d8530cc30647ac Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Sep 2018 16:02:52 -0700 Subject: [PATCH 1076/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213059164 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2dcd2ddd231..839d45d794b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "92627f8ac222dbf74c0ca3751e28ad045d93f5228f039fd4d1176ca28e734779", - git_commit = "19d66a950e2091bb598c6a2d375e14208f5773b2", + sha256 = "5b26b133f19849f9660ab9e6229ad36957581116138e60a624196211f330e6a0", + git_commit = "84d8423bececc26f127a1c40c00588463d8d1650", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0144a03ce17ba1eda9105a7110da379f5aeb0c64 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Sep 2018 17:04:41 -0700 Subject: [PATCH 1077/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213067390 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 839d45d794b..298f7fb7aa3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5b26b133f19849f9660ab9e6229ad36957581116138e60a624196211f330e6a0", - git_commit = "84d8423bececc26f127a1c40c00588463d8d1650", + sha256 = "aed39b71578fcb18d0b3dfe89cf2d7c411ea537905b62430e9a1a41e9c0b4311", + git_commit = "98342d8bea440c960a3a08bf3f27df737b2b2b11", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fb35072fee4fb6497002db0703aa9a2637334c64 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Sep 2018 18:02:24 -0700 Subject: [PATCH 1078/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213073256 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 298f7fb7aa3..d4e2863c3c0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "aed39b71578fcb18d0b3dfe89cf2d7c411ea537905b62430e9a1a41e9c0b4311", - git_commit = "98342d8bea440c960a3a08bf3f27df737b2b2b11", + sha256 = "b6203a7c1ee97baed6ad97d843fdb094c2bf27fe4e61fce82e86238207431e05", + git_commit = "2e44b4681a16f4127502b0330228d7d4b33f8ee5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 71b1f74cf20bff6fa5af05d50db6944afa099b11 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Sep 2018 19:03:41 -0700 Subject: [PATCH 1079/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213077889 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d4e2863c3c0..b1af871b41f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b6203a7c1ee97baed6ad97d843fdb094c2bf27fe4e61fce82e86238207431e05", - git_commit = "2e44b4681a16f4127502b0330228d7d4b33f8ee5", + sha256 = "9d61fa53461a39fca6996c5f67ac9ba5f980f2f9be95d8deef20cb4c1a2cddbd", + git_commit = "0d4cb43a540f08cb73c00fac662c961e4154ac32", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ef75ffc8e774700f5578449d25a6249fc9f3cad9 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Fri, 14 Sep 2018 20:00:54 -0700 Subject: [PATCH 1080/8103] Update release notes PiperOrigin-RevId: 213081048 --- RELEASE.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/RELEASE.md b/RELEASE.md index 7c71d34790a..73529e66b92 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,3 +1,24 @@ +# Release 1.11.0-rc0 + +# Major Features and Improvements + +* No major features or improvements + +## Breaking Changes + +* No breaking changes + +## Bug Fixes and Other Changes + +* Prometheus exporter for TF metrics.= +* Add new REST API to get status of model(s) from ModelServer +* Directly import tensor.proto.h (the transitive import will be removed from tensor.h soon) +* Building optimized TensorFlow Serving binaries is now easier (see https://github.com/tensorflow/serving/g3doc/setup.md) +* Adds columnar format support for input/output tensors in Predict REST API (fixes #1047) +* Development Dockerfiles now produce a more optimized ModelServer +* Fixed TensorFlow Serving API PyPi package overwriting TensorFlow package + + # Release 1.10.0 # Major Features and Improvements From 0b3aab4aa7d364bf1a909b6aff124f5dee282f69 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Sep 2018 20:03:22 -0700 Subject: [PATCH 1081/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213081296 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b1af871b41f..607dfa72c79 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9d61fa53461a39fca6996c5f67ac9ba5f980f2f9be95d8deef20cb4c1a2cddbd", - git_commit = "0d4cb43a540f08cb73c00fac662c961e4154ac32", + sha256 = "241b1e30f12188216a929837f9c4ef44291e60f2e1b91f26ce2e21ad24b8590c", + git_commit = "08589aa0c4447b21dd73183cf5cfafff326324dc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 449a2af279da0906c90ae278ade5fea0d49ea933 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 15 Sep 2018 04:01:06 -0700 Subject: [PATCH 1082/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213105853 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 607dfa72c79..193c1733c7f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "241b1e30f12188216a929837f9c4ef44291e60f2e1b91f26ce2e21ad24b8590c", - git_commit = "08589aa0c4447b21dd73183cf5cfafff326324dc", + sha256 = "822107c111bb746a11ac6451e081bd128471d5e699881dcd9c17b1c95a95eba6", + git_commit = "e517e2cf49a23d8561bcc5fcacbbb6674064b0e9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 477ece64765875c5077451106df7c5b2aaa97370 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 15 Sep 2018 07:01:46 -0700 Subject: [PATCH 1083/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213113465 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 193c1733c7f..d50992797c6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "822107c111bb746a11ac6451e081bd128471d5e699881dcd9c17b1c95a95eba6", - git_commit = "e517e2cf49a23d8561bcc5fcacbbb6674064b0e9", + sha256 = "1d824dd19084f77b2eac055e5d5997705ef48b00979599f616c2d303f251d185", + git_commit = "eab14a9303f6268d97fa3b901cc09a71c86bba63", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d7eaca82d5919dde4fcf9fe85f3fa6b7d08f8dbd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 15 Sep 2018 15:02:31 -0700 Subject: [PATCH 1084/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213133186 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d50992797c6..29d67a77bc2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1d824dd19084f77b2eac055e5d5997705ef48b00979599f616c2d303f251d185", - git_commit = "eab14a9303f6268d97fa3b901cc09a71c86bba63", + sha256 = "91d84ea31d9890ab63043232b814392ad6cd349599a6acc625354d6be9f1c73b", + git_commit = "e37baff90ed84faef679bbf1e785e6790fd2739d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f835a39a1729a49656931d4ab2cbaf59dcf4dc26 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 16 Sep 2018 04:01:58 -0700 Subject: [PATCH 1085/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213166701 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 29d67a77bc2..c5c16bc6bc3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "91d84ea31d9890ab63043232b814392ad6cd349599a6acc625354d6be9f1c73b", - git_commit = "e37baff90ed84faef679bbf1e785e6790fd2739d", + sha256 = "75b859b59e7607b821dab7bdd3ec3569949e5d82cc05b40406b60a3a1f0a1260", + git_commit = "aa2094fc9dc6e67d6e440231828de05a6da3cf78", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c45244e3ab3ba7108f76e2a92b377b11937b947a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 16 Sep 2018 14:02:17 -0700 Subject: [PATCH 1086/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213192814 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c5c16bc6bc3..ee9eb7ce4af 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "75b859b59e7607b821dab7bdd3ec3569949e5d82cc05b40406b60a3a1f0a1260", - git_commit = "aa2094fc9dc6e67d6e440231828de05a6da3cf78", + sha256 = "a96c94477a3d504ff6b7736ccc608cc80815e617426bd9f2b6e2b83111b87fef", + git_commit = "92c31bb620b0f8dd6590380dc6a5674f591ce1cb", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0fefdc36e1f415a95673d15788eb34807492ee20 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 16 Sep 2018 15:02:34 -0700 Subject: [PATCH 1087/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213195338 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ee9eb7ce4af..847c78e9251 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a96c94477a3d504ff6b7736ccc608cc80815e617426bd9f2b6e2b83111b87fef", - git_commit = "92c31bb620b0f8dd6590380dc6a5674f591ce1cb", + sha256 = "3d3b1729f4f26251f37900fe499152e25fb86cf0de53dd845de58f6eed8e8cc2", + git_commit = "a6ee64cd216b3ac440262e1f4ec7872fe7026df6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b952ffa7d5ce30cdc8d90dfac29e1eebe9ea5eec Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 16 Sep 2018 23:01:22 -0700 Subject: [PATCH 1088/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213220576 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 847c78e9251..71f6dec5736 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3d3b1729f4f26251f37900fe499152e25fb86cf0de53dd845de58f6eed8e8cc2", - git_commit = "a6ee64cd216b3ac440262e1f4ec7872fe7026df6", + sha256 = "4fbf55df59baedffb9397f4116ae89f811ff287f7fff95696bcfe3ed454fea29", + git_commit = "5cf71e75a56a6ec424487492cacde7c9fbc9a5aa", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 77b01bb606591fc5b9193f13dededdb0c4c17691 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Sep 2018 02:01:28 -0700 Subject: [PATCH 1089/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213234902 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 71f6dec5736..998af9943bf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4fbf55df59baedffb9397f4116ae89f811ff287f7fff95696bcfe3ed454fea29", - git_commit = "5cf71e75a56a6ec424487492cacde7c9fbc9a5aa", + sha256 = "96785f72ffc44c8890054fef0cd2fe1f1c42281310709c99262345a2e9550069", + git_commit = "f1d42c8967410db1e08c0b6d62dc1fc4844165a8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2aad88ca26d99dc772ff55c7be991e666fb04f79 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Sep 2018 03:02:18 -0700 Subject: [PATCH 1090/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213242492 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 998af9943bf..64a2e20f5a9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "96785f72ffc44c8890054fef0cd2fe1f1c42281310709c99262345a2e9550069", - git_commit = "f1d42c8967410db1e08c0b6d62dc1fc4844165a8", + sha256 = "6c5b873f457b07e75f5f54cc231e5b34ccab5b745da77c21df923676bd9aff94", + git_commit = "5ff7f982846bd3f8056c8252a0afeb07e5b3e982", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 22f0f5d32f48fa1deb095a8ab812afd7a334a18f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Sep 2018 04:01:15 -0700 Subject: [PATCH 1091/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213247566 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 64a2e20f5a9..e6661ff9a44 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6c5b873f457b07e75f5f54cc231e5b34ccab5b745da77c21df923676bd9aff94", - git_commit = "5ff7f982846bd3f8056c8252a0afeb07e5b3e982", + sha256 = "69cc3e48164a5c006312e2485f9225d6c7d7fe6e43d7f7b00cdae7c6330d5db1", + git_commit = "b1f4328517851e76cff3d4af8766e7e3446314ba", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3c9e728518b7b01846a19cb43a9a6b5319934d23 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Sep 2018 05:03:26 -0700 Subject: [PATCH 1092/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213254306 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e6661ff9a44..f5c520d14cf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "69cc3e48164a5c006312e2485f9225d6c7d7fe6e43d7f7b00cdae7c6330d5db1", - git_commit = "b1f4328517851e76cff3d4af8766e7e3446314ba", + sha256 = "ded78bffaaa63ef4d34cf4c06da9a23f5ca03440d87f9972e107819099687c68", + git_commit = "cac963862be3faa421c559f39033c9bfb3b27a51", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fd8d40157907e19e740be9ad0a2c1699d8c8c079 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Sep 2018 09:01:20 -0700 Subject: [PATCH 1093/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213280250 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f5c520d14cf..2d6071b3f88 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ded78bffaaa63ef4d34cf4c06da9a23f5ca03440d87f9972e107819099687c68", - git_commit = "cac963862be3faa421c559f39033c9bfb3b27a51", + sha256 = "384af921f7a77eb99238a5a23e4fb9fd4c886608f2e22eaee3f04279451fa64e", + git_commit = "055e5a0f71c83bab3f645d1c2e2cadeff5ff654f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From bff9502f3b0a9968809417c900a3d59209a8aa7a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Sep 2018 10:01:05 -0700 Subject: [PATCH 1094/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213289407 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2d6071b3f88..9a3a192ba4a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "384af921f7a77eb99238a5a23e4fb9fd4c886608f2e22eaee3f04279451fa64e", - git_commit = "055e5a0f71c83bab3f645d1c2e2cadeff5ff654f", + sha256 = "c2012ef3ef6ec392f5838055c86239d784d02f01f04c3ea9fa0cbf150fffed04", + git_commit = "e0d6830999a6e7c92f047e6e89c3aba20911cc8c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1ef8ba8f3843838c159ce2f5064c88e323be8ee7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Sep 2018 11:00:48 -0700 Subject: [PATCH 1095/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213301177 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9a3a192ba4a..9a497e1a718 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c2012ef3ef6ec392f5838055c86239d784d02f01f04c3ea9fa0cbf150fffed04", - git_commit = "e0d6830999a6e7c92f047e6e89c3aba20911cc8c", + sha256 = "94e83663d5f9286e826e524d41b99b347d393391b41d36c366b027d505add287", + git_commit = "422158776bcd9ffbde485610fdd3af498a2d5669", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0dac531840a8c23414c46c11b15fbbfc66f15ef7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Sep 2018 12:01:56 -0700 Subject: [PATCH 1096/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213312876 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9a497e1a718..a1ca2f0fd27 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "94e83663d5f9286e826e524d41b99b347d393391b41d36c366b027d505add287", - git_commit = "422158776bcd9ffbde485610fdd3af498a2d5669", + sha256 = "dfdf6e302351bf04dc73335cb7b1a1ad163deb638ddda429992f5d56c0430061", + git_commit = "531d08bd10125b83030f1165d8562e23b20f4941", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b8d5b5c8370cb9a07a41860c16bd057153e3b955 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Sep 2018 13:01:32 -0700 Subject: [PATCH 1097/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213322783 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a1ca2f0fd27..59b702a5572 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dfdf6e302351bf04dc73335cb7b1a1ad163deb638ddda429992f5d56c0430061", - git_commit = "531d08bd10125b83030f1165d8562e23b20f4941", + sha256 = "b06417c04bec5ab33063713ceca19dfdca0956b70e15173fabecff73197a1b1d", + git_commit = "a1ea2be7ce4d19c5cd098be2ecd1488a30605899", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From aacb8b6a989115e514e80d407cef388ff95ef4ed Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Sep 2018 14:01:15 -0700 Subject: [PATCH 1098/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213333002 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 59b702a5572..d97c7eaa247 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b06417c04bec5ab33063713ceca19dfdca0956b70e15173fabecff73197a1b1d", - git_commit = "a1ea2be7ce4d19c5cd098be2ecd1488a30605899", + sha256 = "7bcaf8929040b68099eef68aa62ebf412d24c72f30d1828283dd44e66ebdbbf8", + git_commit = "de3fa499bb05c595f9e341c7d507b47b8d44ae90", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 60e9e4637a0cc4039a5606571f359fde0c97cfff Mon Sep 17 00:00:00 2001 From: awk Date: Mon, 17 Sep 2018 14:49:52 -0700 Subject: [PATCH 1099/8103] Minor fixes to release notes. PiperOrigin-RevId: 213342044 --- RELEASE.md | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/RELEASE.md b/RELEASE.md index 73529e66b92..99452d501dd 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,8 +1,9 @@ # Release 1.11.0-rc0 -# Major Features and Improvements +## Major Features and Improvements -* No major features or improvements +* Prometheus exporter for TF metrics (see https://github.com/tensorflow/serving/commit/021efbd3281aa815cab0b35eab6d6d25249c12d4 for details). +* Added new REST API to [get status of model(s)](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/g3doc/api_rest.md#model-status-api) from ModelServer. ## Breaking Changes @@ -10,18 +11,16 @@ ## Bug Fixes and Other Changes -* Prometheus exporter for TF metrics.= -* Add new REST API to get status of model(s) from ModelServer +* Built against TensorFlow [1.11.0-rc0](https://github.com/tensorflow/tensorflow/releases/tag/v1.11.0-rc0). * Directly import tensor.proto.h (the transitive import will be removed from tensor.h soon) -* Building optimized TensorFlow Serving binaries is now easier (see https://github.com/tensorflow/serving/g3doc/setup.md) +* Building optimized TensorFlow Serving binaries is now easier (see [docs](https://github.com/tensorflow/serving/g3doc/setup.md]) for details) * Adds columnar format support for input/output tensors in Predict REST API (fixes #1047) * Development Dockerfiles now produce a more optimized ModelServer -* Fixed TensorFlow Serving API PyPi package overwriting TensorFlow package - +* Fixed TensorFlow Serving API PyPi package overwriting TensorFlow package. # Release 1.10.0 -# Major Features and Improvements +## Major Features and Improvements * No major features or improvements. From 63304b2ccaded60f35c2b6d0b522fde2915acd5c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Sep 2018 15:01:52 -0700 Subject: [PATCH 1100/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213344311 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d97c7eaa247..fbd53569630 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7bcaf8929040b68099eef68aa62ebf412d24c72f30d1828283dd44e66ebdbbf8", - git_commit = "de3fa499bb05c595f9e341c7d507b47b8d44ae90", + sha256 = "452234f99434f763f3b3f41923f08054b6cfd7ca3a3e7dbb6390fb1d3039fd54", + git_commit = "838d9c859583717a151395ef9c28374e124f1408", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 862f4dd354626822a0f2b8ac5fffa97111561a42 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Sep 2018 16:01:47 -0700 Subject: [PATCH 1101/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213355017 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fbd53569630..4c030efb66f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "452234f99434f763f3b3f41923f08054b6cfd7ca3a3e7dbb6390fb1d3039fd54", - git_commit = "838d9c859583717a151395ef9c28374e124f1408", + sha256 = "a6a6cc95b8383b67cf24c203738c3df48c5a2581103ae07d382361d0f53c6cc4", + git_commit = "2015dc15784e635c40f256ed9f3b9b0b3539daaf", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b3b6a20f4067bed47a0aae4ca7002ce87a1154f6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Sep 2018 17:01:35 -0700 Subject: [PATCH 1102/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213365085 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4c030efb66f..8727e931943 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a6a6cc95b8383b67cf24c203738c3df48c5a2581103ae07d382361d0f53c6cc4", - git_commit = "2015dc15784e635c40f256ed9f3b9b0b3539daaf", + sha256 = "039153e8836f7871b923a05874d0b7d1ef01d5ad33655b47d365f6a154fa4f63", + git_commit = "f5116dd366a5bb1d679e1682c13b8fa3c4830a84", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6bc82d5bde420b6902accd35d0233ec4f6ba1fec Mon Sep 17 00:00:00 2001 From: christis Date: Mon, 17 Sep 2018 17:04:33 -0700 Subject: [PATCH 1103/8103] Basic SavedModel Warmup documentation. PiperOrigin-RevId: 213365686 --- .../g3doc/saved_model_warmup.md | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 tensorflow_serving/g3doc/saved_model_warmup.md diff --git a/tensorflow_serving/g3doc/saved_model_warmup.md b/tensorflow_serving/g3doc/saved_model_warmup.md new file mode 100644 index 00000000000..1d60b7b587d --- /dev/null +++ b/tensorflow_serving/g3doc/saved_model_warmup.md @@ -0,0 +1,57 @@ +# SavedModel Warmup + +## Introduction + +The TensorFlow runtime has components that are lazily initialized, +which can cause high latency for the first request/s sent to a model after it is +loaded. This latency can be several orders of magnitude higher than that of a +single inference request. + +To reduce the impact of lazy initialization on request latency, it's possible to +trigger the initialization of the sub-systems and components at model load time +by providing a sample set of inference requests along with the SavedModel. This +process is known as "warming up" the model. + +## Usage + +SavedModel Warmup is supported for Regress, Classify, MultiInference and +Predict. To trigger warmup of the model at load time, attach a warmup data file +under the assets.extra subfolder of the SavedModel directory. + +Requirements for model warmup to work correctly: + +* Warmup file name: 'tf_serving_warmup_requests' +* File location: assets.extra/ +* File format: + [TFRecord](https://www.tensorflow.org/api_guides/python/python_io) with each + record as a + [PredictionLog](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/apis/prediction_log.proto#L40). +* Number of warmup records <= 1000. +* The warmup data must be representative of the inference requests used at + serving. + +Example code snippet producing warmup data: + +```python +import tensorflow as tf +from tensorflow_serving.apis import classification_pb2 +from tensorflow_serving.apis import inference_pb2 +from tensorflow_serving.apis import model_pb2 +from tensorflow_serving.apis import predict_pb2 +from tensorflow_serving.apis import prediction_log_pb2 +from tensorflow_serving.apis import regression_pb2 + +def main(): + with tf.python_io.TFRecordWriter("tf_serving_warmup_requests") as writer: + # replace with one of: + # predict_pb2.PredictRequest(..) + # classification_pb2.ClassificationRequest(..) + # regression_pb2.RegressionRequest(..) + # inference_pb2.MultiInferenceRequest(..) + log = prediction_log_pb2.PredictionLog( + predict_log=prediction_log_pb2.PredictLog(request=)) + writer.write(log.SerializeToString()) + +if __name__ == "__main__": + main() +``` From 701aae40a02ad3784e71a2463f859de5b9cc3bc2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Sep 2018 18:01:33 -0700 Subject: [PATCH 1104/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213372849 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8727e931943..f43e2fae4d9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "039153e8836f7871b923a05874d0b7d1ef01d5ad33655b47d365f6a154fa4f63", - git_commit = "f5116dd366a5bb1d679e1682c13b8fa3c4830a84", + sha256 = "702ed9714cfab666971e92e7a8a62752991f6169d8a3d51a14c737c754eea8d3", + git_commit = "6e8293f1cdf2efe3cec2efdcfa89174893b0bace", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ec429a18c9de0cb83f14d57334cfccd1ef0c8764 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Sep 2018 19:01:48 -0700 Subject: [PATCH 1105/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213379091 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f43e2fae4d9..552bceaeed6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "702ed9714cfab666971e92e7a8a62752991f6169d8a3d51a14c737c754eea8d3", - git_commit = "6e8293f1cdf2efe3cec2efdcfa89174893b0bace", + sha256 = "564236887e99ccc955cf5d859a852275bc5a80998406e1dc7acd5e68ea546952", + git_commit = "71fab28dc4741dedf13fea732f6b134608719bc7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 329f5e5708675316cdafb86d6c7839bc0e6c5e01 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Sep 2018 20:01:43 -0700 Subject: [PATCH 1106/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213383951 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 552bceaeed6..e85f448da63 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "564236887e99ccc955cf5d859a852275bc5a80998406e1dc7acd5e68ea546952", - git_commit = "71fab28dc4741dedf13fea732f6b134608719bc7", + sha256 = "e020a65a187e7b2ace4bdb5149787c82e4f675d54f47c4c8a6511009048aecae", + git_commit = "1bd2804869355a7cd0cbfbe9e6aab7591b8a20de", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5fec1c1f9b09fdcd308e2d60d0384fb2e576de20 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Sep 2018 21:01:31 -0700 Subject: [PATCH 1107/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213389243 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e85f448da63..8b44b7747f4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e020a65a187e7b2ace4bdb5149787c82e4f675d54f47c4c8a6511009048aecae", - git_commit = "1bd2804869355a7cd0cbfbe9e6aab7591b8a20de", + sha256 = "3e605413f7d05716f06593745774b8677dd233777309d6046c065dd4c74c89b9", + git_commit = "bb9958ab69a38cbe57d119947b635a257fa6b802", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 525877b0f7e517f38123319b0dd16ad34a66885e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Sep 2018 22:02:14 -0700 Subject: [PATCH 1108/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213393925 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8b44b7747f4..c5205e92ea9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3e605413f7d05716f06593745774b8677dd233777309d6046c065dd4c74c89b9", - git_commit = "bb9958ab69a38cbe57d119947b635a257fa6b802", + sha256 = "97b23ee0ec4ba3ffe0a0767fb61f6dc3ce728624ddb1620b8f1845eab0e46ec1", + git_commit = "b91e27a9c33d038af79a0944eb9046b926d483c8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f62b75bf78516f55a84dfd37791da9d3fe1d1635 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Sep 2018 00:01:58 -0700 Subject: [PATCH 1109/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213402413 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c5205e92ea9..0cadd347643 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "97b23ee0ec4ba3ffe0a0767fb61f6dc3ce728624ddb1620b8f1845eab0e46ec1", - git_commit = "b91e27a9c33d038af79a0944eb9046b926d483c8", + sha256 = "a4767b08367c90b578d2424427b6de110942045b8a4d8a78e7ef8a406764585f", + git_commit = "9cc7bbe5b476bec556d7dce235996a03775d7492", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8f84fe6f7e596dd25d12bb7e29ccd0c2556a3f8b Mon Sep 17 00:00:00 2001 From: tutmann Date: Tue, 18 Sep 2018 09:56:03 +0200 Subject: [PATCH 1110/8103] Update index.md Embed Noah Fiedels Talk from TFDS in serving docs. --- tensorflow_serving/g3doc/index.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tensorflow_serving/g3doc/index.md b/tensorflow_serving/g3doc/index.md index 18d0e28c42d..fa24e6b7c01 100644 --- a/tensorflow_serving/g3doc/index.md +++ b/tensorflow_serving/g3doc/index.md @@ -12,7 +12,8 @@ To get started with TensorFlow Serving: * Read the [overview](architecture_overview.md) * [Set up](setup.md) your environment * Do the [basic tutorial](serving_basic.md) - +* Or watch the Talk from TensorFlow Dev Summit 2017: + ![TensorFlow Serving Diagram](images/tf_diagram.svg){: width="500"} From 7e52ae0b96e2a6c1ec7bf9b993322cc371fca2d0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Sep 2018 01:03:04 -0700 Subject: [PATCH 1111/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213408187 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0cadd347643..5f438525c48 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a4767b08367c90b578d2424427b6de110942045b8a4d8a78e7ef8a406764585f", - git_commit = "9cc7bbe5b476bec556d7dce235996a03775d7492", + sha256 = "4aba22cf8bd892caac85d45d8f35c398b9a8c48c55af4d9799d2306f947030a2", + git_commit = "cc054336d93cd1eee1b80679a1b87017fda3d9e5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b5fe5ecb9fca82cd518bfff45dc6d7c652ef0a3a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Sep 2018 04:02:33 -0700 Subject: [PATCH 1112/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213426512 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5f438525c48..f976633b9bd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4aba22cf8bd892caac85d45d8f35c398b9a8c48c55af4d9799d2306f947030a2", - git_commit = "cc054336d93cd1eee1b80679a1b87017fda3d9e5", + sha256 = "e471a422b9ffbc331bfad4389ac9575d826e3c2dbebf5056a0c01f9fdc38003b", + git_commit = "0cf3690400e46bd89b48a206eff8dd08a660aced", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4bd27f668e1c92a8d960bb6cc11afc0be98a87c4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Sep 2018 07:03:00 -0700 Subject: [PATCH 1113/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213443099 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f976633b9bd..ea33fbaa472 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e471a422b9ffbc331bfad4389ac9575d826e3c2dbebf5056a0c01f9fdc38003b", - git_commit = "0cf3690400e46bd89b48a206eff8dd08a660aced", + sha256 = "bbc570b0dbac178ad3f7312729c6fe2672d77a4429fc8d6110152dc3f43d95a4", + git_commit = "c6a060c83cc56c8c0cc0f1105550def4bff93c0d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2bc0bd09b91feb4940579fbd3d5a1f924b1010bc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Sep 2018 08:03:01 -0700 Subject: [PATCH 1114/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213449898 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ea33fbaa472..5be4c7231ec 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bbc570b0dbac178ad3f7312729c6fe2672d77a4429fc8d6110152dc3f43d95a4", - git_commit = "c6a060c83cc56c8c0cc0f1105550def4bff93c0d", + sha256 = "1e86b3108e644aede87466378d367a5db40ad1673461e900ad4ae37c88d3b00f", + git_commit = "25c99131362f034c3bc3805d741f0c4ab9d0cb8b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b70b40995ba46a49af3e6d77d7c8da0ee2584b7e Mon Sep 17 00:00:00 2001 From: tutmann Date: Tue, 18 Sep 2018 20:29:33 +0200 Subject: [PATCH 1115/8103] Update index.md --- tensorflow_serving/g3doc/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/g3doc/index.md b/tensorflow_serving/g3doc/index.md index fa24e6b7c01..3adadd13c77 100644 --- a/tensorflow_serving/g3doc/index.md +++ b/tensorflow_serving/g3doc/index.md @@ -13,7 +13,7 @@ To get started with TensorFlow Serving: * [Set up](setup.md) your environment * Do the [basic tutorial](serving_basic.md) * Or watch the Talk from TensorFlow Dev Summit 2017: - +[![Serving Models in Production with TensorFlow Serving](https://img.youtube.com/vi/q_IkJcPyNl0/0.jpg)](http://www.youtube.com/watch?v=q_IkJcPyNl0) ![TensorFlow Serving Diagram](images/tf_diagram.svg){: width="500"} From a1bf8d726de716c6cc8ff0ad035b18f0e1bfef19 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Sep 2018 16:04:55 -0700 Subject: [PATCH 1116/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213535208 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5be4c7231ec..9821fc82a13 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1e86b3108e644aede87466378d367a5db40ad1673461e900ad4ae37c88d3b00f", - git_commit = "25c99131362f034c3bc3805d741f0c4ab9d0cb8b", + sha256 = "3b5287c89aa30018b774aa1af5f40a01e6e45ca96e5612d7a7274baf9622f39d", + git_commit = "0c8a8289da120ee353c4fba5decb0bea9014e0a7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6c7132edda0a673785b226f94b2e6caaadcc5bd2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Sep 2018 17:01:03 -0700 Subject: [PATCH 1117/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213544308 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9821fc82a13..1b549494ed8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3b5287c89aa30018b774aa1af5f40a01e6e45ca96e5612d7a7274baf9622f39d", - git_commit = "0c8a8289da120ee353c4fba5decb0bea9014e0a7", + sha256 = "c872227bd7cb4ac186b8f676a81a107c3cc7df89edf259dde38a33d07c718502", + git_commit = "e1a32c98210f8ebba42a0397259d948e1433c09e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 456e74af3eee459f5623acf86bf6118214515a23 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Sep 2018 18:02:03 -0700 Subject: [PATCH 1118/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213552911 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1b549494ed8..0747926287f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c872227bd7cb4ac186b8f676a81a107c3cc7df89edf259dde38a33d07c718502", - git_commit = "e1a32c98210f8ebba42a0397259d948e1433c09e", + sha256 = "eafa4bb6e029865da11f3c8f7d1cb2012b28dbf0f4c6c2cf776cfebcdfc3f8c3", + git_commit = "f7b54ae1b4b215b2944e232ca51604aad1356930", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5c0c3363ef0d9b88857352b204f884e0a0b0820d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Sep 2018 19:02:09 -0700 Subject: [PATCH 1119/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213558514 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0747926287f..f4f9a8bb514 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eafa4bb6e029865da11f3c8f7d1cb2012b28dbf0f4c6c2cf776cfebcdfc3f8c3", - git_commit = "f7b54ae1b4b215b2944e232ca51604aad1356930", + sha256 = "4eb3a26b5b0f34230d1639728978a46d9d0868f0e94dcc2c19d120605ff0a0b5", + git_commit = "c2dc702159cfccb623b99daf2f9df875a1f3dbfd", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9b084f3bbf3abc32765c84be7d06361e92be4213 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Sep 2018 20:05:36 -0700 Subject: [PATCH 1120/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213563760 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f4f9a8bb514..4f9fc2c99d1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4eb3a26b5b0f34230d1639728978a46d9d0868f0e94dcc2c19d120605ff0a0b5", - git_commit = "c2dc702159cfccb623b99daf2f9df875a1f3dbfd", + sha256 = "476cc7466df8be1b73fed517b5b0ceb588cf78de58b40fcfd1ca8bc4fc8dff67", + git_commit = "9ee75bb6e29007b8b5ea4a6d981996d8a4d88373", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 08ddb2330d72315bedee2568f8df572bf23ac371 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Sep 2018 21:02:25 -0700 Subject: [PATCH 1121/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213568247 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4f9fc2c99d1..2b588848791 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "476cc7466df8be1b73fed517b5b0ceb588cf78de58b40fcfd1ca8bc4fc8dff67", - git_commit = "9ee75bb6e29007b8b5ea4a6d981996d8a4d88373", + sha256 = "89ccee3a1333f93d226166f533c10757ed943f9f7ea4a4b0fbf78026e2563e13", + git_commit = "9fe177881224571aff0c267593f747f5fd7a2967", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f9fe31475bcbeddcba7ec0f80403a11094ae838d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Sep 2018 22:01:42 -0700 Subject: [PATCH 1122/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213572440 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2b588848791..fb584c3a217 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "89ccee3a1333f93d226166f533c10757ed943f9f7ea4a4b0fbf78026e2563e13", - git_commit = "9fe177881224571aff0c267593f747f5fd7a2967", + sha256 = "e577d329d7c374905e1765ed17f1dec6731cd0f790f5398dbbd88f07f4934b2f", + git_commit = "50e7f03591a5d2b6b2abc29e5549ea0077259706", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f452f3cab5d0788aadf77ba63134cd1ad30509e6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Sep 2018 23:01:41 -0700 Subject: [PATCH 1123/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213576729 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fb584c3a217..889635f2db9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e577d329d7c374905e1765ed17f1dec6731cd0f790f5398dbbd88f07f4934b2f", - git_commit = "50e7f03591a5d2b6b2abc29e5549ea0077259706", + sha256 = "0588aec2e7d82e9174f4c32839090a6178a82f71ae9b95721fc26f9f56b53be1", + git_commit = "d7cc73c300b12e7c02507bcfaff146d6c4955f19", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b41139aef14f69274c069ab3fb6ad2785eab7e61 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 19 Sep 2018 00:01:56 -0700 Subject: [PATCH 1124/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213580789 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 889635f2db9..f6cbb76ff64 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0588aec2e7d82e9174f4c32839090a6178a82f71ae9b95721fc26f9f56b53be1", - git_commit = "d7cc73c300b12e7c02507bcfaff146d6c4955f19", + sha256 = "05a3e683389e75c88756a022f6cfb72bce5371b54794fb517e0a03f1b1b31803", + git_commit = "50125bf0d8ee9f47b868211f62cb545c5701a032", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6f2940533ffcd4ca32141cba18aadb4c23d841b6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 19 Sep 2018 03:00:50 -0700 Subject: [PATCH 1125/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213599542 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f6cbb76ff64..af61ad939d2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "05a3e683389e75c88756a022f6cfb72bce5371b54794fb517e0a03f1b1b31803", - git_commit = "50125bf0d8ee9f47b868211f62cb545c5701a032", + sha256 = "d87b21db7d94a2746ef17b7d2c132350c440b0028e5a2865641ef9c7adf25a5e", + git_commit = "0d8942fcbcc9cb3a05be8acc843d1fc4b6dfc9f1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 552297414a668a831eee669c3b3b3e3bab3f6d12 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 19 Sep 2018 04:03:14 -0700 Subject: [PATCH 1126/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213605352 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index af61ad939d2..c14324d2903 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d87b21db7d94a2746ef17b7d2c132350c440b0028e5a2865641ef9c7adf25a5e", - git_commit = "0d8942fcbcc9cb3a05be8acc843d1fc4b6dfc9f1", + sha256 = "f2e1de7b36e8a5e3ec26dde49fb39490d5dccedb552c9b063b729359575e3e2f", + git_commit = "0b274dcbe12a9f0ddd96f94cc80c2e66c195fd76", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d7bca07e192ea95fc61dd293a1f1bfb87a14a956 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 19 Sep 2018 05:02:00 -0700 Subject: [PATCH 1127/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213609641 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c14324d2903..bcf717a3dfb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f2e1de7b36e8a5e3ec26dde49fb39490d5dccedb552c9b063b729359575e3e2f", - git_commit = "0b274dcbe12a9f0ddd96f94cc80c2e66c195fd76", + sha256 = "0e3e00ee9a8ff7588d324c0dc8f45ff0708c10c2171b84e94402e098ad1c8a0e", + git_commit = "227b819d55c3b24103026cdaf1897892422c5cd3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7105d7affbe752e9d577082d564617fa9b5725a6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 19 Sep 2018 07:03:07 -0700 Subject: [PATCH 1128/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213620916 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bcf717a3dfb..b28a2f4dbb5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0e3e00ee9a8ff7588d324c0dc8f45ff0708c10c2171b84e94402e098ad1c8a0e", - git_commit = "227b819d55c3b24103026cdaf1897892422c5cd3", + sha256 = "93ea613b8bd48d5ec9bb09d7c469555a45011b6d1f063a51fbf94ea4a60bfc54", + git_commit = "22ff5db5d4a86c155e56ec1bdf36de503109abbe", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 853d94201fa2a4cd4526ea2e8634ea36822d853e Mon Sep 17 00:00:00 2001 From: olston Date: Wed, 19 Sep 2018 07:59:26 -0700 Subject: [PATCH 1129/8103] Add user-configured model version labels. PiperOrigin-RevId: 213627671 --- .../config/model_server_config.proto | 13 +++ .../model_servers/server_core.cc | 74 ++++++++++-- .../model_servers/server_core.h | 24 +++- .../model_servers/server_core_test.cc | 108 ++++++++++++++---- 4 files changed, 182 insertions(+), 37 deletions(-) diff --git a/tensorflow_serving/config/model_server_config.proto b/tensorflow_serving/config/model_server_config.proto index c2c9ed5dd4e..8d3d5543e9f 100644 --- a/tensorflow_serving/config/model_server_config.proto +++ b/tensorflow_serving/config/model_server_config.proto @@ -48,6 +48,19 @@ message ModelConfig { FileSystemStoragePathSourceConfig.ServableVersionPolicy model_version_policy = 7; + // String labels to associate with versions of the model, allowing inference + // queries to refer to versions by label instead of number. Multiple labels + // can map to the same version, but not vice-versa. + // + // An envisioned use-case for these labels is canarying tentative versions. + // For example, one can assign labels "stable" and "canary" to two specific + // versions. Perhaps initially "stable" is assigned to version 0 and "canary" + // to version 1. Once version 1 passes canary, one can shift the "stable" + // label to refer to version 1 (at that point both labels map to the same + // version -- version 1 -- which is fine). Later once version 2 is ready to + // canary one can move the "canary" label to version 2. And so on. + map version_labels = 8; + // Configures logging requests and responses, to the model. // // (This can be changed once a model is in serving.) diff --git a/tensorflow_serving/model_servers/server_core.cc b/tensorflow_serving/model_servers/server_core.cc index 94f90387cf0..7de5114b54c 100644 --- a/tensorflow_serving/model_servers/server_core.cc +++ b/tensorflow_serving/model_servers/server_core.cc @@ -217,9 +217,6 @@ Status UpdateModelConfigListRelativePaths( } // namespace -constexpr char ServerCore::kStableVersionLabel[]; -constexpr char ServerCore::kCanaryVersionLabel[]; - // ************************************************************************ // Public Methods. // ************************************************************************ @@ -459,6 +456,8 @@ Status ServerCore::ReloadConfig(const ModelServerConfig& new_config) { } config_ = new_config; + TF_RETURN_IF_ERROR(UpdateModelVersionLabelMap()); + LOG(INFO) << "Adding/updating models."; switch (config_.config_case()) { case ModelServerConfig::kModelConfigList: { @@ -489,6 +488,46 @@ Status ServerCore::ReloadConfig(const ModelServerConfig& new_config) { return Status::OK(); } +Status ServerCore::UpdateModelVersionLabelMap() { + std::unique_ptr>> new_label_map( + new std::map>); + for (const ModelConfig& model_config : config_.model_config_list().config()) { + ServableStateMonitor::VersionMap serving_states = + servable_state_monitor_->GetVersionStates(model_config.name()); + + for (const auto& entry : model_config.version_labels()) { + const string& label = entry.first; + const int64 version = entry.second; + + // Verify that the label points to a version that is currently available. + auto serving_states_it = serving_states.find(version); + if (serving_states_it == serving_states.end() || + serving_states_it->second.state.manager_state != + ServableState::ManagerState::kAvailable) { + return errors::FailedPrecondition(strings::StrCat( + "Request to assign label to version ", version, " of model ", + model_config.name(), + ", which is not currently available for inference")); + } + + (*new_label_map)[model_config.name()][label] = version; + } + } + + if (!options_.allow_version_labels) { + if (!new_label_map->empty()) { + return errors::FailedPrecondition( + "Model version labels are not currently allowed by the server."); + } + return Status::OK(); + } + + mutex_lock l(model_labels_to_versions_mu_); + model_labels_to_versions_.swap(new_label_map); + + return Status::OK(); +} + Status ServerCore::CreateAdapter( const string& model_platform, std::unique_ptr* adapter) const { @@ -709,14 +748,10 @@ Status ServerCore::ServableRequestFromModelSpec( "ModelSpec has 'version_label' set, but it is not currently " "allowed by the server."); } - if (model_spec.version_label() == kStableVersionLabel) { - *servable_request = ServableRequest::Earliest(model_spec.name()); - } else if (model_spec.version_label() == kCanaryVersionLabel) { - *servable_request = ServableRequest::Latest(model_spec.name()); - } else { - return errors::InvalidArgument(strings::StrCat( - "Unrecognized version label: ", model_spec.version_label())); - } + int64 version; + TF_RETURN_IF_ERROR(GetModelVersionForLabel( + model_spec.name(), model_spec.version_label(), &version)); + *servable_request = ServableRequest::Specific(model_spec.name(), version); break; } case ModelSpec::VERSION_CHOICE_NOT_SET: { @@ -727,5 +762,22 @@ Status ServerCore::ServableRequestFromModelSpec( return Status::OK(); } +Status ServerCore::GetModelVersionForLabel(const string& model_name, + const string& label, + int64* version) const { + mutex_lock l(model_labels_to_versions_mu_); + auto version_map_it = model_labels_to_versions_->find(model_name); + if (version_map_it != model_labels_to_versions_->end()) { + const std::map& version_map = version_map_it->second; + auto version_it = version_map.find(label); + if (version_it != version_map.end()) { + *version = version_it->second; + return Status::OK(); + } + } + return errors::InvalidArgument( + strings::StrCat("Unrecognized servable version label: ", label)); +} + } // namespace serving } // namespace tensorflow diff --git a/tensorflow_serving/model_servers/server_core.h b/tensorflow_serving/model_servers/server_core.h index 027b8023394..05b3275fb58 100644 --- a/tensorflow_serving/model_servers/server_core.h +++ b/tensorflow_serving/model_servers/server_core.h @@ -186,10 +186,6 @@ class ServerCore : public Manager { return servable_state_monitor_.get(); } - // Model version labels ServerCore recognizes. - static constexpr char kStableVersionLabel[] = "stable"; - static constexpr char kCanaryVersionLabel[] = "canary"; - /// Returns a ServableHandle given a ModelSpec. Returns error if no such /// Servable is available -- e.g. not yet loaded, has been quiesced/unloaded, /// etc. Callers may assume that an OK status indicates a non-null handle. @@ -329,6 +325,11 @@ class ServerCore : public Manager { ModelServerConfig::ConfigCase config_case) EXCLUSIVE_LOCKS_REQUIRED(config_mu_); + // Updates 'model_labels_to_versions_' based on 'config_'. Throws an error if + // requesting to assign a label to a version not in state kAvailable. + Status UpdateModelVersionLabelMap() EXCLUSIVE_LOCKS_REQUIRED(config_mu_) + LOCKS_EXCLUDED(model_labels_to_versions_mu_); + // ************************************************************************ // Request Processing. // ************************************************************************ @@ -337,6 +338,11 @@ class ServerCore : public Manager { Status ServableRequestFromModelSpec(const ModelSpec& model_spec, ServableRequest* servable_request) const; + // Gets the version associated with 'label', for the given model name. + Status GetModelVersionForLabel(const string& model_name, const string& label, + int64* version) const + LOCKS_EXCLUDED(model_labels_to_versions_mu_); + Status GetUntypedServableHandle( const ServableRequest& request, std::unique_ptr* untyped_handle) override { @@ -363,6 +369,10 @@ class ServerCore : public Manager { // The most recent config supplied to ReloadConfig(). ModelServerConfig config_ GUARDED_BY(config_mu_); + // A model_name->label->version# map. + std::unique_ptr>> + model_labels_to_versions_ GUARDED_BY(model_labels_to_versions_mu_); + struct StoragePathSourceAndRouter { FileSystemStoragePathSource* source; DynamicSourceRouter* router; @@ -375,7 +385,11 @@ class ServerCore : public Manager { GUARDED_BY(config_mu_); // A mutex for reconfiguration, used by ReloadConfig(). - mutex config_mu_; + mutable mutex config_mu_; + + // A mutex for swapping the model version label map. Should only be held for + // a short time (i.e. pointer swap) to avoid holding up inference requests. + mutable mutex model_labels_to_versions_mu_; }; } // namespace serving diff --git a/tensorflow_serving/model_servers/server_core_test.cc b/tensorflow_serving/model_servers/server_core_test.cc index b7bd0eb96eb..ca9e956c3ac 100644 --- a/tensorflow_serving/model_servers/server_core_test.cc +++ b/tensorflow_serving/model_servers/server_core_test.cc @@ -680,48 +680,114 @@ TEST_P(ServerCoreTest, ModelSpecMultipleVersionsAvailable) { servable_handle.id()); } - // Use ModelSpec::version_label to request the version labeled "stable". + // Assign labels to the two versions of the model. + ASSERT_EQ(1, two_version_config.model_config_list().config().size()); + ModelConfig* model_config = + two_version_config.mutable_model_config_list()->mutable_config(0); + (*model_config->mutable_version_labels())["A"] = test_util::kTestModelVersion; + (*model_config->mutable_version_labels())["B"] = + test_util::kTestModelLargerVersion; + TF_ASSERT_OK(server_core->ReloadConfig(two_version_config)); + + // Use ModelSpec::version_label to request the version labeled "A". { ModelSpec model_spec; model_spec.set_name(test_util::kTestModelName); - model_spec.set_version_label(ServerCore::kStableVersionLabel); + model_spec.set_version_label("A"); ServableHandle servable_handle; TF_ASSERT_OK( server_core->GetServableHandle(model_spec, &servable_handle)); - EXPECT_EQ((ServableId{test_util::kTestModelName, - test_util::kTestModelVersion /* smaller version */}), - servable_handle.id()); + EXPECT_EQ( + (ServableId{test_util::kTestModelName, test_util::kTestModelVersion}), + servable_handle.id()); } - // Use ModelSpec::version_label to request the version labeled "canary". + // Use ModelSpec::version_label to request the version labeled "B". { ModelSpec model_spec; model_spec.set_name(test_util::kTestModelName); - model_spec.set_version_label(ServerCore::kCanaryVersionLabel); + model_spec.set_version_label("B"); ServableHandle servable_handle; TF_ASSERT_OK( server_core->GetServableHandle(model_spec, &servable_handle)); - EXPECT_EQ( - (ServableId{test_util::kTestModelName, - test_util::kTestModelLargerVersion /* larger version */}), - servable_handle.id()); + EXPECT_EQ((ServableId{test_util::kTestModelName, + test_util::kTestModelLargerVersion}), + servable_handle.id()); + } + + // Use ModelSpec::version_label to request a nonexistent label. + { + ModelSpec model_spec; + model_spec.set_name(test_util::kTestModelName); + model_spec.set_version_label("nonexistent label"); + ServableHandle servable_handle; + Status status = + server_core->GetServableHandle(model_spec, &servable_handle); + ASSERT_FALSE(status.ok()); + EXPECT_THAT(status.ToString(), + ::testing::HasSubstr("Unrecognized servable version label")); } } -TEST_P(ServerCoreTest, ModelSpecVersionLabelsNotAllowed) { +TEST_P(ServerCoreTest, AssignLabelToUnavailableVersion) { + ModelServerConfig two_version_config = + GetTestModelServerConfigForFakePlatform(); + SwitchToHalfPlusTwoWith2Versions(&two_version_config); ServerCore::Options server_core_options = GetDefaultOptions(); - server_core_options.allow_version_labels = false; + server_core_options.allow_version_labels = true; std::unique_ptr server_core; - TF_ASSERT_OK(CreateServerCore(GetTestModelServerConfigForFakePlatform(), + TF_ASSERT_OK(CreateServerCore(two_version_config, std::move(server_core_options), &server_core)); - ModelSpec model_spec; - model_spec.set_name(test_util::kTestModelName); - model_spec.set_version_label(ServerCore::kStableVersionLabel); - ServableHandle servable_handle; - EXPECT_FALSE( - server_core->GetServableHandle(model_spec, &servable_handle) - .ok()); + const std::set aspired_versions = {test_util::kTestModelVersion, + test_util::kTestModelLargerVersion}; + const int64 bogus_version = 777; + for (const int64 aspired_version : aspired_versions) { + ASSERT_NE(bogus_version, aspired_version); + } + + // Wait until both aspired versions of the servable have been loaded. + for (const int64 aspired_version : aspired_versions) { + const auto servable_id = + ServableId{test_util::kTestModelName, aspired_version}; + test_util::WaitUntilServableManagerStateIsOneOf( + *server_core->servable_state_monitor(), servable_id, + {ServableState::ManagerState::kAvailable}); + } + + // Attempt to assign a label to a version that isn't one of the loaded ones. + ASSERT_EQ(1, two_version_config.model_config_list().config().size()); + ModelConfig* model_config = + two_version_config.mutable_model_config_list()->mutable_config(0); + (*model_config->mutable_version_labels())["nice try"] = bogus_version; + Status status = server_core->ReloadConfig(two_version_config); + ASSERT_FALSE(status.ok()); + EXPECT_THAT(status.ToString(), + ::testing::HasSubstr("not currently available for inference")); +} + +TEST_P(ServerCoreTest, VersionLabelsNotAllowed) { + ServerCore::Options server_core_options = GetDefaultOptions(); + server_core_options.allow_version_labels = false; + ModelServerConfig config = GetTestModelServerConfigForFakePlatform(); + std::unique_ptr server_core; + TF_ASSERT_OK( + CreateServerCore(config, std::move(server_core_options), &server_core)); + const auto servable_id = + ServableId{test_util::kTestModelName, test_util::kTestModelVersion}; + test_util::WaitUntilServableManagerStateIsOneOf( + *server_core->servable_state_monitor(), servable_id, + {ServableState::ManagerState::kAvailable}); + + ASSERT_EQ(1, config.model_config_list().config().size()); + ModelConfig* model_config = + config.mutable_model_config_list()->mutable_config(0); + (*model_config->mutable_version_labels())["A"] = test_util::kTestModelVersion; + Status status = server_core->ReloadConfig(config); + ASSERT_FALSE(status.ok()); + EXPECT_THAT( + status.ToString(), + ::testing::HasSubstr("Model version labels are not currently allowed")); } INSTANTIATE_TEST_CASE_P( From 4ed43bda9ad750ab6924fdcaa10e2190c608a9b8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 19 Sep 2018 08:02:17 -0700 Subject: [PATCH 1130/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213628001 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b28a2f4dbb5..9f867feb4c2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "93ea613b8bd48d5ec9bb09d7c469555a45011b6d1f063a51fbf94ea4a60bfc54", - git_commit = "22ff5db5d4a86c155e56ec1bdf36de503109abbe", + sha256 = "8f3a88fa61ad71dad00aca3e05262cfde2a5313353eb496ac7779a23639a2fff", + git_commit = "e1db78697b05be673562fe2b1c9a995d25a71d4c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fe9ec7d1b9096a98ec89f49d24dfd51b57f713d4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 19 Sep 2018 09:11:33 -0700 Subject: [PATCH 1131/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213638073 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9f867feb4c2..0518ecb73c2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8f3a88fa61ad71dad00aca3e05262cfde2a5313353eb496ac7779a23639a2fff", - git_commit = "e1db78697b05be673562fe2b1c9a995d25a71d4c", + sha256 = "28d7acb2527a1977a4a3e3488b90e17272f9066052e9237c8c0b70456d031b38", + git_commit = "42832c2d44ae1845354afed2c22841555645ebe8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From bec76d47a337ee6865ce0b4fcc9e97d5ab67b38f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 19 Sep 2018 10:01:40 -0700 Subject: [PATCH 1132/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213645346 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0518ecb73c2..6d1f71e8984 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "28d7acb2527a1977a4a3e3488b90e17272f9066052e9237c8c0b70456d031b38", - git_commit = "42832c2d44ae1845354afed2c22841555645ebe8", + sha256 = "7c6a3c1b2d57fada3b34360fda8315cbbe606b4ba7d241ec0ef4718a3839b36c", + git_commit = "e8cb8f2ae3122191418c07fd306d3494dcd0d582", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 64469a0da89e314680509df21eb8b2f7efd91060 Mon Sep 17 00:00:00 2001 From: Yu Zheng Date: Wed, 19 Sep 2018 13:24:26 -0400 Subject: [PATCH 1133/8103] add flags to config max_num_load_retries and load_retry_interval_micros --- tensorflow_serving/model_servers/main.cc | 10 ++++++++++ tensorflow_serving/model_servers/server.cc | 2 ++ tensorflow_serving/model_servers/server.h | 2 ++ tensorflow_serving/model_servers/server_core.cc | 1 + tensorflow_serving/model_servers/server_core.h | 7 +++++++ 5 files changed, 22 insertions(+) diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index 4ba9e2c05e3..2a9d00a85cc 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -88,6 +88,16 @@ int main(int argc, char** argv) { tensorflow::Flag("model_base_path", &options.model_base_path, "path to export (ignored if --model_config_file flag " "is set, otherwise required)"), + tensorflow::Flag("max_num_load_retries", &options.max_num_load_retries, + "maximum number of times it retries loading a model " + "after the first failure, before giving up. " + "If set to 0, a load is attempted only once. " + "Default: 5"), + tensorflow::Flag("load_retry_interval_micros", + &options.load_retry_interval_micros, + "The interval, in microseconds, between each servable " + "load retry. If set negative, it doesn't wait. " + "Default: 1 minute"), tensorflow::Flag("file_system_poll_wait_seconds", &options.file_system_poll_wait_seconds, "interval in seconds between each poll of the file " diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index 92178d55255..887e248aee3 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -244,6 +244,8 @@ Status Server::BuildAndStart(const Options& server_options) { options.custom_model_config_loader = &LoadCustomModelConfig; options.aspired_version_policy = std::unique_ptr(new AvailabilityPreservingPolicy); + options.max_num_load_retries = server_options.max_num_load_retries; + options.load_retry_interval_micros = server_options.load_retry_interval_micros; options.file_system_poll_wait_seconds = server_options.file_system_poll_wait_seconds; options.flush_filesystem_caches = server_options.flush_filesystem_caches; diff --git a/tensorflow_serving/model_servers/server.h b/tensorflow_serving/model_servers/server.h index eae27d6a978..5b01ffa9346 100644 --- a/tensorflow_serving/model_servers/server.h +++ b/tensorflow_serving/model_servers/server.h @@ -54,6 +54,8 @@ class Server { float per_process_gpu_memory_fraction = 0; tensorflow::string batching_parameters_file; tensorflow::string model_name; + tensorflow::int32 max_num_load_retries = 5; + tensorflow::int64 load_retry_interval_micros = 1LL * 60 * 1000 * 1000; tensorflow::int32 file_system_poll_wait_seconds = 1; bool flush_filesystem_caches = true; tensorflow::string model_base_path; diff --git a/tensorflow_serving/model_servers/server_core.cc b/tensorflow_serving/model_servers/server_core.cc index 94f90387cf0..069c308062c 100644 --- a/tensorflow_serving/model_servers/server_core.cc +++ b/tensorflow_serving/model_servers/server_core.cc @@ -658,6 +658,7 @@ Status ServerCore::CreateAspiredVersionsManager( manager_options.num_load_threads = options_.num_load_threads; manager_options.num_unload_threads = options_.num_unload_threads; manager_options.max_num_load_retries = options_.max_num_load_retries; + manager_options.load_retry_interval_micros = options_.load_retry_interval_micros; manager_options.pre_load_hook = std::move(options_.pre_load_hook); manager_options.flush_filesystem_caches = options_.flush_filesystem_caches; const tensorflow::Status status = diff --git a/tensorflow_serving/model_servers/server_core.h b/tensorflow_serving/model_servers/server_core.h index 027b8023394..8120dd8f9d3 100644 --- a/tensorflow_serving/model_servers/server_core.h +++ b/tensorflow_serving/model_servers/server_core.h @@ -113,8 +113,15 @@ class ServerCore : public Manager { // Maximum number of times we retry loading a model, after the first // failure, before we give up. + // + // If set to 0, a load is attempted only once. int32 max_num_load_retries = 5; + // The interval, in microseconds, between each servable load retry. If set + // negative, we don't wait. + // Default: 1 minute. + int64 load_retry_interval_micros = 1LL * 60 * 1000 * 1000; + // Time interval between file-system polls, in seconds. int32 file_system_poll_wait_seconds = 30; From fff4bc8838e614bb90d3aa63e0fabd30efc6d71a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 19 Sep 2018 11:01:45 -0700 Subject: [PATCH 1134/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213656766 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6d1f71e8984..29e905cc35a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7c6a3c1b2d57fada3b34360fda8315cbbe606b4ba7d241ec0ef4718a3839b36c", - git_commit = "e8cb8f2ae3122191418c07fd306d3494dcd0d582", + sha256 = "f3fa34f3971aa7dd101b746d3ef48b365d46266b1a472acdcd1fc116212bd252", + git_commit = "1d2e3ba88d56c0e76487042365c07a52eaa94424", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fd0a3d0bd8d0adc7ce2e52268d11189c4be126fc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 19 Sep 2018 12:06:04 -0700 Subject: [PATCH 1135/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213669944 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 29e905cc35a..d09d3b5501c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f3fa34f3971aa7dd101b746d3ef48b365d46266b1a472acdcd1fc116212bd252", - git_commit = "1d2e3ba88d56c0e76487042365c07a52eaa94424", + sha256 = "9516513c4f2de4c13ba048cd0d9d1e62b4e604bfdcff6808883495dab048b1f6", + git_commit = "1b4999df0c2ef3c8c7d771415924fb58a5476c6a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1277991345f2144f194c6d5b87dc862a02068c5d Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Wed, 19 Sep 2018 12:44:15 -0700 Subject: [PATCH 1136/8103] Install TF Serving API in development Docker images PiperOrigin-RevId: 213676487 --- tensorflow_serving/tools/docker/Dockerfile.devel | 15 ++++++++++++++- .../tools/docker/Dockerfile.devel-gpu | 15 ++++++++++++++- .../tools/pip_package/build_pip_package.sh | 5 +++-- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index f8ee65082c6..ebc8a9c180c 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -91,7 +91,20 @@ RUN bazel build --color=yes --curses=yes \ --output_filter=DONT_MATCH_ANYTHING \ ${TF_SERVING_BUILD_OPTIONS} \ tensorflow_serving/model_servers:tensorflow_model_server && \ - cp bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server /usr/local/bin/ + cp bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server \ + /usr/local/bin/ + +# Build and install TensorFlow Serving API +RUN bazel build --color=yes --curses=yes \ + ${TF_SERVING_BAZEL_OPTIONS} \ + --verbose_failures \ + --output_filter=DONT_MATCH_ANYTHING \ + ${TF_SERVING_BUILD_OPTIONS} \ + tensorflow_serving/tools/pip_package:build_pip_package && \ + bazel-bin/tensorflow_serving/tools/pip_package/build_pip_package \ + /tmp/pip && \ + pip --no-cache-dir install --upgrade /tmp/pip/tensorflow_serving*.whl && \ + rm -rf /tmp/pip FROM binary_build as clean_build # Clean up Bazel cache when done. diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 29c58decccb..463e5e260ac 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -140,9 +140,22 @@ RUN ln -s /usr/local/cuda/lib64/stubs/libcuda.so /usr/local/cuda/lib64/stubs/lib --output_filter=DONT_MATCH_ANYTHING \ ${TF_SERVING_BUILD_OPTIONS} \ tensorflow_serving/model_servers:tensorflow_model_server && \ - cp bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server /usr/local/bin/ && \ + cp bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server \ + /usr/local/bin/ && \ rm /usr/local/cuda/lib64/stubs/libcuda.so.1 +# Build and install TensorFlow Serving API +RUN bazel build --color=yes --curses=yes \ + ${TF_SERVING_BAZEL_OPTIONS} \ + --verbose_failures \ + --output_filter=DONT_MATCH_ANYTHING \ + ${TF_SERVING_BUILD_OPTIONS} \ + tensorflow_serving/tools/pip_package:build_pip_package && \ + bazel-bin/tensorflow_serving/tools/pip_package/build_pip_package \ + /tmp/pip && \ + pip --no-cache-dir install --upgrade /tmp/pip/tensorflow_serving*.whl && \ + rm -rf /tmp/pip + FROM binary_build as clean_build # Clean up Bazel cache when done. RUN bazel clean --expunge --color=yes && \ diff --git a/tensorflow_serving/tools/pip_package/build_pip_package.sh b/tensorflow_serving/tools/pip_package/build_pip_package.sh index 48d9e1184ce..5ddfe37756e 100755 --- a/tensorflow_serving/tools/pip_package/build_pip_package.sh +++ b/tensorflow_serving/tools/pip_package/build_pip_package.sh @@ -28,6 +28,7 @@ function main() { exit 1 fi + local BAZEL_PROJECT_DIR="bazel-${PWD##*/}" DEST="$1" TMPDIR="$(mktemp -d)" local PIP_SRC_DIR="tensorflow_serving/tools/pip_package" @@ -43,10 +44,10 @@ function main() { cp bazel-genfiles/tensorflow_serving/apis/*_pb2.py \ "${TMPDIR}/tensorflow_serving/apis" - cp bazel-serving/tensorflow_serving/apis/*_pb2.py \ + cp ${BAZEL_PROJECT_DIR}/tensorflow_serving/apis/*_pb2.py \ "${TMPDIR}/tensorflow_serving/apis" - cp bazel-serving/tensorflow_serving/apis/*_grpc.py \ + cp ${BAZEL_PROJECT_DIR}/tensorflow_serving/apis/*_grpc.py \ "${TMPDIR}/tensorflow_serving/apis" cp bazel-genfiles/tensorflow_serving/config/*_pb2.py \ From a5b895f7f445ff17318557f34ca7444596c5d137 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 19 Sep 2018 13:03:52 -0700 Subject: [PATCH 1137/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213679648 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d09d3b5501c..66f75a391a5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9516513c4f2de4c13ba048cd0d9d1e62b4e604bfdcff6808883495dab048b1f6", - git_commit = "1b4999df0c2ef3c8c7d771415924fb58a5476c6a", + sha256 = "c0b01d38e1d1015b8f7159cb7d7309cef8a990c78857fb27f0341840dd546cfb", + git_commit = "238424ffcf04c38561ed48ebadb16b3b3a770e2e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 31126fb78b6dfc27891b26698d203c6797de38e3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 19 Sep 2018 14:01:26 -0700 Subject: [PATCH 1138/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213690057 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 66f75a391a5..9bc12c1708e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c0b01d38e1d1015b8f7159cb7d7309cef8a990c78857fb27f0341840dd546cfb", - git_commit = "238424ffcf04c38561ed48ebadb16b3b3a770e2e", + sha256 = "c91ddc2e6448bde1ab1a5b57cb1dafebace8e0bebf4d7df214b05c1dc1ad0b0b", + git_commit = "ff11877b101fe9c19021e8d7b43841031eb71cc3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2ef0ffd305899b62e334353a7c4837dac1950912 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 19 Sep 2018 16:01:12 -0700 Subject: [PATCH 1139/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213713754 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9bc12c1708e..eeb28f4eef9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c91ddc2e6448bde1ab1a5b57cb1dafebace8e0bebf4d7df214b05c1dc1ad0b0b", - git_commit = "ff11877b101fe9c19021e8d7b43841031eb71cc3", + sha256 = "c36e8a33f7c7f239e62835503a96dd1e002fba2623a1a6af9f9d8867bd8b226a", + git_commit = "c3014ec19e23e4aad7286b3fac6b25a5fb4a6326", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 08e595fc79844884f2d2b43a75582f3be895248b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 19 Sep 2018 18:01:37 -0700 Subject: [PATCH 1140/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213732398 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index eeb28f4eef9..8d97a2486e0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c36e8a33f7c7f239e62835503a96dd1e002fba2623a1a6af9f9d8867bd8b226a", - git_commit = "c3014ec19e23e4aad7286b3fac6b25a5fb4a6326", + sha256 = "b69b43751bc88a67a3b9714aa634bed4a76bc1ebf189dc9a92a8a5722feed808", + git_commit = "1d78936a3989f6ee5a9945746cd329c37e82287c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 93163d2f4caa8c164f8be2b62ced1f4ec808d907 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 19 Sep 2018 19:03:02 -0700 Subject: [PATCH 1141/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213738578 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8d97a2486e0..80706c185f1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b69b43751bc88a67a3b9714aa634bed4a76bc1ebf189dc9a92a8a5722feed808", - git_commit = "1d78936a3989f6ee5a9945746cd329c37e82287c", + sha256 = "58275be03964c455ba4ef5938bb5b0434b195e5076a861587d8232b6cfeb07a2", + git_commit = "415455b0ef2d65504ab8c9084a6daa2899521212", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 79f4569ddc112bfa96fe56faf2ba1fd5221177e1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 19 Sep 2018 20:02:21 -0700 Subject: [PATCH 1142/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213742702 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 80706c185f1..e3b068c9b37 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "58275be03964c455ba4ef5938bb5b0434b195e5076a861587d8232b6cfeb07a2", - git_commit = "415455b0ef2d65504ab8c9084a6daa2899521212", + sha256 = "0f8c1e748e5a510d20157b711016e7a2905671d16d1188aeccd45fdfc7089f6c", + git_commit = "3cd7354b6e82650ae4977fcb08d0e4f7ac9b4589", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 313d6eda7725afbdf2a0a9cd0630d3ef790dd172 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 19 Sep 2018 23:02:58 -0700 Subject: [PATCH 1143/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213756040 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e3b068c9b37..febdcb124a8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0f8c1e748e5a510d20157b711016e7a2905671d16d1188aeccd45fdfc7089f6c", - git_commit = "3cd7354b6e82650ae4977fcb08d0e4f7ac9b4589", + sha256 = "95f21d609eaa3e1f224a242e092bb3ff042ac6f8ffb63664135d841a35d18559", + git_commit = "62e41201e291b241bfad0b902ab6aa785ee06059", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6fc19d0b29d162b33cbd2e3fe6cd83a562103390 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Sep 2018 00:00:53 -0700 Subject: [PATCH 1144/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213759579 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index febdcb124a8..97e40984b0a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "95f21d609eaa3e1f224a242e092bb3ff042ac6f8ffb63664135d841a35d18559", - git_commit = "62e41201e291b241bfad0b902ab6aa785ee06059", + sha256 = "807fd3fd1f01c0627bbbf122b333e19351d9cac31bb1291b0e1d34f957f24fe7", + git_commit = "fcfc5ad738b1521aa70aaad323079eb72493dcad", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 317ebe9009268977260ed925df6e026b4b024147 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Sep 2018 01:02:47 -0700 Subject: [PATCH 1145/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213765784 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 97e40984b0a..b4893f4ff85 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "807fd3fd1f01c0627bbbf122b333e19351d9cac31bb1291b0e1d34f957f24fe7", - git_commit = "fcfc5ad738b1521aa70aaad323079eb72493dcad", + sha256 = "0f4b8375de30c54cc3233bc40e04742dab0ffe007acf8391651c6adb62be89f8", + git_commit = "2ea398b12ed18b6c51e09f363021c6aa306c5179", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3e459e3374c086ad71dfec8fecb36daf18f671f3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Sep 2018 03:02:02 -0700 Subject: [PATCH 1146/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213780246 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b4893f4ff85..50fbde6523a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0f4b8375de30c54cc3233bc40e04742dab0ffe007acf8391651c6adb62be89f8", - git_commit = "2ea398b12ed18b6c51e09f363021c6aa306c5179", + sha256 = "fcf3675590251e5603dead16541e6c1cbb371fed4dd253a6548d4cb01c311915", + git_commit = "a54310b1faa39df94dcef9ad1b5aaa0acc691e35", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 69864b5e6cd246b57816fd39a23bb1bcb83e9fa6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Sep 2018 04:01:32 -0700 Subject: [PATCH 1147/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213786615 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 50fbde6523a..563d7c1e208 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fcf3675590251e5603dead16541e6c1cbb371fed4dd253a6548d4cb01c311915", - git_commit = "a54310b1faa39df94dcef9ad1b5aaa0acc691e35", + sha256 = "feb2a209eabbe0f6b2322c5b136a0af8ad3b8d01723f03ae991a247137236abd", + git_commit = "9604413da7a27f5718bb88d407d13476dbef5b82", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2be55978bc023b3f9dc52af629a911abe641e251 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Sep 2018 05:01:45 -0700 Subject: [PATCH 1148/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213791735 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 563d7c1e208..a0c89b38a84 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "feb2a209eabbe0f6b2322c5b136a0af8ad3b8d01723f03ae991a247137236abd", - git_commit = "9604413da7a27f5718bb88d407d13476dbef5b82", + sha256 = "a6674d8c73b88131c6d0807509297b72124154a10bd8e140c63d95365b6a4744", + git_commit = "90d084e0c42232043c186e66093b67800fb30fba", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0acb3cc4b4ad0678d5a4d71236527698e8bdbddc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Sep 2018 08:01:06 -0700 Subject: [PATCH 1149/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213813191 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a0c89b38a84..db43854b342 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a6674d8c73b88131c6d0807509297b72124154a10bd8e140c63d95365b6a4744", - git_commit = "90d084e0c42232043c186e66093b67800fb30fba", + sha256 = "6c477fc981bc9fdf842f4c35969f78bddb121fb54bf37ed989aa077665791a6f", + git_commit = "32047f490d0892056ae4e0214d2f049887fdcf35", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ee7fb8d21a62fa1afeb87cfd6974574118478ee4 Mon Sep 17 00:00:00 2001 From: Yu Zheng Date: Thu, 20 Sep 2018 12:03:33 -0400 Subject: [PATCH 1150/8103] fix wrong path in docker readme --- tensorflow_serving/g3doc/docker.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tensorflow_serving/g3doc/docker.md b/tensorflow_serving/g3doc/docker.md index d681334193d..7190bfebe47 100644 --- a/tensorflow_serving/g3doc/docker.md +++ b/tensorflow_serving/g3doc/docker.md @@ -447,14 +447,14 @@ To create a serving image that's fully optimized for your host, simply: ```shell docker build --pull -t $USER/tensorflow-serving-devel \ - -f tools/docker/Dockerfile.devel . + -f tensorflow_serving/tools/docker/Dockerfile.devel . ``` * For GPU: ` ```shell docker build --pull -t $USER/tensorflow-serving-devel-gpu \ - -f tools/docker/Dockerfile.devel-gpu . + -f tensorflow_serving/tools/docker/Dockerfile.devel-gpu . ``` 3. Build a serving image with the development image as a base @@ -464,7 +464,7 @@ To create a serving image that's fully optimized for your host, simply: ```shell docker build -t $USER/tensorflow-serving \ --build-arg TF_SERVING_BUILD_IMAGE=$USER/tensorflow-serving-devel \ - -f tools/docker/Dockerfile . + -f tensorflow_serving/tools/docker/Dockerfile . ``` Your new optimized Docker image is now `$USER/tensorflow-serving`, which @@ -476,7 +476,7 @@ To create a serving image that's fully optimized for your host, simply: ```shell docker build -t $USER/tensorflow-serving-gpu \ --build-arg TF_SERVING_BUILD_IMAGE=$USER/tensorflow-serving-devel-gpu \ - -f tools/docker/Dockerfile.gpu . + -f tensorflow_serving/tools/docker/Dockerfile.gpu . ``` Your new optimized Docker image is now `$USER/tensorflow-serving-gpu`, From 74fcda45f33e5e1240324e0b7de4be1d7eb14411 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Sep 2018 11:04:56 -0700 Subject: [PATCH 1151/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213845653 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index db43854b342..64e8cce17fd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6c477fc981bc9fdf842f4c35969f78bddb121fb54bf37ed989aa077665791a6f", - git_commit = "32047f490d0892056ae4e0214d2f049887fdcf35", + sha256 = "452ed50b7f8698d35dec86c357d6ffdf05f5ca7b9a12a8653c67113c9d73223e", + git_commit = "06ad4ad47bef99d4a8f6856bbb121387e8edcfa5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 46bf0ad225b9c915ae27fcd87d9d1b679b64e67e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Sep 2018 12:03:58 -0700 Subject: [PATCH 1152/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213857783 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 64e8cce17fd..77d85e25605 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "452ed50b7f8698d35dec86c357d6ffdf05f5ca7b9a12a8653c67113c9d73223e", - git_commit = "06ad4ad47bef99d4a8f6856bbb121387e8edcfa5", + sha256 = "e7f64e2b8aab2022f2e3e8868a7b4773a89c9ee89cc532c1c76ba94ad2740872", + git_commit = "6b7c84006a73688adf4b8d34ee4afb4921548bc7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4ed48e574291231d011770919c44d102def0c4ad Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Sep 2018 13:01:24 -0700 Subject: [PATCH 1153/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213866960 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 77d85e25605..dd9b887a348 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e7f64e2b8aab2022f2e3e8868a7b4773a89c9ee89cc532c1c76ba94ad2740872", - git_commit = "6b7c84006a73688adf4b8d34ee4afb4921548bc7", + sha256 = "c6c62655aca9dc721b254ac1bd1fc8ebfcc1b18aae915b855fc27b8ce5f0dc01", + git_commit = "30756301bee0de2b1c16a74a710bd7bf29be468d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2cdba4d5933b0596b81c02d9a4b9988fcb569389 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Sep 2018 15:04:39 -0700 Subject: [PATCH 1154/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213889307 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dd9b887a348..b0199a88e6d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c6c62655aca9dc721b254ac1bd1fc8ebfcc1b18aae915b855fc27b8ce5f0dc01", - git_commit = "30756301bee0de2b1c16a74a710bd7bf29be468d", + sha256 = "33dc769b05fe583f6b56ff9a1d3c106b3db7d80c9c52b0d797f9f0456b67c64c", + git_commit = "17dbe77f5ad47e8fd71924f12b3bc53c05afbacf", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6f4ecadd975f5b4e67c66516ffb3e190593555fe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Sep 2018 16:06:33 -0700 Subject: [PATCH 1155/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213900572 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b0199a88e6d..a7570962c65 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "33dc769b05fe583f6b56ff9a1d3c106b3db7d80c9c52b0d797f9f0456b67c64c", - git_commit = "17dbe77f5ad47e8fd71924f12b3bc53c05afbacf", + sha256 = "4da0e431c97d61d5656784ec31220f5c7ba32ca0057cacef41612021502609e2", + git_commit = "424f0556ad8acde8f912a67e46421957a71dcef2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b4800b664656e304f783eb62f6c1fb7ab317ed7a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Sep 2018 17:04:15 -0700 Subject: [PATCH 1156/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213910059 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a7570962c65..eb4fee9b415 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4da0e431c97d61d5656784ec31220f5c7ba32ca0057cacef41612021502609e2", - git_commit = "424f0556ad8acde8f912a67e46421957a71dcef2", + sha256 = "6d27aca4831bea05cbdf4b2813f01b7f0f8f4a843c9f0b053e69acadf6f7ac3f", + git_commit = "23a88ec5e913ba7086a9aef57875447ccf96e4b5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 572ac081f8c689d8f414eb67109134108aed5045 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Sep 2018 18:03:15 -0700 Subject: [PATCH 1157/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213917356 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index eb4fee9b415..292dc8d2f09 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6d27aca4831bea05cbdf4b2813f01b7f0f8f4a843c9f0b053e69acadf6f7ac3f", - git_commit = "23a88ec5e913ba7086a9aef57875447ccf96e4b5", + sha256 = "6f2ec9dc4bb4ccad4e113a89deb8064577ef2a54e5a6fcb9667bb03fa91f2918", + git_commit = "863b3bd6bb2214065f95fa20f551a8fc8568e55d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 710baa83f920bdb34fdfae192abdeecf15815d15 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Sep 2018 21:04:10 -0700 Subject: [PATCH 1158/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213932120 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 292dc8d2f09..eafce51dbb1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6f2ec9dc4bb4ccad4e113a89deb8064577ef2a54e5a6fcb9667bb03fa91f2918", - git_commit = "863b3bd6bb2214065f95fa20f551a8fc8568e55d", + sha256 = "928006ba0861866fbd383c1512c3b7a4c07445a3399c3f7340ffe1081609233c", + git_commit = "f283f3ac5d7b6de8cadc9c1cee6886b187319afd", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9a2f7dba18e712cc178fa7ae8288af2ae27d4fb6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Sep 2018 22:02:16 -0700 Subject: [PATCH 1159/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213936351 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index eafce51dbb1..22f886a447e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "928006ba0861866fbd383c1512c3b7a4c07445a3399c3f7340ffe1081609233c", - git_commit = "f283f3ac5d7b6de8cadc9c1cee6886b187319afd", + sha256 = "210586753d358ceeef880333fa18f1c482d92132b3dfecc4ec41195354cf1a8a", + git_commit = "f10b00558de87020554c9c0512537dab96dba918", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 55d800aaf201298d939a67cc54153b867954d207 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 21 Sep 2018 00:02:48 -0700 Subject: [PATCH 1160/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213944347 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 22f886a447e..5ec4466128c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "210586753d358ceeef880333fa18f1c482d92132b3dfecc4ec41195354cf1a8a", - git_commit = "f10b00558de87020554c9c0512537dab96dba918", + sha256 = "cba629bee118ceb6e7e4b328cdd2a663de2b9e7e5a8a85dac4f6fb8570ddc36b", + git_commit = "23552a8b2f2a92a31710b9339e6ade514ac25996", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 86b13e7e089a7602f156a27d9dbd4f3502d06d65 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 21 Sep 2018 01:02:01 -0700 Subject: [PATCH 1161/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213949132 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5ec4466128c..63bd198476a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cba629bee118ceb6e7e4b328cdd2a663de2b9e7e5a8a85dac4f6fb8570ddc36b", - git_commit = "23552a8b2f2a92a31710b9339e6ade514ac25996", + sha256 = "7ca427055ea8fb933b3a6f36a3535484c7c28de5ce11d9bbf62c0076d96107c6", + git_commit = "2952f5134905af795ba90ae1eb97e39091ba9843", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1c1ec880c682b2534dc6ceea0910d254fe354c8b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 21 Sep 2018 02:01:25 -0700 Subject: [PATCH 1162/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213954590 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 63bd198476a..068e152567d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7ca427055ea8fb933b3a6f36a3535484c7c28de5ce11d9bbf62c0076d96107c6", - git_commit = "2952f5134905af795ba90ae1eb97e39091ba9843", + sha256 = "3fe621e2061e37aabcf0f2a4aa4b7ee4b137598712630c6e104708ae5f0355c9", + git_commit = "04d86e99547f21947ca7a88f32fa2a0449ba4a5e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f1f85df52681664f6e38b4a361d2393ee9342ef3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 21 Sep 2018 03:03:03 -0700 Subject: [PATCH 1163/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213960229 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 068e152567d..6e38ccea5e2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3fe621e2061e37aabcf0f2a4aa4b7ee4b137598712630c6e104708ae5f0355c9", - git_commit = "04d86e99547f21947ca7a88f32fa2a0449ba4a5e", + sha256 = "060d0dc057b0e7c3e580b756a532c51ef7704a4b35b2e1951eca8a167facf88d", + git_commit = "287c73d3ff1df0b064d9028ad0fa59242a18a077", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f5416f1a68b560f546a81d9f5f40a150f7100274 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 21 Sep 2018 04:02:58 -0700 Subject: [PATCH 1164/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213964447 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6e38ccea5e2..a50610478b5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "060d0dc057b0e7c3e580b756a532c51ef7704a4b35b2e1951eca8a167facf88d", - git_commit = "287c73d3ff1df0b064d9028ad0fa59242a18a077", + sha256 = "2f746fd84e9c7b6cf03557a2cea04b1c6acb6f5b98f287ccdd026ee2e4e79687", + git_commit = "d1e9a1ed54cae9b0b10ab89c06d6d7f9b53af3a1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d36ec5f7ab5754b2349aed387d82587296bd8ad9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 21 Sep 2018 05:02:33 -0700 Subject: [PATCH 1165/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 213969695 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a50610478b5..189c1e35b14 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2f746fd84e9c7b6cf03557a2cea04b1c6acb6f5b98f287ccdd026ee2e4e79687", - git_commit = "d1e9a1ed54cae9b0b10ab89c06d6d7f9b53af3a1", + sha256 = "f84e386860dbac0642c360339ea26f5b2ff3ad14cee978ea4f827976671b89b9", + git_commit = "200b89761a4665e3de6d0efc4e3e10ab287ad81b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1d4f8d4ab697e8d782237495d8a0471138882206 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 21 Sep 2018 11:02:17 -0700 Subject: [PATCH 1166/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214011922 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 189c1e35b14..0ba57fe70fb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f84e386860dbac0642c360339ea26f5b2ff3ad14cee978ea4f827976671b89b9", - git_commit = "200b89761a4665e3de6d0efc4e3e10ab287ad81b", + sha256 = "3a983bfad53937da7f7fd79c38419c3ed7a663034c91fe32e2f5886287caae8b", + git_commit = "035a84769de2921667677b5530011bbd558ddf0c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ff8713643093f10b34e3fa6df0a6fca3f9ab50c1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 21 Sep 2018 11:52:07 -0700 Subject: [PATCH 1167/8103] Add --fail_if_no_model_versions_found option in ServerCore (default false) that, if set, will fail FileSystemStoragePathSource::Create() and ::UpdateConfig() if, for any servables, file system doesn't contain at least one version at base file path. PiperOrigin-RevId: 214020985 --- tensorflow_serving/model_servers/server_core.cc | 2 ++ tensorflow_serving/model_servers/server_core.h | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/tensorflow_serving/model_servers/server_core.cc b/tensorflow_serving/model_servers/server_core.cc index 7de5114b54c..9c8848f3a32 100644 --- a/tensorflow_serving/model_servers/server_core.cc +++ b/tensorflow_serving/model_servers/server_core.cc @@ -552,6 +552,8 @@ FileSystemStoragePathSourceConfig ServerCore::CreateStoragePathSourceConfig( FileSystemStoragePathSourceConfig source_config; source_config.set_file_system_poll_wait_seconds( options_.file_system_poll_wait_seconds); + source_config.set_fail_if_zero_versions_at_startup( + options_.fail_if_no_model_versions_found); for (const auto& model : config.model_config_list().config()) { LOG(INFO) << " (Re-)adding model: " << model.name(); FileSystemStoragePathSourceConfig::ServableToMonitor* servable = diff --git a/tensorflow_serving/model_servers/server_core.h b/tensorflow_serving/model_servers/server_core.h index 05b3275fb58..4e97184f130 100644 --- a/tensorflow_serving/model_servers/server_core.h +++ b/tensorflow_serving/model_servers/server_core.h @@ -144,6 +144,11 @@ class ServerCore : public Manager { // field. bool allow_version_labels = true; + // If set to true, the server will fail to start up (or fail a config + // reload) if, for any configured model, no versions of the model are found + // in the file system under the model's base path. + bool fail_if_no_model_versions_found = false; + // Logger used for logging requests hitting the server. std::unique_ptr server_request_logger; From 8bd6441dda3861741b45d62fef313f4c8c81c2ca Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 21 Sep 2018 12:01:34 -0700 Subject: [PATCH 1168/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214022411 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0ba57fe70fb..443c2a685a6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3a983bfad53937da7f7fd79c38419c3ed7a663034c91fe32e2f5886287caae8b", - git_commit = "035a84769de2921667677b5530011bbd558ddf0c", + sha256 = "690bac3a928401f7d8477fbd82c2f2cea62530af44fa8c28fa942c64f6112207", + git_commit = "010e8ed731d0e10c82fccbf6c119180ca1a36efd", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 948f3b9fac0351006d073011f5f6f35d4a60e482 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 21 Sep 2018 13:01:42 -0700 Subject: [PATCH 1169/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214031288 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 443c2a685a6..d55b9c7b9e5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "690bac3a928401f7d8477fbd82c2f2cea62530af44fa8c28fa942c64f6112207", - git_commit = "010e8ed731d0e10c82fccbf6c119180ca1a36efd", + sha256 = "9097ca1e4c28c5dc6a307cd57dd6e481f5866f251bad498fdae225738112d890", + git_commit = "61a9623ac31fd363aff8537df6c3b6073d721425", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From bc7d560e4fd170f195dfb6e9351f6dda14727d79 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 21 Sep 2018 14:01:49 -0700 Subject: [PATCH 1170/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214040081 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d55b9c7b9e5..2406ad86967 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9097ca1e4c28c5dc6a307cd57dd6e481f5866f251bad498fdae225738112d890", - git_commit = "61a9623ac31fd363aff8537df6c3b6073d721425", + sha256 = "0882fdf35651e1df35c6eca13372648ffe137b544eb2bbcfd963fb73a7301be7", + git_commit = "ef630974578b2c1185d4c3848836839d91cb3963", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5f6f2f6c52941673d962f02824ba114bc1a93f9d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 21 Sep 2018 15:01:52 -0700 Subject: [PATCH 1171/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214049766 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2406ad86967..b85848418fc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0882fdf35651e1df35c6eca13372648ffe137b544eb2bbcfd963fb73a7301be7", - git_commit = "ef630974578b2c1185d4c3848836839d91cb3963", + sha256 = "ad4208990fdf1c9e50b2a4bf092db65e7a2f0f49ccf47855a34e8b3b68e96af0", + git_commit = "f4de7ec889311c42b3af4d5f34f7d31f56f73177", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b9c904ce470fcc0bb4386e66ff1192a288766324 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 21 Sep 2018 16:03:30 -0700 Subject: [PATCH 1172/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214059033 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b85848418fc..e3e915731c6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ad4208990fdf1c9e50b2a4bf092db65e7a2f0f49ccf47855a34e8b3b68e96af0", - git_commit = "f4de7ec889311c42b3af4d5f34f7d31f56f73177", + sha256 = "9948fb1887ba78d125251e621f407df43f69ef00005c75f4b1935ee5c9063919", + git_commit = "08776e73286651617c0c07785ea1476bfabb962a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d966d7fc8211b2b71df7d8c5aac6713cd1525887 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 21 Sep 2018 17:02:43 -0700 Subject: [PATCH 1173/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214066822 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e3e915731c6..87a10a9824e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9948fb1887ba78d125251e621f407df43f69ef00005c75f4b1935ee5c9063919", - git_commit = "08776e73286651617c0c07785ea1476bfabb962a", + sha256 = "5a6c1070acedbb6a303eaacd84d13e6f38aa2d5c2b4e9fdc81c1f931fc214236", + git_commit = "e4e036fef21b933171ce382c36f6c730f8322219", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0e53d2195907d60c0ca3f347e250d31e1c83e816 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 21 Sep 2018 18:00:40 -0700 Subject: [PATCH 1174/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214072765 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 87a10a9824e..9971e947402 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5a6c1070acedbb6a303eaacd84d13e6f38aa2d5c2b4e9fdc81c1f931fc214236", - git_commit = "e4e036fef21b933171ce382c36f6c730f8322219", + sha256 = "a67029c4e82d99fb18ba944c11cf6af5a4ec70add4b39c5c8f96b7582d9cda01", + git_commit = "305a392904e6981e935c2a3514394379ba7083b1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2a08c4a950bacc5638ebd867e0ca7bb2f15beb6c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 21 Sep 2018 20:00:43 -0700 Subject: [PATCH 1175/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214080284 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9971e947402..fbec6a82845 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a67029c4e82d99fb18ba944c11cf6af5a4ec70add4b39c5c8f96b7582d9cda01", - git_commit = "305a392904e6981e935c2a3514394379ba7083b1", + sha256 = "589c3a6f1fa77eb238f346c21d79493fc6f075d85b09afae494d88605dda5e1c", + git_commit = "edbd1a9afc31c9a5127ba769db5e1df11249660a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7c67f60be11e6af862e67e6a35ef385694e79fc4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 22 Sep 2018 00:02:04 -0700 Subject: [PATCH 1176/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214092394 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fbec6a82845..6eaba79b65a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "589c3a6f1fa77eb238f346c21d79493fc6f075d85b09afae494d88605dda5e1c", - git_commit = "edbd1a9afc31c9a5127ba769db5e1df11249660a", + sha256 = "0ef7060194f0e671b872a527a929edd6cfff4dd8a2f882fcca4515f14051cb7e", + git_commit = "94b5ff16ce1530e09bc30c51709b0596ff61103f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f643c09eefd5f4aadc92f38af0dcb19cd2591b38 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 22 Sep 2018 01:02:18 -0700 Subject: [PATCH 1177/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214095595 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6eaba79b65a..170d7b38ede 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0ef7060194f0e671b872a527a929edd6cfff4dd8a2f882fcca4515f14051cb7e", - git_commit = "94b5ff16ce1530e09bc30c51709b0596ff61103f", + sha256 = "ead45cd5744091233c7a978d73a44f5d3b1f113f0648e90ad7c15ac3b6286f4c", + git_commit = "6bfb26e1a3dc6a381829e6e8759cf2d441260738", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From db0c621ed01bbef41ec3d582ee12e5099d621b1c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 22 Sep 2018 02:02:33 -0700 Subject: [PATCH 1178/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214099338 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 170d7b38ede..94f06df6cd8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ead45cd5744091233c7a978d73a44f5d3b1f113f0648e90ad7c15ac3b6286f4c", - git_commit = "6bfb26e1a3dc6a381829e6e8759cf2d441260738", + sha256 = "d68166ad57222ac60fb1b5948b408d7bbe147f918d2aa4a2e346e2af0807cce8", + git_commit = "c6df472e243d6e084dc000022857e08316430b16", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d55a50df1313e72b0ad608f6aedbdc5ba33fc516 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 22 Sep 2018 03:02:22 -0700 Subject: [PATCH 1179/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214103134 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 94f06df6cd8..3b88050c7d2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d68166ad57222ac60fb1b5948b408d7bbe147f918d2aa4a2e346e2af0807cce8", - git_commit = "c6df472e243d6e084dc000022857e08316430b16", + sha256 = "5b3df3d2e33bcb7c1c92ebb66f4a52b5fa8e49c3f6535a2800138b8633ca0049", + git_commit = "e317152dad1aa66bc493abc046a60dbbf650de92", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From acdcee631c155433044429aa74ec78867e984257 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 22 Sep 2018 06:01:52 -0700 Subject: [PATCH 1180/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214110003 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3b88050c7d2..deebc980bc2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5b3df3d2e33bcb7c1c92ebb66f4a52b5fa8e49c3f6535a2800138b8633ca0049", - git_commit = "e317152dad1aa66bc493abc046a60dbbf650de92", + sha256 = "90dd1360865c2085ac7e01daa3a228959a1cf4e07c9a496cd9c8ba1ef97a3edb", + git_commit = "ca552d54ac67be8837aeabdb43269846d9df4eb5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d776ad8d3b6325cb9ab78e0d799d1a2c575f751d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 22 Sep 2018 10:01:48 -0700 Subject: [PATCH 1181/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214119241 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index deebc980bc2..ecf02ddcc4f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "90dd1360865c2085ac7e01daa3a228959a1cf4e07c9a496cd9c8ba1ef97a3edb", - git_commit = "ca552d54ac67be8837aeabdb43269846d9df4eb5", + sha256 = "d693df53a8493bed1b4a84ba9b3f39104b65dffea03970c0f361449b4a3f2187", + git_commit = "e692dda4c8b199555e2fa32132a7784e0893c870", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5279346cc5e0df96c5cd4602e6b48e65d0187bf7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 22 Sep 2018 11:02:40 -0700 Subject: [PATCH 1182/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214121862 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ecf02ddcc4f..6915ff66154 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d693df53a8493bed1b4a84ba9b3f39104b65dffea03970c0f361449b4a3f2187", - git_commit = "e692dda4c8b199555e2fa32132a7784e0893c870", + sha256 = "da85e2f5f8ae42ba4d5e31a4aa6df26ebde941109f7499d2db1f6ca4e003823a", + git_commit = "1a8dd7910eedfea6ba1917c8055fcd7fed9b157e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e51621255df906bc55315b6e2e3566aad93e382a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 22 Sep 2018 12:02:00 -0700 Subject: [PATCH 1183/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214123887 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6915ff66154..bfa1309ea51 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "da85e2f5f8ae42ba4d5e31a4aa6df26ebde941109f7499d2db1f6ca4e003823a", - git_commit = "1a8dd7910eedfea6ba1917c8055fcd7fed9b157e", + sha256 = "9b4b4cb6e41a4a5d61a3e17981db8a8e948ef99cb4af6b198893501e72eb621f", + git_commit = "425e96f3ae4eb338268e3738260f9d79e4bdd893", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9e12557e52f2d0b031f87e7229ab97609d2ef070 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 22 Sep 2018 17:02:44 -0700 Subject: [PATCH 1184/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214135461 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bfa1309ea51..53dd9275d22 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9b4b4cb6e41a4a5d61a3e17981db8a8e948ef99cb4af6b198893501e72eb621f", - git_commit = "425e96f3ae4eb338268e3738260f9d79e4bdd893", + sha256 = "81fa76c58e0102ce84352b84ae4ed2243655c4596aa99c3d94ed86059fdafb3a", + git_commit = "3aa23d30c2e7a675cff8fd0a0ebe9d249dde70a4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 71fae823b407f63f24bee8e4a186012493b118f8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 23 Sep 2018 03:02:38 -0700 Subject: [PATCH 1185/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214160669 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 53dd9275d22..f1dce5c745e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "81fa76c58e0102ce84352b84ae4ed2243655c4596aa99c3d94ed86059fdafb3a", - git_commit = "3aa23d30c2e7a675cff8fd0a0ebe9d249dde70a4", + sha256 = "ccf13833bf9e15b440d581922c439d4354d9c81d50281fff2995978e80232717", + git_commit = "646b3c237deaddddd087d39ab57130b08375c4c7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From dcdee47e6884eae88539442015297af4b15a2b9c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 23 Sep 2018 10:02:10 -0700 Subject: [PATCH 1186/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214176759 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f1dce5c745e..ee7c4fecd7d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ccf13833bf9e15b440d581922c439d4354d9c81d50281fff2995978e80232717", - git_commit = "646b3c237deaddddd087d39ab57130b08375c4c7", + sha256 = "15156e4f1d08be558256da87c49c3948b717ec8fe6f5f495abc6c2d771134806", + git_commit = "fc0150a7730aa06b825a26e65dfca944609726e7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From cd85fee84d625df56ea109daeac2b850792af02a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 23 Sep 2018 11:02:24 -0700 Subject: [PATCH 1187/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214179071 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ee7c4fecd7d..9abb4192f1a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "15156e4f1d08be558256da87c49c3948b717ec8fe6f5f495abc6c2d771134806", - git_commit = "fc0150a7730aa06b825a26e65dfca944609726e7", + sha256 = "492b538e60c6e0c3e2089d655fb1044d33d740cacf556fdfb4352b20f17fee75", + git_commit = "bb5fbbcb663c795dd7fc16e43a0eaaae53231fd9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 21f0b807a12cfea7e3d013fa8ba4b0d59cb202bf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 23 Sep 2018 12:03:35 -0700 Subject: [PATCH 1188/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214181467 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9abb4192f1a..c69df0b0d41 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "492b538e60c6e0c3e2089d655fb1044d33d740cacf556fdfb4352b20f17fee75", - git_commit = "bb5fbbcb663c795dd7fc16e43a0eaaae53231fd9", + sha256 = "2f020326378e91141eab35b31e4261a1b17264a885f5d7be96e96c6b77ff8fdc", + git_commit = "2862f65fd6e6966ebf8af7cb4fa754b319202b0f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a2985cea3bf3812e9076b2c4ef67bd1b2df37ac2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 23 Sep 2018 18:01:12 -0700 Subject: [PATCH 1189/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214196735 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c69df0b0d41..8b84cabc056 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2f020326378e91141eab35b31e4261a1b17264a885f5d7be96e96c6b77ff8fdc", - git_commit = "2862f65fd6e6966ebf8af7cb4fa754b319202b0f", + sha256 = "ee236c357b6211fc1ebb9ed4c658d338b4a22c60b72a1aab301125024161e67a", + git_commit = "1f8db608007ae60f89bf38c4c6af98a0248f214e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 61ee70d203a0a4976e776fb0e634fc400f6f9c45 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 23 Sep 2018 19:01:21 -0700 Subject: [PATCH 1190/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214200780 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8b84cabc056..042c886d27e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ee236c357b6211fc1ebb9ed4c658d338b4a22c60b72a1aab301125024161e67a", - git_commit = "1f8db608007ae60f89bf38c4c6af98a0248f214e", + sha256 = "3699ed9b3689238d8a784fce3738a4c24fb7650e381af1ca84aa41df37ae3191", + git_commit = "fcd7840fbf49802be4bb7f67671465338b7b78a4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 30248e75390cd068af7af37d62ac158304436415 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 24 Sep 2018 00:02:11 -0700 Subject: [PATCH 1191/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214219418 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 042c886d27e..51b5eff2c68 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3699ed9b3689238d8a784fce3738a4c24fb7650e381af1ca84aa41df37ae3191", - git_commit = "fcd7840fbf49802be4bb7f67671465338b7b78a4", + sha256 = "e105c82dda425baa55c677e43b8887dcec26bdcc96ef6bb94a0429213b699ad3", + git_commit = "03f219c4dcd68127eb417358c9c7216d7a273418", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 03249546479b094915ea3ab3128355a65b6aa2ad Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 24 Sep 2018 01:01:25 -0700 Subject: [PATCH 1192/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214225072 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 51b5eff2c68..a78b3bfaf17 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e105c82dda425baa55c677e43b8887dcec26bdcc96ef6bb94a0429213b699ad3", - git_commit = "03f219c4dcd68127eb417358c9c7216d7a273418", + sha256 = "b58ee8ed6888719fc5856428bb358973cae4b7524c985ac3377c5e0d025317e3", + git_commit = "905898e08faa2b28d2970cacf2affc244092f09f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f7f8b675929cdc5d3244bfbbb16872b4bbe2a08c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 24 Sep 2018 03:01:40 -0700 Subject: [PATCH 1193/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214237506 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a78b3bfaf17..79e5b252661 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b58ee8ed6888719fc5856428bb358973cae4b7524c985ac3377c5e0d025317e3", - git_commit = "905898e08faa2b28d2970cacf2affc244092f09f", + sha256 = "07b9f0ab3a65c9f313cfbbe00ccf715cbf8ab94bf632dada9910e410f7cd3636", + git_commit = "b57bdf414edb27b82a95c5f4e2729fafd4cf2dc7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 042605433f960f257102b30f3a1cc528243dad03 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 24 Sep 2018 04:01:15 -0700 Subject: [PATCH 1194/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214243015 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 79e5b252661..e24df2c12b9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "07b9f0ab3a65c9f313cfbbe00ccf715cbf8ab94bf632dada9910e410f7cd3636", - git_commit = "b57bdf414edb27b82a95c5f4e2729fafd4cf2dc7", + sha256 = "d7493d4bae8114b74d9bade4e8d7c9be53c6adad41bd4d555b574446b8a7e642", + git_commit = "379ca4afe9e31f550cd04451af04150b6bbecf78", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2339b59eb9135941a950cef470ea195bcb39095b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 24 Sep 2018 06:02:18 -0700 Subject: [PATCH 1195/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214254463 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e24df2c12b9..220012b4420 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d7493d4bae8114b74d9bade4e8d7c9be53c6adad41bd4d555b574446b8a7e642", - git_commit = "379ca4afe9e31f550cd04451af04150b6bbecf78", + sha256 = "10920bf069c7f69fe53c6071783d143fd2689f20115f99443c1a4cbff93af8d0", + git_commit = "32251dd7793e56130693b33a0c29318b04df8080", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a7ea54a5be0c8cf114ae94c68278532c337c2cbc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 24 Sep 2018 08:01:19 -0700 Subject: [PATCH 1196/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214267261 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 220012b4420..8d463df7e86 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "10920bf069c7f69fe53c6071783d143fd2689f20115f99443c1a4cbff93af8d0", - git_commit = "32251dd7793e56130693b33a0c29318b04df8080", + sha256 = "374dfd90ddf878a8ba7c819b99be97099b4d122b4d6ae560132f08a299e1aaa6", + git_commit = "64498def97852cc359209576703c7b788ba839e9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 545560ddfcac6dfcf39aa8200e5bfb9217e8e893 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 24 Sep 2018 09:00:42 -0700 Subject: [PATCH 1197/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214274604 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8d463df7e86..0a2edbc9d0c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "374dfd90ddf878a8ba7c819b99be97099b4d122b4d6ae560132f08a299e1aaa6", - git_commit = "64498def97852cc359209576703c7b788ba839e9", + sha256 = "2adb32430fe5c2927a6689632a6050844acd0b81840dd0814ee329e25b038fe9", + git_commit = "7f71957f3818eff38671b758915a0a5c819c27e6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 50fe84e144d0d2427265a8e704bd8be220ec3dd2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 24 Sep 2018 10:00:59 -0700 Subject: [PATCH 1198/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214283645 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0a2edbc9d0c..4a1347ad17f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2adb32430fe5c2927a6689632a6050844acd0b81840dd0814ee329e25b038fe9", - git_commit = "7f71957f3818eff38671b758915a0a5c819c27e6", + sha256 = "7db8aaf5e7e494103963f86487d0c4c5c6f02f8debd51b3e77fffa5d5c1ad529", + git_commit = "4cf68d9b869c0cb1efe9865e764c997649b7fbc0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9daa8a6fd10c937c190f1e6e7f5b5e69460809f2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 24 Sep 2018 11:03:36 -0700 Subject: [PATCH 1199/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214295409 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4a1347ad17f..e7c27f0f052 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7db8aaf5e7e494103963f86487d0c4c5c6f02f8debd51b3e77fffa5d5c1ad529", - git_commit = "4cf68d9b869c0cb1efe9865e764c997649b7fbc0", + sha256 = "184ed87cbf89a5249f3740bc983fcb05c2333e33e0e6e34ca811ccb3718373c2", + git_commit = "0c48c703c3c1455cf3b2c0e47e2108e053ff83e2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1b4c71645a272874309618a0195d7b12cca2ed04 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 24 Sep 2018 12:11:02 -0700 Subject: [PATCH 1200/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214307919 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e7c27f0f052..8e2f6bcaf30 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "184ed87cbf89a5249f3740bc983fcb05c2333e33e0e6e34ca811ccb3718373c2", - git_commit = "0c48c703c3c1455cf3b2c0e47e2108e053ff83e2", + sha256 = "cc69295b868f62ef9e7a34d077c0221b605c7dd5a5d31097fa799e77e7016394", + git_commit = "28eeda839f124cf5ba648576e86214b38141e4ab", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 61e8dec21dbeb4f44b261f931e5037495f88258f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 24 Sep 2018 13:04:20 -0700 Subject: [PATCH 1201/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214316493 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8e2f6bcaf30..f7ba9872b82 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cc69295b868f62ef9e7a34d077c0221b605c7dd5a5d31097fa799e77e7016394", - git_commit = "28eeda839f124cf5ba648576e86214b38141e4ab", + sha256 = "10e115186e47d117633998b371aa11c0ffdbb94f1fbbe545090d4984055f08f7", + git_commit = "6357554896e8a1a340eb9406204a26e6d3219c4f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4c76231c8e1d040ca63df12e72f57430dce9cd10 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 24 Sep 2018 14:02:42 -0700 Subject: [PATCH 1202/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214326351 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f7ba9872b82..a435da500bf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "10e115186e47d117633998b371aa11c0ffdbb94f1fbbe545090d4984055f08f7", - git_commit = "6357554896e8a1a340eb9406204a26e6d3219c4f", + sha256 = "956f4eb0d281c71592838c79ca42b64c42e8eb3efc94049d7bac8c0db5ef3b9d", + git_commit = "cc7525d2c8e44c06685b27e77450cb2114765d72", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 33a514fc0fb3a83cf9f30ee2aa3ef1fc405a7032 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 24 Sep 2018 15:03:14 -0700 Subject: [PATCH 1203/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214337543 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a435da500bf..e6b2f492d91 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "956f4eb0d281c71592838c79ca42b64c42e8eb3efc94049d7bac8c0db5ef3b9d", - git_commit = "cc7525d2c8e44c06685b27e77450cb2114765d72", + sha256 = "1101892c13cfad4611c61b9d646a8f71e55042a0424cb7806595c8ac61e9a9ed", + git_commit = "7af35581b64b7811b2e70f672d1e824886eac16f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5ab798068f4815f2318a0621201e5f493597c7fa Mon Sep 17 00:00:00 2001 From: mikecase Date: Tue, 25 Sep 2018 12:03:54 -0700 Subject: [PATCH 1204/8103] Fixes https://github.com/tensorflow/serving/issues/1106 PiperOrigin-RevId: 214479846 --- WORKSPACE | 24 ++++++++++++++++++++++-- tensorflow_serving/requirements.txt | 2 ++ 2 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 tensorflow_serving/requirements.txt diff --git a/WORKSPACE b/WORKSPACE index e6b2f492d91..adcb8fa9d17 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -9,10 +9,29 @@ workspace(name = "tf_serving") # reliable downloads. load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") +# TensorFlow depends on "io_bazel_rules_python" so we need this here. +# Needs to be kept in sync with the same target in TensorFlow's WORKSPACE file. +http_archive( + name = "io_bazel_rules_python", + strip_prefix = "rules_python-8b5d0683a7d878b28fffe464779c8a53659fc645", + urls = [ + "https://github.com/bazelbuild/rules_python/archive/8b5d0683a7d878b28fffe464779c8a53659fc645.tar.gz", + ], +) +load("@io_bazel_rules_python//python:pip.bzl", "pip_repositories") +pip_repositories() +load("@io_bazel_rules_python//python:pip.bzl", "pip_import") +pip_import( + name = "pip_deps", + requirements = "//tensorflow_serving:requirements.txt", +) +load("@pip_deps//:requirements.bzl", "pip_install") +pip_install() + tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1101892c13cfad4611c61b9d646a8f71e55042a0424cb7806595c8ac61e9a9ed", - git_commit = "7af35581b64b7811b2e70f672d1e824886eac16f", + sha256 = "983770f59db24b9b0d309c81c9f546b1e9785c9d2e97f8813fb07d30943d92f6", + git_commit = "7229d08f0b25e24e6dd4833a94a27f404b27a350", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. @@ -27,6 +46,7 @@ http_archive( ], ) + # Please add all new TensorFlow Serving dependencies in workspace.bzl. load("//tensorflow_serving:workspace.bzl", "tf_serving_workspace") diff --git a/tensorflow_serving/requirements.txt b/tensorflow_serving/requirements.txt new file mode 100644 index 00000000000..6e111edefc6 --- /dev/null +++ b/tensorflow_serving/requirements.txt @@ -0,0 +1,2 @@ +keras_applications >= 1.0.5 +keras_preprocessing >= 1.0.3 From 562df103f655eeb508111703d834e3137efe71fa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 25 Sep 2018 13:05:28 -0700 Subject: [PATCH 1205/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214489758 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index adcb8fa9d17..6809414eda1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -30,8 +30,8 @@ pip_install() tensorflow_http_archive( name = "org_tensorflow", - sha256 = "983770f59db24b9b0d309c81c9f546b1e9785c9d2e97f8813fb07d30943d92f6", - git_commit = "7229d08f0b25e24e6dd4833a94a27f404b27a350", + sha256 = "1575679875c65cdeaab2e45f56df7acf485e5238300c0c78646066afccadf304", + git_commit = "df930015230c1195065e2fd01c61f527b8662efb", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0fea2af8363562b5cd574652e52df234c1ba37ca Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 25 Sep 2018 14:01:01 -0700 Subject: [PATCH 1206/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214499162 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6809414eda1..d9481616653 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -30,8 +30,8 @@ pip_install() tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1575679875c65cdeaab2e45f56df7acf485e5238300c0c78646066afccadf304", - git_commit = "df930015230c1195065e2fd01c61f527b8662efb", + sha256 = "6baaed9aa8ca5704da83fd4c467809a9b6e2b8e66bc647c91c9494efa9a103e9", + git_commit = "e51963ead78b3c1c4ab0077a3e43fb9c0f6ab374", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fbd037815780399429fc8c8bd59c96b0a0fb57fb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 25 Sep 2018 15:01:59 -0700 Subject: [PATCH 1207/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214510483 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d9481616653..c57486885b5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -30,8 +30,8 @@ pip_install() tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6baaed9aa8ca5704da83fd4c467809a9b6e2b8e66bc647c91c9494efa9a103e9", - git_commit = "e51963ead78b3c1c4ab0077a3e43fb9c0f6ab374", + sha256 = "783def476a9a2d425de611f5905b1e32d577d4bb195170868d0501c3ec4237d8", + git_commit = "153578f3c90ca423501151adcbaf6b81e05e2440", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c6ed2d48113262aca5bc2287eb2ec3d9c232534f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 25 Sep 2018 18:00:49 -0700 Subject: [PATCH 1208/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214536633 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c57486885b5..251e3e00113 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -30,8 +30,8 @@ pip_install() tensorflow_http_archive( name = "org_tensorflow", - sha256 = "783def476a9a2d425de611f5905b1e32d577d4bb195170868d0501c3ec4237d8", - git_commit = "153578f3c90ca423501151adcbaf6b81e05e2440", + sha256 = "53382ef6eaa331b0aebdcd42a317ef70415199e4eace4fc93ac1dec40221235e", + git_commit = "4177bc92c3b9301877521ba9b26377b80fa27601", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 53406b8000c2447de93a95766aa45b73fcc6a250 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 25 Sep 2018 21:01:28 -0700 Subject: [PATCH 1209/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214549884 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 251e3e00113..a28c9cb60dc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -30,8 +30,8 @@ pip_install() tensorflow_http_archive( name = "org_tensorflow", - sha256 = "53382ef6eaa331b0aebdcd42a317ef70415199e4eace4fc93ac1dec40221235e", - git_commit = "4177bc92c3b9301877521ba9b26377b80fa27601", + sha256 = "a6de80663c13f282121cb29b765163b9e9f240e7f8b07ac1d5c4bc2b80369906", + git_commit = "3f4b8c138165cc9deb0ed931c5a6bb3d8ab556f0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f75294900719d139cd30802e2702b74ad040d511 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 25 Sep 2018 22:03:05 -0700 Subject: [PATCH 1210/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214554017 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a28c9cb60dc..511d4f38356 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -30,8 +30,8 @@ pip_install() tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a6de80663c13f282121cb29b765163b9e9f240e7f8b07ac1d5c4bc2b80369906", - git_commit = "3f4b8c138165cc9deb0ed931c5a6bb3d8ab556f0", + sha256 = "c1936af85f6f02555aab1d05500a71880a5af91af3bd7fe00cdbafe0cd98140b", + git_commit = "6666516f390f125ed70ddbd4e6f89b83d953c408", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9893c1be46675cd4ed3f32585dd5ddc1e937ecb8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 25 Sep 2018 23:01:43 -0700 Subject: [PATCH 1211/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214557340 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 511d4f38356..0ebaa5a3820 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -30,8 +30,8 @@ pip_install() tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c1936af85f6f02555aab1d05500a71880a5af91af3bd7fe00cdbafe0cd98140b", - git_commit = "6666516f390f125ed70ddbd4e6f89b83d953c408", + sha256 = "6a877c5a3e03f156c900297f6eed13365ca15e230f2ea2ba82ef465e7dc0f143", + git_commit = "f2b17b22e12bd743b66945070f338f70b5fa3332", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 96261ba09c3c9b8e621580d6cc0a59325e7eab15 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 Sep 2018 00:01:46 -0700 Subject: [PATCH 1212/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214560869 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0ebaa5a3820..bf66c4a0cac 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -30,8 +30,8 @@ pip_install() tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6a877c5a3e03f156c900297f6eed13365ca15e230f2ea2ba82ef465e7dc0f143", - git_commit = "f2b17b22e12bd743b66945070f338f70b5fa3332", + sha256 = "2194e2617f4bf0dc0ad73b41ac93f2249c0bbbadd26a4ee664468cc695db6d9e", + git_commit = "c63d21b0bfc534b6377b332e9d2ba2abbdb7e0eb", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 621cd385ed3f9755584f10fab8c8086a220865a4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 Sep 2018 03:02:22 -0700 Subject: [PATCH 1213/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214578692 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bf66c4a0cac..b3039e16576 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -30,8 +30,8 @@ pip_install() tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2194e2617f4bf0dc0ad73b41ac93f2249c0bbbadd26a4ee664468cc695db6d9e", - git_commit = "c63d21b0bfc534b6377b332e9d2ba2abbdb7e0eb", + sha256 = "7ff06f354fdcdfcec32a71ff9cf4a10388e0cce65c5a12326d32c05452bed6eb", + git_commit = "ffa90fc521c6051addd50236872a4afaa45e0a49", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d3f0de90486a0da1204880c6dd7342515801fc40 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 Sep 2018 04:01:45 -0700 Subject: [PATCH 1214/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214583165 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b3039e16576..b7328d8d274 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -30,8 +30,8 @@ pip_install() tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7ff06f354fdcdfcec32a71ff9cf4a10388e0cce65c5a12326d32c05452bed6eb", - git_commit = "ffa90fc521c6051addd50236872a4afaa45e0a49", + sha256 = "9161ae23a81b3ccb71fa3a327e0c18106ea4e7b772eef885abd935292fae5008", + git_commit = "b4ae85234b4f626e4aaee1d2c531a6b534712dbb", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 84a3b4604fcde1bfc4b7be3e18afd6991ada1c3e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 Sep 2018 06:01:58 -0700 Subject: [PATCH 1215/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214592865 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b7328d8d274..b2f5607611d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -30,8 +30,8 @@ pip_install() tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9161ae23a81b3ccb71fa3a327e0c18106ea4e7b772eef885abd935292fae5008", - git_commit = "b4ae85234b4f626e4aaee1d2c531a6b534712dbb", + sha256 = "fa4b3dc777f0c52e95b55d02dab7d7357441ba77e6a55ec092066e24d6bbfbae", + git_commit = "e45f7ee4182d5e831026f329cff5da2596d6733a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 88ed6b0e968bf3dd24b9da7a34ec3654c3e8893b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 Sep 2018 10:02:09 -0700 Subject: [PATCH 1216/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214621848 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b2f5607611d..9b8ab1fa790 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -30,8 +30,8 @@ pip_install() tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fa4b3dc777f0c52e95b55d02dab7d7357441ba77e6a55ec092066e24d6bbfbae", - git_commit = "e45f7ee4182d5e831026f329cff5da2596d6733a", + sha256 = "223a7b0ae51e9d65c127eb5dc8e539182bb906e51d948ee616a3d05dc4f00453", + git_commit = "5498f24a3385bdd256b8b1e41329c5841996b26d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 69ba65ad0cb6dce3c13a978815e16667791c29c8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 Sep 2018 11:01:23 -0700 Subject: [PATCH 1217/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214632354 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9b8ab1fa790..c6f2fe559ba 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -30,8 +30,8 @@ pip_install() tensorflow_http_archive( name = "org_tensorflow", - sha256 = "223a7b0ae51e9d65c127eb5dc8e539182bb906e51d948ee616a3d05dc4f00453", - git_commit = "5498f24a3385bdd256b8b1e41329c5841996b26d", + sha256 = "30a481c90506df66a1c5feffe6446a9eeec75efff765c94d8c5c3a22143f39a2", + git_commit = "23a07f2c1444509986eece54e486cdcf0b8e32e4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1f7f0215045093e32815dd36e99f06cbc288a9d5 Mon Sep 17 00:00:00 2001 From: gunan Date: Wed, 26 Sep 2018 11:28:37 -0700 Subject: [PATCH 1218/8103] Automated rollback of commit 5ab798068f4815f2318a0621201e5f493597c7fa PiperOrigin-RevId: 214638317 --- WORKSPACE | 20 -------------------- tensorflow_serving/requirements.txt | 2 -- 2 files changed, 22 deletions(-) delete mode 100644 tensorflow_serving/requirements.txt diff --git a/WORKSPACE b/WORKSPACE index c6f2fe559ba..f5b8ec9d08a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -9,25 +9,6 @@ workspace(name = "tf_serving") # reliable downloads. load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") -# TensorFlow depends on "io_bazel_rules_python" so we need this here. -# Needs to be kept in sync with the same target in TensorFlow's WORKSPACE file. -http_archive( - name = "io_bazel_rules_python", - strip_prefix = "rules_python-8b5d0683a7d878b28fffe464779c8a53659fc645", - urls = [ - "https://github.com/bazelbuild/rules_python/archive/8b5d0683a7d878b28fffe464779c8a53659fc645.tar.gz", - ], -) -load("@io_bazel_rules_python//python:pip.bzl", "pip_repositories") -pip_repositories() -load("@io_bazel_rules_python//python:pip.bzl", "pip_import") -pip_import( - name = "pip_deps", - requirements = "//tensorflow_serving:requirements.txt", -) -load("@pip_deps//:requirements.bzl", "pip_install") -pip_install() - tensorflow_http_archive( name = "org_tensorflow", sha256 = "30a481c90506df66a1c5feffe6446a9eeec75efff765c94d8c5c3a22143f39a2", @@ -46,7 +27,6 @@ http_archive( ], ) - # Please add all new TensorFlow Serving dependencies in workspace.bzl. load("//tensorflow_serving:workspace.bzl", "tf_serving_workspace") diff --git a/tensorflow_serving/requirements.txt b/tensorflow_serving/requirements.txt deleted file mode 100644 index 6e111edefc6..00000000000 --- a/tensorflow_serving/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -keras_applications >= 1.0.5 -keras_preprocessing >= 1.0.3 From a97bbe51fd89f1a0aefdf59985209b8c4ead1cd9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 Sep 2018 12:03:18 -0700 Subject: [PATCH 1219/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214645063 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f5b8ec9d08a..e9af94dafba 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "30a481c90506df66a1c5feffe6446a9eeec75efff765c94d8c5c3a22143f39a2", - git_commit = "23a07f2c1444509986eece54e486cdcf0b8e32e4", + sha256 = "cd377809e09e32d69a79f6dd7c5e3eff42d3ca32d90d9c30631b63b1db6af88b", + git_commit = "cccace731712ab192448ff9bc3ce7259fd462e74", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2622b85e6630361feb610f5ced9de84f08a8062a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 Sep 2018 15:02:32 -0700 Subject: [PATCH 1220/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214675582 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e9af94dafba..9b3d2b32522 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cd377809e09e32d69a79f6dd7c5e3eff42d3ca32d90d9c30631b63b1db6af88b", - git_commit = "cccace731712ab192448ff9bc3ce7259fd462e74", + sha256 = "aef1297d20898542e647aef7a6e68b56e6eb732c55c256f035785632992fd736", + git_commit = "1736e0bbbfdeeba178dff37c970b5a0180ee013f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 541551a42277f374dd820c090ce5fc969137784e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 Sep 2018 16:01:32 -0700 Subject: [PATCH 1221/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214685460 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9b3d2b32522..c7e2b53dbf6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "aef1297d20898542e647aef7a6e68b56e6eb732c55c256f035785632992fd736", - git_commit = "1736e0bbbfdeeba178dff37c970b5a0180ee013f", + sha256 = "389affd04787b2c295e7423739b915661c45045db9dad3910b6fc95c3b9acf12", + git_commit = "dc90d6c486f2ec1741766b0989e6f6e842d94437", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9e8353e94eb40c34f716466167dff5ba88662d5a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 Sep 2018 17:01:32 -0700 Subject: [PATCH 1222/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214694901 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c7e2b53dbf6..3dfffef392e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "389affd04787b2c295e7423739b915661c45045db9dad3910b6fc95c3b9acf12", - git_commit = "dc90d6c486f2ec1741766b0989e6f6e842d94437", + sha256 = "bef2352776a3f62d911ffac8037d4f22e05d4325419eb91118503f79901f3772", + git_commit = "3ab16ebce6a0a9ce20120c3c2dd1f1a8cf5b2ad8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 743d6c5f973f66306906614c2f3744cbde14cbd8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 Sep 2018 18:01:50 -0700 Subject: [PATCH 1223/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214702617 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3dfffef392e..b5126aa7125 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bef2352776a3f62d911ffac8037d4f22e05d4325419eb91118503f79901f3772", - git_commit = "3ab16ebce6a0a9ce20120c3c2dd1f1a8cf5b2ad8", + sha256 = "2a77c8c8db9ae091e8bb5041ebfd3c103c31855bb13619714ff71c6485e09c01", + git_commit = "69650fff2b0f267162c987f35e2747be033a7d80", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 000bef800a302da9999d6455a60ed5b6a90ae7dd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 Sep 2018 19:01:41 -0700 Subject: [PATCH 1224/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214708131 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b5126aa7125..e46338a5d20 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2a77c8c8db9ae091e8bb5041ebfd3c103c31855bb13619714ff71c6485e09c01", - git_commit = "69650fff2b0f267162c987f35e2747be033a7d80", + sha256 = "4489cb38199183d5b2544c6955d4ecfdff01bac38bce003c76eaf673fb3c42d7", + git_commit = "5d61748f4e9998c9d2017bd01864b8fcb6d2127a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 73eb9511ca32607a4da478ac2124526a308b51f8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 Sep 2018 20:01:16 -0700 Subject: [PATCH 1225/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214712268 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e46338a5d20..845cfe30b13 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4489cb38199183d5b2544c6955d4ecfdff01bac38bce003c76eaf673fb3c42d7", - git_commit = "5d61748f4e9998c9d2017bd01864b8fcb6d2127a", + sha256 = "efc91a7574ea5dc55bbcc232355f6e9a78624c590c43d3d57db3a6ef3f5b8edb", + git_commit = "51a6118e5bd85935b1d9ec0e68b92f1f98d14982", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From db206c010712e5d84c15757374b3f76239a2d161 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 Sep 2018 21:01:11 -0700 Subject: [PATCH 1226/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214716811 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 845cfe30b13..091d0c81baf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "efc91a7574ea5dc55bbcc232355f6e9a78624c590c43d3d57db3a6ef3f5b8edb", - git_commit = "51a6118e5bd85935b1d9ec0e68b92f1f98d14982", + sha256 = "bc5188ee27188df99fda9da6253ace954a4f562431f8ca8c80e0e7f43dbced48", + git_commit = "0d5c68e30f4637329fa233df506d7b97802a5e9b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a35833d6ad8b4c8ba5bf00d7fb499356084bcda9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 Sep 2018 23:01:04 -0700 Subject: [PATCH 1227/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214725157 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 091d0c81baf..e2d9c59e679 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bc5188ee27188df99fda9da6253ace954a4f562431f8ca8c80e0e7f43dbced48", - git_commit = "0d5c68e30f4637329fa233df506d7b97802a5e9b", + sha256 = "db2ed52460338b485515da2deaae87cd3766de97819651d7f5f517577a6ca4bd", + git_commit = "a40cfd42e20d7e4520c1306666c9dfee97eb0a2e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 275aa0364917a3307f60b7d0bad6586a24da8b88 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Sep 2018 00:01:48 -0700 Subject: [PATCH 1228/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214729243 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e2d9c59e679..976b90ca027 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "db2ed52460338b485515da2deaae87cd3766de97819651d7f5f517577a6ca4bd", - git_commit = "a40cfd42e20d7e4520c1306666c9dfee97eb0a2e", + sha256 = "cb0a155ca202c600ac64a4ea5b7ced6615b256c8d4d0fd7af0e5d6548aeddfe2", + git_commit = "d3f14ef70cdf113f9d330c1f7c638003429a1dc4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 224b1f392cfd719c1e021cb98ee819159ea1a988 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Sep 2018 01:01:56 -0700 Subject: [PATCH 1229/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214734260 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 976b90ca027..17329f0058e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cb0a155ca202c600ac64a4ea5b7ced6615b256c8d4d0fd7af0e5d6548aeddfe2", - git_commit = "d3f14ef70cdf113f9d330c1f7c638003429a1dc4", + sha256 = "7f20025a2cd933b9625c58cdb9c0ee802ff7d3035f14f7d2a11a72798068cece", + git_commit = "08a6cfed1cf0cccc8ff35448266f44fbc55be0bc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a605f075b3723ae13dc47fe02a4e9d1e3d62e29b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Sep 2018 02:04:46 -0700 Subject: [PATCH 1230/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214741194 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 17329f0058e..6dacb920399 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7f20025a2cd933b9625c58cdb9c0ee802ff7d3035f14f7d2a11a72798068cece", - git_commit = "08a6cfed1cf0cccc8ff35448266f44fbc55be0bc", + sha256 = "4f7cfd2d5841b371d2cf15e3c0601e68059972429588d0611dd21c9a57589d9f", + git_commit = "4e56ea8f9bc398e4cd8bf66abf58cc872c922067", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f02bd2765eca3f05733213258197fd6eeb446fe1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Sep 2018 04:01:22 -0700 Subject: [PATCH 1231/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214751470 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6dacb920399..d8d038f3480 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4f7cfd2d5841b371d2cf15e3c0601e68059972429588d0611dd21c9a57589d9f", - git_commit = "4e56ea8f9bc398e4cd8bf66abf58cc872c922067", + sha256 = "569b07b499b141edc881777822a862b8a306f8e57c817fc5054414f77fa7c038", + git_commit = "19d8963bc0ea64e10ff08ad4e7cc76813a182196", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f429351e939f0ab457534e5e76e62eb110d8ec0a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Sep 2018 09:01:40 -0700 Subject: [PATCH 1232/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214782539 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d8d038f3480..16047ac7dc4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "569b07b499b141edc881777822a862b8a306f8e57c817fc5054414f77fa7c038", - git_commit = "19d8963bc0ea64e10ff08ad4e7cc76813a182196", + sha256 = "5b96202d9bd3ab417f5e92c85e84816ebc7ab72cb81340601e9832673ed57055", + git_commit = "3d30dd424c0404ea5349c0d2acdde2acd4e0aa97", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 504ad4e6f4f84dc6136c60b6ed614ec8f0b3377c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Sep 2018 10:01:23 -0700 Subject: [PATCH 1233/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214791092 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 16047ac7dc4..5a8f7b1b5ed 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5b96202d9bd3ab417f5e92c85e84816ebc7ab72cb81340601e9832673ed57055", - git_commit = "3d30dd424c0404ea5349c0d2acdde2acd4e0aa97", + sha256 = "0e1e8bc25a4ac92820f41bbed82a82706c67535a56438cac7c8192c0ec727426", + git_commit = "9a68681c3e9bf7e51423dcdbefd25da9c365d256", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a2f860cbb31067e852a85f598e37c7f8ff5e0d55 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Sep 2018 11:06:14 -0700 Subject: [PATCH 1234/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214803040 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5a8f7b1b5ed..0930bbf698a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0e1e8bc25a4ac92820f41bbed82a82706c67535a56438cac7c8192c0ec727426", - git_commit = "9a68681c3e9bf7e51423dcdbefd25da9c365d256", + sha256 = "9cb7271445773bef1827b49c843207cd750bd9afe25e6ab4904989d9befecdd5", + git_commit = "941b4e0f226de76f083401842e73bd9efd6db2d0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From bc6447410ee9089a2728a78f5c5b9d196e8ee2d2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Sep 2018 12:06:31 -0700 Subject: [PATCH 1235/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214814037 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0930bbf698a..2b206d4bd32 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9cb7271445773bef1827b49c843207cd750bd9afe25e6ab4904989d9befecdd5", - git_commit = "941b4e0f226de76f083401842e73bd9efd6db2d0", + sha256 = "e56aed05002085b3e3967c5635a5a8235938b482e35a3c1406c5adee538e58d6", + git_commit = "334244be6864dd1dbec9bc8bb4996cc286a8e3e3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 50846fba6fb51efda25519a8daaeec4e6387808f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Sep 2018 15:02:49 -0700 Subject: [PATCH 1236/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214842249 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2b206d4bd32..79883c73e89 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e56aed05002085b3e3967c5635a5a8235938b482e35a3c1406c5adee538e58d6", - git_commit = "334244be6864dd1dbec9bc8bb4996cc286a8e3e3", + sha256 = "1d399850b25b0d7f2ae47aa86d40e4e669fa7a4b0dcd858003ca2d61a7c5e890", + git_commit = "4cedc8b6e738b7a188c9c091cf667bacafae44b7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3d0ef76d1497caf8815c60b815f29ea476aed21e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Sep 2018 17:00:50 -0700 Subject: [PATCH 1237/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214860313 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 79883c73e89..bac73bc5940 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1d399850b25b0d7f2ae47aa86d40e4e669fa7a4b0dcd858003ca2d61a7c5e890", - git_commit = "4cedc8b6e738b7a188c9c091cf667bacafae44b7", + sha256 = "7e7bf21a84fbb5ad76707c884451e5cc6b9a9e3f1e10590f060d9be5cd05a697", + git_commit = "b8c86c3bbd8271ed968087f24e7fb704103bc733", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e08b034f3cab3a41557440454cd97d406cfc2a1c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Sep 2018 18:01:06 -0700 Subject: [PATCH 1238/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214868085 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bac73bc5940..5b151738b0f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7e7bf21a84fbb5ad76707c884451e5cc6b9a9e3f1e10590f060d9be5cd05a697", - git_commit = "b8c86c3bbd8271ed968087f24e7fb704103bc733", + sha256 = "7b8144d53dd9d34b20f0652ef49a58d851be1132e29f6e8a31358bf7fa5e6043", + git_commit = "a0de15424803bb2688aafd496c30b78c4eb6e1c3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b040913dcf476d816c36172ad458c47d3dc1ee86 Mon Sep 17 00:00:00 2001 From: Kamidi Preetham Date: Fri, 28 Sep 2018 14:53:23 +0530 Subject: [PATCH 1239/8103] Update: Corrected http_archive spelling --- tensorflow_serving/repo.bzl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/repo.bzl b/tensorflow_serving/repo.bzl index 25830cd20a3..21fb4cd906a 100644 --- a/tensorflow_serving/repo.bzl +++ b/tensorflow_serving/repo.bzl @@ -1,6 +1,6 @@ """ TensorFlow Http Archive -Modified http_arhive that allows us to override the TensorFlow commit that is +Modified http_archive that allows us to override the TensorFlow commit that is downloaded by setting an environment variable. This override is to be used for testing purposes. From e7c8ce45de143a8492905c53dd021db9e0c7fd6e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Sep 2018 19:01:49 -0700 Subject: [PATCH 1240/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214874108 --- WORKSPACE | 4 ++-- tensorflow_serving/g3doc/METADATA | 6 ------ tensorflow_serving/util/net_http/OWNERS | 2 -- 3 files changed, 2 insertions(+), 10 deletions(-) delete mode 100644 tensorflow_serving/g3doc/METADATA delete mode 100644 tensorflow_serving/util/net_http/OWNERS diff --git a/WORKSPACE b/WORKSPACE index 5b151738b0f..f73916bb34d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7b8144d53dd9d34b20f0652ef49a58d851be1132e29f6e8a31358bf7fa5e6043", - git_commit = "a0de15424803bb2688aafd496c30b78c4eb6e1c3", + sha256 = "3ba91b8efb87f557e235e5dd30905992a244556f1ac3d149f681d3336f05c07a", + git_commit = "4bab3e375b7fffbc8878313089a2bd680952aced", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. diff --git a/tensorflow_serving/g3doc/METADATA b/tensorflow_serving/g3doc/METADATA deleted file mode 100644 index 819e6aaf439..00000000000 --- a/tensorflow_serving/g3doc/METADATA +++ /dev/null @@ -1,6 +0,0 @@ -name: "TensorFlow Serving" -g3doc: { - include: "/learning/serving/g3doc/METADATA" - sitemap_file: "/learning/serving/g3doc/sitemap.md" -} - diff --git a/tensorflow_serving/util/net_http/OWNERS b/tensorflow_serving/util/net_http/OWNERS deleted file mode 100644 index bb25f9c2c39..00000000000 --- a/tensorflow_serving/util/net_http/OWNERS +++ /dev/null @@ -1,2 +0,0 @@ -awk -wenboz \ No newline at end of file From 98dd64998a308e8bb8fbd92e36cc80e65cfe8ea3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Sep 2018 22:02:31 -0700 Subject: [PATCH 1241/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214887193 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f73916bb34d..85e1e255ea9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3ba91b8efb87f557e235e5dd30905992a244556f1ac3d149f681d3336f05c07a", - git_commit = "4bab3e375b7fffbc8878313089a2bd680952aced", + sha256 = "05e936f5ae25771ebca97be0c94796558bb2db0c98137251576f3061c0098c77", + git_commit = "986193d79e00f1780fb3278ed890a72f7285f66e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ed68525067f982f4592e138e7cf9b00185f76b36 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Sep 2018 23:04:10 -0700 Subject: [PATCH 1242/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214891247 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 85e1e255ea9..9a54ea490c8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "05e936f5ae25771ebca97be0c94796558bb2db0c98137251576f3061c0098c77", - git_commit = "986193d79e00f1780fb3278ed890a72f7285f66e", + sha256 = "39b0e9c3738aad2504849037751d1cf1493b9f731164c3266c7de25402993df8", + git_commit = "7fd14feb9cbc690b362633639b27393576472c79", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 726a2d5490e50bbe0f066a07f3623208fed83873 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 28 Sep 2018 00:03:25 -0700 Subject: [PATCH 1243/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214895015 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9a54ea490c8..67bcfa0a630 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "39b0e9c3738aad2504849037751d1cf1493b9f731164c3266c7de25402993df8", - git_commit = "7fd14feb9cbc690b362633639b27393576472c79", + sha256 = "bb57bbcce488ef02de286bb683eec3cd615684be348994329cbf0caf4521020c", + git_commit = "d56c298f1ef14b5a738e1e0b7bbc66fcd736be3e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d335909f01514a2ae815d0d3f7763dd589df4b6c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 28 Sep 2018 01:02:04 -0700 Subject: [PATCH 1244/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214899711 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 67bcfa0a630..b090c220ee9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bb57bbcce488ef02de286bb683eec3cd615684be348994329cbf0caf4521020c", - git_commit = "d56c298f1ef14b5a738e1e0b7bbc66fcd736be3e", + sha256 = "5838e735b7c81e4ba41cbeb9031550da0d1b15d3f780cd1d4f33aa90b67dfd43", + git_commit = "6ebe9baae06c06d0a70a424a55c78f5af07b49f7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 307fa36f1964e9ea0a0f3e992fd9bf4c77dc056e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 28 Sep 2018 02:01:42 -0700 Subject: [PATCH 1245/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214904847 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b090c220ee9..ff0e75847e4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5838e735b7c81e4ba41cbeb9031550da0d1b15d3f780cd1d4f33aa90b67dfd43", - git_commit = "6ebe9baae06c06d0a70a424a55c78f5af07b49f7", + sha256 = "818d0fdfdc082a7523f3b9d9ffee85504747446b21917427c00efe7107a3cc93", + git_commit = "fa8c1eabd06f3043be820bf476e8413818853f17", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8831bb076a99a06476e84df7c2724f55a42beb4d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 28 Sep 2018 04:02:07 -0700 Subject: [PATCH 1246/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214914475 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ff0e75847e4..ac5f6153072 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "818d0fdfdc082a7523f3b9d9ffee85504747446b21917427c00efe7107a3cc93", - git_commit = "fa8c1eabd06f3043be820bf476e8413818853f17", + sha256 = "71c81f5d4519432774838f1ec767db1cdf9cfcdc94edb4f3978a186821af78f4", + git_commit = "19b2383cc0e221262be0780180558cf5bbb3e37e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From be299e11f1fada97bd8699e59586e429cd8764be Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 28 Sep 2018 09:02:18 -0700 Subject: [PATCH 1247/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214943472 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ac5f6153072..4d3fd45387d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "71c81f5d4519432774838f1ec767db1cdf9cfcdc94edb4f3978a186821af78f4", - git_commit = "19b2383cc0e221262be0780180558cf5bbb3e37e", + sha256 = "801418862250eedfc7dec73cae480a4d486c24cbc3a201634f3fecc121ddfe88", + git_commit = "32627bfba19606d3c3a34f5d02ae9428675bbc42", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From cd52f88de9b83e43fcc1b1e2b7bdfd43de90d10c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 28 Sep 2018 10:01:38 -0700 Subject: [PATCH 1248/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214951834 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4d3fd45387d..db20c21db2b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "801418862250eedfc7dec73cae480a4d486c24cbc3a201634f3fecc121ddfe88", - git_commit = "32627bfba19606d3c3a34f5d02ae9428675bbc42", + sha256 = "42302422022c5eea2150187786108b0f59b6d2fb7298bc956b908015c222c917", + git_commit = "c7bb3c3d65e4e064d53630d4b524522eed6f3f44", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d95e0e52ccf327d3e7e465949b3506880e8eac74 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 28 Sep 2018 11:03:04 -0700 Subject: [PATCH 1249/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214963079 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index db20c21db2b..4a785f58ec1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "42302422022c5eea2150187786108b0f59b6d2fb7298bc956b908015c222c917", - git_commit = "c7bb3c3d65e4e064d53630d4b524522eed6f3f44", + sha256 = "2a32bd81954495dd4fd2e2059a5df7013198c7833f1fcacc97b6fb47bbdf477c", + git_commit = "4eb53d3e5f7bec3c757a06d186ff31fe52083e6d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e30e28d9d540f817e42e1f48c95ac7ffe01fc74e Mon Sep 17 00:00:00 2001 From: markdaoust Date: Fri, 28 Sep 2018 11:21:52 -0700 Subject: [PATCH 1250/8103] change TOC format PiperOrigin-RevId: 214966700 --- tensorflow_serving/g3doc/_toc.yaml | 24 ++++++++++++++++++++++++ tensorflow_serving/g3doc/leftnav_files | 12 ------------ 2 files changed, 24 insertions(+), 12 deletions(-) create mode 100644 tensorflow_serving/g3doc/_toc.yaml delete mode 100644 tensorflow_serving/g3doc/leftnav_files diff --git a/tensorflow_serving/g3doc/_toc.yaml b/tensorflow_serving/g3doc/_toc.yaml new file mode 100644 index 00000000000..b6e1a1c156c --- /dev/null +++ b/tensorflow_serving/g3doc/_toc.yaml @@ -0,0 +1,24 @@ +toc: +- heading: TensorFlow Serving +- title: "Introduction" + path: /serving/ +- title: "Architecture Overview" + path: /serving/architecture_overview +- title: "Installation" + path: /serving/setup +- title: "Serving a TensorFlow Model" + path: /serving/serving_basic +- title: "RESTful API" + path: /serving/api_rest +- title: "Building Standard TensorFlow ModelServer" + path: /serving/serving_advanced +- title: "Serving Inception Model with TensorFlow Serving and Kubernetes" + path: /serving/serving_inception +- title: "Creating a new kind of servable" + path: /serving/custom_servable +- title: "Creating a module that discovers new servable paths" + path: /serving/custom_source +- title: "SignatureDefs in SavedModel for TensorFlow Serving" + path: /serving/signature_defs +- title: "Using TensorFlow Serving via Docker" + path: /serving/docker diff --git a/tensorflow_serving/g3doc/leftnav_files b/tensorflow_serving/g3doc/leftnav_files deleted file mode 100644 index 2c7eccc2afc..00000000000 --- a/tensorflow_serving/g3doc/leftnav_files +++ /dev/null @@ -1,12 +0,0 @@ -### TensorFlow Serving -index.md -architecture_overview.md -setup.md -serving_basic.md -api_rest.md -serving_advanced.md -serving_inception.md -custom_servable.md -custom_source.md -signature_defs.md -docker.md \ No newline at end of file From bfaee5f0f4672be242350074191f8f4e035bc8e1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 28 Sep 2018 12:02:11 -0700 Subject: [PATCH 1251/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214973219 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4a785f58ec1..a88917950d2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2a32bd81954495dd4fd2e2059a5df7013198c7833f1fcacc97b6fb47bbdf477c", - git_commit = "4eb53d3e5f7bec3c757a06d186ff31fe52083e6d", + sha256 = "c20d90206ac42c5422ad876a58a2baaa54b5ef0cfb52395e579b6cb33c9c9794", + git_commit = "301e3043e67493ce3777d2b36b43d0210f7b920c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d2c81eff1957caac88835e6b7b0754db85455cc6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 28 Sep 2018 13:02:24 -0700 Subject: [PATCH 1252/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214982324 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a88917950d2..ec7557cc6bc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c20d90206ac42c5422ad876a58a2baaa54b5ef0cfb52395e579b6cb33c9c9794", - git_commit = "301e3043e67493ce3777d2b36b43d0210f7b920c", + sha256 = "58d4b20ecb78bddd1d9dcad49ab7e12d2c161f33f950be8df8c6ca758abd3521", + git_commit = "90aa10fcf5c80591b31988754e6221d6c2b8bbd0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4f918658c996cc8cd654eb0bb7603ad92e088ff6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 28 Sep 2018 13:25:02 -0700 Subject: [PATCH 1253/8103] Cleanup PiperOrigin-RevId: 214985873 --- tensorflow_serving/apis/BUILD | 13 ------------- tensorflow_serving/config/BUILD | 4 ---- tensorflow_serving/core/BUILD | 1 - tensorflow_serving/sources/storage_path/BUILD | 1 - tensorflow_serving/util/BUILD | 1 - 5 files changed, 20 deletions(-) diff --git a/tensorflow_serving/apis/BUILD b/tensorflow_serving/apis/BUILD index b483c5d9d67..2f4862ac0b5 100644 --- a/tensorflow_serving/apis/BUILD +++ b/tensorflow_serving/apis/BUILD @@ -27,7 +27,6 @@ serving_proto_library( name = "get_model_metadata_proto", srcs = ["get_model_metadata.proto"], cc_api_version = 2, - java_api_version = 2, deps = [ ":model_proto", "@org_tensorflow//tensorflow/core:protos_all_cc", @@ -49,7 +48,6 @@ serving_proto_library( name = "input_proto", srcs = ["input.proto"], cc_api_version = 2, - java_api_version = 2, js_api_version = 2, deps = [ "@org_tensorflow//tensorflow/core:protos_all_cc", @@ -80,7 +78,6 @@ serving_proto_library( name = "model_proto", srcs = ["model.proto"], cc_api_version = 2, - java_api_version = 2, js_api_version = 2, deps = [ "@protobuf_archive//:cc_wkt_protos", @@ -109,7 +106,6 @@ serving_proto_library( name = "predict_proto", srcs = ["predict.proto"], cc_api_version = 2, - java_api_version = 2, deps = [ ":model_proto", "@org_tensorflow//tensorflow/core:protos_all_cc", @@ -135,7 +131,6 @@ serving_proto_library( name = "prediction_log_proto", srcs = ["prediction_log.proto"], cc_api_version = 2, - java_api_version = 2, deps = [ ":classification_proto", ":inference_proto", @@ -166,7 +161,6 @@ serving_proto_library( has_services = 1, cc_api_version = 2, cc_grpc_version = 1, - java_api_version = 2, deps = [ ":classification_proto", ":get_model_metadata_proto", @@ -208,7 +202,6 @@ serving_proto_library( name = "model_management_proto", srcs = ["model_management.proto"], cc_api_version = 2, - java_api_version = 2, deps = [ "//tensorflow_serving/config:model_server_config_proto", "//tensorflow_serving/util:status_proto", @@ -229,7 +222,6 @@ serving_proto_library( name = "get_model_status_proto", srcs = ["get_model_status.proto"], cc_api_version = 2, - java_api_version = 2, deps = [ ":model_proto", "//tensorflow_serving/util:status_proto", @@ -252,7 +244,6 @@ serving_proto_library( has_services = 1, cc_api_version = 2, cc_grpc_version = 1, - java_api_version = 2, deps = [ ":get_model_status_proto", ":model_management_proto", @@ -282,7 +273,6 @@ serving_proto_library( name = "classification_proto", srcs = ["classification.proto"], cc_api_version = 2, - java_api_version = 2, deps = [ ":input_proto", ":model_proto", @@ -315,7 +305,6 @@ serving_proto_library( name = "inference_proto", srcs = ["inference.proto"], cc_api_version = 2, - java_api_version = 2, deps = [ ":classification_proto", ":input_proto", @@ -346,7 +335,6 @@ serving_proto_library( name = "regression_proto", srcs = ["regression.proto"], cc_api_version = 2, - java_api_version = 2, deps = [ ":input_proto", ":model_proto", @@ -374,7 +362,6 @@ serving_proto_library( srcs = ["session_service.proto"], has_services = 1, cc_api_version = 2, - java_api_version = 2, deps = [ ":model_proto", "@org_tensorflow//tensorflow/core:protos_all_cc", diff --git a/tensorflow_serving/config/BUILD b/tensorflow_serving/config/BUILD index 60be85c9ef1..25e34d91d3b 100644 --- a/tensorflow_serving/config/BUILD +++ b/tensorflow_serving/config/BUILD @@ -25,7 +25,6 @@ serving_proto_library( name = "model_server_config_proto", srcs = ["model_server_config.proto"], cc_api_version = 2, - java_api_version = 2, deps = [ ":logging_config_proto", "//tensorflow_serving/sources/storage_path:file_system_storage_path_source_proto", @@ -56,7 +55,6 @@ serving_proto_library( name = "log_collector_config_proto", srcs = ["log_collector_config.proto"], cc_api_version = 2, - java_api_version = 2, deps = [ ], ) @@ -73,7 +71,6 @@ serving_proto_library( name = "logging_config_proto", srcs = ["logging_config.proto"], cc_api_version = 2, - java_api_version = 2, deps = [ ":log_collector_config_proto", ], @@ -92,7 +89,6 @@ serving_proto_library( name = "monitoring_config_proto", srcs = ["monitoring_config.proto"], cc_api_version = 2, - java_api_version = 2, deps = [ ], ) diff --git a/tensorflow_serving/core/BUILD b/tensorflow_serving/core/BUILD index b11ab0895a4..c4d051551ad 100644 --- a/tensorflow_serving/core/BUILD +++ b/tensorflow_serving/core/BUILD @@ -739,7 +739,6 @@ serving_proto_library( name = "logging_proto", srcs = ["logging.proto"], cc_api_version = 2, - java_api_version = 2, visibility = [ "//visibility:public", ], diff --git a/tensorflow_serving/sources/storage_path/BUILD b/tensorflow_serving/sources/storage_path/BUILD index 7a294ddeccc..561f2cd495f 100644 --- a/tensorflow_serving/sources/storage_path/BUILD +++ b/tensorflow_serving/sources/storage_path/BUILD @@ -85,7 +85,6 @@ serving_proto_library( name = "file_system_storage_path_source_proto", srcs = ["file_system_storage_path_source.proto"], cc_api_version = 2, - java_api_version = 2, visibility = ["//visibility:public"], ) diff --git a/tensorflow_serving/util/BUILD b/tensorflow_serving/util/BUILD index effbe76307d..86d2686ca4e 100644 --- a/tensorflow_serving/util/BUILD +++ b/tensorflow_serving/util/BUILD @@ -398,7 +398,6 @@ serving_proto_library( name = "status_proto", srcs = ["status.proto"], cc_api_version = 2, - java_api_version = 2, visibility = ["//visibility:public"], deps = [ "@org_tensorflow//tensorflow/core:protos_all_cc", From e11bd51540212242911dae00c8507e2852a5ad5a Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Fri, 28 Sep 2018 14:00:21 -0700 Subject: [PATCH 1254/8103] Update MKL build Fixes https://github.com/tensorflow/serving/issues/1113 PiperOrigin-RevId: 214991457 --- tools/bazel.rc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/bazel.rc b/tools/bazel.rc index cc64156f1bc..3f73cb0b0f5 100644 --- a/tools/bazel.rc +++ b/tools/bazel.rc @@ -9,11 +9,12 @@ build:cuda --define=using_cuda=true --define=using_cuda_nvcc=true # Please note that MKL on MacOS or windows is still not supported. # If you would like to use a local MKL instead of downloading, please set the # environment variable "TF_MKL_ROOT" every time before build. -build:mkl --define=using_mkl=true +build:mkl --define=build_with_mkl=true --define=enable_mkl=true # This config option is used to enable MKL-DNN open source library only, # without depending on MKL binary version. -build:mkl_open_source_only --define=using_mkl_dnn_only=true +build:mkl_open_source_only --define=build_with_mkl_dnn_only=true +build:mkl_open_source_only --define=build_with_mkl=true --define=enable_mkl=true # Processor native optimizations (depends on build host capabilities). build:nativeopt --copt=-march=native From a4eba1d9c56e68b43ebf165fd5a195f101dfa420 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 28 Sep 2018 14:00:52 -0700 Subject: [PATCH 1255/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 214991545 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ec7557cc6bc..5536e9b7893 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "58d4b20ecb78bddd1d9dcad49ab7e12d2c161f33f950be8df8c6ca758abd3521", - git_commit = "90aa10fcf5c80591b31988754e6221d6c2b8bbd0", + sha256 = "2cf6ff5f5556d8abe98b3a3b2c4a7db263387aaedee5bbbf3b4c7ae0167cd8b6", + git_commit = "e00954e8626c74b263b90527e0c020cfd64136b2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e8665be773ecdf9eb123ecdbc67db71103d2569d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 28 Sep 2018 16:01:14 -0700 Subject: [PATCH 1256/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215010361 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5536e9b7893..bcce99acc26 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2cf6ff5f5556d8abe98b3a3b2c4a7db263387aaedee5bbbf3b4c7ae0167cd8b6", - git_commit = "e00954e8626c74b263b90527e0c020cfd64136b2", + sha256 = "4cc54b3d0c82e0a0f16a10ce0667037db9fcc41d25d8f71b0519eaa1e4257a00", + git_commit = "2f559f2d5f75cf80183ae0d855110809404019f7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6848ab19e4e6851024274af3c7d9ed72e718752a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 28 Sep 2018 20:00:55 -0700 Subject: [PATCH 1257/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215031579 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bcce99acc26..5bfbcc5c9bb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4cc54b3d0c82e0a0f16a10ce0667037db9fcc41d25d8f71b0519eaa1e4257a00", - git_commit = "2f559f2d5f75cf80183ae0d855110809404019f7", + sha256 = "e49fd9bf1aca4d6a84b7cca13df7921e1218541b1c8f9c124da730db9b9dc0eb", + git_commit = "d37f771cc5a208cdc88a50a65f491b3c06c9f262", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1597d2faf008c1501aa55c63c64928e4113b607d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 29 Sep 2018 00:00:56 -0700 Subject: [PATCH 1258/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215042101 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5bfbcc5c9bb..ffd30c930db 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e49fd9bf1aca4d6a84b7cca13df7921e1218541b1c8f9c124da730db9b9dc0eb", - git_commit = "d37f771cc5a208cdc88a50a65f491b3c06c9f262", + sha256 = "f7829a7c23d1317f75c431e679adb17c508b598a0479eaaf4760584df103f277", + git_commit = "2e0e934e0b3c00863918c78bf55524eea3f0c0dc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1040c3f01665987f07508979ab7b795fa332206a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 29 Sep 2018 03:00:44 -0700 Subject: [PATCH 1259/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215052358 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ffd30c930db..bc515710672 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f7829a7c23d1317f75c431e679adb17c508b598a0479eaaf4760584df103f277", - git_commit = "2e0e934e0b3c00863918c78bf55524eea3f0c0dc", + sha256 = "0f2b126c3144cb56b15ca53a4aae5ab5c85d491e58525b4f81ecede20cc3ba53", + git_commit = "d78595d333c9b5c8a0705ba6852c08b107d6c462", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 83d867f2f0f143b1ec9c1a54f8897afff3838013 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 29 Sep 2018 04:01:03 -0700 Subject: [PATCH 1260/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215054559 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bc515710672..5e3c71f0924 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0f2b126c3144cb56b15ca53a4aae5ab5c85d491e58525b4f81ecede20cc3ba53", - git_commit = "d78595d333c9b5c8a0705ba6852c08b107d6c462", + sha256 = "c01e36ecae5f8dcf09b8f64cefee624a9bfb4d763a1a08a49c1392ec955a39a9", + git_commit = "d8db18b4201d9d82d1c93ed5453914ff16f1adf4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 190c519bad84ae69fdd5cce2e51a2c907f53ea99 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 29 Sep 2018 13:01:02 -0700 Subject: [PATCH 1261/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215076334 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5e3c71f0924..637c57963f1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c01e36ecae5f8dcf09b8f64cefee624a9bfb4d763a1a08a49c1392ec955a39a9", - git_commit = "d8db18b4201d9d82d1c93ed5453914ff16f1adf4", + sha256 = "75576a4baf5df94906c91e992f388760d8df921023eee5777d4e238ddf7fc57b", + git_commit = "639d0dd8c1ba8d2956ccb59604c157de7ba0a7f2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9f8fc3d19504ac034a89ddbec33ae1a546acce9a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 29 Sep 2018 16:01:01 -0700 Subject: [PATCH 1262/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215083086 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 637c57963f1..27b6c074f5e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "75576a4baf5df94906c91e992f388760d8df921023eee5777d4e238ddf7fc57b", - git_commit = "639d0dd8c1ba8d2956ccb59604c157de7ba0a7f2", + sha256 = "1e10d3c6346887c17e6a6fba197374faddd4043edec9af81c20bec5c071a47f1", + git_commit = "4cf1b45b2e9188086bcb7d12654cd3e130e9b823", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 63a5c18cd453b8044917bfa9d89a762a2efe1721 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 29 Sep 2018 18:01:04 -0700 Subject: [PATCH 1263/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215087700 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 27b6c074f5e..c7cf9e4e9b1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1e10d3c6346887c17e6a6fba197374faddd4043edec9af81c20bec5c071a47f1", - git_commit = "4cf1b45b2e9188086bcb7d12654cd3e130e9b823", + sha256 = "aa7aa7319db01e153b1b0821ff197a4c37bb7e20da5ec704f63f7518a34a5734", + git_commit = "2538e68a69e585696175bd972cae119e06bde294", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a890891297a7389d2b99f9fb308c74e36d64e301 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 30 Sep 2018 06:01:09 -0700 Subject: [PATCH 1264/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215118825 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c7cf9e4e9b1..d5b53f933a4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "aa7aa7319db01e153b1b0821ff197a4c37bb7e20da5ec704f63f7518a34a5734", - git_commit = "2538e68a69e585696175bd972cae119e06bde294", + sha256 = "1692229dd8b16bee2407e5ba601881cdb2b9dbd4ab85a29ad0d6950968f31691", + git_commit = "a00fe72261cf6fe4a00467139e401de14c16224c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9989a98b461a8cebdfd119675605a4d33f62b468 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 30 Sep 2018 08:01:24 -0700 Subject: [PATCH 1265/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215123141 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d5b53f933a4..74dd2ab674c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1692229dd8b16bee2407e5ba601881cdb2b9dbd4ab85a29ad0d6950968f31691", - git_commit = "a00fe72261cf6fe4a00467139e401de14c16224c", + sha256 = "88ff53f18f5e03c8bbfc808c390596dd9af6bdaa48ab46f13d16999c99b49ee8", + git_commit = "4ecce5aa64587afe1cd07ee4c92bbb5ce2cf85df", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 96c82eba9f8ab9ac02504ca7ee9813535f09632f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 30 Sep 2018 14:01:18 -0700 Subject: [PATCH 1266/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215138325 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 74dd2ab674c..132630351ff 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "88ff53f18f5e03c8bbfc808c390596dd9af6bdaa48ab46f13d16999c99b49ee8", - git_commit = "4ecce5aa64587afe1cd07ee4c92bbb5ce2cf85df", + sha256 = "11cff0d792b8e62adba5dd6391ee12b37d623aab5d4a29878c73e5771b7b5868", + git_commit = "5fa4e1ac928b0512b28e955c588c5a7eab2ea046", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 518470c66859982a66528b6f1306de7905a7d7ca Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 30 Sep 2018 22:01:02 -0700 Subject: [PATCH 1267/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215160850 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 132630351ff..8ddeb0d4946 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "11cff0d792b8e62adba5dd6391ee12b37d623aab5d4a29878c73e5771b7b5868", - git_commit = "5fa4e1ac928b0512b28e955c588c5a7eab2ea046", + sha256 = "f2d426defb16acd69ef7711c164064b2a6759ebcb995da990d32ec3444377807", + git_commit = "76c4853b50f201b4a809ac66746c798e049b294c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2936444ba5adbde6798e74814899404402b73e02 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 30 Sep 2018 23:01:10 -0700 Subject: [PATCH 1268/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215164063 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8ddeb0d4946..159da3cfb61 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f2d426defb16acd69ef7711c164064b2a6759ebcb995da990d32ec3444377807", - git_commit = "76c4853b50f201b4a809ac66746c798e049b294c", + sha256 = "f3856f41130288f065ea91516433af22e9907276921ee68a7a997e53caae38bc", + git_commit = "987954ce50583409e54828a044e0866bcfdbd88a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 605485aa14ab27044f4387dee838ec35b92a17f7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Oct 2018 00:02:05 -0700 Subject: [PATCH 1269/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215167368 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 159da3cfb61..9f5ca438582 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f3856f41130288f065ea91516433af22e9907276921ee68a7a997e53caae38bc", - git_commit = "987954ce50583409e54828a044e0866bcfdbd88a", + sha256 = "f316698b888e9296836961c8a2657bf5ea46b9ae2108780f96ca205d8c35bd21", + git_commit = "b797bfb750504e03a38a988c44e3c52e902e87c4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d10b25c0f0220a5be62d6134919b6f493aab9ac7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Oct 2018 03:00:58 -0700 Subject: [PATCH 1270/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215185570 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9f5ca438582..c8fe4c0ec0b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f316698b888e9296836961c8a2657bf5ea46b9ae2108780f96ca205d8c35bd21", - git_commit = "b797bfb750504e03a38a988c44e3c52e902e87c4", + sha256 = "6ad3d6828e356dcb37cf30d4e87a1deaa28737635af252c2ea82daa07b4a9210", + git_commit = "03c5f9cdce62f6711b91fe81505e3c085e54a771", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ef6bd08f1b54046e2e965107eb972fe95e8f6141 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Oct 2018 05:01:00 -0700 Subject: [PATCH 1271/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215195697 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c8fe4c0ec0b..3b1d199e9e4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6ad3d6828e356dcb37cf30d4e87a1deaa28737635af252c2ea82daa07b4a9210", - git_commit = "03c5f9cdce62f6711b91fe81505e3c085e54a771", + sha256 = "9ea50080b733a5819d30bf1c2aedfffdd896bd63f1271d915f39b026a05e03e6", + git_commit = "9a169bf3ba840af8ab3caae7ea1c69c682be3ab7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1578173c088d29de51f4434ee9b8054d588c97f8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Oct 2018 09:01:12 -0700 Subject: [PATCH 1272/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215221876 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3b1d199e9e4..0448143daba 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9ea50080b733a5819d30bf1c2aedfffdd896bd63f1271d915f39b026a05e03e6", - git_commit = "9a169bf3ba840af8ab3caae7ea1c69c682be3ab7", + sha256 = "2ca5b5cd6b3b199a6fcabfaf711c3c8fe4b98fa1003e7eb5560ddcef489d9157", + git_commit = "eef9a3e816932b7c34f426d00d7df53c91130402", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6bb32ee0ced800c9afa155594335719df1b1a830 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Oct 2018 10:00:56 -0700 Subject: [PATCH 1273/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215231219 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0448143daba..deeb91f078f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2ca5b5cd6b3b199a6fcabfaf711c3c8fe4b98fa1003e7eb5560ddcef489d9157", - git_commit = "eef9a3e816932b7c34f426d00d7df53c91130402", + sha256 = "150df2edf289ba4abb8aa9fea1b1f7a31303b5e5f5eb7ee4a5de47fe7965db1f", + git_commit = "9a2f872acd0c38d74d60e4f67701241aa1a26419", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a40cf2176dbdc0454fa9c32e7ab3c0d6da0c738e Mon Sep 17 00:00:00 2001 From: laigd Date: Mon, 1 Oct 2018 10:48:46 -0700 Subject: [PATCH 1274/8103] Install TensorRT in TF Serving's docker build. PiperOrigin-RevId: 215241014 --- .../tools/docker/Dockerfile.devel-gpu | 23 ++++++++++++++++++- .../tools/docker/Dockerfile.gpu | 17 ++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 463e5e260ac..5c04570f27e 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -22,6 +22,7 @@ LABEL tensorflow_serving_github_commit=${TF_SERVING_VERSION_GIT_COMMIT} ENV NCCL_VERSION=2.2.13 ENV CUDNN_VERSION=7.1.4.18 +ENV TF_TENSORRT_VERSION=4.1.2 RUN apt-get update && apt-get install -y --no-install-recommends \ automake \ @@ -62,6 +63,24 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ find /usr/local/cuda-9.0/lib64/ -type f -name 'lib*_static.a' -not -name 'libcudart_static.a' -delete && \ rm /usr/lib/x86_64-linux-gnu/libcudnn_static_v7.a +# The 'apt-get install' of nvinfer-runtime-trt-repo-ubuntu1604-4.0.1-ga-cuda9.0 +# adds a new list which contains libnvinfer library, so it needs another +# 'apt-get update' to retrieve that list before it can actually install the +# library. +RUN apt-get update && \ + apt-get install --no-install-recommends \ + nvinfer-runtime-trt-repo-ubuntu1604-4.0.1-ga-cuda9.0 && \ + apt-get update && \ + apt-get install --no-install-recommends \ + libnvinfer4=${TF_TENSORRT_VERSION}-1+cuda9.0 \ + libnvinfer-dev=${TF_TENSORRT_VERSION}-1+cuda9.0 && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* && \ + rm /usr/lib/x86_64-linux-gnu/libnvinfer.a && \ + rm /usr/lib/x86_64-linux-gnu/libnvinfer_plugin* && \ + rm /usr/lib/x86_64-linux-gnu/libnvcaffe_parser* && \ + rm /usr/lib/x86_64-linux-gnu/libnvparsers* + RUN curl -fSsL -O https://bootstrap.pypa.io/get-pip.py && \ python get-pip.py && \ rm get-pip.py @@ -91,6 +110,8 @@ RUN mkdir /bazel && \ ENV CI_BUILD_PYTHON python ENV LD_LIBRARY_PATH /usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH ENV TF_NEED_CUDA 1 +ENV TF_NEED_TENSORRT 1 +ENV TENSORRT_INSTALL_PATH=/usr/lib/x86_64-linux-gnu ENV TF_CUDA_COMPUTE_CAPABILITIES=3.0,3.5,5.2,6.0,6.1,7.0 ENV TF_CUDA_VERSION=9.0 ENV TF_CUDNN_VERSION=7 @@ -160,4 +181,4 @@ FROM binary_build as clean_build # Clean up Bazel cache when done. RUN bazel clean --expunge --color=yes && \ rm -rf /root/.cache -CMD ["/bin/bash"] \ No newline at end of file +CMD ["/bin/bash"] diff --git a/tensorflow_serving/tools/docker/Dockerfile.gpu b/tensorflow_serving/tools/docker/Dockerfile.gpu index 2c159273f44..283f0349963 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.gpu @@ -32,6 +32,23 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ apt-get clean && \ rm -rf /var/lib/apt/lists/* +# The 'apt-get install' of nvinfer-runtime-trt-repo-ubuntu1604-4.0.1-ga-cuda9.0 +# adds a new list which contains libnvinfer library, so it needs another +# 'apt-get update' to retrieve that list before it can actually install the +# library. +# We don't install libnvinfer-dev since we don't need to build against TensorRT, +# and libnvinfer4 doesn't contain libnvinfer.a static library. +RUN apt-get update && \ + apt-get install --no-install-recommends \ + nvinfer-runtime-trt-repo-ubuntu1604-4.0.1-ga-cuda9.0 && \ + apt-get update && \ + apt-get install --no-install-recommends libnvinfer4=4.1.2-1+cuda9.0 && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* && \ + rm /usr/lib/x86_64-linux-gnu/libnvinfer_plugin* && \ + rm /usr/lib/x86_64-linux-gnu/libnvcaffe_parser* && \ + rm /usr/lib/x86_64-linux-gnu/libnvparsers* + # Install TF Serving GPU pkg COPY --from=build_image /usr/local/bin/tensorflow_model_server /usr/bin/tensorflow_model_server From 5b3600391e28f6c6b742afdd3d292034046a77ff Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Oct 2018 11:00:57 -0700 Subject: [PATCH 1275/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215243802 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index deeb91f078f..44b5fbd1042 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "150df2edf289ba4abb8aa9fea1b1f7a31303b5e5f5eb7ee4a5de47fe7965db1f", - git_commit = "9a2f872acd0c38d74d60e4f67701241aa1a26419", + sha256 = "09b1616f44d3d8772b56b5b2470112ca0535ee5317e747faec21b582355d4f8f", + git_commit = "e285dea8d9626b832f34d65159639f294c2d6881", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e8d5a72c5378415b5a79afab6d38a17887a3ba1b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Oct 2018 12:01:01 -0700 Subject: [PATCH 1276/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215255196 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 44b5fbd1042..c901672119a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "09b1616f44d3d8772b56b5b2470112ca0535ee5317e747faec21b582355d4f8f", - git_commit = "e285dea8d9626b832f34d65159639f294c2d6881", + sha256 = "ced733135831d9f654f46bd0eec36a9b5482e471114a8c8fe8e027039234e3a5", + git_commit = "2bbf05148ad94928c1c828d40e479afdf34e2ef8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2186473a132c6c346dc334d2d02e271c8c550758 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Oct 2018 14:03:32 -0700 Subject: [PATCH 1277/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215276121 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c901672119a..b1bc1a7904d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ced733135831d9f654f46bd0eec36a9b5482e471114a8c8fe8e027039234e3a5", - git_commit = "2bbf05148ad94928c1c828d40e479afdf34e2ef8", + sha256 = "b7f445465e4cfabf9ac39ce3f444a254b70f6fe4b10ffb7d0436c55cf46b93ae", + git_commit = "3c6e6885f32e7638ece306dad3a5081b06137bdc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 837201acf967fa33554cb5aef23553bb98666b35 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Oct 2018 15:03:24 -0700 Subject: [PATCH 1278/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215287075 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b1bc1a7904d..0f72330be90 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b7f445465e4cfabf9ac39ce3f444a254b70f6fe4b10ffb7d0436c55cf46b93ae", - git_commit = "3c6e6885f32e7638ece306dad3a5081b06137bdc", + sha256 = "da29c49c0ff88093bff1a168255bca5392a3823f2b474b130ba7cb4045d2f6fd", + git_commit = "3aa8b781b342c36302bd500737ab4ce9b2b87a45", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From df5ad1540993bda08303436f9b72d8b2547ff1e3 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Mon, 1 Oct 2018 16:05:29 -0700 Subject: [PATCH 1279/8103] Default to valid version for wheel file PiperOrigin-RevId: 215297715 --- tensorflow_serving/tools/pip_package/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/tools/pip_package/setup.py b/tensorflow_serving/tools/pip_package/setup.py index f68d4fed340..c68adc73431 100644 --- a/tensorflow_serving/tools/pip_package/setup.py +++ b/tensorflow_serving/tools/pip_package/setup.py @@ -29,7 +29,7 @@ DOCLINES = __doc__.split('\n') # Set when releasing a new version of TensorFlow Serving (e.g. 1.0.0). -_VERSION = 'undefined' +_VERSION = '0.0.0' REQUIRED_PACKAGES = [ 'tensorflow>=1.2.0,<2', From dc29c2a9908434de37ad946f122bfb18c6399348 Mon Sep 17 00:00:00 2001 From: Lihang Li Date: Mon, 1 Oct 2018 17:08:37 -0700 Subject: [PATCH 1280/8103] Update docker.md --- tensorflow_serving/g3doc/docker.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/g3doc/docker.md b/tensorflow_serving/g3doc/docker.md index 7190bfebe47..dfbfaba70dd 100644 --- a/tensorflow_serving/g3doc/docker.md +++ b/tensorflow_serving/g3doc/docker.md @@ -338,7 +338,7 @@ We currently maintain the following Dockerfiles: * [`Dockerfile`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile), which is a minimal VM with TensorFlow Serving installed. -* [`Dockerfile.gpu`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile), +* [`Dockerfile.gpu`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.gpu), which is a minimal VM with TensorFlow Serving with GPU support to be used with `nvidia-docker`. From 48b71603188701bcfcba24fc3fc2ba86f15f2a0b Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Mon, 1 Oct 2018 17:49:29 -0700 Subject: [PATCH 1281/8103] Update to cuDNN 7.2 in Docker images PiperOrigin-RevId: 215313756 --- .../tools/docker/Dockerfile.devel-gpu | 4 ++-- .../tools/docker/Dockerfile.gpu | 20 ++++++++++++++++--- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 5c04570f27e..facdcab4349 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -21,7 +21,7 @@ LABEL tensorflow_serving_github_branchtag=${TF_SERVING_VERSION_GIT_BRANCH} LABEL tensorflow_serving_github_commit=${TF_SERVING_VERSION_GIT_COMMIT} ENV NCCL_VERSION=2.2.13 -ENV CUDNN_VERSION=7.1.4.18 +ENV CUDNN_VERSION=7.2.1.38 ENV TF_TENSORRT_VERSION=4.1.2 RUN apt-get update && apt-get install -y --no-install-recommends \ @@ -181,4 +181,4 @@ FROM binary_build as clean_build # Clean up Bazel cache when done. RUN bazel clean --expunge --color=yes && \ rm -rf /root/.cache -CMD ["/bin/bash"] +CMD ["/bin/bash"] \ No newline at end of file diff --git a/tensorflow_serving/tools/docker/Dockerfile.gpu b/tensorflow_serving/tools/docker/Dockerfile.gpu index 283f0349963..1d13b5c7214 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.gpu @@ -16,7 +16,7 @@ ARG TF_SERVING_VERSION=latest ARG TF_SERVING_BUILD_IMAGE=tensorflow/serving:${TF_SERVING_VERSION}-devel-gpu FROM ${TF_SERVING_BUILD_IMAGE} as build_image -FROM nvidia/cuda:9.0-cudnn7-runtime-ubuntu16.04 +FROM nvidia/cuda:9.0-base-ubuntu16.04 ARG TF_SERVING_VERSION_GIT_BRANCH=master ARG TF_SERVING_VERSION_GIT_COMMIT=head @@ -25,9 +25,22 @@ LABEL maintainer="gvasudevan@google.com" LABEL tensorflow_serving_github_branchtag=${TF_SERVING_VERSION_GIT_BRANCH} LABEL tensorflow_serving_github_commit=${TF_SERVING_VERSION_GIT_COMMIT} +ENV NCCL_VERSION=2.2.13 +ENV CUDNN_VERSION=7.2.1.38 +ENV TF_TENSORRT_VERSION=4.1.2 + RUN apt-get update && apt-get install -y --no-install-recommends \ - libgomp1 \ ca-certificates \ + cuda-command-line-tools-9-0 \ + cuda-command-line-tools-9-0 \ + cuda-cublas-9-0 \ + cuda-cufft-9-0 \ + cuda-curand-9-0 \ + cuda-cusolver-9-0 \ + cuda-cusparse-9-0 \ + libcudnn7=${CUDNN_VERSION}-1+cuda9.0 \ + libnccl2=${NCCL_VERSION}-1+cuda9.0 \ + libgomp1 \ && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* @@ -42,7 +55,8 @@ RUN apt-get update && \ apt-get install --no-install-recommends \ nvinfer-runtime-trt-repo-ubuntu1604-4.0.1-ga-cuda9.0 && \ apt-get update && \ - apt-get install --no-install-recommends libnvinfer4=4.1.2-1+cuda9.0 && \ + apt-get install --no-install-recommends \ + libnvinfer4=${TF_TENSORRT_VERSION}-1+cuda9.0 && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* && \ rm /usr/lib/x86_64-linux-gnu/libnvinfer_plugin* && \ From 42c8bfc0cbefcd364cdbf37bb774dd11123916bc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Oct 2018 18:00:51 -0700 Subject: [PATCH 1282/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215315188 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0f72330be90..6d3395a9379 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "da29c49c0ff88093bff1a168255bca5392a3823f2b474b130ba7cb4045d2f6fd", - git_commit = "3aa8b781b342c36302bd500737ab4ce9b2b87a45", + sha256 = "17688c74e9e6de7ee57d8dfdbd1c0df1e9a623276421458ccecc76b00bea6220", + git_commit = "b72265dc002e712fc3d0f33434f13c7a36a484b2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3c639f223d335f4b883c107e0e6796707e7787df Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Oct 2018 19:01:41 -0700 Subject: [PATCH 1283/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215320954 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6d3395a9379..b513e732d0f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "17688c74e9e6de7ee57d8dfdbd1c0df1e9a623276421458ccecc76b00bea6220", - git_commit = "b72265dc002e712fc3d0f33434f13c7a36a484b2", + sha256 = "25a1c4be8178a7bd13c9618932e5b97a368e7ec22add13df0b9bd28a20f14fc6", + git_commit = "beede8525be5386451bf0098992c37416d1864db", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6654e945dc009635cbd9a0d7e8d8b25706415fe2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Oct 2018 21:01:36 -0700 Subject: [PATCH 1284/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215329959 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b513e732d0f..b7119802f75 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "25a1c4be8178a7bd13c9618932e5b97a368e7ec22add13df0b9bd28a20f14fc6", - git_commit = "beede8525be5386451bf0098992c37416d1864db", + sha256 = "030abf4209f130df755ee93312b72cc43367362e1728ba60b9de8e6bed738bae", + git_commit = "991f06fd50fc73285ce415d57f720994c2b2e861", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From edb52397cd87ed859a8e05f2de8a2e2317934449 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Oct 2018 22:01:39 -0700 Subject: [PATCH 1285/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215334104 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b7119802f75..75dd90819e1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "030abf4209f130df755ee93312b72cc43367362e1728ba60b9de8e6bed738bae", - git_commit = "991f06fd50fc73285ce415d57f720994c2b2e861", + sha256 = "aeed7c1fe8e56796ce0933640c09d8b5212e915d4ca1e4261ac31fe8682269de", + git_commit = "350388fca9cb9509962ff393a9d21fb2879c9179", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From faa68607962220c7c0ed84c89c59cc703612921c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Oct 2018 23:01:06 -0700 Subject: [PATCH 1286/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215337987 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 75dd90819e1..c70d5304d55 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "aeed7c1fe8e56796ce0933640c09d8b5212e915d4ca1e4261ac31fe8682269de", - git_commit = "350388fca9cb9509962ff393a9d21fb2879c9179", + sha256 = "b26a2f4ecdbb1fbd3c820d86d35d7ea6a644fc195eeb9fc0ebdece5ce8491a4a", + git_commit = "6161d8cc4d66b87ba198cb6a16d83ce317c77eff", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e6da1df378451154f82e8153742c7bcb49f0e82c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Oct 2018 00:01:14 -0700 Subject: [PATCH 1287/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215341537 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c70d5304d55..14af822d218 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b26a2f4ecdbb1fbd3c820d86d35d7ea6a644fc195eeb9fc0ebdece5ce8491a4a", - git_commit = "6161d8cc4d66b87ba198cb6a16d83ce317c77eff", + sha256 = "eb2a4ec1293f70d69158a3728fb2e2fe8df99d3a6129d9dee3ceca1d7dcb1e72", + git_commit = "721ab82745a113fb8cca4ce2b1f22d1d5ab5d546", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 54b5c76fd860d5e8c08fdb9bca8e01ab2f04b061 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Oct 2018 01:01:51 -0700 Subject: [PATCH 1288/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215346789 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 14af822d218..3647f1cbc95 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eb2a4ec1293f70d69158a3728fb2e2fe8df99d3a6129d9dee3ceca1d7dcb1e72", - git_commit = "721ab82745a113fb8cca4ce2b1f22d1d5ab5d546", + sha256 = "4c6e71d88dfd8bb598048df9d6afd05e44fb77da0e227e9098ec11527edb2df6", + git_commit = "9884cb36290664593682d235ce0d5e1925e3fa23", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4b9c431bb9f601635e27c69d47414da7a6699716 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Oct 2018 05:02:19 -0700 Subject: [PATCH 1289/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215369485 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3647f1cbc95..7463784a89e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4c6e71d88dfd8bb598048df9d6afd05e44fb77da0e227e9098ec11527edb2df6", - git_commit = "9884cb36290664593682d235ce0d5e1925e3fa23", + sha256 = "1be7f67b24e9eb262854a97505b89a1caec15756b172aa0179e32992be7e8af1", + git_commit = "f22037abf5a6f4581f5fb6013f72f91747f22965", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ec0a3642988cba1db21535eb61be816c3fafd0b2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Oct 2018 07:02:33 -0700 Subject: [PATCH 1290/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215381464 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7463784a89e..93bcc359cd5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1be7f67b24e9eb262854a97505b89a1caec15756b172aa0179e32992be7e8af1", - git_commit = "f22037abf5a6f4581f5fb6013f72f91747f22965", + sha256 = "79a6e877b5402f1f2656f8df4cc141752e3cf9d875bf5f4f33ea75640d489b3c", + git_commit = "35f3046a326daea0179d024044636f2fcbb45f4a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 625fc9cb470bb8b11a617a5e1ba0708bea4d8abf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Oct 2018 09:03:03 -0700 Subject: [PATCH 1291/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215397447 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 93bcc359cd5..bf60a617b8c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "79a6e877b5402f1f2656f8df4cc141752e3cf9d875bf5f4f33ea75640d489b3c", - git_commit = "35f3046a326daea0179d024044636f2fcbb45f4a", + sha256 = "e9d90c0300440693bc575b96c85127a66c9b51d6865f45bbe149339a80042bde", + git_commit = "97d515273a1e86a861cdfb338671a42b3b1126a7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 029d4218ddf68029cceac868ad32542e0aeab118 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Oct 2018 10:01:52 -0700 Subject: [PATCH 1292/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215407885 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bf60a617b8c..d7b21902f04 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e9d90c0300440693bc575b96c85127a66c9b51d6865f45bbe149339a80042bde", - git_commit = "97d515273a1e86a861cdfb338671a42b3b1126a7", + sha256 = "084506bfade05567260b65b8774a2722762d2bcfc782868310b1803431e424b2", + git_commit = "28757ad658243526d84fd16d53b9eefbf809c6ff", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From aa559f1aa94549cd298b2c661d863559bfa49aea Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Oct 2018 11:01:17 -0700 Subject: [PATCH 1293/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215420319 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d7b21902f04..fa4a09b7777 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "084506bfade05567260b65b8774a2722762d2bcfc782868310b1803431e424b2", - git_commit = "28757ad658243526d84fd16d53b9eefbf809c6ff", + sha256 = "bc8c1c1624c609a6e8bb34fb0e9f202452fe8725ce7d52ee7d2c26b54f049ff2", + git_commit = "dd66b78b38b457c7d37527472c4e92a7a07f4b09", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7c41445b350717f117bf2e4ab10a0492d1c84165 Mon Sep 17 00:00:00 2001 From: olston Date: Tue, 2 Oct 2018 12:41:35 -0700 Subject: [PATCH 1294/8103] Shift tensorflow_serving #includes to the new non-contrib location of the TF batch_util libraries. PiperOrigin-RevId: 215440841 --- tensorflow_serving/batching/BUILD | 12 ++++++------ tensorflow_serving/batching/README.md | 2 +- .../batching/batch_scheduler_retrier.h | 2 +- .../batching/batch_scheduler_retrier_test.cc | 2 +- tensorflow_serving/batching/batching_session.h | 4 ++-- .../batching/streaming_batch_scheduler.h | 2 +- .../batching/streaming_batch_scheduler_test.cc | 2 +- tensorflow_serving/batching/test_util/BUILD | 2 +- .../batching/test_util/puppet_batch_scheduler.h | 2 +- tensorflow_serving/core/BUILD | 4 ++-- tensorflow_serving/core/aspired_versions_manager.h | 2 +- .../core/aspired_versions_manager_benchmark.cc | 2 +- .../core/servable_state_monitor_test.cc | 2 +- tensorflow_serving/servables/tensorflow/BUILD | 10 +++++----- .../servables/tensorflow/bundle_factory_util.cc | 2 +- .../servables/tensorflow/bundle_factory_util.h | 2 +- .../servables/tensorflow/bundle_factory_util_test.cc | 2 +- .../tensorflow/saved_model_bundle_factory.h | 2 +- .../servables/tensorflow/session_bundle_factory.h | 2 +- tensorflow_serving/sources/storage_path/BUILD | 2 +- .../storage_path/file_system_storage_path_source.h | 2 +- tensorflow_serving/util/BUILD | 6 +++--- tensorflow_serving/util/event_bus_test.cc | 2 +- .../util/fast_read_dynamic_ptr_benchmark.cc | 2 +- tensorflow_serving/util/observer_test.cc | 2 +- 25 files changed, 38 insertions(+), 38 deletions(-) diff --git a/tensorflow_serving/batching/BUILD b/tensorflow_serving/batching/BUILD index 73e7212e97b..c38502555c1 100644 --- a/tensorflow_serving/batching/BUILD +++ b/tensorflow_serving/batching/BUILD @@ -26,8 +26,8 @@ cc_library( deps = [ ":batch_scheduler_retrier", "//tensorflow_serving/util:optional", - "@org_tensorflow//tensorflow/contrib/batching:batch_scheduler", "@org_tensorflow//tensorflow/core:lib", + "@org_tensorflow//tensorflow/core/kernels/batching_util:batch_scheduler", ], ) @@ -39,10 +39,10 @@ cc_test( deps = [ ":streaming_batch_scheduler", "//tensorflow_serving/core/test_util:test_main", - "@org_tensorflow//tensorflow/contrib/batching/test_util:fake_clock_env", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", + "@org_tensorflow//tensorflow/core/kernels/batching_util:fake_clock_env", ], ) @@ -59,12 +59,12 @@ cc_library( "//tensorflow_serving/util:cleanup", "//tensorflow_serving/util:hash", "//tensorflow_serving/util:optional", - "@org_tensorflow//tensorflow/contrib/batching:basic_batch_scheduler", - "@org_tensorflow//tensorflow/contrib/batching:batch_scheduler", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:tensorflow", + "@org_tensorflow//tensorflow/core/kernels/batching_util:basic_batch_scheduler", + "@org_tensorflow//tensorflow/core/kernels/batching_util:batch_scheduler", ], ) @@ -98,8 +98,8 @@ cc_library( hdrs = ["batch_scheduler_retrier.h"], visibility = ["//visibility:public"], deps = [ - "@org_tensorflow//tensorflow/contrib/batching:batch_scheduler", "@org_tensorflow//tensorflow/core:lib", + "@org_tensorflow//tensorflow/core/kernels/batching_util:batch_scheduler", ], ) @@ -111,10 +111,10 @@ cc_test( deps = [ ":batch_scheduler_retrier", "//tensorflow_serving/core/test_util:test_main", - "@org_tensorflow//tensorflow/contrib/batching/test_util:fake_clock_env", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", + "@org_tensorflow//tensorflow/core/kernels/batching_util:fake_clock_env", ], ) diff --git a/tensorflow_serving/batching/README.md b/tensorflow_serving/batching/README.md index f92e47e04e6..4d584587d13 100644 --- a/tensorflow_serving/batching/README.md +++ b/tensorflow_serving/batching/README.md @@ -21,7 +21,7 @@ to simplify exposition). It offers a specific TensorFlow Session API, as well as lower-level APIs that can be used to batch at other granularities. The library is currently split across two locations: -(1) tensorflow/contrib/batching (core API and implementation), and +(1) core/kernels/batching_util (core API and implementation), and (2) tensorflow_serving/batching (higher-level and experimental code). The library offers several alternative classes to choose from. The reason for diff --git a/tensorflow_serving/batching/batch_scheduler_retrier.h b/tensorflow_serving/batching/batch_scheduler_retrier.h index b65d5960b86..d6fd9452ee7 100644 --- a/tensorflow_serving/batching/batch_scheduler_retrier.h +++ b/tensorflow_serving/batching/batch_scheduler_retrier.h @@ -21,7 +21,7 @@ limitations under the License. #include #include -#include "tensorflow/contrib/batching/batch_scheduler.h" +#include "tensorflow/core/kernels/batching_util/batch_scheduler.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/platform/env.h" #include "tensorflow/core/platform/macros.h" diff --git a/tensorflow_serving/batching/batch_scheduler_retrier_test.cc b/tensorflow_serving/batching/batch_scheduler_retrier_test.cc index 1bbe388993f..9583f2e47a4 100644 --- a/tensorflow_serving/batching/batch_scheduler_retrier_test.cc +++ b/tensorflow_serving/batching/batch_scheduler_retrier_test.cc @@ -18,7 +18,7 @@ limitations under the License. #include #include -#include "tensorflow/contrib/batching/test_util/fake_clock_env.h" +#include "tensorflow/core/kernels/batching_util/fake_clock_env.h" #include "tensorflow/core/lib/core/error_codes.pb.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/lib/core/notification.h" diff --git a/tensorflow_serving/batching/batching_session.h b/tensorflow_serving/batching/batching_session.h index 0ce8bf34939..9a1f0f583dd 100644 --- a/tensorflow_serving/batching/batching_session.h +++ b/tensorflow_serving/batching/batching_session.h @@ -26,8 +26,8 @@ limitations under the License. #include #include -#include "tensorflow/contrib/batching/basic_batch_scheduler.h" -#include "tensorflow/contrib/batching/batch_scheduler.h" +#include "tensorflow/core/kernels/batching_util/basic_batch_scheduler.h" +#include "tensorflow/core/kernels/batching_util/batch_scheduler.h" #include "tensorflow/core/protobuf/meta_graph.pb.h" #include "tensorflow/core/public/session.h" diff --git a/tensorflow_serving/batching/streaming_batch_scheduler.h b/tensorflow_serving/batching/streaming_batch_scheduler.h index a2b3369541f..c9b7fbf44c5 100644 --- a/tensorflow_serving/batching/streaming_batch_scheduler.h +++ b/tensorflow_serving/batching/streaming_batch_scheduler.h @@ -23,7 +23,7 @@ limitations under the License. #include #include -#include "tensorflow/contrib/batching/batch_scheduler.h" +#include "tensorflow/core/kernels/batching_util/batch_scheduler.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/lib/core/notification.h" #include "tensorflow/core/lib/core/status.h" diff --git a/tensorflow_serving/batching/streaming_batch_scheduler_test.cc b/tensorflow_serving/batching/streaming_batch_scheduler_test.cc index a7949e948c4..2e49319e6af 100644 --- a/tensorflow_serving/batching/streaming_batch_scheduler_test.cc +++ b/tensorflow_serving/batching/streaming_batch_scheduler_test.cc @@ -19,7 +19,7 @@ limitations under the License. #include #include -#include "tensorflow/contrib/batching/test_util/fake_clock_env.h" +#include "tensorflow/core/kernels/batching_util/fake_clock_env.h" #include "tensorflow/core/lib/core/error_codes.pb.h" #include "tensorflow/core/lib/core/status_test_util.h" #include "tensorflow/core/platform/macros.h" diff --git a/tensorflow_serving/batching/test_util/BUILD b/tensorflow_serving/batching/test_util/BUILD index 5673ad23d06..cf79be68122 100644 --- a/tensorflow_serving/batching/test_util/BUILD +++ b/tensorflow_serving/batching/test_util/BUILD @@ -24,8 +24,8 @@ cc_library( hdrs = ["puppet_batch_scheduler.h"], visibility = ["//visibility:private"], deps = [ - "@org_tensorflow//tensorflow/contrib/batching:batch_scheduler", "@org_tensorflow//tensorflow/core:tensorflow", + "@org_tensorflow//tensorflow/core/kernels/batching_util:batch_scheduler", ], ) diff --git a/tensorflow_serving/batching/test_util/puppet_batch_scheduler.h b/tensorflow_serving/batching/test_util/puppet_batch_scheduler.h index 84df13926e2..a588053663c 100644 --- a/tensorflow_serving/batching/test_util/puppet_batch_scheduler.h +++ b/tensorflow_serving/batching/test_util/puppet_batch_scheduler.h @@ -24,7 +24,7 @@ limitations under the License. #include #include -#include "tensorflow/contrib/batching/batch_scheduler.h" +#include "tensorflow/core/kernels/batching_util/batch_scheduler.h" namespace tensorflow { namespace serving { diff --git a/tensorflow_serving/core/BUILD b/tensorflow_serving/core/BUILD index c4d051551ad..66ba8ee04fc 100644 --- a/tensorflow_serving/core/BUILD +++ b/tensorflow_serving/core/BUILD @@ -403,7 +403,7 @@ cc_test( deps = [ ":servable_state_monitor", "//tensorflow_serving/core/test_util:test_main", - "@org_tensorflow//tensorflow/contrib/batching/test_util:fake_clock_env", + "@org_tensorflow//tensorflow/core/kernels/batching_util:fake_clock_env", ], ) @@ -503,8 +503,8 @@ cc_library( "//tensorflow_serving/util:event_bus", "//tensorflow_serving/util:observer", "//tensorflow_serving/util:optional", - "@org_tensorflow//tensorflow/contrib/batching/util:periodic_function_dynamic", "@org_tensorflow//tensorflow/core:lib", + "@org_tensorflow//tensorflow/core/kernels/batching_util:periodic_function_dynamic", ], ) diff --git a/tensorflow_serving/core/aspired_versions_manager.h b/tensorflow_serving/core/aspired_versions_manager.h index 505c7a7c073..9c412e2c3e3 100644 --- a/tensorflow_serving/core/aspired_versions_manager.h +++ b/tensorflow_serving/core/aspired_versions_manager.h @@ -21,7 +21,7 @@ limitations under the License. #include #include -#include "tensorflow/contrib/batching/util/periodic_function.h" +#include "tensorflow/core/kernels/batching_util/periodic_function.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/lib/core/stringpiece.h" #include "tensorflow/core/lib/hash/hash.h" diff --git a/tensorflow_serving/core/aspired_versions_manager_benchmark.cc b/tensorflow_serving/core/aspired_versions_manager_benchmark.cc index 4e109201c2f..fc5dbf8a0a0 100644 --- a/tensorflow_serving/core/aspired_versions_manager_benchmark.cc +++ b/tensorflow_serving/core/aspired_versions_manager_benchmark.cc @@ -26,7 +26,7 @@ limitations under the License. #include #include -#include "tensorflow/contrib/batching/util/periodic_function.h" +#include "tensorflow/core/kernels/batching_util/periodic_function.h" #include "tensorflow/core/lib/core/notification.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/lib/core/threadpool.h" diff --git a/tensorflow_serving/core/servable_state_monitor_test.cc b/tensorflow_serving/core/servable_state_monitor_test.cc index 35f4bf6f8ef..f38d6c7804e 100644 --- a/tensorflow_serving/core/servable_state_monitor_test.cc +++ b/tensorflow_serving/core/servable_state_monitor_test.cc @@ -17,7 +17,7 @@ limitations under the License. #include #include -#include "tensorflow/contrib/batching/test_util/fake_clock_env.h" +#include "tensorflow/core/kernels/batching_util/fake_clock_env.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/platform/logging.h" diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index b710cf87633..8bfaaef45ad 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -49,11 +49,11 @@ cc_library( "//tensorflow_serving/resources:resource_values", "//tensorflow_serving/resources:resources_proto", "//tensorflow_serving/util:file_probing_env", - "@org_tensorflow//tensorflow/contrib/batching:batch_scheduler", - "@org_tensorflow//tensorflow/contrib/batching:shared_batch_scheduler", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", + "@org_tensorflow//tensorflow/core/kernels/batching_util:batch_scheduler", + "@org_tensorflow//tensorflow/core/kernels/batching_util:shared_batch_scheduler", "@protobuf_archive//:cc_wkt_protos", ], ) @@ -72,13 +72,13 @@ cc_test( "//tensorflow_serving/resources:resources_proto", "//tensorflow_serving/test_util", "//tensorflow_serving/util/test_util:mock_file_probing_env", - "@org_tensorflow//tensorflow/contrib/batching:shared_batch_scheduler", "@org_tensorflow//tensorflow/contrib/session_bundle", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", + "@org_tensorflow//tensorflow/core/kernels/batching_util:shared_batch_scheduler", "@protobuf_archive//:cc_wkt_protos", ], ) @@ -130,12 +130,12 @@ cc_library( ":session_bundle_config_proto", "//tensorflow_serving/batching:batching_session", "//tensorflow_serving/resources:resources_proto", - "@org_tensorflow//tensorflow/contrib/batching:shared_batch_scheduler", "@org_tensorflow//tensorflow/contrib/session_bundle", "@org_tensorflow//tensorflow/contrib/session_bundle:bundle_shim", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", + "@org_tensorflow//tensorflow/core/kernels/batching_util:shared_batch_scheduler", ], ) @@ -175,11 +175,11 @@ cc_library( "//tensorflow_serving/resources:resources_proto", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/cc/saved_model:tag_constants", - "@org_tensorflow//tensorflow/contrib/batching:shared_batch_scheduler", "@org_tensorflow//tensorflow/contrib/session_bundle:bundle_shim", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", + "@org_tensorflow//tensorflow/core/kernels/batching_util:shared_batch_scheduler", ], ) diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_util.cc b/tensorflow_serving/servables/tensorflow/bundle_factory_util.cc index 82dd9701a1c..bdf098a4d4a 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_util.cc +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_util.cc @@ -16,7 +16,7 @@ limitations under the License. #include "tensorflow_serving/servables/tensorflow/bundle_factory_util.h" #include "google/protobuf/wrappers.pb.h" -#include "tensorflow/contrib/batching/batch_scheduler.h" +#include "tensorflow/core/kernels/batching_util/batch_scheduler.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/lib/io/path.h" #include "tensorflow/core/platform/env.h" diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_util.h b/tensorflow_serving/servables/tensorflow/bundle_factory_util.h index ee0ebda5d2a..85e099abaf1 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_util.h +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_util.h @@ -16,7 +16,7 @@ limitations under the License. #ifndef TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_BUNDLE_FACTORY_UTIL_H_ #define TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_BUNDLE_FACTORY_UTIL_H_ -#include "tensorflow/contrib/batching/shared_batch_scheduler.h" +#include "tensorflow/core/kernels/batching_util/shared_batch_scheduler.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/protobuf/config.pb.h" #include "tensorflow/core/public/session.h" diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc b/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc index cd39f31db18..7a73480b8b8 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc @@ -23,8 +23,8 @@ limitations under the License. #include "google/protobuf/wrappers.pb.h" #include #include -#include "tensorflow/contrib/batching/shared_batch_scheduler.h" #include "tensorflow/contrib/session_bundle/session_bundle.h" +#include "tensorflow/core/kernels/batching_util/shared_batch_scheduler.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/lib/core/status_test_util.h" #include "tensorflow/core/lib/io/path.h" diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.h b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.h index df3c3419b20..b3b14e241d3 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.h +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.h @@ -17,7 +17,7 @@ limitations under the License. #define TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_SAVED_MODEL_BUNDLE_FACTORY_H_ #include "tensorflow/cc/saved_model/loader.h" -#include "tensorflow/contrib/batching/shared_batch_scheduler.h" +#include "tensorflow/core/kernels/batching_util/shared_batch_scheduler.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/platform/macros.h" #include "tensorflow_serving/batching/batching_session.h" diff --git a/tensorflow_serving/servables/tensorflow/session_bundle_factory.h b/tensorflow_serving/servables/tensorflow/session_bundle_factory.h index 38f3f830368..fa93c9f43e5 100644 --- a/tensorflow_serving/servables/tensorflow/session_bundle_factory.h +++ b/tensorflow_serving/servables/tensorflow/session_bundle_factory.h @@ -16,8 +16,8 @@ limitations under the License. #ifndef TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_SESSION_BUNDLE_FACTORY_H_ #define TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_SESSION_BUNDLE_FACTORY_H_ -#include "tensorflow/contrib/batching/shared_batch_scheduler.h" #include "tensorflow/contrib/session_bundle/session_bundle.h" +#include "tensorflow/core/kernels/batching_util/shared_batch_scheduler.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow_serving/batching/batching_session.h" #include "tensorflow_serving/resources/resources.pb.h" diff --git a/tensorflow_serving/sources/storage_path/BUILD b/tensorflow_serving/sources/storage_path/BUILD index 561f2cd495f..ef040c6f710 100644 --- a/tensorflow_serving/sources/storage_path/BUILD +++ b/tensorflow_serving/sources/storage_path/BUILD @@ -75,9 +75,9 @@ cc_library( "//tensorflow_serving/core:servable_id", "//tensorflow_serving/core:source", "//tensorflow_serving/core:storage_path", - "@org_tensorflow//tensorflow/contrib/batching/util:periodic_function_dynamic", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:tensorflow", + "@org_tensorflow//tensorflow/core/kernels/batching_util:periodic_function_dynamic", ], ) diff --git a/tensorflow_serving/sources/storage_path/file_system_storage_path_source.h b/tensorflow_serving/sources/storage_path/file_system_storage_path_source.h index 7cc53dd42a4..fd9af2d57f8 100644 --- a/tensorflow_serving/sources/storage_path/file_system_storage_path_source.h +++ b/tensorflow_serving/sources/storage_path/file_system_storage_path_source.h @@ -18,7 +18,7 @@ limitations under the License. #include -#include "tensorflow/contrib/batching/util/periodic_function.h" +#include "tensorflow/core/kernels/batching_util/periodic_function.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/platform/macros.h" #include "tensorflow/core/platform/types.h" diff --git a/tensorflow_serving/util/BUILD b/tensorflow_serving/util/BUILD index 86d2686ca4e..7716baba520 100644 --- a/tensorflow_serving/util/BUILD +++ b/tensorflow_serving/util/BUILD @@ -94,8 +94,8 @@ cc_test( deps = [ ":observer", "//tensorflow_serving/core/test_util:test_main", - "@org_tensorflow//tensorflow/contrib/batching/util:periodic_function", "@org_tensorflow//tensorflow/core:lib", + "@org_tensorflow//tensorflow/core/kernels/batching_util:periodic_function", ], ) @@ -119,7 +119,7 @@ cc_test( deps = [ ":event_bus", "//tensorflow_serving/core/test_util:test_main", - "@org_tensorflow//tensorflow/contrib/batching/test_util:fake_clock_env", + "@org_tensorflow//tensorflow/core/kernels/batching_util:fake_clock_env", ], ) @@ -148,10 +148,10 @@ cc_test( srcs = ["fast_read_dynamic_ptr_benchmark.cc"], deps = [ ":fast_read_dynamic_ptr", - "@org_tensorflow//tensorflow/contrib/batching/util:periodic_function", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:tensorflow", "@org_tensorflow//tensorflow/core:test", + "@org_tensorflow//tensorflow/core/kernels/batching_util:periodic_function", ], ) diff --git a/tensorflow_serving/util/event_bus_test.cc b/tensorflow_serving/util/event_bus_test.cc index 5a815c29b2d..b0e845433b9 100644 --- a/tensorflow_serving/util/event_bus_test.cc +++ b/tensorflow_serving/util/event_bus_test.cc @@ -16,7 +16,7 @@ limitations under the License. #include "tensorflow_serving/util/event_bus.h" #include -#include "tensorflow/contrib/batching/test_util/fake_clock_env.h" +#include "tensorflow/core/kernels/batching_util/fake_clock_env.h" namespace tensorflow { namespace serving { diff --git a/tensorflow_serving/util/fast_read_dynamic_ptr_benchmark.cc b/tensorflow_serving/util/fast_read_dynamic_ptr_benchmark.cc index 2e2987f34ef..5ce49c4d394 100644 --- a/tensorflow_serving/util/fast_read_dynamic_ptr_benchmark.cc +++ b/tensorflow_serving/util/fast_read_dynamic_ptr_benchmark.cc @@ -38,7 +38,7 @@ limitations under the License. #include #include -#include "tensorflow/contrib/batching/util/periodic_function.h" +#include "tensorflow/core/kernels/batching_util/periodic_function.h" #include "tensorflow/core/lib/core/notification.h" #include "tensorflow/core/lib/core/threadpool.h" #include "tensorflow/core/platform/env.h" diff --git a/tensorflow_serving/util/observer_test.cc b/tensorflow_serving/util/observer_test.cc index 593362419dd..1fb0f1d5c05 100644 --- a/tensorflow_serving/util/observer_test.cc +++ b/tensorflow_serving/util/observer_test.cc @@ -16,7 +16,7 @@ limitations under the License. #include "tensorflow_serving/util/observer.h" #include -#include "tensorflow/contrib/batching/util/periodic_function.h" +#include "tensorflow/core/kernels/batching_util/periodic_function.h" #include "tensorflow/core/platform/env.h" namespace tensorflow { From 935994a5f7ee56c59048c955b896c38c45a8e7b9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Oct 2018 13:06:51 -0700 Subject: [PATCH 1295/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215444937 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fa4a09b7777..2fad3927261 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bc8c1c1624c609a6e8bb34fb0e9f202452fe8725ce7d52ee7d2c26b54f049ff2", - git_commit = "dd66b78b38b457c7d37527472c4e92a7a07f4b09", + sha256 = "02a9e80948c0fa3be87b7aa7f70915732dafb300cfff0ce923c301bf624cc4da", + git_commit = "b4c23d661228b549186dc82c16ecb22d261becf6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From dba55c6f89c6478f775e8bb72b7f8682bb99c06c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Oct 2018 14:01:14 -0700 Subject: [PATCH 1296/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215453821 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2fad3927261..be0cfe19671 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "02a9e80948c0fa3be87b7aa7f70915732dafb300cfff0ce923c301bf624cc4da", - git_commit = "b4c23d661228b549186dc82c16ecb22d261becf6", + sha256 = "9d3cd373d9ee19231e902536f6b2ad9008615a523a4127646326ed0aa1b6f6bc", + git_commit = "8d4ef71f06a06a093419bf0f80562a1941059029", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 739b2065a4bd7f08b6f4b61ba6604124c1513db0 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Tue, 2 Oct 2018 14:54:50 -0700 Subject: [PATCH 1297/8103] Fix missing NCCL header path PiperOrigin-RevId: 215463591 --- tensorflow_serving/tools/docker/Dockerfile.devel-gpu | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index facdcab4349..3b8e1880f97 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -126,16 +126,16 @@ RUN mkdir /usr/lib/x86_64-linux-gnu/include/ && \ # NCCL 2.x ENV TF_NCCL_VERSION=2 -ENV NCCL_INSTALL_PATH=/usr/lib/nccl/ +ENV NCCL_INSTALL_PATH=/usr/lib/nccl/lib +ENV NCCL_HDR_PATH=/usr/lib/nccl/include # Fix paths so that NCCL can be found WORKDIR / RUN mkdir -p ${NCCL_INSTALL_PATH} && \ - mkdir ${NCCL_INSTALL_PATH}include/ && \ - mkdir ${NCCL_INSTALL_PATH}lib/ && \ - ln -s /usr/include/nccl.h ${NCCL_INSTALL_PATH}include/nccl.h && \ - ln -s /usr/lib/x86_64-linux-gnu/libnccl.so ${NCCL_INSTALL_PATH}lib/libnccl.so && \ - ln -s /usr/lib/x86_64-linux-gnu/libnccl.so.${TF_NCCL_VERSION} ${NCCL_INSTALL_PATH}lib/libnccl.so.${TF_NCCL_VERSION} + mkdir -p ${NCCL_HDR_PATH} && \ + ln -s /usr/include/nccl.h ${NCCL_HDR_PATH}/nccl.h && \ + ln -s /usr/lib/x86_64-linux-gnu/libnccl.so ${NCCL_INSTALL_PATH}/libnccl.so && \ + ln -s /usr/lib/x86_64-linux-gnu/libnccl.so.${TF_NCCL_VERSION} ${NCCL_INSTALL_PATH}/libnccl.so.${TF_NCCL_VERSION} # Set TMP for nvidia build environment ENV TMP="/tmp" From 462072c2d78124c2769f820f7b63ee086de4e305 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Tue, 2 Oct 2018 15:29:25 -0700 Subject: [PATCH 1298/8103] Remove version pinning on pip packages PiperOrigin-RevId: 215470097 --- tensorflow_serving/tools/docker/Dockerfile.devel | 6 +++--- tensorflow_serving/tools/docker/Dockerfile.devel-gpu | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index ebc8a9c180c..4415ea12813 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -53,10 +53,10 @@ RUN curl -fSsL -O https://bootstrap.pypa.io/get-pip.py && \ RUN pip --no-cache-dir install \ grpcio \ h5py \ - keras_applications==1.0.4 \ - keras_preprocessing==1.0.2 \ + keras_applications \ + keras_preprocessing \ mock \ - numpy==1.14.5 + numpy # Set up Bazel # Need >= 0.15.0 so bazel compiles work with docker bind mounts. diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 3b8e1880f97..6cfb90066d2 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -88,10 +88,10 @@ RUN curl -fSsL -O https://bootstrap.pypa.io/get-pip.py && \ RUN pip --no-cache-dir install \ grpcio \ h5py \ - keras_applications==1.0.4 \ - keras_preprocessing==1.0.2 \ + keras_applications \ + keras_preprocessing \ mock \ - numpy==1.14.5 + numpy # Set up Bazel # Need >= 0.15.0 so bazel compiles work with docker bind mounts. From 070e915164211850dd9b56f7ffd52f67ec91d0ef Mon Sep 17 00:00:00 2001 From: blamb Date: Tue, 2 Oct 2018 17:26:03 -0700 Subject: [PATCH 1299/8103] Create subsite for /serving PiperOrigin-RevId: 215488960 --- tensorflow_serving/g3doc/_book.yaml | 42 +++ tensorflow_serving/g3doc/_config.yml | 23 -- .../g3doc/_includes/footer.html | 50 ---- tensorflow_serving/g3doc/_includes/head.html | 12 - .../g3doc/_includes/header.html | 7 - .../g3doc/_includes/icon-github.html | 1 - .../g3doc/_includes/icon-github.svg | 1 - .../g3doc/_includes/icon-twitter.html | 1 - .../g3doc/_includes/icon-twitter.svg | 1 - tensorflow_serving/g3doc/_includes/nav.md | 21 -- tensorflow_serving/g3doc/_index.yaml | 55 ++++ .../g3doc/_layouts/default.html | 27 -- tensorflow_serving/g3doc/_project.yaml | 11 + tensorflow_serving/g3doc/_sass/_base.scss | 225 -------------- tensorflow_serving/g3doc/_sass/_layout.scss | 275 ------------------ .../g3doc/_sass/_syntax-highlighting.scss | 71 ----- tensorflow_serving/g3doc/_toc.yaml | 24 -- tensorflow_serving/g3doc/css/main.scss | 55 ---- tensorflow_serving/g3doc/index.md | 19 -- .../{architecture_overview.md => overview.md} | 5 - 20 files changed, 108 insertions(+), 818 deletions(-) create mode 100644 tensorflow_serving/g3doc/_book.yaml delete mode 100644 tensorflow_serving/g3doc/_config.yml delete mode 100644 tensorflow_serving/g3doc/_includes/footer.html delete mode 100644 tensorflow_serving/g3doc/_includes/head.html delete mode 100644 tensorflow_serving/g3doc/_includes/header.html delete mode 100644 tensorflow_serving/g3doc/_includes/icon-github.html delete mode 100644 tensorflow_serving/g3doc/_includes/icon-github.svg delete mode 100644 tensorflow_serving/g3doc/_includes/icon-twitter.html delete mode 100644 tensorflow_serving/g3doc/_includes/icon-twitter.svg delete mode 100644 tensorflow_serving/g3doc/_includes/nav.md create mode 100644 tensorflow_serving/g3doc/_index.yaml delete mode 100644 tensorflow_serving/g3doc/_layouts/default.html create mode 100644 tensorflow_serving/g3doc/_project.yaml delete mode 100644 tensorflow_serving/g3doc/_sass/_base.scss delete mode 100644 tensorflow_serving/g3doc/_sass/_layout.scss delete mode 100644 tensorflow_serving/g3doc/_sass/_syntax-highlighting.scss delete mode 100644 tensorflow_serving/g3doc/_toc.yaml delete mode 100644 tensorflow_serving/g3doc/css/main.scss delete mode 100644 tensorflow_serving/g3doc/index.md rename tensorflow_serving/g3doc/{architecture_overview.md => overview.md} (98%) diff --git a/tensorflow_serving/g3doc/_book.yaml b/tensorflow_serving/g3doc/_book.yaml new file mode 100644 index 00000000000..36e0f67eaac --- /dev/null +++ b/tensorflow_serving/g3doc/_book.yaml @@ -0,0 +1,42 @@ +upper_tabs: +# Tabs left of dropdown menu +- include: /_upper_tabs_left.yaml +- include: /versions/_upper_tabs_versions.yaml +# Dropdown menu +- name: Ecosystem + path: /ecosystem + is_default: true + menu: + - include: /ecosystem/_menu_toc.yaml + lower_tabs: + # Subsite tabs + other: + - name: Guide + contents: + - title: Overview + path: /serving/overview + - title: Installation + path: /serving/setup + - title: Serve a TensorFlow model + path: /serving/serving_basic + - title: REST API + path: /serving/api_rest + - title: Build a TensorFlow ModelServer + path: /serving/serving_advanced + - title: Serve Inception Model with TensorFlow Serving and Kubernetes + path: /serving/serving_inception + - title: Create a new kind of servable + path: /serving/custom_servable + - title: Create a module that discovers new servable paths + path: /serving/custom_source + - title: SignatureDefs in SavedModel for TensorFlow Serving + path: /serving/signature_defs + - title: Use TensorFlow Serving with Docker + path: /serving/docker + - name: API + skip_translation: true + contents: + - heading: C++ reference + - title: All symbols + path: /serving/api_docs/cc/ + - include: /serving/api_docs/cc/_doxygen.yaml diff --git a/tensorflow_serving/g3doc/_config.yml b/tensorflow_serving/g3doc/_config.yml deleted file mode 100644 index 71a84622bd6..00000000000 --- a/tensorflow_serving/g3doc/_config.yml +++ /dev/null @@ -1,23 +0,0 @@ -# Jekyll configuration file for Github Pages. If you are running a local -# Jekyll server, note that his file is *NOT* reloaded automatically when you change it. If -# you change this file, please restart your local server process. - -# Site settings -title: TensorFlow Serving -email: discuss@tensorflow.org -description: > # this means to ignore newlines until "baseurl:" - TensorFlow Serving is a flexible, high-performance serving system for - machine learning models, designed for production environments. -baseurl: "/serving" # the subpath of your site, e.g. /blog -url: "https://tensorflow.github.io" # the base hostname & protocol for your site -twitter_username: googleresearch -github_username: tensorflow - -# Build settings -markdown: kramdown -defaults: - - - scope: - path: "" - values: - layout: "default" diff --git a/tensorflow_serving/g3doc/_includes/footer.html b/tensorflow_serving/g3doc/_includes/footer.html deleted file mode 100644 index d51240ac00f..00000000000 --- a/tensorflow_serving/g3doc/_includes/footer.html +++ /dev/null @@ -1,50 +0,0 @@ -
- - - - -
diff --git a/tensorflow_serving/g3doc/_includes/head.html b/tensorflow_serving/g3doc/_includes/head.html deleted file mode 100644 index 41340ae57b4..00000000000 --- a/tensorflow_serving/g3doc/_includes/head.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - {% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %} - - - - - - diff --git a/tensorflow_serving/g3doc/_includes/header.html b/tensorflow_serving/g3doc/_includes/header.html deleted file mode 100644 index 1cc2fd8e3c1..00000000000 --- a/tensorflow_serving/g3doc/_includes/header.html +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/tensorflow_serving/g3doc/_includes/icon-github.html b/tensorflow_serving/g3doc/_includes/icon-github.html deleted file mode 100644 index e501a16b187..00000000000 --- a/tensorflow_serving/g3doc/_includes/icon-github.html +++ /dev/null @@ -1 +0,0 @@ -{% include icon-github.svg %}{{ include.username }} diff --git a/tensorflow_serving/g3doc/_includes/icon-github.svg b/tensorflow_serving/g3doc/_includes/icon-github.svg deleted file mode 100644 index 4422c4f5dcc..00000000000 --- a/tensorflow_serving/g3doc/_includes/icon-github.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/tensorflow_serving/g3doc/_includes/icon-twitter.html b/tensorflow_serving/g3doc/_includes/icon-twitter.html deleted file mode 100644 index e623dbd6efc..00000000000 --- a/tensorflow_serving/g3doc/_includes/icon-twitter.html +++ /dev/null @@ -1 +0,0 @@ -{{ include.username }} diff --git a/tensorflow_serving/g3doc/_includes/icon-twitter.svg b/tensorflow_serving/g3doc/_includes/icon-twitter.svg deleted file mode 100644 index dcf660e7bb3..00000000000 --- a/tensorflow_serving/g3doc/_includes/icon-twitter.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/tensorflow_serving/g3doc/_includes/nav.md b/tensorflow_serving/g3doc/_includes/nav.md deleted file mode 100644 index 93fabb571b0..00000000000 --- a/tensorflow_serving/g3doc/_includes/nav.md +++ /dev/null @@ -1,21 +0,0 @@ -## Get Started - -* [Architecture Overview](architecture_overview) -* [Installation](setup) - -## Tutorials - -* [TensorFlow Serving Basics](serving_basic) -* [TensorFlow Serving Advanced](serving_advanced) -* [Serving Inception Model with TensorFlow Serving and Kubernetes](serving_inception) - -## How To - -* [Create a Custom Servable](custom_servable) -* [Create a Custom Source](custom_source) - -## Resources - -* [Source code](https://github.com/tensorflow/serving) -* [TensorFlow site](http://tensorflow.org) -* [Docker images](docker) diff --git a/tensorflow_serving/g3doc/_index.yaml b/tensorflow_serving/g3doc/_index.yaml new file mode 100644 index 00000000000..5a7f28f6248 --- /dev/null +++ b/tensorflow_serving/g3doc/_index.yaml @@ -0,0 +1,55 @@ +book_path: /serving/_book.yaml +project_path: /serving/_project.yaml +description: +landing_page: + custom_css_path: /site-assets/css/style.css + rows: + - heading: TensorFlow Serving for model deployment in production + items: + - classname: devsite-landing-row-50 + description: > + TensorFlow Serving is a flexible, high-performance serving system for + machine learning models, designed for production environments. TensorFlow + Serving makes it easy to deploy new algorithms and experiments, while + keeping the same server architecture and APIs. TensorFlow Serving + provides out-of-the-box integration with TensorFlow models, but can be + easily extended to serve other types of models and data. + code_block: | +
+        # Download the TensorFlow Serving Docker image and repo
+        docker pull tensorflow/serving
+ git clone https://github.com/tensorflow/serving + # Location of demo models + TESTDATA="$(pwd)/serving/tensorflow_serving/servables/tensorflow/testdata" + + # Start TensorFlow Serving container and open the REST API port + docker run -t --rm -p 8501:8501 \ + -v "$TESTDATA/saved_model_half_plus_two_cpu:/models/half_plus_two" \ + -e MODEL_NAME=half_plus_two \ + tensorflow/serving & + + # Query the model using the predict API + curl -d '{"instances": [1.0, 2.0, 5.0]}' \ + -X POST http://localhost:8501/v1/models/half_plus_two:predict
+ # Returns => { "predictions": [2.5, 3.0, 4.5] } +
+ + - classname: devsite-landing-row-cards + items: + - heading: "TensorFlow Serving at the Dev Summit" + youtube_id: q_IkJcPyNl0 + buttons: + - label: Watch the video + path: https://www.youtube.com/watch?v=q_IkJcPyNl0 + - heading: Running your models in production with TensorFlow Serving + image_path: /ecosystem/images/google-research-card-16x9.png + path: https://ai.googleblog.com/2016/02/running-your-models-in-production-with.html + buttons: + - label: Read on Google Research blog + path: https://ai.googleblog.com/2016/02/running-your-models-in-production-with.html + - heading: TensorFlow Serving on GitHub + image_path: /ecosystem/images/github-card-16x9.png + path: https://github.com/tensorflow/serving + buttons: + - label: View on GitHub + path: https://github.com/tensorflow/serving diff --git a/tensorflow_serving/g3doc/_layouts/default.html b/tensorflow_serving/g3doc/_layouts/default.html deleted file mode 100644 index 21ef154988d..00000000000 --- a/tensorflow_serving/g3doc/_layouts/default.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - {% include head.html %} - - - - {% include header.html %} -
- - -
-
- {{ content }} -
-
-
- {% include footer.html %} - - - - diff --git a/tensorflow_serving/g3doc/_project.yaml b/tensorflow_serving/g3doc/_project.yaml new file mode 100644 index 00000000000..62ffe13693f --- /dev/null +++ b/tensorflow_serving/g3doc/_project.yaml @@ -0,0 +1,11 @@ +name: TensorFlow Serving +breadcrumb_name: Serving +home_url: /serving/ +parent_project_metadata_path: /_project.yaml +description: > + TensorFlow Serving is a flexible, high-performance serving system for machine + learning models, designed for production environments. +use_site_branding: true +hide_from_products_list: true +content_license: cc3-apache2 +buganizer_id: 162465 diff --git a/tensorflow_serving/g3doc/_sass/_base.scss b/tensorflow_serving/g3doc/_sass/_base.scss deleted file mode 100644 index d2aecc18798..00000000000 --- a/tensorflow_serving/g3doc/_sass/_base.scss +++ /dev/null @@ -1,225 +0,0 @@ -// Reset some basic elements -body, -h1, -h2, -h3, -h4, -h5, -h6, -p, -blockquote, -pre, -hr, -dl, -dd, -ol, -ul, -figure { - margin: 0; - padding: 0; -} - - - -// Basic styling -body { - font: $base-font-weight #{$base-font-size}/#{$base-line-height} $base-font-family; - color: $text-color; - background-color: $background-color; - -webkit-text-size-adjust: 100%; - -webkit-font-feature-settings: "kern" 1; - -moz-font-feature-settings: "kern" 1; - -o-font-feature-settings: "kern" 1; - font-feature-settings: "kern" 1; - font-kerning: normal; -} - - - -// Set `margin-bottom` to maintain vertical rhythm -h1, -h2, -h3, -h4, -h5, -h6, -p, -blockquote, -pre, -ul, -ol, -dl, -figure, -%vertical-rhythm { - margin-bottom: $spacing-unit / 2; -} - -// Links -a:visited { - color: #000; -} - -// Images -img { - max-width: 100%; - vertical-align: middle; -} - - - -// Figures -figure > img { - display: block; -} - -figcaption { - font-size: $small-font-size; -} - - - -// Lists -ul, -ol { - margin-left: $spacing-unit; -} - -li { - > ul, - > ol { - margin-bottom: 0; - } -} - - - -// Headings -h1, -h2, -h3, -h4, -h5, -h6 { - font-weight: $base-font-weight; -} - - -// Links -a { - color: $brand-color; - text-decoration: none; - - &:visited { - color: darken($brand-color, -15%); - } - - &:hover { - color: $text-color; - text-decoration: underline; - } -} - - - -// Blockquotes -blockquote { - color: $grey-color; - border-left: 4px solid $grey-color-light; - padding-left: $spacing-unit / 2; - font-size: 18px; - letter-spacing: -1px; - font-style: italic; - - > :last-child { - margin-bottom: 0; - } -} - - - -// Code formatting -pre, -code { - font-size: 15px; - border: 1px solid $grey-color-light; - border-radius: 3px; - background-color: #eef; -} - -code { - padding: 1px 5px; -} - -pre { - padding: 8px 12px; - overflow-x: auto; - - > code { - border: 0; - padding-right: 0; - padding-left: 0; - } -} - - - -// Wrapper -.wrapper { - max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit} * 2)); - max-width: calc(#{$content-width} - (#{$spacing-unit} * 2)); - margin-right: auto; - padding-right: $spacing-unit; - padding-left: $spacing-unit; - @extend %clearfix; - - @include media-query($on-laptop) { - max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit})); - max-width: calc(#{$content-width} - (#{$spacing-unit})); - padding-right: $spacing-unit / 2; - padding-left: $spacing-unit / 2; - } -} - -.footer-wrapper { - max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit} * 2)); - max-width: calc(#{$content-width} - (#{$spacing-unit} * 2)); - margin-left: auto; - margin-right: auto; - padding-right: $spacing-unit; - padding-left: $spacing-unit; - @extend %clearfix; - - @include media-query($on-laptop) { - max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit})); - max-width: calc(#{$content-width} - (#{$spacing-unit})); - padding-right: $spacing-unit / 2; - padding-left: $spacing-unit / 2; - } -} - -// Clearfix -%clearfix { - - &:after { - content: ''""''; - display: table; - clear: both; - } -} - - -// Icons -.icon { - - > svg { - display: inline-block; - width: 16px; - height: 16px; - vertical-align: middle; - - path { - fill: $grey-color; - } - } -} diff --git a/tensorflow_serving/g3doc/_sass/_layout.scss b/tensorflow_serving/g3doc/_sass/_layout.scss deleted file mode 100644 index ba1a54107b0..00000000000 --- a/tensorflow_serving/g3doc/_sass/_layout.scss +++ /dev/null @@ -1,275 +0,0 @@ -// scss-lint:disable all - -/** - * Site header - */ -.site-header { - //border-top: 5px solid $grey-color-dark; - //border-bottom: 1px solid $grey-color-light; - height: $header-height; - line-height: 80px; - background-color: #f6911e; - background-image: -webkit-linear-gradient(-360deg, #f6911e,#febd36); - background-image: linear-gradient(90deg,#f6911e,#febd36); - - // Positioning context for the mobile navigation icon - position: relative; -} - -.site-title { - color: #000; - font-size: 30px; - font-weight: 400; - line-height: $header-height; // Equals header height to center. - letter-spacing: -1px; - margin-bottom: 0; - float: left; -} - -a.site-title, a.site-title:visited { - color: #ffffff; -} - -.site-nav { - float: right; - line-height: 56px; - - .menu-icon { - display: none; - } - - .page-link { - color: $text-color; - line-height: $base-line-height; - - // Gaps between nav items, but not on the last one - &:not(:last-child) { - margin-right: 20px; - } - } - - @include media-query($on-palm) { - position: absolute; - top: 9px; - right: $spacing-unit / 2; - background-color: $background-color; - border: 1px solid $grey-color-light; - border-radius: 5px; - text-align: right; - - .menu-icon { - display: block; - float: right; - width: 36px; - height: 26px; - line-height: 0; - padding-top: 10px; - text-align: center; - - > svg { - width: 18px; - height: 15px; - - path { - fill: $grey-color-dark; - } - } - } - - .trigger { - clear: both; - display: none; - } - - &:hover .trigger { - display: block; - padding-bottom: 5px; - } - - .page-link { - display: block; - padding: 5px 10px; - - &:not(:last-child) { - margin-right: 0; - } - margin-left: 20px; - } - } -} - - - -/** - * Site footer - */ -.site-footer { - border-top: 1px solid $grey-color-light; - padding: $spacing-unit 0; -} - -.footer-heading { - font-size: 18px; - margin-bottom: $spacing-unit / 2; -} - -.contact-list, -.social-media-list { - list-style: none; - margin-left: 0; -} - -.footer-col-wrapper { - font-size: 15px; - color: $grey-color; - margin-left: -$spacing-unit / 2; - @extend %clearfix; -} - -.footer-col { - float: left; - margin-bottom: $spacing-unit / 2; - padding-left: $spacing-unit / 2; -} - -.footer-col-1 { - width: -webkit-calc(35% - (#{$spacing-unit} / 2)); - width: calc(35% - (#{$spacing-unit} / 2)); -} - -.footer-col-2 { - width: -webkit-calc(20% - (#{$spacing-unit} / 2)); - width: calc(20% - (#{$spacing-unit} / 2)); -} - -.footer-col-3 { - width: -webkit-calc(45% - (#{$spacing-unit} / 2)); - width: calc(45% - (#{$spacing-unit} / 2)); -} - -@include media-query($on-laptop) { - .footer-col-1, - .footer-col-2 { - width: -webkit-calc(50% - (#{$spacing-unit} / 2)); - width: calc(50% - (#{$spacing-unit} / 2)); - } - - .footer-col-3 { - width: -webkit-calc(100% - (#{$spacing-unit} / 2)); - width: calc(100% - (#{$spacing-unit} / 2)); - } -} - -@include media-query($on-palm) { - .footer-col { - float: none; - width: -webkit-calc(100% - (#{$spacing-unit} / 2)); - width: calc(100% - (#{$spacing-unit} / 2)); - } -} - -/** - * Main page block. - */ -#page-main { - clear:both; -} - -#page-main:after { - content: ""; - clear: both; - display: table; -} - -/** - * Sidebar - */ -.sidebar { - width:250px; - margin-top: 27px; - padding:0; - vertical-align:top; - float:left; - - a { - color: $text-color; - } -} - -/** - * Page content - */ -.page-content { - padding: $spacing-unit 0; - float:left -} - -.page-heading { - font-size: 20px; -} - -.post-list { - margin-left: 0; - list-style: none; - - > li { - margin-bottom: $spacing-unit; - } -} - -.post-meta { - font-size: $small-font-size; - color: $grey-color; -} - -.post-link { - display: block; - font-size: 24px; -} - - - -/** - * Posts - */ -.post-header { - margin-bottom: $spacing-unit; -} - -.post-title { - font-size: 42px; - letter-spacing: -1px; - line-height: 1; - - @include media-query($on-laptop) { - font-size: 36px; - } -} - -.post-content { - margin-bottom: $spacing-unit; - - h2 { - font-size: 32px; - - @include media-query($on-laptop) { - font-size: 28px; - } - } - - h3 { - font-size: 26px; - - @include media-query($on-laptop) { - font-size: 22px; - } - } - - h4 { - font-size: 20px; - - @include media-query($on-laptop) { - font-size: 18px; - } - } -} diff --git a/tensorflow_serving/g3doc/_sass/_syntax-highlighting.scss b/tensorflow_serving/g3doc/_sass/_syntax-highlighting.scss deleted file mode 100644 index 8fac59776d5..00000000000 --- a/tensorflow_serving/g3doc/_sass/_syntax-highlighting.scss +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Syntax highlighting styles - */ -.highlight { - background: #fff; - @extend %vertical-rhythm; - - .highlighter-rouge & { - background: #eef; - } - - .c { color: #998; font-style: italic } // Comment - .err { color: #a61717; background-color: #e3d2d2 } // Error - .k { font-weight: bold } // Keyword - .o { font-weight: bold } // Operator - .cm { color: #998; font-style: italic } // Comment.Multiline - .cp { color: #999; font-weight: bold } // Comment.Preproc - .c1 { color: #998; font-style: italic } // Comment.Single - .cs { color: #999; font-weight: bold; font-style: italic } // Comment.Special - .gd { color: #000; background-color: #fdd } // Generic.Deleted - .gd .x { color: #000; background-color: #faa } // Generic.Deleted.Specific - .ge { font-style: italic } // Generic.Emph - .gr { color: #a00 } // Generic.Error - .gh { color: #999 } // Generic.Heading - .gi { color: #000; background-color: #dfd } // Generic.Inserted - .gi .x { color: #000; background-color: #afa } // Generic.Inserted.Specific - .go { color: #888 } // Generic.Output - .gp { color: #555 } // Generic.Prompt - .gs { font-weight: bold } // Generic.Strong - .gu { color: #aaa } // Generic.Subheading - .gt { color: #a00 } // Generic.Traceback - .kc { font-weight: bold } // Keyword.Constant - .kd { font-weight: bold } // Keyword.Declaration - .kp { font-weight: bold } // Keyword.Pseudo - .kr { font-weight: bold } // Keyword.Reserved - .kt { color: #458; font-weight: bold } // Keyword.Type - .m { color: #099 } // Literal.Number - .s { color: #d14 } // Literal.String - .na { color: #008080 } // Name.Attribute - .nb { color: #0086B3 } // Name.Builtin - .nc { color: #458; font-weight: bold } // Name.Class - .no { color: #008080 } // Name.Constant - .ni { color: #800080 } // Name.Entity - .ne { color: #900; font-weight: bold } // Name.Exception - .nf { color: #900; font-weight: bold } // Name.Function - .nn { color: #555 } // Name.Namespace - .nt { color: #000080 } // Name.Tag - .nv { color: #008080 } // Name.Variable - .ow { font-weight: bold } // Operator.Word - .w { color: #bbb } // Text.Whitespace - .mf { color: #099 } // Literal.Number.Float - .mh { color: #099 } // Literal.Number.Hex - .mi { color: #099 } // Literal.Number.Integer - .mo { color: #099 } // Literal.Number.Oct - .sb { color: #d14 } // Literal.String.Backtick - .sc { color: #d14 } // Literal.String.Char - .sd { color: #d14 } // Literal.String.Doc - .s2 { color: #d14 } // Literal.String.Double - .se { color: #d14 } // Literal.String.Escape - .sh { color: #d14 } // Literal.String.Heredoc - .si { color: #d14 } // Literal.String.Interpol - .sx { color: #d14 } // Literal.String.Other - .sr { color: #009926 } // Literal.String.Regex - .s1 { color: #d14 } // Literal.String.Single - .ss { color: #990073 } // Literal.String.Symbol - .bp { color: #999 } // Name.Builtin.Pseudo - .vc { color: #008080 } // Name.Variable.Class - .vg { color: #008080 } // Name.Variable.Global - .vi { color: #008080 } // Name.Variable.Instance - .il { color: #099 } // Literal.Number.Integer.Long -} diff --git a/tensorflow_serving/g3doc/_toc.yaml b/tensorflow_serving/g3doc/_toc.yaml deleted file mode 100644 index b6e1a1c156c..00000000000 --- a/tensorflow_serving/g3doc/_toc.yaml +++ /dev/null @@ -1,24 +0,0 @@ -toc: -- heading: TensorFlow Serving -- title: "Introduction" - path: /serving/ -- title: "Architecture Overview" - path: /serving/architecture_overview -- title: "Installation" - path: /serving/setup -- title: "Serving a TensorFlow Model" - path: /serving/serving_basic -- title: "RESTful API" - path: /serving/api_rest -- title: "Building Standard TensorFlow ModelServer" - path: /serving/serving_advanced -- title: "Serving Inception Model with TensorFlow Serving and Kubernetes" - path: /serving/serving_inception -- title: "Creating a new kind of servable" - path: /serving/custom_servable -- title: "Creating a module that discovers new servable paths" - path: /serving/custom_source -- title: "SignatureDefs in SavedModel for TensorFlow Serving" - path: /serving/signature_defs -- title: "Using TensorFlow Serving via Docker" - path: /serving/docker diff --git a/tensorflow_serving/g3doc/css/main.scss b/tensorflow_serving/g3doc/css/main.scss deleted file mode 100644 index e189b9e4ea8..00000000000 --- a/tensorflow_serving/g3doc/css/main.scss +++ /dev/null @@ -1,55 +0,0 @@ ---- -# Only the main Sass file needs front matter (the dashes are enough) ---- -@charset "utf-8"; - - - -// Our variables -$base-font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -$base-font-size: 16px; -$base-font-weight: 400; -$small-font-size: $base-font-size * 0.875; -$base-line-height: 1.5; - -$header-height: 80px; - -$spacing-unit: 30px; - -$text-color: #111; -$background-color: #fdfdfd; -$brand-color: #f6911e; - -$grey-color: #828282; -$grey-color-light: lighten($grey-color, 40%); -$grey-color-dark: darken($grey-color, 25%); - -// Width of the content area -$content-width: 800px; - -$on-palm: 600px; -$on-laptop: 800px; - - - -// Use media queries like this: -// @include media-query($on-palm) { -// .wrapper { -// padding-right: $spacing-unit / 2; -// padding-left: $spacing-unit / 2; -// } -// } -@mixin media-query($device) { - @media screen and (max-width: $device) { - @content; - } -} - - - -// Import partials from `sass_dir` (defaults to `_sass`) -@import - "base", - "layout", - "syntax-highlighting" -; diff --git a/tensorflow_serving/g3doc/index.md b/tensorflow_serving/g3doc/index.md deleted file mode 100644 index 3adadd13c77..00000000000 --- a/tensorflow_serving/g3doc/index.md +++ /dev/null @@ -1,19 +0,0 @@ -# Introduction - -TensorFlow Serving is a flexible, high-performance serving system for machine -learning models, designed for production environments. TensorFlow Serving -makes it easy to deploy new algorithms and experiments, while keeping the same -server architecture and APIs. TensorFlow Serving provides out-of-the-box -integration with TensorFlow models, but can be easily extended to serve other -types of models and data. - -To get started with TensorFlow Serving: - -* Read the [overview](architecture_overview.md) -* [Set up](setup.md) your environment -* Do the [basic tutorial](serving_basic.md) -* Or watch the Talk from TensorFlow Dev Summit 2017: -[![Serving Models in Production with TensorFlow Serving](https://img.youtube.com/vi/q_IkJcPyNl0/0.jpg)](http://www.youtube.com/watch?v=q_IkJcPyNl0) - - -![TensorFlow Serving Diagram](images/tf_diagram.svg){: width="500"} diff --git a/tensorflow_serving/g3doc/architecture_overview.md b/tensorflow_serving/g3doc/overview.md similarity index 98% rename from tensorflow_serving/g3doc/architecture_overview.md rename to tensorflow_serving/g3doc/overview.md index 06a4c08e419..4a85ae1982b 100644 --- a/tensorflow_serving/g3doc/architecture_overview.md +++ b/tensorflow_serving/g3doc/overview.md @@ -220,8 +220,3 @@ widget that lets clients easily batch their type-specific inferences across requests into batch requests that algorithm systems can more efficiently process. See the [Batching Guide](https://github.com/tensorflow/serving/tree/master/tensorflow_serving/batching/README.md) for more information. - -## Next Steps - -To get started with TensorFlow Serving, try the -[Basic Tutorial](serving_basic.md). From 1e6f596ca29e8346559d8d7dda3be556274b0158 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Oct 2018 18:02:12 -0700 Subject: [PATCH 1300/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215493298 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index be0cfe19671..a68b52ad6ab 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9d3cd373d9ee19231e902536f6b2ad9008615a523a4127646326ed0aa1b6f6bc", - git_commit = "8d4ef71f06a06a093419bf0f80562a1941059029", + sha256 = "746f561352201a8a08cad478c5f3de3081fbf4f6cf3b6847851db35d0fa61c85", + git_commit = "80821abd6410f47130fc031b15e9ac220de5b1b9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f399c020cef81f345f52d21ba234c5ab9e6d2376 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Oct 2018 20:02:37 -0700 Subject: [PATCH 1301/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215503704 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a68b52ad6ab..7e8bcea63cd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "746f561352201a8a08cad478c5f3de3081fbf4f6cf3b6847851db35d0fa61c85", - git_commit = "80821abd6410f47130fc031b15e9ac220de5b1b9", + sha256 = "79cb2b5ba38293ad4d726b55a23a667e4beaa9e3cd72a6fdfd876015cd27c011", + git_commit = "8dc7bc7764150253c03a666eee84fc48f867d6a2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1a18b724dd24a1bf325182e423efe85cc19db184 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Oct 2018 21:02:12 -0700 Subject: [PATCH 1302/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215508504 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7e8bcea63cd..336839c9442 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "79cb2b5ba38293ad4d726b55a23a667e4beaa9e3cd72a6fdfd876015cd27c011", - git_commit = "8dc7bc7764150253c03a666eee84fc48f867d6a2", + sha256 = "aa913778d042b080ee85660c95ca08663540e3a4aa76471cfc5c17053421bc0a", + git_commit = "9f42ebd5982688511ecc0ef7d23de02b64d8dd1e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8fc4b0d628e1db00bdb8d5e97e8cdcfa6932cbe3 Mon Sep 17 00:00:00 2001 From: demfier Date: Wed, 3 Oct 2018 01:23:41 -0400 Subject: [PATCH 1303/8103] Fix setup documentation --- tensorflow_serving/g3doc/setup.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tensorflow_serving/g3doc/setup.md b/tensorflow_serving/g3doc/setup.md index 8bd2f0714a0..77e0244b5fc 100644 --- a/tensorflow_serving/g3doc/setup.md +++ b/tensorflow_serving/g3doc/setup.md @@ -46,14 +46,12 @@ apt-get remove tensorflow-model-server 2. Install and update TensorFlow ModelServer - ```shell + apt-get update apt-get install tensorflow-model-server ``` - - Once installed, the binary can be invoked using the command `tensorflow_model_server`. From d6914ba17ff2557ad91809807d61699db18255cd Mon Sep 17 00:00:00 2001 From: awk Date: Tue, 2 Oct 2018 22:45:24 -0700 Subject: [PATCH 1304/8103] Accept integers in input requests where float/doubles are allowed, converting them to corresponding decimal type. The conversion fails (and so does the request) if the integer is too big to fit in the decimal type (and incurring a precision loss). PiperOrigin-RevId: 215515883 --- .../http_rest_api_handler_test.cc | 2 +- tensorflow_serving/util/json_tensor.cc | 134 ++++++++++-------- tensorflow_serving/util/json_tensor_test.cc | 109 ++++++++++++-- 3 files changed, 174 insertions(+), 71 deletions(-) diff --git a/tensorflow_serving/model_servers/http_rest_api_handler_test.cc b/tensorflow_serving/model_servers/http_rest_api_handler_test.cc index 15b2c5001c8..5c6529fc500 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler_test.cc +++ b/tensorflow_serving/model_servers/http_rest_api_handler_test.cc @@ -259,7 +259,7 @@ TEST_F(HttpRestApiHandlerTest, PredictRequestErrors) { // Incorrect type. status = handler_.ProcessRequest( - "POST", req_path, R"({ "instances": [1, 2] })", &headers, &output); + "POST", req_path, R"({ "instances": ["x", "y"] })", &headers, &output); EXPECT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("not of expected type: float")); } diff --git a/tensorflow_serving/util/json_tensor.cc b/tensorflow_serving/util/json_tensor.cc index e9505fa789f..ea387a3d72a 100644 --- a/tensorflow_serving/util/json_tensor.cc +++ b/tensorflow_serving/util/json_tensor.cc @@ -77,6 +77,8 @@ constexpr char kBase64Key[] = "b64"; // Suffix for name of tensors that represent bytes (as opposed to strings). constexpr char kBytesTensorNameSuffix[] = "_bytes"; +using RapidJsonWriter = rapidjson::PrettyWriter; + string JsonTypeString(const rapidjson::Value& val) { switch (val.GetType()) { case rapidjson::kNullType: @@ -96,12 +98,57 @@ string JsonTypeString(const rapidjson::Value& val) { } } +template +bool WriteDecimal(RapidJsonWriter* writer, dtype val) { + static_assert( + std::is_same::value || std::is_same::value, + "Only floating-point value types are supported."); + // We do not use native writer->Double() API as float -> double conversion + // causes noise digits to be added (due to the way floating point numbers are + // generally represented in binary, nothing to do with the API itself). So a + // float value of 0.2 can get written out as 0.2000000012322 (or some such). + // + // To get around this, we write the string representation of the float number + // as a raw JSON value (annotated as kNumberType, to ensure JSON does not + // quote the string). + string decimal_str; + if (std::isfinite(val)) { + decimal_str = absl::StrCat(val); + // Add trailing '.0' for whole numbers and those not in scientific notation. + // StrCat() formats numbers in six-digit (printf "%g"), numbers like 9000000 + // and .00003 get written as 9e+06 and 3e-05 (scientific notation). + // + // Not adding '.0' can lead to lists containing mix of decimal and whole + // numbers -- making it difficult for consumers to pick the correct type to + // store these numbers (note, JSON does not have metadata to describe types. + // These are inferred from the tokens). + if (decimal_str.find('.') == string::npos && + decimal_str.find('e') == string::npos) { + absl::StrAppend(&decimal_str, ".0"); + } + } else if (std::isnan(val)) { + decimal_str = "NaN"; + } else if (std::isinf(val)) { + decimal_str = std::signbit(val) ? "-Infinity" : "Infinity"; + } + return writer->RawValue(decimal_str.c_str(), decimal_str.size(), + rapidjson::kNumberType); +} + // Stringify JSON value (only for use in error reporting or debugging). string JsonValueToString(const rapidjson::Value& val) { // TODO(b/67042542): Truncate large values. rapidjson::StringBuffer buffer; - rapidjson::PrettyWriter writer(buffer); - val.Accept(writer); + RapidJsonWriter writer(buffer); + // Write decimal numbers explicitly so inf/nan's get printed + // correctly. RapidJsonWriter() does not write these correctly. + if (val.IsFloat()) { + WriteDecimal(&writer, val.GetFloat()); + } else if (val.IsDouble()) { + WriteDecimal(&writer, val.GetDouble()); + } else { + val.Accept(writer); + } return buffer.GetString(); } @@ -153,19 +200,24 @@ Status FormatSignatureError(const rapidjson::Value& val) { " not formatted correctly. 'signature_name' key must be a string value."); } -Status FloatRangeError(const rapidjson::Value& val, const string& context) { - return errors::InvalidArgument("JSON value: ", val.GetDouble(), - " is out of range for float. ", context, - " expects float type."); +Status LossyDecimalError(const rapidjson::Value& val, const string& target) { + return errors::InvalidArgument( + "Cannot convert JSON value: ", JsonValueToString(val), " to ", target, + " without loss of precision."); } -bool OutOfFloatRange(const rapidjson::Value& val) { - // Note, JSON specification (RFC4627) does not have a way to represent - // non-finite (NaN, -Inf, Inf) numbers unless we loosen the parsing (which - // we do not presently). The isfinite() is a defensive check for the parser. - return std::isfinite(val.GetDouble()) && - (val.GetDouble() > std::numeric_limits::max() || - val.GetDouble() < std::numeric_limits::lowest()); +template +bool IsLosslessDecimal(const rapidjson::Value& val) { + static_assert(std::is_same::value || std::is_same::value, + "Only floating-point value types are supported."); + + // Note, we use GetDouble() for both types as std::isfinite() returns false + // for decimal values that do not fit in float (due to the static_cast<> used + // in converting double to float in GetFloat() call). + if (!std::isfinite(val.GetDouble())) return true; + + if (std::is_same::value) return val.IsLosslessFloat(); + return val.IsLosslessDouble(); } // Adds a JSON value to Tensor. Returns error if value cannot be converted @@ -176,13 +228,18 @@ Status AddValueToTensor(const rapidjson::Value& val, DataType dtype, TensorProto* tensor) { switch (dtype) { case DT_FLOAT: - if (!val.IsDouble()) return TypeError(val, dtype); - if (OutOfFloatRange(val)) return FloatRangeError(val, "Tensor"); - tensor->add_float_val(val.GetDouble()); + if (!val.IsNumber()) return TypeError(val, dtype); + if (!IsLosslessDecimal(val)) { + return LossyDecimalError(val, "float"); + } + tensor->add_float_val(val.GetFloat()); break; case DT_DOUBLE: - if (!val.IsDouble()) return TypeError(val, dtype); + if (!val.IsNumber()) return TypeError(val, dtype); + if (!IsLosslessDecimal(val)) { + return LossyDecimalError(val, "double"); + } tensor->add_double_val(val.GetDouble()); break; @@ -655,10 +712,10 @@ Status AddValueToFeature(const rapidjson::Value& val, if (!IsFeatureOfKind(*feature, Feature::KindCase::kFloatList)) { return IncompatibleFeatureKindError(feature_name, *feature); } - if (OutOfFloatRange(val)) { - return FloatRangeError(val, "Example"); + if (!IsLosslessDecimal(val)) { + return LossyDecimalError(val, "float"); } - feature->mutable_float_list()->add_value(val.GetDouble()); + feature->mutable_float_list()->add_value(val.GetFloat()); } else { if (!IsFeatureOfKind(*feature, Feature::KindCase::kInt64List)) { return IncompatibleFeatureKindError(feature_name, *feature); @@ -744,7 +801,6 @@ Status FillRegressionRequestFromJson(const absl::string_view json, namespace { -using RapidJsonWriter = rapidjson::PrettyWriter; bool IsNamedTensorBytes(const string& name, const TensorProto& tensor) { // TODO(b/67042542): Is DT_STRING the only way to represent bytes? @@ -756,42 +812,6 @@ bool IsNamedTensorBytes(const string& name, const TensorProto& tensor) { absl::EndsWith(name, kBytesTensorNameSuffix); } -template -bool WriteDecimal(RapidJsonWriter* writer, dtype val) { - static_assert( - std::is_same::value || std::is_same::value, - "Only floating-point value types are supported."); - // We do not use native writer->Double() API as float -> double conversion - // causes noise digits to be added (due to the way floating point numbers are - // generally represented in binary, nothing to do with the API itself). So a - // float value of 0.2 can get written out as 0.2000000012322 (or some such). - // - // To get around this, we write the string representation of the float number - // as a raw JSON value (annotated as kNumberType, to ensure JSON does not - // quote the string). - string decimal_str; - if (std::isfinite(val)) { - decimal_str = absl::StrCat(val); - // Add trailing '.0' for whole numbers and those not in scientific notation. - // StrCat() formats numbers in six-digit (printf "%g"), numbers like 9000000 - // and .00003 get written as 9e+06 and 3e-05 (scientific notation). - // - // Not adding '.0' can lead to lists containing mix of decimal and whole - // numbers -- making it difficult for consumers to pick the correct type to - // store these numbers (note, JSON does not have metadata to describe types. - // These are inferred from the tokens). - if (decimal_str.find('.') == string::npos && - decimal_str.find('e') == string::npos) { - absl::StrAppend(&decimal_str, ".0"); - } - } else if (std::isnan(val)) { - decimal_str = "NaN"; - } else if (std::isinf(val)) { - decimal_str = std::signbit(val) ? "-Infinity" : "Infinity"; - } - return writer->RawValue(decimal_str.c_str(), decimal_str.size(), - rapidjson::kNumberType); -} Status AddSingleValueAndAdvance(const TensorProto& tensor, bool string_as_bytes, RapidJsonWriter* writer, int* offset) { diff --git a/tensorflow_serving/util/json_tensor_test.cc b/tensorflow_serving/util/json_tensor_test.cc index 2b4197f39be..1d8edf219f6 100644 --- a/tensorflow_serving/util/json_tensor_test.cc +++ b/tensorflow_serving/util/json_tensor_test.cc @@ -81,6 +81,58 @@ TEST(JsontensorTest, SingleUnnamedTensor) { )")); } +TEST(JsontensorTest, IntegerInputForFloatTensor) { + TensorInfoMap infomap; + ASSERT_TRUE( + TextFormat::ParseFromString("dtype: DT_FLOAT", &infomap["default"])); + + PredictRequest req; + JsonPredictRequestFormat format; + TF_EXPECT_OK(FillPredictRequestFromJson(R"( + { + "instances": [1, 2, 3, 4, 5] + })", + getmap(infomap), &req, &format)); + auto tmap = req.inputs(); + EXPECT_EQ(tmap.size(), 1); + EXPECT_EQ(format, JsonPredictRequestFormat::kRow); + EXPECT_THAT(tmap["default"], EqualsProto(R"( + dtype: DT_FLOAT + tensor_shape { dim { size: 5 } } + float_val: 1 + float_val: 2 + float_val: 3 + float_val: 4 + float_val: 5 + )")); +} + +TEST(JsontensorTest, IntegerInputForDoubleTensor) { + TensorInfoMap infomap; + ASSERT_TRUE( + TextFormat::ParseFromString("dtype: DT_DOUBLE", &infomap["default"])); + + PredictRequest req; + JsonPredictRequestFormat format; + TF_EXPECT_OK(FillPredictRequestFromJson(R"( + { + "instances": [1, 2, 3, 4, 5] + })", + getmap(infomap), &req, &format)); + auto tmap = req.inputs(); + EXPECT_EQ(tmap.size(), 1); + EXPECT_EQ(format, JsonPredictRequestFormat::kRow); + EXPECT_THAT(tmap["default"], EqualsProto(R"( + dtype: DT_DOUBLE + tensor_shape { dim { size: 5 } } + double_val: 1 + double_val: 2 + double_val: 3 + double_val: 4 + double_val: 5 + )")); +} + TEST(JsontensorTest, SingleUnnamedTensorWithSignature) { TensorInfoMap infomap; ASSERT_TRUE( @@ -232,6 +284,8 @@ TEST(JsontensorTest, MultipleNamedTensor) { TextFormat::ParseFromString("dtype: DT_STRING", &infomap["str_tensor"])); ASSERT_TRUE( TextFormat::ParseFromString("dtype: DT_FLOAT", &infomap["float_tensor"])); + ASSERT_TRUE( + TextFormat::ParseFromString("dtype: DT_DOUBLE", &infomap["dbl_tensor"])); PredictRequest req; JsonPredictRequestFormat format; @@ -241,19 +295,21 @@ TEST(JsontensorTest, MultipleNamedTensor) { { "int_tensor": [[1,2],[3,4],[5,6]], "str_tensor": ["foo", "bar"], - "float_tensor": [1.0] + "float_tensor": [1.0, NaN], + "dbl_tensor": [NaN] }, { "int_tensor": [[7,8],[9,0],[1,2]], "str_tensor": ["baz", "bat"], - "float_tensor": [2.0] + "float_tensor": [2.0, Infinity], + "dbl_tensor": [2.0] } ] })", getmap(infomap), &req, &format)); auto tmap = req.inputs(); - EXPECT_EQ(tmap.size(), 3); + EXPECT_EQ(tmap.size(), 4); EXPECT_EQ(format, JsonPredictRequestFormat::kRow); EXPECT_THAT(tmap["int_tensor"], EqualsProto(R"( dtype: DT_INT32 @@ -287,14 +343,25 @@ TEST(JsontensorTest, MultipleNamedTensor) { string_val: "bat" )")); EXPECT_THAT(tmap["float_tensor"], EqualsProto(R"( - dtype: DT_FLOAT - tensor_shape { - dim { size: 2 } - dim { size: 1 } - } - float_val: 1.0 - float_val: 2.0 - )")); + dtype: DT_FLOAT + tensor_shape { + dim { size: 2 } + dim { size: 2 } + } + float_val: 1.0 + float_val: NaN + float_val: 2.0 + float_val: Infinity + )")); + EXPECT_THAT(tmap["dbl_tensor"], EqualsProto(R"( + dtype: DT_DOUBLE + tensor_shape { + dim { size: 2 } + dim { size: 1 } + } + double_val: NaN + double_val: 2.0 + )")); } TEST(JsontensorTest, SingleUnnamedTensorColumnarFormat) { @@ -479,7 +546,23 @@ TEST(JsontensorTest, SingleUnnamedTensorErrors) { std::numeric_limits::max()), getmap(infomap), &req, &format); ASSERT_TRUE(errors::IsInvalidArgument(status)); - EXPECT_THAT(status.error_message(), HasSubstr("out of range for float")); + EXPECT_THAT(status.error_message(), HasSubstr("loss of precision")); + + ASSERT_TRUE( + TextFormat::ParseFromString("dtype: DT_FLOAT", &infomap["default"])); + status = FillPredictRequestFromJson( + absl::Substitute(R"({ "instances": [$0] })", 16777217), getmap(infomap), + &req, &format); + ASSERT_TRUE(errors::IsInvalidArgument(status)); + EXPECT_THAT(status.error_message(), HasSubstr("loss of precision")); + + ASSERT_TRUE( + TextFormat::ParseFromString("dtype: DT_DOUBLE", &infomap["default"])); + status = FillPredictRequestFromJson( + absl::Substitute(R"({ "instances": [$0] })", 9007199254740993ull), + getmap(infomap), &req, &format); + ASSERT_TRUE(errors::IsInvalidArgument(status)); + EXPECT_THAT(status.error_message(), HasSubstr("loss of precision")); } TEST(JsontensorTest, MultipleNamedTensorErrors) { @@ -1240,7 +1323,7 @@ TYPED_TEST(ClassifyRegressRequestTest, JsonErrors) { std::numeric_limits::max()), &req); ASSERT_TRUE(errors::IsInvalidArgument(status)); - EXPECT_THAT(status.error_message(), HasSubstr("out of range for float")); + EXPECT_THAT(status.error_message(), HasSubstr("loss of precision")); } TEST(ClassifyRegressnResultTest, JsonFromClassificationResult) { From b61510f25618579fda7784afe8ed8dc5ece290d1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 3 Oct 2018 00:00:59 -0700 Subject: [PATCH 1305/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215520700 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 336839c9442..1f9954363ad 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "aa913778d042b080ee85660c95ca08663540e3a4aa76471cfc5c17053421bc0a", - git_commit = "9f42ebd5982688511ecc0ef7d23de02b64d8dd1e", + sha256 = "0c6d736092e0c8e58c86342be85cedddb134d1270325f076d7d699fe6969942d", + git_commit = "bbe15eee6779941c54e145d12e16f6473738857c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b864d5bbed9b8490605b95bd19045b088d833fc9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 3 Oct 2018 01:01:23 -0700 Subject: [PATCH 1306/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215526005 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1f9954363ad..16d0b4e32b0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0c6d736092e0c8e58c86342be85cedddb134d1270325f076d7d699fe6969942d", - git_commit = "bbe15eee6779941c54e145d12e16f6473738857c", + sha256 = "cdffd7906d8217a5dd8260ffeeebee5950fceef558a331496771c14b1464897c", + git_commit = "3d452dbcf7e1a71ba449f6acf7342cdd1dd11859", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 25b540f35c85231950076ce7dac3da7f56a753df Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 3 Oct 2018 05:01:20 -0700 Subject: [PATCH 1307/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215546628 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 16d0b4e32b0..d591f691221 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cdffd7906d8217a5dd8260ffeeebee5950fceef558a331496771c14b1464897c", - git_commit = "3d452dbcf7e1a71ba449f6acf7342cdd1dd11859", + sha256 = "c559c8f7b2757874430fbaa6b124125d774febcc751cc2aa3b1d9104743bebdc", + git_commit = "c248f458c76df89fa3d608dcbe7c4c5e10962c24", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 27bfc9610785641a2bd72ab4ba177627ed7f21cf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 3 Oct 2018 08:03:03 -0700 Subject: [PATCH 1308/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215563216 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d591f691221..5b33c19a76d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c559c8f7b2757874430fbaa6b124125d774febcc751cc2aa3b1d9104743bebdc", - git_commit = "c248f458c76df89fa3d608dcbe7c4c5e10962c24", + sha256 = "49180e08450a73a2148fed6802f41784e6a848256d333be8cb380fec1b3362e6", + git_commit = "dd52e1d30702df5dfc805a1f433061dfbb75c814", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5bc6b87b75e4feef71f31922c75a53bfe2810503 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 3 Oct 2018 12:01:33 -0700 Subject: [PATCH 1309/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215601367 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5b33c19a76d..d78ad458abc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "49180e08450a73a2148fed6802f41784e6a848256d333be8cb380fec1b3362e6", - git_commit = "dd52e1d30702df5dfc805a1f433061dfbb75c814", + sha256 = "f9b94e4d6e0d5b8e815727240486a540e4fab611240e2cdaaee7d3210ac52a06", + git_commit = "dc262c9a376004765e7956ff6deb9bc27b045efd", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e6559949db3bfcad83a79bd06a5cc187328af6c2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 3 Oct 2018 13:01:32 -0700 Subject: [PATCH 1310/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215611899 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d78ad458abc..59fa4df5877 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f9b94e4d6e0d5b8e815727240486a540e4fab611240e2cdaaee7d3210ac52a06", - git_commit = "dc262c9a376004765e7956ff6deb9bc27b045efd", + sha256 = "be176827c4953372cda8263732b72b64cdd69f9494f5724941828987051b257c", + git_commit = "47eafbaf43c763dc65a2cd3cfd9ecbd8fbbdf668", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0c7c6ddaba1433cd45087c242b3b2e8250a25b1f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 3 Oct 2018 14:01:21 -0700 Subject: [PATCH 1311/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215623233 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 59fa4df5877..14156a1b985 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "be176827c4953372cda8263732b72b64cdd69f9494f5724941828987051b257c", - git_commit = "47eafbaf43c763dc65a2cd3cfd9ecbd8fbbdf668", + sha256 = "c73da11dc18157a625073c7f858001090401ce9bf74c116c9120327c80b679a1", + git_commit = "808b1dcb318b1feb5a8c9fed5558f95cd05728e4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9a04fbd140cd33f39cc326ab881d36350bb246b1 Mon Sep 17 00:00:00 2001 From: netfs Date: Wed, 3 Oct 2018 14:41:24 -0700 Subject: [PATCH 1312/8103] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a6637e03f42..43f7b604a0f 100644 --- a/README.md +++ b/README.md @@ -52,5 +52,5 @@ See [install instructions](tensorflow_serving/g3doc/setup.md). ## For more information -* [Serving architecture overview](tensorflow_serving/g3doc/architecture_overview.md) +* [Serving architecture overview](tensorflow_serving/g3doc/overview.md) * [TensorFlow website](http://tensorflow.org) From b26991fbbf2592e2908943df8b0704ec5575603d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 3 Oct 2018 15:03:48 -0700 Subject: [PATCH 1313/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215635617 --- README.md | 2 +- WORKSPACE | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 43f7b604a0f..a6637e03f42 100644 --- a/README.md +++ b/README.md @@ -52,5 +52,5 @@ See [install instructions](tensorflow_serving/g3doc/setup.md). ## For more information -* [Serving architecture overview](tensorflow_serving/g3doc/overview.md) +* [Serving architecture overview](tensorflow_serving/g3doc/architecture_overview.md) * [TensorFlow website](http://tensorflow.org) diff --git a/WORKSPACE b/WORKSPACE index 14156a1b985..fe620eebe6d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c73da11dc18157a625073c7f858001090401ce9bf74c116c9120327c80b679a1", - git_commit = "808b1dcb318b1feb5a8c9fed5558f95cd05728e4", + sha256 = "9e2b129e35d707fd84e845b303a42eb48870167f37a261c0885bb0e6b990bb14", + git_commit = "ed904611009a74ae530335d3bd16b7070238cec3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 53a265ce92282b7129e0a94d4a8a6bf978343b03 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 3 Oct 2018 16:01:04 -0700 Subject: [PATCH 1314/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215645617 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fe620eebe6d..ce28bf1b6d5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9e2b129e35d707fd84e845b303a42eb48870167f37a261c0885bb0e6b990bb14", - git_commit = "ed904611009a74ae530335d3bd16b7070238cec3", + sha256 = "076a3d80c59c5c0c6ec1739a9523a9248fafba10062c2e160d57dd4599e33c99", + git_commit = "f5f8dff270b9f2cdf36bba9d671c324a4f7c6fac", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d77e412f3baffec4b7c1bb96e2095178837df3e0 Mon Sep 17 00:00:00 2001 From: demfier Date: Wed, 3 Oct 2018 21:59:50 -0400 Subject: [PATCH 1315/8103] Wrap update and install command in one line --- tensorflow_serving/g3doc/setup.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tensorflow_serving/g3doc/setup.md b/tensorflow_serving/g3doc/setup.md index 77e0244b5fc..29083d339b5 100644 --- a/tensorflow_serving/g3doc/setup.md +++ b/tensorflow_serving/g3doc/setup.md @@ -48,8 +48,7 @@ apt-get remove tensorflow-model-server ```shell - apt-get update - apt-get install tensorflow-model-server + apt-get update && apt-get install tensorflow-model-server ``` Once installed, the binary can be invoked using the command From 666a3a4c6a86eaed0da986bb263dbff3fcaad9f2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 3 Oct 2018 19:01:41 -0700 Subject: [PATCH 1316/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215668429 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ce28bf1b6d5..90dba468355 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "076a3d80c59c5c0c6ec1739a9523a9248fafba10062c2e160d57dd4599e33c99", - git_commit = "f5f8dff270b9f2cdf36bba9d671c324a4f7c6fac", + sha256 = "5922832958f049f8c5c64da9d3f785e62bbe7dea2dffce1619cbd8b1af3763dd", + git_commit = "d6e14a53835eed5eed279c83e475440f8f814f0e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From eba8efad193ba7468ec9a806360a59061f21d709 Mon Sep 17 00:00:00 2001 From: demfier Date: Wed, 3 Oct 2018 22:39:16 -0400 Subject: [PATCH 1317/8103] Add comments for linter --- tensorflow_serving/g3doc/setup.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tensorflow_serving/g3doc/setup.md b/tensorflow_serving/g3doc/setup.md index 29083d339b5..1568c1be8a6 100644 --- a/tensorflow_serving/g3doc/setup.md +++ b/tensorflow_serving/g3doc/setup.md @@ -46,14 +46,18 @@ apt-get remove tensorflow-model-server 2. Install and update TensorFlow ModelServer + ```shell apt-get update && apt-get install tensorflow-model-server ``` - Once installed, the binary can be invoked using the command + + +Once installed, the binary can be invoked using the command `tensorflow_model_server`. + You can upgrade to a newer version of tensorflow-model-server with: From 19a91a0bf9dbae4971c25a32521ae09505ed35b8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 3 Oct 2018 20:01:22 -0700 Subject: [PATCH 1318/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215672876 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 90dba468355..6df2990d145 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5922832958f049f8c5c64da9d3f785e62bbe7dea2dffce1619cbd8b1af3763dd", - git_commit = "d6e14a53835eed5eed279c83e475440f8f814f0e", + sha256 = "6f4bc643ea6a0fa1d93d410cd9740afdc6db4bf63cc5b7311ca5e508d68a4785", + git_commit = "9bd6f5ed55e533ccac055a5bc7fbb771e2d432c5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2b00743e3bf5deb02750fe50a3270e8e1b804559 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 3 Oct 2018 22:02:08 -0700 Subject: [PATCH 1319/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215683200 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6df2990d145..ddde82dd7b7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6f4bc643ea6a0fa1d93d410cd9740afdc6db4bf63cc5b7311ca5e508d68a4785", - git_commit = "9bd6f5ed55e533ccac055a5bc7fbb771e2d432c5", + sha256 = "c4571eba611f2ebdb9277b5eeeb20c2e8a4d0669e87cdb4327590d9f3cdfb539", + git_commit = "8a437200e14c8e09fcc8e952679d489909f175c8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 05ef79ecfd21a012860e3769cdd3e839805ffbd1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 3 Oct 2018 23:01:59 -0700 Subject: [PATCH 1320/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215687564 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ddde82dd7b7..7f28d029b57 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c4571eba611f2ebdb9277b5eeeb20c2e8a4d0669e87cdb4327590d9f3cdfb539", - git_commit = "8a437200e14c8e09fcc8e952679d489909f175c8", + sha256 = "57f281ebc5e18c6eb5e9ccc030648f0cfe09ed1ec18cef1227b94573fd2ddb8d", + git_commit = "54cde61fbf473270ce19f8b40e9511373fbc12c7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 95eebee4bcea0d8cec7419861b962f5ab2bf3d92 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Oct 2018 00:01:09 -0700 Subject: [PATCH 1321/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215691415 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7f28d029b57..877a161a9e1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "57f281ebc5e18c6eb5e9ccc030648f0cfe09ed1ec18cef1227b94573fd2ddb8d", - git_commit = "54cde61fbf473270ce19f8b40e9511373fbc12c7", + sha256 = "a700b863ca7b97c66a60cbc6765839984e31ac19355d67f270a8dd79af48d7c3", + git_commit = "e57874169fca3cfdd15cf0dda3717a6374a7dcb9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 332c82b2b1df4524cd402f2c6683b2ec0b2c4247 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Oct 2018 04:01:22 -0700 Subject: [PATCH 1322/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215714381 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 877a161a9e1..07765b9c800 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a700b863ca7b97c66a60cbc6765839984e31ac19355d67f270a8dd79af48d7c3", - git_commit = "e57874169fca3cfdd15cf0dda3717a6374a7dcb9", + sha256 = "9fce12c386d36edab1ff1aa6ef4f0add8baa1748f64ceb14760774e7043b84de", + git_commit = "98ea840dabc0c4e9417ebe9a0fd10c9d471cda51", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c194546dc5054cfe57805f6c869c4ba1fb951184 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Oct 2018 07:01:21 -0700 Subject: [PATCH 1323/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215730304 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 07765b9c800..464e7a15f51 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9fce12c386d36edab1ff1aa6ef4f0add8baa1748f64ceb14760774e7043b84de", - git_commit = "98ea840dabc0c4e9417ebe9a0fd10c9d471cda51", + sha256 = "ec9b059032a1312d51750da272c83f10ed438f6e9444640a69dd9caf2ec3570c", + git_commit = "28f239fdfa0c94f715fccf0197ab6c3c8df27d28", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ddd1990d9e284a9f4b6e3e28a4b9c6566dc9ba25 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Oct 2018 09:00:52 -0700 Subject: [PATCH 1324/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215745698 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 464e7a15f51..7da389cc829 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ec9b059032a1312d51750da272c83f10ed438f6e9444640a69dd9caf2ec3570c", - git_commit = "28f239fdfa0c94f715fccf0197ab6c3c8df27d28", + sha256 = "7434d6a8b725812d4deac59a393e682312d825b731c4807e90705b1e4e49e365", + git_commit = "82ea80b979768c7fe1daa4b50cf054e5a0968f31", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 990f1fcad3bf8454bfcc04829fd7dc9ec3ed0069 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Oct 2018 10:00:44 -0700 Subject: [PATCH 1325/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215755598 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7da389cc829..04dd9559b58 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7434d6a8b725812d4deac59a393e682312d825b731c4807e90705b1e4e49e365", - git_commit = "82ea80b979768c7fe1daa4b50cf054e5a0968f31", + sha256 = "622733659855909d5e627b846946f89ea1a6605971370f4b8f40fdc025b4a326", + git_commit = "80c9eec9b2475630f83a596f77a906c8075f8e6c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e0bb5ea7cfdef8ad1f263eed4cf71ec6cfad5d7d Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Thu, 4 Oct 2018 12:09:58 -0700 Subject: [PATCH 1326/8103] Add a simple ResNet client PiperOrigin-RevId: 215780365 --- tensorflow_serving/example/resnet_client.py | 62 +++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 tensorflow_serving/example/resnet_client.py diff --git a/tensorflow_serving/example/resnet_client.py b/tensorflow_serving/example/resnet_client.py new file mode 100644 index 00000000000..955abb7208c --- /dev/null +++ b/tensorflow_serving/example/resnet_client.py @@ -0,0 +1,62 @@ +# Copyright 2018 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""A client that performs inferences on a ResNet model using the REST API. + +The client downloads a test image of a cat, queries the server over the REST API +with the test image repeatedly and measures how long it takes to respond. + +Typical usage example: + + resnet_client.py +""" + +from __future__ import print_function + +import base64 +import requests + +SERVER_URL = 'http://localhost:8501/v1/models/resnet:predict' +IMAGE_URL = 'https://tensorflow.org/images/blogs/serving/cat.jpg' + + +def main(): + # Download the image + dl_request = requests.get(IMAGE_URL, stream=True) + dl_request.raise_for_status() + + # Compose a JSON Predict request (send JPEG image in base64). + predict_request = '{"instances" : [{"b64": "%s"}]}' % base64.b64encode( + dl_request.content) + + # Send few requests to warm-up the model. + for _ in xrange(3): + response = requests.post(SERVER_URL, data=predict_request) + response.raise_for_status() + + # Send few actual requests and report average latency. + total_time = 0 + num_requests = 10 + for _ in xrange(num_requests): + response = requests.post(SERVER_URL, data=predict_request) + response.raise_for_status() + total_time += response.elapsed.total_seconds() + prediction = response.json()['predictions'][0] + + print('Prediction class: {}, avg latency: {} ms'.format( + prediction['classes'], (total_time*1000)/num_requests)) + + +if __name__ == '__main__': + main() From dbdf3ce041f8763aa30281da85969438289fa9db Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Oct 2018 13:02:02 -0700 Subject: [PATCH 1327/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215788565 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 04dd9559b58..ea40a6a855a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "622733659855909d5e627b846946f89ea1a6605971370f4b8f40fdc025b4a326", - git_commit = "80c9eec9b2475630f83a596f77a906c8075f8e6c", + sha256 = "d1b1d4568d1e770fcf6d0c0477553120a515d2176eed84d6e863d0c139e38c2e", + git_commit = "2667ed3bf01e7153f466b27c450fc2b662c00bdd", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 26a3eee765397785a6d507a97e93d30dbdbba833 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Oct 2018 14:02:01 -0700 Subject: [PATCH 1328/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215798760 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ea40a6a855a..32bf1ad8580 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d1b1d4568d1e770fcf6d0c0477553120a515d2176eed84d6e863d0c139e38c2e", - git_commit = "2667ed3bf01e7153f466b27c450fc2b662c00bdd", + sha256 = "91c06e9044641050d0da771e07da18c1ea07ca0c69dc042983462d14c8f0f441", + git_commit = "2c75da86ffdb9d04b2b94ce89891f17a8656da22", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 33a4b052cedc39c21107bc99a090b59ca64ec568 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Thu, 4 Oct 2018 14:31:24 -0700 Subject: [PATCH 1329/8103] Update basic serving tutorials PiperOrigin-RevId: 215804106 --- tensorflow_serving/g3doc/serving_advanced.md | 8 ++------ tensorflow_serving/g3doc/serving_basic.md | 8 ++------ tensorflow_serving/g3doc/serving_inception.md | 4 ++-- 3 files changed, 6 insertions(+), 14 deletions(-) diff --git a/tensorflow_serving/g3doc/serving_advanced.md b/tensorflow_serving/g3doc/serving_advanced.md index 56f5c75d878..5d7978cb96b 100644 --- a/tensorflow_serving/g3doc/serving_advanced.md +++ b/tensorflow_serving/g3doc/serving_advanced.md @@ -33,10 +33,6 @@ This tutorial steps through the following tasks: Before getting started, first [install Docker](docker.md#installing-docker) -Note: All `bazel build` commands below use the standard `-c opt` flag. To -further optimize the build, refer to the -[instructions here](setup.md#optimized-build). - ## Train and export TensorFlow Model First, if you haven't done so yet, clone this repository to your local machine: @@ -55,7 +51,7 @@ rm -rf ./models Build the mnist trainer: ```shell -tools/bazel_in_docker.sh bazel build -c opt \ +tools/bazel_in_docker.sh bazel build \ tensorflow_serving/example:mnist_saved_model ``` @@ -289,7 +285,7 @@ Then start the server: ```shell docker run -p 8500:8500 \ --mount type=bind,source=$(pwd)/models/monitored,target=/models/mnist \ - -t --entrypoint=tensorflow_model_server tensorflow/serving --enable_batching \ + -t --entrypoint=tensorflow_model_server tensorflow/serving --enable_batching \ --port=8500 --model_name=mnist --model_base_path=/models/mnist & ``` diff --git a/tensorflow_serving/g3doc/serving_basic.md b/tensorflow_serving/g3doc/serving_basic.md index 0210c5d9a34..b91245479a2 100644 --- a/tensorflow_serving/g3doc/serving_basic.md +++ b/tensorflow_serving/g3doc/serving_basic.md @@ -26,10 +26,6 @@ The code for this tutorial consists of two parts: Before getting started, first [install Docker](docker.md#installing-docker) -Note: All `bazel build` commands below use the standard `-c opt` flag. To -further optimize the build, refer to the -[instructions here](setup.md#optimized-build). - ## Train and export TensorFlow model As you can see in `mnist_saved_model.py`, the training is done the same way it @@ -179,7 +175,7 @@ instructions for both the Bazel and PIP options. * **Bazel**: ```shell - tools/bazel_in_docker.sh bazel build -c opt tensorflow_serving/example:mnist_saved_model + tools/bazel_in_docker.sh bazel build tensorflow_serving/example:mnist_saved_model tools/bazel_in_docker.sh bazel-bin/tensorflow_serving/example/mnist_saved_model models/mnist ``` @@ -253,7 +249,7 @@ requests to the server, and calculates the inference error rate. * **Bazel**: ```shell - tools/bazel_in_docker.sh bazel build -c opt \ + tools/bazel_in_docker.sh bazel build \ tensorflow_serving/example:mnist_client tools/bazel_in_docker.sh bazel-bin/tensorflow_serving/example/mnist_client \ --num_tests=1000 --server=127.0.0.1:8500 diff --git a/tensorflow_serving/g3doc/serving_inception.md b/tensorflow_serving/g3doc/serving_inception.md index 06013268f79..4700618bbdd 100644 --- a/tensorflow_serving/g3doc/serving_inception.md +++ b/tensorflow_serving/g3doc/serving_inception.md @@ -45,7 +45,7 @@ further optimize the build, refer to the [instructions here](setup.md#optimized-build). ```shell -tools/bazel_in_docker.sh bazel build -c opt \ +tools/bazel_in_docker.sh bazel build \ tensorflow_serving/example:inception_saved_model ``` @@ -141,7 +141,7 @@ Note: We leave it as an exercise to the reader to find an image of a cat on the Internet. ```shell -tools/bazel_in_docker.sh bazel build -c opt \ +tools/bazel_in_docker.sh bazel build \ tensorflow_serving/example:inception_client tools/bazel_in_docker.sh bazel-bin/tensorflow_serving/example/inception_client \ --server=127.0.0.1:8500 --image=local/path/to/my_cat_image.jpg From 752c270a5687b49eb4d84e258955535fd310a013 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Oct 2018 17:00:41 -0700 Subject: [PATCH 1330/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215829266 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 32bf1ad8580..12876823b69 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "91c06e9044641050d0da771e07da18c1ea07ca0c69dc042983462d14c8f0f441", - git_commit = "2c75da86ffdb9d04b2b94ce89891f17a8656da22", + sha256 = "78f7233b983643f08c270c37478977db46e44ad5d55aadc68e884733735b07fc", + git_commit = "cf8e7cf89abb4a7783b9a99f17574ea128fa767a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 15029827e36b17ba6cb033f7d96c2a2db38f1fe0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Oct 2018 18:00:51 -0700 Subject: [PATCH 1331/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215836786 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 12876823b69..92bf26ffeff 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "78f7233b983643f08c270c37478977db46e44ad5d55aadc68e884733735b07fc", - git_commit = "cf8e7cf89abb4a7783b9a99f17574ea128fa767a", + sha256 = "0f3eed780fa6e1d05f93d560515d6f1527f204f9b3bdcda98996018dbbc5aa3e", + git_commit = "4a00f2fc6514ad5ee60ab0a9645863fdf263499f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f2afdc1c4407d02617b40f16f421e14ad5902396 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Oct 2018 21:01:23 -0700 Subject: [PATCH 1332/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215851203 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 92bf26ffeff..e652a52ec66 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0f3eed780fa6e1d05f93d560515d6f1527f204f9b3bdcda98996018dbbc5aa3e", - git_commit = "4a00f2fc6514ad5ee60ab0a9645863fdf263499f", + sha256 = "59027a75ab5c2aff7cb324c1c1d9f3623ffdc3a234790d147e0f4481489371c1", + git_commit = "f4cef34fad7b00a3b1f288ff5c95001c5b83c1f8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7321dbcfb1f75822ddc27cb17b420a46577a9d46 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Oct 2018 01:01:31 -0700 Subject: [PATCH 1333/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215868716 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e652a52ec66..d42ee6f9558 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "59027a75ab5c2aff7cb324c1c1d9f3623ffdc3a234790d147e0f4481489371c1", - git_commit = "f4cef34fad7b00a3b1f288ff5c95001c5b83c1f8", + sha256 = "dedba9e2d3f1f3c734b7388e247db9758fc0fe5fe3d319befe4ebc22055e0e40", + git_commit = "57d31aa599c83014397a22bbb8f1a27a33b0ade3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 39f73622d5e717a08046eb815a081c687aaf82d2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Oct 2018 03:02:40 -0700 Subject: [PATCH 1334/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215881376 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d42ee6f9558..641ae6b01c3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dedba9e2d3f1f3c734b7388e247db9758fc0fe5fe3d319befe4ebc22055e0e40", - git_commit = "57d31aa599c83014397a22bbb8f1a27a33b0ade3", + sha256 = "7cdc12bd170b49d373d41b2e3d5b817475db019bce156ade957fb6396a63eec2", + git_commit = "3b94d75a9e10ef8ef33760d0ef6aad326e1353ba", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c9614946aafb5c027e506c6b232b8fec833cc63d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Oct 2018 06:02:16 -0700 Subject: [PATCH 1335/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215895081 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 641ae6b01c3..8ac107aafe2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7cdc12bd170b49d373d41b2e3d5b817475db019bce156ade957fb6396a63eec2", - git_commit = "3b94d75a9e10ef8ef33760d0ef6aad326e1353ba", + sha256 = "c660584be0c9f4c25c079dcdf593083fa6d6c5979a2e1c7c288b07da16aef7cd", + git_commit = "123de2797a4348c963b597096762085bfa09eab1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a37412d7cac7e12714965fc051299df1ddf4d601 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Oct 2018 13:01:20 -0700 Subject: [PATCH 1336/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215952790 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8ac107aafe2..447233220eb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c660584be0c9f4c25c079dcdf593083fa6d6c5979a2e1c7c288b07da16aef7cd", - git_commit = "123de2797a4348c963b597096762085bfa09eab1", + sha256 = "380465e382df6a3d5eaa059410070ad9495a472a353de20d162f5d47f4381415", + git_commit = "0541a277d5c74cf8e99c9f5a7a015926d1a05214", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a2ac1a78ce8b440a37c6bf2bbcf4c2daf76eba22 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Oct 2018 14:01:22 -0700 Subject: [PATCH 1337/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215962019 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 447233220eb..0f469cd34ba 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "380465e382df6a3d5eaa059410070ad9495a472a353de20d162f5d47f4381415", - git_commit = "0541a277d5c74cf8e99c9f5a7a015926d1a05214", + sha256 = "f1a9ce11edf068b60160cceb7f29bb291b15803815a6f287b9659d72c3c13751", + git_commit = "ec451f5ab43467d7cb4ae7736f2de16331441e0b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b83055baad2eff6f1a03073a219ad938e18093b4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Oct 2018 15:02:42 -0700 Subject: [PATCH 1338/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215972170 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0f469cd34ba..17e653da2b6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f1a9ce11edf068b60160cceb7f29bb291b15803815a6f287b9659d72c3c13751", - git_commit = "ec451f5ab43467d7cb4ae7736f2de16331441e0b", + sha256 = "942289f60733e8b768a07a4f963ed989e6aca7efcd25b822ba00e0ba1ca4e22e", + git_commit = "ae0bc6f006497cc04a2ee75166d4ec71c7154fd8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fe4f221c9d7bc5e5e9649eec983e17488f0b11dd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Oct 2018 16:00:58 -0700 Subject: [PATCH 1339/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215981127 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 17e653da2b6..6db8ba39540 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "942289f60733e8b768a07a4f963ed989e6aca7efcd25b822ba00e0ba1ca4e22e", - git_commit = "ae0bc6f006497cc04a2ee75166d4ec71c7154fd8", + sha256 = "ef9c143fa21570fccb664ef7cb1becb0d995131e448c9b9755fee1667b23afdc", + git_commit = "07921022ddc68aacbf210acc62545a90e3091fb1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e1163aefc82ad7ca4cbb41d4db69057e0c2ce50a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Oct 2018 17:00:55 -0700 Subject: [PATCH 1340/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215989250 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6db8ba39540..0a0670cb3c7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ef9c143fa21570fccb664ef7cb1becb0d995131e448c9b9755fee1667b23afdc", - git_commit = "07921022ddc68aacbf210acc62545a90e3091fb1", + sha256 = "c8b2f6308cd26d4734f5064b3184691bdab33419e6ebb3e162f23917a5ea91c8", + git_commit = "4aad5382f0e7148d8489d24d8355b828b3f7811b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ca944d8526e17112217fc17ff6d76ca262f81fc3 Mon Sep 17 00:00:00 2001 From: awk Date: Fri, 5 Oct 2018 17:43:09 -0700 Subject: [PATCH 1341/8103] Fix broken link. Fixes https://github.com/tensorflow/serving/issues/1124 PiperOrigin-RevId: 215993929 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a6637e03f42..43f7b604a0f 100644 --- a/README.md +++ b/README.md @@ -52,5 +52,5 @@ See [install instructions](tensorflow_serving/g3doc/setup.md). ## For more information -* [Serving architecture overview](tensorflow_serving/g3doc/architecture_overview.md) +* [Serving architecture overview](tensorflow_serving/g3doc/overview.md) * [TensorFlow website](http://tensorflow.org) From 8b3b85f198939114eca658a7e7d44fd94191e021 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Oct 2018 18:01:36 -0700 Subject: [PATCH 1342/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 215995404 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0a0670cb3c7..ff2d09523af 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c8b2f6308cd26d4734f5064b3184691bdab33419e6ebb3e162f23917a5ea91c8", - git_commit = "4aad5382f0e7148d8489d24d8355b828b3f7811b", + sha256 = "6eeef17b12d3a0e11942841f625ebb9db49ed882b0dc37f49103c3230d0583e5", + git_commit = "15d399cd8590c18dc643d979883fe4201c8ea631", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 590358910dd17277e89d95d0e7803d34315148c4 Mon Sep 17 00:00:00 2001 From: awk Date: Fri, 5 Oct 2018 18:53:43 -0700 Subject: [PATCH 1343/8103] Update release notes for TF serving 1.11 release. PiperOrigin-RevId: 215999320 --- RELEASE.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/RELEASE.md b/RELEASE.md index 99452d501dd..d2353683d17 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,3 +1,33 @@ +# Release 1.11.0 + +## Major Features and Improvements + +* Prometheus exporter for TF metrics (see https://github.com/tensorflow/serving/commit/021efbd3281aa815cab0b35eab6d6d25249c12d4 for details). + +## Breaking Changes + +* No breaking changes + +## Bug Fixes and Other Changes + +* Built against TensorFlow [1.11.0](https://github.com/tensorflow/tensorflow/releases/tag/v1.11.0) +* Accept integers for float/doubles in JSON REST API requests +* TF Serving API is now pre-built into Docker development images +* GPU Docker images are now built against cuDNN 7.2 +* Add `--max_num_load_retries` flag to ModelServer (fixes #1099) +* Add user-configured model version labels to the stand-alone ModelServer binary. +* Directly import tensor.proto.h (the transitive import will be removed from tensor.h soon) +* Building optimized TensorFlow Serving binaries is now easier (see [docs](https://github.com/tensorflow/serving/g3doc/setup.md]) for details) +* Adds columnar format support for input/output tensors in Predict REST API (fixes #1047) +* Development Dockerfiles now produce a more optimized ModelServer +* Fixed TensorFlow Serving API PyPi package overwriting TensorFlow package. + +## Thanks to our Contributors + +This release contains contributions from many people at Google, as well as: + +Feisan, joshua.horowitz, Prashanth Reddy Basani, tianyapiaozi, Vamsi Sripathi, Yu Zheng + # Release 1.11.0-rc0 ## Major Features and Improvements From af80c7e22a1550a01c73805888d92b680e66f21b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Oct 2018 20:01:43 -0700 Subject: [PATCH 1344/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216002595 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ff2d09523af..4270568013a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6eeef17b12d3a0e11942841f625ebb9db49ed882b0dc37f49103c3230d0583e5", - git_commit = "15d399cd8590c18dc643d979883fe4201c8ea631", + sha256 = "86e99d5a7027f429ebda8475b83b42914c9884ad8220d845a444082689f0fe53", + git_commit = "5dcca3baca11de0687747e9b5ad8854b77fd097d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 58cefe6532c9d006254dee46aafd58fc2a56dc94 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Oct 2018 22:02:13 -0700 Subject: [PATCH 1345/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216008830 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4270568013a..f87bac71516 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "86e99d5a7027f429ebda8475b83b42914c9884ad8220d845a444082689f0fe53", - git_commit = "5dcca3baca11de0687747e9b5ad8854b77fd097d", + sha256 = "4de569d70e1ee6199aa5a79eb70ee0b137b087f2977b6e5526765aeb53a6bcbd", + git_commit = "7d3bfc143a74d8e49f138841a07f7f4693b0a911", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1e0c805703e4c0b611a5127c7da98a98216c8036 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 6 Oct 2018 00:02:18 -0700 Subject: [PATCH 1346/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216014159 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f87bac71516..cfcf7d0a7d3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4de569d70e1ee6199aa5a79eb70ee0b137b087f2977b6e5526765aeb53a6bcbd", - git_commit = "7d3bfc143a74d8e49f138841a07f7f4693b0a911", + sha256 = "5aeadc6d838ddd49ef8bd7febf4afbe8159276e606a5d80464d8d3e76ea7d8b5", + git_commit = "5be206276ca53f887374e3277a018a9348d58e7f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 411e849d353d0986f6495f0bf42669185685ad3d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 6 Oct 2018 03:00:50 -0700 Subject: [PATCH 1347/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216023744 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cfcf7d0a7d3..2b04cadd0a8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5aeadc6d838ddd49ef8bd7febf4afbe8159276e606a5d80464d8d3e76ea7d8b5", - git_commit = "5be206276ca53f887374e3277a018a9348d58e7f", + sha256 = "5f9da5f711cd929e734f360040e20af9d62a9b656e98faefbf118ca64166ee80", + git_commit = "fb92d456476c36210cea3b76393f584a306f092b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e0de06e5daf2588663723fac473319a3b7511474 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 6 Oct 2018 12:01:26 -0700 Subject: [PATCH 1348/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216045704 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2b04cadd0a8..8abf703febe 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5f9da5f711cd929e734f360040e20af9d62a9b656e98faefbf118ca64166ee80", - git_commit = "fb92d456476c36210cea3b76393f584a306f092b", + sha256 = "66bd2f802bbd92228a8b30e51da6ecfed75458e63b55c3a4c62418ccb0aeceff", + git_commit = "5c0a6bdfeb1848b0146a36706d921dde06ba160a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 727a363336faee0853d0a7b30974f536535d4325 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 6 Oct 2018 14:01:38 -0700 Subject: [PATCH 1349/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216050567 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8abf703febe..ce1f000fbd3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "66bd2f802bbd92228a8b30e51da6ecfed75458e63b55c3a4c62418ccb0aeceff", - git_commit = "5c0a6bdfeb1848b0146a36706d921dde06ba160a", + sha256 = "cea61dbc4d7c088d71f7dfc785a288c1a7c11471c3ff8de1c07a02dab4342f38", + git_commit = "6471d6bb2e96d87102156c799858ae12752ace60", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 117bbd1ac893c207d0082c1c1e33f5b84f925337 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 6 Oct 2018 15:02:20 -0700 Subject: [PATCH 1350/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216052787 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ce1f000fbd3..6ffa7fff2ca 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cea61dbc4d7c088d71f7dfc785a288c1a7c11471c3ff8de1c07a02dab4342f38", - git_commit = "6471d6bb2e96d87102156c799858ae12752ace60", + sha256 = "7ea7e29d1b45714856b3b90fbf5bf98d73709e927dbd5c35188e549945716219", + git_commit = "e93a18954689b6d522560f5273f6d3320d545b2e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b9f3d2a4e6e620727eb4675bb6b1132da2e9fcdd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 6 Oct 2018 23:01:56 -0700 Subject: [PATCH 1351/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216071060 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6ffa7fff2ca..aaac2d894e3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7ea7e29d1b45714856b3b90fbf5bf98d73709e927dbd5c35188e549945716219", - git_commit = "e93a18954689b6d522560f5273f6d3320d545b2e", + sha256 = "69c9bc701cd640cff38bfeac95e9cf37a91fca1e0053d8586a61708136fbce22", + git_commit = "7fa6a6b42bc9d562e2b1cc765ca78d281b51f734", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c20160667cb3448c1d6911cd864a4a6c762e93e7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 7 Oct 2018 04:02:06 -0700 Subject: [PATCH 1352/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216085266 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index aaac2d894e3..1272912f467 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "69c9bc701cd640cff38bfeac95e9cf37a91fca1e0053d8586a61708136fbce22", - git_commit = "7fa6a6b42bc9d562e2b1cc765ca78d281b51f734", + sha256 = "ea0fa4419384eab3a1263be97d3b53660567753365cd180e2cbfff0f8835047e", + git_commit = "367f7d651f19c5b111ea0292243eab81fb4058c7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 425195bd52e74fd624cb8ef94aef28fe5678ef09 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 8 Oct 2018 05:01:46 -0700 Subject: [PATCH 1353/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216168571 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1272912f467..f9b0e737dea 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ea0fa4419384eab3a1263be97d3b53660567753365cd180e2cbfff0f8835047e", - git_commit = "367f7d651f19c5b111ea0292243eab81fb4058c7", + sha256 = "d420cec461a15a6d824f65701bfcc1825c2b6eb1092937e5983164d7b2fe36e6", + git_commit = "393a13c1b1a7d51b0871a6d4b3d3413d8e1765bf", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1927325a7beadba02b02de72bc3e639fd6ca768b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 8 Oct 2018 10:02:13 -0700 Subject: [PATCH 1354/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216203799 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f9b0e737dea..9ba0091d8ca 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d420cec461a15a6d824f65701bfcc1825c2b6eb1092937e5983164d7b2fe36e6", - git_commit = "393a13c1b1a7d51b0871a6d4b3d3413d8e1765bf", + sha256 = "b0f2b825404a9378736fa70ead58eb271d3dcc010dceb2f78cf7aaf414abfcf7", + git_commit = "75f57a8b7836a1ed3cda8ba81c88f6caf15cf0c6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 917681fce7f0c52db38529da97029ec3c4103cac Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 8 Oct 2018 11:01:15 -0700 Subject: [PATCH 1355/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216214564 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9ba0091d8ca..18191f6eb09 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b0f2b825404a9378736fa70ead58eb271d3dcc010dceb2f78cf7aaf414abfcf7", - git_commit = "75f57a8b7836a1ed3cda8ba81c88f6caf15cf0c6", + sha256 = "eeefa9f74c56dde50dd67e42266b12f83a4c88350537f5cafc5d8d979c80f664", + git_commit = "5f308cb408eb46ec9af0546be6b9ae1d5166b185", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9332a96af86d40da4a65768a4d9773011f691227 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 8 Oct 2018 12:01:07 -0700 Subject: [PATCH 1356/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216225107 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 18191f6eb09..1d770cd03c0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eeefa9f74c56dde50dd67e42266b12f83a4c88350537f5cafc5d8d979c80f664", - git_commit = "5f308cb408eb46ec9af0546be6b9ae1d5166b185", + sha256 = "377e58ca0fb54f4e03915d7dbe923d5a885477efeba74764fd0e09e7d4bf7726", + git_commit = "96237f7b7ae6b7b8a2cbcf6d64312906b96f060b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 21cd2821411354194898aedde5fd105bc0daf6c3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 8 Oct 2018 13:01:33 -0700 Subject: [PATCH 1357/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216234760 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1d770cd03c0..40902a6cbe1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "377e58ca0fb54f4e03915d7dbe923d5a885477efeba74764fd0e09e7d4bf7726", - git_commit = "96237f7b7ae6b7b8a2cbcf6d64312906b96f060b", + sha256 = "d024ad6628acf02298804398647ce7aeee113f1f343ddba936a257d612fb64f3", + git_commit = "dcd3b4307a3095e3f18aef53f5034787e3cc3af6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d5beb086a21ab32559e4c04fe803a5c29b3aa3e6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 8 Oct 2018 15:40:42 -0700 Subject: [PATCH 1358/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216262771 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 40902a6cbe1..5c0b4c442f2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d024ad6628acf02298804398647ce7aeee113f1f343ddba936a257d612fb64f3", - git_commit = "dcd3b4307a3095e3f18aef53f5034787e3cc3af6", + sha256 = "08b8b8fa1214d112f7513b7f9dfdf858803a55ebcf75be2e70c0cc9f10deef58", + git_commit = "9b558126e31d25ec4e82cb4f50033d6eca44349a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 09065b15511e3217589c6f50792a9019e6e39181 Mon Sep 17 00:00:00 2001 From: wenboz Date: Mon, 8 Oct 2018 16:47:19 -0700 Subject: [PATCH 1359/8103] Added a zlib based gzip module for net_http (httpserver). PiperOrigin-RevId: 216273954 --- .../util/net_http/compression/BUILD | 38 + .../util/net_http/compression/README.md | 11 + .../util/net_http/compression/gzip_zlib.cc | 831 ++++++++++++++++++ .../util/net_http/compression/gzip_zlib.h | 343 ++++++++ .../net_http/compression/gzip_zlib_test.cc | 599 +++++++++++++ 5 files changed, 1822 insertions(+) create mode 100644 tensorflow_serving/util/net_http/compression/BUILD create mode 100644 tensorflow_serving/util/net_http/compression/README.md create mode 100644 tensorflow_serving/util/net_http/compression/gzip_zlib.cc create mode 100644 tensorflow_serving/util/net_http/compression/gzip_zlib.h create mode 100644 tensorflow_serving/util/net_http/compression/gzip_zlib_test.cc diff --git a/tensorflow_serving/util/net_http/compression/BUILD b/tensorflow_serving/util/net_http/compression/BUILD new file mode 100644 index 00000000000..93fd60c17e0 --- /dev/null +++ b/tensorflow_serving/util/net_http/compression/BUILD @@ -0,0 +1,38 @@ +# Description: compression support libraries + +package( + default_visibility = [ + "//tensorflow_serving:internal", + "//tensorflow_serving/util/net_http:__subpackages__", + ], +) + +licenses(["notice"]) # Apache 2.0 + +# C++ lib based on zlib for gzip support +cc_library( + name = "gzip_zlib", + srcs = [ + "gzip_zlib.cc", + ], + hdrs = [ + "gzip_zlib.h", + ], + deps = [ + "@com_google_absl//absl/base", + "@com_google_absl//absl/base:core_headers", + "@com_google_absl//absl/strings", + "@zlib_archive//:zlib", + ], +) + +cc_test( + name = "gzip_zlib_test", + size = "medium", + srcs = ["gzip_zlib_test.cc"], + features = ["-layering_check"], + deps = [ + ":gzip_zlib", + "//tensorflow_serving/core/test_util:test_main", + ], +) diff --git a/tensorflow_serving/util/net_http/compression/README.md b/tensorflow_serving/util/net_http/compression/README.md new file mode 100644 index 00000000000..588a325dc3b --- /dev/null +++ b/tensorflow_serving/util/net_http/compression/README.md @@ -0,0 +1,11 @@ +Compression support +=================== + +This package provides C++ wrappers for compression libraries such as gzip, br. + +APIs are subject to change but usage outside net_http is expected. + +gzip_zlib.h +--------------------- + +Minimum APIs and implementation to support gzip Content-Encoding via zlib. diff --git a/tensorflow_serving/util/net_http/compression/gzip_zlib.cc b/tensorflow_serving/util/net_http/compression/gzip_zlib.cc new file mode 100644 index 00000000000..5ce1aeb483d --- /dev/null +++ b/tensorflow_serving/util/net_http/compression/gzip_zlib.cc @@ -0,0 +1,831 @@ +/* Copyright 2018 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// zlib based C++ wrapper to support gzip compression/uncompression + +#include "tensorflow_serving/util/net_http/compression/gzip_zlib.h" + +#include + +#include +#include + +#include "absl/base/casts.h" +#include "absl/base/internal/raw_logging.h" +#include "absl/base/macros.h" + +namespace tensorflow { +namespace serving { +namespace net_http { + +// TODO(wenboz): disable setting change, free-list (no setting change) + +// The GZIP header (see RFC 1952): +// +---+---+---+---+---+---+---+---+---+---+ +// |ID1|ID2|CM |FLG| MTIME |XFL|OS | +// +---+---+---+---+---+---+---+---+---+---+ +// ID1 \037 +// ID2 \213 +// CM \010 (compression method == DEFLATE) +// FLG \000 (special flags that we do not support) +// MTIME Unix format modification time (0 means not available) +// XFL 2-4? DEFLATE flags +// OS ???? Operating system indicator (255 means unknown) + +// gzip header, as a macro for sizeof() +#define GZIP_HEADER "\037\213\010\000\000\000\000\000\002\377" + +constexpr uint8_t kMagicHeader[2] = {0x1f, 0x8b}; // gzip magic header + +GZipHeader::Status GZipHeader::ReadMore(const char *inbuf, int inbuf_len, + const char **header_end) { + auto pos = reinterpret_cast(inbuf); + const uint8_t *const end = pos + inbuf_len; + + while (pos < end) { + switch (state_) { + case IN_HEADER_ID1: + if (*pos != kMagicHeader[0]) return INVALID_HEADER; + pos++; + state_++; + break; + case IN_HEADER_ID2: + if (*pos != kMagicHeader[1]) return INVALID_HEADER; + pos++; + state_++; + break; + case IN_HEADER_CM: + if (*pos != Z_DEFLATED) return INVALID_HEADER; + pos++; + state_++; + break; + case IN_HEADER_FLG: + flags_ = + (*pos) & (FLAG_FHCRC | FLAG_FEXTRA | FLAG_FNAME | FLAG_FCOMMENT); + pos++; + state_++; + break; + + case IN_HEADER_MTIME_BYTE_0: + pos++; + state_++; + break; + case IN_HEADER_MTIME_BYTE_1: + pos++; + state_++; + break; + case IN_HEADER_MTIME_BYTE_2: + pos++; + state_++; + break; + case IN_HEADER_MTIME_BYTE_3: + pos++; + state_++; + break; + + case IN_HEADER_XFL: + pos++; + state_++; + break; + + case IN_HEADER_OS: + pos++; + state_++; + break; + + case IN_XLEN_BYTE_0: + if (!(flags_ & FLAG_FEXTRA)) { + state_ = IN_FNAME; + break; + } + // We have a two-byte little-endian length, followed by a + // field of that length. + extra_length_ = *pos; + pos++; + state_++; + break; + case IN_XLEN_BYTE_1: + extra_length_ += (*pos) << 8; + pos++; + state_++; + ABSL_FALLTHROUGH_INTENDED; + // if we have a zero-length FEXTRA, we want to check + // to notice that we're done reading the FEXTRA before we exit the loop. + + case IN_FEXTRA: { + // Grab the rest of the bytes in the extra field, or as many + // of them as are actually present so far. + const int num_extra_bytes = + std::min(extra_length_, absl::implicit_cast(end - pos)); + pos += num_extra_bytes; + extra_length_ -= num_extra_bytes; + if (extra_length_ == 0) { + state_ = IN_FNAME; // advance when we've seen extra_length_ bytes + flags_ &= ~FLAG_FEXTRA; // we're done with the FEXTRA stuff + } + break; + } + + case IN_FNAME: + if (!(flags_ & FLAG_FNAME)) { + state_ = IN_FCOMMENT; + break; + } + // See if we can find the end of the \0-terminated FNAME field. + pos = reinterpret_cast(memchr(pos, '\0', (end - pos))); + if (pos != nullptr) { + pos++; // advance past the '\0' + flags_ &= ~FLAG_FNAME; // we're done with the FNAME stuff + state_ = IN_FCOMMENT; + } else { + pos = end; // everything we have so far is part of the FNAME + } + break; + + case IN_FCOMMENT: + if (!(flags_ & FLAG_FCOMMENT)) { + state_ = IN_FHCRC_BYTE_0; + break; + } + // See if we can find the end of the \0-terminated FCOMMENT field. + pos = reinterpret_cast(memchr(pos, '\0', (end - pos))); + if (pos != nullptr) { + pos++; // advance past the '\0' + flags_ &= ~FLAG_FCOMMENT; // we're done with the FCOMMENT stuff + state_ = IN_FHCRC_BYTE_0; + } else { + pos = end; // everything we have so far is part of the FNAME + } + break; + + case IN_FHCRC_BYTE_0: + if (!(flags_ & FLAG_FHCRC)) { + state_ = IN_DONE; + break; + } + pos++; + state_++; + break; + + case IN_FHCRC_BYTE_1: + pos++; + flags_ &= ~FLAG_FHCRC; // we're done with the FHCRC stuff + state_++; + break; + + case IN_DONE: + *header_end = reinterpret_cast(pos); + return COMPLETE_HEADER; + + default: + break; + } + } + + if ((state_ > IN_HEADER_OS) && (flags_ == 0)) { + *header_end = reinterpret_cast(pos); + return COMPLETE_HEADER; + } else { + return INCOMPLETE_HEADER; + } +} + +ZLib::ZLib() + : comp_init_(false), uncomp_init_(false), gzip_header_(new GZipHeader) { + Reinit(); + init_settings_ = settings_; +} + +ZLib::~ZLib() { + if (comp_init_) { + deflateEnd(&comp_stream_); + } + if (uncomp_init_) { + inflateEnd(&uncomp_stream_); + } + delete gzip_header_; +} + +void ZLib::Reinit() { + settings_.compression_level_ = Z_DEFAULT_COMPRESSION; + settings_.window_bits_ = MAX_WBITS; + settings_.mem_level_ = 8; // DEF_MEM_LEVEL + settings_.dont_hide_zstream_end_ = false; + + if (comp_init_) { + int err = deflateReset(&comp_stream_); + if (err != Z_OK) { + deflateEnd(&comp_stream_); + comp_init_ = false; + } + } + if (uncomp_init_) { + // Use negative window bits size to indicate bare stream with no header. + int wbits = -MAX_WBITS; + int err = inflateReset2(&uncomp_stream_, wbits); + if (err != Z_OK) { + inflateEnd(&uncomp_stream_); + uncomp_init_ = false; + } + } + crc_ = 0; + uncompressed_size_ = 0; + gzip_header_->Reset(); + gzip_footer_bytes_ = -1; + first_chunk_ = true; +} + +void ZLib::Reset() { + first_chunk_ = true; + gzip_header_->Reset(); +} + +void ZLib::SetDontHideStreamEnd() { settings_.dont_hide_zstream_end_ = true; } + +int ZLib::MinFooterSize() const { + int min_footer_size = 2; // Room for empty chunk. + min_footer_size += 8; // Room for actual footer for gzip + return min_footer_size; +} + +// --------- COMPRESS MODE + +// Initialization method to be called if we hit an error while +// compressing. On hitting an error, call this method before returning +// the error. +void ZLib::CompressErrorInit() { + if (comp_init_) { + deflateEnd(&comp_stream_); + comp_init_ = false; + } + Reset(); +} + +// These probably return Z_OK, but may return Z_BUF_ERROR if outbuf is full +int ZLib::WriteGzipHeader() { + if (comp_stream_.avail_out < sizeof(GZIP_HEADER)) return Z_BUF_ERROR; + memcpy(comp_stream_.next_out, GZIP_HEADER, sizeof(GZIP_HEADER) - 1); + comp_stream_.next_out += sizeof(GZIP_HEADER) - 1; + comp_stream_.avail_out -= sizeof(GZIP_HEADER) - 1; + return Z_OK; +} + +int ZLib::WriteGzipFooter(Bytef *dest, uLongf destLen) { + if (destLen < 8) // not enough space for footer + return Z_BUF_ERROR; + *dest++ = (crc_ >> 0) & 255; + *dest++ = (crc_ >> 8) & 255; + *dest++ = (crc_ >> 16) & 255; + *dest++ = (crc_ >> 24) & 255; + *dest++ = (uncompressed_size_ >> 0) & 255; + *dest++ = (uncompressed_size_ >> 8) & 255; + *dest++ = (uncompressed_size_ >> 16) & 255; + *dest++ = (uncompressed_size_ >> 24) & 255; + return Z_OK; +} + +int ZLib::DeflateInit() { + int err = deflateInit2(&comp_stream_, settings_.compression_level_, + Z_DEFLATED, -settings_.window_bits_, + settings_.mem_level_, Z_DEFAULT_STRATEGY); + if (err == Z_OK) { + // Save parameters for later reusability checks + init_settings_.compression_level_ = settings_.compression_level_; + init_settings_.window_bits_ = settings_.window_bits_; + init_settings_.mem_level_ = settings_.mem_level_; + } + return err; +} + +int ZLib::CompressInit(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong *sourceLen) { + int err; + + comp_stream_.next_in = (Bytef *)source; + comp_stream_.avail_in = (uInt)*sourceLen; + // Check for sourceLen (unsigned long) to fit into avail_in (unsigned int). + if ((uLong)comp_stream_.avail_in != *sourceLen) return Z_BUF_ERROR; + comp_stream_.next_out = dest; + comp_stream_.avail_out = (uInt)*destLen; + // Check for destLen (unsigned long) to fit into avail_out (unsigned int). + if ((uLong)comp_stream_.avail_out != *destLen) return Z_BUF_ERROR; + + if (!first_chunk_) // only need to set up stream the first time through + return Z_OK; + + // Force full reinit if properties have changed in a way we can't adjust. + if (comp_init_ && (init_settings_.window_bits_ != settings_.window_bits_ || + init_settings_.mem_level_ != settings_.mem_level_)) { + deflateEnd(&comp_stream_); + comp_init_ = false; + } + + // Reuse if we've already initted the object. + if (comp_init_) { // we've already initted it + err = deflateReset(&comp_stream_); + if (err != Z_OK) { + deflateEnd(&comp_stream_); + comp_init_ = false; + } + } + + // If compression level has changed, try to reconfigure instead of reinit + if (comp_init_ && + init_settings_.compression_level_ != settings_.compression_level_) { + err = deflateParams(&comp_stream_, settings_.compression_level_, + Z_DEFAULT_STRATEGY); + if (err == Z_OK) { + init_settings_.compression_level_ = settings_.compression_level_; + } else { + deflateEnd(&comp_stream_); + comp_init_ = false; + } + } + + // First use or previous state was not reusable with current settings. + if (!comp_init_) { + comp_stream_.zalloc = (alloc_func)0; + comp_stream_.zfree = (free_func)0; + comp_stream_.opaque = (voidpf)0; + err = DeflateInit(); + if (err != Z_OK) return err; + comp_init_ = true; + } + return Z_OK; +} + +// Supports chunked compression, using the chunked compression features of zlib. +int ZLib::CompressAtMostOrAll(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong *sourceLen, + int flush_mode) { // Z_FULL_FLUSH or Z_FINISH + int err; + + if ((err = CompressInit(dest, destLen, source, sourceLen)) != Z_OK) + return err; + + // This is used to figure out how many bytes we wrote *this chunk* + uint64_t compressed_size = comp_stream_.total_out; + + // Some setup happens only for the first chunk we compress in a run + if (first_chunk_) { + if ((err = WriteGzipHeader()) != Z_OK) return err; + compressed_size -= sizeof(GZIP_HEADER) - 1; // -= is right: adds to size + crc_ = crc32(0, nullptr, 0); // initialize + + uncompressed_size_ = 0; + first_chunk_ = false; // so we don't do this again + } + + // flush_mode is Z_FINISH for all mode, Z_SYNC_FLUSH for incremental + // compression. + err = deflate(&comp_stream_, flush_mode); + + const uLong source_bytes_consumed = *sourceLen - comp_stream_.avail_in; + *sourceLen = comp_stream_.avail_in; + + if ((err == Z_STREAM_END || err == Z_OK) && comp_stream_.avail_in == 0 && + comp_stream_.avail_out != 0) { + // we processed everything ok and the output buffer was large enough. + } else if (err == Z_STREAM_END && comp_stream_.avail_in > 0) { + return Z_BUF_ERROR; // should never happen + } else if (err != Z_OK && err != Z_STREAM_END && err != Z_BUF_ERROR) { + // an error happened + CompressErrorInit(); + return err; + } else if (comp_stream_.avail_out == 0) { // not enough space + err = Z_BUF_ERROR; + } + + assert(err == Z_OK || err == Z_STREAM_END || err == Z_BUF_ERROR); + if (err == Z_STREAM_END) err = Z_OK; + + // update the crc and other metadata + uncompressed_size_ += source_bytes_consumed; + compressed_size = comp_stream_.total_out - compressed_size; // delta + *destLen = compressed_size; + + crc_ = crc32(crc_, source, source_bytes_consumed); + + return err; +} + +int ZLib::CompressChunkOrAll(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong sourceLen, + int flush_mode) { // Z_FULL_FLUSH or Z_FINISH + const int ret = + CompressAtMostOrAll(dest, destLen, source, &sourceLen, flush_mode); + if (ret == Z_BUF_ERROR) CompressErrorInit(); + return ret; +} + +int ZLib::CompressChunk(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong sourceLen) { + return CompressChunkOrAll(dest, destLen, source, sourceLen, Z_SYNC_FLUSH); +} + +int ZLib::CompressAtMost(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong *sourceLen) { + return CompressAtMostOrAll(dest, destLen, source, sourceLen, Z_SYNC_FLUSH); +} + +// This writes the gzip footer info, if necessary. +// No matter what, we call Reset() so we can compress Chunks again. +int ZLib::CompressChunkDone(Bytef *dest, uLongf *destLen) { + // Make sure our buffer is of reasonable size. + if (*destLen < static_cast(MinFooterSize())) { + *destLen = 0; + return Z_BUF_ERROR; + } + + // The underlying zlib library requires a non-NULL source pointer, even if the + // source length is zero, otherwise it will generate an (incorrect) zero- + // valued CRC checksum. + char dummy = '\0'; + int err; + + assert(!first_chunk_ && comp_init_); + + const uLongf orig_destLen = *destLen; + if ((err = CompressChunkOrAll(dest, destLen, (const Bytef *)&dummy, 0, + Z_FINISH)) != Z_OK) { + Reset(); // we assume they won't retry on error + return err; + } + + // Make sure that when we exit, we can start a new round of chunks later + // (This must be set after the call to CompressChunkOrAll() above.) + Reset(); + + // Write gzip footer. They're explicitly in little-endian order + if ((err = WriteGzipFooter(dest + *destLen, orig_destLen - *destLen)) != Z_OK) + return err; + *destLen += 8; // zlib footer took up another 8 bytes + + return Z_OK; // stream_end is ok +} + +// This routine only initializes the compression stream once. Thereafter, it +// just does a deflateReset on the stream, which should be faster. +int ZLib::Compress(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong sourceLen) { + int err; + const uLongf orig_destLen = *destLen; + if ((err = CompressChunkOrAll(dest, destLen, source, sourceLen, Z_FINISH)) != + Z_OK) + return err; + Reset(); // reset for next call to Compress + + if ((err = WriteGzipFooter(dest + *destLen, orig_destLen - *destLen)) != Z_OK) + return err; + *destLen += 8; // zlib footer took up another 8 bytes + + return Z_OK; +} + +// --------- UNCOMPRESS MODE + +int ZLib::InflateInit() { + // Use negative window bits size to indicate bare stream with no header. + int wbits = (-MAX_WBITS); + int err = inflateInit2(&uncomp_stream_, wbits); + return err; +} + +// Initialization method to be called if we hit an error while +// uncompressing. On hitting an error, call this method before +// returning the error. +void ZLib::UncompressErrorInit() { + if (uncomp_init_) { + inflateEnd(&uncomp_stream_); + uncomp_init_ = false; + } + Reset(); +} + +int ZLib::UncompressInit(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong *sourceLen) { + int err; + + uncomp_stream_.next_in = (Bytef *)source; + uncomp_stream_.avail_in = (uInt)*sourceLen; + // Check for sourceLen (unsigned long) to fit into avail_in (unsigned int). + if ((uLong)uncomp_stream_.avail_in != *sourceLen) return Z_BUF_ERROR; + + uncomp_stream_.next_out = dest; + uncomp_stream_.avail_out = (uInt)*destLen; + // Check for destLen (unsigned long) to fit into avail_out (unsigned int). + if ((uLong)uncomp_stream_.avail_out != *destLen) return Z_BUF_ERROR; + + if (!first_chunk_) // only need to set up stream the first time through + return Z_OK; + + // Reuse if we've already initted the object. + if (uncomp_init_) { + // Use negative window bits size to indicate bare stream with no header. + int wbits = -MAX_WBITS; + err = inflateReset2(&uncomp_stream_, wbits); + if (err != Z_OK) { + UncompressErrorInit(); + } + } + + // First use or previous state was not reusable with current settings. + if (!uncomp_init_) { + uncomp_stream_.zalloc = (alloc_func)0; + uncomp_stream_.zfree = (free_func)0; + uncomp_stream_.opaque = (voidpf)0; + err = InflateInit(); + if (err != Z_OK) return err; + uncomp_init_ = true; + } + return Z_OK; +} + +// If you compressed your data a chunk at a time, with CompressChunk, +// you can uncompress it a chunk at a time with UncompressChunk. +// Only difference bewteen chunked and unchunked uncompression +// is the flush mode we use: Z_SYNC_FLUSH (chunked) or Z_FINISH (unchunked). +int ZLib::UncompressAtMostOrAll(Bytef *dest, uLongf *destLen, + const Bytef *source, uLong *sourceLen, + int flush_mode) { // Z_SYNC_FLUSH or Z_FINISH + int err = Z_OK; + + if (first_chunk_) { + gzip_footer_bytes_ = -1; + + // If we haven't read our first chunk of actual compressed data, + // and we're expecting gzip headers, then parse some more bytes + // from the gzip headers. + const Bytef *bodyBegin = nullptr; + GZipHeader::Status status = gzip_header_->ReadMore( + reinterpret_cast(source), *sourceLen, + reinterpret_cast(&bodyBegin)); + switch (status) { + case GZipHeader::INCOMPLETE_HEADER: // don't have the complete header + *destLen = 0; + *sourceLen = 0; // GZipHeader used all the input + return Z_OK; + case GZipHeader::INVALID_HEADER: // bogus header + Reset(); + return Z_DATA_ERROR; + case GZipHeader::COMPLETE_HEADER: // we have the full header + *sourceLen -= (bodyBegin - source); // skip past header bytes + source = bodyBegin; + crc_ = crc32(0, nullptr, 0); // initialize CRC + break; + default: + ABSL_RAW_LOG(FATAL, "Unexpected gzip header parsing result: %d", + status); + } + } else if (gzip_footer_bytes_ >= 0) { + // We're now just reading the gzip footer. We already read all the data. + if (gzip_footer_bytes_ + *sourceLen > sizeof(gzip_footer_)) { + Reset(); + return Z_DATA_ERROR; + } + uLong len = sizeof(gzip_footer_) - gzip_footer_bytes_; + if (len > *sourceLen) len = *sourceLen; + if (len > 0) { + memcpy(gzip_footer_ + gzip_footer_bytes_, source, len); + gzip_footer_bytes_ += len; + } + *sourceLen -= len; + *destLen = 0; + return Z_OK; + } + + if ((err = UncompressInit(dest, destLen, source, sourceLen)) != Z_OK) { + ABSL_RAW_LOG(WARNING, + "UncompressInit: Error: %d " + " SourceLen: %zu", + err, *sourceLen); + return err; + } + + // This is used to figure out how many output bytes we wrote *this chunk*: + const uLong old_total_out = uncomp_stream_.total_out; + + // This is used to figure out how many input bytes we read *this chunk*: + const uLong old_total_in = uncomp_stream_.total_in; + + if (first_chunk_) { + first_chunk_ = false; // so we don't do this again + + // For the first chunk *only* (to avoid infinite troubles), we let + // there be no actual data to uncompress. This sometimes triggers + // when the input is only the gzip header. + if (*sourceLen == 0) { + *destLen = 0; + return Z_OK; + } + } + + // We'll uncompress as much as we can. If we end OK great, otherwise + // if we get an error that seems to be the gzip footer, we store the + // gzip footer and return OK, otherwise we return the error. + + // flush_mode is Z_SYNC_FLUSH for chunked mode, Z_FINISH for all mode. + err = inflate(&uncomp_stream_, flush_mode); + + // Figure out how many bytes of the input zlib slurped up: + const uLong bytes_read = uncomp_stream_.total_in - old_total_in; + assert((source + bytes_read) <= (source + *sourceLen)); + *sourceLen = uncomp_stream_.avail_in; + + // Next we look at the footer, if any. Note that we might currently + // have just part of the footer (eg, if this data is arriving over a + // socket). After looking for a footer, log a warning if there is data. + if ((err == Z_STREAM_END) && + ((gzip_footer_bytes_ == -1) || + (static_cast(gzip_footer_bytes_) < sizeof(gzip_footer_))) && + (uncomp_stream_.avail_in <= sizeof(gzip_footer_))) { + // Store gzip footer bytes so we can check for footer consistency + // in UncompressChunkDone(). (If we have the whole footer, we + // could do the checking here, but we don't to keep consistency + // with CompressChunkDone().) + gzip_footer_bytes_ = + std::min(absl::implicit_cast(uncomp_stream_.avail_in), + sizeof(gzip_footer_)); + memcpy(gzip_footer_, source + bytes_read, gzip_footer_bytes_); + *sourceLen -= gzip_footer_bytes_; + } else if ((err == Z_STREAM_END || err == Z_OK) // everything went ok + && uncomp_stream_.avail_in == 0) { // and we read it all + } else if (err == Z_STREAM_END && uncomp_stream_.avail_in > 0) { + UncompressErrorInit(); + return Z_DATA_ERROR; + } else if (err != Z_OK && err != Z_STREAM_END && err != Z_BUF_ERROR) { + UncompressErrorInit(); + return err; + } else if (uncomp_stream_.avail_out == 0) { + err = Z_BUF_ERROR; + } + + assert(err == Z_OK || err == Z_BUF_ERROR || err == Z_STREAM_END); + if (err == Z_STREAM_END && !settings_.dont_hide_zstream_end_) err = Z_OK; + + // update the crc and other metadata + uncompressed_size_ = uncomp_stream_.total_out; + *destLen = uncomp_stream_.total_out - old_total_out; // size for this call + + crc_ = crc32(crc_, dest, *destLen); + + return err; +} + +int ZLib::UncompressChunkOrAll(Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int flush_mode) { // Z_SYNC_FLUSH or Z_FINISH + const int ret = + UncompressAtMostOrAll(dest, destLen, source, &sourceLen, flush_mode); + if (ret == Z_BUF_ERROR) UncompressErrorInit(); + return ret; +} + +int ZLib::UncompressAtMost(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong *sourceLen) { + return UncompressAtMostOrAll(dest, destLen, source, sourceLen, Z_SYNC_FLUSH); +} + +int ZLib::UncompressChunk(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong sourceLen) { + return UncompressChunkOrAll(dest, destLen, source, sourceLen, Z_SYNC_FLUSH); +} + +// We make sure we've uncompressed everything, that is, the current +// uncompress stream is at a compressed-buffer-EOF boundary. In gzip +// mode, we also check the gzip footer to make sure we pass the gzip +// consistency checks. We RETURN true iff both types of checks pass. +bool ZLib::UncompressChunkDone() { + assert(!first_chunk_ && uncomp_init_); + // Make sure we're at the end-of-compressed-data point. This means + // if we call inflate with Z_FINISH we won't consume any input or + // write any output + Bytef dummyin, dummyout; + uLongf dummylen = 0; + if (UncompressChunkOrAll(&dummyout, &dummylen, &dummyin, 0, Z_FINISH) != + Z_OK) { + return false; + } + + // Make sure that when we exit, we can start a new round of chunks later + Reset(); + + // Whether we were hoping for a gzip footer or not, we allow a gzip + // footer. (See the note above about bugs in old zlibwrappers.) But + // by the time we've seen all the input, it has to be either a + // complete gzip footer, or no footer at all. + if ((gzip_footer_bytes_ != -1) && (gzip_footer_bytes_ != 0) && + (static_cast(gzip_footer_bytes_) != sizeof(gzip_footer_))) + return false; + + return IsGzipFooterValid(); +} + +bool ZLib::IsGzipFooterComplete() const { + return gzip_footer_bytes_ != -1 && + static_cast(gzip_footer_bytes_) >= sizeof(gzip_footer_); +} + +bool ZLib::IsGzipFooterValid() const { + if (!IsGzipFooterComplete()) return false; + + // The footer holds the lower four bytes of the length. + uLong uncompressed_size = 0; + uncompressed_size += static_cast(gzip_footer_[7]) << 24; + uncompressed_size += gzip_footer_[6] << 16; + uncompressed_size += gzip_footer_[5] << 8; + uncompressed_size += gzip_footer_[4] << 0; + if (uncompressed_size != (uncompressed_size_ & 0xffffffff)) { + return false; + } + + uLong checksum = 0; + checksum += static_cast(gzip_footer_[3]) << 24; + checksum += gzip_footer_[2] << 16; + checksum += gzip_footer_[1] << 8; + checksum += gzip_footer_[0] << 0; + if (crc_ != checksum) return false; + + return true; +} + +// Uncompresses the source buffer into the destination buffer. +// The destination buffer must be long enough to hold the entire +// decompressed contents. +// +// We only initialize the uncomp_stream once. Thereafter, we use +// inflateReset2, which should be faster. +// +// Returns Z_OK on success, otherwise, it returns a zlib error code. +int ZLib::Uncompress(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong sourceLen) { + int err; + if ((err = UncompressChunkOrAll(dest, destLen, source, sourceLen, + Z_FINISH)) != Z_OK) { + Reset(); // let us try to compress again + return err; + } + if (!UncompressChunkDone()) // calls Reset() + return Z_DATA_ERROR; + return Z_OK; // stream_end is ok +} + +// read uncompress length from gzip footer +uLongf ZLib::GzipUncompressedLength(const Bytef *source, uLong len) { + assert(len > 4); + return (static_cast(source[len - 1]) << 24) + + (static_cast(source[len - 2]) << 16) + + (static_cast(source[len - 3]) << 8) + + (static_cast(source[len - 4]) << 0); +} + +int ZLib::UncompressGzipAndAllocate(Bytef **dest, uLongf *destLen, + const Bytef *source, uLong sourceLen) { + *dest = nullptr; // until we successfully allocate + + uLongf uncompress_length = GzipUncompressedLength(source, sourceLen); + + // Do not trust the uncompress size reported by the compressed buffer. + if (uncompress_length > *destLen) { + if (!HasGzipHeader(reinterpret_cast(source), sourceLen)) { + return Z_DATA_ERROR; + } + return Z_MEM_ERROR; // probably a corrupted gzip buffer + } + + *destLen = uncompress_length; + + *dest = (Bytef *)malloc(*destLen); + if (*dest == nullptr) // probably a corrupted gzip buffer + return Z_MEM_ERROR; + + const int retval = Uncompress(*dest, destLen, source, sourceLen); + if (retval != Z_OK) { // just to make life easier for them + free(*dest); + *dest = nullptr; + } + return retval; +} + +// Convenience method to check if a bytestream has a gzip header. +bool ZLib::HasGzipHeader(const char *source, int sourceLen) { + GZipHeader gzh; + const char *ptr = nullptr; + return gzh.ReadMore(source, sourceLen, &ptr) == GZipHeader::COMPLETE_HEADER; +} + +} // namespace net_http +} // namespace serving +} // namespace tensorflow diff --git a/tensorflow_serving/util/net_http/compression/gzip_zlib.h b/tensorflow_serving/util/net_http/compression/gzip_zlib.h new file mode 100644 index 00000000000..22e0d9c393d --- /dev/null +++ b/tensorflow_serving/util/net_http/compression/gzip_zlib.h @@ -0,0 +1,343 @@ +/* Copyright 2018 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_SERVING_UTIL_NET_HTTP_COMPRESSION_GZIP_ZLIB_H_ +#define TENSORFLOW_SERVING_UTIL_NET_HTTP_COMPRESSION_GZIP_ZLIB_H_ + +#include + +#include + +namespace tensorflow { +namespace serving { +namespace net_http { + +class GZipHeader { + public: + GZipHeader() { Reset(); } + ~GZipHeader() {} + + // Wipe the slate clean and start from scratch. + void Reset() { + state_ = IN_HEADER_ID1; + flags_ = 0; + extra_length_ = 0; + } + + enum Status { + INCOMPLETE_HEADER, + COMPLETE_HEADER, + INVALID_HEADER, + }; + + // If the bytes we've seen so far do not yet constitute a complete gzip + // header, return INCOMPLETE_HEADER. If these bytes do not constitute a valid + // gzip header, return INVALID_HEADER. When we've seen a complete + // gzip header, return COMPLETE_HEADER and set the pointer pointed + // to by header_end to the first byte beyond the gzip header. + Status ReadMore(const char *inbuf, int inbuf_len, const char **header_end); + + private: + enum { // flags (see RFC) + FLAG_FTEXT = 0x01, // bit 0 set: file probably ascii text + FLAG_FHCRC = 0x02, // bit 1 set: header CRC present + FLAG_FEXTRA = 0x04, // bit 2 set: extra field present + FLAG_FNAME = 0x08, // bit 3 set: original file name present + FLAG_FCOMMENT = 0x10, // bit 4 set: file comment present + FLAG_RESERVED = 0xE0, // bits 5..7: reserved + }; + + enum State { + // The first 10 bytes are the fixed-size header: + IN_HEADER_ID1, + IN_HEADER_ID2, + IN_HEADER_CM, + IN_HEADER_FLG, + IN_HEADER_MTIME_BYTE_0, + IN_HEADER_MTIME_BYTE_1, + IN_HEADER_MTIME_BYTE_2, + IN_HEADER_MTIME_BYTE_3, + IN_HEADER_XFL, + IN_HEADER_OS, + + IN_XLEN_BYTE_0, + IN_XLEN_BYTE_1, + IN_FEXTRA, + + IN_FNAME, + + IN_FCOMMENT, + + IN_FHCRC_BYTE_0, + IN_FHCRC_BYTE_1, + + IN_DONE, + }; + + int state_; // our current State in the parsing FSM: an int so we can ++ + uint8_t flags_; // the flags byte of the header ("FLG" in the RFC) + uint16_t extra_length_; // how much of the "extra field" we have yet to read +}; + +class ZLib { + public: + ZLib(); + ~ZLib(); + + // Wipe a ZLib object to a virgin state. This differs from Reset() + // in that it also breaks any dictionary, gzip, etc, state. + void Reinit(); + + // Call this to make a zlib buffer as good as new. Here's the only + // case where they differ: + // CompressChunk(a); CompressChunk(b); CompressChunkDone(); vs + // CompressChunk(a); Reset(); CompressChunk(b); CompressChunkDone(); + // You'll want to use Reset(), then, when you interrupt a compress + // (or uncompress) in the middle of a chunk and want to start over. + void Reset(); + + // By default UncompressAtMostOrAll will return Z_OK upon hitting the end of + // the input stream. This function modifies that behavior by returning + // Z_STREAM_END instead. This is useful when getting multiple compressed + // documents in a single stream. Returning Z_STREAM_END will indicate the end + // of a document. + void SetDontHideStreamEnd(); + + // Sets the compression level to be used + void SetCompressionLevel(int level) { settings_.compression_level_ = level; } + + // Sets the size of the window (history buffer) used by the compressor. + // The size is expressed in bits (log base 2 of the desired size). + void SetCompressionWindowSizeInBits(int bits) { + settings_.window_bits_ = bits; + } + + // Controls the amount of memory used by the compresser. + // Legal value are 1 through 9. See zlib.h for more info. + void SetCompressionMemLevel(int level) { settings_.mem_level_ = level; } + + // According to the zlib manual, when you Compress, the destination + // buffer must have size at least src + .1%*src + 12. This function + // helps you calculate that. Augment this to account for a potential + // gzip header and footer, plus a few bytes of slack. + static uLong MinCompressbufSize(uLong uncompress_size) { + return uncompress_size + uncompress_size / 1000 + 40; + } + + // The minimum size of footers written by CompressChunkDone(). + int MinFooterSize() const; + + // Compresses the source buffer into the destination buffer. + // sourceLen is the byte length of the source buffer. + // Upon entry, destLen is the total size of the destination buffer, + // which must be of size at least MinCompressbufSize(sourceLen). + // Upon exit, destLen is the actual size of the compressed buffer. + // + // This function can be used to compress a whole file at once if the + // input file is mmap'ed. + // + // Returns Z_OK if success, Z_MEM_ERROR if there was not + // enough memory, Z_BUF_ERROR if there was not enough room in the + // output buffer. Note that if the output buffer is exactly the same + // size as the compressed result, we still return Z_BUF_ERROR. + // (check CL#1936076) + // + // If the values of *destLen or sourceLen do not fit in an unsigned int, + // Z_BUF_ERROR is returned. + int Compress(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong sourceLen); + + // Uncompresses the source buffer into the destination buffer. + // The destination buffer must be long enough to hold the entire + // decompressed contents. + // + // Returns Z_OK on success, otherwise, it returns a zlib error code. + // + // If the values of *destLen or sourceLen do not fit in an unsigned int, + // Z_BUF_ERROR is returned. + int Uncompress(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong sourceLen); + + // Get the uncompressed size from the gzip header. + uLongf GzipUncompressedLength(const Bytef *source, uLong len); + + // Special helper function to help uncompress gzipped documents: + // We'll allocate (with malloc) a destination buffer exactly big + // enough to hold the gzipped content. We set dest and destLen. + // If we don't return Z_OK, *dest will be NULL, otherwise you + // should free() it when you're done with it. + // Returns Z_OK on success, otherwise, it returns a zlib error code. + // Its the responsibility of the user to set *destLen to the + // expected maximum size of the uncompressed data. The size of the + // uncompressed data is read from the compressed buffer gzip footer. + // This value cannot be trusted, so we compare it to the expected + // maximum size supplied by the user, returning Z_MEM_ERROR if its + // greater than the expected maximum size. + int UncompressGzipAndAllocate(Bytef **dest, uLongf *destLen, + const Bytef *source, uLong sourceLen); + + // Streaming compression and decompression methods come in two + // variations. {Unc,C}ompressAtMost() and {Unc,C}ompressChunk(). + // The former decrements sourceLen by the amount of data that was + // consumed: if it returns Z_BUF_ERROR, set the source of the next + // {Unc,C}ompressAtMost() to the unconsumed data. + // {Unc,C}ompressChunk() is the legacy interface and does not do + // this, thus it cannot recover from a Z_BUF_ERROR (except for in + // the first chunk). + + // Compresses data one chunk at a time -- ie you can call this more + // than once. This is useful for a webserver, for instance, which + // might want to use chunked encoding with compression. To get this + // to work you need to call start and finish routines. + // + // Returns Z_OK if success, Z_MEM_ERROR if there was not + // enough memory, Z_BUF_ERROR if there was not enough room in the + // output buffer. + + int CompressAtMost(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong *sourceLen); + + int CompressChunk(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong sourceLen); + + // Emits gzip footer information, as needed. + // destLen should be at least MinFooterSize() long. + // Returns Z_OK, Z_MEM_ERROR, and Z_BUF_ERROR as in CompressChunk(). + int CompressChunkDone(Bytef *dest, uLongf *destLen); + + // Uncompress data one chunk at a time -- ie you can call this + // more than once. To get this to work you need to call per-chunk + // and "done" routines. + // + // Returns Z_OK if success, Z_MEM_ERROR if there was not + // enough memory, Z_BUF_ERROR if there was not enough room in the + // output buffer. + + int UncompressAtMost(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong *sourceLen); + int UncompressChunk(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong sourceLen); + + // Checks gzip footer information, as needed. Mostly this just + // makes sure the checksums match. Whenever you call this, it + // will assume the last 8 bytes from the previous UncompressChunk + // call are the footer. Returns true iff everything looks ok. + bool UncompressChunkDone(); + + // Only meaningful for chunked compressing/uncompressing. It's true + // after initialization or reset and before the first chunk of + // user data is received. + bool first_chunk() const { return first_chunk_; } + + // Convenience method to check if a bytestream has a header. This + // is intended as a quick test: "Is this likely a GZip file?" + static bool HasGzipHeader(const char *source, int sourceLen); + + // Have we parsed the complete gzip footer? When this result is true, it is + // time to call IsGzipFooterValid() / UncompressChunkDone(). + bool IsGzipFooterComplete() const; + + // Have we parsed the complete gzip footer, and does it match the + // length and CRC checksum of the content that we have uncompressed + // so far? + bool IsGzipFooterValid() const; + + // Accessor for the uncompressed size (first added to address issue #509976) + uLong uncompressed_size() const { return uncompressed_size_; } + + private: + int InflateInit(); // sets up the zlib inflate structure + int DeflateInit(); // sets up the zlib deflate structure + + // These init the zlib data structures for compressing/uncompressing + int CompressInit(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong *sourceLen); + int UncompressInit(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong *sourceLen); + // Initialization method to be called if we hit an error while + // uncompressing. On hitting an error, call this method before + // returning the error. + void UncompressErrorInit(); + // Helper functions to write gzip-specific data + int WriteGzipHeader(); + int WriteGzipFooter(Bytef *dest, uLongf destLen); + + // Helper function for both Compress and CompressChunk + int CompressChunkOrAll(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong sourceLen, int flush_mode); + int CompressAtMostOrAll(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong *sourceLen, int flush_mode); + + // Likewise for UncompressAndUncompressChunk + int UncompressChunkOrAll(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong sourceLen, int flush_mode); + + int UncompressAtMostOrAll(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong *sourceLen, int flush_mode); + + // Initialization method to be called if we hit an error while + // compressing. On hitting an error, call this method before + // returning the error. + void CompressErrorInit(); + + struct Settings { + // compression level + int compression_level_; + + // log base 2 of the window size used in compression + int window_bits_; + + // specifies the amount of memory to be used by compressor (1-9) + int mem_level_; + + // Controls behavior of UncompressAtMostOrAll with regards to returning + // Z_STREAM_END. See comments for SetDontHideStreamEnd. + bool dont_hide_zstream_end_; + }; + + // "Current" settings. These will be used whenever we next configure zlib. + // For example changing compression level or header mode will be recorded + // in these, but don't usually get applied immediately but on next compress. + Settings settings_; + + // Settings last used to initialise and configure zlib. These are needed + // to know if the current desired configuration in settings_ is sufficiently + // compatible with the previous configuration and we can just reconfigure the + // underlying zlib objects, or have to recreate them from scratch. + Settings init_settings_; + + z_stream comp_stream_; // Zlib stream data structure + bool comp_init_; // True if we have initialized comp_stream_ + z_stream uncomp_stream_; // Zlib stream data structure + bool uncomp_init_; // True if we have initialized uncomp_stream_ + + // These are used only in gzip compression mode + uLong crc_; // stored in gzip footer, fitting 4 bytes + uLong uncompressed_size_; + + GZipHeader *gzip_header_; // our gzip header state + + Byte gzip_footer_[8]; // stored footer, used to uncompress + int gzip_footer_bytes_; // num of footer bytes read so far, or -1 + + // These are used only with chunked compression. + bool first_chunk_; // true if we need to emit headers with this chunk +}; + +} // namespace net_http +} // namespace serving +} // namespace tensorflow + +#endif // TENSORFLOW_SERVING_UTIL_NET_HTTP_COMPRESSION_GZIP_ZLIB_H_ diff --git a/tensorflow_serving/util/net_http/compression/gzip_zlib_test.cc b/tensorflow_serving/util/net_http/compression/gzip_zlib_test.cc new file mode 100644 index 00000000000..394d170531d --- /dev/null +++ b/tensorflow_serving/util/net_http/compression/gzip_zlib_test.cc @@ -0,0 +1,599 @@ +/* Copyright 2018 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow_serving/util/net_http/compression/gzip_zlib.h" + +#include +#include +#include +#include + +#include +#include "absl/strings/string_view.h" + +namespace tensorflow { +namespace serving { +namespace net_http { +namespace { + +std::random_device rd; + +typedef std::mt19937_64 RandomEngine; + +int GetUniformRand(RandomEngine* rng, int max) { + std::uniform_int_distribution uniform(0, max); + return uniform(*rng); +} + +// Take some test headers and pass them to a GZipHeader, fragmenting +// the headers in many different random ways. +TEST(GzipHeader, FragmentTest) { + RandomEngine rng(rd()); + + struct TestCase { + const char* str; + int len; // total length of the string + int cruft_len; // length of the gzip header part + }; + TestCase tests[] = { + // Basic header: + {"\037\213\010\000\216\176\356\075\002\003", 10, 0}, + + // Basic headers with crud on the end: + {"\037\213\010\000\216\176\356\075\002\003X", 11, 1}, + {"\037\213\010\000\216\176\356\075\002\003XXX", 13, 3}, + + { + "\037\213\010\010\321\135\265\100\000\003" + "emacs\000", + 16, 0 // with an FNAME of "emacs" + }, + { + "\037\213\010\010\321\135\265\100\000\003" + "\000", + 11, 0 // with an FNAME of zero bytes + }, + { + "\037\213\010\020\321\135\265\100\000\003" + "emacs\000", + 16, 0, // with an FCOMMENT of "emacs" + }, + { + "\037\213\010\020\321\135\265\100\000\003" + "\000", + 11, 0, // with an FCOMMENT of zero bytes + }, + { + "\037\213\010\002\321\135\265\100\000\003" + "\001\002", + 12, 0 // with an FHCRC + }, + { + "\037\213\010\004\321\135\265\100\000\003" + "\003\000foo", + 15, 0 // with an extra of "foo" + }, + { + "\037\213\010\004\321\135\265\100\000\003" + "\000\000", + 12, 0 // with an extra of zero bytes + }, + { + "\037\213\010\032\321\135\265\100\000\003" + "emacs\000" + "emacs\000" + "\001\002", + 24, 0 // with an FNAME of "emacs", FCOMMENT of "emacs", and FHCRC + }, + { + "\037\213\010\036\321\135\265\100\000\003" + "\003\000foo" + "emacs\000" + "emacs\000" + "\001\002", + 29, 0 // with an FNAME of "emacs", FCOMMENT of "emacs", FHCRC, "foo" + }, + { + "\037\213\010\036\321\135\265\100\000\003" + "\003\000foo" + "emacs\000" + "emacs\000" + "\001\002" + "XXX", + 32, 3 // FNAME of "emacs", FCOMMENT of "emacs", FHCRC, "foo", crud + }, + }; + + // Test all the headers test cases. + for (auto test : tests) { + // Test many random ways they might be fragmented. + for (int j = 0; j < 1000; ++j) { + // Get the test case set up. + const char* p = test.str; + int bytes_left = test.len; + int bytes_read = 0; + + // Pick some random places to fragment the headers. + const int num_fragments = GetUniformRand(&rng, bytes_left); + std::vector fragment_starts; + for (int frag_num = 0; frag_num < num_fragments; ++frag_num) { + fragment_starts.push_back(GetUniformRand(&rng, bytes_left)); + } + sort(fragment_starts.begin(), fragment_starts.end()); + + GZipHeader gzip_headers; + // Go through several fragments and pass them to the headers for parsing. + int frag_num = 0; + while (bytes_left > 0) { + const int fragment_len = (frag_num < num_fragments) + ? (fragment_starts[frag_num] - bytes_read) + : (test.len - bytes_read); + EXPECT_GE(fragment_len, 0); + const char* header_end = nullptr; + GZipHeader::Status status = + gzip_headers.ReadMore(p, fragment_len, &header_end); + bytes_read += fragment_len; + bytes_left -= fragment_len; + EXPECT_GE(bytes_left, 0); + p += fragment_len; + frag_num++; + if (bytes_left <= test.cruft_len) { + EXPECT_EQ(status, GZipHeader::COMPLETE_HEADER); + break; + } else { + EXPECT_EQ(status, GZipHeader::INCOMPLETE_HEADER); + } + } // while + } // for many fragmentations + } // for all test case headers +} + +// 1048576 == 2^20 == 1 MB +#define MAX_BUF_SIZE 1048500 +#define MAX_BUF_FLEX 1048576 + +void TestCompression(ZLib* zlib, const std::string& uncompbuf, + const char* msg) { + uLongf complen = ZLib::MinCompressbufSize(uncompbuf.size()); + std::string compbuf(complen, '\0'); + int err = zlib->Compress((Bytef*)compbuf.data(), &complen, + (Bytef*)uncompbuf.data(), uncompbuf.size()); + EXPECT_EQ(Z_OK, err) << " " << uncompbuf.size() << " bytes down to " + << complen << " bytes."; + + // Output data size should match input data size. + uLongf uncomplen2 = uncompbuf.size(); + std::string uncompbuf2(uncomplen2, '\0'); + err = zlib->Uncompress((Bytef*)&uncompbuf2[0], &uncomplen2, + (Bytef*)compbuf.data(), complen); + EXPECT_EQ(Z_OK, err); + + if (msg != nullptr) { + printf("Orig: %7lu Compressed: %7lu %5.3f %s\n", uncomplen2, complen, + (float)complen / uncomplen2, msg); + } + + EXPECT_EQ(uncompbuf, absl::string_view(uncompbuf2.data(), uncomplen2)) + << "Uncompression mismatch!"; +} + +// Take some test inputs and pass them to zlib, fragmenting the input randomly. +void TestRandomGzipHeaderUncompress(ZLib* zlib) { + RandomEngine rng(rd()); + + struct TestCase { + const char* str; + int len; // total length of the string + }; + TestCase tests[] = { + { + // header, body ("hello, world!\n"), footer + "\037\213\010\000\216\176\356\075\002\003" + "\313\110\315\311\311\327\121\050\317\057\312\111\121\344\002\000" + "\300\337\061\266\016\000\000\000", + 34, + }, + }; + + std::string uncompbuf2(MAX_BUF_FLEX, '\0'); + // Test all the headers test cases. + for (uint32_t i = 0; i < ABSL_ARRAYSIZE(tests); ++i) { + // Test many random ways they might be fragmented. + for (int j = 0; j < 5 * 1000; ++j) { + // Get the test case set up. + const char* p = tests[i].str; + int bytes_left = tests[i].len; + int bytes_read = 0; + int bytes_uncompressed = 0; + zlib->Reset(); + + // Pick some random places to fragment the headers. + const int num_fragments = GetUniformRand(&rng, bytes_left); + std::vector fragment_starts; + for (int frag_num = 0; frag_num < num_fragments; ++frag_num) { + fragment_starts.push_back(GetUniformRand(&rng, bytes_left)); + } + sort(fragment_starts.begin(), fragment_starts.end()); + + // Go through several fragments and pass them in for parsing. + int frag_num = 0; + while (bytes_left > 0) { + const int fragment_len = (frag_num < num_fragments) + ? (fragment_starts[frag_num] - bytes_read) + : (tests[i].len - bytes_read); + ASSERT_GE(fragment_len, 0); + if (fragment_len != 0) { // zlib doesn't like 0-length buffers + uLongf uncomplen2 = uncompbuf2.size() - bytes_uncompressed; + int err = + zlib->UncompressChunk((Bytef*)&uncompbuf2[0] + bytes_uncompressed, + &uncomplen2, (const Bytef*)p, fragment_len); + ASSERT_EQ(err, Z_OK); + bytes_uncompressed += uncomplen2; + bytes_read += fragment_len; + bytes_left -= fragment_len; + ASSERT_GE(bytes_left, 0); + p += fragment_len; + } + frag_num++; + } // while bytes left to uncompress + + ASSERT_TRUE(zlib->UncompressChunkDone()); + EXPECT_EQ(sizeof("hello, world!\n") - 1, bytes_uncompressed); + EXPECT_EQ( + 0, strncmp(uncompbuf2.data(), "hello, world!\n", bytes_uncompressed)) + << "Uncompression mismatch, expected 'hello, world!\\n', " + << "got '" << absl::string_view(uncompbuf2.data(), bytes_uncompressed) + << "'"; + } // for many fragmentations + } // for all test case headers +} + +constexpr int32_t kMaxSizeUncompressedData = 10 * 1024 * 1024; // 10MB + +void TestErrors(ZLib* zlib, const std::string& uncompbuf_str) { + const char* uncompbuf = uncompbuf_str.data(); + const uLongf uncomplen = uncompbuf_str.size(); + std::string compbuf(MAX_BUF_SIZE, '\0'); + std::string uncompbuf2(MAX_BUF_FLEX, '\0'); + int err; + + uLongf complen = 23; // don't give it enough space to compress + err = zlib->Compress((Bytef*)compbuf.data(), &complen, (Bytef*)uncompbuf, + uncomplen); + EXPECT_EQ(Z_BUF_ERROR, err); + + // OK, now successfully compress + complen = compbuf.size(); + err = zlib->Compress((Bytef*)compbuf.data(), &complen, (Bytef*)uncompbuf, + uncomplen); + EXPECT_EQ(Z_OK, err) << " " << uncomplen << " bytes down to " << complen + << " bytes."; + + uLongf uncomplen2 = 10; // not enough space to uncompress + err = zlib->Uncompress((Bytef*)&uncompbuf2[0], &uncomplen2, + (Bytef*)compbuf.data(), complen); + EXPECT_EQ(Z_BUF_ERROR, err); + + // Here we check what happens when we don't try to uncompress enough bytes + uncomplen2 = uncompbuf2.size(); + err = zlib->Uncompress((Bytef*)&uncompbuf2[0], &uncomplen2, + (Bytef*)compbuf.data(), 23); + EXPECT_EQ(Z_BUF_ERROR, err); + + uncomplen2 = uncompbuf2.size(); + err = zlib->UncompressChunk((Bytef*)&uncompbuf2[0], &uncomplen2, + (Bytef*)compbuf.data(), 23); + EXPECT_EQ(Z_OK, err); // it's ok if a single chunk is too small + if (err == Z_OK) { + EXPECT_FALSE(zlib->UncompressChunkDone()) + << "UncompresDone() was happy with its 3 bytes of compressed data"; + } + + const int changepos = 0; + const char oldval = compbuf[changepos]; // corrupt the input + compbuf[changepos]++; + uncomplen2 = uncompbuf2.size(); + err = zlib->Uncompress((Bytef*)&uncompbuf2[0], &uncomplen2, + (Bytef*)compbuf.data(), complen); + EXPECT_NE(Z_OK, err); + + compbuf[changepos] = oldval; + + // Make sure our memory-allocating uncompressor deals with problems gracefully + char* tmpbuf; + char tmp_compbuf[10] = "\255\255\255\255\255\255\255\255\255"; + uncomplen2 = kMaxSizeUncompressedData; + err = zlib->UncompressGzipAndAllocate( + (Bytef**)&tmpbuf, &uncomplen2, (Bytef*)tmp_compbuf, sizeof(tmp_compbuf)); + EXPECT_NE(Z_OK, err); + EXPECT_EQ(nullptr, tmpbuf); +} + +void TestBogusGunzipRequest(ZLib* zlib) { + const Bytef compbuf[] = "This is not compressed"; + const uLongf complen = sizeof(compbuf); + Bytef* uncompbuf; + uLongf uncomplen = 0; + int err = + zlib->UncompressGzipAndAllocate(&uncompbuf, &uncomplen, compbuf, complen); + EXPECT_EQ(Z_DATA_ERROR, err); +} + +void TestGzip(ZLib* zlib, const std::string& uncompbuf_str) { + const char* uncompbuf = uncompbuf_str.data(); + const uLongf uncomplen = uncompbuf_str.size(); + std::string compbuf(MAX_BUF_SIZE, '\0'); + std::string uncompbuf2(MAX_BUF_FLEX, '\0'); + + uLongf complen = compbuf.size(); + int err = zlib->Compress((Bytef*)compbuf.data(), &complen, (Bytef*)uncompbuf, + uncomplen); + EXPECT_EQ(Z_OK, err) << " " << uncomplen << " bytes down to " << complen + << " bytes."; + + uLongf uncomplen2 = uncompbuf2.size(); + err = zlib->Uncompress((Bytef*)&uncompbuf2[0], &uncomplen2, + (Bytef*)compbuf.data(), complen); + EXPECT_EQ(Z_OK, err); + EXPECT_EQ(uncomplen, uncomplen2) << "Uncompression mismatch!"; + EXPECT_EQ(0, memcmp(uncompbuf, uncompbuf2.data(), uncomplen)) + << "Uncompression mismatch!"; + + // Also try the auto-allocate uncompressor + char* tmpbuf; + err = zlib->UncompressGzipAndAllocate((Bytef**)&tmpbuf, &uncomplen2, + (Bytef*)compbuf.data(), complen); + EXPECT_EQ(Z_OK, err); + EXPECT_EQ(uncomplen, uncomplen2) << "Uncompression mismatch!"; + EXPECT_EQ(0, memcmp(uncompbuf, uncompbuf2.data(), uncomplen)) + << "Uncompression mismatch!"; + if (tmpbuf) free(tmpbuf); +} + +void TestChunkedGzip(ZLib* zlib, const std::string& uncompbuf_str, + int num_chunks) { + const char* uncompbuf = uncompbuf_str.data(); + const uLongf uncomplen = uncompbuf_str.size(); + std::string compbuf(MAX_BUF_SIZE, '\0'); + std::string uncompbuf2(MAX_BUF_FLEX, '\0'); + EXPECT_GT(num_chunks, 2); + + // uncompbuf2 is larger than uncompbuf to test for decoding too much + // + // Note that it is possible to receive num_chunks+1 total + // chunks, due to rounding error. + const int chunklen = uncomplen / num_chunks; + int chunknum, i, err; + int cum_len[100]; // cumulative compressed length, max to 100 + cum_len[0] = 0; + for (chunknum = 0, i = 0; i < uncomplen; i += chunklen, chunknum++) { + uLongf complen = compbuf.size() - cum_len[chunknum]; + // Make sure the last chunk gets the correct chunksize. + int chunksize = (uncomplen - i) < chunklen ? (uncomplen - i) : chunklen; + err = zlib->CompressChunk((Bytef*)compbuf.data() + cum_len[chunknum], + &complen, (Bytef*)uncompbuf + i, chunksize); + ASSERT_EQ(Z_OK, err) << " " << uncomplen << " bytes down to " << complen + << " bytes."; + cum_len[chunknum + 1] = cum_len[chunknum] + complen; + } + uLongf complen = compbuf.size() - cum_len[chunknum]; + err = zlib->CompressChunkDone((Bytef*)compbuf.data() + cum_len[chunknum], + &complen); + EXPECT_EQ(Z_OK, err); + cum_len[chunknum + 1] = cum_len[chunknum] + complen; + + for (chunknum = 0, i = 0; i < uncomplen; i += chunklen, chunknum++) { + uLongf uncomplen2 = uncomplen - i; + // Make sure the last chunk gets the correct chunksize. + int expected = uncomplen2 < chunklen ? uncomplen2 : chunklen; + err = zlib->UncompressChunk((Bytef*)&uncompbuf2[0] + i, &uncomplen2, + (Bytef*)compbuf.data() + cum_len[chunknum], + cum_len[chunknum + 1] - cum_len[chunknum]); + EXPECT_EQ(Z_OK, err); + EXPECT_EQ(expected, uncomplen2) + << "Uncompress size is " << uncomplen2 << ", not " << expected; + } + // There should be no further uncompressed bytes, after uncomplen bytes. + uLongf uncomplen2 = uncompbuf2.size() - uncomplen; + EXPECT_NE(0, uncomplen2); + err = zlib->UncompressChunk((Bytef*)&uncompbuf2[0] + uncomplen, &uncomplen2, + (Bytef*)compbuf.data() + cum_len[chunknum], + cum_len[chunknum + 1] - cum_len[chunknum]); + EXPECT_EQ(Z_OK, err); + EXPECT_EQ(0, uncomplen2); + EXPECT_TRUE(zlib->UncompressChunkDone()); + + // Those uncomplen bytes should match. + EXPECT_EQ(0, memcmp(uncompbuf, uncompbuf2.data(), uncomplen)) + << "Uncompression mismatch!"; + + // Now test to make sure resetting works properly + // (1) First, uncompress the first chunk and make sure it's ok + uncomplen2 = uncompbuf2.size(); + err = zlib->UncompressChunk((Bytef*)&uncompbuf2[0], &uncomplen2, + (Bytef*)compbuf.data(), cum_len[1]); + EXPECT_EQ(Z_OK, err); + EXPECT_EQ(chunklen, uncomplen2) << "Uncompression mismatch!"; + // The first uncomplen2 bytes should match, where uncomplen2 is the number of + // successfully uncompressed bytes by the most recent UncompressChunk call. + // The remaining (uncomplen - uncomplen2) bytes would still match if the + // uncompression guaranteed not to modify the buffer other than those first + // uncomplen2 bytes, but there is no such guarantee. + EXPECT_EQ(0, memcmp(uncompbuf, uncompbuf2.data(), uncomplen2)) + << "Uncompression mismatch!"; + + // (2) Now, try the first chunk again and see that there's an error + uncomplen2 = uncompbuf2.size(); + err = zlib->UncompressChunk((Bytef*)&uncompbuf2[0], &uncomplen2, + (Bytef*)compbuf.data(), cum_len[1]); + EXPECT_EQ(Z_DATA_ERROR, err); + + // (3) Now reset it and try again, and see that it's ok + zlib->Reset(); + uncomplen2 = uncompbuf2.size(); + err = zlib->UncompressChunk((Bytef*)&uncompbuf2[0], &uncomplen2, + (Bytef*)compbuf.data(), cum_len[1]); + EXPECT_EQ(Z_OK, err); + EXPECT_EQ(chunklen, uncomplen2) << "Uncompression mismatch!"; + EXPECT_EQ(0, memcmp(uncompbuf, uncompbuf2.data(), uncomplen2)) + << "Uncompression mismatch!"; + + // (4) Make sure we can tackle output buffers that are too small + // with the *AtMost() interfaces. + uLong source_len = cum_len[2] - cum_len[1]; + EXPECT_GT(source_len, 1); + // uncomplen2 = source_len/2; + uncomplen2 = 2; // fixed as we use fixed strings now + err = zlib->UncompressAtMost((Bytef*)&uncompbuf2[0], &uncomplen2, + (Bytef*)(compbuf.data() + cum_len[1]), + &source_len); + EXPECT_EQ(Z_BUF_ERROR, err); + + EXPECT_EQ(0, memcmp(uncompbuf + chunklen, uncompbuf2.data(), uncomplen2)) + << "Uncompression mismatch!"; + + const int saveuncomplen2 = uncomplen2; + uncomplen2 = uncompbuf2.size() - uncomplen2; + // Uncompress the rest of the chunk. + err = zlib->UncompressAtMost( + (Bytef*)&uncompbuf2[0], &uncomplen2, + (Bytef*)(compbuf.data() + cum_len[2] - source_len), &source_len); + + EXPECT_EQ(Z_OK, err); + + EXPECT_EQ(0, memcmp(uncompbuf + chunklen + saveuncomplen2, uncompbuf2.data(), + uncomplen2)) + << "Uncompression mismatch!"; + + // (5) Finally, reset again + zlib->Reset(); +} + +void TestFooterBufferTooSmall(ZLib* zlib) { + uLongf footer_len = zlib->MinFooterSize() - 1; + ASSERT_EQ(9, footer_len); + Bytef footer_buffer[9]; + int err = zlib->CompressChunkDone(footer_buffer, &footer_len); + ASSERT_EQ(Z_BUF_ERROR, err); + ASSERT_EQ(0, footer_len); +} + +TEST(ZLibTest, HugeCompression) { + // Just big enough to trigger 32 bit overflow in MinCompressbufSize() + // calculation. + const uLong HUGE_DATA_SIZE = 0x81000000; + + // Construct an easily compressible huge buffer. + std::string uncompbuf(HUGE_DATA_SIZE, 'A'); + + ZLib zlib; + zlib.SetCompressionLevel(6); + TestCompression(&zlib, uncompbuf, nullptr); +} + +// TODO(wenboz): random size randm data +const char kText[] = "1234567890abcdefghijklmnopqrstuvwxyz"; + +TEST(ZLibTest, Compression) { + const std::string uncompbuf = kText; + ZLib zlib; + zlib.SetCompressionLevel(6); + + TestCompression(&zlib, uncompbuf, "fixed size"); +} + +TEST(ZLibTest, OtherErrors) { + const std::string uncompbuf = kText; + ZLib zlib; + + TestErrors(&zlib, uncompbuf); + + TestBogusGunzipRequest(&zlib); +} + +TEST(ZLibTest, UncompressChunkedHeaders) { + // TestGzipHeaderUncompress(&zlib); + + ZLib zlib; + TestRandomGzipHeaderUncompress(&zlib); +} + +TEST(ZLibTest, GzipCompression) { + const std::string uncompbuf = kText; + ZLib zlib; + + TestGzip(&zlib, uncompbuf); + + // Try compressing again using the same ZLib + TestGzip(&zlib, uncompbuf); +} + +TEST(ZLibTest, ChunkedCompression) { + const std::string uncompbuf = kText; + ZLib zlib; + + TestChunkedGzip(&zlib, uncompbuf, 5); + + // Try compressing again using the same ZLib + TestChunkedGzip(&zlib, uncompbuf, 6); + + // In theory we can mix and match the type of compression we do + TestGzip(&zlib, uncompbuf); + TestChunkedGzip(&zlib, uncompbuf, 8); + + // Test writing final chunk and footer into buffer that's too small. + TestFooterBufferTooSmall(&zlib); + + TestGzip(&zlib, uncompbuf); +} + +TEST(ZLibTest, BytewiseRead) { + std::string text = + "v nedrah tundry vydra v getrah tyrit v vedrah yadra kedra"; + size_t text_len = text.size(); + size_t archive_len = ZLib::MinCompressbufSize(text_len); + std::string archive(archive_len, '\0'); + size_t decompressed_len = text_len + 1; + std::string decompressed(decompressed_len, '\0'); + size_t decompressed_offset = 0; + + ZLib compressor; + int rc = compressor.Compress((Bytef*)archive.data(), &archive_len, + (Bytef*)text.data(), text_len); + ASSERT_EQ(rc, Z_OK); + + ZLib zlib; + for (size_t i = 0; i < archive_len; ++i) { + size_t source_len = 1; + size_t dest_len = decompressed_len - decompressed_offset; + rc = zlib.UncompressAtMost( + (Bytef*)decompressed.data() + decompressed_offset, &dest_len, + (Bytef*)archive.data() + i, &source_len); + ASSERT_EQ(rc, Z_OK); + ASSERT_EQ(source_len, 0); + decompressed_offset += dest_len; + } + + ASSERT_TRUE(zlib.IsGzipFooterValid()); + ASSERT_EQ(decompressed_offset, text_len); + + std::string truncated_output(decompressed.data(), text_len); + ASSERT_EQ(truncated_output, text); +} + +} // namespace +} // namespace net_http +} // namespace serving +} // namespace tensorflow From 1a222d96518560e57241290be516ebc21a12576e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 8 Oct 2018 22:01:55 -0700 Subject: [PATCH 1360/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216302442 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5c0b4c442f2..deeecb294db 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "08b8b8fa1214d112f7513b7f9dfdf858803a55ebcf75be2e70c0cc9f10deef58", - git_commit = "9b558126e31d25ec4e82cb4f50033d6eca44349a", + sha256 = "3741643fc6b535588a2581d296feee6fdc2ef6b7e00a413c7e1f0ea408449809", + git_commit = "d58712b7fc8de0e1f87fe2ea5221bc3c85230ed3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b1796b4ea846cad9ed8a53f2c279e89deb4afac4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 8 Oct 2018 23:02:29 -0700 Subject: [PATCH 1361/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216306407 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index deeecb294db..8931e5bd109 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3741643fc6b535588a2581d296feee6fdc2ef6b7e00a413c7e1f0ea408449809", - git_commit = "d58712b7fc8de0e1f87fe2ea5221bc3c85230ed3", + sha256 = "410f2864227e234c9872ad93074335dcb7333715649c4a911376b7d40a2dce17", + git_commit = "a593c6885bec8c545665ec2f25d794777be55ba9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e94c35253006ec6750ca239b423f5744405758ee Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 9 Oct 2018 00:02:38 -0700 Subject: [PATCH 1362/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216310403 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8931e5bd109..2eb350badb6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "410f2864227e234c9872ad93074335dcb7333715649c4a911376b7d40a2dce17", - git_commit = "a593c6885bec8c545665ec2f25d794777be55ba9", + sha256 = "9324938ce5fa1cc9c9455ee2de06c515dd8795c6b478477da412d9309aeb8605", + git_commit = "d1f0494b89a31298df7743018c0a3fa388ac16a2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 14b10acef626d26711255a7b87ce060555a22f78 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 9 Oct 2018 02:00:51 -0700 Subject: [PATCH 1363/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216321891 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2eb350badb6..d37adc8e43d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9324938ce5fa1cc9c9455ee2de06c515dd8795c6b478477da412d9309aeb8605", - git_commit = "d1f0494b89a31298df7743018c0a3fa388ac16a2", + sha256 = "65199d970c42430a68c82fe48abb983edb8bb3c3c0a29778accb80ce26559d1c", + git_commit = "129bb5e845ccb2ab6339e85d39545800dac6ca33", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0b3654dee152859a4b32c48423133a9d35994066 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 9 Oct 2018 05:01:41 -0700 Subject: [PATCH 1364/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216338832 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d37adc8e43d..7e856707ce8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "65199d970c42430a68c82fe48abb983edb8bb3c3c0a29778accb80ce26559d1c", - git_commit = "129bb5e845ccb2ab6339e85d39545800dac6ca33", + sha256 = "5f77aae31f0614f112e3fe3c31aa9d189b656f946498b465f28da14b8045303e", + git_commit = "69f60d4c8cb5edb6fdc63b837b6db29562d28744", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 12a7eb42632c8c94cbe138472aed18b345d3db32 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 9 Oct 2018 08:01:11 -0700 Subject: [PATCH 1365/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216356960 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7e856707ce8..da8a24a1c30 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5f77aae31f0614f112e3fe3c31aa9d189b656f946498b465f28da14b8045303e", - git_commit = "69f60d4c8cb5edb6fdc63b837b6db29562d28744", + sha256 = "82f6fb453e43701cabbab02801b240eff43119a0ec6039b610918891b2e0b2e2", + git_commit = "e730b261f9028b2f3430461b82c30c86b9ece22f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 65ae27519a0b19d88271bd0a9fa69c8a5546a487 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 9 Oct 2018 09:01:01 -0700 Subject: [PATCH 1366/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216365183 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index da8a24a1c30..1c52a8615dc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "82f6fb453e43701cabbab02801b240eff43119a0ec6039b610918891b2e0b2e2", - git_commit = "e730b261f9028b2f3430461b82c30c86b9ece22f", + sha256 = "43a5bdfa9c0390d1b295983c3889de0034b6dbeed68389a1762fdf61288fc569", + git_commit = "a9a44b070bf639ee9bd60f0fd21157a297cd7f82", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 842e1e71e4852372ba88d584f3e2a285ce06a842 Mon Sep 17 00:00:00 2001 From: vfdev Date: Tue, 9 Oct 2018 23:30:43 +0200 Subject: [PATCH 1367/8103] Update serving_inception.md --- tensorflow_serving/g3doc/serving_inception.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/g3doc/serving_inception.md b/tensorflow_serving/g3doc/serving_inception.md index 4700618bbdd..c2c5f1fa3a4 100644 --- a/tensorflow_serving/g3doc/serving_inception.md +++ b/tensorflow_serving/g3doc/serving_inception.md @@ -82,7 +82,7 @@ This should result in output like: ```console Successfully loaded model from inception-v3/model.ckpt-157585 at step=157585. -Exporting trained moedl to models/inception/1 +Exporting trained model to models/inception/1 Successfully exported model to models/inception $ ls models/inception 1 From 845c56d38c3638c12788895a4e4b814bd8696c52 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 9 Oct 2018 15:02:27 -0700 Subject: [PATCH 1368/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216429370 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1c52a8615dc..f06bfc69f1d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "43a5bdfa9c0390d1b295983c3889de0034b6dbeed68389a1762fdf61288fc569", - git_commit = "a9a44b070bf639ee9bd60f0fd21157a297cd7f82", + sha256 = "59ac8d21b73a16c028f62d782ae873fcf3da9740fe3dc4eb6c01f193ee350b62", + git_commit = "5d9a7fdf4f02c2db487a03e7ad2d520f8847c4e3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1eda45183626bd378accf309826077f2369749b9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 9 Oct 2018 16:03:09 -0700 Subject: [PATCH 1369/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216439920 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f06bfc69f1d..79423c3d955 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "59ac8d21b73a16c028f62d782ae873fcf3da9740fe3dc4eb6c01f193ee350b62", - git_commit = "5d9a7fdf4f02c2db487a03e7ad2d520f8847c4e3", + sha256 = "b46af882bfad1100460e1105e7f27931fbd4b783466a3f9dd9069b49b3b5c495", + git_commit = "950cf87104bfee28e2165fe368f66337b8a1336d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From edec3fe2b652c6443236b291f59f2726fea98b23 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 9 Oct 2018 22:02:08 -0700 Subject: [PATCH 1370/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216476131 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 79423c3d955..e584becb2c5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b46af882bfad1100460e1105e7f27931fbd4b783466a3f9dd9069b49b3b5c495", - git_commit = "950cf87104bfee28e2165fe368f66337b8a1336d", + sha256 = "4792e5797d7cef9324daf38728d46dcc5dd32d7cb744f6cdc923164c5a9927de", + git_commit = "5d670479c6ea20c510fa46ae1bb45123df75e067", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 250f4c0338e0c6dbd1485934fbc6fdde0db66951 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Oct 2018 00:00:50 -0700 Subject: [PATCH 1371/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216483949 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e584becb2c5..5b0a20a9898 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4792e5797d7cef9324daf38728d46dcc5dd32d7cb744f6cdc923164c5a9927de", - git_commit = "5d670479c6ea20c510fa46ae1bb45123df75e067", + sha256 = "673001d3e03324ac81d76562202016f7bc6b677a62086ef72388b6fc4d91a4fe", + git_commit = "dcf641daac0f2fee74eafbb0de1d32f6c8c4c6fd", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 645363f83d76981e24bddac29796b22e8944983a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Oct 2018 05:01:22 -0700 Subject: [PATCH 1372/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216511759 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5b0a20a9898..94a008a23f9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "673001d3e03324ac81d76562202016f7bc6b677a62086ef72388b6fc4d91a4fe", - git_commit = "dcf641daac0f2fee74eafbb0de1d32f6c8c4c6fd", + sha256 = "d7d0baa6fc4150bd0756821a9ae0b1d3dad77461a2b4bcb01a8c1993c3ee258c", + git_commit = "028ca321cb7b476868dcb39585d5cd361d81f05f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a25b0dad3984d3b154db1144df9d3b447b19aae6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20T=C3=B6rh=C3=B6nen?= Date: Wed, 10 Oct 2018 18:28:40 +0300 Subject: [PATCH 1373/8103] Add support for listening gRPC over UNIX socket --- tensorflow_serving/model_servers/main.cc | 4 ++++ tensorflow_serving/model_servers/server.cc | 12 ++++++++++++ tensorflow_serving/model_servers/server.h | 1 + 3 files changed, 17 insertions(+) diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index 2a9d00a85cc..ee00e235f8c 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -59,6 +59,10 @@ int main(int argc, char** argv) { std::vector flag_list = { tensorflow::Flag("port", &options.grpc_port, "Port to listen on for gRPC API"), + tensorflow::Flag("grpc_socket_path", &options.grpc_socket_path, + "If non-empty, listen to a UNIX socket for gRPC API " + "on the given path. Can be either relative or absolute " + "path."), tensorflow::Flag("rest_api_port", &options.http_port, "Port to listen on for HTTP/REST API. If set to zero " "HTTP/REST API will not be exported. This port must be " diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index f3b75d7132e..ca42b84fab7 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -263,6 +263,14 @@ Status Server::BuildAndStart(const Options& server_options) { builder.AddListeningPort( server_address, BuildServerCredentialsFromSSLConfigFile(server_options.ssl_config_file)); + // If defined, listen to a UNIX socket for gRPC. + const string grpc_socket_path = server_options.grpc_socket_path; + const string grpc_socket_uri = "unix:" + grpc_socket_path; + if (!grpc_socket_path.empty()) { + builder.AddListeningPort( + grpc_socket_uri, + BuildServerCredentialsFromSSLConfigFile(server_options.ssl_config_file)); + } builder.RegisterService(model_service_.get()); builder.RegisterService(prediction_service_.get()); builder.SetMaxMessageSize(tensorflow::kint32max); @@ -284,6 +292,10 @@ Status Server::BuildAndStart(const Options& server_options) { return errors::InvalidArgument("Failed to BuildAndStart gRPC server"); } LOG(INFO) << "Running gRPC ModelServer at " << server_address << " ..."; + if (!grpc_socket_path.empty()) { + LOG(INFO) << "Running gRPC ModelServer at UNIX socket " + << grpc_socket_uri << "..."; + } if (server_options.http_port != 0) { if (server_options.http_port != server_options.grpc_port) { diff --git a/tensorflow_serving/model_servers/server.h b/tensorflow_serving/model_servers/server.h index 5b01ffa9346..85f177cffe1 100644 --- a/tensorflow_serving/model_servers/server.h +++ b/tensorflow_serving/model_servers/server.h @@ -39,6 +39,7 @@ class Server { // tensorflow::int32 grpc_port = 8500; tensorflow::string grpc_channel_arguments; + tensorflow::string grpc_socket_path; // // HTTP Server options. From f07c2d2ab0a4053bc4e858c9107315d1838dbb21 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Oct 2018 09:02:39 -0700 Subject: [PATCH 1374/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216538699 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 94a008a23f9..a3471906f03 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d7d0baa6fc4150bd0756821a9ae0b1d3dad77461a2b4bcb01a8c1993c3ee258c", - git_commit = "028ca321cb7b476868dcb39585d5cd361d81f05f", + sha256 = "be87e637632d28100f3e6341dbc17fcb1dba70cbd6f5be184cba079e2bc99c68", + git_commit = "93226f635c5c108b3b501d8bbcf27e64dec49fb9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 80047bccdb947393ef173aa065038ccb3fc4e4d2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Oct 2018 10:01:43 -0700 Subject: [PATCH 1375/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216547667 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a3471906f03..107ec6d85d2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "be87e637632d28100f3e6341dbc17fcb1dba70cbd6f5be184cba079e2bc99c68", - git_commit = "93226f635c5c108b3b501d8bbcf27e64dec49fb9", + sha256 = "442b7a377af02ba11e1cd7213cf2fc9c5ed235d807b756ce76035a6e640396cf", + git_commit = "828e374bfbe788a1c5ddbdbbd36149785ad6d0e6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From eb1fbbf681ec6f90970df7770a8915bed4e08dad Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Oct 2018 11:01:48 -0700 Subject: [PATCH 1376/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216558378 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 107ec6d85d2..b417de95abc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "442b7a377af02ba11e1cd7213cf2fc9c5ed235d807b756ce76035a6e640396cf", - git_commit = "828e374bfbe788a1c5ddbdbbd36149785ad6d0e6", + sha256 = "668601fc5bac344b47971c138d6e83d7d05c9a846de64a9a679b3f9c25dc7fd7", + git_commit = "e09ddb4290f74f053c6420d7bc140486b237404b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 998689d05b89b67080f0918f103a3ee62297ca0e Mon Sep 17 00:00:00 2001 From: wenboz Date: Wed, 10 Oct 2018 11:50:16 -0700 Subject: [PATCH 1377/8103] No public changes. PiperOrigin-RevId: 216567292 --- tensorflow_serving/util/net_http/compression/BUILD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/util/net_http/compression/BUILD b/tensorflow_serving/util/net_http/compression/BUILD index 93fd60c17e0..ef098d140e8 100644 --- a/tensorflow_serving/util/net_http/compression/BUILD +++ b/tensorflow_serving/util/net_http/compression/BUILD @@ -28,7 +28,7 @@ cc_library( cc_test( name = "gzip_zlib_test", - size = "medium", + size = "large", srcs = ["gzip_zlib_test.cc"], features = ["-layering_check"], deps = [ From d7e74e0285b456415b3b20d61b4ad638ea6d59c1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Oct 2018 12:01:53 -0700 Subject: [PATCH 1378/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216569304 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b417de95abc..2aba5c0a851 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "668601fc5bac344b47971c138d6e83d7d05c9a846de64a9a679b3f9c25dc7fd7", - git_commit = "e09ddb4290f74f053c6420d7bc140486b237404b", + sha256 = "1b7c1a1e44dd8868e1bbd833e9f17bf1f73837c0ebe7830183d8c83082cb13ed", + git_commit = "dbac4acb330663c4a3b8a167b9f83c5b9acc95fe", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 96fa4b53565f86490b31a01492cdac071ebc3e11 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Oct 2018 13:02:06 -0700 Subject: [PATCH 1379/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216578667 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2aba5c0a851..8e036e7a3c2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1b7c1a1e44dd8868e1bbd833e9f17bf1f73837c0ebe7830183d8c83082cb13ed", - git_commit = "dbac4acb330663c4a3b8a167b9f83c5b9acc95fe", + sha256 = "575d2e08b3eea298899dfc0f6873466f153bf89af53299febb1a95ad2bb96f61", + git_commit = "73177c09d6ef3716aa449c1f0d7afd992c91dcd7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 29a81eec05099702cfe068be1af0f14e60c38f60 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Oct 2018 14:01:57 -0700 Subject: [PATCH 1380/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216588770 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8e036e7a3c2..30cac457ab0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "575d2e08b3eea298899dfc0f6873466f153bf89af53299febb1a95ad2bb96f61", - git_commit = "73177c09d6ef3716aa449c1f0d7afd992c91dcd7", + sha256 = "6fd702e0d1e89cee4dca603c992464b5cfd3ae90c88f13fb020118e98236bf71", + git_commit = "dbbb44ec54ea4d8ae028eed6cae9240112d8340c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 73c7f262c784eaaca1e928d91d88ab8a47c0e055 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Oct 2018 15:02:20 -0700 Subject: [PATCH 1381/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216599337 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 30cac457ab0..8283d7b3535 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6fd702e0d1e89cee4dca603c992464b5cfd3ae90c88f13fb020118e98236bf71", - git_commit = "dbbb44ec54ea4d8ae028eed6cae9240112d8340c", + sha256 = "95d2c6aa888d97abfc4c8358dac84046754c74ae1da84fea0654b7ff30f0f502", + git_commit = "3fb4383c772ed8c5dc25bc903d6be694b70bf70a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0037a58c7ce2e97376bfedf81e68b446e4d812e8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Oct 2018 16:01:56 -0700 Subject: [PATCH 1382/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216609334 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8283d7b3535..52d9830c51f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "95d2c6aa888d97abfc4c8358dac84046754c74ae1da84fea0654b7ff30f0f502", - git_commit = "3fb4383c772ed8c5dc25bc903d6be694b70bf70a", + sha256 = "dd59e525f7893d17ab20abc0249bc9ecf8b7586e2d2fd004a35f16779c5ec8b4", + git_commit = "8e468c33d22b8da61b02254d648759860f9426bb", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 91f3a94982e8266c0ed0b1fef9e043e2da646c50 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Oct 2018 19:01:43 -0700 Subject: [PATCH 1383/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216631580 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 52d9830c51f..78c1b6c5407 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dd59e525f7893d17ab20abc0249bc9ecf8b7586e2d2fd004a35f16779c5ec8b4", - git_commit = "8e468c33d22b8da61b02254d648759860f9426bb", + sha256 = "41cd3ae1887cd3d986eeb7fefbac5c0cc16bfab8bc2ccf260ae50f4baa1c0b83", + git_commit = "d45c30fa4cf35a0cc71c8b18c2b710d1a3559aee", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fb3d9484a3085fcef688c89398b160ca327665f1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Oct 2018 20:02:00 -0700 Subject: [PATCH 1384/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216635744 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 78c1b6c5407..93a51d4118e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "41cd3ae1887cd3d986eeb7fefbac5c0cc16bfab8bc2ccf260ae50f4baa1c0b83", - git_commit = "d45c30fa4cf35a0cc71c8b18c2b710d1a3559aee", + sha256 = "7a4b6d69ae6c80cc276e97250b29577c36dee64714b67f29592e447a1d87c888", + git_commit = "9ef04f539932c286bcf6c9b05c06b5c3981bd892", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From cd09be4fc07b969015fcb6a864d6e823200ed354 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Oct 2018 21:02:39 -0700 Subject: [PATCH 1385/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216640609 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 93a51d4118e..c435783e546 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7a4b6d69ae6c80cc276e97250b29577c36dee64714b67f29592e447a1d87c888", - git_commit = "9ef04f539932c286bcf6c9b05c06b5c3981bd892", + sha256 = "3a3df814ce8f877358621f781f9bfdd5de7c0cb9ae3e5df16bb38df8d1aa686e", + git_commit = "905deeaadd41d529461d8a6666e9cf46f0097a8f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1369345c24faef1e7da0bf4f077dde9440009552 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Oct 2018 21:45:26 -0700 Subject: [PATCH 1386/8103] PiperOrigin-RevId: 216643785 --- tensorflow_serving/apis/BUILD | 2 -- 1 file changed, 2 deletions(-) diff --git a/tensorflow_serving/apis/BUILD b/tensorflow_serving/apis/BUILD index 2f4862ac0b5..a5a5a6f4242 100644 --- a/tensorflow_serving/apis/BUILD +++ b/tensorflow_serving/apis/BUILD @@ -48,7 +48,6 @@ serving_proto_library( name = "input_proto", srcs = ["input.proto"], cc_api_version = 2, - js_api_version = 2, deps = [ "@org_tensorflow//tensorflow/core:protos_all_cc", ], @@ -78,7 +77,6 @@ serving_proto_library( name = "model_proto", srcs = ["model.proto"], cc_api_version = 2, - js_api_version = 2, deps = [ "@protobuf_archive//:cc_wkt_protos", ], From 4bc5f4410346f7d708fd07a0678c8001b580310c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Oct 2018 01:02:04 -0700 Subject: [PATCH 1387/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216657742 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c435783e546..2f125d0496c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3a3df814ce8f877358621f781f9bfdd5de7c0cb9ae3e5df16bb38df8d1aa686e", - git_commit = "905deeaadd41d529461d8a6666e9cf46f0097a8f", + sha256 = "e045c8ee1ed435e987519efd66bf394897c6fec76221c55778610b83c191fd80", + git_commit = "96a633367ecd5ae9b31e128c2436b1a3f81b27fd", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d54b16b0468f65c72fb93886db71baef24f31fec Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Oct 2018 05:06:10 -0700 Subject: [PATCH 1388/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216679332 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2f125d0496c..fc3c59c8cd9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e045c8ee1ed435e987519efd66bf394897c6fec76221c55778610b83c191fd80", - git_commit = "96a633367ecd5ae9b31e128c2436b1a3f81b27fd", + sha256 = "0c41f2c97f3f3ce29bdba89fb85bd89a74715e5fcbb2d397bec2d4343af28e2f", + git_commit = "100f9dee3115d892be1a39ae023bd80e24bf70eb", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0ce8f77b92d369c18bb582f982f29ee053d9d64f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Oct 2018 09:02:19 -0700 Subject: [PATCH 1389/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216704705 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fc3c59c8cd9..39e51874670 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0c41f2c97f3f3ce29bdba89fb85bd89a74715e5fcbb2d397bec2d4343af28e2f", - git_commit = "100f9dee3115d892be1a39ae023bd80e24bf70eb", + sha256 = "2babb64685a99b76f2857a7ff2995c89c242a26543266a7eedaa2c1b4b1ee977", + git_commit = "4c080129c62d625c3f57c7d9ee6d8dab8e91ca1e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 317dc62342c7eba1b80fc80e58a08fbd509b71fc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Oct 2018 12:02:02 -0700 Subject: [PATCH 1390/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216736958 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 39e51874670..be532fa7e08 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2babb64685a99b76f2857a7ff2995c89c242a26543266a7eedaa2c1b4b1ee977", - git_commit = "4c080129c62d625c3f57c7d9ee6d8dab8e91ca1e", + sha256 = "9ebf2a0ad2cf7dec415fa357b66d4cb119fe17b7dfea69ff654305a6250a1576", + git_commit = "2502702e23e448dcef0fdd13d7e3049f6b5c9726", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 28d1c0d7349fe1392c8b7170d5d7dfc64a9d284d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Oct 2018 13:02:21 -0700 Subject: [PATCH 1391/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216746601 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index be532fa7e08..8e0c6f132d6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9ebf2a0ad2cf7dec415fa357b66d4cb119fe17b7dfea69ff654305a6250a1576", - git_commit = "2502702e23e448dcef0fdd13d7e3049f6b5c9726", + sha256 = "deadef48f13c149a46d2f8505efad219a8844b4bac0bdb8008c96310bb13b7da", + git_commit = "5c286cf56d6cdd50092ce131a677dd69ab573061", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 89c7ad8fb13ad6ee5805bf8579dddd2eb83b0381 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Oct 2018 14:01:49 -0700 Subject: [PATCH 1392/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216756521 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8e0c6f132d6..465acc462fc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "deadef48f13c149a46d2f8505efad219a8844b4bac0bdb8008c96310bb13b7da", - git_commit = "5c286cf56d6cdd50092ce131a677dd69ab573061", + sha256 = "f0f894be179a150f068f44ac8447414e74725a3741a221ece663ca140c98e26a", + git_commit = "3fd902b26cb09374a19391058ca0b72d997e76b2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From cec2089c0f3dc29250179b9d2f6e82478066e427 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Oct 2018 15:02:22 -0700 Subject: [PATCH 1393/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216767253 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 465acc462fc..f5be795fffe 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f0f894be179a150f068f44ac8447414e74725a3741a221ece663ca140c98e26a", - git_commit = "3fd902b26cb09374a19391058ca0b72d997e76b2", + sha256 = "d6e1d075fd6eaa9353ba5f65b2e94f787de5076f1abb94f5c6b7f2f3c98cf220", + git_commit = "3f750304649c5928638e13dc96380ab5c1005f0e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d84997da0492ffb5fddab2639e78dc13ed502b84 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Oct 2018 16:01:57 -0700 Subject: [PATCH 1394/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216776986 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f5be795fffe..1b129ccaa73 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d6e1d075fd6eaa9353ba5f65b2e94f787de5076f1abb94f5c6b7f2f3c98cf220", - git_commit = "3f750304649c5928638e13dc96380ab5c1005f0e", + sha256 = "8eb58adc4689aeff236d67f6be6044ab255a0543ce1b51a5ae38737577abb878", + git_commit = "e70b97f778cd19949f80eb72ea115c8fe8cde8fe", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2bcf5ff5e7cf37c35c0f058dba0bb0a8102ec76e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Oct 2018 17:02:09 -0700 Subject: [PATCH 1395/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216785974 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1b129ccaa73..36725ee8524 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8eb58adc4689aeff236d67f6be6044ab255a0543ce1b51a5ae38737577abb878", - git_commit = "e70b97f778cd19949f80eb72ea115c8fe8cde8fe", + sha256 = "833073e191f92055bb3aa570f378a98eb7724e02521e71bfb332f8c1316dac68", + git_commit = "15a8a88452041517b7711d099ccd04a130c20d70", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From de0f2725d632f8f20e5a7b9bbc299c6250847bb6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Oct 2018 18:01:45 -0700 Subject: [PATCH 1396/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216792748 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 36725ee8524..46227d603a9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "833073e191f92055bb3aa570f378a98eb7724e02521e71bfb332f8c1316dac68", - git_commit = "15a8a88452041517b7711d099ccd04a130c20d70", + sha256 = "a76f604020bc7443a90ea0cb56c16d52968dd8e9fed742a2168488a01155daf9", + git_commit = "cb8f301d8e94a393c9bce4c6e1b96ba163b41603", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fd0369acd744ba75a3562c31cad623f7f2a5c3d1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Oct 2018 19:01:51 -0700 Subject: [PATCH 1397/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216798281 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 46227d603a9..373f7085fb0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a76f604020bc7443a90ea0cb56c16d52968dd8e9fed742a2168488a01155daf9", - git_commit = "cb8f301d8e94a393c9bce4c6e1b96ba163b41603", + sha256 = "f0e192f132f71761423e135ec277303fd50dbaedc02c20d7b98df2571d5f68ac", + git_commit = "7c2fb35f1ae4fcd74199757bccafb1702221352a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c0960079984732441c63027e2ec5f00f14530574 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Thu, 11 Oct 2018 19:10:30 -0700 Subject: [PATCH 1398/8103] Update comments in ResNet client script PiperOrigin-RevId: 216799189 --- tensorflow_serving/example/resnet_client.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tensorflow_serving/example/resnet_client.py b/tensorflow_serving/example/resnet_client.py index 955abb7208c..d4ec0825f7d 100644 --- a/tensorflow_serving/example/resnet_client.py +++ b/tensorflow_serving/example/resnet_client.py @@ -17,6 +17,13 @@ The client downloads a test image of a cat, queries the server over the REST API with the test image repeatedly and measures how long it takes to respond. +The client expects a TensorFlow Serving ModelServer running a ResNet SavedModel +from: + +https://github.com/tensorflow/models/tree/master/official/resnet#pre-trained-model + +The SavedModel must be one that can take JPEG images as inputs. + Typical usage example: resnet_client.py @@ -27,7 +34,11 @@ import base64 import requests +# The server URL specifies the endpoint of your server running the ResNet +# model with the name "resnet" and using the predict interface. SERVER_URL = 'http://localhost:8501/v1/models/resnet:predict' + +# The image URL is the location of the image we should send to the server IMAGE_URL = 'https://tensorflow.org/images/blogs/serving/cat.jpg' From 2f8feb53e9de761cfd872b8905946a99df9203ab Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Oct 2018 20:01:55 -0700 Subject: [PATCH 1399/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216802424 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 373f7085fb0..f6ced8a7b54 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f0e192f132f71761423e135ec277303fd50dbaedc02c20d7b98df2571d5f68ac", - git_commit = "7c2fb35f1ae4fcd74199757bccafb1702221352a", + sha256 = "26a991038e7f6f40ebd2b4c35bf30ae12a65e8ef7a71dbc13a7e3cd63cc6ee5a", + git_commit = "8fbed5f43ccac490088679c86d6989afae7d9e1a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From aee599e833ba2a6b0b2994985f66e9ff68dacab9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Oct 2018 23:02:03 -0700 Subject: [PATCH 1400/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216815887 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f6ced8a7b54..a35d964a085 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "26a991038e7f6f40ebd2b4c35bf30ae12a65e8ef7a71dbc13a7e3cd63cc6ee5a", - git_commit = "8fbed5f43ccac490088679c86d6989afae7d9e1a", + sha256 = "fd2a091657ec75bb1d42b2dd4e9643eb829105fbb7e01c8a74fedb4ac5d4a2e3", + git_commit = "82249722d239c74b3746c65b3696775c7f100e69", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 97978adfc4fa982d2448a9fc358dffe7a2945c32 Mon Sep 17 00:00:00 2001 From: vfdev Date: Fri, 12 Oct 2018 08:52:39 +0200 Subject: [PATCH 1401/8103] Add `-N` to useradd. Fixes #1137 --- tools/bazel_in_docker.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/bazel_in_docker.sh b/tools/bazel_in_docker.sh index 3f2155aa700..0d615fe956c 100755 --- a/tools/bazel_in_docker.sh +++ b/tools/bazel_in_docker.sh @@ -46,7 +46,7 @@ function get_switch_user_cmd() { local username=$(id -n -u) local groupname=$(id -n -g) local cmdline="groupadd -f ${groupname} && groupmod -o -g ${gid} ${groupname}" - cmdline+="; id -u ${username} &>/dev/null || useradd ${username} && usermod -o -u ${uid} -g ${gid} ${username}" + cmdline+="; id -u ${username} &>/dev/null || useradd -N ${username} && usermod -o -u ${uid} -g ${gid} ${username}" cmdline+="; chroot --userspec=${username} / " echo "${cmdline}" } From 6463c76090b35abef2b372b9a2b5116f189be747 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Oct 2018 00:02:10 -0700 Subject: [PATCH 1402/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216819591 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a35d964a085..687c048922f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fd2a091657ec75bb1d42b2dd4e9643eb829105fbb7e01c8a74fedb4ac5d4a2e3", - git_commit = "82249722d239c74b3746c65b3696775c7f100e69", + sha256 = "d12097cae3cb1d050ba1226e3b721162f70cbf11f311804827c696948c41e54a", + git_commit = "ea5cd0a4a6c1eac892cdf5fa8782bb05ebe2bf98", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 25ddeab643ff9f6760aeeed7b0d27f1865ec41f2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Oct 2018 03:03:17 -0700 Subject: [PATCH 1403/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216835314 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 687c048922f..898140d140e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d12097cae3cb1d050ba1226e3b721162f70cbf11f311804827c696948c41e54a", - git_commit = "ea5cd0a4a6c1eac892cdf5fa8782bb05ebe2bf98", + sha256 = "01cbc2cc9567739a6d7cd524296fed8f8bd790bf3f5edb29f08f8734a79ed8fa", + git_commit = "690d9e3f465a55cbad43051574dde04189768a0c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fe9b4d914479e9700e0bcfa04a48e833c49c67e5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Oct 2018 04:01:48 -0700 Subject: [PATCH 1404/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216839807 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 898140d140e..945dff9616d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "01cbc2cc9567739a6d7cd524296fed8f8bd790bf3f5edb29f08f8734a79ed8fa", - git_commit = "690d9e3f465a55cbad43051574dde04189768a0c", + sha256 = "3ad16f4685af9dba9fb5fe8d34d91d5f182266a9c8adfa43289c68258b1f02d6", + git_commit = "9e0fa9578638f9147c0b180e6ea89d67d5c0bae3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 861956c12c15cb37319aae2fa273aa55c99a9f5d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Oct 2018 09:02:13 -0700 Subject: [PATCH 1405/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216870225 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 945dff9616d..06528b229e3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3ad16f4685af9dba9fb5fe8d34d91d5f182266a9c8adfa43289c68258b1f02d6", - git_commit = "9e0fa9578638f9147c0b180e6ea89d67d5c0bae3", + sha256 = "1c90e05a312954484427fa9ca1b2920d0793d6cafb54c761c3b70757145a4745", + git_commit = "72bf28cd1f2e1a8bd6e4493ef3e2625816235e76", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2fda31f905eefd2d108e9c84b8d7d55e4e482833 Mon Sep 17 00:00:00 2001 From: kathywu Date: Fri, 12 Oct 2018 11:59:24 -0700 Subject: [PATCH 1406/8103] Replacing legacy_init_op argument in SavedModelBuilder with main_op. PiperOrigin-RevId: 216898647 --- tensorflow_serving/g3doc/serving_basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/g3doc/serving_basic.md b/tensorflow_serving/g3doc/serving_basic.md index b91245479a2..95512d2a090 100644 --- a/tensorflow_serving/g3doc/serving_basic.md +++ b/tensorflow_serving/g3doc/serving_basic.md @@ -60,7 +60,7 @@ builder.add_meta_graph_and_variables( signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: classification_signature, }, - legacy_init_op=legacy_init_op) + main_op=main_op) builder.save() ``` From e7686ace7c861711340126428f75b8d7d167dfbd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Oct 2018 12:01:54 -0700 Subject: [PATCH 1407/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216899005 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 06528b229e3..4135d55dde3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1c90e05a312954484427fa9ca1b2920d0793d6cafb54c761c3b70757145a4745", - git_commit = "72bf28cd1f2e1a8bd6e4493ef3e2625816235e76", + sha256 = "262e9644fd53f26a991889e0eb080ed80d8c8b71fcdecfe3b57cbcddc93db5ef", + git_commit = "443084eeaff33764271ea025119b1d8c151d6694", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d82fc3699b66799d01ea8ffc4d3e4fb0c2a7d5cf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Oct 2018 13:01:57 -0700 Subject: [PATCH 1408/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216908306 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4135d55dde3..e8007bc9629 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "262e9644fd53f26a991889e0eb080ed80d8c8b71fcdecfe3b57cbcddc93db5ef", - git_commit = "443084eeaff33764271ea025119b1d8c151d6694", + sha256 = "ae0a6808b9ef74b768c3fb85bd5fac16f370f70b8fca4fe163de6fc6404e8bab", + git_commit = "d30ace44a62a7699b01e567e496906e77cd5e682", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1bd3410573037efc5a2293b1da61ba7e042dba7d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Oct 2018 14:01:49 -0700 Subject: [PATCH 1409/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216917814 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e8007bc9629..ce39558d0ed 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ae0a6808b9ef74b768c3fb85bd5fac16f370f70b8fca4fe163de6fc6404e8bab", - git_commit = "d30ace44a62a7699b01e567e496906e77cd5e682", + sha256 = "f90e39d3e837a7dbdd1d980c5116ecd8ca08feffba4634a81f8a01a523c9adbe", + git_commit = "2f5e8e189c3b70840d7a835d4e36fd146380abc4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f5d2275b428f2991d01e824bc2a6f91f7573f2e3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Oct 2018 15:02:16 -0700 Subject: [PATCH 1410/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216928035 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ce39558d0ed..a4a27dc4fc7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f90e39d3e837a7dbdd1d980c5116ecd8ca08feffba4634a81f8a01a523c9adbe", - git_commit = "2f5e8e189c3b70840d7a835d4e36fd146380abc4", + sha256 = "66f0ffa0e568da56082ef51fde525e6b247061b627775de728a1e08a9aded7cd", + git_commit = "2ad4975e11b96b5b9f28c46c1a6d0b5d330b2bcd", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 066a50254c126cd1099f7dbb31a3175452f397ee Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Oct 2018 16:02:11 -0700 Subject: [PATCH 1411/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216937007 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a4a27dc4fc7..f6094950402 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "66f0ffa0e568da56082ef51fde525e6b247061b627775de728a1e08a9aded7cd", - git_commit = "2ad4975e11b96b5b9f28c46c1a6d0b5d330b2bcd", + sha256 = "f0fbc49bf1e72c7fdfe41f9b44a7723a8c472f94aa8380639176762c83de8db6", + git_commit = "d1757bde2551873810149693f5e77620559fbb26", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2f3405eefc26698e5c97c3f645e3a38f293f2d7b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Oct 2018 17:02:19 -0700 Subject: [PATCH 1412/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216945169 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f6094950402..cc037fadd80 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f0fbc49bf1e72c7fdfe41f9b44a7723a8c472f94aa8380639176762c83de8db6", - git_commit = "d1757bde2551873810149693f5e77620559fbb26", + sha256 = "b692639076fbe71b8d0b5d146b558239b0aaa99507992dc6aebb680f61b0f47a", + git_commit = "df414e1360551dd6783276808b0fc37f7e974876", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e9503214ee55aa18e43c494296056d472e01f4fe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Oct 2018 19:02:06 -0700 Subject: [PATCH 1413/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216955431 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cc037fadd80..e9b0e625699 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b692639076fbe71b8d0b5d146b558239b0aaa99507992dc6aebb680f61b0f47a", - git_commit = "df414e1360551dd6783276808b0fc37f7e974876", + sha256 = "870acb315b94dea73e51d12e0e770c149ef228ab5b3b2fc397bb77698c154fad", + git_commit = "dc1aab20a12e2d32a10f019a5de3f65f56345fa8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8c0ce1a1ee2420e306b9487e7e9a95c81541e7a6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Oct 2018 20:02:05 -0700 Subject: [PATCH 1414/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216958637 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e9b0e625699..d3d487526c0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "870acb315b94dea73e51d12e0e770c149ef228ab5b3b2fc397bb77698c154fad", - git_commit = "dc1aab20a12e2d32a10f019a5de3f65f56345fa8", + sha256 = "f18d18ff08d76f1e0f859ae161b3d8476dd425fe364c74c5781901d0cb196404", + git_commit = "989b82109f52cf1726b5f02f5fdffc41252cabf6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 698c47a40afb92014aa7fc59edd05df63673c5ce Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 13 Oct 2018 00:02:48 -0700 Subject: [PATCH 1415/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216970540 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d3d487526c0..e73f262fa58 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f18d18ff08d76f1e0f859ae161b3d8476dd425fe364c74c5781901d0cb196404", - git_commit = "989b82109f52cf1726b5f02f5fdffc41252cabf6", + sha256 = "91fbe636484c4b25a61b0a6bc9fbe6e7300665a124032e28eb890ca7a993060b", + git_commit = "0f13eb912c48a7d9c5f4122a18a5e617222ae0ce", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0d5521e3918bca95fe8f8f43e9b468df1961821f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 13 Oct 2018 03:02:02 -0700 Subject: [PATCH 1416/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 216979535 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e73f262fa58..3258a9c2bfc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "91fbe636484c4b25a61b0a6bc9fbe6e7300665a124032e28eb890ca7a993060b", - git_commit = "0f13eb912c48a7d9c5f4122a18a5e617222ae0ce", + sha256 = "15dc1d09e7a12f04be5ebe1f24af912990afde48265eb644846a6184a02541c5", + git_commit = "573985cacba7ba36032fe3ac55f4ca9b52e08033", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c44fed919e5767ac056fadbc7c15a62fd73c3521 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 13 Oct 2018 14:01:47 -0700 Subject: [PATCH 1417/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217006106 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3258a9c2bfc..0fcc425ee40 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "15dc1d09e7a12f04be5ebe1f24af912990afde48265eb644846a6184a02541c5", - git_commit = "573985cacba7ba36032fe3ac55f4ca9b52e08033", + sha256 = "b9aaf256e35036db4bcbb0c12bd17e3c387f894dec21b2adfe36a33bac1d7662", + git_commit = "d84bfa45172da3af2b487593fb0cac1756f4fc0d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c00fa260ed11921cb6e492b239380095e0518625 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 13 Oct 2018 18:01:33 -0700 Subject: [PATCH 1418/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217015146 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0fcc425ee40..3d79de25b16 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b9aaf256e35036db4bcbb0c12bd17e3c387f894dec21b2adfe36a33bac1d7662", - git_commit = "d84bfa45172da3af2b487593fb0cac1756f4fc0d", + sha256 = "6a2d794bbe7d811992dfca65a9f353633153855d1b9e2d73bafe0c9c73782e6e", + git_commit = "f667188daefab3650a07eaa578c78af7c96ff14b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 098836c5b2ffe9d7498e0af5e7822aa044198eab Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 13 Oct 2018 19:01:53 -0700 Subject: [PATCH 1419/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217017237 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3d79de25b16..2aa009004b8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6a2d794bbe7d811992dfca65a9f353633153855d1b9e2d73bafe0c9c73782e6e", - git_commit = "f667188daefab3650a07eaa578c78af7c96ff14b", + sha256 = "8fca0f3a790e97221a4ab70cdc084770137291a8624afe8f2b5020022084fecb", + git_commit = "47b04fdb3ee2491dfb0306ea56617d0e95b38c27", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 99dafe6f657ff68380acd7e30aa61310a3f1cec4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 14 Oct 2018 04:01:49 -0700 Subject: [PATCH 1420/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217040376 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2aa009004b8..7496b0b192e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8fca0f3a790e97221a4ab70cdc084770137291a8624afe8f2b5020022084fecb", - git_commit = "47b04fdb3ee2491dfb0306ea56617d0e95b38c27", + sha256 = "64ccf1b2e67468cacc04cea2987c24ec78761c1ba687d13eec08dba0fa02fa09", + git_commit = "c9e3160160c013fe9f72e23796d5365b1475e3db", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 94f4d4b35473bcc38860d86d634083a77bf6c783 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 15 Oct 2018 03:02:16 -0700 Subject: [PATCH 1421/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217114124 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7496b0b192e..7707cb1d1db 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "64ccf1b2e67468cacc04cea2987c24ec78761c1ba687d13eec08dba0fa02fa09", - git_commit = "c9e3160160c013fe9f72e23796d5365b1475e3db", + sha256 = "524f6486f9c1a7b8b2766c181d31f0cd506c3bae798975d01b9f4dc7aee8a4c3", + git_commit = "6582efdc5e40b9196664878cb20e4f6590fcd0ea", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1cceb78579f51a20d07447436180e55ef769774d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 15 Oct 2018 05:02:16 -0700 Subject: [PATCH 1422/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217124153 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7707cb1d1db..237a327368c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "524f6486f9c1a7b8b2766c181d31f0cd506c3bae798975d01b9f4dc7aee8a4c3", - git_commit = "6582efdc5e40b9196664878cb20e4f6590fcd0ea", + sha256 = "19da5b0b3970d5cf005066447d2921c85f1bc648d4228b676f38f4551fd47e4c", + git_commit = "63923f0bb1268acb88c0752f8c7f06c821c01094", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 01c2fb804161125bebda0b5880657ad046ab2da7 Mon Sep 17 00:00:00 2001 From: awk Date: Mon, 15 Oct 2018 10:34:28 -0700 Subject: [PATCH 1423/8103] Handle range checking of floating point numbers correctly. Underlying rapidjson::IsLosslessFloat() does not work correctly (e.g. IsLosslessFloat(0.2) returns false!). We now split the range check into two parts: one to check if a integral value can fit in float/double without loss and other part to do usual decimal compare against the defined limits. The latter is used for non-integer values. Fixes https://github.com/tensorflow/serving/issues/1136 PiperOrigin-RevId: 217166796 --- tensorflow_serving/util/json_tensor.cc | 18 +++++++++++++--- tensorflow_serving/util/json_tensor_test.cc | 24 ++++++++++++--------- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/tensorflow_serving/util/json_tensor.cc b/tensorflow_serving/util/json_tensor.cc index ea387a3d72a..a0870b812df 100644 --- a/tensorflow_serving/util/json_tensor.cc +++ b/tensorflow_serving/util/json_tensor.cc @@ -15,6 +15,7 @@ limitations under the License. #include "tensorflow_serving/util/json_tensor.h" +#include #include #include #include @@ -209,15 +210,26 @@ Status LossyDecimalError(const rapidjson::Value& val, const string& target) { template bool IsLosslessDecimal(const rapidjson::Value& val) { static_assert(std::is_same::value || std::is_same::value, - "Only floating-point value types are supported."); + "Only floating point value types are supported."); + static_assert(std::numeric_limits::radix == 2, + "Floating point type must have base 2."); // Note, we use GetDouble() for both types as std::isfinite() returns false // for decimal values that do not fit in float (due to the static_cast<> used // in converting double to float in GetFloat() call). if (!std::isfinite(val.GetDouble())) return true; - if (std::is_same::value) return val.IsLosslessFloat(); - return val.IsLosslessDouble(); + // Maximum integer value that can be represented by the floating type. + static constexpr int64 kMaxInt = (1LL << std::numeric_limits::digits) - 1; + + if (val.IsUint64()) { + return val.GetUint64() <= kMaxInt; + } + if (val.IsInt64()) { + return std::abs(val.GetInt64()) <= kMaxInt; + } + return val.GetDouble() <= std::numeric_limits::max() && + val.GetDouble() >= std::numeric_limits::lowest(); } // Adds a JSON value to Tensor. Returns error if value cannot be converted diff --git a/tensorflow_serving/util/json_tensor_test.cc b/tensorflow_serving/util/json_tensor_test.cc index 1d8edf219f6..9edc46e1cb1 100644 --- a/tensorflow_serving/util/json_tensor_test.cc +++ b/tensorflow_serving/util/json_tensor_test.cc @@ -81,7 +81,7 @@ TEST(JsontensorTest, SingleUnnamedTensor) { )")); } -TEST(JsontensorTest, IntegerInputForFloatTensor) { +TEST(JsontensorTest, MixedInputForFloatTensor) { TensorInfoMap infomap; ASSERT_TRUE( TextFormat::ParseFromString("dtype: DT_FLOAT", &infomap["default"])); @@ -90,7 +90,7 @@ TEST(JsontensorTest, IntegerInputForFloatTensor) { JsonPredictRequestFormat format; TF_EXPECT_OK(FillPredictRequestFromJson(R"( { - "instances": [1, 2, 3, 4, 5] + "instances": [1, 2.0, 3, 4, 5.003, 0.007, 0.0] })", getmap(infomap), &req, &format)); auto tmap = req.inputs(); @@ -98,16 +98,18 @@ TEST(JsontensorTest, IntegerInputForFloatTensor) { EXPECT_EQ(format, JsonPredictRequestFormat::kRow); EXPECT_THAT(tmap["default"], EqualsProto(R"( dtype: DT_FLOAT - tensor_shape { dim { size: 5 } } + tensor_shape { dim { size: 7 } } float_val: 1 - float_val: 2 + float_val: 2.0 float_val: 3 float_val: 4 - float_val: 5 + float_val: 5.003 + float_val: 0.007 + float_val: 0.0 )")); } -TEST(JsontensorTest, IntegerInputForDoubleTensor) { +TEST(JsontensorTest, MixedInputForDoubleTensor) { TensorInfoMap infomap; ASSERT_TRUE( TextFormat::ParseFromString("dtype: DT_DOUBLE", &infomap["default"])); @@ -116,7 +118,7 @@ TEST(JsontensorTest, IntegerInputForDoubleTensor) { JsonPredictRequestFormat format; TF_EXPECT_OK(FillPredictRequestFromJson(R"( { - "instances": [1, 2, 3, 4, 5] + "instances": [1.0, 2, 3, 4, 0.662, 0, 0.0] })", getmap(infomap), &req, &format)); auto tmap = req.inputs(); @@ -124,12 +126,14 @@ TEST(JsontensorTest, IntegerInputForDoubleTensor) { EXPECT_EQ(format, JsonPredictRequestFormat::kRow); EXPECT_THAT(tmap["default"], EqualsProto(R"( dtype: DT_DOUBLE - tensor_shape { dim { size: 5 } } - double_val: 1 + tensor_shape { dim { size: 7 } } + double_val: 1.0 double_val: 2 double_val: 3 double_val: 4 - double_val: 5 + double_val: 0.662 + double_val: 0 + double_val: 0.0 )")); } From 0f0f1ad5690fd33ae9d0c1afb5585fe4942a9d6d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 15 Oct 2018 14:01:46 -0700 Subject: [PATCH 1424/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217203100 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 237a327368c..4fe68e0db70 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "19da5b0b3970d5cf005066447d2921c85f1bc648d4228b676f38f4551fd47e4c", - git_commit = "63923f0bb1268acb88c0752f8c7f06c821c01094", + sha256 = "2f2b54acd4b34a7d536abcf4f5d487497fbd0e2cf588d83b3d8766297d7ac56c", + git_commit = "6d84f1ff526bd0d972477799be8edd019073975a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 005cf3c3da0d3696fce4bbaf469c68d2abb1db4f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 15 Oct 2018 15:02:35 -0700 Subject: [PATCH 1425/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217213854 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4fe68e0db70..c9e53db8838 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2f2b54acd4b34a7d536abcf4f5d487497fbd0e2cf588d83b3d8766297d7ac56c", - git_commit = "6d84f1ff526bd0d972477799be8edd019073975a", + sha256 = "4f63e28a45b499a6b4a04125ca4d7bb90beefec0ec4193a97df33551f4ff82fd", + git_commit = "63f4fcd6618b25f6b3a624c5ca8fe12efe84acb3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 06ca7ac223196e4b91f6a38419fd4e5785116d6d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 15 Oct 2018 18:01:43 -0700 Subject: [PATCH 1426/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217241679 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c9e53db8838..156c0308a11 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4f63e28a45b499a6b4a04125ca4d7bb90beefec0ec4193a97df33551f4ff82fd", - git_commit = "63f4fcd6618b25f6b3a624c5ca8fe12efe84acb3", + sha256 = "951dd346d2c32571763929a34d839bd53a9858a9db92298207da9af14c482b96", + git_commit = "6194d396864c29b06ef041b92938afae40723848", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9700f30f3026d3aafb3bac2264286407de149132 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 15 Oct 2018 19:02:03 -0700 Subject: [PATCH 1427/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217248791 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 156c0308a11..372b2c0034c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "951dd346d2c32571763929a34d839bd53a9858a9db92298207da9af14c482b96", - git_commit = "6194d396864c29b06ef041b92938afae40723848", + sha256 = "022f5eb6040b39afb42c912984f779f2e019053cffa9684356b9ccf20b841eec", + git_commit = "f943364eb8df6e56b889432172f0e74cda4ae4b2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f8a8462bec1c6cf470ff0d61d0d8563cd3232c5f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 15 Oct 2018 20:02:03 -0700 Subject: [PATCH 1428/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217253433 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 372b2c0034c..5b81860e695 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "022f5eb6040b39afb42c912984f779f2e019053cffa9684356b9ccf20b841eec", - git_commit = "f943364eb8df6e56b889432172f0e74cda4ae4b2", + sha256 = "3205072abf2e5bf7f4826c1c30b80c1067b3e27960b25fc7e418528d82a31dbf", + git_commit = "adcaf40165e7c0871aafa1c9b36236446c699b7d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2aee61f88f7dbeb888c5a8edde9131b9bef75b32 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 15 Oct 2018 21:02:17 -0700 Subject: [PATCH 1429/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217258200 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5b81860e695..0008a97acc3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3205072abf2e5bf7f4826c1c30b80c1067b3e27960b25fc7e418528d82a31dbf", - git_commit = "adcaf40165e7c0871aafa1c9b36236446c699b7d", + sha256 = "411bf3a8aa6031bf13446840c097c0c5ef1b6cfd552adb5bffac7480e5e93a5c", + git_commit = "6f90abf4a274e700769c927ea8727f59e39cc919", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3799ad4fe2df9dd735d1aa70cbea39f1c944aede Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 15 Oct 2018 22:01:54 -0700 Subject: [PATCH 1430/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217262735 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0008a97acc3..96d49c74550 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "411bf3a8aa6031bf13446840c097c0c5ef1b6cfd552adb5bffac7480e5e93a5c", - git_commit = "6f90abf4a274e700769c927ea8727f59e39cc919", + sha256 = "9829825cfbbbf9b525a829aa02f54cc854f6317cd545838acfece2442d20acff", + git_commit = "5473b48a761ee1746686efe697bee7661bbaa612", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1c14a80221fa849547cc4bc814968ea3c7052287 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 16 Oct 2018 00:02:02 -0700 Subject: [PATCH 1431/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217271579 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 96d49c74550..00635110aae 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9829825cfbbbf9b525a829aa02f54cc854f6317cd545838acfece2442d20acff", - git_commit = "5473b48a761ee1746686efe697bee7661bbaa612", + sha256 = "d1874d9f89739569bb9e041852de99d04305f18c1458f566e3fc6e39e7fde9af", + git_commit = "903a6399aab19b549fefd0ead836af644f3d00f8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 831434474b34e0067a18b3b5bc0161b9e1c7b08b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 16 Oct 2018 15:02:18 -0700 Subject: [PATCH 1432/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217393320 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 00635110aae..4f54873b440 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d1874d9f89739569bb9e041852de99d04305f18c1458f566e3fc6e39e7fde9af", - git_commit = "903a6399aab19b549fefd0ead836af644f3d00f8", + sha256 = "4cede63f014522b8b2283fbf665607cf42c2282b349daed9c5fee99d654daef8", + git_commit = "d4eb6ab275f3db5e5ea116b1a0ac4203ef01db87", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5c7740fc3d8d5c017643a8cc40a7202717b10dd6 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Tue, 16 Oct 2018 15:56:56 -0700 Subject: [PATCH 1433/8103] Add git hash for version metadata of model server and add tags for dev and nightly builds. PiperOrigin-RevId: 217403451 --- tensorflow_serving/model_servers/BUILD | 6 ++- tensorflow_serving/model_servers/main.cc | 3 +- tensorflow_serving/model_servers/version.cc | 22 +++++++++++ tensorflow_serving/model_servers/version.h | 42 +++++++++++++++------ tools/bazel.rc | 4 +- tools/gen_status_stamp.sh | 39 +++++++++++++++++++ 6 files changed, 100 insertions(+), 16 deletions(-) create mode 100644 tensorflow_serving/model_servers/version.cc create mode 100755 tools/gen_status_stamp.sh diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index a6d6eb06d99..e0e3670283e 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -331,7 +331,10 @@ cc_library( srcs = [ "main.cc", ], - hdrs = ["version.h"], + hdrs = [ + "version.h", + ], + linkstamp = "version.cc", visibility = [ ":tensorflow_model_server_custom_op_clients", "//tensorflow_serving:internal", @@ -348,6 +351,7 @@ cc_library( cc_binary( name = "tensorflow_model_server", + stamp = 1, visibility = ["//tensorflow_serving:internal"], deps = [ ":tensorflow_model_server_main_lib", diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index 2a9d00a85cc..6353c396b8f 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -158,8 +158,7 @@ int main(int argc, char** argv) { } if (display_version) { - std::cout << "TensorFlow ModelServer: " << TF_MODELSERVER_VERSION_STRING - << "\n" + std::cout << "TensorFlow ModelServer: " << TF_Serving_Version() << "\n" << "TensorFlow Library: " << TF_Version() << "\n"; return 0; } diff --git a/tensorflow_serving/model_servers/version.cc b/tensorflow_serving/model_servers/version.cc new file mode 100644 index 00000000000..96230a6ce9f --- /dev/null +++ b/tensorflow_serving/model_servers/version.cc @@ -0,0 +1,22 @@ +/* Copyright 2018 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow_serving/model_servers/version.h" + +const char kTFS_SCM_Revision[] = TF_MODELSERVER_VERSION_STRING; + +extern "C" { +const char* TF_Serving_Version() { return kTFS_SCM_Revision; } +} diff --git a/tensorflow_serving/model_servers/version.h b/tensorflow_serving/model_servers/version.h index 5aa5b868cb8..5506eba2537 100644 --- a/tensorflow_serving/model_servers/version.h +++ b/tensorflow_serving/model_servers/version.h @@ -16,25 +16,43 @@ limitations under the License. #ifndef TENSORFLOW_SERVING_MODEL_SERVERS_VERSION_H_ #define TENSORFLOW_SERVING_MODEL_SERVERS_VERSION_H_ -// TF Serving Model Server uses semantic versioning, see http://semver.org/. +// TF Serving Model Server uses semantic versioning for releases +// - see http://semver.org/. For nightlies, a git hash is used to track the +// build via linkstamping +#define TF_MODELSERVER_STR_HELPER(x) #x +#define TF_MODELSERVER_STR(x) TF_MODELSERVER_STR_HELPER(x) -#define TF_MODELSERVER_MAJOR_VERSION 1 -#define TF_MODELSERVER_MINOR_VERSION 10 +#define TF_MODELSERVER_MAJOR_VERSION 0 +#define TF_MODELSERVER_MINOR_VERSION 0 #define TF_MODELSERVER_PATCH_VERSION 0 - // TF_MODELSERVER_VERSION_SUFFIX is non-empty for pre-releases // (e.g. "-alpha", "-alpha.1", "-beta", "-rc", "-rc.1") -#define TF_MODELSERVER_VERSION_SUFFIX "-dev" - -#define TF_MODELSERVER_STR_HELPER(x) #x -#define TF_MODELSERVER_STR(x) TF_MODELSERVER_STR_HELPER(x) - -// e.g. "0.5.0" or "0.6.0-alpha". +#define TF_MODELSERVER_VERSION_SUFFIX "" + +#ifndef TF_MODELSERVER_VERSION_NO_META +// TF_MODELSERVER_BUILD_TAG can be set to be nightly for nightly builds +#ifndef TF_MODELSERVER_BUILD_TAG +#define TF_MODELSERVER_META_TAG "+dev" +#else +#define TF_MODELSERVER_META_TAG "+" TF_MODELSERVER_STR(TF_MODELSERVER_BUILD_TAG) +#endif +#define TF_MODELSERVER_META_SCM_HASH ".sha." BUILD_SCM_REVISION +#else +#define TF_MODELSERVER_META_TAG "" +#define TF_MODELSERVER_META_SCM_HASH "" +#endif + +// e.g. "0.5.0+nightly.sha.a1b2c3d" or "0.6.0-rc1". // clang-format off #define TF_MODELSERVER_VERSION_STRING \ (TF_MODELSERVER_STR(TF_MODELSERVER_MAJOR_VERSION) "." TF_MODELSERVER_STR( \ - TF_MODELSERVER_MINOR_VERSION) "." TF_MODELSERVER_STR( \ - TF_MODELSERVER_PATCH_VERSION) TF_MODELSERVER_VERSION_SUFFIX) + TF_MODELSERVER_MINOR_VERSION) "." TF_MODELSERVER_STR( \ + TF_MODELSERVER_PATCH_VERSION) TF_MODELSERVER_VERSION_SUFFIX \ + TF_MODELSERVER_META_TAG TF_MODELSERVER_META_SCM_HASH) // clang-format on +extern "C" { +const char* TF_Serving_Version(); +} + #endif // TENSORFLOW_SERVING_MODEL_SERVERS_VERSION_H_ diff --git a/tools/bazel.rc b/tools/bazel.rc index 3f73cb0b0f5..bcc008657e6 100644 --- a/tools/bazel.rc +++ b/tools/bazel.rc @@ -34,4 +34,6 @@ build -c opt # Adding --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0" creates parity with TF # compilation options. It also addresses memory use due to # copy-on-write semantics of std::strings of the older ABI. -build --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0 \ No newline at end of file +build --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0 + +build --workspace_status_command=/proc/self/cwd/tools/gen_status_stamp.sh \ No newline at end of file diff --git a/tools/gen_status_stamp.sh b/tools/gen_status_stamp.sh new file mode 100755 index 00000000000..f8c840d6d8d --- /dev/null +++ b/tools/gen_status_stamp.sh @@ -0,0 +1,39 @@ +#!/bin/bash +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +# This script will be run by the building process to generate key-value +# information that represents the status of the workspace. The output should be +# in the format: +# +# KEY1 VALUE1 +# KEY2 VALUE2 +# +# If the script exits with non-zero code, it's considered as a failure +# and the output will be discarded. + +# if we're inside a git tree +if [ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1; then + git_rev=$(git rev-parse --short HEAD) + if [[ $? != 0 ]]; + then + exit 1 + fi + echo "BUILD_SCM_REVISION ${git_rev}" +else + echo "BUILD_SCM_REVISION no_git" +fi; + + From 2eb8fa0ebbe7b828cfc17aa8c081a730d3011756 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 16 Oct 2018 16:02:07 -0700 Subject: [PATCH 1434/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217404359 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4f54873b440..be5f84dbdfc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4cede63f014522b8b2283fbf665607cf42c2282b349daed9c5fee99d654daef8", - git_commit = "d4eb6ab275f3db5e5ea116b1a0ac4203ef01db87", + sha256 = "929a4f4d1cc9c8bfc4a89532e3abda350892147369e607f303d9dadfb0b424bb", + git_commit = "b28c5f471e486d86564669721887f284ed402ff8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f95f194c826cf92f48648238051672daa1df6fc0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 16 Oct 2018 17:02:03 -0700 Subject: [PATCH 1435/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217413822 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index be5f84dbdfc..a75d96d5654 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "929a4f4d1cc9c8bfc4a89532e3abda350892147369e607f303d9dadfb0b424bb", - git_commit = "b28c5f471e486d86564669721887f284ed402ff8", + sha256 = "e5d169a668f40b635f7f61f897cc9d22a0ba9817892476b64cac980ab72ef0b1", + git_commit = "e6440a80c846ef1d29428348356d41f0d7a36eba", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f72bdbf27c69cd3c369ff6833e9d8ebfcece8a54 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 16 Oct 2018 18:04:23 -0700 Subject: [PATCH 1436/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217421641 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a75d96d5654..9a1c62d1931 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e5d169a668f40b635f7f61f897cc9d22a0ba9817892476b64cac980ab72ef0b1", - git_commit = "e6440a80c846ef1d29428348356d41f0d7a36eba", + sha256 = "195085f99e9f3e30167e92e435444185654d886b0e6c8fbe84b292c9b0f8555d", + git_commit = "41ba73a1e50361a31c3b845ea61f3df3507cdcde", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 90e1e93e5f0a1a096a90d4ab30d7c7c935e8d067 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 16 Oct 2018 22:01:51 -0700 Subject: [PATCH 1437/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217440667 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9a1c62d1931..a3199bd48c7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "195085f99e9f3e30167e92e435444185654d886b0e6c8fbe84b292c9b0f8555d", - git_commit = "41ba73a1e50361a31c3b845ea61f3df3507cdcde", + sha256 = "03274388391aa4759d6e262abcc2b63dee4592fe25d48234f3d25e2777c86b89", + git_commit = "0f1894de6cfddb3df8a3d6865d97b947af56f995", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 63982f76ed5e8a795d81b7a67a4f331fe8ad8e71 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 16 Oct 2018 23:02:23 -0700 Subject: [PATCH 1438/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217444836 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a3199bd48c7..5c7e1632bd2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "03274388391aa4759d6e262abcc2b63dee4592fe25d48234f3d25e2777c86b89", - git_commit = "0f1894de6cfddb3df8a3d6865d97b947af56f995", + sha256 = "91146e22771a0cb5cee3dbb0f4c53c4fe868759d6c346134da3669a15986c8c1", + git_commit = "ea718e872df737a6ee69f53a8f9b212c9c8197ec", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b94f6c89335782a7f175e8973c4f326375c55120 Mon Sep 17 00:00:00 2001 From: wenboz Date: Tue, 16 Oct 2018 23:30:47 -0700 Subject: [PATCH 1439/8103] Implemented gzip uncompression support in net_http. PiperOrigin-RevId: 217447041 --- .../util/net_http/compression/gzip_zlib.cc | 7 +- .../util/net_http/compression/gzip_zlib.h | 3 + .../util/net_http/server/internal/BUILD | 4 + .../server/internal/evhttp_request.cc | 60 +++++- .../net_http/server/internal/evhttp_request.h | 16 ++ .../server/internal/evhttp_request_test.cc | 141 +++++++++++++ .../net_http/server/internal/evhttp_server.cc | 2 + .../util/net_http/server/public/BUILD | 4 + .../net_http/server/public/header_names.cc | 159 +++++++++++++++ .../net_http/server/public/header_names.h | 185 ++++++++++++++++++ .../server/public/httpserver_interface.h | 37 +++- 11 files changed, 606 insertions(+), 12 deletions(-) create mode 100644 tensorflow_serving/util/net_http/server/public/header_names.cc create mode 100644 tensorflow_serving/util/net_http/server/public/header_names.h diff --git a/tensorflow_serving/util/net_http/compression/gzip_zlib.cc b/tensorflow_serving/util/net_http/compression/gzip_zlib.cc index 5ce1aeb483d..1ce8820f0bd 100644 --- a/tensorflow_serving/util/net_http/compression/gzip_zlib.cc +++ b/tensorflow_serving/util/net_http/compression/gzip_zlib.cc @@ -44,9 +44,7 @@ namespace net_http { // XFL 2-4? DEFLATE flags // OS ???? Operating system indicator (255 means unknown) -// gzip header, as a macro for sizeof() -#define GZIP_HEADER "\037\213\010\000\000\000\000\000\002\377" - +constexpr char GZIP_HEADER[] = "\037\213\010\000\000\000\000\000\002\377"; constexpr uint8_t kMagicHeader[2] = {0x1f, 0x8b}; // gzip magic header GZipHeader::Status GZipHeader::ReadMore(const char *inbuf, int inbuf_len, @@ -808,8 +806,7 @@ int ZLib::UncompressGzipAndAllocate(Bytef **dest, uLongf *destLen, *destLen = uncompress_length; *dest = (Bytef *)malloc(*destLen); - if (*dest == nullptr) // probably a corrupted gzip buffer - return Z_MEM_ERROR; + if (*dest == nullptr) return Z_MEM_ERROR; const int retval = Uncompress(*dest, destLen, source, sourceLen); if (retval != Z_OK) { // just to make life easier for them diff --git a/tensorflow_serving/util/net_http/compression/gzip_zlib.h b/tensorflow_serving/util/net_http/compression/gzip_zlib.h index 22e0d9c393d..6ad674d9537 100644 --- a/tensorflow_serving/util/net_http/compression/gzip_zlib.h +++ b/tensorflow_serving/util/net_http/compression/gzip_zlib.h @@ -96,6 +96,9 @@ class ZLib { ZLib(); ~ZLib(); + // The max length of the buffer to store uncompressed data + static constexpr int64_t kMaxUncompressedBytes = 10 * 1024 * 1024; // 10MB + // Wipe a ZLib object to a virgin state. This differs from Reset() // in that it also breaks any dictionary, gzip, etc, state. void Reinit(); diff --git a/tensorflow_serving/util/net_http/server/internal/BUILD b/tensorflow_serving/util/net_http/server/internal/BUILD index 60fa455f9cb..52e8ab2c92b 100644 --- a/tensorflow_serving/util/net_http/server/internal/BUILD +++ b/tensorflow_serving/util/net_http/server/internal/BUILD @@ -20,12 +20,15 @@ cc_library( "server_support.h", ], deps = [ + "//tensorflow_serving/util/net_http/compression:gzip_zlib", "//tensorflow_serving/util/net_http/server/public:http_server_api", "@com_github_libevent_libevent//:libevent", "@com_google_absl//absl/base", "@com_google_absl//absl/base:core_headers", "@com_google_absl//absl/memory", + "@com_google_absl//absl/strings", "@com_google_absl//absl/synchronization", + "@zlib_archive//:zlib", ], ) @@ -55,6 +58,7 @@ cc_test( ":evhttp_server", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/util/net_http/client:evhttp_client", + "//tensorflow_serving/util/net_http/compression:gzip_zlib", "//tensorflow_serving/util/net_http/internal:fixed_thread_pool", "//tensorflow_serving/util/net_http/server/public:http_server", "//tensorflow_serving/util/net_http/server/public:http_server_api", diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_request.cc b/tensorflow_serving/util/net_http/server/internal/evhttp_request.cc index e30cc615e1d..309353a1a7b 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_request.cc +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_request.cc @@ -17,18 +17,24 @@ limitations under the License. #include "tensorflow_serving/util/net_http/server/internal/evhttp_request.h" +#include + #include #include #include #include #include "absl/base/internal/raw_logging.h" +#include "absl/strings/string_view.h" #include "libevent/include/event2/buffer.h" #include "libevent/include/event2/event.h" #include "libevent/include/event2/http.h" #include "libevent/include/event2/keyvalq_struct.h" +#include "tensorflow_serving/util/net_http/compression/gzip_zlib.h" +#include "tensorflow_serving/util/net_http/server/public/header_names.h" + namespace tensorflow { namespace serving { namespace net_http { @@ -145,10 +151,10 @@ std::unique_ptr EvHTTPRequest::ReadRequestBytes( evbuffer* input_buf = evhttp_request_get_input_buffer(parsed_request_->request); if (input_buf == nullptr) { - return nullptr; // nobody + return nullptr; // no body } - size_t* buf_size = reinterpret_cast(size); + auto buf_size = reinterpret_cast(size); *buf_size = evbuffer_get_contiguous_space(input_buf); @@ -162,11 +168,59 @@ std::unique_ptr EvHTTPRequest::ReadRequestBytes( if (ret != *buf_size) { ABSL_RAW_LOG(ERROR, "Unexpected: read less than specified num_bytes : %zu", *buf_size); + free(block); + *buf_size = 0; + return nullptr; // don't return corrupted buffer + } + + // Uncompress the entire body + if (NeedUncompressGzipContent()) { + void* new_block; + UncompressGzipContent(block, *buf_size, &new_block, buf_size); + free(block); + if (new_block != nullptr) { + block = new_block; + } else { + ABSL_RAW_LOG(ERROR, "Failed to uncompress the gzipped body"); + *buf_size = 0; + return nullptr; // don't return corrupted buffer + } } return std::unique_ptr(static_cast(block)); } +bool EvHTTPRequest::NeedUncompressGzipContent() { + if (handler_options_ != nullptr && + handler_options_->auto_uncompress_input()) { + auto content_encoding = GetRequestHeader(HTTPHeaders::CONTENT_ENCODING); + if (content_encoding != nullptr) { + return content_encoding.find("gzip") != absl::string_view::npos; + } + } + + return false; +} + +void EvHTTPRequest::UncompressGzipContent(void* input, size_t input_size, + void** uncompressed_input, + size_t* uncompressed_input_size) { + int64_t max = handler_options_->auto_uncompress_max_size() > 0 + ? handler_options_->auto_uncompress_max_size() + : ZLib::kMaxUncompressedBytes; + + // our APIs don't need expose the actual content-length + *uncompressed_input_size = static_cast(max); + + ZLib zlib; + int err = zlib.UncompressGzipAndAllocate( + reinterpret_cast(uncompressed_input), uncompressed_input_size, + reinterpret_cast(input), input_size); + if (err != Z_OK) { + ABSL_RAW_LOG(ERROR, "Got zlib error: %d", err); + } +} + // Note: passing string_view incurs a copy of underlying std::string data // (stack) absl::string_view EvHTTPRequest::GetRequestHeader( @@ -182,7 +236,7 @@ std::vector EvHTTPRequest::request_headers() const { for (evkeyval* header = ev_headers->tqh_first; header; header = header->next.tqe_next) { - result.push_back(absl::string_view(header->key)); + result.emplace_back(header->key); } return result; diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_request.h b/tensorflow_serving/util/net_http/server/internal/evhttp_request.h index 7132ff1d450..7894b368a74 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_request.h +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_request.h @@ -22,6 +22,7 @@ limitations under the License. #include #include "tensorflow_serving/util/net_http/server/internal/server_support.h" +#include "tensorflow_serving/util/net_http/server/public/httpserver_interface.h" #include "tensorflow_serving/util/net_http/server/public/server_request_interface.h" struct evbuffer; @@ -100,11 +101,26 @@ class EvHTTPRequest final : public ServerRequestInterface { // Initializes the resource and returns false if any error. bool Initialize(); + // Keeps a reference to the registered RequestHandlerOptions + void SetHandlerOptions(const RequestHandlerOptions& handler_options) { + this->handler_options_ = &handler_options; + } + private: void EvSendReply(HTTPStatusCode status); + // Returns true if the data needs be uncompressed + bool NeedUncompressGzipContent(); + + // Must set uncompressed_input to nullptr if uncompression is failed + void UncompressGzipContent(void* input, size_t input_size, + void** uncompressed_input, + size_t* uncompressed_input_size); + ServerSupport* server_; + const RequestHandlerOptions* handler_options_; + std::unique_ptr parsed_request_; evbuffer* output_buf; // owned by this diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_request_test.cc b/tensorflow_serving/util/net_http/server/internal/evhttp_request_test.cc index 4275e1bd435..402e5d465c2 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_request_test.cc +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_request_test.cc @@ -23,6 +23,7 @@ limitations under the License. #include "absl/memory/memory.h" #include "tensorflow_serving/util/net_http/client/evhttp_connection.h" +#include "tensorflow_serving/util/net_http/compression/gzip_zlib.h" #include "tensorflow_serving/util/net_http/internal/fixed_thread_pool.h" #include "tensorflow_serving/util/net_http/server/public/httpserver.h" #include "tensorflow_serving/util/net_http/server/public/httpserver_interface.h" @@ -215,6 +216,146 @@ TEST_F(EvHTTPRequestTest, ResponseHeaders) { server->WaitForTermination(); } +// === gzip support ==== + +// Test invalid gzip body +TEST_F(EvHTTPRequestTest, InvalidGzipPost) { + auto handler = [](ServerRequestInterface* request) { + int64_t num_bytes; + auto request_body = request->ReadRequestBytes(&num_bytes); + EXPECT_TRUE(request_body == nullptr); + EXPECT_EQ(0, num_bytes); + + request->Reply(); + }; + server->RegisterRequestHandler("/ok", std::move(handler), + RequestHandlerOptions()); + server->StartAcceptingRequests(); + + auto connection = + EvHTTPConnection::Connect("localhost", server->listen_port()); + ASSERT_TRUE(connection != nullptr); + + ClientRequest request = {"/ok", "POST", {}, "abcde"}; + request.headers.emplace_back("Content-Encoding", "my_gzip"); + ClientResponse response = {}; + + EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); + EXPECT_EQ(response.status, 200); + + server->Terminate(); + server->WaitForTermination(); +} + +// Test disabled gzip +TEST_F(EvHTTPRequestTest, DisableGzipPost) { + auto handler = [](ServerRequestInterface* request) { + int64_t num_bytes; + auto request_body = request->ReadRequestBytes(&num_bytes); + EXPECT_EQ(5, num_bytes); + + request->Reply(); + }; + RequestHandlerOptions options; + options.set_auto_uncompress_input(false); + server->RegisterRequestHandler("/ok", std::move(handler), options); + server->StartAcceptingRequests(); + + auto connection = + EvHTTPConnection::Connect("localhost", server->listen_port()); + ASSERT_TRUE(connection != nullptr); + + ClientRequest request = {"/ok", "POST", {}, "abcde"}; + request.headers.emplace_back("Content-Encoding", "my_gzip"); + ClientResponse response = {}; + + EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); + EXPECT_EQ(response.status, 200); + + server->Terminate(); + server->WaitForTermination(); +} + +std::string CompressString(const char* data, size_t size) { + ZLib zlib; + std::string buf(1000, '\0'); + size_t compressed_size = buf.size(); + zlib.Compress((Bytef*)buf.data(), &compressed_size, (Bytef*)data, size); + + return std::string(buf.data(), compressed_size); +} + +// Test valid gzip body +TEST_F(EvHTTPRequestTest, ValidGzipPost) { + constexpr char kBody[] = "abcdefg12345"; + std::string compressed = CompressString(kBody, sizeof(kBody) - 1); + + auto handler = [&](ServerRequestInterface* request) { + int64_t num_bytes; + auto request_body = request->ReadRequestBytes(&num_bytes); + + std::string body_str(request_body.get(), static_cast(num_bytes)); + EXPECT_EQ(body_str, std::string(kBody)); + EXPECT_EQ(sizeof(kBody) - 1, num_bytes); + + request->Reply(); + }; + server->RegisterRequestHandler("/ok", std::move(handler), + RequestHandlerOptions()); + server->StartAcceptingRequests(); + + auto connection = + EvHTTPConnection::Connect("localhost", server->listen_port()); + ASSERT_TRUE(connection != nullptr); + + ClientRequest request = {"/ok", "POST", {}, compressed}; + request.headers.emplace_back("Content-Encoding", "my_gzip"); + ClientResponse response = {}; + + EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); + EXPECT_EQ(response.status, 200); + + server->Terminate(); + server->WaitForTermination(); +} + +// Test gzip exceeding the max uncompressed limit +TEST_F(EvHTTPRequestTest, GzipExceedingLimit) { + constexpr char kBody[] = "abcdefg12345"; + constexpr int bodySize = sizeof(kBody) - 1; + std::string compressed = CompressString(kBody, static_cast(bodySize)); + + auto handler = [&](ServerRequestInterface* request) { + int64_t num_bytes; + auto request_body = request->ReadRequestBytes(&num_bytes); + + std::string body_str(request_body.get(), static_cast(num_bytes)); + EXPECT_TRUE(request_body == nullptr); + EXPECT_EQ(0, num_bytes); + + request->Reply(); + }; + + RequestHandlerOptions options; + options.set_auto_uncompress_max_size(bodySize - 1); // not enough buffer + server->RegisterRequestHandler("/ok", std::move(handler), options); + server->StartAcceptingRequests(); + + auto connection = + EvHTTPConnection::Connect("localhost", server->listen_port()); + ASSERT_TRUE(connection != nullptr); + + ClientRequest request = {"/ok", "POST", {}, compressed}; + request.headers.emplace_back("Content-Encoding", "my_gzip"); + ClientResponse response = {}; + + EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); + EXPECT_EQ(response.status, 200); + + server->Terminate(); + server->WaitForTermination(); +} + } // namespace } // namespace net_http } // namespace serving diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc b/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc index f2f7770b7d3..8b4cb4216fa 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc @@ -139,6 +139,7 @@ void EvHTTPServer::DispatchEvRequest(evhttp_request* req) { auto handler_map_it = uri_handlers_.find(path); if (handler_map_it != uri_handlers_.end()) { + ev_request->SetHandlerOptions(handler_map_it->second.options); IncOps(); dispatched = true; ScheduleHandlerReference(handler_map_it->second.handler, @@ -151,6 +152,7 @@ void EvHTTPServer::DispatchEvRequest(evhttp_request* req) { if (handler == nullptr) { continue; } + ev_request->SetHandlerOptions(dispatcher.options); IncOps(); dispatched = true; ScheduleHandler(std::move(handler), ev_request.release()); diff --git a/tensorflow_serving/util/net_http/server/public/BUILD b/tensorflow_serving/util/net_http/server/public/BUILD index c6a75b8f615..513c88cbc0a 100644 --- a/tensorflow_serving/util/net_http/server/public/BUILD +++ b/tensorflow_serving/util/net_http/server/public/BUILD @@ -11,7 +11,11 @@ licenses(["notice"]) # Apache 2.0 cc_library( name = "http_server_api", + srcs = [ + "header_names.cc", + ], hdrs = [ + "header_names.h", "httpserver_interface.h", "response_code_enum.h", "server_request_interface.h", diff --git a/tensorflow_serving/util/net_http/server/public/header_names.cc b/tensorflow_serving/util/net_http/server/public/header_names.cc new file mode 100644 index 00000000000..9eaa71cd314 --- /dev/null +++ b/tensorflow_serving/util/net_http/server/public/header_names.cc @@ -0,0 +1,159 @@ +/* Copyright 2018 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow_serving/util/net_http/server/public/header_names.h" + +namespace tensorflow { +namespace serving { +namespace net_http { + +// Standard header names + +const char HTTPHeaders::ACCEPT[] = "Accept"; +const char HTTPHeaders::ACCEPT_CHARSET[] = "Accept-Charset"; +const char HTTPHeaders::ACCEPT_ENCODING[] = "Accept-Encoding"; +const char HTTPHeaders::ACCEPT_LANGUAGE[] = "Accept-Language"; +const char HTTPHeaders::ACCEPT_RANGES[] = "Accept-Ranges"; +const char HTTPHeaders::ACCESS_CONTROL_ALLOW_CREDENTIALS[] = + "Access-Control-Allow-Credentials"; +const char HTTPHeaders::ACCESS_CONTROL_ALLOW_HEADERS[] = + "Access-Control-Allow-Headers"; +const char HTTPHeaders::ACCESS_CONTROL_ALLOW_METHODS[] = + "Access-Control-Allow-Methods"; +const char HTTPHeaders::ACCESS_CONTROL_ALLOW_ORIGIN[] = + "Access-Control-Allow-Origin"; +const char HTTPHeaders::ACCESS_CONTROL_EXPOSE_HEADERS[] = + "Access-Control-Expose-Headers"; +const char HTTPHeaders::ACCESS_CONTROL_MAX_AGE[] = "Access-Control-Max-Age"; +const char HTTPHeaders::ACCESS_CONTROL_REQUEST_HEADERS[] = + "Access-Control-Request-Headers"; +const char HTTPHeaders::ACCESS_CONTROL_REQUEST_METHOD[] = + "Access-Control-Request-Method"; +const char HTTPHeaders::AGE[] = "Age"; +const char HTTPHeaders::ALLOW[] = "Allow"; +const char HTTPHeaders::AUTHORIZATION[] = "Authorization"; +const char HTTPHeaders::CACHE_CONTROL[] = "Cache-Control"; +const char HTTPHeaders::CONNECTION[] = "Connection"; +const char HTTPHeaders::CONTENT_DISPOSITION[] = "Content-Disposition"; +const char HTTPHeaders::CONTENT_ENCODING[] = "Content-Encoding"; +const char HTTPHeaders::CONTENT_LANGUAGE[] = "Content-Language"; +const char HTTPHeaders::CONTENT_LENGTH[] = "Content-Length"; +const char HTTPHeaders::CONTENT_LOCATION[] = "Content-Location"; +const char HTTPHeaders::CONTENT_RANGE[] = "Content-Range"; +const char HTTPHeaders::CONTENT_SECURITY_POLICY[] = "Content-Security-Policy"; +const char HTTPHeaders::CONTENT_SECURITY_POLICY_REPORT_ONLY[] = + "Content-Security-Policy-Report-Only"; +const char HTTPHeaders::X_CONTENT_SECURITY_POLICY[] = + "X-Content-Security-Policy"; +const char HTTPHeaders::X_CONTENT_SECURITY_POLICY_REPORT_ONLY[] = + "X-Content-Security-Policy-Report-Only"; +const char HTTPHeaders::X_WEBKIT_CSP[] = "X-WebKit-CSP"; +const char HTTPHeaders::X_WEBKIT_CSP_REPORT_ONLY[] = "X-WebKit-CSP-Report-Only"; +const char HTTPHeaders::CONTENT_TYPE[] = "Content-Type"; +const char HTTPHeaders::CONTENT_MD5[] = "Content-MD5"; +const char HTTPHeaders::X_CONTENT_TYPE_OPTIONS[] = "X-Content-Type-Options"; +const char HTTPHeaders::COOKIE[] = "Cookie"; +const char HTTPHeaders::COOKIE2[] = "Cookie2"; +const char HTTPHeaders::DATE[] = "Date"; +const char HTTPHeaders::DAV[] = "DAV"; +const char HTTPHeaders::DEPTH[] = "Depth"; +const char HTTPHeaders::DESTINATION[] = "Destination"; +const char HTTPHeaders::DNT[] = "DNT"; +const char HTTPHeaders::EARLY_DATA[] = "Early-Data"; +const char HTTPHeaders::ETAG[] = "ETag"; +const char HTTPHeaders::EXPECT[] = "Expect"; +const char HTTPHeaders::EXPIRES[] = "Expires"; +const char HTTPHeaders::FOLLOW_ONLY_WHEN_PRERENDER_SHOWN[] = + "Follow-Only-When-Prerender-Shown"; +const char HTTPHeaders::FORWARDED[] = "Forwarded"; +const char HTTPHeaders::FROM[] = "From"; +const char HTTPHeaders::HOST[] = "Host"; +const char HTTPHeaders::HTTP2_SETTINGS[] = "HTTP2-Settings"; +const char HTTPHeaders::IF[] = "If"; +const char HTTPHeaders::IF_MATCH[] = "If-Match"; +const char HTTPHeaders::IF_MODIFIED_SINCE[] = "If-Modified-Since"; +const char HTTPHeaders::IF_NONE_MATCH[] = "If-None-Match"; +const char HTTPHeaders::IF_UNMODIFIED_SINCE[] = "If-Unmodified-Since"; +const char HTTPHeaders::IF_RANGE[] = "If-Range"; +const char HTTPHeaders::KEEP_ALIVE[] = "Keep-Alive"; +const char HTTPHeaders::LABEL[] = "Label"; +const char HTTPHeaders::LAST_MODIFIED[] = "Last-Modified"; +const char HTTPHeaders::LINK[] = "Link"; +const char HTTPHeaders::LOCATION[] = "Location"; +const char HTTPHeaders::LOCK_TOKEN[] = "Lock-Token"; +const char HTTPHeaders::MAX_FORWARDS[] = "Max-Forwards"; +const char HTTPHeaders::MS_AUTHOR_VIA[] = "MS-Author-Via"; +const char HTTPHeaders::ORIGIN[] = "Origin"; +const char HTTPHeaders::OVERWRITE_HDR[] = "Overwrite"; +const char HTTPHeaders::PRAGMA[] = "Pragma"; +const char HTTPHeaders::P3P[] = "P3P"; +const char HTTPHeaders::PING_FROM[] = "Ping-From"; +const char HTTPHeaders::PING_TO[] = "Ping-To"; +const char HTTPHeaders::PROXY_CONNECTION[] = "Proxy-Connection"; +const char HTTPHeaders::PROXY_AUTHENTICATE[] = "Proxy-Authenticate"; +const char HTTPHeaders::PROXY_AUTHORIZATION[] = "Proxy-Authorization"; +const char HTTPHeaders::PUBLIC_KEY_PINS[] = "Public-Key-Pins"; +const char HTTPHeaders::PUBLIC_KEY_PINS_REPORT_ONLY[] = + "Public-Key-Pins-Report-Only"; +const char HTTPHeaders::RANGE[] = "Range"; +const char HTTPHeaders::REFERER[] = "Referer"; +const char HTTPHeaders::REFERRER_POLICY[] = "Referrer-Policy"; +const char HTTPHeaders::REFERRER_POLICY_NO_REFERRER[] = "no-referrer"; +const char HTTPHeaders::REFERRER_POLICY_NO_REFFERER_WHEN_DOWNGRADE[] = + "no-referrer-when-downgrade"; +const char HTTPHeaders::REFERRER_POLICY_SAME_ORIGIN[] = "same-origin"; +const char HTTPHeaders::REFERRER_POLICY_ORIGIN[] = "origin"; +const char HTTPHeaders::REFERRER_POLICY_STRICT_ORIGIN[] = "strict-origin"; +const char HTTPHeaders::REFERRER_POLICY_ORIGIN_WHEN_CROSS_ORIGIN[] = + "origin-when-cross-origin"; +const char HTTPHeaders::REFERRER_POLICY_STRICT_ORIGIN_WHEN_CROSS_ORIGIN[] = + "strict-origin-when-cross-origin"; +const char HTTPHeaders::REFERRER_POLICY_UNSAFE_URL[] = "unsafe-url"; +const char HTTPHeaders::REFRESH[] = "Refresh"; +const char HTTPHeaders::RETRY_AFTER[] = "Retry-After"; +const char HTTPHeaders::SEC_METADATA[] = "Sec-Metadata"; +const char HTTPHeaders::SEC_TOKEN_BINDING[] = "Sec-Token-Binding"; +const char HTTPHeaders::SEC_PROVIDED_TOKEN_BINDING_ID[] = + "Sec-Provided-Token-Binding-ID"; +const char HTTPHeaders::SEC_REFERRED_TOKEN_BINDING_ID[] = + "Sec-Referred-Token-Binding-ID"; +const char HTTPHeaders::SERVER[] = "Server"; +const char HTTPHeaders::SERVER_TIMING[] = "Server-Timing"; +const char HTTPHeaders::SERVICE_WORKER[] = "Service-Worker"; +const char HTTPHeaders::SERVICE_WORKER_ALLOWED[] = "Service-Worker-Allowed"; +const char HTTPHeaders::SERVICE_WORKER_NAVIGATION_PRELOAD[] = + "Service-Worker-Navigation-Preload"; +const char HTTPHeaders::SET_COOKIE[] = "Set-Cookie"; +const char HTTPHeaders::SET_COOKIE2[] = "Set-Cookie2"; +const char HTTPHeaders::STATUS_URI[] = "Status-URI"; +const char HTTPHeaders::STRICT_TRANSPORT_SECURITY[] = + "Strict-Transport-Security"; +const char HTTPHeaders::TIMEOUT[] = "Timeout"; +const char HTTPHeaders::TIMING_ALLOW_ORIGIN[] = "Timing-Allow-Origin"; +const char HTTPHeaders::TK[] = "Tk"; +const char HTTPHeaders::TRAILER[] = "Trailer"; +const char HTTPHeaders::TRAILERS[] = "Trailers"; +const char HTTPHeaders::TRANSFER_ENCODING[] = "Transfer-Encoding"; +const char HTTPHeaders::TRANSFER_ENCODING_ABBRV[] = "TE"; +const char HTTPHeaders::UPGRADE[] = "Upgrade"; +const char HTTPHeaders::USER_AGENT[] = "User-Agent"; +const char HTTPHeaders::VARY[] = "Vary"; +const char HTTPHeaders::VIA[] = "Via"; +const char HTTPHeaders::WARNING[] = "Warning"; +const char HTTPHeaders::WWW_AUTHENTICATE[] = "WWW-Authenticate"; + +} // namespace net_http +} // namespace serving +} // namespace tensorflow diff --git a/tensorflow_serving/util/net_http/server/public/header_names.h b/tensorflow_serving/util/net_http/server/public/header_names.h new file mode 100644 index 00000000000..34312820d4a --- /dev/null +++ b/tensorflow_serving/util/net_http/server/public/header_names.h @@ -0,0 +1,185 @@ +/* Copyright 2018 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_SERVING_UTIL_NET_HTTP_SERVER_PUBLIC_HEADER_NAMES_H_ +#define TENSORFLOW_SERVING_UTIL_NET_HTTP_SERVER_PUBLIC_HEADER_NAMES_H_ + +namespace tensorflow { +namespace serving { +namespace net_http { + +// Standard HTTP Header Names +// +// http://www.iana.org/assignments/message-headers +class HTTPHeaders { + public: + HTTPHeaders() = delete; + + static const char ACCEPT[]; + static const char ACCEPT_CHARSET[]; + static const char ACCEPT_ENCODING[]; + static const char ACCEPT_LANGUAGE[]; + static const char ACCEPT_RANGES[]; + static const char ACCESS_CONTROL_ALLOW_CREDENTIALS[]; + static const char ACCESS_CONTROL_ALLOW_HEADERS[]; + static const char ACCESS_CONTROL_ALLOW_METHODS[]; + static const char ACCESS_CONTROL_ALLOW_ORIGIN[]; + static const char ACCESS_CONTROL_EXPOSE_HEADERS[]; + static const char ACCESS_CONTROL_MAX_AGE[]; + static const char ACCESS_CONTROL_REQUEST_HEADERS[]; + static const char ACCESS_CONTROL_REQUEST_METHOD[]; + static const char AGE[]; + static const char ALLOW[]; + static const char AUTHORIZATION[]; + static const char CACHE_CONTROL[]; + static const char CONNECTION[]; + static const char CONTENT_DISPOSITION[]; + static const char CONTENT_ENCODING[]; + static const char CONTENT_LANGUAGE[]; + static const char CONTENT_LENGTH[]; + static const char CONTENT_LOCATION[]; + static const char CONTENT_RANGE[]; + // http://w3.org/TR/CSP/#content-security-policy-header-field + static const char CONTENT_SECURITY_POLICY[]; + // http://w3.org/TR/CSP/#content-security-policy-report-only-header-field + static const char CONTENT_SECURITY_POLICY_REPORT_ONLY[]; + // A nonstandard CSP header that was introduced for CSP v.1 + // https://www.w3.org/TR/2011/WD-CSP-20111129/ and used by the Firefox until + // version 23 and the Internet Explorer version 10. + // Please, use CONTENT_SECURITY_POLICY to pass the CSP. + static const char X_CONTENT_SECURITY_POLICY[]; + // A nonstandard CSP header that was introduced for CSP v.1 + // https://www.w3.org/TR/2011/WD-CSP-20111129/ and used by the Firefox until + // version 23 and Internet Explorer version 10. + // Please, use CONTENT_SECURITY_POLICY_REPORT_ONLY to pass the CSP. + static const char X_CONTENT_SECURITY_POLICY_REPORT_ONLY[]; + // A nonstandard CSP header that was introduced for CSP v.1 + // https://www.w3.org/TR/2011/WD-CSP-20111129/ and used by the Chrome until + // version 25. Please, use CONTENT_SECURITY_POLICY to pass the CSP. + static const char X_WEBKIT_CSP[]; + // A nonstandard CSP header that was introduced for CSP v.1 + // https://www.w3.org/TR/2011/WD-CSP-20111129/ and used by the Chrome until + // version 25. + // Please, use CONTENT_SECURITY_POLICY_REPORT_ONLY to pass the CSP. + static const char X_WEBKIT_CSP_REPORT_ONLY[]; + static const char CONTENT_TYPE[]; + static const char CONTENT_MD5[]; + // A header, introduced by Microsoft, to modify how browsers + // interpret Content-Type: + // http://blogs.msdn.com/ie/archive/2008/09/02/ie8-security-part-vi-beta-2-update.aspx + static const char X_CONTENT_TYPE_OPTIONS[]; + static const char COOKIE[]; + static const char COOKIE2[]; + static const char DATE[]; + static const char DAV[]; + static const char DEPTH[]; + static const char DESTINATION[]; + static const char DNT[]; + // https://tools.ietf.org/html/rfc8470 + static const char EARLY_DATA[]; + static const char ETAG[]; + static const char EXPECT[]; + static const char EXPIRES[]; + static const char FOLLOW_ONLY_WHEN_PRERENDER_SHOWN[]; + // Supersedes X-Forwarded-For (https://tools.ietf.org/html/rfc7239). + static const char FORWARDED[]; + static const char FROM[]; + static const char HOST[]; + // http://httpwg.org/specs/rfc7540.html#Http2SettingsHeader + static const char HTTP2_SETTINGS[]; + static const char IF[]; + static const char IF_MATCH[]; + static const char IF_MODIFIED_SINCE[]; + static const char IF_NONE_MATCH[]; + static const char IF_RANGE[]; + static const char IF_UNMODIFIED_SINCE[]; + static const char KEEP_ALIVE[]; + static const char LABEL[]; + static const char LAST_MODIFIED[]; + static const char LINK[]; + static const char LOCATION[]; + static const char LOCK_TOKEN[]; + static const char MAX_FORWARDS[]; + static const char MS_AUTHOR_VIA[]; + static const char ORIGIN[]; + static const char OVERWRITE_HDR[]; + static const char P3P[]; + // http://html.spec.whatwg.org/multipage/semantics.html#hyperlink-auditing + static const char PING_FROM[]; + // http://html.spec.whatwg.org/multipage/semantics.html#hyperlink-auditing + static const char PING_TO[]; + static const char PRAGMA[]; + static const char PROXY_CONNECTION[]; + static const char PROXY_AUTHENTICATE[]; + static const char PROXY_AUTHORIZATION[]; + // http://tools.ietf.org/html/draft-ietf-websec-key-pinning + static const char PUBLIC_KEY_PINS[]; + static const char PUBLIC_KEY_PINS_REPORT_ONLY[]; + static const char RANGE[]; + static const char REFERER[]; + // https://www.w3.org/TR/referrer-policy/ + static const char REFERRER_POLICY[]; + static const char REFERRER_POLICY_NO_REFERRER[]; + static const char REFERRER_POLICY_NO_REFFERER_WHEN_DOWNGRADE[]; + static const char REFERRER_POLICY_SAME_ORIGIN[]; + static const char REFERRER_POLICY_ORIGIN[]; + static const char REFERRER_POLICY_STRICT_ORIGIN[]; + static const char REFERRER_POLICY_ORIGIN_WHEN_CROSS_ORIGIN[]; + static const char REFERRER_POLICY_STRICT_ORIGIN_WHEN_CROSS_ORIGIN[]; + static const char REFERRER_POLICY_UNSAFE_URL[]; + static const char REFRESH[]; + static const char RETRY_AFTER[]; + // https://github.com/mikewest/sec-metadata + static const char SEC_METADATA[]; + // https://tools.ietf.org/html/draft-ietf-tokbind-https + static const char SEC_TOKEN_BINDING[]; + // https://tools.ietf.org/html/draft-ietf-tokbind-ttrp + static const char SEC_PROVIDED_TOKEN_BINDING_ID[]; + static const char SEC_REFERRED_TOKEN_BINDING_ID[]; + static const char SERVER[]; + // https://www.w3.org/TR/server-timing/ + static const char SERVER_TIMING[]; + // https://www.w3.org/TR/service-workers/#update-algorithm + static const char SERVICE_WORKER[]; + static const char SERVICE_WORKER_ALLOWED[]; + // https://developers.google.com/web/updates/2017/02/navigation-preload + static const char SERVICE_WORKER_NAVIGATION_PRELOAD[]; + static const char SET_COOKIE[]; + static const char SET_COOKIE2[]; + static const char STATUS_URI[]; + // HSTS http://tools.ietf.org/html/draft-ietf-websec-strict-transport-sec + static const char STRICT_TRANSPORT_SECURITY[]; + static const char TIMEOUT[]; + // http://www.w3.org/TR/2011/WD-resource-timing-20110524/#cross-origin-resources + static const char TIMING_ALLOW_ORIGIN[]; + // http://www.w3.org/2011/tracking-protection/drafts/tracking-dnt.html#response-header-field + static const char TK[]; + static const char TRAILER[]; + static const char TRAILERS[]; + static const char TRANSFER_ENCODING[]; + static const char TRANSFER_ENCODING_ABBRV[]; + static const char UPGRADE[]; + static const char USER_AGENT[]; + static const char VARY[]; + static const char VIA[]; + static const char WARNING[]; + static const char WWW_AUTHENTICATE[]; +}; + +} // namespace net_http +} // namespace serving +} // namespace tensorflow + +#endif // TENSORFLOW_SERVING_UTIL_NET_HTTP_SERVER_PUBLIC_HEADER_NAMES_H_ diff --git a/tensorflow_serving/util/net_http/server/public/httpserver_interface.h b/tensorflow_serving/util/net_http/server/public/httpserver_interface.h index 5ddcd8a29b3..fe561d755d4 100644 --- a/tensorflow_serving/util/net_http/server/public/httpserver_interface.h +++ b/tensorflow_serving/util/net_http/server/public/httpserver_interface.h @@ -67,9 +67,9 @@ class ServerOptions { executor_ = std::move(executor); } - const std::vector& ports() { return ports_; } + const std::vector& ports() const { return ports_; } - EventExecutor* executor() { return executor_.get(); } + EventExecutor* executor() const { return executor_.get(); } private: std::vector ports_; @@ -82,10 +82,39 @@ class RequestHandlerOptions { public: RequestHandlerOptions() = default; + RequestHandlerOptions(const RequestHandlerOptions&) = default; + RequestHandlerOptions& operator=(const RequestHandlerOptions&) = default; + + // Sets the max length of uncompressed data when uncompressing a request body + inline RequestHandlerOptions& set_auto_uncompress_max_size(int64_t size) { + auto_uncompress_max_size_ = size; + return *this; + } + + // The max length of uncompressed data when doing uncompress. Returns 0 if + // not set. See Zlib::kMaxUncompressedBytes for the default config. + inline int64_t auto_uncompress_max_size() const { + return auto_uncompress_max_size_; + } + + // The auto_uncompress_input option specifies whether the request + // input data should be uncompressed if the request has the + // Content-Encoding: .*gzip.* header. The option defaults to true. + inline RequestHandlerOptions& set_auto_uncompress_input( + bool should_uncompress) { + auto_uncompress_input_ = should_uncompress; + return *this; + } + + inline bool auto_uncompress_input() const { return auto_uncompress_input_; } + private: - // Potential options: compression, CORS rules, streaming control + // To be added: compression, CORS rules, streaming control // thread executor, admission control, limits ... - // with public setter/getters. + + bool auto_uncompress_input_ = true; + + int64_t auto_uncompress_max_size_ = 0; }; // A request handler is registered by the application to handle a request From 69ad5b2bb458cf21b856af09f5f33e6a7f5e3c86 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Oct 2018 00:02:24 -0700 Subject: [PATCH 1440/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217448984 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5c7e1632bd2..00c8bcc253f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "91146e22771a0cb5cee3dbb0f4c53c4fe868759d6c346134da3669a15986c8c1", - git_commit = "ea718e872df737a6ee69f53a8f9b212c9c8197ec", + sha256 = "88f48885aa2073ad210e5106ddaf8eacd52b70beceda08f3cac29aa2e40f6c70", + git_commit = "24294c62886b6666cf6e60982deccc2a318dfed4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 16b41247eaef618ba1c5bc66ec7b0285503435c1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Oct 2018 04:02:02 -0700 Subject: [PATCH 1441/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217491002 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 00c8bcc253f..0d4a3ca45a6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "88f48885aa2073ad210e5106ddaf8eacd52b70beceda08f3cac29aa2e40f6c70", - git_commit = "24294c62886b6666cf6e60982deccc2a318dfed4", + sha256 = "6f3d34b64ff070abe348826d8c05a1a2daf13ec94155684a33e962b183553d56", + git_commit = "7bcbcc1392516a2b2d7a7abae2ccce7091c8dae3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 890709ad4fcc022329e743ee734cc2f391c64e38 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Oct 2018 12:02:21 -0700 Subject: [PATCH 1442/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217562082 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0d4a3ca45a6..8e6f3c3fe5b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6f3d34b64ff070abe348826d8c05a1a2daf13ec94155684a33e962b183553d56", - git_commit = "7bcbcc1392516a2b2d7a7abae2ccce7091c8dae3", + sha256 = "3f7e20fa2c03352c39c570f251e70aa8d25a00a77cce77f6d10966c2278ce715", + git_commit = "9a20e435c5b4b941fd7014342b7a359e5c6cdd6b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 37e6268934c83d36b921b4a2ed4ff1c8d213716b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Oct 2018 12:06:54 -0700 Subject: [PATCH 1443/8103] PiperOrigin-RevId: 217563115 --- tensorflow_serving/serving.bzl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/serving.bzl b/tensorflow_serving/serving.bzl index a56ea39498b..b9306d1d366 100644 --- a/tensorflow_serving/serving.bzl +++ b/tensorflow_serving/serving.bzl @@ -5,7 +5,7 @@ def serving_proto_library(name, srcs=[], has_services=False, deps=[], visibility=None, testonly=0, # pylint: disable=unused-argument cc_grpc_version = None, cc_api_version=2, go_api_version=2, - java_api_version=2, js_api_version=2, + java_api_version=2, py_api_version=2): native.filegroup(name=name + "_proto_srcs", srcs=srcs, From 84412f029d66c7a61aab72ee585bd297c2bb6f36 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Oct 2018 13:02:33 -0700 Subject: [PATCH 1444/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217572606 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8e6f3c3fe5b..eb1fd104a99 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3f7e20fa2c03352c39c570f251e70aa8d25a00a77cce77f6d10966c2278ce715", - git_commit = "9a20e435c5b4b941fd7014342b7a359e5c6cdd6b", + sha256 = "cce243522b2af2a6f292f02ceaf624ec89ced53bbc9c570d539a33e654d6377f", + git_commit = "75154000c2edf8d67500afba12f0a7b5c410c12f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e8c8ede6f576a4387e5b0e7b0db297aae0d6f1f4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Oct 2018 14:01:37 -0700 Subject: [PATCH 1445/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217582976 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index eb1fd104a99..02e9f3cdc06 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cce243522b2af2a6f292f02ceaf624ec89ced53bbc9c570d539a33e654d6377f", - git_commit = "75154000c2edf8d67500afba12f0a7b5c410c12f", + sha256 = "799c996d725f825ea91d48e2482ad23c8e2f4b1fe4e409c71f24e3385d254db0", + git_commit = "6cd6115a7be5d9d87ab9ecaa5c75c6270c9061a7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9059fb90c5ad61d5a3fe57f71a71a81c92f6fdc2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Oct 2018 15:02:12 -0700 Subject: [PATCH 1446/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217594322 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 02e9f3cdc06..6ca6339b49b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "799c996d725f825ea91d48e2482ad23c8e2f4b1fe4e409c71f24e3385d254db0", - git_commit = "6cd6115a7be5d9d87ab9ecaa5c75c6270c9061a7", + sha256 = "8b314df68046895e129ab1db524fdbda41c5bc621e90508af7c5c43a3ae01dda", + git_commit = "0a9f327e2de9522e58480c7420567f6e78f0b6b8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6db2149991cca12bd957e704bed3d28676234bed Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Oct 2018 16:02:27 -0700 Subject: [PATCH 1447/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217605729 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6ca6339b49b..607991ebc1a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8b314df68046895e129ab1db524fdbda41c5bc621e90508af7c5c43a3ae01dda", - git_commit = "0a9f327e2de9522e58480c7420567f6e78f0b6b8", + sha256 = "4ce7e0ed7c13ce08cee1e3d28065277c95ffd06a19399038c525b530948d886c", + git_commit = "dc5bf64549c605e59b646379ac88e7d5d5e8f3b9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0c0394464d606ba68845df00d1f5e38e18bc3f3e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Oct 2018 17:02:00 -0700 Subject: [PATCH 1448/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217615594 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 607991ebc1a..4ad1f877636 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4ce7e0ed7c13ce08cee1e3d28065277c95ffd06a19399038c525b530948d886c", - git_commit = "dc5bf64549c605e59b646379ac88e7d5d5e8f3b9", + sha256 = "82acbe552b39cd998d90a9bf08e78e430ae68e429626578298b3fba041bbcc70", + git_commit = "1868b6cd16e18e371acc4afc454593f7c1d3ff5e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5c1f6f086bb3eb09e0dd7fbc05816b731abb9eb1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Oct 2018 18:01:44 -0700 Subject: [PATCH 1449/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217622888 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4ad1f877636..e06b96fba13 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "82acbe552b39cd998d90a9bf08e78e430ae68e429626578298b3fba041bbcc70", - git_commit = "1868b6cd16e18e371acc4afc454593f7c1d3ff5e", + sha256 = "f62c2dd11ebe2eba83627a6db77a0cfcdfad7107a45681ecb6365f83f18dfebd", + git_commit = "a54150fe9571c713e45a3f2828fbaf5d18dda3d3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0fb864f0ce383b71431398afb7c4435d576382bf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Oct 2018 19:02:06 -0700 Subject: [PATCH 1450/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217628777 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e06b96fba13..283852a24db 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f62c2dd11ebe2eba83627a6db77a0cfcdfad7107a45681ecb6365f83f18dfebd", - git_commit = "a54150fe9571c713e45a3f2828fbaf5d18dda3d3", + sha256 = "5ccc638d117308bf1845505929f89a133a51909b74c35af1c2b20370bf61590e", + git_commit = "7e0257d953401288bc10dc11d07b418371bbc56d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0eaf90e72915d3ef989da8175dc1cb6bf85ec943 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Oct 2018 20:01:49 -0700 Subject: [PATCH 1451/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217633339 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 283852a24db..d1ff3232fca 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5ccc638d117308bf1845505929f89a133a51909b74c35af1c2b20370bf61590e", - git_commit = "7e0257d953401288bc10dc11d07b418371bbc56d", + sha256 = "12cc64ce1c2db6cda94e470cd6843333bf3ccafa090fc0b4abeec850a47392d2", + git_commit = "aaaf1908758c2c1fadf534b6dccf6fdea1bdc18b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4967933458cba7ff1dc534a0815e3eb49ddc9711 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Oct 2018 22:01:46 -0700 Subject: [PATCH 1452/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217642748 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d1ff3232fca..b366fe510d8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "12cc64ce1c2db6cda94e470cd6843333bf3ccafa090fc0b4abeec850a47392d2", - git_commit = "aaaf1908758c2c1fadf534b6dccf6fdea1bdc18b", + sha256 = "c6ea649d82da19a1037d2baff3c38bc7bd2136230f80de0aac89ce9d338c05d9", + git_commit = "2a81cf99d22c3a0d551e68805bb4b021fbfcb860", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7eb323b66a45733f7439322f813c628d5756ce17 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Oct 2018 23:02:15 -0700 Subject: [PATCH 1453/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217647272 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b366fe510d8..e7903ef8c05 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c6ea649d82da19a1037d2baff3c38bc7bd2136230f80de0aac89ce9d338c05d9", - git_commit = "2a81cf99d22c3a0d551e68805bb4b021fbfcb860", + sha256 = "044212bd94ecef136647102f9c8c168147b3d28c75208d61b0778718a2e540a4", + git_commit = "c3b42c815ca49461bb667b667546690e0d4200d2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8a5345f5b9744605866250ad15ef45ab18234981 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Oct 2018 00:01:57 -0700 Subject: [PATCH 1454/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217651705 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e7903ef8c05..c8a887155ab 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "044212bd94ecef136647102f9c8c168147b3d28c75208d61b0778718a2e540a4", - git_commit = "c3b42c815ca49461bb667b667546690e0d4200d2", + sha256 = "8da73dfd76876755dc36ecbe1ad8ef9d39da4b8dd78e3f953f2d996a0fa81202", + git_commit = "0918aa74153664dbc61604af3cf0d66eb334c7ce", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fa7410e5660056918a8fd7e5b2203c47437664b8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Oct 2018 04:01:57 -0700 Subject: [PATCH 1455/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217675533 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c8a887155ab..3b3f228ddc0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8da73dfd76876755dc36ecbe1ad8ef9d39da4b8dd78e3f953f2d996a0fa81202", - git_commit = "0918aa74153664dbc61604af3cf0d66eb334c7ce", + sha256 = "4d5f4c19d843d2d94ddd3da1e98ee3c554d9206079184b70a2a6096955659a9a", + git_commit = "14f0af7f4bf2473a75163a7b2412cc462600b5e9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c3e6f33dcc9d5b7e95bac2cb9cf08f92541015b0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Oct 2018 09:02:03 -0700 Subject: [PATCH 1456/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217709091 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3b3f228ddc0..4263741290d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4d5f4c19d843d2d94ddd3da1e98ee3c554d9206079184b70a2a6096955659a9a", - git_commit = "14f0af7f4bf2473a75163a7b2412cc462600b5e9", + sha256 = "3f4c5595d35bdf073c253bc7edb282b145bb2db8a69dc98021cbf2d39f0cce62", + git_commit = "37080f543c4b85d58cd5173a310995592ecec832", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 61b44ed81097a51d9389ad2b18d2a7b36f110f88 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Oct 2018 10:01:59 -0700 Subject: [PATCH 1457/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217719667 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4263741290d..466d0fbd840 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3f4c5595d35bdf073c253bc7edb282b145bb2db8a69dc98021cbf2d39f0cce62", - git_commit = "37080f543c4b85d58cd5173a310995592ecec832", + sha256 = "52dc0557061ec648a3809189351ca7c6dd5ccc40bd5c5ad5d40e7a4e0d97fbe6", + git_commit = "c9598f9b1879af82537cfeaff50d01c8fb04cd79", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a010bd7d7c1f2bbe2c2cbff3b221fc8e0efd9612 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Oct 2018 14:01:52 -0700 Subject: [PATCH 1458/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217764181 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 466d0fbd840..2c10a06cfb3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "52dc0557061ec648a3809189351ca7c6dd5ccc40bd5c5ad5d40e7a4e0d97fbe6", - git_commit = "c9598f9b1879af82537cfeaff50d01c8fb04cd79", + sha256 = "39d968c1f814f17bb080c3943a6bd4cc7b1a531fa7ed2a5a7ee785ed42e8ee9f", + git_commit = "670ecb73f4e2c99ff7804760ac66051319dece74", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 32b0670f43fa8f85cabf98201fe15e9b1b643bdb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Oct 2018 16:01:53 -0700 Subject: [PATCH 1459/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217785536 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2c10a06cfb3..a92fae1dc92 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "39d968c1f814f17bb080c3943a6bd4cc7b1a531fa7ed2a5a7ee785ed42e8ee9f", - git_commit = "670ecb73f4e2c99ff7804760ac66051319dece74", + sha256 = "3062d321eec46558d75983d60348a7ec5a21546357d1ee0407794425a09391d7", + git_commit = "441c7775c1266e87fda35aac5faea90a7b324c94", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 32e569faa6fb89d653f266f3e403956ac33c3070 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Oct 2018 17:02:31 -0700 Subject: [PATCH 1460/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217794797 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a92fae1dc92..13530f34a05 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3062d321eec46558d75983d60348a7ec5a21546357d1ee0407794425a09391d7", - git_commit = "441c7775c1266e87fda35aac5faea90a7b324c94", + sha256 = "b49c19586afa1c1bbce700d659cb7aa76a1686813972d2fd3cac4b36f06a78d2", + git_commit = "55a4b150ec417cd9b771c33a363d6b969294b3eb", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b14866458a6bc2d31579e18c3081d4d8e9e56d57 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Oct 2018 18:01:58 -0700 Subject: [PATCH 1461/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217801761 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 13530f34a05..8572d13d1b5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b49c19586afa1c1bbce700d659cb7aa76a1686813972d2fd3cac4b36f06a78d2", - git_commit = "55a4b150ec417cd9b771c33a363d6b969294b3eb", + sha256 = "86f6b22153e417430be4acf48153e09b71ea58cd8e10f3c59410ebe192c97e68", + git_commit = "11c4c33f51a9154092bed984c8981f2ec73ebd8f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7bd1546f911243d581d2fe0d6eab73583639c614 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Oct 2018 19:02:16 -0700 Subject: [PATCH 1462/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217807595 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8572d13d1b5..3fbe8e0e250 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "86f6b22153e417430be4acf48153e09b71ea58cd8e10f3c59410ebe192c97e68", - git_commit = "11c4c33f51a9154092bed984c8981f2ec73ebd8f", + sha256 = "24197e4f4e6e2df4bbdb02ba1d42b00d014473c3d811bf2be9512f08f3b3c023", + git_commit = "6e45e6ae21529ffebd4c0856cb1c2c8a278bf780", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1564fbf8885844b7f0737f5ffe2ebd5a73ab7cb8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Oct 2018 20:01:57 -0700 Subject: [PATCH 1463/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217811636 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3fbe8e0e250..bff46d22bb2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "24197e4f4e6e2df4bbdb02ba1d42b00d014473c3d811bf2be9512f08f3b3c023", - git_commit = "6e45e6ae21529ffebd4c0856cb1c2c8a278bf780", + sha256 = "076cda58385a5a787d27850c8cac879939ad6a70e2299cb1363fbe956acc32f4", + git_commit = "cf2c1478026a30c8ccb496fc04efb64da77024b9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b2e3d76aae2f3b79036c0389a127ce1706a57ed7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Oct 2018 00:02:13 -0700 Subject: [PATCH 1464/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217828174 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bff46d22bb2..c83206eb9c6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "076cda58385a5a787d27850c8cac879939ad6a70e2299cb1363fbe956acc32f4", - git_commit = "cf2c1478026a30c8ccb496fc04efb64da77024b9", + sha256 = "5df45f8f99b0876037a8077152fe159a020b78315e73a3c784a5877f9f894c51", + git_commit = "25b1195bae31b1fe379b740b0bf29e86f93c1fb6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 61202878ea2fc5b776993e56a092997452fe8ccd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Oct 2018 02:01:43 -0700 Subject: [PATCH 1465/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217840018 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c83206eb9c6..b17041fe336 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5df45f8f99b0876037a8077152fe159a020b78315e73a3c784a5877f9f894c51", - git_commit = "25b1195bae31b1fe379b740b0bf29e86f93c1fb6", + sha256 = "848a0307b76446fcdd5cef22b0163eb09b2ed1715aa59ee621f9f80d7940c256", + git_commit = "3a98128fc086432f2b3704e63df640007cc4ec81", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6d752718bd6eba07d69aa679d6373d13615ee097 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Oct 2018 03:02:33 -0700 Subject: [PATCH 1466/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217845521 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b17041fe336..2dca6feaa85 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "848a0307b76446fcdd5cef22b0163eb09b2ed1715aa59ee621f9f80d7940c256", - git_commit = "3a98128fc086432f2b3704e63df640007cc4ec81", + sha256 = "679ddd71c948c8f6ea3e2ed4a0f77ab23952f03e72c787726dca1ed37ab153d0", + git_commit = "8d475d2e33d056a5f25a482c28c0b7d62d59e40d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6b535aa4f36303ebea2c4b27ce2496010ffe3a4c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Oct 2018 09:02:33 -0700 Subject: [PATCH 1467/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217877706 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2dca6feaa85..c053c0b82e4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "679ddd71c948c8f6ea3e2ed4a0f77ab23952f03e72c787726dca1ed37ab153d0", - git_commit = "8d475d2e33d056a5f25a482c28c0b7d62d59e40d", + sha256 = "793ef03c37cc6c78e17fcf66d769fb042f1448dfb9a27acd2c6383dc793fe144", + git_commit = "86d50a4ebc018c793ba626e5a8fcacdbba987198", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 99d32fc8379cfb1082894b1ac4e4602784aa1264 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Oct 2018 10:01:56 -0700 Subject: [PATCH 1468/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217885996 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c053c0b82e4..6b8b8accb34 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "793ef03c37cc6c78e17fcf66d769fb042f1448dfb9a27acd2c6383dc793fe144", - git_commit = "86d50a4ebc018c793ba626e5a8fcacdbba987198", + sha256 = "c218c15d4780f32d2f5447b2e4022a663c6163096709ea68e847762362918851", + git_commit = "7a790da2f5431fb07818577aa65e58811cad7caa", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From be7c70d779a39fad73a535185a4f4f991c1d859a Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Fri, 19 Oct 2018 10:29:00 -0700 Subject: [PATCH 1469/8103] Fix GPU build Fixes https://github.com/tensorflow/serving/issues/1150 PiperOrigin-RevId: 217890974 --- tensorflow_serving/tools/docker/Dockerfile.devel-gpu | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 6cfb90066d2..5df4a35e18d 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -155,7 +155,7 @@ RUN echo "Building with Bazel options: ${TF_SERVING_BAZEL_OPTIONS}" RUN ln -s /usr/local/cuda/lib64/stubs/libcuda.so /usr/local/cuda/lib64/stubs/libcuda.so.1 && \ LD_LIBRARY_PATH=/usr/local/cuda/lib64/stubs:${LD_LIBRARY_PATH} \ - bazel build --color=yes --curses=yes --config=cuda \ + bazel build --color=yes --curses=yes --config=cuda --copt="-fPIC"\ ${TF_SERVING_BAZEL_OPTIONS} \ --verbose_failures \ --output_filter=DONT_MATCH_ANYTHING \ From ce5a5c93d8573e490a43314d7841d60e5a5bad43 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Oct 2018 11:02:32 -0700 Subject: [PATCH 1470/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217897023 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6b8b8accb34..954c3298a46 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c218c15d4780f32d2f5447b2e4022a663c6163096709ea68e847762362918851", - git_commit = "7a790da2f5431fb07818577aa65e58811cad7caa", + sha256 = "277ce1abd0c234ba160731c1594b93e766d65ec88681669499a7c60a68f27f2e", + git_commit = "4d0939bb192723cb7aa0f74a584f526153846d99", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 34a52bf2af672fb72e1002723df1928281e3583f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Oct 2018 12:01:56 -0700 Subject: [PATCH 1471/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217908346 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 954c3298a46..2219a61a174 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "277ce1abd0c234ba160731c1594b93e766d65ec88681669499a7c60a68f27f2e", - git_commit = "4d0939bb192723cb7aa0f74a584f526153846d99", + sha256 = "90a82eb94fbff5a6cad7877e5241c788c11a4bc81de064598b7f89d71ed6c795", + git_commit = "1c9ffa14f5034a3e36beec7bbd98636fd1e1cabf", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2c645c19eba93e4e83ffd5a6ae362e784729c85a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Oct 2018 13:02:10 -0700 Subject: [PATCH 1472/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217917610 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2219a61a174..430ce86ff68 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "90a82eb94fbff5a6cad7877e5241c788c11a4bc81de064598b7f89d71ed6c795", - git_commit = "1c9ffa14f5034a3e36beec7bbd98636fd1e1cabf", + sha256 = "0efa111c76752971b247107e4e79e45f10224b73e4d2b0684ae8369f78e0156a", + git_commit = "47e56b594d5ed654a934a627e015f0be0f707e2e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2079d1bba2c2b69a6ab3f229a43c21faf75e2b19 Mon Sep 17 00:00:00 2001 From: olston Date: Fri, 19 Oct 2018 13:29:09 -0700 Subject: [PATCH 1473/8103] Remove "experimental" designation for model version labels. PiperOrigin-RevId: 217921645 --- tensorflow_serving/apis/model.proto | 1 - 1 file changed, 1 deletion(-) diff --git a/tensorflow_serving/apis/model.proto b/tensorflow_serving/apis/model.proto index 9c6427fe7d6..56493f68222 100644 --- a/tensorflow_serving/apis/model.proto +++ b/tensorflow_serving/apis/model.proto @@ -24,7 +24,6 @@ message ModelSpec { google.protobuf.Int64Value version = 2; // Use the version associated with the given label. - // EXPERIMENTAL. DO NOT USE AT THIS TIME. string version_label = 4; } From ea80fdc45bf4d8c22339beca2141201636a06d41 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Oct 2018 14:01:57 -0700 Subject: [PATCH 1474/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217926821 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 430ce86ff68..b37940cf4df 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0efa111c76752971b247107e4e79e45f10224b73e4d2b0684ae8369f78e0156a", - git_commit = "47e56b594d5ed654a934a627e015f0be0f707e2e", + sha256 = "19e26532f50ba267a6a9f8c8a87701e220f2c24bd29752e2fd2e0ddf93a3c98d", + git_commit = "34b1c5f6bc22dbb512f5d0462153042ffc6407fa", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9345832e6bb766a6d69faff7337ee741e1dc39fe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Oct 2018 15:03:00 -0700 Subject: [PATCH 1475/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217937564 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b37940cf4df..8849a9f4728 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "19e26532f50ba267a6a9f8c8a87701e220f2c24bd29752e2fd2e0ddf93a3c98d", - git_commit = "34b1c5f6bc22dbb512f5d0462153042ffc6407fa", + sha256 = "baebc5db57c60cbab0991b50cfd1d49f7bf47ead474801a4e49cab7fa3caa694", + git_commit = "607d6e0fcb21424ce922715586994468eaf7f2f0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 552c40d0028e0e86cc91827c0879096d1f8be176 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Oct 2018 16:02:13 -0700 Subject: [PATCH 1476/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217946545 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8849a9f4728..7d2d21626c7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "baebc5db57c60cbab0991b50cfd1d49f7bf47ead474801a4e49cab7fa3caa694", - git_commit = "607d6e0fcb21424ce922715586994468eaf7f2f0", + sha256 = "b3d03a7d7c908485a46eda20618814da9d8798f4fa744611b8a8fc5d9c8427b1", + git_commit = "230d0037226a6723c16de58f0ea359be8c6aca7b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 308612dd8d7e6156ba98b8eda8ace9a82f404efd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Oct 2018 17:02:07 -0700 Subject: [PATCH 1477/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217954741 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7d2d21626c7..89220d07d93 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b3d03a7d7c908485a46eda20618814da9d8798f4fa744611b8a8fc5d9c8427b1", - git_commit = "230d0037226a6723c16de58f0ea359be8c6aca7b", + sha256 = "95814411095541e8c3959c51a3c96772754bd9e52a861c0473dda379cb43fde7", + git_commit = "a1355299ec71c1f056aa12cfcc11b7cc8960598b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 70a599a09658d8c1474fa7a936545cf3e0547106 Mon Sep 17 00:00:00 2001 From: olston Date: Fri, 19 Oct 2018 17:10:23 -0700 Subject: [PATCH 1478/8103] Automated rollback of commit 2079d1bba2c2b69a6ab3f229a43c21faf75e2b19 PiperOrigin-RevId: 217955891 --- tensorflow_serving/apis/model.proto | 1 + 1 file changed, 1 insertion(+) diff --git a/tensorflow_serving/apis/model.proto b/tensorflow_serving/apis/model.proto index 56493f68222..9c6427fe7d6 100644 --- a/tensorflow_serving/apis/model.proto +++ b/tensorflow_serving/apis/model.proto @@ -24,6 +24,7 @@ message ModelSpec { google.protobuf.Int64Value version = 2; // Use the version associated with the given label. + // EXPERIMENTAL. DO NOT USE AT THIS TIME. string version_label = 4; } From fcadcba7f91892c13733bf492d8adadd231acd79 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Oct 2018 18:02:04 -0700 Subject: [PATCH 1479/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217960938 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 89220d07d93..9d88af4385d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "95814411095541e8c3959c51a3c96772754bd9e52a861c0473dda379cb43fde7", - git_commit = "a1355299ec71c1f056aa12cfcc11b7cc8960598b", + sha256 = "7414245de3346db4c2aa5ecb8b1c0e6b9c677c5614154e323b700f01223c1a5d", + git_commit = "6c3baec9b932dd7a6c692081b5695874c25df63d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f3da4d2511c1db41c48bb48ea3f9ff1d73e4f066 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Oct 2018 22:02:12 -0700 Subject: [PATCH 1480/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 217975797 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9d88af4385d..6368d22b7e9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7414245de3346db4c2aa5ecb8b1c0e6b9c677c5614154e323b700f01223c1a5d", - git_commit = "6c3baec9b932dd7a6c692081b5695874c25df63d", + sha256 = "d682b11ce17332fd087c17f29d190772de46c0d7745edd5b15fb502720558f39", + git_commit = "6802f2908445574a2ba3744dffe5765f55e4fd96", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b31b65681fa83942835909100e2fe564793908f8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 20 Oct 2018 06:01:54 -0700 Subject: [PATCH 1481/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218001980 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6368d22b7e9..d448c3860af 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d682b11ce17332fd087c17f29d190772de46c0d7745edd5b15fb502720558f39", - git_commit = "6802f2908445574a2ba3744dffe5765f55e4fd96", + sha256 = "50b3d610e4b426d321806060609cb790d768b0121e3805af60aec61fec278239", + git_commit = "0b2713a28da0375625d13854aedc78be9954ca9a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1c5c3173c0934f9a9b307fb56264d8b246ab8b3b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 20 Oct 2018 11:01:51 -0700 Subject: [PATCH 1482/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218015338 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d448c3860af..e31d055f6bf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "50b3d610e4b426d321806060609cb790d768b0121e3805af60aec61fec278239", - git_commit = "0b2713a28da0375625d13854aedc78be9954ca9a", + sha256 = "daf0c4eb236b1f6364e8b5640326d257f31cbf59a026f144d9cd6ee0af9792f8", + git_commit = "165be36baeb9d43198fa6e21a3d82b7012c147c3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8006f77b789323ee3eddf68f601539bb2d23a4a2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 20 Oct 2018 14:01:57 -0700 Subject: [PATCH 1483/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218023522 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e31d055f6bf..6271699f848 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "daf0c4eb236b1f6364e8b5640326d257f31cbf59a026f144d9cd6ee0af9792f8", - git_commit = "165be36baeb9d43198fa6e21a3d82b7012c147c3", + sha256 = "f2df6101590df8decfa217b4709808d6fee6e6804dfd81c46cafbf22558578e5", + git_commit = "4404cbf5091247bdefe5dbb199d21566629ddc96", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 551c26c05c416df93d6c37f659ca5971a19bc58b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 20 Oct 2018 15:02:27 -0700 Subject: [PATCH 1484/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218026186 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6271699f848..6b9883acbf0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f2df6101590df8decfa217b4709808d6fee6e6804dfd81c46cafbf22558578e5", - git_commit = "4404cbf5091247bdefe5dbb199d21566629ddc96", + sha256 = "0deb81ecf2489d5b33bf22b290c8fdedf059e2a4a7f2b5e713160f8d67fae7cb", + git_commit = "9d864b711e7dd29af6b180ba036836d5ffb8773f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3f1a40575a52287074973cccb3a7c007fc99fa9d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 20 Oct 2018 17:01:56 -0700 Subject: [PATCH 1485/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218031270 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6b9883acbf0..3e7da3f138d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0deb81ecf2489d5b33bf22b290c8fdedf059e2a4a7f2b5e713160f8d67fae7cb", - git_commit = "9d864b711e7dd29af6b180ba036836d5ffb8773f", + sha256 = "8feffb2209c75f473bcd54fa04269531d52dfdae826f94470e87717c5129f1e7", + git_commit = "0b370f71a7dfa7177c4c87686ff2754c2c7aba40", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 62adf03ee3acc4319b7a1b73cb39d286249f1d4f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 20 Oct 2018 18:01:58 -0700 Subject: [PATCH 1486/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218033738 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3e7da3f138d..62ffeb8e72a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8feffb2209c75f473bcd54fa04269531d52dfdae826f94470e87717c5129f1e7", - git_commit = "0b370f71a7dfa7177c4c87686ff2754c2c7aba40", + sha256 = "80c372b96cb59225f12fb872ace3209c7ca7e1d5ed42fdd6dbc6377151827996", + git_commit = "1afec5ac1fcf2aacb61d780e0c72777d1de9787a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From bbe4496a748ca581bb064121e4e68c5270840955 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 21 Oct 2018 00:02:24 -0700 Subject: [PATCH 1487/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218048600 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 62ffeb8e72a..73d80d2b745 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "80c372b96cb59225f12fb872ace3209c7ca7e1d5ed42fdd6dbc6377151827996", - git_commit = "1afec5ac1fcf2aacb61d780e0c72777d1de9787a", + sha256 = "1e473867ce9e5c6e4e692e5d6805deb013acf6f2b048713af4d74a5f1b02c12b", + git_commit = "35d795eaafa664cfc11a786fe03511e4ba5b9a0e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 48fc91bca7ed44d0465b68c6940352f06e828214 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 21 Oct 2018 01:01:57 -0700 Subject: [PATCH 1488/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218051847 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 73d80d2b745..8cae4cda78a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1e473867ce9e5c6e4e692e5d6805deb013acf6f2b048713af4d74a5f1b02c12b", - git_commit = "35d795eaafa664cfc11a786fe03511e4ba5b9a0e", + sha256 = "a6007e56437da3951346fa75867abfc03c03ae2f809d912f5ad2c350e84c687f", + git_commit = "f43d458a318d4d97298710654f1692f6e8364f82", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 355dadaada8a95e3f7d6430d22b8c031a29fb8e4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 21 Oct 2018 06:02:06 -0700 Subject: [PATCH 1489/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218066055 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8cae4cda78a..6a6f59c498d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a6007e56437da3951346fa75867abfc03c03ae2f809d912f5ad2c350e84c687f", - git_commit = "f43d458a318d4d97298710654f1692f6e8364f82", + sha256 = "bc1fc698093496ab1d99fd884de2a69140dcc19d9cf724ef2ab195bf00fd42d9", + git_commit = "7eba9315aa7522e516af2de48bd5b5d139ba8d9f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f58953152a6444409fa97819ea4cf967b93e6cd5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 21 Oct 2018 20:01:49 -0700 Subject: [PATCH 1490/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218104908 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6a6f59c498d..7931860d571 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bc1fc698093496ab1d99fd884de2a69140dcc19d9cf724ef2ab195bf00fd42d9", - git_commit = "7eba9315aa7522e516af2de48bd5b5d139ba8d9f", + sha256 = "d0039e2ed2635f2870c3af5f9a98380cf8b4ac5a6af5dae1df57575a01697af0", + git_commit = "4a5693e732b80a593bca7bf94ddd5df9e5d78cc0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 71f69c031a3f5b708c50ffec2d2cb944c9e111e1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 22 Oct 2018 04:01:50 -0700 Subject: [PATCH 1491/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218144038 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7931860d571..dc159bf96bd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d0039e2ed2635f2870c3af5f9a98380cf8b4ac5a6af5dae1df57575a01697af0", - git_commit = "4a5693e732b80a593bca7bf94ddd5df9e5d78cc0", + sha256 = "7fe3fd584fd8cb94ae4ca5b0d6c05dc6698e05b82c8065a0a84717a40e94c159", + git_commit = "0af3d95e40fb04fcff9e9dba86b95775be21440f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a17c89202e68bf19f369b9cbc97db7ced283b874 Mon Sep 17 00:00:00 2001 From: Charles Verge Date: Fri, 12 Oct 2018 22:29:29 -0300 Subject: [PATCH 1492/8103] Add error messages for specific cases when json for REST requests is not formated correctly to assist in debugging calls. Previously error messages return the same error message for * Both inputs and instances existed * Value was not an array when array expected * Empty array * When examples key was missing for method classify --- tensorflow_serving/util/json_tensor.cc | 52 +++++++++++++++------ tensorflow_serving/util/json_tensor_test.cc | 2 +- 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/tensorflow_serving/util/json_tensor.cc b/tensorflow_serving/util/json_tensor.cc index a0870b812df..a484aaf057e 100644 --- a/tensorflow_serving/util/json_tensor.cc +++ b/tensorflow_serving/util/json_tensor.cc @@ -188,11 +188,10 @@ Status Base64FormatError(const rapidjson::Value& val) { " not formatted correctly for base64 data"); } -Status FormatError(const rapidjson::Value& val) { - return errors::InvalidArgument( - "JSON Value: ", JsonValueToString(val), - " not formatted correctly. Expecting object with 'instances' or 'input'" - " key and a list/array or object as the value respectively."); +template +Status FormatError(const rapidjson::Value& val, Args&&... args) { + return errors::InvalidArgument("JSON Value: ", + JsonValueToString(val), " ", std::forward(args)...); } Status FormatSignatureError(const rapidjson::Value& val) { @@ -459,7 +458,9 @@ Status ParseJson(const absl::string_view json, rapidjson::Document* doc) { // "instances" : [ ] // ... // } - if (!doc->IsObject()) return FormatError(*doc); + if (!doc->IsObject()) { + return FormatError(*doc, "Is not object"); + } return Status::OK(); } @@ -637,14 +638,28 @@ Status FillPredictRequestFromJson( auto itr_instances = doc.FindMember(kPredictRequestInstancesKey); auto itr_inputs = doc.FindMember(kPredictRequestInputsKey); if (itr_instances != doc.MemberEnd()) { - if (itr_inputs != doc.MemberEnd()) return FormatError(doc); - if (!itr_instances->value.IsArray()) return FormatError(doc); - if (!itr_instances->value.Capacity()) return FormatError(doc); + if (itr_inputs != doc.MemberEnd()) { + return FormatError(doc, "Not formatted correctly expecting only", + " one of '", kPredictRequestInputsKey, "' or '", + kPredictRequestInstancesKey, "' keys to exist "); + } + if (!itr_instances->value.IsArray()) { + return FormatError(doc, "Excepting '", + kPredictRequestInstancesKey, "' to be an list/array"); + } + if (!itr_instances->value.Capacity()) { + return FormatError(doc, "No values in '", + kPredictRequestInstancesKey, "' array"); + } *format = JsonPredictRequestFormat::kRow; return FillTensorMapFromInstancesList(itr_instances, tensorinfo_map, request->mutable_inputs()); } else if (itr_inputs != doc.MemberEnd()) { - if (itr_instances != doc.MemberEnd()) return FormatError(doc); + if (itr_instances != doc.MemberEnd()) { + return FormatError(doc, "Not formatted correctly expecting only", + " one of '", kPredictRequestInputsKey, "' or '", + kPredictRequestInstancesKey, "' keys to exist "); + } *format = JsonPredictRequestFormat::kColumnar; return FillTensorMapFromInputsMap(itr_inputs, tensorinfo_map, request->mutable_inputs()); @@ -786,9 +801,20 @@ Status FillClassifyRegressRequestFromJson(const absl::string_view json, // Fill in list of Examples. itr = doc.FindMember(kClassifyRegressRequestExamplesKey); - if (itr == doc.MemberEnd()) return FormatError(doc); - if (!itr->value.IsArray()) return FormatError(doc); - if (!itr->value.Capacity()) return FormatError(doc); + if (itr == doc.MemberEnd()) { + return FormatError(doc, "When method is classify, key '", + kClassifyRegressRequestExamplesKey, + "' is expected and was not found"); + } + if (!itr->value.IsArray()) { + return FormatError(doc, "Expecting '", + kClassifyRegressRequestExamplesKey, + "' value to be an list/array"); + } + if (!itr->value.Capacity()) { + return FormatError(doc, "'", kClassifyRegressRequestExamplesKey, + "' value is an empty array"); + } for (const auto& val : itr->value.GetArray()) { TF_RETURN_IF_ERROR(MakeExampleFromJsonObject( val, has_context diff --git a/tensorflow_serving/util/json_tensor_test.cc b/tensorflow_serving/util/json_tensor_test.cc index 9edc46e1cb1..7e1c057e81e 100644 --- a/tensorflow_serving/util/json_tensor_test.cc +++ b/tensorflow_serving/util/json_tensor_test.cc @@ -509,7 +509,7 @@ TEST(JsontensorTest, SingleUnnamedTensorErrors) { })", getmap(infomap), &req, &format); ASSERT_TRUE(errors::IsInvalidArgument(status)); - EXPECT_THAT(status.error_message(), HasSubstr("not formatted correctly")); + EXPECT_THAT(status.error_message(), HasSubstr("Not formatted correctly")); status = FillPredictRequestFromJson(R"( { From 08a98a81d268220b42bde6d736a668e4e7ebf3b0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 22 Oct 2018 12:01:54 -0700 Subject: [PATCH 1493/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218207951 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dc159bf96bd..ee31ff97103 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7fe3fd584fd8cb94ae4ca5b0d6c05dc6698e05b82c8065a0a84717a40e94c159", - git_commit = "0af3d95e40fb04fcff9e9dba86b95775be21440f", + sha256 = "75bd28ee25e8c5c7bf571dfec812ef82808b59a9f3e1ba1f81bb9fbe10af38f5", + git_commit = "4a7b57e93d0e21e93cc718920f6e8a6f2ab1cb27", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 25ea2d6d884267b69b236329e211e80860f682d6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 22 Oct 2018 13:01:52 -0700 Subject: [PATCH 1494/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218218019 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ee31ff97103..45b316d465d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "75bd28ee25e8c5c7bf571dfec812ef82808b59a9f3e1ba1f81bb9fbe10af38f5", - git_commit = "4a7b57e93d0e21e93cc718920f6e8a6f2ab1cb27", + sha256 = "a97d722d99d8d72eb25554e2e10626d898485849a0f8c38945f6ec0084936d36", + git_commit = "2ee5ee30d69ecf5d38392786db1f54b700cd0b3e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2932374f5faa094b97ec83f210805d1de75d1ae8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 22 Oct 2018 14:02:10 -0700 Subject: [PATCH 1495/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218228986 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 45b316d465d..b427dbb8ef0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a97d722d99d8d72eb25554e2e10626d898485849a0f8c38945f6ec0084936d36", - git_commit = "2ee5ee30d69ecf5d38392786db1f54b700cd0b3e", + sha256 = "fd0c7b8e03ed2d4f06e088909fda285dc6f3034828a764f35b33be756a4e4c92", + git_commit = "71d3161aa4151c2c753c28bc31153c3b7ef5459b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From cc08f97bc75396fc8915a05b6e86cdb3374b6c6a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 22 Oct 2018 15:03:43 -0700 Subject: [PATCH 1496/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218240647 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b427dbb8ef0..7e452e1b133 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fd0c7b8e03ed2d4f06e088909fda285dc6f3034828a764f35b33be756a4e4c92", - git_commit = "71d3161aa4151c2c753c28bc31153c3b7ef5459b", + sha256 = "0eeeed6a289c33ee51def305abfe41374925ef6b927edc77fc6bd106b432e0cd", + git_commit = "5555ad1617d62c8064d9853a9e771802150dfb29", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 040d4ed0f89b8b6d58e20f389a2d75126c260afb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 22 Oct 2018 19:02:11 -0700 Subject: [PATCH 1497/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218272902 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7e452e1b133..4c1acffb362 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0eeeed6a289c33ee51def305abfe41374925ef6b927edc77fc6bd106b432e0cd", - git_commit = "5555ad1617d62c8064d9853a9e771802150dfb29", + sha256 = "8b9faf895a502ef348757c3eebc2abe33ad265027ac3915e5e7cc52561c33837", + git_commit = "e31663c01094e69ea862c01aa7388d29e4722aec", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 694dc5f9af39320813d1458f9686717d946f2595 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 22 Oct 2018 20:01:52 -0700 Subject: [PATCH 1498/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218277203 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4c1acffb362..6c9638a9167 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8b9faf895a502ef348757c3eebc2abe33ad265027ac3915e5e7cc52561c33837", - git_commit = "e31663c01094e69ea862c01aa7388d29e4722aec", + sha256 = "2e79d66cf73cc02f1ee7dcd96eeec8f053b3114fa8d78982e293aedb517733c3", + git_commit = "e4b876eba4f2cc0067bfcc6b5f06d86c310fe77a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From eeaa766da28a31f484968d2e70655436c7ac2c8d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 23 Oct 2018 02:01:55 -0700 Subject: [PATCH 1499/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218307813 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6c9638a9167..ed85cec1b15 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2e79d66cf73cc02f1ee7dcd96eeec8f053b3114fa8d78982e293aedb517733c3", - git_commit = "e4b876eba4f2cc0067bfcc6b5f06d86c310fe77a", + sha256 = "dcafddd34d4c54bfe0bacdea0603b4182f3ae19124ee26fe8de616082abdc9a2", + git_commit = "8c072a519e2beed483adb361a9be934a47bee366", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0d367ab008eba9fbb083fe24dd30ffdcd640c444 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 23 Oct 2018 09:02:58 -0700 Subject: [PATCH 1500/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218350089 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ed85cec1b15..aa005da1db3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dcafddd34d4c54bfe0bacdea0603b4182f3ae19124ee26fe8de616082abdc9a2", - git_commit = "8c072a519e2beed483adb361a9be934a47bee366", + sha256 = "b87f1a5e3e2369fd1656cee6eab06592c255aa71698dd51ca74c5c40d0a52685", + git_commit = "c9bfe819a2e53dd2fe836c664135d5685f04af6d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d530fbcb92dca30b0f9cab9ce3e2cf905a932821 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 23 Oct 2018 14:02:01 -0700 Subject: [PATCH 1501/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218402713 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index aa005da1db3..2e849303184 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b87f1a5e3e2369fd1656cee6eab06592c255aa71698dd51ca74c5c40d0a52685", - git_commit = "c9bfe819a2e53dd2fe836c664135d5685f04af6d", + sha256 = "d000f91761bad942db98a2fe973398990cee38a3cfe714bdd01af807cfa17dea", + git_commit = "ce61d388dcc0de859ddda5ed7935d2df6eef977a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0c1257a4d5a741a8b70127759066238aba00e474 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 23 Oct 2018 15:02:10 -0700 Subject: [PATCH 1502/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218413840 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2e849303184..4bd32d2ef6d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d000f91761bad942db98a2fe973398990cee38a3cfe714bdd01af807cfa17dea", - git_commit = "ce61d388dcc0de859ddda5ed7935d2df6eef977a", + sha256 = "8532cfdcba1233a34eed979647a4a363b044a6e1a11cc830ca01a13861257385", + git_commit = "b6476baf0ad3430d2fe02dd605fbf945c12f084d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 69289d28f7f688823ac2ebc0d10cba7b6d18c073 Mon Sep 17 00:00:00 2001 From: awk Date: Tue, 23 Oct 2018 15:20:01 -0700 Subject: [PATCH 1503/8103] Update release notes for 1.11.1 release. PiperOrigin-RevId: 218417084 --- RELEASE.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/RELEASE.md b/RELEASE.md index d2353683d17..e1788368dcb 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,3 +1,18 @@ +# Release 1.11.1 + +## Bug Fixes and Other Changes + +* Fix version of model server binary (Fixes #1134) +* Range check floating point numbers correctly (Fixes #1136). +* Fix docker run script for same user and group name (Fixes #1137). +* Fix GPU build (Fixes #1150) + +## Thanks to our Contributors + +This release contains contributions from many people at Google, as well as: + +vfdev + # Release 1.11.0 ## Major Features and Improvements From 793fd90ee41ac34fa4c9261eef2d2c908dca9735 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Tue, 23 Oct 2018 16:54:29 -0700 Subject: [PATCH 1504/8103] Remove dependence on bazel for python examples PiperOrigin-RevId: 218431912 --- tensorflow_serving/example/BUILD | 61 +- .../example/imagenet_lsvrc_2015_synsets.txt | 1000 - .../example/imagenet_metadata.txt | 21842 ---------------- .../example/inception_saved_model.py | 203 - .../{inception_client.cc => resnet_client.cc} | 8 +- ...eption_client.py => resnet_client_grpc.py} | 36 +- .../{inception_k8s.yaml => resnet_k8s.yaml} | 14 +- tensorflow_serving/g3doc/_book.yaml | 8 +- tensorflow_serving/g3doc/serving_advanced.md | 46 +- tensorflow_serving/g3doc/serving_basic.md | 58 +- tensorflow_serving/g3doc/serving_inception.md | 387 - .../g3doc/serving_kubernetes.md | 366 + tensorflow_serving/g3doc/setup.md | 16 +- .../tools/docker/Dockerfile.devel | 3 +- .../tools/docker/Dockerfile.devel-gpu | 3 +- .../{bazel_in_docker.sh => run_in_docker.sh} | 29 +- 16 files changed, 469 insertions(+), 23611 deletions(-) delete mode 100644 tensorflow_serving/example/imagenet_lsvrc_2015_synsets.txt delete mode 100644 tensorflow_serving/example/imagenet_metadata.txt delete mode 100644 tensorflow_serving/example/inception_saved_model.py rename tensorflow_serving/example/{inception_client.cc => resnet_client.cc} (96%) rename tensorflow_serving/example/{inception_client.py => resnet_client_grpc.py} (58%) rename tensorflow_serving/example/{inception_k8s.yaml => resnet_k8s.yaml} (81%) delete mode 100644 tensorflow_serving/g3doc/serving_inception.md create mode 100644 tensorflow_serving/g3doc/serving_kubernetes.md rename tools/{bazel_in_docker.sh => run_in_docker.sh} (67%) diff --git a/tensorflow_serving/example/BUILD b/tensorflow_serving/example/BUILD index 823309d11b7..8b9d098a205 100644 --- a/tensorflow_serving/example/BUILD +++ b/tensorflow_serving/example/BUILD @@ -20,67 +20,10 @@ filegroup( ), ) -py_library( - name = "mnist_input_data", - srcs = ["mnist_input_data.py"], - srcs_version = "PY2AND3", -) - -py_binary( - name = "mnist_saved_model", - srcs = [ - "mnist_saved_model.py", - ], - srcs_version = "PY2AND3", - deps = [ - ":mnist_input_data", - "@org_tensorflow//tensorflow:tensorflow_py", - ], -) - -py_binary( - name = "mnist_client", - srcs = [ - "mnist_client.py", - ], - srcs_version = "PY2AND3", - deps = [ - ":mnist_input_data", - "//tensorflow_serving/apis:predict_proto_py_pb2", - "//tensorflow_serving/apis:prediction_service_proto_py_pb2", - "@org_tensorflow//tensorflow:tensorflow_py", - ], -) - -py_binary( - name = "inception_saved_model", - srcs = [ - "inception_saved_model.py", - ], - srcs_version = "PY2AND3", - deps = [ - "@inception_model//inception", - "@org_tensorflow//tensorflow:tensorflow_py", - ], -) - -py_binary( - name = "inception_client", - srcs = [ - "inception_client.py", - ], - srcs_version = "PY2AND3", - deps = [ - "//tensorflow_serving/apis:predict_proto_py_pb2", - "//tensorflow_serving/apis:prediction_service_proto_py_pb2", - "@org_tensorflow//tensorflow:tensorflow_py", - ], -) - cc_binary( - name = "inception_client_cc", + name = "resnet_client_cc", srcs = [ - "inception_client.cc", + "resnet_client.cc", ], deps = [ "//tensorflow_serving/apis:prediction_service_proto", diff --git a/tensorflow_serving/example/imagenet_lsvrc_2015_synsets.txt b/tensorflow_serving/example/imagenet_lsvrc_2015_synsets.txt deleted file mode 100644 index 88aa58f966b..00000000000 --- a/tensorflow_serving/example/imagenet_lsvrc_2015_synsets.txt +++ /dev/null @@ -1,1000 +0,0 @@ -n01440764 -n01443537 -n01484850 -n01491361 -n01494475 -n01496331 -n01498041 -n01514668 -n01514859 -n01518878 -n01530575 -n01531178 -n01532829 -n01534433 -n01537544 -n01558993 -n01560419 -n01580077 -n01582220 -n01592084 -n01601694 -n01608432 -n01614925 -n01616318 -n01622779 -n01629819 -n01630670 -n01631663 -n01632458 -n01632777 -n01641577 -n01644373 -n01644900 -n01664065 -n01665541 -n01667114 -n01667778 -n01669191 -n01675722 -n01677366 -n01682714 -n01685808 -n01687978 -n01688243 -n01689811 -n01692333 -n01693334 -n01694178 -n01695060 -n01697457 -n01698640 -n01704323 -n01728572 -n01728920 -n01729322 -n01729977 -n01734418 -n01735189 -n01737021 -n01739381 -n01740131 -n01742172 -n01744401 -n01748264 -n01749939 -n01751748 -n01753488 -n01755581 -n01756291 -n01768244 -n01770081 -n01770393 -n01773157 -n01773549 -n01773797 -n01774384 -n01774750 -n01775062 -n01776313 -n01784675 -n01795545 -n01796340 -n01797886 -n01798484 -n01806143 -n01806567 -n01807496 -n01817953 -n01818515 -n01819313 -n01820546 -n01824575 -n01828970 -n01829413 -n01833805 -n01843065 -n01843383 -n01847000 -n01855032 -n01855672 -n01860187 -n01871265 -n01872401 -n01873310 -n01877812 -n01882714 -n01883070 -n01910747 -n01914609 -n01917289 -n01924916 -n01930112 -n01943899 -n01944390 -n01945685 -n01950731 -n01955084 -n01968897 -n01978287 -n01978455 -n01980166 -n01981276 -n01983481 -n01984695 -n01985128 -n01986214 -n01990800 -n02002556 -n02002724 -n02006656 -n02007558 -n02009229 -n02009912 -n02011460 -n02012849 -n02013706 -n02017213 -n02018207 -n02018795 -n02025239 -n02027492 -n02028035 -n02033041 -n02037110 -n02051845 -n02056570 -n02058221 -n02066245 -n02071294 -n02074367 -n02077923 -n02085620 -n02085782 -n02085936 -n02086079 -n02086240 -n02086646 -n02086910 -n02087046 -n02087394 -n02088094 -n02088238 -n02088364 -n02088466 -n02088632 -n02089078 -n02089867 -n02089973 -n02090379 -n02090622 -n02090721 -n02091032 -n02091134 -n02091244 -n02091467 -n02091635 -n02091831 -n02092002 -n02092339 -n02093256 -n02093428 -n02093647 -n02093754 -n02093859 -n02093991 -n02094114 -n02094258 -n02094433 -n02095314 -n02095570 -n02095889 -n02096051 -n02096177 -n02096294 -n02096437 -n02096585 -n02097047 -n02097130 -n02097209 -n02097298 -n02097474 -n02097658 -n02098105 -n02098286 -n02098413 -n02099267 -n02099429 -n02099601 -n02099712 -n02099849 -n02100236 -n02100583 -n02100735 -n02100877 -n02101006 -n02101388 -n02101556 -n02102040 -n02102177 -n02102318 -n02102480 -n02102973 -n02104029 -n02104365 -n02105056 -n02105162 -n02105251 -n02105412 -n02105505 -n02105641 -n02105855 -n02106030 -n02106166 -n02106382 -n02106550 -n02106662 -n02107142 -n02107312 -n02107574 -n02107683 -n02107908 -n02108000 -n02108089 -n02108422 -n02108551 -n02108915 -n02109047 -n02109525 -n02109961 -n02110063 -n02110185 -n02110341 -n02110627 -n02110806 -n02110958 -n02111129 -n02111277 -n02111500 -n02111889 -n02112018 -n02112137 -n02112350 -n02112706 -n02113023 -n02113186 -n02113624 -n02113712 -n02113799 -n02113978 -n02114367 -n02114548 -n02114712 -n02114855 -n02115641 -n02115913 -n02116738 -n02117135 -n02119022 -n02119789 -n02120079 -n02120505 -n02123045 -n02123159 -n02123394 -n02123597 -n02124075 -n02125311 -n02127052 -n02128385 -n02128757 -n02128925 -n02129165 -n02129604 -n02130308 -n02132136 -n02133161 -n02134084 -n02134418 -n02137549 -n02138441 -n02165105 -n02165456 -n02167151 -n02168699 -n02169497 -n02172182 -n02174001 -n02177972 -n02190166 -n02206856 -n02219486 -n02226429 -n02229544 -n02231487 -n02233338 -n02236044 -n02256656 -n02259212 -n02264363 -n02268443 -n02268853 -n02276258 -n02277742 -n02279972 -n02280649 -n02281406 -n02281787 -n02317335 -n02319095 -n02321529 -n02325366 -n02326432 -n02328150 -n02342885 -n02346627 -n02356798 -n02361337 -n02363005 -n02364673 -n02389026 -n02391049 -n02395406 -n02396427 -n02397096 -n02398521 -n02403003 -n02408429 -n02410509 -n02412080 -n02415577 -n02417914 -n02422106 -n02422699 -n02423022 -n02437312 -n02437616 -n02441942 -n02442845 -n02443114 -n02443484 -n02444819 -n02445715 -n02447366 -n02454379 -n02457408 -n02480495 -n02480855 -n02481823 -n02483362 -n02483708 -n02484975 -n02486261 -n02486410 -n02487347 -n02488291 -n02488702 -n02489166 -n02490219 -n02492035 -n02492660 -n02493509 -n02493793 -n02494079 -n02497673 -n02500267 -n02504013 -n02504458 -n02509815 -n02510455 -n02514041 -n02526121 -n02536864 -n02606052 -n02607072 -n02640242 -n02641379 -n02643566 -n02655020 -n02666196 -n02667093 -n02669723 -n02672831 -n02676566 -n02687172 -n02690373 -n02692877 -n02699494 -n02701002 -n02704792 -n02708093 -n02727426 -n02730930 -n02747177 -n02749479 -n02769748 -n02776631 -n02777292 -n02782093 -n02783161 -n02786058 -n02787622 -n02788148 -n02790996 -n02791124 -n02791270 -n02793495 -n02794156 -n02795169 -n02797295 -n02799071 -n02802426 -n02804414 -n02804610 -n02807133 -n02808304 -n02808440 -n02814533 -n02814860 -n02815834 -n02817516 -n02823428 -n02823750 -n02825657 -n02834397 -n02835271 -n02837789 -n02840245 -n02841315 -n02843684 -n02859443 -n02860847 -n02865351 -n02869837 -n02870880 -n02871525 -n02877765 -n02879718 -n02883205 -n02892201 -n02892767 -n02894605 -n02895154 -n02906734 -n02909870 -n02910353 -n02916936 -n02917067 -n02927161 -n02930766 -n02939185 -n02948072 -n02950826 -n02951358 -n02951585 -n02963159 -n02965783 -n02966193 -n02966687 -n02971356 -n02974003 -n02977058 -n02978881 -n02979186 -n02980441 -n02981792 -n02988304 -n02992211 -n02992529 -n02999410 -n03000134 -n03000247 -n03000684 -n03014705 -n03016953 -n03017168 -n03018349 -n03026506 -n03028079 -n03032252 -n03041632 -n03042490 -n03045698 -n03047690 -n03062245 -n03063599 -n03063689 -n03065424 -n03075370 -n03085013 -n03089624 -n03095699 -n03100240 -n03109150 -n03110669 -n03124043 -n03124170 -n03125729 -n03126707 -n03127747 -n03127925 -n03131574 -n03133878 -n03134739 -n03141823 -n03146219 -n03160309 -n03179701 -n03180011 -n03187595 -n03188531 -n03196217 -n03197337 -n03201208 -n03207743 -n03207941 -n03208938 -n03216828 -n03218198 -n03220513 -n03223299 -n03240683 -n03249569 -n03250847 -n03255030 -n03259280 -n03271574 -n03272010 -n03272562 -n03290653 -n03291819 -n03297495 -n03314780 -n03325584 -n03337140 -n03344393 -n03345487 -n03347037 -n03355925 -n03372029 -n03376595 -n03379051 -n03384352 -n03388043 -n03388183 -n03388549 -n03393912 -n03394916 -n03400231 -n03404251 -n03417042 -n03424325 -n03425413 -n03443371 -n03444034 -n03445777 -n03445924 -n03447447 -n03447721 -n03450230 -n03452741 -n03457902 -n03459775 -n03461385 -n03467068 -n03476684 -n03476991 -n03478589 -n03481172 -n03482405 -n03483316 -n03485407 -n03485794 -n03492542 -n03494278 -n03495258 -n03496892 -n03498962 -n03527444 -n03529860 -n03530642 -n03532672 -n03534580 -n03535780 -n03538406 -n03544143 -n03584254 -n03584829 -n03590841 -n03594734 -n03594945 -n03595614 -n03598930 -n03599486 -n03602883 -n03617480 -n03623198 -n03627232 -n03630383 -n03633091 -n03637318 -n03642806 -n03649909 -n03657121 -n03658185 -n03661043 -n03662601 -n03666591 -n03670208 -n03673027 -n03676483 -n03680355 -n03690938 -n03691459 -n03692522 -n03697007 -n03706229 -n03709823 -n03710193 -n03710637 -n03710721 -n03717622 -n03720891 -n03721384 -n03724870 -n03729826 -n03733131 -n03733281 -n03733805 -n03742115 -n03743016 -n03759954 -n03761084 -n03763968 -n03764736 -n03769881 -n03770439 -n03770679 -n03773504 -n03775071 -n03775546 -n03776460 -n03777568 -n03777754 -n03781244 -n03782006 -n03785016 -n03786901 -n03787032 -n03788195 -n03788365 -n03791053 -n03792782 -n03792972 -n03793489 -n03794056 -n03796401 -n03803284 -n03804744 -n03814639 -n03814906 -n03825788 -n03832673 -n03837869 -n03838899 -n03840681 -n03841143 -n03843555 -n03854065 -n03857828 -n03866082 -n03868242 -n03868863 -n03871628 -n03873416 -n03874293 -n03874599 -n03876231 -n03877472 -n03877845 -n03884397 -n03887697 -n03888257 -n03888605 -n03891251 -n03891332 -n03895866 -n03899768 -n03902125 -n03903868 -n03908618 -n03908714 -n03916031 -n03920288 -n03924679 -n03929660 -n03929855 -n03930313 -n03930630 -n03933933 -n03935335 -n03937543 -n03938244 -n03942813 -n03944341 -n03947888 -n03950228 -n03954731 -n03956157 -n03958227 -n03961711 -n03967562 -n03970156 -n03976467 -n03976657 -n03977966 -n03980874 -n03982430 -n03983396 -n03991062 -n03992509 -n03995372 -n03998194 -n04004767 -n04005630 -n04008634 -n04009552 -n04019541 -n04023962 -n04026417 -n04033901 -n04033995 -n04037443 -n04039381 -n04040759 -n04041544 -n04044716 -n04049303 -n04065272 -n04067472 -n04069434 -n04070727 -n04074963 -n04081281 -n04086273 -n04090263 -n04099969 -n04111531 -n04116512 -n04118538 -n04118776 -n04120489 -n04125021 -n04127249 -n04131690 -n04133789 -n04136333 -n04141076 -n04141327 -n04141975 -n04146614 -n04147183 -n04149813 -n04152593 -n04153751 -n04154565 -n04162706 -n04179913 -n04192698 -n04200800 -n04201297 -n04204238 -n04204347 -n04208210 -n04209133 -n04209239 -n04228054 -n04229816 -n04235860 -n04238763 -n04239074 -n04243546 -n04251144 -n04252077 -n04252225 -n04254120 -n04254680 -n04254777 -n04258138 -n04259630 -n04263257 -n04264628 -n04265275 -n04266014 -n04270147 -n04273569 -n04275548 -n04277352 -n04285008 -n04286575 -n04296562 -n04310018 -n04311004 -n04311174 -n04317175 -n04325704 -n04326547 -n04328186 -n04330267 -n04332243 -n04335435 -n04336792 -n04344873 -n04346328 -n04347754 -n04350905 -n04355338 -n04355933 -n04356056 -n04357314 -n04366367 -n04367480 -n04370456 -n04371430 -n04371774 -n04372370 -n04376876 -n04380533 -n04389033 -n04392985 -n04398044 -n04399382 -n04404412 -n04409515 -n04417672 -n04418357 -n04423845 -n04428191 -n04429376 -n04435653 -n04442312 -n04443257 -n04447861 -n04456115 -n04458633 -n04461696 -n04462240 -n04465501 -n04467665 -n04476259 -n04479046 -n04482393 -n04483307 -n04485082 -n04486054 -n04487081 -n04487394 -n04493381 -n04501370 -n04505470 -n04507155 -n04509417 -n04515003 -n04517823 -n04522168 -n04523525 -n04525038 -n04525305 -n04532106 -n04532670 -n04536866 -n04540053 -n04542943 -n04548280 -n04548362 -n04550184 -n04552348 -n04553703 -n04554684 -n04557648 -n04560804 -n04562935 -n04579145 -n04579432 -n04584207 -n04589890 -n04590129 -n04591157 -n04591713 -n04592741 -n04596742 -n04597913 -n04599235 -n04604644 -n04606251 -n04612504 -n04613696 -n06359193 -n06596364 -n06785654 -n06794110 -n06874185 -n07248320 -n07565083 -n07579787 -n07583066 -n07584110 -n07590611 -n07613480 -n07614500 -n07615774 -n07684084 -n07693725 -n07695742 -n07697313 -n07697537 -n07711569 -n07714571 -n07714990 -n07715103 -n07716358 -n07716906 -n07717410 -n07717556 -n07718472 -n07718747 -n07720875 -n07730033 -n07734744 -n07742313 -n07745940 -n07747607 -n07749582 -n07753113 -n07753275 -n07753592 -n07754684 -n07760859 -n07768694 -n07802026 -n07831146 -n07836838 -n07860988 -n07871810 -n07873807 -n07875152 -n07880968 -n07892512 -n07920052 -n07930864 -n07932039 -n09193705 -n09229709 -n09246464 -n09256479 -n09288635 -n09332890 -n09399592 -n09421951 -n09428293 -n09468604 -n09472597 -n09835506 -n10148035 -n10565667 -n11879895 -n11939491 -n12057211 -n12144580 -n12267677 -n12620546 -n12768682 -n12985857 -n12998815 -n13037406 -n13040303 -n13044778 -n13052670 -n13054560 -n13133613 -n15075141 diff --git a/tensorflow_serving/example/imagenet_metadata.txt b/tensorflow_serving/example/imagenet_metadata.txt deleted file mode 100644 index 913a237e95d..00000000000 --- a/tensorflow_serving/example/imagenet_metadata.txt +++ /dev/null @@ -1,21842 +0,0 @@ -n00004475 organism, being -n00005787 benthos -n00006024 heterotroph -n00006484 cell -n00007846 person, individual, someone, somebody, mortal, soul -n00015388 animal, animate being, beast, brute, creature, fauna -n00017222 plant, flora, plant life -n00021265 food, nutrient -n00021939 artifact, artefact -n00120010 hop -n00141669 check-in -n00288000 dressage -n00288190 curvet, vaulting -n00288384 piaffe -n00324978 funambulism, tightrope walking -n00326094 rock climbing -n00433458 contact sport -n00433661 outdoor sport, field sport -n00433802 gymnastics, gymnastic exercise -n00434075 acrobatics, tumbling -n00439826 track and field -n00440039 track, running -n00440218 jumping -n00440382 broad jump, long jump -n00440509 high jump -n00440643 Fosbury flop -n00440747 skiing -n00440941 cross-country skiing -n00441073 ski jumping -n00441824 water sport, aquatics -n00442115 swimming, swim -n00442437 bathe -n00442847 dip, plunge -n00442981 dive, diving -n00443231 floating, natation -n00443375 dead-man's float, prone float -n00443517 belly flop, belly flopper, belly whop, belly whopper -n00443692 cliff diving -n00443803 flip -n00443917 gainer, full gainer -n00444142 half gainer -n00444340 jackknife -n00444490 swan dive, swallow dive -n00444651 skin diving, skin-dive -n00444846 scuba diving -n00444937 snorkeling, snorkel diving -n00445055 surfing, surfboarding, surfriding -n00445226 water-skiing -n00445351 rowing, row -n00445685 sculling -n00445802 boxing, pugilism, fisticuffs -n00446311 professional boxing -n00446411 in-fighting -n00446493 fight -n00446632 rope-a-dope -n00446804 spar, sparring -n00446980 archery -n00447073 sledding -n00447221 tobogganing -n00447361 luging -n00447463 bobsledding -n00447540 wrestling, rassling, grappling -n00447957 Greco-Roman wrestling -n00448126 professional wrestling -n00448232 sumo -n00448466 skating -n00448640 ice skating -n00448748 figure skating -n00448872 rollerblading -n00448958 roller skating -n00449054 skateboarding -n00449168 speed skating -n00449295 racing -n00449517 auto racing, car racing -n00449695 boat racing -n00449796 hydroplane racing -n00449892 camel racing -n00449977 greyhound racing -n00450070 horse racing -n00450335 riding, horseback riding, equitation -n00450700 equestrian sport -n00450866 pony-trekking -n00450998 showjumping, stadium jumping -n00451186 cross-country riding, cross-country jumping -n00451370 cycling -n00451563 bicycling -n00451635 motorcycling -n00451768 dune cycling -n00451866 blood sport -n00452034 bullfighting, tauromachy -n00452152 cockfighting -n00452293 hunt, hunting -n00452734 battue -n00452864 beagling -n00453126 coursing -n00453313 deer hunting, deer hunt -n00453396 ducking, duck hunting -n00453478 fox hunting, foxhunt -n00453631 pigsticking -n00453935 fishing, sportfishing -n00454237 angling -n00454395 fly-fishing -n00454493 troll, trolling -n00454624 casting, cast -n00454855 bait casting -n00454983 fly casting -n00455076 overcast -n00455173 surf casting, surf fishing -n00456465 day game -n00463246 athletic game -n00463543 ice hockey, hockey, hockey game -n00464277 tetherball -n00464478 water polo -n00464651 outdoor game -n00464894 golf, golf game -n00466273 professional golf -n00466377 round of golf, round -n00466524 medal play, stroke play -n00466630 match play -n00466712 miniature golf -n00466880 croquet -n00467320 quoits, horseshoes -n00467536 shuffleboard, shovelboard -n00467719 field game -n00467995 field hockey, hockey -n00468299 shinny, shinney -n00468480 football, football game -n00469651 American football, American football game -n00470554 professional football -n00470682 touch football -n00470830 hurling -n00470966 rugby, rugby football, rugger -n00471437 ball game, ballgame -n00471613 baseball, baseball game -n00474568 ball -n00474657 professional baseball -n00474769 hardball -n00474881 perfect game -n00475014 no-hit game, no-hitter -n00475142 one-hitter, 1-hitter -n00475273 two-hitter, 2-hitter -n00475403 three-hitter, 3-hitter -n00475535 four-hitter, 4-hitter -n00475661 five-hitter, 5-hitter -n00475787 softball, softball game -n00476140 rounders -n00476235 stickball, stickball game -n00476389 cricket -n00477392 lacrosse -n00477639 polo -n00477827 pushball -n00478262 soccer, association football -n00479076 court game -n00479440 handball -n00479616 racquetball -n00479734 fives -n00479887 squash, squash racquets, squash rackets -n00480211 volleyball, volleyball game -n00480366 jai alai, pelota -n00480508 badminton -n00480885 battledore, battledore and shuttlecock -n00480993 basketball, basketball game, hoops -n00481803 professional basketball -n00481938 deck tennis -n00482122 netball -n00482298 tennis, lawn tennis -n00483205 professional tennis -n00483313 singles -n00483409 singles -n00483508 doubles -n00483605 doubles -n00483705 royal tennis, real tennis, court tennis -n00483848 pallone -n00523513 sport, athletics -n00812526 clasp, clench, clutch, clutches, grasp, grip, hold -n00825773 judo -n00887544 team sport -n01035504 Last Supper, Lord's Supper -n01035667 Seder, Passover supper -n01055165 camping, encampment, bivouacking, tenting -n01314388 pest -n01314663 critter -n01314781 creepy-crawly -n01314910 darter -n01315213 peeper -n01315330 homeotherm, homoiotherm, homotherm -n01315581 poikilotherm, ectotherm -n01315805 range animal -n01316422 scavenger -n01316579 bottom-feeder, bottom-dweller -n01316734 bottom-feeder -n01316949 work animal -n01317089 beast of burden, jument -n01317294 draft animal -n01317391 pack animal, sumpter -n01317541 domestic animal, domesticated animal -n01317813 feeder -n01317916 feeder -n01318053 stocker -n01318279 hatchling -n01318381 head -n01318478 migrator -n01318660 molter, moulter -n01318894 pet -n01319001 stayer -n01319187 stunt -n01319467 marine animal, marine creature, sea animal, sea creature -n01319685 by-catch, bycatch -n01320872 female -n01321123 hen -n01321230 male -n01321456 adult -n01321579 young, offspring -n01321770 orphan -n01321854 young mammal -n01322221 baby -n01322343 pup, whelp -n01322508 wolf pup, wolf cub -n01322604 puppy -n01322685 cub, young carnivore -n01322898 lion cub -n01322983 bear cub -n01323068 tiger cub -n01323155 kit -n01323261 suckling -n01323355 sire -n01323493 dam -n01323599 thoroughbred, purebred, pureblood -n01323781 giant -n01324305 mutant -n01324431 carnivore -n01324610 herbivore -n01324799 insectivore -n01324916 acrodont -n01325060 pleurodont -n01326291 microorganism, micro-organism -n01327909 monohybrid -n01329186 arbovirus, arborvirus -n01330126 adenovirus -n01330497 arenavirus -n01332181 Marburg virus -n01333082 Arenaviridae -n01333483 vesiculovirus -n01333610 Reoviridae -n01334217 variola major, variola major virus -n01334690 viroid, virusoid -n01335218 coliphage -n01337191 paramyxovirus -n01337734 poliovirus -n01338685 herpes, herpes virus -n01339083 herpes simplex 1, HS1, HSV-1, HSV-I -n01339336 herpes zoster, herpes zoster virus -n01339471 herpes varicella zoster, herpes varicella zoster virus -n01339801 cytomegalovirus, CMV -n01340014 varicella zoster virus -n01340522 polyoma, polyoma virus -n01340785 lyssavirus -n01340935 reovirus -n01341090 rotavirus -n01342269 moneran, moneron -n01347583 archaebacteria, archaebacterium, archaeobacteria, archeobacteria -n01349735 bacteroid -n01350226 Bacillus anthracis, anthrax bacillus -n01350701 Yersinia pestis -n01351170 Brucella -n01351315 spirillum, spirilla -n01357328 botulinus, botulinum, Clostridium botulinum -n01357507 clostridium perfringens -n01358572 cyanobacteria, blue-green algae -n01359762 trichodesmium -n01362336 nitric bacteria, nitrobacteria -n01363719 spirillum -n01365474 Francisella, genus Francisella -n01365885 gonococcus, Neisseria gonorrhoeae -n01366700 Corynebacterium diphtheriae, C. diphtheriae, Klebs-Loeffler bacillus -n01367772 enteric bacteria, enterobacteria, enterics, entric -n01368672 klebsiella -n01369358 Salmonella typhimurium -n01369484 typhoid bacillus, Salmonella typhosa, Salmonella typhi -n01374703 nitrate bacterium, nitric bacterium -n01374846 nitrite bacterium, nitrous bacterium -n01375204 actinomycete -n01376237 streptomyces -n01376437 Streptomyces erythreus -n01376543 Streptomyces griseus -n01377278 tubercle bacillus, Mycobacterium tuberculosis -n01377510 pus-forming bacteria -n01377694 streptobacillus -n01378545 myxobacteria, myxobacterium, myxobacter, gliding bacteria, slime bacteria -n01379389 staphylococcus, staphylococci, staph -n01380610 diplococcus -n01380754 pneumococcus, Diplococcus pneumoniae -n01381044 streptococcus, streptococci, strep -n01382033 spirochete, spirochaete -n01384084 planktonic algae -n01384164 zooplankton -n01384687 parasite -n01385017 endoparasite, entoparasite, entozoan, entozoon, endozoan -n01385330 ectoparasite, ectozoan, ectozoon, epizoan, epizoon -n01386007 pathogen -n01386182 commensal -n01386354 myrmecophile -n01387065 protoctist -n01389507 protozoan, protozoon -n01390123 sarcodinian, sarcodine -n01390763 heliozoan -n01392275 endameba -n01392380 ameba, amoeba -n01393486 globigerina -n01394040 testacean -n01394492 arcella -n01394771 difflugia -n01395254 ciliate, ciliated protozoan, ciliophoran -n01396048 paramecium, paramecia -n01396617 stentor -n01397114 alga, algae -n01397690 arame -n01397871 seagrass -n01400247 golden algae -n01400391 yellow-green algae -n01402600 brown algae -n01403457 kelp -n01404365 fucoid, fucoid algae -n01404495 fucoid -n01405007 fucus -n01405616 bladderwrack, Ascophyllum nodosum -n01407798 green algae, chlorophyte -n01410457 pond scum -n01411450 chlorella -n01412694 stonewort -n01413457 desmid -n01414216 sea moss -n01415626 eukaryote, eucaryote -n01415920 prokaryote, procaryote -n01416213 zooid -n01418498 Leishmania, genus Leishmania -n01418620 zoomastigote, zooflagellate -n01419332 polymastigote -n01419573 costia, Costia necatrix -n01419888 giardia -n01421333 cryptomonad, cryptophyte -n01421807 sporozoan -n01422185 sporozoite -n01422335 trophozoite -n01422450 merozoite -n01423302 coccidium, eimeria -n01423617 gregarine -n01424420 plasmodium, Plasmodium vivax, malaria parasite -n01425223 leucocytozoan, leucocytozoon -n01427399 microsporidian -n01429172 Ostariophysi, order Ostariophysi -n01438208 cypriniform fish -n01438581 loach -n01439121 cyprinid, cyprinid fish -n01439514 carp -n01439808 domestic carp, Cyprinus carpio -n01440160 leather carp -n01440242 mirror carp -n01440467 European bream, Abramis brama -n01440764 tench, Tinca tinca -n01441117 dace, Leuciscus leuciscus -n01441272 chub, Leuciscus cephalus -n01441425 shiner -n01441910 common shiner, silversides, Notropis cornutus -n01442450 roach, Rutilus rutilus -n01442710 rudd, Scardinius erythrophthalmus -n01442972 minnow, Phoxinus phoxinus -n01443243 gudgeon, Gobio gobio -n01443537 goldfish, Carassius auratus -n01443831 crucian carp, Carassius carassius, Carassius vulgaris -n01444339 electric eel, Electrophorus electric -n01444783 catostomid -n01445429 buffalo fish, buffalofish -n01445593 black buffalo, Ictiobus niger -n01445857 hog sucker, hog molly, Hypentelium nigricans -n01446152 redhorse, redhorse sucker -n01446589 cyprinodont -n01446760 killifish -n01447139 mummichog, Fundulus heteroclitus -n01447331 striped killifish, mayfish, may fish, Fundulus majalis -n01447658 rivulus -n01447946 flagfish, American flagfish, Jordanella floridae -n01448291 swordtail, helleri, topminnow, Xyphophorus helleri -n01448594 guppy, rainbow fish, Lebistes reticulatus -n01448951 topminnow, poeciliid fish, poeciliid, live-bearer -n01449374 mosquitofish, Gambusia affinis -n01449712 platy, Platypoecilus maculatus -n01449980 mollie, molly -n01450661 squirrelfish -n01450950 reef squirrelfish, Holocentrus coruscus -n01451115 deepwater squirrelfish, Holocentrus bullisi -n01451295 Holocentrus ascensionis -n01451426 soldierfish, soldier-fish -n01451863 anomalops, flashlight fish -n01452345 flashlight fish, Photoblepharon palpebratus -n01453087 John Dory, Zeus faber -n01453475 boarfish, Capros aper -n01453742 boarfish -n01454545 cornetfish -n01454856 stickleback, prickleback -n01455317 three-spined stickleback, Gasterosteus aculeatus -n01455461 ten-spined stickleback, Gasterosteus pungitius -n01455778 pipefish, needlefish -n01456137 dwarf pipefish, Syngnathus hildebrandi -n01456454 deepwater pipefish, Cosmocampus profundus -n01456756 seahorse, sea horse -n01457082 snipefish, bellows fish -n01457407 shrimpfish, shrimp-fish -n01457852 trumpetfish, Aulostomus maculatus -n01458746 pellicle -n01458842 embryo, conceptus, fertilized egg -n01459791 fetus, foetus -n01460303 abortus -n01461315 spawn -n01461646 blastula, blastosphere -n01462042 blastocyst, blastodermic vessicle -n01462544 gastrula -n01462803 morula -n01464844 yolk, vitellus -n01466257 chordate -n01467336 cephalochordate -n01467804 lancelet, amphioxus -n01468238 tunicate, urochordate, urochord -n01468712 ascidian -n01469103 sea squirt -n01469723 salp, salpa -n01470145 doliolum -n01470479 larvacean -n01470733 appendicularia -n01470895 ascidian tadpole -n01471682 vertebrate, craniate -n01472303 Amniota -n01472502 amniote -n01473806 aquatic vertebrate -n01474283 jawless vertebrate, jawless fish, agnathan -n01474864 ostracoderm -n01475232 heterostracan -n01475940 anaspid -n01476418 conodont -n01477080 cyclostome -n01477525 lamprey, lamprey eel, lamper eel -n01477875 sea lamprey, Petromyzon marinus -n01478511 hagfish, hag, slime eels -n01478969 Myxine glutinosa -n01479213 eptatretus -n01479820 gnathostome -n01480106 placoderm -n01480516 cartilaginous fish, chondrichthian -n01480880 holocephalan, holocephalian -n01481331 chimaera -n01481498 rabbitfish, Chimaera monstrosa -n01482071 elasmobranch, selachian -n01482330 shark -n01483021 cow shark, six-gilled shark, Hexanchus griseus -n01483522 mackerel shark -n01483830 porbeagle, Lamna nasus -n01484097 mako, mako shark -n01484285 shortfin mako, Isurus oxyrhincus -n01484447 longfin mako, Isurus paucus -n01484562 bonito shark, blue pointed, Isurus glaucus -n01484850 great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias -n01485479 basking shark, Cetorhinus maximus -n01486010 thresher, thrasher, thresher shark, fox shark, Alopius vulpinus -n01486540 carpet shark, Orectolobus barbatus -n01486838 nurse shark, Ginglymostoma cirratum -n01487506 sand tiger, sand shark, Carcharias taurus, Odontaspis taurus -n01488038 whale shark, Rhincodon typus -n01488918 requiem shark -n01489501 bull shark, cub shark, Carcharhinus leucas -n01489709 sandbar shark, Carcharhinus plumbeus -n01489920 blacktip shark, sandbar shark, Carcharhinus limbatus -n01490112 whitetip shark, oceanic whitetip shark, white-tipped shark, Carcharinus longimanus -n01490360 dusky shark, Carcharhinus obscurus -n01490670 lemon shark, Negaprion brevirostris -n01491006 blue shark, great blue shark, Prionace glauca -n01491361 tiger shark, Galeocerdo cuvieri -n01491661 soupfin shark, soupfin, soup-fin, Galeorhinus zyopterus -n01491874 dogfish -n01492357 smooth dogfish -n01492569 smoothhound, smoothhound shark, Mustelus mustelus -n01492708 American smooth dogfish, Mustelus canis -n01492860 Florida smoothhound, Mustelus norrisi -n01493146 whitetip shark, reef whitetip shark, Triaenodon obseus -n01493541 spiny dogfish -n01493829 Atlantic spiny dogfish, Squalus acanthias -n01494041 Pacific spiny dogfish, Squalus suckleyi -n01494475 hammerhead, hammerhead shark -n01494757 smooth hammerhead, Sphyrna zygaena -n01494882 smalleye hammerhead, Sphyrna tudes -n01495006 shovelhead, bonnethead, bonnet shark, Sphyrna tiburo -n01495493 angel shark, angelfish, Squatina squatina, monkfish -n01495701 ray -n01496331 electric ray, crampfish, numbfish, torpedo -n01497118 sawfish -n01497413 smalltooth sawfish, Pristis pectinatus -n01497738 guitarfish -n01498041 stingray -n01498406 roughtail stingray, Dasyatis centroura -n01498699 butterfly ray -n01498989 eagle ray -n01499396 spotted eagle ray, spotted ray, Aetobatus narinari -n01499732 cownose ray, cow-nosed ray, Rhinoptera bonasus -n01500091 manta, manta ray, devilfish -n01500476 Atlantic manta, Manta birostris -n01500854 devil ray, Mobula hypostoma -n01501160 skate -n01501641 grey skate, gray skate, Raja batis -n01501777 little skate, Raja erinacea -n01501948 thorny skate, Raja radiata -n01502101 barndoor skate, Raja laevis -n01503061 bird -n01503976 dickeybird, dickey-bird, dickybird, dicky-bird -n01504179 fledgling, fledgeling -n01504344 nestling, baby bird -n01514668 cock -n01514752 gamecock, fighting cock -n01514859 hen -n01514926 nester -n01515078 night bird -n01515217 night raven -n01515303 bird of passage -n01516212 archaeopteryx, archeopteryx, Archaeopteryx lithographica -n01517389 archaeornis -n01517565 ratite, ratite bird, flightless bird -n01517966 carinate, carinate bird, flying bird -n01518878 ostrich, Struthio camelus -n01519563 cassowary -n01519873 emu, Dromaius novaehollandiae, Emu novaehollandiae -n01520576 kiwi, apteryx -n01521399 rhea, Rhea americana -n01521756 rhea, nandu, Pterocnemia pennata -n01522450 elephant bird, aepyornis -n01523105 moa -n01524359 passerine, passeriform bird -n01524761 nonpasserine bird -n01525720 oscine, oscine bird -n01526521 songbird, songster -n01526766 honey eater, honeysucker -n01527194 accentor -n01527347 hedge sparrow, sparrow, dunnock, Prunella modularis -n01527617 lark -n01527917 skylark, Alauda arvensis -n01528396 wagtail -n01528654 pipit, titlark, lark -n01528845 meadow pipit, Anthus pratensis -n01529672 finch -n01530439 chaffinch, Fringilla coelebs -n01530575 brambling, Fringilla montifringilla -n01531178 goldfinch, Carduelis carduelis -n01531344 linnet, lintwhite, Carduelis cannabina -n01531512 siskin, Carduelis spinus -n01531639 red siskin, Carduelis cucullata -n01531811 redpoll, Carduelis flammea -n01531971 redpoll, Carduelis hornemanni -n01532325 New World goldfinch, goldfinch, yellowbird, Spinus tristis -n01532511 pine siskin, pine finch, Spinus pinus -n01532829 house finch, linnet, Carpodacus mexicanus -n01533000 purple finch, Carpodacus purpureus -n01533339 canary, canary bird -n01533481 common canary, Serinus canaria -n01533651 serin -n01533893 crossbill, Loxia curvirostra -n01534155 bullfinch, Pyrrhula pyrrhula -n01534433 junco, snowbird -n01534582 dark-eyed junco, slate-colored junco, Junco hyemalis -n01534762 New World sparrow -n01535140 vesper sparrow, grass finch, Pooecetes gramineus -n01535469 white-throated sparrow, whitethroat, Zonotrichia albicollis -n01535690 white-crowned sparrow, Zonotrichia leucophrys -n01536035 chipping sparrow, Spizella passerina -n01536186 field sparrow, Spizella pusilla -n01536334 tree sparrow, Spizella arborea -n01536644 song sparrow, Melospiza melodia -n01536780 swamp sparrow, Melospiza georgiana -n01537134 bunting -n01537544 indigo bunting, indigo finch, indigo bird, Passerina cyanea -n01537895 ortolan, ortolan bunting, Emberiza hortulana -n01538059 reed bunting, Emberiza schoeniclus -n01538200 yellowhammer, yellow bunting, Emberiza citrinella -n01538362 yellow-breasted bunting, Emberiza aureola -n01538630 snow bunting, snowbird, snowflake, Plectrophenax nivalis -n01538955 honeycreeper -n01539272 banana quit -n01539573 sparrow, true sparrow -n01539925 English sparrow, house sparrow, Passer domesticus -n01540090 tree sparrow, Passer montanus -n01540233 grosbeak, grossbeak -n01540566 evening grosbeak, Hesperiphona vespertina -n01540832 hawfinch, Coccothraustes coccothraustes -n01541102 pine grosbeak, Pinicola enucleator -n01541386 cardinal, cardinal grosbeak, Richmondena Cardinalis, Cardinalis cardinalis, redbird -n01541760 pyrrhuloxia, Pyrrhuloxia sinuata -n01541922 towhee -n01542168 chewink, cheewink, Pipilo erythrophthalmus -n01542433 green-tailed towhee, Chlorura chlorura -n01542786 weaver, weaverbird, weaver finch -n01543175 baya, Ploceus philippinus -n01543383 whydah, whidah, widow bird -n01543632 Java sparrow, Java finch, ricebird, Padda oryzivora -n01543936 avadavat, amadavat -n01544208 grassfinch, grass finch -n01544389 zebra finch, Poephila castanotis -n01544704 honeycreeper, Hawaiian honeycreeper -n01545574 lyrebird -n01546039 scrubbird, scrub-bird, scrub bird -n01546506 broadbill -n01546921 tyrannid -n01547832 New World flycatcher, flycatcher, tyrant flycatcher, tyrant bird -n01548301 kingbird, Tyrannus tyrannus -n01548492 Arkansas kingbird, western kingbird -n01548694 Cassin's kingbird, Tyrannus vociferans -n01548865 eastern kingbird -n01549053 grey kingbird, gray kingbird, petchary, Tyrannus domenicensis domenicensis -n01549430 pewee, peewee, peewit, pewit, wood pewee, Contopus virens -n01549641 western wood pewee, Contopus sordidulus -n01549886 phoebe, phoebe bird, Sayornis phoebe -n01550172 vermillion flycatcher, firebird, Pyrocephalus rubinus mexicanus -n01550761 cotinga, chatterer -n01551080 cock of the rock, Rupicola rupicola -n01551300 cock of the rock, Rupicola peruviana -n01551711 manakin -n01552034 bellbird -n01552333 umbrella bird, Cephalopterus ornatus -n01552813 ovenbird -n01553142 antbird, ant bird -n01553527 ant thrush -n01553762 ant shrike -n01554017 spotted antbird, Hylophylax naevioides -n01554448 woodhewer, woodcreeper, wood-creeper, tree creeper -n01555004 pitta -n01555305 scissortail, scissortailed flycatcher, Muscivora-forficata -n01555809 Old World flycatcher, true flycatcher, flycatcher -n01556182 spotted flycatcher, Muscicapa striata, Muscicapa grisola -n01556514 thickhead, whistler -n01557185 thrush -n01557962 missel thrush, mistle thrush, mistletoe thrush, Turdus viscivorus -n01558149 song thrush, mavis, throstle, Turdus philomelos -n01558307 fieldfare, snowbird, Turdus pilaris -n01558461 redwing, Turdus iliacus -n01558594 blackbird, merl, merle, ouzel, ousel, European blackbird, Turdus merula -n01558765 ring ouzel, ring blackbird, ring thrush, Turdus torquatus -n01558993 robin, American robin, Turdus migratorius -n01559160 clay-colored robin, Turdus greyi -n01559477 hermit thrush, Hylocichla guttata -n01559639 veery, Wilson's thrush, Hylocichla fuscescens -n01559804 wood thrush, Hylocichla mustelina -n01560105 nightingale, Luscinia megarhynchos -n01560280 thrush nightingale, Luscinia luscinia -n01560419 bulbul -n01560636 Old World chat, chat -n01560793 stonechat, Saxicola torquata -n01560935 whinchat, Saxicola rubetra -n01561181 solitaire -n01561452 redstart, redtail -n01561732 wheatear -n01562014 bluebird -n01562265 robin, redbreast, robin redbreast, Old World robin, Erithacus rubecola -n01562451 bluethroat, Erithacus svecicus -n01563128 warbler -n01563449 gnatcatcher -n01563746 kinglet -n01563945 goldcrest, golden-crested kinglet, Regulus regulus -n01564101 gold-crowned kinglet, Regulus satrata -n01564217 ruby-crowned kinglet, ruby-crowned wren, Regulus calendula -n01564394 Old World warbler, true warbler -n01564773 blackcap, Silvia atricapilla -n01564914 greater whitethroat, whitethroat, Sylvia communis -n01565078 lesser whitethroat, whitethroat, Sylvia curruca -n01565345 wood warbler, Phylloscopus sibilatrix -n01565599 sedge warbler, sedge bird, sedge wren, reedbird, Acrocephalus schoenobaenus -n01565930 wren warbler -n01566207 tailorbird, Orthotomus sutorius -n01566645 babbler, cackler -n01567133 New World warbler, wood warbler -n01567678 parula warbler, northern parula, Parula americana -n01567879 Wilson's warbler, Wilson's blackcap, Wilsonia pusilla -n01568132 flycatching warbler -n01568294 American redstart, redstart, Setophaga ruticilla -n01568720 Cape May warbler, Dendroica tigrina -n01568892 yellow warbler, golden warbler, yellowbird, Dendroica petechia -n01569060 Blackburn, Blackburnian warbler, Dendroica fusca -n01569262 Audubon's warbler, Audubon warbler, Dendroica auduboni -n01569423 myrtle warbler, myrtle bird, Dendroica coronata -n01569566 blackpoll, Dendroica striate -n01569836 New World chat, chat -n01569971 yellow-breasted chat, Icteria virens -n01570267 ovenbird, Seiurus aurocapillus -n01570421 water thrush -n01570676 yellowthroat -n01570839 common yellowthroat, Maryland yellowthroat, Geothlypis trichas -n01571410 riflebird, Ptloris paradisea -n01571904 New World oriole, American oriole, oriole -n01572328 northern oriole, Icterus galbula -n01572489 Baltimore oriole, Baltimore bird, hangbird, firebird, Icterus galbula galbula -n01572654 Bullock's oriole, Icterus galbula bullockii -n01572782 orchard oriole, Icterus spurius -n01573074 meadowlark, lark -n01573240 eastern meadowlark, Sturnella magna -n01573360 western meadowlark, Sturnella neglecta -n01573627 cacique, cazique -n01573898 bobolink, ricebird, reedbird, Dolichonyx oryzivorus -n01574045 New World blackbird, blackbird -n01574390 grackle, crow blackbird -n01574560 purple grackle, Quiscalus quiscula -n01574801 rusty blackbird, rusty grackle, Euphagus carilonus -n01575117 cowbird -n01575401 red-winged blackbird, redwing, Agelaius phoeniceus -n01575745 Old World oriole, oriole -n01576076 golden oriole, Oriolus oriolus -n01576358 fig-bird -n01576695 starling -n01577035 common starling, Sturnus vulgaris -n01577458 rose-colored starling, rose-colored pastor, Pastor sturnus, Pastor roseus -n01577659 myna, mynah, mina, minah, myna bird, mynah bird -n01577941 crested myna, Acridotheres tristis -n01578180 hill myna, Indian grackle, grackle, Gracula religiosa -n01578575 corvine bird -n01579028 crow -n01579149 American crow, Corvus brachyrhyncos -n01579260 raven, Corvus corax -n01579410 rook, Corvus frugilegus -n01579578 jackdaw, daw, Corvus monedula -n01579729 chough -n01580077 jay -n01580379 Old World jay -n01580490 common European jay, Garullus garullus -n01580772 New World jay -n01580870 blue jay, jaybird, Cyanocitta cristata -n01581166 Canada jay, grey jay, gray jay, camp robber, whisker jack, Perisoreus canadensis -n01581434 Rocky Mountain jay, Perisoreus canadensis capitalis -n01581730 nutcracker -n01581874 common nutcracker, Nucifraga caryocatactes -n01581984 Clark's nutcracker, Nucifraga columbiana -n01582220 magpie -n01582398 European magpie, Pica pica -n01582498 American magpie, Pica pica hudsonia -n01582856 Australian magpie -n01583209 butcherbird -n01583495 currawong, bell magpie -n01583828 piping crow, piping crow-shrike, Gymnorhina tibicen -n01584225 wren, jenny wren -n01584695 winter wren, Troglodytes troglodytes -n01584853 house wren, Troglodytes aedon -n01585121 marsh wren -n01585287 long-billed marsh wren, Cistothorus palustris -n01585422 sedge wren, short-billed marsh wren, Cistothorus platensis -n01585715 rock wren, Salpinctes obsoletus -n01586020 Carolina wren, Thryothorus ludovicianus -n01586374 cactus wren -n01586941 mockingbird, mocker, Mimus polyglotktos -n01587278 blue mockingbird, Melanotis caerulescens -n01587526 catbird, grey catbird, gray catbird, Dumetella carolinensis -n01587834 thrasher, mocking thrush -n01588002 brown thrasher, brown thrush, Toxostoma rufums -n01588431 New Zealand wren -n01588725 rock wren, Xenicus gilviventris -n01588996 rifleman bird, Acanthisitta chloris -n01589286 creeper, tree creeper -n01589718 brown creeper, American creeper, Certhia americana -n01589893 European creeper, Certhia familiaris -n01590220 wall creeper, tichodrome, Tichodroma muriaria -n01591005 European nuthatch, Sitta europaea -n01591123 red-breasted nuthatch, Sitta canadensis -n01591301 white-breasted nuthatch, Sitta carolinensis -n01591697 titmouse, tit -n01592084 chickadee -n01592257 black-capped chickadee, blackcap, Parus atricapillus -n01592387 tufted titmouse, Parus bicolor -n01592540 Carolina chickadee, Parus carolinensis -n01592694 blue tit, tomtit, Parus caeruleus -n01593028 bushtit, bush tit -n01593282 wren-tit, Chamaea fasciata -n01593553 verdin, Auriparus flaviceps -n01594004 fairy bluebird, bluebird -n01594372 swallow -n01594787 barn swallow, chimney swallow, Hirundo rustica -n01594968 cliff swallow, Hirundo pyrrhonota -n01595168 tree swallow, tree martin, Hirundo nigricans -n01595450 white-bellied swallow, tree swallow, Iridoprocne bicolor -n01595624 martin -n01595974 house martin, Delichon urbica -n01596273 bank martin, bank swallow, sand martin, Riparia riparia -n01596608 purple martin, Progne subis -n01597022 wood swallow, swallow shrike -n01597336 tanager -n01597737 scarlet tanager, Piranga olivacea, redbird, firebird -n01597906 western tanager, Piranga ludoviciana -n01598074 summer tanager, summer redbird, Piranga rubra -n01598271 hepatic tanager, Piranga flava hepatica -n01598588 shrike -n01598988 butcherbird -n01599159 European shrike, Lanius excubitor -n01599269 northern shrike, Lanius borealis -n01599388 white-rumped shrike, Lanius ludovicianus excubitorides -n01599556 loggerhead shrike, Lanius lucovicianus -n01599741 migrant shrike, Lanius ludovicianus migrans -n01600085 bush shrike -n01600341 black-fronted bush shrike, Chlorophoneus nigrifrons -n01600657 bowerbird, catbird -n01601068 satin bowerbird, satin bird, Ptilonorhynchus violaceus -n01601410 great bowerbird, Chlamydera nuchalis -n01601694 water ouzel, dipper -n01602080 European water ouzel, Cinclus aquaticus -n01602209 American water ouzel, Cinclus mexicanus -n01602630 vireo -n01602832 red-eyed vireo, Vireo olivaceous -n01603000 solitary vireo, Vireo solitarius -n01603152 blue-headed vireo, Vireo solitarius solitarius -n01603600 waxwing -n01603812 cedar waxwing, cedarbird, Bombycilla cedrorun -n01603953 Bohemian waxwing, Bombycilla garrulus -n01604330 bird of prey, raptor, raptorial bird -n01604968 Accipitriformes, order Accipitriformes -n01605630 hawk -n01606097 eyas -n01606177 tiercel, tercel, tercelet -n01606522 goshawk, Accipiter gentilis -n01606672 sparrow hawk, Accipiter nisus -n01606809 Cooper's hawk, blue darter, Accipiter cooperii -n01606978 chicken hawk, hen hawk -n01607309 buteonine -n01607429 redtail, red-tailed hawk, Buteo jamaicensis -n01607600 rough-legged hawk, roughleg, Buteo lagopus -n01607812 red-shouldered hawk, Buteo lineatus -n01607962 buzzard, Buteo buteo -n01608265 honey buzzard, Pernis apivorus -n01608432 kite -n01608814 black kite, Milvus migrans -n01609062 swallow-tailed kite, swallow-tailed hawk, Elanoides forficatus -n01609391 white-tailed kite, Elanus leucurus -n01609751 harrier -n01609956 marsh harrier, Circus Aeruginosus -n01610100 Montagu's harrier, Circus pygargus -n01610226 marsh hawk, northern harrier, hen harrier, Circus cyaneus -n01610552 harrier eagle, short-toed eagle -n01610955 falcon -n01611472 peregrine, peregrine falcon, Falco peregrinus -n01611674 falcon-gentle, falcon-gentil -n01611800 gyrfalcon, gerfalcon, Falco rusticolus -n01611969 kestrel, Falco tinnunculus -n01612122 sparrow hawk, American kestrel, kestrel, Falco sparverius -n01612275 pigeon hawk, merlin, Falco columbarius -n01612476 hobby, Falco subbuteo -n01612628 caracara -n01612955 Audubon's caracara, Polyborus cheriway audubonii -n01613177 carancha, Polyborus plancus -n01613294 eagle, bird of Jove -n01613615 young bird -n01613807 eaglet -n01614038 harpy, harpy eagle, Harpia harpyja -n01614343 golden eagle, Aquila chrysaetos -n01614556 tawny eagle, Aquila rapax -n01614925 bald eagle, American eagle, Haliaeetus leucocephalus -n01615121 sea eagle -n01615303 Kamchatkan sea eagle, Stellar's sea eagle, Haliaeetus pelagicus -n01615458 ern, erne, grey sea eagle, gray sea eagle, European sea eagle, white-tailed sea eagle, Haliatus albicilla -n01615703 fishing eagle, Haliaeetus leucorhyphus -n01616086 osprey, fish hawk, fish eagle, sea eagle, Pandion haliaetus -n01616318 vulture -n01616551 Aegypiidae, family Aegypiidae -n01616764 Old World vulture -n01617095 griffon vulture, griffon, Gyps fulvus -n01617443 bearded vulture, lammergeier, lammergeyer, Gypaetus barbatus -n01617766 Egyptian vulture, Pharaoh's chicken, Neophron percnopterus -n01618082 black vulture, Aegypius monachus -n01618503 secretary bird, Sagittarius serpentarius -n01618922 New World vulture, cathartid -n01619310 buzzard, turkey buzzard, turkey vulture, Cathartes aura -n01619536 condor -n01619835 Andean condor, Vultur gryphus -n01620135 California condor, Gymnogyps californianus -n01620414 black vulture, carrion crow, Coragyps atratus -n01620735 king vulture, Sarcorhamphus papa -n01621127 owl, bird of Minerva, bird of night, hooter -n01621635 owlet -n01622120 little owl, Athene noctua -n01622352 horned owl -n01622483 great horned owl, Bubo virginianus -n01622779 great grey owl, great gray owl, Strix nebulosa -n01622959 tawny owl, Strix aluco -n01623110 barred owl, Strix varia -n01623425 screech owl, Otus asio -n01623615 screech owl -n01623706 scops owl -n01623880 spotted owl, Strix occidentalis -n01624115 Old World scops owl, Otus scops -n01624212 Oriental scops owl, Otus sunia -n01624305 hoot owl -n01624537 hawk owl, Surnia ulula -n01624833 long-eared owl, Asio otus -n01625121 laughing owl, laughing jackass, Sceloglaux albifacies -n01625562 barn owl, Tyto alba -n01627424 amphibian -n01628331 Ichyostega -n01628770 urodele, caudate -n01629276 salamander -n01629819 European fire salamander, Salamandra salamandra -n01629962 spotted salamander, fire salamander, Salamandra maculosa -n01630148 alpine salamander, Salamandra atra -n01630284 newt, triton -n01630670 common newt, Triturus vulgaris -n01630901 red eft, Notophthalmus viridescens -n01631175 Pacific newt -n01631354 rough-skinned newt, Taricha granulosa -n01631512 California newt, Taricha torosa -n01631663 eft -n01632047 ambystomid, ambystomid salamander -n01632308 mole salamander, Ambystoma talpoideum -n01632458 spotted salamander, Ambystoma maculatum -n01632601 tiger salamander, Ambystoma tigrinum -n01632777 axolotl, mud puppy, Ambystoma mexicanum -n01632952 waterdog -n01633406 hellbender, mud puppy, Cryptobranchus alleganiensis -n01633781 giant salamander, Megalobatrachus maximus -n01634227 olm, Proteus anguinus -n01634522 mud puppy, Necturus maculosus -n01635027 dicamptodon, dicamptodontid -n01635176 Pacific giant salamander, Dicamptodon ensatus -n01635480 olympic salamander, Rhyacotriton olympicus -n01636127 lungless salamander, plethodont -n01636352 eastern red-backed salamander, Plethodon cinereus -n01636510 western red-backed salamander, Plethodon vehiculum -n01636829 dusky salamander -n01637112 climbing salamander -n01637338 arboreal salamander, Aneides lugubris -n01637615 slender salamander, worm salamander -n01637932 web-toed salamander -n01638194 Shasta salamander, Hydromantes shastae -n01638329 limestone salamander, Hydromantes brunus -n01638722 amphiuma, congo snake, congo eel, blind eel -n01639187 siren -n01639765 frog, toad, toad frog, anuran, batrachian, salientian -n01640846 true frog, ranid -n01641206 wood-frog, wood frog, Rana sylvatica -n01641391 leopard frog, spring frog, Rana pipiens -n01641577 bullfrog, Rana catesbeiana -n01641739 green frog, spring frog, Rana clamitans -n01641930 cascades frog, Rana cascadae -n01642097 goliath frog, Rana goliath -n01642257 pickerel frog, Rana palustris -n01642391 tarahumara frog, Rana tarahumarae -n01642539 grass frog, Rana temporaria -n01642943 leptodactylid frog, leptodactylid -n01643255 robber frog -n01643507 barking frog, robber frog, Hylactophryne augusti -n01643896 crapaud, South American bullfrog, Leptodactylus pentadactylus -n01644373 tree frog, tree-frog -n01644900 tailed frog, bell toad, ribbed toad, tailed toad, Ascaphus trui -n01645466 Liopelma hamiltoni -n01645776 true toad -n01646292 bufo -n01646388 agua, agua toad, Bufo marinus -n01646555 European toad, Bufo bufo -n01646648 natterjack, Bufo calamita -n01646802 American toad, Bufo americanus -n01646902 Eurasian green toad, Bufo viridis -n01647033 American green toad, Bufo debilis -n01647180 Yosemite toad, Bufo canorus -n01647303 Texas toad, Bufo speciosus -n01647466 southwestern toad, Bufo microscaphus -n01647640 western toad, Bufo boreas -n01648139 obstetrical toad, midwife toad, Alytes obstetricans -n01648356 midwife toad, Alytes cisternasi -n01648620 fire-bellied toad, Bombina bombina -n01649170 spadefoot, spadefoot toad -n01649412 western spadefoot, Scaphiopus hammondii -n01649556 southern spadefoot, Scaphiopus multiplicatus -n01649726 plains spadefoot, Scaphiopus bombifrons -n01650167 tree toad, tree frog, tree-frog -n01650690 spring peeper, Hyla crucifer -n01650901 Pacific tree toad, Hyla regilla -n01651059 canyon treefrog, Hyla arenicolor -n01651285 chameleon tree frog -n01651487 cricket frog -n01651641 northern cricket frog, Acris crepitans -n01651778 eastern cricket frog, Acris gryllus -n01652026 chorus frog -n01652297 lowland burrowing treefrog, northern casque-headed frog, Pternohyla fodiens -n01653026 western narrow-mouthed toad, Gastrophryne olivacea -n01653223 eastern narrow-mouthed toad, Gastrophryne carolinensis -n01653509 sheep frog -n01653773 tongueless frog -n01654083 Surinam toad, Pipa pipa, Pipa americana -n01654637 African clawed frog, Xenopus laevis -n01654863 South American poison toad -n01655344 caecilian, blindworm -n01661091 reptile, reptilian -n01661592 anapsid, anapsid reptile -n01661818 diapsid, diapsid reptile -n01662060 Diapsida, subclass Diapsida -n01662622 chelonian, chelonian reptile -n01662784 turtle -n01663401 sea turtle, marine turtle -n01663782 green turtle, Chelonia mydas -n01664065 loggerhead, loggerhead turtle, Caretta caretta -n01664369 ridley -n01664492 Atlantic ridley, bastard ridley, bastard turtle, Lepidochelys kempii -n01664674 Pacific ridley, olive ridley, Lepidochelys olivacea -n01664990 hawksbill turtle, hawksbill, hawkbill, tortoiseshell turtle, Eretmochelys imbricata -n01665541 leatherback turtle, leatherback, leathery turtle, Dermochelys coriacea -n01665932 snapping turtle -n01666228 common snapping turtle, snapper, Chelydra serpentina -n01666585 alligator snapping turtle, alligator snapper, Macroclemys temmincki -n01667114 mud turtle -n01667432 musk turtle, stinkpot -n01667778 terrapin -n01668091 diamondback terrapin, Malaclemys centrata -n01668436 red-bellied terrapin, red-bellied turtle, redbelly, Pseudemys rubriventris -n01668665 slider, yellow-bellied terrapin, Pseudemys scripta -n01668892 cooter, river cooter, Pseudemys concinna -n01669191 box turtle, box tortoise -n01669372 Western box turtle, Terrapene ornata -n01669654 painted turtle, painted terrapin, painted tortoise, Chrysemys picta -n01670092 tortoise -n01670535 European tortoise, Testudo graeca -n01670802 giant tortoise -n01671125 gopher tortoise, gopher turtle, gopher, Gopherus polypemus -n01671479 desert tortoise, Gopherus agassizii -n01671705 Texas tortoise -n01672032 soft-shelled turtle, pancake turtle -n01672432 spiny softshell, Trionyx spiniferus -n01672611 smooth softshell, Trionyx muticus -n01673282 tuatara, Sphenodon punctatum -n01674216 saurian -n01674464 lizard -n01674990 gecko -n01675352 flying gecko, fringed gecko, Ptychozoon homalocephalum -n01675722 banded gecko -n01676755 iguanid, iguanid lizard -n01677366 common iguana, iguana, Iguana iguana -n01677747 marine iguana, Amblyrhynchus cristatus -n01678043 desert iguana, Dipsosaurus dorsalis -n01678343 chuckwalla, Sauromalus obesus -n01678657 zebra-tailed lizard, gridiron-tailed lizard, Callisaurus draconoides -n01679005 fringe-toed lizard, Uma notata -n01679307 earless lizard -n01679626 collared lizard -n01679962 leopard lizard -n01680264 spiny lizard -n01680478 fence lizard -n01680655 western fence lizard, swift, blue-belly, Sceloporus occidentalis -n01680813 eastern fence lizard, pine lizard, Sceloporus undulatus -n01680983 sagebrush lizard, Sceloporus graciosus -n01681328 side-blotched lizard, sand lizard, Uta stansburiana -n01681653 tree lizard, Urosaurus ornatus -n01681940 horned lizard, horned toad, horny frog -n01682172 Texas horned lizard, Phrynosoma cornutum -n01682435 basilisk -n01682714 American chameleon, anole, Anolis carolinensis -n01683201 worm lizard -n01683558 night lizard -n01684133 skink, scincid, scincid lizard -n01684578 western skink, Eumeces skiltonianus -n01684741 mountain skink, Eumeces callicephalus -n01685439 teiid lizard, teiid -n01685808 whiptail, whiptail lizard -n01686044 racerunner, race runner, six-lined racerunner, Cnemidophorus sexlineatus -n01686220 plateau striped whiptail, Cnemidophorus velox -n01686403 Chihuahuan spotted whiptail, Cnemidophorus exsanguis -n01686609 western whiptail, Cnemidophorus tigris -n01686808 checkered whiptail, Cnemidophorus tesselatus -n01687128 teju -n01687290 caiman lizard -n01687665 agamid, agamid lizard -n01687978 agama -n01688243 frilled lizard, Chlamydosaurus kingi -n01688961 moloch -n01689081 mountain devil, spiny lizard, Moloch horridus -n01689411 anguid lizard -n01689811 alligator lizard -n01690149 blindworm, slowworm, Anguis fragilis -n01690466 glass lizard, glass snake, joint snake -n01691217 legless lizard -n01691652 Lanthanotus borneensis -n01691951 venomous lizard -n01692333 Gila monster, Heloderma suspectum -n01692523 beaded lizard, Mexican beaded lizard, Heloderma horridum -n01692864 lacertid lizard, lacertid -n01693175 sand lizard, Lacerta agilis -n01693334 green lizard, Lacerta viridis -n01693783 chameleon, chamaeleon -n01694178 African chameleon, Chamaeleo chamaeleon -n01694311 horned chameleon, Chamaeleo oweni -n01694709 monitor, monitor lizard, varan -n01694955 African monitor, Varanus niloticus -n01695060 Komodo dragon, Komodo lizard, dragon lizard, giant lizard, Varanus komodoensis -n01696633 crocodilian reptile, crocodilian -n01697178 crocodile -n01697457 African crocodile, Nile crocodile, Crocodylus niloticus -n01697611 Asian crocodile, Crocodylus porosus -n01697749 Morlett's crocodile -n01697978 false gavial, Tomistoma schlegeli -n01698434 alligator, gator -n01698640 American alligator, Alligator mississipiensis -n01698782 Chinese alligator, Alligator sinensis -n01699040 caiman, cayman -n01699254 spectacled caiman, Caiman sclerops -n01699675 gavial, Gavialis gangeticus -n01701551 armored dinosaur -n01701859 stegosaur, stegosaurus, Stegosaur stenops -n01702256 ankylosaur, ankylosaurus -n01702479 Edmontonia -n01703011 bone-headed dinosaur -n01703161 pachycephalosaur, pachycephalosaurus -n01703569 ceratopsian, horned dinosaur -n01704103 protoceratops -n01704323 triceratops -n01704626 styracosaur, styracosaurus -n01705010 psittacosaur, psittacosaurus -n01705591 ornithopod, ornithopod dinosaur -n01705934 hadrosaur, hadrosaurus, duck-billed dinosaur -n01707294 trachodon, trachodont -n01708106 saurischian, saurischian dinosaur -n01708998 sauropod, sauropod dinosaur -n01709484 apatosaur, apatosaurus, brontosaur, brontosaurus, thunder lizard, Apatosaurus excelsus -n01709876 barosaur, barosaurus -n01710177 diplodocus -n01711160 argentinosaur -n01712008 theropod, theropod dinosaur, bird-footed dinosaur -n01712752 ceratosaur, ceratosaurus -n01713170 coelophysis -n01713764 tyrannosaur, tyrannosaurus, Tyrannosaurus rex -n01714231 allosaur, allosaurus -n01715888 ornithomimid -n01717016 maniraptor -n01717229 oviraptorid -n01717467 velociraptor -n01718096 deinonychus -n01718414 utahraptor, superslasher -n01719403 synapsid, synapsid reptile -n01721174 dicynodont -n01721898 pelycosaur -n01722670 dimetrodon -n01722998 pterosaur, flying reptile -n01723579 pterodactyl -n01724231 ichthyosaur -n01724840 ichthyosaurus -n01725086 stenopterygius, Stenopterygius quadrisicissus -n01725713 plesiosaur, plesiosaurus -n01726203 nothosaur -n01726692 snake, serpent, ophidian -n01727646 colubrid snake, colubrid -n01728266 hoop snake -n01728572 thunder snake, worm snake, Carphophis amoenus -n01728920 ringneck snake, ring-necked snake, ring snake -n01729322 hognose snake, puff adder, sand viper -n01729672 leaf-nosed snake -n01729977 green snake, grass snake -n01730185 smooth green snake, Opheodrys vernalis -n01730307 rough green snake, Opheodrys aestivus -n01730563 green snake -n01730812 racer -n01730960 blacksnake, black racer, Coluber constrictor -n01731137 blue racer, Coluber constrictor flaviventris -n01731277 horseshoe whipsnake, Coluber hippocrepis -n01731545 whip-snake, whip snake, whipsnake -n01731764 coachwhip, coachwhip snake, Masticophis flagellum -n01731941 California whipsnake, striped racer, Masticophis lateralis -n01732093 Sonoran whipsnake, Masticophis bilineatus -n01732244 rat snake -n01732614 corn snake, red rat snake, Elaphe guttata -n01732789 black rat snake, blacksnake, pilot blacksnake, mountain blacksnake, Elaphe obsoleta -n01732989 chicken snake -n01733214 Indian rat snake, Ptyas mucosus -n01733466 glossy snake, Arizona elegans -n01733757 bull snake, bull-snake -n01733957 gopher snake, Pituophis melanoleucus -n01734104 pine snake -n01734418 king snake, kingsnake -n01734637 common kingsnake, Lampropeltis getulus -n01734808 milk snake, house snake, milk adder, checkered adder, Lampropeltis triangulum -n01735189 garter snake, grass snake -n01735439 common garter snake, Thamnophis sirtalis -n01735577 ribbon snake, Thamnophis sauritus -n01735728 Western ribbon snake, Thamnophis proximus -n01736032 lined snake, Tropidoclonion lineatum -n01736375 ground snake, Sonora semiannulata -n01736796 eastern ground snake, Potamophis striatula, Haldea striatula -n01737021 water snake -n01737472 common water snake, banded water snake, Natrix sipedon, Nerodia sipedon -n01737728 water moccasin -n01737875 grass snake, ring snake, ringed snake, Natrix natrix -n01738065 viperine grass snake, Natrix maura -n01738306 red-bellied snake, Storeria occipitamaculata -n01738601 sand snake -n01738731 banded sand snake, Chilomeniscus cinctus -n01739094 black-headed snake -n01739381 vine snake -n01739647 lyre snake -n01739871 Sonoran lyre snake, Trimorphodon lambda -n01740131 night snake, Hypsiglena torquata -n01740551 blind snake, worm snake -n01740885 western blind snake, Leptotyphlops humilis -n01741232 indigo snake, gopher snake, Drymarchon corais -n01741442 eastern indigo snake, Drymarchon corais couperi -n01741562 constrictor -n01741943 boa -n01742172 boa constrictor, Constrictor constrictor -n01742447 rubber boa, tow-headed snake, Charina bottae -n01742821 rosy boa, Lichanura trivirgata -n01743086 anaconda, Eunectes murinus -n01743605 python -n01743936 carpet snake, Python variegatus, Morelia spilotes variegatus -n01744100 reticulated python, Python reticulatus -n01744270 Indian python, Python molurus -n01744401 rock python, rock snake, Python sebae -n01744555 amethystine python -n01745125 elapid, elapid snake -n01745484 coral snake, harlequin-snake, New World coral snake -n01745902 eastern coral snake, Micrurus fulvius -n01746191 western coral snake, Micruroides euryxanthus -n01746359 coral snake, Old World coral snake -n01746952 African coral snake, Aspidelaps lubricus -n01747285 Australian coral snake, Rhynchoelaps australis -n01747589 copperhead, Denisonia superba -n01747885 cobra -n01748264 Indian cobra, Naja naja -n01748389 asp, Egyptian cobra, Naja haje -n01748686 black-necked cobra, spitting cobra, Naja nigricollis -n01748906 hamadryad, king cobra, Ophiophagus hannah, Naja hannah -n01749244 ringhals, rinkhals, spitting snake, Hemachatus haemachatus -n01749582 mamba -n01749742 black mamba, Dendroaspis augusticeps -n01749939 green mamba -n01750167 death adder, Acanthophis antarcticus -n01750437 tiger snake, Notechis scutatus -n01750743 Australian blacksnake, Pseudechis porphyriacus -n01751036 krait -n01751215 banded krait, banded adder, Bungarus fasciatus -n01751472 taipan, Oxyuranus scutellatus -n01751748 sea snake -n01752165 viper -n01752585 adder, common viper, Vipera berus -n01752736 asp, asp viper, Vipera aspis -n01753032 puff adder, Bitis arietans -n01753180 gaboon viper, Bitis gabonica -n01753488 horned viper, cerastes, sand viper, horned asp, Cerastes cornutus -n01753959 pit viper -n01754370 copperhead, Agkistrodon contortrix -n01754533 water moccasin, cottonmouth, cottonmouth moccasin, Agkistrodon piscivorus -n01754876 rattlesnake, rattler -n01755581 diamondback, diamondback rattlesnake, Crotalus adamanteus -n01755740 timber rattlesnake, banded rattlesnake, Crotalus horridus horridus -n01755952 canebrake rattlesnake, canebrake rattler, Crotalus horridus atricaudatus -n01756089 prairie rattlesnake, prairie rattler, Western rattlesnake, Crotalus viridis -n01756291 sidewinder, horned rattlesnake, Crotalus cerastes -n01756508 Western diamondback, Western diamondback rattlesnake, Crotalus atrox -n01756733 rock rattlesnake, Crotalus lepidus -n01756916 tiger rattlesnake, Crotalus tigris -n01757115 Mojave rattlesnake, Crotalus scutulatus -n01757343 speckled rattlesnake, Crotalus mitchellii -n01757677 massasauga, massasauga rattler, Sistrurus catenatus -n01757901 ground rattler, massasauga, Sistrurus miliaris -n01758141 fer-de-lance, Bothrops atrops -n01758757 carcase, carcass -n01758895 carrion -n01767661 arthropod -n01768244 trilobite -n01769347 arachnid, arachnoid -n01770081 harvestman, daddy longlegs, Phalangium opilio -n01770393 scorpion -n01770795 false scorpion, pseudoscorpion -n01771100 book scorpion, Chelifer cancroides -n01771417 whip-scorpion, whip scorpion -n01771766 vinegarroon, Mastigoproctus giganteus -n01772222 spider -n01772664 orb-weaving spider -n01773157 black and gold garden spider, Argiope aurantia -n01773549 barn spider, Araneus cavaticus -n01773797 garden spider, Aranea diademata -n01774097 comb-footed spider, theridiid -n01774384 black widow, Latrodectus mactans -n01774750 tarantula -n01775062 wolf spider, hunting spider -n01775370 European wolf spider, tarantula, Lycosa tarentula -n01775730 trap-door spider -n01776192 acarine -n01776313 tick -n01776705 hard tick, ixodid -n01777304 Ixodes dammini, deer tick -n01777467 Ixodes neotomae -n01777649 Ixodes pacificus, western black-legged tick -n01777909 Ixodes scapularis, black-legged tick -n01778217 sheep-tick, sheep tick, Ixodes ricinus -n01778487 Ixodes persulcatus -n01778621 Ixodes dentatus -n01778801 Ixodes spinipalpis -n01779148 wood tick, American dog tick, Dermacentor variabilis -n01779463 soft tick, argasid -n01779629 mite -n01779939 web-spinning mite -n01780142 acarid -n01780426 trombidiid -n01780696 trombiculid -n01781071 harvest mite, chigger, jigger, redbug -n01781570 acarus, genus Acarus -n01781698 itch mite, sarcoptid -n01781875 rust mite -n01782209 spider mite, tetranychid -n01782516 red spider, red spider mite, Panonychus ulmi -n01783017 myriapod -n01783706 garden centipede, garden symphilid, symphilid, Scutigerella immaculata -n01784293 tardigrade -n01784675 centipede -n01785667 house centipede, Scutigera coleoptrata -n01786646 millipede, millepede, milliped -n01787006 sea spider, pycnogonid -n01787191 Merostomata, class Merostomata -n01787835 horseshoe crab, king crab, Limulus polyphemus, Xiphosurus polyphemus -n01788291 Asian horseshoe crab -n01788579 eurypterid -n01788864 tongue worm, pentastomid -n01789386 gallinaceous bird, gallinacean -n01789740 domestic fowl, fowl, poultry -n01790171 Dorking -n01790304 Plymouth Rock -n01790398 Cornish, Cornish fowl -n01790557 Rock Cornish -n01790711 game fowl -n01790812 cochin, cochin china -n01791107 jungle fowl, gallina -n01791314 jungle cock -n01791388 jungle hen -n01791463 red jungle fowl, Gallus gallus -n01791625 chicken, Gallus gallus -n01791954 bantam -n01792042 chick, biddy -n01792158 cock, rooster -n01792429 cockerel -n01792530 capon -n01792640 hen, biddy -n01792808 cackler -n01792955 brood hen, broody, broody hen, setting hen, sitter -n01793085 mother hen -n01793159 layer -n01793249 pullet -n01793340 spring chicken -n01793435 Rhode Island red -n01793565 Dominique, Dominick -n01793715 Orpington -n01794158 turkey, Meleagris gallopavo -n01794344 turkey cock, gobbler, tom, tom turkey -n01794651 ocellated turkey, Agriocharis ocellata -n01795088 grouse -n01795545 black grouse -n01795735 European black grouse, heathfowl, Lyrurus tetrix -n01795900 Asian black grouse, Lyrurus mlokosiewiczi -n01796019 blackcock, black cock -n01796105 greyhen, grayhen, grey hen, gray hen, heath hen -n01796340 ptarmigan -n01796519 red grouse, moorfowl, moorbird, moor-bird, moorgame, Lagopus scoticus -n01796729 moorhen -n01797020 capercaillie, capercailzie, horse of the wood, Tetrao urogallus -n01797307 spruce grouse, Canachites canadensis -n01797601 sage grouse, sage hen, Centrocercus urophasianus -n01797886 ruffed grouse, partridge, Bonasa umbellus -n01798168 sharp-tailed grouse, sprigtail, sprig tail, Pedioecetes phasianellus -n01798484 prairie chicken, prairie grouse, prairie fowl -n01798706 greater prairie chicken, Tympanuchus cupido -n01798839 lesser prairie chicken, Tympanuchus pallidicinctus -n01798979 heath hen, Tympanuchus cupido cupido -n01799302 guan -n01799679 curassow -n01800195 piping guan -n01800424 chachalaca -n01800633 Texas chachalaca, Ortilis vetula macalli -n01801088 megapode, mound bird, mound-bird, mound builder, scrub fowl -n01801479 mallee fowl, leipoa, lowan, Leipoa ocellata -n01801672 mallee hen -n01801876 brush turkey, Alectura lathami -n01802159 maleo, Macrocephalon maleo -n01802721 phasianid -n01803078 pheasant -n01803362 ring-necked pheasant, Phasianus colchicus -n01803641 afropavo, Congo peafowl, Afropavo congensis -n01803893 argus, argus pheasant -n01804163 golden pheasant, Chrysolophus pictus -n01804478 bobwhite, bobwhite quail, partridge -n01804653 northern bobwhite, Colinus virginianus -n01804921 Old World quail -n01805070 migratory quail, Coturnix coturnix, Coturnix communis -n01805321 monal, monaul -n01805801 peafowl, bird of Juno -n01806061 peachick, pea-chick -n01806143 peacock -n01806297 peahen -n01806364 blue peafowl, Pavo cristatus -n01806467 green peafowl, Pavo muticus -n01806567 quail -n01806847 California quail, Lofortyx californicus -n01807105 tragopan -n01807496 partridge -n01807828 Hungarian partridge, grey partridge, gray partridge, Perdix perdix -n01808140 red-legged partridge, Alectoris ruffa -n01808291 Greek partridge, rock partridge, Alectoris graeca -n01808596 mountain quail, mountain partridge, Oreortyx picta palmeri -n01809106 guinea fowl, guinea, Numida meleagris -n01809371 guinea hen -n01809752 hoatzin, hoactzin, stinkbird, Opisthocomus hoazin -n01810268 tinamou, partridge -n01810700 columbiform bird -n01811243 dodo, Raphus cucullatus -n01811909 pigeon -n01812187 pouter pigeon, pouter -n01812337 dove -n01812662 rock dove, rock pigeon, Columba livia -n01812866 band-tailed pigeon, band-tail pigeon, bandtail, Columba fasciata -n01813088 wood pigeon, ringdove, cushat, Columba palumbus -n01813385 turtledove -n01813532 Streptopelia turtur -n01813658 ringdove, Streptopelia risoria -n01813948 Australian turtledove, turtledove, Stictopelia cuneata -n01814217 mourning dove, Zenaidura macroura -n01814370 domestic pigeon -n01814549 squab -n01814620 fairy swallow -n01814755 roller, tumbler, tumbler pigeon -n01814921 homing pigeon, homer -n01815036 carrier pigeon -n01815270 passenger pigeon, Ectopistes migratorius -n01815601 sandgrouse, sand grouse -n01816017 painted sandgrouse, Pterocles indicus -n01816140 pin-tailed sandgrouse, pin-tailed grouse, Pterocles alchata -n01816474 pallas's sandgrouse, Syrrhaptes paradoxus -n01816887 parrot -n01817263 popinjay -n01817346 poll, poll parrot -n01817953 African grey, African gray, Psittacus erithacus -n01818299 amazon -n01818515 macaw -n01818832 kea, Nestor notabilis -n01819115 cockatoo -n01819313 sulphur-crested cockatoo, Kakatoe galerita, Cacatua galerita -n01819465 pink cockatoo, Kakatoe leadbeateri -n01819734 cockateel, cockatiel, cockatoo parrot, Nymphicus hollandicus -n01820052 lovebird -n01820348 lory -n01820546 lorikeet -n01820801 varied Lorikeet, Glossopsitta versicolor -n01821076 rainbow lorikeet, Trichoglossus moluccanus -n01821203 parakeet, parrakeet, parroket, paraquet, paroquet, parroquet -n01821554 Carolina parakeet, Conuropsis carolinensis -n01821869 budgerigar, budgereegah, budgerygah, budgie, grass parakeet, lovebird, shell parakeet, Melopsittacus undulatus -n01822300 ring-necked parakeet, Psittacula krameri -n01822602 cuculiform bird -n01823013 cuckoo -n01823414 European cuckoo, Cuculus canorus -n01823740 black-billed cuckoo, Coccyzus erythropthalmus -n01824035 roadrunner, chaparral cock, Geococcyx californianus -n01824344 ani -n01824575 coucal -n01824749 crow pheasant, Centropus sinensis -n01825278 touraco, turaco, turacou, turakoo -n01825930 coraciiform bird -n01826364 roller -n01826680 European roller, Coracias garrulus -n01826844 ground roller -n01827403 kingfisher -n01827793 Eurasian kingfisher, Alcedo atthis -n01828096 belted kingfisher, Ceryle alcyon -n01828556 kookaburra, laughing jackass, Dacelo gigas -n01828970 bee eater -n01829413 hornbill -n01829869 hoopoe, hoopoo -n01830042 Euopean hoopoe, Upupa epops -n01830479 wood hoopoe -n01830915 motmot, momot -n01831360 tody -n01831712 apodiform bird -n01832167 swift -n01832493 European swift, Apus apus -n01832813 chimney swift, chimney swallow, Chateura pelagica -n01833112 swiftlet, Collocalia inexpectata -n01833415 tree swift, crested swift -n01833805 hummingbird -n01834177 Archilochus colubris -n01834540 thornbill -n01835276 goatsucker, nightjar, caprimulgid -n01835769 European goatsucker, European nightjar, Caprimulgus europaeus -n01835918 chuck-will's-widow, Caprimulgus carolinensis -n01836087 whippoorwill, Caprimulgus vociferus -n01836673 poorwill, Phalaenoptilus nuttallii -n01837072 frogmouth -n01837526 oilbird, guacharo, Steatornis caripensis -n01838038 piciform bird -n01838598 woodpecker, peckerwood, pecker -n01839086 green woodpecker, Picus viridis -n01839330 downy woodpecker -n01839598 flicker -n01839750 yellow-shafted flicker, Colaptes auratus, yellowhammer -n01839949 gilded flicker, Colaptes chrysoides -n01840120 red-shafted flicker, Colaptes caper collaris -n01840412 ivorybill, ivory-billed woodpecker, Campephilus principalis -n01840775 redheaded woodpecker, redhead, Melanerpes erythrocephalus -n01841102 sapsucker -n01841288 yellow-bellied sapsucker, Sphyrapicus varius -n01841441 red-breasted sapsucker, Sphyrapicus varius ruber -n01841679 wryneck -n01841943 piculet -n01842235 barbet -n01842504 puffbird -n01842788 honey guide -n01843065 jacamar -n01843383 toucan -n01843719 toucanet -n01844231 trogon -n01844551 quetzal, quetzal bird -n01844746 resplendent quetzel, resplendent trogon, Pharomacrus mocino -n01844917 aquatic bird -n01845132 waterfowl, water bird, waterbird -n01845477 anseriform bird -n01846331 duck -n01847000 drake -n01847089 quack-quack -n01847170 duckling -n01847253 diving duck -n01847407 dabbling duck, dabbler -n01847806 mallard, Anas platyrhynchos -n01847978 black duck, Anas rubripes -n01848123 teal -n01848323 greenwing, green-winged teal, Anas crecca -n01848453 bluewing, blue-winged teal, Anas discors -n01848555 garganey, Anas querquedula -n01848648 widgeon, wigeon, Anas penelope -n01848840 American widgeon, baldpate, Anas americana -n01848976 shoveler, shoveller, broadbill, Anas clypeata -n01849157 pintail, pin-tailed duck, Anas acuta -n01849466 sheldrake -n01849676 shelduck -n01849863 ruddy duck, Oxyura jamaicensis -n01850192 bufflehead, butterball, dipper, Bucephela albeola -n01850373 goldeneye, whistler, Bucephela clangula -n01850553 Barrow's goldeneye, Bucephala islandica -n01850873 canvasback, canvasback duck, Aythya valisineria -n01851038 pochard, Aythya ferina -n01851207 redhead, Aythya americana -n01851375 scaup, scaup duck, bluebill, broadbill -n01851573 greater scaup, Aythya marila -n01851731 lesser scaup, lesser scaup duck, lake duck, Aythya affinis -n01851895 wild duck -n01852142 wood duck, summer duck, wood widgeon, Aix sponsa -n01852329 wood drake -n01852400 mandarin duck, Aix galericulata -n01852671 muscovy duck, musk duck, Cairina moschata -n01852861 sea duck -n01853195 eider, eider duck -n01853498 scoter, scooter -n01853666 common scoter, Melanitta nigra -n01853870 old squaw, oldwife, Clangula hyemalis -n01854415 merganser, fish duck, sawbill, sheldrake -n01854700 goosander, Mergus merganser -n01854838 American merganser, Mergus merganser americanus -n01855032 red-breasted merganser, Mergus serrator -n01855188 smew, Mergus albellus -n01855476 hooded merganser, hooded sheldrake, Lophodytes cucullatus -n01855672 goose -n01856072 gosling -n01856155 gander -n01856380 Chinese goose, Anser cygnoides -n01856553 greylag, graylag, greylag goose, graylag goose, Anser anser -n01856890 blue goose, Chen caerulescens -n01857079 snow goose -n01857325 brant, brant goose, brent, brent goose -n01857512 common brant goose, Branta bernicla -n01857632 honker, Canada goose, Canadian goose, Branta canadensis -n01857851 barnacle goose, barnacle, Branta leucopsis -n01858281 coscoroba -n01858441 swan -n01858780 cob -n01858845 pen -n01858906 cygnet -n01859190 mute swan, Cygnus olor -n01859325 whooper, whooper swan, Cygnus cygnus -n01859496 tundra swan, Cygnus columbianus -n01859689 whistling swan, Cygnus columbianus columbianus -n01859852 Bewick's swan, Cygnus columbianus bewickii -n01860002 trumpeter, trumpeter swan, Cygnus buccinator -n01860187 black swan, Cygnus atratus -n01860497 screamer -n01860864 horned screamer, Anhima cornuta -n01861148 crested screamer -n01861330 chaja, Chauna torquata -n01861778 mammal, mammalian -n01862399 female mammal -n01871265 tusker -n01871543 prototherian -n01871875 monotreme, egg-laying mammal -n01872401 echidna, spiny anteater, anteater -n01872772 echidna, spiny anteater, anteater -n01873310 platypus, duckbill, duckbilled platypus, duck-billed platypus, Ornithorhynchus anatinus -n01874434 marsupial, pouched mammal -n01874928 opossum, possum -n01875313 common opossum, Didelphis virginiana, Didelphis marsupialis -n01875610 crab-eating opossum -n01876034 opossum rat -n01876326 bandicoot -n01876667 rabbit-eared bandicoot, rabbit bandicoot, bilby, Macrotis lagotis -n01877134 kangaroo -n01877606 giant kangaroo, great grey kangaroo, Macropus giganteus -n01877812 wallaby, brush kangaroo -n01878061 common wallaby, Macropus agiles -n01878335 hare wallaby, kangaroo hare -n01878639 nail-tailed wallaby, nail-tailed kangaroo -n01878929 rock wallaby, rock kangaroo -n01879217 pademelon, paddymelon -n01879509 tree wallaby, tree kangaroo -n01879837 musk kangaroo, Hypsiprymnodon moschatus -n01880152 rat kangaroo, kangaroo rat -n01880473 potoroo -n01880716 bettong -n01880813 jerboa kangaroo, kangaroo jerboa -n01881171 phalanger, opossum, possum -n01881564 cuscus -n01881857 brush-tailed phalanger, Trichosurus vulpecula -n01882125 flying phalanger, flying opossum, flying squirrel -n01882714 koala, koala bear, kangaroo bear, native bear, Phascolarctos cinereus -n01883070 wombat -n01883513 dasyurid marsupial, dasyurid -n01883920 dasyure -n01884104 eastern dasyure, Dasyurus quoll -n01884203 native cat, Dasyurus viverrinus -n01884476 thylacine, Tasmanian wolf, Tasmanian tiger, Thylacinus cynocephalus -n01884834 Tasmanian devil, ursine dasyure, Sarcophilus hariisi -n01885158 pouched mouse, marsupial mouse, marsupial rat -n01885498 numbat, banded anteater, anteater, Myrmecobius fasciatus -n01886045 pouched mole, marsupial mole, Notoryctus typhlops -n01886756 placental, placental mammal, eutherian, eutherian mammal -n01887474 livestock, stock, farm animal -n01887623 bull -n01887787 cow -n01887896 calf -n01888045 calf -n01888181 yearling -n01888264 buck -n01888411 doe -n01889074 insectivore -n01889520 mole -n01889849 starnose mole, star-nosed mole, Condylura cristata -n01890144 brewer's mole, hair-tailed mole, Parascalops breweri -n01890564 golden mole -n01890860 shrew mole -n01891013 Asiatic shrew mole, Uropsilus soricipes -n01891274 American shrew mole, Neurotrichus gibbsii -n01891633 shrew, shrewmouse -n01892030 common shrew, Sorex araneus -n01892145 masked shrew, Sorex cinereus -n01892385 short-tailed shrew, Blarina brevicauda -n01892551 water shrew -n01892744 American water shrew, Sorex palustris -n01893021 European water shrew, Neomys fodiens -n01893164 Mediterranean water shrew, Neomys anomalus -n01893399 least shrew, Cryptotis parva -n01893825 hedgehog, Erinaceus europaeus, Erinaceus europeaeus -n01894207 tenrec, tendrac -n01894522 tailless tenrec, Tenrec ecaudatus -n01894956 otter shrew, potamogale, Potamogale velox -n01896844 eiderdown -n01897257 aftershaft -n01897426 sickle feather -n01897536 contour feather -n01897667 bastard wing, alula, spurious wing -n01898593 saddle hackle, saddle feather -n01899894 encolure -n01900150 hair -n01903234 squama -n01903346 scute -n01903498 sclerite -n01904029 plastron -n01904806 scallop shell -n01904886 oyster shell -n01905321 theca -n01905661 invertebrate -n01906749 sponge, poriferan, parazoan -n01907287 choanocyte, collar cell -n01907738 glass sponge -n01908042 Venus's flower basket -n01908958 metazoan -n01909422 coelenterate, cnidarian -n01909788 planula -n01909906 polyp -n01910252 medusa, medusoid, medusan -n01910747 jellyfish -n01911063 scyphozoan -n01911403 Chrysaora quinquecirrha -n01911839 hydrozoan, hydroid -n01912152 hydra -n01912454 siphonophore -n01912809 nanomia -n01913166 Portuguese man-of-war, man-of-war, jellyfish -n01913346 praya -n01913440 apolemia -n01914163 anthozoan, actinozoan -n01914609 sea anemone, anemone -n01914830 actinia, actinian, actiniarian -n01915700 sea pen -n01915811 coral -n01916187 gorgonian, gorgonian coral -n01916388 sea feather -n01916481 sea fan -n01916588 red coral -n01916925 stony coral, madrepore, madriporian coral -n01917289 brain coral -n01917611 staghorn coral, stag's-horn coral -n01917882 mushroom coral -n01918744 ctenophore, comb jelly -n01919385 beroe -n01920051 platyctenean -n01920438 sea gooseberry -n01921059 Venus's girdle, Cestum veneris -n01922303 worm -n01922717 helminth, parasitic worm -n01922948 woodworm -n01923025 woodborer, borer -n01923404 acanthocephalan, spiny-headed worm -n01923890 arrowworm, chaetognath -n01924800 bladder worm -n01924916 flatworm, platyhelminth -n01925270 planarian, planaria -n01925695 fluke, trematode, trematode worm -n01925916 cercaria -n01926379 liver fluke, Fasciola hepatica -n01926689 Fasciolopsis buski -n01927159 schistosome, blood fluke -n01927456 tapeworm, cestode -n01927928 echinococcus -n01928215 taenia -n01928517 ribbon worm, nemertean, nemertine, proboscis worm -n01928865 beard worm, pogonophoran -n01929186 rotifer -n01930112 nematode, nematode worm, roundworm -n01930852 common roundworm, Ascaris lumbricoides -n01931140 chicken roundworm, Ascaridia galli -n01931520 pinworm, threadworm, Enterobius vermicularis -n01931714 eelworm -n01932151 vinegar eel, vinegar worm, Anguillula aceti, Turbatrix aceti -n01932936 trichina, Trichinella spiralis -n01933151 hookworm -n01933478 filaria -n01933988 Guinea worm, Dracunculus medinensis -n01934440 annelid, annelid worm, segmented worm -n01934844 archiannelid -n01935176 oligochaete, oligochaete worm -n01935395 earthworm, angleworm, fishworm, fishing worm, wiggler, nightwalker, nightcrawler, crawler, dew worm, red worm -n01936391 polychaete, polychete, polychaete worm, polychete worm -n01936671 lugworm, lug, lobworm -n01936858 sea mouse -n01937579 bloodworm -n01937909 leech, bloodsucker, hirudinean -n01938454 medicinal leech, Hirudo medicinalis -n01938735 horseleech -n01940736 mollusk, mollusc, shellfish -n01941223 scaphopod -n01941340 tooth shell, tusk shell -n01942177 gastropod, univalve -n01942869 abalone, ear-shell -n01943087 ormer, sea-ear, Haliotis tuberculata -n01943541 scorpion shell -n01943899 conch -n01944118 giant conch, Strombus gigas -n01944390 snail -n01944812 edible snail, Helix pomatia -n01944955 garden snail -n01945143 brown snail, Helix aspersa -n01945340 Helix hortensis -n01945685 slug -n01945845 seasnail -n01946277 neritid, neritid gastropod -n01946630 nerita -n01946827 bleeding tooth, Nerita peloronta -n01947139 neritina -n01947396 whelk -n01947997 moon shell, moonshell -n01948446 periwinkle, winkle -n01948573 limpet -n01949085 common limpet, Patella vulgata -n01949499 keyhole limpet, Fissurella apertura, Diodora apertura -n01949973 river limpet, freshwater limpet, Ancylus fluviatilis -n01950731 sea slug, nudibranch -n01951274 sea hare, Aplysia punctata -n01951613 Hermissenda crassicornis -n01952029 bubble shell -n01952712 physa -n01953361 cowrie, cowry -n01953594 money cowrie, Cypraea moneta -n01953762 tiger cowrie, Cypraea tigris -n01954516 solenogaster, aplacophoran -n01955084 chiton, coat-of-mail shell, sea cradle, polyplacophore -n01955933 bivalve, pelecypod, lamellibranch -n01956344 spat -n01956481 clam -n01956764 seashell -n01957335 soft-shell clam, steamer, steamer clam, long-neck clam, Mya arenaria -n01958038 quahog, quahaug, hard-shell clam, hard clam, round clam, Venus mercenaria, Mercenaria mercenaria -n01958346 littleneck, littleneck clam -n01958435 cherrystone, cherrystone clam -n01958531 geoduck -n01959029 razor clam, jackknife clam, knife-handle -n01959492 giant clam, Tridacna gigas -n01959985 cockle -n01960177 edible cockle, Cardium edule -n01960459 oyster -n01961234 Japanese oyster, Ostrea gigas -n01961600 Virginia oyster -n01961985 pearl oyster, Pinctada margaritifera -n01962506 saddle oyster, Anomia ephippium -n01962788 window oyster, windowpane oyster, capiz, Placuna placenta -n01963317 ark shell -n01963479 blood clam -n01963571 mussel -n01964049 marine mussel, mytilid -n01964271 edible mussel, Mytilus edulis -n01964441 freshwater mussel, freshwater clam -n01964957 pearly-shelled mussel -n01965252 thin-shelled mussel -n01965529 zebra mussel, Dreissena polymorpha -n01965889 scallop, scollop, escallop -n01966377 bay scallop, Pecten irradians -n01966586 sea scallop, giant scallop, Pecten magellanicus -n01967094 shipworm, teredinid -n01967308 teredo -n01967963 piddock -n01968315 cephalopod, cephalopod mollusk -n01968897 chambered nautilus, pearly nautilus, nautilus -n01969726 octopod -n01970164 octopus, devilfish -n01970667 paper nautilus, nautilus, Argonaut, Argonauta argo -n01971094 decapod -n01971280 squid -n01971620 loligo -n01971850 ommastrephes -n01972131 architeuthis, giant squid -n01972541 cuttlefish, cuttle -n01973148 spirula, Spirula peronii -n01974773 crustacean -n01975687 malacostracan crustacean -n01976146 decapod crustacean, decapod -n01976868 brachyuran -n01976957 crab -n01977485 stone crab, Menippe mercenaria -n01978010 hard-shell crab -n01978136 soft-shell crab, soft-shelled crab -n01978287 Dungeness crab, Cancer magister -n01978455 rock crab, Cancer irroratus -n01978587 Jonah crab, Cancer borealis -n01978930 swimming crab -n01979269 English lady crab, Portunus puber -n01979526 American lady crab, lady crab, calico crab, Ovalipes ocellatus -n01979874 blue crab, Callinectes sapidus -n01980166 fiddler crab -n01980655 pea crab -n01981276 king crab, Alaska crab, Alaskan king crab, Alaska king crab, Paralithodes camtschatica -n01981702 spider crab -n01982068 European spider crab, king crab, Maja squinado -n01982347 giant crab, Macrocheira kaempferi -n01982650 lobster -n01983048 true lobster -n01983481 American lobster, Northern lobster, Maine lobster, Homarus americanus -n01983674 European lobster, Homarus vulgaris -n01983829 Cape lobster, Homarus capensis -n01984245 Norway lobster, Nephrops norvegicus -n01984695 spiny lobster, langouste, rock lobster, crawfish, crayfish, sea crawfish -n01985128 crayfish, crawfish, crawdad, crawdaddy -n01985493 Old World crayfish, ecrevisse -n01985797 American crayfish -n01986214 hermit crab -n01986806 shrimp -n01987076 snapping shrimp, pistol shrimp -n01987545 prawn -n01987727 long-clawed prawn, river prawn, Palaemon australis -n01988203 tropical prawn -n01988701 krill -n01988869 Euphausia pacifica -n01989516 opossum shrimp -n01989869 stomatopod, stomatopod crustacean -n01990007 mantis shrimp, mantis crab -n01990516 squilla, mantis prawn -n01990800 isopod -n01991028 woodlouse, slater -n01991520 pill bug -n01992262 sow bug -n01992423 sea louse, sea slater -n01992773 amphipod -n01993525 skeleton shrimp -n01993830 whale louse -n01994910 daphnia, water flea -n01995514 fairy shrimp -n01995686 brine shrimp, Artemia salina -n01996280 tadpole shrimp -n01996585 copepod, copepod crustacean -n01997119 cyclops, water flea -n01997825 seed shrimp, mussel shrimp, ostracod -n01998183 barnacle, cirriped, cirripede -n01998741 acorn barnacle, rock barnacle, Balanus balanoides -n01999186 goose barnacle, gooseneck barnacle, Lepas fascicularis -n01999767 onychophoran, velvet worm, peripatus -n02000954 wading bird, wader -n02002075 stork -n02002556 white stork, Ciconia ciconia -n02002724 black stork, Ciconia nigra -n02003037 adjutant bird, adjutant, adjutant stork, Leptoptilus dubius -n02003204 marabou, marabout, marabou stork, Leptoptilus crumeniferus -n02003577 openbill -n02003839 jabiru, Jabiru mycteria -n02004131 saddlebill, jabiru, Ephippiorhynchus senegalensis -n02004492 policeman bird, black-necked stork, jabiru, Xenorhyncus asiaticus -n02004855 wood ibis, wood stork, flinthead, Mycteria americana -n02005399 shoebill, shoebird, Balaeniceps rex -n02005790 ibis -n02006063 wood ibis, wood stork, Ibis ibis -n02006364 sacred ibis, Threskiornis aethiopica -n02006656 spoonbill -n02006985 common spoonbill, Platalea leucorodia -n02007284 roseate spoonbill, Ajaia ajaja -n02007558 flamingo -n02008041 heron -n02008497 great blue heron, Ardea herodius -n02008643 great white heron, Ardea occidentalis -n02008796 egret -n02009229 little blue heron, Egretta caerulea -n02009380 snowy egret, snowy heron, Egretta thula -n02009508 little egret, Egretta garzetta -n02009750 great white heron, Casmerodius albus -n02009912 American egret, great white heron, Egretta albus -n02010272 cattle egret, Bubulcus ibis -n02010453 night heron, night raven -n02010728 black-crowned night heron, Nycticorax nycticorax -n02011016 yellow-crowned night heron, Nyctanassa violacea -n02011281 boatbill, boat-billed heron, broadbill, Cochlearius cochlearius -n02011460 bittern -n02011805 American bittern, stake driver, Botaurus lentiginosus -n02011943 European bittern, Botaurus stellaris -n02012185 least bittern, Ixobrychus exilis -n02012849 crane -n02013177 whooping crane, whooper, Grus americana -n02013567 courlan, Aramus guarauna -n02013706 limpkin, Aramus pictus -n02014237 crested cariama, seriema, Cariama cristata -n02014524 chunga, seriema, Chunga burmeisteri -n02014941 rail -n02015357 weka, maori hen, wood hen -n02015554 crake -n02015797 corncrake, land rail, Crex crex -n02016066 spotted crake, Porzana porzana -n02016358 gallinule, marsh hen, water hen, swamphen -n02016659 Florida gallinule, Gallinula chloropus cachinnans -n02016816 moorhen, Gallinula chloropus -n02016956 purple gallinule -n02017213 European gallinule, Porphyrio porphyrio -n02017475 American gallinule, Porphyrula martinica -n02017725 notornis, takahe, Notornis mantelli -n02018027 coot -n02018207 American coot, marsh hen, mud hen, water hen, Fulica americana -n02018368 Old World coot, Fulica atra -n02018795 bustard -n02019190 great bustard, Otis tarda -n02019438 plain turkey, Choriotis australis -n02019929 button quail, button-quail, bustard quail, hemipode -n02020219 striped button quail, Turnix sylvatica -n02020578 plain wanderer, Pedionomus torquatus -n02021050 trumpeter -n02021281 Brazilian trumpeter, Psophia crepitans -n02021795 seabird, sea bird, seafowl -n02022684 shorebird, shore bird, limicoline bird -n02023341 plover -n02023855 piping plover, Charadrius melodus -n02023992 killdeer, kildeer, killdeer plover, Charadrius vociferus -n02024185 dotterel, dotrel, Charadrius morinellus, Eudromias morinellus -n02024479 golden plover -n02024763 lapwing, green plover, peewit, pewit -n02025043 turnstone -n02025239 ruddy turnstone, Arenaria interpres -n02025389 black turnstone, Arenaria-Melanocephala -n02026059 sandpiper -n02026629 surfbird, Aphriza virgata -n02026948 European sandpiper, Actitis hypoleucos -n02027075 spotted sandpiper, Actitis macularia -n02027357 least sandpiper, stint, Erolia minutilla -n02027492 red-backed sandpiper, dunlin, Erolia alpina -n02027897 greenshank, Tringa nebularia -n02028035 redshank, Tringa totanus -n02028175 yellowlegs -n02028342 greater yellowlegs, Tringa melanoleuca -n02028451 lesser yellowlegs, Tringa flavipes -n02028727 pectoral sandpiper, jacksnipe, Calidris melanotos -n02028900 knot, greyback, grayback, Calidris canutus -n02029087 curlew sandpiper, Calidris Ferruginea -n02029378 sanderling, Crocethia alba -n02029706 upland sandpiper, upland plover, Bartramian sandpiper, Bartramia longicauda -n02030035 ruff, Philomachus pugnax -n02030224 reeve -n02030287 tattler -n02030568 Polynesian tattler, Heteroscelus incanus -n02030837 willet, Catoptrophorus semipalmatus -n02030996 woodcock -n02031298 Eurasian woodcock, Scolopax rusticola -n02031585 American woodcock, woodcock snipe, Philohela minor -n02031934 snipe -n02032222 whole snipe, Gallinago gallinago -n02032355 Wilson's snipe, Gallinago gallinago delicata -n02032480 great snipe, woodcock snipe, Gallinago media -n02032769 jacksnipe, half snipe, Limnocryptes minima -n02033041 dowitcher -n02033208 greyback, grayback, Limnodromus griseus -n02033324 red-breasted snipe, Limnodromus scolopaceus -n02033561 curlew -n02033779 European curlew, Numenius arquata -n02033882 Eskimo curlew, Numenius borealis -n02034129 godwit -n02034295 Hudsonian godwit, Limosa haemastica -n02034661 stilt, stiltbird, longlegs, long-legs, stilt plover, Himantopus stilt -n02034971 black-necked stilt, Himantopus mexicanus -n02035210 black-winged stilt, Himantopus himantopus -n02035402 white-headed stilt, Himantopus himantopus leucocephalus -n02035656 kaki, Himantopus novae-zelandiae -n02036053 stilt, Australian stilt -n02036228 banded stilt, Cladorhyncus leucocephalum -n02036711 avocet -n02037110 oystercatcher, oyster catcher -n02037464 phalarope -n02037869 red phalarope, Phalaropus fulicarius -n02038141 northern phalarope, Lobipes lobatus -n02038466 Wilson's phalarope, Steganopus tricolor -n02038993 pratincole, glareole -n02039171 courser -n02039497 cream-colored courser, Cursorius cursor -n02039780 crocodile bird, Pluvianus aegyptius -n02040266 stone curlew, thick-knee, Burhinus oedicnemus -n02040505 coastal diving bird -n02041085 larid -n02041246 gull, seagull, sea gull -n02041678 mew, mew gull, sea mew, Larus canus -n02041875 black-backed gull, great black-backed gull, cob, Larus marinus -n02042046 herring gull, Larus argentatus -n02042180 laughing gull, blackcap, pewit, pewit gull, Larus ridibundus -n02042472 ivory gull, Pagophila eburnea -n02042759 kittiwake -n02043063 tern -n02043333 sea swallow, Sterna hirundo -n02043808 skimmer -n02044178 jaeger -n02044517 parasitic jaeger, arctic skua, Stercorarius parasiticus -n02044778 skua, bonxie -n02044908 great skua, Catharacta skua -n02045369 auk -n02045596 auklet -n02045864 razorbill, razor-billed auk, Alca torda -n02046171 little auk, dovekie, Plautus alle -n02046759 guillemot -n02046939 black guillemot, Cepphus grylle -n02047045 pigeon guillemot, Cepphus columba -n02047260 murre -n02047411 common murre, Uria aalge -n02047517 thick-billed murre, Uria lomvia -n02047614 puffin -n02047975 Atlantic puffin, Fratercula arctica -n02048115 horned puffin, Fratercula corniculata -n02048353 tufted puffin, Lunda cirrhata -n02048698 gaviiform seabird -n02049088 loon, diver -n02049532 podicipitiform seabird -n02050004 grebe -n02050313 great crested grebe, Podiceps cristatus -n02050442 red-necked grebe, Podiceps grisegena -n02050586 black-necked grebe, eared grebe, Podiceps nigricollis -n02050809 dabchick, little grebe, Podiceps ruficollis -n02051059 pied-billed grebe, Podilymbus podiceps -n02051474 pelecaniform seabird -n02051845 pelican -n02052204 white pelican, Pelecanus erythrorhynchos -n02052365 Old world white pelican, Pelecanus onocrotalus -n02052775 frigate bird, man-of-war bird -n02053083 gannet -n02053425 solan, solan goose, solant goose, Sula bassana -n02053584 booby -n02054036 cormorant, Phalacrocorax carbo -n02054502 snakebird, anhinga, darter -n02054711 water turkey, Anhinga anhinga -n02055107 tropic bird, tropicbird, boatswain bird -n02055658 sphenisciform seabird -n02055803 penguin -n02056228 Adelie, Adelie penguin, Pygoscelis adeliae -n02056570 king penguin, Aptenodytes patagonica -n02056728 emperor penguin, Aptenodytes forsteri -n02057035 jackass penguin, Spheniscus demersus -n02057330 rock hopper, crested penguin -n02057731 pelagic bird, oceanic bird -n02057898 procellariiform seabird -n02058221 albatross, mollymawk -n02058594 wandering albatross, Diomedea exulans -n02058747 black-footed albatross, gooney, gooney bird, goonie, goony, Diomedea nigripes -n02059162 petrel -n02059541 white-chinned petrel, Procellaria aequinoctialis -n02059852 giant petrel, giant fulmar, Macronectes giganteus -n02060133 fulmar, fulmar petrel, Fulmarus glacialis -n02060411 shearwater -n02060569 Manx shearwater, Puffinus puffinus -n02060889 storm petrel -n02061217 stormy petrel, northern storm petrel, Hydrobates pelagicus -n02061560 Mother Carey's chicken, Mother Carey's hen, Oceanites oceanicus -n02061853 diving petrel -n02062017 aquatic mammal -n02062430 cetacean, cetacean mammal, blower -n02062744 whale -n02063224 baleen whale, whalebone whale -n02063662 right whale -n02064000 bowhead, bowhead whale, Greenland whale, Balaena mysticetus -n02064338 rorqual, razorback -n02064816 blue whale, sulfur bottom, Balaenoptera musculus -n02065026 finback, finback whale, fin whale, common rorqual, Balaenoptera physalus -n02065263 sei whale, Balaenoptera borealis -n02065407 lesser rorqual, piked whale, minke whale, Balaenoptera acutorostrata -n02065726 humpback, humpback whale, Megaptera novaeangliae -n02066245 grey whale, gray whale, devilfish, Eschrichtius gibbosus, Eschrichtius robustus -n02066707 toothed whale -n02067240 sperm whale, cachalot, black whale, Physeter catodon -n02067603 pygmy sperm whale, Kogia breviceps -n02067768 dwarf sperm whale, Kogia simus -n02068206 beaked whale -n02068541 bottle-nosed whale, bottlenose whale, bottlenose, Hyperoodon ampullatus -n02068974 dolphin -n02069412 common dolphin, Delphinus delphis -n02069701 bottlenose dolphin, bottle-nosed dolphin, bottlenose -n02069974 Atlantic bottlenose dolphin, Tursiops truncatus -n02070174 Pacific bottlenose dolphin, Tursiops gilli -n02070430 porpoise -n02070624 harbor porpoise, herring hog, Phocoena phocoena -n02070776 vaquita, Phocoena sinus -n02071028 grampus, Grampus griseus -n02071294 killer whale, killer, orca, grampus, sea wolf, Orcinus orca -n02071636 pilot whale, black whale, common blackfish, blackfish, Globicephala melaena -n02072040 river dolphin -n02072493 narwhal, narwal, narwhale, Monodon monoceros -n02072798 white whale, beluga, Delphinapterus leucas -n02073250 sea cow, sirenian mammal, sirenian -n02073831 manatee, Trichechus manatus -n02074367 dugong, Dugong dugon -n02074726 Steller's sea cow, Hydrodamalis gigas -n02075296 carnivore -n02075612 omnivore -n02075927 pinniped mammal, pinniped, pinnatiped -n02076196 seal -n02076402 crabeater seal, crab-eating seal -n02076779 eared seal -n02077152 fur seal -n02077384 guadalupe fur seal, Arctocephalus philippi -n02077658 fur seal -n02077787 Alaska fur seal, Callorhinus ursinus -n02077923 sea lion -n02078292 South American sea lion, Otaria Byronia -n02078574 California sea lion, Zalophus californianus, Zalophus californicus -n02078738 Australian sea lion, Zalophus lobatus -n02079005 Steller sea lion, Steller's sea lion, Eumetopias jubatus -n02079389 earless seal, true seal, hair seal -n02079851 harbor seal, common seal, Phoca vitulina -n02080146 harp seal, Pagophilus groenlandicus -n02080415 elephant seal, sea elephant -n02080713 bearded seal, squareflipper square flipper, Erignathus barbatus -n02081060 hooded seal, bladdernose, Cystophora cristata -n02081571 walrus, seahorse, sea horse -n02081798 Atlantic walrus, Odobenus rosmarus -n02081927 Pacific walrus, Odobenus divergens -n02082056 Fissipedia -n02082190 fissiped mammal, fissiped -n02082791 aardvark, ant bear, anteater, Orycteropus afer -n02083346 canine, canid -n02083672 bitch -n02083780 brood bitch -n02084071 dog, domestic dog, Canis familiaris -n02084732 pooch, doggie, doggy, barker, bow-wow -n02084861 cur, mongrel, mutt -n02085019 feist, fice -n02085118 pariah dog, pye-dog, pie-dog -n02085272 lapdog -n02085374 toy dog, toy -n02085620 Chihuahua -n02085782 Japanese spaniel -n02085936 Maltese dog, Maltese terrier, Maltese -n02086079 Pekinese, Pekingese, Peke -n02086240 Shih-Tzu -n02086346 toy spaniel -n02086478 English toy spaniel -n02086646 Blenheim spaniel -n02086753 King Charles spaniel -n02086910 papillon -n02087046 toy terrier -n02087122 hunting dog -n02087314 courser -n02087394 Rhodesian ridgeback -n02087551 hound, hound dog -n02088094 Afghan hound, Afghan -n02088238 basset, basset hound -n02088364 beagle -n02088466 bloodhound, sleuthhound -n02088632 bluetick -n02088745 boarhound -n02088839 coonhound -n02088992 coondog -n02089078 black-and-tan coonhound -n02089232 dachshund, dachsie, badger dog -n02089468 sausage dog, sausage hound -n02089555 foxhound -n02089725 American foxhound -n02089867 Walker hound, Walker foxhound -n02089973 English foxhound -n02090129 harrier -n02090253 Plott hound -n02090379 redbone -n02090475 wolfhound -n02090622 borzoi, Russian wolfhound -n02090721 Irish wolfhound -n02090827 greyhound -n02091032 Italian greyhound -n02091134 whippet -n02091244 Ibizan hound, Ibizan Podenco -n02091467 Norwegian elkhound, elkhound -n02091635 otterhound, otter hound -n02091831 Saluki, gazelle hound -n02092002 Scottish deerhound, deerhound -n02092173 staghound -n02092339 Weimaraner -n02092468 terrier -n02093056 bullterrier, bull terrier -n02093256 Staffordshire bullterrier, Staffordshire bull terrier -n02093428 American Staffordshire terrier, Staffordshire terrier, American pit bull terrier, pit bull terrier -n02093647 Bedlington terrier -n02093754 Border terrier -n02093859 Kerry blue terrier -n02093991 Irish terrier -n02094114 Norfolk terrier -n02094258 Norwich terrier -n02094433 Yorkshire terrier -n02094562 rat terrier, ratter -n02094721 Manchester terrier, black-and-tan terrier -n02094931 toy Manchester, toy Manchester terrier -n02095050 fox terrier -n02095212 smooth-haired fox terrier -n02095314 wire-haired fox terrier -n02095412 wirehair, wirehaired terrier, wire-haired terrier -n02095570 Lakeland terrier -n02095727 Welsh terrier -n02095889 Sealyham terrier, Sealyham -n02096051 Airedale, Airedale terrier -n02096177 cairn, cairn terrier -n02096294 Australian terrier -n02096437 Dandie Dinmont, Dandie Dinmont terrier -n02096585 Boston bull, Boston terrier -n02096756 schnauzer -n02097047 miniature schnauzer -n02097130 giant schnauzer -n02097209 standard schnauzer -n02097298 Scotch terrier, Scottish terrier, Scottie -n02097474 Tibetan terrier, chrysanthemum dog -n02097658 silky terrier, Sydney silky -n02097786 Skye terrier -n02097967 Clydesdale terrier -n02098105 soft-coated wheaten terrier -n02098286 West Highland white terrier -n02098413 Lhasa, Lhasa apso -n02098550 sporting dog, gun dog -n02098806 bird dog -n02098906 water dog -n02099029 retriever -n02099267 flat-coated retriever -n02099429 curly-coated retriever -n02099601 golden retriever -n02099712 Labrador retriever -n02099849 Chesapeake Bay retriever -n02099997 pointer, Spanish pointer -n02100236 German short-haired pointer -n02100399 setter -n02100583 vizsla, Hungarian pointer -n02100735 English setter -n02100877 Irish setter, red setter -n02101006 Gordon setter -n02101108 spaniel -n02101388 Brittany spaniel -n02101556 clumber, clumber spaniel -n02101670 field spaniel -n02101861 springer spaniel, springer -n02102040 English springer, English springer spaniel -n02102177 Welsh springer spaniel -n02102318 cocker spaniel, English cocker spaniel, cocker -n02102480 Sussex spaniel -n02102605 water spaniel -n02102806 American water spaniel -n02102973 Irish water spaniel -n02103181 griffon, wire-haired pointing griffon -n02103406 working dog -n02103841 watchdog, guard dog -n02104029 kuvasz -n02104184 attack dog -n02104280 housedog -n02104365 schipperke -n02104523 shepherd dog, sheepdog, sheep dog -n02104882 Belgian sheepdog, Belgian shepherd -n02105056 groenendael -n02105162 malinois -n02105251 briard -n02105412 kelpie -n02105505 komondor -n02105641 Old English sheepdog, bobtail -n02105855 Shetland sheepdog, Shetland sheep dog, Shetland -n02106030 collie -n02106166 Border collie -n02106382 Bouvier des Flandres, Bouviers des Flandres -n02106550 Rottweiler -n02106662 German shepherd, German shepherd dog, German police dog, alsatian -n02106854 police dog -n02106966 pinscher -n02107142 Doberman, Doberman pinscher -n02107312 miniature pinscher -n02107420 Sennenhunde -n02107574 Greater Swiss Mountain dog -n02107683 Bernese mountain dog -n02107908 Appenzeller -n02108000 EntleBucher -n02108089 boxer -n02108254 mastiff -n02108422 bull mastiff -n02108551 Tibetan mastiff -n02108672 bulldog, English bulldog -n02108915 French bulldog -n02109047 Great Dane -n02109150 guide dog -n02109256 Seeing Eye dog -n02109391 hearing dog -n02109525 Saint Bernard, St Bernard -n02109687 seizure-alert dog -n02109811 sled dog, sledge dog -n02109961 Eskimo dog, husky -n02110063 malamute, malemute, Alaskan malamute -n02110185 Siberian husky -n02110341 dalmatian, coach dog, carriage dog -n02110532 liver-spotted dalmatian -n02110627 affenpinscher, monkey pinscher, monkey dog -n02110806 basenji -n02110958 pug, pug-dog -n02111129 Leonberg -n02111277 Newfoundland, Newfoundland dog -n02111500 Great Pyrenees -n02111626 spitz -n02111889 Samoyed, Samoyede -n02112018 Pomeranian -n02112137 chow, chow chow -n02112350 keeshond -n02112497 griffon, Brussels griffon, Belgian griffon -n02112706 Brabancon griffon -n02112826 corgi, Welsh corgi -n02113023 Pembroke, Pembroke Welsh corgi -n02113186 Cardigan, Cardigan Welsh corgi -n02113335 poodle, poodle dog -n02113624 toy poodle -n02113712 miniature poodle -n02113799 standard poodle -n02113892 large poodle -n02113978 Mexican hairless -n02114100 wolf -n02114367 timber wolf, grey wolf, gray wolf, Canis lupus -n02114548 white wolf, Arctic wolf, Canis lupus tundrarum -n02114712 red wolf, maned wolf, Canis rufus, Canis niger -n02114855 coyote, prairie wolf, brush wolf, Canis latrans -n02115012 coydog -n02115096 jackal, Canis aureus -n02115335 wild dog -n02115641 dingo, warrigal, warragal, Canis dingo -n02115913 dhole, Cuon alpinus -n02116185 crab-eating dog, crab-eating fox, Dusicyon cancrivorus -n02116450 raccoon dog, Nyctereutes procyonides -n02116738 African hunting dog, hyena dog, Cape hunting dog, Lycaon pictus -n02117135 hyena, hyaena -n02117512 striped hyena, Hyaena hyaena -n02117646 brown hyena, strand wolf, Hyaena brunnea -n02117900 spotted hyena, laughing hyena, Crocuta crocuta -n02118176 aardwolf, Proteles cristata -n02118333 fox -n02118643 vixen -n02118707 Reynard -n02119022 red fox, Vulpes vulpes -n02119247 black fox -n02119359 silver fox -n02119477 red fox, Vulpes fulva -n02119634 kit fox, prairie fox, Vulpes velox -n02119789 kit fox, Vulpes macrotis -n02120079 Arctic fox, white fox, Alopex lagopus -n02120278 blue fox -n02120505 grey fox, gray fox, Urocyon cinereoargenteus -n02120997 feline, felid -n02121620 cat, true cat -n02121808 domestic cat, house cat, Felis domesticus, Felis catus -n02122298 kitty, kitty-cat, puss, pussy, pussycat -n02122430 mouser -n02122510 alley cat -n02122580 stray -n02122725 tom, tomcat -n02122810 gib -n02122878 tabby, queen -n02122948 kitten, kitty -n02123045 tabby, tabby cat -n02123159 tiger cat -n02123242 tortoiseshell, tortoiseshell-cat, calico cat -n02123394 Persian cat -n02123478 Angora, Angora cat -n02123597 Siamese cat, Siamese -n02123785 blue point Siamese -n02123917 Burmese cat -n02124075 Egyptian cat -n02124157 Maltese, Maltese cat -n02124313 Abyssinian, Abyssinian cat -n02124484 Manx, Manx cat -n02124623 wildcat -n02125010 sand cat -n02125081 European wildcat, catamountain, Felis silvestris -n02125311 cougar, puma, catamount, mountain lion, painter, panther, Felis concolor -n02125494 ocelot, panther cat, Felis pardalis -n02125689 jaguarundi, jaguarundi cat, jaguarondi, eyra, Felis yagouaroundi -n02125872 kaffir cat, caffer cat, Felis ocreata -n02126028 jungle cat, Felis chaus -n02126139 serval, Felis serval -n02126317 leopard cat, Felis bengalensis -n02126640 margay, margay cat, Felis wiedi -n02126787 manul, Pallas's cat, Felis manul -n02127052 lynx, catamount -n02127292 common lynx, Lynx lynx -n02127381 Canada lynx, Lynx canadensis -n02127482 bobcat, bay lynx, Lynx rufus -n02127586 spotted lynx, Lynx pardina -n02127678 caracal, desert lynx, Lynx caracal -n02127808 big cat, cat -n02128385 leopard, Panthera pardus -n02128598 leopardess -n02128669 panther -n02128757 snow leopard, ounce, Panthera uncia -n02128925 jaguar, panther, Panthera onca, Felis onca -n02129165 lion, king of beasts, Panthera leo -n02129463 lioness -n02129530 lionet -n02129604 tiger, Panthera tigris -n02129837 Bengal tiger -n02129923 tigress -n02129991 liger -n02130086 tiglon, tigon -n02130308 cheetah, chetah, Acinonyx jubatus -n02130545 saber-toothed tiger, sabertooth -n02130925 Smiledon californicus -n02131653 bear -n02132136 brown bear, bruin, Ursus arctos -n02132320 bruin -n02132466 Syrian bear, Ursus arctos syriacus -n02132580 grizzly, grizzly bear, silvertip, silver-tip, Ursus horribilis, Ursus arctos horribilis -n02132788 Alaskan brown bear, Kodiak bear, Kodiak, Ursus middendorffi, Ursus arctos middendorffi -n02133161 American black bear, black bear, Ursus americanus, Euarctos americanus -n02133400 cinnamon bear -n02133704 Asiatic black bear, black bear, Ursus thibetanus, Selenarctos thibetanus -n02134084 ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus -n02134418 sloth bear, Melursus ursinus, Ursus ursinus -n02134971 viverrine, viverrine mammal -n02135220 civet, civet cat -n02135610 large civet, Viverra zibetha -n02135844 small civet, Viverricula indica, Viverricula malaccensis -n02136103 binturong, bearcat, Arctictis bintourong -n02136285 Cryptoprocta, genus Cryptoprocta -n02136452 fossa, fossa cat, Cryptoprocta ferox -n02136794 fanaloka, Fossa fossa -n02137015 genet, Genetta genetta -n02137302 banded palm civet, Hemigalus hardwickii -n02137549 mongoose -n02137722 Indian mongoose, Herpestes nyula -n02137888 ichneumon, Herpestes ichneumon -n02138169 palm cat, palm civet -n02138441 meerkat, mierkat -n02138647 slender-tailed meerkat, Suricata suricatta -n02138777 suricate, Suricata tetradactyla -n02139199 bat, chiropteran -n02139671 fruit bat, megabat -n02140049 flying fox -n02140179 Pteropus capestratus -n02140268 Pteropus hypomelanus -n02140491 harpy, harpy bat, tube-nosed bat, tube-nosed fruit bat -n02140858 Cynopterus sphinx -n02141306 carnivorous bat, microbat -n02141611 mouse-eared bat -n02141713 leafnose bat, leaf-nosed bat -n02142407 macrotus, Macrotus californicus -n02142734 spearnose bat -n02142898 Phyllostomus hastatus -n02143142 hognose bat, Choeronycteris mexicana -n02143439 horseshoe bat -n02143891 horseshoe bat -n02144251 orange bat, orange horseshoe bat, Rhinonicteris aurantius -n02144593 false vampire, false vampire bat -n02144936 big-eared bat, Megaderma lyra -n02145424 vespertilian bat, vespertilionid -n02145910 frosted bat, Vespertilio murinus -n02146201 red bat, Lasiurus borealis -n02146371 brown bat -n02146700 little brown bat, little brown myotis, Myotis leucifugus -n02146879 cave myotis, Myotis velifer -n02147173 big brown bat, Eptesicus fuscus -n02147328 serotine, European brown bat, Eptesicus serotinus -n02147591 pallid bat, cave bat, Antrozous pallidus -n02147947 pipistrelle, pipistrel, Pipistrellus pipistrellus -n02148088 eastern pipistrel, Pipistrellus subflavus -n02148512 jackass bat, spotted bat, Euderma maculata -n02148835 long-eared bat -n02148991 western big-eared bat, Plecotus townsendi -n02149420 freetail, free-tailed bat, freetailed bat -n02149653 guano bat, Mexican freetail bat, Tadarida brasiliensis -n02149861 pocketed bat, pocketed freetail bat, Tadirida femorosacca -n02150134 mastiff bat -n02150482 vampire bat, true vampire bat -n02150885 Desmodus rotundus -n02151230 hairy-legged vampire bat, Diphylla ecaudata -n02152740 predator, predatory animal -n02152881 prey, quarry -n02152991 game -n02153109 big game -n02153203 game bird -n02153809 fossorial mammal -n02156732 tetrapod -n02156871 quadruped -n02157206 hexapod -n02157285 biped -n02159955 insect -n02160947 social insect -n02161225 holometabola, metabola -n02161338 defoliator -n02161457 pollinator -n02161588 gallfly -n02162561 scorpion fly -n02163008 hanging fly -n02163297 collembolan, springtail -n02164464 beetle -n02165105 tiger beetle -n02165456 ladybug, ladybeetle, lady beetle, ladybird, ladybird beetle -n02165877 two-spotted ladybug, Adalia bipunctata -n02166229 Mexican bean beetle, bean beetle, Epilachna varivestis -n02166567 Hippodamia convergens -n02166826 vedalia, Rodolia cardinalis -n02167151 ground beetle, carabid beetle -n02167505 bombardier beetle -n02167820 calosoma -n02167944 searcher, searcher beetle, Calosoma scrutator -n02168245 firefly, lightning bug -n02168427 glowworm -n02168699 long-horned beetle, longicorn, longicorn beetle -n02169023 sawyer, sawyer beetle -n02169218 pine sawyer -n02169497 leaf beetle, chrysomelid -n02169705 flea beetle -n02169974 Colorado potato beetle, Colorado beetle, potato bug, potato beetle, Leptinotarsa decemlineata -n02170400 carpet beetle, carpet bug -n02170599 buffalo carpet beetle, Anthrenus scrophulariae -n02170738 black carpet beetle -n02170993 clerid beetle, clerid -n02171164 bee beetle -n02171453 lamellicorn beetle -n02171869 scarabaeid beetle, scarabaeid, scarabaean -n02172182 dung beetle -n02172518 scarab, scarabaeus, Scarabaeus sacer -n02172678 tumblebug -n02172761 dorbeetle -n02172870 June beetle, June bug, May bug, May beetle -n02173113 green June beetle, figeater -n02173373 Japanese beetle, Popillia japonica -n02173784 Oriental beetle, Asiatic beetle, Anomala orientalis -n02174001 rhinoceros beetle -n02174355 melolonthid beetle -n02174659 cockchafer, May bug, May beetle, Melolontha melolontha -n02175014 rose chafer, rose bug, Macrodactylus subspinosus -n02175569 rose chafer, rose beetle, Cetonia aurata -n02175916 stag beetle -n02176261 elaterid beetle, elater, elaterid -n02176439 click beetle, skipjack, snapping beetle -n02176747 firefly, fire beetle, Pyrophorus noctiluca -n02176916 wireworm -n02177196 water beetle -n02177506 whirligig beetle -n02177775 deathwatch beetle, deathwatch, Xestobium rufovillosum -n02177972 weevil -n02178411 snout beetle -n02178717 boll weevil, Anthonomus grandis -n02179012 blister beetle, meloid -n02179192 oil beetle -n02179340 Spanish fly -n02179891 Dutch-elm beetle, Scolytus multistriatus -n02180233 bark beetle -n02180427 spruce bark beetle, Dendroctonus rufipennis -n02180875 rove beetle -n02181235 darkling beetle, darkling groung beetle, tenebrionid -n02181477 mealworm -n02181724 flour beetle, flour weevil -n02182045 seed beetle, seed weevil -n02182355 pea weevil, Bruchus pisorum -n02182642 bean weevil, Acanthoscelides obtectus -n02182930 rice weevil, black weevil, Sitophylus oryzae -n02183096 Asian longhorned beetle, Anoplophora glabripennis -n02183507 web spinner -n02183857 louse, sucking louse -n02184473 common louse, Pediculus humanus -n02184589 head louse, Pediculus capitis -n02184720 body louse, cootie, Pediculus corporis -n02185167 crab louse, pubic louse, crab, Phthirius pubis -n02185481 bird louse, biting louse, louse -n02186153 flea -n02186717 Pulex irritans -n02187150 dog flea, Ctenocephalides canis -n02187279 cat flea, Ctenocephalides felis -n02187554 chigoe, chigger, chigoe flea, Tunga penetrans -n02187900 sticktight, sticktight flea, Echidnophaga gallinacea -n02188699 dipterous insect, two-winged insects, dipteran, dipteron -n02189363 gall midge, gallfly, gall gnat -n02189670 Hessian fly, Mayetiola destructor -n02190166 fly -n02190790 housefly, house fly, Musca domestica -n02191273 tsetse fly, tsetse, tzetze fly, tzetze, glossina -n02191773 blowfly, blow fly -n02191979 bluebottle, Calliphora vicina -n02192252 greenbottle, greenbottle fly -n02192513 flesh fly, Sarcophaga carnaria -n02192814 tachina fly -n02193009 gadfly -n02193163 botfly -n02194249 human botfly, Dermatobia hominis -n02194750 sheep botfly, sheep gadfly, Oestrus ovis -n02195091 warble fly -n02195526 horsefly, cleg, clegg, horse fly -n02195819 bee fly -n02196119 robber fly, bee killer -n02196344 fruit fly, pomace fly -n02196896 apple maggot, railroad worm, Rhagoletis pomonella -n02197185 Mediterranean fruit fly, medfly, Ceratitis capitata -n02197689 drosophila, Drosophila melanogaster -n02197877 vinegar fly -n02198129 leaf miner, leaf-miner -n02198532 louse fly, hippoboscid -n02198859 horse tick, horsefly, Hippobosca equina -n02199170 sheep ked, sheep-tick, sheep tick, Melophagus Ovinus -n02199502 horn fly, Haematobia irritans -n02200198 mosquito -n02200509 wiggler, wriggler -n02200630 gnat -n02200850 yellow-fever mosquito, Aedes aegypti -n02201000 Asian tiger mosquito, Aedes albopictus -n02201497 anopheline -n02201626 malarial mosquito, malaria mosquito -n02202006 common mosquito, Culex pipiens -n02202124 Culex quinquefasciatus, Culex fatigans -n02202287 gnat -n02202678 punkie, punky, punkey, no-see-um, biting midge -n02203152 midge -n02203592 fungus gnat -n02203978 psychodid -n02204249 sand fly, sandfly, Phlebotomus papatasii -n02204722 fungus gnat, sciara, sciarid -n02204907 armyworm -n02205219 crane fly, daddy longlegs -n02205673 blackfly, black fly, buffalo gnat -n02206270 hymenopterous insect, hymenopteran, hymenopteron, hymenopter -n02206856 bee -n02207179 drone -n02207345 queen bee -n02207449 worker -n02207647 soldier -n02207805 worker bee -n02208280 honeybee, Apis mellifera -n02208498 Africanized bee, Africanized honey bee, killer bee, Apis mellifera scutellata, Apis mellifera adansonii -n02208848 black bee, German bee -n02208979 Carniolan bee -n02209111 Italian bee -n02209354 carpenter bee -n02209624 bumblebee, humblebee -n02209964 cuckoo-bumblebee -n02210427 andrena, andrenid, mining bee -n02210921 Nomia melanderi, alkali bee -n02211444 leaf-cutting bee, leaf-cutter, leaf-cutter bee -n02211627 mason bee -n02211896 potter bee -n02212062 wasp -n02212602 vespid, vespid wasp -n02212958 paper wasp -n02213107 hornet -n02213239 giant hornet, Vespa crabro -n02213543 common wasp, Vespula vulgaris -n02213663 bald-faced hornet, white-faced hornet, Vespula maculata -n02213788 yellow jacket, yellow hornet, Vespula maculifrons -n02214096 Polistes annularis -n02214341 mason wasp -n02214499 potter wasp -n02214660 Mutillidae, family Mutillidae -n02214773 velvet ant -n02215161 sphecoid wasp, sphecoid -n02215621 mason wasp -n02215770 digger wasp -n02216211 cicada killer, Sphecius speciosis -n02216365 mud dauber -n02216740 gall wasp, gallfly, cynipid wasp, cynipid gall wasp -n02217563 chalcid fly, chalcidfly, chalcid, chalcid wasp -n02217839 strawworm, jointworm -n02218134 chalcis fly -n02218371 ichneumon fly -n02218713 sawfly -n02219015 birch leaf miner, Fenusa pusilla -n02219486 ant, emmet, pismire -n02220055 pharaoh ant, pharaoh's ant, Monomorium pharaonis -n02220225 little black ant, Monomorium minimum -n02220518 army ant, driver ant, legionary ant -n02220804 carpenter ant -n02221083 fire ant -n02221414 wood ant, Formica rufa -n02221571 slave ant -n02221715 Formica fusca -n02221820 slave-making ant, slave-maker -n02222035 sanguinary ant, Formica sanguinea -n02222321 bulldog ant -n02222582 Amazon ant, Polyergus rufescens -n02223266 termite, white ant -n02223520 dry-wood termite -n02224023 Reticulitermes lucifugus -n02224713 Mastotermes darwiniensis -n02225081 Mastotermes electrodominicus -n02225798 powder-post termite, Cryptotermes brevis -n02226183 orthopterous insect, orthopteron, orthopteran -n02226429 grasshopper, hopper -n02226821 short-horned grasshopper, acridid -n02226970 locust -n02227247 migratory locust, Locusta migratoria -n02227604 migratory grasshopper -n02227966 long-horned grasshopper, tettigoniid -n02228341 katydid -n02228697 mormon cricket, Anabrus simplex -n02229156 sand cricket, Jerusalem cricket, Stenopelmatus fuscus -n02229544 cricket -n02229765 mole cricket -n02230023 European house cricket, Acheta domestica -n02230187 field cricket, Acheta assimilis -n02230480 tree cricket -n02230634 snowy tree cricket, Oecanthus fultoni -n02231052 phasmid, phasmid insect -n02231487 walking stick, walkingstick, stick insect -n02231803 diapheromera, Diapheromera femorata -n02232223 walking leaf, leaf insect -n02233338 cockroach, roach -n02233943 oriental cockroach, oriental roach, Asiatic cockroach, blackbeetle, Blatta orientalis -n02234355 American cockroach, Periplaneta americana -n02234570 Australian cockroach, Periplaneta australasiae -n02234848 German cockroach, Croton bug, crotonbug, water bug, Blattella germanica -n02235205 giant cockroach -n02236044 mantis, mantid -n02236241 praying mantis, praying mantid, Mantis religioso -n02236355 bug -n02236896 hemipterous insect, bug, hemipteran, hemipteron -n02237424 leaf bug, plant bug -n02237581 mirid bug, mirid, capsid -n02237868 four-lined plant bug, four-lined leaf bug, Poecilocapsus lineatus -n02238235 lygus bug -n02238358 tarnished plant bug, Lygus lineolaris -n02238594 lace bug -n02238887 lygaeid, lygaeid bug -n02239192 chinch bug, Blissus leucopterus -n02239528 coreid bug, coreid -n02239774 squash bug, Anasa tristis -n02240068 leaf-footed bug, leaf-foot bug -n02240517 bedbug, bed bug, chinch, Cimex lectularius -n02241008 backswimmer, Notonecta undulata -n02241426 true bug -n02241569 heteropterous insect -n02241799 water bug -n02242137 giant water bug -n02242455 water scorpion -n02243209 water boatman, boat bug -n02243562 water strider, pond-skater, water skater -n02243878 common pond-skater, Gerris lacustris -n02244173 assassin bug, reduviid -n02244515 conenose, cone-nosed bug, conenose bug, big bedbug, kissing bug -n02244797 wheel bug, Arilus cristatus -n02245111 firebug -n02245443 cotton stainer -n02246011 homopterous insect, homopteran -n02246628 whitefly -n02246941 citrus whitefly, Dialeurodes citri -n02247216 greenhouse whitefly, Trialeurodes vaporariorum -n02247511 sweet-potato whitefly -n02247655 superbug, Bemisia tabaci, poinsettia strain -n02248062 cotton strain -n02248368 coccid insect -n02248510 scale insect -n02248887 soft scale -n02249134 brown soft scale, Coccus hesperidum -n02249515 armored scale -n02249809 San Jose scale, Aspidiotus perniciosus -n02250280 cochineal insect, cochineal, Dactylopius coccus -n02250822 mealybug, mealy bug -n02251067 citrophilous mealybug, citrophilus mealybug, Pseudococcus fragilis -n02251233 Comstock mealybug, Comstock's mealybug, Pseudococcus comstocki -n02251593 citrus mealybug, Planococcus citri -n02251775 plant louse, louse -n02252226 aphid -n02252799 apple aphid, green apple aphid, Aphis pomi -n02252972 blackfly, bean aphid, Aphis fabae -n02253127 greenfly -n02253264 green peach aphid -n02253494 ant cow -n02253715 woolly aphid, woolly plant louse -n02253913 woolly apple aphid, American blight, Eriosoma lanigerum -n02254246 woolly alder aphid, Prociphilus tessellatus -n02254697 adelgid -n02254901 balsam woolly aphid, Adelges piceae -n02255023 spruce gall aphid, Adelges abietis -n02255391 woolly adelgid -n02256172 jumping plant louse, psylla, psyllid -n02256656 cicada, cicala -n02257003 dog-day cicada, harvest fly -n02257284 seventeen-year locust, periodical cicada, Magicicada septendecim -n02257715 spittle insect, spittlebug -n02257985 froghopper -n02258198 meadow spittlebug, Philaenus spumarius -n02258508 pine spittlebug -n02258629 Saratoga spittlebug, Aphrophora saratogensis -n02259212 leafhopper -n02259377 plant hopper, planthopper -n02259708 treehopper -n02259987 lantern fly, lantern-fly -n02260421 psocopterous insect -n02260863 psocid -n02261063 bark-louse, bark louse -n02261419 booklouse, book louse, deathwatch, Liposcelis divinatorius -n02261757 common booklouse, Trogium pulsatorium -n02262178 ephemerid, ephemeropteran -n02262449 mayfly, dayfly, shadfly -n02262803 stonefly, stone fly, plecopteran -n02263378 neuropteron, neuropteran, neuropterous insect -n02264021 ant lion, antlion, antlion fly -n02264232 doodlebug, ant lion, antlion -n02264363 lacewing, lacewing fly -n02264591 aphid lion, aphis lion -n02264885 green lacewing, chrysopid, stink fly -n02265330 brown lacewing, hemerobiid, hemerobiid fly -n02266050 dobson, dobsonfly, dobson fly, Corydalus cornutus -n02266269 hellgrammiate, dobson -n02266421 fish fly, fish-fly -n02266864 alderfly, alder fly, Sialis lutaria -n02267208 snakefly -n02267483 mantispid -n02268148 odonate -n02268443 dragonfly, darning needle, devil's darning needle, sewing needle, snake feeder, snake doctor, mosquito hawk, skeeter hawk -n02268853 damselfly -n02269196 trichopterous insect, trichopteran, trichopteron -n02269340 caddis fly, caddis-fly, caddice fly, caddice-fly -n02269522 caseworm -n02269657 caddisworm, strawworm -n02270011 thysanuran insect, thysanuron -n02270200 bristletail -n02270623 silverfish, Lepisma saccharina -n02270945 firebrat, Thermobia domestica -n02271222 jumping bristletail, machilid -n02271570 thysanopter, thysanopteron, thysanopterous insect -n02271897 thrips, thrip, thripid -n02272286 tobacco thrips, Frankliniella fusca -n02272552 onion thrips, onion louse, Thrips tobaci -n02272871 earwig -n02273392 common European earwig, Forficula auricularia -n02274024 lepidopterous insect, lepidopteron, lepidopteran -n02274259 butterfly -n02274822 nymphalid, nymphalid butterfly, brush-footed butterfly, four-footed butterfly -n02275560 mourning cloak, mourning cloak butterfly, Camberwell beauty, Nymphalis antiopa -n02275773 tortoiseshell, tortoiseshell butterfly -n02276078 painted beauty, Vanessa virginiensis -n02276258 admiral -n02276355 red admiral, Vanessa atalanta -n02276749 white admiral, Limenitis camilla -n02276902 banded purple, white admiral, Limenitis arthemis -n02277094 red-spotted purple, Limenitis astyanax -n02277268 viceroy, Limenitis archippus -n02277422 anglewing -n02277742 ringlet, ringlet butterfly -n02278024 comma, comma butterfly, Polygonia comma -n02278210 fritillary -n02278463 silverspot -n02278839 emperor butterfly, emperor -n02278980 purple emperor, Apatura iris -n02279257 peacock, peacock butterfly, Inachis io -n02279637 danaid, danaid butterfly -n02279972 monarch, monarch butterfly, milkweed butterfly, Danaus plexippus -n02280458 pierid, pierid butterfly -n02280649 cabbage butterfly -n02281015 small white, Pieris rapae -n02281136 large white, Pieris brassicae -n02281267 southern cabbage butterfly, Pieris protodice -n02281406 sulphur butterfly, sulfur butterfly -n02281787 lycaenid, lycaenid butterfly -n02282257 blue -n02282385 copper -n02282553 American copper, Lycaena hypophlaeas -n02282903 hairstreak, hairstreak butterfly -n02283077 Strymon melinus -n02283201 moth -n02283617 moth miller, miller -n02283951 tortricid, tortricid moth -n02284224 leaf roller, leaf-roller -n02284611 tea tortrix, tortrix, Homona coffearia -n02284884 orange tortrix, tortrix, Argyrotaenia citrana -n02285179 codling moth, codlin moth, Carpocapsa pomonella -n02285548 lymantriid, tussock moth -n02285801 tussock caterpillar -n02286089 gypsy moth, gipsy moth, Lymantria dispar -n02286425 browntail, brown-tail moth, Euproctis phaeorrhoea -n02286654 gold-tail moth, Euproctis chrysorrhoea -n02287004 geometrid, geometrid moth -n02287352 Paleacrita vernata -n02287622 Alsophila pometaria -n02287799 cankerworm -n02287987 spring cankerworm -n02288122 fall cankerworm -n02288268 measuring worm, inchworm, looper -n02288789 pyralid, pyralid moth -n02289307 bee moth, wax moth, Galleria mellonella -n02289610 corn borer, European corn borer moth, corn borer moth, Pyrausta nubilalis -n02289988 Mediterranean flour moth, Anagasta kuehniella -n02290340 tobacco moth, cacao moth, Ephestia elutella -n02290664 almond moth, fig moth, Cadra cautella -n02290870 raisin moth, Cadra figulilella -n02291220 tineoid, tineoid moth -n02291572 tineid, tineid moth -n02291748 clothes moth -n02292085 casemaking clothes moth, Tinea pellionella -n02292401 webbing clothes moth, webbing moth, Tineola bisselliella -n02292692 carpet moth, tapestry moth, Trichophaga tapetzella -n02293352 gelechiid, gelechiid moth -n02293868 grain moth -n02294097 angoumois moth, angoumois grain moth, Sitotroga cerealella -n02294407 potato moth, potato tuber moth, splitworm, Phthorimaea operculella -n02294577 potato tuberworm, Phthorimaea operculella -n02295064 noctuid moth, noctuid, owlet moth -n02295390 cutworm -n02295870 underwing -n02296021 red underwing, Catocala nupta -n02296276 antler moth, Cerapteryx graminis -n02296612 heliothis moth, Heliothis zia -n02296912 army cutworm, Chorizagrotis auxiliaris -n02297294 armyworm, Pseudaletia unipuncta -n02297442 armyworm, army worm, Pseudaletia unipuncta -n02297819 Spodoptera exigua -n02297938 beet armyworm, Spodoptera exigua -n02298095 Spodoptera frugiperda -n02298218 fall armyworm, Spodoptera frugiperda -n02298541 hawkmoth, hawk moth, sphingid, sphinx moth, hummingbird moth -n02299039 Manduca sexta -n02299157 tobacco hornworm, tomato worm, Manduca sexta -n02299378 Manduca quinquemaculata -n02299505 tomato hornworm, potato worm, Manduca quinquemaculata -n02299846 death's-head moth, Acherontia atropos -n02300173 bombycid, bombycid moth, silkworm moth -n02300554 domestic silkworm moth, domesticated silkworm moth, Bombyx mori -n02300797 silkworm -n02301452 saturniid, saturniid moth -n02301935 emperor, emperor moth, Saturnia pavonia -n02302244 imperial moth, Eacles imperialis -n02302459 giant silkworm moth, silkworm moth -n02302620 silkworm, giant silkworm, wild wilkworm -n02302969 luna moth, Actias luna -n02303284 cecropia, cecropia moth, Hyalophora cecropia -n02303585 cynthia moth, Samia cynthia, Samia walkeri -n02303777 ailanthus silkworm, Samia cynthia -n02304036 io moth, Automeris io -n02304432 polyphemus moth, Antheraea polyphemus -n02304657 pernyi moth, Antheraea pernyi -n02304797 tussah, tusseh, tussur, tussore, tusser, Antheraea mylitta -n02305085 atlas moth, Atticus atlas -n02305407 arctiid, arctiid moth -n02305636 tiger moth -n02305929 cinnabar, cinnabar moth, Callimorpha jacobeae -n02306433 lasiocampid, lasiocampid moth -n02306825 eggar, egger -n02307176 tent-caterpillar moth, Malacosoma americana -n02307325 tent caterpillar -n02307515 tent-caterpillar moth, Malacosoma disstria -n02307681 forest tent caterpillar, Malacosoma disstria -n02307910 lappet, lappet moth -n02308033 lappet caterpillar -n02308139 webworm -n02308471 webworm moth -n02308618 Hyphantria cunea -n02308735 fall webworm, Hyphantria cunea -n02309120 garden webworm, Loxostege similalis -n02309242 instar -n02309337 caterpillar -n02309841 corn borer, Pyrausta nubilalis -n02310000 bollworm -n02310149 pink bollworm, Gelechia gossypiella -n02310334 corn earworm, cotton bollworm, tomato fruitworm, tobacco budworm, vetchworm, Heliothis zia -n02310585 cabbageworm, Pieris rapae -n02310717 woolly bear, woolly bear caterpillar -n02310941 woolly bear moth -n02311060 larva -n02311617 nymph -n02311748 leptocephalus -n02312006 grub -n02312175 maggot -n02312325 leatherjacket -n02312427 pupa -n02312640 chrysalis -n02312912 imago -n02313008 queen -n02313360 phoronid -n02313709 bryozoan, polyzoan, sea mat, sea moss, moss animal -n02315487 brachiopod, lamp shell, lampshell -n02315821 peanut worm, sipunculid -n02316707 echinoderm -n02317335 starfish, sea star -n02317781 brittle star, brittle-star, serpent star -n02318167 basket star, basket fish -n02318687 Astrophyton muricatum -n02319095 sea urchin -n02319308 edible sea urchin, Echinus esculentus -n02319555 sand dollar -n02319829 heart urchin -n02320127 crinoid -n02320465 sea lily -n02321170 feather star, comatulid -n02321529 sea cucumber, holothurian -n02322047 trepang, Holothuria edulis -n02322992 Duplicidentata -n02323449 lagomorph, gnawing mammal -n02323902 leporid, leporid mammal -n02324045 rabbit, coney, cony -n02324431 rabbit ears -n02324514 lapin -n02324587 bunny, bunny rabbit -n02324850 European rabbit, Old World rabbit, Oryctolagus cuniculus -n02325366 wood rabbit, cottontail, cottontail rabbit -n02325722 eastern cottontail, Sylvilagus floridanus -n02325884 swamp rabbit, canecutter, swamp hare, Sylvilagus aquaticus -n02326074 marsh hare, swamp rabbit, Sylvilagus palustris -n02326432 hare -n02326763 leveret -n02326862 European hare, Lepus europaeus -n02327028 jackrabbit -n02327175 white-tailed jackrabbit, whitetail jackrabbit, Lepus townsendi -n02327435 blacktail jackrabbit, Lepus californicus -n02327656 polar hare, Arctic hare, Lepus arcticus -n02327842 snowshoe hare, snowshoe rabbit, varying hare, Lepus americanus -n02328009 Belgian hare, leporide -n02328150 Angora, Angora rabbit -n02328429 pika, mouse hare, rock rabbit, coney, cony -n02328820 little chief hare, Ochotona princeps -n02328942 collared pika, Ochotona collaris -n02329401 rodent, gnawer -n02330245 mouse -n02331046 rat -n02331309 pocket rat -n02331842 murine -n02332156 house mouse, Mus musculus -n02332447 harvest mouse, Micromyx minutus -n02332755 field mouse, fieldmouse -n02332954 nude mouse -n02333190 European wood mouse, Apodemus sylvaticus -n02333546 brown rat, Norway rat, Rattus norvegicus -n02333733 wharf rat -n02333819 sewer rat -n02333909 black rat, roof rat, Rattus rattus -n02334201 bandicoot rat, mole rat -n02334460 jerboa rat -n02334728 kangaroo mouse -n02335127 water rat -n02335231 beaver rat -n02336011 New World mouse -n02336275 American harvest mouse, harvest mouse -n02336641 wood mouse -n02336826 white-footed mouse, vesper mouse, Peromyscus leucopus -n02337001 deer mouse, Peromyscus maniculatus -n02337171 cactus mouse, Peromyscus eremicus -n02337332 cotton mouse, Peromyscus gossypinus -n02337598 pygmy mouse, Baiomys taylori -n02337902 grasshopper mouse -n02338145 muskrat, musquash, Ondatra zibethica -n02338449 round-tailed muskrat, Florida water rat, Neofiber alleni -n02338722 cotton rat, Sigmodon hispidus -n02338901 wood rat, wood-rat -n02339282 dusky-footed wood rat -n02339376 vole, field mouse -n02339922 packrat, pack rat, trade rat, bushytail woodrat, Neotoma cinerea -n02340186 dusky-footed woodrat, Neotoma fuscipes -n02340358 eastern woodrat, Neotoma floridana -n02340640 rice rat, Oryzomys palustris -n02340930 pine vole, pine mouse, Pitymys pinetorum -n02341288 meadow vole, meadow mouse, Microtus pennsylvaticus -n02341475 water vole, Richardson vole, Microtus richardsoni -n02341616 prairie vole, Microtus ochrogaster -n02341974 water vole, water rat, Arvicola amphibius -n02342250 red-backed mouse, redback vole -n02342534 phenacomys -n02342885 hamster -n02343058 Eurasian hamster, Cricetus cricetus -n02343320 golden hamster, Syrian hamster, Mesocricetus auratus -n02343772 gerbil, gerbille -n02344175 jird -n02344270 tamarisk gerbil, Meriones unguiculatus -n02344408 sand rat, Meriones longifrons -n02344528 lemming -n02344918 European lemming, Lemmus lemmus -n02345078 brown lemming, Lemmus trimucronatus -n02345340 grey lemming, gray lemming, red-backed lemming -n02345600 pied lemming -n02345774 Hudson bay collared lemming, Dicrostonyx hudsonius -n02345997 southern bog lemming, Synaptomys cooperi -n02346170 northern bog lemming, Synaptomys borealis -n02346627 porcupine, hedgehog -n02346998 Old World porcupine -n02347274 brush-tailed porcupine, brush-tail porcupine -n02347573 long-tailed porcupine, Trichys lipura -n02347744 New World porcupine -n02348173 Canada porcupine, Erethizon dorsatum -n02348788 pocket mouse -n02349205 silky pocket mouse, Perognathus flavus -n02349390 plains pocket mouse, Perognathus flavescens -n02349557 hispid pocket mouse, Perognathus hispidus -n02349847 Mexican pocket mouse, Liomys irroratus -n02350105 kangaroo rat, desert rat, Dipodomys phillipsii -n02350357 Ord kangaroo rat, Dipodomys ordi -n02350670 kangaroo mouse, dwarf pocket rat -n02350989 jumping mouse -n02351343 meadow jumping mouse, Zapus hudsonius -n02351870 jerboa -n02352002 typical jerboa -n02352290 Jaculus jaculus -n02352591 dormouse -n02352932 loir, Glis glis -n02353172 hazel mouse, Muscardinus avellanarius -n02353411 lerot -n02353861 gopher, pocket gopher, pouched rat -n02354162 plains pocket gopher, Geomys bursarius -n02354320 southeastern pocket gopher, Geomys pinetis -n02354621 valley pocket gopher, Thomomys bottae -n02354781 northern pocket gopher, Thomomys talpoides -n02355227 squirrel -n02355477 tree squirrel -n02356381 eastern grey squirrel, eastern gray squirrel, cat squirrel, Sciurus carolinensis -n02356612 western grey squirrel, western gray squirrel, Sciurus griseus -n02356798 fox squirrel, eastern fox squirrel, Sciurus niger -n02356977 black squirrel -n02357111 red squirrel, cat squirrel, Sciurus vulgaris -n02357401 American red squirrel, spruce squirrel, red squirrel, Sciurus hudsonicus, Tamiasciurus hudsonicus -n02357585 chickeree, Douglas squirrel, Tamiasciurus douglasi -n02357911 antelope squirrel, whitetail antelope squirrel, antelope chipmunk, Citellus leucurus -n02358091 ground squirrel, gopher, spermophile -n02358390 mantled ground squirrel, Citellus lateralis -n02358584 suslik, souslik, Citellus citellus -n02358712 flickertail, Richardson ground squirrel, Citellus richardsoni -n02358890 rock squirrel, Citellus variegatus -n02359047 Arctic ground squirrel, parka squirrel, Citellus parryi -n02359324 prairie dog, prairie marmot -n02359556 blacktail prairie dog, Cynomys ludovicianus -n02359667 whitetail prairie dog, Cynomys gunnisoni -n02359915 eastern chipmunk, hackee, striped squirrel, ground squirrel, Tamias striatus -n02360282 chipmunk -n02360480 baronduki, baranduki, barunduki, burunduki, Eutamius asiaticus, Eutamius sibiricus -n02360781 American flying squirrel -n02360933 southern flying squirrel, Glaucomys volans -n02361090 northern flying squirrel, Glaucomys sabrinus -n02361337 marmot -n02361587 groundhog, woodchuck, Marmota monax -n02361706 hoary marmot, whistler, whistling marmot, Marmota caligata -n02361850 yellowbelly marmot, rockchuck, Marmota flaviventris -n02362194 Asiatic flying squirrel -n02363005 beaver -n02363245 Old World beaver, Castor fiber -n02363351 New World beaver, Castor canadensis -n02363996 mountain beaver, sewellel, Aplodontia rufa -n02364520 cavy -n02364673 guinea pig, Cavia cobaya -n02364840 aperea, wild cavy, Cavia porcellus -n02365108 mara, Dolichotis patagonum -n02365480 capybara, capibara, Hydrochoerus hydrochaeris -n02366002 agouti, Dasyprocta aguti -n02366301 paca, Cuniculus paca -n02366579 mountain paca -n02366959 coypu, nutria, Myocastor coypus -n02367492 chinchilla, Chinchilla laniger -n02367812 mountain chinchilla, mountain viscacha -n02368116 viscacha, chinchillon, Lagostomus maximus -n02368399 abrocome, chinchilla rat, rat chinchilla -n02368821 mole rat -n02369293 mole rat -n02369555 sand rat -n02369680 naked mole rat -n02369935 queen, queen mole rat -n02370137 Damaraland mole rat -n02370525 Ungulata -n02370806 ungulate, hoofed mammal -n02371344 unguiculate, unguiculate mammal -n02372140 dinoceras, uintathere -n02372584 hyrax, coney, cony, dassie, das -n02372952 rock hyrax, rock rabbit, Procavia capensis -n02373336 odd-toed ungulate, perissodactyl, perissodactyl mammal -n02374149 equine, equid -n02374451 horse, Equus caballus -n02375302 roan -n02375438 stablemate, stable companion -n02375757 gee-gee -n02375862 eohippus, dawn horse -n02376542 foal -n02376679 filly -n02376791 colt -n02376918 male horse -n02377063 ridgeling, ridgling, ridgel, ridgil -n02377181 stallion, entire -n02377291 stud, studhorse -n02377388 gelding -n02377480 mare, female horse -n02377603 broodmare, stud mare -n02377703 saddle horse, riding horse, mount -n02378149 remount -n02378299 palfrey -n02378415 warhorse -n02378541 cavalry horse -n02378625 charger, courser -n02378755 steed -n02378870 prancer -n02378969 hack -n02379081 cow pony -n02379183 quarter horse -n02379329 Morgan -n02379430 Tennessee walker, Tennessee walking horse, Walking horse, Plantation walking horse -n02379630 American saddle horse -n02379743 Appaloosa -n02379908 Arabian, Arab -n02380052 Lippizan, Lipizzan, Lippizaner -n02380335 pony -n02380464 polo pony -n02380583 mustang -n02380745 bronco, bronc, broncho -n02380875 bucking bronco -n02381004 buckskin -n02381119 crowbait, crow-bait -n02381261 dun -n02381364 grey, gray -n02381460 wild horse -n02381609 tarpan, Equus caballus gomelini -n02381831 Przewalski's horse, Przevalski's horse, Equus caballus przewalskii, Equus caballus przevalskii -n02382039 cayuse, Indian pony -n02382132 hack -n02382204 hack, jade, nag, plug -n02382338 plow horse, plough horse -n02382437 pony -n02382635 Shetland pony -n02382750 Welsh pony -n02382850 Exmoor -n02382948 racehorse, race horse, bangtail -n02383231 thoroughbred -n02384741 steeplechaser -n02384858 racer -n02385002 finisher -n02385098 pony -n02385214 yearling -n02385580 dark horse -n02385676 mudder -n02385776 nonstarter -n02385898 stalking-horse -n02386014 harness horse -n02386141 cob -n02386224 hackney -n02386310 workhorse -n02386496 draft horse, draught horse, dray horse -n02386746 packhorse -n02386853 carthorse, cart horse, drayhorse -n02386968 Clydesdale -n02387093 Percheron -n02387254 farm horse, dobbin -n02387346 shire, shire horse -n02387452 pole horse, poler -n02387722 post horse, post-horse, poster -n02387887 coach horse -n02387983 pacer -n02388143 pacer, pacemaker, pacesetter -n02388276 trotting horse, trotter -n02388453 pole horse -n02388588 stepper, high stepper -n02388735 chestnut -n02388832 liver chestnut -n02388917 bay -n02389026 sorrel -n02389128 palomino -n02389261 pinto -n02389346 ass -n02389559 domestic ass, donkey, Equus asinus -n02389779 burro -n02389865 moke -n02389943 jack, jackass -n02390015 jennet, jenny, jenny ass -n02390101 mule -n02390258 hinny -n02390454 wild ass -n02390640 African wild ass, Equus asinus -n02390738 kiang, Equus kiang -n02390834 onager, Equus hemionus -n02390938 chigetai, dziggetai, Equus hemionus hemionus -n02391049 zebra -n02391234 common zebra, Burchell's zebra, Equus Burchelli -n02391373 mountain zebra, Equus zebra zebra -n02391508 grevy's zebra, Equus grevyi -n02391617 quagga, Equus quagga -n02391994 rhinoceros, rhino -n02392434 Indian rhinoceros, Rhinoceros unicornis -n02392555 woolly rhinoceros, Rhinoceros antiquitatis -n02392824 white rhinoceros, Ceratotherium simum, Diceros simus -n02393161 black rhinoceros, Diceros bicornis -n02393580 tapir -n02393807 New World tapir, Tapirus terrestris -n02393940 Malayan tapir, Indian tapir, Tapirus indicus -n02394477 even-toed ungulate, artiodactyl, artiodactyl mammal -n02395003 swine -n02395406 hog, pig, grunter, squealer, Sus scrofa -n02395694 piglet, piggy, shoat, shote -n02395855 sucking pig -n02395931 porker -n02396014 boar -n02396088 sow -n02396157 razorback, razorback hog, razorbacked hog -n02396427 wild boar, boar, Sus scrofa -n02396796 babirusa, babiroussa, babirussa, Babyrousa Babyrussa -n02397096 warthog -n02397529 peccary, musk hog -n02397744 collared peccary, javelina, Tayassu angulatus, Tayassu tajacu, Peccari angulatus -n02397987 white-lipped peccary, Tayassu pecari -n02398521 hippopotamus, hippo, river horse, Hippopotamus amphibius -n02399000 ruminant -n02401031 bovid -n02402010 bovine -n02402175 ox, wild ox -n02402425 cattle, cows, kine, oxen, Bos taurus -n02403003 ox -n02403153 stirk -n02403231 bullock, steer -n02403325 bull -n02403454 cow, moo-cow -n02403740 heifer -n02403820 bullock -n02403920 dogie, dogy, leppy -n02404028 maverick -n02404186 beef, beef cattle -n02404432 longhorn, Texas longhorn -n02404573 Brahman, Brahma, Brahmin, Bos indicus -n02404906 zebu -n02405101 aurochs, urus, Bos primigenius -n02405302 yak, Bos grunniens -n02405440 banteng, banting, tsine, Bos banteng -n02405577 Welsh, Welsh Black -n02405692 red poll -n02405799 Santa Gertrudis -n02405929 Aberdeen Angus, Angus, black Angus -n02406046 Africander -n02406174 dairy cattle, dairy cow, milch cow, milk cow, milcher, milker -n02406432 Ayrshire -n02406533 Brown Swiss -n02406647 Charolais -n02406749 Jersey -n02406859 Devon -n02406952 grade -n02407071 Durham, shorthorn -n02407172 milking shorthorn -n02407276 Galloway -n02407390 Friesian, Holstein, Holstein-Friesian -n02407521 Guernsey -n02407625 Hereford, whiteface -n02407763 cattalo, beefalo -n02407959 Old World buffalo, buffalo -n02408429 water buffalo, water ox, Asiatic buffalo, Bubalus bubalis -n02408660 Indian buffalo -n02408817 carabao -n02409038 anoa, dwarf buffalo, Anoa depressicornis -n02409202 tamarau, tamarao, Bubalus mindorensis, Anoa mindorensis -n02409508 Cape buffalo, Synercus caffer -n02409870 Asian wild ox -n02410011 gaur, Bibos gaurus -n02410141 gayal, mithan, Bibos frontalis -n02410509 bison -n02410702 American bison, American buffalo, buffalo, Bison bison -n02410900 wisent, aurochs, Bison bonasus -n02411206 musk ox, musk sheep, Ovibos moschatus -n02411705 sheep -n02411999 ewe -n02412080 ram, tup -n02412210 wether -n02412440 lamb -n02412629 lambkin -n02412700 baa-lamb -n02412787 hog, hogget, hogg -n02412909 teg -n02412977 Persian lamb -n02413050 black sheep -n02413131 domestic sheep, Ovis aries -n02413484 Cotswold -n02413593 Hampshire, Hampshire down -n02413717 Lincoln -n02413824 Exmoor -n02413917 Cheviot -n02414043 broadtail, caracul, karakul -n02414209 longwool -n02414290 merino, merino sheep -n02414442 Rambouillet -n02414578 wild sheep -n02414763 argali, argal, Ovis ammon -n02414904 Marco Polo sheep, Marco Polo's sheep, Ovis poli -n02415130 urial, Ovis vignei -n02415253 Dall sheep, Dall's sheep, white sheep, Ovis montana dalli -n02415435 mountain sheep -n02415577 bighorn, bighorn sheep, cimarron, Rocky Mountain bighorn, Rocky Mountain sheep, Ovis canadensis -n02415829 mouflon, moufflon, Ovis musimon -n02416104 aoudad, arui, audad, Barbary sheep, maned sheep, Ammotragus lervia -n02416519 goat, caprine animal -n02416820 kid -n02416880 billy, billy goat, he-goat -n02416964 nanny, nanny-goat, she-goat -n02417070 domestic goat, Capra hircus -n02417242 Cashmere goat, Kashmir goat -n02417387 Angora, Angora goat -n02417534 wild goat -n02417663 bezoar goat, pasang, Capra aegagrus -n02417785 markhor, markhoor, Capra falconeri -n02417914 ibex, Capra ibex -n02418064 goat antelope -n02418465 mountain goat, Rocky Mountain goat, Oreamnos americanus -n02418770 goral, Naemorhedus goral -n02419056 serow -n02419336 chamois, Rupicapra rupicapra -n02419634 takin, gnu goat, Budorcas taxicolor -n02419796 antelope -n02420509 blackbuck, black buck, Antilope cervicapra -n02420828 gerenuk, Litocranius walleri -n02421136 addax, Addax nasomaculatus -n02421449 gnu, wildebeest -n02421792 dik-dik -n02422106 hartebeest -n02422391 sassaby, topi, Damaliscus lunatus -n02422699 impala, Aepyceros melampus -n02423022 gazelle -n02423218 Thomson's gazelle, Gazella thomsoni -n02423362 Gazella subgutturosa -n02423589 springbok, springbuck, Antidorcas marsupialis, Antidorcas euchore -n02424085 bongo, Tragelaphus eurycerus, Boocercus eurycerus -n02424305 kudu, koodoo, koudou -n02424486 greater kudu, Tragelaphus strepsiceros -n02424589 lesser kudu, Tragelaphus imberbis -n02424695 harnessed antelope -n02424909 nyala, Tragelaphus angasi -n02425086 mountain nyala, Tragelaphus buxtoni -n02425228 bushbuck, guib, Tragelaphus scriptus -n02425532 nilgai, nylghai, nylghau, blue bull, Boselaphus tragocamelus -n02425887 sable antelope, Hippotragus niger -n02426176 saiga, Saiga tatarica -n02426481 steenbok, steinbok, Raphicerus campestris -n02426813 eland -n02427032 common eland, Taurotragus oryx -n02427183 giant eland, Taurotragus derbianus -n02427470 kob, Kobus kob -n02427576 lechwe, Kobus leche -n02427724 waterbuck -n02428089 puku, Adenota vardoni -n02428349 oryx, pasang -n02428508 gemsbok, gemsbuck, Oryx gazella -n02428842 forest goat, spindle horn, Pseudoryx nghetinhensis -n02429456 pronghorn, prongbuck, pronghorn antelope, American antelope, Antilocapra americana -n02430045 deer, cervid -n02430559 stag -n02430643 royal, royal stag -n02430748 pricket -n02430830 fawn -n02431122 red deer, elk, American elk, wapiti, Cervus elaphus -n02431337 hart, stag -n02431441 hind -n02431542 brocket -n02431628 sambar, sambur, Cervus unicolor -n02431785 wapiti, elk, American elk, Cervus elaphus canadensis -n02431976 Japanese deer, sika, Cervus nipon, Cervus sika -n02432291 Virginia deer, white tail, whitetail, white-tailed deer, whitetail deer, Odocoileus Virginianus -n02432511 mule deer, burro deer, Odocoileus hemionus -n02432704 black-tailed deer, blacktail deer, blacktail, Odocoileus hemionus columbianus -n02432983 elk, European elk, moose, Alces alces -n02433318 fallow deer, Dama dama -n02433546 roe deer, Capreolus capreolus -n02433729 roebuck -n02433925 caribou, reindeer, Greenland caribou, Rangifer tarandus -n02434190 woodland caribou, Rangifer caribou -n02434415 barren ground caribou, Rangifer arcticus -n02434712 brocket -n02434954 muntjac, barking deer -n02435216 musk deer, Moschus moschiferus -n02435517 pere david's deer, elaphure, Elaphurus davidianus -n02435853 chevrotain, mouse deer -n02436224 kanchil, Tragulus kanchil -n02436353 napu, Tragulus Javanicus -n02436645 water chevrotain, water deer, Hyemoschus aquaticus -n02437136 camel -n02437312 Arabian camel, dromedary, Camelus dromedarius -n02437482 Bactrian camel, Camelus bactrianus -n02437616 llama -n02437971 domestic llama, Lama peruana -n02438173 guanaco, Lama guanicoe -n02438272 alpaca, Lama pacos -n02438580 vicuna, Vicugna vicugna -n02439033 giraffe, camelopard, Giraffa camelopardalis -n02439398 okapi, Okapia johnstoni -n02441326 musteline mammal, mustelid, musteline -n02441942 weasel -n02442172 ermine, shorttail weasel, Mustela erminea -n02442336 stoat -n02442446 New World least weasel, Mustela rixosa -n02442572 Old World least weasel, Mustela nivalis -n02442668 longtail weasel, long-tailed weasel, Mustela frenata -n02442845 mink -n02443015 American mink, Mustela vison -n02443114 polecat, fitch, foulmart, foumart, Mustela putorius -n02443346 ferret -n02443484 black-footed ferret, ferret, Mustela nigripes -n02443808 muishond -n02443959 snake muishond, Poecilogale albinucha -n02444251 striped muishond, Ictonyx striata -n02444819 otter -n02445004 river otter, Lutra canadensis -n02445171 Eurasian otter, Lutra lutra -n02445394 sea otter, Enhydra lutris -n02445715 skunk, polecat, wood pussy -n02446206 striped skunk, Mephitis mephitis -n02446352 hooded skunk, Mephitis macroura -n02446645 hog-nosed skunk, hognosed skunk, badger skunk, rooter skunk, Conepatus leuconotus -n02447021 spotted skunk, little spotted skunk, Spilogale putorius -n02447366 badger -n02447762 American badger, Taxidea taxus -n02448060 Eurasian badger, Meles meles -n02448318 ratel, honey badger, Mellivora capensis -n02448633 ferret badger -n02448885 hog badger, hog-nosed badger, sand badger, Arctonyx collaris -n02449183 wolverine, carcajou, skunk bear, Gulo luscus -n02449350 glutton, Gulo gulo, wolverine -n02449699 grison, Grison vittatus, Galictis vittatus -n02450034 marten, marten cat -n02450295 pine marten, Martes martes -n02450426 sable, Martes zibellina -n02450561 American marten, American sable, Martes americana -n02450677 stone marten, beech marten, Martes foina -n02450829 fisher, pekan, fisher cat, black cat, Martes pennanti -n02451125 yellow-throated marten, Charronia flavigula -n02451415 tayra, taira, Eira barbara -n02451575 fictional animal -n02453108 pachyderm -n02453611 edentate -n02454379 armadillo -n02454794 peba, nine-banded armadillo, Texas armadillo, Dasypus novemcinctus -n02455135 apar, three-banded armadillo, Tolypeutes tricinctus -n02455428 tatouay, cabassous, Cabassous unicinctus -n02455720 peludo, poyou, Euphractus sexcinctus -n02456008 giant armadillo, tatou, tatu, Priodontes giganteus -n02456275 pichiciago, pichiciego, fairy armadillo, chlamyphore, Chlamyphorus truncatus -n02456962 sloth, tree sloth -n02457408 three-toed sloth, ai, Bradypus tridactylus -n02457945 two-toed sloth, unau, unai, Choloepus didactylus -n02458135 two-toed sloth, unau, unai, Choloepus hoffmanni -n02458517 megatherian, megatheriid, megatherian mammal -n02459190 mylodontid -n02460009 anteater, New World anteater -n02460451 ant bear, giant anteater, great anteater, tamanoir, Myrmecophaga jubata -n02460817 silky anteater, two-toed anteater, Cyclopes didactylus -n02461128 tamandua, tamandu, lesser anteater, Tamandua tetradactyla -n02461830 pangolin, scaly anteater, anteater -n02462213 coronet -n02469248 scapular -n02469472 tadpole, polliwog, pollywog -n02469914 primate -n02470238 simian -n02470325 ape -n02470709 anthropoid -n02470899 anthropoid ape -n02471300 hominoid -n02471762 hominid -n02472293 homo, man, human being, human -n02472987 world, human race, humanity, humankind, human beings, humans, mankind, man -n02473307 Homo erectus -n02473554 Pithecanthropus, Pithecanthropus erectus, genus Pithecanthropus -n02473720 Java man, Trinil man -n02473857 Peking man -n02473983 Sinanthropus, genus Sinanthropus -n02474110 Homo soloensis -n02474282 Javanthropus, genus Javanthropus -n02474605 Homo habilis -n02474777 Homo sapiens -n02475078 Neandertal man, Neanderthal man, Neandertal, Neanderthal, Homo sapiens neanderthalensis -n02475358 Cro-magnon -n02475669 Homo sapiens sapiens, modern man -n02476219 australopithecine -n02476567 Australopithecus afarensis -n02476870 Australopithecus africanus -n02477028 Australopithecus boisei -n02477187 Zinjanthropus, genus Zinjanthropus -n02477329 Australopithecus robustus -n02477516 Paranthropus, genus Paranthropus -n02477782 Sivapithecus -n02478239 rudapithecus, Dryopithecus Rudapithecus hungaricus -n02478875 proconsul -n02479332 Aegyptopithecus -n02480153 great ape, pongid -n02480495 orangutan, orang, orangutang, Pongo pygmaeus -n02480855 gorilla, Gorilla gorilla -n02481103 western lowland gorilla, Gorilla gorilla gorilla -n02481235 eastern lowland gorilla, Gorilla gorilla grauri -n02481366 mountain gorilla, Gorilla gorilla beringei -n02481500 silverback -n02481823 chimpanzee, chimp, Pan troglodytes -n02482060 western chimpanzee, Pan troglodytes verus -n02482286 eastern chimpanzee, Pan troglodytes schweinfurthii -n02482474 central chimpanzee, Pan troglodytes troglodytes -n02482650 pygmy chimpanzee, bonobo, Pan paniscus -n02483092 lesser ape -n02483362 gibbon, Hylobates lar -n02483708 siamang, Hylobates syndactylus, Symphalangus syndactylus -n02484322 monkey -n02484473 Old World monkey, catarrhine -n02484975 guenon, guenon monkey -n02485225 talapoin, Cercopithecus talapoin -n02485371 grivet, Cercopithecus aethiops -n02485536 vervet, vervet monkey, Cercopithecus aethiops pygerythrus -n02485688 green monkey, African green monkey, Cercopithecus aethiops sabaeus -n02485988 mangabey -n02486261 patas, hussar monkey, Erythrocebus patas -n02486410 baboon -n02486657 chacma, chacma baboon, Papio ursinus -n02486908 mandrill, Mandrillus sphinx -n02487079 drill, Mandrillus leucophaeus -n02487347 macaque -n02487547 rhesus, rhesus monkey, Macaca mulatta -n02487675 bonnet macaque, bonnet monkey, capped macaque, crown monkey, Macaca radiata -n02487847 Barbary ape, Macaca sylvana -n02488003 crab-eating macaque, croo monkey, Macaca irus -n02488291 langur -n02488415 entellus, hanuman, Presbytes entellus, Semnopithecus entellus -n02488702 colobus, colobus monkey -n02488894 guereza, Colobus guereza -n02489166 proboscis monkey, Nasalis larvatus -n02489589 New World monkey, platyrrhine, platyrrhinian -n02490219 marmoset -n02490597 true marmoset -n02490811 pygmy marmoset, Cebuella pygmaea -n02491107 tamarin, lion monkey, lion marmoset, leoncita -n02491329 silky tamarin, Leontocebus rosalia -n02491474 pinche, Leontocebus oedipus -n02492035 capuchin, ringtail, Cebus capucinus -n02492356 douroucouli, Aotus trivirgatus -n02492660 howler monkey, howler -n02492948 saki -n02493224 uakari -n02493509 titi, titi monkey -n02493793 spider monkey, Ateles geoffroyi -n02494079 squirrel monkey, Saimiri sciureus -n02494383 woolly monkey -n02495242 tree shrew -n02496052 prosimian -n02496913 lemur -n02497673 Madagascar cat, ring-tailed lemur, Lemur catta -n02498153 aye-aye, Daubentonia madagascariensis -n02498743 slender loris, Loris gracilis -n02499022 slow loris, Nycticebus tardigradua, Nycticebus pygmaeus -n02499316 potto, kinkajou, Perodicticus potto -n02499568 angwantibo, golden potto, Arctocebus calabarensis -n02499808 galago, bushbaby, bush baby -n02500267 indri, indris, Indri indri, Indri brevicaudatus -n02500596 woolly indris, Avahi laniger -n02501583 tarsier -n02501923 Tarsius syrichta -n02502006 Tarsius glis -n02502514 flying lemur, flying cat, colugo -n02502807 Cynocephalus variegatus -n02503127 proboscidean, proboscidian -n02503517 elephant -n02503756 rogue elephant -n02504013 Indian elephant, Elephas maximus -n02504458 African elephant, Loxodonta africana -n02504770 mammoth -n02505063 woolly mammoth, northern mammoth, Mammuthus primigenius -n02505238 columbian mammoth, Mammuthus columbi -n02505485 imperial mammoth, imperial elephant, Archidiskidon imperator -n02505998 mastodon, mastodont -n02506947 plantigrade mammal, plantigrade -n02507148 digitigrade mammal, digitigrade -n02507649 procyonid -n02508021 raccoon, racoon -n02508213 common raccoon, common racoon, coon, ringtail, Procyon lotor -n02508346 crab-eating raccoon, Procyon cancrivorus -n02508742 bassarisk, cacomistle, cacomixle, coon cat, raccoon fox, ringtail, ring-tailed cat, civet cat, miner's cat, Bassariscus astutus -n02509197 kinkajou, honey bear, potto, Potos flavus, Potos caudivolvulus -n02509515 coati, coati-mondi, coati-mundi, coon cat, Nasua narica -n02509815 lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens -n02510455 giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca -n02511730 twitterer -n02512053 fish -n02512752 fingerling -n02512830 game fish, sport fish -n02512938 food fish -n02513248 rough fish -n02513355 groundfish, bottom fish -n02513560 young fish -n02513727 parr -n02513805 mouthbreeder -n02513939 spawner -n02514041 barracouta, snoek -n02515214 crossopterygian, lobefin, lobe-finned fish -n02515713 coelacanth, Latimeria chalumnae -n02516188 lungfish -n02516776 ceratodus -n02517442 catfish, siluriform fish -n02517938 silurid, silurid fish -n02518324 European catfish, sheatfish, Silurus glanis -n02518622 electric catfish, Malopterurus electricus -n02519148 bullhead, bullhead catfish -n02519340 horned pout, hornpout, pout, Ameiurus Melas -n02519472 brown bullhead -n02519686 channel catfish, channel cat, Ictalurus punctatus -n02519862 blue catfish, blue cat, blue channel catfish, blue channel cat -n02520147 flathead catfish, mudcat, goujon, shovelnose catfish, spoonbill catfish, Pylodictus olivaris -n02520525 armored catfish -n02520810 sea catfish -n02521646 gadoid, gadoid fish -n02522399 cod, codfish -n02522637 codling -n02522722 Atlantic cod, Gadus morhua -n02522866 Pacific cod, Alaska cod, Gadus macrocephalus -n02523110 whiting, Merlangus merlangus, Gadus merlangus -n02523427 burbot, eelpout, ling, cusk, Lota lota -n02523877 haddock, Melanogrammus aeglefinus -n02524202 pollack, pollock, Pollachius pollachius -n02524524 hake -n02524659 silver hake, Merluccius bilinearis, whiting -n02524928 ling -n02525382 cusk, torsk, Brosme brosme -n02525703 grenadier, rattail, rattail fish -n02526121 eel -n02526425 elver -n02526818 common eel, freshwater eel -n02527057 tuna, Anguilla sucklandii -n02527271 moray, moray eel -n02527622 conger, conger eel -n02528163 teleost fish, teleost, teleostan -n02529293 beaked salmon, sandfish, Gonorhynchus gonorhynchus -n02529772 clupeid fish, clupeid -n02530052 whitebait -n02530188 brit, britt -n02530421 shad -n02530637 common American shad, Alosa sapidissima -n02530831 river shad, Alosa chrysocloris -n02530999 allice shad, allis shad, allice, allis, Alosa alosa -n02531114 alewife, Alosa pseudoharengus, Pomolobus pseudoharengus -n02531625 menhaden, Brevoortia tyrannis -n02532028 herring, Clupea harangus -n02532272 Atlantic herring, Clupea harengus harengus -n02532451 Pacific herring, Clupea harengus pallasii -n02532602 sardine -n02532786 sild -n02532918 brisling, sprat, Clupea sprattus -n02533209 pilchard, sardine, Sardina pilchardus -n02533545 Pacific sardine, Sardinops caerulea -n02533834 anchovy -n02534165 mediterranean anchovy, Engraulis encrasicholus -n02534559 salmonid -n02534734 salmon -n02535080 parr -n02535163 blackfish -n02535258 redfish -n02535537 Atlantic salmon, Salmo salar -n02535759 landlocked salmon, lake salmon -n02536165 sockeye, sockeye salmon, red salmon, blueback salmon, Oncorhynchus nerka -n02536456 chinook, chinook salmon, king salmon, quinnat salmon, Oncorhynchus tshawytscha -n02536864 coho, cohoe, coho salmon, blue jack, silver salmon, Oncorhynchus kisutch -n02537085 trout -n02537319 brown trout, salmon trout, Salmo trutta -n02537525 rainbow trout, Salmo gairdneri -n02537716 sea trout -n02538010 lake trout, salmon trout, Salvelinus namaycush -n02538216 brook trout, speckled trout, Salvelinus fontinalis -n02538406 char, charr -n02538562 Arctic char, Salvelinus alpinus -n02538985 whitefish -n02539424 lake whitefish, Coregonus clupeaformis -n02539573 cisco, lake herring, Coregonus artedi -n02539894 round whitefish, Menominee whitefish, Prosopium cylindraceum -n02540412 smelt -n02540983 sparling, European smelt, Osmerus eperlanus -n02541257 capelin, capelan, caplin -n02541687 tarpon, Tarpon atlanticus -n02542017 ladyfish, tenpounder, Elops saurus -n02542432 bonefish, Albula vulpes -n02542958 argentine -n02543255 lanternfish -n02543565 lizardfish, snakefish, snake-fish -n02544274 lancetfish, lancet fish, wolffish -n02545841 opah, moonfish, Lampris regius -n02546028 New World opah, Lampris guttatus -n02546331 ribbonfish -n02546627 dealfish, Trachipterus arcticus -n02547014 oarfish, king of the herring, ribbonfish, Regalecus glesne -n02547733 batfish -n02548247 goosefish, angler, anglerfish, angler fish, monkfish, lotte, allmouth, Lophius Americanus -n02548689 toadfish, Opsanus tau -n02548884 oyster fish, oyster-fish, oysterfish -n02549248 frogfish -n02549376 sargassum fish -n02549989 needlefish, gar, billfish -n02550203 timucu -n02550460 flying fish -n02550655 monoplane flying fish, two-wing flying fish -n02551134 halfbeak -n02551668 saury, billfish, Scomberesox saurus -n02552171 spiny-finned fish, acanthopterygian -n02553028 lingcod, Ophiodon elongatus -n02554730 percoid fish, percoid, percoidean -n02555863 perch -n02556373 climbing perch, Anabas testudineus, A. testudineus -n02556846 perch -n02557182 yellow perch, Perca flavescens -n02557318 European perch, Perca fluviatilis -n02557591 pike-perch, pike perch -n02557749 walleye, walleyed pike, jack salmon, dory, Stizostedion vitreum -n02557909 blue pike, blue pickerel, blue pikeperch, blue walleye, Strizostedion vitreum glaucum -n02558206 snail darter, Percina tanasi -n02558860 cusk-eel -n02559144 brotula -n02559383 pearlfish, pearl-fish -n02559862 robalo -n02560110 snook -n02561108 pike -n02561381 northern pike, Esox lucius -n02561514 muskellunge, Esox masquinongy -n02561661 pickerel -n02561803 chain pickerel, chain pike, Esox niger -n02561937 redfin pickerel, barred pickerel, Esox americanus -n02562315 sunfish, centrarchid -n02562796 crappie -n02562971 black crappie, Pomoxis nigromaculatus -n02563079 white crappie, Pomoxis annularis -n02563182 freshwater bream, bream -n02563648 pumpkinseed, Lepomis gibbosus -n02563792 bluegill, Lepomis macrochirus -n02563949 spotted sunfish, stumpknocker, Lepomis punctatus -n02564270 freshwater bass -n02564403 rock bass, rock sunfish, Ambloplites rupestris -n02564720 black bass -n02564935 Kentucky black bass, spotted black bass, Micropterus pseudoplites -n02565072 smallmouth, smallmouth bass, smallmouthed bass, smallmouth black bass, smallmouthed black bass, Micropterus dolomieu -n02565324 largemouth, largemouth bass, largemouthed bass, largemouth black bass, largemouthed black bass, Micropterus salmoides -n02565573 bass -n02566109 serranid fish, serranid -n02566489 white perch, silver perch, Morone americana -n02566665 yellow bass, Morone interrupta -n02567334 blackmouth bass, Synagrops bellus -n02567633 rock sea bass, rock bass, Centropristis philadelphica -n02568087 striped bass, striper, Roccus saxatilis, rockfish -n02568447 stone bass, wreckfish, Polyprion americanus -n02568959 grouper -n02569484 hind -n02569631 rock hind, Epinephelus adscensionis -n02569905 creole-fish, Paranthias furcifer -n02570164 jewfish, Mycteroperca bonaci -n02570484 soapfish -n02570838 surfperch, surffish, surf fish -n02571167 rainbow seaperch, rainbow perch, Hipsurus caryi -n02571652 bigeye -n02571810 catalufa, Priacanthus arenatus -n02572196 cardinalfish -n02572484 flame fish, flamefish, Apogon maculatus -n02573249 tilefish, Lopholatilus chamaeleonticeps -n02573704 bluefish, Pomatomus saltatrix -n02574271 cobia, Rachycentron canadum, sergeant fish -n02574910 remora, suckerfish, sucking fish -n02575325 sharksucker, Echeneis naucrates -n02575590 whale sucker, whalesucker, Remilegia australis -n02576223 carangid fish, carangid -n02576575 jack -n02576906 crevalle jack, jack crevalle, Caranx hippos -n02577041 yellow jack, Caranx bartholomaei -n02577164 runner, blue runner, Caranx crysos -n02577403 rainbow runner, Elagatis bipinnulata -n02577662 leatherjacket, leatherjack -n02577952 threadfish, thread-fish, Alectis ciliaris -n02578233 moonfish, Atlantic moonfish, horsefish, horsehead, horse-head, dollarfish, Selene setapinnis -n02578454 lookdown, lookdown fish, Selene vomer -n02578771 amberjack, amberfish -n02578928 yellowtail, Seriola dorsalis -n02579303 kingfish, Seriola grandis -n02579557 pompano -n02579762 Florida pompano, Trachinotus carolinus -n02579928 permit, Trachinotus falcatus -n02580336 scad -n02580679 horse mackerel, jack mackerel, Spanish mackerel, saurel, Trachurus symmetricus -n02580830 horse mackerel, saurel, Trachurus trachurus -n02581108 bigeye scad, big-eyed scad, goggle-eye, Selar crumenophthalmus -n02581482 mackerel scad, mackerel shad, Decapterus macarellus -n02581642 round scad, cigarfish, quiaquia, Decapterus punctatus -n02581957 dolphinfish, dolphin, mahimahi -n02582220 Coryphaena hippurus -n02582349 Coryphaena equisetis -n02582721 pomfret, Brama raii -n02583567 characin, characin fish, characid -n02583890 tetra -n02584145 cardinal tetra, Paracheirodon axelrodi -n02584449 piranha, pirana, caribe -n02585872 cichlid, cichlid fish -n02586238 bolti, Tilapia nilotica -n02586543 snapper -n02587051 red snapper, Lutjanus blackfordi -n02587300 grey snapper, gray snapper, mangrove snapper, Lutjanus griseus -n02587479 mutton snapper, muttonfish, Lutjanus analis -n02587618 schoolmaster, Lutjanus apodus -n02587877 yellowtail, yellowtail snapper, Ocyurus chrysurus -n02588286 grunt -n02588794 margate, Haemulon album -n02588945 Spanish grunt, Haemulon macrostomum -n02589062 tomtate, Haemulon aurolineatum -n02589196 cottonwick, Haemulon malanurum -n02589316 sailor's-choice, sailors choice, Haemulon parra -n02589623 porkfish, pork-fish, Anisotremus virginicus -n02589796 pompon, black margate, Anisotremus surinamensis -n02590094 pigfish, hogfish, Orthopristis chrysopterus -n02590495 sparid, sparid fish -n02590702 sea bream, bream -n02590987 porgy -n02591330 red porgy, Pagrus pagrus -n02591613 European sea bream, Pagellus centrodontus -n02591911 Atlantic sea bream, Archosargus rhomboidalis -n02592055 sheepshead, Archosargus probatocephalus -n02592371 pinfish, sailor's-choice, squirrelfish, Lagodon rhomboides -n02592734 sheepshead porgy, Calamus penna -n02593019 snapper, Chrysophrys auratus -n02593191 black bream, Chrysophrys australis -n02593453 scup, northern porgy, northern scup, Stenotomus chrysops -n02593679 scup, southern porgy, southern scup, Stenotomus aculeatus -n02594250 sciaenid fish, sciaenid -n02594942 striped drum, Equetus pulcher -n02595056 jackknife-fish, Equetus lanceolatus -n02595339 silver perch, mademoiselle, Bairdiella chrysoura -n02595702 red drum, channel bass, redfish, Sciaenops ocellatus -n02596067 mulloway, jewfish, Sciaena antarctica -n02596252 maigre, maiger, Sciaena aquila -n02596381 croaker -n02596720 Atlantic croaker, Micropogonias undulatus -n02597004 yellowfin croaker, surffish, surf fish, Umbrina roncador -n02597367 whiting -n02597608 kingfish -n02597818 king whiting, Menticirrhus americanus -n02597972 northern whiting, Menticirrhus saxatilis -n02598134 corbina, Menticirrhus undulatus -n02598573 white croaker, chenfish, kingfish, Genyonemus lineatus -n02598878 white croaker, queenfish, Seriphus politus -n02599052 sea trout -n02599347 weakfish, Cynoscion regalis -n02599557 spotted weakfish, spotted sea trout, spotted squeateague, Cynoscion nebulosus -n02599958 mullet -n02600298 goatfish, red mullet, surmullet, Mullus surmuletus -n02600503 red goatfish, Mullus auratus -n02600798 yellow goatfish, Mulloidichthys martinicus -n02601344 mullet, grey mullet, gray mullet -n02601767 striped mullet, Mugil cephalus -n02601921 white mullet, Mugil curema -n02602059 liza, Mugil liza -n02602405 silversides, silverside -n02602760 jacksmelt, Atherinopsis californiensis -n02603317 barracuda -n02603540 great barracuda, Sphyraena barracuda -n02603862 sweeper -n02604157 sea chub -n02604480 Bermuda chub, rudderfish, Kyphosus sectatrix -n02604954 spadefish, angelfish, Chaetodipterus faber -n02605316 butterfly fish -n02605703 chaetodon -n02605936 angelfish -n02606052 rock beauty, Holocanthus tricolor -n02606384 damselfish, demoiselle -n02606751 beaugregory, Pomacentrus leucostictus -n02607072 anemone fish -n02607201 clown anemone fish, Amphiprion percula -n02607470 sergeant major, Abudefduf saxatilis -n02607862 wrasse -n02608284 pigfish, giant pigfish, Achoerodus gouldii -n02608547 hogfish, hog snapper, Lachnolaimus maximus -n02608860 slippery dick, Halicoeres bivittatus -n02608996 puddingwife, pudding-wife, Halicoeres radiatus -n02609302 bluehead, Thalassoma bifasciatum -n02609823 pearly razorfish, Hemipteronatus novacula -n02610066 tautog, blackfish, Tautoga onitis -n02610373 cunner, bergall, Tautogolabrus adspersus -n02610664 parrotfish, polly fish, pollyfish -n02610980 threadfin -n02611561 jawfish -n02611898 stargazer -n02612167 sand stargazer -n02613181 blenny, combtooth blenny -n02613572 shanny, Blennius pholis -n02613820 Molly Miller, Scartella cristata -n02614140 clinid, clinid fish -n02614482 pikeblenny -n02614653 bluethroat pikeblenny, Chaenopsis ocellata -n02614978 gunnel, bracketed blenny -n02615298 rock gunnel, butterfish, Pholis gunnellus -n02616128 eelblenny -n02616397 wrymouth, ghostfish, Cryptacanthodes maculatus -n02616851 wolffish, wolf fish, catfish -n02617537 viviparous eelpout, Zoarces viviparus -n02618094 ocean pout, Macrozoarces americanus -n02618513 sand lance, sand launce, sand eel, launce -n02618827 dragonet -n02619165 goby, gudgeon -n02619550 mudskipper, mudspringer -n02619861 sleeper, sleeper goby -n02620167 flathead -n02620578 archerfish, Toxotes jaculatrix -n02621258 surgeonfish -n02621908 gempylid -n02622249 snake mackerel, Gempylus serpens -n02622547 escolar, Lepidocybium flavobrunneum -n02622712 oilfish, Ruvettus pretiosus -n02622955 cutlassfish, frost fish, hairtail -n02623445 scombroid, scombroid fish -n02624167 mackerel -n02624551 common mackerel, shiner, Scomber scombrus -n02624807 Spanish mackerel, Scomber colias -n02624987 chub mackerel, tinker, Scomber japonicus -n02625258 wahoo, Acanthocybium solandri -n02625612 Spanish mackerel -n02625851 king mackerel, cavalla, cero, Scomberomorus cavalla -n02626089 Scomberomorus maculatus -n02626265 cero, pintado, kingfish, Scomberomorus regalis -n02626471 sierra, Scomberomorus sierra -n02626762 tuna, tunny -n02627037 albacore, long-fin tunny, Thunnus alalunga -n02627292 bluefin, bluefin tuna, horse mackerel, Thunnus thynnus -n02627532 yellowfin, yellowfin tuna, Thunnus albacares -n02627835 bonito -n02628062 skipjack, Atlantic bonito, Sarda sarda -n02628259 Chile bonito, Chilean bonito, Pacific bonito, Sarda chiliensis -n02628600 skipjack, skipjack tuna, Euthynnus pelamis -n02629230 bonito, oceanic bonito, Katsuwonus pelamis -n02629716 swordfish, Xiphias gladius -n02630281 sailfish -n02630615 Atlantic sailfish, Istiophorus albicans -n02630739 billfish -n02631041 marlin -n02631330 blue marlin, Makaira nigricans -n02631475 black marlin, Makaira mazara, Makaira marlina -n02631628 striped marlin, Makaira mitsukurii -n02631775 white marlin, Makaira albida -n02632039 spearfish -n02632494 louvar, Luvarus imperialis -n02633422 dollarfish, Poronotus triacanthus -n02633677 palometa, California pompano, Palometa simillima -n02633977 harvestfish, Paprilus alepidotus -n02634545 driftfish -n02635154 barrelfish, black rudderfish, Hyperglyphe perciformis -n02635580 clingfish -n02636170 tripletail -n02636405 Atlantic tripletail, Lobotes surinamensis -n02636550 Pacific tripletail, Lobotes pacificus -n02636854 mojarra -n02637179 yellowfin mojarra, Gerres cinereus -n02637475 silver jenny, Eucinostomus gula -n02637977 whiting -n02638596 ganoid, ganoid fish -n02639087 bowfin, grindle, dogfish, Amia calva -n02639605 paddlefish, duckbill, Polyodon spathula -n02639922 Chinese paddlefish, Psephurus gladis -n02640242 sturgeon -n02640626 Pacific sturgeon, white sturgeon, Sacramento sturgeon, Acipenser transmontanus -n02640857 beluga, hausen, white sturgeon, Acipenser huso -n02641379 gar, garfish, garpike, billfish, Lepisosteus osseus -n02642107 scorpaenoid, scorpaenoid fish -n02642644 scorpaenid, scorpaenid fish -n02643112 scorpionfish, scorpion fish, sea scorpion -n02643316 plumed scorpionfish, Scorpaena grandicornis -n02643566 lionfish -n02643836 stonefish, Synanceja verrucosa -n02644113 rockfish -n02644360 copper rockfish, Sebastodes caurinus -n02644501 vermillion rockfish, rasher, Sebastodes miniatus -n02644665 red rockfish, Sebastodes ruberrimus -n02644817 rosefish, ocean perch, Sebastodes marinus -n02645538 bullhead -n02645691 miller's-thumb -n02645953 sea raven, Hemitripterus americanus -n02646667 lumpfish, Cyclopterus lumpus -n02646892 lumpsucker -n02648035 pogge, armed bullhead, Agonus cataphractus -n02648625 greenling -n02648916 kelp greenling, Hexagrammos decagrammus -n02649218 painted greenling, convict fish, convictfish, Oxylebius pictus -n02649546 flathead -n02650050 gurnard -n02650413 tub gurnard, yellow gurnard, Trigla lucerna -n02650541 sea robin, searobin -n02651060 northern sea robin, Prionotus carolinus -n02652132 flying gurnard, flying robin, butterflyfish -n02652668 plectognath, plectognath fish -n02653145 triggerfish -n02653497 queen triggerfish, Bessy cerca, oldwench, oldwife, Balistes vetula -n02653786 filefish -n02654112 leatherjacket, leatherfish -n02654425 boxfish, trunkfish -n02654745 cowfish, Lactophrys quadricornis -n02655020 puffer, pufferfish, blowfish, globefish -n02655523 spiny puffer -n02655848 porcupinefish, porcupine fish, Diodon hystrix -n02656032 balloonfish, Diodon holocanthus -n02656301 burrfish -n02656670 ocean sunfish, sunfish, mola, headfish -n02656969 sharptail mola, Mola lanceolata -n02657368 flatfish -n02657694 flounder -n02658079 righteye flounder, righteyed flounder -n02658531 plaice, Pleuronectes platessa -n02658811 European flatfish, Platichthys flesus -n02659176 yellowtail flounder, Limanda ferruginea -n02659478 winter flounder, blackback flounder, lemon sole, Pseudopleuronectes americanus -n02659808 lemon sole, Microstomus kitt -n02660091 American plaice, Hippoglossoides platessoides -n02660208 halibut, holibut -n02660519 Atlantic halibut, Hippoglossus hippoglossus -n02660640 Pacific halibut, Hippoglossus stenolepsis -n02661017 lefteye flounder, lefteyed flounder -n02661473 southern flounder, Paralichthys lethostigmus -n02661618 summer flounder, Paralichthys dentatus -n02662239 whiff -n02662397 horned whiff, Citharichthys cornutus -n02662559 sand dab -n02662825 windowpane, Scophthalmus aquosus -n02662993 brill, Scophthalmus rhombus -n02663211 turbot, Psetta maxima -n02663485 tonguefish, tongue-fish -n02663849 sole -n02664285 European sole, Solea solea -n02664642 English sole, lemon sole, Parophrys vitulus -n02665250 hogchoker, Trinectes maculatus -n02665985 aba -n02666196 abacus -n02666501 abandoned ship, derelict -n02666624 A battery -n02666943 abattoir, butchery, shambles, slaughterhouse -n02667093 abaya -n02667244 Abbe condenser -n02667379 abbey -n02667478 abbey -n02667576 abbey -n02667693 Abney level -n02668393 abrader, abradant -n02668613 abrading stone -n02669295 abutment -n02669442 abutment arch -n02669534 academic costume -n02669723 academic gown, academic robe, judge's robe -n02670186 accelerator, throttle, throttle valve -n02670382 accelerator, particle accelerator, atom smasher -n02670683 accelerator, accelerator pedal, gas pedal, gas, throttle, gun -n02670935 accelerometer -n02671780 accessory, accoutrement, accouterment -n02672152 accommodating lens implant, accommodating IOL -n02672371 accommodation -n02672831 accordion, piano accordion, squeeze box -n02675077 acetate disk, phonograph recording disk -n02675219 acetate rayon, acetate -n02675522 achromatic lens -n02676097 acoustic delay line, sonic delay line -n02676261 acoustic device -n02676566 acoustic guitar -n02676670 acoustic modem -n02676938 acropolis -n02677028 acrylic -n02677136 acrylic, acrylic paint -n02677436 actinometer -n02677718 action, action mechanism -n02678010 active matrix screen -n02678384 actuator -n02678897 adapter, adaptor -n02679142 adder -n02679257 adding machine, totalizer, totaliser -n02679961 addressing machine, Addressograph -n02680110 adhesive bandage -n02680512 adit -n02680638 adjoining room -n02680754 adjustable wrench, adjustable spanner -n02681392 adobe, adobe brick -n02682311 adz, adze -n02682407 aeolian harp, aeolian lyre, wind harp -n02682569 aerator -n02682811 aerial torpedo -n02682922 aerosol, aerosol container, aerosol can, aerosol bomb, spray can -n02683183 Aertex -n02683323 afghan -n02683454 Afro-wig -n02683558 afterburner -n02683791 after-shave, after-shave lotion -n02684248 agateware -n02684356 agglomerator -n02684515 aglet, aiglet, aiguilette -n02684649 aglet, aiglet -n02684962 agora, public square -n02685082 aigrette, aigret -n02685253 aileron -n02685365 air bag -n02685701 airbrake -n02685995 airbrush -n02686121 airbus -n02686227 air compressor -n02686379 air conditioner, air conditioning -n02686568 aircraft -n02687172 aircraft carrier, carrier, flattop, attack aircraft carrier -n02687423 aircraft engine -n02687682 air cushion, air spring -n02687821 airdock, hangar, repair shed -n02687992 airfield, landing field, flying field, field -n02688273 air filter, air cleaner -n02688443 airfoil, aerofoil, control surface, surface -n02689144 airframe -n02689274 air gun, airgun, air rifle -n02689434 air hammer, jackhammer, pneumatic hammer -n02689748 air horn -n02689819 airing cupboard -n02690373 airliner -n02690715 airmailer -n02691156 airplane, aeroplane, plane -n02692086 airplane propeller, airscrew, prop -n02692232 airport, airdrome, aerodrome, drome -n02692513 air pump, vacuum pump -n02692680 air search radar -n02692877 airship, dirigible -n02693246 air terminal, airport terminal -n02693413 air-to-air missile -n02693540 air-to-ground missile, air-to-surface missile -n02694045 aisle -n02694279 Aladdin's lamp -n02694426 alarm, warning device, alarm system -n02694662 alarm clock, alarm -n02694966 alb -n02695627 alcazar -n02695762 alcohol thermometer, alcohol-in-glass thermometer -n02696165 alehouse -n02696246 alembic -n02696569 algometer -n02696843 alidade, alidad -n02697022 alidade, alidad -n02697221 A-line -n02697576 Allen screw -n02697675 Allen wrench -n02697876 alligator wrench -n02698244 alms dish, alms tray -n02698473 alpaca -n02698634 alpenstock -n02699494 altar -n02699629 altar, communion table, Lord's table -n02699770 altarpiece, reredos -n02699915 altazimuth -n02700064 alternator -n02700258 altimeter -n02700895 Amati -n02701002 ambulance -n02701260 amen corner -n02701730 American organ -n02702989 ammeter -n02703124 ammonia clock -n02703275 ammunition, ammo -n02704645 amphibian, amphibious aircraft -n02704792 amphibian, amphibious vehicle -n02704949 amphitheater, amphitheatre, coliseum -n02705201 amphitheater, amphitheatre -n02705429 amphora -n02705944 amplifier -n02706221 ampulla -n02706806 amusement arcade -n02708093 analog clock -n02708224 analog computer, analogue computer -n02708433 analog watch -n02708555 analytical balance, chemical balance -n02708711 analyzer, analyser -n02708885 anamorphosis, anamorphism -n02709101 anastigmat -n02709367 anchor, ground tackle -n02709637 anchor chain, anchor rope -n02709763 anchor light, riding light, riding lamp -n02709908 AND circuit, AND gate -n02710044 andiron, firedog, dog, dog-iron -n02710201 android, humanoid, mechanical man -n02710324 anechoic chamber -n02710429 anemometer, wind gauge, wind gage -n02710600 aneroid barometer, aneroid -n02711237 angiocardiogram -n02711780 angioscope -n02712545 angle bracket, angle iron -n02712643 angledozer -n02713003 ankle brace -n02713218 anklet, anklets, bobbysock, bobbysocks -n02713364 anklet -n02713496 ankus -n02714315 anode -n02714535 anode -n02714751 answering machine -n02715229 antenna, aerial, transmitting aerial -n02715513 anteroom, antechamber, entrance hall, hall, foyer, lobby, vestibule -n02715712 antiaircraft, antiaircraft gun, flak, flack, pom-pom, ack-ack, ack-ack gun -n02716626 antiballistic missile, ABM -n02720048 antifouling paint -n02720576 anti-G suit, G suit -n02721813 antimacassar -n02723165 antiperspirant -n02724722 anti-submarine rocket -n02725872 anvil -n02726017 ao dai -n02726210 apadana -n02726305 apartment, flat -n02726681 apartment building, apartment house -n02727016 aperture -n02727141 aperture -n02727426 apiary, bee house -n02727825 apparatus, setup -n02728440 apparel, wearing apparel, dress, clothes -n02729222 applecart -n02729837 appliance -n02729965 appliance, contraption, contrivance, convenience, gadget, gizmo, gismo, widget -n02730265 applicator, applier -n02730568 appointment, fitting -n02730930 apron -n02731251 apron string -n02731398 apse, apsis -n02731629 aqualung, Aqua-Lung, scuba -n02731900 aquaplane -n02732072 aquarium, fish tank, marine museum -n02732572 arabesque -n02732827 arbor, arbour, bower, pergola -n02733213 arcade, colonnade -n02733524 arch -n02734725 architecture -n02734835 architrave -n02735268 arch support -n02735361 arc lamp, arc light -n02735538 arctic, galosh, golosh, rubber, gumshoe -n02735688 area -n02736396 areaway -n02736798 argyle, argyll -n02737351 ark -n02737660 arm -n02738031 armament -n02738271 armature -n02738449 armband -n02738535 armchair -n02738741 armet -n02738859 arm guard, arm pad -n02738978 armhole -n02739123 armilla -n02739427 armlet, arm band -n02739550 armoire -n02739668 armor, armour -n02739889 armored car, armoured car -n02740061 armored car, armoured car -n02740300 armored personnel carrier, armoured personnel carrier, APC -n02740533 armored vehicle, armoured vehicle -n02740764 armor plate, armour plate, armor plating, plate armor, plate armour -n02741367 armory, armoury, arsenal -n02741475 armrest -n02742070 arquebus, harquebus, hackbut, hagbut -n02742194 array -n02742322 array, raiment, regalia -n02742468 arrester, arrester hook -n02742753 arrow -n02743426 arsenal, armory, armoury -n02744323 arterial road -n02744844 arthrogram -n02744961 arthroscope -n02745492 artificial heart -n02745611 artificial horizon, gyro horizon, flight indicator -n02745816 artificial joint -n02746008 artificial kidney, hemodialyzer -n02746225 artificial skin -n02746365 artillery, heavy weapon, gun, ordnance -n02746595 artillery shell -n02746683 artist's loft -n02746978 art school -n02747063 ascot -n02747177 ashcan, trash can, garbage can, wastebin, ash bin, ash-bin, ashbin, dustbin, trash barrel, trash bin -n02747672 ash-pan -n02747802 ashtray -n02748183 aspergill, aspersorium -n02748359 aspersorium -n02748491 aspirator -n02749169 aspirin powder, headache powder -n02749292 assault gun -n02749479 assault rifle, assault gun -n02749670 assegai, assagai -n02749790 assembly -n02749953 assembly -n02750070 assembly hall -n02750169 assembly plant -n02750320 astatic coils -n02750652 astatic galvanometer -n02751067 astrodome -n02751215 astrolabe -n02751295 astronomical telescope -n02751490 astronomy satellite -n02752199 athenaeum, atheneum -n02752496 athletic sock, sweat sock, varsity sock -n02752615 athletic supporter, supporter, suspensor, jockstrap, jock -n02752810 atlas, telamon -n02752917 atmometer, evaporometer -n02753044 atom bomb, atomic bomb, A-bomb, fission bomb, plutonium bomb -n02753394 atomic clock -n02753710 atomic pile, atomic reactor, pile, chain reactor -n02754103 atomizer, atomiser, spray, sprayer, nebulizer, nebuliser -n02754656 atrium -n02755140 attache case, attache -n02755352 attachment, bond -n02755529 attack submarine -n02755675 attenuator -n02755823 attic -n02755984 attic fan -n02756098 attire, garb, dress -n02756854 audio amplifier -n02756977 audiocassette -n02757061 audio CD, audio compact disc -n02757337 audiometer, sonometer -n02757462 audio system, sound system -n02757714 audiotape -n02757810 audiotape -n02757927 audiovisual, audiovisual aid -n02758134 auditorium -n02758490 auger, gimlet, screw auger, wimble -n02758863 autobahn -n02758960 autoclave, sterilizer, steriliser -n02759257 autofocus -n02759387 autogiro, autogyro, gyroplane -n02759700 autoinjector -n02759963 autoloader, self-loader -n02760099 automat -n02760199 automat -n02760298 automatic choke -n02760429 automatic firearm, automatic gun, automatic weapon -n02760658 automatic pistol, automatic -n02760855 automatic rifle, automatic, machine rifle -n02761034 automatic transmission, automatic drive -n02761206 automation -n02761392 automaton, robot, golem -n02761557 automobile engine -n02761696 automobile factory, auto factory, car factory -n02761834 automobile horn, car horn, motor horn, horn, hooter -n02762169 autopilot, automatic pilot, robot pilot -n02762371 autoradiograph -n02762508 autostrada -n02762725 auxiliary boiler, donkey boiler -n02762909 auxiliary engine, donkey engine -n02763083 auxiliary pump, donkey pump -n02763198 auxiliary research submarine -n02763306 auxiliary storage, external storage, secondary storage -n02763604 aviary, bird sanctuary, volary -n02763714 awl -n02763901 awning, sunshade, sunblind -n02764044 ax, axe -n02764398 ax handle, axe handle -n02764505 ax head, axe head -n02764614 axis, axis of rotation -n02764779 axle -n02764935 axle bar -n02765028 axletree -n02766168 babushka -n02766320 baby bed, baby's bed -n02766534 baby buggy, baby carriage, carriage, perambulator, pram, stroller, go-cart, pushchair, pusher -n02766792 baby grand, baby grand piano, parlor grand, parlor grand piano, parlour grand, parlour grand piano -n02767038 baby powder -n02767147 baby shoe -n02767433 back, backrest -n02767665 back -n02767956 backbench -n02768114 backboard -n02768226 backboard, basketball backboard -n02768433 backbone -n02768655 back brace -n02768973 backgammon board -n02769075 background, desktop, screen background -n02769290 backhoe -n02769669 backlighting -n02769748 backpack, back pack, knapsack, packsack, rucksack, haversack -n02769963 backpacking tent, pack tent -n02770078 backplate -n02770211 back porch -n02770585 backsaw, back saw -n02770721 backscratcher -n02770830 backseat -n02771004 backspace key, backspace, backspacer -n02771166 backstairs -n02771286 backstay -n02771547 backstop -n02771750 backsword -n02772101 backup system -n02772435 badminton court -n02772554 badminton equipment -n02772700 badminton racket, badminton racquet, battledore -n02773037 bag -n02773838 bag, traveling bag, travelling bag, grip, suitcase -n02774152 bag, handbag, pocketbook, purse -n02774630 baggage, luggage -n02774921 baggage -n02775039 baggage car, luggage van -n02775178 baggage claim -n02775483 bagpipe -n02775689 bailey -n02775813 bailey -n02775897 Bailey bridge -n02776007 bain-marie -n02776205 bait, decoy, lure -n02776505 baize -n02776631 bakery, bakeshop, bakehouse -n02776825 balaclava, balaclava helmet -n02776978 balalaika -n02777100 balance -n02777292 balance beam, beam -n02777402 balance wheel, balance -n02777638 balbriggan -n02777734 balcony -n02777927 balcony -n02778131 baldachin -n02778294 baldric, baldrick -n02778456 bale -n02778588 baling wire -n02778669 ball -n02779435 ball -n02779609 ball and chain -n02779719 ball-and-socket joint -n02779971 ballast, light ballast -n02780315 ball bearing, needle bearing, roller bearing -n02780445 ball cartridge -n02780588 ballcock, ball cock -n02780704 balldress -n02780815 ballet skirt, tutu -n02781121 ball gown -n02781213 ballistic galvanometer -n02781338 ballistic missile -n02781517 ballistic pendulum -n02781764 ballistocardiograph, cardiograph -n02782093 balloon -n02782432 balloon bomb, Fugo -n02782602 balloon sail -n02782681 ballot box -n02782778 ballpark, park -n02783035 ball-peen hammer -n02783161 ballpoint, ballpoint pen, ballpen, Biro -n02783324 ballroom, dance hall, dance palace -n02783459 ball valve -n02783900 balsa raft, Kon Tiki -n02783994 baluster -n02784124 banana boat -n02784998 band -n02785648 bandage, patch -n02786058 Band Aid -n02786198 bandanna, bandana -n02786331 bandbox -n02786463 banderilla -n02786611 bandoleer, bandolier -n02786736 bandoneon -n02786837 bandsaw, band saw -n02787120 bandwagon -n02787269 bangalore torpedo -n02787435 bangle, bauble, gaud, gewgaw, novelty, fallal, trinket -n02787622 banjo -n02788021 banner, streamer -n02788148 bannister, banister, balustrade, balusters, handrail -n02788386 banquette -n02788462 banyan, banian -n02788572 baptismal font, baptistry, baptistery, font -n02788689 bar -n02789487 bar -n02790669 barbecue, barbeque -n02790823 barbed wire, barbwire -n02790996 barbell -n02791124 barber chair -n02791270 barbershop -n02791532 barbette carriage -n02791665 barbican, barbacan -n02791795 bar bit -n02792409 bareboat -n02792552 barge, flatboat, hoy, lighter -n02792948 barge pole -n02793089 baritone, baritone horn -n02793199 bark, barque -n02793296 bar magnet -n02793414 bar mask -n02793495 barn -n02793684 barndoor -n02793842 barn door -n02793930 barnyard -n02794008 barograph -n02794156 barometer -n02794368 barong -n02794474 barouche -n02794664 bar printer -n02794779 barrack -n02794972 barrage balloon -n02795169 barrel, cask -n02795528 barrel, gun barrel -n02795670 barrelhouse, honky-tonk -n02795783 barrel knot, blood knot -n02795978 barrel organ, grind organ, hand organ, hurdy gurdy, hurdy-gurdy, street organ -n02796207 barrel vault -n02796318 barrette -n02796412 barricade -n02796623 barrier -n02796995 barroom, bar, saloon, ginmill, taproom -n02797295 barrow, garden cart, lawn cart, wheelbarrow -n02797535 bascule -n02797692 base, pedestal, stand -n02797881 base, bag -n02799071 baseball -n02799175 baseball bat, lumber -n02799323 baseball cap, jockey cap, golf cap -n02799897 baseball equipment -n02800213 baseball glove, glove, baseball mitt, mitt -n02800497 basement, cellar -n02800675 basement -n02800940 basic point defense missile system -n02801047 basilica, Roman basilica -n02801184 basilica -n02801450 basilisk -n02801525 basin -n02801823 basinet -n02801938 basket, handbasket -n02802215 basket, basketball hoop, hoop -n02802426 basketball -n02802544 basketball court -n02802721 basketball equipment -n02802990 basket weave -n02803349 bass -n02803539 bass clarinet -n02803666 bass drum, gran casa -n02803809 basset horn -n02803934 bass fiddle, bass viol, bull fiddle, double bass, contrabass, string bass -n02804123 bass guitar -n02804252 bass horn, sousaphone, tuba -n02804414 bassinet -n02804515 bassinet -n02804610 bassoon -n02805283 baster -n02805845 bastinado -n02805983 bastion -n02806088 bastion, citadel -n02806379 bat -n02806530 bath -n02806762 bath chair -n02806875 bathhouse, bagnio -n02806992 bathhouse, bathing machine -n02807133 bathing cap, swimming cap -n02807523 bath oil -n02807616 bathrobe -n02807731 bathroom, bath -n02808185 bath salts -n02808304 bath towel -n02808440 bathtub, bathing tub, bath, tub -n02808829 bathyscaphe, bathyscaph, bathyscape -n02808968 bathysphere -n02809105 batik -n02809241 batiste -n02809364 baton, wand -n02809491 baton -n02809605 baton -n02809736 baton -n02810139 battering ram -n02810270 batter's box -n02810471 battery, electric battery -n02810782 battery, stamp battery -n02811059 batting cage, cage -n02811204 batting glove -n02811350 batting helmet -n02811468 battle-ax, battle-axe -n02811618 battle cruiser -n02811719 battle dress -n02811936 battlement, crenelation, crenellation -n02812201 battleship, battlewagon -n02812342 battle sight, battlesight -n02812631 bay -n02812785 bay -n02812949 bayonet -n02813252 bay rum -n02813399 bay window, bow window -n02813544 bazaar, bazar -n02813645 bazaar, bazar -n02813752 bazooka -n02813981 B battery -n02814116 BB gun -n02814338 beach house -n02814428 beach towel -n02814533 beach wagon, station wagon, wagon, estate car, beach waggon, station waggon, waggon -n02814774 beachwear -n02814860 beacon, lighthouse, beacon light, pharos -n02815478 beading plane -n02815749 beaker -n02815834 beaker -n02815950 beam -n02816494 beam balance -n02816656 beanbag -n02816768 beanie, beany -n02817031 bearing -n02817251 bearing rein, checkrein -n02817386 bearing wall -n02817516 bearskin, busby, shako -n02817650 beater -n02817799 beating-reed instrument, reed instrument, reed -n02818135 beaver, castor -n02818254 beaver -n02818687 Beckman thermometer -n02818832 bed -n02819697 bed -n02820085 bed and breakfast, bed-and-breakfast -n02820210 bedclothes, bed clothing, bedding -n02820556 Bedford cord -n02820675 bed jacket -n02821202 bedpan -n02821415 bedpost -n02821543 bedroll -n02821627 bedroom, sleeping room, sleeping accommodation, chamber, bedchamber -n02821943 bedroom furniture -n02822064 bedsitting room, bedsitter, bedsit -n02822220 bedspread, bedcover, bed cover, bed covering, counterpane, spread -n02822399 bedspring -n02822579 bedstead, bedframe -n02822762 beefcake -n02822865 beehive, hive -n02823124 beeper, pager -n02823335 beer barrel, beer keg -n02823428 beer bottle -n02823510 beer can -n02823586 beer garden -n02823750 beer glass -n02823848 beer hall -n02823964 beer mat -n02824058 beer mug, stein -n02824152 belaying pin -n02824319 belfry -n02824448 bell -n02825153 bell arch -n02825240 bellarmine, longbeard, long-beard, greybeard -n02825442 bellbottom trousers, bell-bottoms, bellbottom pants -n02825657 bell cote, bell cot -n02825872 bell foundry -n02825961 bell gable -n02826068 bell jar, bell glass -n02826259 bellows -n02826459 bellpull -n02826589 bell push -n02826683 bell seat, balloon seat -n02826812 bell tent -n02826886 bell tower -n02827148 bellyband -n02827606 belt -n02828115 belt, belt ammunition, belted ammunition -n02828299 belt buckle -n02828427 belting -n02828884 bench -n02829246 bench clamp -n02829353 bench hook -n02829510 bench lathe -n02829596 bench press -n02830157 bender -n02831237 beret -n02831335 berlin -n02831595 Bermuda shorts, Jamaica shorts -n02831724 berth, bunk, built in bed -n02831894 besom -n02831998 Bessemer converter -n02833040 bethel -n02833140 betting shop -n02833275 bevatron -n02833403 bevel, bevel square -n02833793 bevel gear, pinion and crown wheel, pinion and ring gear -n02834027 B-flat clarinet, licorice stick -n02834397 bib -n02834506 bib-and-tucker -n02834642 bicorn, bicorne -n02834778 bicycle, bike, wheel, cycle -n02835271 bicycle-built-for-two, tandem bicycle, tandem -n02835412 bicycle chain -n02835551 bicycle clip, trouser clip -n02835724 bicycle pump -n02835829 bicycle rack -n02835915 bicycle seat, saddle -n02836035 bicycle wheel -n02836174 bidet -n02836268 bier -n02836392 bier -n02836513 bi-fold door -n02836607 bifocals -n02836900 Big Blue, BLU-82 -n02837134 big board -n02837567 bight -n02837789 bikini, two-piece -n02837887 bikini pants -n02838014 bilge -n02838178 bilge keel -n02838345 bilge pump -n02838577 bilge well -n02838728 bill, peak, eyeshade, visor, vizor -n02838958 bill, billhook -n02839110 billboard, hoarding -n02839351 billiard ball -n02839592 billiard room, billiard saloon, billiard parlor, billiard parlour, billiard hall -n02839910 bin -n02840134 binder, ligature -n02840245 binder, ring-binder -n02840515 bindery -n02840619 binding, book binding, cover, back -n02841063 bin liner -n02841187 binnacle -n02841315 binoculars, field glasses, opera glasses -n02841506 binocular microscope -n02841641 biochip -n02841847 biohazard suit -n02842133 bioscope -n02842573 biplane -n02842809 birch, birch rod -n02843029 birchbark canoe, birchbark, birch bark -n02843158 birdbath -n02843276 birdcage -n02843465 birdcall -n02843553 bird feeder, birdfeeder, feeder -n02843684 birdhouse -n02843777 bird shot, buckshot, duck shot -n02843909 biretta, berretta, birretta -n02844056 bishop -n02844214 bistro -n02844307 bit -n02844714 bit -n02845130 bite plate, biteplate -n02845293 bitewing -n02845985 bitumastic -n02846141 black -n02846260 black -n02846511 blackboard, chalkboard -n02846619 blackboard eraser -n02846733 black box -n02846874 blackface -n02847461 blackjack, cosh, sap -n02847631 black tie -n02847852 blackwash -n02848118 bladder -n02848216 blade -n02848523 blade, vane -n02848806 blade -n02848921 blank, dummy, blank shell -n02849154 blanket, cover -n02849885 blast furnace -n02850060 blasting cap -n02850358 blazer, sport jacket, sport coat, sports jacket, sports coat -n02850732 blender, liquidizer, liquidiser -n02850950 blimp, sausage balloon, sausage -n02851099 blind, screen -n02851795 blind curve, blind bend -n02851939 blindfold -n02852043 bling, bling bling -n02852173 blinker, flasher -n02852360 blister pack, bubble pack -n02853016 block -n02853218 blockade -n02853336 blockade-runner -n02853745 block and tackle -n02853870 blockbuster -n02854378 blockhouse -n02854532 block plane -n02854630 bloodmobile -n02854739 bloomers, pants, drawers, knickers -n02854926 blouse -n02855089 blower -n02855390 blowtorch, torch, blowlamp -n02855701 blucher -n02855793 bludgeon -n02855925 blue -n02856013 blue chip -n02856237 blunderbuss -n02856362 blunt file -n02857365 boarding -n02857477 boarding house, boardinghouse -n02857644 boardroom, council chamber -n02857907 boards -n02858304 boat -n02859184 boater, leghorn, Panama, Panama hat, sailor, skimmer, straw hat -n02859343 boat hook -n02859443 boathouse -n02859557 boatswain's chair, bosun's chair -n02859729 boat train -n02859955 boatyard -n02860415 bobbin, spool, reel -n02860640 bobby pin, hairgrip, grip -n02860847 bobsled, bobsleigh, bob -n02861022 bobsled, bobsleigh -n02861147 bocce ball, bocci ball, boccie ball -n02861286 bodega -n02861387 bodice -n02861509 bodkin, threader -n02861658 bodkin -n02861777 bodkin -n02861886 body -n02862048 body armor, body armour, suit of armor, suit of armour, coat of mail, cataphract -n02862916 body lotion -n02863014 body stocking -n02863176 body plethysmograph -n02863340 body pad -n02863426 bodywork -n02863536 Bofors gun -n02863638 bogy, bogie, bogey -n02863750 boiler, steam boiler -n02864122 boiling water reactor, BWR -n02864504 bolero -n02864593 bollard, bitt -n02864987 bolo, bolo knife -n02865351 bolo tie, bolo, bola tie, bola -n02865665 bolt -n02865931 bolt, deadbolt -n02866106 bolt -n02866386 bolt cutter -n02866578 bomb -n02867401 bombazine -n02867592 bomb calorimeter, bomb -n02867715 bomber -n02867966 bomber jacket -n02868240 bomblet, cluster bomblet -n02868429 bomb rack -n02868546 bombshell -n02868638 bomb shelter, air-raid shelter, bombproof -n02868975 bone-ash cup, cupel, refractory pot -n02869155 bone china -n02869249 bones, castanets, clappers, finger cymbals -n02869563 boneshaker -n02869737 bongo, bongo drum -n02869837 bonnet, poke bonnet -n02870526 book -n02870676 book bag -n02870772 bookbindery -n02870880 bookcase -n02871005 bookend -n02871147 bookmark, bookmarker -n02871314 bookmobile -n02871439 bookshelf -n02871525 bookshop, bookstore, bookstall -n02871631 boom -n02871824 boom, microphone boom -n02871963 boomerang, throwing stick, throw stick -n02872333 booster, booster rocket, booster unit, takeoff booster, takeoff rocket -n02872529 booster, booster amplifier, booster station, relay link, relay station, relay transmitter -n02872752 boot -n02873520 boot -n02873623 boot camp -n02873733 bootee, bootie -n02873839 booth, cubicle, stall, kiosk -n02874086 booth -n02874214 booth -n02874336 boothose -n02874442 bootjack -n02874537 bootlace -n02874642 bootleg -n02874750 bootstrap -n02875436 bore bit, borer, rock drill, stone drill -n02875626 boron chamber -n02875948 borstal -n02876084 bosom -n02876326 Boston rocker -n02876457 bota -n02876657 bottle -n02877266 bottle, feeding bottle, nursing bottle -n02877513 bottle bank -n02877642 bottlebrush -n02877765 bottlecap -n02877962 bottle opener -n02878107 bottling plant -n02878222 bottom, freighter, merchantman, merchant ship -n02878425 boucle -n02878534 boudoir -n02878628 boulle, boule, buhl -n02878796 bouncing betty -n02879087 bouquet, corsage, posy, nosegay -n02879309 boutique, dress shop -n02879422 boutonniere -n02879517 bow -n02879718 bow -n02880189 bow, bowknot -n02880393 bow and arrow -n02880546 bowed stringed instrument, string -n02880842 Bowie knife -n02880940 bowl -n02881193 bowl -n02881546 bowl -n02881757 bowler hat, bowler, derby hat, derby, plug hat -n02881906 bowline, bowline knot -n02882190 bowling alley -n02882301 bowling ball, bowl -n02882483 bowling equipment -n02882647 bowling pin, pin -n02882894 bowling shoe -n02883004 bowsprit -n02883101 bowstring -n02883205 bow tie, bow-tie, bowtie -n02883344 box -n02884225 box, loge -n02884450 box, box seat -n02884859 box beam, box girder -n02884994 box camera, box Kodak -n02885108 boxcar -n02885233 box coat -n02885338 boxing equipment -n02885462 boxing glove, glove -n02885882 box office, ticket office, ticket booth -n02886321 box spring -n02886434 box wrench, box end wrench -n02886599 brace, bracing -n02887079 brace, braces, orthodontic braces -n02887209 brace -n02887489 brace, suspender, gallus -n02887832 brace and bit -n02887970 bracelet, bangle -n02888270 bracer, armguard -n02888429 brace wrench -n02888569 bracket, wall bracket -n02888898 bradawl, pricker -n02889425 brake -n02889646 brake -n02889856 brake band -n02889996 brake cylinder, hydraulic brake cylinder, master cylinder -n02890188 brake disk -n02890351 brake drum, drum -n02890513 brake lining -n02890662 brake pad -n02890804 brake pedal -n02890940 brake shoe, shoe, skid -n02891188 brake system, brakes -n02891788 brass, brass instrument -n02892201 brass, memorial tablet, plaque -n02892304 brass -n02892392 brassard -n02892499 brasserie -n02892626 brassie -n02892767 brassiere, bra, bandeau -n02892948 brass knucks, knucks, brass knuckles, knuckles, knuckle duster -n02893269 brattice -n02893418 brazier, brasier -n02893608 breadbasket -n02893692 bread-bin, breadbox -n02893941 bread knife -n02894024 breakable -n02894158 breakfast area, breakfast nook -n02894337 breakfast table -n02894605 breakwater, groin, groyne, mole, bulwark, seawall, jetty -n02894847 breast drill -n02895008 breast implant -n02895154 breastplate, aegis, egis -n02895328 breast pocket -n02895438 breathalyzer, breathalyser -n02896074 breechblock, breech closer -n02896294 breechcloth, breechclout, loincloth -n02896442 breeches, knee breeches, knee pants, knickerbockers, knickers -n02896694 breeches buoy -n02896856 breechloader -n02896949 breeder reactor -n02897097 Bren, Bren gun -n02897389 brewpub -n02897820 brick -n02898093 brickkiln -n02898173 bricklayer's hammer -n02898269 brick trowel, mason's trowel -n02898369 brickwork -n02898585 bridal gown, wedding gown, wedding dress -n02898711 bridge, span -n02899439 bridge, nosepiece -n02900160 bridle -n02900459 bridle path, bridle road -n02900594 bridoon -n02900705 briefcase -n02900857 briefcase bomb -n02900987 briefcase computer -n02901114 briefs, Jockey shorts -n02901259 brig -n02901377 brig -n02901481 brigandine -n02901620 brigantine, hermaphrodite brig -n02901793 brilliantine -n02901901 brilliant pebble -n02902079 brim -n02902687 bristle brush -n02902816 britches -n02902916 broad arrow -n02903006 broadax, broadaxe -n02903126 brochette -n02903204 broadcaster, spreader -n02903727 broadcloth -n02903852 broadcloth -n02904109 broad hatchet -n02904233 broadloom -n02904505 broadside -n02904640 broadsword -n02904803 brocade -n02904927 brogan, brogue, clodhopper, work shoe -n02905036 broiler -n02905152 broken arch -n02905886 bronchoscope -n02906734 broom -n02906963 broom closet -n02907082 broomstick, broom handle -n02907296 brougham -n02907391 Browning automatic rifle, BAR -n02907656 Browning machine gun, Peacemaker -n02907873 brownstone -n02908123 brunch coat -n02908217 brush -n02908773 Brussels carpet -n02908951 Brussels lace -n02909053 bubble -n02909165 bubble chamber -n02909285 bubble jet printer, bubble-jet printer, bubblejet -n02909706 buckboard -n02909870 bucket, pail -n02910145 bucket seat -n02910241 bucket shop -n02910353 buckle -n02910542 buckram -n02910701 bucksaw -n02910864 buckskins -n02910964 buff, buffer -n02911332 buffer, polisher -n02911485 buffer, buffer storage, buffer store -n02912065 buffet, counter, sideboard -n02912319 buffing wheel -n02912557 buggy, roadster -n02912894 bugle -n02913152 building, edifice -n02914991 building complex, complex -n02915904 bulldog clip, alligator clip -n02916065 bulldog wrench -n02916179 bulldozer, dozer -n02916350 bullet, slug -n02916936 bulletproof vest -n02917067 bullet train, bullet -n02917377 bullhorn, loud hailer, loud-hailer -n02917521 bullion -n02917607 bullnose, bullnosed plane -n02917742 bullpen, detention cell, detention centre -n02917964 bullpen -n02918112 bullring -n02918330 bulwark -n02918455 bumboat -n02918595 bumper -n02918831 bumper -n02918964 bumper car, Dodgem -n02919148 bumper guard -n02919308 bumper jack -n02919414 bundle, sheaf -n02919648 bung, spile -n02919792 bungalow, cottage -n02919890 bungee, bungee cord -n02919976 bunghole -n02920083 bunk -n02920164 bunk, feed bunk -n02920259 bunk bed, bunk -n02920369 bunker, sand trap, trap -n02920503 bunker, dugout -n02920658 bunker -n02921029 bunsen burner, bunsen, etna -n02921195 bunting -n02921292 bur, burr -n02921406 Burberry -n02921592 burette, buret -n02921756 burglar alarm -n02921884 burial chamber, sepulcher, sepulchre, sepulture -n02922159 burial garment -n02922292 burial mound, grave mound, barrow, tumulus -n02922461 burin -n02922578 burqa, burka -n02922798 burlap, gunny -n02922877 burn bag -n02923129 burner -n02923535 burnous, burnoose, burnouse -n02923682 burp gun, machine pistol -n02923915 burr -n02924116 bus, autobus, coach, charabanc, double-decker, jitney, motorbus, motorcoach, omnibus, passenger vehicle -n02925009 bushel basket -n02925107 bushing, cylindrical lining -n02925385 bush jacket -n02925519 business suit -n02925666 buskin, combat boot, desert boot, half boot, top boot -n02926426 bustier -n02926591 bustle -n02927053 butcher knife -n02927161 butcher shop, meat market -n02927764 butter dish -n02927887 butterfly valve -n02928049 butter knife -n02928299 butt hinge -n02928413 butt joint, butt -n02928608 button -n02929184 buttonhook -n02929289 buttress, buttressing -n02929462 butt shaft -n02929582 butt weld, butt-weld -n02929923 buzz bomb, robot bomb, flying bomb, doodlebug, V-1 -n02930080 buzzer -n02930214 BVD, BVD's -n02930339 bypass condenser, bypass capacitor -n02930645 byway, bypath, byroad -n02930766 cab, hack, taxi, taxicab -n02931013 cab, cabriolet -n02931148 cab -n02931294 cabana -n02931417 cabaret, nightclub, night club, club, nightspot -n02931836 caber -n02932019 cabin -n02932400 cabin -n02932523 cabin car, caboose -n02932693 cabin class, second class, economy class -n02932891 cabin cruiser, cruiser, pleasure boat, pleasure craft -n02933112 cabinet -n02933340 cabinet, console -n02933462 cabinet, locker, storage locker -n02933649 cabinetwork -n02933750 cabin liner -n02933990 cable, cable television, cable system, cable television service -n02934168 cable, line, transmission line -n02934451 cable car, car -n02935017 cache, memory cache -n02935387 caddy, tea caddy -n02935490 caesium clock -n02935658 cafe, coffeehouse, coffee shop, coffee bar -n02935891 cafeteria -n02936176 cafeteria tray -n02936281 caff -n02936402 caftan, kaftan -n02936570 caftan, kaftan -n02936714 cage, coop -n02936921 cage -n02937010 cagoule -n02937336 caisson -n02937958 calash, caleche, calash top -n02938218 calceus -n02938321 calcimine -n02938886 calculator, calculating machine -n02939185 caldron, cauldron -n02939763 calico -n02939866 caliper, calliper -n02940289 call-board -n02940385 call center, call centre -n02940570 caller ID -n02940706 calliope, steam organ -n02941095 calorimeter -n02941228 calpac, calpack, kalpac -n02941845 camail, aventail, ventail -n02942015 camber arch -n02942147 cambric -n02942349 camcorder -n02942460 camel's hair, camelhair -n02942699 camera, photographic camera -n02943241 camera lens, optical lens -n02943465 camera lucida -n02943686 camera obscura -n02943871 camera tripod -n02943964 camise -n02944075 camisole -n02944146 camisole, underbodice -n02944256 camlet -n02944459 camouflage -n02944579 camouflage, camo -n02944826 camp, encampment, cantonment, bivouac -n02945161 camp -n02945813 camp, refugee camp -n02945964 campaign hat -n02946127 campanile, belfry -n02946270 camp chair -n02946348 camper, camping bus, motor home -n02946509 camper trailer -n02946753 campstool -n02946824 camshaft -n02946921 can, tin, tin can -n02947212 canal -n02947660 canal boat, narrow boat, narrowboat -n02947818 candelabrum, candelabra -n02947977 candid camera -n02948072 candle, taper, wax light -n02948293 candlepin -n02948403 candlesnuffer -n02948557 candlestick, candle holder -n02948834 candlewick -n02948942 candy thermometer -n02949084 cane -n02949202 cane -n02949356 cangue -n02949542 canister, cannister, tin -n02950018 cannery -n02950120 cannikin -n02950186 cannikin -n02950256 cannon -n02950482 cannon -n02950632 cannon -n02950826 cannon -n02950943 cannonball, cannon ball, round shot -n02951358 canoe -n02951585 can opener, tin opener -n02951703 canopic jar, canopic vase -n02951843 canopy -n02952109 canopy -n02952237 canopy -n02952374 canteen -n02952485 canteen -n02952585 canteen -n02952674 canteen, mobile canteen -n02952798 canteen -n02952935 cant hook -n02953056 cantilever -n02953197 cantilever bridge -n02953455 cantle -n02953552 Canton crepe -n02953673 canvas, canvass -n02953850 canvas, canvass -n02954163 canvas tent, canvas, canvass -n02954340 cap -n02954938 cap -n02955065 cap -n02955247 capacitor, capacitance, condenser, electrical condenser -n02955540 caparison, trapping, housing -n02955767 cape, mantle -n02956393 capital ship -n02956699 capitol -n02956795 cap opener -n02956883 capote, hooded cloak -n02957008 capote, hooded coat -n02957135 cap screw -n02957252 capstan -n02957427 capstone, copestone, coping stone, stretcher -n02957755 capsule -n02957862 captain's chair -n02958343 car, auto, automobile, machine, motorcar -n02959942 car, railcar, railway car, railroad car -n02960352 car, elevator car -n02960690 carabiner, karabiner, snap ring -n02960903 carafe, decanter -n02961035 caravansary, caravanserai, khan, caravan inn -n02961225 car battery, automobile battery -n02961451 carbine -n02961544 car bomb -n02961947 carbon arc lamp, carbon arc -n02962061 carboy -n02962200 carburetor, carburettor -n02962414 car carrier -n02962843 cardcase -n02962938 cardiac monitor, heart monitor -n02963159 cardigan -n02963302 card index, card catalog, card catalogue -n02963503 cardiograph, electrocardiograph -n02963692 cardioid microphone -n02963821 car door -n02963987 cardroom -n02964075 card table -n02964196 card table -n02964295 car-ferry -n02964634 cargo area, cargo deck, cargo hold, hold, storage area -n02964843 cargo container -n02964934 cargo door -n02965024 cargo hatch -n02965122 cargo helicopter -n02965216 cargo liner -n02965300 cargo ship, cargo vessel -n02965529 carillon -n02965783 car mirror -n02966068 caroche -n02966193 carousel, carrousel, merry-go-round, roundabout, whirligig -n02966545 carpenter's hammer, claw hammer, clawhammer -n02966687 carpenter's kit, tool kit -n02966786 carpenter's level -n02966942 carpenter's mallet -n02967081 carpenter's rule -n02967170 carpenter's square -n02967294 carpetbag -n02967407 carpet beater, rug beater -n02967540 carpet loom -n02967626 carpet pad, rug pad, underlay, underlayment -n02967782 carpet sweeper, sweeper -n02967991 carpet tack -n02968074 carport, car port -n02968210 carrack, carack -n02968333 carrel, carrell, cubicle, stall -n02968473 carriage, equipage, rig -n02969010 carriage -n02969163 carriage bolt -n02969323 carriageway -n02969527 carriage wrench -n02969634 carrick bend -n02969886 carrier -n02970408 carryall, holdall, tote, tote bag -n02970534 carrycot -n02970685 car seat -n02970849 cart -n02971167 car tire, automobile tire, auto tire, rubber tire -n02971356 carton -n02971473 cartouche, cartouch -n02971579 car train -n02971691 cartridge -n02971940 cartridge, pickup -n02972397 cartridge belt -n02972714 cartridge extractor, cartridge remover, extractor -n02972934 cartridge fuse -n02973017 cartridge holder, cartridge clip, clip, magazine -n02973236 cartwheel -n02973805 carving fork -n02973904 carving knife -n02974003 car wheel -n02974348 caryatid -n02974454 cascade liquefier -n02974565 cascade transformer -n02974697 case -n02975212 case, display case, showcase, vitrine -n02975589 case, compositor's case, typesetter's case -n02975994 casein paint, casein -n02976123 case knife, sheath knife -n02976249 case knife -n02976350 casement -n02976455 casement window -n02976552 casern -n02976641 case shot, canister, canister shot -n02976815 cash bar -n02976939 cashbox, money box, till -n02977058 cash machine, cash dispenser, automated teller machine, automatic teller machine, automated teller, automatic teller, ATM -n02977330 cashmere -n02977438 cash register, register -n02977619 casing, case -n02977936 casino, gambling casino -n02978055 casket, jewel casket -n02978205 casque -n02978367 casquet, casquetel -n02978478 Cassegrainian telescope, Gregorian telescope -n02978753 casserole -n02978881 cassette -n02979074 cassette deck -n02979186 cassette player -n02979290 cassette recorder -n02979399 cassette tape -n02979516 cassock -n02979836 cast, plaster cast, plaster bandage -n02980036 caster, castor -n02980203 caster, castor -n02980441 castle -n02980625 castle, rook -n02981024 catacomb -n02981198 catafalque -n02981321 catalytic converter -n02981565 catalytic cracker, cat cracker -n02981792 catamaran -n02981911 catapult, arbalest, arbalist, ballista, bricole, mangonel, onager, trebuchet, trebucket -n02982232 catapult, launcher -n02982416 catboat -n02982515 cat box -n02982599 catch -n02983072 catchall -n02983189 catcher's mask -n02983357 catchment -n02983507 Caterpillar, cat -n02983904 cathedra, bishop's throne -n02984061 cathedral -n02984203 cathedral, duomo -n02984469 catheter -n02984699 cathode -n02985137 cathode-ray tube, CRT -n02985606 cat-o'-nine-tails, cat -n02985828 cat's-paw -n02985963 catsup bottle, ketchup bottle -n02986066 cattle car -n02986160 cattle guard, cattle grid -n02986348 cattleship, cattle boat -n02987047 cautery, cauterant -n02987379 cavalier hat, slouch hat -n02987492 cavalry sword, saber, sabre -n02987706 cavetto -n02987823 cavity wall -n02987950 C battery -n02988066 C-clamp -n02988156 CD drive -n02988304 CD player -n02988486 CD-R, compact disc recordable, CD-WO, compact disc write-once -n02988679 CD-ROM, compact disc read-only memory -n02988963 CD-ROM drive -n02989099 cedar chest -n02990373 ceiling -n02990758 celesta -n02991048 cell, electric cell -n02991302 cell, jail cell, prison cell -n02991847 cellar, wine cellar -n02992032 cellblock, ward -n02992211 cello, violoncello -n02992368 cellophane -n02992529 cellular telephone, cellular phone, cellphone, cell, mobile phone -n02992795 cellulose tape, Scotch tape, Sellotape -n02993194 cenotaph, empty tomb -n02993368 censer, thurible -n02993546 center, centre -n02994573 center punch -n02994743 Centigrade thermometer -n02995345 central processing unit, CPU, C.P.U., central processor, processor, mainframe -n02995871 centrifugal pump -n02995998 centrifuge, extractor, separator -n02997391 ceramic -n02997607 ceramic ware -n02997910 cereal bowl -n02998003 cereal box -n02998107 cerecloth -n02998563 cesspool, cesspit, sink, sump -n02998696 chachka, tsatske, tshatshke, tchotchke -n02998841 chador, chadar, chaddar, chuddar -n02999138 chafing dish -n02999410 chain -n02999936 chain -n03000134 chainlink fence -n03000247 chain mail, ring mail, mail, chain armor, chain armour, ring armor, ring armour -n03000530 chain printer -n03000684 chain saw, chainsaw -n03001115 chain store -n03001282 chain tongs -n03001540 chain wrench -n03001627 chair -n03002096 chair -n03002210 chair of state -n03002341 chairlift, chair lift -n03002555 chaise, shay -n03002711 chaise longue, chaise, daybed -n03002816 chalet -n03002948 chalice, goblet -n03003091 chalk -n03003633 challis -n03004275 chamberpot, potty, thunder mug -n03004409 chambray -n03004531 chamfer bit -n03004620 chamfer plane -n03004713 chamois cloth -n03004824 chancel, sanctuary, bema -n03005033 chancellery -n03005147 chancery -n03005285 chandelier, pendant, pendent -n03005515 chandlery -n03005619 chanfron, chamfron, testiere, frontstall, front-stall -n03006626 chanter, melody pipe -n03006788 chantry -n03006903 chap -n03007130 chapel -n03007297 chapterhouse, fraternity house, frat house -n03007444 chapterhouse -n03007591 character printer, character-at-a-time printer, serial printer -n03008177 charcuterie -n03008817 charge-exchange accelerator -n03008976 charger, battery charger -n03009111 chariot -n03009269 chariot -n03009794 charnel house, charnel -n03010473 chassis -n03010656 chassis -n03010795 chasuble -n03010915 chateau -n03011018 chatelaine -n03011355 checker, chequer -n03011741 checkout, checkout counter -n03012013 cheekpiece -n03012159 cheeseboard, cheese tray -n03012373 cheesecloth -n03012499 cheese cutter -n03012644 cheese press -n03012734 chemical bomb, gas bomb -n03012897 chemical plant -n03013006 chemical reactor -n03013438 chemise, sack, shift -n03013580 chemise, shimmy, shift, slip, teddy -n03013850 chenille -n03014440 chessman, chess piece -n03014705 chest -n03015149 chesterfield -n03015254 chest of drawers, chest, bureau, dresser -n03015478 chest protector -n03015631 cheval-de-frise, chevaux-de-frise -n03015851 cheval glass -n03016209 chicane -n03016389 chicken coop, coop, hencoop, henhouse -n03016609 chicken wire -n03016737 chicken yard, hen yard, chicken run, fowl run -n03016868 chiffon -n03016953 chiffonier, commode -n03017070 child's room -n03017168 chime, bell, gong -n03017698 chimney breast -n03017835 chimney corner, inglenook -n03018209 china -n03018349 china cabinet, china closet -n03018614 chinchilla -n03018712 Chinese lantern -n03018848 Chinese puzzle -n03019198 chinning bar -n03019304 chino -n03019434 chino -n03019685 chin rest -n03019806 chin strap -n03019938 chintz -n03020034 chip, microchip, micro chip, silicon chip, microprocessor chip -n03020416 chip, poker chip -n03020692 chisel -n03021228 chlamys -n03024064 choir -n03024233 choir loft -n03024333 choke -n03024518 choke, choke coil, choking coil -n03025070 chokey, choky -n03025165 choo-choo -n03025250 chopine, platform -n03025886 chordophone -n03026506 Christmas stocking -n03026907 chronograph -n03027001 chronometer -n03027108 chronoscope -n03027250 chuck -n03027505 chuck wagon -n03027625 chukka, chukka boot -n03028079 church, church building -n03028596 church bell -n03028785 church hat -n03029066 church key -n03029197 church tower -n03029296 churidars -n03029445 churn, butter churn -n03029925 ciderpress -n03030262 cigar band -n03030353 cigar box -n03030557 cigar cutter -n03030880 cigarette butt -n03031012 cigarette case -n03031152 cigarette holder -n03031422 cigar lighter, cigarette lighter, pocket lighter -n03031756 cinch, girth -n03032252 cinema, movie theater, movie theatre, movie house, picture palace -n03032453 cinquefoil -n03032811 circle, round -n03033267 circlet -n03033362 circuit, electrical circuit, electric circuit -n03033986 circuit board, circuit card, board, card, plug-in, add-in -n03034244 circuit breaker, breaker -n03034405 circuitry -n03034516 circular plane, compass plane -n03034663 circular saw, buzz saw -n03035252 circus tent, big top, round top, top -n03035510 cistern -n03035715 cistern, water tank -n03035832 cittern, cithern, cither, citole, gittern -n03036022 city hall -n03036149 cityscape -n03036244 city university -n03036341 civies, civvies -n03036469 civilian clothing, civilian dress, civilian garb, plain clothes -n03036701 clack valve, clack, clapper valve -n03036866 clamp, clinch -n03037108 clamshell, grapple -n03037228 clapper, tongue -n03037404 clapperboard -n03037590 clarence -n03037709 clarinet -n03038041 Clark cell, Clark standard cell -n03038281 clasp -n03038480 clasp knife, jackknife -n03038685 classroom, schoolroom -n03038870 clavichord -n03039015 clavier, Klavier -n03039259 clay pigeon -n03039353 claymore mine, claymore -n03039493 claymore -n03039827 cleaners, dry cleaners -n03039947 cleaning implement, cleaning device, cleaning equipment -n03040229 cleaning pad -n03040376 clean room, white room -n03040836 clearway -n03041114 cleat -n03041265 cleat -n03041449 cleats -n03041632 cleaver, meat cleaver, chopper -n03041810 clerestory, clearstory -n03042139 clevis -n03042384 clews -n03042490 cliff dwelling -n03042697 climbing frame -n03042829 clinch -n03042984 clinch, clench -n03043173 clincher -n03043274 clinic -n03043423 clinical thermometer, mercury-in-glass clinical thermometer -n03043693 clinker, clinker brick -n03043798 clinometer, inclinometer -n03043958 clip -n03044671 clip lead -n03044801 clip-on -n03044934 clipper -n03045074 clipper -n03045228 clipper, clipper ship -n03045337 cloak -n03045698 cloak -n03045800 cloakroom, coatroom -n03046029 cloche -n03046133 cloche -n03046257 clock -n03046802 clock pendulum -n03046921 clock radio -n03047052 clock tower -n03047171 clockwork -n03047690 clog, geta, patten, sabot -n03047799 cloisonne -n03047941 cloister -n03048883 closed circuit, loop -n03049066 closed-circuit television -n03049326 closed loop, closed-loop system -n03049457 closet -n03049782 closeup lens -n03049924 cloth cap, flat cap -n03050026 cloth covering -n03050453 clothesbrush -n03050546 clothes closet, clothespress -n03050655 clothes dryer, clothes drier -n03050864 clothes hamper, laundry basket, clothes basket, voider -n03051041 clotheshorse -n03051249 clothespin, clothes pin, clothes peg -n03051396 clothes tree, coat tree, coat stand -n03051540 clothing, article of clothing, vesture, wear, wearable, habiliment -n03052464 clothing store, haberdashery, haberdashery store, mens store -n03052917 clout nail, clout -n03053047 clove hitch -n03053976 club car, lounge car -n03054491 clubroom -n03054605 cluster bomb -n03054901 clutch -n03055159 clutch, clutch pedal -n03055418 clutch bag, clutch -n03055670 coach, four-in-hand, coach-and-four -n03055857 coach house, carriage house, remise -n03056097 coal car -n03056215 coal chute -n03056288 coal house -n03056493 coal shovel -n03056583 coaming -n03056873 coaster brake -n03057021 coat -n03057541 coat button -n03057636 coat closet -n03057724 coatdress -n03057841 coatee -n03057920 coat hanger, clothes hanger, dress hanger -n03058107 coating, coat -n03058603 coating -n03058949 coat of paint -n03059103 coatrack, coat rack, hatrack -n03059236 coattail -n03059366 coaxial cable, coax, coax cable -n03059685 cobweb -n03059934 cobweb -n03060728 Cockcroft and Walton accelerator, Cockcroft-Walton accelerator, Cockcroft and Walton voltage multiplier, Cockcroft-Walton voltage multiplier -n03061050 cocked hat -n03061211 cockhorse -n03061345 cockleshell -n03061505 cockpit -n03061674 cockpit -n03061819 cockpit -n03061893 cockscomb, coxcomb -n03062015 cocktail dress, sheath -n03062122 cocktail lounge -n03062245 cocktail shaker -n03062336 cocotte -n03062651 codpiece -n03062798 coelostat -n03062985 coffee can -n03063073 coffee cup -n03063199 coffee filter -n03063338 coffee maker -n03063485 coffee mill, coffee grinder -n03063599 coffee mug -n03063689 coffeepot -n03063834 coffee stall -n03063968 coffee table, cocktail table -n03064250 coffee urn -n03064350 coffer -n03064562 Coffey still -n03064758 coffin, casket -n03064935 cog, sprocket -n03065243 coif -n03065424 coil, spiral, volute, whorl, helix -n03065708 coil -n03066232 coil -n03066359 coil spring, volute spring -n03066464 coin box -n03066849 colander, cullender -n03067093 cold cathode -n03067212 cold chisel, set chisel -n03067339 cold cream, coldcream, face cream, vanishing cream -n03067518 cold frame -n03068181 collar, neckband -n03068998 collar -n03069752 college -n03070059 collet, collet chuck -n03070193 collider -n03070396 colliery, pit -n03070587 collimator -n03070854 collimator -n03071021 cologne, cologne water, eau de cologne -n03071160 colonnade -n03071288 colonoscope -n03071552 colorimeter, tintometer -n03072056 colors, colours -n03072201 color television, colour television, color television system, colour television system, color TV, colour TV -n03072440 color tube, colour tube, color television tube, colour television tube, color TV tube, colour TV tube -n03072682 color wash, colour wash -n03073296 Colt -n03073384 colter, coulter -n03073545 columbarium -n03073694 columbarium, cinerarium -n03073977 column, pillar -n03074380 column, pillar -n03074855 comb -n03075097 comb -n03075248 comber -n03075370 combination lock -n03075500 combination plane -n03075634 combine -n03075768 comforter, pacifier, baby's dummy, teething ring -n03075946 command module -n03076411 commissary -n03076623 commissary -n03076708 commodity, trade good, good -n03077442 common ax, common axe, Dayton ax, Dayton axe -n03077616 common room -n03077741 communications satellite -n03078287 communication system -n03078506 community center, civic center -n03078670 commutator -n03078802 commuter, commuter train -n03078995 compact, powder compact -n03079136 compact, compact car -n03079230 compact disk, compact disc, CD -n03079494 compact-disk burner, CD burner -n03079616 companionway -n03079741 compartment -n03080309 compartment -n03080497 compass -n03080633 compass -n03080731 compass card, mariner's compass -n03080904 compass saw -n03081859 compound -n03081986 compound lens -n03082127 compound lever -n03082280 compound microscope -n03082450 compress -n03082656 compression bandage, tourniquet -n03082807 compressor -n03082979 computer, computing machine, computing device, data processor, electronic computer, information processing system -n03084420 computer circuit -n03084834 computerized axial tomography scanner, CAT scanner -n03085013 computer keyboard, keypad -n03085219 computer monitor -n03085333 computer network -n03085602 computer screen, computer display -n03085781 computer store -n03085915 computer system, computing system, automatic data processing system, ADP system, ADPS -n03086183 concentration camp, stockade -n03086457 concert grand, concert piano -n03086580 concert hall -n03086670 concertina -n03086868 concertina -n03087069 concrete mixer, cement mixer -n03087245 condensation pump, diffusion pump -n03087366 condenser, optical condenser -n03087521 condenser -n03087643 condenser -n03087816 condenser microphone, capacitor microphone -n03088389 condominium -n03088580 condominium, condo -n03088707 conductor -n03089477 cone clutch, cone friction clutch -n03089624 confectionery, confectionary, candy store -n03089753 conference center, conference house -n03089879 conference room -n03090000 conference table, council table, council board -n03090172 confessional -n03090437 conformal projection, orthomorphic projection -n03090710 congress boot, congress shoe, congress gaiter -n03090856 conic projection, conical projection -n03091044 connecting rod -n03091223 connecting room -n03091374 connection, connexion, connector, connecter, connective -n03091907 conning tower -n03092053 conning tower -n03092166 conservatory, hothouse, indoor garden -n03092314 conservatory, conservatoire -n03092476 console -n03092656 console -n03092883 console table, console -n03093427 consulate -n03093792 contact, tangency -n03094159 contact, contact lens -n03094503 container -n03095699 container ship, containership, container vessel -n03095965 containment -n03096439 contrabassoon, contrafagotto, double bassoon -n03096960 control, controller -n03097362 control center -n03097535 control circuit, negative feedback circuit -n03097673 control key, command key -n03098140 control panel, instrument panel, control board, board, panel -n03098515 control rod -n03098688 control room -n03098806 control system -n03098959 control tower -n03099147 convector -n03099274 convenience store -n03099454 convent -n03099622 conventicle, meetinghouse -n03099771 converging lens, convex lens -n03099945 converter, convertor -n03100240 convertible -n03100346 convertible, sofa bed -n03100490 conveyance, transport -n03100897 conveyer belt, conveyor belt, conveyer, conveyor, transporter -n03101156 cooker -n03101302 cookfire -n03101375 cookhouse -n03101517 cookie cutter -n03101664 cookie jar, cooky jar -n03101796 cookie sheet, baking tray -n03101986 cooking utensil, cookware -n03102371 cookstove -n03102516 coolant system -n03102654 cooler, ice chest -n03102859 cooling system, cooling -n03103128 cooling system, engine cooling system -n03103396 cooling tower -n03103563 coonskin cap, coonskin -n03103904 cope -n03104019 coping saw -n03104512 copperware -n03105088 copyholder -n03105214 coquille -n03105306 coracle -n03105467 corbel, truss -n03105645 corbel arch -n03105810 corbel step, corbie-step, corbiestep, crow step -n03105974 corbie gable -n03106722 cord, corduroy -n03106898 cord, electric cord -n03107046 cordage -n03107488 cords, corduroys -n03107716 core -n03108455 core bit -n03108624 core drill -n03108759 corer -n03108853 cork, bottle cork -n03109033 corker -n03109150 corkscrew, bottle screw -n03109253 corncrib -n03109693 corner, quoin -n03109881 corner, nook -n03110202 corner post -n03110669 cornet, horn, trumpet, trump -n03111041 cornice -n03111177 cornice -n03111296 cornice, valance, valance board, pelmet -n03111690 correctional institution -n03112240 corrugated fastener, wiggle nail -n03112719 corselet, corslet -n03112869 corset, girdle, stays -n03113152 cosmetic -n03113505 cosmotron -n03113657 costume -n03113835 costume -n03114041 costume -n03114236 costume -n03114379 cosy, tea cosy, cozy, tea cozy -n03114504 cot, camp bed -n03114743 cottage tent -n03114839 cotter, cottar -n03115014 cotter pin -n03115180 cotton -n03115400 cotton flannel, Canton flannel -n03115663 cotton mill -n03115762 couch -n03115897 couch -n03116008 couchette -n03116163 coude telescope, coude system -n03116530 counter -n03116767 counter, tabulator -n03117199 counter -n03117642 counterbore, countersink, countersink bit -n03118346 counter tube -n03118969 country house -n03119203 country store, general store, trading post -n03119396 coupe -n03119510 coupling, coupler -n03120198 court, courtyard -n03120491 court -n03120778 court, courtroom -n03121040 court -n03121190 Courtelle -n03121298 courthouse -n03121431 courthouse -n03121897 coverall -n03122073 covered bridge -n03122202 covered couch -n03122295 covered wagon, Conestoga wagon, Conestoga, prairie wagon, prairie schooner -n03122748 covering -n03123553 coverlet -n03123666 cover plate -n03123809 cowbarn, cowshed, cow barn, cowhouse, byre -n03123917 cowbell -n03124043 cowboy boot -n03124170 cowboy hat, ten-gallon hat -n03124313 cowhide -n03124474 cowl -n03124590 cow pen, cattle pen, corral -n03125057 CPU board, mother board -n03125588 crackle, crackleware, crackle china -n03125729 cradle -n03125870 craft -n03126090 cramp, cramp iron -n03126385 crampon, crampoon, climbing iron, climber -n03126580 crampon, crampoon -n03126707 crane -n03126927 craniometer -n03127024 crank, starter -n03127203 crankcase -n03127408 crankshaft -n03127531 crash barrier -n03127747 crash helmet -n03127925 crate -n03128085 cravat -n03128248 crayon, wax crayon -n03128427 crazy quilt -n03128519 cream, ointment, emollient -n03129001 cream pitcher, creamer -n03129471 creche, foundling hospital -n03129636 creche -n03129753 credenza, credence -n03129848 creel -n03130066 crematory, crematorium, cremation chamber -n03130233 crematory, crematorium -n03130563 crepe, crape -n03130761 crepe de Chine -n03130866 crescent wrench -n03131193 cretonne -n03131574 crib, cot -n03131669 crib -n03131967 cricket ball -n03132076 cricket bat, bat -n03132261 cricket equipment -n03132438 cringle, eyelet, loop, grommet, grummet -n03132666 crinoline -n03132776 crinoline -n03133050 crochet needle, crochet hook -n03133415 crock, earthenware jar -n03133878 Crock Pot -n03134118 crook, shepherd's crook -n03134232 Crookes radiometer -n03134394 Crookes tube -n03134739 croquet ball -n03134853 croquet equipment -n03135030 croquet mallet -n03135532 cross -n03135656 crossbar -n03135788 crossbar -n03135917 crossbar -n03136051 crossbench -n03136254 cross bit -n03136369 crossbow -n03136504 crosscut saw, crosscut handsaw, cutoff saw -n03137473 crossjack, mizzen course -n03137579 crosspiece -n03138128 crotchet -n03138217 croupier's rake -n03138344 crowbar, wrecking bar, pry, pry bar -n03138669 crown, diadem -n03139089 crown, crownwork, jacket, jacket crown, cap -n03139464 crown jewels -n03139640 crown lens -n03139998 crow's nest -n03140126 crucible, melting pot -n03140292 crucifix, rood, rood-tree -n03140431 cruet, crewet -n03140546 cruet-stand -n03140652 cruise control -n03140771 cruise missile -n03140900 cruiser -n03141065 cruiser, police cruiser, patrol car, police car, prowl car, squad car -n03141327 cruise ship, cruise liner -n03141455 crupper -n03141612 cruse -n03141702 crusher -n03141823 crutch -n03142099 cryometer -n03142205 cryoscope -n03142325 cryostat -n03142431 crypt -n03142679 crystal, watch crystal, watch glass -n03143400 crystal detector -n03143572 crystal microphone -n03143754 crystal oscillator, quartz oscillator -n03144156 crystal set -n03144873 cubitiere -n03144982 cucking stool, ducking stool -n03145147 cuckoo clock -n03145277 cuddy -n03145384 cudgel -n03145522 cue, cue stick, pool cue, pool stick -n03145719 cue ball -n03145843 cuff, turnup -n03146219 cuirass -n03146342 cuisse -n03146449 cul, cul de sac, dead end -n03146560 culdoscope -n03146687 cullis -n03146777 culotte -n03146846 cultivator, tiller -n03147084 culverin -n03147156 culverin -n03147280 culvert -n03147509 cup -n03148324 cupboard, closet -n03148518 cup hook -n03148727 cupola -n03148808 cupola -n03149135 curb, curb bit -n03149401 curb roof -n03149686 curbstone, kerbstone -n03149810 curette, curet -n03150232 curler, hair curler, roller, crimper -n03150511 curling iron -n03150661 currycomb -n03150795 cursor, pointer -n03151077 curtain, drape, drapery, mantle, pall -n03152303 customhouse, customshouse -n03152951 cutaway, cutaway drawing, cutaway model -n03153246 cutlas, cutlass -n03153585 cutoff -n03153948 cutout -n03154073 cutter, cutlery, cutting tool -n03154316 cutter -n03154446 cutting implement -n03154616 cutting room -n03154745 cutty stool -n03154895 cutwork -n03155178 cybercafe -n03155502 cyclopean masonry -n03155915 cyclostyle -n03156071 cyclotron -n03156279 cylinder -n03156405 cylinder, piston chamber -n03156767 cylinder lock -n03157348 cymbal -n03158186 dacha -n03158414 Dacron, Terylene -n03158668 dado -n03158796 dado plane -n03158885 dagger, sticker -n03159535 dairy, dairy farm -n03159640 dais, podium, pulpit, rostrum, ambo, stump, soapbox -n03160001 daisy print wheel, daisy wheel -n03160186 daisywheel printer -n03160309 dam, dike, dyke -n03160740 damask -n03161016 dampener, moistener -n03161450 damper, muffler -n03161893 damper block, piano damper -n03162297 dark lantern, bull's-eye -n03162460 darkroom -n03162556 darning needle, embroidery needle -n03162714 dart -n03162818 dart -n03163222 dashboard, fascia -n03163381 dashiki, daishiki -n03163488 dash-pot -n03163798 data converter -n03163973 data input device, input device -n03164192 data multiplexer -n03164344 data system, information system -n03164605 davenport -n03164722 davenport -n03164929 davit -n03165096 daybed, divan bed -n03165211 daybook, ledger -n03165466 day nursery, day care center -n03165616 day school -n03165823 dead axle -n03165955 deadeye -n03166120 deadhead -n03166514 deanery -n03166600 deathbed -n03166685 death camp -n03166809 death house, death row -n03166951 death knell, death bell -n03167153 death seat -n03167978 deck -n03168107 deck -n03168217 deck chair, beach chair -n03168543 deck-house -n03168663 deckle -n03168774 deckle edge, deckle -n03168933 declinometer, transit declinometer -n03169063 decoder -n03169176 decolletage -n03170292 decoupage -n03170459 dedicated file server -n03170635 deep-freeze, Deepfreeze, deep freezer, freezer -n03170872 deerstalker -n03171228 defense system, defence system -n03171356 defensive structure, defense, defence -n03171635 defibrillator -n03171910 defilade -n03172038 deflector -n03172738 delayed action -n03172965 delay line -n03173270 delft -n03173387 delicatessen, deli, food shop -n03173929 delivery truck, delivery van, panel truck -n03174079 delta wing -n03174450 demijohn -n03174731 demitasse -n03175081 den -n03175189 denim, dungaree, jean -n03175301 densimeter, densitometer -n03175457 densitometer -n03175604 dental appliance -n03175843 dental floss, floss -n03175983 dental implant -n03176238 dentist's drill, burr drill -n03176386 denture, dental plate, plate -n03176594 deodorant, deodourant -n03176763 department store, emporium -n03177059 departure lounge -n03177165 depilatory, depilator, epilator -n03177708 depressor -n03178000 depth finder -n03178173 depth gauge, depth gage -n03178430 derrick -n03178538 derrick -n03178674 derringer -n03179701 desk -n03179910 desk phone -n03180011 desktop computer -n03180384 dessert spoon -n03180504 destroyer, guided missile destroyer -n03180732 destroyer escort -n03180865 detached house, single dwelling -n03180969 detector, sensor, sensing element -n03181293 detector -n03181667 detention home, detention house, house of detention, detention camp -n03182140 detonating fuse -n03182232 detonator, detonating device, cap -n03182912 developer -n03183080 device -n03185868 Dewar flask, Dewar -n03186199 dhoti -n03186285 dhow -n03186818 dial, telephone dial -n03187037 dial -n03187153 dial -n03187268 dialog box, panel -n03187595 dial telephone, dial phone -n03187751 dialyzer, dialysis machine -n03188290 diamante -n03188531 diaper, nappy, napkin -n03188725 diaper -n03188871 diaphone -n03189083 diaphragm, stop -n03189311 diaphragm -n03189818 diathermy machine -n03190458 dibble, dibber -n03191286 dice cup, dice box -n03191451 dicer -n03191561 dickey, dickie, dicky, shirtfront -n03191776 dickey, dickie, dicky, dickey-seat, dickie-seat, dicky-seat -n03192543 Dictaphone -n03192907 die -n03193107 diesel, diesel engine, diesel motor -n03193260 diesel-electric locomotive, diesel-electric -n03193423 diesel-hydraulic locomotive, diesel-hydraulic -n03193597 diesel locomotive -n03193754 diestock -n03194170 differential analyzer -n03194297 differential gear, differential -n03194812 diffuser, diffusor -n03194992 diffuser, diffusor -n03195332 digester -n03195485 diggings, digs, domiciliation, lodgings, pad -n03195799 digital-analog converter, digital-to-analog converter -n03195959 digital audiotape, DAT -n03196062 digital camera -n03196217 digital clock -n03196324 digital computer -n03196598 digital display, alphanumeric display -n03196990 digital subscriber line, DSL -n03197201 digital voltmeter -n03197337 digital watch -n03197446 digitizer, digitiser, analog-digital converter, analog-to-digital converter -n03198223 dilator, dilater -n03198500 dildo -n03199358 dimity -n03199488 dimmer -n03199647 diner -n03199775 dinette -n03199901 dinghy, dory, rowboat -n03200231 dining area -n03200357 dining car, diner, dining compartment, buffet car -n03200539 dining-hall -n03200701 dining room, dining-room -n03200906 dining-room furniture -n03201035 dining-room table -n03201208 dining table, board -n03201529 dinner bell -n03201638 dinner dress, dinner gown, formal, evening gown -n03201776 dinner jacket, tux, tuxedo, black tie -n03201895 dinner napkin -n03201996 dinner pail, dinner bucket -n03202354 dinner table -n03202481 dinner theater, dinner theatre -n03202760 diode, semiconductor diode, junction rectifier, crystal rectifier -n03202940 diode, rectifying tube, rectifying valve -n03203089 dip -n03203806 diplomatic building -n03204134 dipole, dipole antenna -n03204306 dipper -n03204436 dipstick -n03204558 DIP switch, dual inline package switch -n03204955 directional antenna -n03205143 directional microphone -n03205304 direction finder -n03205458 dirk -n03205574 dirndl -n03205669 dirndl -n03205903 dirty bomb -n03206023 discharge lamp -n03206158 discharge pipe -n03206282 disco, discotheque -n03206405 discount house, discount store, discounter, wholesale house -n03206602 discus, saucer -n03206718 disguise -n03206908 dish -n03207305 dish, dish aerial, dish antenna, saucer -n03207548 dishpan -n03207630 dish rack -n03207743 dishrag, dishcloth -n03207835 dishtowel, dish towel, tea towel -n03207941 dishwasher, dish washer, dishwashing machine -n03208556 disk, disc -n03208938 disk brake, disc brake -n03209359 disk clutch -n03209477 disk controller -n03209666 disk drive, disc drive, hard drive, Winchester drive -n03209910 diskette, floppy, floppy disk -n03210245 disk harrow, disc harrow -n03210372 dispatch case, dispatch box -n03210552 dispensary -n03210683 dispenser -n03211117 display, video display -n03211413 display adapter, display adaptor -n03211616 display panel, display board, board -n03211789 display window, shop window, shopwindow, show window -n03212114 disposal, electric pig, garbage disposal -n03212247 disrupting explosive, bursting explosive -n03212406 distaff -n03212811 distillery, still -n03213014 distributor, distributer, electrical distributor -n03213361 distributor cam -n03213538 distributor cap -n03213715 distributor housing -n03213826 distributor point, breaker point, point -n03214253 ditch -n03214450 ditch spade, long-handled spade -n03214582 ditty bag -n03214966 divan -n03215076 divan, diwan -n03215191 dive bomber -n03215337 diverging lens, concave lens -n03215508 divided highway, dual carriageway -n03215749 divider -n03215930 diving bell -n03216199 divining rod, dowser, dowsing rod, waterfinder, water finder -n03216402 diving suit, diving dress -n03216562 dixie -n03216710 Dixie cup, paper cup -n03216828 dock, dockage, docking facility -n03217653 doeskin -n03217739 dogcart -n03217889 doggie bag, doggy bag -n03218198 dogsled, dog sled, dog sleigh -n03218446 dog wrench -n03219010 doily, doyley, doyly -n03219135 doll, dolly -n03219483 dollhouse, doll's house -n03219612 dolly -n03219859 dolman -n03219966 dolman, dolman jacket -n03220095 dolman sleeve -n03220237 dolmen, cromlech, portal tomb -n03220513 dome -n03220692 dome, domed stadium, covered stadium -n03221059 domino, half mask, eye mask -n03221351 dongle -n03221540 donkey jacket -n03221720 door -n03222176 door -n03222318 door -n03222516 doorbell, bell, buzzer -n03222722 doorframe, doorcase -n03222857 doorjamb, doorpost -n03223162 doorlock -n03223299 doormat, welcome mat -n03223441 doornail -n03223553 doorplate -n03223686 doorsill, doorstep, threshold -n03223923 doorstop, doorstopper -n03224490 Doppler radar -n03224603 dormer, dormer window -n03224753 dormer window -n03224893 dormitory, dorm, residence hall, hall, student residence -n03225108 dormitory, dormitory room, dorm room -n03225458 dosemeter, dosimeter -n03225616 dossal, dossel -n03225777 dot matrix printer, matrix printer, dot printer -n03225988 double bed -n03226090 double-bitted ax, double-bitted axe, Western ax, Western axe -n03226254 double boiler, double saucepan -n03226375 double-breasted jacket -n03226538 double-breasted suit -n03226880 double door -n03227010 double glazing -n03227184 double-hung window -n03227317 double knit -n03227721 doubler -n03227856 double reed -n03228016 double-reed instrument, double reed -n03228254 doublet -n03228365 doubletree -n03228533 douche, douche bag -n03228692 dovecote, columbarium, columbary -n03228796 Dover's powder -n03228967 dovetail, dovetail joint -n03229115 dovetail plane -n03229244 dowel, dowel pin, joggle -n03229526 downstage -n03231160 drafting instrument -n03231368 drafting table, drawing table -n03231819 Dragunov -n03232309 drainage ditch -n03232417 drainage system -n03232543 drain basket -n03232815 drainplug -n03232923 drape -n03233123 drapery -n03233624 drawbar -n03233744 drawbridge, lift bridge -n03233905 drawer -n03234164 drawers, underdrawers, shorts, boxers, boxershorts -n03234952 drawing chalk -n03235042 drawing room, withdrawing room -n03235180 drawing room -n03235327 drawknife, drawshave -n03235796 drawstring bag -n03235979 dray, camion -n03236093 dreadnought, dreadnaught -n03236217 dredge -n03236423 dredger -n03236580 dredging bucket -n03236735 dress, frock -n03237212 dress blues, dress whites -n03237340 dresser -n03237416 dress hat, high hat, opera hat, silk hat, stovepipe, top hat, topper, beaver -n03237639 dressing, medical dressing -n03237839 dressing case -n03237992 dressing gown, robe-de-chambre, lounging robe -n03238131 dressing room -n03238286 dressing sack, dressing sacque -n03238586 dressing table, dresser, vanity, toilet table -n03238762 dress rack -n03238879 dress shirt, evening shirt -n03239054 dress suit, full dress, tailcoat, tail coat, tails, white tie, white tie and tails -n03239259 dress uniform -n03239607 drift net -n03239726 drill -n03240140 electric drill -n03240683 drilling platform, offshore rig -n03240892 drill press -n03241093 drill rig, drilling rig, oilrig, oil rig -n03241335 drinking fountain, water fountain, bubbler -n03241496 drinking vessel -n03241903 drip loop -n03242120 drip mat -n03242264 drip pan -n03242390 dripping pan, drip pan -n03242506 drip pot -n03242995 drive -n03243218 drive -n03243625 drive line, drive line system -n03244047 driver, number one wood -n03244231 driveshaft -n03244388 driveway, drive, private road -n03244775 driving iron, one iron -n03244919 driving wheel -n03245271 drogue, drogue chute, drogue parachute -n03245421 drogue parachute -n03245724 drone, drone pipe, bourdon -n03245889 drone, pilotless aircraft, radio-controlled aircraft -n03246197 drop arch -n03246312 drop cloth -n03246454 drop curtain, drop cloth, drop -n03246653 drop forge, drop hammer, drop press -n03246933 drop-leaf table -n03247083 dropper, eye dropper -n03247351 droshky, drosky -n03247495 drove, drove chisel -n03248835 drugget -n03249342 drugstore, apothecary's shop, chemist's, chemist's shop, pharmacy -n03249569 drum, membranophone, tympan -n03249956 drum, metal drum -n03250089 drum brake -n03250279 drumhead, head -n03250405 drum printer -n03250588 drum sander, electric sander, sander, smoother -n03250847 drumstick -n03250952 dry battery -n03251100 dry-bulb thermometer -n03251280 dry cell -n03251533 dry dock, drydock, graving dock -n03251766 dryer, drier -n03251932 dry fly -n03252231 dry kiln -n03252324 dry masonry -n03252422 dry point -n03252637 dry wall, dry-stone wall -n03252787 dual scan display -n03253071 duck -n03253187 duckboard -n03253279 duckpin -n03253714 dudeen -n03253796 duffel, duffle -n03253886 duffel bag, duffle bag, duffel, duffle -n03254046 duffel coat, duffle coat -n03254189 dugout -n03254374 dugout canoe, dugout, pirogue -n03254625 dulciana -n03254737 dulcimer -n03254862 dulcimer -n03255030 dumbbell -n03255167 dumb bomb, gravity bomb -n03255322 dumbwaiter, food elevator -n03255488 dumdum, dumdum bullet -n03255899 dumpcart -n03256032 Dumpster -n03256166 dump truck, dumper, tipper truck, tipper lorry, tip truck, tipper -n03256472 Dumpy level -n03256631 dunce cap, dunce's cap, fool's cap -n03256788 dune buggy, beach buggy -n03256928 dungeon -n03257065 duplex apartment, duplex -n03257210 duplex house, duplex, semidetached house -n03257586 duplicator, copier -n03258192 dust bag, vacuum bag -n03258330 dustcloth, dustrag, duster -n03258456 dust cover -n03258577 dust cover, dust sheet -n03258905 dustmop, dust mop, dry mop -n03259009 dustpan -n03259280 Dutch oven -n03259401 Dutch oven -n03259505 dwelling, home, domicile, abode, habitation, dwelling house -n03260206 dye-works -n03260504 dynamo -n03260733 dynamometer, ergometer -n03260849 Eames chair -n03261019 earflap, earlap -n03261263 early warning radar -n03261395 early warning system -n03261603 earmuff -n03261776 earphone, earpiece, headphone, phone -n03262072 earplug -n03262248 earplug -n03262519 earthenware -n03262717 earthwork -n03262809 easel -n03262932 easy chair, lounge chair, overstuffed chair -n03263076 eaves -n03263338 ecclesiastical attire, ecclesiastical robe -n03263640 echinus -n03263758 echocardiograph -n03264906 edger -n03265032 edge tool -n03265754 efficiency apartment -n03266195 egg-and-dart, egg-and-anchor, egg-and-tongue -n03266371 eggbeater, eggwhisk -n03266620 egg timer -n03266749 eiderdown, duvet, continental quilt -n03267113 eight ball -n03267468 ejection seat, ejector seat, capsule -n03267696 elastic -n03267821 elastic bandage -n03268142 Elastoplast -n03268311 elbow -n03268645 elbow pad -n03268790 electric, electric automobile, electric car -n03268918 electrical cable -n03269073 electrical contact -n03269203 electrical converter -n03269401 electrical device -n03270165 electrical system -n03270695 electric bell -n03270854 electric blanket -n03271030 electric chair, chair, death chair, hot seat -n03271260 electric clock -n03271376 electric-discharge lamp, gas-discharge lamp -n03271574 electric fan, blower -n03271765 electric frying pan -n03271865 electric furnace -n03272010 electric guitar -n03272125 electric hammer -n03272239 electric heater, electric fire -n03272383 electric lamp -n03272562 electric locomotive -n03272810 electric meter, power meter -n03272940 electric mixer -n03273061 electric motor -n03273551 electric organ, electronic organ, Hammond organ, organ -n03273740 electric range -n03273913 electric refrigerator, fridge -n03274265 electric toothbrush -n03274435 electric typewriter -n03274561 electro-acoustic transducer -n03274796 electrode -n03275125 electrodynamometer -n03275311 electroencephalograph -n03275566 electrograph -n03275681 electrolytic, electrolytic capacitor, electrolytic condenser -n03275864 electrolytic cell -n03276179 electromagnet -n03276696 electrometer -n03276839 electromyograph -n03277004 electron accelerator -n03277149 electron gun -n03277459 electronic balance -n03277602 electronic converter -n03277771 electronic device -n03278248 electronic equipment -n03278914 electronic fetal monitor, electronic foetal monitor, fetal monitor, foetal monitor -n03279153 electronic instrument, electronic musical instrument -n03279364 electronic voltmeter -n03279508 electron microscope -n03279804 electron multiplier -n03279918 electrophorus -n03280216 electroscope -n03280394 electrostatic generator, electrostatic machine, Wimshurst machine, Van de Graaff generator -n03280644 electrostatic printer -n03281145 elevator, lift -n03281524 elevator -n03281673 elevator shaft -n03282060 embankment -n03282295 embassy -n03282401 embellishment -n03283221 emergency room, ER -n03283413 emesis basin -n03283827 emitter -n03284308 empty -n03284482 emulsion, photographic emulsion -n03284743 enamel -n03284886 enamel -n03284981 enamelware -n03285578 encaustic -n03285730 encephalogram, pneumoencephalogram -n03285912 enclosure -n03286572 endoscope -n03287351 energizer, energiser -n03287733 engine -n03288003 engine -n03288500 engineering, engine room -n03288643 enginery -n03288742 English horn, cor anglais -n03288886 English saddle, English cavalry saddle -n03289660 enlarger -n03289985 ensemble -n03290096 ensign -n03290195 entablature -n03290653 entertainment center -n03291413 entrenching tool, trenching spade -n03291551 entrenchment, intrenchment -n03291741 envelope -n03291819 envelope -n03291963 envelope, gasbag -n03292085 eolith -n03292362 epauliere -n03292475 epee -n03292603 epergne -n03292736 epicyclic train, epicyclic gear train -n03292960 epidiascope -n03293095 epilating wax -n03293741 equalizer, equaliser -n03293863 equatorial -n03294048 equipment -n03294604 erasable programmable read-only memory, EPROM -n03294833 eraser -n03295012 erecting prism -n03295140 erection -n03295246 Erlenmeyer flask -n03295928 escape hatch -n03296081 escapement -n03296217 escape wheel -n03296328 escarpment, escarp, scarp, protective embankment -n03296478 escutcheon, scutcheon -n03296963 esophagoscope, oesophagoscope -n03297103 espadrille -n03297226 espalier -n03297495 espresso maker -n03297644 espresso shop -n03297735 establishment -n03298089 estaminet -n03298352 estradiol patch -n03298716 etagere -n03298858 etamine, etamin -n03299406 etching -n03300216 ethernet -n03300443 ethernet cable -n03301175 Eton jacket -n03301291 etui -n03301389 eudiometer -n03301568 euphonium -n03301833 evaporative cooler -n03301940 evening bag -n03302671 exercise bike, exercycle -n03302790 exercise device -n03302938 exhaust, exhaust system -n03303217 exhaust fan -n03303669 exhaust valve -n03303831 exhibition hall, exhibition area -n03304197 Exocet -n03304323 expansion bit, expansive bit -n03304465 expansion bolt -n03305300 explosive detection system, EDS -n03305522 explosive device -n03305953 explosive trace detection, ETD -n03306385 express, limited -n03306869 extension, telephone extension, extension phone -n03307037 extension cord -n03307573 external-combustion engine -n03307792 external drive -n03308152 extractor -n03308481 eyebrow pencil -n03308614 eyecup, eyebath, eye cup -n03309110 eyeliner -n03309356 eyepatch, patch -n03309465 eyepiece, ocular -n03309687 eyeshadow -n03309808 fabric, cloth, material, textile -n03313333 facade, frontage, frontal -n03314227 face guard -n03314378 face mask -n03314608 faceplate -n03314780 face powder -n03314884 face veil -n03315644 facing, cladding -n03315805 facing -n03315990 facing, veneer -n03316105 facsimile, facsimile machine, fax -n03316406 factory, mill, manufacturing plant, manufactory -n03316873 factory ship -n03317233 fagot, faggot -n03317510 fagot stitch, faggot stitch -n03317673 Fahrenheit thermometer -n03317788 faience -n03317889 faille -n03318136 fairlead -n03318294 fairy light -n03318865 falchion -n03318983 fallboard, fall-board -n03319167 fallout shelter -n03319457 false face -n03319576 false teeth -n03319745 family room -n03320046 fan -n03320262 fan belt -n03320421 fan blade -n03320519 fancy dress, masquerade, masquerade costume -n03320845 fanion -n03320959 fanlight -n03321103 fanjet, fan-jet, fanjet engine, turbojet, turbojet engine, turbofan, turbofan engine -n03321419 fanjet, fan-jet, turbofan, turbojet -n03321563 fanny pack, butt pack -n03321843 fan tracery -n03321954 fan vaulting -n03322570 farm building -n03322704 farmer's market, green market, greenmarket -n03322836 farmhouse -n03322940 farm machine -n03323096 farmplace, farm-place, farmstead -n03323211 farmyard -n03323319 farthingale -n03323703 fastener, fastening, holdfast, fixing -n03324629 fast reactor -n03324814 fat farm -n03324928 fatigues -n03325088 faucet, spigot -n03325288 fauld -n03325403 fauteuil -n03325584 feather boa, boa -n03325691 featheredge -n03325941 fedora, felt hat, homburg, Stetson, trilby -n03326073 feedback circuit, feedback loop -n03326371 feedlot -n03326475 fell, felled seam -n03326660 felloe, felly -n03326795 felt -n03326948 felt-tip pen, felt-tipped pen, felt tip, Magic Marker -n03327133 felucca -n03327234 fence, fencing -n03327553 fencing mask, fencer's mask -n03327691 fencing sword -n03327841 fender, wing -n03328201 fender, buffer, cowcatcher, pilot -n03329302 Ferris wheel -n03329536 ferrule, collet -n03329663 ferry, ferryboat -n03330002 ferule -n03330665 festoon -n03330792 fetoscope, foetoscope -n03330947 fetter, hobble -n03331077 fez, tarboosh -n03331244 fiber, fibre, vulcanized fiber -n03331599 fiber optic cable, fibre optic cable -n03332005 fiberscope -n03332173 fichu -n03332271 fiddlestick, violin bow -n03332393 field artillery, field gun -n03332591 field coil, field winding -n03332784 field-effect transistor, FET -n03332989 field-emission microscope -n03333129 field glass, glass, spyglass -n03333252 field hockey ball -n03333349 field hospital -n03333610 field house, sports arena -n03333711 field lens -n03333851 field magnet -n03334017 field-sequential color television, field-sequential color TV, field-sequential color television system, field-sequential color TV system -n03334291 field tent -n03334382 fieldwork -n03334492 fife -n03334912 fifth wheel, spare -n03335030 fighter, fighter aircraft, attack aircraft -n03335333 fighting chair -n03335461 fig leaf -n03335846 figure eight, figure of eight -n03336168 figure loom, figured-fabric loom -n03336282 figure skate -n03336575 filament -n03336742 filature -n03336839 file -n03337140 file, file cabinet, filing cabinet -n03337383 file folder -n03337494 file server -n03337822 filigree, filagree, fillagree -n03338287 filling -n03338821 film, photographic film -n03339296 film, plastic film -n03339529 film advance -n03339643 filter -n03340009 filter -n03340723 finder, viewfinder, view finder -n03340923 finery -n03341035 fine-tooth comb, fine-toothed comb -n03341153 finger -n03341297 fingerboard -n03341606 finger bowl -n03342015 finger paint, fingerpaint -n03342127 finger-painting -n03342262 finger plate, escutcheon, scutcheon -n03342432 fingerstall, cot -n03342657 finish coat, finishing coat -n03342863 finish coat, finishing coat -n03342961 finisher -n03343047 fin keel -n03343234 fipple -n03343354 fipple flute, fipple pipe, recorder, vertical flute -n03343560 fire -n03343737 fire alarm, smoke alarm -n03343853 firearm, piece, small-arm -n03344305 fire bell -n03344393 fireboat -n03344509 firebox -n03344642 firebrick -n03344784 fire control radar -n03344935 fire control system -n03345487 fire engine, fire truck -n03345837 fire extinguisher, extinguisher, asphyxiator -n03346135 fire iron -n03346289 fireman's ax, fireman's axe -n03346455 fireplace, hearth, open fireplace -n03347037 fire screen, fireguard -n03347472 fire tongs, coal tongs -n03347617 fire tower -n03348142 firewall -n03348868 firing chamber, gun chamber -n03349020 firing pin -n03349296 firkin -n03349367 firmer chisel -n03349469 first-aid kit -n03349599 first-aid station -n03349771 first base -n03349892 first class -n03350204 fishbowl, fish bowl, goldfish bowl -n03350352 fisherman's bend -n03350456 fisherman's knot, true lover's knot, truelove knot -n03350602 fisherman's lure, fish lure -n03351151 fishhook -n03351262 fishing boat, fishing smack, fishing vessel -n03351434 fishing gear, tackle, fishing tackle, fishing rig, rig -n03351979 fishing rod, fishing pole -n03352232 fish joint -n03352366 fish knife -n03352628 fishnet, fishing net -n03352961 fish slice -n03353281 fitment -n03353951 fixative -n03354207 fixer-upper -n03354903 flag -n03355468 flageolet, treble recorder, shepherd's pipe -n03355768 flagon -n03355925 flagpole, flagstaff -n03356038 flagship -n03356279 flail -n03356446 flambeau -n03356559 flamethrower -n03356858 flange, rim -n03356982 flannel -n03357081 flannel, gabardine, tweed, white -n03357267 flannelette -n03357716 flap, flaps -n03358172 flash, photoflash, flash lamp, flashgun, flashbulb, flash bulb -n03358380 flash -n03358726 flash camera -n03358841 flasher -n03359137 flashlight, torch -n03359285 flashlight battery -n03359436 flash memory -n03359566 flask -n03360133 flat arch, straight arch -n03360300 flatbed -n03360431 flatbed press, cylinder press -n03360622 flat bench -n03360731 flatcar, flatbed, flat -n03361109 flat file -n03361297 flatlet -n03361380 flat panel display, FPD -n03361550 flats -n03361683 flat tip screwdriver -n03362639 fleece -n03362771 fleet ballistic missile submarine -n03362890 fleur-de-lis, fleur-de-lys -n03363363 flight simulator, trainer -n03363549 flintlock -n03363749 flintlock, firelock -n03364008 flip-flop, thong -n03364156 flipper, fin -n03364599 float, plasterer's float -n03364937 floating dock, floating dry dock -n03365231 floatplane, pontoon plane -n03365374 flood, floodlight, flood lamp, photoflood -n03365592 floor, flooring -n03365991 floor, level, storey, story -n03366464 floor -n03366721 floorboard -n03366823 floor cover, floor covering -n03366974 floor joist -n03367059 floor lamp -n03367321 flophouse, dosshouse -n03367410 florist, florist shop, flower store -n03367545 floss -n03367875 flotsam, jetsam -n03367969 flour bin -n03368048 flour mill -n03368352 flowerbed, flower bed, bed of flowers -n03369276 flugelhorn, fluegelhorn -n03369407 fluid drive -n03369512 fluid flywheel -n03369866 flume -n03370387 fluorescent lamp -n03370646 fluoroscope, roentgenoscope -n03371875 flush toilet, lavatory -n03372029 flute, transverse flute -n03372549 flute, flute glass, champagne flute -n03372822 flux applicator -n03372933 fluxmeter -n03373237 fly -n03373611 flying boat -n03373943 flying buttress, arc-boutant -n03374102 flying carpet -n03374282 flying jib -n03374372 fly rod -n03374473 fly tent -n03374570 flytrap -n03374649 flywheel -n03374838 fob, watch chain, watch guard -n03375171 foghorn -n03375329 foglamp -n03375575 foil -n03376159 fold, sheepfold, sheep pen, sheepcote -n03376279 folder -n03376595 folding chair -n03376771 folding door, accordion door -n03376938 folding saw -n03378005 food court -n03378174 food processor -n03378342 food hamper -n03378442 foot -n03378593 footage -n03378765 football -n03379051 football helmet -n03379204 football stadium -n03379343 footbath -n03379719 foot brake -n03379828 footbridge, overcrossing, pedestrian bridge -n03379989 foothold, footing -n03380301 footlocker, locker -n03380647 foot rule -n03380724 footstool, footrest, ottoman, tuffet -n03380867 footwear, footgear -n03381126 footwear -n03381231 forceps -n03381450 force pump -n03381565 fore-and-after -n03381776 fore-and-aft sail -n03382104 forecastle, fo'c'sle -n03382292 forecourt -n03382413 foredeck -n03382533 fore edge, foredge -n03382708 foreground -n03382856 foremast -n03382969 fore plane -n03383099 foresail -n03383211 forestay -n03383378 foretop -n03383468 fore-topmast -n03383562 fore-topsail -n03383821 forge -n03384167 fork -n03384352 forklift -n03384891 formalwear, eveningwear, evening dress, evening clothes -n03385295 Formica -n03385557 fortification, munition -n03386011 fortress, fort -n03386343 forty-five -n03386544 Foucault pendulum -n03386726 foulard -n03386870 foul-weather gear -n03387323 foundation garment, foundation -n03387653 foundry, metalworks -n03388043 fountain -n03388183 fountain pen -n03388323 four-in-hand -n03388549 four-poster -n03388711 four-pounder -n03388990 four-stroke engine, four-stroke internal-combustion engine -n03389611 four-wheel drive, 4WD -n03389761 four-wheel drive, 4WD -n03389889 four-wheeler -n03389983 fowling piece -n03390075 foxhole, fox hole -n03390327 fragmentation bomb, antipersonnel bomb, anti-personnel bomb, daisy cutter -n03390673 frail -n03390786 fraise -n03390983 frame, framing -n03391301 frame -n03391613 frame buffer -n03391770 framework -n03392648 Francis turbine -n03392741 franking machine -n03393017 free house -n03393199 free-reed -n03393324 free-reed instrument -n03393761 freewheel -n03393912 freight car -n03394149 freight elevator, service elevator -n03394272 freight liner, liner train -n03394480 freight train, rattler -n03394649 French door -n03394916 French horn, horn -n03395256 French polish, French polish shellac -n03395401 French roof -n03395514 French window -n03395859 Fresnel lens -n03396074 fret -n03396580 friary -n03396654 friction clutch -n03396997 frieze -n03397087 frieze -n03397266 frigate -n03397412 frigate -n03397532 frill, flounce, ruffle, furbelow -n03397947 Frisbee -n03398153 frock -n03398228 frock coat -n03399579 frontlet, frontal -n03399677 front porch -n03399761 front projector -n03399971 fruit machine -n03400231 frying pan, frypan, skillet -n03400972 fuel filter -n03401129 fuel gauge, fuel indicator -n03401279 fuel injection, fuel injection system -n03401721 fuel system -n03402188 full-dress uniform -n03402369 full metal jacket -n03402511 full skirt -n03402785 fumigator -n03402941 funeral home, funeral parlor, funeral parlour, funeral chapel, funeral church, funeral-residence -n03403643 funnel -n03404012 funny wagon -n03404149 fur -n03404251 fur coat -n03404360 fur hat -n03404449 furnace -n03404900 furnace lining, refractory -n03405111 furnace room -n03405265 furnishing -n03405595 furnishing, trappings -n03405725 furniture, piece of furniture, article of furniture -n03406759 fur-piece -n03406966 furrow -n03407369 fuse, electrical fuse, safety fuse -n03407865 fusee drive, fusee -n03408054 fuselage -n03408264 fusil -n03408340 fustian -n03408444 futon -n03409297 gabardine -n03409393 gable, gable end, gable wall -n03409591 gable roof, saddle roof, saddleback, saddleback roof -n03409920 gadgetry -n03410022 gaff -n03410147 gaff -n03410303 gaff -n03410423 gaffsail, gaff-headed sail -n03410571 gaff topsail, fore-and-aft topsail -n03410740 gag, muzzle -n03410938 gaiter -n03411079 gaiter -n03411208 Galilean telescope -n03411339 galleon -n03411927 gallery -n03412058 gallery, art gallery, picture gallery -n03412220 galley, ship's galley, caboose, cookhouse -n03412387 galley -n03412511 galley -n03412906 gallows -n03413124 gallows tree, gallows-tree, gibbet, gallous -n03413264 galvanometer -n03413428 gambling house, gambling den, gambling hell, gaming house -n03413684 gambrel, gambrel roof -n03413828 game -n03414029 gamebag -n03414162 game equipment -n03414676 gaming table -n03415252 gamp, brolly -n03415486 gangplank, gangboard, gangway -n03415626 gangsaw -n03415749 gangway -n03415868 gantlet -n03416094 gantry, gauntry -n03416489 garage -n03416640 garage, service department -n03416775 Garand rifle, Garand, M-1, M-1 rifle -n03416900 garbage -n03417042 garbage truck, dustcart -n03417202 garboard, garboard plank, garboard strake -n03417345 garden -n03417749 garden -n03417970 garden rake -n03418158 garden spade -n03418242 garden tool, lawn tool -n03418402 garden trowel -n03418618 gargoyle -n03418749 garibaldi -n03418915 garlic press -n03419014 garment -n03420345 garment bag -n03420801 garrison cap, overseas cap -n03420935 garrote, garotte, garrotte, iron collar -n03421117 garter, supporter -n03421324 garter belt, suspender belt -n03421485 garter stitch -n03421669 gas guzzler -n03421768 gas shell -n03421960 gas bracket -n03422072 gas burner, gas jet -n03422484 gas-cooled reactor -n03422589 gas-discharge tube -n03422771 gas engine -n03423099 gas fixture -n03423224 gas furnace -n03423306 gas gun -n03423479 gas heater -n03423568 gas holder, gasometer -n03423719 gasket -n03423877 gas lamp -n03424204 gas maser -n03424325 gasmask, respirator, gas helmet -n03424489 gas meter, gasometer -n03424630 gasoline engine, petrol engine -n03424862 gasoline gauge, gasoline gage, gas gauge, gas gage, petrol gauge, petrol gage -n03425241 gas oven -n03425325 gas oven -n03425413 gas pump, gasoline pump, petrol pump, island dispenser -n03425595 gas range, gas stove, gas cooker -n03425769 gas ring -n03426134 gas tank, gasoline tank, petrol tank -n03426285 gas thermometer, air thermometer -n03426462 gastroscope -n03426574 gas turbine -n03426871 gas-turbine ship -n03427202 gat, rod -n03427296 gate -n03428090 gatehouse -n03428226 gateleg table -n03428349 gatepost -n03429003 gathered skirt -n03429137 Gatling gun -n03429288 gauge, gage -n03429682 gauntlet, gantlet -n03429771 gauntlet, gantlet, metal glove -n03429914 gauze, netting, veiling -n03430091 gauze, gauze bandage -n03430313 gavel -n03430418 gazebo, summerhouse -n03430551 gear, gear wheel, geared wheel, cogwheel -n03430959 gear, paraphernalia, appurtenance -n03431243 gear, gear mechanism -n03431570 gearbox, gear box, gear case -n03431745 gearing, gear, geartrain, power train, train -n03432061 gearset -n03432129 gearshift, gearstick, shifter, gear lever -n03432360 Geiger counter, Geiger-Muller counter -n03432509 Geiger tube, Geiger-Muller tube -n03433247 gene chip, DNA chip -n03433637 general-purpose bomb, GP bomb -n03433877 generator -n03434188 generator -n03434285 generator -n03434830 Geneva gown -n03435593 geodesic dome -n03435743 georgette -n03435991 gharry -n03436075 ghat -n03436182 ghetto blaster, boom box -n03436417 gift shop, novelty shop -n03436549 gift wrapping -n03436656 gig -n03436772 gig -n03436891 gig -n03436990 gig -n03437184 gildhall -n03437295 gill net -n03437430 gilt, gilding -n03437581 gimbal -n03437741 gingham -n03437829 girandole, girandola -n03437941 girder -n03438071 girdle, cincture, sash, waistband, waistcloth -n03438257 glass, drinking glass -n03438661 glass -n03438780 glass cutter -n03438863 glasses case -n03439348 glebe house -n03439631 Glengarry -n03439814 glider, sailplane -n03440216 Global Positioning System, GPS -n03440682 glockenspiel, orchestral bells -n03440876 glory hole, lazaretto -n03441112 glove -n03441345 glove compartment -n03441465 glow lamp -n03441582 glow tube -n03442288 glyptic art, glyptography -n03442487 glyptics, lithoglyptics -n03442597 gnomon -n03442756 goal -n03443005 goalmouth -n03443149 goalpost -n03443371 goblet -n03443543 godown -n03443912 goggles -n03444034 go-kart -n03445326 gold plate -n03445617 golf bag -n03445777 golf ball -n03445924 golfcart, golf cart -n03446070 golf club, golf-club, club -n03446268 golf-club head, club head, club-head, clubhead -n03446832 golf equipment -n03447075 golf glove -n03447358 golliwog, golliwogg -n03447447 gondola -n03447721 gong, tam-tam -n03447894 goniometer -n03448031 Gordian knot -n03448590 gorget -n03448696 gossamer -n03448956 Gothic arch -n03449217 gouache -n03449309 gouge -n03449451 gourd, calabash -n03449564 government building -n03449858 government office -n03450230 gown -n03450516 gown, robe -n03450734 gown, surgical gown, scrubs -n03450881 grab -n03450974 grab bag -n03451120 grab bar -n03451253 grace cup -n03451365 grade separation -n03451711 graduated cylinder -n03451798 graffito, graffiti -n03452267 gramophone, acoustic gramophone -n03452449 granary, garner -n03452594 grandfather clock, longcase clock -n03452741 grand piano, grand -n03453231 graniteware -n03453320 granny knot, granny -n03453443 grape arbor, grape arbour -n03454110 grapnel, grapnel anchor -n03454211 grapnel, grapple, grappler, grappling hook, grappling iron -n03454442 grass skirt -n03454536 grate, grating -n03454707 grate, grating -n03454885 grater -n03455355 graver, graving tool, pointel, pointrel -n03455488 gravestone, headstone, tombstone -n03455642 gravimeter, gravity meter -n03455802 gravure, photogravure, heliogravure -n03456024 gravy boat, gravy holder, sauceboat, boat -n03456186 grey, gray -n03456299 grease-gun, gun -n03456447 greasepaint -n03456548 greasy spoon -n03456665 greatcoat, overcoat, topcoat -n03457008 great hall -n03457451 greave, jambeau -n03457686 greengrocery -n03457902 greenhouse, nursery, glasshouse -n03458271 grenade -n03458422 grid, gridiron -n03459328 griddle -n03459591 grill, grille, grillwork -n03459775 grille, radiator grille -n03459914 grillroom, grill -n03460040 grinder -n03460147 grinding wheel, emery wheel -n03460297 grindstone -n03460455 gripsack -n03460899 gristmill -n03461288 grocery bag -n03461385 grocery store, grocery, food market, market -n03461651 grogram -n03461882 groined vault -n03461988 groover -n03462110 grosgrain -n03462315 gros point -n03462747 ground, earth -n03462972 ground bait -n03463185 ground control -n03463381 ground floor, first floor, ground level -n03463666 groundsheet, ground cloth -n03464053 G-string, thong -n03464467 guard, safety, safety device -n03464628 guard boat -n03464952 guardroom -n03465040 guardroom -n03465151 guard ship -n03465320 guard's van -n03465426 gueridon -n03465500 Guarnerius -n03465605 guesthouse -n03465718 guestroom -n03465818 guidance system, guidance device -n03466162 guided missile -n03466493 guided missile cruiser -n03466600 guided missile frigate -n03466839 guildhall -n03466947 guilloche -n03467068 guillotine -n03467254 guimpe -n03467380 guimpe -n03467517 guitar -n03467796 guitar pick -n03467887 gulag -n03467984 gun -n03468570 gunboat -n03468696 gun carriage -n03468821 gun case -n03469031 gun emplacement, weapons emplacement -n03469175 gun enclosure, gun turret, turret -n03469493 gunlock, firing mechanism -n03469832 gunnery -n03469903 gunnysack, gunny sack, burlap bag -n03470005 gun pendulum -n03470222 gun room -n03470387 gunsight, gun-sight -n03470629 gun trigger, trigger -n03470948 gurney -n03471030 gusher -n03471190 gusset, inset -n03471347 gusset, gusset plate -n03471779 guy, guy cable, guy wire, guy rope -n03472232 gymnastic apparatus, exerciser -n03472535 gym shoe, sneaker, tennis shoe -n03472672 gym suit -n03472796 gymslip -n03472937 gypsy cab -n03473078 gyrocompass -n03473227 gyroscope, gyro -n03473465 gyrostabilizer, gyrostabiliser -n03473817 habergeon -n03473966 habit -n03474167 habit, riding habit -n03474352 hacienda -n03474779 hacksaw, hack saw, metal saw -n03474896 haft, helve -n03475581 hairbrush -n03475674 haircloth, hair -n03475823 hairdressing, hair tonic, hair oil, hair grease -n03475961 hairnet -n03476083 hairpiece, false hair, postiche -n03476313 hairpin -n03476542 hair shirt -n03476684 hair slide -n03476991 hair spray -n03477143 hairspring -n03477303 hair trigger -n03477410 halberd -n03477512 half binding -n03477773 half hatchet -n03477902 half hitch -n03478589 half track -n03478756 hall -n03478907 hall -n03479121 hall -n03479266 Hall of Fame -n03479397 hall of residence -n03479502 hallstand -n03480579 halter -n03480719 halter, hackamore -n03480973 hame -n03481172 hammer -n03481521 hammer, power hammer -n03482001 hammer -n03482128 hammerhead -n03482252 hammock, sack -n03482405 hamper -n03482523 hand -n03482877 handball -n03483086 handbarrow -n03483230 handbell -n03483316 hand blower, blow dryer, blow drier, hair dryer, hair drier -n03483531 handbow -n03483637 hand brake, emergency, emergency brake, parking brake -n03483823 hand calculator, pocket calculator -n03483971 handcar -n03484083 handcart, pushcart, cart, go-cart -n03484487 hand cream -n03484576 handcuff, cuff, handlock, manacle -n03484809 hand drill, handheld drill -n03484931 hand glass, simple microscope, magnifying glass -n03485198 hand glass, hand mirror -n03485309 hand grenade -n03485407 hand-held computer, hand-held microcomputer -n03485575 handhold -n03485794 handkerchief, hankie, hanky, hankey -n03487090 handlebar -n03487331 handloom -n03487444 hand lotion -n03487533 hand luggage -n03487642 hand-me-down -n03487774 hand mower -n03487886 hand pump -n03488111 handrest -n03488188 handsaw, hand saw, carpenter's saw -n03488438 handset, French telephone -n03488603 hand shovel -n03488784 handspike -n03488887 handstamp, rubber stamp -n03489048 hand throttle -n03489162 hand tool -n03490006 hand towel, face towel -n03490119 hand truck, truck -n03490324 handwear, hand wear -n03490449 handwheel -n03490649 handwheel -n03490784 hangar queen -n03490884 hanger -n03491032 hang glider -n03491724 hangman's rope, hangman's halter, halter, hemp, hempen necktie -n03491988 hank -n03492087 hansom, hansom cab -n03492250 harbor, harbour -n03492542 hard disc, hard disk, fixed disk -n03492922 hard hat, tin hat, safety hat -n03493219 hardtop -n03493792 hardware, ironware -n03493911 hardware store, ironmonger, ironmonger's shop -n03494278 harmonica, mouth organ, harp, mouth harp -n03494537 harmonium, organ, reed organ -n03494706 harness -n03495039 harness -n03495258 harp -n03495570 harp -n03495671 harpoon -n03495941 harpoon gun -n03496183 harpoon log -n03496296 harpsichord, cembalo -n03496486 Harris Tweed -n03496612 harrow -n03496892 harvester, reaper -n03497100 hash house -n03497352 hasp -n03497657 hat, chapeau, lid -n03498441 hatbox -n03498536 hatch -n03498662 hatchback, hatchback door -n03498781 hatchback -n03498866 hatchel, heckle -n03498962 hatchet -n03499354 hatpin -n03499468 hauberk, byrnie -n03499907 Hawaiian guitar, steel guitar -n03500090 hawse, hawsehole, hawsepipe -n03500209 hawser -n03500295 hawser bend -n03500389 hay bale -n03500457 hayfork -n03500557 hayloft, haymow, mow -n03500699 haymaker, hay conditioner -n03500838 hayrack, hayrig -n03500971 hayrack -n03501152 hazard -n03501288 head -n03501520 head -n03501614 head -n03502200 headboard -n03502331 head covering, veil -n03502509 headdress, headgear -n03502777 header -n03502897 header -n03503097 header, coping, cope -n03503233 header, lintel -n03503358 headfast -n03503477 head gasket -n03503567 head gate -n03503718 headgear -n03503997 headlight, headlamp -n03504205 headpiece -n03504293 headpin, kingpin -n03504723 headquarters, central office, main office, home office, home base -n03505015 headrace -n03505133 headrest -n03505383 headsail -n03505504 headscarf -n03505667 headset -n03505764 head shop -n03506028 headstall, headpiece -n03506184 headstock -n03506370 health spa, spa, health club -n03506560 hearing aid, ear trumpet -n03506727 hearing aid, deaf-aid -n03506880 hearse -n03507241 hearth, fireside -n03507458 hearthrug -n03507658 heart-lung machine -n03507963 heat engine -n03508101 heater, warmer -n03508485 heat exchanger -n03508881 heating pad, hot pad -n03509394 heat lamp, infrared lamp -n03509608 heat pump -n03509843 heat-seeking missile -n03510072 heat shield -n03510244 heat sink -n03510384 heaume -n03510487 heaver -n03510583 heavier-than-air craft -n03510866 heckelphone, basset oboe -n03510987 hectograph, heliotype -n03511175 hedge, hedgerow -n03511333 hedge trimmer -n03512030 helicon, bombardon -n03512147 helicopter, chopper, whirlybird, eggbeater -n03512452 heliograph -n03512624 heliometer -n03512911 helm -n03513137 helmet -n03513376 helmet -n03514129 hematocrit, haematocrit -n03514340 hemming-stitch -n03514451 hemostat, haemostat -n03514693 hemstitch, hemstitching -n03514894 henroost -n03515338 heraldry -n03515934 hermitage -n03516266 herringbone -n03516367 herringbone, herringbone pattern -n03516647 Herschelian telescope, off-axis reflector -n03516844 Hessian boot, hessian, jackboot, Wellington, Wellington boot -n03516996 heterodyne receiver, superheterodyne receiver, superhet -n03517509 hibachi -n03517647 hideaway, retreat -n03517760 hi-fi, high fidelity sound system -n03517899 high altar -n03517982 high-angle gun -n03518135 highball glass -n03518230 highboard -n03518305 highboy, tallboy -n03518445 highchair, feeding chair -n03518631 high gear, high -n03518829 high-hat cymbal, high hat -n03518943 highlighter -n03519081 highlighter -n03519226 high-pass filter -n03519387 high-rise, tower block -n03519674 high table -n03519848 high-warp loom -n03520493 hijab -n03521076 hinge, flexible joint -n03521431 hinging post, swinging post -n03521544 hip boot, thigh boot -n03521675 hipflask, pocket flask -n03521771 hip pad -n03521899 hip pocket -n03522003 hippodrome -n03522100 hip roof, hipped roof -n03522634 hitch -n03522863 hitch -n03522990 hitching post -n03523134 hitchrack, hitching bar -n03523398 hob -n03523506 hobble skirt -n03523987 hockey skate -n03524150 hockey stick -n03524287 hod -n03524425 hodoscope -n03524574 hoe -n03524745 hoe handle -n03524976 hogshead -n03525074 hoist -n03525252 hold, keep -n03525454 holder -n03525693 holding cell -n03525827 holding device -n03526062 holding pen, holding paddock, holding yard -n03527149 hollowware, holloware -n03527444 holster -n03527565 holster -n03527675 holy of holies, sanctum sanctorum -n03528100 home, nursing home, rest home -n03528263 home appliance, household appliance -n03528523 home computer -n03528901 home plate, home base, home, plate -n03529175 home room, homeroom -n03529444 homespun -n03529629 homestead -n03529860 home theater, home theatre -n03530189 homing torpedo -n03530511 hone -n03530642 honeycomb -n03530910 hood, bonnet, cowl, cowling -n03531281 hood -n03531447 hood -n03531546 hood, exhaust hood -n03531691 hood -n03531982 hood latch -n03532342 hook -n03532672 hook, claw -n03532919 hook -n03533014 hookah, narghile, nargileh, sheesha, shisha, chicha, calean, kalian, water pipe, hubble-bubble, hubbly-bubbly -n03533392 hook and eye -n03533486 hookup, assemblage -n03533654 hookup -n03533845 hook wrench, hook spanner -n03534580 hoopskirt, crinoline -n03534695 hoosegow, hoosgow -n03534776 Hoover -n03535024 hope chest, wedding chest -n03535284 hopper -n03535647 hopsacking, hopsack -n03535780 horizontal bar, high bar -n03536122 horizontal stabilizer, horizontal stabiliser, tailplane -n03536568 horizontal tail -n03536761 horn -n03537085 horn -n03537241 horn -n03537412 horn button -n03537550 hornpipe, pibgorn, stockhorn -n03538037 horse, gymnastic horse -n03538179 horsebox -n03538300 horsecar -n03538406 horse cart, horse-cart -n03538542 horsecloth -n03538634 horse-drawn vehicle -n03538817 horsehair -n03538957 horsehair wig -n03539103 horseless carriage -n03539293 horse pistol, horse-pistol -n03539433 horseshoe, shoe -n03539546 horseshoe -n03539678 horse-trail -n03539754 horsewhip -n03540090 hose -n03540267 hosiery, hose -n03540476 hospice -n03540595 hospital, infirmary -n03540914 hospital bed -n03541091 hospital room -n03541269 hospital ship -n03541393 hospital train -n03541537 hostel, youth hostel, student lodging -n03541696 hostel, hostelry, inn, lodge, auberge -n03541923 hot-air balloon -n03542333 hotel -n03542605 hotel-casino, casino-hotel -n03542727 hotel-casino, casino-hotel -n03542860 hotel room -n03543012 hot line -n03543112 hot pants -n03543254 hot plate, hotplate -n03543394 hot rod, hot-rod -n03543511 hot spot, hotspot -n03543603 hot tub -n03543735 hot-water bottle, hot-water bag -n03543945 houndstooth check, hound's-tooth check, dogstooth check, dogs-tooth check, dog's-tooth check -n03544143 hourglass -n03544238 hour hand, little hand -n03544360 house -n03545150 house -n03545470 houseboat -n03545585 houselights -n03545756 house of cards, cardhouse, card-house, cardcastle -n03545961 house of correction -n03546112 house paint, housepaint -n03546235 housetop -n03546340 housing, lodging, living accommodations -n03547054 hovel, hut, hutch, shack, shanty -n03547229 hovercraft, ground-effect machine -n03547397 howdah, houdah -n03547530 huarache, huaraches -n03547861 hub-and-spoke, hub-and-spoke system -n03548086 hubcap -n03548195 huck, huckaback -n03548320 hug-me-tight -n03548402 hula-hoop -n03548533 hulk -n03548626 hull -n03548930 humeral veil, veil -n03549199 Humvee, Hum-Vee -n03549350 hunter, hunting watch -n03549473 hunting knife -n03549589 hurdle -n03549732 hurricane deck, hurricane roof, promenade deck, awning deck -n03549897 hurricane lamp, hurricane lantern, tornado lantern, storm lantern, storm lamp -n03550153 hut, army hut, field hut -n03550289 hutch -n03550420 hutment -n03551084 hydraulic brake, hydraulic brakes -n03551395 hydraulic press -n03551582 hydraulic pump, hydraulic ram -n03551790 hydraulic system -n03552001 hydraulic transmission, hydraulic transmission system -n03552449 hydroelectric turbine -n03552749 hydrofoil, hydroplane -n03553019 hydrofoil, foil -n03553248 hydrogen bomb, H-bomb, fusion bomb, thermonuclear bomb -n03553486 hydrometer, gravimeter -n03554375 hygrodeik -n03554460 hygrometer -n03554645 hygroscope -n03555006 hyperbaric chamber -n03555217 hypercoaster -n03555426 hypermarket -n03555564 hypodermic needle -n03555662 hypodermic syringe, hypodermic, hypo -n03555862 hypsometer -n03555996 hysterosalpingogram -n03556173 I-beam -n03556679 ice ax, ice axe, piolet -n03556811 iceboat, ice yacht, scooter -n03556992 icebreaker, iceboat -n03557270 iced-tea spoon -n03557360 ice hockey rink, ice-hockey rink -n03557590 ice machine -n03557692 ice maker -n03557840 ice pack, ice bag -n03558007 icepick, ice pick -n03558176 ice rink, ice-skating rink, ice -n03558404 ice skate -n03558633 ice tongs -n03558739 icetray -n03559373 iconoscope -n03559531 Identikit, Identikit picture -n03559999 idle pulley, idler pulley, idle wheel -n03560430 igloo, iglu -n03560860 ignition coil -n03561047 ignition key -n03561169 ignition switch -n03561573 imaret -n03562565 immovable bandage -n03563200 impact printer -n03563460 impeller -n03563710 implant -n03563967 implement -n03564849 impression -n03565288 imprint -n03565565 improvised explosive device, I.E.D., IED -n03565710 impulse turbine -n03565830 in-basket, in-tray -n03565991 incendiary bomb, incendiary, firebomb -n03566193 incinerator -n03566329 inclined plane -n03566555 inclinometer, dip circle -n03566730 inclinometer -n03566860 incrustation, encrustation -n03567066 incubator, brooder -n03567635 index register -n03567788 Indiaman -n03567912 Indian club -n03568117 indicator -n03568818 induction coil -n03569014 inductor, inductance -n03569174 industrial watercourse -n03569293 inertial guidance system, inertial navigation system -n03569494 inflater, inflator -n03571280 inhaler, inhalator -n03571439 injector -n03571625 ink bottle, inkpot -n03571853 ink eraser -n03571942 ink-jet printer -n03572107 inkle -n03572205 inkstand -n03572321 inkwell, inkstand -n03572631 inlay -n03573574 inside caliper -n03573848 insole, innersole -n03574243 instep -n03574416 instillator -n03574555 institution -n03574816 instrument -n03575958 instrument of punishment -n03576215 instrument of torture -n03576443 intaglio, diaglyph -n03576955 intake valve -n03577090 integrated circuit, microcircuit -n03577312 integrator, planimeter -n03577474 Intelnet -n03577672 interceptor -n03577818 interchange -n03578055 intercommunication system, intercom -n03578251 intercontinental ballistic missile, ICBM -n03578656 interface, port -n03578981 interferometer -n03579538 interior door -n03579982 internal-combustion engine, ICE -n03580518 internal drive -n03580615 internet, net, cyberspace -n03580845 interphone -n03580990 interrupter -n03581125 intersection, crossroad, crossway, crossing, carrefour -n03581531 interstice -n03581897 intraocular lens -n03582508 intravenous pyelogram, IVP -n03582959 inverter -n03583419 ion engine -n03583621 ionization chamber, ionization tube -n03584254 iPod -n03584400 video iPod -n03584829 iron, smoothing iron -n03585073 iron -n03585337 iron, branding iron -n03585438 irons, chains -n03585551 ironclad -n03585682 iron foundry -n03585778 iron horse -n03585875 ironing -n03586219 iron lung -n03586631 ironmongery -n03586911 ironworks -n03587205 irrigation ditch -n03588216 izar -n03588841 jabot -n03588951 jack -n03589313 jack, jackstones -n03589513 jack -n03589672 jack -n03589791 jacket -n03590306 jacket -n03590475 jacket -n03590588 jack-in-the-box -n03590841 jack-o'-lantern -n03590932 jack plane -n03591116 Jacob's ladder, jack ladder, pilot ladder -n03591313 jaconet -n03591592 Jacquard loom, Jacquard -n03591798 jacquard -n03591901 jag, dag -n03592245 jail, jailhouse, gaol, clink, slammer, poky, pokey -n03592669 jalousie -n03592773 jamb -n03592931 jammer -n03593122 jampot, jamjar -n03593222 japan -n03593526 jar -n03593862 Jarvik heart, Jarvik artificial heart -n03594010 jaunting car, jaunty car -n03594148 javelin -n03594277 jaw -n03594523 Jaws of Life -n03594734 jean, blue jean, denim -n03594945 jeep, landrover -n03595055 jellaba -n03595264 jerkin -n03595409 jeroboam, double-magnum -n03595523 jersey -n03595614 jersey, T-shirt, tee shirt -n03595860 jet, jet plane, jet-propelled plane -n03596099 jet bridge -n03596285 jet engine -n03596543 jetliner -n03597147 jeweler's glass -n03597317 jewelled headdress, jeweled headdress -n03597916 jew's harp, jews' harp, mouth bow -n03598151 jib -n03598299 jibboom -n03598385 jig -n03598515 jig -n03598646 jiggermast, jigger -n03598783 jigsaw, scroll saw, fretsaw -n03598930 jigsaw puzzle -n03599486 jinrikisha, ricksha, rickshaw -n03599964 jobcentre -n03600285 jodhpurs, jodhpur breeches, riding breeches -n03600475 jodhpur, jodhpur boot, jodhpur shoe -n03600722 joinery -n03600977 joint -n03601442 Joint Direct Attack Munition, JDAM -n03601638 jointer, jointer plane, jointing plane, long plane -n03601840 joist -n03602081 jolly boat, jolly -n03602194 jorum -n03602365 joss house -n03602686 journal bearing -n03602790 journal box -n03602883 joystick -n03603442 jungle gym -n03603594 junk -n03603722 jug -n03604156 jukebox, nickelodeon -n03604311 jumbojet, jumbo jet -n03604400 jumper, pinafore, pinny -n03604536 jumper -n03604629 jumper -n03604763 jumper -n03604843 jumper cable, jumper lead, lead, booster cable -n03605417 jump seat -n03605504 jump suit -n03605598 jump suit, jumpsuit -n03605722 junction -n03605915 junction, conjunction -n03606106 junction barrier, barrier strip -n03606251 junk shop -n03606347 jury box -n03606465 jury mast -n03607029 kachina -n03607186 kaffiyeh -n03607527 kalansuwa -n03607659 Kalashnikov -n03607923 kameez -n03608504 kanzu -n03609147 katharometer -n03609235 kayak -n03609397 kazoo -n03609542 keel -n03609786 keelboat -n03609959 keelson -n03610098 keep, donjon, dungeon -n03610418 keg -n03610524 kennel, doghouse, dog house -n03610682 kepi, peaked cap, service cap, yachting cap -n03610836 keratoscope -n03610992 kerchief -n03612010 ketch -n03612814 kettle, boiler -n03612965 kettle, kettledrum, tympanum, tympani, timpani -n03613294 key -n03613592 key -n03614007 keyboard -n03614383 keyboard buffer -n03614532 keyboard instrument -n03614782 keyhole -n03614887 keyhole saw -n03615300 khadi, khaddar -n03615406 khaki -n03615563 khakis -n03615655 khimar -n03615790 khukuri -n03616091 kick pleat -n03616225 kicksorter, pulse height analyzer -n03616428 kickstand -n03616763 kick starter, kick start -n03616979 kid glove, suede glove -n03617095 kiln -n03617312 kilt -n03617480 kimono -n03617594 kinescope, picture tube, television tube -n03617834 Kinetoscope -n03618101 king -n03618339 king -n03618546 kingbolt, kingpin, swivel pin -n03618678 king post -n03618797 Kipp's apparatus -n03618982 kirk -n03619050 kirpan -n03619196 kirtle -n03619275 kirtle -n03619396 kit, outfit -n03619650 kit -n03619793 kitbag, kit bag -n03619890 kitchen -n03620052 kitchen appliance -n03620353 kitchenette -n03620967 kitchen table -n03621049 kitchen utensil -n03621377 kitchenware -n03621694 kite balloon -n03622058 klaxon, claxon -n03622401 klieg light -n03622526 klystron -n03622839 knee brace -n03622931 knee-high, knee-hi -n03623198 knee pad -n03623338 knee piece -n03623556 knife -n03624134 knife -n03624400 knife blade -n03624767 knight, horse -n03625355 knit -n03625539 knitting machine -n03625646 knitting needle -n03625943 knitwear -n03626115 knob, boss -n03626272 knob, pommel -n03626418 knobble -n03626502 knobkerrie, knobkerry -n03626760 knocker, doorknocker, rapper -n03627232 knot -n03627954 knuckle joint, hinge joint -n03628071 kohl -n03628215 koto -n03628421 kraal -n03628511 kremlin -n03628728 kris, creese, crease -n03628831 krummhorn, crumhorn, cromorne -n03628984 Kundt's tube -n03629100 Kurdistan -n03629231 kurta -n03629520 kylix, cylix -n03629643 kymograph, cymograph -n03630262 lab bench, laboratory bench -n03630383 lab coat, laboratory coat -n03631177 lace -n03631811 lacquer -n03631922 lacquerware -n03632100 lacrosse ball -n03632577 ladder-back -n03632729 ladder-back, ladder-back chair -n03632852 ladder truck, aerial ladder truck -n03632963 ladies' room, powder room -n03633091 ladle -n03633341 lady chapel -n03633632 lagerphone -n03633886 lag screw, lag bolt -n03634034 lake dwelling, pile dwelling -n03634899 lally, lally column -n03635032 lamasery -n03635108 lambrequin -n03635330 lame -n03635516 laminar flow clean room -n03635668 laminate -n03635932 lamination -n03636248 lamp -n03636649 lamp -n03637027 lamp house, lamphouse, lamp housing -n03637181 lamppost -n03637318 lampshade, lamp shade -n03637480 lanai -n03637787 lancet arch, lancet -n03637898 lancet window -n03638014 landau -n03638180 lander -n03638623 landing craft -n03638743 landing flap -n03638883 landing gear -n03639077 landing net -n03639230 landing skid -n03639497 land line, landline -n03639675 land mine, ground-emplaced mine, booby trap -n03639880 land office -n03640850 lanolin -n03640988 lantern -n03641569 lanyard, laniard -n03641947 lap, lap covering -n03642144 laparoscope -n03642341 lapboard -n03642444 lapel -n03642573 lap joint, splice -n03642806 laptop, laptop computer -n03643149 laryngoscope -n03643253 laser, optical maser -n03643491 laser-guided bomb, LGB -n03643737 laser printer -n03643907 lash, thong -n03644073 lashing -n03644378 lasso, lariat, riata, reata -n03644858 latch -n03645011 latch, door latch -n03645168 latchet -n03645290 latchkey -n03645577 lateen, lateen sail -n03646020 latex paint, latex, rubber-base paint -n03646148 lath -n03646296 lathe -n03646809 latrine -n03646916 lattice, latticework, fretwork -n03647423 launch -n03647520 launcher, rocket launcher -n03648219 laundry, wash, washing, washables -n03648431 laundry cart -n03648667 laundry truck -n03649003 lavalava -n03649161 lavaliere, lavalier, lavalliere -n03649288 laver -n03649674 lawn chair, garden chair -n03649797 lawn furniture -n03649909 lawn mower, mower -n03650551 layette -n03651388 lead-acid battery, lead-acid accumulator -n03651605 lead-in -n03651843 leading rein -n03652100 lead pencil -n03652389 leaf spring -n03652729 lean-to -n03652826 lean-to tent -n03652932 leash, tether, lead -n03653110 leatherette, imitation leather -n03653220 leather strip -n03653454 Leclanche cell -n03653583 lectern, reading desk -n03653740 lecture room -n03653833 lederhosen -n03653975 ledger board -n03654576 leg -n03654826 leg -n03655072 legging, leging, leg covering -n03655470 Leiden jar, Leyden jar -n03655720 leisure wear -n03656484 lens, lense, lens system -n03656957 lens, electron lens -n03657121 lens cap, lens cover -n03657239 lens implant, interocular lens implant, IOL -n03657511 leotard, unitard, body suit, cat suit -n03658102 letter case -n03658185 letter opener, paper knife, paperknife -n03658635 levee -n03658858 level, spirit level -n03659292 lever -n03659686 lever, lever tumbler -n03659809 lever -n03659950 lever lock -n03660124 Levi's, levis -n03660562 Liberty ship -n03660909 library -n03661043 library -n03661340 lid -n03662301 Liebig condenser -n03662452 lie detector -n03662601 lifeboat -n03662719 life buoy, lifesaver, life belt, life ring -n03662887 life jacket, life vest, cork jacket -n03663433 life office -n03663531 life preserver, preserver, flotation device -n03663910 life-support system, life support -n03664159 life-support system, life support -n03664675 lifting device -n03664840 lift pump -n03664943 ligament -n03665232 ligature -n03665366 light, light source -n03665851 light arm -n03665924 light bulb, lightbulb, bulb, incandescent lamp, electric light, electric-light bulb -n03666238 light circuit, lighting circuit -n03666362 light-emitting diode, LED -n03666591 lighter, light, igniter, ignitor -n03666917 lighter-than-air craft -n03667060 light filter, diffusing screen -n03667235 lighting -n03667552 light machine gun -n03667664 light meter, exposure meter, photometer -n03667829 light microscope -n03668067 lightning rod, lightning conductor -n03668279 light pen, electronic stylus -n03668488 lightship -n03668803 Lilo -n03669245 limber -n03669534 limekiln -n03669886 limiter, clipper -n03670208 limousine, limo -n03671914 linear accelerator, linac -n03672521 linen -n03672827 line printer, line-at-a-time printer -n03673027 liner, ocean liner -n03673270 liner, lining -n03673450 lingerie, intimate apparel -n03673767 lining, liner -n03674270 link, data link -n03674440 linkage -n03674731 Link trainer -n03674842 linocut -n03675076 linoleum knife, linoleum cutter -n03675235 Linotype, Linotype machine -n03675445 linsey-woolsey -n03675558 linstock -n03675907 lion-jaw forceps -n03676087 lip-gloss -n03676483 lipstick, lip rouge -n03676623 liqueur glass -n03676759 liquid crystal display, LCD -n03677115 liquid metal reactor -n03677682 lisle -n03677766 lister, lister plow, lister plough, middlebreaker, middle buster -n03678558 litterbin, litter basket, litter-basket -n03678729 little theater, little theatre -n03678879 live axle, driving axle -n03679384 living quarters, quarters -n03679712 living room, living-room, sitting room, front room, parlor, parlour -n03680248 load -n03680355 Loafer -n03680512 loaner -n03680734 lobe -n03680858 lobster pot -n03680942 local -n03681477 local area network, LAN -n03681813 local oscillator, heterodyne oscillator -n03682380 Lochaber ax -n03682487 lock -n03682877 lock, ignition lock -n03683079 lock, lock chamber -n03683341 lock -n03683457 lockage -n03683606 locker -n03683708 locker room -n03683995 locket -n03684143 lock-gate -n03684224 locking pliers -n03684489 lockring, lock ring, lock washer -n03684611 lockstitch -n03684740 lockup -n03684823 locomotive, engine, locomotive engine, railway locomotive -n03685307 lodge, indian lodge -n03685486 lodge, hunting lodge -n03685640 lodge -n03685820 lodging house, rooming house -n03686130 loft, attic, garret -n03686363 loft, pigeon loft -n03686470 loft -n03686924 log cabin -n03687137 loggia -n03687928 longbow -n03688066 long iron -n03688192 long johns -n03688405 long sleeve -n03688504 long tom -n03688605 long trousers, long pants -n03688707 long underwear, union suit -n03688832 looking glass, glass -n03688943 lookout, observation tower, lookout station, observatory -n03689157 loom -n03689570 loop knot -n03690168 lorgnette -n03690279 Lorraine cross, cross of Lorraine -n03690473 lorry, camion -n03690851 lota -n03690938 lotion -n03691459 loudspeaker, speaker, speaker unit, loudspeaker system, speaker system -n03691817 lounge, waiting room, waiting area -n03692004 lounger -n03692136 lounging jacket, smoking jacket -n03692272 lounging pajama, lounging pyjama -n03692379 loungewear -n03692522 loupe, jeweler's loupe -n03692842 louvered window, jalousie -n03693293 love knot, lovers' knot, lover's knot, true lovers' knot, true lover's knot -n03693474 love seat, loveseat, tete-a-tete, vis-a-vis -n03693707 loving cup -n03693860 lowboy -n03694196 low-pass filter -n03694356 low-warp-loom -n03694639 LP, L-P -n03694761 L-plate -n03694949 lubber's hole -n03695122 lubricating system, force-feed lubricating system, force feed, pressure-feed lubricating system, pressure feed -n03695452 luff -n03695616 lug -n03695753 luge -n03695857 Luger -n03695957 luggage carrier -n03696065 luggage compartment, automobile trunk, trunk -n03696301 luggage rack, roof rack -n03696445 lugger -n03696568 lugsail, lug -n03696746 lug wrench -n03696909 lumberjack, lumber jacket -n03697007 lumbermill, sawmill -n03697366 lunar excursion module, lunar module, LEM -n03697552 lunchroom -n03697812 lunette -n03697913 lungi, lungyi, longyi -n03698123 lunula -n03698226 lusterware -n03698360 lute -n03698604 luxury liner, express luxury liner -n03698723 lyceum -n03698815 lychgate, lichgate -n03699280 lyre -n03699591 machete, matchet, panga -n03699754 machicolation -n03699975 machine -n03700963 machine, simple machine -n03701191 machine bolt -n03701391 machine gun -n03701640 machinery -n03701790 machine screw -n03702248 machine tool -n03702440 machinist's vise, metalworking vise -n03702582 machmeter -n03703075 mackinaw -n03703203 mackinaw, Mackinaw boat -n03703463 mackinaw, Mackinaw coat -n03703590 mackintosh, macintosh -n03703730 macrame -n03703862 madras -n03703945 Mae West, air jacket -n03704549 magazine rack -n03704834 magic lantern -n03705379 magnet -n03705808 magnetic bottle -n03706229 magnetic compass -n03706415 magnetic core memory, core memory -n03706653 magnetic disk, magnetic disc, disk, disc -n03706939 magnetic head -n03707171 magnetic mine -n03707372 magnetic needle -n03707597 magnetic recorder -n03707766 magnetic stripe -n03708036 magnetic tape, mag tape, tape -n03708425 magneto, magnetoelectric machine -n03708843 magnetometer, gaussmeter -n03708962 magnetron -n03709206 magnifier -n03709363 magnum -n03709545 magnus hitch -n03709644 mail -n03709823 mailbag, postbag -n03709960 mailbag, mail pouch -n03710079 mailboat, mail boat, packet, packet boat -n03710193 mailbox, letter box -n03710294 mail car -n03710421 maildrop -n03710528 mailer -n03710637 maillot -n03710721 maillot, tank suit -n03710937 mailsorter -n03711044 mail train -n03711711 mainframe, mainframe computer -n03711999 mainmast -n03712111 main rotor -n03712337 mainsail -n03712444 mainspring -n03712887 main-topmast -n03712981 main-topsail -n03713069 main yard -n03713151 maisonette, maisonnette -n03713436 majolica, maiolica -n03714235 makeup, make-up, war paint -n03715114 Maksutov telescope -n03715275 malacca, malacca cane -n03715386 mallet, beetle -n03715669 mallet, hammer -n03715892 mallet -n03716228 mammogram -n03716887 mandola -n03716966 mandolin -n03717131 manger, trough -n03717285 mangle -n03717447 manhole -n03717622 manhole cover -n03718212 man-of-war, ship of the line -n03718335 manometer -n03718458 manor, manor house -n03718581 manor hall, hall -n03718699 MANPAD -n03718789 mansard, mansard roof -n03718935 manse -n03719053 mansion, mansion house, manse, hall, residence -n03719343 mantel, mantelpiece, mantle, mantlepiece, chimneypiece -n03719560 mantelet, mantilla -n03719743 mantilla -n03720005 Mao jacket -n03720163 map -n03720665 maquiladora -n03720891 maraca -n03721047 marble -n03721252 marching order -n03721384 marimba, xylophone -n03721590 marina -n03722007 marker -n03722288 marketplace, market place, mart, market -n03722646 marlinespike, marlinspike, marlingspike -n03722944 marocain, crepe marocain -n03723153 marquee, marquise -n03723267 marquetry, marqueterie -n03723439 marriage bed -n03723781 martello tower -n03723885 martingale -n03724066 mascara -n03724176 maser -n03724417 masher -n03724538 mashie, five iron -n03724623 mashie niblick, seven iron -n03724756 masjid, musjid -n03724870 mask -n03725035 mask -n03725506 Masonite -n03725600 Mason jar -n03725717 masonry -n03725869 mason's level -n03726116 massage parlor -n03726233 massage parlor -n03726371 mass spectrograph -n03726516 mass spectrometer, spectrometer -n03726760 mast -n03726993 mast -n03727067 mastaba, mastabah -n03727465 master bedroom -n03727605 masterpiece, chef-d'oeuvre -n03727837 mat -n03727946 mat, gym mat -n03728437 match, lucifer, friction match -n03728982 match -n03729131 matchboard -n03729308 matchbook -n03729402 matchbox -n03729482 matchlock -n03729647 match plane, tonguing and grooving plane -n03729826 matchstick -n03729951 material -n03730153 materiel, equipage -n03730334 maternity hospital -n03730494 maternity ward -n03730655 matrix -n03730788 Matthew Walker, Matthew Walker knot -n03730893 matting -n03731019 mattock -n03731483 mattress cover -n03731695 maul, sledge, sledgehammer -n03731882 maulstick, mahlstick -n03732020 Mauser -n03732114 mausoleum -n03732458 maxi -n03732543 Maxim gun -n03732658 maximum and minimum thermometer -n03733131 maypole -n03733281 maze, labyrinth -n03733465 mazer -n03733547 means -n03733644 measure -n03733805 measuring cup -n03733925 measuring instrument, measuring system, measuring device -n03735637 measuring stick, measure, measuring rod -n03735963 meat counter -n03736064 meat grinder -n03736147 meat hook -n03736269 meat house -n03736372 meat safe -n03736470 meat thermometer -n03736970 mechanical device -n03738066 mechanical piano, Pianola, player piano -n03738241 mechanical system -n03738472 mechanism -n03739518 medical building, health facility, healthcare facility -n03739693 medical instrument -n03742019 medicine ball -n03742115 medicine chest, medicine cabinet -n03742238 MEDLINE -n03743016 megalith, megalithic structure -n03743279 megaphone -n03743902 memorial, monument -n03744276 memory, computer memory, storage, computer storage, store, memory board -n03744684 memory chip -n03744840 memory device, storage device -n03745146 menagerie, zoo, zoological garden -n03745487 mending -n03745571 menhir, standing stone -n03746005 menorah -n03746155 Menorah -n03746330 man's clothing -n03746486 men's room, men's -n03748162 mercantile establishment, retail store, sales outlet, outlet -n03749504 mercury barometer -n03749634 mercury cell -n03749807 mercury thermometer, mercury-in-glass thermometer -n03750206 mercury-vapor lamp -n03750437 mercy seat -n03750614 merlon -n03751065 mess, mess hall -n03751269 mess jacket, monkey jacket, shell jacket -n03751458 mess kit -n03751590 messuage -n03751757 metal detector -n03752071 metallic -n03752185 metal screw -n03752398 metal wood -n03752922 meteorological balloon -n03753077 meter -n03753514 meterstick, metrestick -n03757604 metronome -n03758089 mezzanine, mezzanine floor, entresol -n03758220 mezzanine, first balcony -n03758894 microbalance -n03758992 microbrewery -n03759243 microfiche -n03759432 microfilm -n03759661 micrometer, micrometer gauge, micrometer caliper -n03759954 microphone, mike -n03760310 microprocessor -n03760671 microscope -n03760944 microtome -n03761084 microwave, microwave oven -n03761588 microwave diathermy machine -n03761731 microwave linear accelerator -n03762238 middy, middy blouse -n03762332 midiron, two iron -n03762434 mihrab -n03762602 mihrab -n03762982 military hospital -n03763727 military quarters -n03763968 military uniform -n03764276 military vehicle -n03764606 milk bar -n03764736 milk can -n03764822 milk float -n03764995 milking machine -n03765128 milking stool -n03765467 milk wagon, milkwagon -n03765561 mill, grinder, milling machinery -n03765934 milldam -n03766044 miller, milling machine -n03766218 milliammeter -n03766322 millinery, woman's hat -n03766508 millinery, hat shop -n03766600 milling -n03766697 millivoltmeter -n03766935 millstone -n03767112 millstone -n03767203 millwheel, mill wheel -n03767459 mimeograph, mimeo, mimeograph machine, Roneo, Roneograph -n03767745 minaret -n03767966 mincer, mincing machine -n03768132 mine -n03768683 mine detector -n03768823 minelayer -n03768916 mineshaft -n03769610 minibar, cellaret -n03769722 minibike, motorbike -n03769881 minibus -n03770085 minicar -n03770224 minicomputer -n03770316 ministry -n03770439 miniskirt, mini -n03770520 minisub, minisubmarine -n03770679 minivan -n03770834 miniver -n03770954 mink, mink coat -n03772077 minster -n03772269 mint -n03772584 minute hand, big hand -n03772674 Minuteman -n03773035 mirror -n03773504 missile -n03773835 missile defense system, missile defence system -n03774327 miter box, mitre box -n03774461 miter joint, mitre joint, miter, mitre -n03775071 mitten -n03775199 mixer -n03775388 mixer -n03775546 mixing bowl -n03775636 mixing faucet -n03775747 mizzen, mizen -n03775847 mizzenmast, mizenmast, mizzen, mizen -n03776167 mobcap -n03776460 mobile home, manufactured home -n03776877 moccasin, mocassin -n03776997 mock-up -n03777126 mod con -n03777568 Model T -n03777754 modem -n03778459 modillion -n03778817 module -n03779000 module -n03779128 mohair -n03779246 moire, watered-silk -n03779370 mold, mould, cast -n03779884 moldboard, mouldboard -n03780047 moldboard plow, mouldboard plough -n03780799 moleskin -n03781055 Molotov cocktail, petrol bomb, gasoline bomb -n03781244 monastery -n03781467 monastic habit -n03781594 moneybag -n03781683 money belt -n03781787 monitor -n03782006 monitor -n03782190 monitor, monitoring device -n03782794 monkey-wrench, monkey wrench -n03782929 monk's cloth -n03783304 monochrome -n03783430 monocle, eyeglass -n03783575 monofocal lens implant, monofocal IOL -n03783873 monoplane -n03784139 monotype -n03784270 monstrance, ostensorium -n03784793 mooring tower, mooring mast -n03784896 Moorish arch, horseshoe arch -n03785016 moped -n03785142 mop handle -n03785237 moquette -n03785499 morgue, mortuary, dead room -n03785721 morion, cabasset -n03786096 morning dress -n03786194 morning dress -n03786313 morning room -n03786621 Morris chair -n03786715 mortar, howitzer, trench mortar -n03786901 mortar -n03787032 mortarboard -n03787523 mortise joint, mortise-and-tenon joint -n03788047 mosaic -n03788195 mosque -n03788365 mosquito net -n03788498 motel -n03788601 motel room -n03788914 Mother Hubbard, muumuu -n03789171 motion-picture camera, movie camera, cine-camera -n03789400 motion-picture film, movie film, cine-film -n03789603 motley -n03789794 motley -n03789946 motor -n03790230 motorboat, powerboat -n03790512 motorcycle, bike -n03790755 motor hotel, motor inn, motor lodge, tourist court, court -n03790953 motorized wheelchair -n03791053 motor scooter, scooter -n03791235 motor vehicle, automotive vehicle -n03792048 mound, hill -n03792334 mound, hill, pitcher's mound -n03792526 mount, setting -n03792782 mountain bike, all-terrain bike, off-roader -n03792972 mountain tent -n03793489 mouse, computer mouse -n03793850 mouse button -n03794056 mousetrap -n03794136 mousse, hair mousse, hair gel -n03794798 mouthpiece, embouchure -n03795123 mouthpiece -n03795269 mouthpiece, gumshield -n03795758 movement -n03795976 movie projector, cine projector, film projector -n03796181 moving-coil galvanometer -n03796401 moving van -n03796522 mud brick -n03796605 mudguard, splash guard, splash-guard -n03796848 mudhif -n03796974 muff -n03797062 muffle -n03797182 muffler -n03797264 mufti -n03797390 mug -n03797896 mulch -n03798061 mule, scuff -n03798442 multichannel recorder -n03798610 multiengine airplane, multiengine plane -n03798982 multiplex -n03799113 multiplexer -n03799240 multiprocessor -n03799375 multistage rocket, step rocket -n03799610 munition, ordnance, ordnance store -n03799876 Murphy bed -n03800371 musette, shepherd's pipe -n03800485 musette pipe -n03800563 museum -n03800772 mushroom anchor -n03800933 musical instrument, instrument -n03801353 music box, musical box -n03801533 music hall, vaudeville theater, vaudeville theatre -n03801671 music school -n03801760 music stand, music rack -n03801880 music stool, piano stool -n03802007 musket -n03802228 musket ball, ball -n03802393 muslin -n03802643 mustache cup, moustache cup -n03802800 mustard plaster, sinapism -n03802973 mute -n03803116 muzzle loader -n03803284 muzzle -n03803780 myelogram -n03804211 nacelle -n03804744 nail -n03805180 nailbrush -n03805280 nailfile -n03805374 nailhead -n03805503 nailhead -n03805725 nail polish, nail enamel, nail varnish -n03805933 nainsook -n03807334 Napier's bones, Napier's rods -n03809211 nard, spikenard -n03809312 narrowbody aircraft, narrow-body aircraft, narrow-body -n03809603 narrow wale -n03809686 narthex -n03809802 narthex -n03810412 nasotracheal tube -n03810952 national monument -n03811295 nautilus, nuclear submarine, nuclear-powered submarine -n03811444 navigational system -n03811847 naval equipment -n03811965 naval gun -n03812263 naval missile -n03812382 naval radar -n03812789 naval tactical data system -n03812924 naval weaponry -n03813078 nave -n03813176 navigational instrument -n03813946 nebuchadnezzar -n03814528 neckband -n03814639 neck brace -n03814727 neckcloth, stock -n03814817 neckerchief -n03814906 necklace -n03815149 necklet -n03815278 neckline -n03815482 neckpiece -n03815615 necktie, tie -n03816005 neckwear -n03816136 needle -n03816394 needle -n03816530 needlenose pliers -n03816849 needlework, needlecraft -n03817191 negative -n03817331 negative magnetic pole, negative pole, south-seeking pole -n03817522 negative pole -n03817647 negligee, neglige, peignoir, wrapper, housecoat -n03818001 neolith -n03818343 neon lamp, neon induction lamp, neon tube -n03819047 nephoscope -n03819336 nest -n03819448 nest egg -n03819595 net, network, mesh, meshing, meshwork -n03819994 net -n03820154 net -n03820318 net -n03820728 network, electronic network -n03820950 network -n03821145 neutron bomb -n03821424 newel -n03821518 newel post, newel -n03822171 newspaper, paper -n03822361 newsroom -n03822504 newsroom -n03822656 newsstand -n03822767 Newtonian telescope, Newtonian reflector -n03823111 nib, pen nib -n03823216 niblick, nine iron -n03823312 nicad, nickel-cadmium accumulator -n03823673 nickel-iron battery, nickel-iron accumulator -n03823906 Nicol prism -n03824197 night bell -n03824284 nightcap -n03824381 nightgown, gown, nightie, night-robe, nightdress -n03824589 night latch -n03824713 night-light -n03824999 nightshirt -n03825080 nightwear, sleepwear, nightclothes -n03825271 ninepin, skittle, skittle pin -n03825442 ninepin ball, skittle ball -n03825673 ninon -n03825788 nipple -n03825913 nipple shield -n03826039 niqab -n03826186 Nissen hut, Quonset hut -n03827420 nogging -n03827536 noisemaker -n03828020 nonsmoker, nonsmoking car -n03829340 non-volatile storage, nonvolatile storage -n03829857 Norfolk jacket -n03829954 noria -n03831203 nosebag, feedbag -n03831382 noseband, nosepiece -n03831757 nose flute -n03832144 nosewheel -n03832673 notebook, notebook computer -n03833907 nuclear-powered ship -n03834040 nuclear reactor, reactor -n03834472 nuclear rocket -n03834604 nuclear weapon, atomic weapon -n03835197 nude, nude painting -n03835729 numdah, numdah rug, nammad -n03835941 nun's habit -n03836062 nursery, baby's room -n03836451 nut and bolt -n03836602 nutcracker -n03836906 nylon -n03836976 nylons, nylon stocking, rayons, rayon stocking, silk stocking -n03837422 oar -n03837606 oast -n03837698 oast house -n03837869 obelisk -n03838024 object ball -n03838298 objective, objective lens, object lens, object glass -n03838748 oblique bandage -n03838899 oboe, hautboy, hautbois -n03839172 oboe da caccia -n03839276 oboe d'amore -n03839424 observation dome -n03839671 observatory -n03839795 obstacle -n03840327 obturator -n03840681 ocarina, sweet potato -n03840823 octant -n03841011 odd-leg caliper -n03841143 odometer, hodometer, mileometer, milometer -n03841290 oeil de boeuf -n03841666 office, business office -n03842012 office building, office block -n03842156 office furniture -n03842276 officer's mess -n03842377 off-line equipment, auxiliary equipment -n03842585 ogee, cyma reversa -n03842754 ogee arch, keel arch -n03842986 ohmmeter -n03843092 oil, oil color, oil colour -n03843316 oilcan -n03843438 oilcloth -n03843555 oil filter -n03843883 oil heater, oilstove, kerosene heater, kerosine heater -n03844045 oil lamp, kerosene lamp, kerosine lamp -n03844233 oil paint -n03844550 oil pump -n03844673 oil refinery, petroleum refinery -n03844815 oilskin, slicker -n03844965 oil slick -n03845107 oilstone -n03845190 oil tanker, oiler, tanker, tank ship -n03845990 old school tie -n03846100 olive drab -n03846234 olive drab, olive-drab uniform -n03846431 Olympian Zeus -n03846677 omelet pan, omelette pan -n03846772 omnidirectional antenna, nondirectional antenna -n03846970 omnirange, omnidirectional range, omnidirectional radio range -n03847471 onion dome -n03847823 open-air market, open-air marketplace, market square -n03848033 open circuit -n03848168 open-end wrench, tappet wrench -n03848348 opener -n03848537 open-hearth furnace -n03849275 openside plane, rabbet plane -n03849412 open sight -n03849679 openwork -n03849814 opera, opera house -n03849943 opera cloak, opera hood -n03850053 operating microscope -n03850245 operating room, OR, operating theater, operating theatre, surgery -n03850492 operating table -n03850613 ophthalmoscope -n03851341 optical device -n03851787 optical disk, optical disc -n03852280 optical instrument -n03852544 optical pyrometer, pyroscope -n03852688 optical telescope -n03853291 orchestra pit, pit -n03853924 ordinary, ordinary bicycle -n03854065 organ, pipe organ -n03854421 organdy, organdie -n03854506 organic light-emitting diode, OLED -n03854722 organ loft -n03854815 organ pipe, pipe, pipework -n03855214 organza -n03855333 oriel, oriel window -n03855464 oriflamme -n03855604 O ring -n03855756 Orlon -n03855908 orlop deck, orlop, fourth deck -n03856012 orphanage, orphans' asylum -n03856335 orphrey -n03856465 orrery -n03856728 orthicon, image orthicon -n03857026 orthochromatic film -n03857156 orthopter, ornithopter -n03857291 orthoscope -n03857687 oscillograph -n03857828 oscilloscope, scope, cathode-ray oscilloscope, CRO -n03858085 ossuary -n03858183 otoscope, auriscope, auroscope -n03858418 ottoman, pouf, pouffe, puff, hassock -n03858533 oubliette -n03858837 out-basket, out-tray -n03859000 outboard motor, outboard -n03859170 outboard motorboat, outboard -n03859280 outbuilding -n03859495 outerwear, overclothes -n03859608 outfall -n03859958 outfit, getup, rig, turnout -n03860234 outfitter -n03860404 outhouse, privy, earth-closet, jakes -n03861048 output device -n03861271 outrigger -n03861430 outrigger canoe -n03861596 outside caliper -n03861842 outside mirror -n03862379 outwork -n03862676 oven -n03862862 oven thermometer -n03863108 overall -n03863262 overall, boilersuit, boilers suit -n03863657 overcoat, overcoating -n03863783 overdrive -n03863923 overgarment, outer garment -n03864139 overhand knot -n03864356 overhang -n03864692 overhead projector -n03865288 overmantel -n03865371 overnighter, overnight bag, overnight case -n03865557 overpass, flyover -n03865820 override -n03865949 overshoe -n03866082 overskirt -n03867854 oxbow -n03868044 Oxbridge -n03868242 oxcart -n03868324 oxeye -n03868406 oxford -n03868643 oximeter -n03868763 oxyacetylene torch -n03868863 oxygen mask -n03869838 oyster bar -n03869976 oyster bed, oyster bank, oyster park -n03870105 pace car -n03870290 pacemaker, artificial pacemaker -n03870546 pack -n03870672 pack -n03870980 pack, face pack -n03871083 package, parcel -n03871371 package store, liquor store, off-licence -n03871524 packaging -n03871628 packet -n03871724 packing box, packing case -n03871860 packinghouse, packing plant -n03872016 packinghouse -n03872167 packing needle -n03872273 packsaddle -n03873416 paddle, boat paddle -n03873699 paddle -n03873848 paddle -n03873996 paddle box, paddle-box -n03874138 paddle steamer, paddle-wheeler -n03874293 paddlewheel, paddle wheel -n03874487 paddock -n03874599 padlock -n03874823 page printer, page-at-a-time printer -n03875218 paint, pigment -n03875806 paintball -n03875955 paintball gun -n03876111 paintbox -n03876231 paintbrush -n03877351 paisley -n03877472 pajama, pyjama, pj's, jammies -n03877674 pajama, pyjama -n03877845 palace -n03878066 palace, castle -n03878211 palace -n03878294 palanquin, palankeen -n03878418 paleolith -n03878511 palestra, palaestra -n03878674 palette, pallet -n03878828 palette knife -n03878963 palisade -n03879456 pallet -n03879705 pallette, palette -n03880032 pallium -n03880129 pallium -n03880323 pan -n03880531 pan, cooking pan -n03881305 pancake turner -n03881404 panchromatic film -n03881534 panda car -n03882611 paneling, panelling, pane -n03882960 panhandle -n03883054 panic button -n03883385 pannier -n03883524 pannier -n03883664 pannikin -n03883773 panopticon -n03883944 panopticon -n03884397 panpipe, pandean pipe, syrinx -n03884554 pantaloon -n03884639 pantechnicon -n03884778 pantheon -n03884926 pantheon -n03885028 pantie, panty, scanty, step-in -n03885194 panting, trousering -n03885293 pant leg, trouser leg -n03885410 pantograph -n03885535 pantry, larder, buttery -n03885669 pants suit, pantsuit -n03885788 panty girdle -n03885904 pantyhose -n03886053 panzer -n03886641 paper chain -n03886762 paper clip, paperclip, gem clip -n03886940 paper cutter -n03887185 paper fastener -n03887330 paper feed -n03887512 paper mill -n03887697 paper towel -n03887899 parabolic mirror -n03888022 parabolic reflector, paraboloid reflector -n03888257 parachute, chute -n03888605 parallel bars, bars -n03888808 parallel circuit, shunt circuit -n03888998 parallel interface, parallel port -n03889397 parang -n03889503 parapet, breastwork -n03889626 parapet -n03889726 parasail -n03889871 parasol, sunshade -n03890093 parer, paring knife -n03890233 parfait glass -n03890358 pargeting, pargetting, pargetry -n03890514 pari-mutuel machine, totalizer, totaliser, totalizator, totalisator -n03891051 parka, windbreaker, windcheater, anorak -n03891251 park bench -n03891332 parking meter -n03891538 parlor, parlour -n03892178 parquet, parquet floor -n03892425 parquetry, parqueterie -n03892557 parsonage, vicarage, rectory -n03892728 Parsons table -n03893935 partial denture -n03894051 particle detector -n03894379 partition, divider -n03894677 parts bin -n03894933 party line -n03895038 party wall -n03895170 parvis -n03895866 passenger car, coach, carriage -n03896103 passenger ship -n03896233 passenger train -n03896419 passenger van -n03896526 passe-partout -n03896628 passive matrix display -n03896984 passkey, passe-partout, master key, master -n03897130 pass-through -n03897634 pastry cart -n03897943 patch -n03898129 patchcord -n03898271 patchouli, patchouly, pachouli -n03898395 patch pocket -n03898633 patchwork, patchwork quilt -n03898787 patent log, screw log, taffrail log -n03899100 paternoster -n03899612 patina -n03899768 patio, terrace -n03899933 patisserie -n03900028 patka -n03900194 patrol boat, patrol ship -n03900301 patty-pan -n03900393 pave -n03900979 pavilion, marquee -n03901229 pavior, paviour, paving machine -n03901338 pavis, pavise -n03901750 pawn -n03901974 pawnbroker's shop, pawnshop, loan office -n03902125 pay-phone, pay-station -n03902220 PC board -n03902482 peach orchard -n03902756 pea jacket, peacoat -n03903133 peavey, peavy, cant dog, dog hook -n03903290 pectoral, pectoral medallion -n03903424 pedal, treadle, foot pedal, foot lever -n03903733 pedal pusher, toreador pants -n03903868 pedestal, plinth, footstall -n03904060 pedestal table -n03904183 pedestrian crossing, zebra crossing -n03904433 pedicab, cycle rickshaw -n03904657 pediment -n03904782 pedometer -n03904909 peeler -n03905361 peep sight -n03905540 peg, nog -n03905730 peg, pin, thole, tholepin, rowlock, oarlock -n03905947 peg -n03906106 peg, wooden leg, leg, pegleg -n03906224 pegboard -n03906463 Pelham -n03906590 pelican crossing -n03906789 pelisse -n03906894 pelvimeter -n03906997 pen -n03907475 penal colony -n03907654 penal institution, penal facility -n03907908 penalty box -n03908111 pen-and-ink -n03908204 pencil -n03908456 pencil -n03908618 pencil box, pencil case -n03908714 pencil sharpener -n03909020 pendant earring, drop earring, eardrop -n03909160 pendulum -n03909406 pendulum clock -n03909516 pendulum watch -n03909658 penetration bomb -n03911406 penile implant -n03911513 penitentiary, pen -n03911658 penknife -n03911767 penlight -n03911866 pennant, pennon, streamer, waft -n03912218 pennywhistle, tin whistle, whistle -n03912821 penthouse -n03913343 pentode -n03913930 peplos, peplus, peplum -n03914106 peplum -n03914337 pepper mill, pepper grinder -n03914438 pepper shaker, pepper box, pepper pot -n03914583 pepper spray -n03914831 percale -n03915118 percolator -n03915320 percussion cap -n03915437 percussion instrument, percussive instrument -n03915900 perforation -n03916031 perfume, essence -n03916289 perfumery -n03916385 perfumery -n03916470 perfumery -n03916720 peripheral, computer peripheral, peripheral device -n03917048 periscope -n03917198 peristyle -n03917327 periwig, peruke -n03917814 permanent press, durable press -n03918074 perpetual motion machine -n03918480 personal computer, PC, microcomputer -n03918737 personal digital assistant, PDA, personal organizer, personal organiser, organizer, organiser -n03919096 personnel carrier -n03919289 pestle -n03919430 pestle, muller, pounder -n03919808 petcock -n03920288 Petri dish -n03920384 petrolatum gauze -n03920641 pet shop -n03920737 petticoat, half-slip, underskirt -n03920867 pew, church bench -n03923379 phial, vial, ampule, ampul, ampoule -n03923564 Phillips screw -n03923692 Phillips screwdriver -n03923918 phonograph needle, needle -n03924069 phonograph record, phonograph recording, record, disk, disc, platter -n03924407 photocathode -n03924532 photocoagulator -n03924679 photocopier -n03926148 photographic equipment -n03926412 photographic paper, photographic material -n03926876 photometer -n03927091 photomicrograph -n03927299 Photostat, Photostat machine -n03927539 photostat -n03927792 physical pendulum, compound pendulum -n03928116 piano, pianoforte, forte-piano -n03928589 piano action -n03928814 piano keyboard, fingerboard, clavier -n03928994 piano wire -n03929091 piccolo -n03929202 pick, pickax, pickaxe -n03929443 pick -n03929660 pick, plectrum, plectron -n03929855 pickelhaube -n03930229 picket boat -n03930313 picket fence, paling -n03930431 picket ship -n03930515 pickle barrel -n03930630 pickup, pickup truck -n03931765 picture frame -n03931885 picture hat -n03931980 picture rail -n03932080 picture window -n03932670 piece of cloth, piece of material -n03933391 pied-a-terre -n03933933 pier -n03934042 pier -n03934229 pier arch -n03934311 pier glass, pier mirror -n03934565 pier table -n03934656 pieta -n03934890 piezometer -n03935116 pig bed, pig -n03935234 piggery, pig farm -n03935335 piggy bank, penny bank -n03935883 pilaster -n03936269 pile, spile, piling, stilt -n03936466 pile driver -n03937543 pill bottle -n03937835 pillbox, toque, turban -n03937931 pillion -n03938037 pillory -n03938244 pillow -n03938401 pillow block -n03938522 pillow lace, bobbin lace -n03938725 pillow sham -n03939062 pilot bit -n03939178 pilot boat -n03939281 pilot burner, pilot light, pilot -n03939440 pilot cloth -n03939565 pilot engine -n03939677 pilothouse, wheelhouse -n03939844 pilot light, pilot lamp, indicator lamp -n03940256 pin -n03940894 pin, flag -n03941013 pin, pin tumbler -n03941231 pinata -n03941417 pinball machine, pin table -n03941586 pince-nez -n03941684 pincer, pair of pincers, tweezer, pair of tweezers -n03941887 pinch bar -n03942028 pincurl clip -n03942600 pinfold -n03942813 ping-pong ball -n03942920 pinhead -n03943115 pinion -n03943266 pinnacle -n03943623 pinprick -n03943714 pinstripe -n03943833 pinstripe -n03943920 pinstripe -n03944024 pintle -n03944138 pinwheel, pinwheel wind collector -n03944341 pinwheel -n03945459 tabor pipe -n03945615 pipe -n03945817 pipe bomb -n03945928 pipe cleaner -n03946076 pipe cutter -n03946162 pipefitting, pipe fitting -n03947111 pipet, pipette -n03947343 pipe vise, pipe clamp -n03947466 pipe wrench, tube wrench -n03947798 pique -n03947888 pirate, pirate ship -n03948242 piste -n03948459 pistol, handgun, side arm, shooting iron -n03948830 pistol grip -n03948950 piston, plunger -n03949145 piston ring -n03949317 piston rod -n03949761 pit -n03950228 pitcher, ewer -n03950359 pitchfork -n03950537 pitching wedge -n03950647 pitch pipe -n03950899 pith hat, pith helmet, sun helmet, topee, topi -n03951068 piton -n03951213 Pitot-static tube, Pitot head, Pitot tube -n03951453 Pitot tube, Pitot -n03951800 pitsaw -n03951971 pivot, pin -n03952150 pivoting window -n03952576 pizzeria, pizza shop, pizza parlor -n03953020 place of business, business establishment -n03953416 place of worship, house of prayer, house of God, house of worship -n03953901 placket -n03954393 planchet, coin blank -n03954731 plane, carpenter's plane, woodworking plane -n03955296 plane, planer, planing machine -n03955489 plane seat -n03955809 planetarium -n03955941 planetarium -n03956157 planetarium -n03956331 planetary gear, epicyclic gear, planet wheel, planet gear -n03956531 plank-bed -n03956623 planking -n03956785 planner -n03956922 plant, works, industrial plant -n03957315 planter -n03957420 plaster, adhesive plaster, sticking plaster -n03957762 plasterboard, gypsum board -n03957991 plastering trowel -n03958227 plastic bag -n03958338 plastic bomb -n03958630 plastic laminate -n03958752 plastic wrap -n03959014 plastron -n03959123 plastron -n03959227 plastron -n03959701 plate, scale, shell -n03960374 plate, collection plate -n03960490 plate -n03961394 platen -n03961630 platen -n03961711 plate rack -n03961828 plate rail -n03961939 platform -n03962525 platform, weapons platform -n03962685 platform -n03962852 platform bed -n03962932 platform rocker -n03963028 plating, metal plating -n03963198 platter -n03963294 playback -n03963483 playbox, play-box -n03963645 playground -n03964495 playpen, pen -n03964611 playsuit -n03965456 plaza, mall, center, shopping mall, shopping center, shopping centre -n03965907 pleat, plait -n03966206 plenum -n03966325 plethysmograph -n03966582 pleximeter, plessimeter -n03966751 plexor, plessor, percussor -n03966976 pliers, pair of pliers, plyers -n03967270 plimsoll -n03967396 plotter -n03967562 plow, plough -n03967942 plug, stopper, stopple -n03968293 plug, male plug -n03968479 plug fuse -n03968581 plughole -n03968728 plumb bob, plumb, plummet -n03969510 plumb level -n03970156 plunger, plumber's helper -n03970363 plus fours -n03970546 plush -n03971218 plywood, plyboard -n03971321 pneumatic drill -n03971960 p-n junction -n03972146 p-n-p transistor -n03972372 poacher -n03972524 pocket -n03973003 pocket battleship -n03973285 pocketcomb, pocket comb -n03973402 pocket flap -n03973520 pocket-handkerchief -n03973628 pocketknife, pocket knife -n03973839 pocket watch -n03973945 pod, fuel pod -n03974070 pogo stick -n03974915 point-and-shoot camera -n03975035 pointed arch -n03975657 pointing trowel -n03975788 point lace, needlepoint -n03975926 poker, stove poker, fire hook, salamander -n03976105 polarimeter, polariscope -n03976268 Polaroid -n03976467 Polaroid camera, Polaroid Land camera -n03976657 pole -n03977158 pole -n03977266 poleax, poleaxe -n03977430 poleax, poleaxe -n03977592 police boat -n03977966 police van, police wagon, paddy wagon, patrol wagon, wagon, black Maria -n03978421 polling booth -n03978575 polo ball -n03978686 polo mallet, polo stick -n03978815 polonaise -n03978966 polo shirt, sport shirt -n03979377 polyester -n03979492 polygraph -n03980026 pomade, pomatum -n03980478 pommel horse, side horse -n03980874 poncho -n03980986 pongee -n03981094 poniard, bodkin -n03981340 pontifical -n03981566 pontoon -n03981760 pontoon bridge, bateau bridge, floating bridge -n03981924 pony cart, ponycart, donkey cart, tub-cart -n03982232 pool ball -n03982331 poolroom -n03982430 pool table, billiard table, snooker table -n03982642 poop deck -n03982767 poor box, alms box, mite box -n03982895 poorhouse -n03983396 pop bottle, soda bottle -n03983499 popgun -n03983612 poplin -n03983712 popper -n03983928 poppet, poppet valve -n03984125 pop tent -n03984234 porcelain -n03984381 porch -n03984643 porkpie, porkpie hat -n03984759 porringer -n03985069 portable -n03985232 portable computer -n03985441 portable circular saw, portable saw -n03985881 portcullis -n03986071 porte-cochere -n03986224 porte-cochere -n03986355 portfolio -n03986562 porthole -n03986704 portico -n03986857 portiere -n03986949 portmanteau, Gladstone, Gladstone bag -n03987266 portrait camera -n03987376 portrait lens -n03987674 positive pole, positive magnetic pole, north-seeking pole -n03987865 positive pole -n03987990 positron emission tomography scanner, PET scanner -n03988170 post -n03988758 postage meter -n03988926 post and lintel -n03989199 post chaise -n03989349 postern -n03989447 post exchange, PX -n03989665 posthole digger, post-hole digger -n03989777 post horn -n03989898 posthouse, post house -n03990474 pot -n03991062 pot, flowerpot -n03991202 potbelly, potbelly stove -n03991321 Potemkin village -n03991443 potential divider, voltage divider -n03991646 potentiometer, pot -n03991837 potentiometer -n03992325 potpourri -n03992436 potsherd -n03992509 potter's wheel -n03992703 pottery, clayware -n03992975 pottle -n03993053 potty seat, potty chair -n03993180 pouch -n03993403 poultice, cataplasm, plaster -n03993703 pound, dog pound -n03993878 pound net -n03994008 powder -n03994297 powder and shot -n03994417 powdered mustard, dry mustard -n03994614 powder horn, powder flask -n03994757 powder keg -n03995018 power brake -n03995265 power cord -n03995372 power drill -n03995535 power line, power cable -n03995661 power loom -n03995856 power mower, motor mower -n03996004 power pack -n03996145 power saw, saw, sawing machine -n03996416 power shovel, excavator, digger, shovel -n03996849 power steering, power-assisted steering -n03997274 power takeoff, PTO -n03997484 power tool -n03997875 praetorium, pretorium -n03998194 prayer rug, prayer mat -n03998333 prayer shawl, tallith, tallis -n03998673 precipitator, electrostatic precipitator, Cottrell precipitator -n03999064 prefab -n03999160 presbytery -n03999621 presence chamber -n03999992 press, mechanical press -n04000311 press, printing press -n04000480 press -n04000592 press box -n04000716 press gallery -n04000998 press of sail, press of canvas -n04001132 pressure cabin -n04001265 pressure cooker -n04001397 pressure dome -n04001499 pressure gauge, pressure gage -n04001661 pressurized water reactor, PWR -n04001845 pressure suit -n04002262 pricket -n04002371 prie-dieu -n04002629 primary coil, primary winding, primary -n04003241 Primus stove, Primus -n04003359 Prince Albert -n04003856 print -n04004099 print buffer -n04004210 printed circuit -n04004475 printer, printing machine -n04004767 printer -n04004990 printer cable -n04005197 priory -n04005630 prison, prison house -n04005912 prison camp, internment camp, prisoner of war camp, POW camp -n04006067 privateer -n04006227 private line -n04006330 privet hedge -n04006411 probe -n04007415 proctoscope -n04007664 prod, goad -n04008385 production line, assembly line, line -n04008634 projectile, missile -n04009552 projector -n04009801 projector -n04009923 prolonge -n04010057 prolonge knot, sailor's breastplate -n04010779 prompter, autocue -n04010927 prong -n04011827 propeller, propellor -n04012084 propeller plane -n04012482 propjet, turboprop, turbo-propeller plane -n04012665 proportional counter tube, proportional counter -n04013060 propulsion system -n04013176 proscenium, proscenium wall -n04013600 proscenium arch -n04013729 prosthesis, prosthetic device -n04014297 protective covering, protective cover, protection -n04015204 protective garment -n04015786 proton accelerator -n04015908 protractor -n04016240 pruner, pruning hook, lopper -n04016479 pruning knife -n04016576 pruning saw -n04016684 pruning shears -n04016846 psaltery -n04017571 psychrometer -n04017807 PT boat, mosquito boat, mosquito craft, motor torpedo boat -n04018155 public address system, P.A. system, PA system, P.A., PA -n04018399 public house, pub, saloon, pothouse, gin mill, taphouse -n04018667 public toilet, comfort station, public convenience, convenience, public lavatory, restroom, toilet facility, wash room -n04019101 public transport -n04019335 public works -n04019541 puck, hockey puck -n04019696 pull -n04019881 pullback, tieback -n04020087 pull chain -n04020298 pulley, pulley-block, pulley block, block -n04020744 pull-off, rest area, rest stop, layby, lay-by -n04020912 Pullman, Pullman car -n04021028 pullover, slipover -n04021164 pull-through -n04021362 pulse counter -n04021503 pulse generator -n04021704 pulse timing circuit -n04021798 pump -n04022332 pump -n04022434 pump action, slide action -n04022708 pump house, pumping station -n04022866 pump room -n04023021 pump-type pliers -n04023119 pump well -n04023249 punch, puncher -n04023422 punchboard -n04023695 punch bowl -n04023962 punching bag, punch bag, punching ball, punchball -n04024137 punch pliers -n04024274 punch press -n04024862 punnet -n04024983 punt -n04025508 pup tent, shelter tent -n04025633 purdah -n04026053 purifier -n04026180 purl, purl stitch -n04026417 purse -n04026813 push-bike -n04026918 push broom -n04027023 push button, push, button -n04027367 push-button radio -n04027706 pusher, zori -n04027820 put-put -n04027935 puttee -n04028074 putter, putting iron -n04028221 putty knife -n04028315 puzzle -n04028581 pylon, power pylon -n04028764 pylon -n04029416 pyramidal tent -n04029647 pyrograph -n04029734 pyrometer -n04029913 pyrometric cone -n04030054 pyrostat -n04030161 pyx, pix -n04030274 pyx, pix, pyx chest, pix chest -n04030414 pyxis -n04030518 quad, quadrangle -n04030846 quadrant -n04030965 quadraphony, quadraphonic system, quadriphonic system -n04031884 quartering -n04032509 quarterstaff -n04032603 quartz battery, quartz mill -n04032936 quartz lamp -n04033287 queen -n04033425 queen -n04033557 queen post -n04033801 quern -n04033901 quill, quill pen -n04033995 quilt, comforter, comfort, puff -n04034262 quilted bedspread -n04034367 quilting -n04035231 quipu -n04035634 quirk molding, quirk moulding -n04035748 quirt -n04035836 quiver -n04035912 quoin, coign, coigne -n04036155 quoit -n04036303 QWERTY keyboard -n04036776 rabbet, rebate -n04036963 rabbet joint -n04037076 rabbit ears -n04037220 rabbit hutch -n04037298 raceabout -n04037443 racer, race car, racing car -n04037873 raceway, race -n04037964 racing boat -n04038231 racing gig -n04038338 racing skiff, single shell -n04038440 rack, stand -n04038727 rack -n04039041 rack, wheel -n04039209 rack and pinion -n04039381 racket, racquet -n04039742 racquetball -n04039848 radar, microwave radar, radio detection and ranging, radiolocation -n04040247 radial, radial tire, radial-ply tire -n04040373 radial engine, rotary engine -n04040540 radiation pyrometer -n04040759 radiator -n04041069 radiator -n04041243 radiator cap -n04041408 radiator hose -n04041544 radio, wireless -n04041747 radio antenna, radio aerial -n04042076 radio chassis -n04042204 radio compass -n04042358 radiogram, radiograph, shadowgraph, skiagraph, skiagram -n04042632 radio interferometer -n04042795 radio link, link -n04042985 radiometer -n04043168 radiomicrometer -n04043411 radio-phonograph, radio-gramophone -n04043733 radio receiver, receiving set, radio set, radio, tuner, wireless -n04044307 radiotelegraph, radiotelegraphy, wireless telegraph, wireless telegraphy -n04044498 radiotelephone, radiophone, wireless telephone -n04044716 radio telescope, radio reflector -n04044955 radiotherapy equipment -n04045085 radio transmitter -n04045255 radome, radar dome -n04045397 raft -n04045644 rafter, balk, baulk -n04045787 raft foundation -n04045941 rag, shred, tag, tag end, tatter -n04046091 ragbag -n04046277 raglan -n04046400 raglan sleeve -n04046590 rail -n04046974 rail fence -n04047139 railhead -n04047401 railing, rail -n04047733 railing -n04047834 railroad bed -n04048441 railroad tunnel -n04049303 rain barrel -n04049405 raincoat, waterproof -n04049585 rain gauge, rain gage, pluviometer, udometer -n04049753 rain stick -n04050066 rake -n04050313 rake handle -n04050600 RAM disk -n04050933 ramekin, ramequin -n04051269 ramjet, ramjet engine, atherodyde, athodyd, flying drainpipe -n04051439 rammer -n04051549 ramp, incline -n04051705 rampant arch -n04051825 rampart, bulwark, wall -n04052235 ramrod -n04052346 ramrod -n04052442 ranch, spread, cattle ranch, cattle farm -n04052658 ranch house -n04052757 random-access memory, random access memory, random memory, RAM, read/write memory -n04053508 rangefinder, range finder -n04053677 range hood -n04053767 range pole, ranging pole, flagpole -n04054361 rapier, tuck -n04054566 rariora -n04054670 rasp, wood file -n04055180 ratchet, rachet, ratch -n04055447 ratchet wheel -n04055700 rathskeller -n04055861 ratline, ratlin -n04056073 rat-tail file -n04056180 rattan, ratan -n04056413 rattrap -n04056932 rayon -n04057047 razor -n04057215 razorblade -n04057435 reaction-propulsion engine, reaction engine -n04057673 reaction turbine -n04057846 reactor -n04057981 reading lamp -n04058096 reading room -n04058239 read-only memory, ROM, read-only storage, fixed storage -n04058486 read-only memory chip -n04058594 readout, read-out -n04058721 read/write head, head -n04059157 ready-to-wear -n04059298 real storage -n04059399 reamer -n04059516 reamer, juicer, juice reamer -n04059947 rearview mirror -n04060198 Reaumur thermometer -n04060448 rebozo -n04060647 receiver, receiving system -n04060904 receptacle -n04061681 reception desk -n04061793 reception room -n04061969 recess, niche -n04062179 reciprocating engine -n04062428 recliner, reclining chair, lounger -n04062644 reconnaissance plane -n04062807 reconnaissance vehicle, scout car -n04063154 record changer, auto-changer, changer -n04063373 recorder, recording equipment, recording machine -n04063868 recording -n04064213 recording system -n04064401 record player, phonograph -n04064747 record sleeve, record cover -n04064862 recovery room -n04065272 recreational vehicle, RV, R.V. -n04065464 recreation room, rec room -n04065789 recycling bin -n04065909 recycling plant -n04066023 redbrick university -n04066270 red carpet -n04066388 redoubt -n04066476 redoubt -n04066767 reduction gear -n04067143 reed pipe -n04067231 reed stop -n04067353 reef knot, flat knot -n04067472 reel -n04067658 reel -n04067818 refectory -n04067921 refectory table -n04068441 refinery -n04068601 reflecting telescope, reflector -n04069166 reflectometer -n04069276 reflector -n04069434 reflex camera -n04069582 reflux condenser -n04069777 reformatory, reform school, training school -n04070003 reformer -n04070207 refracting telescope -n04070415 refractometer -n04070545 refrigeration system -n04070727 refrigerator, icebox -n04070964 refrigerator car -n04071102 refuge, sanctuary, asylum -n04071263 regalia -n04071393 regimentals -n04072193 regulator -n04072551 rein -n04072960 relay, electrical relay -n04073425 release, button -n04073948 religious residence, cloister -n04074185 reliquary -n04074963 remote control, remote -n04075291 remote terminal, link-attached terminal, remote station, link-attached station -n04075468 removable disk -n04075715 rendering -n04075813 rep, repp -n04075916 repair shop, fix-it shop -n04076052 repeater -n04076284 repeating firearm, repeater -n04076713 repository, monument -n04077430 reproducer -n04077594 rerebrace, upper cannon -n04077734 rescue equipment -n04077889 research center, research facility -n04078002 reseau -n04078574 reservoir -n04078955 reset -n04079106 reset button -n04079244 residence -n04079603 resistance pyrometer -n04079933 resistor, resistance -n04080138 resonator -n04080454 resonator, cavity resonator, resonating chamber -n04080705 resort hotel, spa -n04080833 respirator, inhalator -n04081281 restaurant, eating house, eating place, eatery -n04081699 rest house -n04081844 restraint, constraint -n04082344 resuscitator -n04082562 retainer -n04082710 retaining wall -n04082886 reticle, reticule, graticule -n04083113 reticulation -n04083309 reticule -n04083649 retort -n04083800 retractor -n04084517 return key, return -n04084682 reverberatory furnace -n04084889 revers, revere -n04085017 reverse, reverse gear -n04085574 reversible -n04085873 revetment, revetement, stone facing -n04086066 revetment -n04086273 revolver, six-gun, six-shooter -n04086446 revolving door, revolver -n04086663 rheometer -n04086794 rheostat, variable resistor -n04086937 rhinoscope -n04087126 rib -n04087432 riband, ribband -n04087709 ribbed vault -n04087826 ribbing -n04088229 ribbon development -n04088343 rib joint pliers -n04088441 ricer -n04088696 riddle -n04088797 ride -n04089152 ridge, ridgepole, rooftree -n04089376 ridge rope -n04089666 riding boot -n04089836 riding crop, hunting crop -n04089976 riding mower -n04090263 rifle -n04090548 rifle ball -n04090781 rifle grenade -n04091097 rig -n04091466 rigger, rigger brush -n04091584 rigger -n04091693 rigging, tackle -n04092168 rigout -n04093157 ringlet -n04093223 rings -n04093625 rink, skating rink -n04093775 riot gun -n04093915 ripcord -n04094060 ripcord -n04094250 ripping bar -n04094438 ripping chisel -n04094608 ripsaw, splitsaw -n04094720 riser -n04094859 riser, riser pipe, riser pipeline, riser main -n04095109 Ritz -n04095210 river boat -n04095342 rivet -n04095577 riveting machine, riveter, rivetter -n04095938 roach clip, roach holder -n04096066 road, route -n04096733 roadbed -n04096848 roadblock, barricade -n04097085 roadhouse -n04097373 roadster, runabout, two-seater -n04097622 roadway -n04097760 roaster -n04097866 robe -n04098169 robotics equipment -n04098260 Rochon prism, Wollaston prism -n04098399 rock bit, roller bit -n04098513 rocker -n04098795 rocker, cradle -n04099003 rocker arm, valve rocker -n04099175 rocket, rocket engine -n04099429 rocket, projectile -n04099969 rocking chair, rocker -n04100174 rod -n04100519 rodeo -n04101375 roll -n04101497 roller -n04101701 roller -n04101860 roller bandage -n04102037 in-line skate -n04102162 Rollerblade -n04102285 roller blind -n04102406 roller coaster, big dipper, chute-the-chute -n04102618 roller skate -n04102760 roller towel -n04102872 roll film -n04102962 rolling hitch -n04103094 rolling mill -n04103206 rolling pin -n04103364 rolling stock -n04103665 roll-on -n04103769 roll-on -n04103918 roll-on roll-off -n04104147 Rolodex -n04104384 Roman arch, semicircular arch -n04104500 Roman building -n04104770 romper, romper suit -n04104925 rood screen -n04105068 roof -n04105438 roof -n04105704 roofing -n04105893 room -n04107598 roomette -n04107743 room light -n04107984 roost -n04108268 rope -n04108822 rope bridge -n04108999 rope tow -n04110068 rose water -n04110178 rose window, rosette -n04110281 rosin bag -n04110439 rotary actuator, positioner -n04110654 rotary engine -n04110841 rotary press -n04110955 rotating mechanism -n04111190 rotating shaft, shaft -n04111414 rotisserie -n04111531 rotisserie -n04111668 rotor -n04111962 rotor, rotor coil -n04112147 rotor -n04112252 rotor blade, rotary wing -n04112430 rotor head, rotor shaft -n04112579 rotunda -n04112654 rotunda -n04112752 rouge, paint, blusher -n04112921 roughcast -n04113038 rouleau -n04113194 roulette, toothed wheel -n04113316 roulette ball -n04113406 roulette wheel, wheel -n04113641 round, unit of ammunition, one shot -n04113765 round arch -n04113968 round-bottom flask -n04114069 roundel -n04114301 round file -n04114428 roundhouse -n04114719 router -n04114844 router -n04114996 router plane -n04115144 rowel -n04115256 row house, town house -n04115456 rowing boat -n04115542 rowlock arch -n04115802 royal -n04115996 royal mast -n04116098 rubber band, elastic band, elastic -n04116294 rubber boot, gum boot -n04116389 rubber bullet -n04116512 rubber eraser, rubber, pencil eraser -n04117216 rudder -n04117464 rudder -n04117639 rudder blade -n04118021 rug, carpet, carpeting -n04118538 rugby ball -n04118635 ruin -n04118776 rule, ruler -n04119091 rumble -n04119230 rumble seat -n04119360 rummer -n04119478 rumpus room, playroom, game room -n04119630 runcible spoon -n04119751 rundle, spoke, rung -n04120489 running shoe -n04120695 running suit -n04120842 runway -n04121228 rushlight, rush candle -n04121342 russet -n04121426 rya, rya rug -n04121511 saber, sabre -n04121728 saber saw, jigsaw, reciprocating saw -n04122262 sable -n04122349 sable, sable brush, sable's hair pencil -n04122492 sable coat -n04122578 sabot, wooden shoe -n04122685 sachet -n04122825 sack, poke, paper bag, carrier bag -n04123026 sack, sacque -n04123123 sackbut -n04123228 sackcloth -n04123317 sackcloth -n04123448 sack coat -n04123567 sacking, bagging -n04123740 saddle -n04124098 saddlebag -n04124202 saddle blanket, saddlecloth, horse blanket -n04124370 saddle oxford, saddle shoe -n04124488 saddlery -n04124573 saddle seat -n04124887 saddle stitch -n04125021 safe -n04125116 safe -n04125257 safe-deposit, safe-deposit box, safety-deposit, safety deposit box, deposit box, lockbox -n04125541 safe house -n04125692 safety arch -n04125853 safety belt, life belt, safety harness -n04126066 safety bicycle, safety bike -n04126244 safety bolt, safety lock -n04126541 safety curtain -n04126659 safety fuse -n04126852 safety lamp, Davy lamp -n04126980 safety match, book matches -n04127117 safety net -n04127249 safety pin -n04127395 safety rail, guardrail -n04127521 safety razor -n04127633 safety valve, relief valve, escape valve, escape cock, escape -n04127904 sail, canvas, canvass, sheet -n04128413 sail -n04128499 sailboat, sailing boat -n04128710 sailcloth -n04128837 sailing vessel, sailing ship -n04129490 sailing warship -n04129688 sailor cap -n04129766 sailor suit -n04130143 salad bar -n04130257 salad bowl -n04130566 salinometer -n04130907 sallet, salade -n04131015 salon -n04131113 salon -n04131208 salon, beauty salon, beauty parlor, beauty parlour, beauty shop -n04131368 saltbox -n04131499 saltcellar -n04131690 saltshaker, salt shaker -n04131811 saltworks -n04131929 salver -n04132158 salwar, shalwar -n04132465 Sam Browne belt -n04132603 samisen, shamisen -n04132829 samite -n04132985 samovar -n04133114 sampan -n04133789 sandal -n04134008 sandbag -n04134170 sandblaster -n04134523 sandbox -n04134632 sandglass -n04135024 sand wedge -n04135118 sandwich board -n04135315 sanitary napkin, sanitary towel, Kotex -n04135710 cling film, clingfilm, Saran Wrap -n04135933 sarcenet, sarsenet -n04136045 sarcophagus -n04136161 sari, saree -n04136333 sarong -n04136510 sash, window sash -n04136800 sash fastener, sash lock, window lock -n04137089 sash window -n04137217 satchel -n04137355 sateen -n04137444 satellite, artificial satellite, orbiter -n04137773 satellite receiver -n04137897 satellite television, satellite TV -n04138131 satellite transmitter -n04138261 satin -n04138869 Saturday night special -n04138977 saucepan -n04139140 saucepot -n04139395 sauna, sweat room -n04139859 savings bank, coin bank, money box, bank -n04140064 saw -n04140539 sawed-off shotgun -n04140631 sawhorse, horse, sawbuck, buck -n04140777 sawmill -n04140853 saw set -n04141076 sax, saxophone -n04141198 saxhorn -n04141327 scabbard -n04141712 scaffolding, staging -n04141838 scale -n04141975 scale, weighing machine -n04142175 scaler -n04142327 scaling ladder -n04142434 scalpel -n04142731 scanner, electronic scanner -n04142999 scanner -n04143140 scanner, digital scanner, image scanner -n04143365 scantling, stud -n04143897 scarf -n04144241 scarf joint, scarf -n04144539 scatter rug, throw rug -n04144651 scauper, scorper -n04145863 Schmidt telescope, Schmidt camera -n04146050 school, schoolhouse -n04146343 schoolbag -n04146504 school bell -n04146614 school bus -n04146862 school ship, training ship -n04146976 school system -n04147183 schooner -n04147291 schooner -n04147495 scientific instrument -n04147793 scimitar -n04147916 scintillation counter -n04148054 scissors, pair of scissors -n04148285 sclerometer -n04148464 scoinson arch, sconcheon arch -n04148579 sconce -n04148703 sconce -n04149083 scoop -n04149374 scooter -n04149813 scoreboard -n04150153 scouring pad -n04150273 scow -n04150371 scow -n04150980 scraper -n04151108 scratcher -n04151581 screen -n04151940 screen, cover, covert, concealment -n04152387 screen -n04152593 screen, CRT screen -n04153025 screen door, screen -n04153330 screening -n04153751 screw -n04154152 screw, screw propeller -n04154340 screw -n04154565 screwdriver -n04154753 screw eye -n04154854 screw key -n04154938 screw thread, thread -n04155068 screwtop -n04155177 screw wrench -n04155457 scriber, scribe, scratch awl -n04155625 scrim -n04155735 scrimshaw -n04155889 scriptorium -n04156040 scrubber -n04156140 scrub brush, scrubbing brush, scrubber -n04156297 scrub plane -n04156411 scuffer -n04156591 scuffle, scuffle hoe, Dutch hoe -n04156814 scull -n04156946 scull -n04157099 scullery -n04157320 sculpture -n04158002 scuttle, coal scuttle -n04158138 scyphus -n04158250 scythe -n04158672 seabag -n04158807 sea boat -n04158956 sea chest -n04160036 sealing wax, seal -n04160261 sealskin -n04160372 seam -n04160586 seaplane, hydroplane -n04160847 searchlight -n04161010 searing iron -n04161358 seat -n04161981 seat -n04162433 seat -n04162706 seat belt, seatbelt -n04163530 secateurs -n04164002 secondary coil, secondary winding, secondary -n04164199 second balcony, family circle, upper balcony, peanut gallery -n04164406 second base -n04164757 second hand -n04164868 secretary, writing table, escritoire, secretaire -n04165409 sectional -n04165675 security blanket -n04165945 security system, security measure, security -n04166111 security system -n04166281 sedan, saloon -n04166436 sedan, sedan chair -n04167346 seeder -n04167489 seeker -n04167661 seersucker -n04168084 segmental arch -n04168199 Segway, Segway Human Transporter, Segway HT -n04168472 seidel -n04168541 seine -n04168840 seismograph -n04169437 selector, selector switch -n04169597 selenium cell -n04170037 self-propelled vehicle -n04170384 self-registering thermometer -n04170515 self-starter -n04170694 selsyn, synchro -n04170933 selvage, selvedge -n04171208 semaphore -n04171459 semiautomatic firearm -n04171629 semiautomatic pistol, semiautomatic -n04171831 semiconductor device, semiconductor unit, semiconductor -n04172107 semi-detached house -n04172230 semigloss -n04172342 semitrailer, semi -n04172512 sennit -n04172607 sensitometer -n04172776 sentry box -n04172904 separate -n04173046 septic tank -n04173172 sequence, episode -n04173511 sequencer, sequenator -n04173907 serape, sarape -n04174026 serge -n04174101 serger -n04174234 serial port -n04174500 serpent -n04174705 serration -n04175039 server -n04175147 server, host -n04175574 service club -n04176068 serving cart -n04176190 serving dish -n04176295 servo, servomechanism, servosystem -n04176528 set -n04177041 set gun, spring gun -n04177329 setscrew -n04177545 setscrew -n04177654 set square -n04177755 settee -n04177820 settle, settee -n04177931 settlement house -n04178190 seventy-eight, 78 -n04178329 Seven Wonders of the Ancient World, Seven Wonders of the World -n04178668 sewage disposal plant, disposal plant -n04179126 sewer, sewerage, cloaca -n04179712 sewing basket -n04179824 sewing kit -n04179913 sewing machine -n04180063 sewing needle -n04180229 sewing room -n04180888 sextant -n04181083 sgraffito -n04181228 shackle, bond, hamper, trammel -n04181561 shackle -n04181718 shade -n04182152 shadow box -n04182322 shaft -n04183217 shag rug -n04183329 shaker -n04183957 shank -n04184095 shank, stem -n04184316 shantung -n04184435 shaper, shaping machine -n04184600 shaping tool -n04184880 sharkskin -n04185071 sharpener -n04185529 Sharpie -n04185804 shaver, electric shaver, electric razor -n04185946 shaving brush -n04186051 shaving cream, shaving soap -n04186268 shaving foam -n04186455 shawl -n04186624 shawm -n04186848 shears -n04187061 sheath -n04187233 sheathing, overlay, overlayer -n04187547 shed -n04187751 sheep bell -n04187885 sheepshank -n04187970 sheepskin coat, afghan -n04188064 sheepwalk, sheeprun -n04188179 sheet, bed sheet -n04189092 sheet bend, becket bend, weaver's knot, weaver's hitch -n04189282 sheeting -n04189651 sheet pile, sheath pile, sheet piling -n04189816 Sheetrock -n04190052 shelf -n04190376 shelf bracket -n04190464 shell -n04190747 shell, case, casing -n04190997 shell, racing shell -n04191150 shellac, shellac varnish -n04191595 shelter -n04191943 shelter -n04192238 shelter -n04192361 sheltered workshop -n04192521 Sheraton -n04192698 shield, buckler -n04192858 shield -n04193179 shielding -n04193377 shift key, shift -n04193742 shillelagh, shillalah -n04193883 shim -n04194009 shingle -n04194127 shin guard, shinpad -n04194289 ship -n04196080 shipboard system -n04196502 shipping, cargo ships, merchant marine, merchant vessels -n04196803 shipping room -n04196925 ship-towed long-range acoustic detection system -n04197110 shipwreck -n04197391 shirt -n04197781 shirt button -n04197878 shirtdress -n04198015 shirtfront -n04198233 shirting -n04198355 shirtsleeve -n04198453 shirttail -n04198562 shirtwaist, shirtwaister -n04198722 shiv -n04198797 shock absorber, shock, cushion -n04199027 shoe -n04200000 shoe -n04200258 shoebox -n04200537 shoehorn -n04200800 shoe shop, shoe-shop, shoe store -n04200908 shoetree -n04201064 shofar, shophar -n04201297 shoji -n04201733 shooting brake -n04202142 shooting lodge, shooting box -n04202282 shooting stick -n04202417 shop, store -n04203356 shop bell -n04204081 shopping bag -n04204238 shopping basket -n04204347 shopping cart -n04204755 short circuit, short -n04205062 short iron -n04205318 short pants, shorts, trunks -n04205505 short sleeve -n04205613 shortwave diathermy machine -n04206070 shot -n04206225 shot glass, jigger, pony -n04206356 shotgun, scattergun -n04206570 shotgun shell -n04206790 shot tower -n04207151 shoulder -n04207343 shoulder bag -n04207596 shouldered arch -n04207763 shoulder holster -n04207903 shoulder pad -n04208065 shoulder patch -n04208210 shovel -n04208427 shovel -n04208582 shovel hat -n04208760 showboat -n04208936 shower -n04209133 shower cap -n04209239 shower curtain -n04209509 shower room -n04209613 shower stall, shower bath -n04209811 showroom, salesroom, saleroom -n04210012 shrapnel -n04210120 shredder -n04210288 shrimper -n04210390 shrine -n04210591 shrink-wrap -n04210858 shunt -n04211001 shunt, electrical shunt, bypass -n04211219 shunter -n04211356 shutter -n04211528 shutter -n04211857 shuttle -n04211970 shuttle -n04212165 shuttle bus -n04212282 shuttlecock, bird, birdie, shuttle -n04212467 shuttle helicopter -n04212810 Sibley tent -n04213105 sickbay, sick berth -n04213264 sickbed -n04213353 sickle, reaping hook, reap hook -n04213530 sickroom -n04214046 sideboard -n04214282 sidecar -n04214413 side chapel -n04214649 sidelight, running light -n04215153 sidesaddle -n04215402 sidewalk, pavement -n04215588 sidewall -n04215800 side-wheeler -n04215910 sidewinder -n04216634 sieve, screen -n04216860 sifter -n04216963 sights -n04217387 sigmoidoscope, flexible sigmoidoscope -n04217546 signal box, signal tower -n04217718 signaling device -n04217882 signboard, sign -n04218564 silencer, muffler -n04218921 silent butler -n04219185 Silex -n04219424 silk -n04219580 silks -n04220250 silo -n04220805 silver plate -n04221076 silverpoint -n04221673 simple pendulum -n04221823 simulator -n04222210 single bed -n04222307 single-breasted jacket -n04222470 single-breasted suit -n04222723 single prop, single-propeller plane -n04222847 single-reed instrument, single-reed woodwind -n04223066 single-rotor helicopter -n04223170 singlestick, fencing stick, backsword -n04223299 singlet, vest, undershirt -n04224395 siren -n04224543 sister ship -n04224842 sitar -n04225031 sitz bath, hip bath -n04225222 six-pack, six pack, sixpack -n04225729 skate -n04225987 skateboard -n04226322 skeg -n04226464 skein -n04226537 skeleton, skeletal frame, frame, underframe -n04226826 skeleton key -n04226962 skep -n04227050 skep -n04227144 sketch, study -n04227519 sketcher -n04227787 skew arch -n04227900 skewer -n04228054 ski -n04228215 ski binding, binding -n04228422 skibob -n04228581 ski boot -n04228693 ski cap, stocking cap, toboggan cap -n04229007 skidder -n04229107 skid lid -n04229480 skiff -n04229620 ski jump -n04229737 ski lodge -n04229816 ski mask -n04229959 skimmer -n04230387 ski parka, ski jacket -n04230487 ski-plane -n04230603 ski pole -n04230707 ski rack -n04230808 skirt -n04231272 skirt -n04231693 ski tow, ski lift, lift -n04231905 Skivvies -n04232153 skullcap -n04232312 skybox -n04232437 skyhook -n04232800 skylight, fanlight -n04233027 skysail -n04233124 skyscraper -n04233295 skywalk -n04233715 slacks -n04233832 slack suit -n04234160 slasher -n04234260 slash pocket -n04234455 slat, spline -n04234670 slate -n04234763 slate pencil -n04234887 slate roof -n04235291 sled, sledge, sleigh -n04235646 sleeper -n04235771 sleeper -n04235860 sleeping bag -n04236001 sleeping car, sleeper, wagon-lit -n04236377 sleeve, arm -n04236702 sleeve -n04236809 sleigh bed -n04236935 sleigh bell, cascabel -n04237174 slice bar -n04237287 slicer -n04237423 slicer -n04238128 slide, playground slide, sliding board -n04238321 slide fastener, zip, zipper, zip fastener -n04238617 slide projector -n04238763 slide rule, slipstick -n04238953 slide valve -n04239074 sliding door -n04239218 sliding seat -n04239333 sliding window -n04239436 sling, scarf bandage, triangular bandage -n04239639 sling -n04239786 slingback, sling -n04239900 slinger ring -n04240434 slip clutch, slip friction clutch -n04240752 slipcover -n04240867 slip-joint pliers -n04241042 slipknot -n04241249 slip-on -n04241394 slipper, carpet slipper -n04241573 slip ring -n04242084 slit lamp -n04242315 slit trench -n04242408 sloop -n04242587 sloop of war -n04242704 slop basin, slop bowl -n04243003 slop pail, slop jar -n04243142 slops -n04243251 slopshop, slopseller's shop -n04243546 slot, one-armed bandit -n04243941 slot machine, coin machine -n04244379 sluice, sluiceway, penstock -n04244847 smack -n04244997 small boat -n04245218 small computer system interface, SCSI -n04245412 small ship -n04245508 small stores -n04245847 smart bomb -n04246060 smelling bottle -n04246271 smocking -n04246459 smoke bomb, smoke grenade -n04246731 smokehouse, meat house -n04246855 smoker, smoking car, smoking carriage, smoking compartment -n04247011 smoke screen, smokescreen -n04247440 smoking room -n04247544 smoothbore -n04247630 smooth plane, smoothing plane -n04247736 snack bar, snack counter, buffet -n04247876 snaffle, snaffle bit -n04248209 snap, snap fastener, press stud -n04248396 snap brim -n04248507 snap-brim hat -n04248851 snare, gin, noose -n04249415 snare drum, snare, side drum -n04249582 snatch block -n04249882 snifter, brandy snifter, brandy glass -n04250224 sniper rifle, precision rifle -n04250473 snips, tinsnips -n04250599 Sno-cat -n04250692 snood -n04250850 snorkel, schnorkel, schnorchel, snorkel breather, breather -n04251144 snorkel -n04251701 snowbank, snow bank -n04251791 snowboard -n04252077 snowmobile -n04252225 snowplow, snowplough -n04252331 snowshoe -n04252560 snowsuit -n04252653 snow thrower, snow blower -n04253057 snuffbox -n04253168 snuffer -n04253304 snuffers -n04253931 soapbox -n04254009 soap dish -n04254120 soap dispenser -n04254450 soap pad -n04254680 soccer ball -n04254777 sock -n04255163 socket -n04255346 socket wrench -n04255499 socle -n04255586 soda can -n04255670 soda fountain -n04255768 soda fountain -n04255899 sod house, soddy, adobe house -n04256318 sodium-vapor lamp, sodium-vapour lamp -n04256520 sofa, couch, lounge -n04256758 soffit -n04256891 softball, playground ball -n04257223 soft pedal -n04257684 soil pipe -n04257790 solar array, solar battery, solar panel -n04257986 solar cell, photovoltaic cell -n04258138 solar dish, solar collector, solar furnace -n04258333 solar heater -n04258438 solar house -n04258618 solar telescope -n04258732 solar thermal system -n04258859 soldering iron -n04259202 solenoid -n04259468 solleret, sabaton -n04259630 sombrero -n04260192 sonic depth finder, fathometer -n04260364 sonogram, echogram -n04260589 sonograph -n04261116 sorter -n04261281 souk -n04261369 sound bow -n04261506 soundbox, body -n04261638 sound camera -n04261767 sounder -n04261868 sound film -n04262161 sounding board, soundboard -n04262530 sounding rocket -n04262678 sound recording, audio recording, audio -n04262869 sound spectrograph -n04263257 soup bowl -n04263336 soup ladle -n04263502 soupspoon, soup spoon -n04263760 source of illumination -n04263950 sourdine -n04264134 soutache -n04264233 soutane -n04264361 sou'wester -n04264485 soybean future -n04264628 space bar -n04264765 space capsule, capsule -n04264914 spacecraft, ballistic capsule, space vehicle -n04265275 space heater -n04265428 space helmet -n04265904 space rocket -n04266014 space shuttle -n04266162 space station, space platform, space laboratory -n04266375 spacesuit -n04266486 spade -n04266849 spade bit -n04266968 spaghetti junction -n04267091 Spandau -n04267165 spandex -n04267246 spandrel, spandril -n04267435 spanker -n04267577 spar -n04267985 sparge pipe -n04268142 spark arrester, sparker -n04268275 spark arrester -n04268418 spark chamber, spark counter -n04268565 spark coil -n04268799 spark gap -n04269086 spark lever -n04269270 spark plug, sparking plug, plug -n04269502 sparkplug wrench -n04269668 spark transmitter -n04269822 spat, gaiter -n04269944 spatula -n04270147 spatula -n04270371 speakerphone -n04270576 speaking trumpet -n04270891 spear, lance, shaft -n04271148 spear, gig, fizgig, fishgig, lance -n04271531 specialty store -n04271793 specimen bottle -n04271891 spectacle -n04272054 spectacles, specs, eyeglasses, glasses -n04272389 spectator pump, spectator -n04272782 spectrograph -n04272928 spectrophotometer -n04273064 spectroscope, prism spectroscope -n04273285 speculum -n04273569 speedboat -n04273659 speed bump -n04273796 speedometer, speed indicator -n04273972 speed skate, racing skate -n04274686 spherometer -n04274985 sphygmomanometer -n04275093 spicemill -n04275175 spice rack -n04275283 spider -n04275548 spider web, spider's web -n04275661 spike -n04275904 spike -n04277352 spindle -n04277493 spindle, mandrel, mandril, arbor -n04277669 spindle -n04277826 spin dryer, spin drier -n04278247 spinet -n04278353 spinet -n04278447 spinnaker -n04278605 spinner -n04278932 spinning frame -n04279063 spinning jenny -n04279172 spinning machine -n04279353 spinning rod -n04279462 spinning wheel -n04279858 spiral bandage -n04279987 spiral ratchet screwdriver, ratchet screwdriver -n04280259 spiral spring -n04280373 spirit lamp -n04280487 spirit stove -n04280845 spirometer -n04280970 spit -n04281260 spittoon, cuspidor -n04281375 splashboard, splasher, dashboard -n04281571 splasher -n04281998 splice, splicing -n04282231 splicer -n04282494 splint -n04282872 split rail, fence rail -n04282992 Spode -n04283096 spoiler -n04283255 spoiler -n04283378 spoke, wheel spoke, radius -n04283585 spokeshave -n04283784 sponge cloth -n04283905 sponge mop -n04284002 spoon -n04284341 spoon -n04284438 Spork -n04284572 sporran -n04284869 sport kite, stunt kite -n04285008 sports car, sport car -n04285146 sports equipment -n04285622 sports implement -n04285803 sportswear, athletic wear, activewear -n04285965 sport utility, sport utility vehicle, S.U.V., SUV -n04286128 spot -n04286575 spotlight, spot -n04286960 spot weld, spot-weld -n04287351 spouter -n04287451 sprag -n04287747 spray gun -n04287898 spray paint -n04287986 spreader -n04288165 sprig -n04288272 spring -n04288533 spring balance, spring scale -n04288673 springboard -n04289027 sprinkler -n04289195 sprinkler system -n04289449 sprit -n04289576 spritsail -n04289690 sprocket, sprocket wheel -n04289827 sprocket -n04290079 spun yarn -n04290259 spur, gad -n04290507 spur gear, spur wheel -n04290615 sputnik -n04290762 spy satellite -n04291069 squad room -n04291242 square -n04291759 square knot -n04291992 square-rigger -n04292080 square sail -n04292221 squash ball -n04292414 squash racket, squash racquet, bat -n04292572 squawk box, squawker, intercom speaker -n04292921 squeegee -n04293119 squeezer -n04293258 squelch circuit, squelch, squelcher -n04293744 squinch -n04294212 stabilizer, stabiliser -n04294426 stabilizer -n04294614 stabilizer bar, anti-sway bar -n04294879 stable, stalls, horse barn -n04295081 stable gear, saddlery, tack -n04295353 stabling -n04295571 stacks -n04295777 staddle -n04295881 stadium, bowl, arena, sports stadium -n04296562 stage -n04297098 stagecoach, stage -n04297750 stained-glass window -n04297847 stair-carpet -n04298053 stair-rod -n04298661 stairwell -n04298765 stake -n04299215 stall, stand, sales booth -n04299370 stall -n04299963 stamp -n04300358 stamp mill, stamping mill -n04300509 stamping machine, stamper -n04300643 stanchion -n04301000 stand -n04301242 standard -n04301474 standard cell -n04301760 standard transmission, stick shift -n04302200 standing press -n04302863 stanhope -n04302988 Stanley Steamer -n04303095 staple -n04303258 staple -n04303357 staple gun, staplegun, tacker -n04303497 stapler, stapling machine -n04304215 starship, spaceship -n04304375 starter, starter motor, starting motor -n04304680 starting gate, starting stall -n04305016 Stassano furnace, electric-arc furnace -n04305210 Statehouse -n04305323 stately home -n04305471 state prison -n04305572 stateroom -n04305947 static tube -n04306080 station -n04306592 stator, stator coil -n04306847 statue -n04307419 stay -n04307767 staysail -n04307878 steakhouse, chophouse -n04307986 steak knife -n04308084 stealth aircraft -n04308273 stealth bomber -n04308397 stealth fighter -n04308583 steam bath, steam room, vapor bath, vapour bath -n04308807 steamboat -n04308915 steam chest -n04309049 steam engine -n04309348 steamer, steamship -n04309548 steamer -n04309833 steam iron -n04310018 steam locomotive -n04310157 steamroller, road roller -n04310507 steam shovel -n04310604 steam turbine -n04310721 steam whistle -n04310904 steel -n04311004 steel arch bridge -n04311174 steel drum -n04311595 steel mill, steelworks, steel plant, steel factory -n04312020 steel-wool pad -n04312154 steelyard, lever scale, beam scale -n04312432 steeple, spire -n04312654 steerage -n04312756 steering gear -n04312916 steering linkage -n04313220 steering system, steering mechanism -n04313503 steering wheel, wheel -n04313628 stele, stela -n04314107 stem-winder -n04314216 stencil -n04314522 Sten gun -n04314632 stenograph -n04314914 step, stair -n04315342 step-down transformer -n04315713 step stool -n04315828 step-up transformer -n04315948 stereo, stereophony, stereo system, stereophonic system -n04316498 stereoscope -n04316815 stern chaser -n04316924 sternpost -n04317063 sternwheeler -n04317175 stethoscope -n04317325 stewing pan, stewpan -n04317420 stick -n04317833 stick -n04317976 stick, control stick, joystick -n04318131 stick -n04318787 stile -n04318892 stiletto -n04318982 still -n04319545 stillroom, still room -n04319774 Stillson wrench -n04319937 stilt -n04320405 Stinger -n04320598 stink bomb, stench bomb -n04320871 stirrer -n04320973 stirrup, stirrup iron -n04321121 stirrup pump -n04321453 stob -n04322026 stock, gunstock -n04322531 stockade -n04322692 stockcar -n04322801 stock car -n04323519 stockinet, stockinette -n04323819 stocking -n04324120 stock-in-trade -n04324297 stockpot -n04324387 stockroom, stock room -n04324515 stocks -n04325041 stock saddle, Western saddle -n04325208 stockyard -n04325704 stole -n04325804 stomacher -n04325968 stomach pump -n04326547 stone wall -n04326676 stoneware -n04326799 stonework -n04326896 stool -n04327204 stoop, stoep -n04327544 stop bath, short-stop, short-stop bath -n04327682 stopcock, cock, turncock -n04328054 stopper knot -n04328186 stopwatch, stop watch -n04328329 storage battery, accumulator -n04328580 storage cell, secondary cell -n04328703 storage ring -n04328946 storage space -n04329477 storeroom, storage room, stowage -n04329681 storm cellar, cyclone cellar, tornado cellar -n04329834 storm door -n04329958 storm window, storm sash -n04330109 stoup, stoop -n04330189 stoup -n04330267 stove -n04330340 stove, kitchen stove, range, kitchen range, cooking stove -n04330669 stove bolt -n04330746 stovepipe -n04330896 stovepipe iron -n04330998 Stradavarius, Strad -n04331277 straight chair, side chair -n04331443 straightedge -n04331639 straightener -n04331765 straight flute, straight-fluted drill -n04331892 straight pin -n04332074 straight razor -n04332243 strainer -n04332580 straitjacket, straightjacket -n04332987 strap -n04333129 strap -n04333869 strap hinge, joint hinge -n04334105 strapless -n04334365 streamer fly -n04334504 streamliner -n04334599 street -n04335209 street -n04335435 streetcar, tram, tramcar, trolley, trolley car -n04335693 street clothes -n04335886 streetlight, street lamp -n04336792 stretcher -n04337157 stretcher -n04337287 stretch pants -n04337503 strickle -n04337650 strickle -n04338517 stringed instrument -n04338963 stringer -n04339062 stringer -n04339191 string tie -n04339638 strip -n04339879 strip lighting -n04340019 strip mall -n04340521 stroboscope, strobe, strobe light -n04340750 strongbox, deedbox -n04340935 stronghold, fastness -n04341133 strongroom -n04341288 strop -n04341414 structural member -n04341686 structure, construction -n04343511 student center -n04343630 student lamp -n04343740 student union -n04344003 stud finder -n04344734 studio apartment, studio -n04344873 studio couch, day bed -n04345028 study -n04345201 study hall -n04345787 stuffing nut, packing nut -n04346003 stump -n04346157 stun gun, stun baton -n04346328 stupa, tope -n04346428 sty, pigsty, pigpen -n04346511 stylus, style -n04346679 stylus -n04346855 sub-assembly -n04347119 subcompact, subcompact car -n04347519 submachine gun -n04347754 submarine, pigboat, sub, U-boat -n04348070 submarine torpedo -n04348184 submersible, submersible warship -n04348359 submersible -n04348988 subtracter -n04349189 subway token -n04349306 subway train -n04349401 subwoofer -n04349913 suction cup -n04350104 suction pump -n04350235 sudatorium, sudatory -n04350458 suede cloth, suede -n04350581 sugar bowl -n04350688 sugar refinery -n04350769 sugar spoon, sugar shell -n04350905 suit, suit of clothes -n04351550 suite, rooms -n04351699 suiting -n04353573 sulky -n04354026 summer house -n04354182 sumo ring -n04354387 sump -n04354487 sump pump -n04354589 sunbonnet -n04355115 Sunday best, Sunday clothes -n04355267 sun deck -n04355338 sundial -n04355511 sundress -n04355684 sundries -n04355821 sun gear -n04355933 sunglass -n04356056 sunglasses, dark glasses, shades -n04356595 sunhat, sun hat -n04356772 sunlamp, sun lamp, sunray lamp, sun-ray lamp -n04356925 sun parlor, sun parlour, sun porch, sunporch, sunroom, sun lounge, solarium -n04357121 sunroof, sunshine-roof -n04357314 sunscreen, sunblock, sun blocker -n04357531 sunsuit -n04357930 supercharger -n04358117 supercomputer -n04358256 superconducting supercollider -n04358491 superhighway, information superhighway -n04358707 supermarket -n04358874 superstructure -n04359034 supertanker -n04359124 supper club -n04359217 supplejack -n04359335 supply chamber -n04359500 supply closet -n04359589 support -n04360501 support -n04360798 support column -n04360914 support hose, support stocking -n04361095 supporting structure -n04361260 supporting tower -n04361937 surcoat -n04362624 surface gauge, surface gage, scribing block -n04362821 surface lift -n04362972 surface search radar -n04363082 surface ship -n04363210 surface-to-air missile, SAM -n04363412 surface-to-air missile system -n04363671 surfboat -n04363777 surcoat -n04363874 surgeon's knot -n04363991 surgery -n04364160 surge suppressor, surge protector, spike suppressor, spike arrester, lightning arrester -n04364397 surgical dressing -n04364545 surgical instrument -n04364827 surgical knife -n04364994 surplice -n04365112 surrey -n04365229 surtout -n04365328 surveillance system -n04365484 surveying instrument, surveyor's instrument -n04365751 surveyor's level -n04366033 sushi bar -n04366116 suspension, suspension system -n04366367 suspension bridge -n04366832 suspensory, suspensory bandage -n04367011 sustaining pedal, loud pedal -n04367371 suture, surgical seam -n04367480 swab, swob, mop -n04367746 swab -n04367950 swaddling clothes, swaddling bands -n04368109 swag -n04368235 swage block -n04368365 swagger stick -n04368496 swallow-tailed coat, swallowtail, morning coat -n04368695 swamp buggy, marsh buggy -n04368840 swan's down -n04369025 swathe, wrapping -n04369282 swatter, flyswatter, flyswat -n04369485 sweat bag -n04369618 sweatband -n04370048 sweater, jumper -n04370288 sweat pants, sweatpants -n04370456 sweatshirt -n04370600 sweatshop -n04370774 sweat suit, sweatsuit, sweats, workout suit -n04370955 sweep, sweep oar -n04371050 sweep hand, sweep-second -n04371430 swimming trunks, bathing trunks -n04371563 swimsuit, swimwear, bathing suit, swimming costume, bathing costume -n04371774 swing -n04371979 swing door, swinging door -n04372370 switch, electric switch, electrical switch -n04373089 switchblade, switchblade knife, flick-knife, flick knife -n04373428 switch engine, donkey engine -n04373563 swivel -n04373704 swivel chair -n04373795 swizzle stick -n04373894 sword, blade, brand, steel -n04374315 sword cane, sword stick -n04374521 S wrench -n04374735 synagogue, temple, tabernacle -n04374907 synchrocyclotron -n04375080 synchroflash -n04375241 synchromesh -n04375405 synchronous converter, rotary, rotary converter -n04375615 synchronous motor -n04375775 synchrotron -n04375926 synchroscope, synchronoscope, synchronizer, synchroniser -n04376400 synthesizer, synthesiser -n04376876 syringe -n04377057 system -n04378489 tabard -n04378651 Tabernacle -n04378956 tabi, tabis -n04379096 tab key, tab -n04379243 table -n04379964 table -n04380255 tablefork -n04380346 table knife -n04380533 table lamp -n04380916 table saw -n04381073 tablespoon -n04381450 tablet-armed chair -n04381587 table-tennis table, ping-pong table, pingpong table -n04381724 table-tennis racquet, table-tennis bat, pingpong paddle -n04381860 tabletop -n04381994 tableware -n04382334 tabor, tabour -n04382438 taboret, tabouret -n04382537 tachistoscope, t-scope -n04382695 tachograph -n04382880 tachometer, tach -n04383015 tachymeter, tacheometer -n04383130 tack -n04383301 tack hammer -n04383839 taffeta -n04383923 taffrail -n04384593 tailgate, tailboard -n04384910 taillight, tail lamp, rear light, rear lamp -n04385079 tailor-made -n04385157 tailor's chalk -n04385536 tailpipe -n04385799 tail rotor, anti-torque rotor -n04386051 tailstock -n04386456 take-up -n04386664 talaria -n04386792 talcum, talcum powder -n04387095 tam, tam-o'-shanter, tammy -n04387201 tambour -n04387261 tambour, embroidery frame, embroidery hoop -n04387400 tambourine -n04387531 tammy -n04387706 tamp, tamper, tamping bar -n04387932 Tampax -n04388040 tampion, tompion -n04388162 tampon -n04388473 tandoor -n04388574 tangram -n04388743 tank, storage tank -n04389033 tank, army tank, armored combat vehicle, armoured combat vehicle -n04389430 tankard -n04389521 tank car, tank -n04389718 tank destroyer -n04389854 tank engine, tank locomotive -n04389999 tanker plane -n04390483 tank shell -n04390577 tank top -n04390873 tannoy -n04390977 tap, spigot -n04391445 tapa, tappa -n04391838 tape, tape recording, taping -n04392113 tape, tapeline, tape measure -n04392526 tape deck -n04392764 tape drive, tape transport, transport -n04392985 tape player -n04393095 tape recorder, tape machine -n04393301 taper file -n04393549 tapestry, tapis -n04393808 tappet -n04393913 tap wrench -n04394031 tare -n04394261 target, butt -n04394421 target acquisition system -n04394630 tarmacadam, tarmac, macadam -n04395024 tarpaulin, tarp -n04395106 tartan, plaid -n04395332 tasset, tasse -n04395651 tattoo -n04395875 tavern, tap house -n04396226 tawse -n04396335 taximeter -n04396650 T-bar lift, T-bar, Alpine lift -n04396808 tea bag -n04396902 tea ball -n04397027 tea cart, teacart, tea trolley, tea wagon -n04397168 tea chest -n04397261 teaching aid -n04397452 teacup -n04397645 tea gown -n04397768 teakettle -n04397860 tea maker -n04398044 teapot -n04398497 teashop, teahouse, tearoom, tea parlor, tea parlour -n04398688 teaspoon -n04398834 tea-strainer -n04398951 tea table -n04399046 tea tray -n04399158 tea urn -n04399382 teddy, teddy bear -n04399537 tee, golf tee -n04399846 tee hinge, T hinge -n04400109 telecom hotel, telco building -n04400289 telecommunication system, telecom system, telecommunication equipment, telecom equipment -n04400499 telegraph, telegraphy -n04400737 telegraph key -n04400899 telemeter -n04401088 telephone, phone, telephone set -n04401578 telephone bell -n04401680 telephone booth, phone booth, call box, telephone box, telephone kiosk -n04401828 telephone cord, phone cord -n04401949 telephone jack, phone jack -n04402057 telephone line, phone line, telephone circuit, subscriber line, line -n04402342 telephone plug, phone plug -n04402449 telephone pole, telegraph pole, telegraph post -n04402580 telephone receiver, receiver -n04402746 telephone system, phone system -n04402984 telephone wire, telephone line, telegraph wire, telegraph line -n04403413 telephoto lens, zoom lens -n04403524 Teleprompter -n04403638 telescope, scope -n04403925 telescopic sight, telescope sight -n04404072 telethermometer -n04404200 teletypewriter, teleprinter, teletype machine, telex, telex machine -n04404412 television, television system -n04404817 television antenna, tv-antenna -n04404997 television camera, tv camera, camera -n04405540 television equipment, video equipment -n04405762 television monitor, tv monitor -n04405907 television receiver, television, television set, tv, tv set, idiot box, boob tube, telly, goggle box -n04406239 television room, tv room -n04406552 television transmitter -n04406687 telpher, telfer -n04406817 telpherage, telferage -n04407257 tempera, poster paint, poster color, poster colour -n04407435 temple -n04407686 temple -n04408871 temporary hookup, patch -n04409011 tender, supply ship -n04409128 tender, ship's boat, pinnace, cutter -n04409279 tender -n04409384 tenement, tenement house -n04409515 tennis ball -n04409625 tennis camp -n04409806 tennis racket, tennis racquet -n04409911 tenon -n04410086 tenor drum, tom-tom -n04410365 tenoroon -n04410485 tenpenny nail -n04410565 tenpin -n04410663 tensimeter -n04410760 tensiometer -n04410886 tensiometer -n04411019 tensiometer -n04411264 tent, collapsible shelter -n04411835 tenter -n04411966 tenterhook -n04412097 tent-fly, rainfly, fly sheet, fly, tent flap -n04412300 tent peg -n04412416 tepee, tipi, teepee -n04413151 terminal, pole -n04413419 terminal -n04413969 terraced house -n04414101 terra cotta -n04414199 terrarium -n04414319 terra sigillata, Samian ware -n04414476 terry, terry cloth, terrycloth -n04414675 Tesla coil -n04414909 tessera -n04415257 test equipment -n04415663 test rocket, research rocket, test instrument vehicle -n04415815 test room, testing room -n04416005 testudo -n04416901 tetraskelion, tetraskele -n04417086 tetrode -n04417180 textile machine -n04417361 textile mill -n04417672 thatch, thatched roof -n04417809 theater, theatre, house -n04418357 theater curtain, theatre curtain -n04418644 theater light -n04419073 theodolite, transit -n04419642 theremin -n04419868 thermal printer -n04420024 thermal reactor -n04420720 thermocouple, thermocouple junction -n04421083 thermoelectric thermometer, thermel, electric thermometer -n04421258 thermograph, thermometrograph -n04421417 thermograph -n04421582 thermohydrometer, thermogravimeter -n04421740 thermojunction -n04421872 thermometer -n04422409 thermonuclear reactor, fusion reactor -n04422566 thermopile -n04422727 thermos, thermos bottle, thermos flask -n04422875 thermostat, thermoregulator -n04423552 thigh pad -n04423687 thill -n04423845 thimble -n04424692 thinning shears -n04425804 third base, third -n04425977 third gear, third -n04426184 third rail -n04426316 thong -n04426427 thong -n04427216 three-centered arch, basket-handle arch -n04427473 three-decker -n04427559 three-dimensional radar, 3d radar -n04427715 three-piece suit -n04427857 three-quarter binding -n04428008 three-way switch, three-point switch -n04428191 thresher, thrasher, threshing machine -n04428382 threshing floor -n04428634 thriftshop, second-hand store -n04429038 throat protector -n04429376 throne -n04430475 thrust bearing -n04430605 thruster -n04430896 thumb -n04431025 thumbhole -n04431436 thumbscrew -n04431648 thumbstall -n04431745 thumbtack, drawing pin, pushpin -n04431925 thunderer -n04432043 thwart, cross thwart -n04432203 tiara -n04432662 ticking -n04432785 tickler coil -n04433377 tie, tie beam -n04433585 tie, railroad tie, crosstie, sleeper -n04434207 tie rack -n04434531 tie rod -n04434932 tights, leotards -n04435180 tile -n04435552 tile cutter -n04435653 tile roof -n04435759 tiller -n04435870 tilter -n04436012 tilt-top table, tip-top table, tip table -n04436185 timber -n04436329 timber -n04436401 timber hitch -n04436542 timbrel -n04436832 time bomb, infernal machine -n04436992 time capsule -n04437276 time clock -n04437380 time-delay measuring instrument, time-delay measuring system -n04437670 time-fuse -n04437953 timepiece, timekeeper, horologe -n04438304 timer -n04438507 timer -n04438643 time-switch -n04438897 tin -n04439505 tinderbox -n04439585 tine -n04439712 tinfoil, tin foil -n04440597 tippet -n04440963 tire chain, snow chain -n04441093 tire iron, tire tool -n04441528 titfer -n04441662 tithe barn -n04441790 titrator -n04442312 toaster -n04442441 toaster oven -n04442582 toasting fork -n04442741 toastrack -n04443164 tobacco pouch -n04443257 tobacco shop, tobacconist shop, tobacconist -n04443433 toboggan -n04443766 toby, toby jug, toby fillpot jug -n04444121 tocsin, warning bell -n04444218 toe -n04444749 toecap -n04444953 toehold -n04445040 toga -n04445154 toga virilis -n04445327 toggle -n04445610 toggle bolt -n04445782 toggle joint -n04445952 toggle switch, toggle, on-off switch, on/off switch -n04446162 togs, threads, duds -n04446276 toilet, lavatory, lav, can, john, privy, bathroom -n04446844 toilet bag, sponge bag -n04447028 toilet bowl -n04447156 toilet kit, travel kit -n04447276 toilet powder, bath powder, dusting powder -n04447443 toiletry, toilet articles -n04447861 toilet seat -n04448070 toilet water, eau de toilette -n04448185 tokamak -n04448361 token -n04449290 tollbooth, tolbooth, tollhouse -n04449449 toll bridge -n04449550 tollgate, tollbar -n04449700 toll line -n04449966 tomahawk, hatchet -n04450133 Tommy gun, Thompson submachine gun -n04450243 tomograph -n04450465 tone arm, pickup, pickup arm -n04450640 toner -n04450749 tongs, pair of tongs -n04450994 tongue -n04451139 tongue and groove joint -n04451318 tongue depressor -n04451636 tonometer -n04451818 tool -n04452528 tool bag -n04452615 toolbox, tool chest, tool cabinet, tool case -n04452757 toolshed, toolhouse -n04452848 tooth -n04453037 tooth -n04453156 toothbrush -n04453390 toothpick -n04453666 top -n04453910 top, cover -n04454654 topgallant, topgallant mast -n04454792 topgallant, topgallant sail -n04454908 topiary -n04455048 topknot -n04455250 topmast -n04455579 topper -n04455652 topsail -n04456011 toque -n04456115 torch -n04456472 torpedo -n04456734 torpedo -n04457157 torpedo -n04457326 torpedo boat -n04457474 torpedo-boat destroyer -n04457638 torpedo tube -n04457767 torque converter -n04457910 torque wrench -n04458201 torture chamber -n04458633 totem pole -n04458843 touch screen, touchscreen -n04459018 toupee, toupe -n04459122 touring car, phaeton, tourer -n04459243 tourist class, third class -n04459362 towel -n04459610 toweling, towelling -n04459773 towel rack, towel horse -n04459909 towel rail, towel bar -n04460130 tower -n04461437 town hall -n04461570 towpath, towing path -n04461696 tow truck, tow car, wrecker -n04461879 toy -n04462011 toy box, toy chest -n04462240 toyshop -n04462576 trace detector -n04463679 track, rail, rails, runway -n04464125 track -n04464615 trackball -n04464852 tracked vehicle -n04465050 tract house -n04465203 tract housing -n04465358 traction engine -n04465501 tractor -n04465666 tractor -n04466871 trail bike, dirt bike, scrambler -n04467099 trailer, house trailer -n04467307 trailer -n04467506 trailer camp, trailer park -n04467665 trailer truck, tractor trailer, trucking rig, rig, articulated lorry, semi -n04467899 trailing edge -n04468005 train, railroad train -n04469003 tramline, tramway, streetcar track -n04469251 trammel -n04469514 trampoline -n04469684 tramp steamer, tramp -n04469813 tramway, tram, aerial tramway, cable tramway, ropeway -n04470741 transdermal patch, skin patch -n04471148 transept -n04471315 transformer -n04471632 transistor, junction transistor, electronic transistor -n04471912 transit instrument -n04472243 transmission, transmission system -n04472563 transmission shaft -n04472726 transmitter, sender -n04472961 transom, traverse -n04473108 transom, transom window, fanlight -n04473275 transponder -n04473884 transporter -n04474035 transporter, car transporter -n04474187 transport ship -n04474466 trap -n04475309 trap door -n04475411 trapeze -n04475496 trave, traverse, crossbeam, crosspiece -n04475631 travel iron -n04475749 trawl, dragnet, trawl net -n04475900 trawl, trawl line, spiller, setline, trotline -n04476116 trawler, dragger -n04476259 tray -n04476526 tray cloth -n04476831 tread -n04476972 tread -n04477219 treadmill, treadwheel, tread-wheel -n04477387 treadmill -n04477548 treasure chest -n04477725 treasure ship -n04478066 treenail, trenail, trunnel -n04478383 trefoil arch -n04478512 trellis, treillage -n04478657 trench -n04479046 trench coat -n04479287 trench knife -n04479405 trepan -n04479526 trepan, trephine -n04479694 trestle -n04479823 trestle -n04479939 trestle bridge -n04480033 trestle table -n04480141 trestlework -n04480303 trews -n04480527 trial balloon -n04480853 triangle -n04480995 triangle -n04481524 triclinium -n04481642 triclinium -n04482177 tricorn, tricorne -n04482297 tricot -n04482393 tricycle, trike, velocipede -n04482975 trident -n04483073 trigger -n04483307 trimaran -n04483925 trimmer -n04484024 trimmer arch -n04484432 triode -n04485082 tripod -n04485423 triptych -n04485586 trip wire -n04485750 trireme -n04485884 triskelion, triskele -n04486054 triumphal arch -n04486213 trivet -n04486322 trivet -n04486616 troika -n04486934 troll -n04487081 trolleybus, trolley coach, trackless trolley -n04487394 trombone -n04487724 troop carrier, troop transport -n04487894 troopship -n04488202 trophy case -n04488427 trough -n04488530 trouser -n04488742 trouser cuff -n04488857 trouser press, pants presser -n04489008 trouser, pant -n04489695 trousseau -n04489817 trowel -n04490091 truck, motortruck -n04491312 trumpet arch -n04491388 truncheon, nightstick, baton, billy, billystick, billy club -n04491638 trundle bed, trundle, truckle bed, truckle -n04491769 trunk -n04491934 trunk hose -n04492060 trunk lid -n04492157 trunk line -n04492375 truss -n04492749 truss bridge -n04493109 try square -n04493259 T-square -n04493381 tub, vat -n04494204 tube, vacuum tube, thermionic vacuum tube, thermionic tube, electron tube, thermionic valve -n04495051 tuck box -n04495183 tucker -n04495310 tucker-bag -n04495450 tuck shop -n04495555 Tudor arch, four-centered arch -n04495698 tudung -n04495843 tugboat, tug, towboat, tower -n04496614 tulle -n04496726 tumble-dryer, tumble drier -n04496872 tumbler -n04497249 tumbrel, tumbril -n04497442 tun -n04497570 tunic -n04497801 tuning fork -n04498275 tupik, tupek, sealskin tent -n04498389 turban -n04498523 turbine -n04498873 turbogenerator -n04499062 tureen -n04499300 Turkish bath -n04499446 Turkish towel, terry towel -n04499554 Turk's head -n04499810 turnbuckle -n04500060 turner, food turner -n04500390 turnery -n04501127 turnpike -n04501281 turnspit -n04501370 turnstile -n04501550 turntable -n04501837 turntable, lazy Susan -n04501947 turret -n04502059 turret clock -n04502197 turtleneck, turtle, polo-neck -n04502502 tweed -n04502670 tweeter -n04502851 twenty-two, .22 -n04502989 twenty-two pistol -n04503073 twenty-two rifle -n04503155 twill -n04503269 twill, twill weave -n04503413 twin bed -n04503499 twinjet -n04503593 twist bit, twist drill -n04503705 two-by-four -n04504038 two-man tent -n04504141 two-piece, two-piece suit, lounge suit -n04504770 typesetting machine -n04505036 typewriter -n04505345 typewriter carriage -n04505470 typewriter keyboard -n04505888 tyrolean, tirolean -n04506289 uke, ukulele -n04506402 ulster -n04506506 ultracentrifuge -n04506688 ultramicroscope, dark-field microscope -n04506895 Ultrasuede -n04506994 ultraviolet lamp, ultraviolet source -n04507155 umbrella -n04507326 umbrella tent -n04507453 undercarriage -n04507689 undercoat, underseal -n04508163 undergarment, unmentionable -n04508489 underpants -n04508949 underwear, underclothes, underclothing -n04509171 undies -n04509260 uneven parallel bars, uneven bars -n04509417 unicycle, monocycle -n04509592 uniform -n04510706 universal joint, universal -n04511002 university -n04513827 upholstery -n04513998 upholstery material -n04514095 upholstery needle -n04514241 uplift -n04514648 upper berth, upper -n04515003 upright, upright piano -n04515444 upset, swage -n04515729 upstairs -n04515890 urceole -n04516116 urn -n04516214 urn -n04516354 used-car, secondhand car -n04516672 utensil -n04517211 Uzi -n04517408 vacation home -n04517823 vacuum, vacuum cleaner -n04517999 vacuum chamber -n04518132 vacuum flask, vacuum bottle -n04518343 vacuum gauge, vacuum gage -n04518643 Valenciennes, Valenciennes lace -n04518764 valise -n04519153 valve -n04519536 valve -n04519728 valve-in-head engine -n04519887 vambrace, lower cannon -n04520170 van -n04520382 van, caravan -n04520784 vane -n04520962 vaporizer, vaporiser -n04521571 variable-pitch propeller -n04521863 variometer -n04521987 varnish -n04522168 vase -n04523525 vault -n04523831 vault, bank vault -n04524142 vaulting horse, long horse, buck -n04524313 vehicle -n04524594 Velcro -n04524716 velocipede -n04524941 velour, velours -n04525038 velvet -n04525191 velveteen -n04525305 vending machine -n04525417 veneer, veneering -n04525584 Venetian blind -n04525821 Venn diagram, Venn's diagram -n04526520 ventilation, ventilation system, ventilating system -n04526800 ventilation shaft -n04526964 ventilator -n04527648 veranda, verandah, gallery -n04528079 verdigris -n04528968 vernier caliper, vernier micrometer -n04529108 vernier scale, vernier -n04529681 vertical file -n04529962 vertical stabilizer, vertical stabiliser, vertical fin, tail fin, tailfin -n04530283 vertical tail -n04530456 Very pistol, Verey pistol -n04530566 vessel, watercraft -n04531098 vessel -n04531873 vest, waistcoat -n04532022 vestiture -n04532106 vestment -n04532398 vest pocket -n04532504 vestry, sacristy -n04532670 viaduct -n04532831 vibraphone, vibraharp, vibes -n04533042 vibrator -n04533199 vibrator -n04533499 Victrola -n04533594 vicuna -n04533700 videocassette -n04533802 videocassette recorder, VCR -n04533946 videodisk, videodisc, DVD -n04534127 video recording, video -n04534359 videotape -n04534520 videotape -n04534895 vigil light, vigil candle -n04535252 villa -n04535370 villa -n04535524 villa -n04536153 viol -n04536335 viola -n04536465 viola da braccio -n04536595 viola da gamba, gamba, bass viol -n04536765 viola d'amore -n04536866 violin, fiddle -n04537436 virginal, pair of virginals -n04538249 viscometer, viscosimeter -n04538403 viscose rayon, viscose -n04538552 vise, bench vise -n04538878 visor, vizor -n04539053 visual display unit, VDU -n04539203 vivarium -n04539407 Viyella -n04539794 voile -n04540053 volleyball -n04540255 volleyball net -n04540397 voltage regulator -n04540761 voltaic cell, galvanic cell, primary cell -n04541136 voltaic pile, pile, galvanic pile -n04541320 voltmeter -n04541662 vomitory -n04541777 von Neumann machine -n04541987 voting booth -n04542095 voting machine -n04542329 voussoir -n04542474 vox angelica, voix celeste -n04542595 vox humana -n04542715 waders -n04542858 wading pool -n04542943 waffle iron -n04543158 wagon, waggon -n04543509 wagon, coaster wagon -n04543636 wagon tire -n04543772 wagon wheel -n04543924 wain -n04543996 wainscot, wainscoting, wainscotting -n04544325 wainscoting, wainscotting -n04544450 waist pack, belt bag -n04545305 walker, baby-walker, go-cart -n04545471 walker, Zimmer, Zimmer frame -n04545748 walker -n04545858 walkie-talkie, walky-talky -n04545984 walk-in -n04546081 walking shoe -n04546194 walking stick -n04546340 Walkman -n04546595 walk-up apartment, walk-up -n04546855 wall -n04547592 wall -n04548280 wall clock -n04548362 wallet, billfold, notecase, pocketbook -n04549028 wall tent -n04549122 wall unit -n04549629 wand -n04549721 Wankel engine, Wankel rotary engine, epitrochoidal engine -n04549919 ward, hospital ward -n04550184 wardrobe, closet, press -n04550676 wardroom -n04551055 warehouse, storage warehouse -n04551833 warming pan -n04552097 war paint -n04552348 warplane, military plane -n04552551 war room -n04552696 warship, war vessel, combat ship -n04553389 wash -n04553561 wash-and-wear -n04553703 washbasin, handbasin, washbowl, lavabo, wash-hand basin -n04554211 washboard, splashboard -n04554406 washboard -n04554684 washer, automatic washer, washing machine -n04554871 washer -n04554998 washhouse -n04555291 washroom -n04555400 washstand, wash-hand stand -n04555600 washtub -n04555700 wastepaper basket, waste-paper basket, wastebasket, waste basket, circular file -n04555897 watch, ticker -n04556408 watch cap -n04556533 watch case -n04556664 watch glass -n04556948 watchtower -n04557308 water-base paint -n04557522 water bed -n04557648 water bottle -n04557751 water butt -n04558059 water cart -n04558199 water chute -n04558478 water closet, closet, W.C., loo -n04558804 watercolor, water-color, watercolour, water-colour -n04559023 water-cooled reactor -n04559166 water cooler -n04559451 water faucet, water tap, tap, hydrant -n04559620 water filter -n04559730 water gauge, water gage, water glass -n04559910 water glass -n04559994 water hazard -n04560113 water heater, hot-water heater, hot-water tank -n04560292 watering can, watering pot -n04560502 watering cart -n04560619 water jacket -n04560804 water jug -n04560882 water jump -n04561010 water level -n04561287 water meter -n04561422 water mill -n04561734 waterproof -n04561857 waterproofing -n04561965 water pump -n04562122 water scooter, sea scooter, scooter -n04562262 water ski -n04562496 waterspout -n04562935 water tower -n04563020 water wagon, water waggon -n04563204 waterwheel, water wheel -n04563413 waterwheel, water wheel -n04563560 water wings -n04563790 waterworks -n04564278 wattmeter -n04564581 waxwork, wax figure -n04565039 ways, shipway, slipway -n04565375 weapon, arm, weapon system -n04566257 weaponry, arms, implements of war, weapons system, munition -n04566561 weapons carrier -n04566756 weathercock -n04567098 weatherglass -n04567593 weather satellite, meteorological satellite -n04567746 weather ship -n04568069 weathervane, weather vane, vane, wind vane -n04568557 web, entanglement -n04568713 web -n04568841 webbing -n04569063 webcam -n04569520 wedge -n04569822 wedge -n04570118 wedgie -n04570214 Wedgwood -n04570416 weeder, weed-whacker -n04570532 weeds, widow's weeds -n04570815 weekender -n04570958 weighbridge -n04571292 weight, free weight, exercising weight -n04571566 weir -n04571686 weir -n04571800 welcome wagon -n04571958 weld -n04572121 welder's mask -n04572235 weldment -n04572935 well -n04573045 wellhead -n04573281 welt -n04573379 Weston cell, cadmium cell -n04573513 wet bar -n04573625 wet-bulb thermometer -n04573832 wet cell -n04573937 wet fly -n04574067 wet suit -n04574348 whaleboat -n04574471 whaler, whaling ship -n04574606 whaling gun -n04574999 wheel -n04575723 wheel -n04575824 wheel and axle -n04576002 wheelchair -n04576211 wheeled vehicle -n04576971 wheelwork -n04577139 wherry -n04577293 wherry, Norfolk wherry -n04577426 whetstone -n04577567 whiffletree, whippletree, swingletree -n04577769 whip -n04578112 whipcord -n04578329 whipping post -n04578559 whipstitch, whipping, whipstitching -n04578708 whirler -n04578801 whisk, whisk broom -n04578934 whisk -n04579056 whiskey bottle -n04579145 whiskey jug -n04579230 whispering gallery, whispering dome -n04579432 whistle -n04579667 whistle -n04579986 white -n04580493 white goods -n04581102 whitewash -n04581595 whorehouse, brothel, bordello, bagnio, house of prostitution, house of ill repute, bawdyhouse, cathouse, sporting house -n04581829 wick, taper -n04582205 wicker, wickerwork, caning -n04582349 wicker basket -n04582771 wicket, hoop -n04582869 wicket -n04583022 wickiup, wikiup -n04583212 wide-angle lens, fisheye lens -n04583620 widebody aircraft, wide-body aircraft, wide-body, twin-aisle airplane -n04583888 wide wale -n04583967 widow's walk -n04584056 Wiffle, Wiffle Ball -n04584207 wig -n04584373 wigwam -n04585128 Wilton, Wilton carpet -n04585318 wimple -n04585456 wincey -n04585626 winceyette -n04585745 winch, windlass -n04585980 Winchester -n04586072 windbreak, shelterbelt -n04586581 winder, key -n04586932 wind instrument, wind -n04587327 windjammer -n04587404 windmill, aerogenerator, wind generator -n04587559 windmill -n04587648 window -n04588739 window -n04589190 window blind -n04589325 window box -n04589434 window envelope -n04589593 window frame -n04589890 window screen -n04590021 window seat -n04590129 window shade -n04590263 windowsill -n04590553 windshield, windscreen -n04590746 windshield wiper, windscreen wiper, wiper, wiper blade -n04590933 Windsor chair -n04591056 Windsor knot -n04591157 Windsor tie -n04591249 wind tee -n04591359 wind tunnel -n04591517 wind turbine -n04591631 wine bar -n04591713 wine bottle -n04591887 wine bucket, wine cooler -n04592005 wine cask, wine barrel -n04592099 wineglass -n04592356 winepress -n04592465 winery, wine maker -n04592596 wineskin -n04592741 wing -n04593077 wing chair -n04593185 wing nut, wing-nut, wing screw, butterfly nut, thumbnut -n04593376 wing tip -n04593524 wing tip -n04593629 winker, blinker, blinder -n04593866 wiper, wiper arm, contact arm -n04594114 wiper motor -n04594218 wire -n04594489 wire, conducting wire -n04594742 wire cloth -n04594828 wire cutter -n04594919 wire gauge, wire gage -n04595028 wireless local area network, WLAN, wireless fidelity, WiFi -n04595285 wire matrix printer, wire printer, stylus printer -n04595501 wire recorder -n04595611 wire stripper -n04595762 wirework, grillwork -n04595855 wiring -n04596116 wishing cap -n04596492 witness box, witness stand -n04596742 wok -n04596852 woman's clothing -n04597066 wood -n04597309 woodcarving -n04597400 wood chisel -n04597804 woodenware -n04597913 wooden spoon -n04598136 woodscrew -n04598318 woodshed -n04598416 wood vise, woodworking vise, shoulder vise -n04598582 woodwind, woodwind instrument, wood -n04598965 woof, weft, filling, pick -n04599124 woofer -n04599235 wool, woolen, woollen -n04600312 workbasket, workbox, workbag -n04600486 workbench, work bench, bench -n04600912 work-clothing, work-clothes -n04601041 workhouse -n04601159 workhouse -n04601938 workpiece -n04602762 workroom -n04602840 works, workings -n04602956 work-shirt -n04603399 workstation -n04603729 worktable, work table -n04603872 workwear -n04604276 World Wide Web, WWW, web -n04604644 worm fence, snake fence, snake-rail fence, Virginia fence -n04604806 worm gear -n04605057 worm wheel -n04605163 worsted -n04605321 worsted, worsted yarn -n04605446 wrap, wrapper -n04605572 wraparound -n04605726 wrapping, wrap, wrapper -n04606251 wreck -n04606574 wrench, spanner -n04607035 wrestling mat -n04607242 wringer -n04607640 wrist pad -n04607759 wrist pin, gudgeon pin -n04607869 wristwatch, wrist watch -n04607982 writing arm -n04608329 writing desk -n04608435 writing desk -n04608567 writing implement -n04608809 xerographic printer -n04608923 Xerox, xerographic copier, Xerox machine -n04609531 X-ray film -n04609651 X-ray machine -n04609811 X-ray tube -n04610013 yacht, racing yacht -n04610176 yacht chair -n04610274 yagi, Yagi aerial -n04610503 yard -n04610676 yard -n04611351 yardarm -n04611795 yard marker -n04611916 yardstick, yard measure -n04612026 yarmulke, yarmulka, yarmelke -n04612159 yashmak, yashmac -n04612257 yataghan -n04612373 yawl, dandy -n04612504 yawl -n04612840 yoke -n04613015 yoke -n04613158 yoke, coupling -n04613696 yurt -n04613939 Zamboni -n04614505 zero -n04614655 ziggurat, zikkurat, zikurat -n04614844 zill -n04615149 zip gun -n04615226 zither, cither, zithern -n04615644 zoot suit -n04682018 shading -n04950713 grain -n04950952 wood grain, woodgrain, woodiness -n04951071 graining, woodgraining -n04951186 marbleization, marbleisation, marbleizing, marbleising -n04951373 light, lightness -n04951716 aura, aureole, halo, nimbus, glory, gloriole -n04951875 sunniness -n04953296 glint -n04953678 opalescence, iridescence -n04955160 polish, gloss, glossiness, burnish -n04957356 primary color for pigments, primary colour for pigments -n04957589 primary color for light, primary colour for light -n04958634 colorlessness, colourlessness, achromatism, achromaticity -n04958865 mottle -n04959061 achromia -n04959230 shade, tint, tincture, tone -n04959672 chromatic color, chromatic colour, spectral color, spectral colour -n04960277 black, blackness, inkiness -n04960582 coal black, ebony, jet black, pitch black, sable, soot black -n04961062 alabaster -n04961331 bone, ivory, pearl, off-white -n04961691 gray, grayness, grey, greyness -n04962062 ash grey, ash gray, silver, silver grey, silver gray -n04962240 charcoal, charcoal grey, charcoal gray, oxford grey, oxford gray -n04963111 sanguine -n04963307 Turkey red, alizarine red -n04963588 crimson, ruby, deep red -n04963740 dark red -n04964001 claret -n04964799 fuschia -n04964878 maroon -n04965179 orange, orangeness -n04965451 reddish orange -n04965661 yellow, yellowness -n04966543 gamboge, lemon, lemon yellow, maize -n04966941 pale yellow, straw, wheat -n04967191 green, greenness, viridity -n04967561 greenishness -n04967674 sea green -n04967801 sage green -n04967882 bottle green -n04968056 emerald -n04968139 olive green, olive-green -n04968749 jade green, jade -n04968895 blue, blueness -n04969242 azure, cerulean, sapphire, lazuline, sky-blue -n04969540 steel blue -n04969798 greenish blue, aqua, aquamarine, turquoise, cobalt blue, peacock blue -n04969952 purplish blue, royal blue -n04970059 purple, purpleness -n04970312 Tyrian purple -n04970398 indigo -n04970470 lavender -n04970631 reddish purple, royal purple -n04970916 pink -n04971211 carnation -n04971313 rose, rosiness -n04972350 chestnut -n04972451 chocolate, coffee, deep brown, umber, burnt umber -n04972801 light brown -n04973020 tan, topaz -n04973291 beige, ecru -n04973386 reddish brown, sepia, burnt sienna, Venetian red, mahogany -n04973585 brick red -n04973669 copper, copper color -n04973816 Indian red -n04974145 puce -n04974340 olive -n04974859 ultramarine -n04975739 complementary color, complementary -n04976319 pigmentation -n04976952 complexion, skin color, skin colour -n04977412 ruddiness, rosiness -n04978561 nonsolid color, nonsolid colour, dithered color, dithered colour -n04979002 aposematic coloration, warning coloration -n04979307 cryptic coloration -n04981658 ring -n05102764 center of curvature, centre of curvature -n05218119 cadaver, corpse, stiff, clay, remains -n05233741 mandibular notch -n05235879 rib -n05238282 skin, tegument, cutis -n05239437 skin graft -n05241218 epidermal cell -n05241485 melanocyte -n05241662 prickle cell -n05242070 columnar cell, columnar epithelial cell -n05242239 spongioblast -n05242928 squamous cell -n05244421 amyloid plaque, amyloid protein plaque -n05244755 dental plaque, bacterial plaque -n05244934 macule, macula -n05245192 freckle, lentigo -n05257476 bouffant -n05257967 sausage curl -n05258051 forelock -n05258627 spit curl, kiss curl -n05259914 pigtail -n05260127 pageboy -n05260240 pompadour -n05261310 thatch -n05262422 soup-strainer, toothbrush -n05262534 mustachio, moustachio, handle-bars -n05262698 walrus mustache, walrus moustache -n05263183 stubble -n05263316 vandyke beard, vandyke -n05263448 soul patch, Attilio -n05265736 esophageal smear -n05266096 paraduodenal smear, duodenal smear -n05266879 specimen -n05278922 punctum -n05279953 glenoid fossa, glenoid cavity -n05282652 diastema -n05285623 marrow, bone marrow -n05302499 mouth, oral cavity, oral fissure, rima oris -n05314075 canthus -n05399034 milk -n05399243 mother's milk -n05399356 colostrum, foremilk -n05418717 vein, vena, venous blood vessel -n05427346 ganglion cell, gangliocyte -n05442594 X chromosome -n05447757 embryonic cell, formative cell -n05448704 myeloblast -n05448827 sideroblast -n05449196 osteocyte -n05449661 megalocyte, macrocyte -n05449959 leukocyte, leucocyte, white blood cell, white cell, white blood corpuscle, white corpuscle, WBC -n05450617 histiocyte -n05451099 fixed phagocyte -n05451384 lymphocyte, lymph cell -n05453412 monoblast -n05453657 neutrophil, neutrophile -n05453815 microphage -n05454833 sickle cell -n05454978 siderocyte -n05455113 spherocyte -n05458173 ootid -n05458576 oocyte -n05459101 spermatid -n05459457 Leydig cell, Leydig's cell -n05459769 striated muscle cell, striated muscle fiber -n05460759 smooth muscle cell -n05464534 Ranvier's nodes, nodes of Ranvier -n05467054 neuroglia, glia -n05467758 astrocyte -n05468098 protoplasmic astrocyte -n05468739 oligodendrocyte -n05469664 proprioceptor -n05469861 dendrite -n05475397 sensory fiber, afferent fiber -n05482922 subarachnoid space -n05486510 cerebral cortex, cerebral mantle, pallium, cortex -n05491154 renal cortex -n05526957 prepuce, foreskin -n05538625 head, caput -n05539947 scalp -n05541509 frontal eminence -n05542893 suture, sutura, fibrous joint -n05545879 foramen magnum -n05571341 esophagogastric junction, oesophagogastric junction -n05578095 heel -n05581932 cuticle -n05584746 hangnail, agnail -n05586759 exoskeleton -n05604434 abdominal wall -n05716342 lemon -n06008896 coordinate axis -n06209940 landscape -n06254669 medium -n06255081 vehicle -n06255613 paper -n06259898 channel, transmission channel -n06262567 film, cinema, celluloid -n06262943 silver screen -n06263202 free press -n06263369 press, public press -n06263609 print media -n06263762 storage medium, data-storage medium -n06263895 magnetic storage medium, magnetic medium, magnetic storage -n06266417 journalism, news media -n06266633 Fleet Street -n06266710 photojournalism -n06266878 news photography -n06266973 rotogravure -n06267145 newspaper, paper -n06267564 daily -n06267655 gazette -n06267758 school newspaper, school paper -n06267893 tabloid, rag, sheet -n06267991 yellow journalism, tabloid, tab -n06271778 telecommunication, telecom -n06272290 telephone, telephony -n06272612 voice mail, voicemail -n06272803 call, phone call, telephone call -n06273207 call-back -n06273294 collect call -n06273414 call forwarding -n06273555 call-in -n06273743 call waiting -n06273890 crank call -n06273986 local call -n06274092 long distance, long-distance call, trunk call -n06274292 toll call -n06274546 wake-up call -n06274760 three-way calling -n06274921 telegraphy -n06275095 cable, cablegram, overseas telegram -n06275353 wireless -n06275471 radiotelegraph, radiotelegraphy, wireless telegraphy -n06276501 radiotelephone, radiotelephony, wireless telephone -n06276697 broadcasting -n06276902 Rediffusion -n06277025 multiplex -n06277135 radio, radiocommunication, wireless -n06277280 television, telecasting, TV, video -n06278338 cable television, cable -n06278475 high-definition television, HDTV -n06281040 reception -n06281175 signal detection, detection -n06340977 Hakham -n06359193 web site, website, internet site, site -n06359467 chat room, chatroom -n06359657 portal site, portal -n06415688 jotter -n06417096 breviary -n06418693 wordbook -n06419354 desk dictionary, collegiate dictionary -n06423496 reckoner, ready reckoner -n06470073 document, written document, papers -n06591815 album, record album -n06592078 concept album -n06592281 rock opera -n06592421 tribute album, benefit album -n06595351 magazine, mag -n06596179 colour supplement -n06596364 comic book -n06596474 news magazine -n06596607 pulp, pulp magazine -n06596727 slick, slick magazine, glossy -n06596845 trade magazine -n06613686 movie, film, picture, moving picture, moving-picture show, motion picture, motion-picture show, picture show, pic, flick -n06614901 outtake -n06616216 shoot-'em-up -n06618653 spaghetti Western -n06625062 encyclical, encyclical letter -n06785654 crossword puzzle, crossword -n06793231 sign -n06794110 street sign -n06874185 traffic light, traffic signal, stoplight -n06883725 swastika, Hakenkreuz -n06892775 concert -n06998748 artwork, art, graphics, nontextual matter -n07005523 lobe -n07248320 book jacket, dust cover, dust jacket, dust wrapper -n07273802 cairn -n07461050 three-day event -n07556406 comfort food -n07556637 comestible, edible, eatable, pabulum, victual, victuals -n07556872 tuck -n07556970 course -n07557165 dainty, delicacy, goody, kickshaw, treat -n07557434 dish -n07560193 fast food -n07560331 finger food -n07560422 ingesta -n07560542 kosher -n07560652 fare -n07560903 diet -n07561112 diet -n07561590 dietary -n07561848 balanced diet -n07562017 bland diet, ulcer diet -n07562172 clear liquid diet -n07562379 diabetic diet -n07562495 dietary supplement -n07562651 carbohydrate loading, carbo loading -n07562881 fad diet -n07562984 gluten-free diet -n07563207 high-protein diet -n07563366 high-vitamin diet, vitamin-deficiency diet -n07563642 light diet -n07563800 liquid diet -n07564008 low-calorie diet -n07564101 low-fat diet -n07564292 low-sodium diet, low-salt diet, salt-free diet -n07564515 macrobiotic diet -n07564629 reducing diet, obesity diet -n07564796 soft diet, pap, spoon food -n07564971 vegetarianism -n07565083 menu -n07565161 chow, chuck, eats, grub -n07565259 board, table -n07565608 mess -n07565725 ration -n07565945 field ration -n07566092 K ration -n07566231 C-ration -n07566340 foodstuff, food product -n07566863 starches -n07567039 breadstuff -n07567139 coloring, colouring, food coloring, food colouring, food color, food colour -n07567390 concentrate -n07567611 tomato concentrate -n07567707 meal -n07567980 kibble -n07568095 cornmeal, Indian meal -n07568241 farina -n07568389 matzo meal, matzoh meal, matzah meal -n07568502 oatmeal, rolled oats -n07568625 pea flour -n07568818 roughage, fiber -n07568991 bran -n07569106 flour -n07569423 plain flour -n07569543 wheat flour -n07569644 whole wheat flour, graham flour, graham, whole meal flour -n07569873 soybean meal, soybean flour, soy flour -n07570021 semolina -n07570530 corn gluten feed -n07570720 nutriment, nourishment, nutrition, sustenance, aliment, alimentation, victuals -n07572353 commissariat, provisions, provender, viands, victuals -n07572616 larder -n07572858 frozen food, frozen foods -n07572957 canned food, canned foods, canned goods, tinned goods -n07573103 canned meat, tinned meat -n07573347 Spam -n07573453 dehydrated food, dehydrated foods -n07573563 square meal -n07573696 meal, repast -n07574176 potluck -n07574426 refection -n07574504 refreshment -n07574602 breakfast -n07574780 continental breakfast, petit dejeuner -n07574923 brunch -n07575076 lunch, luncheon, tiffin, dejeuner -n07575226 business lunch -n07575392 high tea -n07575510 tea, afternoon tea, teatime -n07575726 dinner -n07575984 supper -n07576182 buffet -n07576438 picnic -n07576577 cookout -n07576781 barbecue, barbeque -n07576969 clambake -n07577144 fish fry -n07577374 bite, collation, snack -n07577538 nosh -n07577657 nosh-up -n07577772 ploughman's lunch -n07577918 coffee break, tea break -n07578093 banquet, feast, spread -n07579575 entree, main course -n07579688 piece de resistance -n07579787 plate -n07579917 adobo -n07580053 side dish, side order, entremets -n07580253 special -n07580359 casserole -n07580470 chicken casserole -n07580592 chicken cacciatore, chicken cacciatora, hunter's chicken -n07581249 antipasto -n07581346 appetizer, appetiser, starter -n07581607 canape -n07581775 cocktail -n07581931 fruit cocktail -n07582027 crab cocktail -n07582152 shrimp cocktail -n07582277 hors d'oeuvre -n07582441 relish -n07582609 dip -n07582811 bean dip -n07582892 cheese dip -n07582970 clam dip -n07583066 guacamole -n07583197 soup -n07583865 soup du jour -n07583978 alphabet soup -n07584110 consomme -n07584228 madrilene -n07584332 bisque -n07584423 borsch, borsh, borscht, borsht, borshch, bortsch -n07584593 broth -n07584859 barley water -n07584938 bouillon -n07585015 beef broth, beef stock -n07585107 chicken broth, chicken stock -n07585208 broth, stock -n07585474 stock cube -n07585557 chicken soup -n07585644 cock-a-leekie, cocky-leeky -n07585758 gazpacho -n07585906 gumbo -n07585997 julienne -n07586099 marmite -n07586179 mock turtle soup -n07586318 mulligatawny -n07586485 oxtail soup -n07586604 pea soup -n07586718 pepper pot, Philadelphia pepper pot -n07586894 petite marmite, minestrone, vegetable soup -n07587023 potage, pottage -n07587111 pottage -n07587206 turtle soup, green turtle soup -n07587331 eggdrop soup -n07587441 chowder -n07587618 corn chowder -n07587700 clam chowder -n07587819 Manhattan clam chowder -n07587962 New England clam chowder -n07588111 fish chowder -n07588193 won ton, wonton, wonton soup -n07588299 split-pea soup -n07588419 green pea soup, potage St. Germain -n07588574 lentil soup -n07588688 Scotch broth -n07588817 vichyssoise -n07588947 stew -n07589458 bigos -n07589543 Brunswick stew -n07589724 burgoo -n07589872 burgoo -n07589967 olla podrida, Spanish burgoo -n07590068 mulligan stew, mulligan, Irish burgoo -n07590177 purloo, chicken purloo, poilu -n07590320 goulash, Hungarian goulash, gulyas -n07590502 hotchpotch -n07590611 hot pot, hotpot -n07590752 beef goulash -n07590841 pork-and-veal goulash -n07590974 porkholt -n07591049 Irish stew -n07591162 oyster stew -n07591236 lobster stew -n07591330 lobscouse, lobscuse, scouse -n07591473 fish stew -n07591586 bouillabaisse -n07591813 matelote -n07591961 paella -n07592094 fricassee -n07592317 chicken stew -n07592400 turkey stew -n07592481 beef stew -n07592656 ragout -n07592768 ratatouille -n07592922 salmi -n07593004 pot-au-feu -n07593107 slumgullion -n07593199 smorgasbord -n07593471 viand -n07593774 ready-mix -n07593972 brownie mix -n07594066 cake mix -n07594155 lemonade mix -n07594250 self-rising flour, self-raising flour -n07594737 choice morsel, tidbit, titbit -n07594840 savory, savoury -n07595051 calf's-foot jelly -n07595180 caramel, caramelized sugar -n07595368 lump sugar -n07595649 cane sugar -n07595751 castor sugar, caster sugar -n07595914 powdered sugar -n07596046 granulated sugar -n07596160 icing sugar -n07596362 corn sugar -n07596452 brown sugar -n07596566 demerara, demerara sugar -n07596684 sweet, confection -n07596967 confectionery -n07597145 confiture -n07597263 sweetmeat -n07597365 candy, confect -n07598256 candy bar -n07598529 carob bar -n07598622 hardbake -n07598734 hard candy -n07598928 barley-sugar, barley candy -n07599068 brandyball -n07599161 jawbreaker -n07599242 lemon drop -n07599383 sourball -n07599468 patty -n07599554 peppermint patty -n07599649 bonbon -n07599783 brittle, toffee, toffy -n07599911 peanut brittle -n07599998 chewing gum, gum -n07600177 gum ball -n07600285 bubble gum -n07600394 butterscotch -n07600506 candied fruit, succade, crystallized fruit -n07600696 candied apple, candy apple, taffy apple, caramel apple, toffee apple -n07600895 crystallized ginger -n07601025 grapefruit peel -n07601175 lemon peel -n07601290 orange peel -n07601407 candied citrus peel -n07601572 candy cane -n07601686 candy corn -n07601809 caramel -n07602650 center, centre -n07604956 comfit -n07605040 cotton candy, spun sugar, candyfloss -n07605198 dragee -n07605282 dragee -n07605380 fondant -n07605474 fudge -n07605597 chocolate fudge -n07605693 divinity, divinity fudge -n07605804 penuche, penoche, panoche, panocha -n07605944 gumdrop -n07606058 jujube -n07606191 honey crisp -n07606278 mint, mint candy -n07606419 horehound -n07606538 peppermint, peppermint candy -n07606669 jelly bean, jelly egg -n07606764 kiss, candy kiss -n07606933 molasses kiss -n07607027 meringue kiss -n07607138 chocolate kiss -n07607361 licorice, liquorice -n07607492 Life Saver -n07607605 lollipop, sucker, all-day sucker -n07607707 lozenge -n07607832 cachou -n07607967 cough drop, troche, pastille, pastil -n07608098 marshmallow -n07608245 marzipan, marchpane -n07608339 nougat -n07608429 nougat bar -n07608533 nut bar -n07608641 peanut bar -n07608721 popcorn ball -n07608866 praline -n07608980 rock candy -n07609083 rock candy, rock -n07609215 sugar candy -n07609316 sugarplum -n07609407 taffy -n07609549 molasses taffy -n07609632 truffle, chocolate truffle -n07609728 Turkish Delight -n07609840 dessert, sweet, afters -n07610295 ambrosia, nectar -n07610502 ambrosia -n07610620 baked Alaska -n07610746 blancmange -n07610890 charlotte -n07611046 compote, fruit compote -n07611148 dumpling -n07611267 flan -n07611358 frozen dessert -n07611733 junket -n07611839 mousse -n07611991 mousse -n07612137 pavlova -n07612273 peach melba -n07612367 whip -n07612530 prune whip -n07612632 pudding -n07612996 pudding, pud -n07613158 syllabub, sillabub -n07613266 tiramisu -n07613480 trifle -n07613671 tipsy cake -n07613815 jello, Jell-O -n07614103 apple dumpling -n07614198 ice, frappe -n07614348 water ice, sorbet -n07614500 ice cream, icecream -n07614730 ice-cream cone -n07614825 chocolate ice cream -n07615052 Neapolitan ice cream -n07615190 peach ice cream -n07615289 sherbert, sherbet -n07615460 strawberry ice cream -n07615569 tutti-frutti -n07615671 vanilla ice cream -n07615774 ice lolly, lolly, lollipop, popsicle -n07615954 ice milk -n07616046 frozen yogurt -n07616174 snowball -n07616265 snowball -n07616386 parfait -n07616487 ice-cream sundae, sundae -n07616590 split -n07616748 banana split -n07616906 frozen pudding -n07617051 frozen custard, soft ice cream -n07617188 pudding -n07617344 flummery -n07617447 fish mousse -n07617526 chicken mousse -n07617611 chocolate mousse -n07617708 plum pudding, Christmas pudding -n07617839 carrot pudding -n07617932 corn pudding -n07618029 steamed pudding -n07618119 duff, plum duff -n07618281 vanilla pudding -n07618432 chocolate pudding -n07618587 brown Betty -n07618684 Nesselrode, Nesselrode pudding -n07618871 pease pudding -n07619004 custard -n07619208 creme caramel -n07619301 creme anglais -n07619409 creme brulee -n07619508 fruit custard -n07619881 tapioca -n07620047 tapioca pudding -n07620145 roly-poly, roly-poly pudding -n07620327 suet pudding -n07620597 Bavarian cream -n07620689 maraschino, maraschino cherry -n07621264 nonpareil -n07621497 zabaglione, sabayon -n07621618 garnish -n07623136 pastry, pastry dough -n07624466 turnover -n07624666 apple turnover -n07624757 knish -n07624924 pirogi, piroshki, pirozhki -n07625061 samosa -n07625324 timbale -n07627931 puff paste, pate feuillete -n07628068 phyllo -n07628181 puff batter, pouf paste, pate a choux -n07631926 ice-cream cake, icebox cake -n07639069 doughnut, donut, sinker -n07641928 fish cake, fish ball -n07642361 fish stick, fish finger -n07642471 conserve, preserve, conserves, preserves -n07642742 apple butter -n07642833 chowchow -n07642933 jam -n07643026 lemon curd, lemon cheese -n07643200 strawberry jam, strawberry preserves -n07643306 jelly -n07643474 apple jelly -n07643577 crabapple jelly -n07643679 grape jelly -n07643764 marmalade -n07643891 orange marmalade -n07643981 gelatin, jelly -n07644244 gelatin dessert -n07648913 buffalo wing -n07648997 barbecued wing -n07650792 mess -n07650903 mince -n07651025 puree -n07654148 barbecue, barbeque -n07654298 biryani, biriani -n07655067 escalope de veau Orloff -n07655263 saute -n07663899 patty, cake -n07665438 veal parmesan, veal parmigiana -n07666176 veal cordon bleu -n07672914 margarine, margarin, oleo, oleomargarine, marge -n07678586 mincemeat -n07678729 stuffing, dressing -n07678953 turkey stuffing -n07679034 oyster stuffing, oyster dressing -n07679140 forcemeat, farce -n07679356 bread, breadstuff, staff of life -n07680168 anadama bread -n07680313 bap -n07680416 barmbrack -n07680517 breadstick, bread-stick -n07680655 grissino -n07680761 brown bread, Boston brown bread -n07680932 bun, roll -n07681264 tea bread -n07681355 caraway seed bread -n07681450 challah, hallah -n07681691 cinnamon bread -n07681805 cracked-wheat bread -n07681926 cracker -n07682197 crouton -n07682316 dark bread, whole wheat bread, whole meal bread, brown bread -n07682477 English muffin -n07682624 flatbread -n07682808 garlic bread -n07682952 gluten bread -n07683039 graham bread -n07683138 Host -n07683265 flatbrod -n07683360 bannock -n07683490 chapatti, chapati -n07683617 pita, pocket bread -n07683786 loaf of bread, loaf -n07684084 French loaf -n07684164 matzo, matzoh, matzah, unleavened bread -n07684289 nan, naan -n07684422 onion bread -n07684517 raisin bread -n07684600 quick bread -n07684938 banana bread -n07685031 date bread -n07685118 date-nut bread -n07685218 nut bread -n07685303 oatcake -n07685399 Irish soda bread -n07685546 skillet bread, fry bread -n07685730 rye bread -n07685918 black bread, pumpernickel -n07686021 Jewish rye bread, Jewish rye -n07686202 limpa -n07686299 Swedish rye bread, Swedish rye -n07686461 salt-rising bread -n07686634 simnel -n07686720 sour bread, sourdough bread -n07686873 toast -n07687053 wafer -n07687211 white bread, light bread -n07687381 baguet, baguette -n07687469 French bread -n07687626 Italian bread -n07687789 cornbread -n07688021 corn cake -n07688130 skillet corn bread -n07688265 ashcake, ash cake, corn tash -n07688412 hoecake -n07688624 cornpone, pone -n07688757 corn dab, corn dodger, dodger -n07688898 hush puppy, hushpuppy -n07689003 johnnycake, johnny cake, journey cake -n07689217 Shawnee cake -n07689313 spoon bread, batter bread -n07689490 cinnamon toast -n07689624 orange toast -n07689757 Melba toast -n07689842 zwieback, rusk, Brussels biscuit, twice-baked bread -n07690019 frankfurter bun, hotdog bun -n07690152 hamburger bun, hamburger roll -n07690273 muffin, gem -n07690431 bran muffin -n07690511 corn muffin -n07690585 Yorkshire pudding -n07690739 popover -n07690892 scone -n07691091 drop scone, griddlecake, Scotch pancake -n07691237 cross bun, hot cross bun -n07691539 brioche -n07691650 crescent roll, croissant -n07691758 hard roll, Vienna roll -n07691863 soft roll -n07691954 kaiser roll -n07692114 Parker House roll -n07692248 clover-leaf roll -n07692405 onion roll -n07692517 bialy, bialystoker -n07692614 sweet roll, coffee roll -n07692887 bear claw, bear paw -n07693048 cinnamon roll, cinnamon bun, cinnamon snail -n07693223 honey bun, sticky bun, caramel bun, schnecken -n07693439 pinwheel roll -n07693590 danish, danish pastry -n07693725 bagel, beigel -n07693889 onion bagel -n07693972 biscuit -n07694169 rolled biscuit -n07694403 baking-powder biscuit -n07694516 buttermilk biscuit, soda biscuit -n07694659 shortcake -n07694839 hardtack, pilot biscuit, pilot bread, sea biscuit, ship biscuit -n07695187 saltine -n07695284 soda cracker -n07695410 oyster cracker -n07695504 water biscuit -n07695652 graham cracker -n07695742 pretzel -n07695878 soft pretzel -n07695965 sandwich -n07696403 sandwich plate -n07696527 butty -n07696625 ham sandwich -n07696728 chicken sandwich -n07696839 club sandwich, three-decker, triple-decker -n07696977 open-face sandwich, open sandwich -n07697100 hamburger, beefburger, burger -n07697313 cheeseburger -n07697408 tunaburger -n07697537 hotdog, hot dog, red hot -n07697699 Sloppy Joe -n07697825 bomber, grinder, hero, hero sandwich, hoagie, hoagy, Cuban sandwich, Italian sandwich, poor boy, sub, submarine, submarine sandwich, torpedo, wedge, zep -n07698250 gyro -n07698401 bacon-lettuce-tomato sandwich, BLT -n07698543 Reuben -n07698672 western, western sandwich -n07698782 wrap -n07700003 spaghetti -n07703889 hasty pudding -n07704054 gruel -n07704205 congee, jook -n07704305 skilly -n07705931 edible fruit -n07707451 vegetable, veggie, veg -n07708124 julienne, julienne vegetable -n07708398 raw vegetable, rabbit food -n07708512 crudites -n07708685 celery stick -n07708798 legume -n07709046 pulse -n07709172 potherb -n07709333 greens, green, leafy vegetable -n07709701 chop-suey greens -n07709881 bean curd, tofu -n07710007 solanaceous vegetable -n07710283 root vegetable -n07710616 potato, white potato, Irish potato, murphy, spud, tater -n07710952 baked potato -n07711080 french fries, french-fried potatoes, fries, chips -n07711232 home fries, home-fried potatoes -n07711371 jacket potato -n07711569 mashed potato -n07711683 potato skin, potato peel, potato peelings -n07711799 Uruguay potato -n07711907 yam -n07712063 sweet potato -n07712267 yam -n07712382 snack food -n07712559 chip, crisp, potato chip, Saratoga chip -n07712748 corn chip -n07712856 tortilla chip -n07712959 nacho -n07713074 eggplant, aubergine, mad apple -n07713267 pieplant, rhubarb -n07713395 cruciferous vegetable -n07713763 mustard, mustard greens, leaf mustard, Indian mustard -n07713895 cabbage, chou -n07714078 kale, kail, cole -n07714188 collards, collard greens -n07714287 Chinese cabbage, celery cabbage, Chinese celery -n07714448 bok choy, bok choi -n07714571 head cabbage -n07714802 red cabbage -n07714895 savoy cabbage, savoy -n07714990 broccoli -n07715103 cauliflower -n07715221 brussels sprouts -n07715407 broccoli rabe, broccoli raab -n07715561 squash -n07715721 summer squash -n07716034 yellow squash -n07716203 crookneck, crookneck squash, summer crookneck -n07716358 zucchini, courgette -n07716504 marrow, vegetable marrow -n07716649 cocozelle -n07716750 pattypan squash -n07716906 spaghetti squash -n07717070 winter squash -n07717410 acorn squash -n07717556 butternut squash -n07717714 hubbard squash -n07717858 turban squash -n07718068 buttercup squash -n07718195 cushaw -n07718329 winter crookneck squash -n07718472 cucumber, cuke -n07718671 gherkin -n07718747 artichoke, globe artichoke -n07718920 artichoke heart -n07719058 Jerusalem artichoke, sunchoke -n07719213 asparagus -n07719330 bamboo shoot -n07719437 sprout -n07719616 bean sprout -n07719756 alfalfa sprout -n07719839 beet, beetroot -n07719980 beet green -n07720084 sugar beet -n07720185 mangel-wurzel -n07720277 chard, Swiss chard, spinach beet, leaf beet -n07720442 pepper -n07720615 sweet pepper -n07720875 bell pepper -n07721018 green pepper -n07721118 globe pepper -n07721195 pimento, pimiento -n07721325 hot pepper -n07721456 chili, chili pepper, chilli, chilly, chile -n07721678 jalapeno, jalapeno pepper -n07721833 chipotle -n07721942 cayenne, cayenne pepper -n07722052 tabasco, red pepper -n07722217 onion -n07722390 Bermuda onion -n07722485 green onion, spring onion, scallion -n07722666 Vidalia onion -n07722763 Spanish onion -n07722888 purple onion, red onion -n07723039 leek -n07723177 shallot -n07723330 salad green, salad greens -n07723559 lettuce -n07723753 butterhead lettuce -n07723968 buttercrunch -n07724078 Bibb lettuce -n07724173 Boston lettuce -n07724269 crisphead lettuce, iceberg lettuce, iceberg -n07724492 cos, cos lettuce, romaine, romaine lettuce -n07724654 leaf lettuce, loose-leaf lettuce -n07724819 celtuce -n07724943 bean, edible bean -n07725158 goa bean -n07725255 lentil -n07725376 pea -n07725531 green pea, garden pea -n07725663 marrowfat pea -n07725789 snow pea, sugar pea -n07725888 sugar snap pea -n07726009 split-pea -n07726095 chickpea, garbanzo -n07726230 cajan pea, pigeon pea, dahl -n07726386 field pea -n07726525 mushy peas -n07726672 black-eyed pea, cowpea -n07726796 common bean -n07727048 kidney bean -n07727140 navy bean, pea bean, white bean -n07727252 pinto bean -n07727377 frijole -n07727458 black bean, turtle bean -n07727578 fresh bean -n07727741 flageolet, haricot -n07727868 green bean -n07728053 snap bean, snap -n07728181 string bean -n07728284 Kentucky wonder, Kentucky wonder bean -n07728391 scarlet runner, scarlet runner bean, runner bean, English runner bean -n07728585 haricot vert, haricots verts, French bean -n07728708 wax bean, yellow bean -n07728804 shell bean -n07729000 lima bean -n07729142 Fordhooks -n07729225 sieva bean, butter bean, butterbean, civet bean -n07729384 fava bean, broad bean -n07729485 soy, soybean, soya, soya bean -n07729828 green soybean -n07729926 field soybean -n07730033 cardoon -n07730207 carrot -n07730320 carrot stick -n07730406 celery -n07730562 pascal celery, Paschal celery -n07730708 celeriac, celery root -n07730855 chicory, curly endive -n07731006 radicchio -n07731122 coffee substitute -n07731284 chicory, chicory root -n07731436 Postum -n07731587 chicory escarole, endive, escarole -n07731767 Belgian endive, French endive, witloof -n07731952 corn, edible corn -n07732168 sweet corn, green corn -n07732302 hominy -n07732433 lye hominy -n07732525 pearl hominy -n07732636 popcorn -n07732747 cress -n07732904 watercress -n07733005 garden cress -n07733124 winter cress -n07733217 dandelion green -n07733394 gumbo, okra -n07733567 kohlrabi, turnip cabbage -n07733712 lamb's-quarter, pigweed, wild spinach -n07733847 wild spinach -n07734017 tomato -n07734183 beefsteak tomato -n07734292 cherry tomato -n07734417 plum tomato -n07734555 tomatillo, husk tomato, Mexican husk tomato -n07734744 mushroom -n07734879 stuffed mushroom -n07735052 salsify -n07735179 oyster plant, vegetable oyster -n07735294 scorzonera, black salsify -n07735404 parsnip -n07735510 pumpkin -n07735687 radish -n07735803 turnip -n07735981 white turnip -n07736087 rutabaga, swede, swedish turnip, yellow turnip -n07736256 turnip greens -n07736371 sorrel, common sorrel -n07736527 French sorrel -n07736692 spinach -n07736813 taro, taro root, cocoyam, dasheen, edda -n07736971 truffle, earthnut -n07737081 edible nut -n07737594 bunya bunya -n07737745 peanut, earthnut, goober, goober pea, groundnut, monkey nut -n07738105 freestone -n07738224 cling, clingstone -n07739035 windfall -n07739125 apple -n07739344 crab apple, crabapple -n07739506 eating apple, dessert apple -n07739923 Baldwin -n07740033 Cortland -n07740115 Cox's Orange Pippin -n07740220 Delicious -n07740342 Golden Delicious, Yellow Delicious -n07740461 Red Delicious -n07740597 Empire -n07740744 Grimes' golden -n07740855 Jonathan -n07740954 McIntosh -n07741138 Macoun -n07741235 Northern Spy -n07741357 Pearmain -n07741461 Pippin -n07741623 Prima -n07741706 Stayman -n07741804 Winesap -n07741888 Stayman Winesap -n07742012 cooking apple -n07742224 Bramley's Seedling -n07742313 Granny Smith -n07742415 Lane's Prince Albert -n07742513 Newtown Wonder -n07742605 Rome Beauty -n07742704 berry -n07743224 bilberry, whortleberry, European blueberry -n07743384 huckleberry -n07743544 blueberry -n07743723 wintergreen, boxberry, checkerberry, teaberry, spiceberry -n07743902 cranberry -n07744057 lingonberry, mountain cranberry, cowberry, lowbush cranberry -n07744246 currant -n07744430 gooseberry -n07744559 black currant -n07744682 red currant -n07744811 blackberry -n07745046 boysenberry -n07745197 dewberry -n07745357 loganberry -n07745466 raspberry -n07745661 saskatoon, serviceberry, shadberry, juneberry -n07745940 strawberry -n07746038 sugarberry, hackberry -n07746186 persimmon -n07746334 acerola, barbados cherry, surinam cherry, West Indian cherry -n07746551 carambola, star fruit -n07746749 ceriman, monstera -n07746910 carissa plum, natal plum -n07747055 citrus, citrus fruit, citrous fruit -n07747607 orange -n07747811 temple orange -n07747951 mandarin, mandarin orange -n07748157 clementine -n07748276 satsuma -n07748416 tangerine -n07748574 tangelo, ugli, ugli fruit -n07748753 bitter orange, Seville orange, sour orange -n07748912 sweet orange -n07749095 Jaffa orange -n07749192 navel orange -n07749312 Valencia orange -n07749446 kumquat -n07749582 lemon -n07749731 lime -n07749870 key lime -n07749969 grapefruit -n07750146 pomelo, shaddock -n07750299 citrange -n07750449 citron -n07750586 almond -n07750736 Jordan almond -n07750872 apricot -n07751004 peach -n07751148 nectarine -n07751280 pitahaya -n07751451 plum -n07751737 damson, damson plum -n07751858 greengage, greengage plum -n07751977 beach plum -n07752109 sloe -n07752264 Victoria plum -n07752377 dried fruit -n07752514 dried apricot -n07752602 prune -n07752664 raisin -n07752782 seedless raisin, sultana -n07752874 seeded raisin -n07752966 currant -n07753113 fig -n07753275 pineapple, ananas -n07753448 anchovy pear, river pear -n07753592 banana -n07753743 passion fruit -n07753980 granadilla -n07754155 sweet calabash -n07754279 bell apple, sweet cup, water lemon, yellow granadilla -n07754451 breadfruit -n07754684 jackfruit, jak, jack -n07754894 cacao bean, cocoa bean -n07755089 cocoa -n07755262 canistel, eggfruit -n07755411 melon -n07755619 melon ball -n07755707 muskmelon, sweet melon -n07755929 cantaloup, cantaloupe -n07756096 winter melon -n07756325 honeydew, honeydew melon -n07756499 Persian melon -n07756641 net melon, netted melon, nutmeg melon -n07756838 casaba, casaba melon -n07756951 watermelon -n07757132 cherry -n07757312 sweet cherry, black cherry -n07757511 bing cherry -n07757602 heart cherry, oxheart, oxheart cherry -n07757753 blackheart, blackheart cherry -n07757874 capulin, Mexican black cherry -n07757990 sour cherry -n07758125 amarelle -n07758260 morello -n07758407 cocoa plum, coco plum, icaco -n07758582 gherkin -n07758680 grape -n07758950 fox grape -n07759194 Concord grape -n07759324 Catawba -n07759424 muscadine, bullace grape -n07759576 scuppernong -n07759691 slipskin grape -n07759816 vinifera grape -n07760070 emperor -n07760153 muscat, muscatel, muscat grape -n07760297 ribier -n07760395 sultana -n07760501 Tokay -n07760673 flame tokay -n07760755 Thompson Seedless -n07760859 custard apple -n07761141 cherimoya, cherimolla -n07761309 soursop, guanabana -n07761611 sweetsop, annon, sugar apple -n07761777 ilama -n07761954 pond apple -n07762114 papaw, pawpaw -n07762244 papaya -n07762373 kai apple -n07762534 ketembilla, kitembilla, kitambilla -n07762740 ackee, akee -n07762913 durian -n07763107 feijoa, pineapple guava -n07763290 genip, Spanish lime -n07763483 genipap, genipap fruit -n07763629 kiwi, kiwi fruit, Chinese gooseberry -n07763792 loquat, Japanese plum -n07763987 mangosteen -n07764155 mango -n07764315 sapodilla, sapodilla plum, sapota -n07764486 sapote, mammee, marmalade plum -n07764630 tamarind, tamarindo -n07764847 avocado, alligator pear, avocado pear, aguacate -n07765073 date -n07765208 elderberry -n07765361 guava -n07765517 mombin -n07765612 hog plum, yellow mombin -n07765728 hog plum, wild plum -n07765862 jaboticaba -n07765999 jujube, Chinese date, Chinese jujube -n07766173 litchi, litchi nut, litchee, lichi, leechee, lichee, lychee -n07766409 longanberry, dragon's eye -n07766530 mamey, mammee, mammee apple -n07766723 marang -n07766891 medlar -n07767002 medlar -n07767171 mulberry -n07767344 olive -n07767549 black olive, ripe olive -n07767709 green olive -n07767847 pear -n07768068 bosc -n07768139 anjou -n07768230 bartlett, bartlett pear -n07768318 seckel, seckel pear -n07768423 plantain -n07768590 plumcot -n07768694 pomegranate -n07768858 prickly pear -n07769102 Barbados gooseberry, blade apple -n07769306 quandong, quandang, quantong, native peach -n07769465 quandong nut -n07769584 quince -n07769731 rambutan, rambotan -n07769886 pulasan, pulassan -n07770034 rose apple -n07770180 sorb, sorb apple -n07770439 sour gourd, monkey bread -n07770571 edible seed -n07770763 pumpkin seed -n07770869 betel nut, areca nut -n07771082 beechnut -n07771212 walnut -n07771405 black walnut -n07771539 English walnut -n07771731 brazil nut, brazil -n07771891 butternut -n07772026 souari nut -n07772147 cashew, cashew nut -n07772274 chestnut -n07772413 chincapin, chinkapin, chinquapin -n07772788 hazelnut, filbert, cobnut, cob -n07772935 coconut, cocoanut -n07773428 coconut milk, coconut water -n07774182 grugru nut -n07774295 hickory nut -n07774479 cola extract -n07774596 macadamia nut -n07774719 pecan -n07774842 pine nut, pignolia, pinon nut -n07775050 pistachio, pistachio nut -n07775197 sunflower seed -n07783827 anchovy paste -n07785487 rollmops -n07800091 feed, provender -n07800487 cattle cake -n07800636 creep feed -n07800740 fodder -n07801007 feed grain -n07801091 eatage, forage, pasture, pasturage, grass -n07801342 silage, ensilage -n07801508 oil cake -n07801709 oil meal -n07801779 alfalfa -n07801892 broad bean, horse bean -n07802026 hay -n07802152 timothy -n07802246 stover -n07802417 grain, food grain, cereal -n07802767 grist -n07802863 groats -n07802963 millet -n07803093 barley, barleycorn -n07803213 pearl barley -n07803310 buckwheat -n07803408 bulgur, bulghur, bulgur wheat -n07803545 wheat, wheat berry -n07803779 cracked wheat -n07803895 stodge -n07803992 wheat germ -n07804152 oat -n07804323 rice -n07804543 brown rice -n07804657 white rice, polished rice -n07804771 wild rice, Indian rice -n07804900 paddy -n07805006 slop, slops, swill, pigswill, pigwash -n07805254 mash -n07805389 chicken feed, scratch -n07805478 cud, rechewed food -n07805594 bird feed, bird food, birdseed -n07805731 petfood, pet-food, pet food -n07805966 dog food -n07806043 cat food -n07806120 canary seed -n07806221 salad -n07806633 tossed salad -n07806774 green salad -n07806879 Caesar salad -n07807002 salmagundi -n07807171 salad nicoise -n07807317 combination salad -n07807472 chef's salad -n07807594 potato salad -n07807710 pasta salad -n07807834 macaroni salad -n07807922 fruit salad -n07808022 Waldorf salad -n07808166 crab Louis -n07808268 herring salad -n07808352 tuna fish salad, tuna salad -n07808479 chicken salad -n07808587 coleslaw, slaw -n07808675 aspic -n07808806 molded salad -n07808904 tabbouleh, tabooli -n07809096 ingredient, fixings -n07809368 flavorer, flavourer, flavoring, flavouring, seasoner, seasoning -n07810531 bouillon cube -n07810907 condiment -n07811416 herb -n07812046 fines herbes -n07812184 spice -n07812662 spearmint oil -n07812790 lemon oil -n07812913 wintergreen oil, oil of wintergreen -n07813107 salt, table salt, common salt -n07813324 celery salt -n07813495 onion salt -n07813579 seasoned salt -n07813717 sour salt -n07813833 five spice powder -n07814007 allspice -n07814203 cinnamon -n07814390 stick cinnamon -n07814487 clove -n07814634 cumin, cumin seed -n07814790 fennel -n07814925 ginger, gingerroot -n07815163 ginger, powdered ginger -n07815294 mace -n07815424 nutmeg -n07815588 pepper, peppercorn -n07815839 black pepper -n07815956 white pepper -n07816052 sassafras -n07816164 basil, sweet basil -n07816296 bay leaf -n07816398 borage -n07816575 hyssop -n07816726 caraway -n07816839 chervil -n07817024 chives -n07817160 comfrey, healing herb -n07817315 coriander, Chinese parsley, cilantro -n07817465 coriander, coriander seed -n07817599 costmary -n07817758 fennel, common fennel -n07817871 fennel, Florence fennel, finocchio -n07818029 fennel seed -n07818133 fenugreek, fenugreek seed -n07818277 garlic, ail -n07818422 clove, garlic clove -n07818572 garlic chive -n07818689 lemon balm -n07818825 lovage -n07818995 marjoram, oregano -n07819166 mint -n07819303 mustard seed -n07819480 mustard, table mustard -n07819682 Chinese mustard -n07819769 nasturtium -n07819896 parsley -n07820036 salad burnet -n07820145 rosemary -n07820297 rue -n07820497 sage -n07820683 clary sage -n07820814 savory, savoury -n07820960 summer savory, summer savoury -n07821107 winter savory, winter savoury -n07821260 sweet woodruff, waldmeister -n07821404 sweet cicely -n07821610 tarragon, estragon -n07821758 thyme -n07821919 turmeric -n07822053 caper -n07822197 catsup, ketchup, cetchup, tomato ketchup -n07822323 cardamom, cardamon, cardamum -n07822518 cayenne, cayenne pepper, red pepper -n07822687 chili powder -n07822845 chili sauce -n07823105 chutney, Indian relish -n07823280 steak sauce -n07823369 taco sauce -n07823460 salsa -n07823591 mint sauce -n07823698 cranberry sauce -n07823814 curry powder -n07823951 curry -n07824191 lamb curry -n07824268 duck sauce, hoisin sauce -n07824383 horseradish -n07824502 marinade -n07824702 paprika -n07824863 Spanish paprika -n07824988 pickle -n07825194 dill pickle -n07825399 bread and butter pickle -n07825496 pickle relish -n07825597 piccalilli -n07825717 sweet pickle -n07825850 applesauce, apple sauce -n07825972 soy sauce, soy -n07826091 Tabasco, Tabasco sauce -n07826250 tomato paste -n07826340 angelica -n07826453 angelica -n07826544 almond extract -n07826653 anise, aniseed, anise seed -n07826930 Chinese anise, star anise, star aniseed -n07827130 juniper berries -n07827284 saffron -n07827410 sesame seed, benniseed -n07827554 caraway seed -n07827750 poppy seed -n07827896 dill, dill weed -n07828041 dill seed -n07828156 celery seed -n07828275 lemon extract -n07828378 monosodium glutamate, MSG -n07828642 vanilla bean -n07828987 vinegar, acetum -n07829248 cider vinegar -n07829331 wine vinegar -n07829412 sauce -n07830493 anchovy sauce -n07830593 hot sauce -n07830690 hard sauce -n07830841 horseradish sauce, sauce Albert -n07830986 bolognese pasta sauce -n07831146 carbonara -n07831267 tomato sauce -n07831450 tartare sauce, tartar sauce -n07831663 wine sauce -n07831821 marchand de vin, mushroom wine sauce -n07831955 bread sauce -n07832099 plum sauce -n07832202 peach sauce -n07832307 apricot sauce -n07832416 pesto -n07832592 ravigote, ravigotte -n07832741 remoulade sauce -n07832902 dressing, salad dressing -n07833333 sauce Louis -n07833535 bleu cheese dressing, blue cheese dressing -n07833672 blue cheese dressing, Roquefort dressing -n07833816 French dressing, vinaigrette, sauce vinaigrette -n07833951 Lorenzo dressing -n07834065 anchovy dressing -n07834160 Italian dressing -n07834286 half-and-half dressing -n07834507 mayonnaise, mayo -n07834618 green mayonnaise, sauce verte -n07834774 aioli, aioli sauce, garlic sauce -n07834872 Russian dressing, Russian mayonnaise -n07835051 salad cream -n07835173 Thousand Island dressing -n07835331 barbecue sauce -n07835457 hollandaise -n07835547 bearnaise -n07835701 Bercy, Bercy butter -n07835823 bordelaise -n07835921 bourguignon, bourguignon sauce, Burgundy sauce -n07836077 brown sauce, sauce Espagnole -n07836269 Espagnole, sauce Espagnole -n07836456 Chinese brown sauce, brown sauce -n07836600 blanc -n07836731 cheese sauce -n07836838 chocolate sauce, chocolate syrup -n07837002 hot-fudge sauce, fudge sauce -n07837110 cocktail sauce, seafood sauce -n07837234 Colbert, Colbert butter -n07837362 white sauce, bechamel sauce, bechamel -n07837545 cream sauce -n07837630 Mornay sauce -n07837755 demiglace, demi-glaze -n07837912 gravy, pan gravy -n07838073 gravy -n07838233 spaghetti sauce, pasta sauce -n07838441 marinara -n07838551 mole -n07838659 hunter's sauce, sauce chausseur -n07838811 mushroom sauce -n07838905 mustard sauce -n07839055 Nantua, shrimp sauce -n07839172 Hungarian sauce, paprika sauce -n07839312 pepper sauce, Poivrade -n07839478 roux -n07839593 Smitane -n07839730 Soubise, white onion sauce -n07839864 Lyonnaise sauce, brown onion sauce -n07840027 veloute -n07840124 allemande, allemande sauce -n07840219 caper sauce -n07840304 poulette -n07840395 curry sauce -n07840520 Worcester sauce, Worcestershire, Worcestershire sauce -n07840672 coconut milk, coconut cream -n07840804 egg, eggs -n07841037 egg white, white, albumen, ovalbumin -n07841345 egg yolk, yolk -n07841495 boiled egg, coddled egg -n07841639 hard-boiled egg, hard-cooked egg -n07841800 Easter egg -n07841907 Easter egg -n07842044 chocolate egg -n07842130 candy egg -n07842202 poached egg, dropped egg -n07842308 scrambled eggs -n07842433 deviled egg, stuffed egg -n07842605 shirred egg, baked egg, egg en cocotte -n07842753 omelet, omelette -n07842972 firm omelet -n07843117 French omelet -n07843220 fluffy omelet -n07843348 western omelet -n07843464 souffle -n07843636 fried egg -n07843775 dairy product -n07844042 milk -n07844604 milk -n07844786 sour milk -n07844867 soya milk, soybean milk, soymilk -n07845087 formula -n07845166 pasteurized milk -n07845335 cows' milk -n07845421 yak's milk -n07845495 goats' milk -n07845571 acidophilus milk -n07845702 raw milk -n07845775 scalded milk -n07845863 homogenized milk -n07846014 certified milk -n07846143 powdered milk, dry milk, dried milk, milk powder -n07846274 nonfat dry milk -n07846359 evaporated milk -n07846471 condensed milk -n07846557 skim milk, skimmed milk -n07846688 semi-skimmed milk -n07846802 whole milk -n07846938 low-fat milk -n07847047 buttermilk -n07847198 cream -n07847453 clotted cream, Devonshire cream -n07847585 double creme, heavy whipping cream -n07847706 half-and-half -n07847827 heavy cream -n07847917 light cream, coffee cream, single cream -n07848093 sour cream, soured cream -n07848196 whipping cream, light whipping cream -n07848338 butter -n07848771 clarified butter, drawn butter -n07848936 ghee -n07849026 brown butter, beurre noisette -n07849186 Meuniere butter, lemon butter -n07849336 yogurt, yoghurt, yoghourt -n07849506 blueberry yogurt -n07849619 raita -n07849733 whey -n07849912 curd -n07850083 curd -n07850219 clabber -n07850329 cheese -n07851054 paring -n07851298 cream cheese -n07851443 double cream -n07851554 mascarpone -n07851641 triple cream, triple creme -n07851767 cottage cheese, pot cheese, farm cheese, farmer's cheese -n07851926 process cheese, processed cheese -n07852045 bleu, blue cheese -n07852229 Stilton -n07852302 Roquefort -n07852376 gorgonzola -n07852452 Danish blue -n07852532 Bavarian blue -n07852614 Brie -n07852712 brick cheese -n07852833 Camembert -n07852919 cheddar, cheddar cheese, Armerican cheddar, American cheese -n07853125 rat cheese, store cheese -n07853232 Cheshire cheese -n07853345 double Gloucester -n07853445 Edam -n07853560 goat cheese, chevre -n07853648 Gouda, Gouda cheese -n07853762 grated cheese -n07853852 hand cheese -n07853946 Liederkranz -n07854066 Limburger -n07854184 mozzarella -n07854266 Muenster -n07854348 Parmesan -n07854455 quark cheese, quark -n07854614 ricotta -n07854707 string cheese -n07854813 Swiss cheese -n07854982 Emmenthal, Emmental, Emmenthaler, Emmentaler -n07855105 Gruyere -n07855188 sapsago -n07855317 Velveeta -n07855413 nut butter -n07855510 peanut butter -n07855603 marshmallow fluff -n07855721 onion butter -n07855812 pimento butter -n07855907 shrimp butter -n07856045 lobster butter -n07856186 yak butter -n07856270 spread, paste -n07856756 cheese spread -n07856895 anchovy butter -n07856992 fishpaste -n07857076 garlic butter -n07857170 miso -n07857356 wasabi -n07857598 snail butter -n07857731 hummus, humus, hommos, hoummos, humous -n07857959 pate -n07858114 duck pate -n07858197 foie gras, pate de foie gras -n07858336 tapenade -n07858484 tahini -n07858595 sweetening, sweetener -n07858841 aspartame -n07858978 honey -n07859142 saccharin -n07859284 sugar, refined sugar -n07859583 syrup, sirup -n07859796 sugar syrup -n07859951 molasses -n07860103 sorghum, sorghum molasses -n07860208 treacle, golden syrup -n07860331 grenadine -n07860447 maple syrup -n07860548 corn syrup -n07860629 miraculous food, manna, manna from heaven -n07860805 batter -n07860988 dough -n07861158 bread dough -n07861247 pancake batter -n07861334 fritter batter -n07861557 coq au vin -n07861681 chicken provencale -n07861813 chicken and rice -n07861983 moo goo gai pan -n07862095 arroz con pollo -n07862244 bacon and eggs -n07862348 barbecued spareribs, spareribs -n07862461 beef Bourguignonne, boeuf Bourguignonne -n07862611 beef Wellington, filet de boeuf en croute -n07862770 bitok -n07862946 boiled dinner, New England boiled dinner -n07863107 Boston baked beans -n07863229 bubble and squeak -n07863374 pasta -n07863547 cannelloni -n07863644 carbonnade flamande, Belgian beef stew -n07863802 cheese souffle -n07863935 chicken Marengo -n07864065 chicken cordon bleu -n07864198 Maryland chicken -n07864317 chicken paprika, chicken paprikash -n07864475 chicken Tetrazzini -n07864638 Tetrazzini -n07864756 chicken Kiev -n07864934 chili, chili con carne -n07865105 chili dog -n07865196 chop suey -n07865484 chow mein -n07865575 codfish ball, codfish cake -n07865700 coquille -n07865788 coquilles Saint-Jacques -n07866015 croquette -n07866151 cottage pie -n07866277 rissole -n07866409 dolmas, stuffed grape leaves -n07866571 egg foo yong, egg fu yung -n07866723 egg roll, spring roll -n07866868 eggs Benedict -n07867021 enchilada -n07867164 falafel, felafel -n07867324 fish and chips -n07867421 fondue, fondu -n07867616 cheese fondue -n07867751 chocolate fondue -n07867883 fondue, fondu -n07868045 beef fondue, boeuf fondu bourguignon -n07868200 French toast -n07868340 fried rice, Chinese fried rice -n07868508 frittata -n07868684 frog legs -n07868830 galantine -n07868955 gefilte fish, fish ball -n07869111 haggis -n07869291 ham and eggs -n07869391 hash -n07869522 corned beef hash -n07869611 jambalaya -n07869775 kabob, kebab, shish kebab -n07869937 kedgeree -n07870069 souvlaki, souvlakia -n07870167 lasagna, lasagne -n07870313 seafood Newburg -n07870478 lobster Newburg, lobster a la Newburg -n07870620 shrimp Newburg -n07870734 Newburg sauce -n07870894 lobster thermidor -n07871065 lutefisk, lutfisk -n07871234 macaroni and cheese -n07871335 macedoine -n07871436 meatball -n07871588 porcupine ball, porcupines -n07871720 Swedish meatball -n07871810 meat loaf, meatloaf -n07872593 moussaka -n07872748 osso buco -n07873057 marrow, bone marrow -n07873198 pheasant under glass -n07873348 pigs in blankets -n07873464 pilaf, pilaff, pilau, pilaw -n07873679 bulgur pilaf -n07873807 pizza, pizza pie -n07874063 sausage pizza -n07874159 pepperoni pizza -n07874259 cheese pizza -n07874343 anchovy pizza -n07874441 Sicilian pizza -n07874531 poi -n07874674 pork and beans -n07874780 porridge -n07874995 oatmeal, burgoo -n07875086 loblolly -n07875152 potpie -n07875267 rijsttaffel, rijstaffel, rijstafel -n07875436 risotto, Italian rice -n07875560 roulade -n07875693 fish loaf -n07875835 salmon loaf -n07875926 Salisbury steak -n07876026 sauerbraten -n07876189 sauerkraut -n07876281 scallopine, scallopini -n07876460 veal scallopini -n07876550 scampi -n07876651 Scotch egg -n07876775 Scotch woodcock -n07876893 scrapple -n07877187 spaghetti and meatballs -n07877299 Spanish rice -n07877675 steak tartare, tartar steak, cannibal mound -n07877849 pepper steak -n07877961 steak au poivre, peppered steak, pepper steak -n07878145 beef Stroganoff -n07878283 stuffed cabbage -n07878479 kishke, stuffed derma -n07878647 stuffed peppers -n07878785 stuffed tomato, hot stuffed tomato -n07878926 stuffed tomato, cold stuffed tomato -n07879072 succotash -n07879174 sukiyaki -n07879350 sashimi -n07879450 sushi -n07879560 Swiss steak -n07879659 tamale -n07879821 tamale pie -n07879953 tempura -n07880080 teriyaki -n07880213 terrine -n07880325 Welsh rarebit, Welsh rabbit, rarebit -n07880458 schnitzel, Wiener schnitzel -n07880751 taco -n07880880 chicken taco -n07880968 burrito -n07881117 beef burrito -n07881205 quesadilla -n07881404 tostada -n07881525 bean tostada -n07881625 refried beans, frijoles refritos -n07881800 beverage, drink, drinkable, potable -n07882420 wish-wash -n07882497 concoction, mixture, intermixture -n07882886 mix, premix -n07883031 filling -n07883156 lekvar -n07883251 potion -n07883384 elixir -n07883510 elixir of life -n07883661 philter, philtre, love-potion, love-philter, love-philtre -n07884567 alcohol, alcoholic drink, alcoholic beverage, intoxicant, inebriant -n07885705 proof spirit -n07886057 home brew, homebrew -n07886176 hooch, hootch -n07886317 kava, kavakava -n07886463 aperitif -n07886572 brew, brewage -n07886849 beer -n07887099 draft beer, draught beer -n07887192 suds -n07887304 Munich beer, Munchener -n07887461 bock, bock beer -n07887634 lager, lager beer -n07887967 light beer -n07888058 Oktoberfest, Octoberfest -n07888229 Pilsner, Pilsener -n07888378 shebeen -n07888465 Weissbier, white beer, wheat beer -n07888816 Weizenbock -n07888909 malt -n07889193 wort -n07889274 malt, malt liquor -n07889510 ale -n07889814 bitter -n07889990 Burton -n07890068 pale ale -n07890226 porter, porter's beer -n07890352 stout -n07890540 Guinness -n07890617 kvass -n07890750 mead -n07890890 metheglin -n07890970 hydromel -n07891095 oenomel -n07891189 near beer -n07891309 ginger beer -n07891433 sake, saki, rice beer -n07891726 wine, vino -n07892418 vintage -n07892512 red wine -n07892813 white wine -n07893253 blush wine, pink wine, rose, rose wine -n07893425 altar wine, sacramental wine -n07893528 sparkling wine -n07893642 champagne, bubbly -n07893792 cold duck -n07893891 Burgundy, Burgundy wine -n07894102 Beaujolais -n07894298 Medoc -n07894451 Canary wine -n07894551 Chablis, white Burgundy -n07894703 Montrachet -n07894799 Chardonnay, Pinot Chardonnay -n07894965 Pinot noir -n07895100 Pinot blanc -n07895237 Bordeaux, Bordeaux wine -n07895435 claret, red Bordeaux -n07895595 Chianti -n07895710 Cabernet, Cabernet Sauvignon -n07895839 Merlot -n07895962 Sauvignon blanc -n07896060 California wine -n07896165 Cotes de Provence -n07896287 dessert wine -n07896422 Dubonnet -n07896560 jug wine -n07896661 macon, maconnais -n07896765 Moselle -n07896893 Muscadet -n07896994 plonk -n07897116 retsina -n07897200 Rhine wine, Rhenish, hock -n07897438 Riesling -n07897600 liebfraumilch -n07897750 Rhone wine -n07897865 Rioja -n07897975 sack -n07898117 Saint Emilion -n07898247 Soave -n07898333 zinfandel -n07898443 Sauterne, Sauternes -n07898617 straw wine -n07898745 table wine -n07898895 Tokay -n07899003 vin ordinaire -n07899108 vermouth -n07899292 sweet vermouth, Italian vermouth -n07899434 dry vermouth, French vermouth -n07899533 Chenin blanc -n07899660 Verdicchio -n07899769 Vouvray -n07899899 Yquem -n07899976 generic, generic wine -n07900225 varietal, varietal wine -n07900406 fortified wine -n07900616 Madeira -n07900734 malmsey -n07900825 port, port wine -n07900958 sherry -n07901355 Marsala -n07901457 muscat, muscatel, muscadel, muscadelle -n07901587 liquor, spirits, booze, hard drink, hard liquor, John Barleycorn, strong drink -n07902121 neutral spirits, ethyl alcohol -n07902336 aqua vitae, ardent spirits -n07902443 eau de vie -n07902520 moonshine, bootleg, corn liquor -n07902698 bathtub gin -n07902799 aquavit, akvavit -n07902937 arrack, arak -n07903101 bitters -n07903208 brandy -n07903543 applejack -n07903643 Calvados -n07903731 Armagnac -n07903841 Cognac -n07903962 grappa -n07904072 kirsch -n07904293 slivovitz -n07904395 gin -n07904637 sloe gin -n07904760 geneva, Holland gin, Hollands -n07904865 grog -n07904934 ouzo -n07905038 rum -n07905296 demerara, demerara rum -n07905386 Jamaica rum -n07905474 schnapps, schnaps -n07905618 pulque -n07905770 mescal -n07905979 tequila -n07906111 vodka -n07906284 whiskey, whisky -n07906572 blended whiskey, blended whisky -n07906718 bourbon -n07906877 corn whiskey, corn whisky, corn -n07907037 firewater -n07907161 Irish, Irish whiskey, Irish whisky -n07907342 poteen -n07907429 rye, rye whiskey, rye whisky -n07907548 Scotch, Scotch whiskey, Scotch whisky, malt whiskey, malt whisky, Scotch malt whiskey, Scotch malt whisky -n07907831 sour mash, sour mash whiskey -n07907943 liqueur, cordial -n07908411 absinth, absinthe -n07908567 amaretto -n07908647 anisette, anisette de Bordeaux -n07908812 benedictine -n07908923 Chartreuse -n07909129 coffee liqueur -n07909231 creme de cacao -n07909362 creme de menthe -n07909504 creme de fraise -n07909593 Drambuie -n07909714 Galliano -n07909811 orange liqueur -n07909954 curacao, curacoa -n07910048 triple sec -n07910152 Grand Marnier -n07910245 kummel -n07910379 maraschino, maraschino liqueur -n07910538 pastis -n07910656 Pernod -n07910799 pousse-cafe -n07910970 Kahlua -n07911061 ratafia, ratafee -n07911249 sambuca -n07911371 mixed drink -n07911677 cocktail -n07912093 Dom Pedro -n07912211 highball -n07913180 mixer -n07913300 bishop -n07913393 Bloody Mary -n07913537 Virgin Mary, bloody shame -n07913644 bullshot -n07913774 cobbler -n07913882 collins, Tom Collins -n07914006 cooler -n07914128 refresher -n07914271 smoothie -n07914413 daiquiri, rum cocktail -n07914586 strawberry daiquiri -n07914686 NADA daiquiri -n07914777 spritzer -n07914887 flip -n07914995 gimlet -n07915094 gin and tonic -n07915213 grasshopper -n07915366 Harvey Wallbanger -n07915491 julep, mint julep -n07915618 manhattan -n07915800 Rob Roy -n07915918 margarita -n07916041 martini -n07916183 gin and it -n07916319 vodka martini -n07916437 old fashioned -n07916582 pink lady -n07917133 Sazerac -n07917272 screwdriver -n07917392 sidecar -n07917507 Scotch and soda -n07917618 sling -n07917791 brandy sling -n07917874 gin sling -n07917951 rum sling -n07918028 sour -n07918193 whiskey sour, whisky sour -n07918309 stinger -n07918706 swizzle -n07918879 hot toddy, toddy -n07919165 zombie, zombi -n07919310 fizz -n07919441 Irish coffee -n07919572 cafe au lait -n07919665 cafe noir, demitasse -n07919787 decaffeinated coffee, decaf -n07919894 drip coffee -n07920052 espresso -n07920222 caffe latte, latte -n07920349 cappuccino, cappuccino coffee, coffee cappuccino -n07920540 iced coffee, ice coffee -n07920663 instant coffee -n07920872 mocha, mocha coffee -n07920989 mocha -n07921090 cassareep -n07921239 Turkish coffee -n07921360 chocolate milk -n07921455 cider, cyder -n07921615 hard cider -n07921834 scrumpy -n07921948 sweet cider -n07922041 mulled cider -n07922147 perry -n07922512 rotgut -n07922607 slug -n07922764 cocoa, chocolate, hot chocolate, drinking chocolate -n07922955 criollo -n07923748 juice -n07924033 fruit juice, fruit crush -n07924276 nectar -n07924366 apple juice -n07924443 cranberry juice -n07924560 grape juice -n07924655 must -n07924747 grapefruit juice -n07924834 orange juice -n07924955 frozen orange juice, orange-juice concentrate -n07925116 pineapple juice -n07925229 lemon juice -n07925327 lime juice -n07925423 papaya juice -n07925500 tomato juice -n07925608 carrot juice -n07925708 V-8 juice -n07925808 koumiss, kumis -n07925966 fruit drink, ade -n07926250 lemonade -n07926346 limeade -n07926442 orangeade -n07926540 malted milk -n07926785 mate -n07926920 mulled wine -n07927070 negus -n07927197 soft drink -n07927512 pop, soda, soda pop, soda water, tonic -n07927716 birch beer -n07927836 bitter lemon -n07927931 cola, dope -n07928163 cream soda -n07928264 egg cream -n07928367 ginger ale, ginger pop -n07928488 orange soda -n07928578 phosphate -n07928696 Coca Cola, Coke -n07928790 Pepsi, Pepsi Cola -n07928887 root beer -n07928998 sarsaparilla -n07929172 tonic, tonic water, quinine water -n07929351 coffee bean, coffee berry, coffee -n07929519 coffee, java -n07929940 cafe royale, coffee royal -n07930062 fruit punch -n07930205 milk punch -n07930315 mimosa, buck's fizz -n07930433 pina colada -n07930554 punch -n07930864 cup -n07931001 champagne cup -n07931096 claret cup -n07931280 wassail -n07931452 planter's punch -n07931612 White Russian -n07931733 fish house punch -n07931870 May wine -n07932039 eggnog -n07932323 cassiri -n07932454 spruce beer -n07932614 rickey -n07932762 gin rickey -n07932841 tea, tea leaf -n07933154 tea bag -n07933274 tea -n07933530 tea-like drink -n07933652 cambric tea -n07933799 cuppa, cupper -n07933891 herb tea, herbal tea, herbal -n07934032 tisane -n07934152 camomile tea -n07934282 ice tea, iced tea -n07934373 sun tea -n07934530 black tea -n07934678 congou, congo, congou tea, English breakfast tea -n07934800 Darjeeling -n07934908 orange pekoe, pekoe -n07935043 souchong, soochong -n07935152 green tea -n07935288 hyson -n07935379 oolong -n07935504 water -n07935737 bottled water -n07935878 branch water -n07936015 spring water -n07936093 sugar water -n07936263 drinking water -n07936459 ice water -n07936548 soda water, carbonated water, club soda, seltzer, sparkling water -n07936745 mineral water -n07936979 seltzer -n07937069 Vichy water -n07937344 perishable, spoilable -n07937461 couscous -n07937621 ramekin, ramequin -n07938007 multivitamin, multivitamin pill -n07938149 vitamin pill -n07938313 soul food -n07938594 mold, mould -n07942152 people -n07951464 collection, aggregation, accumulation, assemblage -n07954211 book, rule book -n07977870 library -n08079613 baseball club, ball club, club, nine -n08182379 crowd -n08238463 class, form, grade, course -n08242223 core, nucleus, core group -n08249459 concert band, military band -n08253141 dance -n08256735 wedding, wedding party -n08376250 chain, concatenation -n08385989 power breakfast -n08492354 aerie, aery, eyrie, eyry -n08492461 agora -n08494231 amusement park, funfair, pleasure ground -n08495908 aphelion -n08496334 apron -n08500819 interplanetary space -n08500989 interstellar space -n08501887 intergalactic space -n08505018 bush -n08506347 semidesert -n08511017 beam-ends -n08517010 bridgehead -n08517676 bus stop -n08518171 campsite, campground, camping site, camping ground, bivouac, encampment, camping area -n08519299 detention basin -n08521623 cemetery, graveyard, burial site, burial ground, burying ground, memorial park, necropolis -n08523340 trichion, crinion -n08524735 city, metropolis, urban center -n08539072 business district, downtown -n08539276 outskirts -n08540532 borough -n08547468 cow pasture -n08547544 crest -n08551296 eparchy, exarchate -n08554440 suburb, suburbia, suburban area -n08555333 stockbroker belt -n08555710 crawlspace, crawl space -n08558770 sheikdom, sheikhdom -n08558963 residence, abode -n08559155 domicile, legal residence -n08560295 dude ranch -n08569482 farmland, farming area -n08571275 midfield -n08571642 firebreak, fireguard -n08571898 flea market -n08573674 battlefront, front, front line -n08573842 garbage heap, junk heap, rubbish heap, scrapheap, trash heap, junk pile, trash pile, refuse heap -n08578517 benthos, benthic division, benthonic zone -n08579266 goldfield -n08579352 grainfield, grain field -n08580944 half-mast, half-staff -n08583292 hemline -n08583455 heronry -n08583554 hipline -n08583682 hipline -n08584914 hole-in-the-wall -n08586978 junkyard -n08589670 isoclinic line, isoclinal -n08596076 littoral, litoral, littoral zone, sands -n08597579 magnetic pole -n08598301 grassland -n08598568 mecca -n08599174 observer's meridian -n08599292 prime meridian -n08611339 nombril -n08611421 no-parking zone -n08613733 outdoors, out-of-doors, open air, open -n08614632 fairground -n08616050 pasture, pastureland, grazing land, lea, ley -n08618831 perihelion -n08619112 periselene, perilune -n08623676 locus of infection -n08628141 kasbah, casbah -n08633683 waterfront -n08640531 resort, resort hotel, holiday resort -n08640739 resort area, playground, vacation spot -n08640962 rough -n08643267 ashram -n08644045 harborage, harbourage -n08645104 scrubland -n08645212 weald -n08645318 wold -n08647264 schoolyard -n08648917 showplace -n08649711 bedside -n08651104 sideline, out of bounds -n08652376 ski resort -n08658309 soil horizon -n08658918 geological horizon -n08659242 coal seam -n08659331 coalface -n08659446 field -n08659861 oilfield -n08661878 Temperate Zone -n08662427 terreplein -n08663051 three-mile limit -n08663703 desktop -n08663860 top -n08673039 kampong, campong -n08674344 subtropics, semitropics -n08676253 barrio -n08677424 veld, veldt -n08677801 vertex, peak, apex, acme -n08678783 waterline, water line, water level -n08679167 high-water mark -n08679269 low-water mark -n08679562 continental divide -n08685188 zodiac -n08782627 Aegean island -n08896327 sultanate -n09032191 Swiss canton -n09186592 abyssal zone -n09189157 aerie, aery, eyrie, eyry -n09191635 air bubble -n09193551 alluvial flat, alluvial plain -n09193705 alp -n09194227 Alpine glacier, Alpine type of glacier -n09199101 anthill, formicary -n09201998 aquifer -n09203827 archipelago -n09205509 arete -n09206896 arroyo -n09206985 ascent, acclivity, rise, raise, climb, upgrade -n09208496 asterism -n09209025 asthenosphere -n09210862 atoll -n09213434 bank -n09213565 bank -n09214060 bar -n09214269 barbecue pit -n09214916 barrier reef -n09215023 baryon, heavy particle -n09215437 basin -n09217230 beach -n09218315 honeycomb -n09218494 belay -n09218641 ben -n09219233 berm -n09223487 bladder stone, cystolith -n09224725 bluff -n09226869 borrow pit -n09228055 brae -n09229709 bubble -n09230041 burrow, tunnel -n09230202 butte -n09231117 caldera -n09233446 canyon, canon -n09233603 canyonside -n09238926 cave -n09239302 cavern -n09242389 chasm -n09245515 cirque, corrie, cwm -n09246464 cliff, drop, drop-off -n09247410 cloud -n09248153 coast -n09248399 coastland -n09249034 col, gap -n09249155 collector -n09251407 comet -n09255070 continental glacier -n09256479 coral reef -n09257843 cove -n09259025 crag -n09259219 crater -n09260907 cultivated land, farmland, plowland, ploughland, tilled land, tillage, tilth -n09262690 dale -n09263912 defile, gorge -n09264803 delta -n09265620 descent, declivity, fall, decline, declination, declension, downslope -n09266604 diapir -n09267854 divot -n09268007 divot -n09269341 down -n09269472 downhill -n09269882 draw -n09270160 drey -n09270657 drumlin -n09270735 dune, sand dune -n09274152 escarpment, scarp -n09274305 esker -n09279986 fireball -n09281252 flare star -n09282208 floor -n09283193 fomite, vehicle -n09283405 foothill -n09283514 footwall -n09283767 foreland -n09283866 foreshore -n09287415 gauge boson -n09287968 geological formation, formation -n09288635 geyser -n09289331 glacier -n09289596 glen -n09290350 gopher hole -n09290444 gorge -n09294877 grotto, grot -n09295210 growler -n09295946 gulch, flume -n09300306 gully -n09300905 hail -n09302616 highland, upland -n09303008 hill -n09303528 hillside -n09304750 hole, hollow -n09305031 hollow, holler -n09305898 hot spring, thermal spring -n09308572 iceberg, berg -n09308743 icecap, ice cap -n09309046 ice field -n09309168 ice floe, floe -n09309292 ice mass -n09310616 inclined fault -n09315159 ion -n09319604 isthmus -n09325824 kidney stone, urinary calculus, nephrolith, renal calculus -n09326662 knoll, mound, hillock, hummock, hammock -n09327077 kopje, koppie -n09327538 Kuiper belt, Edgeworth-Kuiper belt -n09330378 lake bed, lake bottom -n09331251 lakefront -n09332890 lakeside, lakeshore -n09335693 landfall -n09335809 landfill -n09336555 lather -n09337048 leak -n09337253 ledge, shelf -n09338013 lepton -n09339810 lithosphere, geosphere -n09344198 lowland -n09344324 lunar crater -n09344724 maar -n09348460 massif -n09349648 meander -n09351905 mesa, table -n09352849 meteorite -n09353815 microfossil -n09354511 midstream -n09357346 molehill -n09357447 monocline -n09359803 mountain, mount -n09361517 mountainside, versant -n09362316 mouth -n09362945 mull -n09366017 natural depression, depression -n09366317 natural elevation, elevation -n09375606 nullah -n09376198 ocean -n09376526 ocean floor, sea floor, ocean bottom, seabed, sea bottom, Davy Jones's locker, Davy Jones -n09376786 oceanfront -n09381242 outcrop, outcropping, rock outcrop -n09382099 oxbow -n09384106 pallasite -n09389867 perforation -n09391386 photosphere -n09391644 piedmont -n09391774 Piedmont glacier, Piedmont type of glacier -n09392402 pinetum -n09393524 plage -n09393605 plain, field, champaign -n09396465 point -n09396608 polar glacier -n09398076 pothole, chuckhole -n09398677 precipice -n09399592 promontory, headland, head, foreland -n09400584 ptyalith -n09400987 pulsar -n09402944 quicksand -n09403086 rabbit burrow, rabbit hole -n09403211 radiator -n09403427 rainbow -n09403734 range, mountain range, range of mountains, chain, mountain chain, chain of mountains -n09405078 rangeland -n09405787 ravine -n09406793 reef -n09409512 ridge -n09409752 ridge, ridgeline -n09410224 rift valley -n09411189 riparian forest -n09411295 ripple mark -n09415584 riverbank, riverside -n09415671 riverbed, river bottom -n09416076 rock, stone -n09416890 roof -n09421031 saltpan -n09421799 sandbank -n09421951 sandbar, sand bar -n09422190 sandpit -n09422631 sanitary landfill -n09425019 sawpit -n09425344 scablands -n09428293 seashore, coast, seacoast, sea-coast -n09428628 seaside, seaboard -n09429630 seif dune -n09432283 shell -n09432990 shiner -n09433312 shoal -n09433442 shore -n09433839 shoreline -n09435739 sinkhole, sink, swallow hole -n09436444 ski slope -n09436708 sky -n09437454 slope, incline, side -n09438844 snowcap -n09438940 snowdrift -n09439032 snowfield -n09439213 soapsuds, suds, lather -n09442595 spit, tongue -n09443281 spoor -n09443641 spume -n09444783 star -n09445008 steep -n09445289 steppe -n09447666 strand -n09448690 streambed, creek bed -n09450163 sun, Sun -n09451237 supernova -n09452291 swale -n09452395 swamp, swampland -n09452760 swell -n09453008 tableland, plateau -n09454153 talus, scree -n09454412 tangle -n09454744 tar pit -n09456207 terrace, bench -n09457979 tidal basin -n09458269 tideland -n09459979 tor -n09460046 tor -n09461069 Trapezium -n09462600 troposphere -n09463226 tundra -n09464486 twinkler -n09466678 uphill -n09467696 urolith -n09468604 valley, vale -n09470027 vehicle-borne transmission -n09470222 vein, mineral vein -n09472413 volcanic crater, crater -n09472597 volcano -n09474010 wadi -n09474412 wall -n09474765 warren, rabbit warren -n09475044 wasp's nest, wasps' nest, hornet's nest, hornets' nest -n09475179 watercourse -n09475925 waterside -n09476123 water table, water level, groundwater level -n09478210 whinstone, whin -n09480959 wormcast -n09481120 xenolith -n09493983 Circe -n09495962 gryphon, griffin, griffon -n09505153 spiritual leader -n09537660 messiah, christ -n09556121 Rhea Silvia, Rea Silvia -n09605110 number one -n09606009 adventurer, venturer -n09606527 anomaly, unusual person -n09607630 appointee, appointment -n09607782 argonaut -n09607903 Ashkenazi -n09608709 benefactor, helper -n09610255 color-blind person -n09610405 commoner, common man, common person -n09611722 conservator -n09612700 contrarian -n09613118 contadino -n09613191 contestant -n09613690 cosigner, cosignatory -n09615336 discussant -n09616573 enologist, oenologist, fermentologist -n09616922 entertainer -n09617161 eulogist, panegyrist -n09617435 ex-gambler -n09617577 experimenter -n09617696 experimenter -n09618760 exponent -n09618880 ex-president -n09618957 face -n09619168 female, female person -n09619452 finisher -n09620078 inhabitant, habitant, dweller, denizen, indweller -n09620794 native, indigen, indigene, aborigine, aboriginal -n09621232 native -n09622049 juvenile, juvenile person -n09622302 lover -n09624168 male, male person -n09624559 mediator, go-between, intermediator, intermediary, intercessor -n09624899 mediatrix -n09625401 national, subject -n09626238 peer, equal, match, compeer -n09627807 prize winner, lottery winner -n09627906 recipient, receiver -n09629065 religionist -n09629246 sensualist -n09629752 traveler, traveller -n09631129 unwelcome person, persona non grata -n09632274 unskilled person -n09632518 worker -n09633969 wrongdoer, offender -n09635534 Black African -n09635635 Afrikaner, Afrikander, Boer -n09635973 Aryan -n09636339 Black, Black person, blackamoor, Negro, Negroid -n09637339 Black woman -n09638454 mulatto -n09638875 White, White person, Caucasian -n09639382 Circassian -n09639919 Semite -n09640327 Chaldean, Chaldaean, Chaldee -n09640715 Elamite -n09641002 white man -n09641578 WASP, white Anglo-Saxon Protestant -n09643799 gook, slant-eye -n09644152 Mongol, Mongolian -n09644657 Tatar, Tartar, Mongol Tatar -n09648743 Nahuatl -n09648911 Aztec -n09649067 Olmec -n09650729 Biloxi -n09650839 Blackfoot -n09650989 Brule -n09651123 Caddo -n09651968 Cheyenne -n09652149 Chickasaw -n09653144 Cocopa, Cocopah -n09653438 Comanche -n09654079 Creek -n09654518 Delaware -n09654898 Diegueno -n09655213 Esselen -n09655466 Eyeish -n09656077 Havasupai -n09657206 Hunkpapa -n09657748 Iowa, Ioway -n09658254 Kalapooia, Kalapuya, Calapooya, Calapuya -n09658398 Kamia -n09658815 Kekchi -n09658921 Kichai -n09659039 Kickapoo -n09659188 Kiliwa, Kiliwi -n09660010 Malecite -n09660240 Maricopa -n09661873 Mohican, Mahican -n09662038 Muskhogean, Muskogean -n09662661 Navaho, Navajo -n09662951 Nootka -n09663248 Oglala, Ogalala -n09663786 Osage -n09663999 Oneida -n09664556 Paiute, Piute -n09664908 Passamaquody -n09665367 Penobscot -n09665545 Penutian -n09666349 Potawatomi -n09666476 Powhatan -n09666883 kachina -n09667358 Salish -n09668199 Shahaptian, Sahaptin, Sahaptino -n09668437 Shasta -n09668562 Shawnee -n09668988 Sihasapa -n09669631 Teton, Lakota, Teton Sioux, Teton Dakota -n09670280 Taracahitian -n09670521 Tarahumara -n09670909 Tuscarora -n09671089 Tutelo -n09672590 Yana -n09672725 Yavapai -n09672840 Yokuts -n09673091 Yuma -n09674412 Gadaba -n09674786 Kolam -n09675045 Kui -n09675673 Toda -n09675799 Tulu -n09675922 Gujarati, Gujerati -n09676021 Kashmiri -n09676247 Punjabi, Panjabi -n09676884 Slav -n09677427 Anabaptist -n09678747 Adventist, Second Adventist -n09679028 gentile, non-Jew, goy -n09679170 gentile -n09679925 Catholic -n09680908 Old Catholic -n09681107 Uniat, Uniate, Uniate Christian -n09681234 Copt -n09681973 Jewess -n09683180 Jihadist -n09683757 Buddhist -n09683924 Zen Buddhist -n09684082 Mahayanist -n09684901 swami -n09685233 Hare Krishna -n09685806 Shintoist -n09686262 Eurafrican -n09686401 Eurasian -n09688233 Gael -n09688804 Frank -n09689435 Afghan, Afghanistani -n09689958 Albanian -n09690083 Algerian -n09690208 Altaic -n09690496 Andorran -n09690621 Angolan -n09690864 Anguillan -n09691604 Austrian -n09691729 Bahamian -n09691858 Bahraini, Bahreini -n09692125 Basotho -n09692915 Herero -n09693244 Luba, Chiluba -n09693982 Barbadian -n09694664 Bolivian -n09694771 Bornean -n09695019 Carioca -n09695132 Tupi -n09695514 Bruneian -n09695620 Bulgarian -n09695979 Byelorussian, Belorussian, White Russian -n09696456 Cameroonian -n09696585 Canadian -n09696763 French Canadian -n09697401 Central American -n09697986 Chilean -n09698644 Congolese -n09699020 Cypriot, Cypriote, Cyprian -n09699642 Dane -n09700125 Djiboutian -n09700964 Britisher, Briton, Brit -n09701148 English person -n09701833 Englishwoman -n09702134 Anglo-Saxon -n09702673 Angle -n09703101 West Saxon -n09703344 Lombard, Langobard -n09703485 limey, John Bull -n09703708 Cantabrigian -n09703809 Cornishman -n09703932 Cornishwoman -n09704057 Lancastrian -n09704157 Lancastrian -n09704283 Geordie -n09705003 Oxonian -n09705124 Ethiopian -n09705671 Amhara -n09705784 Eritrean -n09706029 Finn -n09706255 Komi -n09707061 Livonian -n09707289 Lithuanian -n09707735 Selkup, Ostyak-Samoyed -n09708750 Parisian -n09708889 Parisienne -n09709531 Creole -n09709673 Creole -n09710041 Gabonese -n09710164 Greek, Hellene -n09710886 Dorian -n09711132 Athenian -n09711435 Laconian -n09712324 Guyanese -n09712448 Haitian -n09712696 Malay, Malayan -n09712967 Moro -n09713108 Netherlander, Dutchman, Hollander -n09714120 Icelander -n09714694 Iraqi, Iraki -n09715165 Irishman -n09715303 Irishwoman -n09715427 Dubliner -n09716047 Italian -n09716933 Roman -n09717233 Sabine -n09718217 Japanese, Nipponese -n09718811 Jordanian -n09718936 Korean -n09719309 Kenyan -n09719794 Lao, Laotian -n09720033 Lapp, Lapplander, Sami, Saami, Same, Saame -n09720256 Latin American, Latino -n09720595 Lebanese -n09720702 Levantine -n09720842 Liberian -n09721244 Luxemburger, Luxembourger -n09721444 Macedonian -n09722064 Sabahan -n09722658 Mexican -n09722817 Chicano -n09723067 Mexican-American, Mexicano -n09723819 Namibian -n09723944 Nauruan -n09724234 Gurkha -n09724533 New Zealander, Kiwi -n09724656 Nicaraguan -n09724785 Nigerian -n09725000 Hausa, Haussa -n09725229 North American -n09725546 Nova Scotian, bluenose -n09725653 Omani -n09725772 Pakistani -n09725935 Brahui -n09726621 South American Indian -n09726811 Carib, Carib Indian -n09727440 Filipino -n09727826 Polynesian -n09728137 Qatari, Katari -n09728285 Romanian, Rumanian -n09729062 Muscovite -n09729156 Georgian -n09730077 Sarawakian -n09730204 Scandinavian, Norse, Northman -n09730824 Senegalese -n09731343 Slovene -n09731436 South African -n09731571 South American -n09732170 Sudanese -n09733459 Syrian -n09733793 Tahitian -n09734185 Tanzanian -n09734450 Tibetan -n09734535 Togolese -n09734639 Tuareg -n09735258 Turki -n09735654 Chuvash -n09736485 Turkoman, Turkmen, Turcoman -n09736798 Uzbek, Uzbeg, Uzbak, Usbek, Usbeg -n09736945 Ugandan -n09737050 Ukranian -n09737161 Yakut -n09737453 Tungus, Evenk -n09738121 Igbo -n09738400 American -n09740724 Anglo-American -n09741074 Alaska Native, Alaskan Native, Native Alaskan -n09741331 Arkansan, Arkansawyer -n09741722 Carolinian -n09741816 Coloradan -n09741904 Connecticuter -n09741999 Delawarean, Delawarian -n09742101 Floridian -n09742315 German American -n09742927 Illinoisan -n09743487 Mainer, Down Easter -n09743601 Marylander -n09743792 Minnesotan, Gopher -n09744161 Nebraskan, Cornhusker -n09744346 New Hampshirite, Granite Stater -n09744462 New Jerseyan, New Jerseyite, Garden Stater -n09744679 New Yorker -n09744834 North Carolinian, Tarheel -n09745229 Oregonian, Beaver -n09745324 Pennsylvanian, Keystone Stater -n09745834 Texan -n09745933 Utahan -n09746936 Uruguayan -n09747191 Vietnamese, Annamese -n09747495 Gambian -n09748101 East German -n09748408 Berliner -n09748648 Prussian -n09748889 Ghanian -n09749386 Guinean -n09750282 Papuan -n09750641 Walloon -n09750770 Yemeni -n09750891 Yugoslav, Jugoslav, Yugoslavian, Jugoslavian -n09751076 Serbian, Serb -n09751496 Xhosa -n09751622 Zairese, Zairean -n09751895 Zimbabwean -n09752023 Zulu -n09752519 Gemini, Twin -n09753348 Sagittarius, Archer -n09753792 Pisces, Fish -n09754152 abbe -n09754217 abbess, mother superior, prioress -n09754633 abnegator -n09754907 abridger, abbreviator -n09755086 abstractor, abstracter -n09755241 absconder -n09755555 absolver -n09755788 abecedarian -n09755893 aberrant -n09756049 abettor, abetter -n09756195 abhorrer -n09756961 abomination -n09757449 abseiler, rappeller -n09758173 abstainer, ascetic -n09758885 academic administrator -n09759501 academician -n09760290 accessory before the fact -n09760609 companion -n09760913 accompanist, accompanyist -n09761068 accomplice, confederate -n09761753 account executive, account representative, registered representative, customer's broker, customer's man -n09762011 accused -n09762385 accuser -n09763272 acid head -n09763784 acquaintance, friend -n09764201 acquirer -n09764598 aerialist -n09764732 action officer -n09764900 active -n09765118 active citizen -n09765278 actor, histrion, player, thespian, role player -n09767197 actor, doer, worker -n09769076 addict, nut, freak, junkie, junky -n09769525 adducer -n09769929 adjuster, adjustor, claims adjuster, claims adjustor, claim agent -n09770179 adjutant, aide, aide-de-camp -n09770359 adjutant general -n09771435 admirer, adorer -n09772330 adoptee -n09772746 adulterer, fornicator -n09772930 adulteress, fornicatress, hussy, jade, loose woman, slut, strumpet, trollop -n09773962 advertiser, advertizer, adman -n09774167 advisee -n09774783 advocate, advocator, proponent, exponent -n09775907 aeronautical engineer -n09776346 affiliate -n09776642 affluent -n09776807 aficionado -n09777870 buck sergeant -n09778266 agent-in-place -n09778537 aggravator, annoyance -n09778783 agitator, fomenter -n09778927 agnostic -n09779124 agnostic, doubter -n09779280 agonist -n09779461 agony aunt -n09779790 agriculturist, agriculturalist, cultivator, grower, raiser -n09780395 air attache -n09780828 air force officer, commander -n09780984 airhead -n09781398 air traveler, air traveller -n09781504 alarmist -n09781650 albino -n09782167 alcoholic, alky, dipsomaniac, boozer, lush, soaker, souse -n09782397 alderman -n09782855 alexic -n09783537 alienee, grantee -n09783776 alienor -n09783884 aliterate, aliterate person -n09784043 algebraist -n09784160 allegorizer, allegoriser -n09784564 alliterator -n09785236 almoner, medical social worker -n09785659 alpinist -n09785891 altar boy -n09786115 alto -n09787534 ambassador, embassador -n09787765 ambassador -n09788073 ambusher -n09788237 amicus curiae, friend of the court -n09789150 amoralist -n09789566 amputee -n09789898 analogist -n09790047 analphabet, analphabetic -n09790482 analyst -n09791014 industry analyst -n09791419 market strategist -n09791816 anarchist, nihilist, syndicalist -n09792125 anathema, bete noire -n09792555 ancestor, ascendant, ascendent, antecedent, root -n09792969 anchor, anchorman, anchorperson -n09793141 ancient -n09793352 anecdotist, raconteur -n09793946 angler, troller -n09794550 animator -n09794668 animist -n09795010 annotator -n09795124 announcer -n09795334 announcer -n09796809 anti -n09796974 anti-American -n09797742 anti-Semite, Jew-baiter -n09797873 Anzac -n09797998 ape-man -n09798096 aphakic -n09800469 appellant, plaintiff in error -n09800964 appointee -n09801102 apprehender -n09801275 April fool -n09801533 aspirant, aspirer, hopeful, wannabe, wannabee -n09802445 appreciator -n09802641 appropriator -n09802951 Arabist -n09804230 archaist -n09805151 archbishop -n09805324 archer, bowman -n09805475 architect, designer -n09806944 archivist -n09807075 archpriest, hierarch, high priest, prelate, primate -n09808080 Aristotelian, Aristotelean, Peripatetic -n09808591 armiger -n09809279 army attache -n09809538 army engineer, military engineer -n09809749 army officer -n09809925 arranger, adapter, transcriber -n09810166 arrival, arriver, comer -n09811568 arthritic -n09811712 articulator -n09811852 artilleryman, cannoneer, gunner, machine gunner -n09813219 artist's model, sitter -n09814252 assayer -n09814381 assemblyman -n09814488 assemblywoman -n09814567 assenter -n09814660 asserter, declarer, affirmer, asseverator, avower -n09815455 assignee -n09815790 assistant, helper, help, supporter -n09816654 assistant professor -n09816771 associate -n09817174 associate -n09817386 associate professor -n09818022 astronaut, spaceman, cosmonaut -n09819477 cosmographer, cosmographist -n09820044 atheist -n09820263 athlete, jock -n09821831 attendant, attender, tender -n09822830 attorney general -n09823153 auditor -n09823287 augur, auspex -n09823502 aunt, auntie, aunty -n09823832 au pair girl -n09824135 authoritarian, dictator -n09824609 authority -n09825096 authorizer, authoriser -n09825750 automobile mechanic, auto-mechanic, car-mechanic, mechanic, grease monkey -n09826204 aviator, aeronaut, airman, flier, flyer -n09826605 aviatrix, airwoman, aviatress -n09826821 ayah -n09827246 babu, baboo -n09827363 baby, babe, sister -n09828216 baby -n09828403 baby boomer, boomer -n09828988 baby farmer -n09830194 back -n09830400 backbencher -n09830629 backpacker, packer -n09830759 backroom boy, brain truster -n09830926 backscratcher -n09831962 bad person -n09832456 baggage -n09832633 bag lady -n09832978 bailee -n09833111 bailiff -n09833275 bailor -n09833441 bairn -n09833536 baker, bread maker -n09833751 balancer -n09833997 balker, baulker, noncompliant -n09834258 ball-buster, ball-breaker -n09834378 ball carrier, runner -n09834699 ballet dancer -n09834885 ballet master -n09835017 ballet mistress -n09835153 balletomane -n09835230 ball hawk -n09835348 balloonist -n09835506 ballplayer, baseball player -n09836160 bullfighter, toreador -n09836343 banderillero -n09836519 matador -n09836786 picador -n09837459 bandsman -n09837720 banker -n09838295 bank robber -n09838370 bankrupt, insolvent -n09838621 bantamweight -n09839702 barmaid -n09840217 baron, big businessman, business leader, king, magnate, mogul, power, top executive, tycoon -n09840435 baron -n09840520 baron -n09841188 bartender, barman, barkeep, barkeeper, mixologist -n09841515 baseball coach, baseball manager -n09841696 base runner, runner -n09842047 basketball player, basketeer, cager -n09842288 basketweaver, basketmaker -n09842395 Basket Maker -n09842528 bass, basso -n09842823 bastard, by-blow, love child, illegitimate child, illegitimate, whoreson -n09843443 bat boy -n09843602 bather -n09843716 batman -n09843824 baton twirler, twirler -n09844457 Bavarian -n09844898 beadsman, bedesman -n09845401 beard -n09845849 beatnik, beat -n09846142 beauty consultant -n09846469 Bedouin, Beduin -n09846586 bedwetter, bed wetter, wetter -n09846755 beekeeper, apiarist, apiculturist -n09846894 beer drinker, ale drinker -n09847267 beggarman -n09847344 beggarwoman -n09847543 beldam, beldame -n09848110 theist -n09848489 believer, truster -n09849167 bell founder -n09849990 benedick, benedict -n09850760 berserker, berserk -n09850974 besieger -n09851165 best, topper -n09851575 betrothed -n09853541 Big Brother -n09853645 bigot -n09853881 big shot, big gun, big wheel, big cheese, big deal, big enchilada, big fish, head honcho -n09854218 big sister -n09854421 billiard player -n09854915 biochemist -n09855433 biographer -n09856401 bird fancier -n09856671 birth -n09856827 birth-control campaigner, birth-control reformer -n09857007 bisexual, bisexual person -n09858165 black belt -n09858299 blackmailer, extortioner, extortionist -n09858733 Black Muslim -n09859152 blacksmith -n09859285 blade -n09859975 blind date -n09861287 bluecoat -n09861599 bluestocking, bas bleu -n09861863 boatbuilder -n09861946 boatman, boater, waterman -n09862183 boatswain, bos'n, bo's'n, bosun, bo'sun -n09862621 bobby -n09863031 bodyguard, escort -n09863339 boffin -n09863749 Bolshevik, Marxist, red, bolshie, bolshy -n09863936 Bolshevik, Bolshevist -n09864632 bombshell -n09864968 bondman, bondsman -n09865068 bondwoman, bondswoman, bondmaid -n09865162 bondwoman, bondswoman, bondmaid -n09865398 bond servant -n09865672 book agent -n09865744 bookbinder -n09866115 bookkeeper -n09866354 bookmaker -n09866559 bookworm -n09866661 booster, shoplifter, lifter -n09866817 bootblack, shoeblack -n09866922 bootlegger, moonshiner -n09867069 bootmaker, boot maker -n09867154 borderer -n09867311 border patrolman -n09868270 botanist, phytologist, plant scientist -n09868782 bottom feeder -n09868899 boulevardier -n09869317 bounty hunter -n09869447 bounty hunter -n09869578 Bourbon -n09870096 bowler -n09871095 slugger, slogger -n09871229 cub, lad, laddie, sonny, sonny boy -n09871681 Boy Scout -n09871867 boy scout -n09871952 boy wonder -n09872066 bragger, braggart, boaster, blowhard, line-shooter, vaunter -n09872557 brahman, brahmin -n09873348 brawler -n09873473 breadwinner -n09873769 breaststroker -n09873899 breeder, stock breeder -n09874428 brick -n09874725 bride -n09874862 bridesmaid, maid of honor -n09875025 bridge agent -n09875979 broadcast journalist -n09876701 Brother -n09877288 brother-in-law -n09877587 browser -n09877750 Brummie, Brummy -n09877951 buddy, brother, chum, crony, pal, sidekick -n09878921 bull -n09879552 bully -n09880189 bunny, bunny girl -n09880741 burglar -n09881265 bursar -n09881358 busboy, waiter's assistant -n09881895 business editor -n09883047 business traveler -n09883452 buster -n09883807 busybody, nosy-parker, nosey-parker, quidnunc -n09885059 buttinsky -n09885866 cabinetmaker, furniture maker -n09886403 caddie, golf caddie -n09886540 cadet, plebe -n09888635 caller, caller-out -n09889065 call girl -n09889170 calligrapher, calligraphist -n09889691 campaigner, candidate, nominee -n09889941 camper -n09890192 camp follower -n09890749 candidate, prospect -n09891730 canonist -n09892262 capitalist -n09892513 captain, headwaiter, maitre d'hotel, maitre d' -n09892693 captain, senior pilot -n09893191 captain -n09893344 captain, chieftain -n09893502 captive -n09893600 captive -n09894143 cardinal -n09894445 cardiologist, heart specialist, heart surgeon -n09894654 card player -n09894909 cardsharp, card sharp, cardsharper, card sharper, sharper, sharpie, sharpy, card shark -n09895222 careerist -n09895480 career man -n09895561 caregiver -n09895701 caretaker -n09895902 caretaker -n09896170 caricaturist -n09896311 carillonneur -n09896401 caroler, caroller -n09896685 carpenter -n09896826 carper, niggler -n09898020 Cartesian -n09899289 cashier -n09899671 casualty, injured party -n09899782 casualty -n09899929 casuist, sophist -n09901337 catechist -n09901502 catechumen, neophyte -n09901642 caterer -n09901786 Catholicos -n09901921 cat fancier -n09902128 Cavalier, Royalist -n09902353 cavalryman, trooper -n09902731 caveman, cave man, cave dweller, troglodyte -n09902851 celebrant -n09902954 celebrant, celebrator, celebrater -n09903153 celebrity, famous person -n09903501 cellist, violoncellist -n09903639 censor -n09903936 censor -n09904208 centenarian -n09904837 centrist, middle of the roader, moderate, moderationist -n09905050 centurion -n09905185 certified public accountant, CPA -n09905530 chachka, tsatske, tshatshke, tchotchke, tchotchkeleh -n09906293 chambermaid, fille de chambre -n09906449 chameleon -n09906704 champion, champ, title-holder -n09907804 chandler -n09908769 prison chaplain -n09909660 charcoal burner -n09909929 charge d'affaires -n09910222 charioteer -n09910374 charmer, beguiler -n09910556 chartered accountant -n09910840 chartist, technical analyst -n09911226 charwoman, char, cleaning woman, cleaning lady, woman -n09912431 male chauvinist, sexist -n09912681 cheapskate, tightwad -n09912907 Chechen -n09912995 checker -n09913329 cheerer -n09913455 cheerleader -n09913593 cheerleader -n09915434 Cheops, Khufu -n09915651 chess master -n09916348 chief executive officer, CEO, chief operating officer -n09917214 chief of staff -n09917345 chief petty officer -n09917481 Chief Secretary -n09917593 child, kid, youngster, minor, shaver, nipper, small fry, tiddler, tike, tyke, fry, nestling -n09918248 child, kid -n09918554 child, baby -n09918867 child prodigy, infant prodigy, wonder child -n09919061 chimneysweeper, chimneysweep, sweep -n09919200 chiropractor -n09919451 chit -n09919899 choker -n09920106 choragus -n09920283 choreographer -n09920901 chorus girl, showgirl, chorine -n09921034 chosen -n09923003 cicerone -n09923186 cigar smoker -n09923418 cipher, cypher, nobody, nonentity -n09923561 circus acrobat -n09923673 citizen -n09923996 city editor -n09924106 city father -n09924195 city man -n09924313 city slicker, city boy -n09924437 civic leader, civil leader -n09924996 civil rights leader, civil rights worker, civil rights activist -n09927089 cleaner -n09927451 clergyman, reverend, man of the cloth -n09928136 cleric, churchman, divine, ecclesiastic -n09928451 clerk -n09928845 clever Dick, clever clogs -n09929202 climatologist -n09929298 climber -n09929577 clinician -n09930257 closer, finisher -n09930628 closet queen -n09930876 clown, buffoon, goof, goofball, merry andrew -n09931165 clown, buffoon -n09931418 coach, private instructor, tutor -n09931640 coach, manager, handler -n09932098 pitching coach -n09932336 coachman -n09932508 coal miner, collier, pitman -n09932788 coastguardsman -n09933020 cobber -n09933098 cobbler, shoemaker -n09933842 codger, old codger -n09933972 co-beneficiary -n09934337 cog -n09934488 cognitive neuroscientist -n09934774 coiffeur -n09935107 coiner -n09935434 collaborator, cooperator, partner, pardner -n09936825 colleen -n09936892 college student, university student -n09937056 collegian, college man, college boy -n09937688 colonial -n09937802 colonialist -n09937903 colonizer, coloniser -n09938080 coloratura, coloratura soprano -n09938449 color guard -n09938991 colossus, behemoth, giant, heavyweight, titan -n09940725 comedian -n09940818 comedienne -n09941089 comer -n09941571 commander -n09941787 commander in chief, generalissimo -n09941964 commanding officer, commandant, commander -n09942697 commissar, political commissar -n09942970 commissioned officer -n09943239 commissioned military officer -n09943811 commissioner -n09944022 commissioner -n09944160 committee member -n09944430 committeewoman -n09945021 commodore -n09945223 communicant -n09945319 communist, commie -n09945603 Communist -n09945745 commuter -n09946814 compere -n09947127 complexifier -n09950457 compulsive -n09950728 computational linguist -n09951070 computer scientist -n09951274 computer user -n09951524 Comrade -n09951616 concert-goer, music lover -n09952163 conciliator, make-peace, pacifier, peacemaker, reconciler -n09953052 conductor -n09953350 confectioner, candymaker -n09953615 Confederate -n09954355 confessor -n09954639 confidant, intimate -n09955406 Confucian, Confucianist -n09955944 rep -n09956578 conqueror, vanquisher -n09957523 Conservative -n09958133 Nonconformist, chapelgoer -n09958292 Anglican -n09958447 consignee -n09958569 consigner, consignor -n09959142 constable -n09959658 constructivist -n09960688 contractor -n09961198 contralto -n09961331 contributor -n09961469 control freak -n09961605 convalescent -n09961739 convener -n09962966 convict, con, inmate, yard bird, yardbird -n09964202 copilot, co-pilot -n09964411 copycat, imitator, emulator, ape, aper -n09965515 coreligionist -n09965787 cornerback -n09966470 corporatist -n09966554 correspondent, letter writer -n09967063 cosmetician -n09967406 cosmopolitan, cosmopolite -n09967555 Cossack -n09967816 cost accountant -n09967967 co-star -n09968259 costumier, costumer, costume designer -n09968652 cotter, cottier -n09968741 cotter, cottar -n09968845 counselor, counsellor -n09970088 counterterrorist -n09970192 counterspy, mole -n09970402 countess -n09970822 compromiser -n09971273 countrywoman -n09971385 county agent, agricultural agent, extension agent -n09971839 courtier -n09972010 cousin, first cousin, cousin-german, full cousin -n09972458 cover girl, pin-up, lovely -n09972587 cow -n09974648 craftsman, artisan, journeyman, artificer -n09975425 craftsman, crafter -n09976024 crapshooter -n09976283 crazy, loony, looney, nutcase, weirdo -n09976429 creature, wight -n09976728 creditor -n09976917 creep, weirdo, weirdie, weirdy, spook -n09978442 criminologist -n09979321 critic -n09979913 Croesus -n09980458 cross-examiner, cross-questioner -n09980805 crossover voter, crossover -n09980985 croupier -n09981092 crown prince -n09981278 crown princess -n09981540 cryptanalyst, cryptographer, cryptologist -n09981939 Cub Scout -n09982152 cuckold -n09982525 cultist -n09983314 curandera -n09983572 curate, minister of religion, minister, parson, pastor, rector -n09983889 curator, conservator -n09984960 customer agent -n09985470 cutter, carver -n09985809 cyberpunk -n09985978 cyborg, bionic man, bionic woman -n09986450 cymbalist -n09986700 Cynic -n09986904 cytogeneticist -n09987045 cytologist -n09987161 czar -n09987239 czar, tsar, tzar -n09988063 dad, dada, daddy, pa, papa, pappa, pop -n09988311 dairyman -n09988493 Dalai Lama, Grand Lama -n09988703 dallier, dillydallier, dilly-dallier, mope, lounger -n09989502 dancer, professional dancer, terpsichorean -n09990415 dancer, social dancer -n09990690 clog dancer -n09990777 dancing-master, dance master -n09991740 dark horse -n09991867 darling, favorite, favourite, pet, dearie, deary, ducky -n09992538 date, escort -n09992837 daughter, girl -n09993252 dawdler, drone, laggard, lagger, trailer, poke -n09993651 day boarder -n09994400 day laborer, day labourer -n09994673 deacon, Protestant deacon -n09994808 deaconess -n09994878 deadeye -n09995829 deipnosophist -n09996039 dropout -n09996304 deadhead -n09996481 deaf person -n09997622 debtor, debitor -n09998788 deckhand, roustabout -n09999135 defamer, maligner, slanderer, vilifier, libeler, backbiter, traducer -n10000294 defense contractor -n10000459 deist, freethinker -n10000787 delegate -n10001217 deliveryman, delivery boy, deliverer -n10001481 demagogue, demagog, rabble-rouser -n10001764 demigod, superman, Ubermensch -n10002257 demographer, demographist, population scientist -n10002760 demonstrator, protester -n10003476 den mother -n10004718 department head -n10005006 depositor -n10005934 deputy -n10006177 dermatologist, skin doctor -n10006748 descender -n10007684 designated hitter -n10007809 designer, intriguer -n10007995 desk clerk, hotel desk clerk, hotel clerk -n10008123 desk officer -n10008254 desk sergeant, deskman, station keeper -n10009162 detainee, political detainee -n10009276 detective, investigator, tec, police detective -n10009484 detective -n10009671 detractor, disparager, depreciator, knocker -n10010062 developer -n10010243 deviationist -n10010632 devisee -n10010767 devisor -n10010864 devourer -n10011360 dialectician -n10011486 diarist, diary keeper, journalist -n10012484 dietician, dietitian, nutritionist -n10013811 diocesan -n10015215 director, theater director, theatre director -n10015485 director -n10015792 dirty old man -n10015897 disbeliever, nonbeliever, unbeliever -n10017272 disk jockey, disc jockey, dj -n10017422 dispatcher -n10018747 distortionist -n10018861 distributor, distributer -n10019072 district attorney, DA -n10019187 district manager -n10019406 diver, plunger -n10020366 divorcee, grass widow -n10020533 ex-wife, ex -n10020670 divorce lawyer -n10020807 docent -n10020890 doctor, doc, physician, MD, Dr., medico -n10022908 dodo, fogy, fogey, fossil -n10023264 doge -n10023506 dog in the manger -n10023656 dogmatist, doctrinaire -n10024025 dolichocephalic -n10024362 domestic partner, significant other, spousal equivalent, spouse equivalent -n10024937 Dominican -n10025060 dominus, dominie, domine, dominee -n10025295 don, father -n10025391 Donatist -n10025635 donna -n10026976 dosser, street person -n10027246 double, image, look-alike -n10027590 double-crosser, double-dealer, two-timer, betrayer, traitor -n10028402 down-and-out -n10028541 doyenne -n10029068 draftsman, drawer -n10030277 dramatist, playwright -n10032987 dreamer -n10033412 dressmaker, modiste, needlewoman, seamstress, sempstress -n10033572 dressmaker's model -n10033663 dribbler, driveller, slobberer, drooler -n10033888 dribbler -n10034201 drinker, imbiber, toper, juicer -n10034614 drinker -n10035952 drug addict, junkie, junky -n10036266 drug user, substance abuser, user -n10036444 Druid -n10036692 drum majorette, majorette -n10036929 drummer -n10037080 drunk -n10037385 drunkard, drunk, rummy, sot, inebriate, wino -n10037588 Druze, Druse -n10037922 dry, prohibitionist -n10038119 dry nurse -n10038409 duchess -n10038620 duke -n10039271 duffer -n10039946 dunker -n10040240 Dutch uncle -n10040698 dyspeptic -n10040945 eager beaver, busy bee, live wire, sharpie, sharpy -n10041373 earl -n10041887 earner, wage earner -n10042690 eavesdropper -n10042845 eccentric, eccentric person, flake, oddball, geek -n10043024 eclectic, eclecticist -n10043491 econometrician, econometrist -n10043643 economist, economic expert -n10044682 ectomorph -n10044879 editor, editor in chief -n10047199 egocentric, egoist -n10047459 egotist, egoist, swellhead -n10048117 ejaculator -n10048367 elder -n10048612 elder statesman -n10048836 elected official -n10049363 electrician, lineman, linesman -n10050043 elegist -n10050880 elocutionist -n10051026 emancipator, manumitter -n10051761 embryologist -n10051861 emeritus -n10051975 emigrant, emigre, emigree, outgoer -n10052694 emissary, envoy -n10053439 empress -n10053808 employee -n10054657 employer -n10055297 enchantress, witch -n10055410 enchantress, temptress, siren, Delilah, femme fatale -n10055566 encyclopedist, encyclopaedist -n10055730 endomorph -n10055847 enemy, foe, foeman, opposition -n10056103 energizer, energiser, vitalizer, vitaliser, animator -n10056611 end man -n10056719 end man, corner man -n10057271 endorser, indorser -n10058411 enjoyer -n10058962 enlisted woman -n10059067 enophile, oenophile -n10060075 entrant -n10060175 entrant -n10060352 entrepreneur, enterpriser -n10061043 envoy, envoy extraordinary, minister plenipotentiary -n10061195 enzymologist -n10061431 eparch -n10061882 epidemiologist -n10062042 epigone, epigon -n10062176 epileptic -n10062275 Episcopalian -n10062492 equerry -n10062594 equerry -n10062716 erotic -n10062905 escapee -n10062996 escapist, dreamer, wishful thinker -n10063635 Eskimo, Esquimau, Inuit -n10063919 espionage agent -n10064831 esthetician, aesthetician -n10064977 etcher -n10065758 ethnologist -n10066206 Etonian -n10066314 etymologist -n10067011 evangelist, revivalist, gospeler, gospeller -n10067305 Evangelist -n10067600 event planner -n10067968 examiner, inspector -n10068234 examiner, tester, quizzer -n10068425 exarch -n10069296 executant -n10069981 executive secretary -n10070108 executive vice president -n10070377 executrix -n10070449 exegete -n10070563 exhibitor, exhibitioner, shower -n10070711 exhibitionist, show-off -n10071332 exile, expatriate, expat -n10071557 existentialist, existentialist philosopher, existential philosopher -n10072054 exorcist, exorciser -n10074249 ex-spouse -n10074578 extern, medical extern -n10074735 extremist -n10074841 extrovert, extravert -n10075299 eyewitness -n10075693 facilitator -n10076224 fairy godmother -n10076483 falangist, phalangist -n10076604 falconer, hawker -n10076957 falsifier -n10077106 familiar -n10077593 fan, buff, devotee, lover -n10077879 fanatic, fiend -n10078131 fancier, enthusiast -n10078719 farm boy -n10078806 farmer, husbandman, granger, sodbuster -n10079399 farmhand, fieldhand, field hand, farm worker -n10079893 fascist -n10080117 fascista -n10080508 fatalist, determinist, predestinarian, predestinationist -n10080869 father, male parent, begetter -n10081204 Father, Padre -n10081842 father-figure -n10082043 father-in-law -n10082299 Fauntleroy, Little Lord Fauntleroy -n10082423 Fauve, fauvist -n10082562 favorite son -n10082687 featherweight -n10082997 federalist -n10083677 fellow traveler, fellow traveller -n10083823 female aristocrat -n10084043 female offspring -n10084295 female child, girl, little girl -n10085101 fence -n10085869 fiance, groom-to-be -n10086383 fielder, fieldsman -n10086744 field judge -n10087434 fighter pilot -n10087736 filer -n10088200 film director, director -n10090745 finder -n10091349 fire chief, fire marshal -n10091450 fire-eater, fire-swallower -n10091564 fire-eater, hothead -n10091651 fireman, firefighter, fire fighter, fire-eater -n10091861 fire marshall -n10091997 fire walker -n10092488 first baseman, first sacker -n10092643 firstborn, eldest -n10092794 first lady -n10092978 first lieutenant, 1st lieutenant -n10093167 first offender -n10093475 first sergeant, sergeant first class -n10093818 fishmonger, fishwife -n10094320 flagellant -n10094584 flag officer -n10094782 flak catcher, flak, flack catcher, flack -n10095265 flanker back, flanker -n10095420 flapper -n10095769 flatmate -n10095869 flatterer, adulator -n10096126 flibbertigibbet, foolish woman -n10096508 flight surgeon -n10097262 floorwalker, shopwalker -n10097477 flop, dud, washout -n10097590 Florentine -n10097842 flower girl -n10097995 flower girl -n10098245 flutist, flautist, flute player -n10098388 fly-by-night -n10098517 flyweight -n10098624 flyweight -n10098710 foe, enemy -n10098862 folk dancer -n10099002 folk poet -n10099375 follower -n10101308 football hero -n10101634 football player, footballer -n10101981 footman -n10102800 forefather, father, sire -n10103155 foremother -n10103228 foreign agent -n10103921 foreigner, outsider -n10104064 boss -n10104487 foreman -n10104756 forester, tree farmer, arboriculturist -n10104888 forewoman -n10105085 forger, counterfeiter -n10105733 forward -n10105906 foster-brother, foster brother -n10106387 foster-father, foster father -n10106509 foster-mother, foster mother -n10106995 foster-sister, foster sister -n10107173 foster-son, foster son -n10107303 founder, beginner, founding father, father -n10108018 foundress -n10108089 four-minute man -n10108464 framer -n10108832 Francophobe -n10109443 freak, monster, monstrosity, lusus naturae -n10109662 free agent, free spirit, freewheeler -n10109826 free agent -n10110093 freedom rider -n10110731 free-liver -n10110893 freeloader -n10111358 free trader -n10111779 Freudian -n10111903 friar, mendicant -n10112129 monk, monastic -n10113249 frontierswoman -n10113583 front man, front, figurehead, nominal head, straw man, strawman -n10113869 frotteur -n10114476 fucker -n10114550 fucker -n10114662 fuddy-duddy -n10115430 fullback -n10115946 funambulist, tightrope walker -n10116370 fundamentalist -n10116478 fundraiser -n10116702 futurist -n10117017 gadgeteer -n10117267 gagman, gagster, gagwriter -n10117415 gagman, standup comedian -n10117739 gainer, weight gainer -n10117851 gal -n10118301 galoot -n10118743 gambist -n10118844 gambler -n10119609 gamine -n10120330 garbage man, garbageman, garbage collector, garbage carter, garbage hauler, refuse collector, dustman -n10120671 gardener -n10121026 garment cutter -n10121246 garroter, garrotter, strangler, throttler, choker -n10121714 gasman -n10121800 gastroenterologist -n10122300 gatherer -n10122531 gawker -n10123122 gendarme -n10123844 general, full general -n10126177 generator, source, author -n10126424 geneticist -n10126708 genitor -n10127186 gent -n10127689 geologist -n10128519 geophysicist -n10128748 ghostwriter, ghost -n10129338 Gibson girl -n10129825 girl, miss, missy, young lady, young woman, fille -n10130686 girlfriend, girl, lady friend -n10130877 girlfriend -n10131151 girl wonder -n10131268 Girondist, Girondin -n10131590 gitano -n10131815 gladiator -n10132035 glassblower -n10132502 gleaner -n10134178 goat herder, goatherd -n10134396 godchild -n10134760 godfather -n10134982 godparent -n10135129 godson -n10135197 gofer -n10135297 goffer, gopher -n10136615 goldsmith, goldworker, gold-worker -n10136959 golfer, golf player, linksman -n10137825 gondolier, gondoliere -n10138369 good guy -n10138472 good old boy, good ole boy, good ol' boy -n10139077 good Samaritan -n10139651 gossip columnist -n10140051 gouger -n10140597 governor general -n10140683 grabber -n10140783 grader -n10140929 graduate nurse, trained nurse -n10141364 grammarian, syntactician -n10141732 granddaughter -n10142166 grande dame -n10142391 grandfather, gramps, granddad, grandad, granddaddy, grandpa -n10142537 Grand Inquisitor -n10142747 grandma, grandmother, granny, grannie, gran, nan, nanna -n10142946 grandmaster -n10143172 grandparent -n10143595 grantee -n10143725 granter -n10144338 grass widower, divorced man -n10145239 great-aunt, grandaunt -n10145340 great grandchild -n10145480 great granddaughter -n10145590 great grandmother -n10145774 great grandparent -n10145902 great grandson -n10146002 great-nephew, grandnephew -n10146104 great-niece, grandniece -n10146416 Green Beret -n10146816 grenadier, grenade thrower -n10146927 greeter, saluter, welcomer -n10147121 gringo -n10147262 grinner -n10147710 grocer -n10147935 groom, bridegroom -n10148035 groom, bridegroom -n10148305 grouch, grump, crank, churl, crosspatch -n10148825 group captain -n10149436 grunter -n10149867 prison guard, jailer, jailor, gaoler, screw, turnkey -n10150071 guard -n10150794 guesser -n10150940 guest, invitee -n10151133 guest -n10151261 guest of honor -n10151367 guest worker, guestworker -n10151570 guide -n10151760 guitarist, guitar player -n10152306 gunnery sergeant -n10152616 guru -n10152763 guru -n10153155 guvnor -n10153414 guy, cat, hombre, bozo -n10153594 gymnast -n10153865 gym rat -n10154013 gynecologist, gynaecologist, woman's doctor -n10154186 Gypsy, Gipsy, Romany, Rommany, Romani, Roma, Bohemian -n10154601 hack, drudge, hacker -n10155222 hacker, cyber-terrorist, cyberpunk -n10155600 haggler -n10155849 hairdresser, hairstylist, stylist, styler -n10156629 hakim, hakeem -n10156831 Hakka -n10157016 halberdier -n10157128 halfback -n10157271 half blood -n10158506 hand -n10159045 animal trainer, handler -n10159289 handyman, jack of all trades, odd-job man -n10159533 hang glider -n10160188 hardliner -n10160280 harlequin -n10160412 harmonizer, harmoniser -n10161622 hash head -n10162016 hatchet man, iceman -n10162194 hater -n10162354 hatmaker, hatter, milliner, modiste -n10164025 headman, tribal chief, chieftain, chief -n10164233 headmaster, schoolmaster, master -n10164492 head nurse -n10165448 hearer, listener, auditor, attender -n10166189 heartbreaker -n10166394 heathen, pagan, gentile, infidel -n10167152 heavyweight -n10167361 heavy -n10167565 heckler, badgerer -n10167838 hedger -n10168012 hedger, equivocator, tergiversator -n10168183 hedonist, pagan, pleasure seeker -n10168584 heir, inheritor, heritor -n10168837 heir apparent -n10169147 heiress, inheritress, inheritrix -n10169241 heir presumptive -n10169419 hellion, heller, devil -n10169796 helmsman, steersman, steerer -n10170060 hire -n10170681 hematologist, haematologist -n10170866 hemiplegic -n10171219 herald, trumpeter -n10171456 herbalist, herb doctor -n10171567 herder, herdsman, drover -n10172080 hermaphrodite, intersex, gynandromorph, androgyne, epicene, epicene person -n10173410 heroine -n10173579 heroin addict -n10173665 hero worshiper, hero worshipper -n10173771 Herr -n10174253 highbinder -n10174330 highbrow -n10174445 high commissioner -n10174589 highflier, highflyer -n10174695 Highlander, Scottish Highlander, Highland Scot -n10174971 high-muck-a-muck, pooh-bah -n10175248 high priest -n10175725 highjacker, hijacker -n10176913 hireling, pensionary -n10177150 historian, historiographer -n10178077 hitchhiker -n10178216 hitter, striker -n10179069 hobbyist -n10180580 holdout -n10180791 holdover, hangover -n10180923 holdup man, stickup man -n10181445 homeboy -n10181547 homeboy -n10181799 home buyer -n10181878 homegirl -n10182190 homeless, homeless person -n10182402 homeopath, homoeopath -n10183347 honest woman -n10183931 honor guard, guard of honor -n10184505 hooker -n10185148 hoper -n10185483 hornist -n10185793 horseman, equestrian, horseback rider -n10186068 horse trader -n10186143 horsewoman -n10186216 horse wrangler, wrangler -n10186350 horticulturist, plantsman -n10186686 hospital chaplain -n10186774 host, innkeeper, boniface -n10187130 host -n10187491 hostess -n10187990 hotelier, hotelkeeper, hotel manager, hotelman, hosteller -n10188715 housekeeper -n10188856 housemaster -n10188957 housemate -n10189278 house physician, resident, resident physician -n10189597 house sitter -n10190122 housing commissioner -n10190516 huckster, cheap-jack -n10191001 hugger -n10191388 humanist, humanitarian -n10191613 humanitarian, do-gooder, improver -n10192839 hunk -n10193650 huntress -n10194231 ex-husband, ex -n10194775 hydrologist -n10195056 hyperope -n10195155 hypertensive -n10195261 hypnotist, hypnotizer, hypnotiser, mesmerist, mesmerizer -n10195593 hypocrite, dissembler, dissimulator, phony, phoney, pretender -n10196404 iceman -n10196725 iconoclast -n10197392 ideologist, ideologue -n10198437 idol, matinee idol -n10198832 idolizer, idoliser -n10199251 imam, imaum -n10200246 imperialist -n10200781 important person, influential person, personage -n10202225 inamorato -n10202624 incumbent, officeholder -n10202763 incurable -n10203949 inductee -n10204177 industrialist -n10204833 infanticide -n10205231 inferior -n10205344 infernal -n10205457 infielder -n10205714 infiltrator -n10206173 informer, betrayer, rat, squealer, blabber -n10206506 ingenue -n10206629 ingenue -n10207077 polymath -n10207169 in-law, relative-in-law -n10208189 inquiry agent -n10208847 inspector -n10208950 inspector general -n10209082 instigator, initiator -n10209731 insurance broker, insurance agent, general agent, underwriter -n10210137 insurgent, insurrectionist, freedom fighter, rebel -n10210512 intelligence analyst -n10210648 interior designer, designer, interior decorator, house decorator, room decorator, decorator -n10210911 interlocutor, conversational partner -n10211036 interlocutor, middleman -n10211666 International Grandmaster -n10211830 internationalist -n10212231 internist -n10212501 interpreter, translator -n10212780 interpreter -n10213034 intervenor -n10213429 introvert -n10214062 invader, encroacher -n10214390 invalidator, voider, nullifier -n10215623 investigator -n10216106 investor -n10216403 invigilator -n10217208 irreligionist -n10218043 Ivy Leaguer -n10218164 Jack of all trades -n10218292 Jacksonian -n10219240 Jane Doe -n10219453 janissary -n10219879 Jat -n10220080 Javanese, Javan -n10220924 Jekyll and Hyde -n10221312 jester, fool, motley fool -n10221520 Jesuit -n10222170 jezebel -n10222259 jilt -n10222497 jobber, middleman, wholesaler -n10222716 job candidate -n10223069 Job's comforter -n10223177 jockey -n10223606 John Doe -n10224578 journalist -n10225219 judge, justice, jurist -n10225931 judge advocate -n10226413 juggler -n10227166 Jungian -n10227266 junior -n10227393 junior -n10227490 Junior, Jr, Jnr -n10227698 junior lightweight -n10227793 junior middleweight -n10227985 jurist, legal expert -n10228278 juror, juryman, jurywoman -n10228468 justice of the peace -n10228592 justiciar, justiciary -n10228712 kachina -n10229883 keyboardist -n10230216 Khedive -n10233248 kingmaker -n10235024 king, queen, world-beater -n10235269 King's Counsel -n10235385 Counsel to the Crown -n10236304 kin, kinsperson, family -n10236521 enate, matrikin, matrilineal kin, matrisib, matrilineal sib -n10236842 kink -n10237069 kinswoman -n10237196 kisser, osculator -n10237464 kitchen help -n10237556 kitchen police, KP -n10237676 Klansman, Ku Kluxer, Kluxer -n10237799 kleptomaniac -n10238272 kneeler -n10238375 knight -n10239928 knocker -n10240082 knower, apprehender -n10240235 know-it-all, know-all -n10240417 kolkhoznik -n10240821 Kshatriya -n10241024 labor coach, birthing coach, doula, monitrice -n10241300 laborer, manual laborer, labourer, jack -n10242328 Labourite -n10243137 lady -n10243273 lady-in-waiting -n10243483 lady's maid -n10243664 lama -n10243872 lamb, dear -n10244108 lame duck -n10244359 lamplighter -n10244913 land agent -n10245029 landgrave -n10245341 landlubber, lubber, landsman -n10245507 landlubber, landsman, landman -n10245639 landowner, landholder, property owner -n10245863 landscape architect, landscape gardener, landscaper, landscapist -n10246317 langlaufer -n10246395 languisher -n10246703 lapidary, lapidarist -n10247358 lass, lassie, young girl, jeune fille -n10247880 Latin -n10248008 Latin -n10248198 latitudinarian -n10248377 Jehovah's Witness -n10249191 law agent -n10249270 lawgiver, lawmaker -n10249459 lawman, law officer, peace officer -n10249869 law student -n10249950 lawyer, attorney -n10250712 lay reader -n10251329 lazybones -n10251612 leaker -n10252075 leaseholder, lessee -n10252222 lector, lecturer, reader -n10252354 lector, reader -n10252547 lecturer -n10253122 left-hander, lefty, southpaw -n10253296 legal representative -n10253479 legate, official emissary -n10253611 legatee -n10253703 legionnaire, legionary -n10255459 letterman -n10257221 liberator -n10258602 licenser -n10258786 licentiate -n10259348 lieutenant -n10259780 lieutenant colonel, light colonel -n10259997 lieutenant commander -n10260473 lieutenant junior grade, lieutenant JG -n10260706 life -n10260800 lifeguard, lifesaver -n10261211 life tenant -n10261511 light flyweight -n10261624 light heavyweight, cruiserweight -n10261862 light heavyweight -n10262343 light-o'-love, light-of-love -n10262445 lightweight -n10262561 lightweight -n10262655 lightweight -n10262880 lilliputian -n10263146 limnologist -n10263411 lineman -n10263790 line officer -n10265281 lion-hunter -n10265801 lisper -n10265891 lister -n10266016 literary critic -n10266328 literate, literate person -n10266848 litigant, litigator -n10267166 litterer, litterbug, litter lout -n10267311 little brother -n10267865 little sister -n10268629 lobbyist -n10269199 locksmith -n10269289 locum tenens, locum -n10271677 Lord, noble, nobleman -n10272782 loser -n10272913 loser, also-ran -n10273064 failure, loser, nonstarter, unsuccessful person -n10274173 Lothario -n10274318 loudmouth, blusterer -n10274815 lowerclassman, underclassman -n10275249 Lowlander, Scottish Lowlander, Lowland Scot -n10275395 loyalist, stalwart -n10275848 Luddite -n10276045 lumberman, lumberjack, logger, feller, faller -n10276477 lumper -n10276942 bedlamite -n10277027 pyromaniac -n10277638 lutist, lutanist, lutenist -n10277815 Lutheran -n10277912 lyricist, lyrist -n10278456 macebearer, mace, macer -n10279018 machinist, mechanic, shop mechanic -n10279778 madame -n10280034 maenad -n10280130 maestro, master -n10280598 magdalen -n10280674 magician, prestidigitator, conjurer, conjuror, illusionist -n10281546 magus -n10281770 maharani, maharanee -n10281896 mahatma -n10282482 maid, maiden -n10282672 maid, maidservant, housemaid, amah -n10283170 major -n10283366 major -n10283546 major-domo, seneschal -n10284064 maker, shaper -n10284871 malahini -n10284965 malcontent -n10286282 malik -n10286539 malingerer, skulker, shammer -n10286749 Malthusian -n10288964 adonis -n10289039 man -n10289176 man -n10289462 manageress -n10289766 mandarin -n10290422 maneuverer, manoeuvrer -n10290541 maniac -n10290813 Manichaean, Manichean, Manichee -n10290919 manicurist -n10291110 manipulator -n10291469 man-at-arms -n10291822 man of action, man of deeds -n10291942 man of letters -n10292316 manufacturer, producer -n10293332 marcher, parader -n10293590 marchioness, marquise -n10293861 margrave -n10294020 margrave -n10294139 Marine, devil dog, leatherneck, shipboard soldier -n10295371 marquess -n10295479 marquis, marquess -n10296176 marshal, marshall -n10296444 martinet, disciplinarian, moralist -n10297234 mascot -n10297367 masochist -n10297531 mason, stonemason -n10297841 masquerader, masker, masquer -n10298202 masseur -n10298271 masseuse -n10298647 master -n10298912 master, captain, sea captain, skipper -n10299125 master-at-arms -n10299250 master of ceremonies, emcee, host -n10299700 masturbator, onanist -n10299875 matchmaker, matcher, marriage broker -n10300041 mate, first mate -n10300154 mate -n10300303 mate -n10300500 mater -n10300654 material -n10300829 materialist -n10302576 matriarch, materfamilias -n10302700 matriarch -n10302905 matriculate -n10303037 matron -n10303814 mayor, city manager -n10304086 mayoress -n10304650 mechanical engineer -n10304914 medalist, medallist, medal winner -n10305635 medical officer, medic -n10305802 medical practitioner, medical man -n10306004 medical scientist -n10306279 medium, spiritualist, sensitive -n10306496 megalomaniac -n10306595 melancholic, melancholiac -n10306890 Melkite, Melchite -n10307114 melter -n10308066 nonmember -n10308168 board member -n10308275 clansman, clanswoman, clan member -n10308504 memorizer, memoriser -n10308653 Mendelian -n10308732 mender, repairer, fixer -n10310783 Mesoamerican -n10311506 messmate -n10311661 mestiza -n10312287 meteorologist -n10312491 meter maid -n10312600 Methodist -n10313000 Metis -n10313239 metropolitan -n10313441 mezzo-soprano, mezzo -n10313724 microeconomist, microeconomic expert -n10314054 middle-aged man -n10314182 middlebrow -n10314517 middleweight -n10314836 midwife, accoucheuse -n10315217 mikado, tenno -n10315456 Milanese -n10315561 miler -n10315730 miles gloriosus -n10316360 military attache -n10316527 military chaplain, padre, Holy Joe, sky pilot -n10316862 military leader -n10317007 military officer, officer -n10317500 military policeman, MP -n10317963 mill agent -n10318293 mill-hand, factory worker -n10318607 millionairess -n10318686 millwright -n10319313 minder -n10320484 mining engineer -n10320863 minister, government minister -n10321126 ministrant -n10321340 minor leaguer, bush leaguer -n10321632 Minuteman -n10321882 misanthrope, misanthropist -n10322238 misfit -n10323634 mistress -n10323752 mistress, kept woman, fancy woman -n10323999 mixed-blood -n10324560 model, poser -n10325549 class act -n10325774 modeler, modeller -n10326776 modifier -n10327143 molecular biologist -n10327987 Monegasque, Monacan -n10328123 monetarist -n10328328 moneygrubber -n10328437 moneymaker -n10328696 Mongoloid -n10328941 monolingual -n10329035 monologist -n10330593 moonlighter -n10330931 moralist -n10331098 morosoph -n10331167 morris dancer -n10331258 mortal enemy -n10331347 mortgagee, mortgage holder -n10331841 mortician, undertaker, funeral undertaker, funeral director -n10332110 moss-trooper -n10332385 mother, female parent -n10332861 mother -n10332953 mother -n10333044 mother figure -n10333165 mother hen -n10333317 mother-in-law -n10333439 mother's boy, mamma's boy, mama's boy -n10333601 mother's daughter -n10333838 motorcycle cop, motorcycle policeman, speed cop -n10334009 motorcyclist -n10334461 Mound Builder -n10334782 mountebank, charlatan -n10335246 mourner, griever, sorrower, lamenter -n10335801 mouthpiece, mouth -n10335931 mover -n10336411 moviegoer, motion-picture fan -n10336904 muffin man -n10337488 mugwump, independent, fencesitter -n10338231 Mullah, Mollah, Mulla -n10338391 muncher -n10339179 murderess -n10339251 murder suspect -n10339717 musher -n10340312 musician, instrumentalist, player -n10341243 musicologist -n10341343 music teacher -n10341446 musketeer -n10341573 Muslimah -n10341955 mutilator, maimer, mangler -n10342180 mutineer -n10342367 mute, deaf-mute, deaf-and-dumb person -n10342543 mutterer, mumbler, murmurer -n10342893 muzzler -n10342992 Mycenaen -n10343088 mycologist -n10343355 myope -n10343449 myrmidon -n10343554 mystic, religious mystic -n10343869 mythologist -n10344121 naif -n10344203 nailer -n10344319 namby-pamby -n10344656 name dropper -n10344774 namer -n10345015 nan -n10345100 nanny, nursemaid, nurse -n10345302 narc, nark, narcotics agent -n10345422 narcissist, narcist -n10345659 nark, copper's nark -n10346015 nationalist -n10347204 nautch girl -n10347446 naval commander -n10348526 Navy SEAL, SEAL -n10349243 obstructionist, obstructor, obstructer, resister, thwarter -n10349750 Nazarene -n10349836 Nazarene, Ebionite -n10350220 Nazi, German Nazi -n10350774 nebbish, nebbech -n10351064 necker -n10353016 neonate, newborn, newborn infant, newborn baby -n10353355 nephew -n10353928 neurobiologist -n10354265 neurologist, brain doctor -n10354754 neurosurgeon, brain surgeon -n10355142 neutral -n10355306 neutralist -n10355449 newcomer, fledgling, fledgeling, starter, neophyte, freshman, newbie, entrant -n10355688 newcomer -n10355806 New Dealer -n10356450 newspaper editor -n10356877 newsreader, news reader -n10357012 Newtonian -n10357613 niece -n10357737 niggard, skinflint, scrooge, churl -n10358032 night porter -n10358124 night rider, nightrider -n10358575 NIMBY -n10359117 niqaabi -n10359422 nitpicker -n10359546 Nobelist, Nobel Laureate -n10359659 NOC -n10360366 noncandidate -n10360747 noncommissioned officer, noncom, enlisted officer -n10361060 nondescript -n10361194 nondriver -n10361296 nonparticipant -n10361525 nonperson, unperson -n10362003 nonresident -n10362319 nonsmoker -n10362557 Northern Baptist -n10363445 noticer -n10363573 novelist -n10364198 novitiate, novice -n10364502 nuclear chemist, radiochemist -n10365514 nudger -n10366145 nullipara -n10366276 number theorist -n10366966 nurse -n10368291 nursling, nurseling, suckling -n10368528 nymph, houri -n10368624 nymphet -n10368711 nympholept -n10368798 nymphomaniac, nympho -n10369095 oarswoman -n10369317 oboist -n10369417 obscurantist -n10369528 observer, commentator -n10369699 obstetrician, accoucheur -n10369955 occupier -n10370381 occultist -n10370955 wine lover -n10371052 offerer, offeror -n10371221 office-bearer -n10371330 office boy -n10371450 officeholder, officer -n10373390 officiant -n10373525 Federal, Fed, federal official -n10374541 oilman -n10374849 oil tycoon -n10374943 old-age pensioner -n10375052 old boy -n10375314 old lady -n10375402 old man -n10376523 oldster, old person, senior citizen, golden ager -n10376890 old-timer, oldtimer, gaffer, old geezer, antique -n10377021 old woman -n10377185 oligarch -n10377291 Olympian -n10377542 omnivore -n10377633 oncologist -n10378026 onlooker, looker-on -n10378113 onomancer -n10378780 operator -n10379376 opportunist, self-seeker -n10380126 optimist -n10380499 Orangeman -n10380672 orator, speechmaker, rhetorician, public speaker, speechifier -n10381804 orderly, hospital attendant -n10381981 orderly -n10382157 orderly sergeant -n10382302 ordinand -n10382480 ordinary -n10382710 organ-grinder -n10382825 organist -n10383094 organization man -n10383237 organizer, organiser, arranger -n10383505 organizer, organiser, labor organizer -n10383816 originator, conceiver, mastermind -n10384214 ornithologist, bird watcher -n10384392 orphan -n10384496 orphan -n10385566 osteopath, osteopathist -n10386196 out-and-outer -n10386754 outdoorswoman -n10386874 outfielder -n10386984 outfielder -n10387196 right fielder -n10387324 right-handed pitcher, right-hander -n10387836 outlier -n10389865 owner-occupier -n10389976 oyabun -n10390600 packrat -n10390698 padrone -n10390807 padrone -n10391416 page, pageboy -n10393909 painter -n10394434 Paleo-American, Paleo-Amerind, Paleo-Indian -n10394786 paleontologist, palaeontologist, fossilist -n10395073 pallbearer, bearer -n10395209 palmist, palmister, chiromancer -n10395390 pamperer, spoiler, coddler, mollycoddler -n10395828 Panchen Lama -n10396106 panelist, panellist -n10396337 panhandler -n10396727 paparazzo -n10396908 paperboy -n10397001 paperhanger, paperer -n10397142 paperhanger -n10397392 papoose, pappoose -n10399130 pardoner -n10400003 paretic -n10400108 parishioner -n10400205 park commissioner -n10400437 Parliamentarian, Member of Parliament -n10400618 parliamentary agent -n10400998 parodist, lampooner -n10401204 parricide -n10401331 parrot -n10401639 partaker, sharer -n10402709 part-timer -n10402824 party -n10403633 party man, party liner -n10403876 passenger, rider -n10404426 passer -n10404998 paster -n10405540 pater -n10405694 patient -n10406266 patriarch -n10406391 patriarch -n10406765 patriarch, paterfamilias -n10407310 patriot, nationalist -n10407954 patron, sponsor, supporter -n10408809 patternmaker -n10409459 pawnbroker -n10409752 payer, remunerator -n10410246 peacekeeper -n10410996 peasant -n10411356 pedant, bookworm, scholastic -n10411551 peddler, pedlar, packman, hawker, pitchman -n10411867 pederast, paederast, child molester -n10414239 penologist -n10414768 pentathlete -n10414865 Pentecostal, Pentecostalist -n10415037 percussionist -n10416567 periodontist -n10417288 peshmerga -n10417424 personality -n10417551 personal representative -n10417682 personage -n10417843 persona grata -n10417969 persona non grata -n10418101 personification -n10418735 perspirer, sweater -n10419047 pervert, deviant, deviate, degenerate -n10419472 pessimist -n10419630 pest, blighter, cuss, pesterer, gadfly -n10419785 Peter Pan -n10420031 petitioner, suppliant, supplicant, requester -n10420277 petit juror, petty juror -n10420507 pet sitter, critter sitter -n10420649 petter, fondler -n10421016 Pharaoh, Pharaoh of Egypt -n10421470 pharmacist, druggist, chemist, apothecary, pill pusher, pill roller -n10421956 philanthropist, altruist -n10422405 philatelist, stamp collector -n10425946 philosopher -n10426454 phonetician -n10426630 phonologist -n10427223 photojournalist -n10427359 photometrist, photometrician -n10427764 physical therapist, physiotherapist -n10428004 physicist -n10431122 piano maker -n10431625 picker, chooser, selector -n10432189 picnicker, picknicker -n10432441 pilgrim -n10432875 pill -n10432957 pillar, mainstay -n10433077 pill head -n10433452 pilot -n10433610 Piltdown man, Piltdown hoax -n10433737 pimp, procurer, panderer, pander, pandar, fancy man, ponce -n10435169 pipe smoker -n10435251 pip-squeak, squirt, small fry -n10435716 pisser, urinator -n10435988 pitcher, hurler, twirler -n10436334 pitchman -n10437014 placeman, placeseeker -n10437137 placer miner -n10437262 plagiarist, plagiarizer, plagiariser, literary pirate, pirate -n10437698 plainsman -n10438172 planner, contriver, deviser -n10438619 planter, plantation owner -n10438842 plasterer -n10439373 platinum blond, platinum blonde -n10439523 platitudinarian -n10439727 playboy, man-about-town, Corinthian -n10439851 player, participant -n10441037 playmate, playfellow -n10441124 pleaser -n10441694 pledger -n10441962 plenipotentiary -n10442093 plier, plyer -n10442232 plodder, slowpoke, stick-in-the-mud, slowcoach -n10442417 plodder, slogger -n10442573 plotter, mapper -n10443032 plumber, pipe fitter -n10443659 pluralist -n10443830 pluralist -n10444194 poet -n10448322 pointsman -n10448455 point woman -n10449664 policyholder -n10450038 political prisoner -n10450161 political scientist -n10450303 politician, politico, pol, political leader -n10451450 politician -n10451590 pollster, poll taker, headcounter, canvasser -n10451858 polluter, defiler -n10453184 pool player -n10455619 portraitist, portrait painter, portrayer, limner -n10456070 poseuse -n10456138 positivist, rationalist -n10456696 postdoc, post doc -n10457214 poster girl -n10457444 postulator -n10457903 private citizen -n10458111 problem solver, solver, convergent thinker -n10458356 pro-lifer -n10458596 prosthetist -n10459882 postulant -n10460033 potboy, potman -n10461060 poultryman, poulterer -n10462588 power user -n10462751 power worker, power-station worker -n10462860 practitioner, practician -n10464052 prayer, supplicant -n10464542 preceptor, don -n10464711 predecessor -n10464870 preemptor, pre-emptor -n10465002 preemptor, pre-emptor -n10465451 premature baby, preterm baby, premature infant, preterm infant, preemie, premie -n10465831 presbyter -n10466198 presenter, sponsor -n10466564 presentist -n10466918 preserver -n10467179 president -n10467395 President of the United States, United States President, President, Chief Executive -n10468750 president, prexy -n10469611 press agent, publicity man, public relations man, PR man -n10469874 press photographer -n10470779 priest -n10471640 prima ballerina -n10471732 prima donna, diva -n10471859 prima donna -n10472129 primigravida, gravida I -n10472447 primordial dwarf, hypoplastic dwarf, true dwarf, normal dwarf -n10473453 prince charming -n10473562 prince consort -n10473789 princeling -n10473917 Prince of Wales -n10474064 princess -n10474343 princess royal -n10474446 principal, dealer -n10474645 principal, school principal, head teacher, head -n10475835 print seller -n10475940 prior -n10476467 private, buck private, common soldier -n10477713 probationer, student nurse -n10477955 processor -n10478118 process-server -n10478293 proconsul -n10478462 proconsul -n10478827 proctologist -n10478960 proctor, monitor -n10479135 procurator -n10479328 procurer, securer -n10481167 profit taker -n10481268 programmer, computer programmer, coder, software engineer -n10482054 promiser, promisor -n10482220 promoter, booster, plugger -n10482587 promulgator -n10482921 propagandist -n10483138 propagator, disseminator -n10483395 property man, propman, property master -n10483799 prophetess -n10483890 prophet -n10484858 prosecutor, public prosecutor, prosecuting officer, prosecuting attorney -n10485298 prospector -n10485883 protectionist -n10486166 protegee -n10486236 protozoologist -n10486561 provost marshal -n10487182 pruner, trimmer -n10487363 psalmist -n10487592 psephologist -n10488016 psychiatrist, head-shrinker, shrink -n10488309 psychic -n10488656 psycholinguist -n10489426 psychophysicist -n10490421 publican, tavern keeper -n10491998 pudge -n10492086 puerpera -n10492727 punching bag -n10493199 punter -n10493419 punter -n10493685 puppeteer -n10493835 puppy, pup -n10493922 purchasing agent -n10494195 puritan -n10494373 Puritan -n10495167 pursuer -n10495421 pusher, shover -n10495555 pusher, drug peddler, peddler, drug dealer, drug trafficker -n10495756 pusher, thruster -n10496393 putz -n10496489 Pygmy, Pigmy -n10497135 qadi -n10497534 quadriplegic -n10497645 quadruplet, quad -n10498046 quaker, trembler -n10498699 quarter -n10498816 quarterback, signal caller, field general -n10498986 quartermaster -n10499110 quartermaster general -n10499232 Quebecois -n10499355 queen, queen regnant, female monarch -n10499631 Queen of England -n10499857 queen -n10500217 queen -n10500419 queen consort -n10500603 queen mother -n10500824 Queen's Counsel -n10500942 question master, quizmaster -n10501453 quick study, sponge -n10501635 quietist -n10502046 quitter -n10502329 rabbi -n10502950 racist, racialist -n10503818 radiobiologist -n10504090 radiologic technologist -n10504206 radiologist, radiotherapist -n10505347 rainmaker -n10505613 raiser -n10505732 raja, rajah -n10505942 rake, rakehell, profligate, rip, blood, roue -n10506336 ramrod -n10506544 ranch hand -n10506915 ranker -n10507070 ranter, raver -n10507380 rape suspect -n10507482 rapper -n10507565 rapporteur -n10507692 rare bird, rara avis -n10508141 ratepayer -n10508379 raw recruit -n10508710 reader -n10509063 reading teacher -n10509161 realist -n10509810 real estate broker, real estate agent, estate agent, land agent, house agent -n10510245 rear admiral -n10510974 receiver -n10511771 reciter -n10512201 recruit, enlistee -n10512372 recruit, military recruit -n10512708 recruiter -n10512859 recruiting-sergeant -n10513509 redcap -n10513823 redhead, redheader, red-header, carrottop -n10513938 redneck, cracker -n10514051 reeler -n10514121 reenactor -n10514255 referral -n10514429 referee, ref -n10514784 refiner -n10515863 Reform Jew -n10516527 registered nurse, RN -n10517137 registrar -n10517283 Regius professor -n10518349 reliever, allayer, comforter -n10519126 anchorite, hermit -n10519494 religious leader -n10519984 remover -n10520286 Renaissance man, generalist -n10520544 renegade -n10520964 rentier -n10521100 repairman, maintenance man, service man -n10521662 reporter, newsman, newsperson -n10521853 newswoman -n10522035 representative -n10522324 reprobate, miscreant -n10522759 rescuer, recoverer, saver -n10523341 reservist -n10524076 resident commissioner -n10524223 respecter -n10524869 restaurateur, restauranter -n10525134 restrainer, controller -n10525436 retailer, retail merchant -n10525617 retiree, retired person -n10525878 returning officer -n10526534 revenant -n10527147 revisionist -n10527334 revolutionist, revolutionary, subversive, subverter -n10528023 rheumatologist -n10528148 Rhodesian man, Homo rhodesiensis -n10528493 rhymer, rhymester, versifier, poetizer, poetiser -n10529231 rich person, wealthy person, have -n10530150 rider -n10530383 riding master -n10530571 rifleman -n10530959 right-hander, right hander, righthander -n10531109 right-hand man, chief assistant, man Friday -n10531445 ringer -n10531838 ringleader -n10533874 roadman, road mender -n10533983 roarer, bawler, bellower, screamer, screecher, shouter, yeller -n10536134 rocket engineer, rocket scientist -n10536274 rocket scientist -n10536416 rock star -n10537708 Romanov, Romanoff -n10537906 romanticist, romantic -n10538629 ropemaker, rope-maker, roper -n10538733 roper -n10538853 roper -n10539015 ropewalker, ropedancer -n10539160 rosebud -n10539278 Rosicrucian -n10540114 Mountie -n10540252 Rough Rider -n10540656 roundhead -n10541833 civil authority, civil officer -n10542608 runner -n10542761 runner -n10542888 runner -n10543161 running back -n10543937 rusher -n10544232 rustic -n10544748 saboteur, wrecker, diversionist -n10545792 sadist -n10546428 sailing master, navigator -n10546633 sailor, crewman -n10548419 salesgirl, saleswoman, saleslady -n10548537 salesman -n10548681 salesperson, sales representative, sales rep -n10549510 salvager, salvor -n10550252 sandwichman -n10550369 sangoma -n10550468 sannup -n10551576 sapper -n10552393 Sassenach -n10553140 satrap -n10553235 saunterer, stroller, ambler -n10554024 Savoyard -n10554141 sawyer -n10554846 scalper -n10555059 scandalmonger -n10555430 scapegrace, black sheep -n10556033 scene painter -n10556518 schemer, plotter -n10556704 schizophrenic -n10556825 schlemiel, shlemiel -n10557246 schlockmeister, shlockmeister -n10557854 scholar, scholarly person, bookman, student -n10559009 scholiast -n10559288 schoolchild, school-age child, pupil -n10559508 schoolfriend -n10559683 Schoolman, medieval Schoolman -n10559996 schoolmaster -n10560106 schoolmate, classmate, schoolfellow, class fellow -n10560637 scientist -n10561222 scion -n10561320 scoffer, flouter, mocker, jeerer -n10561736 scofflaw -n10562135 scorekeeper, scorer -n10562283 scorer -n10562509 scourer -n10562968 scout, talent scout -n10563314 scoutmaster -n10563403 scrambler -n10563711 scratcher -n10564098 screen actor, movie actor -n10565502 scrutineer, canvasser -n10565667 scuba diver -n10566072 sculptor, sculpturer, carver, statue maker -n10567613 Sea Scout -n10567722 seasonal worker, seasonal -n10567848 seasoner -n10568200 second baseman, second sacker -n10568358 second cousin -n10568443 seconder -n10568608 second fiddle, second banana -n10568915 second-in-command -n10569011 second lieutenant, 2nd lieutenant -n10569179 second-rater, mediocrity -n10570019 secretary -n10570704 Secretary of Agriculture, Agriculture Secretary -n10571907 Secretary of Health and Human Services -n10572706 Secretary of State -n10572889 Secretary of the Interior, Interior Secretary -n10573957 sectarian, sectary, sectarist -n10574311 section hand -n10574538 secularist -n10574840 security consultant -n10575463 seeded player, seed -n10575594 seeder, cloud seeder -n10575787 seeker, searcher, quester -n10576223 segregate -n10576316 segregator, segregationist -n10576676 selectman -n10576818 selectwoman -n10576962 selfish person -n10577182 self-starter -n10577284 seller, marketer, vender, vendor, trafficker -n10577710 selling agent -n10577820 semanticist, semiotician -n10578021 semifinalist -n10578162 seminarian, seminarist -n10578471 senator -n10578656 sendee -n10579062 senior -n10579549 senior vice president -n10580030 separatist, separationist -n10580437 septuagenarian -n10580535 serf, helot, villein -n10581648 spree killer -n10581890 serjeant-at-law, serjeant, sergeant-at-law, sergeant -n10582604 server -n10582746 serviceman, military man, man, military personnel -n10583387 settler, colonist -n10583790 settler -n10585077 sex symbol -n10585217 sexton, sacristan -n10585628 shaheed -n10586166 Shakespearian, Shakespearean -n10586265 shanghaier, seizer -n10586444 sharecropper, cropper, sharecrop farmer -n10586903 shaver -n10586998 Shavian -n10588074 sheep -n10588357 sheik, tribal sheik, sheikh, tribal sheikh, Arab chief -n10588724 shelver -n10588965 shepherd -n10589666 ship-breaker -n10590146 shipmate -n10590239 shipowner -n10590452 shipping agent -n10590903 shirtmaker -n10591072 shogun -n10591811 shopaholic -n10592049 shop girl -n10592811 shop steward, steward -n10593521 shot putter -n10594147 shrew, termagant -n10594523 shuffler -n10594857 shyster, pettifogger -n10595164 sibling, sib -n10595647 sick person, diseased person, sufferer -n10596517 sightreader -n10596899 signaler, signaller -n10597505 signer -n10597745 signor, signior -n10597889 signora -n10598013 signore -n10598181 signorina -n10598459 silent partner, sleeping partner -n10598904 addle-head, addlehead, loon, birdbrain -n10599215 simperer -n10599806 singer, vocalist, vocalizer, vocaliser -n10601234 Sinologist -n10601362 sipper -n10602119 sirrah -n10602470 Sister -n10602985 sister, sis -n10603528 waverer, vacillator, hesitator, hesitater -n10603851 sitar player -n10604275 sixth-former -n10604380 skateboarder -n10604634 skeptic, sceptic, doubter -n10604880 sketcher -n10604979 skidder -n10605253 skier -n10605737 skinny-dipper -n10607291 skin-diver, aquanaut -n10607478 skinhead -n10609092 slasher -n10609198 slattern, slut, slovenly woman, trollop -n10610465 sleeper, slumberer -n10610850 sleeper -n10611267 sleeping beauty -n10611613 sleuth, sleuthhound -n10612210 slob, sloven, pig, slovenly person -n10612373 sloganeer -n10612518 slopseller, slop-seller -n10613996 smasher, stunner, knockout, beauty, ravisher, sweetheart, peach, lulu, looker, mantrap, dish -n10614507 smirker -n10614629 smith, metalworker -n10615179 smoothie, smoothy, sweet talker, charmer -n10615334 smuggler, runner, contrabandist, moon curser, moon-curser -n10616578 sneezer -n10617024 snob, prig, snot, snoot -n10617193 snoop, snooper -n10617397 snorer -n10618234 sob sister -n10618342 soccer player -n10618465 social anthropologist, cultural anthropologist -n10618685 social climber, climber -n10618848 socialist -n10619492 socializer, socialiser -n10619642 social scientist -n10619888 social secretary -n10620212 Socinian -n10620586 sociolinguist -n10620758 sociologist -n10621294 soda jerk, soda jerker -n10621400 sodalist -n10621514 sodomite, sodomist, sod, bugger -n10622053 soldier -n10624074 son, boy -n10624310 songster -n10624437 songstress -n10624540 songwriter, songster, ballad maker -n10625860 sorcerer, magician, wizard, necromancer, thaumaturge, thaumaturgist -n10626630 sorehead -n10627252 soul mate -n10628097 Southern Baptist -n10628644 sovereign, crowned head, monarch -n10629329 spacewalker -n10629647 Spanish American, Hispanic American, Hispanic -n10629939 sparring partner, sparring mate -n10630093 spastic -n10630188 speaker, talker, utterer, verbalizer, verbaliser -n10631131 native speaker -n10631309 Speaker -n10631654 speechwriter -n10632576 specialist, medical specialist -n10633298 specifier -n10633450 spectator, witness, viewer, watcher, looker -n10634464 speech therapist -n10634849 speedskater, speed skater -n10634990 spellbinder -n10635788 sphinx -n10636488 spinster, old maid -n10637483 split end -n10638922 sport, sportsman, sportswoman -n10639238 sport, summercater -n10639359 sporting man, outdoor man -n10639637 sports announcer, sportscaster, sports commentator -n10639817 sports editor -n10641223 sprog -n10642596 square dancer -n10642705 square shooter, straight shooter, straight arrow -n10643095 squatter -n10643837 squire -n10643937 squire -n10644598 staff member, staffer -n10645017 staff sergeant -n10645223 stage director -n10646032 stainer -n10646140 stakeholder -n10646433 stalker -n10646641 stalking-horse -n10646780 stammerer, stutterer -n10646942 stamper, stomper, tramper, trampler -n10647745 standee -n10648237 stand-in, substitute, relief, reliever, backup, backup man, fill-in -n10648696 star, principal, lead -n10649197 starlet -n10649308 starter, dispatcher -n10650162 statesman, solon, national leader -n10652605 state treasurer -n10652703 stationer, stationery seller -n10654015 stenographer, amanuensis, shorthand typist -n10654211 stentor -n10654321 stepbrother, half-brother, half brother -n10654827 stepmother -n10654932 stepparent -n10655169 stevedore, loader, longshoreman, docker, dockhand, dock worker, dockworker, dock-walloper, lumper -n10655442 steward -n10655594 steward, flight attendant -n10655730 steward -n10655986 stickler -n10656120 stiff -n10656223 stifler, smotherer -n10656969 stipendiary, stipendiary magistrate -n10657306 stitcher -n10657556 stockjobber -n10657835 stock trader -n10658304 stockist -n10659042 stoker, fireman -n10659762 stooper -n10660128 store detective -n10660621 strafer -n10660883 straight man, second banana -n10661002 stranger, alien, unknown -n10661216 stranger -n10661563 strategist, strategian -n10661732 straw boss, assistant foreman -n10663315 streetwalker, street girl, hooker, hustler, floozy, floozie, slattern -n10663549 stretcher-bearer, litter-bearer -n10665302 struggler -n10665587 stud, he-man, macho-man -n10665698 student, pupil, educatee -n10666752 stumblebum, palooka -n10667477 stylist -n10667709 subaltern -n10667863 subcontractor -n10668450 subduer, surmounter, overcomer -n10668666 subject, case, guinea pig -n10669991 subordinate, subsidiary, underling, foot soldier -n10671042 substitute, reserve, second-stringer -n10671613 successor, heir -n10671736 successor, replacement -n10671898 succorer, succourer -n10672371 Sufi -n10672540 suffragan, suffragan bishop -n10672662 suffragette -n10673296 sugar daddy -n10673776 suicide bomber -n10674130 suitor, suer, wooer -n10674713 sumo wrestler -n10675010 sunbather -n10675142 sundowner -n10675609 super heavyweight -n10676018 superior, higher-up, superordinate -n10676434 supermom -n10676569 supernumerary, spear carrier, extra -n10678937 supremo -n10679174 surgeon, operating surgeon, sawbones -n10679503 Surgeon General -n10679610 Surgeon General -n10679723 surpriser -n10680609 surveyor -n10680796 surveyor -n10681194 survivor, subsister -n10681557 sutler, victualer, victualler, provisioner -n10682713 sweeper -n10682953 sweetheart, sweetie, steady, truelove -n10683675 swinger, tramp -n10684146 switcher, whipper -n10684630 swot, grind, nerd, wonk, dweeb -n10684827 sycophant, toady, crawler, lackey, ass-kisser -n10685398 sylph -n10686073 sympathizer, sympathiser, well-wisher -n10686517 symphonist -n10686694 syncopator -n10686885 syndic -n10688356 tactician -n10688811 tagger -n10689306 tailback -n10690268 tallyman, tally clerk -n10690421 tallyman -n10690648 tanker, tank driver -n10691318 tapper, wiretapper, phone tapper -n10691937 Tartuffe, Tartufe -n10692090 Tarzan -n10692482 taster, taste tester, taste-tester, sampler -n10692883 tax assessor, assessor -n10693235 taxer -n10693334 taxi dancer -n10693824 taxonomist, taxonomer, systematist -n10694258 teacher, instructor -n10694939 teaching fellow -n10695450 tearaway -n10696101 technical sergeant -n10696508 technician -n10697135 Ted, Teddy boy -n10697282 teetotaler, teetotaller, teetotalist -n10698368 television reporter, television newscaster, TV reporter, TV newsman -n10699558 temporizer, temporiser -n10699752 tempter -n10699981 term infant -n10700105 toiler -n10700201 tenant, renter -n10700640 tenant -n10700963 tenderfoot -n10701180 tennis player -n10701644 tennis pro, professional tennis player -n10701962 tenor saxophonist, tenorist -n10702167 termer -n10702615 terror, scourge, threat -n10703221 tertigravida, gravida III -n10703336 testator, testate -n10703480 testatrix -n10703692 testee, examinee -n10704238 test-tube baby -n10704712 Texas Ranger, Ranger -n10704886 thane -n10705448 theatrical producer -n10705615 theologian, theologist, theologizer, theologiser -n10706812 theorist, theoretician, theorizer, theoriser, idealogue -n10707134 theosophist -n10707233 therapist, healer -n10707707 Thessalonian -n10708292 thinker, creative thinker, mind -n10708454 thinker -n10709529 thrower -n10710171 thurifer -n10710259 ticket collector, ticket taker -n10710778 tight end -n10710913 tiler -n10711483 timekeeper, timer -n10711766 Timorese -n10712229 tinkerer, fiddler -n10712374 tinsmith, tinner -n10712474 tinter -n10712690 tippler, social drinker -n10712835 tipster, tout -n10713254 T-man -n10713686 toastmaster, symposiarch -n10713843 toast mistress -n10714195 tobogganist -n10715030 tomboy, romp, hoyden -n10715347 toolmaker -n10715789 torchbearer -n10716576 Tory -n10716864 Tory -n10717055 tosser -n10717196 tosser, jerk-off, wanker -n10717337 totalitarian -n10718131 tourist, tourer, holidaymaker -n10718349 tout, touter -n10718509 tout, ticket tout -n10718665 tovarich, tovarisch -n10718952 towhead -n10719036 town clerk -n10719132 town crier, crier -n10719267 townsman, towner -n10719807 toxicologist -n10720197 track star -n10720453 trader, bargainer, dealer, monger -n10720964 trade unionist, unionist, union member -n10721124 traditionalist, diehard -n10721321 traffic cop -n10721612 tragedian -n10721708 tragedian -n10721819 tragedienne -n10722029 trail boss -n10722575 trainer -n10722965 traitor, treasonist -n10723230 traitress -n10723597 transactor -n10724132 transcriber -n10724372 transfer, transferee -n10724570 transferee -n10725280 translator, transcriber -n10726031 transvestite, cross-dresser -n10726786 traveling salesman, travelling salesman, commercial traveler, commercial traveller, roadman, bagman -n10727016 traverser -n10727171 trawler -n10727458 Treasury, First Lord of the Treasury -n10728117 trencher -n10728233 trend-setter, taste-maker, fashion arbiter -n10728624 tribesman -n10728998 trier, attempter, essayer -n10729330 trifler -n10730542 trooper -n10730728 trooper, state trooper -n10731013 Trotskyite, Trotskyist, Trot -n10731732 truant, hooky player -n10732010 trumpeter, cornetist -n10732521 trusty -n10732854 Tudor -n10732967 tumbler -n10733820 tutee -n10734394 twin -n10734741 two-timer -n10734891 Tyke -n10734963 tympanist, timpanist -n10735173 typist -n10735298 tyrant, autocrat, despot -n10735984 umpire, ump -n10737103 understudy, standby -n10737264 undesirable -n10738111 unicyclist -n10738215 unilateralist -n10738670 Unitarian -n10738871 Arminian -n10739135 universal donor -n10739297 UNIX guru -n10739391 Unknown Soldier -n10740594 upsetter -n10740732 upstager -n10740868 upstart, parvenu, nouveau-riche, arriviste -n10741152 upstart -n10741367 urchin -n10741493 urologist -n10742005 usherette -n10742111 usher, doorkeeper -n10742546 usurper, supplanter -n10742997 utility man -n10743124 utilizer, utiliser -n10743356 Utopian -n10744078 uxoricide -n10744164 vacationer, vacationist -n10745006 valedictorian, valedictory speaker -n10745770 valley girl -n10746931 vaulter, pole vaulter, pole jumper -n10747119 vegetarian -n10747424 vegan -n10747548 venerator -n10747965 venture capitalist -n10748142 venturer, merchant-venturer -n10748506 vermin, varmint -n10748620 very important person, VIP, high-up, dignitary, panjandrum, high muckamuck -n10749928 vibist, vibraphonist -n10750031 vicar -n10750188 vicar -n10750640 vicar-general -n10751026 vice chancellor -n10751152 vicegerent -n10751265 vice president, V.P. -n10751710 vice-regent -n10752480 victim, dupe -n10753061 Victorian -n10753182 victualer, victualler -n10753339 vigilante, vigilance man -n10753442 villager -n10753989 vintager -n10754189 vintner, wine merchant -n10754281 violator, debaucher, ravisher -n10754449 violator, lawbreaker, law offender -n10755080 violist -n10755164 virago -n10755394 virologist -n10755648 Visayan, Bisayan -n10756061 viscountess -n10756148 viscount -n10756261 Visigoth -n10756641 visionary -n10756837 visiting fireman -n10757050 visiting professor -n10757492 visualizer, visualiser -n10758337 vixen, harpy, hellcat -n10758445 vizier -n10758949 voicer -n10759151 volunteer, unpaid worker -n10759331 volunteer, military volunteer, voluntary -n10759982 votary -n10760199 votary -n10760622 vouchee -n10760951 vower -n10761190 voyager -n10761326 voyeur, Peeping Tom, peeper -n10761519 vulcanizer, vulcaniser -n10762212 waffler -n10762480 Wagnerian -n10763075 waif, street child -n10763245 wailer -n10763383 waiter, server -n10763620 waitress -n10764465 walking delegate -n10764622 walk-on -n10764719 wallah -n10765305 wally -n10765587 waltzer -n10765679 wanderer, roamer, rover, bird of passage -n10765885 Wandering Jew -n10766260 wanton -n10768148 warrantee -n10768272 warrantee -n10768903 washer -n10769084 washerman, laundryman -n10769188 washwoman, washerwoman, laundrywoman, laundress -n10769321 wassailer, carouser -n10769459 wastrel, waster -n10771066 Wave -n10772092 weatherman, weather forecaster -n10772580 weekend warrior -n10772937 weeder -n10773665 welder -n10773800 welfare case, charity case -n10774329 westerner -n10774756 West-sider -n10775003 wetter -n10775128 whaler -n10776052 Whig -n10776339 whiner, complainer, moaner, sniveller, crybaby, bellyacher, grumbler, squawker -n10776887 whipper-in -n10777299 whisperer -n10778044 whiteface -n10778148 Carmelite, White Friar -n10778711 Augustinian -n10778999 white hope, great white hope -n10779610 white supremacist -n10779897 whoremaster, whoremonger -n10779995 whoremaster, whoremonger, john, trick -n10780284 widow, widow woman -n10780632 wife, married woman -n10781236 wiggler, wriggler, squirmer -n10781817 wimp, chicken, crybaby -n10782362 wing commander -n10782471 winger -n10782791 winner -n10782940 winner, victor -n10783240 window dresser, window trimmer -n10783539 winker -n10783646 wiper -n10783734 wireman, wirer -n10784113 wise guy, smart aleck, wiseacre, wisenheimer, weisenheimer -n10784544 witch doctor -n10784922 withdrawer -n10785480 withdrawer -n10787470 woman, adult female -n10788852 woman -n10789415 wonder boy, golden boy -n10789709 wonderer -n10791115 working girl -n10791221 workman, workingman, working man, working person -n10791820 workmate -n10791890 worldling -n10792335 worshiper, worshipper -n10792506 worthy -n10792856 wrecker -n10793570 wright -n10793799 write-in candidate, write-in -n10794014 writer, author -n10801561 Wykehamist -n10801802 yakuza -n10802507 yard bird, yardbird -n10802621 yardie -n10802953 yardman -n10803031 yardmaster, trainmaster, train dispatcher -n10803282 yenta -n10803978 yogi -n10804287 young buck, young man -n10804636 young Turk -n10804732 Young Turk -n10805501 Zionist -n10806113 zoo keeper -n10994097 Genet, Edmund Charles Edouard Genet, Citizen Genet -n11100798 Kennan, George F. Kennan, George Frost Kennan -n11196627 Munro, H. H. Munro, Hector Hugh Munro, Saki -n11242849 Popper, Karl Popper, Sir Karl Raimund Popper -n11318824 Stoker, Bram Stoker, Abraham Stoker -n11346873 Townes, Charles Townes, Charles Hard Townes -n11448153 dust storm, duster, sandstorm, sirocco -n11487732 parhelion, mock sun, sundog -n11508382 snow, snowfall -n11511327 facula -n11524451 wave -n11530008 microflora -n11531193 wilding -n11531334 semi-climber -n11532682 volva -n11533212 basidiocarp -n11533999 domatium -n11536567 apomict -n11536673 aquatic -n11537327 bryophyte, nonvascular plant -n11539289 acrocarp, acrocarpous moss -n11542137 sphagnum, sphagnum moss, peat moss, bog moss -n11542640 liverwort, hepatic -n11544015 hepatica, Marchantia polymorpha -n11545350 pecopteris -n11545524 pteridophyte, nonflowering plant -n11545714 fern -n11547562 fern ally -n11547855 spore -n11548728 carpospore -n11548870 chlamydospore -n11549009 conidium, conidiospore -n11549245 oospore -n11549779 tetraspore -n11549895 zoospore -n11552133 cryptogam -n11552386 spermatophyte, phanerogam, seed plant -n11552594 seedling -n11552806 annual -n11552976 biennial -n11553240 perennial -n11553522 hygrophyte -n11596108 gymnosperm -n11597657 gnetum, Gnetum gnemon -n11598287 Catha edulis -n11598686 ephedra, joint fir -n11598886 mahuang, Ephedra sinica -n11599324 welwitschia, Welwitschia mirabilis -n11600372 cycad -n11601177 sago palm, Cycas revoluta -n11601333 false sago, fern palm, Cycas circinalis -n11601918 zamia -n11602091 coontie, Florida arrowroot, Seminole bread, Zamia pumila -n11602478 ceratozamia -n11602873 dioon -n11603246 encephalartos -n11603462 kaffir bread, Encephalartos caffer -n11603835 macrozamia -n11604046 burrawong, Macrozamia communis, Macrozamia spiralis -n11608250 pine, pine tree, true pine -n11609475 pinon, pinyon -n11609684 nut pine -n11609862 pinon pine, Mexican nut pine, Pinus cembroides -n11610047 Rocky mountain pinon, Pinus edulis -n11610215 single-leaf, single-leaf pine, single-leaf pinyon, Pinus monophylla -n11610437 bishop pine, bishop's pine, Pinus muricata -n11610602 California single-leaf pinyon, Pinus californiarum -n11610823 Parry's pinyon, Pinus quadrifolia, Pinus parryana -n11611087 spruce pine, Pinus glabra -n11611233 black pine, Pinus nigra -n11611356 pitch pine, northern pitch pine, Pinus rigida -n11611561 pond pine, Pinus serotina -n11611758 stone pine, umbrella pine, European nut pine, Pinus pinea -n11612018 Swiss pine, Swiss stone pine, arolla pine, cembra nut tree, Pinus cembra -n11612235 cembra nut, cedar nut -n11612349 Swiss mountain pine, mountain pine, dwarf mountain pine, mugho pine, mugo pine, Pinus mugo -n11612575 ancient pine, Pinus longaeva -n11612923 white pine -n11613219 American white pine, eastern white pine, weymouth pine, Pinus strobus -n11613459 western white pine, silver pine, mountain pine, Pinus monticola -n11613692 southwestern white pine, Pinus strobiformis -n11613867 limber pine, Pinus flexilis -n11614039 whitebark pine, whitebarked pine, Pinus albicaulis -n11614250 yellow pine -n11614420 ponderosa, ponderosa pine, western yellow pine, bull pine, Pinus ponderosa -n11614713 Jeffrey pine, Jeffrey's pine, black pine, Pinus jeffreyi -n11615026 shore pine, lodgepole, lodgepole pine, spruce pine, Pinus contorta -n11615259 Sierra lodgepole pine, Pinus contorta murrayana -n11615387 loblolly pine, frankincense pine, Pinus taeda -n11615607 jack pine, Pinus banksiana -n11615812 swamp pine -n11615967 longleaf pine, pitch pine, southern yellow pine, Georgia pine, Pinus palustris -n11616260 shortleaf pine, short-leaf pine, shortleaf yellow pine, Pinus echinata -n11616486 red pine, Canadian red pine, Pinus resinosa -n11616662 Scotch pine, Scots pine, Scotch fir, Pinus sylvestris -n11616852 scrub pine, Virginia pine, Jersey pine, Pinus virginiana -n11617090 Monterey pine, Pinus radiata -n11617272 bristlecone pine, Rocky Mountain bristlecone pine, Pinus aristata -n11617631 table-mountain pine, prickly pine, hickory pine, Pinus pungens -n11617878 knobcone pine, Pinus attenuata -n11618079 Japanese red pine, Japanese table pine, Pinus densiflora -n11618290 Japanese black pine, black pine, Pinus thunbergii -n11618525 Torrey pine, Torrey's pine, soledad pine, grey-leaf pine, sabine pine, Pinus torreyana -n11618861 larch, larch tree -n11619227 American larch, tamarack, black larch, Larix laricina -n11619455 western larch, western tamarack, Oregon larch, Larix occidentalis -n11619687 subalpine larch, Larix lyallii -n11619845 European larch, Larix decidua -n11620016 Siberian larch, Larix siberica, Larix russica -n11620389 golden larch, Pseudolarix amabilis -n11620673 fir, fir tree, true fir -n11621029 silver fir -n11621281 amabilis fir, white fir, Pacific silver fir, red silver fir, Christmas tree, Abies amabilis -n11621547 European silver fir, Christmas tree, Abies alba -n11621727 white fir, Colorado fir, California white fir, Abies concolor, Abies lowiana -n11621950 balsam fir, balm of Gilead, Canada balsam, Abies balsamea -n11622184 Fraser fir, Abies fraseri -n11622368 lowland fir, lowland white fir, giant fir, grand fir, Abies grandis -n11622591 Alpine fir, subalpine fir, Abies lasiocarpa -n11622771 Santa Lucia fir, bristlecone fir, Abies bracteata, Abies venusta -n11623105 cedar, cedar tree, true cedar -n11623815 cedar of Lebanon, Cedrus libani -n11623967 deodar, deodar cedar, Himalayan cedar, Cedrus deodara -n11624192 Atlas cedar, Cedrus atlantica -n11624531 spruce -n11625003 Norway spruce, Picea abies -n11625223 weeping spruce, Brewer's spruce, Picea breweriana -n11625391 Engelmann spruce, Engelmann's spruce, Picea engelmannii -n11625632 white spruce, Picea glauca -n11625804 black spruce, Picea mariana, spruce pine -n11626010 Siberian spruce, Picea obovata -n11626152 Sitka spruce, Picea sitchensis -n11626409 oriental spruce, Picea orientalis -n11626585 Colorado spruce, Colorado blue spruce, silver spruce, Picea pungens -n11626826 red spruce, eastern spruce, yellow spruce, Picea rubens -n11627168 hemlock, hemlock tree -n11627512 eastern hemlock, Canadian hemlock, spruce pine, Tsuga canadensis -n11627714 Carolina hemlock, Tsuga caroliniana -n11627908 mountain hemlock, black hemlock, Tsuga mertensiana -n11628087 western hemlock, Pacific hemlock, west coast hemlock, Tsuga heterophylla -n11628456 douglas fir -n11628793 green douglas fir, douglas spruce, douglas pine, douglas hemlock, Oregon fir, Oregon pine, Pseudotsuga menziesii -n11629047 big-cone spruce, big-cone douglas fir, Pseudotsuga macrocarpa -n11629354 Cathaya -n11630017 cedar, cedar tree -n11630489 cypress, cypress tree -n11631159 gowen cypress, Cupressus goveniana -n11631405 pygmy cypress, Cupressus pigmaea, Cupressus goveniana pigmaea -n11631619 Santa Cruz cypress, Cupressus abramsiana, Cupressus goveniana abramsiana -n11631854 Arizona cypress, Cupressus arizonica -n11631985 Guadalupe cypress, Cupressus guadalupensis -n11632167 Monterey cypress, Cupressus macrocarpa -n11632376 Mexican cypress, cedar of Goa, Portuguese cypress, Cupressus lusitanica -n11632619 Italian cypress, Mediterranean cypress, Cupressus sempervirens -n11632929 King William pine, Athrotaxis selaginoides -n11633284 Chilean cedar, Austrocedrus chilensis -n11634736 incense cedar, red cedar, Calocedrus decurrens, Libocedrus decurrens -n11635152 southern white cedar, coast white cedar, Atlantic white cedar, white cypress, white cedar, Chamaecyparis thyoides -n11635433 Oregon cedar, Port Orford cedar, Lawson's cypress, Lawson's cedar, Chamaecyparis lawsoniana -n11635830 yellow cypress, yellow cedar, Nootka cypress, Alaska cedar, Chamaecyparis nootkatensis -n11636204 Japanese cedar, Japan cedar, sugi, Cryptomeria japonica -n11636835 juniper berry -n11639084 incense cedar -n11639306 kawaka, Libocedrus plumosa -n11639445 pahautea, Libocedrus bidwillii, mountain pine -n11640132 metasequoia, dawn redwood, Metasequoia glyptostrodoides -n11643835 arborvitae -n11644046 western red cedar, red cedar, canoe cedar, Thuja plicata -n11644226 American arborvitae, northern white cedar, white cedar, Thuja occidentalis -n11644462 Oriental arborvitae, Thuja orientalis, Platycladus orientalis -n11644872 hiba arborvitae, Thujopsis dolobrata -n11645163 keteleeria -n11645590 Wollemi pine -n11645914 araucaria -n11646167 monkey puzzle, chile pine, Araucaria araucana -n11646344 norfolk island pine, Araucaria heterophylla, Araucaria excelsa -n11646517 new caledonian pine, Araucaria columnaris -n11646694 bunya bunya, bunya bunya tree, Araucaria bidwillii -n11646955 hoop pine, Moreton Bay pine, Araucaria cunninghamii -n11647306 kauri pine, dammar pine -n11647703 kauri, kaury, Agathis australis -n11647868 amboina pine, amboyna pine, Agathis dammara, Agathis alba -n11648039 dundathu pine, queensland kauri, smooth bark kauri, Agathis robusta -n11648268 red kauri, Agathis lanceolata -n11648776 plum-yew -n11649150 California nutmeg, nutmeg-yew, Torreya californica -n11649359 stinking cedar, stinking yew, Torrey tree, Torreya taxifolia -n11649878 celery pine -n11650160 celery top pine, celery-topped pine, Phyllocladus asplenifolius -n11650307 tanekaha, Phyllocladus trichomanoides -n11650430 Alpine celery pine, Phyllocladus alpinus -n11650558 yellowwood, yellowwood tree -n11650759 gymnospermous yellowwood -n11652039 podocarp -n11652217 yacca, yacca podocarp, Podocarpus coriaceus -n11652376 brown pine, Rockingham podocarp, Podocarpus elatus -n11652578 cape yellowwood, African yellowwood, Podocarpus elongatus -n11652753 South-African yellowwood, Podocarpus latifolius -n11652966 alpine totara, Podocarpus nivalis -n11653126 totara, Podocarpus totara -n11653570 common yellowwood, bastard yellowwood, Afrocarpus falcata -n11653904 kahikatea, New Zealand Dacryberry, New Zealand white pine, Dacrycarpus dacrydioides, Podocarpus dacrydioides -n11654293 rimu, imou pine, red pine, Dacrydium cupressinum -n11654438 tarwood, tar-wood, Dacrydium colensoi -n11654984 common sickle pine, Falcatifolium falciforme -n11655152 yellow-leaf sickle pine, Falcatifolium taxoides -n11655592 tarwood, tar-wood, New Zealand mountain pine, Halocarpus bidwilli, Dacrydium bidwilli -n11655974 westland pine, silver pine, Lagarostrobus colensoi -n11656123 huon pine, Lagarostrobus franklinii, Dacrydium franklinii -n11656549 Chilean rimu, Lepidothamnus fonkii -n11656771 mountain rimu, Lepidothamnus laxifolius, Dacridium laxifolius -n11657585 nagi, Nageia nagi -n11658331 miro, black pine, Prumnopitys ferruginea, Podocarpus ferruginea -n11658544 matai, black pine, Prumnopitys taxifolia, Podocarpus spicata -n11658709 plum-fruited yew, Prumnopitys andina, Prumnopitys elegans -n11659248 Prince Albert yew, Prince Albert's yew, Saxe-gothea conspicua -n11659627 Sundacarpus amara, Prumnopitys amara, Podocarpus amara -n11660300 Japanese umbrella pine, Sciadopitys verticillata -n11661372 yew -n11661909 Old World yew, English yew, Taxus baccata -n11662128 Pacific yew, California yew, western yew, Taxus brevifolia -n11662371 Japanese yew, Taxus cuspidata -n11662585 Florida yew, Taxus floridana -n11662937 New Caledonian yew, Austrotaxus spicata -n11663263 white-berry yew, Pseudotaxus chienii -n11664418 ginkgo, gingko, maidenhair tree, Ginkgo biloba -n11665372 angiosperm, flowering plant -n11666854 dicot, dicotyledon, magnoliopsid, exogen -n11668117 monocot, monocotyledon, liliopsid, endogen -n11669786 floret, floweret -n11669921 flower -n11672269 bloomer -n11672400 wildflower, wild flower -n11674019 apetalous flower -n11674332 inflorescence -n11675025 rosebud -n11675404 gynostegium -n11675738 pollinium -n11676500 pistil -n11676743 gynobase -n11676850 gynophore -n11677485 stylopodium -n11677902 carpophore -n11678010 cornstalk, corn stalk -n11678299 petiolule -n11678377 mericarp -n11679378 micropyle -n11680457 germ tube -n11680596 pollen tube -n11682659 gemma -n11683216 galbulus -n11683838 nectary, honey gland -n11684264 pericarp, seed vessel -n11684499 epicarp, exocarp -n11684654 mesocarp -n11685091 pip -n11685621 silique, siliqua -n11686195 cataphyll -n11686652 perisperm -n11686780 monocarp, monocarpic plant, monocarpous plant -n11686912 sporophyte -n11687071 gametophyte -n11687432 megasporangium, macrosporangium -n11687789 microspore -n11687964 microsporangium -n11688069 microsporophyll -n11688378 archespore, archesporium -n11689197 bonduc nut, nicker nut, nicker seed -n11689367 Job's tears -n11689483 oilseed, oil-rich seed -n11689678 castor bean -n11689815 cottonseed -n11689957 candlenut -n11690088 peach pit -n11690254 hypanthium, floral cup, calyx tube -n11690455 petal, flower petal -n11691046 corolla -n11691857 lip -n11692265 perianth, chlamys, floral envelope, perigone, perigonium -n11692792 thistledown -n11693981 custard apple, custard apple tree -n11694300 cherimoya, cherimoya tree, Annona cherimola -n11694469 ilama, ilama tree, Annona diversifolia -n11694664 soursop, prickly custard apple, soursop tree, Annona muricata -n11694866 bullock's heart, bullock's heart tree, bullock heart, Annona reticulata -n11695085 sweetsop, sweetsop tree, Annona squamosa -n11695285 pond apple, pond-apple tree, Annona glabra -n11695599 pawpaw, papaw, papaw tree, Asimina triloba -n11695974 ilang-ilang, ylang-ylang, Cananga odorata -n11696450 lancewood, lancewood tree, Oxandra lanceolata -n11696935 Guinea pepper, negro pepper, Xylopia aethiopica -n11697560 barberry -n11697802 American barberry, Berberis canadensis -n11698042 common barberry, European barberry, Berberis vulgaris -n11698245 Japanese barberry, Berberis thunbergii -n11699442 Oregon grape, Oregon holly grape, hollygrape, mountain grape, holly-leaves barberry, Mahonia aquifolium -n11699751 Oregon grape, Mahonia nervosa -n11700058 mayapple, May apple, wild mandrake, Podophyllum peltatum -n11700279 May apple -n11700864 allspice -n11701066 Carolina allspice, strawberry shrub, strawberry bush, sweet shrub, Calycanthus floridus -n11701302 spicebush, California allspice, Calycanthus occidentalis -n11702713 katsura tree, Cercidiphyllum japonicum -n11703669 laurel -n11704093 true laurel, bay, bay laurel, bay tree, Laurus nobilis -n11704620 camphor tree, Cinnamomum camphora -n11704791 cinnamon, Ceylon cinnamon, Ceylon cinnamon tree, Cinnamomum zeylanicum -n11705171 cassia, cassia-bark tree, Cinnamomum cassia -n11705387 cassia bark, Chinese cinnamon -n11705573 Saigon cinnamon, Cinnamomum loureirii -n11705776 cinnamon bark -n11706325 spicebush, spice bush, American spicebush, Benjamin bush, Lindera benzoin, Benzoin odoriferum -n11706761 avocado, avocado tree, Persea Americana -n11706942 laurel-tree, red bay, Persea borbonia -n11707229 sassafras, sassafras tree, Sassafras albidum -n11707827 California laurel, California bay tree, Oregon myrtle, pepperwood, spice tree, sassafras laurel, California olive, mountain laurel, Umbellularia californica -n11708658 anise tree -n11708857 purple anise, Illicium floridanum -n11709045 star anise, Illicium anisatum -n11709205 star anise, Chinese anise, Illicium verum -n11709674 magnolia -n11710136 southern magnolia, evergreen magnolia, large-flowering magnolia, bull bay, Magnolia grandiflora -n11710393 umbrella tree, umbrella magnolia, elkwood, elk-wood, Magnolia tripetala -n11710658 earleaved umbrella tree, Magnolia fraseri -n11710827 cucumber tree, Magnolia acuminata -n11710987 large-leaved magnolia, large-leaved cucumber tree, great-leaved macrophylla, Magnolia macrophylla -n11711289 saucer magnolia, Chinese magnolia, Magnolia soulangiana -n11711537 star magnolia, Magnolia stellata -n11711764 sweet bay, swamp bay, swamp laurel, Magnolia virginiana -n11711971 manglietia, genus Manglietia -n11712282 tulip tree, tulip poplar, yellow poplar, canary whitewood, Liriodendron tulipifera -n11713164 moonseed -n11713370 common moonseed, Canada moonseed, yellow parilla, Menispermum canadense -n11713763 Carolina moonseed, Cocculus carolinus -n11714382 nutmeg, nutmeg tree, Myristica fragrans -n11715430 water nymph, fragrant water lily, pond lily, Nymphaea odorata -n11715678 European white lily, Nymphaea alba -n11716698 southern spatterdock, Nuphar sagittifolium -n11717399 lotus, Indian lotus, sacred lotus, Nelumbo nucifera -n11717577 water chinquapin, American lotus, yanquapin, Nelumbo lutea -n11718296 water-shield, fanwort, Cabomba caroliniana -n11718681 water-shield, Brasenia schreberi, water-target -n11719286 peony, paeony -n11720353 buttercup, butterflower, butter-flower, crowfoot, goldcup, kingcup -n11720643 meadow buttercup, tall buttercup, tall crowfoot, tall field buttercup, Ranunculus acris -n11720891 water crowfoot, water buttercup, Ranunculus aquatilis -n11721337 lesser celandine, pilewort, Ranunculus ficaria -n11721642 lesser spearwort, Ranunculus flammula -n11722036 greater spearwort, Ranunculus lingua -n11722342 western buttercup, Ranunculus occidentalis -n11722466 creeping buttercup, creeping crowfoot, Ranunculus repens -n11722621 cursed crowfoot, celery-leaved buttercup, Ranunculus sceleratus -n11722982 aconite -n11723227 monkshood, helmetflower, helmet flower, Aconitum napellus -n11723452 wolfsbane, wolfbane, wolf's bane, Aconitum lycoctonum -n11723770 baneberry, cohosh, herb Christopher -n11723986 baneberry -n11724109 red baneberry, redberry, red-berry, snakeberry, Actaea rubra -n11724660 pheasant's-eye, Adonis annua -n11725015 anemone, windflower -n11725311 Alpine anemone, mountain anemone, Anemone tetonensis -n11725480 Canada anemone, Anemone Canadensis -n11725623 thimbleweed, Anemone cylindrica -n11725821 wood anemone, Anemone nemorosa -n11725973 wood anemone, snowdrop, Anemone quinquefolia -n11726145 longheaded thimbleweed, Anemone riparia -n11726269 snowdrop anemone, snowdrop windflower, Anemone sylvestris -n11726433 Virginia thimbleweed, Anemone virginiana -n11726707 rue anemone, Anemonella thalictroides -n11727091 columbine, aquilegia, aquilege -n11727358 meeting house, honeysuckle, Aquilegia canadensis -n11727540 blue columbine, Aquilegia caerulea, Aquilegia scopulorum calcarea -n11727738 granny's bonnets, Aquilegia vulgaris -n11728099 marsh marigold, kingcup, meadow bright, May blob, cowslip, water dragon, Caltha palustris -n11728769 American bugbane, summer cohosh, Cimicifuga americana -n11728945 black cohosh, black snakeroot, rattle-top, Cimicifuga racemosa -n11729142 fetid bugbane, foetid bugbane, Cimicifuga foetida -n11729478 clematis -n11729860 pine hyacinth, Clematis baldwinii, Viorna baldwinii -n11730015 blue jasmine, blue jessamine, curly clematis, marsh clematis, Clematis crispa -n11730458 golden clematis, Clematis tangutica -n11730602 scarlet clematis, Clematis texensis -n11730750 leather flower, Clematis versicolor -n11730933 leather flower, vase-fine, vase vine, Clematis viorna -n11731157 virgin's bower, old man's beard, devil's darning needle, Clematis virginiana -n11731659 purple clematis, purple virgin's bower, mountain clematis, Clematis verticillaris -n11732052 goldthread, golden thread, Coptis groenlandica, Coptis trifolia groenlandica -n11732567 rocket larkspur, Consolida ambigua, Delphinium ajacis -n11733054 delphinium -n11733312 larkspur -n11733548 winter aconite, Eranthis hyemalis -n11734493 lenten rose, black hellebore, Helleborus orientalis -n11734698 green hellebore, Helleborus viridis -n11735053 hepatica, liverleaf -n11735570 goldenseal, golden seal, yellow root, turmeric root, Hydrastis Canadensis -n11735977 false rue anemone, false rue, Isopyrum biternatum -n11736362 giant buttercup, Laccopetalum giganteum -n11736694 nigella -n11736851 love-in-a-mist, Nigella damascena -n11737009 fennel flower, Nigella hispanica -n11737125 black caraway, nutmeg flower, Roman coriander, Nigella sativa -n11737534 pasqueflower, pasque flower -n11738547 meadow rue -n11738997 false bugbane, Trautvetteria carolinensis -n11739365 globeflower, globe flower -n11739978 winter's bark, winter's bark tree, Drimys winteri -n11740414 pepper shrub, Pseudowintera colorata, Wintera colorata -n11741175 sweet gale, Scotch gale, Myrica gale -n11741350 wax myrtle -n11741575 bay myrtle, puckerbush, Myrica cerifera -n11741797 bayberry, candleberry, swamp candleberry, waxberry, Myrica pensylvanica -n11742310 sweet fern, Comptonia peregrina, Comptonia asplenifolia -n11742878 corkwood, corkwood tree, Leitneria floridana -n11744011 jointed rush, Juncus articulatus -n11744108 toad rush, Juncus bufonius -n11744471 slender rush, Juncus tenuis -n11745817 zebrawood, zebrawood tree -n11746600 Connarus guianensis -n11747468 legume, leguminous plant -n11748002 legume -n11748811 peanut -n11749112 granadilla tree, granadillo, Brya ebenus -n11749603 arariba, Centrolobium robustum -n11750173 tonka bean, coumara nut -n11750508 courbaril, Hymenaea courbaril -n11750989 melilotus, melilot, sweet clover -n11751765 darling pea, poison bush -n11751974 smooth darling pea, Swainsona galegifolia -n11752578 clover, trefoil -n11752798 alpine clover, Trifolium alpinum -n11752937 hop clover, shamrock, lesser yellow trefoil, Trifolium dubium -n11753143 crimson clover, Italian clover, Trifolium incarnatum -n11753355 red clover, purple clover, Trifolium pratense -n11753562 buffalo clover, Trifolium reflexum, Trifolium stoloniferum -n11753700 white clover, dutch clover, shamrock, Trifolium repens -n11754893 mimosa -n11756092 acacia -n11756329 shittah, shittah tree -n11756669 wattle -n11756870 black wattle, Acacia auriculiformis -n11757017 gidgee, stinking wattle, Acacia cambegei -n11757190 catechu, Jerusalem thorn, Acacia catechu -n11757653 silver wattle, mimosa, Acacia dealbata -n11757851 huisache, cassie, mimosa bush, sweet wattle, sweet acacia, scented wattle, flame tree, Acacia farnesiana -n11758122 lightwood, Acacia melanoxylon -n11758276 golden wattle, Acacia pycnantha -n11758483 fever tree, Acacia xanthophloea -n11758799 coralwood, coral-wood, red sandalwood, Barbados pride, peacock flower fence, Adenanthera pavonina -n11759224 albizzia, albizia -n11759404 silk tree, Albizia julibrissin, Albizzia julibrissin -n11759609 siris, siris tree, Albizia lebbeck, Albizzia lebbeck -n11759853 rain tree, saman, monkeypod, monkey pod, zaman, zamang, Albizia saman -n11760785 calliandra -n11761202 conacaste, elephant's ear, Enterolobium cyclocarpa -n11761650 inga -n11761836 ice-cream bean, Inga edulis -n11762018 guama, Inga laurina -n11762433 lead tree, white popinac, Leucaena glauca, Leucaena leucocephala -n11762927 wild tamarind, Lysiloma latisiliqua, Lysiloma bahamensis -n11763142 sabicu, Lysiloma sabicu -n11763625 nitta tree -n11763874 Parkia javanica -n11764478 manila tamarind, camachile, huamachil, wild tamarind, Pithecellobium dulce -n11764814 cat's-claw, catclaw, black bead, Pithecellodium unguis-cati -n11765568 honey mesquite, Western honey mesquite, Prosopis glandulosa -n11766046 algarroba, algarrobilla, algarobilla -n11766189 screw bean, screwbean, tornillo, screwbean mesquite, Prosopis pubescens -n11766432 screw bean -n11767354 dogbane -n11767877 Indian hemp, rheumatism weed, Apocynum cannabinum -n11768816 bushman's poison, ordeal tree, Acocanthera oppositifolia, Acocanthera venenata -n11769176 impala lily, mock azalia, desert rose, kudu lily, Adenium obesum, Adenium multiflorum -n11769621 allamanda -n11769803 common allamanda, golden trumpet, Allamanda cathartica -n11770256 dita, dita bark, devil tree, Alstonia scholaris -n11771147 Nepal trumpet flower, Easter lily vine, Beaumontia grandiflora -n11771539 carissa -n11771746 hedge thorn, natal plum, Carissa bispinosa -n11771924 natal plum, amatungulu, Carissa macrocarpa, Carissa grandiflora -n11772408 periwinkle, rose periwinkle, Madagascar periwinkle, old maid, Cape periwinkle, red periwinkle, cayenne jasmine, Catharanthus roseus, Vinca rosea -n11772879 ivory tree, conessi, kurchi, kurchee, Holarrhena pubescens, Holarrhena antidysenterica -n11773408 white dipladenia, Mandevilla boliviensis, Dipladenia boliviensis -n11773628 Chilean jasmine, Mandevilla laxa -n11773987 oleander, rose bay, Nerium oleander -n11774513 frangipani, frangipanni -n11774972 West Indian jasmine, pagoda tree, Plumeria alba -n11775340 rauwolfia, rauvolfia -n11775626 snakewood, Rauwolfia serpentina -n11776234 Strophanthus kombe -n11777080 yellow oleander, Thevetia peruviana, Thevetia neriifolia -n11778092 myrtle, Vinca minor -n11778257 large periwinkle, Vinca major -n11779300 arum, aroid -n11780148 cuckoopint, lords-and-ladies, jack-in-the-pulpit, Arum maculatum -n11780424 black calla, Arum palaestinum -n11781176 calamus -n11782036 alocasia, elephant's ear, elephant ear -n11782266 giant taro, Alocasia macrorrhiza -n11782761 amorphophallus -n11782878 pungapung, telingo potato, elephant yam, Amorphophallus paeonifolius, Amorphophallus campanulatus -n11783162 devil's tongue, snake palm, umbrella arum, Amorphophallus rivieri -n11783920 anthurium, tailflower, tail-flower -n11784126 flamingo flower, flamingo plant, Anthurium andraeanum, Anthurium scherzerianum -n11784497 jack-in-the-pulpit, Indian turnip, wake-robin, Arisaema triphyllum, Arisaema atrorubens -n11785276 friar's-cowl, Arisarum vulgare -n11785668 caladium -n11785875 Caladium bicolor -n11786131 wild calla, water arum, Calla palustris -n11786539 taro, taro plant, dalo, dasheen, Colocasia esculenta -n11786843 taro, cocoyam, dasheen, eddo -n11787190 cryptocoryne, water trumpet -n11788039 dracontium -n11788727 golden pothos, pothos, ivy arum, Epipremnum aureum, Scindapsus aureus -n11789066 skunk cabbage, Lysichiton americanum -n11789438 monstera -n11789589 ceriman, Monstera deliciosa -n11789962 nephthytis -n11790089 Nephthytis afzelii -n11790788 arrow arum -n11790936 green arrow arum, tuckahoe, Peltandra virginica -n11791341 philodendron -n11791569 pistia, water lettuce, water cabbage, Pistia stratiotes, Pistia stratoites -n11792029 pothos -n11792341 spathiphyllum, peace lily, spathe flower -n11792742 skunk cabbage, polecat weed, foetid pothos, Symplocarpus foetidus -n11793403 yautia, tannia, spoonflower, malanga, Xanthosoma sagittifolium, Xanthosoma atrovirens -n11793779 calla lily, calla, arum lily, Zantedeschia aethiopica -n11794024 pink calla, Zantedeschia rehmanii -n11794139 golden calla -n11794519 duckweed -n11795049 common duckweed, lesser duckweed, Lemna minor -n11795216 star-duckweed, Lemna trisulca -n11795580 great duckweed, water flaxseed, Spirodela polyrrhiza -n11796005 watermeal -n11796188 common wolffia, Wolffia columbiana -n11797321 aralia -n11797508 American angelica tree, devil's walking stick, Hercules'-club, Aralia spinosa -n11797981 American spikenard, petty morel, life-of-man, Aralia racemosa -n11798270 bristly sarsaparilla, bristly sarsparilla, dwarf elder, Aralia hispida -n11798496 Japanese angelica tree, Aralia elata -n11798688 Chinese angelica, Chinese angelica tree, Aralia stipulata -n11798978 ivy, common ivy, English ivy, Hedera helix -n11799331 puka, Meryta sinclairii -n11799732 ginseng, nin-sin, Panax ginseng, Panax schinseng, Panax pseudoginseng -n11800236 ginseng -n11800565 umbrella tree, Schefflera actinophylla, Brassaia actinophylla -n11801392 birthwort, Aristolochia clematitis -n11801665 Dutchman's-pipe, pipe vine, Aristolochia macrophylla, Aristolochia durior -n11801891 Virginia snakeroot, Virginia serpentaria, Virginia serpentary, Aristolochia serpentaria -n11802410 Canada ginger, black snakeroot, Asarum canadense -n11802586 heartleaf, heart-leaf, Asarum virginicum -n11802800 heartleaf, heart-leaf, Asarum shuttleworthii -n11802995 asarabacca, Asarum europaeum -n11805255 caryophyllaceous plant -n11805544 corn cockle, corn campion, crown-of-the-field, Agrostemma githago -n11805956 sandwort -n11806219 mountain sandwort, mountain starwort, mountain daisy, Arenaria groenlandica -n11806369 pine-barren sandwort, longroot, Arenaria caroliniana -n11806521 seabeach sandwort, Arenaria peploides -n11806679 rock sandwort, Arenaria stricta -n11806814 thyme-leaved sandwort, Arenaria serpyllifolia -n11807108 mouse-ear chickweed, mouse eared chickweed, mouse ear, clammy chickweed, chickweed -n11807525 snow-in-summer, love-in-a-mist, Cerastium tomentosum -n11807696 Alpine mouse-ear, Arctic mouse-ear, Cerastium alpinum -n11807979 pink, garden pink -n11808299 sweet William, Dianthus barbatus -n11808468 carnation, clove pink, gillyflower, Dianthus caryophyllus -n11808721 china pink, rainbow pink, Dianthus chinensis -n11808932 Japanese pink, Dianthus chinensis heddewigii -n11809094 maiden pink, Dianthus deltoides -n11809271 cheddar pink, Diangus gratianopolitanus -n11809437 button pink, Dianthus latifolius -n11809594 cottage pink, grass pink, Dianthus plumarius -n11809754 fringed pink, Dianthus supurbus -n11810030 drypis -n11810358 baby's breath, babies'-breath, Gypsophila paniculata -n11811059 coral necklace, Illecebrum verticullatum -n11811473 lychnis, catchfly -n11811706 ragged robin, cuckoo flower, Lychnis flos-cuculi, Lychins floscuculi -n11811921 scarlet lychnis, maltese cross, Lychins chalcedonica -n11812094 mullein pink, rose campion, gardener's delight, dusty miller, Lychnis coronaria -n11812910 sandwort, Moehringia lateriflora -n11813077 sandwort, Moehringia mucosa -n11814584 soapwort, hedge pink, bouncing Bet, bouncing Bess, Saponaria officinalis -n11814996 knawel, knawe, Scleranthus annuus -n11815491 silene, campion, catchfly -n11815721 moss campion, Silene acaulis -n11815918 wild pink, Silene caroliniana -n11816121 red campion, red bird's eye, Silene dioica, Lychnis dioica -n11816336 white campion, evening lychnis, white cockle, bladder campion, Silene latifolia, Lychnis alba -n11816649 fire pink, Silene virginica -n11816829 bladder campion, Silene uniflora, Silene vulgaris -n11817160 corn spurry, corn spurrey, Spergula arvensis -n11817501 sand spurry, sea spurry, Spergularia rubra -n11817914 chickweed -n11818069 common chickweed, Stellaria media -n11818636 cowherb, cow cockle, Vaccaria hispanica, Vaccaria pyramidata, Saponaria vaccaria -n11819509 Hottentot fig, Hottentot's fig, sour fig, Carpobrotus edulis, Mesembryanthemum edule -n11819912 livingstone daisy, Dorotheanthus bellidiformis -n11820965 fig marigold, pebble plant -n11821184 ice plant, icicle plant, Mesembryanthemum crystallinum -n11822300 New Zealand spinach, Tetragonia tetragonioides, Tetragonia expansa -n11823043 amaranth -n11823305 amaranth -n11823436 tumbleweed, Amaranthus albus, Amaranthus graecizans -n11823756 prince's-feather, gentleman's-cane, prince's-plume, red amaranth, purple amaranth, Amaranthus cruentus, Amaranthus hybridus hypochondriacus, Amaranthus hybridus erythrostachys -n11824146 pigweed, Amaranthus hypochondriacus -n11824344 thorny amaranth, Amaranthus spinosus -n11824747 alligator weed, alligator grass, Alternanthera philoxeroides -n11825351 cockscomb, common cockscomb, Celosia cristata, Celosia argentea cristata -n11825749 cottonweed -n11826198 globe amaranth, bachelor's button, Gomphrena globosa -n11826569 bloodleaf -n11827541 saltwort, Batis maritima -n11828577 lamb's-quarters, pigweed, wild spinach, Chenopodium album -n11828973 good-king-henry, allgood, fat hen, wild spinach, Chenopodium bonus-henricus -n11829205 Jerusalem oak, feather geranium, Mexican tea, Chenopodium botrys, Atriplex mexicana -n11829672 oak-leaved goosefoot, oakleaf goosefoot, Chenopodium glaucum -n11829922 sowbane, red goosefoot, Chenopodium hybridum -n11830045 nettle-leaved goosefoot, nettleleaf goosefoot, Chenopodium murale -n11830252 red goosefoot, French spinach, Chenopodium rubrum -n11830400 stinking goosefoot, Chenopodium vulvaria -n11830714 orach, orache -n11830906 saltbush -n11831100 garden orache, mountain spinach, Atriplex hortensis -n11831297 desert holly, Atriplex hymenelytra -n11831521 quail bush, quail brush, white thistle, Atriplex lentiformis -n11832214 beet, common beet, Beta vulgaris -n11832480 beetroot, Beta vulgaris rubra -n11832671 chard, Swiss chard, spinach beet, leaf beet, chard plant, Beta vulgaris cicla -n11832899 mangel-wurzel, mangold-wurzel, mangold, Beta vulgaris vulgaris -n11833373 winged pigweed, tumbleweed, Cycloloma atriplicifolium -n11833749 halogeton, Halogeton glomeratus -n11834272 glasswort, samphire, Salicornia europaea -n11834654 saltwort, barilla, glasswort, kali, kelpwort, Salsola kali, Salsola soda -n11834890 Russian thistle, Russian tumbleweed, Russian cactus, tumbleweed, Salsola kali tenuifolia -n11835251 greasewood, black greasewood, Sarcobatus vermiculatus -n11836327 scarlet musk flower, Nyctaginia capitata -n11836722 sand verbena -n11837204 sweet sand verbena, Abronia fragrans -n11837351 yellow sand verbena, Abronia latifolia -n11837562 beach pancake, Abronia maritima -n11837743 beach sand verbena, pink sand verbena, Abronia umbellata -n11837970 desert sand verbena, Abronia villosa -n11838413 trailing four o'clock, trailing windmills, Allionia incarnata -n11838916 bougainvillea -n11839460 umbrellawort -n11839568 four o'clock -n11839823 common four-o'clock, marvel-of-Peru, Mirabilis jalapa, Mirabilis uniflora -n11840067 California four o'clock, Mirabilis laevis, Mirabilis californica -n11840246 sweet four o'clock, maravilla, Mirabilis longiflora -n11840476 desert four o'clock, Colorado four o'clock, maravilla, Mirabilis multiflora -n11840764 mountain four o'clock, Mirabilis oblongifolia -n11841247 cockspur, Pisonia aculeata -n11843441 rattail cactus, rat's-tail cactus, Aporocactus flagelliformis -n11844371 saguaro, sahuaro, Carnegiea gigantea -n11844892 night-blooming cereus -n11845557 echinocactus, barrel cactus -n11845793 hedgehog cactus -n11845913 golden barrel cactus, Echinocactus grusonii -n11846312 hedgehog cereus -n11846425 rainbow cactus -n11846765 epiphyllum, orchid cactus -n11847169 barrel cactus -n11848479 night-blooming cereus -n11848867 chichipe, Lemaireocereus chichipe -n11849271 mescal, mezcal, peyote, Lophophora williamsii -n11849467 mescal button, sacred mushroom, magic mushroom -n11849871 mammillaria -n11849983 feather ball, Mammillaria plumosa -n11850521 garambulla, garambulla cactus, Myrtillocactus geometrizans -n11850918 Knowlton's cactus, Pediocactus knowltonii -n11851258 nopal -n11851578 prickly pear, prickly pear cactus -n11851839 cholla, Opuntia cholla -n11852028 nopal, Opuntia lindheimeri -n11852148 tuna, Opuntia tuna -n11852531 Barbados gooseberry, Barbados-gooseberry vine, Pereskia aculeata -n11853079 mistletoe cactus -n11853356 Christmas cactus, Schlumbergera buckleyi, Schlumbergera baridgesii -n11853813 night-blooming cereus -n11854479 crab cactus, Thanksgiving cactus, Zygocactus truncatus, Schlumbergera truncatus -n11855274 pokeweed -n11855435 Indian poke, Phytolacca acinosa -n11855553 poke, pigeon berry, garget, scoke, Phytolacca americana -n11855842 ombu, bella sombra, Phytolacca dioica -n11856573 bloodberry, blood berry, rougeberry, rouge plant, Rivina humilis -n11857696 portulaca -n11857875 rose moss, sun plant, Portulaca grandiflora -n11858077 common purslane, pussley, pussly, verdolagas, Portulaca oleracea -n11858703 rock purslane -n11858814 red maids, redmaids, Calandrinia ciliata -n11859275 Carolina spring beauty, Claytonia caroliniana -n11859472 spring beauty, Clatonia lanceolata -n11859737 Virginia spring beauty, Claytonia virginica -n11860208 siskiyou lewisia, Lewisia cotyledon -n11860555 bitterroot, Lewisia rediviva -n11861238 broad-leaved montia, Montia cordifolia -n11861487 blinks, blinking chickweed, water chickweed, Montia lamprosperma -n11861641 toad lily, Montia chamissoi -n11861853 winter purslane, miner's lettuce, Cuban spinach, Montia perfoliata -n11862835 flame flower, flame-flower, flameflower, Talinum aurantiacum -n11863467 pigmy talinum, Talinum brevifolium -n11863877 jewels-of-opar, Talinum paniculatum -n11865071 caper -n11865276 native pomegranate, Capparis arborea -n11865429 caper tree, Jamaica caper tree, Capparis cynophallophora -n11865574 caper tree, bay-leaved caper, Capparis flexuosa -n11865874 common caper, Capparis spinosa -n11866248 spiderflower, cleome -n11866706 Rocky Mountain bee plant, stinking clover, Cleome serrulata -n11867311 clammyweed, Polanisia graveolens, Polanisia dodecandra -n11868814 crucifer, cruciferous plant -n11869351 cress, cress plant -n11869689 watercress -n11870044 stonecress, stone cress -n11870418 garlic mustard, hedge garlic, sauce-alone, jack-by-the-hedge, Alliaria officinalis -n11870747 alyssum, madwort -n11871059 rose of Jericho, resurrection plant, Anastatica hierochuntica -n11871496 Arabidopsis thaliana, mouse-ear cress -n11871748 Arabidopsis lyrata -n11872146 rock cress, rockcress -n11872324 sicklepod, Arabis Canadensis -n11872658 tower mustard, tower cress, Turritis glabra, Arabis glabra -n11873182 horseradish, horseradish root -n11873612 winter cress, St. Barbara's herb, scurvy grass -n11874081 yellow rocket, rockcress, rocket cress, Barbarea vulgaris, Sisymbrium barbarea -n11874423 hoary alison, hoary alyssum, Berteroa incana -n11874878 buckler mustard, Biscutalla laevigata -n11875523 wild cabbage, Brassica oleracea -n11875691 cabbage, cultivated cabbage, Brassica oleracea -n11875938 head cabbage, head cabbage plant, Brassica oleracea capitata -n11876204 savoy cabbage -n11876432 brussels sprout, Brassica oleracea gemmifera -n11876634 cauliflower, Brassica oleracea botrytis -n11876803 broccoli, Brassica oleracea italica -n11877193 collard -n11877283 kohlrabi, Brassica oleracea gongylodes -n11877473 turnip plant -n11877646 turnip, white turnip, Brassica rapa -n11877860 rutabaga, turnip cabbage, swede, Swedish turnip, rutabaga plant, Brassica napus napobrassica -n11878101 broccoli raab, broccoli rabe, Brassica rapa ruvo -n11878283 mustard -n11878633 chinese mustard, indian mustard, leaf mustard, gai choi, Brassica juncea -n11879054 bok choy, bok choi, pakchoi, pak choi, Chinese white cabbage, Brassica rapa chinensis -n11879722 rape, colza, Brassica napus -n11879895 rapeseed -n11881189 shepherd's purse, shepherd's pouch, Capsella bursa-pastoris -n11882074 lady's smock, cuckooflower, cuckoo flower, meadow cress, Cardamine pratensis -n11882237 coral-root bittercress, coralroot, coralwort, Cardamine bulbifera, Dentaria bulbifera -n11882426 crinkleroot, crinkle-root, crinkle root, pepper root, toothwort, Cardamine diphylla, Dentaria diphylla -n11882636 American watercress, mountain watercress, Cardamine rotundifolia -n11882821 spring cress, Cardamine bulbosa -n11882972 purple cress, Cardamine douglasii -n11883328 wallflower, Cheiranthus cheiri, Erysimum cheiri -n11883628 prairie rocket -n11883945 scurvy grass, common scurvy grass, Cochlearia officinalis -n11884384 sea kale, sea cole, Crambe maritima -n11884967 tansy mustard, Descurainia pinnata -n11885856 draba -n11887119 wallflower -n11887310 prairie rocket -n11887476 Siberian wall flower, Erysimum allionii, Cheiranthus allionii -n11887750 western wall flower, Erysimum asperum, Cheiranthus asperus, Erysimum arkansanum -n11888061 wormseed mustard, Erysimum cheiranthoides -n11888424 heliophila -n11888800 damask violet, Dame's violet, sweet rocket, Hesperis matronalis -n11889205 tansy-leaved rocket, Hugueninia tanacetifolia, Sisymbrium tanacetifolia -n11889619 candytuft -n11890022 woad -n11890150 dyer's woad, Isatis tinctoria -n11890884 bladderpod -n11891175 sweet alyssum, sweet alison, Lobularia maritima -n11892029 Malcolm stock, stock -n11892181 Virginian stock, Virginia stock, Malcolmia maritima -n11892637 stock, gillyflower -n11892817 brompton stock, Matthiola incana -n11893640 bladderpod -n11893916 chamois cress, Pritzelago alpina, Lepidium alpina -n11894327 radish plant, radish -n11894558 jointed charlock, wild radish, wild rape, runch, Raphanus raphanistrum -n11894770 radish, Raphanus sativus -n11895092 radish, daikon, Japanese radish, Raphanus sativus longipinnatus -n11895472 marsh cress, yellow watercress, Rorippa islandica -n11895714 great yellowcress, Rorippa amphibia, Nasturtium amphibium -n11896141 schizopetalon, Schizopetalon walkeri -n11896722 field mustard, wild mustard, charlock, chadlock, Brassica kaber, Sinapis arvensis -n11897116 hedge mustard, Sisymbrium officinale -n11897466 desert plume, prince's-plume, Stanleya pinnata, Cleome pinnata -n11898639 pennycress -n11898775 field pennycress, French weed, fanweed, penny grass, stinkweed, mithridate mustard, Thlaspi arvense -n11899223 fringepod, lacepod -n11899762 bladderpod -n11899921 wasabi -n11900569 poppy -n11901294 Iceland poppy, Papaver alpinum -n11901452 western poppy, Papaver californicum -n11901597 prickly poppy, Papaver argemone -n11901759 Iceland poppy, arctic poppy, Papaver nudicaule -n11901977 oriental poppy, Papaver orientale -n11902200 corn poppy, field poppy, Flanders poppy, Papaver rhoeas -n11902389 opium poppy, Papaver somniferum -n11902709 prickly poppy, argemone, white thistle, devil's fig -n11902982 Mexican poppy, Argemone mexicana -n11903333 bocconia, tree celandine, Bocconia frutescens -n11903671 celandine, greater celandine, swallowwort, swallow wort, Chelidonium majus -n11904109 corydalis -n11904274 climbing corydalis, Corydalis claviculata, Fumaria claviculata -n11905392 California poppy, Eschscholtzia californica -n11905749 horn poppy, horned poppy, yellow horned poppy, sea poppy, Glaucium flavum -n11906127 golden cup, Mexican tulip poppy, Hunnemania fumariifolia -n11906514 plume poppy, bocconia, Macleaya cordata -n11906917 blue poppy, Meconopsis betonicifolia -n11907100 Welsh poppy, Meconopsis cambrica -n11907405 creamcups, Platystemon californicus -n11907689 matilija poppy, California tree poppy, Romneya coulteri -n11908549 wind poppy, flaming poppy, Stylomecon heterophyllum, Papaver heterophyllum -n11908846 celandine poppy, wood poppy, Stylophorum diphyllum -n11909864 climbing fumitory, Allegheny vine, Adlumia fungosa, Fumaria fungosa -n11910271 bleeding heart, lyreflower, lyre-flower, Dicentra spectabilis -n11910460 Dutchman's breeches, Dicentra cucullaria -n11910666 squirrel corn, Dicentra canadensis -n11915214 composite, composite plant -n11915658 compass plant, compass flower -n11915899 everlasting, everlasting flower -n11916467 achillea -n11916696 yarrow, milfoil, Achillea millefolium -n11917407 pink-and-white everlasting, pink paper daisy, Acroclinium roseum -n11917835 white snakeroot, white sanicle, Ageratina altissima, Eupatorium rugosum -n11918286 ageratum -n11918473 common ageratum, Ageratum houstonianum -n11918808 sweet sultan, Amberboa moschata, Centaurea moschata -n11919447 ragweed, ambrosia, bitterweed -n11919761 common ragweed, Ambrosia artemisiifolia -n11919975 great ragweed, Ambrosia trifida -n11920133 western ragweed, perennial ragweed, Ambrosia psilostachya -n11920498 ammobium -n11920663 winged everlasting, Ammobium alatum -n11920998 pellitory, pellitory-of-Spain, Anacyclus pyrethrum -n11921395 pearly everlasting, cottonweed, Anaphalis margaritacea -n11921792 andryala -n11922661 plantain-leaved pussytoes -n11922755 field pussytoes -n11922839 solitary pussytoes -n11922926 mountain everlasting -n11923174 mayweed, dog fennel, stinking mayweed, stinking chamomile, Anthemis cotula -n11923397 yellow chamomile, golden marguerite, dyers' chamomile, Anthemis tinctoria -n11923637 corn chamomile, field chamomile, corn mayweed, Anthemis arvensis -n11924014 woolly daisy, dwarf daisy, Antheropeas wallacei, Eriophyllum wallacei -n11924445 burdock, clotbur -n11924849 great burdock, greater burdock, cocklebur, Arctium lappa -n11925303 African daisy -n11925450 blue-eyed African daisy, Arctotis stoechadifolia, Arctotis venusta -n11925898 marguerite, marguerite daisy, Paris daisy, Chrysanthemum frutescens, Argyranthemum frutescens -n11926365 silversword, Argyroxiphium sandwicense -n11926833 arnica -n11926976 heartleaf arnica, Arnica cordifolia -n11927215 Arnica montana -n11927740 lamb succory, dwarf nipplewort, Arnoseris minima -n11928352 artemisia -n11928858 mugwort -n11929743 sweet wormwood, Artemisia annua -n11930038 field wormwood, Artemisia campestris -n11930203 tarragon, estragon, Artemisia dracunculus -n11930353 sand sage, silvery wormwood, Artemisia filifolia -n11930571 wormwood sage, prairie sagewort, Artemisia frigida -n11930788 western mugwort, white sage, cudweed, prairie sage, Artemisia ludoviciana, Artemisia gnaphalodes -n11930994 Roman wormwood, Artemis pontica -n11931135 bud brush, bud sagebrush, Artemis spinescens -n11931540 common mugwort, Artemisia vulgaris -n11931918 aster -n11932745 wood aster -n11932927 whorled aster, Aster acuminatus -n11933099 heath aster, Aster arenosus -n11933257 heart-leaved aster, Aster cordifolius -n11933387 white wood aster, Aster divaricatus -n11933546 bushy aster, Aster dumosus -n11933728 heath aster, Aster ericoides -n11933903 white prairie aster, Aster falcatus -n11934041 stiff aster, Aster linarifolius -n11934239 goldilocks, goldilocks aster, Aster linosyris, Linosyris vulgaris -n11934463 large-leaved aster, Aster macrophyllus -n11934616 New England aster, Aster novae-angliae -n11934807 Michaelmas daisy, New York aster, Aster novi-belgii -n11935027 upland white aster, Aster ptarmicoides -n11935187 Short's aster, Aster shortii -n11935330 sea aster, sea starwort, Aster tripolium -n11935469 prairie aster, Aster turbinellis -n11935627 annual salt-marsh aster -n11935715 aromatic aster -n11935794 arrow leaved aster -n11935877 azure aster -n11935953 bog aster -n11936027 crooked-stemmed aster -n11936113 Eastern silvery aster -n11936199 flat-topped white aster -n11936287 late purple aster -n11936369 panicled aster -n11936448 perennial salt marsh aster -n11936539 purple-stemmed aster -n11936624 rough-leaved aster -n11936707 rush aster -n11936782 Schreiber's aster -n11936864 small white aster -n11936946 smooth aster -n11937023 southern aster -n11937102 starved aster, calico aster -n11937195 tradescant's aster -n11937278 wavy-leaved aster -n11937360 Western silvery aster -n11937446 willow aster -n11937692 ayapana, Ayapana triplinervis, Eupatorium aya-pana -n11938556 mule fat, Baccharis viminea -n11939180 balsamroot -n11939491 daisy -n11939699 common daisy, English daisy, Bellis perennis -n11940006 bur marigold, burr marigold, beggar-ticks, beggar's-ticks, sticktight -n11940349 Spanish needles, Bidens bipinnata -n11940599 tickseed sunflower, Bidens coronata, Bidens trichosperma -n11940750 European beggar-ticks, trifid beggar-ticks, trifid bur marigold, Bidens tripartita -n11941094 slender knapweed -n11941478 false chamomile -n11941924 Swan River daisy, Brachycome Iberidifolia -n11942659 woodland oxeye, Buphthalmum salicifolium -n11943133 Indian plantain -n11943407 calendula -n11943660 common marigold, pot marigold, ruddles, Scotch marigold, Calendula officinalis -n11943992 China aster, Callistephus chinensis -n11944196 thistle -n11944751 welted thistle, Carduus crispus -n11944954 musk thistle, nodding thistle, Carduus nutans -n11945367 carline thistle -n11945514 stemless carline thistle, Carlina acaulis -n11945783 common carline thistle, Carlina vulgaris -n11946051 safflower, false saffron, Carthamus tinctorius -n11946313 safflower seed -n11946727 catananche -n11946918 blue succory, cupid's dart, Catananche caerulea -n11947251 centaury -n11947629 dusty miller, Centaurea cineraria, Centaurea gymnocarpa -n11947802 cornflower, bachelor's button, bluebottle, Centaurea cyanus -n11948044 star-thistle, caltrop, Centauria calcitrapa -n11948264 knapweed -n11948469 sweet sultan, Centaurea imperialis -n11948864 great knapweed, greater knapweed, Centaurea scabiosa -n11949015 Barnaby's thistle, yellow star-thistle, Centaurea solstitialis -n11949402 chamomile, camomile, Chamaemelum nobilis, Anthemis nobilis -n11949857 chaenactis -n11950345 chrysanthemum -n11950686 corn marigold, field marigold, Chrysanthemum segetum -n11950877 crown daisy, Chrysanthemum coronarium -n11951052 chop-suey greens, tong ho, shun giku, Chrysanthemum coronarium spatiosum -n11951511 golden aster -n11951820 Maryland golden aster, Chrysopsis mariana -n11952346 goldenbush -n11952541 rabbit brush, rabbit bush, Chrysothamnus nauseosus -n11953038 chicory, succory, chicory plant, Cichorium intybus -n11953339 endive, witloof, Cichorium endivia -n11953610 chicory, chicory root -n11953884 plume thistle, plumed thistle -n11954161 Canada thistle, creeping thistle, Cirsium arvense -n11954345 field thistle, Cirsium discolor -n11954484 woolly thistle, Cirsium flodmanii -n11954642 European woolly thistle, Cirsium eriophorum -n11954798 melancholy thistle, Cirsium heterophylum, Cirsium helenioides -n11955040 brook thistle, Cirsium rivulare -n11955153 bull thistle, boar thistle, spear thistle, Cirsium vulgare, Cirsium lanceolatum -n11955532 blessed thistle, sweet sultan, Cnicus benedictus -n11955896 mistflower, mist-flower, ageratum, Conoclinium coelestinum, Eupatorium coelestinum -n11956348 horseweed, Canadian fleabane, fleabane, Conyza canadensis, Erigeron canadensis -n11956850 coreopsis, tickseed, tickweed, tick-weed -n11957317 giant coreopsis, Coreopsis gigantea -n11957514 sea dahlia, Coreopsis maritima -n11957678 calliopsis, Coreopsis tinctoria -n11958080 cosmos, cosmea -n11958499 brass buttons, Cotula coronopifolia -n11958888 billy buttons -n11959259 hawk's-beard, hawk's-beards -n11959632 artichoke, globe artichoke, artichoke plant, Cynara scolymus -n11959862 cardoon, Cynara cardunculus -n11960245 dahlia, Dahlia pinnata -n11960673 German ivy, Delairea odorata, Senecio milkanioides -n11961100 florist's chrysanthemum, florists' chrysanthemum, mum, Dendranthema grandifloruom, Chrysanthemum morifolium -n11961446 cape marigold, sun marigold, star of the veldt -n11961871 leopard's-bane, leopardbane -n11962272 coneflower -n11962667 globe thistle -n11962994 elephant's-foot -n11963572 tassel flower, Emilia sagitta -n11963932 brittlebush, brittle bush, incienso, Encelia farinosa -n11964446 sunray, Enceliopsis nudicaulis -n11964848 engelmannia -n11965218 fireweed, Erechtites hieracifolia -n11965627 fleabane -n11965962 blue fleabane, Erigeron acer -n11966083 daisy fleabane, Erigeron annuus -n11966215 orange daisy, orange fleabane, Erigeron aurantiacus -n11966385 spreading fleabane, Erigeron divergens -n11966617 seaside daisy, beach aster, Erigeron glaucous -n11966896 Philadelphia fleabane, Erigeron philadelphicus -n11967142 robin's plantain, Erigeron pulchellus -n11967315 showy daisy, Erigeron speciosus -n11967744 woolly sunflower -n11967878 golden yarrow, Eriophyllum lanatum -n11968519 dog fennel, Eupatorium capillifolium -n11968704 Joe-Pye weed, spotted Joe-Pye weed, Eupatorium maculatum -n11968931 boneset, agueweed, thoroughwort, Eupatorium perfoliatum -n11969166 Joe-Pye weed, purple boneset, trumpet weed, marsh milkweed, Eupatorium purpureum -n11969607 blue daisy, blue marguerite, Felicia amelloides -n11969806 kingfisher daisy, Felicia bergeriana -n11970101 cotton rose, cudweed, filago -n11970298 herba impia, Filago germanica -n11970586 gaillardia -n11971248 gazania -n11971406 treasure flower, Gazania rigens -n11971783 African daisy -n11971927 Barberton daisy, Transvaal daisy, Gerbera jamesonii -n11972291 desert sunflower, Gerea canescens -n11972759 cudweed -n11972959 chafeweed, wood cudweed, Gnaphalium sylvaticum -n11973341 gumweed, gum plant, tarweed, rosinweed -n11973634 Grindelia robusta -n11973749 curlycup gumweed, Grindelia squarrosa -n11974373 little-head snakeweed, Gutierrezia microcephala -n11974557 rabbitweed, rabbit-weed, snakeweed, broom snakeweed, broom snakeroot, turpentine weed, Gutierrezia sarothrae -n11974888 broomweed, broom-weed, Gutierrezia texana -n11975254 velvet plant, purple velvet plant, royal velvet plant, Gynura aurantiaca -n11976170 goldenbush -n11976314 camphor daisy, Haplopappus phyllocephalus -n11976511 yellow spiny daisy, Haplopappus spinulosus -n11976933 hoary golden bush, Hazardia cana -n11977303 sneezeweed -n11977660 orange sneezeweed, owlclaws, Helenium hoopesii -n11977887 rosilla, Helenium puberulum -n11978233 sunflower, helianthus -n11978551 swamp sunflower, Helianthus angustifolius -n11978713 common sunflower, mirasol, Helianthus annuus -n11978961 giant sunflower, tall sunflower, Indian potato, Helianthus giganteus -n11979187 showy sunflower, Helianthus laetiflorus -n11979354 Maximilian's sunflower, Helianthus maximilianii -n11979527 prairie sunflower, Helianthus petiolaris -n11979715 Jerusalem artichoke, girasol, Jerusalem artichoke sunflower, Helianthus tuberosus -n11979964 Jerusalem artichoke -n11980318 strawflower, golden everlasting, yellow paper daisy, Helichrysum bracteatum -n11980682 heliopsis, oxeye -n11981192 strawflower -n11981475 hairy golden aster, prairie golden aster, Heterotheca villosa, Chrysopsis villosa -n11982115 hawkweed -n11982545 rattlesnake weed, Hieracium venosum -n11982939 alpine coltsfoot, Homogyne alpina, Tussilago alpina -n11983375 alpine gold, alpine hulsea, Hulsea algida -n11983606 dwarf hulsea, Hulsea nana -n11984144 cat's-ear, California dandelion, capeweed, gosmore, Hypochaeris radicata -n11984542 inula -n11985053 marsh elder, iva -n11985321 burweed marsh elder, false ragweed, Iva xanthifolia -n11985739 krigia -n11985903 dwarf dandelion, Krigia dandelion, Krigia bulbosa -n11986511 garden lettuce, common lettuce, Lactuca sativa -n11986729 cos lettuce, romaine lettuce, Lactuca sativa longifolia -n11987126 leaf lettuce, Lactuca sativa crispa -n11987349 celtuce, stem lettuce, Lactuca sativa asparagina -n11987511 prickly lettuce, horse thistle, Lactuca serriola, Lactuca scariola -n11988132 goldfields, Lasthenia chrysostoma -n11988596 tidytips, tidy tips, Layia platyglossa -n11988893 hawkbit -n11989087 fall dandelion, arnica bud, Leontodon autumnalis -n11989393 edelweiss, Leontopodium alpinum -n11989869 oxeye daisy, ox-eyed daisy, marguerite, moon daisy, white daisy, Leucanthemum vulgare, Chrysanthemum leucanthemum -n11990167 oxeye daisy, Leucanthemum maximum, Chrysanthemum maximum -n11990313 shasta daisy, Leucanthemum superbum, Chrysanthemum maximum maximum -n11990627 Pyrenees daisy, Leucanthemum lacustre, Chrysanthemum lacustre -n11990920 north island edelweiss, Leucogenes leontopodium -n11991263 blazing star, button snakeroot, gayfeather, gay-feather, snakeroot -n11991549 dotted gayfeather, Liatris punctata -n11991777 dense blazing star, Liatris pycnostachya -n11992479 Texas star, Lindheimera texana -n11992806 African daisy, yellow ageratum, Lonas inodora, Lonas annua -n11993203 tahoka daisy, tansy leaf aster, Machaeranthera tanacetifolia -n11993444 sticky aster, Machaeranthera bigelovii -n11993675 Mojave aster, Machaeranthera tortifoloia -n11994150 tarweed -n11995092 sweet false chamomile, wild chamomile, German chamomile, Matricaria recutita, Matricaria chamomilla -n11995396 pineapple weed, rayless chamomile, Matricaria matricarioides -n11996251 climbing hempweed, climbing boneset, wild climbing hempweed, climbing hemp-vine, Mikania scandens -n11996677 mutisia -n11997032 rattlesnake root -n11997160 white lettuce, cankerweed, Nabalus alba, Prenanthes alba -n11997969 daisybush, daisy-bush, daisy bush -n11998492 New Zealand daisybush, Olearia haastii -n11998888 cotton thistle, woolly thistle, Scotch thistle, Onopordum acanthium, Onopordon acanthium -n11999278 othonna -n11999656 cascade everlasting, Ozothamnus secundiflorus, Helichrysum secundiflorum -n12000191 butterweed -n12001294 American feverfew, wild quinine, prairie dock, Parthenium integrifolium -n12001707 cineraria, Pericallis cruenta, Senecio cruentus -n12001924 florest's cineraria, Pericallis hybrida -n12002428 butterbur, bog rhubarb, Petasites hybridus, Petasites vulgaris -n12002651 winter heliotrope, sweet coltsfoot, Petasites fragrans -n12002826 sweet coltsfoot, Petasites sagitattus -n12003167 oxtongue, bristly oxtongue, bitterweed, bugloss, Picris echioides -n12003696 hawkweed -n12004120 mouse-ear hawkweed, Pilosella officinarum, Hieracium pilocella -n12004547 stevia -n12004987 rattlesnake root, Prenanthes purpurea -n12005656 fleabane, feabane mullet, Pulicaria dysenterica -n12006306 sheep plant, vegetable sheep, Raoulia lutescens, Raoulia australis -n12006766 coneflower -n12006930 Mexican hat, Ratibida columnaris -n12007196 long-head coneflower, prairie coneflower, Ratibida columnifera -n12007406 prairie coneflower, Ratibida tagetes -n12007766 Swan River everlasting, rhodanthe, Rhodanthe manglesii, Helipterum manglesii -n12008252 coneflower -n12008487 black-eyed Susan, Rudbeckia hirta, Rudbeckia serotina -n12008749 cutleaved coneflower, Rudbeckia laciniata -n12009047 golden glow, double gold, hortensia, Rudbeckia laciniata hortensia -n12009420 lavender cotton, Santolina chamaecyparissus -n12009792 creeping zinnia, Sanvitalia procumbens -n12010628 golden thistle -n12010815 Spanish oyster plant, Scolymus hispanicus -n12011370 nodding groundsel, Senecio bigelovii -n12011620 dusty miller, Senecio cineraria, Cineraria maritima -n12012111 butterweed, ragwort, Senecio glabellus -n12012253 ragwort, tansy ragwort, ragweed, benweed, Senecio jacobaea -n12012510 arrowleaf groundsel, Senecio triangularis -n12013035 black salsify, viper's grass, scorzonera, Scorzonera hispanica -n12013511 white-topped aster -n12013701 narrow-leaved white-topped aster -n12014085 silver sage, silver sagebrush, grey sage, gray sage, Seriphidium canum, Artemisia cana -n12014355 sea wormwood, Seriphidium maritimum, Artemisia maritima -n12014923 sawwort, Serratula tinctoria -n12015221 rosinweed, Silphium laciniatum -n12015525 milk thistle, lady's thistle, Our Lady's mild thistle, holy thistle, blessed thistle, Silybum marianum -n12015959 goldenrod -n12016434 silverrod, Solidago bicolor -n12016567 meadow goldenrod, Canadian goldenrod, Solidago canadensis -n12016777 Missouri goldenrod, Solidago missouriensis -n12016914 alpine goldenrod, Solidago multiradiata -n12017127 grey goldenrod, gray goldenrod, Solidago nemoralis -n12017326 Blue Mountain tea, sweet goldenrod, Solidago odora -n12017511 dyer's weed, Solidago rugosa -n12017664 seaside goldenrod, beach goldenrod, Solidago sempervirens -n12017853 narrow goldenrod, Solidago spathulata -n12018014 Boott's goldenrod -n12018100 Elliott's goldenrod -n12018188 Ohio goldenrod -n12018271 rough-stemmed goldenrod -n12018363 showy goldenrod -n12018447 tall goldenrod -n12018530 zigzag goldenrod, broad leaved goldenrod -n12018760 sow thistle, milk thistle -n12019035 milkweed, Sonchus oleraceus -n12019827 stevia -n12020184 stokes' aster, cornflower aster, Stokesia laevis -n12020507 marigold -n12020736 African marigold, big marigold, Aztec marigold, Tagetes erecta -n12020941 French marigold, Tagetes patula -n12022054 painted daisy, pyrethrum, Tanacetum coccineum, Chrysanthemum coccineum -n12022382 pyrethrum, Dalmatian pyrethrum, Dalmatia pyrethrum, Tanacetum cinerariifolium, Chrysanthemum cinerariifolium -n12022821 northern dune tansy, Tanacetum douglasii -n12023108 feverfew, Tanacetum parthenium, Chrysanthemum parthenium -n12023407 dusty miller, silver-lace, silver lace, Tanacetum ptarmiciflorum, Chrysanthemum ptarmiciflorum -n12023726 tansy, golden buttons, scented fern, Tanacetum vulgare -n12024176 dandelion, blowball -n12024445 common dandelion, Taraxacum ruderalia, Taraxacum officinale -n12024690 dandelion green -n12024805 Russian dandelion, kok-saghyz, kok-sagyz, Taraxacum kok-saghyz -n12025220 stemless hymenoxys, Tetraneuris acaulis, Hymenoxys acaulis -n12026018 Mexican sunflower, tithonia -n12026476 Easter daisy, stemless daisy, Townsendia Exscapa -n12026981 yellow salsify, Tragopogon dubius -n12027222 salsify, oyster plant, vegetable oyster, Tragopogon porrifolius -n12027658 meadow salsify, goatsbeard, shepherd's clock, Tragopogon pratensis -n12028424 scentless camomile, scentless false camomile, scentless mayweed, scentless hayweed, corn mayweed, Tripleurospermum inodorum, Matricaria inodorum -n12029039 turfing daisy, Tripleurospermum tchihatchewii, Matricaria tchihatchewii -n12029635 coltsfoot, Tussilago farfara -n12030092 ursinia -n12030654 crownbeard, crown-beard, crown beard -n12030908 wingstem, golden ironweed, yellow ironweed, golden honey plant, Verbesina alternifolia, Actinomeris alternifolia -n12031139 cowpen daisy, golden crownbeard, golden crown beard, butter daisy, Verbesina encelioides, Ximenesia encelioides -n12031388 gravelweed, Verbesina helianthoides -n12031547 Virginia crownbeard, frostweed, frost-weed, Verbesina virginica -n12031927 ironweed, vernonia -n12032429 mule's ears, Wyethia amplexicaulis -n12032686 white-rayed mule's ears, Wyethia helianthoides -n12033139 cocklebur, cockle-bur, cockleburr, cockle-burr -n12033504 xeranthemum -n12033709 immortelle, Xeranthemum annuum -n12034141 zinnia, old maid, old maid flower -n12034384 white zinnia, Zinnia acerosa -n12034594 little golden zinnia, Zinnia grandiflora -n12035631 blazing star, Mentzelia livicaulis, Mentzelia laevicaulis -n12035907 bartonia, Mentzelia lindleyi -n12036067 achene -n12036226 samara, key fruit, key -n12036939 campanula, bellflower -n12037499 creeping bellflower, Campanula rapunculoides -n12037691 Canterbury bell, cup and saucer, Campanula medium -n12038038 tall bellflower, Campanula americana -n12038208 marsh bellflower, Campanula aparinoides -n12038406 clustered bellflower, Campanula glomerata -n12038585 peach bells, peach bell, willow bell, Campanula persicifolia -n12038760 chimney plant, chimney bellflower, Campanula pyramidalis -n12038898 rampion, rampion bellflower, Campanula rapunculus -n12039317 tussock bellflower, spreading bellflower, Campanula carpatica -n12041446 orchid, orchidaceous plant -n12043444 orchis -n12043673 male orchis, early purple orchid, Orchis mascula -n12043836 butterfly orchid, butterfly orchis, Orchis papilionaceae -n12044041 showy orchis, purple orchis, purple-hooded orchis, Orchis spectabilis -n12044467 aerides -n12044784 angrecum -n12045157 jewel orchid -n12045514 puttyroot, adam-and-eve, Aplectrum hyemale -n12045860 arethusa -n12046028 bog rose, wild pink, dragon's mouth, Arethusa bulbosa -n12046428 bletia -n12046815 Bletilla striata, Bletia striata -n12047345 brassavola -n12047884 spider orchid, Brassia lawrenceana -n12048056 spider orchid, Brassia verrucosa -n12048399 caladenia -n12048928 calanthe -n12049282 grass pink, Calopogon pulchellum, Calopogon tuberosum -n12049562 calypso, fairy-slipper, Calypso bulbosa -n12050533 cattleya -n12050959 helleborine -n12051103 red helleborine, Cephalanthera rubra -n12051514 spreading pogonia, funnel-crest rosebud orchid, Cleistes divaricata, Pogonia divaricata -n12051792 rosebud orchid, Cleistes rosea, Pogonia rosea -n12052267 satyr orchid, Coeloglossum bracteatum -n12052447 frog orchid, Coeloglossum viride -n12052787 coelogyne -n12053405 coral root -n12053690 spotted coral root, Corallorhiza maculata -n12053962 striped coral root, Corallorhiza striata -n12054195 early coral root, pale coral root, Corallorhiza trifida -n12055073 swan orchid, swanflower, swan-flower, swanneck, swan-neck -n12055516 cymbid, cymbidium -n12056099 cypripedia -n12056217 lady's slipper, lady-slipper, ladies' slipper, slipper orchid -n12056601 moccasin flower, nerveroot, Cypripedium acaule -n12056758 common lady's-slipper, showy lady's-slipper, showy lady slipper, Cypripedium reginae, Cypripedium album -n12056990 ram's-head, ram's-head lady's slipper, Cypripedium arietinum -n12057211 yellow lady's slipper, yellow lady-slipper, Cypripedium calceolus, Cypripedium parviflorum -n12057447 large yellow lady's slipper, Cypripedium calceolus pubescens -n12057660 California lady's slipper, Cypripedium californicum -n12057895 clustered lady's slipper, Cypripedium fasciculatum -n12058192 mountain lady's slipper, Cypripedium montanum -n12058630 marsh orchid -n12058822 common spotted orchid, Dactylorhiza fuchsii, Dactylorhiza maculata fuchsii -n12059314 dendrobium -n12059625 disa -n12060546 phantom orchid, snow orchid, Eburophyton austinae -n12061104 tulip orchid, Encyclia citrina, Cattleya citrina -n12061380 butterfly orchid, Encyclia tampensis, Epidendrum tampense -n12061614 butterfly orchid, butterfly orchis, Epidendrum venosum, Encyclia venosa -n12062105 epidendron -n12062468 helleborine -n12062626 Epipactis helleborine -n12062781 stream orchid, chatterbox, giant helleborine, Epipactis gigantea -n12063211 tongueflower, tongue-flower -n12063639 rattlesnake plantain, helleborine -n12064389 fragrant orchid, Gymnadenia conopsea -n12064591 short-spurred fragrant orchid, Gymnadenia odoratissima -n12065316 fringed orchis, fringed orchid -n12065649 frog orchid -n12065777 rein orchid, rein orchis -n12066018 bog rein orchid, bog candles, Habenaria dilatata -n12066261 white fringed orchis, white fringed orchid, Habenaria albiflora -n12066451 elegant Habenaria, Habenaria elegans -n12066630 purple-fringed orchid, purple-fringed orchis, Habenaria fimbriata -n12066821 coastal rein orchid, Habenaria greenei -n12067029 Hooker's orchid, Habenaria hookeri -n12067193 ragged orchid, ragged orchis, ragged-fringed orchid, green fringed orchis, Habenaria lacera -n12067433 prairie orchid, prairie white-fringed orchis, Habenaria leucophaea -n12067672 snowy orchid, Habenaria nivea -n12067817 round-leaved rein orchid, Habenaria orbiculata -n12068138 purple fringeless orchid, purple fringeless orchis, Habenaria peramoena -n12068432 purple-fringed orchid, purple-fringed orchis, Habenaria psycodes -n12068615 Alaska rein orchid, Habenaria unalascensis -n12069009 crested coral root, Hexalectris spicata -n12069217 Texas purple spike, Hexalectris warnockii -n12069679 lizard orchid, Himantoglossum hircinum -n12070016 laelia -n12070381 liparis -n12070583 twayblade -n12070712 fen orchid, fen orchis, Liparis loeselii -n12071259 broad-leaved twayblade, Listera convallarioides -n12071477 lesser twayblade, Listera cordata -n12071744 twayblade, Listera ovata -n12072210 green adder's mouth, Malaxis-unifolia, Malaxis ophioglossoides -n12072722 masdevallia -n12073217 maxillaria -n12073554 pansy orchid -n12073991 odontoglossum -n12074408 oncidium, dancing lady orchid, butterfly plant, butterfly orchid -n12074867 bee orchid, Ophrys apifera -n12075010 fly orchid, Ophrys insectifera, Ophrys muscifera -n12075151 spider orchid -n12075299 early spider orchid, Ophrys sphegodes -n12075830 Venus' slipper, Venus's slipper, Venus's shoe -n12076223 phaius -n12076577 moth orchid, moth plant -n12076852 butterfly plant, Phalaenopsis amabilis -n12077244 rattlesnake orchid -n12077944 lesser butterfly orchid, Platanthera bifolia, Habenaria bifolia -n12078172 greater butterfly orchid, Platanthera chlorantha, Habenaria chlorantha -n12078451 prairie white-fringed orchid, Platanthera leucophea -n12078747 tangle orchid -n12079120 Indian crocus -n12079523 pleurothallis -n12079963 pogonia -n12080395 butterfly orchid -n12080588 Psychopsis krameriana, Oncidium papilio kramerianum -n12080820 Psychopsis papilio, Oncidium papilio -n12081215 helmet orchid, greenhood -n12081649 foxtail orchid -n12082131 orange-blossom orchid, Sarcochilus falcatus -n12083113 sobralia -n12083591 ladies' tresses, lady's tresses -n12083847 screw augur, Spiranthes cernua -n12084158 hooded ladies' tresses, Spiranthes romanzoffiana -n12084400 western ladies' tresses, Spiranthes porrifolia -n12084555 European ladies' tresses, Spiranthes spiralis -n12084890 stanhopea -n12085267 stelis -n12085664 fly orchid -n12086012 vanda -n12086192 blue orchid, Vanda caerulea -n12086539 vanilla -n12086778 vanilla orchid, Vanilla planifolia -n12087961 yam, yam plant -n12088223 yam -n12088327 white yam, water yam, Dioscorea alata -n12088495 cinnamon vine, Chinese yam, Dioscorea batata -n12088909 elephant's-foot, tortoise plant, Hottentot bread vine, Hottentot's bread vine, Dioscorea elephantipes -n12089320 wild yam, Dioscorea paniculata -n12089496 cush-cush, Dioscorea trifida -n12089846 black bryony, black bindweed, Tamus communis -n12090890 primrose, primula -n12091213 English primrose, Primula vulgaris -n12091377 cowslip, paigle, Primula veris -n12091550 oxlip, paigle, Primula elatior -n12091697 Chinese primrose, Primula sinensis -n12091953 polyanthus, Primula polyantha -n12092262 pimpernel -n12092417 scarlet pimpernel, red pimpernel, poor man's weatherglass, Anagallis arvensis -n12092629 bog pimpernel, Anagallis tenella -n12092930 chaffweed, bastard pimpernel, false pimpernel -n12093329 cyclamen, Cyclamen purpurascens -n12093600 sowbread, Cyclamen hederifolium, Cyclamen neopolitanum -n12093885 sea milkwort, sea trifoly, black saltwort, Glaux maritima -n12094244 featherfoil, feather-foil -n12094401 water gillyflower, American featherfoil, Hottonia inflata -n12094612 water violet, Hottonia palustris -n12095020 loosestrife -n12095281 gooseneck loosestrife, Lysimachia clethroides Duby -n12095412 yellow pimpernel, Lysimachia nemorum -n12095543 fringed loosestrife, Lysimachia ciliatum -n12095647 moneywort, creeping Jenny, creeping Charlie, Lysimachia nummularia -n12095934 swamp candles, Lysimachia terrestris -n12096089 whorled loosestrife, Lysimachia quadrifolia -n12096395 water pimpernel -n12096563 brookweed, Samolus valerandii -n12096674 brookweed, Samolus parviflorus, Samolus floribundus -n12097396 coralberry, spiceberry, Ardisia crenata -n12097556 marlberry, Ardisia escallonoides, Ardisia paniculata -n12098403 plumbago -n12098524 leadwort, Plumbago europaea -n12098827 thrift -n12099342 sea lavender, marsh rosemary, statice -n12100187 barbasco, joewood, Jacquinia keyensis -n12101870 gramineous plant, graminaceous plant -n12102133 grass -n12103680 midgrass -n12103894 shortgrass, short-grass -n12104104 sword grass -n12104238 tallgrass, tall-grass -n12104501 herbage, pasturage -n12104734 goat grass, Aegilops triuncalis -n12105125 wheatgrass, wheat-grass -n12105353 crested wheatgrass, crested wheat grass, fairway crested wheat grass, Agropyron cristatum -n12105828 bearded wheatgrass, Agropyron subsecundum -n12105981 western wheatgrass, bluestem wheatgrass, Agropyron smithii -n12106134 intermediate wheatgrass, Agropyron intermedium, Elymus hispidus -n12106323 slender wheatgrass, Agropyron trachycaulum, Agropyron pauciflorum, Elymus trachycaulos -n12107002 velvet bent, velvet bent grass, brown bent, Rhode Island bent, dog bent, Agrostis canina -n12107191 cloud grass, Agrostis nebulosa -n12107710 meadow foxtail, Alopecurus pratensis -n12107970 foxtail, foxtail grass -n12108432 broom grass -n12108613 broom sedge, Andropogon virginicus -n12108871 tall oat grass, tall meadow grass, evergreen grass, false oat, French rye, Arrhenatherum elatius -n12109365 toetoe, toitoi, Arundo conspicua, Chionochloa conspicua -n12109827 oat -n12110085 cereal oat, Avena sativa -n12110236 wild oat, wild oat grass, Avena fatua -n12110352 slender wild oat, Avena barbata -n12110475 wild red oat, animated oat, Avene sterilis -n12110778 brome, bromegrass -n12111238 chess, cheat, Bromus secalinus -n12111627 field brome, Bromus arvensis -n12112008 grama, grama grass, gramma, gramma grass -n12112337 black grama, Bouteloua eriopoda -n12112609 buffalo grass, Buchloe dactyloides -n12112918 reed grass -n12113195 feather reed grass, feathertop, Calamagrostis acutiflora -n12113323 Australian reed grass, Calamagrostic quadriseta -n12113657 burgrass, bur grass -n12114010 buffel grass, Cenchrus ciliaris, Pennisetum cenchroides -n12114590 Rhodes grass, Chloris gayana -n12115180 pampas grass, Cortaderia selloana -n12116058 giant star grass, Cynodon plectostachyum -n12116429 orchard grass, cocksfoot, cockspur, Dactylis glomerata -n12116734 Egyptian grass, crowfoot grass, Dactyloctenium aegypticum -n12117017 crabgrass, crab grass, finger grass -n12117235 smooth crabgrass, Digitaria ischaemum -n12117326 large crabgrass, hairy finger grass, Digitaria sanguinalis -n12117695 barnyard grass, barn grass, barn millet, Echinochloa crusgalli -n12117912 Japanese millet, billion-dollar grass, Japanese barnyard millet, sanwa millet, Echinochloa frumentacea -n12118414 yardgrass, yard grass, wire grass, goose grass, Eleusine indica -n12118661 finger millet, ragi, ragee, African millet, coracan, corakan, kurakkan, Eleusine coracana -n12119099 lyme grass -n12119238 wild rye -n12119390 giant ryegrass, Elymus condensatus, Leymus condensatus -n12119539 sea lyme grass, European dune grass, Elymus arenarius, Leymus arenaria -n12119717 Canada wild rye, Elymus canadensis -n12120347 teff, teff grass, Eragrostis tef, Eragrostic abyssinica -n12120578 weeping love grass, African love grass, Eragrostis curvula -n12121033 plume grass -n12121187 Ravenna grass, wool grass, Erianthus ravennae -n12121610 fescue, fescue grass, meadow fescue, Festuca elatior -n12122442 reed meadow grass, Glyceria grandis -n12122725 velvet grass, Yorkshire fog, Holcus lanatus -n12122918 creeping soft grass, Holcus mollis -n12123648 barleycorn -n12123741 barley grass, wall barley, Hordeum murinum -n12124172 little barley, Hordeum pusillum -n12124627 rye grass, ryegrass -n12124818 perennial ryegrass, English ryegrass, Lolium perenne -n12125001 Italian ryegrass, Italian rye, Lolium multiflorum -n12125183 darnel, tare, bearded darnel, cheat, Lolium temulentum -n12125584 nimblewill, nimble Will, Muhlenbergia schreberi -n12126084 cultivated rice, Oryza sativa -n12126360 ricegrass, rice grass -n12126736 smilo, smilo grass, Oryzopsis miliacea -n12127460 switch grass, Panicum virgatum -n12127575 broomcorn millet, hog millet, Panicum miliaceum -n12127768 goose grass, Texas millet, Panicum Texanum -n12128071 dallisgrass, dallis grass, paspalum, Paspalum dilatatum -n12128306 Bahia grass, Paspalum notatum -n12128490 knotgrass, Paspalum distichum -n12129134 fountain grass, Pennisetum ruppelii, Pennisetum setaceum -n12129738 reed canary grass, gardener's garters, lady's laces, ribbon grass, Phalaris arundinacea -n12129986 canary grass, birdseed grass, Phalaris canariensis -n12130549 timothy, herd's grass, Phleum pratense -n12131405 bluegrass, blue grass -n12131550 meadowgrass, meadow grass -n12132092 wood meadowgrass, Poa nemoralis, Agrostis alba -n12132956 noble cane -n12133151 munj, munja, Saccharum bengalense, Saccharum munja -n12133462 broom beard grass, prairie grass, wire grass, Andropogon scoparius, Schizachyrium scoparium -n12133682 bluestem, blue stem, Andropogon furcatus, Andropogon gerardii -n12134025 rye, Secale cereale -n12134486 bristlegrass, bristle grass -n12134695 giant foxtail -n12134836 yellow bristlegrass, yellow bristle grass, yellow foxtail, glaucous bristlegrass, Setaria glauca -n12135049 green bristlegrass, green foxtail, rough bristlegrass, bottle-grass, bottle grass, Setaria viridis -n12135576 Siberian millet, Setaria italica rubrofructa -n12135729 German millet, golden wonder millet, Setaria italica stramineofructa -n12135898 millet -n12136392 rattan, rattan cane -n12136581 malacca -n12136720 reed -n12137120 sorghum -n12137569 grain sorghum -n12137791 durra, doura, dourah, Egyptian corn, Indian millet, Guinea corn -n12137954 feterita, federita, Sorghum vulgare caudatum -n12138110 hegari -n12138248 kaoliang -n12138444 milo, milo maize -n12138578 shallu, Sorghum vulgare rosburghii -n12139196 broomcorn, Sorghum vulgare technicum -n12139575 cordgrass, cord grass -n12139793 salt reed grass, Spartina cynosuroides -n12139921 prairie cordgrass, freshwater cordgrass, slough grass, Spartina pectinmata -n12140511 smut grass, blackseed, carpet grass, Sporobolus poiretii -n12140759 sand dropseed, Sporobolus cryptandrus -n12140903 rush grass, rush-grass -n12141167 St. Augustine grass, Stenotaphrum secundatum, buffalo grass -n12141385 grain -n12141495 cereal, cereal grass -n12142085 wheat -n12142357 wheat berry -n12142450 durum, durum wheat, hard wheat, Triticum durum, Triticum turgidum, macaroni wheat -n12143065 spelt, Triticum spelta, Triticum aestivum spelta -n12143215 emmer, starch wheat, two-grain spelt, Triticum dicoccum -n12143405 wild wheat, wild emmer, Triticum dicoccum dicoccoides -n12143676 corn, maize, Indian corn, Zea mays -n12144313 mealie -n12144580 corn -n12144987 dent corn, Zea mays indentata -n12145148 flint corn, flint maize, Yankee corn, Zea mays indurata -n12145477 popcorn, Zea mays everta -n12146311 zoysia -n12146488 Manila grass, Japanese carpet grass, Zoysia matrella -n12146654 Korean lawn grass, Japanese lawn grass, Zoysia japonica -n12147226 bamboo -n12147835 common bamboo, Bambusa vulgaris -n12148757 giant bamboo, kyo-chiku, Dendrocalamus giganteus -n12150722 umbrella plant, umbrella sedge, Cyperus alternifolius -n12150969 chufa, yellow nutgrass, earth almond, ground almond, rush nut, Cyperus esculentus -n12151170 galingale, galangal, Cyperus longus -n12151615 nutgrass, nut grass, nutsedge, nut sedge, Cyperus rotundus -n12152031 sand sedge, sand reed, Carex arenaria -n12152251 cypress sedge, Carex pseudocyperus -n12152532 cotton grass, cotton rush -n12152722 common cotton grass, Eriophorum angustifolium -n12153033 hardstem bulrush, hardstemmed bulrush, Scirpus acutus -n12153224 wool grass, Scirpus cyperinus -n12153580 spike rush -n12153741 water chestnut, Chinese water chestnut, Eleocharis dulcis -n12153914 needle spike rush, needle rush, slender spike rush, hair grass, Eleocharis acicularis -n12154114 creeping spike rush, Eleocharis palustris -n12154773 pandanus, screw pine -n12155009 textile screw pine, lauhala, Pandanus tectorius -n12155583 cattail -n12155773 cat's-tail, bullrush, bulrush, nailrod, reed mace, reedmace, Typha latifolia -n12156679 bur reed -n12156819 grain, caryopsis -n12157056 kernel -n12157179 rye -n12157769 gourd, gourd vine -n12158031 gourd -n12158443 pumpkin, pumpkin vine, autumn pumpkin, Cucurbita pepo -n12158798 squash, squash vine -n12159055 summer squash, summer squash vine, Cucurbita pepo melopepo -n12159388 yellow squash -n12159555 marrow, marrow squash, vegetable marrow -n12159804 zucchini, courgette -n12159942 cocozelle, Italian vegetable marrow -n12160125 cymling, pattypan squash -n12160303 spaghetti squash -n12160490 winter squash, winter squash plant -n12160857 acorn squash -n12161056 hubbard squash, Cucurbita maxima -n12161285 turban squash, Cucurbita maxima turbaniformis -n12161577 buttercup squash -n12161744 butternut squash, Cucurbita maxima -n12161969 winter crookneck, winter crookneck squash, Cucurbita moschata -n12162181 cushaw, Cucurbita mixta, Cucurbita argyrosperma -n12162425 prairie gourd, prairie gourd vine, Missouri gourd, wild pumpkin, buffalo gourd, calabazilla, Cucurbita foetidissima -n12162758 prairie gourd -n12163035 bryony, briony -n12163279 white bryony, devil's turnip, Bryonia alba -n12164363 sweet melon, muskmelon, sweet melon vine, Cucumis melo -n12164656 cantaloupe, cantaloup, cantaloupe vine, cantaloup vine, Cucumis melo cantalupensis -n12164881 winter melon, Persian melon, honeydew melon, winter melon vine, Cucumis melo inodorus -n12165170 net melon, netted melon, nutmeg melon, Cucumis melo reticulatus -n12165384 cucumber, cucumber vine, Cucumis sativus -n12165758 squirting cucumber, exploding cucumber, touch-me-not, Ecballium elaterium -n12166128 bottle gourd, calabash, Lagenaria siceraria -n12166424 luffa, dishcloth gourd, sponge gourd, rag gourd, strainer vine -n12166793 loofah, vegetable sponge, Luffa cylindrica -n12166929 angled loofah, sing-kwa, Luffa acutangula -n12167075 loofa, loofah, luffa, loufah sponge -n12167436 balsam apple, Momordica balsamina -n12167602 balsam pear, Momordica charantia -n12168565 lobelia -n12169099 water lobelia, Lobelia dortmanna -n12170585 mallow -n12171098 musk mallow, mus rose, Malva moschata -n12171316 common mallow, Malva neglecta -n12171966 okra, gumbo, okra plant, lady's-finger, Abelmoschus esculentus, Hibiscus esculentus -n12172364 okra -n12172481 abelmosk, musk mallow, Abelmoschus moschatus, Hibiscus moschatus -n12172906 flowering maple -n12173069 velvetleaf, velvet-leaf, velvetweed, Indian mallow, butter-print, China jute, Abutilon theophrasti -n12173664 hollyhock -n12173912 rose mallow, Alcea rosea, Althea rosea -n12174311 althea, althaea, hollyhock -n12174521 marsh mallow, white mallow, Althea officinalis -n12174926 poppy mallow -n12175181 fringed poppy mallow, Callirhoe digitata -n12175370 purple poppy mallow, Callirhoe involucrata -n12175598 clustered poppy mallow, Callirhoe triangulata -n12176453 sea island cotton, tree cotton, Gossypium barbadense -n12176709 Levant cotton, Gossypium herbaceum -n12176953 upland cotton, Gossypium hirsutum -n12177129 Peruvian cotton, Gossypium peruvianum -n12177455 wild cotton, Arizona wild cotton, Gossypium thurberi -n12178129 kenaf, kanaf, deccan hemp, bimli, bimli hemp, Indian hemp, Bombay hemp, Hibiscus cannabinus -n12178780 sorrel tree, Hibiscus heterophyllus -n12178896 rose mallow, swamp mallow, common rose mallow, swamp rose mallow, Hibiscus moscheutos -n12179122 cotton rose, Confederate rose, Confederate rose mallow, Hibiscus mutabilis -n12179632 roselle, rozelle, sorrel, red sorrel, Jamaica sorrel, Hibiscus sabdariffa -n12180168 mahoe, majagua, mahagua, balibago, purau, Hibiscus tiliaceus -n12180456 flower-of-an-hour, flowers-of-an-hour, bladder ketmia, black-eyed Susan, Hibiscus trionum -n12180885 lacebark, ribbonwood, houhere, Hoheria populnea -n12181352 wild hollyhock, Iliamna remota, Sphaeralcea remota -n12181612 mountain hollyhock, Iliamna ruvularis, Iliamna acerifolia -n12182049 seashore mallow -n12182276 salt marsh mallow, Kosteletzya virginica -n12183026 chaparral mallow, Malacothamnus fasciculatus, Sphaeralcea fasciculata -n12183452 malope, Malope trifida -n12183816 false mallow -n12184095 waxmallow, wax mallow, sleeping hibiscus -n12184468 glade mallow, Napaea dioica -n12184912 pavonia -n12185254 ribbon tree, ribbonwood, Plagianthus regius, Plagianthus betulinus -n12185859 bush hibiscus, Radyera farragei, Hibiscus farragei -n12186352 Virginia mallow, Sida hermaphrodita -n12186554 Queensland hemp, jellyleaf, Sida rhombifolia -n12186839 Indian mallow, Sida spinosa -n12187247 checkerbloom, wild hollyhock, Sidalcea malviflora -n12187663 globe mallow, false mallow -n12187891 prairie mallow, red false mallow, Sphaeralcea coccinea, Malvastrum coccineum -n12188289 tulipwood tree -n12188635 portia tree, bendy tree, seaside mahoe, Thespesia populnea -n12189429 red silk-cotton tree, simal, Bombax ceiba, Bombax malabarica -n12189779 cream-of-tartar tree, sour gourd, Adansonia gregorii -n12189987 baobab, monkey-bread tree, Adansonia digitata -n12190410 kapok, ceiba tree, silk-cotton tree, white silk-cotton tree, Bombay ceiba, God tree, Ceiba pentandra -n12190869 durian, durion, durian tree, Durio zibethinus -n12191240 Montezuma -n12192132 shaving-brush tree, Pseudobombax ellipticum -n12192877 quandong, quandong tree, Brisbane quandong, silver quandong tree, blue fig, Elaeocarpus grandis -n12193334 quandong, blue fig -n12193665 makomako, New Zealand wine berry, wineberry, Aristotelia serrata, Aristotelia racemosa -n12194147 Jamaican cherry, calabur tree, calabura, silk wood, silkwood, Muntingia calabura -n12194613 breakax, breakaxe, break-axe, Sloanea jamaicensis -n12195391 sterculia -n12195533 Panama tree, Sterculia apetala -n12195734 kalumpang, Java olives, Sterculia foetida -n12196129 bottle-tree, bottle tree -n12196336 flame tree, flame durrajong, Brachychiton acerifolius, Sterculia acerifolia -n12196527 flame tree, broad-leaved bottletree, Brachychiton australis -n12196694 kurrajong, currajong, Brachychiton populneus -n12196954 Queensland bottletree, narrow-leaved bottletree, Brachychiton rupestris, Sterculia rupestris -n12197359 kola, kola nut, kola nut tree, goora nut, Cola acuminata -n12197601 kola nut, cola nut -n12198286 Chinese parasol tree, Chinese parasol, Japanese varnish tree, phoenix tree, Firmiana simplex -n12198793 flannelbush, flannel bush, California beauty -n12199266 screw tree -n12199399 nut-leaved screw tree, Helicteres isora -n12199790 red beech, brown oak, booyong, crow's foot, stave wood, silky elm, Heritiera trifoliolata, Terrietia trifoliolata -n12199982 looking glass tree, Heritiera macrophylla -n12200143 looking-glass plant, Heritiera littoralis -n12200504 honey bell, honeybells, Hermannia verticillata, Mahernia verticillata -n12200905 mayeng, maple-leaved bayur, Pterospermum acerifolium -n12201331 silver tree, Tarrietia argyrodendron -n12201580 cacao, cacao tree, chocolate tree, Theobroma cacao -n12201938 obeche, obechi, arere, samba, Triplochiton scleroxcylon -n12202936 linden, linden tree, basswood, lime, lime tree -n12203529 American basswood, American lime, Tilia americana -n12203699 small-leaved linden, small-leaved lime, Tilia cordata -n12203896 white basswood, cottonwood, Tilia heterophylla -n12204032 Japanese linden, Japanese lime, Tilia japonica -n12204175 silver lime, silver linden, Tilia tomentosa -n12204730 corchorus -n12205460 African hemp, Sparmannia africana -n12205694 herb, herbaceous plant -n12214789 protea -n12215022 honeypot, king protea, Protea cynaroides -n12215210 honeyflower, honey-flower, Protea mellifera -n12215579 banksia -n12215824 honeysuckle, Australian honeysuckle, coast banksia, Banksia integrifolia -n12216215 smoke bush -n12216628 Chilean firebush, Chilean flameflower, Embothrium coccineum -n12216968 Chilean nut, Chile nut, Chile hazel, Chilean hazelnut, Guevina heterophylla, Guevina avellana -n12217453 grevillea -n12217851 red-flowered silky oak, Grevillea banksii -n12218274 silky oak, Grevillea robusta -n12218490 beefwood, Grevillea striata -n12218868 cushion flower, pincushion hakea, Hakea laurina -n12219668 rewa-rewa, New Zealand honeysuckle -n12220019 honeyflower, honey-flower, mountain devil, Lambertia formosa -n12220496 silver tree, Leucadendron argenteum -n12220829 lomatia -n12221191 macadamia, macadamia tree -n12221368 Macadamia integrifolia -n12221522 macadamia nut, macadamia nut tree, Macadamia ternifolia -n12221801 Queensland nut, Macadamia tetraphylla -n12222090 prickly ash, Orites excelsa -n12222493 geebung -n12222900 wheel tree, firewheel tree, Stenocarpus sinuatus -n12223160 scrub beefwood, beefwood, Stenocarpus salignus -n12223569 waratah, Telopea Oreades -n12223764 waratah, Telopea speciosissima -n12224978 casuarina -n12225222 she-oak -n12225349 beefwood -n12225563 Australian pine, Casuarina equisetfolia -n12226932 heath -n12227658 tree heath, briar, brier, Erica arborea -n12227909 briarroot -n12228229 winter heath, spring heath, Erica carnea -n12228387 bell heather, heather bell, fine-leaved heath, Erica cinerea -n12228689 Cornish heath, Erica vagans -n12228886 Spanish heath, Portuguese heath, Erica lusitanica -n12229111 Prince-of-Wales'-heath, Prince of Wales heath, Erica perspicua -n12229651 bog rosemary, moorwort, Andromeda glaucophylla -n12229887 marsh andromeda, common bog rosemary, Andromeda polifolia -n12230540 madrona, madrono, manzanita, Arbutus menziesii -n12230794 strawberry tree, Irish strawberry, Arbutus unedo -n12231192 bearberry -n12231709 alpine bearberry, black bearberry, Arctostaphylos alpina -n12232114 heartleaf manzanita, Arctostaphylos andersonii -n12232280 Parry manzanita, Arctostaphylos manzanita -n12232851 spike heath, Bruckenthalia spiculifolia -n12233249 bryanthus -n12234318 leatherleaf, Chamaedaphne calyculata -n12234669 Connemara heath, St. Dabeoc's heath, Daboecia cantabrica -n12235051 trailing arbutus, mayflower, Epigaea repens -n12235479 creeping snowberry, moxie plum, maidenhair berry, Gaultheria hispidula -n12236160 salal, shallon, Gaultheria shallon -n12236546 huckleberry -n12236768 black huckleberry, Gaylussacia baccata -n12236977 dangleberry, dangle-berry, Gaylussacia frondosa -n12237152 box huckleberry, Gaylussacia brachycera -n12237486 kalmia -n12237641 mountain laurel, wood laurel, American laurel, calico bush, Kalmia latifolia -n12237855 swamp laurel, bog laurel, bog kalmia, Kalmia polifolia -n12238756 trapper's tea, glandular Labrador tea -n12238913 wild rosemary, marsh tea, Ledum palustre -n12239240 sand myrtle, Leiophyllum buxifolium -n12239647 leucothoe -n12239880 dog laurel, dog hobble, switch-ivy, Leucothoe fontanesiana, Leucothoe editorum -n12240150 sweet bells, Leucothoe racemosa -n12240477 alpine azalea, mountain azalea, Loiseleuria procumbens -n12240965 staggerbush, stagger bush, Lyonia mariana -n12241192 maleberry, male berry, privet andromeda, he-huckleberry, Lyonia ligustrina -n12241426 fetterbush, fetter bush, shiny lyonia, Lyonia lucida -n12241880 false azalea, fool's huckleberry, Menziesia ferruginea -n12242123 minniebush, minnie bush, Menziesia pilosa -n12242409 sorrel tree, sourwood, titi, Oxydendrum arboreum -n12242850 mountain heath, Phyllodoce caerulea, Bryanthus taxifolius -n12243109 purple heather, Brewer's mountain heather, Phyllodoce breweri -n12243693 fetterbush, mountain fetterbush, mountain andromeda, Pieris floribunda -n12244153 rhododendron -n12244458 coast rhododendron, Rhododendron californicum -n12244650 rosebay, Rhododendron maxima -n12244819 swamp azalea, swamp honeysuckle, white honeysuckle, Rhododendron viscosum -n12245319 azalea -n12245695 cranberry -n12245885 American cranberry, large cranberry, Vaccinium macrocarpon -n12246037 European cranberry, small cranberry, Vaccinium oxycoccus -n12246232 blueberry, blueberry bush -n12246773 farkleberry, sparkleberry, Vaccinium arboreum -n12246941 low-bush blueberry, low blueberry, Vaccinium angustifolium, Vaccinium pennsylvanicum -n12247202 rabbiteye blueberry, rabbit-eye blueberry, rabbiteye, Vaccinium ashei -n12247407 dwarf bilberry, dwarf blueberry, Vaccinium caespitosum -n12247963 evergreen blueberry, Vaccinium myrsinites -n12248141 evergreen huckleberry, Vaccinium ovatum -n12248359 bilberry, thin-leaved bilberry, mountain blue berry, Viccinium membranaceum -n12248574 bilberry, whortleberry, whinberry, blaeberry, Viccinium myrtillus -n12248780 bog bilberry, bog whortleberry, moor berry, Vaccinium uliginosum alpinum -n12248941 dryland blueberry, dryland berry, Vaccinium pallidum -n12249122 grouseberry, grouse-berry, grouse whortleberry, Vaccinium scoparium -n12249294 deerberry, squaw huckleberry, Vaccinium stamineum -n12249542 cowberry, mountain cranberry, lingonberry, lingenberry, lingberry, foxberry, Vaccinium vitis-idaea -n12251001 diapensia -n12251278 galax, galaxy, wandflower, beetleweed, coltsfoot, Galax urceolata -n12251740 pyxie, pixie, pixy, Pyxidanthera barbulata -n12252168 shortia -n12252383 oconee bells, Shortia galacifolia -n12252866 Australian heath -n12253229 epacris -n12253487 common heath, Epacris impressa -n12253664 common heath, blunt-leaf heath, Epacris obtusifolia -n12253835 Port Jackson heath, Epacris purpurascens -n12254168 native cranberry, groundberry, ground-berry, cranberry heath, Astroloma humifusum, Styphelia humifusum -n12255225 pink fivecorner, Styphelia triflora -n12256112 wintergreen, pyrola -n12256325 false wintergreen, Pyrola americana, Pyrola rotundifolia americana -n12256522 lesser wintergreen, Pyrola minor -n12256708 wild lily of the valley, shinleaf, Pyrola elliptica -n12256920 wild lily of the valley, Pyrola rotundifolia -n12257570 pipsissewa, prince's pine -n12257725 love-in-winter, western prince's pine, Chimaphila umbellata, Chimaphila corymbosa -n12258101 one-flowered wintergreen, one-flowered pyrola, Moneses uniflora, Pyrola uniflora -n12258885 Indian pipe, waxflower, Monotropa uniflora -n12259316 pinesap, false beachdrops, Monotropa hypopithys -n12260799 beech, beech tree -n12261359 common beech, European beech, Fagus sylvatica -n12261571 copper beech, purple beech, Fagus sylvatica atropunicea, Fagus purpurea, Fagus sylvatica purpurea -n12261808 American beech, white beech, red beech, Fagus grandifolia, Fagus americana -n12262018 weeping beech, Fagus pendula, Fagus sylvatica pendula -n12262185 Japanese beech -n12262553 chestnut, chestnut tree -n12263038 American chestnut, American sweet chestnut, Castanea dentata -n12263204 European chestnut, sweet chestnut, Spanish chestnut, Castanea sativa -n12263410 Chinese chestnut, Castanea mollissima -n12263588 Japanese chestnut, Castanea crenata -n12263738 Allegheny chinkapin, eastern chinquapin, chinquapin, dwarf chestnut, Castanea pumila -n12263987 Ozark chinkapin, Ozark chinquapin, chinquapin, Castanea ozarkensis -n12264512 oak chestnut -n12264786 giant chinkapin, golden chinkapin, Chrysolepis chrysophylla, Castanea chrysophylla, Castanopsis chrysophylla -n12265083 dwarf golden chinkapin, Chrysolepis sempervirens -n12265394 tanbark oak, Lithocarpus densiflorus -n12265600 Japanese oak, Lithocarpus glabra, Lithocarpus glaber -n12266217 southern beech, evergreen beech -n12266528 myrtle beech, Nothofagus cuninghamii -n12266644 Coigue, Nothofagus dombeyi -n12266796 New Zealand beech -n12266984 silver beech, Nothofagus menziesii -n12267133 roble beech, Nothofagus obliqua -n12267265 rauli beech, Nothofagus procera -n12267411 black beech, Nothofagus solanderi -n12267534 hard beech, Nothofagus truncata -n12267677 acorn -n12267931 cupule, acorn cup -n12268246 oak, oak tree -n12269241 live oak -n12269406 coast live oak, California live oak, Quercus agrifolia -n12269652 white oak -n12270027 American white oak, Quercus alba -n12270278 Arizona white oak, Quercus arizonica -n12270460 swamp white oak, swamp oak, Quercus bicolor -n12270741 European turkey oak, turkey oak, Quercus cerris -n12270946 canyon oak, canyon live oak, maul oak, iron oak, Quercus chrysolepis -n12271187 scarlet oak, Quercus coccinea -n12271451 jack oak, northern pin oak, Quercus ellipsoidalis -n12271643 red oak -n12271933 southern red oak, swamp red oak, turkey oak, Quercus falcata -n12272239 Oregon white oak, Oregon oak, Garry oak, Quercus garryana -n12272432 holm oak, holm tree, holly-leaved oak, evergreen oak, Quercus ilex -n12272735 bear oak, Quercus ilicifolia -n12272883 shingle oak, laurel oak, Quercus imbricaria -n12273114 bluejack oak, turkey oak, Quercus incana -n12273344 California black oak, Quercus kelloggii -n12273515 American turkey oak, turkey oak, Quercus laevis -n12273768 laurel oak, pin oak, Quercus laurifolia -n12273939 California white oak, valley oak, valley white oak, roble, Quercus lobata -n12274151 overcup oak, Quercus lyrata -n12274358 bur oak, burr oak, mossy-cup oak, mossycup oak, Quercus macrocarpa -n12274630 scrub oak -n12274863 blackjack oak, blackjack, jack oak, Quercus marilandica -n12275131 swamp chestnut oak, Quercus michauxii -n12275317 Japanese oak, Quercus mongolica, Quercus grosseserrata -n12275489 chestnut oak -n12275675 chinquapin oak, chinkapin oak, yellow chestnut oak, Quercus muehlenbergii -n12275888 myrtle oak, seaside scrub oak, Quercus myrtifolia -n12276110 water oak, possum oak, Quercus nigra -n12276314 Nuttall oak, Nuttall's oak, Quercus nuttalli -n12276477 durmast, Quercus petraea, Quercus sessiliflora -n12276628 basket oak, cow oak, Quercus prinus, Quercus montana -n12276872 pin oak, swamp oak, Quercus palustris -n12277150 willow oak, Quercus phellos -n12277334 dwarf chinkapin oak, dwarf chinquapin oak, dwarf oak, Quercus prinoides -n12277578 common oak, English oak, pedunculate oak, Quercus robur -n12277800 northern red oak, Quercus rubra, Quercus borealis -n12278107 Shumard oak, Shumard red oak, Quercus shumardii -n12278371 post oak, box white oak, brash oak, iron oak, Quercus stellata -n12278650 cork oak, Quercus suber -n12278865 Spanish oak, Quercus texana -n12279060 huckleberry oak, Quercus vaccinifolia -n12279293 Chinese cork oak, Quercus variabilis -n12279458 black oak, yellow oak, quercitron, quercitron oak, Quercus velutina -n12279772 southern live oak, Quercus virginiana -n12280060 interior live oak, Quercus wislizenii, Quercus wizlizenii -n12280364 mast -n12281241 birch, birch tree -n12281788 yellow birch, Betula alleghaniensis, Betula leutea -n12281974 American white birch, paper birch, paperbark birch, canoe birch, Betula cordifolia, Betula papyrifera -n12282235 grey birch, gray birch, American grey birch, American gray birch, Betula populifolia -n12282527 silver birch, common birch, European white birch, Betula pendula -n12282737 downy birch, white birch, Betula pubescens -n12282933 black birch, river birch, red birch, Betula nigra -n12283147 sweet birch, cherry birch, black birch, Betula lenta -n12283395 Yukon white birch, Betula neoalaskana -n12283542 swamp birch, water birch, mountain birch, Western paper birch, Western birch, Betula fontinalis -n12283790 Newfoundland dwarf birch, American dwarf birch, Betula glandulosa -n12284262 alder, alder tree -n12284821 common alder, European black alder, Alnus glutinosa, Alnus vulgaris -n12285049 grey alder, gray alder, Alnus incana -n12285195 seaside alder, Alnus maritima -n12285369 white alder, mountain alder, Alnus rhombifolia -n12285512 red alder, Oregon alder, Alnus rubra -n12285705 speckled alder, Alnus rugosa -n12285900 smooth alder, hazel alder, Alnus serrulata -n12286068 green alder, Alnus veridis -n12286197 green alder, Alnus veridis crispa, Alnus crispa -n12286826 hornbeam -n12286988 European hornbeam, Carpinus betulus -n12287195 American hornbeam, Carpinus caroliniana -n12287642 hop hornbeam -n12287836 Old World hop hornbeam, Ostrya carpinifolia -n12288005 Eastern hop hornbeam, ironwood, ironwood tree, Ostrya virginiana -n12288823 hazelnut, hazel, hazelnut tree -n12289310 American hazel, Corylus americana -n12289433 cobnut, filbert, Corylus avellana, Corylus avellana grandis -n12289585 beaked hazelnut, Corylus cornuta -n12290748 centaury -n12290975 rosita, Centaurium calycosum -n12291143 lesser centaury, Centaurium minus -n12291459 seaside centaury -n12291671 slender centaury -n12291959 prairie gentian, tulip gentian, bluebell, Eustoma grandiflorum -n12292463 Persian violet, Exacum affine -n12292877 columbo, American columbo, deer's-ear, deer's-ears, pyramid plant, American gentian -n12293723 gentian -n12294124 gentianella, Gentiana acaulis -n12294331 closed gentian, blind gentian, bottle gentian, Gentiana andrewsii -n12294542 explorer's gentian, Gentiana calycosa -n12294723 closed gentian, blind gentian, Gentiana clausa -n12294871 great yellow gentian, Gentiana lutea -n12295033 marsh gentian, calathian violet, Gentiana pneumonanthe -n12295237 soapwort gentian, Gentiana saponaria -n12295429 striped gentian, Gentiana villosa -n12295796 agueweed, ague weed, five-flowered gentian, stiff gentian, Gentianella quinquefolia, Gentiana quinquefolia -n12296045 felwort, gentianella amarella -n12296432 fringed gentian -n12296735 Gentianopsis crinita, Gentiana crinita -n12296929 Gentianopsis detonsa, Gentiana detonsa -n12297110 Gentianopsid procera, Gentiana procera -n12297280 Gentianopsis thermalis, Gentiana thermalis -n12297507 tufted gentian, Gentianopsis holopetala, Gentiana holopetala -n12297846 spurred gentian -n12298165 sabbatia -n12299640 toothbrush tree, mustard tree, Salvadora persica -n12300840 olive tree -n12301180 olive, European olive tree, Olea europaea -n12301445 olive -n12301613 black maire, Olea cunninghamii -n12301766 white maire, Olea lanceolata -n12302071 fringe tree -n12302248 fringe bush, Chionanthus virginicus -n12302565 forestiera -n12303083 forsythia -n12303462 ash, ash tree -n12304115 white ash, Fraxinus Americana -n12304286 swamp ash, Fraxinus caroliniana -n12304420 flowering ash, Fraxinus cuspidata -n12304703 European ash, common European ash, Fraxinus excelsior -n12304899 Oregon ash, Fraxinus latifolia, Fraxinus oregona -n12305089 black ash, basket ash, brown ash, hoop ash, Fraxinus nigra -n12305293 manna ash, flowering ash, Fraxinus ornus -n12305475 red ash, downy ash, Fraxinus pennsylvanica -n12305654 green ash, Fraxinus pennsylvanica subintegerrima -n12305819 blue ash, Fraxinus quadrangulata -n12305986 mountain ash, Fraxinus texensis -n12306089 pumpkin ash, Fraxinus tomentosa -n12306270 Arizona ash, Fraxinus velutina -n12306717 jasmine -n12306938 primrose jasmine, Jasminum mesnyi -n12307076 winter jasmine, Jasminum nudiflorum -n12307240 common jasmine, true jasmine, jessamine, Jasminum officinale -n12307756 privet -n12308112 Amur privet, Ligustrum amurense -n12308447 Japanese privet, Ligustrum japonicum -n12308907 Ligustrum obtusifolium -n12309277 common privet, Ligustrum vulgare -n12309630 devilwood, American olive, Osmanthus americanus -n12310021 mock privet -n12310349 lilac -n12310638 Himalayan lilac, Syringa emodi -n12311045 Persian lilac, Syringa persica -n12311224 Japanese tree lilac, Syringa reticulata, Syringa amurensis japonica -n12311413 Japanese lilac, Syringa villosa -n12311579 common lilac, Syringa vulgaris -n12312110 bloodwort -n12312728 kangaroo paw, kangaroo's paw, kangaroo's-foot, kangaroo-foot plant, Australian sword lily, Anigozanthus manglesii -n12315060 Virginian witch hazel, Hamamelis virginiana -n12315245 vernal witch hazel, Hamamelis vernalis -n12315598 winter hazel, flowering hazel -n12315999 fothergilla, witch alder -n12316444 liquidambar -n12316572 sweet gum, sweet gum tree, bilsted, red gum, American sweet gum, Liquidambar styraciflua -n12317296 iron tree, iron-tree, ironwood, ironwood tree -n12318378 walnut, walnut tree -n12318782 California black walnut, Juglans californica -n12318965 butternut, butternut tree, white walnut, Juglans cinerea -n12319204 black walnut, black walnut tree, black hickory, Juglans nigra -n12319414 English walnut, English walnut tree, Circassian walnut, Persian walnut, Juglans regia -n12320010 hickory, hickory tree -n12320414 water hickory, bitter pecan, water bitternut, Carya aquatica -n12320627 pignut, pignut hickory, brown hickory, black hickory, Carya glabra -n12320806 bitternut, bitternut hickory, bitter hickory, bitter pignut, swamp hickory, Carya cordiformis -n12321077 pecan, pecan tree, Carya illinoensis, Carya illinoinsis -n12321395 big shellbark, big shellbark hickory, big shagbark, king nut, king nut hickory, Carya laciniosa -n12321669 nutmeg hickory, Carya myristicaeformis, Carya myristiciformis -n12321873 shagbark, shagbark hickory, shellbark, shellbark hickory, Carya ovata -n12322099 mockernut, mockernut hickory, black hickory, white-heart hickory, big-bud hickory, Carya tomentosa -n12322501 wing nut, wing-nut -n12322699 Caucasian walnut, Pterocarya fraxinifolia -n12323665 dhawa, dhava -n12324056 combretum -n12324222 hiccup nut, hiccough nut, Combretum bracteosum -n12324388 bush willow, Combretum appiculatum -n12324558 bush willow, Combretum erythrophyllum -n12324906 button tree, button mangrove, Conocarpus erectus -n12325234 white mangrove, Laguncularia racemosa -n12325787 oleaster -n12327022 water milfoil -n12327528 anchovy pear, anchovy pear tree, Grias cauliflora -n12327846 brazil nut, brazil-nut tree, Bertholletia excelsa -n12328398 loosestrife -n12328567 purple loosestrife, spiked loosestrife, Lythrum salicaria -n12328801 grass poly, hyssop loosestrife, Lythrum hyssopifolia -n12329260 crape myrtle, crepe myrtle, crepe flower, Lagerstroemia indica -n12329473 Queen's crape myrtle, pride-of-India, Lagerstroemia speciosa -n12330239 myrtaceous tree -n12330469 myrtle -n12330587 common myrtle, Myrtus communis -n12330891 bayberry, bay-rum tree, Jamaica bayberry, wild cinnamon, Pimenta acris -n12331066 allspice, allspice tree, pimento tree, Pimenta dioica -n12331263 allspice tree, Pimenta officinalis -n12331655 sour cherry, Eugenia corynantha -n12331788 nakedwood, Eugenia dicrana -n12332030 Surinam cherry, pitanga, Eugenia uniflora -n12332218 rose apple, rose-apple tree, jambosa, Eugenia jambos -n12332555 feijoa, feijoa bush -n12333053 jaboticaba, jaboticaba tree, Myrciaria cauliflora -n12333530 guava, true guava, guava bush, Psidium guajava -n12333771 guava, strawberry guava, yellow cattley guava, Psidium littorale -n12333961 cattley guava, purple strawberry guava, Psidium cattleianum, Psidium littorale longipes -n12334153 Brazilian guava, Psidium guineense -n12334293 gum tree, gum -n12334891 eucalyptus, eucalypt, eucalyptus tree -n12335483 flooded gum -n12335664 mallee -n12335800 stringybark -n12335937 smoothbark -n12336092 red gum, peppermint, peppermint gum, Eucalyptus amygdalina -n12336224 red gum, marri, Eucalyptus calophylla -n12336333 river red gum, river gum, Eucalyptus camaldulensis, Eucalyptus rostrata -n12336586 mountain swamp gum, Eucalyptus camphora -n12336727 snow gum, ghost gum, white ash, Eucalyptus coriacea, Eucalyptus pauciflora -n12336973 alpine ash, mountain oak, Eucalyptus delegatensis -n12337131 white mallee, congoo mallee, Eucalyptus dumosa -n12337246 white stringybark, thin-leaved stringybark, Eucalyptusd eugenioides -n12337391 white mountain ash, Eucalyptus fraxinoides -n12337617 blue gum, fever tree, Eucalyptus globulus -n12337800 rose gum, Eucalypt grandis -n12337922 cider gum, Eucalypt gunnii -n12338034 swamp gum, Eucalypt ovata -n12338146 spotted gum, Eucalyptus maculata -n12338258 lemon-scented gum, Eucalyptus citriodora, Eucalyptus maculata citriodora -n12338454 black mallee, black sally, black gum, Eucalytus stellulata -n12338655 forest red gum, Eucalypt tereticornis -n12338796 mountain ash, Eucalyptus regnans -n12338979 manna gum, Eucalyptus viminalis -n12339526 clove, clove tree, Syzygium aromaticum, Eugenia aromaticum, Eugenia caryophyllatum -n12339831 clove -n12340383 tupelo, tupelo tree -n12340581 water gum, Nyssa aquatica -n12340755 sour gum, black gum, pepperidge, Nyssa sylvatica -n12341542 enchanter's nightshade -n12341931 Circaea lutetiana -n12342299 willowherb -n12342498 fireweed, giant willowherb, rosebay willowherb, wickup, Epilobium angustifolium -n12342852 California fuchsia, humming bird's trumpet, Epilobium canum canum, Zauschneria californica -n12343480 fuchsia -n12343753 lady's-eardrop, ladies'-eardrop, lady's-eardrops, ladies'-eardrops, Fuchsia coccinea -n12344283 evening primrose -n12344483 common evening primrose, German rampion, Oenothera biennis -n12344700 sundrops, Oenothera fruticosa -n12344837 Missouri primrose, Ozark sundrops, Oenothera macrocarpa -n12345280 pomegranate, pomegranate tree, Punica granatum -n12345899 mangrove, Rhizophora mangle -n12346578 daphne -n12346813 garland flower, Daphne cneorum -n12346986 spurge laurel, wood laurel, Daphne laureola -n12347158 mezereon, February daphne, Daphne mezereum -n12349315 Indian rhododendron, Melastoma malabathricum -n12349711 Medinilla magnifica -n12350032 deer grass, meadow beauty -n12350758 canna -n12351091 achira, indian shot, arrowroot, Canna indica, Canna edulis -n12351790 arrowroot, American arrowroot, obedience plant, Maranta arundinaceae -n12352287 banana, banana tree -n12352639 dwarf banana, Musa acuminata -n12352844 Japanese banana, Musa basjoo -n12352990 plantain, plantain tree, Musa paradisiaca -n12353203 edible banana, Musa paradisiaca sapientum -n12353431 abaca, Manila hemp, Musa textilis -n12353754 Abyssinian banana, Ethiopian banana, Ensete ventricosum, Musa ensete -n12355760 ginger -n12356023 common ginger, Canton ginger, stem ginger, Zingiber officinale -n12356395 turmeric, Curcuma longa, Curcuma domestica -n12356960 galangal, Alpinia galanga -n12357485 shellflower, shall-flower, shell ginger, Alpinia Zerumbet, Alpinia speciosa, Languas speciosa -n12357968 grains of paradise, Guinea grains, Guinea pepper, melagueta pepper, Aframomum melegueta -n12358293 cardamom, cardamon, Elettaria cardamomum -n12360108 begonia -n12360534 fibrous-rooted begonia -n12360684 tuberous begonia -n12360817 rhizomatous begonia -n12360958 Christmas begonia, blooming-fool begonia, Begonia cheimantha -n12361135 angel-wing begonia, Begonia cocchinea -n12361560 beefsteak begonia, kidney begonia, Begonia erythrophylla, Begonia feastii -n12361754 star begonia, star-leaf begonia, Begonia heracleifolia -n12361946 rex begonia, king begonia, painted-leaf begonia, beefsteak geranium, Begonia rex -n12362274 wax begonia, Begonia semperflorens -n12362514 Socotra begonia, Begonia socotrana -n12362668 hybrid tuberous begonia, Begonia tuberhybrida -n12363301 dillenia -n12363768 guinea gold vine, guinea flower -n12364604 poon -n12364940 calaba, Santa Maria tree, Calophyllum calaba -n12365158 Maria, Calophyllum longifolium -n12365285 laurelwood, lancewood tree, Calophyllum candidissimum -n12365462 Alexandrian laurel, Calophyllum inophyllum -n12365900 clusia -n12366053 wild fig, Clusia flava -n12366186 waxflower, Clusia insignis -n12366313 pitch apple, strangler fig, Clusia rosea, Clusia major -n12366675 mangosteen, mangosteen tree, Garcinia mangostana -n12366870 gamboge tree, Garcinia hanburyi, Garcinia cambogia, Garcinia gummi-gutta -n12367611 St John's wort -n12368028 common St John's wort, tutsan, Hypericum androsaemum -n12368257 great St John's wort, Hypericum ascyron, Hypericum pyramidatum -n12368451 creeping St John's wort, Hypericum calycinum -n12369066 low St Andrew's cross, Hypericum hypericoides -n12369309 klammath weed, Hypericum perforatum -n12369476 shrubby St John's wort, Hypericum prolificum, Hypericum spathulatum -n12369665 St Peter's wort, Hypericum tetrapterum, Hypericum maculatum -n12369845 marsh St-John's wort, Hypericum virginianum -n12370174 mammee apple, mammee, mamey, mammee tree, Mammea americana -n12370549 rose chestnut, ironwood, ironwood tree, Mesua ferrea -n12371202 bower actinidia, tara vine, Actinidia arguta -n12371439 Chinese gooseberry, kiwi, kiwi vine, Actinidia chinensis, Actinidia deliciosa -n12371704 silvervine, silver vine, Actinidia polygama -n12372233 wild cinnamon, white cinnamon tree, Canella winterana, Canella-alba -n12373100 papaya, papaia, pawpaw, papaya tree, melon tree, Carica papaya -n12373739 souari, souari nut, souari tree, Caryocar nuciferum -n12374418 rockrose, rock rose -n12374705 white-leaved rockrose, Cistus albidus -n12374862 common gum cistus, Cistus ladanifer, Cistus ladanum -n12375769 frostweed, frost-weed, frostwort, Helianthemum canadense, Crocanthemum canadense -n12377198 dipterocarp -n12377494 red lauan, red lauan tree, Shorea teysmanniana -n12378249 governor's plum, governor plum, Madagascar plum, ramontchi, batoko palm, Flacourtia indica -n12378753 kei apple, kei apple bush, Dovyalis caffra -n12378963 ketembilla, kitembilla, kitambilla, ketembilla tree, Ceylon gooseberry, Dovyalis hebecarpa -n12379531 chaulmoogra, chaulmoogra tree, chaulmugra, Hydnocarpus kurzii, Taraktagenos kurzii, Taraktogenos kurzii -n12380761 wild peach, Kiggelaria africana -n12381511 candlewood -n12382233 boojum tree, cirio, Fouquieria columnaris, Idria columnaris -n12382875 bird's-eye bush, Ochna serrulata -n12383737 granadilla, purple granadillo, Passiflora edulis -n12383894 granadilla, sweet granadilla, Passiflora ligularis -n12384037 granadilla, giant granadilla, Passiflora quadrangularis -n12384227 maypop, Passiflora incarnata -n12384375 Jamaica honeysuckle, yellow granadilla, Passiflora laurifolia -n12384569 banana passion fruit, Passiflora mollissima -n12384680 sweet calabash, Passiflora maliformis -n12384839 love-in-a-mist, running pop, wild water lemon, Passiflora foetida -n12385429 reseda -n12385566 mignonette, sweet reseda, Reseda odorata -n12385830 dyer's rocket, dyer's mignonette, weld, Reseda luteola -n12386945 false tamarisk, German tamarisk, Myricaria germanica -n12387103 halophyte -n12387633 viola -n12387839 violet -n12388143 field pansy, heartsease, Viola arvensis -n12388293 American dog violet, Viola conspersa -n12388858 dog violet, heath violet, Viola canina -n12388989 horned violet, tufted pansy, Viola cornuta -n12389130 two-eyed violet, heartsease, Viola ocellata -n12389501 bird's-foot violet, pansy violet, Johnny-jump-up, wood violet, Viola pedata -n12389727 downy yellow violet, Viola pubescens -n12389932 long-spurred violet, Viola rostrata -n12390099 pale violet, striped violet, cream violet, Viola striata -n12390314 hedge violet, wood violet, Viola sylvatica, Viola reichenbachiana -n12392070 nettle -n12392549 stinging nettle, Urtica dioica -n12392765 Roman nettle, Urtica pipulifera -n12393269 ramie, ramee, Chinese silk plant, China grass, Boehmeria nivea -n12394118 wood nettle, Laportea canadensis -n12394328 Australian nettle, Australian nettle tree -n12394638 pellitory-of-the-wall, wall pellitory, pellitory, Parietaria difussa -n12395068 richweed, clearweed, dead nettle, Pilea pumilla -n12395289 artillery plant, Pilea microphylla -n12395463 friendship plant, panamica, panamiga, Pilea involucrata -n12395906 Queensland grass-cloth plant, Pipturus argenteus -n12396091 Pipturus albidus -n12396924 cannabis, hemp -n12397431 Indian hemp, Cannabis indica -n12399132 mulberry, mulberry tree -n12399384 white mulberry, Morus alba -n12399534 black mulberry, Morus nigra -n12399656 red mulberry, Morus rubra -n12399899 osage orange, bow wood, mock orange, Maclura pomifera -n12400489 breadfruit, breadfruit tree, Artocarpus communis, Artocarpus altilis -n12400720 jackfruit, jackfruit tree, Artocarpus heterophyllus -n12400924 marang, marang tree, Artocarpus odoratissima -n12401335 fig tree -n12401684 fig, common fig, common fig tree, Ficus carica -n12401893 caprifig, Ficus carica sylvestris -n12402051 golden fig, Florida strangler fig, strangler fig, wild fig, Ficus aurea -n12402348 banyan, banyan tree, banian, banian tree, Indian banyan, East Indian fig tree, Ficus bengalensis -n12402596 pipal, pipal tree, pipul, peepul, sacred fig, bo tree, Ficus religiosa -n12402840 India-rubber tree, India-rubber plant, India-rubber fig, rubber plant, Assam rubber, Ficus elastica -n12403075 mistletoe fig, mistletoe rubber plant, Ficus diversifolia, Ficus deltoidea -n12403276 Port Jackson fig, rusty rig, little-leaf fig, Botany Bay fig, Ficus rubiginosa -n12403513 sycamore, sycamore fig, mulberry fig, Ficus sycomorus -n12403994 paper mulberry, Broussonetia papyrifera -n12404729 trumpetwood, trumpet-wood, trumpet tree, snake wood, imbauba, Cecropia peltata -n12405714 elm, elm tree -n12406304 winged elm, wing elm, Ulmus alata -n12406488 American elm, white elm, water elm, rock elm, Ulmus americana -n12406715 smooth-leaved elm, European field elm, Ulmus carpinifolia -n12406902 cedar elm, Ulmus crassifolia -n12407079 witch elm, wych elm, Ulmus glabra -n12407222 Dutch elm, Ulmus hollandica -n12407396 Huntingdon elm, Ulmus hollandica vegetata -n12407545 water elm, Ulmus laevis -n12407715 Chinese elm, Ulmus parvifolia -n12407890 English elm, European elm, Ulmus procera -n12408077 Siberian elm, Chinese elm, dwarf elm, Ulmus pumila -n12408280 slippery elm, red elm, Ulmus rubra -n12408466 Jersey elm, guernsey elm, wheately elm, Ulmus sarniensis, Ulmus campestris sarniensis, Ulmus campestris wheatleyi -n12408717 September elm, red elm, Ulmus serotina -n12408873 rock elm, Ulmus thomasii -n12409231 hackberry, nettle tree -n12409470 European hackberry, Mediterranean hackberry, Celtis australis -n12409651 American hackberry, Celtis occidentalis -n12409840 sugarberry, Celtis laevigata -n12411461 iridaceous plant -n12412355 bearded iris -n12412606 beardless iris -n12412987 orrisroot, orris -n12413165 dwarf iris, Iris cristata -n12413301 Dutch iris, Iris filifolia -n12413419 Florentine iris, orris, Iris germanica florentina, Iris florentina -n12413642 stinking iris, gladdon, gladdon iris, stinking gladwyn, roast beef plant, Iris foetidissima -n12413880 German iris, Iris germanica -n12414035 Japanese iris, Iris kaempferi -n12414159 German iris, Iris kochii -n12414329 Dalmatian iris, Iris pallida -n12414449 Persian iris, Iris persica -n12414818 Dutch iris, Iris tingitana -n12414932 dwarf iris, vernal iris, Iris verna -n12415595 Spanish iris, xiphium iris, Iris xiphium -n12416073 blackberry-lily, leopard lily, Belamcanda chinensis -n12416423 crocus -n12416703 saffron, saffron crocus, Crocus sativus -n12417836 corn lily -n12418221 blue-eyed grass -n12418507 wandflower, Sparaxis tricolor -n12419037 amaryllis -n12419878 salsilla, Bomarea edulis -n12420124 salsilla, Bomarea salsilla -n12420535 blood lily -n12420722 Cape tulip, Haemanthus coccineus -n12421137 hippeastrum, Hippeastrum puniceum -n12421467 narcissus -n12421683 daffodil, Narcissus pseudonarcissus -n12421917 jonquil, Narcissus jonquilla -n12422129 jonquil -n12422559 Jacobean lily, Aztec lily, Strekelia formosissima -n12425281 liliaceous plant -n12426623 mountain lily, Lilium auratum -n12426749 Canada lily, wild yellow lily, meadow lily, wild meadow lily, Lilium canadense -n12427184 tiger lily, leopard lily, pine lily, Lilium catesbaei -n12427391 Columbia tiger lily, Oregon lily, Lilium columbianum -n12427566 tiger lily, devil lily, kentan, Lilium lancifolium -n12427757 Easter lily, Bermuda lily, white trumpet lily, Lilium longiflorum -n12427946 coast lily, Lilium maritinum -n12428076 Turk's-cap, martagon, Lilium martagon -n12428242 Michigan lily, Lilium michiganense -n12428412 leopard lily, panther lily, Lilium pardalinum -n12428747 Turk's-cap, Turk's cap-lily, Lilium superbum -n12429352 African lily, African tulip, blue African lily, Agapanthus africanus -n12430198 colicroot, colic root, crow corn, star grass, unicorn root -n12430471 ague root, ague grass, Aletris farinosa -n12430675 yellow colicroot, Aletris aurea -n12431434 alliaceous plant -n12432069 Hooker's onion, Allium acuminatum -n12432356 wild leek, Levant garlic, kurrat, Allium ampeloprasum -n12432574 Canada garlic, meadow leek, rose leek, Allium canadense -n12432707 keeled garlic, Allium carinatum -n12433081 onion -n12433178 shallot, eschalot, multiplier onion, Allium cepa aggregatum, Allium ascalonicum -n12433769 nodding onion, nodding wild onion, lady's leek, Allium cernuum -n12433952 Welsh onion, Japanese leek, Allium fistulosum -n12434106 red-skinned onion, Allium haematochiton -n12434483 daffodil garlic, flowering onion, Naples garlic, Allium neopolitanum -n12434634 few-flowered leek, Allium paradoxum -n12434775 garlic, Allium sativum -n12434985 sand leek, giant garlic, Spanish garlic, rocambole, Allium scorodoprasum -n12435152 chives, chive, cive, schnittlaugh, Allium schoenoprasum -n12435486 crow garlic, false garlic, field garlic, stag's garlic, wild garlic, Allium vineale -n12435649 wild garlic, wood garlic, Ramsons, Allium ursinum -n12435777 garlic chive, Chinese chive, Oriental garlic, Allium tuberosum -n12435965 round-headed leek, Allium sphaerocephalum -n12436090 three-cornered leek, triquetrous leek, Allium triquetrum -n12436907 cape aloe, Aloe ferox -n12437513 kniphofia, tritoma, flame flower, flame-flower, flameflower -n12437769 poker plant, Kniphofia uvaria -n12437930 red-hot poker, Kniphofia praecox -n12439154 fly poison, Amianthum muscaetoxicum, Amianthum muscitoxicum -n12439830 amber lily, Anthericum torreyi -n12441183 asparagus, edible asparagus, Asparagus officinales -n12441390 asparagus fern, Asparagus setaceous, Asparagus plumosus -n12441552 smilax, Asparagus asparagoides -n12441958 asphodel -n12442548 Jacob's rod -n12443323 aspidistra, cast-iron plant, bar-room plant, Aspidistra elatio -n12443736 coral drops, Bessera elegans -n12444095 Christmas bells -n12444898 climbing onion, Bowiea volubilis -n12446200 mariposa, mariposa tulip, mariposa lily -n12446519 globe lily, fairy lantern -n12446737 cat's-ear -n12446908 white globe lily, white fairy lantern, Calochortus albus -n12447121 yellow globe lily, golden fairy lantern, Calochortus amabilis -n12447346 rose globe lily, Calochortus amoenus -n12447581 star tulip, elegant cat's ears, Calochortus elegans -n12447891 desert mariposa tulip, Calochortus kennedyi -n12448136 yellow mariposa tulip, Calochortus luteus -n12448361 sagebrush mariposa tulip, Calochortus macrocarpus -n12448700 sego lily, Calochortus nuttallii -n12449296 camas, camass, quamash, camosh, camash -n12449526 common camas, Camassia quamash -n12449784 Leichtlin's camas, Camassia leichtlinii -n12449934 wild hyacinth, indigo squill, Camassia scilloides -n12450344 dogtooth violet, dogtooth, dog's-tooth violet -n12450607 white dogtooth violet, white dog's-tooth violet, blonde lilian, Erythronium albidum -n12450840 yellow adder's tongue, trout lily, amberbell, Erythronium americanum -n12451070 European dogtooth, Erythronium dens-canis -n12451240 fawn lily, Erythronium californicum -n12451399 glacier lily, snow lily, Erythronium grandiflorum -n12451566 avalanche lily, Erythronium montanum -n12451915 fritillary, checkered lily -n12452256 mission bells, rice-grain fritillary, Fritillaria affinis, Fritillaria lanceolata, Fritillaria mutica -n12452480 mission bells, black fritillary, Fritillaria biflora -n12452673 stink bell, Fritillaria agrestis -n12452836 crown imperial, Fritillaria imperialis -n12453018 white fritillary, Fritillaria liliaceae -n12453186 snake's head fritillary, guinea-hen flower, checkered daffodil, leper lily, Fritillaria meleagris -n12453714 adobe lily, pink fritillary, Fritillaria pluriflora -n12453857 scarlet fritillary, Fritillaria recurva -n12454159 tulip -n12454436 dwarf tulip, Tulipa armena, Tulipa suaveolens -n12454556 lady tulip, candlestick tulip, Tulipa clusiana -n12454705 Tulipa gesneriana -n12454793 cottage tulip -n12454949 Darwin tulip -n12455950 gloriosa, glory lily, climbing lily, creeping lily, Gloriosa superba -n12457091 lemon lily, Hemerocallis lilio-asphodelus, Hemerocallis flava -n12458550 common hyacinth, Hyacinthus orientalis -n12458713 Roman hyacinth, Hyacinthus orientalis albulus -n12458874 summer hyacinth, cape hyacinth, Hyacinthus candicans, Galtonia candicans -n12459629 star-of-Bethlehem -n12460146 bath asparagus, Prussian asparagus, Ornithogalum pyrenaicum -n12460697 grape hyacinth -n12460957 common grape hyacinth, Muscari neglectum -n12461109 tassel hyacinth, Muscari comosum -n12461466 scilla, squill -n12461673 spring squill, Scilla verna, sea onion -n12462032 false asphodel -n12462221 Scotch asphodel, Tofieldia pusilla -n12462582 sea squill, sea onion, squill, Urginea maritima -n12462805 squill -n12463134 butcher's broom, Ruscus aculeatus -n12463743 bog asphodel -n12463975 European bog asphodel, Narthecium ossifragum -n12464128 American bog asphodel, Narthecium americanum -n12464476 hellebore, false hellebore -n12464649 white hellebore, American hellebore, Indian poke, bugbane, Veratrum viride -n12465557 squaw grass, bear grass, Xerophyllum tenax -n12466727 death camas, zigadene -n12467018 alkali grass, Zigadenus elegans -n12467197 white camas, Zigadenus glaucus -n12467433 poison camas, Zigadenus nuttalli -n12467592 grassy death camas, Zigadenus venenosus, Zigadenus venenosus gramineus -n12468545 prairie wake-robin, prairie trillium, Trillium recurvatum -n12468719 dwarf-white trillium, snow trillium, early wake-robin -n12469517 herb Paris, Paris quadrifolia -n12470092 sarsaparilla -n12470512 bullbrier, greenbrier, catbrier, horse brier, horse-brier, brier, briar, Smilax rotundifolia -n12470907 rough bindweed, Smilax aspera -n12472024 clintonia, Clinton's lily -n12473608 false lily of the valley, Maianthemum canadense -n12473840 false lily of the valley, Maianthemum bifolium -n12474167 Solomon's-seal -n12474418 great Solomon's-seal, Polygonatum biflorum, Polygonatum commutatum -n12475035 bellwort, merry bells, wild oats -n12475242 strawflower, cornflower, Uvularia grandiflora -n12475774 pia, Indian arrowroot, Tacca leontopetaloides, Tacca pinnatifida -n12476510 agave, century plant, American aloe -n12477163 American agave, Agave americana -n12477401 sisal, Agave sisalana -n12477583 maguey, cantala, Agave cantala -n12477747 maguey, Agave atrovirens -n12477983 Agave tequilana -n12478768 cabbage tree, grass tree, Cordyline australis -n12479537 dracaena -n12480456 tuberose, Polianthes tuberosa -n12480895 sansevieria, bowstring hemp -n12481150 African bowstring hemp, African hemp, Sansevieria guineensis -n12481289 Ceylon bowstring hemp, Sansevieria zeylanica -n12481458 mother-in-law's tongue, snake plant, Sansevieria trifasciata -n12482437 Spanish bayonet, Yucca aloifolia -n12482668 Spanish bayonet, Yucca baccata -n12482893 Joshua tree, Yucca brevifolia -n12483282 soapweed, soap-weed, soap tree, Yucca elata -n12483427 Adam's needle, Adam's needle-and-thread, spoonleaf yucca, needle palm, Yucca filamentosa -n12483625 bear grass, Yucca glauca -n12483841 Spanish dagger, Yucca gloriosa -n12484244 Our Lord's candle, Yucca whipplei -n12484784 water shamrock, buckbean, bogbean, bog myrtle, marsh trefoil, Menyanthes trifoliata -n12485653 butterfly bush, buddleia -n12485981 yellow jasmine, yellow jessamine, Carolina jasmine, evening trumpet flower, Gelsemium sempervirens -n12486574 flax -n12487058 calabar bean, ordeal bean -n12488454 bonduc, bonduc tree, Caesalpinia bonduc, Caesalpinia bonducella -n12488709 divi-divi, Caesalpinia coriaria -n12489046 Mysore thorn, Caesalpinia decapetala, Caesalpinia sepiaria -n12489676 brazilian ironwood, Caesalpinia ferrea -n12489815 bird of paradise, poinciana, Caesalpinia gilliesii, Poinciana gilliesii -n12490490 shingle tree, Acrocarpus fraxinifolius -n12491017 mountain ebony, orchid tree, Bauhinia variegata -n12491435 msasa, Brachystegia speciformis -n12491826 cassia -n12492106 golden shower tree, drumstick tree, purging cassia, pudding pipe tree, canafistola, canafistula, Cassia fistula -n12492460 pink shower, pink shower tree, horse cassia, Cassia grandis -n12492682 rainbow shower, Cassia javonica -n12492900 horse cassia, Cassia roxburghii, Cassia marginata -n12493208 carob, carob tree, carob bean tree, algarroba, Ceratonia siliqua -n12493426 carob, carob bean, algarroba bean, algarroba, locust bean, locust pod -n12493868 paloverde -n12494794 royal poinciana, flamboyant, flame tree, peacock flower, Delonix regia, Poinciana regia -n12495146 locust tree, locust -n12495670 water locust, swamp locust, Gleditsia aquatica -n12495895 honey locust, Gleditsia triacanthos -n12496427 Kentucky coffee tree, bonduc, chicot, Gymnocladus dioica -n12496949 logwood, logwood tree, campeachy, bloodwood tree, Haematoxylum campechianum -n12497669 Jerusalem thorn, horsebean, Parkinsonia aculeata -n12498055 palo verde, Parkinsonia florida, Cercidium floridum -n12498457 Dalmatian laburnum, Petteria ramentacea, Cytisus ramentaceus -n12499163 senna -n12499757 avaram, tanner's cassia, Senna auriculata, Cassia auriculata -n12499979 Alexandria senna, Alexandrian senna, true senna, tinnevelly senna, Indian senna, Senna alexandrina, Cassia acutifolia, Cassia augustifolia -n12500309 wild senna, Senna marilandica, Cassia marilandica -n12500518 sicklepod, Senna obtusifolia, Cassia tora -n12500751 coffee senna, mogdad coffee, styptic weed, stinking weed, Senna occidentalis, Cassia occidentalis -n12501202 tamarind, tamarind tree, tamarindo, Tamarindus indica -n12504570 false indigo, bastard indigo, Amorpha californica -n12504783 false indigo, bastard indigo, Amorpha fruticosa -n12505253 hog peanut, wild peanut, Amphicarpaea bracteata, Amphicarpa bracteata -n12506181 angelim, andelmin -n12506341 cabbage bark, cabbage-bark tree, cabbage tree, Andira inermis -n12506991 kidney vetch, Anthyllis vulneraria -n12507379 groundnut, groundnut vine, Indian potato, potato bean, wild bean, Apios americana, Apios tuberosa -n12507823 rooibos, Aspalathus linearis, Aspalathus cedcarbergensis -n12508309 milk vetch, milk-vetch -n12508618 alpine milk vetch, Astragalus alpinus -n12508762 purple milk vetch, Astragalus danicus -n12509109 camwood, African sandalwood, Baphia nitida -n12509476 wild indigo, false indigo -n12509665 blue false indigo, Baptisia australis -n12509821 white false indigo, Baptisia lactea -n12509993 indigo broom, horsefly weed, rattle weed, Baptisia tinctoria -n12510343 dhak, dak, palas, Butea frondosa, Butea monosperma -n12510774 pigeon pea, pigeon-pea plant, cajan pea, catjang pea, red gram, dhal, dahl, Cajanus cajan -n12511488 sword bean, Canavalia gladiata -n12511856 pea tree, caragana -n12512095 Siberian pea tree, Caragana arborescens -n12512294 Chinese pea tree, Caragana sinica -n12512674 Moreton Bay chestnut, Australian chestnut -n12513172 butterfly pea, Centrosema virginianum -n12513613 Judas tree, love tree, Circis siliquastrum -n12513933 redbud, Cercis canadensis -n12514138 western redbud, California redbud, Cercis occidentalis -n12514592 tagasaste, Chamaecytisus palmensis, Cytesis proliferus -n12514992 weeping tree broom -n12515393 flame pea -n12515711 chickpea, chickpea plant, Egyptian pea, Cicer arietinum -n12515925 chickpea, garbanzo -n12516165 Kentucky yellowwood, gopherwood, Cladrastis lutea, Cladrastis kentukea -n12516584 glory pea, clianthus -n12516828 desert pea, Sturt pea, Sturt's desert pea, Clianthus formosus, Clianthus speciosus -n12517077 parrot's beak, parrot's bill, Clianthus puniceus -n12517445 butterfly pea, Clitoria mariana -n12517642 blue pea, butterfly pea, Clitoria turnatea -n12518013 telegraph plant, semaphore plant, Codariocalyx motorius, Desmodium motorium, Desmodium gyrans -n12518481 bladder senna, Colutea arborescens -n12519089 axseed, crown vetch, Coronilla varia -n12519563 crotalaria, rattlebox -n12520406 guar, cluster bean, Cyamopsis tetragonolobus, Cyamopsis psoraloides -n12521186 white broom, white Spanish broom, Cytisus albus, Cytisus multiflorus -n12521394 common broom, Scotch broom, green broom, Cytisus scoparius -n12522188 rosewood, rosewood tree -n12522678 Indian blackwood, East Indian rosewood, East India rosewood, Indian rosewood, Dalbergia latifolia -n12522894 sissoo, sissu, sisham, Dalbergia sissoo -n12523141 kingwood, kingwood tree, Dalbergia cearensis -n12523475 Brazilian rosewood, caviuna wood, jacaranda, Dalbergia nigra -n12523850 cocobolo, Dalbergia retusa -n12524188 blackwood, blackwood tree -n12525168 bitter pea -n12525513 derris -n12525753 derris root, tuba root, Derris elliptica -n12526178 prairie mimosa, prickle-weed, Desmanthus ilinoensis -n12526516 tick trefoil, beggar lice, beggar's lice -n12526754 beggarweed, Desmodium tortuosum, Desmodium purpureum -n12527081 Australian pea, Dipogon lignosus, Dolichos lignosus -n12527738 coral tree, erythrina -n12528109 kaffir boom, Cape kafferboom, Erythrina caffra -n12528382 coral bean tree, Erythrina corallodendrum -n12528549 ceibo, crybaby tree, cry-baby tree, common coral tree, Erythrina crista-galli -n12528768 kaffir boom, Transvaal kafferboom, Erythrina lysistemon -n12528974 Indian coral tree, Erythrina variegata, Erythrina Indica -n12529220 cork tree, Erythrina vespertilio -n12529500 goat's rue, goat rue, Galega officinalis -n12529905 poison bush, poison pea, gastrolobium -n12530629 Spanish broom, Spanish gorse, Genista hispanica -n12530818 woodwaxen, dyer's greenweed, dyer's-broom, dyeweed, greenweed, whin, woadwaxen, Genista tinctoria -n12531328 chanar, chanal, Geoffroea decorticans -n12531727 gliricidia -n12532564 soy, soybean, soya bean -n12532886 licorice, liquorice, Glycyrrhiza glabra -n12533190 wild licorice, wild liquorice, American licorice, American liquorice, Glycyrrhiza lepidota -n12533437 licorice root -n12534208 Western Australia coral pea, Hardenbergia comnptoniana -n12534625 sweet vetch, Hedysarum boreale -n12534862 French honeysuckle, sulla, Hedysarum coronarium -n12536291 anil, Indigofera suffruticosa, Indigofera anil -n12537253 scarlet runner, running postman, Kennedia prostrata -n12537569 hyacinth bean, bonavist, Indian bean, Egyptian bean, Lablab purpureus, Dolichos lablab -n12538209 Scotch laburnum, Alpine golden chain, Laburnum alpinum -n12539074 vetchling -n12539306 wild pea -n12539832 everlasting pea -n12540250 beach pea, sea pea, Lathyrus maritimus, Lathyrus japonicus -n12540647 grass vetch, grass vetchling, Lathyrus nissolia -n12540966 marsh pea, Lathyrus palustris -n12541157 common vetchling, meadow pea, yellow vetchling, Lathyrus pratensis -n12541403 grass pea, Indian pea, khesari, Lathyrus sativus -n12542043 Tangier pea, Tangier peavine, Lalthyrus tingitanus -n12542240 heath pea, earth-nut pea, earthnut pea, tuberous vetch, Lathyrus tuberosus -n12543186 bicolor lespediza, ezo-yama-hagi, Lespedeza bicolor -n12543455 japanese clover, japan clover, jap clover, Lespedeza striata -n12543639 Korean lespedeza, Lespedeza stipulacea -n12543826 sericea lespedeza, Lespedeza sericea, Lespedeza cuneata -n12544240 lentil, lentil plant, Lens culinaris -n12544539 lentil -n12545232 prairie bird's-foot trefoil, compass plant, prairie lotus, prairie trefoil, Lotus americanus -n12545635 bird's foot trefoil, bird's foot clover, babies' slippers, bacon and eggs, Lotus corniculatus -n12545865 winged pea, asparagus pea, Lotus tetragonolobus -n12546183 lupine, lupin -n12546420 white lupine, field lupine, wolf bean, Egyptian lupine, Lupinus albus -n12546617 tree lupine, Lupinus arboreus -n12546962 wild lupine, sundial lupine, Indian beet, old-maid's bonnet, Lupinus perennis -n12547215 bluebonnet, buffalo clover, Texas bluebonnet, Lupinus subcarnosus -n12547503 Texas bluebonnet, Lupinus texensis -n12548280 medic, medick, trefoil -n12548564 moon trefoil, Medicago arborea -n12548804 sickle alfalfa, sickle lucerne, sickle medick, Medicago falcata -n12549005 Calvary clover, Medicago intertexta, Medicago echinus -n12549192 black medick, hop clover, yellow trefoil, nonesuch clover, Medicago lupulina -n12549420 alfalfa, lucerne, Medicago sativa -n12549799 millettia -n12550210 mucuna -n12550408 cowage, velvet bean, Bengal bean, Benghal bean, Florida bean, Mucuna pruriens utilis, Mucuna deeringiana, Mucuna aterrima, Stizolobium deeringiana -n12551173 tolu tree, tolu balsam tree, Myroxylon balsamum, Myroxylon toluiferum -n12551457 Peruvian balsam, Myroxylon pereirae, Myroxylon balsamum pereirae -n12552309 sainfoin, sanfoin, holy clover, esparcet, Onobrychis viciifolia, Onobrychis viciaefolia -n12552893 restharrow, rest-harrow, Ononis repens -n12553742 bead tree, jumby bean, jumby tree, Ormosia monosperma -n12554029 jumby bead, jumbie bead, Ormosia coarctata -n12554526 locoweed, crazyweed, crazy weed -n12554729 purple locoweed, purple loco, Oxytropis lambertii -n12554911 tumbleweed -n12555255 yam bean, Pachyrhizus erosus -n12555859 shamrock pea, Parochetus communis -n12556656 pole bean -n12557064 kidney bean, frijol, frijole -n12557438 haricot -n12557556 wax bean -n12557681 scarlet runner, scarlet runner bean, Dutch case-knife bean, runner bean, Phaseolus coccineus, Phaseolus multiflorus -n12558230 lima bean, lima bean plant, Phaseolus limensis -n12558425 sieva bean, butter bean, butter-bean plant, lima bean, Phaseolus lunatus -n12558680 tepary bean, Phaseolus acutifolius latifolius -n12559044 chaparral pea, stingaree-bush, Pickeringia montana -n12559518 Jamaica dogwood, fish fuddle, Piscidia piscipula, Piscidia erythrina -n12560282 pea -n12560621 garden pea -n12560775 edible-pod pea, edible-podded pea, Pisum sativum macrocarpon -n12561169 sugar snap pea, snap pea -n12561309 field pea, field-pea plant, Austrian winter pea, Pisum sativum arvense, Pisum arvense -n12561594 field pea -n12562141 common flat pea, native holly, Playlobium obtusangulum -n12562577 quira -n12562785 roble, Platymiscium trinitatis -n12563045 Panama redwood tree, Panama redwood, Platymiscium pinnatum -n12563702 Indian beech, Pongamia glabra -n12564083 winged bean, winged pea, goa bean, goa bean vine, Manila bean, Psophocarpus tetragonolobus -n12564613 breadroot, Indian breadroot, pomme blanche, pomme de prairie, Psoralea esculenta -n12565102 bloodwood tree, kiaat, Pterocarpus angolensis -n12565912 kino, Pterocarpus marsupium -n12566331 red sandalwood, red sanders, red sanderswood, red saunders, Pterocarpus santalinus -n12566954 kudzu, kudzu vine, Pueraria lobata -n12567950 bristly locust, rose acacia, moss locust, Robinia hispida -n12568186 black locust, yellow locust, Robinia pseudoacacia -n12568649 clammy locust, Robinia viscosa -n12569037 carib wood, Sabinea carinalis -n12569616 Colorado River hemp, Sesbania exaltata -n12569851 scarlet wisteria tree, vegetable hummingbird, Sesbania grandiflora -n12570394 Japanese pagoda tree, Chinese scholartree, Chinese scholar tree, Sophora japonica, Sophora sinensis -n12570703 mescal bean, coral bean, frijolito, frijolillo, Sophora secundiflora -n12570972 kowhai, Sophora tetraptera -n12571781 jade vine, emerald creeper, Strongylodon macrobotrys -n12572546 hoary pea -n12572759 bastard indigo, Tephrosia purpurea -n12572858 catgut, goat's rue, wild sweet pea, Tephrosia virginiana -n12573256 bush pea -n12573474 false lupine, golden pea, yellow pea, Thermopsis macrophylla -n12573647 Carolina lupine, Thermopsis villosa -n12573911 tipu, tipu tree, yellow jacaranda, pride of Bolivia -n12574320 bird's foot trefoil, Trigonella ornithopodioides -n12574470 fenugreek, Greek clover, Trigonella foenumgraecum -n12574866 gorse, furze, whin, Irish gorse, Ulex europaeus -n12575322 vetch -n12575812 tufted vetch, bird vetch, Calnada pea, Vicia cracca -n12576323 broad bean, fava bean, horsebean -n12576451 bitter betch, Vicia orobus -n12576695 bush vetch, Vicia sepium -n12577362 moth bean, Vigna aconitifolia, Phaseolus aconitifolius -n12577895 snailflower, snail-flower, snail flower, snail bean, corkscrew flower, Vigna caracalla, Phaseolus caracalla -n12578255 mung, mung bean, green gram, golden gram, Vigna radiata, Phaseolus aureus -n12578626 cowpea, cowpea plant, black-eyed pea, Vigna unguiculata, Vigna sinensis -n12578916 cowpea, black-eyed pea -n12579038 asparagus bean, yard-long bean, Vigna unguiculata sesquipedalis, Vigna sesquipedalis -n12579404 swamp oak, Viminaria juncea, Viminaria denudata -n12579822 keurboom, Virgilia capensis, Virgilia oroboides -n12580012 keurboom, Virgilia divaricata -n12580654 Japanese wistaria, Wisteria floribunda -n12580786 Chinese wistaria, Wisteria chinensis -n12580896 American wistaria, American wisteria, Wisteria frutescens -n12581110 silky wisteria, Wisteria venusta -n12582231 palm, palm tree -n12582665 sago palm -n12582846 feather palm -n12583126 fan palm -n12583401 palmetto -n12583681 coyol, coyol palm, Acrocomia vinifera -n12583855 grugru, gri-gri, grugru palm, macamba, Acrocomia aculeata -n12584191 areca -n12584365 betel palm, Areca catechu -n12584715 sugar palm, gomuti, gomuti palm, Arenga pinnata -n12585137 piassava palm, pissaba palm, Bahia piassava, bahia coquilla, Attalea funifera -n12585373 coquilla nut -n12585629 palmyra, palmyra palm, toddy palm, wine palm, lontar, longar palm, Borassus flabellifer -n12586298 calamus -n12586499 rattan, rattan palm, Calamus rotang -n12586725 lawyer cane, Calamus australis -n12586989 fishtail palm -n12587132 wine palm, jaggery palm, kitul, kittul, kitul tree, toddy palm, Caryota urens -n12587487 wax palm, Ceroxylon andicola, Ceroxylon alpinum -n12587803 coconut, coconut palm, coco palm, coco, cocoa palm, coconut tree, Cocos nucifera -n12588320 carnauba, carnauba palm, wax palm, Copernicia prunifera, Copernicia cerifera -n12588780 caranday, caranda, caranda palm, wax palm, Copernicia australis, Copernicia alba -n12589142 corozo, corozo palm -n12589458 gebang palm, Corypha utan, Corypha gebanga -n12589687 latanier, latanier palm -n12589841 talipot, talipot palm, Corypha umbraculifera -n12590232 oil palm -n12590499 African oil palm, Elaeis guineensis -n12590600 American oil palm, Elaeis oleifera -n12590715 palm nut, palm kernel -n12591017 cabbage palm, Euterpe oleracea -n12591351 cabbage palm, cabbage tree, Livistona australis -n12591702 true sago palm, Metroxylon sagu -n12592058 nipa palm, Nipa fruticans -n12592544 babassu, babassu palm, coco de macao, Orbignya phalerata, Orbignya spesiosa, Orbignya martiana -n12592839 babassu nut -n12593122 cohune palm, Orbignya cohune, cohune -n12593341 cohune nut -n12593994 date palm, Phoenix dactylifera -n12594324 ivory palm, ivory-nut palm, ivory plant, Phytelephas macrocarpa -n12594989 raffia palm, Raffia farinifera, Raffia ruffia -n12595699 bamboo palm, Raffia vinifera -n12595964 lady palm -n12596148 miniature fan palm, bamboo palm, fern rhapis, Rhapis excelsa -n12596345 reed rhapis, slender lady palm, Rhapis humilis -n12596709 royal palm, Roystonea regia -n12596849 cabbage palm, Roystonea oleracea -n12597134 cabbage palmetto, cabbage palm, Sabal palmetto -n12597466 saw palmetto, scrub palmetto, Serenoa repens -n12597798 thatch palm, thatch tree, silver thatch, broom palm, Thrinax parviflora -n12598027 key palm, silvertop palmetto, silver thatch, Thrinax microcarpa, Thrinax morrisii, Thrinax keyensis -n12599185 English plantain, narrow-leaved plantain, ribgrass, ribwort, ripple-grass, buckthorn, Plantago lanceolata -n12599435 broad-leaved plantain, common plantain, white-man's foot, whiteman's foot, cart-track plant, Plantago major -n12599661 hoary plantain, Plantago media -n12599874 fleawort, psyllium, Spanish psyllium, Plantago psyllium -n12600095 rugel's plantain, broad-leaved plantain, Plantago rugelii -n12600267 hoary plantain, Plantago virginica -n12601494 buckwheat, Polygonum fagopyrum, Fagopyrum esculentum -n12601805 prince's-feather, princess feather, kiss-me-over-the-garden-gate, prince's-plume, Polygonum orientale -n12602262 eriogonum -n12602434 umbrella plant, Eriogonum allenii -n12602612 wild buckwheat, California buckwheat, Erigonum fasciculatum -n12602980 rhubarb, rhubarb plant -n12603273 Himalayan rhubarb, Indian rhubarb, red-veined pie plant, Rheum australe, Rheum emodi -n12603449 pie plant, garden rhubarb, Rheum cultorum, Rheum rhabarbarum, Rheum rhaponticum -n12603672 Chinese rhubarb, Rheum palmatum -n12604228 sour dock, garden sorrel, Rumex acetosa -n12604460 sheep sorrel, sheep's sorrel, Rumex acetosella -n12604639 bitter dock, broad-leaved dock, yellow dock, Rumex obtusifolius -n12604845 French sorrel, garden sorrel, Rumex scutatus -n12605683 yellow-eyed grass -n12606438 commelina -n12606545 spiderwort, dayflower -n12607456 pineapple, pineapple plant, Ananas comosus -n12609379 pipewort, Eriocaulon aquaticum -n12610328 water hyacinth, water orchid, Eichhornia crassipes, Eichhornia spesiosa -n12610740 water star grass, mud plantain, Heteranthera dubia -n12611640 naiad, water nymph -n12612170 water plantain, Alisma plantago-aquatica -n12612811 narrow-leaved water plantain -n12613706 hydrilla, Hydrilla verticillata -n12614096 American frogbit, Limnodium spongia -n12614477 waterweed -n12614625 Canadian pondweed, Elodea canadensis -n12615232 tape grass, eelgrass, wild celery, Vallisneria spiralis -n12615710 pondweed -n12616248 curled leaf pondweed, curly pondweed, Potamogeton crispus -n12616630 loddon pondweed, Potamogeton nodosus, Potamogeton americanus -n12616996 frog's lettuce -n12617559 arrow grass, Triglochin maritima -n12618146 horned pondweed, Zannichellia palustris -n12618727 eelgrass, grass wrack, sea wrack, Zostera marina -n12620196 rose, rosebush -n12620546 hip, rose hip, rosehip -n12620969 banksia rose, Rosa banksia -n12621410 damask rose, summer damask rose, Rosa damascena -n12621619 sweetbrier, sweetbriar, brier, briar, eglantine, Rosa eglanteria -n12621945 Cherokee rose, Rosa laevigata -n12622297 musk rose, Rosa moschata -n12622875 agrimonia, agrimony -n12623077 harvest-lice, Agrimonia eupatoria -n12623211 fragrant agrimony, Agrimonia procera -n12623818 alderleaf Juneberry, alder-leaved serviceberry, Amelanchier alnifolia -n12624381 flowering quince -n12624568 japonica, maule's quince, Chaenomeles japonica -n12625003 coco plum, coco plum tree, cocoa plum, icaco, Chrysobalanus icaco -n12625383 cotoneaster -n12625670 Cotoneaster dammeri -n12625823 Cotoneaster horizontalis -n12626674 parsley haw, parsley-leaved thorn, Crataegus apiifolia, Crataegus marshallii -n12626878 scarlet haw, Crataegus biltmoreana -n12627119 blackthorn, pear haw, pear hawthorn, Crataegus calpodendron, Crataegus tomentosa -n12627347 cockspur thorn, cockspur hawthorn, Crataegus crus-galli -n12627526 mayhaw, summer haw, Crataegus aestivalis -n12628356 red haw, downy haw, Crataegus mollis, Crataegus coccinea mollis -n12628705 red haw, Crataegus pedicellata, Crataegus coccinea -n12628986 quince, quince bush, Cydonia oblonga -n12629305 mountain avens, Dryas octopetala -n12629666 loquat, loquat tree, Japanese medlar, Japanese plum, Eriobotrya japonica -n12630763 beach strawberry, Chilean strawberry, Fragaria chiloensis -n12630999 Virginia strawberry, scarlet strawberry, Fragaria virginiana -n12631331 avens -n12631637 yellow avens, Geum alleppicum strictum, Geum strictum -n12631932 yellow avens, Geum macrophyllum -n12632335 prairie smoke, purple avens, Geum triflorum -n12632733 bennet, white avens, Geum virginianum -n12633061 toyon, tollon, Christmasberry, Christmas berry, Heteromeles arbutifolia, Photinia arbutifolia -n12633638 apple tree -n12633994 apple, orchard apple tree, Malus pumila -n12634211 wild apple, crab apple, crabapple -n12634429 crab apple, crabapple, cultivated crab apple -n12634734 Siberian crab, Siberian crab apple, cherry apple, cherry crab, Malus baccata -n12634986 wild crab, Malus sylvestris -n12635151 American crab apple, garland crab, Malus coronaria -n12635359 Oregon crab apple, Malus fusca -n12635532 Southern crab apple, flowering crab, Malus angustifolia -n12635744 Iowa crab, Iowa crab apple, prairie crab, western crab apple, Malus ioensis -n12635955 Bechtel crab, flowering crab -n12636224 medlar, medlar tree, Mespilus germanica -n12636885 cinquefoil, five-finger -n12637123 silverweed, goose-tansy, goose grass, Potentilla anserina -n12637485 salad burnet, burnet bloodwort, pimpernel, Poterium sanguisorba -n12638218 plum, plum tree -n12638556 wild plum, wild plum tree -n12638753 Allegheny plum, Alleghany plum, sloe, Prunus alleghaniensis -n12638964 American red plum, August plum, goose plum, Prunus americana -n12639168 chickasaw plum, hog plum, hog plum bush, Prunus angustifolia -n12639376 beach plum, beach plum bush, Prunus maritima -n12639584 common plum, Prunus domestica -n12639736 bullace, Prunus insititia -n12639910 damson plum, damson plum tree, Prunus domestica insititia -n12640081 big-tree plum, Prunus mexicana -n12640284 Canada plum, Prunus nigra -n12640435 plumcot, plumcot tree -n12640607 apricot, apricot tree -n12640839 Japanese apricot, mei, Prunus mume -n12641007 common apricot, Prunus armeniaca -n12641180 purple apricot, black apricot, Prunus dasycarpa -n12641413 cherry, cherry tree -n12641931 wild cherry, wild cherry tree -n12642090 wild cherry -n12642200 sweet cherry, Prunus avium -n12642435 heart cherry, oxheart, oxheart cherry -n12642600 gean, mazzard, mazzard cherry -n12642964 capulin, capulin tree, Prunus capuli -n12643113 cherry laurel, laurel cherry, mock orange, wild orange, Prunus caroliniana -n12643313 cherry plum, myrobalan, myrobalan plum, Prunus cerasifera -n12643473 sour cherry, sour cherry tree, Prunus cerasus -n12643688 amarelle, Prunus cerasus caproniana -n12643877 morello, Prunus cerasus austera -n12644283 marasca -n12644902 almond tree -n12645174 almond, sweet almond, Prunus dulcis, Prunus amygdalus, Amygdalus communis -n12645530 bitter almond, Prunus dulcis amara, Amygdalus communis amara -n12646072 jordan almond -n12646197 dwarf flowering almond, Prunus glandulosa -n12646397 holly-leaved cherry, holly-leaf cherry, evergreen cherry, islay, Prunus ilicifolia -n12646605 fuji, fuji cherry, Prunus incisa -n12646740 flowering almond, oriental bush cherry, Prunus japonica -n12646950 cherry laurel, laurel cherry, Prunus laurocerasus -n12647231 Catalina cherry, Prunus lyonii -n12647376 bird cherry, bird cherry tree -n12647560 hagberry tree, European bird cherry, common bird cherry, Prunus padus -n12647787 hagberry -n12647893 pin cherry, Prunus pensylvanica -n12648045 peach, peach tree, Prunus persica -n12648196 nectarine, nectarine tree, Prunus persica nectarina -n12648424 sand cherry, Prunus pumila, Prunus pumilla susquehanae, Prunus susquehanae, Prunus cuneata -n12648693 Japanese plum, Prunus salicina -n12648888 black cherry, black cherry tree, rum cherry, Prunus serotina -n12649065 flowering cherry -n12649317 oriental cherry, Japanese cherry, Japanese flowering cherry, Prunus serrulata -n12649539 Japanese flowering cherry, Prunus sieboldii -n12649866 Sierra plum, Pacific plum, Prunus subcordata -n12650038 rosebud cherry, winter flowering cherry, Prunus subhirtella -n12650229 Russian almond, dwarf Russian almond, Prunus tenella -n12650379 flowering almond, Prunus triloba -n12650556 chokecherry, chokecherry tree, Prunus virginiana -n12650805 chokecherry -n12650915 western chokecherry, Prunus virginiana demissa, Prunus demissa -n12651229 Pyracantha, pyracanth, fire thorn, firethorn -n12651611 pear, pear tree, Pyrus communis -n12651821 fruit tree -n12653218 bramble bush -n12653436 lawyerbush, lawyer bush, bush lawyer, Rubus cissoides, Rubus australis -n12653633 stone bramble, Rubus saxatilis -n12654227 sand blackberry, Rubus cuneifolius -n12654857 boysenberry, boysenberry bush -n12655062 loganberry, Rubus loganobaccus, Rubus ursinus loganobaccus -n12655245 American dewberry, Rubus canadensis -n12655351 Northern dewberry, American dewberry, Rubus flagellaris -n12655498 Southern dewberry, Rubus trivialis -n12655605 swamp dewberry, swamp blackberry, Rubus hispidus -n12655726 European dewberry, Rubus caesius -n12655869 raspberry, raspberry bush -n12656369 wild raspberry, European raspberry, framboise, Rubus idaeus -n12656528 American raspberry, Rubus strigosus, Rubus idaeus strigosus -n12656685 black raspberry, blackcap, blackcap raspberry, thimbleberry, Rubus occidentalis -n12656909 salmonberry, Rubus spectabilis -n12657082 salmonberry, salmon berry, thimbleberry, Rubus parviflorus -n12657755 wineberry, Rubus phoenicolasius -n12658118 mountain ash -n12658308 rowan, rowan tree, European mountain ash, Sorbus aucuparia -n12658481 rowanberry -n12658603 American mountain ash, Sorbus americana -n12658715 Western mountain ash, Sorbus sitchensis -n12658846 service tree, sorb apple, sorb apple tree, Sorbus domestica -n12659064 wild service tree, Sorbus torminalis -n12659356 spirea, spiraea -n12659539 bridal wreath, bridal-wreath, Saint Peter's wreath, St. Peter's wreath, Spiraea prunifolia -n12660601 madderwort, rubiaceous plant -n12661045 Indian madder, munjeet, Rubia cordifolia -n12661227 madder, Rubia tinctorum -n12661538 woodruff -n12662074 dagame, lemonwood tree, Calycophyllum candidissimum -n12662379 blolly, West Indian snowberry, Chiococca alba -n12662772 coffee, coffee tree -n12663023 Arabian coffee, Coffea arabica -n12663254 Liberian coffee, Coffea liberica -n12663359 robusta coffee, Rio Nunez coffee, Coffea robusta, Coffea canephora -n12663804 cinchona, chinchona -n12664005 Cartagena bark, Cinchona cordifolia, Cinchona lancifolia -n12664187 calisaya, Cinchona officinalis, Cinchona ledgeriana, Cinchona calisaya -n12664469 cinchona tree, Cinchona pubescens -n12664710 cinchona, cinchona bark, Peruvian bark, Jesuit's bark -n12665048 bedstraw -n12665271 sweet woodruff, waldmeister, woodruff, fragrant bedstraw, Galium odoratum, Asperula odorata -n12665659 Northern bedstraw, Northern snow bedstraw, Galium boreale -n12665857 yellow bedstraw, yellow cleavers, Our Lady's bedstraw, Galium verum -n12666050 wild licorice, Galium lanceolatum -n12666159 cleavers, clivers, goose grass, catchweed, spring cleavers, Galium aparine -n12666369 wild madder, white madder, white bedstraw, infant's-breath, false baby's breath, Galium mollugo -n12666965 cape jasmine, cape jessamine, Gardenia jasminoides, Gardenia augusta -n12667406 genipa -n12667582 genipap fruit, jagua, marmalade box, Genipa Americana -n12667964 hamelia -n12668131 scarlet bush, scarlet hamelia, coloradillo, Hamelia patens, Hamelia erecta -n12669803 lemonwood, lemon-wood, lemonwood tree, lemon-wood tree, Psychotria capensis -n12670334 negro peach, Sarcocephalus latifolius, Sarcocephalus esculentus -n12670758 wild medlar, wild medlar tree, medlar, Vangueria infausta -n12670962 Spanish tamarind, Vangueria madagascariensis -n12671651 abelia -n12672289 bush honeysuckle, Diervilla sessilifolia -n12673588 American twinflower, Linnaea borealis americana -n12674120 honeysuckle -n12674685 American fly honeysuckle, fly honeysuckle, Lonicera canadensis -n12674895 Italian honeysuckle, Italian woodbine, Lonicera caprifolium -n12675299 yellow honeysuckle, Lonicera flava -n12675515 hairy honeysuckle, Lonicera hirsuta -n12675876 Japanese honeysuckle, Lonicera japonica -n12676134 Hall's honeysuckle, Lonicera japonica halliana -n12676370 Morrow's honeysuckle, Lonicera morrowii -n12676534 woodbine, Lonicera periclymenum -n12676703 trumpet honeysuckle, coral honeysuckle, trumpet flower, trumpet vine, Lonicera sempervirens -n12677120 European fly honeysuckle, European honeysuckle, Lonicera xylosteum -n12677331 swamp fly honeysuckle -n12677612 snowberry, common snowberry, waxberry, Symphoricarpos alba -n12677841 coralberry, Indian currant, Symphoricarpos orbiculatus -n12678794 blue elder, blue elderberry, Sambucus caerulea -n12679023 dwarf elder, danewort, Sambucus ebulus -n12679432 American red elder, red-berried elder, stinking elder, Sambucus pubens -n12679593 European red elder, red-berried elder, Sambucus racemosa -n12679876 feverroot, horse gentian, tinker's root, wild coffee, Triostium perfoliatum -n12680402 cranberry bush, cranberry tree, American cranberry bush, highbush cranberry, Viburnum trilobum -n12680652 wayfaring tree, twist wood, twistwood, Viburnum lantana -n12680864 guelder rose, European cranberrybush, European cranberry bush, crampbark, cranberry tree, Viburnum opulus -n12681376 arrow wood, Viburnum recognitum -n12681579 black haw, Viburnum prunifolium -n12681893 weigela, Weigela florida -n12682411 teasel, teazel, teasle -n12682668 common teasel, Dipsacus fullonum -n12682882 fuller's teasel, Dipsacus sativus -n12683096 wild teasel, Dipsacus sylvestris -n12683407 scabious, scabiosa -n12683571 sweet scabious, pincushion flower, mournful widow, Scabiosa atropurpurea -n12683791 field scabious, Scabiosa arvensis -n12684379 jewelweed, lady's earrings, orange balsam, celandine, touch-me-not, Impatiens capensis -n12685431 geranium -n12685831 cranesbill, crane's bill -n12686077 wild geranium, spotted cranesbill, Geranium maculatum -n12686274 meadow cranesbill, Geranium pratense -n12686496 Richardson's geranium, Geranium richardsonii -n12686676 herb robert, herbs robert, herb roberts, Geranium robertianum -n12686877 sticky geranium, Geranium viscosissimum -n12687044 dove's foot geranium, Geranium molle -n12687462 rose geranium, sweet-scented geranium, Pelargonium graveolens -n12687698 fish geranium, bedding geranium, zonal pelargonium, Pelargonium hortorum -n12687957 ivy geranium, ivy-leaved geranium, hanging geranium, Pelargonium peltatum -n12688187 apple geranium, nutmeg geranium, Pelargonium odoratissimum -n12688372 lemon geranium, Pelargonium limoneum -n12688716 storksbill, heron's bill -n12689305 musk clover, muskus grass, white-stemmed filaree, Erodium moschatum -n12690653 incense tree -n12691428 elephant tree, Bursera microphylla -n12691661 gumbo-limbo, Bursera simaruba -n12692024 Boswellia carteri -n12692160 salai, Boswellia serrata -n12692521 balm of gilead, Commiphora meccanensis -n12692714 myrrh tree, Commiphora myrrha -n12693244 Protium heptaphyllum -n12693352 Protium guianense -n12693865 water starwort -n12694486 barbados cherry, acerola, Surinam cherry, West Indian cherry, Malpighia glabra -n12695144 mahogany, mahogany tree -n12695975 chinaberry, chinaberry tree, China tree, Persian lilac, pride-of-India, azederach, azedarach, Melia azederach, Melia azedarach -n12696492 neem, neem tree, nim tree, margosa, arishth, Azadirachta indica, Melia Azadirachta -n12696830 neem seed -n12697152 Spanish cedar, Spanish cedar tree, Cedrela odorata -n12697514 satinwood, satinwood tree, Chloroxylon swietenia -n12698027 African scented mahogany, cedar mahogany, sapele mahogany, Entandrophragma cylindricum -n12698435 silver ash -n12698598 native beech, flindosa, flindosy, Flindersia australis -n12698774 bunji-bunji, Flindersia schottiana -n12699031 African mahogany -n12699301 lanseh tree, langsat, langset, Lansium domesticum -n12699922 true mahogany, Cuban mahogany, Dominican mahogany, Swietinia mahogani -n12700088 Honduras mahogany, Swietinia macrophylla -n12700357 Philippine mahogany, Philippine cedar, kalantas, Toona calantas, Cedrela calantas -n12702124 caracolito, Ruptiliocarpon caracolito -n12703190 common wood sorrel, cuckoo bread, shamrock, Oxalis acetosella -n12703383 Bermuda buttercup, English-weed, Oxalis pes-caprae, Oxalis cernua -n12703557 creeping oxalis, creeping wood sorrel, Oxalis corniculata -n12703716 goatsfoot, goat's foot, Oxalis caprina -n12703856 violet wood sorrel, Oxalis violacea -n12704041 oca, oka, Oxalis tuberosa, Oxalis crenata -n12704343 carambola, carambola tree, Averrhoa carambola -n12704513 bilimbi, Averrhoa bilimbi -n12705013 milkwort -n12705220 senega, Polygala alba -n12705458 orange milkwort, yellow milkwort, candyweed, yellow bachelor's button, Polygala lutea -n12705698 flowering wintergreen, gaywings, bird-on-the-wing, fringed polygala, Polygala paucifolia -n12705978 Seneca snakeroot, Seneka snakeroot, senga root, senega root, senega snakeroot, Polygala senega -n12706410 common milkwort, gand flower, Polygala vulgaris -n12707199 rue, herb of grace, Ruta graveolens -n12707781 citrus, citrus tree -n12708293 orange, orange tree -n12708654 sour orange, Seville orange, bitter orange, bitter orange tree, bigarade, marmalade orange, Citrus aurantium -n12708941 bergamot, bergamot orange, Citrus bergamia -n12709103 pomelo, pomelo tree, pummelo, shaddock, Citrus maxima, Citrus grandis, Citrus decumana -n12709349 citron, citron tree, Citrus medica -n12709688 grapefruit, Citrus paradisi -n12709901 mandarin, mandarin orange, mandarin orange tree, Citrus reticulata -n12710295 tangerine, tangerine tree -n12710415 clementine, clementine tree -n12710577 satsuma, satsuma tree -n12710693 sweet orange, sweet orange tree, Citrus sinensis -n12710917 temple orange, temple orange tree, tangor, king orange, Citrus nobilis -n12711182 tangelo, tangelo tree, ugli fruit, Citrus tangelo -n12711398 rangpur, rangpur lime, lemanderin, Citrus limonia -n12711596 lemon, lemon tree, Citrus limon -n12711817 sweet lemon, sweet lime, Citrus limetta -n12711984 lime, lime tree, Citrus aurantifolia -n12712320 citrange, citrange tree, Citroncirus webberi -n12712626 fraxinella, dittany, burning bush, gas plant, Dictamnus alba -n12713063 kumquat, cumquat, kumquat tree -n12713358 marumi, marumi kumquat, round kumquat, Fortunella japonica -n12713521 nagami, nagami kumquat, oval kumquat, Fortunella margarita -n12713866 cork tree, Phellodendron amurense -n12714254 trifoliate orange, trifoliata, wild orange, Poncirus trifoliata -n12714755 prickly ash -n12714949 toothache tree, sea ash, Zanthoxylum americanum, Zanthoxylum fraxineum -n12715195 Hercules'-club, Hercules'-clubs, Hercules-club, Zanthoxylum clava-herculis -n12715914 bitterwood tree -n12716400 marupa, Simarouba amara -n12716594 paradise tree, bitterwood, Simarouba glauca -n12717072 ailanthus -n12717224 tree of heaven, tree of the gods, Ailanthus altissima -n12717644 wild mango, dika, wild mango tree, Irvingia gabonensis -n12718074 pepper tree, Kirkia wilmsii -n12718483 Jamaica quassia, bitterwood, Picrasma excelsa, Picrasma excelsum -n12718995 quassia, bitterwood, Quassia amara -n12719684 nasturtium -n12719944 garden nasturtium, Indian cress, Tropaeolum majus -n12720200 bush nasturtium, Tropaeolum minus -n12720354 canarybird flower, canarybird vine, canary creeper, Tropaeolum peregrinum -n12721122 bean caper, Syrian bean caper, Zygophyllum fabago -n12721477 palo santo, Bulnesia sarmienti -n12722071 lignum vitae, Guaiacum officinale -n12723062 creosote bush, coville, hediondilla, Larrea tridentata -n12723610 caltrop, devil's weed, Tribulus terestris -n12724942 willow, willow tree -n12725521 osier -n12725738 white willow, Huntingdon willow, Salix alba -n12725940 silver willow, silky willow, Salix alba sericea, Salix sericea -n12726159 golden willow, Salix alba vitellina, Salix vitellina -n12726357 cricket-bat willow, Salix alba caerulea -n12726528 arctic willow, Salix arctica -n12726670 weeping willow, Babylonian weeping willow, Salix babylonica -n12726902 Wisconsin weeping willow, Salix pendulina, Salix blanda, Salix pendulina blanda -n12727101 pussy willow, Salix discolor -n12727301 sallow -n12727518 goat willow, florist's willow, pussy willow, Salix caprea -n12727729 peachleaf willow, peach-leaved willow, almond-leaves willow, Salix amygdaloides -n12727960 almond willow, black Hollander, Salix triandra, Salix amygdalina -n12728164 hoary willow, sage willow, Salix candida -n12728322 crack willow, brittle willow, snap willow, Salix fragilis -n12728508 prairie willow, Salix humilis -n12728656 dwarf willow, Salix herbacea -n12728864 grey willow, gray willow, Salix cinerea -n12729023 arroyo willow, Salix lasiolepis -n12729164 shining willow, Salix lucida -n12729315 swamp willow, black willow, Salix nigra -n12729521 bay willow, laurel willow, Salix pentandra -n12729729 purple willow, red willow, red osier, basket willow, purple osier, Salix purpurea -n12729950 balsam willow, Salix pyrifolia -n12730143 creeping willow, Salix repens -n12730370 Sitka willow, silky willow, Salix sitchensis -n12730544 dwarf grey willow, dwarf gray willow, sage willow, Salix tristis -n12730776 bearberry willow, Salix uva-ursi -n12731029 common osier, hemp willow, velvet osier, Salix viminalis -n12731401 poplar, poplar tree -n12731835 balsam poplar, hackmatack, tacamahac, Populus balsamifera -n12732009 white poplar, white aspen, abele, aspen poplar, silver-leaved poplar, Populus alba -n12732252 grey poplar, gray poplar, Populus canescens -n12732491 black poplar, Populus nigra -n12732605 Lombardy poplar, Populus nigra italica -n12732756 cottonwood -n12732966 Eastern cottonwood, necklace poplar, Populus deltoides -n12733218 black cottonwood, Western balsam poplar, Populus trichocarpa -n12733428 swamp cottonwood, black cottonwood, downy poplar, swamp poplar, Populus heterophylla -n12733647 aspen -n12733870 quaking aspen, European quaking aspen, Populus tremula -n12734070 American quaking aspen, American aspen, Populus tremuloides -n12734215 Canadian aspen, bigtooth aspen, bigtoothed aspen, big-toothed aspen, large-toothed aspen, large tooth aspen, Populus grandidentata -n12735160 sandalwood tree, true sandalwood, Santalum album -n12736603 quandong, quandang, quandong tree, Eucarya acuminata, Fusanus acuminatus -n12736999 rabbitwood, buffalo nut, Pyrularia pubera -n12737383 Loranthaceae, family Loranthaceae, mistletoe family -n12737898 mistletoe, Loranthus europaeus -n12738259 American mistletoe, Arceuthobium pusillum -n12739332 mistletoe, Viscum album, Old World mistletoe -n12739966 American mistletoe, Phoradendron serotinum, Phoradendron flavescens -n12740967 aalii -n12741222 soapberry, soapberry tree -n12741586 wild China tree, Sapindus drumondii, Sapindus marginatus -n12741792 China tree, false dogwood, jaboncillo, chinaberry, Sapindus saponaria -n12742290 akee, akee tree, Blighia sapida -n12742741 soapberry vine -n12742878 heartseed, Cardiospermum grandiflorum -n12743009 balloon vine, heart pea, Cardiospermum halicacabum -n12743352 longan, lungen, longanberry, Dimocarpus longan, Euphorbia litchi, Nephelium longana -n12743823 harpullia -n12743976 harpulla, Harpullia cupanioides -n12744142 Moreton Bay tulipwood, Harpullia pendula -n12744387 litchi, lichee, litchi tree, Litchi chinensis, Nephelium litchi -n12744850 Spanish lime, Spanish lime tree, honey berry, mamoncillo, genip, ginep, Melicocca bijuga, Melicocca bijugatus -n12745386 rambutan, rambotan, rambutan tree, Nephelium lappaceum -n12745564 pulasan, pulassan, pulasan tree, Nephelium mutabile -n12746884 pachysandra -n12747120 Allegheny spurge, Allegheny mountain spurge, Pachysandra procumbens -n12748248 bittersweet, American bittersweet, climbing bittersweet, false bittersweet, staff vine, waxwork, shrubby bittersweet, Celastrus scandens -n12749049 spindle tree, spindleberry, spindleberry tree -n12749456 winged spindle tree, Euonymous alatus -n12749679 wahoo, burning bush, Euonymus atropurpureus -n12749852 strawberry bush, wahoo, Euonymus americanus -n12750076 evergreen bittersweet, Euonymus fortunei radicans, Euonymus radicans vegetus -n12750767 cyrilla, leatherwood, white titi, Cyrilla racemiflora -n12751172 titi, buckwheat tree, Cliftonia monophylla -n12751675 crowberry -n12752205 maple -n12753007 silver maple, Acer saccharinum -n12753245 sugar maple, rock maple, Acer saccharum -n12753573 red maple, scarlet maple, swamp maple, Acer rubrum -n12753762 moosewood, moose-wood, striped maple, striped dogwood, goosefoot maple, Acer pennsylvanicum -n12754003 Oregon maple, big-leaf maple, Acer macrophyllum -n12754174 dwarf maple, Rocky-mountain maple, Acer glabrum -n12754311 mountain maple, mountain alder, Acer spicatum -n12754468 vine maple, Acer circinatum -n12754648 hedge maple, field maple, Acer campestre -n12754781 Norway maple, Acer platanoides -n12754981 sycamore, great maple, scottish maple, Acer pseudoplatanus -n12755225 box elder, ash-leaved maple, Acer negundo -n12755387 California box elder, Acer negundo Californicum -n12755559 pointed-leaf maple, Acer argutum -n12755727 Japanese maple, full moon maple, Acer japonicum -n12755876 Japanese maple, Acer palmatum -n12756457 holly -n12757115 Chinese holly, Ilex cornuta -n12757303 bearberry, possum haw, winterberry, Ilex decidua -n12757458 inkberry, gallberry, gall-berry, evergreen winterberry, Ilex glabra -n12757668 mate, Paraguay tea, Ilex paraguariensis -n12757816 American holly, Christmas holly -n12757930 low gallberry holly -n12758014 tall gallberry holly -n12758099 yaupon holly -n12758176 deciduous holly -n12758250 juneberry holly -n12758325 largeleaf holly -n12758399 Geogia holly -n12758471 common winterberry holly -n12758555 smooth winterberry holly -n12759273 cashew, cashew tree, Anacardium occidentale -n12759668 goncalo alves, Astronium fraxinifolium -n12760539 Venetian sumac, wig tree, Cotinus coggygria -n12760875 laurel sumac, Malosma laurina, Rhus laurina -n12761284 mango, mango tree, Mangifera indica -n12761702 pistachio, Pistacia vera, pistachio tree -n12761905 terebinth, Pistacia terebinthus -n12762049 mastic, mastic tree, lentisk, Pistacia lentiscus -n12762405 Australian sumac, Rhodosphaera rhodanthema, Rhus rhodanthema -n12762896 sumac, sumach, shumac -n12763529 smooth sumac, scarlet sumac, vinegar tree, Rhus glabra -n12764008 sugar-bush, sugar sumac, Rhus ovata -n12764202 staghorn sumac, velvet sumac, Virginian sumac, vinegar tree, Rhus typhina -n12764507 squawbush, squaw-bush, skunkbush, Rhus trilobata -n12764978 aroeira blanca, Schinus chichita -n12765115 pepper tree, molle, Peruvian mastic tree, Schinus molle -n12765402 Brazilian pepper tree, Schinus terebinthifolius -n12765846 hog plum, yellow mombin, yellow mombin tree, Spondias mombin -n12766043 mombin, mombin tree, jocote, Spondias purpurea -n12766595 poison ash, poison dogwood, poison sumac, Toxicodendron vernix, Rhus vernix -n12766869 poison ivy, markweed, poison mercury, poison oak, Toxicodendron radicans, Rhus radicans -n12767208 western poison oak, Toxicodendron diversilobum, Rhus diversiloba -n12767423 eastern poison oak, Toxicodendron quercifolium, Rhus quercifolia, Rhus toxicodenedron -n12767648 varnish tree, lacquer tree, Chinese lacquer tree, Japanese lacquer tree, Japanese varnish tree, Japanese sumac, Toxicodendron vernicifluum, Rhus verniciflua -n12768369 horse chestnut, buckeye, Aesculus hippocastanum -n12768682 buckeye, horse chestnut, conker -n12768809 sweet buckeye -n12768933 Ohio buckeye -n12769065 dwarf buckeye, bottlebrush buckeye -n12769219 red buckeye -n12769318 particolored buckeye -n12770529 ebony, ebony tree, Diospyros ebenum -n12770892 marblewood, marble-wood, Andaman marble, Diospyros kurzii -n12771085 marblewood, marble-wood -n12771192 persimmon, persimmon tree -n12771390 Japanese persimmon, kaki, Diospyros kaki -n12771597 American persimmon, possumwood, Diospyros virginiana -n12771890 date plum, Diospyros lotus -n12772753 buckthorn -n12772908 southern buckthorn, shittimwood, shittim, mock orange, Bumelia lycioides -n12773142 false buckthorn, chittamwood, chittimwood, shittimwood, black haw, Bumelia lanuginosa -n12773651 star apple, caimito, Chrysophyllum cainito -n12773917 satinleaf, satin leaf, caimitillo, damson plum, Chrysophyllum oliviforme -n12774299 balata, balata tree, beefwood, bully tree, Manilkara bidentata -n12774641 sapodilla, sapodilla tree, Manilkara zapota, Achras zapota -n12775070 gutta-percha tree, Palaquium gutta -n12775393 gutta-percha tree -n12775717 canistel, canistel tree, Pouteria campechiana nervosa -n12775919 marmalade tree, mammee, sapote, Pouteria zapota, Calocarpum zapota -n12776558 sweetleaf, Symplocus tinctoria -n12776774 Asiatic sweetleaf, sapphire berry, Symplocus paniculata -n12777436 styrax -n12777680 snowbell, Styrax obassia -n12777778 Japanese snowbell, Styrax japonicum -n12777892 Texas snowbell, Texas snowbells, Styrax texana -n12778398 silver-bell tree, silverbell tree, snowdrop tree, opossum wood, Halesia carolina, Halesia tetraptera -n12778605 carnivorous plant -n12779603 pitcher plant -n12779851 common pitcher plant, huntsman's cup, huntsman's cups, Sarracenia purpurea -n12780325 hooded pitcher plant, Sarracenia minor -n12780563 huntsman's horn, huntsman's horns, yellow trumpet, yellow pitcher plant, trumpets, Sarracenia flava -n12781940 tropical pitcher plant -n12782530 sundew, sundew plant, daily dew -n12782915 Venus's flytrap, Venus's flytraps, Dionaea muscipula -n12783316 waterwheel plant, Aldrovanda vesiculosa -n12783730 Drosophyllum lusitanicum -n12784371 roridula -n12784889 Australian pitcher plant, Cephalotus follicularis -n12785724 sedum -n12785889 stonecrop -n12786273 rose-root, midsummer-men, Sedum rosea -n12786464 orpine, orpin, livelong, live-forever, Sedum telephium -n12786836 pinwheel, Aeonium haworthii -n12787364 Christmas bush, Christmas tree, Ceratopetalum gummiferum -n12788854 hortensia, Hydrangea macrophylla hortensis -n12789054 fall-blooming hydrangea, Hydrangea paniculata -n12789554 carpenteria, Carpenteria californica -n12789977 decumary, Decumaria barbata, Decumaria barbara -n12790430 deutzia -n12791064 philadelphus -n12791329 mock orange, syringa, Philadelphus coronarius -n12793015 saxifrage, breakstone, rockfoil -n12793284 yellow mountain saxifrage, Saxifraga aizoides -n12793494 meadow saxifrage, fair-maids-of-France, Saxifraga granulata -n12793695 mossy saxifrage, Saxifraga hypnoides -n12793886 western saxifrage, Saxifraga occidentalis -n12794135 purple saxifrage, Saxifraga oppositifolia -n12794367 star saxifrage, starry saxifrage, Saxifraga stellaris -n12794568 strawberry geranium, strawberry saxifrage, mother-of-thousands, Saxifraga stolonifera, Saxifraga sarmentosam -n12794985 astilbe -n12795209 false goatsbeard, Astilbe biternata -n12795352 dwarf astilbe, Astilbe chinensis pumila -n12795555 spirea, spiraea, Astilbe japonica -n12796022 bergenia -n12796385 coast boykinia, Boykinia elata, Boykinia occidentalis -n12796849 golden saxifrage, golden spleen -n12797368 umbrella plant, Indian rhubarb, Darmera peltata, Peltiphyllum peltatum -n12797860 bridal wreath, bridal-wreath, Francoa ramosa -n12798284 alumroot, alumbloom -n12798910 coralbells, Heuchera sanguinea -n12799269 leatherleaf saxifrage, Leptarrhena pyrolifolia -n12799776 woodland star, Lithophragma affine, Lithophragma affinis, Tellima affinis -n12800049 prairie star, Lithophragma parviflorum -n12800586 miterwort, mitrewort, bishop's cap -n12801072 five-point bishop's cap, Mitella pentandra -n12801520 parnassia, grass-of-Parnassus -n12801781 bog star, Parnassia palustris -n12801966 fringed grass of Parnassus, Parnassia fimbriata -n12803226 false alumroot, fringe cups, Tellima grandiflora -n12803754 foamflower, coolwart, false miterwort, false mitrewort, Tiarella cordifolia -n12803958 false miterwort, false mitrewort, Tiarella unifoliata -n12804352 pickaback plant, piggyback plant, youth-on-age, Tolmiea menziesii -n12805146 currant, currant bush -n12805561 black currant, European black currant, Ribes nigrum -n12805762 white currant, Ribes sativum -n12806015 gooseberry, gooseberry bush, Ribes uva-crispa, Ribes grossularia -n12806732 plane tree, sycamore, platan -n12807251 London plane, Platanus acerifolia -n12807409 American sycamore, American plane, buttonwood, Platanus occidentalis -n12807624 oriental plane, Platanus orientalis -n12807773 California sycamore, Platanus racemosa -n12808007 Arizona sycamore, Platanus wrightii -n12809868 Greek valerian, Polemonium reptans -n12810007 northern Jacob's ladder, Polemonium boreale -n12810151 skunkweed, skunk-weed, Polemonium viscosum -n12810595 phlox -n12811027 moss pink, mountain phlox, moss phlox, dwarf phlox, Phlox subulata -n12811713 evening-snow, Linanthus dichotomus -n12812235 acanthus -n12812478 bear's breech, bear's breeches, sea holly, Acanthus mollis -n12812801 caricature plant, Graptophyllum pictum -n12813189 black-eyed Susan, black-eyed Susan vine, Thunbergia alata -n12814643 catalpa, Indian bean -n12814857 Catalpa bignioides -n12814960 Catalpa speciosa -n12815198 desert willow, Chilopsis linearis -n12815668 calabash, calabash tree, Crescentia cujete -n12815838 calabash -n12816508 borage, tailwort, Borago officinalis -n12816942 common amsinckia, Amsinckia intermedia -n12817464 anchusa -n12817694 bugloss, alkanet, Anchusa officinalis -n12817855 cape forget-me-not, Anchusa capensis -n12818004 cape forget-me-not, Anchusa riparia -n12818346 Spanish elm, Equador laurel, salmwood, cypre, princewood, Cordia alliodora -n12818601 princewood, Spanish elm, Cordia gerascanthus -n12818966 Chinese forget-me-not, Cynoglossum amabile -n12819141 hound's-tongue, Cynoglossum officinale -n12819354 hound's-tongue, Cynoglossum virginaticum -n12819728 blueweed, blue devil, blue thistle, viper's bugloss, Echium vulgare -n12820113 beggar's lice, beggar lice -n12820669 gromwell, Lithospermum officinale -n12820853 puccoon, Lithospermum caroliniense -n12821505 Virginia bluebell, Virginia cowslip, Mertensia virginica -n12821895 garden forget-me-not, Myosotis sylvatica -n12822115 forget-me-not, mouse ear, Myosotis scorpiodes -n12822466 false gromwell -n12822769 comfrey, cumfrey -n12822955 common comfrey, boneset, Symphytum officinale -n12823717 convolvulus -n12823859 bindweed -n12824053 field bindweed, wild morning-glory, Convolvulus arvensis -n12824289 scammony, Convolvulus scammonia -n12824735 silverweed -n12825497 dodder -n12826143 dichondra, Dichondra micrantha -n12827270 cypress vine, star-glory, Indian pink, Ipomoea quamoclit, Quamoclit pennata -n12827537 moonflower, belle de nuit, Ipomoea alba -n12827907 wild potato vine, wild sweet potato vine, man-of-the-earth, manroot, scammonyroot, Ipomoea panurata, Ipomoea fastigiata -n12828220 red morning-glory, star ipomoea, Ipomoea coccinea -n12828379 man-of-the-earth, Ipomoea leptophylla -n12828520 scammony, Ipomoea orizabensis -n12828791 Japanese morning glory, Ipomoea nil -n12828977 imperial Japanese morning glory, Ipomoea imperialis -n12829582 gesneriad -n12829975 gesneria -n12830222 achimenes, hot water plant -n12830568 aeschynanthus -n12831141 lace-flower vine, Alsobia dianthiflora, Episcia dianthiflora -n12831535 columnea -n12831932 episcia -n12832315 gloxinia -n12832538 Canterbury bell, Gloxinia perennis -n12832822 kohleria -n12833149 African violet, Saintpaulia ionantha -n12833985 streptocarpus -n12834190 Cape primrose -n12834798 waterleaf -n12834938 Virginia waterleaf, Shawnee salad, shawny, Indian salad, John's cabbage, Hydrophyllum virginianum -n12835331 yellow bells, California yellow bells, whispering bells, Emmanthe penduliflora -n12835766 yerba santa, Eriodictyon californicum -n12836212 nemophila -n12836337 baby blue-eyes, Nemophila menziesii -n12836508 five-spot, Nemophila maculata -n12836862 scorpionweed, scorpion weed, phacelia -n12837052 California bluebell, Phacelia campanularia -n12837259 California bluebell, whitlavia, Phacelia minor, Phacelia whitlavia -n12837466 fiddleneck, Phacelia tanacetifolia -n12837803 fiesta flower, Pholistoma auritum, Nemophila aurita -n12839574 basil thyme, basil balm, mother of thyme, Acinos arvensis, Satureja acinos -n12839979 giant hyssop -n12840168 yellow giant hyssop, Agastache nepetoides -n12840362 anise hyssop, Agastache foeniculum -n12840502 Mexican hyssop, Agastache mexicana -n12840749 bugle, bugleweed -n12841007 creeping bugle, Ajuga reptans -n12841193 erect bugle, blue bugle, Ajuga genevensis -n12841354 pyramid bugle, Ajuga pyramidalis -n12842302 wood mint -n12842519 hairy wood mint, Blephilia hirsuta -n12842642 downy wood mint, Blephilia celiata -n12842887 calamint -n12843144 common calamint, Calamintha sylvatica, Satureja calamintha officinalis -n12843316 large-flowered calamint, Calamintha grandiflora, Clinopodium grandiflorum, Satureja grandiflora -n12843557 lesser calamint, field balm, Calamintha nepeta, Calamintha nepeta glantulosa, Satureja nepeta, Satureja calamintha glandulosa -n12843970 wild basil, cushion calamint, Clinopodium vulgare, Satureja vulgaris -n12844409 horse balm, horseweed, stoneroot, stone-root, richweed, stone root, Collinsonia canadensis -n12844939 coleus, flame nettle -n12845187 country borage, Coleus aromaticus, Coleus amboinicus, Plectranthus amboinicus -n12845413 painted nettle, Joseph's coat, Coleus blumei, Solenostemon blumei, Solenostemon scutellarioides -n12845908 Apalachicola rosemary, Conradina glabra -n12846335 dragonhead, dragon's head, Dracocephalum parviflorum -n12846690 elsholtzia -n12847008 hemp nettle, dead nettle, Galeopsis tetrahit -n12847374 ground ivy, alehoof, field balm, gill-over-the-ground, runaway robin, Glechoma hederaceae, Nepeta hederaceae -n12847927 pennyroyal, American pennyroyal, Hedeoma pulegioides -n12848499 hyssop, Hyssopus officinalis -n12849061 dead nettle -n12849279 white dead nettle, Lamium album -n12849416 henbit, Lamium amplexicaule -n12849952 English lavender, Lavandula angustifolia, Lavandula officinalis -n12850168 French lavender, Lavandula stoechas -n12850336 spike lavender, French lavender, Lavandula latifolia -n12850906 dagga, Cape dagga, red dagga, wilde dagga, Leonotis leonurus -n12851094 lion's-ear, Leonotis nepetaefolia, Leonotis nepetifolia -n12851469 motherwort, Leonurus cardiaca -n12851860 pitcher sage, Lepechinia calycina, Sphacele calycina -n12852234 bugleweed, Lycopus virginicus -n12852428 water horehound, Lycopus americanus -n12852570 gipsywort, gypsywort, Lycopus europaeus -n12853080 origanum -n12853287 oregano, marjoram, pot marjoram, wild marjoram, winter sweet, Origanum vulgare -n12853482 sweet marjoram, knotted marjoram, Origanum majorana, Majorana hortensis -n12854048 horehound -n12854193 common horehound, white horehound, Marrubium vulgare -n12854600 lemon balm, garden balm, sweet balm, bee balm, beebalm, Melissa officinalis -n12855365 corn mint, field mint, Mentha arvensis -n12855494 water-mint, water mint, Mentha aquatica -n12855710 bergamot mint, lemon mint, eau de cologne mint, Mentha citrata -n12855886 horsemint, Mentha longifolia -n12856091 peppermint, Mentha piperita -n12856287 spearmint, Mentha spicata -n12856479 apple mint, applemint, Mentha rotundifolia, Mentha suaveolens -n12856680 pennyroyal, Mentha pulegium -n12857204 yerba buena, Micromeria chamissonis, Micromeria douglasii, Satureja douglasii -n12857779 molucca balm, bells of Ireland, Molucella laevis -n12858150 monarda, wild bergamot -n12858397 bee balm, beebalm, bergamot mint, oswego tea, Monarda didyma -n12858618 horsemint, Monarda punctata -n12858871 bee balm, beebalm, Monarda fistulosa -n12858987 lemon mint, horsemint, Monarda citriodora -n12859153 plains lemon monarda, Monarda pectinata -n12859272 basil balm, Monarda clinopodia -n12859679 mustang mint, Monardella lanceolata -n12859986 catmint, catnip, Nepeta cataria -n12860365 basil -n12860978 beefsteak plant, Perilla frutescens crispa -n12861345 phlomis -n12861541 Jerusalem sage, Phlomis fruticosa -n12861892 physostegia -n12862512 plectranthus -n12862828 patchouli, patchouly, pachouli, Pogostemon cablin -n12863234 self-heal, heal all, Prunella vulgaris -n12863624 mountain mint -n12864160 rosemary, Rosmarinus officinalis -n12865037 clary sage, Salvia clarea -n12865562 purple sage, chaparral sage, Salvia leucophylla -n12865708 cancerweed, cancer weed, Salvia lyrata -n12865824 common sage, ramona, Salvia officinalis -n12866002 meadow clary, Salvia pratensis -n12866162 clary, Salvia sclarea -n12866333 pitcher sage, Salvia spathacea -n12866459 Mexican mint, Salvia divinorum -n12866635 wild sage, wild clary, vervain sage, Salvia verbenaca -n12866968 savory -n12867184 summer savory, Satureja hortensis, Satureia hortensis -n12867449 winter savory, Satureja montana, Satureia montana -n12867826 skullcap, helmetflower -n12868019 blue pimpernel, blue skullcap, mad-dog skullcap, mad-dog weed, Scutellaria lateriflora -n12868880 hedge nettle, dead nettle, Stachys sylvatica -n12869061 hedge nettle, Stachys palustris -n12869478 germander -n12869668 American germander, wood sage, Teucrium canadense -n12870048 cat thyme, marum, Teucrium marum -n12870225 wood sage, Teucrium scorodonia -n12870535 thyme -n12870682 common thyme, Thymus vulgaris -n12870891 wild thyme, creeping thyme, Thymus serpyllum -n12871272 blue curls -n12871696 turpentine camphor weed, camphorweed, vinegarweed, Trichostema lanceolatum -n12871859 bastard pennyroyal, Trichostema dichotomum -n12872458 bladderwort -n12872914 butterwort -n12873341 genlisea -n12873984 martynia, Martynia annua -n12875269 common unicorn plant, devil's claw, common devil's claw, elephant-tusk, proboscis flower, ram's horn, Proboscidea louisianica -n12875697 sand devil's claw, Proboscidea arenaria, Martynia arenaria -n12875861 sweet unicorn plant, Proboscidea fragrans, Martynia fragrans -n12876899 figwort -n12877244 snapdragon -n12877493 white snapdragon, Antirrhinum coulterianum -n12877637 yellow twining snapdragon, Antirrhinum filipes -n12877838 Mediterranean snapdragon, Antirrhinum majus -n12878169 kitten-tails -n12878325 Alpine besseya, Besseya alpina -n12878784 false foxglove, Aureolaria pedicularia, Gerardia pedicularia -n12879068 false foxglove, Aureolaria virginica, Gerardia virginica -n12879527 calceolaria, slipperwort -n12879963 Indian paintbrush, painted cup -n12880244 desert paintbrush, Castilleja chromosa -n12880462 giant red paintbrush, Castilleja miniata -n12880638 great plains paintbrush, Castilleja sessiliflora -n12880799 sulfur paintbrush, Castilleja sulphurea -n12881105 shellflower, shell-flower, turtlehead, snakehead, snake-head, Chelone glabra -n12881913 maiden blue-eyed Mary, Collinsia parviflora -n12882158 blue-eyed Mary, Collinsia verna -n12882779 foxglove, digitalis -n12882945 common foxglove, fairy bell, fingerflower, finger-flower, fingerroot, finger-root, Digitalis purpurea -n12883265 yellow foxglove, straw foxglove, Digitalis lutea -n12883628 gerardia -n12884100 blue toadflax, old-field toadflax, Linaria canadensis -n12884260 toadflax, butter-and-eggs, wild snapdragon, devil's flax, Linaria vulgaris -n12885045 golden-beard penstemon, Penstemon barbatus -n12885265 scarlet bugler, Penstemon centranthifolius -n12885510 red shrubby penstemon, redwood penstemon -n12885754 Platte River penstemon, Penstemon cyananthus -n12886185 hot-rock penstemon, Penstemon deustus -n12886402 Jones' penstemon, Penstemon dolius -n12886600 shrubby penstemon, lowbush penstemon, Penstemon fruticosus -n12886831 narrow-leaf penstemon, Penstemon linarioides -n12887293 balloon flower, scented penstemon, Penstemon palmeri -n12887532 Parry's penstemon, Penstemon parryi -n12887713 rock penstemon, cliff penstemon, Penstemon rupicola -n12888016 Rydberg's penstemon, Penstemon rydbergii -n12888234 cascade penstemon, Penstemon serrulatus -n12888457 Whipple's penstemon, Penstemon whippleanus -n12889219 moth mullein, Verbascum blattaria -n12889412 white mullein, Verbascum lychnitis -n12889579 purple mullein, Verbascum phoeniceum -n12889713 common mullein, great mullein, Aaron's rod, flannel mullein, woolly mullein, torch, Verbascum thapsus -n12890265 veronica, speedwell -n12890490 field speedwell, Veronica agrestis -n12890685 brooklime, American brooklime, Veronica americana -n12890928 corn speedwell, Veronica arvensis -n12891093 brooklime, European brooklime, Veronica beccabunga -n12891305 germander speedwell, bird's eye, Veronica chamaedrys -n12891469 water speedwell, Veronica michauxii, Veronica anagallis-aquatica -n12891643 common speedwell, gypsyweed, Veronica officinalis -n12891824 purslane speedwell, Veronica peregrina -n12892013 thyme-leaved speedwell, Veronica serpyllifolia -n12893463 nightshade -n12893993 horse nettle, ball nettle, bull nettle, ball nightshade, Solanum carolinense -n12895298 African holly, Solanum giganteum -n12895811 potato vine, Solanum jasmoides -n12896615 garden huckleberry, wonderberry, sunberry, Solanum nigrum guineese, Solanum melanocerasum, Solanum burbankii -n12897118 naranjilla, Solanum quitoense -n12897788 potato vine, giant potato creeper, Solanum wendlandii -n12897999 potato tree, Brazilian potato tree, Solanum wrightii, Solanum macranthum -n12898342 belladonna, belladonna plant, deadly nightshade, Atropa belladonna -n12898774 bush violet, browallia -n12899166 lady-of-the-night, Brunfelsia americana -n12899537 angel's trumpet, maikoa, Brugmansia arborea, Datura arborea -n12899752 angel's trumpet, Brugmansia suaveolens, Datura suaveolens -n12899971 red angel's trumpet, Brugmansia sanguinea, Datura sanguinea -n12900783 cone pepper, Capsicum annuum conoides -n12901724 bird pepper, Capsicum frutescens baccatum, Capsicum baccatum -n12902466 day jessamine, Cestrum diurnum -n12902662 night jasmine, night jessamine, Cestrum nocturnum -n12903014 tree tomato, tamarillo -n12903367 thorn apple -n12903503 jimsonweed, jimson weed, Jamestown weed, common thorn apple, apple of Peru, Datura stramonium -n12903964 pichi, Fabiana imbricata -n12904314 henbane, black henbane, stinking nightshade, Hyoscyamus niger -n12904562 Egyptian henbane, Hyoscyamus muticus -n12904938 matrimony vine, boxthorn -n12905135 common matrimony vine, Duke of Argyll's tea tree, Lycium barbarum, Lycium halimifolium -n12905412 Christmasberry, Christmas berry, Lycium carolinianum -n12906214 plum tomato -n12906498 mandrake, devil's apples, Mandragora officinarum -n12906771 mandrake root, mandrake -n12907057 apple of Peru, shoo fly, Nicandra physaloides -n12907671 flowering tobacco, Jasmine tobacco, Nicotiana alata -n12907857 common tobacco, Nicotiana tabacum -n12908093 wild tobacco, Indian tobacco, Nicotiana rustica -n12908645 cupflower, nierembergia -n12908854 whitecup, Nierembergia repens, Nierembergia rivularis -n12909421 petunia -n12909614 large white petunia, Petunia axillaris -n12909759 violet-flowered petunia, Petunia integrifolia -n12909917 hybrid petunia, Petunia hybrida -n12911079 cape gooseberry, purple ground cherry, Physalis peruviana -n12911264 strawberry tomato, dwarf cape gooseberry, Physalis pruinosa -n12911440 tomatillo, jamberry, Mexican husk tomato, Physalis ixocarpa -n12911673 tomatillo, miltomate, purple ground cherry, jamberry, Physalis philadelphica -n12911914 yellow henbane, Physalis viscosa -n12912274 cock's eggs, Salpichroa organifolia, Salpichroa rhomboidea -n12912670 salpiglossis -n12912801 painted tongue, Salpiglossis sinuata -n12913144 butterfly flower, poor man's orchid, schizanthus -n12913524 Scopolia carniolica -n12913791 chalice vine, trumpet flower, cupflower, Solandra guttata -n12914923 verbena, vervain -n12915140 lantana -n12915568 black mangrove, Avicennia marina -n12915811 white mangrove, Avicennia officinalis -n12916179 black mangrove, Aegiceras majus -n12916511 teak, Tectona grandis -n12917901 spurge -n12918609 sun spurge, wartweed, wartwort, devil's milk, Euphorbia helioscopia -n12918810 petty spurge, devil's milk, Euphorbia peplus -n12918991 medusa's head, Euphorbia medusae, Euphorbia caput-medusae -n12919195 wild spurge, flowering spurge, tramp's spurge, Euphorbia corollata -n12919403 snow-on-the-mountain, snow-in-summer, ghost weed, Euphorbia marginata -n12919646 cypress spurge, Euphorbia cyparissias -n12919847 leafy spurge, wolf's milk, Euphorbia esula -n12920043 hairy spurge, Euphorbia hirsuta -n12920204 poinsettia, Christmas star, Christmas flower, lobster plant, Mexican flameleaf, painted leaf, Euphorbia pulcherrima -n12920521 Japanese poinsettia, mole plant, paint leaf, Euphorbia heterophylla -n12920719 fire-on-the-mountain, painted leaf, Mexican fire plant, Euphorbia cyathophora -n12920955 wood spurge, Euphorbia amygdaloides -n12921315 dwarf spurge, Euphorbia exigua -n12921499 scarlet plume, Euphorbia fulgens -n12921660 naboom, cactus euphorbia, Euphorbia ingens -n12921868 crown of thorns, Christ thorn, Christ plant, Euphorbia milii -n12922119 toothed spurge, Euphorbia dentata -n12922458 three-seeded mercury, Acalypha virginica -n12922763 croton, Croton tiglium -n12923108 cascarilla, Croton eluteria -n12923257 cascarilla bark, eleuthera bark, sweetwood bark -n12924623 castor-oil plant, castor bean plant, palma christi, palma christ, Ricinus communis -n12925179 spurge nettle, tread-softly, devil nettle, pica-pica, Cnidoscolus urens, Jatropha urens, Jatropha stimulosus -n12925583 physic nut, Jatropha curcus -n12926039 Para rubber tree, caoutchouc tree, Hevea brasiliensis -n12926480 cassava, casava -n12926689 bitter cassava, manioc, mandioc, mandioca, tapioca plant, gari, Manihot esculenta, Manihot utilissima -n12927013 cassava, manioc -n12927194 sweet cassava, Manihot dulcis -n12927494 candlenut, varnish tree, Aleurites moluccana -n12927758 tung tree, tung, tung-oil tree, Aleurites fordii -n12928071 slipper spurge, slipper plant -n12928307 candelilla, Pedilanthus bracteatus, Pedilanthus pavonis -n12928491 Jewbush, Jew-bush, Jew bush, redbird cactus, redbird flower, Pedilanthus tithymaloides -n12928819 jumping bean, jumping seed, Mexican jumping bean -n12929403 camellia, camelia -n12929600 japonica, Camellia japonica -n12930778 umbellifer, umbelliferous plant -n12930951 wild parsley -n12931231 fool's parsley, lesser hemlock, Aethusa cynapium -n12931542 dill, Anethum graveolens -n12931906 angelica, angelique -n12932173 garden angelica, archangel, Angelica Archangelica -n12932365 wild angelica, Angelica sylvestris -n12932706 chervil, beaked parsley, Anthriscus cereifolium -n12932966 cow parsley, wild chervil, Anthriscus sylvestris -n12933274 wild celery, Apium graveolens -n12934036 astrantia, masterwort -n12934174 greater masterwort, Astrantia major -n12934479 caraway, Carum carvi -n12934685 whorled caraway -n12934985 water hemlock, Cicuta verosa -n12935166 spotted cowbane, spotted hemlock, spotted water hemlock -n12935609 hemlock, poison hemlock, poison parsley, California fern, Nebraska fern, winter fern, Conium maculatum -n12936155 earthnut, Conopodium denudatum -n12936826 cumin, Cuminum cyminum -n12937130 wild carrot, Queen Anne's lace, Daucus carota -n12938081 eryngo, eringo -n12938193 sea holly, sea holm, sea eryngium, Eryngium maritimum -n12938445 button snakeroot, Eryngium aquaticum -n12938667 rattlesnake master, rattlesnake's master, button snakeroot, Eryngium yuccifolium -n12939104 fennel -n12939282 common fennel, Foeniculum vulgare -n12939479 Florence fennel, Foeniculum dulce, Foeniculum vulgare dulce -n12939874 cow parsnip, hogweed, Heracleum sphondylium -n12940226 lovage, Levisticum officinale -n12940609 sweet cicely, Myrrhis odorata -n12941220 water fennel, Oenanthe aquatica -n12941536 parsnip, Pastinaca sativa -n12941717 cultivated parsnip -n12942025 wild parsnip, madnep -n12942395 parsley, Petroselinum crispum -n12942572 Italian parsley, flat-leaf parsley, Petroselinum crispum neapolitanum -n12942729 Hamburg parsley, turnip-rooted parsley, Petroselinum crispum tuberosum -n12943049 anise, anise plant, Pimpinella anisum -n12943443 sanicle, snakeroot -n12943912 purple sanicle, Sanicula bipinnatifida -n12944095 European sanicle, Sanicula Europaea -n12945177 water parsnip, Sium suave -n12945366 greater water parsnip, Sium latifolium -n12945549 skirret, Sium sisarum -n12946849 dogwood, dogwood tree, cornel -n12947313 common white dogwood, eastern flowering dogwood, Cornus florida -n12947544 red osier, red osier dogwood, red dogwood, American dogwood, redbrush, Cornus stolonifera -n12947756 silky dogwood, Cornus obliqua -n12947895 silky cornel, silky dogwood, Cornus amomum -n12948053 common European dogwood, red dogwood, blood-twig, pedwood, Cornus sanguinea -n12948251 bunchberry, dwarf cornel, crackerberry, pudding berry, Cornus canadensis -n12948495 cornelian cherry, Cornus mas -n12949160 puka, Griselinia lucida -n12949361 kapuka, Griselinia littoralis -n12950126 valerian -n12950314 common valerian, garden heliotrope, Valeriana officinalis -n12950796 common corn salad, lamb's lettuce, Valerianella olitoria, Valerianella locusta -n12951146 red valerian, French honeysuckle, Centranthus ruber -n12951835 filmy fern, film fern -n12952165 bristle fern, filmy fern -n12952469 hare's-foot bristle fern, Trichomanes boschianum -n12952590 Killarney fern, Trichomanes speciosum -n12952717 kidney fern, Trichomanes reniforme -n12953206 flowering fern, osmund -n12953484 royal fern, royal osmund, king fern, ditch fern, French bracken, Osmunda regalis -n12953712 interrupted fern, Osmunda clatonia -n12954353 crape fern, Prince-of-Wales fern, Prince-of-Wales feather, Prince-of-Wales plume, Leptopteris superba, Todea superba -n12954799 crepe fern, king fern, Todea barbara -n12955414 curly grass, curly grass fern, Schizaea pusilla -n12955840 pine fern, Anemia adiantifolia -n12956170 climbing fern -n12956367 creeping fern, Hartford fern, Lygodium palmatum -n12956588 climbing maidenhair, climbing maidenhair fern, snake fern, Lygodium microphyllum -n12956922 scented fern, Mohria caffrorum -n12957608 clover fern, pepperwort -n12957803 nardoo, nardo, common nardoo, Marsilea drummondii -n12957924 water clover, Marsilea quadrifolia -n12958261 pillwort, Pilularia globulifera -n12958615 regnellidium, Regnellidium diphyllum -n12959074 floating-moss, Salvinia rotundifolia, Salvinia auriculata -n12959538 mosquito fern, floating fern, Carolina pond fern, Azolla caroliniana -n12960378 adder's tongue, adder's tongue fern -n12960552 ribbon fern, Ophioglossum pendulum -n12960863 grape fern -n12961242 daisyleaf grape fern, daisy-leaved grape fern, Botrychium matricariifolium -n12961393 leathery grape fern, Botrychium multifidum -n12961536 rattlesnake fern, Botrychium virginianum -n12961879 flowering fern, Helminthostachys zeylanica -n12963628 powdery mildew -n12964920 Dutch elm fungus, Ceratostomella ulmi -n12965626 ergot, Claviceps purpurea -n12965951 rye ergot -n12966804 black root rot fungus, Xylaria mali -n12966945 dead-man's-fingers, dead-men's-fingers, Xylaria polymorpha -n12968136 sclerotinia -n12968309 brown cup -n12969131 earthball, false truffle, puffball, hard-skinned puffball -n12969425 Scleroderma citrinum, Scleroderma aurantium -n12969670 Scleroderma flavidium, star earthball -n12969927 Scleroderma bovista, smooth earthball -n12970193 Podaxaceae -n12970293 stalked puffball -n12970733 stalked puffball -n12971400 false truffle -n12971804 Rhizopogon idahoensis -n12972136 Truncocolumella citrina -n12973443 mucor -n12973791 rhizopus -n12973937 bread mold, Rhizopus nigricans -n12974987 slime mold, slime mould -n12975804 true slime mold, acellular slime mold, plasmodial slime mold, myxomycete -n12976198 cellular slime mold -n12976554 dictostylium -n12978076 pond-scum parasite -n12979316 potato wart fungus, Synchytrium endobioticum -n12979829 white fungus, Saprolegnia ferax -n12980080 water mold -n12980840 downy mildew, false mildew -n12981086 blue mold fungus, Peronospora tabacina -n12981301 onion mildew, Peronospora destructor -n12981443 tobacco mildew, Peronospora hyoscyami -n12981954 white rust -n12982468 pythium -n12982590 damping off fungus, Pythium debaryanum -n12982915 Phytophthora citrophthora -n12983048 Phytophthora infestans -n12983654 clubroot fungus, Plasmodiophora brassicae -n12983873 Geglossaceae -n12983961 Sarcosomataceae -n12984267 Rufous rubber cup -n12984489 devil's cigar -n12984595 devil's urn -n12985420 truffle, earthnut, earth-ball -n12985773 club fungus -n12985857 coral fungus -n12986227 tooth fungus -n12987056 lichen -n12987423 ascolichen -n12987535 basidiolichen -n12988158 lecanora -n12988341 manna lichen -n12988572 archil, orchil -n12989007 roccella, Roccella tinctoria -n12989938 beard lichen, beard moss, Usnea barbata -n12990597 horsehair lichen, horsetail lichen -n12991184 reindeer moss, reindeer lichen, arctic moss, Cladonia rangiferina -n12991837 crottle, crottal, crotal -n12992177 Iceland moss, Iceland lichen, Cetraria islandica -n12992868 fungus -n12994892 promycelium -n12995601 true fungus -n12997654 basidiomycete, basidiomycetous fungi -n12997919 mushroom -n12998815 agaric -n13000891 mushroom -n13001041 mushroom -n13001206 toadstool -n13001366 horse mushroom, Agaricus arvensis -n13001529 meadow mushroom, field mushroom, Agaricus campestris -n13001930 shiitake, shiitake mushroom, Chinese black mushroom, golden oak mushroom, Oriental black mushroom, Lentinus edodes -n13002209 scaly lentinus, Lentinus lepideus -n13002750 royal agaric, Caesar's agaric, Amanita caesarea -n13002925 false deathcap, Amanita mappa -n13003061 fly agaric, Amanita muscaria -n13003254 death cap, death cup, death angel, destroying angel, Amanita phalloides -n13003522 blushing mushroom, blusher, Amanita rubescens -n13003712 destroying angel, Amanita verna -n13004423 chanterelle, chantarelle, Cantharellus cibarius -n13004640 floccose chanterelle, Cantharellus floccosus -n13004826 pig's ears, Cantharellus clavatus -n13004992 cinnabar chanterelle, Cantharellus cinnabarinus -n13005329 jack-o-lantern fungus, jack-o-lantern, jack-a-lantern, Omphalotus illudens -n13005984 inky cap, inky-cap mushroom, Coprinus atramentarius -n13006171 shaggymane, shaggy cap, shaggymane mushroom, Coprinus comatus -n13006631 milkcap, Lactarius delicioso -n13006894 fairy-ring mushroom, Marasmius oreades -n13007034 fairy ring, fairy circle -n13007417 oyster mushroom, oyster fungus, oyster agaric, Pleurotus ostreatus -n13007629 olive-tree agaric, Pleurotus phosphoreus -n13008157 Pholiota astragalina -n13008315 Pholiota aurea, golden pholiota -n13008485 Pholiota destruens -n13008689 Pholiota flammans -n13008839 Pholiota flavida -n13009085 nameko, viscid mushroom, Pholiota nameko -n13009244 Pholiota squarrosa-adiposa -n13009429 Pholiota squarrosa, scaly pholiota -n13009656 Pholiota squarrosoides -n13010694 Stropharia ambigua -n13010951 Stropharia hornemannii -n13011221 Stropharia rugoso-annulata -n13011595 gill fungus -n13012253 Entoloma lividum, Entoloma sinuatum -n13012469 Entoloma aprile -n13012973 Chlorophyllum molybdites -n13013534 lepiota -n13013764 parasol mushroom, Lepiota procera -n13013965 poisonous parasol, Lepiota morgani -n13014097 Lepiota naucina -n13014265 Lepiota rhacodes -n13014409 American parasol, Lepiota americana -n13014581 Lepiota rubrotincta -n13014741 Lepiota clypeolaria -n13014879 onion stem, Lepiota cepaestipes -n13015509 pink disease fungus, Corticium salmonicolor -n13015688 bottom rot fungus, Corticium solani -n13016076 potato fungus, Pellicularia filamentosa, Rhizoctinia solani -n13016289 coffee fungus, Pellicularia koleroga -n13017102 blewits, Clitocybe nuda -n13017240 sandy mushroom, Tricholoma populinum -n13017439 Tricholoma pessundatum -n13017610 Tricholoma sejunctum -n13017789 man-on-a-horse, Tricholoma flavovirens -n13017979 Tricholoma venenata -n13018088 Tricholoma pardinum -n13018232 Tricholoma vaccinum -n13018407 Tricholoma aurantium -n13018906 Volvaria bombycina -n13019496 Pluteus aurantiorugosus -n13019643 Pluteus magnus, sawdust mushroom -n13019835 deer mushroom, Pluteus cervinus -n13020191 straw mushroom, Chinese mushroom, Volvariella volvacea -n13020481 Volvariella bombycina -n13020964 Clitocybe clavipes -n13021166 Clitocybe dealbata -n13021332 Clitocybe inornata -n13021543 Clitocybe robusta, Clytocybe alba -n13021689 Clitocybe irina, Tricholoma irinum, Lepista irina -n13021867 Clitocybe subconnexa -n13022210 winter mushroom, Flammulina velutipes -n13022709 mycelium -n13022903 sclerotium -n13023134 sac fungus -n13024012 ascomycete, ascomycetous fungus -n13024500 Clavicipitaceae, grainy club mushrooms -n13024653 grainy club -n13025647 yeast -n13025854 baker's yeast, brewer's yeast, Saccharomyces cerevisiae -n13026015 wine-maker's yeast, Saccharomyces ellipsoides -n13027557 Aspergillus fumigatus -n13027879 brown root rot fungus, Thielavia basicola -n13028611 discomycete, cup fungus -n13028937 Leotia lubrica -n13029122 Mitrula elegans -n13029326 Sarcoscypha coccinea, scarlet cup -n13029610 Caloscypha fulgens -n13029760 Aleuria aurantia, orange peel fungus -n13030337 elf cup -n13030616 Peziza domicilina -n13030852 blood cup, fairy cup, Peziza coccinea -n13031193 Urnula craterium, urn fungus -n13031323 Galiella rufa -n13031474 Jafnea semitosta -n13032115 morel -n13032381 common morel, Morchella esculenta, sponge mushroom, sponge morel -n13032618 Disciotis venosa, cup morel -n13032923 Verpa, bell morel -n13033134 Verpa bohemica, early morel -n13033396 Verpa conica, conic Verpa -n13033577 black morel, Morchella conica, conic morel, Morchella angusticeps, narrowhead morel -n13033879 Morchella crassipes, thick-footed morel -n13034062 Morchella semilibera, half-free morel, cow's head -n13034555 Wynnea americana -n13034788 Wynnea sparassoides -n13035241 false morel -n13035389 lorchel -n13035707 helvella -n13035925 Helvella crispa, miter mushroom -n13036116 Helvella acetabulum -n13036312 Helvella sulcata -n13036804 discina -n13037406 gyromitra -n13037585 Gyromitra californica, California false morel -n13037805 Gyromitra sphaerospora, round-spored gyromitra -n13038068 Gyromitra esculenta, brain mushroom, beefsteak morel -n13038376 Gyromitra infula, saddled-shaped false morel -n13038577 Gyromitra fastigiata, Gyromitra brunnea -n13038744 Gyromitra gigas -n13039349 gasteromycete, gastromycete -n13040303 stinkhorn, carrion fungus -n13040629 common stinkhorn, Phallus impudicus -n13040796 Phallus ravenelii -n13041312 dog stinkhorn, Mutinus caninus -n13041943 Calostoma lutescens -n13042134 Calostoma cinnabarina -n13042316 Calostoma ravenelii -n13042982 stinky squid, Pseudocolus fusiformis -n13043926 puffball, true puffball -n13044375 giant puffball, Calvatia gigantea -n13044778 earthstar -n13045210 Geastrum coronatum -n13045594 Radiigera fuscogleba -n13045975 Astreus pteridis -n13046130 Astreus hygrometricus -n13046669 bird's-nest fungus -n13047862 Gastrocybe lateritia -n13048447 Macowanites americanus -n13049953 polypore, pore fungus, pore mushroom -n13050397 bracket fungus, shelf fungus -n13050705 Albatrellus dispansus -n13050940 Albatrellus ovinus, sheep polypore -n13051346 Neolentinus ponderosus -n13052014 Oligoporus leucospongia -n13052248 Polyporus tenuiculus -n13052670 hen-of-the-woods, hen of the woods, Polyporus frondosus, Grifola frondosa -n13052931 Polyporus squamosus, scaly polypore -n13053608 beefsteak fungus, Fistulina hepatica -n13054073 agaric, Fomes igniarius -n13054560 bolete -n13055423 Boletus chrysenteron -n13055577 Boletus edulis -n13055792 Frost's bolete, Boletus frostii -n13055949 Boletus luridus -n13056135 Boletus mirabilis -n13056349 Boletus pallidus -n13056607 Boletus pulcherrimus -n13056799 Boletus pulverulentus -n13057054 Boletus roxanae -n13057242 Boletus subvelutipes -n13057422 Boletus variipes -n13057639 Boletus zelleri -n13058037 Fuscoboletinus paluster -n13058272 Fuscoboletinus serotinus -n13058608 Leccinum fibrillosum -n13059298 Suillus albivelatus -n13059657 old-man-of-the-woods, Strobilomyces floccopus -n13060017 Boletellus russellii -n13060190 jelly fungus -n13061172 snow mushroom, Tremella fuciformis -n13061348 witches' butter, Tremella lutescens -n13061471 Tremella foliacea -n13061704 Tremella reticulata -n13062421 Jew's-ear, Jew's-ears, ear fungus, Auricularia auricula -n13063269 rust, rust fungus -n13063514 aecium -n13064111 flax rust, flax rust fungus, Melampsora lini -n13064457 blister rust, Cronartium ribicola -n13065089 wheat rust, Puccinia graminis -n13065514 apple rust, cedar-apple rust, Gymnosporangium juniperi-virginianae -n13066129 smut, smut fungus -n13066448 covered smut -n13066979 loose smut -n13067191 cornsmut, corn smut -n13067330 boil smut, Ustilago maydis -n13067532 Sphacelotheca, genus Sphacelotheca -n13067672 head smut, Sphacelotheca reiliana -n13068255 bunt, Tilletia caries -n13068434 bunt, stinking smut, Tilletia foetida -n13068735 onion smut, Urocystis cepulae -n13068917 flag smut fungus -n13069224 wheat flag smut, Urocystis tritici -n13069773 felt fungus, Septobasidium pseudopedicellatum -n13070308 waxycap -n13070875 Hygrocybe acutoconica, conic waxycap -n13071371 Hygrophorus borealis -n13071553 Hygrophorus caeruleus -n13071815 Hygrophorus inocybiformis -n13072031 Hygrophorus kauffmanii -n13072209 Hygrophorus marzuolus -n13072350 Hygrophorus purpurascens -n13072528 Hygrophorus russula -n13072706 Hygrophorus sordidus -n13072863 Hygrophorus tennesseensis -n13073055 Hygrophorus turundus -n13073703 Neohygrophorus angelesianus -n13074619 Cortinarius armillatus -n13074814 Cortinarius atkinsonianus -n13075020 Cortinarius corrugatus -n13075272 Cortinarius gentilis -n13075441 Cortinarius mutabilis, purple-staining Cortinarius -n13075684 Cortinarius semisanguineus -n13075847 Cortinarius subfoetidus -n13076041 Cortinarius violaceus -n13076405 Gymnopilus spectabilis -n13076643 Gymnopilus validipes -n13076831 Gymnopilus ventricosus -n13077033 mold, mould -n13077295 mildew -n13078021 verticillium -n13079073 monilia -n13079419 candida -n13079567 Candida albicans, Monilia albicans -n13080306 blastomycete -n13080866 yellow spot fungus, Cercospora kopkei -n13081229 green smut fungus, Ustilaginoidea virens -n13081999 dry rot -n13082568 rhizoctinia -n13083023 houseplant -n13083461 bedder, bedding plant -n13084184 succulent -n13084834 cultivar -n13085113 weed -n13085747 wort -n13090018 brier -n13090871 aril -n13091620 sporophyll, sporophyl -n13091774 sporangium, spore case, spore sac -n13091982 sporangiophore -n13092078 ascus -n13092240 ascospore -n13092385 arthrospore -n13092987 eusporangium -n13093275 tetrasporangium -n13093629 gametangium -n13094145 sorus -n13094273 sorus -n13095013 partial veil -n13096779 lignum -n13098515 vascular ray, medullary ray -n13098962 phloem, bast -n13099833 evergreen, evergreen plant -n13099999 deciduous plant -n13100156 poisonous plant -n13100677 vine -n13102648 creeper -n13102775 tendril -n13103023 root climber -n13103660 lignosae -n13103750 arborescent plant -n13103877 snag -n13104059 tree -n13107694 timber tree -n13107807 treelet -n13107891 arbor -n13108131 bean tree -n13108323 pollard -n13108481 sapling -n13108545 shade tree -n13108662 gymnospermous tree -n13108841 conifer, coniferous tree -n13109733 angiospermous tree, flowering tree -n13110915 nut tree -n13111174 spice tree -n13111340 fever tree -n13111504 stump, tree stump -n13111881 bonsai -n13112035 ming tree -n13112201 ming tree -n13118330 undershrub -n13118707 subshrub, suffrutex -n13119870 bramble -n13120211 liana -n13120958 geophyte -n13121104 desert plant, xerophyte, xerophytic plant, xerophile, xerophilous plant -n13121349 mesophyte, mesophytic plant -n13122364 marsh plant, bog plant, swamp plant -n13123309 hemiepiphyte, semiepiphyte -n13123431 strangler, strangler tree -n13123841 lithophyte, lithophytic plant -n13124358 saprobe -n13124654 autophyte, autophytic plant, autotroph, autotrophic organism -n13125117 root -n13126050 taproot -n13126856 prop root -n13127001 prophyll -n13127303 rootstock -n13127666 quickset -n13127843 stolon, runner, offset -n13128278 tuberous plant -n13128582 rhizome, rootstock, rootstalk -n13128976 rachis -n13129078 caudex -n13130014 cladode, cladophyll, phylloclad, phylloclade -n13130161 receptacle -n13130726 scape, flower stalk -n13131028 umbel -n13131618 petiole, leafstalk -n13132034 peduncle -n13132156 pedicel, pedicle -n13132338 flower cluster -n13132486 raceme -n13132656 panicle -n13132756 thyrse, thyrsus -n13132940 cyme -n13133140 cymule -n13133233 glomerule -n13133316 scorpioid cyme -n13133613 ear, spike, capitulum -n13133932 spadix -n13134302 bulbous plant -n13134531 bulbil, bulblet -n13134844 cormous plant -n13134947 fruit -n13135692 fruitlet -n13135832 seed -n13136316 bean -n13136556 nut -n13136781 nutlet -n13137010 kernel, meat -n13137225 syconium -n13137409 berry -n13137672 aggregate fruit, multiple fruit, syncarp -n13137951 simple fruit, bacca -n13138155 acinus -n13138308 drupe, stone fruit -n13138658 drupelet -n13138842 pome, false fruit -n13139055 pod, seedpod -n13139321 loment -n13139482 pyxidium, pyxis -n13139647 husk -n13139837 cornhusk -n13140049 pod, cod, seedcase -n13140367 accessory fruit, pseudocarp -n13141141 buckthorn -n13141415 buckthorn berry, yellow berry -n13141564 cascara buckthorn, bearberry, bearwood, chittamwood, chittimwood, Rhamnus purshianus -n13141797 cascara, cascara sagrada, chittam bark, chittem bark -n13141972 Carolina buckthorn, indian cherry, Rhamnus carolinianus -n13142182 coffeeberry, California buckthorn, California coffee, Rhamnus californicus -n13142504 redberry, red-berry, Rhamnus croceus -n13142907 nakedwood -n13143285 jujube, jujube bush, Christ's-thorn, Jerusalem thorn, Ziziphus jujuba -n13143758 Christ's-thorn, Jerusalem thorn, Paliurus spina-christi -n13144084 hazel, hazel tree, Pomaderris apetala -n13145040 fox grape, Vitis labrusca -n13145250 muscadine, Vitis rotundifolia -n13145444 vinifera, vinifera grape, common grape vine, Vitis vinifera -n13146403 Pinot blanc -n13146583 Sauvignon grape -n13146928 Sauvignon blanc -n13147153 Muscadet -n13147270 Riesling -n13147386 Zinfandel -n13147532 Chenin blanc -n13147689 malvasia -n13147918 Verdicchio -n13148208 Boston ivy, Japanese ivy, Parthenocissus tricuspidata -n13148384 Virginia creeper, American ivy, woodbine, Parthenocissus quinquefolia -n13149296 true pepper, pepper vine -n13149970 betel, betel pepper, Piper betel -n13150378 cubeb -n13150592 schizocarp -n13150894 peperomia -n13151082 watermelon begonia, Peperomia argyreia, Peperomia sandersii -n13152339 yerba mansa, Anemopsis californica -n13154388 pinna, pinnule -n13154494 frond -n13154841 bract -n13155095 bracteole, bractlet -n13155305 involucre -n13155611 glume -n13156986 palmate leaf -n13157137 pinnate leaf -n13157346 bijugate leaf, bijugous leaf, twice-pinnate -n13157481 decompound leaf -n13157684 acuminate leaf -n13157971 deltoid leaf -n13158167 ensiform leaf -n13158512 linear leaf, elongate leaf -n13158605 lyrate leaf -n13158714 obtuse leaf -n13158815 oblanceolate leaf -n13159357 pandurate leaf, panduriform leaf -n13159691 reniform leaf -n13159890 spatulate leaf -n13160116 even-pinnate leaf, abruptly-pinnate leaf -n13160254 odd-pinnate leaf -n13160365 pedate leaf -n13160604 crenate leaf -n13160831 dentate leaf -n13160938 denticulate leaf -n13161151 erose leaf -n13161254 runcinate leaf -n13161904 prickly-edged leaf -n13163553 deadwood -n13163649 haulm, halm -n13163991 branchlet, twig, sprig -n13164501 osier -n13170840 giant scrambling fern, Diplopterygium longissimum -n13171210 umbrella fern, fan fern, Sticherus flabellatus, Gleichenia flabellata -n13171797 floating fern, water sprite, Ceratopteris pteridioides -n13172923 polypody -n13173132 licorice fern, Polypodium glycyrrhiza -n13173259 grey polypody, gray polypody, resurrection fern, Polypodium polypodioides -n13173488 leatherleaf, leathery polypody, coast polypody, Polypodium scouleri -n13173697 rock polypody, rock brake, American wall fern, Polypodium virgianum -n13173882 common polypody, adder's fern, wall fern, golden maidenhair, golden polypody, sweet fern, Polypodium vulgare -n13174354 bear's-paw fern, Aglaomorpha meyeniana -n13174670 strap fern -n13174823 Florida strap fern, cow-tongue fern, hart's-tongue fern -n13175682 basket fern, Drynaria rigidula -n13176363 snake polypody, Microgramma-piloselloides -n13176714 climbing bird's nest fern, Microsorium punctatum -n13177048 golden polypody, serpent fern, rabbit's-foot fern, Phlebodium aureum, Polypodium aureum -n13177529 staghorn fern -n13177768 South American staghorn, Platycerium andinum -n13177884 common staghorn fern, elkhorn fern, Platycerium bifurcatum, Platycerium alcicorne -n13178284 felt fern, tongue fern, Pyrrosia lingua, Cyclophorus lingua -n13178707 potato fern, Solanopteris bifrons -n13179056 myrmecophyte -n13179804 grass fern, ribbon fern, Vittaria lineata -n13180534 spleenwort -n13180875 black spleenwort, Asplenium adiantum-nigrum -n13181055 bird's nest fern, Asplenium nidus -n13181244 ebony spleenwort, Scott's Spleenwort, Asplenium platyneuron -n13181406 black-stem spleenwort, black-stemmed spleenwort, little ebony spleenwort -n13181811 walking fern, walking leaf, Asplenium rhizophyllum, Camptosorus rhizophyllus -n13182164 green spleenwort, Asplenium viride -n13182338 mountain spleenwort, Asplenium montanum -n13182799 lobed spleenwort, Asplenium pinnatifidum -n13182937 lanceolate spleenwort, Asplenium billotii -n13183056 hart's-tongue, hart's-tongue fern, Asplenium scolopendrium, Phyllitis scolopendrium -n13183489 scale fern, scaly fern, Asplenium ceterach, Ceterach officinarum -n13184394 scolopendrium -n13185269 deer fern, Blechnum spicant -n13185658 doodia, rasp fern -n13186388 chain fern -n13186546 Virginia chain fern, Woodwardia virginica -n13187367 silver tree fern, sago fern, black tree fern, Cyathea medullaris -n13188096 davallia -n13188268 hare's-foot fern -n13188462 Canary Island hare's foot fern, Davallia canariensis -n13188767 squirrel's-foot fern, ball fern, Davalia bullata, Davalia bullata mariesii, Davallia Mariesii -n13190060 bracken, Pteridium esculentum -n13190747 soft tree fern, Dicksonia antarctica -n13191148 Scythian lamb, Cibotium barometz -n13191620 false bracken, Culcita dubia -n13191884 thyrsopteris, Thyrsopteris elegans -n13192625 shield fern, buckler fern -n13193143 broad buckler-fern, Dryopteris dilatata -n13193269 fragrant cliff fern, fragrant shield fern, fragrant wood fern, Dryopteris fragrans -n13193466 Goldie's fern, Goldie's shield fern, goldie's wood fern, Dryopteris goldiana -n13193642 wood fern, wood-fern, woodfern -n13193856 male fern, Dryopteris filix-mas -n13194036 marginal wood fern, evergreen wood fern, leatherleaf wood fern, Dryopteris marginalis -n13194212 mountain male fern, Dryopteris oreades -n13194572 lady fern, Athyrium filix-femina -n13194758 Alpine lady fern, Athyrium distentifolium -n13194918 silvery spleenwort, glade fern, narrow-leaved spleenwort, Athyrium pycnocarpon, Diplazium pycnocarpon -n13195341 holly fern, Cyrtomium aculeatum, Polystichum aculeatum -n13195761 bladder fern -n13196003 brittle bladder fern, brittle fern, fragile fern, Cystopteris fragilis -n13196234 mountain bladder fern, Cystopteris montana -n13196369 bulblet fern, bulblet bladder fern, berry fern, Cystopteris bulbifera -n13196738 silvery spleenwort, Deparia acrostichoides, Athyrium thelypteroides -n13197274 oak fern, Gymnocarpium dryopteris, Thelypteris dryopteris -n13197507 limestone fern, northern oak fern, Gymnocarpium robertianum -n13198054 ostrich fern, shuttlecock fern, fiddlehead, Matteuccia struthiopteris, Pteretis struthiopteris, Onoclea struthiopteris -n13198482 hart's-tongue, hart's-tongue fern, Olfersia cervina, Polybotrya cervina, Polybotria cervina -n13198914 sensitive fern, bead fern, Onoclea sensibilis -n13199717 Christmas fern, canker brake, dagger fern, evergreen wood fern, Polystichum acrostichoides -n13199970 holly fern -n13200193 Braun's holly fern, prickly shield fern, Polystichum braunii -n13200542 western holly fern, Polystichum scopulinum -n13200651 soft shield fern, Polystichum setiferum -n13200986 leather fern, leatherleaf fern, ten-day fern, Rumohra adiantiformis, Polystichum adiantiformis -n13201423 button fern, Tectaria cicutaria -n13201566 Indian button fern, Tectaria macrodonta -n13201969 woodsia -n13202125 rusty woodsia, fragrant woodsia, oblong woodsia, Woodsia ilvensis -n13202355 Alpine woodsia, northern woodsia, flower-cup fern, Woodsia alpina -n13202602 smooth woodsia, Woodsia glabella -n13205058 Boston fern, Nephrolepis exaltata, Nephrolepis exaltata bostoniensis -n13205249 basket fern, toothed sword fern, Nephrolepis pectinata -n13206178 golden fern, leather fern, Acrostichum aureum -n13206817 maidenhair, maidenhair fern -n13207094 common maidenhair, Venushair, Venus'-hair fern, southern maidenhair, Venus maidenhair, Adiantum capillus-veneris -n13207335 American maidenhair fern, five-fingered maidenhair fern, Adiantum pedatum -n13207572 Bermuda maidenhair, Bermuda maidenhair fern, Adiantum bellum -n13207736 brittle maidenhair, brittle maidenhair fern, Adiantum tenerum -n13207923 Farley maidenhair, Farley maidenhair fern, Barbados maidenhair, glory fern, Adiantum tenerum farleyense -n13208302 annual fern, Jersey fern, Anogramma leptophylla -n13208705 lip fern, lipfern -n13208965 smooth lip fern, Alabama lip fern, Cheilanthes alabamensis -n13209129 lace fern, Cheilanthes gracillima -n13209270 wooly lip fern, hairy lip fern, Cheilanthes lanosa -n13209460 southwestern lip fern, Cheilanthes eatonii -n13209808 bamboo fern, Coniogramme japonica -n13210350 American rock brake, American parsley fern, Cryptogramma acrostichoides -n13210597 European parsley fern, mountain parsley fern, Cryptogramma crispa -n13211020 hand fern, Doryopteris pedata -n13211790 cliff brake, cliff-brake, rock brake -n13212025 coffee fern, Pellaea andromedifolia -n13212175 purple rock brake, Pellaea atropurpurea -n13212379 bird's-foot fern, Pellaea mucronata, Pellaea ornithopus -n13212559 button fern, Pellaea rotundifolia -n13213066 silver fern, Pityrogramma argentea -n13213397 golden fern, Pityrogramma calomelanos aureoflava -n13213577 gold fern, Pityrogramma chrysophylla -n13214217 Pteris cretica -n13214340 spider brake, spider fern, Pteris multifida -n13214485 ribbon fern, spider fern, Pteris serrulata -n13215258 potato fern, Marattia salicina -n13215586 angiopteris, giant fern, Angiopteris evecta -n13217005 skeleton fork fern, Psilotum nudum -n13219422 horsetail -n13219833 common horsetail, field horsetail, Equisetum arvense -n13219976 swamp horsetail, water horsetail, Equisetum fluviatile -n13220122 scouring rush, rough horsetail, Equisetum hyemale, Equisetum hyemale robustum, Equisetum robustum -n13220355 marsh horsetail, Equisetum palustre -n13220525 wood horsetail, Equisetum Sylvaticum -n13220663 variegated horsetail, variegated scouring rush, Equisetum variegatum -n13221529 club moss, club-moss, lycopod -n13222877 shining clubmoss, Lycopodium lucidulum -n13222985 alpine clubmoss, Lycopodium alpinum -n13223090 fir clubmoss, mountain clubmoss, little clubmoss, Lycopodium selago -n13223588 ground cedar, staghorn moss, Lycopodium complanatum -n13223710 ground fir, princess pine, tree clubmoss, Lycopodium obscurum -n13223843 foxtail grass, Lycopodium alopecuroides -n13224673 spikemoss, spike moss, little club moss -n13224922 meadow spikemoss, basket spikemoss, Selaginella apoda -n13225244 desert selaginella, Selaginella eremophila -n13225365 resurrection plant, rose of Jericho, Selaginella lepidophylla -n13225617 florida selaginella, Selaginella eatonii -n13226320 quillwort -n13226871 earthtongue, earth-tongue -n13228017 snuffbox fern, meadow fern, Thelypteris palustris pubescens, Dryopteris thelypteris pubescens -n13228536 christella -n13229543 mountain fern, Oreopteris limbosperma, Dryopteris oreopteris -n13229951 New York fern, Parathelypteris novae-boracensis, Dryopteris noveboracensis -n13230190 Massachusetts fern, Parathelypteris simulata, Thelypteris simulata -n13230662 beech fern -n13230843 broad beech fern, southern beech fern, Phegopteris hexagonoptera, Dryopteris hexagonoptera, Thelypteris hexagonoptera -n13231078 long beech fern, narrow beech fern, northern beech fern, Phegopteris connectilis, Dryopteris phegopteris, Thelypteris phegopteris -n13231678 shoestring fungus -n13231919 Armillaria caligata, booted armillaria -n13232106 Armillaria ponderosa, white matsutake -n13232363 Armillaria zelleri -n13232779 honey mushroom, honey fungus, Armillariella mellea -n13233727 milkweed, silkweed -n13234114 white milkweed, Asclepias albicans -n13234519 poke milkweed, Asclepias exaltata -n13234678 swamp milkweed, Asclepias incarnata -n13234857 Mead's milkweed, Asclepias meadii, Asclepia meadii -n13235011 purple silkweed, Asclepias purpurascens -n13235159 showy milkweed, Asclepias speciosa -n13235319 poison milkweed, horsetail milkweed, Asclepias subverticillata -n13235503 butterfly weed, orange milkweed, chigger flower, chiggerflower, pleurisy root, tuber root, Indian paintbrush, Asclepias tuberosa -n13235766 whorled milkweed, Asclepias verticillata -n13236100 cruel plant, Araujia sericofera -n13237188 wax plant, Hoya carnosa -n13237508 silk vine, Periploca graeca -n13238375 stapelia, carrion flower, starfish flower -n13238654 Stapelias asterias -n13238988 stephanotis -n13239177 Madagascar jasmine, waxflower, Stephanotis floribunda -n13239736 negro vine, Vincetoxicum hirsutum, Vincetoxicum negrum -n13239921 zygospore -n13240362 tree of knowledge -n13252672 orangery -n13354021 pocketbook -n13555775 shit, dump -n13579829 cordage -n13650447 yard, pace -n13653902 extremum, peak -n13862407 leaf shape, leaf form -n13862552 equilateral -n13862780 figure -n13863020 pencil -n13863186 plane figure, two-dimensional figure -n13863473 solid figure, three-dimensional figure -n13863771 line -n13864035 bulb -n13864153 convex shape, convexity -n13864965 concave shape, concavity, incurvation, incurvature -n13865298 cylinder -n13865483 round shape -n13865904 heart -n13866144 polygon, polygonal shape -n13866626 convex polygon -n13866827 concave polygon -n13867005 reentrant polygon, reentering polygon -n13867492 amorphous shape -n13868248 closed curve -n13868371 simple closed curve, Jordan curve -n13868515 S-shape -n13868944 wave, undulation -n13869045 extrados -n13869547 hook, crotchet -n13869788 envelope -n13869896 bight -n13871717 diameter -n13872592 cone, conoid, cone shape -n13872822 funnel, funnel shape -n13873361 oblong -n13873502 circle -n13873917 circle -n13874073 equator -n13874558 scallop, crenation, crenature, crenel, crenelle -n13875392 ring, halo, annulus, doughnut, anchor ring -n13875571 loop -n13875884 bight -n13876561 helix, spiral -n13877547 element of a cone -n13877667 element of a cylinder -n13878306 ellipse, oval -n13879049 quadrate -n13879320 triangle, trigon, trilateral -n13879816 acute triangle, acute-angled triangle -n13880199 isosceles triangle -n13880415 obtuse triangle, obtuse-angled triangle -n13880551 right triangle, right-angled triangle -n13880704 scalene triangle -n13880994 parallel -n13881512 trapezoid -n13881644 star -n13882201 pentagon -n13882276 hexagon -n13882487 heptagon -n13882563 octagon -n13882639 nonagon -n13882713 decagon -n13882961 rhombus, rhomb, diamond -n13883603 spherical polygon -n13883763 spherical triangle -n13884261 convex polyhedron -n13884384 concave polyhedron -n13884930 cuboid -n13885011 quadrangular prism -n13886260 bell, bell shape, campana -n13888491 angular distance -n13889066 true anomaly -n13889331 spherical angle -n13891547 angle of refraction -n13891937 acute angle -n13893786 groove, channel -n13894154 rut -n13894434 bulge, bump, hump, swelling, gibbosity, gibbousness, jut, prominence, protuberance, protrusion, extrusion, excrescence -n13895262 belly -n13896100 bow, arc -n13896217 crescent -n13897198 ellipsoid -n13897528 hypotenuse -n13897996 balance, equilibrium, equipoise, counterbalance -n13898207 conformation -n13898315 symmetry, proportion -n13898645 spheroid, ellipsoid of revolution -n13899735 spherule -n13900287 toroid -n13900422 column, tower, pillar -n13901211 barrel, drum -n13901321 pipe, tube -n13901423 pellet -n13901490 bolus -n13901858 dewdrop -n13902048 ridge -n13902336 rim -n13902793 taper -n13903079 boundary, edge, bound -n13905121 incisure, incisura -n13905275 notch -n13905792 wrinkle, furrow, crease, crinkle, seam, line -n13906484 dermatoglyphic -n13906669 frown line -n13906767 line of life, life line, lifeline -n13906936 line of heart, heart line, love line, mensal line -n13907272 crevice, cranny, crack, fissure, chap -n13908201 cleft -n13908580 roulette, line roulette -n13911045 node -n13912260 tree, tree diagram -n13912540 stemma -n13914141 brachium -n13914265 fork, crotch -n13914608 block, cube -n13915023 ovoid -n13915113 tetrahedron -n13915209 pentahedron -n13915305 hexahedron -n13915999 regular polyhedron, regular convex solid, regular convex polyhedron, Platonic body, Platonic solid, ideal solid -n13916363 polyhedral angle -n13916721 cube, regular hexahedron -n13917690 truncated pyramid -n13917785 truncated cone -n13918274 tail, tail end -n13918387 tongue, knife -n13918717 trapezohedron -n13919547 wedge, wedge shape, cuneus -n13919919 keel -n13926786 place, shoes -n14131950 herpes -n14175579 chlamydia -n14564779 wall -n14582716 micronutrient -n14583400 chyme -n14585392 ragweed pollen -n14592309 pina cloth -n14603798 chlorobenzylidenemalononitrile, CS gas -n14633206 carbon, C, atomic number 6 -n14685296 charcoal, wood coal -n14696793 rock, stone -n14698884 gravel, crushed rock -n14714645 aflatoxin -n14720833 alpha-tocopheral -n14765422 leopard -n14785065 bricks and mortar -n14786943 lagging -n14804958 hydraulic cement, Portland cement -n14810561 choline -n14820180 concrete -n14821852 glass wool -n14844693 soil, dirt -n14853210 high explosive -n14858292 litter -n14867545 fish meal -n14891255 Greek fire -n14899328 culture medium, medium -n14900184 agar, nutrient agar -n14900342 blood agar -n14908027 hip tile, hipped tile -n14909584 hyacinth, jacinth -n14914945 hydroxide ion, hydroxyl ion -n14915184 ice, water ice -n14919819 inositol -n14938389 linoleum, lino -n14941787 lithia water -n14942411 lodestone, loadstone -n14973585 pantothenic acid, pantothen -n14974264 paper -n14975598 papyrus -n14976759 pantile -n14976871 blacktop, blacktopping -n14977188 tarmacadam, tarmac -n14977504 paving, pavement, paving material -n14992287 plaster -n14993378 poison gas -n15005577 ridge tile -n15006012 roughcast -n15019030 sand -n15048888 spackle, spackling compound -n15060326 render -n15060688 wattle and daub -n15062057 stucco -n15067877 tear gas, teargas, lacrimator, lachrymator -n15075141 toilet tissue, toilet paper, bathroom tissue -n15086247 linseed, flaxseed -n15089258 vitamin -n15089472 fat-soluble vitamin -n15089645 water-soluble vitamin -n15089803 vitamin A, antiophthalmic factor, axerophthol, A -n15090065 vitamin A1, retinol -n15090238 vitamin A2, dehydroretinol -n15090742 B-complex vitamin, B complex, vitamin B complex, vitamin B, B vitamin, B -n15091129 vitamin B1, thiamine, thiamin, aneurin, antiberiberi factor -n15091304 vitamin B12, cobalamin, cyanocobalamin, antipernicious anemia factor -n15091473 vitamin B2, vitamin G, riboflavin, lactoflavin, ovoflavin, hepatoflavin -n15091669 vitamin B6, pyridoxine, pyridoxal, pyridoxamine, adermin -n15091846 vitamin Bc, vitamin M, folate, folic acid, folacin, pteroylglutamic acid, pteroylmonoglutamic acid -n15092059 niacin, nicotinic acid -n15092227 vitamin D, calciferol, viosterol, ergocalciferol, cholecalciferol, D -n15092409 vitamin E, tocopherol, E -n15092650 biotin, vitamin H -n15092751 vitamin K, naphthoquinone, antihemorrhagic factor -n15092942 vitamin K1, phylloquinone, phytonadione -n15093049 vitamin K3, menadione -n15093137 vitamin P, bioflavinoid, citrin -n15093298 vitamin C, C, ascorbic acid -n15102359 planking -n15102455 chipboard, hardboard -n15102894 knothole diff --git a/tensorflow_serving/example/inception_saved_model.py b/tensorflow_serving/example/inception_saved_model.py deleted file mode 100644 index 0ce19d04eb3..00000000000 --- a/tensorflow_serving/example/inception_saved_model.py +++ /dev/null @@ -1,203 +0,0 @@ -# Copyright 2016 Google Inc. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== - -#!/usr/bin/env python2.7 -"""Export inception model given existing training checkpoints. - -The model is exported as SavedModel with proper signatures that can be loaded by -standard tensorflow_model_server. -""" - -from __future__ import print_function - -import os.path - -# This is a placeholder for a Google-internal import. - -import tensorflow as tf - -from inception import inception_model - -tf.app.flags.DEFINE_string('checkpoint_dir', '/tmp/inception_train', - """Directory where to read training checkpoints.""") -tf.app.flags.DEFINE_string('output_dir', '/tmp/inception_output', - """Directory where to export inference model.""") -tf.app.flags.DEFINE_integer('model_version', 1, - """Version number of the model.""") -tf.app.flags.DEFINE_integer('image_size', 299, - """Needs to provide same value as in training.""") -FLAGS = tf.app.flags.FLAGS - -NUM_CLASSES = 1000 -NUM_TOP_CLASSES = 5 - -WORKING_DIR = os.path.dirname(os.path.realpath(__file__)) -SYNSET_FILE = os.path.join(WORKING_DIR, 'imagenet_lsvrc_2015_synsets.txt') -METADATA_FILE = os.path.join(WORKING_DIR, 'imagenet_metadata.txt') - - -def export(): - # Create index->synset mapping - synsets = [] - with open(SYNSET_FILE) as f: - synsets = f.read().splitlines() - # Create synset->metadata mapping - texts = {} - with open(METADATA_FILE) as f: - for line in f.read().splitlines(): - parts = line.split('\t') - assert len(parts) == 2 - texts[parts[0]] = parts[1] - - with tf.Graph().as_default(): - # Build inference model. - # Please refer to Tensorflow inception model for details. - - # Input transformation. - serialized_tf_example = tf.placeholder(tf.string, name='tf_example') - feature_configs = { - 'image/encoded': tf.FixedLenFeature( - shape=[], dtype=tf.string), - } - tf_example = tf.parse_example(serialized_tf_example, feature_configs) - jpegs = tf_example['image/encoded'] - images = tf.map_fn(preprocess_image, jpegs, dtype=tf.float32) - - # Run inference. - logits, _ = inception_model.inference(images, NUM_CLASSES + 1) - - # Transform output to topK result. - values, indices = tf.nn.top_k(logits, NUM_TOP_CLASSES) - - # Create a constant string Tensor where the i'th element is - # the human readable class description for the i'th index. - # Note that the 0th index is an unused background class - # (see inception model definition code). - class_descriptions = ['unused background'] - for s in synsets: - class_descriptions.append(texts[s]) - class_tensor = tf.constant(class_descriptions) - - table = tf.contrib.lookup.index_to_string_table_from_tensor(class_tensor) - classes = table.lookup(tf.to_int64(indices)) - - # Restore variables from training checkpoint. - variable_averages = tf.train.ExponentialMovingAverage( - inception_model.MOVING_AVERAGE_DECAY) - variables_to_restore = variable_averages.variables_to_restore() - saver = tf.train.Saver(variables_to_restore) - with tf.Session() as sess: - # Restore variables from training checkpoints. - ckpt = tf.train.get_checkpoint_state(FLAGS.checkpoint_dir) - if ckpt and ckpt.model_checkpoint_path: - saver.restore(sess, ckpt.model_checkpoint_path) - # Assuming model_checkpoint_path looks something like: - # /my-favorite-path/imagenet_train/model.ckpt-0, - # extract global_step from it. - global_step = ckpt.model_checkpoint_path.split('/')[-1].split('-')[-1] - print('Successfully loaded model from %s at step=%s.' % - (ckpt.model_checkpoint_path, global_step)) - else: - print('No checkpoint file found at %s' % FLAGS.checkpoint_dir) - return - - # Export inference model. - output_path = os.path.join( - tf.compat.as_bytes(FLAGS.output_dir), - tf.compat.as_bytes(str(FLAGS.model_version))) - print('Exporting trained model to', output_path) - builder = tf.saved_model.builder.SavedModelBuilder(output_path) - - # Build the signature_def_map. - classify_inputs_tensor_info = tf.saved_model.utils.build_tensor_info( - serialized_tf_example) - classes_output_tensor_info = tf.saved_model.utils.build_tensor_info( - classes) - scores_output_tensor_info = tf.saved_model.utils.build_tensor_info(values) - - classification_signature = ( - tf.saved_model.signature_def_utils.build_signature_def( - inputs={ - tf.saved_model.signature_constants.CLASSIFY_INPUTS: - classify_inputs_tensor_info - }, - outputs={ - tf.saved_model.signature_constants.CLASSIFY_OUTPUT_CLASSES: - classes_output_tensor_info, - tf.saved_model.signature_constants.CLASSIFY_OUTPUT_SCORES: - scores_output_tensor_info - }, - method_name=tf.saved_model.signature_constants. - CLASSIFY_METHOD_NAME)) - - predict_inputs_tensor_info = tf.saved_model.utils.build_tensor_info(jpegs) - prediction_signature = ( - tf.saved_model.signature_def_utils.build_signature_def( - inputs={'images': predict_inputs_tensor_info}, - outputs={ - 'classes': classes_output_tensor_info, - 'scores': scores_output_tensor_info - }, - method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME - )) - - builder.add_meta_graph_and_variables( - sess, [tf.saved_model.tag_constants.SERVING], - signature_def_map={ - 'predict_images': - prediction_signature, - tf.saved_model.signature_constants. - DEFAULT_SERVING_SIGNATURE_DEF_KEY: - classification_signature, - }, - main_op=tf.tables_initializer(), - strip_default_attrs=True) - - builder.save() - print('Successfully exported model to %s' % FLAGS.output_dir) - - -def preprocess_image(image_buffer): - """Preprocess JPEG encoded bytes to 3D float Tensor.""" - - # Decode the string as an RGB JPEG. - # Note that the resulting image contains an unknown height and width - # that is set dynamically by decode_jpeg. In other words, the height - # and width of image is unknown at compile-time. - image = tf.image.decode_jpeg(image_buffer, channels=3) - # After this point, all image pixels reside in [0,1) - # until the very end, when they're rescaled to (-1, 1). The various - # adjust_* ops all require this range for dtype float. - image = tf.image.convert_image_dtype(image, dtype=tf.float32) - # Crop the central region of the image with an area containing 87.5% of - # the original image. - image = tf.image.central_crop(image, central_fraction=0.875) - # Resize the image to the original height and width. - image = tf.expand_dims(image, 0) - image = tf.image.resize_bilinear( - image, [FLAGS.image_size, FLAGS.image_size], align_corners=False) - image = tf.squeeze(image, [0]) - # Finally, rescale to [-1,1] instead of [0, 1) - image = tf.subtract(image, 0.5) - image = tf.multiply(image, 2.0) - return image - - -def main(unused_argv=None): - export() - - -if __name__ == '__main__': - tf.app.run() diff --git a/tensorflow_serving/example/inception_client.cc b/tensorflow_serving/example/resnet_client.cc similarity index 96% rename from tensorflow_serving/example/inception_client.cc rename to tensorflow_serving/example/resnet_client.cc index 460d1729f68..3a7cb1f1419 100644 --- a/tensorflow_serving/example/inception_client.cc +++ b/tensorflow_serving/example/resnet_client.cc @@ -76,7 +76,7 @@ class ServingClient { proto.mutable_tensor_shape()->add_dim()->set_size(1); - inputs["images"] = proto; + inputs["image_bytes"] = proto; Status status = stub_->Predict(&context, predictRequest, &response); @@ -116,10 +116,10 @@ class ServingClient { }; int main(int argc, char** argv) { - tensorflow::string server_port = "localhost:9000"; + tensorflow::string server_port = "localhost:8500"; tensorflow::string image_file = ""; - tensorflow::string model_name = "inception"; - tensorflow::string model_signature_name = "predict_images"; + tensorflow::string model_name = "resnet"; + tensorflow::string model_signature_name = "serving_default"; std::vector flag_list = { tensorflow::Flag("server_port", &server_port, "the IP and port of the server"), diff --git a/tensorflow_serving/example/inception_client.py b/tensorflow_serving/example/resnet_client_grpc.py similarity index 58% rename from tensorflow_serving/example/inception_client.py rename to tensorflow_serving/example/resnet_client_grpc.py index 0a7e0eefe17..df580fa460c 100644 --- a/tensorflow_serving/example/inception_client.py +++ b/tensorflow_serving/example/resnet_client_grpc.py @@ -12,10 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # ============================================================================== +"""Send JPEG image to tensorflow_model_server loaded with ResNet model. -#!/usr/bin/env python2.7 - -"""Send JPEG image to tensorflow_model_server loaded with inception model. """ from __future__ import print_function @@ -23,32 +21,42 @@ # This is a placeholder for a Google-internal import. import grpc +import requests import tensorflow as tf from tensorflow_serving.apis import predict_pb2 from tensorflow_serving.apis import prediction_service_pb2_grpc +# The image URL is the location of the image we should send to the server +IMAGE_URL = 'https://tensorflow.org/images/blogs/serving/cat.jpg' -tf.app.flags.DEFINE_string('server', 'localhost:9000', +tf.app.flags.DEFINE_string('server', 'localhost:8500', 'PredictionService host:port') tf.app.flags.DEFINE_string('image', '', 'path to image in JPEG format') FLAGS = tf.app.flags.FLAGS def main(_): + if FLAGS.image: + with open(FLAGS.image, 'rb') as f: + data = f.read() + else: + # Download the image since we weren't given one + dl_request = requests.get(IMAGE_URL, stream=True) + dl_request.raise_for_status() + data = dl_request.content + channel = grpc.insecure_channel(FLAGS.server) stub = prediction_service_pb2_grpc.PredictionServiceStub(channel) # Send request - with open(FLAGS.image, 'rb') as f: - # See prediction_service.proto for gRPC request/response details. - data = f.read() - request = predict_pb2.PredictRequest() - request.model_spec.name = 'inception' - request.model_spec.signature_name = 'predict_images' - request.inputs['images'].CopyFrom( - tf.contrib.util.make_tensor_proto(data, shape=[1])) - result = stub.Predict(request, 10.0) # 10 secs timeout - print(result) + # See prediction_service.proto for gRPC request/response details. + request = predict_pb2.PredictRequest() + request.model_spec.name = 'resnet' + request.model_spec.signature_name = 'serving_default' + request.inputs['image_bytes'].CopyFrom( + tf.contrib.util.make_tensor_proto(data, shape=[1])) + result = stub.Predict(request, 10.0) # 10 secs timeout + print(result) if __name__ == '__main__': diff --git a/tensorflow_serving/example/inception_k8s.yaml b/tensorflow_serving/example/resnet_k8s.yaml similarity index 81% rename from tensorflow_serving/example/inception_k8s.yaml rename to tensorflow_serving/example/resnet_k8s.yaml index b380cad495c..ed1de3fa78c 100644 --- a/tensorflow_serving/example/inception_k8s.yaml +++ b/tensorflow_serving/example/resnet_k8s.yaml @@ -16,17 +16,17 @@ apiVersion: extensions/v1beta1 kind: Deployment metadata: - name: inception-deployment + name: resnet-deployment spec: replicas: 3 template: metadata: labels: - app: inception-server + app: resnet-server spec: containers: - - name: inception-container - image: gcr.io/tensorflow-serving/inception + - name: resnet-container + image: gcr.io/tensorflow-serving/resnet ports: - containerPort: 8500 --- @@ -34,12 +34,12 @@ apiVersion: v1 kind: Service metadata: labels: - run: inception-service - name: inception-service + run: resnet-service + name: resnet-service spec: ports: - port: 8500 targetPort: 8500 selector: - app: inception-server + app: resnet-server type: LoadBalancer diff --git a/tensorflow_serving/g3doc/_book.yaml b/tensorflow_serving/g3doc/_book.yaml index 36e0f67eaac..96a7bd24282 100644 --- a/tensorflow_serving/g3doc/_book.yaml +++ b/tensorflow_serving/g3doc/_book.yaml @@ -23,16 +23,16 @@ upper_tabs: path: /serving/api_rest - title: Build a TensorFlow ModelServer path: /serving/serving_advanced - - title: Serve Inception Model with TensorFlow Serving and Kubernetes - path: /serving/serving_inception + - title: Use TensorFlow Serving with Docker + path: /serving/docker + - title: Use TensorFlow Serving with Kubernetes + path: /serving/serving_kubernetes - title: Create a new kind of servable path: /serving/custom_servable - title: Create a module that discovers new servable paths path: /serving/custom_source - title: SignatureDefs in SavedModel for TensorFlow Serving path: /serving/signature_defs - - title: Use TensorFlow Serving with Docker - path: /serving/docker - name: API skip_translation: true contents: diff --git a/tensorflow_serving/g3doc/serving_advanced.md b/tensorflow_serving/g3doc/serving_advanced.md index 5d7978cb96b..81c0435c638 100644 --- a/tensorflow_serving/g3doc/serving_advanced.md +++ b/tensorflow_serving/g3doc/serving_advanced.md @@ -45,30 +45,21 @@ cd serving Clear the export directory if it already exists: ```shell -rm -rf ./models -``` - -Build the mnist trainer: - -```shell -tools/bazel_in_docker.sh bazel build \ - tensorflow_serving/example:mnist_saved_model +rm -rf /tmp/models ``` Train (with 100 iterations) and export the first version of model: ```shell -tools/bazel_in_docker.sh \ - bazel-bin/tensorflow_serving/example/mnist_saved_model \ - --training_iteration=100 --model_version=1 models/mnist +tools/run_in_docker.sh python tensorflow_serving/example/mnist_saved_model.py \ + --training_iteration=100 --model_version=1 /tmp/mnist ``` Train (with 2000 iterations) and export the second version of model: ```shell -tools/bazel_in_docker.sh \ - bazel-bin/tensorflow_serving/example/mnist_saved_model \ - --training_iteration=2000 --model_version=2 models/mnist +tools/run_in_docker.sh python tensorflow_serving/example/mnist_saved_model.py \ + --training_iteration=2000 --model_version=2 /tmp/mnist ``` As you can see in `mnist_saved_model.py`, the training and exporting is done the @@ -78,10 +69,10 @@ iterations for the first run and exporting it as v1, while training it normally for the second run and exporting it as v2 to the same parent directory -- as we expect the latter to achieve better classification accuracy due to more intensive training. You should see training data for each training run in your -`mnist_model` directory: +`/tmp/mnist` directory: ```console -$ ls models/mnist_model +$ ls /tmp/mnist 1 2 ``` @@ -276,15 +267,15 @@ To put all these into the context of this tutorial: Copy the first version of the export to the monitored folder: ```shell -mkdir models/monitored -cp -r models/mnist/1 models/monitored +mkdir /tmp/monitored +cp -r /tmp/mnist/1 /tmp/monitored ``` Then start the server: ```shell docker run -p 8500:8500 \ - --mount type=bind,source=$(pwd)/models/monitored,target=/models/mnist \ + --mount type=bind,source=/tmp/monitored,target=/models/mnist \ -t --entrypoint=tensorflow_model_server tensorflow/serving --enable_batching \ --port=8500 --model_name=mnist --model_base_path=/models/mnist & ``` @@ -293,18 +284,11 @@ The server will emit log messages every one second that say "Aspiring version for servable ...", which means it has found the export, and is tracking its continued existence. -First let's build the client: - -```shell -tools/bazel_in_docker.sh bazel build -c opt \ - tensorflow_serving/example:mnist_client -``` - -Now run the test with `--concurrency=10`. This will send concurrent requests to -the server and thus trigger your batching logic. +Let's run the client with `--concurrency=10`. This will send concurrent requests +to the server and thus trigger your batching logic. ```shell -tools/bazel_in_docker.sh bazel-bin/tensorflow_serving/example/mnist_client \ +tools/run_in_docker.sh python tensorflow_serving/example/mnist_client.py \ --num_tests=1000 --server=127.0.0.1:8500 --concurrency=10 ``` @@ -319,8 +303,8 @@ Then we copy the second version of the export to the monitored folder and re-run the test: ```shell -cp -r models/mnist/2 models/monitored -tools/bazel_in_docker.sh bazel-bin/tensorflow_serving/example/mnist_client \ +cp -r /tmp/mnist/2 /tmp/monitored +tools/run_in_docker.sh python tensorflow_serving/example/mnist_client.py \ --num_tests=1000 --server=127.0.0.1:8500 --concurrency=10 ``` diff --git a/tensorflow_serving/g3doc/serving_basic.md b/tensorflow_serving/g3doc/serving_basic.md index 95512d2a090..75fff7cdf85 100644 --- a/tensorflow_serving/g3doc/serving_basic.md +++ b/tensorflow_serving/g3doc/serving_basic.md @@ -24,7 +24,7 @@ The code for this tutorial consists of two parts: The TensorFlow Serving ModelServer discovers new exported models and runs a [gRPC](http://www.grpc.io) service for serving them. -Before getting started, first [install Docker](docker.md#installing-docker) +Before getting started, first [install Docker](docker.md#installing-docker). ## Train and export TensorFlow model @@ -155,35 +155,15 @@ cd serving Clear the export directory if it already exists: ```shell -rm -rf models/mnist +rm -rf /tmp/mnist ``` -If you would like to install the `tensorflow` and `tensorflow-serving-api` PIP -packages, you can run all Python code (export and client) using a simple -`python` command. To install the PIP package, follow the -[instructions here](setup.md#tensorflow-serving-python-api-pip-package). It's -also possible to use Bazel to build the necessary dependencies and run all code -without installing those packages. The rest of the codelab will have -instructions for both the Bazel and PIP options. +Now let's train the model: -* **PIP**: - - ```shell - python tensorflow_serving/example/mnist_saved_model.py models/mnist - ``` - -* **Bazel**: - - ```shell - tools/bazel_in_docker.sh bazel build tensorflow_serving/example:mnist_saved_model - tools/bazel_in_docker.sh bazel-bin/tensorflow_serving/example/mnist_saved_model models/mnist - ``` - - TIP: Building from sources consumes a lot of RAM. If RAM is an issue on your - system, you may limit RAM usage by specifying - `--local_resources=2048,.5,1.0` while invoking Bazel. See the - [Bazel docs](https://docs.bazel.build/versions/master/user-manual.html#flag--local_resources) - for more information. +```shell +tools/run_in_docker.sh python tensorflow_serving/example/mnist_saved_model.py \ + /tmp/mnist +``` This should result in output that looks like: @@ -200,7 +180,7 @@ Done exporting! Now let's take a look at the export directory. ```console -$ ls models/mnist +$ ls /tmp/mnist 1 ``` @@ -209,7 +189,7 @@ of the model. `FLAGS.model_version` has the default value of 1, therefore the corresponding sub-directory `1` is created. ```console -$ ls models/mnist/1 +$ ls /tmp/mnist/1 saved_model.pb variables ``` @@ -229,7 +209,7 @@ Use a Docker serving image to easily load the model for serving: ```shell docker run -p 8500:8500 \ ---mount type=bind,source=$(pwd)/models/mnist,target=/models/mnist \ +--mount type=bind,source=/tmp/mnist,target=/models/mnist \ -e MODEL_NAME=mnist -t tensorflow/serving & ``` @@ -240,20 +220,10 @@ We can use the provided utility to test the server. The client downloads MNIST test data, sends them as requests to the server, and calculates the inference error rate. -* **PIP**: - - ```shell - python tensorflow_serving/example/mnist_client.py --num_tests=1000 --server=127.0.0.1:8500 - ``` - -* **Bazel**: - - ```shell - tools/bazel_in_docker.sh bazel build \ - tensorflow_serving/example:mnist_client - tools/bazel_in_docker.sh bazel-bin/tensorflow_serving/example/mnist_client \ - --num_tests=1000 --server=127.0.0.1:8500 - ``` +```shell +tools/run_in_docker.sh python tensorflow_serving/example/mnist_client.py \ + --num_tests=1000 --server=127.0.0.1:8500 +``` This should output something like diff --git a/tensorflow_serving/g3doc/serving_inception.md b/tensorflow_serving/g3doc/serving_inception.md deleted file mode 100644 index c2c5f1fa3a4..00000000000 --- a/tensorflow_serving/g3doc/serving_inception.md +++ /dev/null @@ -1,387 +0,0 @@ -# Serving Inception Model with TensorFlow Serving and Kubernetes - -This tutorial shows how to use TensorFlow Serving components running in Docker -containers to serve the TensorFlow Inception model and how to deploy the -serving cluster with Kubernetes. - -To learn more about TensorFlow Serving, we recommend -[TensorFlow Serving basic tutorial](serving_basic.md) and -[TensorFlow Serving advanced tutorial](serving_advanced.md). - -To learn more about TensorFlow Inception model, we recommend -[Inception in TensorFlow](https://github.com/tensorflow/models/tree/master/research/inception). - -- [Part 1](#part_1_export_the_inception_model) shows how to export the - Inception model -- [Part 2](#part_2_run_in_local_docker_container) shows how to run the local - Docker serving image -- [Part 3](#part_3_deploy_in_kubernetes) shows how to deploy in Kubernetes. - -## Part 1: Export the Inception model - -Before getting started, first [install Docker](docker.md#installing-docker) - -### Clone Tensorflow Serving - -First we want to clone the TensorFlow Serving source to our local machine: - -```shell -git clone https://github.com/tensorflow/serving -cd serving -``` - -Clear our local models directory in case we already have one - -```shell -rm -rf ./models/inception -``` - -### Build TensorFlow Serving Inception model exporter - -Next, we will build the Inception model exporter using a docker container. - -Note: All `bazel build` commands below use the standard `-c opt` flag. To -further optimize the build, refer to the -[instructions here](setup.md#optimized-build). - -```shell -tools/bazel_in_docker.sh bazel build \ - tensorflow_serving/example:inception_saved_model -``` - -### Export Inception model - -With the inception model built, we run -[inception_saved_model.py](https://github.com/tensorflow/serving/tree/master/tensorflow_serving/example/inception_saved_model.py) -to export the Inception model using the released -[Inception model training checkpoint](http://download.tensorflow.org/models/image/imagenet/inception-v3-2016-03-01.tar.gz). -Instead of training from scratch, we use the readily available checkpoints of -well trained variables to restore the inference graph and export it directly. - -```shell -curl -O http://download.tensorflow.org/models/image/imagenet/inception-v3-2016-03-01.tar.gz -tar xzf inception-v3-2016-03-01.tar.gz -``` - -We can verify we have the checkpoint: - -```console -$ ls inception-v3 -README.txt checkpoint model.ckpt-157585 -``` - -Now let's export the Inception model: - -```shell -tools/bazel_in_docker.sh \ - bazel-bin/tensorflow_serving/example/inception_saved_model \ - --checkpoint_dir=inception-v3 --output_dir=models/inception -``` - -This should result in output like: - -```console -Successfully loaded model from inception-v3/model.ckpt-157585 at step=157585. -Exporting trained model to models/inception/1 -Successfully exported model to models/inception -$ ls models/inception -1 -``` - -## Part 2: Run in local Docker container - -### Commit image for deployment - -Now we want to take a serving image and -[commit](https://docs.docker.com/engine/reference/commandline/commit/) all -changes to a new image `$USER/inception_serving` for Kubernetes deployment. - -First we run a serving image as a daemon: - -```shell -docker run -d --name serving_base tensorflow/serving -``` - -Next, we copy the Inception model data to the container's model folder: - -```shell -docker cp models/inception serving_base:/models/inception -``` - -Finally we commit the container to serving the Inception model: - -```shell -docker commit --change "ENV MODEL_NAME inception" serving_base \ - $USER/inception_serving -``` - -Now let's stop the serving base container - -```shell -docker kill serving_base -``` - -### Start the server - -Now let's start the container with the Inception model so it's ready for -serving, exposing the gRPC port 8500: - -```shell -docker run -p 8500:8500 -t $USER/inception_serving & -``` - -### Query the server - -Query the server with [inception_client.py](https://github.com/tensorflow/serving/tree/master/tensorflow_serving/example/inception_client.py). -The client sends an image specified by the command line parameter to the server -over gRPC for classification into human readable descriptions of the -[ImageNet](http://www.image-net.org/) categories. - -Note: We leave it as an exercise to the reader to find an image of a cat on the -Internet. - -```shell -tools/bazel_in_docker.sh bazel build \ - tensorflow_serving/example:inception_client -tools/bazel_in_docker.sh bazel-bin/tensorflow_serving/example/inception_client \ - --server=127.0.0.1:8500 --image=local/path/to/my_cat_image.jpg -``` - -This should result in output like: - -```console -outputs { - key: "classes" - value { - dtype: DT_STRING - tensor_shape { - dim { - size: 1 - } - dim { - size: 5 - } - } - string_val: "tiger cat" - string_val: "Egyptian cat" - string_val: "tabby, tabby cat" - string_val: "lynx, catamount" - string_val: "Cardigan, Cardigan Welsh corgi" - } -} -outputs { - key: "scores" - value { - dtype: DT_FLOAT - tensor_shape { - dim { - size: 1 - } - dim { - size: 5 - } - } - float_val: 9.5486907959 - float_val: 8.52025032043 - float_val: 8.05995368958 - float_val: 4.30645561218 - float_val: 3.93207240105 - } -} -``` - -It works! The server successfully classifies your cat image! - -## Part 3: Deploy in Kubernetes - -In this section we use the container image built in Part 0 to deploy a serving -cluster with [Kubernetes](http://kubernetes.io) in the -[Google Cloud Platform](http://cloud.google.com). - - -### GCloud project login - -Here we assume you have created and logged in a -[gcloud](https://cloud.google.com/sdk/gcloud/) project named -`tensorflow-serving`. - -```shell -gcloud auth login --project tensorflow-serving -``` - -### Create a container cluster - -First we create a -[Google Kubernetes Engine](https://cloud.google.com/container-engine/) cluster -for service deployment. - -```shell -$ gcloud container clusters create inception-serving-cluster --num-nodes 5 -``` - -Which should output something like: - -```console -Creating cluster inception-serving-cluster...done. -Created [https://container.googleapis.com/v1/projects/tensorflow-serving/zones/us-central1-f/clusters/inception-serving-cluster]. -kubeconfig entry generated for inception-serving-cluster. -NAME ZONE MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS -inception-serving-cluster us-central1-f 1.1.8 104.197.163.119 n1-standard-1 1.1.8 5 RUNNING -``` - -Set the default cluster for gcloud container command and pass cluster -credentials to [kubectl](http://kubernetes.io/docs/user-guide/kubectl-overview/). - -```shell -gcloud config set container/cluster inception-serving-cluster -gcloud container clusters get-credentials inception-serving-cluster -``` - -which should result in: - -```console -Fetching cluster endpoint and auth data. -kubeconfig entry generated for inception-serving-cluster. -``` - -### Upload the Docker image - -Let's now push our image to the -[Google Container Registry](https://cloud.google.com/container-registry/docs/) -so that we can run it on Google Cloud Platform. - -First we tag the `$USER/inception_serving` image using the Container Registry -format and our project name, - -```shell -docker tag $USER/inception_serving gcr.io/tensorflow-serving/inception -``` - -Next we push the image to the Registry, - -```shell -gcloud docker -- push gcr.io/tensorflow-serving/inception -``` - -### Create Kubernetes Deployment and Service - -The deployment consists of 3 replicas of `inception_inference` server -controlled by a -[Kubernetes Deployment](http://kubernetes.io/docs/user-guide/deployments/). -The replicas are exposed externally by a -[Kubernetes Service](http://kubernetes.io/docs/user-guide/services/) -along with an -[External Load Balancer](http://kubernetes.io/docs/user-guide/load-balancer/). - -We create them using the example Kubernetes config -[inception_k8s.yaml](https://github.com/tensorflow/serving/tree/master/tensorflow_serving/example/inception_k8s.yaml). - -```shell -kubectl create -f tensorflow_serving/example/inception_k8s.yaml -``` - -With output: - -```console -deployment "inception-deployment" created -service "inception-service" created -``` - -To view status of the deployment and pods: - -```console -$ kubectl get deployments -NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE -inception-deployment 3 3 3 3 5s -``` - -```console -$ kubectl get pods -NAME READY STATUS RESTARTS AGE -inception-deployment-bbcbc 1/1 Running 0 10s -inception-deployment-cj6l2 1/1 Running 0 10s -inception-deployment-t1uep 1/1 Running 0 10s -``` - -To view status of the service: - -```console -$ kubectl get services -NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE -inception-service 10.239.240.227 104.155.184.157 8500/TCP 1m -``` - -It can take a while for everything to be up and running. - -```console -$ kubectl describe service inception-service -Name: inception-service -Namespace: default -Labels: run=inception-service -Selector: run=inception-service -Type: LoadBalancer -IP: 10.239.240.227 -LoadBalancer Ingress: 104.155.184.157 -Port: 8500/TCP -NodePort: 30334/TCP -Endpoints: -Session Affinity: None -Events: - FirstSeen LastSeen Count From SubobjectPath Type Reason Message - --------- -------- ----- ---- ------------- -------- ------ ------- - 1m 1m 1 {service-controller } Normal CreatingLoadBalancer Creating load balancer - 1m 1m 1 {service-controller } Normal CreatedLoadBalancer Created load balancer -``` - -The service external IP address is listed next to LoadBalancer Ingress. - -### Query the model - -We can now query the service at its external address from our local host. - -```console -$ tools/bazel_in_docker.sh \ - bazel-bin/tensorflow_serving/example/inception_client \ - --server=104.155.184.157:8500 --image=local/path/to/my_cat_image.jpg -outputs { - key: "classes" - value { - dtype: DT_STRING - tensor_shape { - dim { - size: 1 - } - dim { - size: 5 - } - } - string_val: "tiger cat" - string_val: "Egyptian cat" - string_val: "tabby, tabby cat" - string_val: "lynx, catamount" - string_val: "Cardigan, Cardigan Welsh corgi" - } -} -outputs { - key: "scores" - value { - dtype: DT_FLOAT - tensor_shape { - dim { - size: 1 - } - dim { - size: 5 - } - } - float_val: 9.5486907959 - float_val: 8.52025032043 - float_val: 8.05995368958 - float_val: 4.30645561218 - float_val: 3.93207240105 - } -} -``` - -You have successfully deployed Inception model serving as a service in -Kubernetes! diff --git a/tensorflow_serving/g3doc/serving_kubernetes.md b/tensorflow_serving/g3doc/serving_kubernetes.md new file mode 100644 index 00000000000..4022025e328 --- /dev/null +++ b/tensorflow_serving/g3doc/serving_kubernetes.md @@ -0,0 +1,366 @@ +# Use TensorFlow Serving with Kubernetes + +This tutorial shows how to use TensorFlow Serving components running in Docker +containers to serve the TensorFlow ResNet model and how to deploy the serving +cluster with Kubernetes. + +To learn more about TensorFlow Serving, we recommend +[TensorFlow Serving basic tutorial](serving_basic.md) and +[TensorFlow Serving advanced tutorial](serving_advanced.md). + +To learn more about TensorFlow ResNet model, we recommend reading +[ResNet in TensorFlow](https://github.com/tensorflow/models/tree/master/official/resnet). + +- [Part 1](#part_1_setup) gets your environment setup +- [Part 2](#part_2_running_in_docker) shows how to run the local Docker + serving image +- [Part 3](#part_3_deploy_in_kubernetes) shows how to deploy in Kubernetes. + +## Part 1: Setup + +Before getting started, first [install Docker](docker.md#installing-docker). + +### Download the ResNet SavedModel + +Let's clear our local models directory in case we already have one: + +```shell +rm -rf /tmp/resnet +``` + +Deep residual networks, or ResNets for short, provided the breakthrough idea of +identity mappings in order to enable training of very deep convolutional neural +networks. For our example, we will download a TensorFlow SavedModel of ResNet +for the ImageNet dataset. + +```shell +mkdir /tmp/resnet +curl -s http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v2_fp32_savedmodel_NHWC_jpg.tar.gz| \ +tar --strip-components=2 -C /tmp/resnet -xvz +``` + +We can verify we have the SavedModel: + +```console +$ ls /tmp/resnet/* +saved_model.pb variables +``` + +## Part 2: Running in Docker + +### Commit image for deployment + +Now we want to take a serving image and +[commit](https://docs.docker.com/engine/reference/commandline/commit/) all +changes to a new image `$USER/resnet_serving` for Kubernetes deployment. + +First we run a serving image as a daemon: + +```shell +docker run -d --name serving_base tensorflow/serving +``` + +Next, we copy the ResNet model data to the container's model folder: + +```shell +docker cp /tmp/resnet serving_base:/models/resnet +``` + +Finally we commit the container to serving the ResNet model: + +```shell +docker commit --change "ENV MODEL_NAME resnet" serving_base \ + $USER/resnet_serving +``` + +Now let's stop the serving base container + +```shell +docker kill serving_base +docker rm serving_base +``` + +### Start the server + +Now let's start the container with the ResNet model so it's ready for serving, +exposing the gRPC port 8500: + +```shell +docker run -p 8500:8500 -t $USER/resnet_serving & +``` + +### Query the server + +For the client, we will need to clone the TensorFlow Serving GitHub repo: + +```shell +git clone https://github.com/tensorflow/serving +cd serving +``` + +Query the server with +[resnet_client_grpc.py](https://github.com/tensorflow/serving/tree/master/tensorflow_serving/example/resnet_client_grpc.py). +The client downloads an image and sends it over gRPC for classification into +[ImageNet](http://www.image-net.org/) categories. + +```shell +tools/run_in_docker.sh python tensorflow_serving/example/resnet_client_grpc.py +``` + +This should result in output like: + +```console +outputs { + key: "classes" + value { + dtype: DT_INT64 + tensor_shape { + dim { + size: 1 + } + } + int64_val: 286 + } +} +outputs { + key: "probabilities" + value { + dtype: DT_FLOAT + tensor_shape { + dim { + size: 1 + } + dim { + size: 1001 + } + } + float_val: 2.41628322328e-06 + float_val: 1.90121829746e-06 + float_val: 2.72477100225e-05 + float_val: 4.42638565801e-07 + float_val: 8.98362372936e-07 + float_val: 6.84421956976e-06 + float_val: 1.66555237229e-05 +... + float_val: 1.59407863976e-06 + float_val: 1.2315689446e-06 + float_val: 1.17812135159e-06 + float_val: 1.46365800902e-05 + float_val: 5.81210713335e-07 + float_val: 6.59980651108e-05 + float_val: 0.00129527016543 + } +} +model_spec { + name: "resnet" + version { + value: 1538687457 + } + signature_name: "serving_default" +} +``` + +It works! The server successfully classifies a cat image! + +## Part 3: Deploy in Kubernetes + +In this section we use the container image built in Part 0 to deploy a serving +cluster with [Kubernetes](http://kubernetes.io) in the +[Google Cloud Platform](http://cloud.google.com). + + +### GCloud project login + +Here we assume you have created and logged in a +[gcloud](https://cloud.google.com/sdk/gcloud/) project named +`tensorflow-serving`. + +```shell +gcloud auth login --project tensorflow-serving +``` + +### Create a container cluster + +First we create a +[Google Kubernetes Engine](https://cloud.google.com/container-engine/) cluster +for service deployment. + +```shell +$ gcloud container clusters create resnet-serving-cluster --num-nodes 5 +``` + +Which should output something like: + +```console +Creating cluster resnet-serving-cluster...done. +Created [https://container.googleapis.com/v1/projects/tensorflow-serving/zones/us-central1-f/clusters/resnet-serving-cluster]. +kubeconfig entry generated for resnet-serving-cluster. +NAME ZONE MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS +resnet-serving-cluster us-central1-f 1.1.8 104.197.163.119 n1-standard-1 1.1.8 5 RUNNING +``` + +Set the default cluster for gcloud container command and pass cluster +credentials to [kubectl](http://kubernetes.io/docs/user-guide/kubectl-overview/). + +```shell +gcloud config set container/cluster resnet-serving-cluster +gcloud container clusters get-credentials resnet-serving-cluster +``` + +which should result in: + +```console +Fetching cluster endpoint and auth data. +kubeconfig entry generated for resnet-serving-cluster. +``` + +### Upload the Docker image + +Let's now push our image to the +[Google Container Registry](https://cloud.google.com/container-registry/docs/) +so that we can run it on Google Cloud Platform. + +First we tag the `$USER/resnet_serving` image using the Container Registry +format and our project name, + +```shell +docker tag $USER/resnet_serving gcr.io/tensorflow-serving/resnet +``` + +Next we push the image to the Registry, + +```shell +gcloud docker -- push gcr.io/tensorflow-serving/resnet +``` + +### Create Kubernetes Deployment and Service + +The deployment consists of 3 replicas of `resnet_inference` server controlled by +a [Kubernetes Deployment](http://kubernetes.io/docs/user-guide/deployments/). +The replicas are exposed externally by a +[Kubernetes Service](http://kubernetes.io/docs/user-guide/services/) along with +an +[External Load Balancer](http://kubernetes.io/docs/user-guide/load-balancer/). + +We create them using the example Kubernetes config +[resnet_k8s.yaml](https://github.com/tensorflow/serving/tree/master/tensorflow_serving/example/resnet_k8s.yaml). + +```shell +kubectl create -f tensorflow_serving/example/resnet_k8s.yaml +``` + +With output: + +```console +deployment "resnet-deployment" created +service "resnet-service" created +``` + +To view status of the deployment and pods: + +```console +$ kubectl get deployments +NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE +resnet-deployment 3 3 3 3 5s +``` + +```console +$ kubectl get pods +NAME READY STATUS RESTARTS AGE +resnet-deployment-bbcbc 1/1 Running 0 10s +resnet-deployment-cj6l2 1/1 Running 0 10s +resnet-deployment-t1uep 1/1 Running 0 10s +``` + +To view status of the service: + +```console +$ kubectl get services +NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE +resnet-service 10.239.240.227 104.155.184.157 8500/TCP 1m +``` + +It can take a while for everything to be up and running. + +```console +$ kubectl describe service resnet-service +Name: resnet-service +Namespace: default +Labels: run=resnet-service +Selector: run=resnet-service +Type: LoadBalancer +IP: 10.239.240.227 +LoadBalancer Ingress: 104.155.184.157 +Port: 8500/TCP +NodePort: 30334/TCP +Endpoints: +Session Affinity: None +Events: + FirstSeen LastSeen Count From SubobjectPath Type Reason Message + --------- -------- ----- ---- ------------- -------- ------ ------- + 1m 1m 1 {service-controller } Normal CreatingLoadBalancer Creating load balancer + 1m 1m 1 {service-controller } Normal CreatedLoadBalancer Created load balancer +``` + +The service external IP address is listed next to LoadBalancer Ingress. + +### Query the model + +We can now query the service at its external address from our local host. + +```console +$ tools/run_in_docker.sh python \ + tensorflow_serving/example/resnet_client_grpc.py \ + --server=104.155.184.157:8500 +outputs { + key: "classes" + value { + dtype: DT_INT64 + tensor_shape { + dim { + size: 1 + } + } + int64_val: 286 + } +} +outputs { + key: "probabilities" + value { + dtype: DT_FLOAT + tensor_shape { + dim { + size: 1 + } + dim { + size: 1001 + } + } + float_val: 2.41628322328e-06 + float_val: 1.90121829746e-06 + float_val: 2.72477100225e-05 + float_val: 4.42638565801e-07 + float_val: 8.98362372936e-07 + float_val: 6.84421956976e-06 + float_val: 1.66555237229e-05 +... + float_val: 1.59407863976e-06 + float_val: 1.2315689446e-06 + float_val: 1.17812135159e-06 + float_val: 1.46365800902e-05 + float_val: 5.81210713335e-07 + float_val: 6.59980651108e-05 + float_val: 0.00129527016543 + } +} +model_spec { + name: "resnet" + version { + value: 1538687457 + } + signature_name: "serving_default" +} +``` + +You have successfully deployed the ResNet model serving as a service in +Kubernetes! diff --git a/tensorflow_serving/g3doc/setup.md b/tensorflow_serving/g3doc/setup.md index 1568c1be8a6..70429202244 100644 --- a/tensorflow_serving/g3doc/setup.md +++ b/tensorflow_serving/g3doc/setup.md @@ -103,7 +103,7 @@ cd serving #### Build In order to build in a hermetic environment with all dependencies taken care of, -we will use the `bazel_in_docker.sh` script. This script passes build commands +we will use the `run_in_docker.sh` script. This script passes build commands through to a Docker container. By default, the script will build with the latest nightly Docker development image. @@ -113,7 +113,7 @@ build individual targets or the entire source tree. To build the entire tree, execute: ```shell -tools/bazel_in_docker.sh bazel build -c opt tensorflow_serving/... +tools/run_in_docker.sh bazel build -c opt tensorflow_serving/... ``` Binaries are placed in the bazel-bin directory, and can be run using a command @@ -126,7 +126,7 @@ bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server To test your build, execute: ```shell -tools/bazel_in_docker.sh bazel test -c opt tensorflow_serving/... +tools/run_in_docker.sh bazel test -c opt tensorflow_serving/... ``` See the [basic tutorial](serving_basic.md) and [advanced @@ -139,8 +139,8 @@ If you want to build from a specific branch (such as a release branch), pass `-b ` to the `git clone` command. We will also want to match the build environment for that branch of code, by -passing the `bazel_in_docker.sh` script the Docker development image we'd like -to use. +passing the `run_in_docker.sh` script the Docker development image we'd like to +use. For example, to build version 1.10 of TensorFlow Serving: @@ -148,8 +148,8 @@ For example, to build version 1.10 of TensorFlow Serving: $ git clone -b r1.10 https://github.com/tensorflow/serving.git ... $ cd serving -$ tools/bazel_in_docker.sh -d tensorflow/serving:1.10-devel \ - bazel build -c opt tensorflow_serving/... +$ tools/run_in_docker.sh -d tensorflow/serving:1.10-devel \ + bazel build tensorflow_serving/... ... ``` @@ -162,7 +162,7 @@ platform-specific instruction sets for your processor, you can add For example: ```shell -tools/bazel_in_docker.sh bazel build --config=nativeopt tensorflow_serving/... +tools/run_in_docker.sh bazel build --config=nativeopt tensorflow_serving/... ``` It's also possible to compile using specific instruction sets (e.g. AVX). diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index 4415ea12813..601415955ca 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -56,7 +56,8 @@ RUN pip --no-cache-dir install \ keras_applications \ keras_preprocessing \ mock \ - numpy + numpy \ + requests # Set up Bazel # Need >= 0.15.0 so bazel compiles work with docker bind mounts. diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 5df4a35e18d..617a7783c10 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -91,7 +91,8 @@ RUN pip --no-cache-dir install \ keras_applications \ keras_preprocessing \ mock \ - numpy + numpy \ + requests # Set up Bazel # Need >= 0.15.0 so bazel compiles work with docker bind mounts. diff --git a/tools/bazel_in_docker.sh b/tools/run_in_docker.sh similarity index 67% rename from tools/bazel_in_docker.sh rename to tools/run_in_docker.sh index 0d615fe956c..4b9f05af80a 100755 --- a/tools/bazel_in_docker.sh +++ b/tools/run_in_docker.sh @@ -14,17 +14,25 @@ # limitations under the License. # ============================================================================== # -# Script to run bazel and do builds in a docker container. +# Script to run commands (like builds and scripts) in a docker container. # # Useful to do builds in a hermetic (docker) environment. The script sets # up the correct user/group names and docker bind mounts to allow build -# a source tree. +# a source tree. Also useful for running python scripts without having to +# track down dependencies (that are covered by the docker container). +# +# Note: This script binds your working directory (via pwd) and /tmp to the +# Docker container. Any scripts or programs you run will need to have its output +# routed to one of the above locations in order to persist. # # Typical usage (to build from lastest upstream source): # $ git clone https://github.com/tensorflow/serving.git # $ cd serving -# $ bazel_in_docker.sh bazel build -c opt tensorflow_serving/model_servers:tensorflow_model_server +# $ ./run_in_docker.sh bazel build tensorflow_serving/model_servers:tensorflow_model_server # +# Running a python script: +# $ cd tensorflow_serving/example +# $ ./run_in_docker.sh mnist_saved_model.py /tmp/mnist set -e @@ -34,8 +42,8 @@ function usage() { echo " ${progname} [-d ] [args ...]" echo "" echo "Examples:" - echo " ${progname} bazel build -c opt tensorflow_serving/model_servers:tensorflow_model_server" - echo " ${progname} bazel test tensorflow_serving/..." + echo " ${progname} bazel build tensorflow_serving/model_servers:tensorflow_model_server" + echo " ${progname} python tensorflow_serving/examples/mnist_saved_model.py /tmp/mnist" echo " ${progname} -d tensorflow/serving:latest-devel bazel version" exit 1 } @@ -55,6 +63,10 @@ function get_bazel_cmd() { echo "cd $(pwd); TEST_TMPDIR=.cache" } +function get_python_cmd() { + echo "cd $(pwd);" +} + (( $# < 1 )) && usage [[ "$1" = "-"* ]] && [[ "$1" != "-d" ]] && usage @@ -63,9 +75,14 @@ IMAGE="tensorflow/serving:nightly-devel" [[ "${IMAGE}" = "" ]] && usage RUN_OPTS=(--rm -it --network=host) +# Map the working directory and /tmp to allow scripts/binaries to run and also +# output data that might be used by other scripts/binaries +RUN_OPTS+=("-v $(pwd):$(pwd)") +RUN_OPTS+=("-v /tmp:/tmp") if [[ "$1" = "bazel"* ]]; then CMD="sh -c '$(get_bazel_cmd) $@'" - RUN_OPTS+=("-v $(pwd):$(pwd)") +elif [[ "$1" == "python"* ]]; then + CMD="sh -c '$(get_python_cmd) $@'" else CMD="$@" fi From 94fb1cdecf0fa23031e9dc77d43d55c4656170e9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 23 Oct 2018 17:02:11 -0700 Subject: [PATCH 1505/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218432964 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4bd32d2ef6d..ace6fcd6757 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8532cfdcba1233a34eed979647a4a363b044a6e1a11cc830ca01a13861257385", - git_commit = "b6476baf0ad3430d2fe02dd605fbf945c12f084d", + sha256 = "e4f22b9609ffae4bd2597a06c6151c6510685cddf4e641e802963442a6f61508", + git_commit = "4d36871a30cac770a483882e577cb813d815f964", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2f39f8248bb23f4362c5c7cf45e98fb56e6b7cb6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 23 Oct 2018 23:02:08 -0700 Subject: [PATCH 1506/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218462622 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ace6fcd6757..f06eb2dbc2a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e4f22b9609ffae4bd2597a06c6151c6510685cddf4e641e802963442a6f61508", - git_commit = "4d36871a30cac770a483882e577cb813d815f964", + sha256 = "cdc17fb5aeaab70429f806de6f7c765f1949b3cea7ceafce0180c0a1d1a6a76c", + git_commit = "4253d46e8d332910dc08e6ce1813e99971decc41", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ac7b4dbed7a46ff209995dd2379323c73d5fc2fb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 24 Oct 2018 05:03:18 -0700 Subject: [PATCH 1507/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218494954 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f06eb2dbc2a..068c9f98614 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cdc17fb5aeaab70429f806de6f7c765f1949b3cea7ceafce0180c0a1d1a6a76c", - git_commit = "4253d46e8d332910dc08e6ce1813e99971decc41", + sha256 = "b87c2278c33847808733afda173e396117a4623a732c5138e23b3690a440d48e", + git_commit = "60c56a4103e9f9239b9b7b104a846619dc4ecc20", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6692f5f1a0c24ec64d2f85933ea636e87ec4f8ae Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 24 Oct 2018 11:02:16 -0700 Subject: [PATCH 1508/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218541027 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 068c9f98614..645d235b614 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b87c2278c33847808733afda173e396117a4623a732c5138e23b3690a440d48e", - git_commit = "60c56a4103e9f9239b9b7b104a846619dc4ecc20", + sha256 = "150ca56761604cd919634523d10bb9aa80b2678b131323ace6a94b0d10250fa4", + git_commit = "24f3e7315039938c3e806be58d20bc8c1e6e54b8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d63f6a178d35ffc4417ac211aa474dd54a91ea18 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 24 Oct 2018 12:01:46 -0700 Subject: [PATCH 1509/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218552018 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 645d235b614..cada6b4bf51 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "150ca56761604cd919634523d10bb9aa80b2678b131323ace6a94b0d10250fa4", - git_commit = "24f3e7315039938c3e806be58d20bc8c1e6e54b8", + sha256 = "d68ecd63af915129f3f4716a413e4821ff0c564521e7dce206c76ec00bf1084a", + git_commit = "22ed8d0595a54f5ff4799d53631beee2bb02255d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 90e72a4af748a041ad6950d4cd15c0dc71a3446b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 24 Oct 2018 13:01:55 -0700 Subject: [PATCH 1510/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218561185 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cada6b4bf51..a3ff8a20901 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d68ecd63af915129f3f4716a413e4821ff0c564521e7dce206c76ec00bf1084a", - git_commit = "22ed8d0595a54f5ff4799d53631beee2bb02255d", + sha256 = "1c02664e9c76571aa3546e63f531feb6b33eaf0807f2f4166b1bdaebd0a6a640", + git_commit = "7e1aa5098c03731dffce9055ae5b55a60cbd407d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0bff7d1ee8c433470316d8d0766b8689edeaf6cc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 24 Oct 2018 17:01:58 -0700 Subject: [PATCH 1511/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218604065 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a3ff8a20901..d8dad870e25 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1c02664e9c76571aa3546e63f531feb6b33eaf0807f2f4166b1bdaebd0a6a640", - git_commit = "7e1aa5098c03731dffce9055ae5b55a60cbd407d", + sha256 = "5007eea5b569ea55a3226b15dee20dea3b2ece4023afdcf8541190fdcb081a24", + git_commit = "2a1cbeda4aea4fa0b9199394b742aa46815c97bc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2f30f40547529f1c26bedc5d6518241e2fb6f1c1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 24 Oct 2018 18:01:41 -0700 Subject: [PATCH 1512/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218611859 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d8dad870e25..a05a2231ac6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5007eea5b569ea55a3226b15dee20dea3b2ece4023afdcf8541190fdcb081a24", - git_commit = "2a1cbeda4aea4fa0b9199394b742aa46815c97bc", + sha256 = "f4cba95e37650e195909f22369ac3b95afa67e0657a48553f684a6ce8d1e2111", + git_commit = "7adcbb8049bb873ec169e7b544de46fb4a325648", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 97687024c3b7515d2f2979c35054f44c8f84d146 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 24 Oct 2018 18:15:09 -0700 Subject: [PATCH 1513/8103] Add new REST API to get model metadata known to the ModelServer. The API is accessible via GET method on following URL: http://host:port/v1/models/${MODEL_NAME}[/versions/${MODEL_VERSION}]/metadata This closely mirrors `PredictionService.GetModelMetadataResponse` gRPC API. If no ${MODEL_VERSION} is specified, the model metadata based on the latest version is returned in the response. Fixes https://github.com/tensorflow/serving/issues/1115 PiperOrigin-RevId: 218613679 --- tensorflow_serving/g3doc/api_rest.md | 21 ++ tensorflow_serving/model_servers/BUILD | 7 +- .../model_servers/http_rest_api_handler.cc | 91 ++++++- .../model_servers/http_rest_api_handler.h | 3 + .../http_rest_api_handler_test.cc | 25 ++ .../tensorflow_model_server_test.py | 29 +++ tensorflow_serving/servables/tensorflow/BUILD | 1 + .../tensorflow/get_model_metadata_impl.cc | 9 +- .../tensorflow/get_model_metadata_impl.h | 2 + .../get_model_metadata_impl_test.cc | 11 +- .../half_plus_two_model_metadata.json | 232 ++++++++++++++++++ ...del_half_plus_two_2_versions_metadata.json | 232 ++++++++++++++++++ 12 files changed, 650 insertions(+), 13 deletions(-) create mode 100644 tensorflow_serving/servables/tensorflow/testdata/half_plus_two_model_metadata.json create mode 100644 tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_2_versions_metadata.json diff --git a/tensorflow_serving/g3doc/api_rest.md b/tensorflow_serving/g3doc/api_rest.md index fcf2cbc59d4..ff7d59e054a 100644 --- a/tensorflow_serving/g3doc/api_rest.md +++ b/tensorflow_serving/g3doc/api_rest.md @@ -39,6 +39,27 @@ If successful, returns a JSON representation of [`GetModelStatusResponse`](https://github.com/tensorflow/serving/blob/5369880e9143aa00d586ee536c12b04e945a977c/tensorflow_serving/apis/get_model_status.proto#L64) protobuf. +## Model Metadata API + +This API closely follows the +[`PredictionService.GetModelMetadata`](https://github.com/tensorflow/serving/blob/5369880e9143aa00d586ee536c12b04e945a977c/tensorflow_serving/apis/prediction_service.proto#L29) +gRPC API. It returns the metadata of a model in the ModelServer. + +### URL + +``` +GET http://host:port/v1/models/${MODEL_NAME}[/versions/${MODEL_VERSION}]/metadata +``` + +`/versions/${MODEL_VERSION}` is optional. If omitted the model metadata for +the latest version is returned in the response. + +### Response format + +If successful, returns a JSON representation of +[`GetModelMetadataResponse`](https://github.com/tensorflow/serving/blob/5369880e9143aa00d586ee536c12b04e945a977c/tensorflow_serving/apis/get_model_metadata.proto#L23) +protobuf. + ## Classify and Regress API This API closely follows the `Classify` and `Regress` methods of diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index e0e3670283e..8d5bc96a02c 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -160,7 +160,10 @@ cc_test( name = "http_rest_api_handler_test", size = "medium", srcs = ["http_rest_api_handler_test.cc"], - data = ["@org_tensorflow//tensorflow/cc/saved_model:saved_model_half_plus_two"], + data = [ + "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_2_versions_metadata.json", + "@org_tensorflow//tensorflow/cc/saved_model:saved_model_half_plus_two", + ], deps = [ ":http_rest_api_handler", ":model_platform_types", @@ -266,6 +269,7 @@ cc_library( "//tensorflow_serving/apis:predict_proto", "//tensorflow_serving/core:servable_handle", "//tensorflow_serving/servables/tensorflow:classification_service", + "//tensorflow_serving/servables/tensorflow:get_model_metadata_impl", "//tensorflow_serving/servables/tensorflow:predict_impl", "//tensorflow_serving/servables/tensorflow:regression_service", "//tensorflow_serving/util:json_tensor", @@ -372,6 +376,7 @@ py_test( "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two/00000123/export.data-00000-of-00001", "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two/00000123/export.index", "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two/00000123/export.meta", + "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two_model_metadata.json", "//tensorflow_serving/servables/tensorflow/testdata:monitoring_config.txt", "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_three/00000123/assets/foo.txt", "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_three/00000123/saved_model.pb", diff --git a/tensorflow_serving/model_servers/http_rest_api_handler.cc b/tensorflow_serving/model_servers/http_rest_api_handler.cc index 620ac0d935d..58e99b37b04 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler.cc +++ b/tensorflow_serving/model_servers/http_rest_api_handler.cc @@ -17,6 +17,7 @@ limitations under the License. #include +#include "google/protobuf/any.pb.h" #include "google/protobuf/util/json_util.h" #include "absl/strings/escaping.h" #include "absl/strings/numbers.h" @@ -32,6 +33,7 @@ limitations under the License. #include "tensorflow_serving/model_servers/get_model_status_impl.h" #include "tensorflow_serving/model_servers/server_core.h" #include "tensorflow_serving/servables/tensorflow/classification_service.h" +#include "tensorflow_serving/servables/tensorflow/get_model_metadata_impl.h" #include "tensorflow_serving/servables/tensorflow/predict_impl.h" #include "tensorflow_serving/servables/tensorflow/regression_service.h" #include "tensorflow_serving/util/json_tensor.h" @@ -54,7 +56,8 @@ HttpRestApiHandler::HttpRestApiHandler(const RunOptions& run_options, prediction_api_regex_( R"((?i)/v1/models/([^/:]+)(?:/versions/(\d+))?:(classify|regress|predict))"), modelstatus_api_regex_( - R"((?i)/v1/models(?:/([^/:]+))?(?:/versions/(\d+))?)") {} + R"((?i)/v1/models(?:/([^/:]+))?(?:/versions/(\d+))?(?:\/(metadata))?)") { +} HttpRestApiHandler::~HttpRestApiHandler() {} @@ -84,6 +87,7 @@ Status HttpRestApiHandler::ProcessRequest( string model_name; string model_version_str; string method; + string model_subresource; Status status = errors::InvalidArgument("Malformed request: ", http_method, " ", request_path); if (http_method == "POST" && @@ -110,8 +114,14 @@ Status HttpRestApiHandler::ProcessRequest( } } else if (http_method == "GET" && RE2::FullMatch(string(request_path), modelstatus_api_regex_, - &model_name, &model_version_str)) { - status = ProcessModelStatusRequest(model_name, model_version_str, output); + &model_name, &model_version_str, + &model_subresource)) { + if (!model_subresource.empty() && model_subresource == "metadata") { + status = + ProcessModelMetadataRequest(model_name, model_version_str, output); + } else { + status = ProcessModelStatusRequest(model_name, model_version_str, output); + } } if (!status.ok()) { @@ -219,6 +229,81 @@ Status HttpRestApiHandler::ProcessModelStatusRequest( return Status::OK(); } +Status HttpRestApiHandler::ProcessModelMetadataRequest( + const absl::string_view model_name, + const absl::string_view model_version_str, string* output) { + GetModelMetadataRequest request; + if (model_name.empty()) { + return errors::InvalidArgument("Missing model name in request."); + } + request.mutable_model_spec()->set_name(string(model_name)); + // We currently only support the kSignatureDef metadata field + request.add_metadata_field(GetModelMetadataImpl::kSignatureDef); + if (!model_version_str.empty()) { + int64 version; + if (!absl::SimpleAtoi(model_version_str, &version)) { + return errors::InvalidArgument( + "Failed to convert version: ", model_version_str, " to numeric."); + } + request.mutable_model_spec()->mutable_version()->set_value(version); + } + + GetModelMetadataResponse response; + TF_RETURN_IF_ERROR( + GetModelMetadataImpl::GetModelMetadata(core_, request, &response)); + JsonPrintOptions opts; + opts.add_whitespace = true; + opts.always_print_primitive_fields = true; + // TODO(b/118381513): preserving proto field names on 'Any' fields has been + // fixed in the master branch of OSS protobuf but the TF ecosystem is + // currently using v3.6.0 where the fix is not present. To resolve the issue + // we invoke MessageToJsonString on invididual fields and concatenate the + // resulting strings and make it valid JSON that conforms with the response we + // expect. + opts.preserve_proto_field_names = true; + + string model_spec_output; + const auto& status1 = + MessageToJsonString(response.model_spec(), &model_spec_output, opts); + if (!status1.ok()) { + return errors::Internal( + "Failed to convert model spec proto to json. Error: ", + status1.ToString()); + } + + tensorflow::serving::SignatureDefMap signature_def_map; + if (response.metadata().end() == + response.metadata().find(GetModelMetadataImpl::kSignatureDef)) { + return errors::Internal( + "Failed to find 'signature_def' key in the GetModelMetadataResponse " + "metadata map."); + } + bool unpack_status = response.metadata() + .at(GetModelMetadataImpl::kSignatureDef) + .UnpackTo(&signature_def_map); + if (!unpack_status) { + return errors::Internal( + "Failed to unpack 'Any' object to 'SignatureDefMap'."); + } + + string signature_def_output; + const auto& status2 = + MessageToJsonString(signature_def_map, &signature_def_output, opts); + if (!status2.ok()) { + return errors::Internal( + "Failed to convert signature def proto to json. Error: ", + status2.ToString()); + } + + // Concatenate the resulting strings into a valid JSON format. + absl::StrAppend(output, "{\n"); + absl::StrAppend(output, "\"model_spec\":", model_spec_output, ",\n"); + absl::StrAppend(output, "\"metadata\": {"); + absl::StrAppend(output, "\"signature_def\": ", signature_def_output, "}\n"); + absl::StrAppend(output, "}\n"); + return Status::OK(); +} + Status HttpRestApiHandler::GetInfoMap( const ModelSpec& model_spec, const string& signature_name, ::google::protobuf::Map* infomap) { diff --git a/tensorflow_serving/model_servers/http_rest_api_handler.h b/tensorflow_serving/model_servers/http_rest_api_handler.h index c319a3c7624..442d3bd9a34 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler.h +++ b/tensorflow_serving/model_servers/http_rest_api_handler.h @@ -100,6 +100,9 @@ class HttpRestApiHandler { Status ProcessModelStatusRequest(const absl::string_view model_name, const absl::string_view model_version_str, string* output); + Status ProcessModelMetadataRequest(const absl::string_view model_name, + const absl::string_view model_version_str, + string* output); Status GetInfoMap(const ModelSpec& model_spec, const string& signature_name, ::google::protobuf::Map* infomap); diff --git a/tensorflow_serving/model_servers/http_rest_api_handler_test.cc b/tensorflow_serving/model_servers/http_rest_api_handler_test.cc index 5c6529fc500..af729a7bef7 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler_test.cc +++ b/tensorflow_serving/model_servers/http_rest_api_handler_test.cc @@ -32,6 +32,7 @@ limitations under the License. #include "tensorflow/cc/saved_model/signature_constants.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/lib/core/status_test_util.h" +#include "tensorflow/core/platform/env.h" #include "tensorflow_serving/core/availability_preserving_policy.h" #include "tensorflow_serving/model_servers/model_platform_types.h" #include "tensorflow_serving/model_servers/platform_config_util.h" @@ -212,6 +213,11 @@ TEST_F(HttpRestApiHandlerTest, UnsupportedApiCalls) { "", &headers, &output); EXPECT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("Failed to convert version")); + + status = handler_.ProcessRequest("POST", "/v1/models/foo/metadata", "", + &headers, &output); + EXPECT_TRUE(errors::IsInvalidArgument(status)); + EXPECT_THAT(status.error_message(), HasSubstr("Malformed request")); } TEST_F(HttpRestApiHandlerTest, PredictModelNameVersionErrors) { @@ -406,6 +412,25 @@ TEST_F(HttpRestApiHandlerTest, GetStatus) { })")); } +TEST_F(HttpRestApiHandlerTest, GetModelMetadata) { + HeaderList headers; + string output; + string test_file_contents; + + // Get model metadata without specifying version. + TF_EXPECT_OK(handler_.ProcessRequest( + "GET", absl::StrCat("/v1/models/", kTestModelName, "/metadata"), "", + &headers, &output)); + EXPECT_THAT(headers, UnorderedElementsAreArray( + (HeaderList){{"Content-Type", "application/json"}})); + const string fname = absl::StrCat( + "./tensorflow_serving/servables/tensorflow/testdata", + "/saved_model_half_plus_two_2_versions_metadata.json"); + TF_EXPECT_OK(tensorflow::ReadFileToString(tensorflow::Env::Default(), fname, + &test_file_contents)); + TF_EXPECT_OK(CompareJson(output, test_file_contents)); +} + } // namespace } // namespace serving } // namespace tensorflow diff --git a/tensorflow_serving/model_servers/tensorflow_model_server_test.py b/tensorflow_serving/model_servers/tensorflow_model_server_test.py index 090ca0f4245..442481133f5 100644 --- a/tensorflow_serving/model_servers/tensorflow_model_server_test.py +++ b/tensorflow_serving/model_servers/tensorflow_model_server_test.py @@ -292,6 +292,10 @@ def _GetBatchingParametersFile(self): """Returns a path to a batching configuration file.""" return os.path.join(self.testdata_dir, 'batching_config.txt') + def _GetModelMetadataFile(self): + """Returns a path to a sample model metadata file.""" + return os.path.join(self.testdata_dir, 'half_plus_two_model_metadata.json') + def _GetMonitoringConfigFile(self): """Returns a path to a monitoring configuration file.""" return os.path.join(self.testdata_dir, 'monitoring_config.txt') @@ -651,6 +655,31 @@ def testGetStatusREST(self): }] }) + def testGetModelMetadataREST(self): + """Test ModelStatus implementation over REST API with columnar inputs.""" + model_path = self._GetSavedModelBundlePath() + host, port = TensorflowModelServerTest.RunServer('default', + model_path)[2].split(':') + + # Prepare request + url = 'http://{}:{}/v1/models/default/metadata'.format(host, port) + + # Send request + resp_data = None + try: + resp_data = CallREST(url, None) + except Exception as e: # pylint: disable=broad-except + self.fail('Request failed with error: {}'.format(e)) + + try: + model_metadata_file = self._GetModelMetadataFile() + with open(model_metadata_file) as f: + expected_metadata = json.load(f) + # Verify response + self.assertEquals(json.loads(resp_data), expected_metadata) + except Exception as e: # pylint: disable=broad-except + self.fail('Request failed with error: {}'.format(e)) + def testPrometheusEndpoint(self): """Test ModelStatus implementation over REST API with columnar inputs.""" model_path = self._GetSavedModelBundlePath() diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index 8bfaaef45ad..3e2c5ee9ea3 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -531,6 +531,7 @@ cc_test( "//tensorflow_serving/model_servers:platform_config_util", "//tensorflow_serving/test_util", "@org_tensorflow//tensorflow/cc/saved_model:loader", + "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", "@org_tensorflow//tensorflow/contrib/session_bundle", "@org_tensorflow//tensorflow/contrib/session_bundle:bundle_shim", "@org_tensorflow//tensorflow/core:lib", diff --git a/tensorflow_serving/servables/tensorflow/get_model_metadata_impl.cc b/tensorflow_serving/servables/tensorflow/get_model_metadata_impl.cc index bc960b7c2ba..5b3ddf8e2d4 100644 --- a/tensorflow_serving/servables/tensorflow/get_model_metadata_impl.cc +++ b/tensorflow_serving/servables/tensorflow/get_model_metadata_impl.cc @@ -32,8 +32,6 @@ namespace serving { namespace { -const string kSignatureDef = "signature_def"; - Status ValidateGetModelMetadataRequest(const GetModelMetadataRequest& request) { if (request.metadata_field_size() == 0) { return tensorflow::Status( @@ -41,7 +39,7 @@ Status ValidateGetModelMetadataRequest(const GetModelMetadataRequest& request) { "GetModelMetadataRequest must specify at least one metadata_field"); } for (const auto& metadata_field : request.metadata_field()) { - if (metadata_field != kSignatureDef) { + if (metadata_field != GetModelMetadataImpl::kSignatureDef) { return tensorflow::errors::InvalidArgument( "Metadata field %s is not supported", metadata_field); } @@ -63,12 +61,15 @@ Status SavedModelGetSignatureDef(ServerCore* core, const ModelSpec& model_spec, response_model_spec->set_name(bundle.id().name); response_model_spec->mutable_version()->set_value(bundle.id().version); - (*response->mutable_metadata())[kSignatureDef].PackFrom(signature_def_map); + (*response->mutable_metadata())[GetModelMetadataImpl::kSignatureDef].PackFrom( + signature_def_map); return tensorflow::Status::OK(); } } // namespace +constexpr const char GetModelMetadataImpl::kSignatureDef[]; + Status GetModelMetadataImpl::GetModelMetadata( ServerCore* core, const GetModelMetadataRequest& request, GetModelMetadataResponse* response) { diff --git a/tensorflow_serving/servables/tensorflow/get_model_metadata_impl.h b/tensorflow_serving/servables/tensorflow/get_model_metadata_impl.h index 6981778935a..1db2d325255 100644 --- a/tensorflow_serving/servables/tensorflow/get_model_metadata_impl.h +++ b/tensorflow_serving/servables/tensorflow/get_model_metadata_impl.h @@ -25,6 +25,8 @@ namespace serving { class GetModelMetadataImpl { public: + static constexpr const char kSignatureDef[] = "signature_def"; + static Status GetModelMetadata(ServerCore* core, const GetModelMetadataRequest& request, GetModelMetadataResponse* response); diff --git a/tensorflow_serving/servables/tensorflow/get_model_metadata_impl_test.cc b/tensorflow_serving/servables/tensorflow/get_model_metadata_impl_test.cc index ac761108e4b..081f5de0a3a 100644 --- a/tensorflow_serving/servables/tensorflow/get_model_metadata_impl_test.cc +++ b/tensorflow_serving/servables/tensorflow/get_model_metadata_impl_test.cc @@ -50,7 +50,6 @@ namespace { constexpr char kTestModelName[] = "test_model"; constexpr int kTestModelVersion = 123; -const string kSignatureDef = "signature_def"; class GetModelMetadataImplTest : public ::testing::TestWithParam { public: @@ -143,7 +142,7 @@ TEST_P(GetModelMetadataImplTest, MissingOrEmptyModelSpec) { GetModelMetadataRequest request; GetModelMetadataResponse response; - request.add_metadata_field(kSignatureDef); + request.add_metadata_field(GetModelMetadataImpl::kSignatureDef); EXPECT_EQ(tensorflow::error::INVALID_ARGUMENT, GetModelMetadataImpl::GetModelMetadata(GetServerCore(), request, &response) @@ -173,7 +172,7 @@ TEST_P(GetModelMetadataImplTest, ReturnsSignaturesForValidModel) { ModelSpec* model_spec = request.mutable_model_spec(); model_spec->set_name(kTestModelName); model_spec->mutable_version()->set_value(kTestModelVersion); - request.add_metadata_field(kSignatureDef); + request.add_metadata_field(GetModelMetadataImpl::kSignatureDef); TF_EXPECT_OK(GetModelMetadataImpl::GetModelMetadata(GetServerCore(), request, &response)); @@ -181,7 +180,9 @@ TEST_P(GetModelMetadataImplTest, ReturnsSignaturesForValidModel) { test_util::EqualsProto(request.model_spec())); EXPECT_EQ(response.metadata_size(), 1); SignatureDefMap received_signature_def_map; - response.metadata().at(kSignatureDef).UnpackTo(&received_signature_def_map); + response.metadata() + .at(GetModelMetadataImpl::kSignatureDef) + .UnpackTo(&received_signature_def_map); SignatureDefMap expected_signature_def_map = GetSignatureDefMap(GetServerCore(), request.model_spec()); @@ -214,7 +215,7 @@ TEST_P(GetModelMetadataImplTest, ModelSpecOverride) { "model_spec {" " name: \"test_model\"" "}"); - request.add_metadata_field(kSignatureDef); + request.add_metadata_field(GetModelMetadataImpl::kSignatureDef); auto model_spec_override = test_util::CreateProto("name: \"nonexistent_model\""); diff --git a/tensorflow_serving/servables/tensorflow/testdata/half_plus_two_model_metadata.json b/tensorflow_serving/servables/tensorflow/testdata/half_plus_two_model_metadata.json new file mode 100644 index 00000000000..a3456c71624 --- /dev/null +++ b/tensorflow_serving/servables/tensorflow/testdata/half_plus_two_model_metadata.json @@ -0,0 +1,232 @@ +{ + "model_spec": { + "name": "default", + "signature_name": "", + "version": "123" + }, + "metadata": { + "signature_def": { + "signature_def": { + "regress_x2_to_y3": { + "inputs": { + "inputs": { + "dtype": "DT_FLOAT", + "tensor_shape": { + "dim": [ + { + "size": "-1", + "name": "" + }, + { + "size": "1", + "name": "" + } + ], + "unknown_rank": false + }, + "name": "x2:0" + } + }, + "outputs": { + "outputs": { + "dtype": "DT_FLOAT", + "tensor_shape": { + "dim": [ + { + "size": "-1", + "name": "" + }, + { + "size": "1", + "name": "" + } + ], + "unknown_rank": false + }, + "name": "y3:0" + } + }, + "method_name": "tensorflow/serving/regress" + }, + "serving_default": { + "inputs": { + "x": { + "dtype": "DT_FLOAT", + "tensor_shape": { + "dim": [ + { + "size": "-1", + "name": "" + }, + { + "size": "1", + "name": "" + } + ], + "unknown_rank": false + }, + "name": "x:0" + } + }, + "outputs": { + "y": { + "dtype": "DT_FLOAT", + "tensor_shape": { + "dim": [ + { + "size": "-1", + "name": "" + }, + { + "size": "1", + "name": "" + } + ], + "unknown_rank": false + }, + "name": "y:0" + } + }, + "method_name": "tensorflow/serving/predict" + }, + "classify_x_to_y": { + "inputs": { + "inputs": { + "dtype": "DT_STRING", + "tensor_shape": { + "dim": [], + "unknown_rank": true + }, + "name": "tf_example:0" + } + }, + "outputs": { + "scores": { + "dtype": "DT_FLOAT", + "tensor_shape": { + "dim": [ + { + "size": "-1", + "name": "" + }, + { + "size": "1", + "name": "" + } + ], + "unknown_rank": false + }, + "name": "y:0" + } + }, + "method_name": "tensorflow/serving/classify" + }, + "classify_x2_to_y3": { + "inputs": { + "inputs": { + "dtype": "DT_FLOAT", + "tensor_shape": { + "dim": [ + { + "size": "-1", + "name": "" + }, + { + "size": "1", + "name": "" + } + ], + "unknown_rank": false + }, + "name": "x2:0" + } + }, + "outputs": { + "scores": { + "dtype": "DT_FLOAT", + "tensor_shape": { + "dim": [ + { + "size": "-1", + "name": "" + }, + { + "size": "1", + "name": "" + } + ], + "unknown_rank": false + }, + "name": "y3:0" + } + }, + "method_name": "tensorflow/serving/classify" + }, + "regress_x_to_y2": { + "inputs": { + "inputs": { + "dtype": "DT_STRING", + "tensor_shape": { + "dim": [], + "unknown_rank": true + }, + "name": "tf_example:0" + } + }, + "outputs": { + "outputs": { + "dtype": "DT_FLOAT", + "tensor_shape": { + "dim": [ + { + "size": "-1", + "name": "" + }, + { + "size": "1", + "name": "" + } + ], + "unknown_rank": false + }, + "name": "y2:0" + } + }, + "method_name": "tensorflow/serving/regress" + }, + "regress_x_to_y": { + "inputs": { + "inputs": { + "dtype": "DT_STRING", + "tensor_shape": { + "dim": [], + "unknown_rank": true + }, + "name": "tf_example:0" + } + }, + "outputs": { + "outputs": { + "dtype": "DT_FLOAT", + "tensor_shape": { + "dim": [ + { + "size": "-1", + "name": "" + }, + { + "size": "1", + "name": "" + } + ], + "unknown_rank": false + }, + "name": "y:0" + } + }, + "method_name": "tensorflow/serving/regress" + } + } + } + } +} diff --git a/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_2_versions_metadata.json b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_2_versions_metadata.json new file mode 100644 index 00000000000..7fea6552dc1 --- /dev/null +++ b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_2_versions_metadata.json @@ -0,0 +1,232 @@ +{ + "model_spec": { + "name": "saved_model_half_plus_two_2_versions", + "signature_name": "", + "version": "123" + }, + "metadata": { + "signature_def": { + "signature_def": { + "regress_x2_to_y3": { + "inputs": { + "inputs": { + "dtype": "DT_FLOAT", + "tensor_shape": { + "dim": [ + { + "size": "-1", + "name": "" + }, + { + "size": "1", + "name": "" + } + ], + "unknown_rank": false + }, + "name": "x2:0" + } + }, + "outputs": { + "outputs": { + "dtype": "DT_FLOAT", + "tensor_shape": { + "dim": [ + { + "size": "-1", + "name": "" + }, + { + "size": "1", + "name": "" + } + ], + "unknown_rank": false + }, + "name": "y3:0" + } + }, + "method_name": "tensorflow/serving/regress" + }, + "serving_default": { + "inputs": { + "x": { + "dtype": "DT_FLOAT", + "tensor_shape": { + "dim": [ + { + "size": "-1", + "name": "" + }, + { + "size": "1", + "name": "" + } + ], + "unknown_rank": false + }, + "name": "x:0" + } + }, + "outputs": { + "y": { + "dtype": "DT_FLOAT", + "tensor_shape": { + "dim": [ + { + "size": "-1", + "name": "" + }, + { + "size": "1", + "name": "" + } + ], + "unknown_rank": false + }, + "name": "y:0" + } + }, + "method_name": "tensorflow/serving/predict" + }, + "classify_x_to_y": { + "inputs": { + "inputs": { + "dtype": "DT_STRING", + "tensor_shape": { + "dim": [], + "unknown_rank": true + }, + "name": "tf_example:0" + } + }, + "outputs": { + "scores": { + "dtype": "DT_FLOAT", + "tensor_shape": { + "dim": [ + { + "size": "-1", + "name": "" + }, + { + "size": "1", + "name": "" + } + ], + "unknown_rank": false + }, + "name": "y:0" + } + }, + "method_name": "tensorflow/serving/classify" + }, + "classify_x2_to_y3": { + "inputs": { + "inputs": { + "dtype": "DT_FLOAT", + "tensor_shape": { + "dim": [ + { + "size": "-1", + "name": "" + }, + { + "size": "1", + "name": "" + } + ], + "unknown_rank": false + }, + "name": "x2:0" + } + }, + "outputs": { + "scores": { + "dtype": "DT_FLOAT", + "tensor_shape": { + "dim": [ + { + "size": "-1", + "name": "" + }, + { + "size": "1", + "name": "" + } + ], + "unknown_rank": false + }, + "name": "y3:0" + } + }, + "method_name": "tensorflow/serving/classify" + }, + "regress_x_to_y2": { + "inputs": { + "inputs": { + "dtype": "DT_STRING", + "tensor_shape": { + "dim": [], + "unknown_rank": true + }, + "name": "tf_example:0" + } + }, + "outputs": { + "outputs": { + "dtype": "DT_FLOAT", + "tensor_shape": { + "dim": [ + { + "size": "-1", + "name": "" + }, + { + "size": "1", + "name": "" + } + ], + "unknown_rank": false + }, + "name": "y2:0" + } + }, + "method_name": "tensorflow/serving/regress" + }, + "regress_x_to_y": { + "inputs": { + "inputs": { + "dtype": "DT_STRING", + "tensor_shape": { + "dim": [], + "unknown_rank": true + }, + "name": "tf_example:0" + } + }, + "outputs": { + "outputs": { + "dtype": "DT_FLOAT", + "tensor_shape": { + "dim": [ + { + "size": "-1", + "name": "" + }, + { + "size": "1", + "name": "" + } + ], + "unknown_rank": false + }, + "name": "y:0" + } + }, + "method_name": "tensorflow/serving/regress" + } + } + } + } +} From 5f77a62b0c45f876ef278db7af2c144b392bd01a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 24 Oct 2018 20:01:55 -0700 Subject: [PATCH 1514/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218622126 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a05a2231ac6..a019afbb1c7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f4cba95e37650e195909f22369ac3b95afa67e0657a48553f684a6ce8d1e2111", - git_commit = "7adcbb8049bb873ec169e7b544de46fb4a325648", + sha256 = "32468c26a44f412b8332f6d159a985752193508ab0afec0bfa5724b57feb20a5", + git_commit = "e6516003940e57021f8ca8d20723be9ebf343499", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 19e113841655a5b03cd683bd7bfc1a642ce02030 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 24 Oct 2018 23:01:54 -0700 Subject: [PATCH 1515/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218635500 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a019afbb1c7..a89dc9e76e6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "32468c26a44f412b8332f6d159a985752193508ab0afec0bfa5724b57feb20a5", - git_commit = "e6516003940e57021f8ca8d20723be9ebf343499", + sha256 = "4675a8628ae3b5e78c42af8fc799be3cebf6d44ed8ef76f86943a33a73baaa19", + git_commit = "0049a3a42a35e115b121fc585b667b7fe1674e24", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9c82de898de2cf7eb497db7a9663400dff5489c1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 25 Oct 2018 02:01:53 -0700 Subject: [PATCH 1516/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218651735 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a89dc9e76e6..d8732af2521 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4675a8628ae3b5e78c42af8fc799be3cebf6d44ed8ef76f86943a33a73baaa19", - git_commit = "0049a3a42a35e115b121fc585b667b7fe1674e24", + sha256 = "30e168fef885b54f18eda2641da1f97a86cd92ede8c839b318a4eda631709cb0", + git_commit = "30382d4747e33a130e60e8362348f065085855fc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2e5731dbc70a6731561c82ba7a6ca811341de606 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 25 Oct 2018 03:02:05 -0700 Subject: [PATCH 1517/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218657386 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d8732af2521..485eb900914 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "30e168fef885b54f18eda2641da1f97a86cd92ede8c839b318a4eda631709cb0", - git_commit = "30382d4747e33a130e60e8362348f065085855fc", + sha256 = "85cf3a5356751fa5ae36f2541e4b3f0821ffd3a19c6e20ea54e837d2c1137023", + git_commit = "1d61c46a4a9de61c8701482649c1bb6bd828fdff", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 08c87de04fdf2bd73a47291a5bcc301f31ddbda1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 25 Oct 2018 05:01:59 -0700 Subject: [PATCH 1518/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218668330 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 485eb900914..99c26cf200b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "85cf3a5356751fa5ae36f2541e4b3f0821ffd3a19c6e20ea54e837d2c1137023", - git_commit = "1d61c46a4a9de61c8701482649c1bb6bd828fdff", + sha256 = "e1e623432eae3be9b93930c461ecb30284c3cfb84c0287f373b8fe4e4937a66a", + git_commit = "5d2b7b34c84678c2eebacf37f790094604482377", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From bb8792b5a8c0404ade98d958e4deee03181414b4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 25 Oct 2018 06:02:02 -0700 Subject: [PATCH 1519/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218673350 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 99c26cf200b..54b5b41bd58 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e1e623432eae3be9b93930c461ecb30284c3cfb84c0287f373b8fe4e4937a66a", - git_commit = "5d2b7b34c84678c2eebacf37f790094604482377", + sha256 = "9486a73e48be6e8a338f23c516a4590d6c96f8087077aa0e6329bc0d11a6392c", + git_commit = "670eff0b0f60b9fde8231e927807677a80016904", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 256450779fbef6aafde2461d9db44a62dc30f61c Mon Sep 17 00:00:00 2001 From: llao Date: Thu, 25 Oct 2018 10:29:49 -0700 Subject: [PATCH 1520/8103] Add a comment on why the score in the classification result may be missing. PiperOrigin-RevId: 218709445 --- tensorflow_serving/apis/classification.proto | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tensorflow_serving/apis/classification.proto b/tensorflow_serving/apis/classification.proto index aa81bd8c19b..16a90b15a88 100644 --- a/tensorflow_serving/apis/classification.proto +++ b/tensorflow_serving/apis/classification.proto @@ -12,7 +12,8 @@ message Class { // Label or name of the class. string label = 1; // Score for this class (e.g., the probability the item belongs to this - // class). + // class). As per the proto3 default-value semantics, if the score is missing, + // it should be treated as 0. float score = 2; } From ed3dc5f2764b4025aded960dabd77f9a6968872a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 25 Oct 2018 15:01:54 -0700 Subject: [PATCH 1521/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218756225 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 54b5b41bd58..525a9ded60a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9486a73e48be6e8a338f23c516a4590d6c96f8087077aa0e6329bc0d11a6392c", - git_commit = "670eff0b0f60b9fde8231e927807677a80016904", + sha256 = "882a4ffadb10b6ed805853676078443742d939786205c27b68b3452ef9aabbaf", + git_commit = "2d46bcb3007b561b6e22399c0e89099afcdea2ba", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1814bb3af5fc3044b812187577da8793409ba4fe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 25 Oct 2018 16:01:56 -0700 Subject: [PATCH 1522/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218766914 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 525a9ded60a..55da52fe18a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "882a4ffadb10b6ed805853676078443742d939786205c27b68b3452ef9aabbaf", - git_commit = "2d46bcb3007b561b6e22399c0e89099afcdea2ba", + sha256 = "f20c4bd1ceca896b3d4d37c368770c8b5a72fa6836785f586b6385e01c83479e", + git_commit = "9a1a8af2735d09a198a0b97c2fbc1693da28bdc3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 56680b13b69c2cdf793be72e3931d20a618cd3ba Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 25 Oct 2018 18:01:47 -0700 Subject: [PATCH 1523/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218783504 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 55da52fe18a..4e33a10cb36 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f20c4bd1ceca896b3d4d37c368770c8b5a72fa6836785f586b6385e01c83479e", - git_commit = "9a1a8af2735d09a198a0b97c2fbc1693da28bdc3", + sha256 = "ca9cb5111c5a06e5002b76bf1637fed4c88fe4ed7224f9b4beb9e595782b5d93", + git_commit = "41550f88d35b52f55043f3a12a3912e485c88b38", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0a06fb88c87f5c6ff594b899092ed2d3a0083fbf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 25 Oct 2018 19:01:49 -0700 Subject: [PATCH 1524/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218788965 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4e33a10cb36..6e93507bbf7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ca9cb5111c5a06e5002b76bf1637fed4c88fe4ed7224f9b4beb9e595782b5d93", - git_commit = "41550f88d35b52f55043f3a12a3912e485c88b38", + sha256 = "0a4581956eeab23b02fa3b23912ee4dc8fa7e499694d023192228ab2cffbdcd6", + git_commit = "32681ff9a33a1fcc31e7f03e0728c3ac796beb5f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 56653e457a650d52eb14d2fa6aae67a0f4697993 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 25 Oct 2018 20:01:49 -0700 Subject: [PATCH 1525/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218794271 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6e93507bbf7..92dc2454a7f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0a4581956eeab23b02fa3b23912ee4dc8fa7e499694d023192228ab2cffbdcd6", - git_commit = "32681ff9a33a1fcc31e7f03e0728c3ac796beb5f", + sha256 = "25195ed5f9d6f1143a57a63f61c42c9e3eac5f5c89bccb3b5da1ff575b45bae6", + git_commit = "ba60fcf7121e358b4ffd89d5e67badb6058f3257", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 86e6cd57fa70efa0e0edd8ec636e374b7ea7e6d1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 25 Oct 2018 21:01:44 -0700 Subject: [PATCH 1526/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218799477 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 92dc2454a7f..4c4127a1d75 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "25195ed5f9d6f1143a57a63f61c42c9e3eac5f5c89bccb3b5da1ff575b45bae6", - git_commit = "ba60fcf7121e358b4ffd89d5e67badb6058f3257", + sha256 = "201b3073a9a1e6151ccc0b8d3d9d50217310f1459f708249fd9b3e49ce171bcb", + git_commit = "bde19b79b3d5e0d4be679f8144acb7f06b1c83ee", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2a602b6351be0998cce0893f08c9c308142fefe7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 25 Oct 2018 22:01:38 -0700 Subject: [PATCH 1527/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218803544 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4c4127a1d75..27cdbe55a41 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "201b3073a9a1e6151ccc0b8d3d9d50217310f1459f708249fd9b3e49ce171bcb", - git_commit = "bde19b79b3d5e0d4be679f8144acb7f06b1c83ee", + sha256 = "947c7a8443b5ff58d5a23010c51ef11418d928c70151e97dab134fbe60bc0cec", + git_commit = "bef89e6a153b5e89bc171fe5a399f02fa04d991a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9cd4d00587c7060ddf36f6f99d61f937f5053f90 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 25 Oct 2018 23:01:51 -0700 Subject: [PATCH 1528/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218807726 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 27cdbe55a41..6fe5c018481 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "947c7a8443b5ff58d5a23010c51ef11418d928c70151e97dab134fbe60bc0cec", - git_commit = "bef89e6a153b5e89bc171fe5a399f02fa04d991a", + sha256 = "7399cdad74ebf37844e63795e35df7feca53fdc7b3a087e499de330bcb688be3", + git_commit = "85b85a46c625d0b47cddfa8c7b399f32fe5a3ccc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3a4ed736eb9d5b5b8807104338e0cada3747545e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 26 Oct 2018 06:01:47 -0700 Subject: [PATCH 1529/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218842595 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6fe5c018481..3404e2085e4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7399cdad74ebf37844e63795e35df7feca53fdc7b3a087e499de330bcb688be3", - git_commit = "85b85a46c625d0b47cddfa8c7b399f32fe5a3ccc", + sha256 = "174d549c4d76b3d0f30d2c675d864deabd58cb43d666a9324429fa69f8da89d1", + git_commit = "8fd6bd4af37fd4191b6869099ceff17242d75498", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b4940a3f580b75826cad56ef66d575411357c3b1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 26 Oct 2018 10:01:46 -0700 Subject: [PATCH 1530/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218869639 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3404e2085e4..f02059362ca 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "174d549c4d76b3d0f30d2c675d864deabd58cb43d666a9324429fa69f8da89d1", - git_commit = "8fd6bd4af37fd4191b6869099ceff17242d75498", + sha256 = "ad32893a95eae74c65c5d7318df2ee6424973114b32b2e1c9d15de8875dfc0b0", + git_commit = "762f422ebb4f521ea5a713c18c5ae6420a9fb74e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6b1c8db01761a7b8ce8c089bee68f970ab229739 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 26 Oct 2018 11:03:50 -0700 Subject: [PATCH 1531/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218881180 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f02059362ca..045efda377f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ad32893a95eae74c65c5d7318df2ee6424973114b32b2e1c9d15de8875dfc0b0", - git_commit = "762f422ebb4f521ea5a713c18c5ae6420a9fb74e", + sha256 = "f6efdf0cd30b5b85f9d8a437e08b6d42cc0312139ea317df346fb0c13991e032", + git_commit = "a2211a92a91c892598b240e7fb334e8b05bae591", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1be401cfe0fcdf8329e6711cad5e761b1e0faf02 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 26 Oct 2018 16:01:55 -0700 Subject: [PATCH 1532/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218927962 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 045efda377f..93bd256043b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f6efdf0cd30b5b85f9d8a437e08b6d42cc0312139ea317df346fb0c13991e032", - git_commit = "a2211a92a91c892598b240e7fb334e8b05bae591", + sha256 = "4a209a18b3aa42c8fd3ac20aa43a175fc6dcbfad1161875012708c7163ef489b", + git_commit = "f5a99d5272b50e93b340bd2f34a4871139c502be", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 10738e2d95252ac77766b126496c455c27582280 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 26 Oct 2018 17:02:08 -0700 Subject: [PATCH 1533/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218936029 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 93bd256043b..078305385e7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4a209a18b3aa42c8fd3ac20aa43a175fc6dcbfad1161875012708c7163ef489b", - git_commit = "f5a99d5272b50e93b340bd2f34a4871139c502be", + sha256 = "94aaa4f04c073ce727607cd69749dd1de008a54e9a1eafab42d3ab0954962e6e", + git_commit = "5e11be225e2160837ea4ccc18ae2470bfa06e55c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ef699a9dd1a85fe1a9790607760334f7d52c1155 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 26 Oct 2018 18:01:45 -0700 Subject: [PATCH 1534/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218941412 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 078305385e7..0c34f0a4454 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "94aaa4f04c073ce727607cd69749dd1de008a54e9a1eafab42d3ab0954962e6e", - git_commit = "5e11be225e2160837ea4ccc18ae2470bfa06e55c", + sha256 = "702aa5fc0c977b2d42d2e632ba0cba09d11df626ee905978a02b8510ea48ff8b", + git_commit = "8874f6f8b4caabf8e0d5d9eb2e11b4d0d24cfffa", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From abbc3eb86987b2ebf61e946ee916fbef25fca25d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 26 Oct 2018 20:01:43 -0700 Subject: [PATCH 1535/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218948643 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0c34f0a4454..9f0e52da170 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "702aa5fc0c977b2d42d2e632ba0cba09d11df626ee905978a02b8510ea48ff8b", - git_commit = "8874f6f8b4caabf8e0d5d9eb2e11b4d0d24cfffa", + sha256 = "efc4e2143915adb0bd153603acf52a1e8e4b6086c9a2038964b745bd97e44813", + git_commit = "68ebb861e916c094de934b1d10a47d905e596795", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f360fcbff2cd06f2bcaa1a18564747316a0c0e99 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 27 Oct 2018 00:02:01 -0700 Subject: [PATCH 1536/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218960115 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9f0e52da170..6bb6480cacb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "efc4e2143915adb0bd153603acf52a1e8e4b6086c9a2038964b745bd97e44813", - git_commit = "68ebb861e916c094de934b1d10a47d905e596795", + sha256 = "6749db5d3ae2ce52c327f8a839cfd6b2b7047c7e0bd758b335f3f4eaba0a14a3", + git_commit = "5529a3267c39ddaa1c283eb7fa99a044e940d56f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c3d45d8f9c79a750e6166979a3af1c4ec76dc90c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 27 Oct 2018 04:01:58 -0700 Subject: [PATCH 1537/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 218973140 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6bb6480cacb..16990b64c79 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6749db5d3ae2ce52c327f8a839cfd6b2b7047c7e0bd758b335f3f4eaba0a14a3", - git_commit = "5529a3267c39ddaa1c283eb7fa99a044e940d56f", + sha256 = "f5c8ddba6387f7a52e2403a6c5a9218174b0a853aaa494becc5e6b1e88c3fbc8", + git_commit = "eddf3635b41fd457b2a36cf17bba40352c4abc57", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4eb7ea8f04d844c75e3b8b6a96fc9d7dfc56b3e3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 27 Oct 2018 20:01:51 -0700 Subject: [PATCH 1538/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219011217 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 16990b64c79..30156a1dc50 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f5c8ddba6387f7a52e2403a6c5a9218174b0a853aaa494becc5e6b1e88c3fbc8", - git_commit = "eddf3635b41fd457b2a36cf17bba40352c4abc57", + sha256 = "352e552bdfbcf725dca3f80279670a7557b31315aebe917feeaf9d8a0e2bb934", + git_commit = "ea916c474bb19422cea3cfb17cce5ab6d7552582", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 751d1571ed3b977603d1f90cb97835723acf8e17 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 27 Oct 2018 23:01:56 -0700 Subject: [PATCH 1539/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219018881 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 30156a1dc50..7d90cd84922 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "352e552bdfbcf725dca3f80279670a7557b31315aebe917feeaf9d8a0e2bb934", - git_commit = "ea916c474bb19422cea3cfb17cce5ab6d7552582", + sha256 = "f968340f9b68900a5e2875a574788423892fc1754094e7d83d13e66bc283a51c", + git_commit = "86a7867840d290f6d80b20765b4635c217700bd4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3139adbc8ecf009abc9660aa2ca187b46ce94e17 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 28 Oct 2018 07:01:56 -0700 Subject: [PATCH 1540/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219039065 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7d90cd84922..71ae5c55ffb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f968340f9b68900a5e2875a574788423892fc1754094e7d83d13e66bc283a51c", - git_commit = "86a7867840d290f6d80b20765b4635c217700bd4", + sha256 = "45621a20cf3510cc80ac8fdeee041f689126781ce7ef4496be8ce15cc8d80efe", + git_commit = "11048a0dc9475e2a830735c04e9fdb5b25e1cba1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 69a198d7da93bdbcb073f464a7efcce9b2e61bb3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 28 Oct 2018 22:01:39 -0700 Subject: [PATCH 1541/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219077307 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 71ae5c55ffb..7b5310b0d3d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "45621a20cf3510cc80ac8fdeee041f689126781ce7ef4496be8ce15cc8d80efe", - git_commit = "11048a0dc9475e2a830735c04e9fdb5b25e1cba1", + sha256 = "335489aff1ee8e6bf05e0d7ae752f57b8022a0554d2b4671552356053946680e", + git_commit = "e66aea59e0367618f924ffe3bc3b1140be8eaf45", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 139da97b2615fb5cd926af16e43956f0ad894efa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 29 Oct 2018 01:01:58 -0700 Subject: [PATCH 1542/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219088911 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7b5310b0d3d..b5075e08213 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "335489aff1ee8e6bf05e0d7ae752f57b8022a0554d2b4671552356053946680e", - git_commit = "e66aea59e0367618f924ffe3bc3b1140be8eaf45", + sha256 = "89baaefc811db213414d3ab58ef372cd267458d09684712e6acee7ec5e0ef4cf", + git_commit = "8efee06786198142bd99bdec0bfacc791d0937ab", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6cfc4a6fe916b5d2bda4d59f07425d361bbd7f4c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 29 Oct 2018 04:02:37 -0700 Subject: [PATCH 1543/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219106764 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b5075e08213..6f0e1ac6ed2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "89baaefc811db213414d3ab58ef372cd267458d09684712e6acee7ec5e0ef4cf", - git_commit = "8efee06786198142bd99bdec0bfacc791d0937ab", + sha256 = "9255b9966780eef21724fe505bbd36a5da8482e620853c680368f7c069988272", + git_commit = "7fa6658a8f82fafc2f7f9226a5bb0f6cfb3d77a6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9e236e09ac2d3fe4e6ce3e7b20f7b27c10d77b9b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 29 Oct 2018 09:12:45 -0700 Subject: [PATCH 1544/8103] Internal build specification change PiperOrigin-RevId: 219137973 --- tensorflow_serving/serving.bzl | 73 +++++++++++++++++++--------------- 1 file changed, 41 insertions(+), 32 deletions(-) diff --git a/tensorflow_serving/serving.bzl b/tensorflow_serving/serving.bzl index b9306d1d366..e474842b23e 100644 --- a/tensorflow_serving/serving.bzl +++ b/tensorflow_serving/serving.bzl @@ -1,39 +1,48 @@ load("@protobuf_archive//:protobuf.bzl", "cc_proto_library") load("@protobuf_archive//:protobuf.bzl", "py_proto_library") -def serving_proto_library(name, srcs=[], has_services=False, - deps=[], visibility=None, testonly=0, # pylint: disable=unused-argument - cc_grpc_version = None, - cc_api_version=2, go_api_version=2, - java_api_version=2, - py_api_version=2): - native.filegroup(name=name + "_proto_srcs", - srcs=srcs, - testonly=testonly,) +def serving_proto_library( + name, + srcs = [], + has_services = False, # pylint: disable=unused-argument + deps = [], + visibility = None, + testonly = 0, + cc_grpc_version = None, + cc_api_version = 2): # pylint: disable=unused-argument + native.filegroup( + name = name + "_proto_srcs", + srcs = srcs, + testonly = testonly, + ) - use_grpc_plugin = None - if cc_grpc_version: - use_grpc_plugin = True - cc_proto_library(name=name, - srcs=srcs, - deps=deps, - cc_libs = ["@protobuf_archive//:protobuf"], - protoc="@protobuf_archive//:protoc", - default_runtime="@protobuf_archive//:protobuf", - use_grpc_plugin=use_grpc_plugin, - testonly=testonly, - visibility=visibility,) + use_grpc_plugin = None + if cc_grpc_version: + use_grpc_plugin = True + cc_proto_library( + name = name, + srcs = srcs, + deps = deps, + cc_libs = ["@protobuf_archive//:protobuf"], + protoc = "@protobuf_archive//:protoc", + default_runtime = "@protobuf_archive//:protobuf", + use_grpc_plugin = use_grpc_plugin, + testonly = testonly, + visibility = visibility, + ) def serving_go_grpc_library(**kwargs): # pylint: disable=unused-argument - """Build the Go gRPC bindings for a service. Not yet implemented.""" - return + """Build the Go gRPC bindings for a service. Not yet implemented.""" + return -def serving_proto_library_py(name, proto_library, srcs=[], deps=[], visibility=None, testonly=0): # pylint: disable=unused-argument - py_proto_library(name=name, - srcs=srcs, - srcs_version = "PY2AND3", - deps=["@protobuf_archive//:protobuf_python"] + deps, - default_runtime="@protobuf_archive//:protobuf_python", - protoc="@protobuf_archive//:protoc", - visibility=visibility, - testonly=testonly,) +def serving_proto_library_py(name, proto_library, srcs = [], deps = [], visibility = None, testonly = 0): # pylint: disable=unused-argument + py_proto_library( + name = name, + srcs = srcs, + srcs_version = "PY2AND3", + deps = ["@protobuf_archive//:protobuf_python"] + deps, + default_runtime = "@protobuf_archive//:protobuf_python", + protoc = "@protobuf_archive//:protoc", + visibility = visibility, + testonly = testonly, + ) From 1dfb9fd42408c0bc763fc2d6e4b77b081164ca4e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 29 Oct 2018 15:02:07 -0700 Subject: [PATCH 1545/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219199703 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6f0e1ac6ed2..2d516359463 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9255b9966780eef21724fe505bbd36a5da8482e620853c680368f7c069988272", - git_commit = "7fa6658a8f82fafc2f7f9226a5bb0f6cfb3d77a6", + sha256 = "a5e0613f3ec1e9857827c7c57f282daeb5b4fd82a3be993f1e20f9350547f20b", + git_commit = "98fb3b92432dbc68e9170d137fc4aedf721bd1b7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3b9f701d2ab16b9a91979d1d6ad472930a17aeb1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 29 Oct 2018 16:01:44 -0700 Subject: [PATCH 1546/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219209551 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2d516359463..6d187ccfa9a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a5e0613f3ec1e9857827c7c57f282daeb5b4fd82a3be993f1e20f9350547f20b", - git_commit = "98fb3b92432dbc68e9170d137fc4aedf721bd1b7", + sha256 = "4d8a3dc008222b3c9cd08985a1779d49fdbba0c7040e4ca4a66743e9f8f00726", + git_commit = "20e7d7db87b41abeb057819c33f247ecfcf2ad5c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 56c60bce657745e6aa29c2d9b31f2f41e5088cf0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 29 Oct 2018 18:01:55 -0700 Subject: [PATCH 1547/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219226387 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6d187ccfa9a..4569e5e5fea 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4d8a3dc008222b3c9cd08985a1779d49fdbba0c7040e4ca4a66743e9f8f00726", - git_commit = "20e7d7db87b41abeb057819c33f247ecfcf2ad5c", + sha256 = "96f5bbcdcd1990f459eecb264a75c4781361af3ceb0b2358eab2e868c2caa69b", + git_commit = "ce96b12258a2a649ce021c1073c6d77e5fd08171", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4b235ff0c084f5c1dbe2a864375f5cc70fd805a1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 29 Oct 2018 19:02:01 -0700 Subject: [PATCH 1548/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219232945 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4569e5e5fea..1e14abfe1c3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "96f5bbcdcd1990f459eecb264a75c4781361af3ceb0b2358eab2e868c2caa69b", - git_commit = "ce96b12258a2a649ce021c1073c6d77e5fd08171", + sha256 = "59915027c8ff0707b76e370b02cdb0d44e0c99fd2a85358144c4a483af65535b", + git_commit = "c8700f6297eb84eeb65a6a49411f568195687733", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4c326b3128a2faa064e6bbb3f101da6f8b90e92f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 29 Oct 2018 21:01:55 -0700 Subject: [PATCH 1549/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219241709 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1e14abfe1c3..455b1788570 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "59915027c8ff0707b76e370b02cdb0d44e0c99fd2a85358144c4a483af65535b", - git_commit = "c8700f6297eb84eeb65a6a49411f568195687733", + sha256 = "3a94a06bacab07c2506de9407a2a023bb7804ccc2a69e9590836dbf55ca78264", + git_commit = "10f259865ae3ad5703e4b962b99969cd29e4c676", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 17e6dc511517fa3b0fd465f36e7683e5c5ab1221 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 30 Oct 2018 02:01:50 -0700 Subject: [PATCH 1550/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219265174 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 455b1788570..924b1d94ba0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3a94a06bacab07c2506de9407a2a023bb7804ccc2a69e9590836dbf55ca78264", - git_commit = "10f259865ae3ad5703e4b962b99969cd29e4c676", + sha256 = "439fbb1262e7bf99b65781e449b00b3591e80f7b2af616e6c67b683fa47c387f", + git_commit = "e283ef23d9471882bef8a7f59150459d017fe5e6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7237fb54c8d5898713e0bba7573add60cd19c25e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 30 Oct 2018 03:36:28 -0700 Subject: [PATCH 1551/8103] Make error message for input size mismatch even more actionable. PiperOrigin-RevId: 219273777 --- tensorflow_serving/servables/tensorflow/BUILD | 1 + .../servables/tensorflow/predict_util.cc | 49 +++++++++-------- .../servables/tensorflow/predict_util_test.cc | 55 ++++++++++++------- 3 files changed, 62 insertions(+), 43 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index 3e2c5ee9ea3..fbb153b2506 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -480,6 +480,7 @@ cc_test( "//tensorflow_serving/model_servers:platform_config_util", "//tensorflow_serving/model_servers:server_core", "//tensorflow_serving/test_util", + "@com_google_absl//absl/strings", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", "@org_tensorflow//tensorflow/contrib/session_bundle", diff --git a/tensorflow_serving/servables/tensorflow/predict_util.cc b/tensorflow_serving/servables/tensorflow/predict_util.cc index b141604516c..afa9710a4a8 100644 --- a/tensorflow_serving/servables/tensorflow/predict_util.cc +++ b/tensorflow_serving/servables/tensorflow/predict_util.cc @@ -33,21 +33,6 @@ namespace tensorflow { namespace serving { namespace { -// Returns the keys in the map as a comma delimited string. Useful for debugging -// or when returning error messages. -// e.g. returns "key1, key2, key3". -string MapKeysToString(const google::protobuf::Map& map) { - string result = ""; - for (const auto& i : map) { - if (result.empty()) { - result += i.first; - } else { - result += ", " + i.first; - } - } - return result; -} - Status VerifySignature(const SignatureDef& signature) { if (signature.method_name() != kPredictMethodName && signature.method_name() != kClassifyMethodName && @@ -61,24 +46,40 @@ Status VerifySignature(const SignatureDef& signature) { } template -std::vector get_map_keys(const T& proto_map) { - std::vector keys; +std::set GetMapKeys(const T& proto_map) { + std::set keys; for (auto it : proto_map) { - keys.push_back(it.first); + keys.insert(it.first); } return keys; } +// Returns a \ b, i.e. all items that are in `set_a` but not in `set_b`. +std::set SetDifference(std::set set_a, std::set set_b) { + std::set result; + std::set_difference(set_a.begin(), set_a.end(), set_b.begin(), set_b.end(), + std::inserter(result, result.end())); + return result; +} + Status VerifyRequestInputsSize(const SignatureDef& signature, const PredictRequest& request) { if (request.inputs().size() != signature.inputs().size()) { + const std::set request_inputs = GetMapKeys(request.inputs()); + const std::set signature_inputs = GetMapKeys(signature.inputs()); + const std::set sent_extra = + SetDifference(request_inputs, signature_inputs); + const std::set missing = + SetDifference(signature_inputs, request_inputs); return tensorflow::Status( tensorflow::error::INVALID_ARGUMENT, absl::StrCat( "input size does not match signature: ", request.inputs().size(), - "!=", signature.inputs().size(), " len([", - absl::StrJoin(get_map_keys(request.inputs()), ","), "]) != len([", - absl::StrJoin(get_map_keys(signature.inputs()), ","), "])")); + "!=", signature.inputs().size(), " len({", + absl::StrJoin(request_inputs, ","), "}) != len({", + absl::StrJoin(signature_inputs, ","), "}). Sent extra: {", + absl::StrJoin(sent_extra, ","), "}. Missing but required: {", + absl::StrJoin(missing, ","), "}.")); } return Status::OK(); } @@ -100,7 +101,8 @@ Status PreProcessPrediction(const SignatureDef& signature, tensorflow::error::INVALID_ARGUMENT, strings::StrCat("input tensor alias not found in signature: ", alias, ". Inputs expected to be in the set {", - MapKeysToString(signature.inputs()), "}.")); + absl::StrJoin(GetMapKeys(signature.inputs()), ","), + "}.")); } Tensor tensor; if (!tensor.FromProto(input.second)) { @@ -121,7 +123,8 @@ Status PreProcessPrediction(const SignatureDef& signature, tensorflow::error::INVALID_ARGUMENT, strings::StrCat("output tensor alias not found in signature: ", alias, " Outputs expected to be in the set {", - MapKeysToString(signature.outputs()), "}.")); + absl::StrJoin(GetMapKeys(signature.outputs()), ","), + "}.")); } if (seen_outputs.find(alias) != seen_outputs.end()) { return tensorflow::Status(tensorflow::error::INVALID_ARGUMENT, diff --git a/tensorflow_serving/servables/tensorflow/predict_util_test.cc b/tensorflow_serving/servables/tensorflow/predict_util_test.cc index 6bea09f10a9..47a6809391e 100644 --- a/tensorflow_serving/servables/tensorflow/predict_util_test.cc +++ b/tensorflow_serving/servables/tensorflow/predict_util_test.cc @@ -17,6 +17,7 @@ limitations under the License. #include #include +#include "absl/strings/str_cat.h" #include "tensorflow/cc/saved_model/loader.h" #include "tensorflow/cc/saved_model/signature_constants.h" #include "tensorflow/contrib/session_bundle/session_bundle.h" @@ -167,21 +168,31 @@ TEST_F(PredictImplTest, EmptyInputList) { TEST_F(PredictImplTest, InputTensorsDontMatchModelSpecInputs) { PredictRequest request; PredictResponse response; + auto inputs = request.mutable_inputs(); ModelSpec* model_spec = request.mutable_model_spec(); model_spec->set_name(kTestModelName); model_spec->mutable_version()->set_value(kTestModelVersion); - TensorProto tensor_proto; - tensor_proto.add_string_val("any_key"); - tensor_proto.set_dtype(tensorflow::DT_STRING); - tensor_proto.mutable_tensor_shape()->add_dim()->set_size(1); - - auto inputs = request.mutable_inputs(); - (*inputs)["key"] = tensor_proto; - EXPECT_EQ( - tensorflow::error::INVALID_ARGUMENT, - CallPredict(GetServerCore(), request, &response).code()); + TensorProto tensor_proto1; + tensor_proto1.add_string_val("any_value"); + tensor_proto1.set_dtype(tensorflow::DT_STRING); + tensor_proto1.mutable_tensor_shape()->add_dim()->set_size(1); + (*inputs)["unknown_key1"] = tensor_proto1; + + TensorProto tensor_proto2; + tensor_proto2.add_float_val(1.0); + tensor_proto2.set_dtype(tensorflow::DT_FLOAT); + tensor_proto2.mutable_tensor_shape()->add_dim()->set_size(1); + (*inputs)["unknown_key2"] = tensor_proto2; + + Status status = CallPredict(GetServerCore(), request, &response); + EXPECT_EQ(status.code(), tensorflow::error::INVALID_ARGUMENT); + EXPECT_THAT(status.error_message(), + ::testing::HasSubstr("Sent extra: {unknown_key1,unknown_key2}")); + EXPECT_THAT(status.error_message(), + ::testing::HasSubstr(absl::StrCat("Missing but required: {", + kInputTensorKey, "}"))); } TEST_F(PredictImplTest, OutputFiltersDontMatchModelSpecOutputs) { @@ -199,9 +210,11 @@ TEST_F(PredictImplTest, OutputFiltersDontMatchModelSpecOutputs) { request.add_output_filter("output_filter"); // Output filter like this doesn't exist. - EXPECT_EQ( - tensorflow::error::INVALID_ARGUMENT, - CallPredict(GetServerCore(), request, &response).code()); + Status status1 = CallPredict(GetServerCore(), request, &response); + EXPECT_EQ(status1.code(), tensorflow::error::INVALID_ARGUMENT); + EXPECT_THAT(status1.error_message(), + ::testing::HasSubstr( + "output tensor alias not found in signature: output_filter")); request.clear_output_filter(); request.add_output_filter(kOutputTensorKey); @@ -209,9 +222,10 @@ TEST_F(PredictImplTest, OutputFiltersDontMatchModelSpecOutputs) { request.add_output_filter(kOutputTensorKey); // Duplicate output filter specified. - EXPECT_EQ( - tensorflow::error::INVALID_ARGUMENT, - CallPredict(GetServerCore(), request, &response).code()); + Status status2 = CallPredict(GetServerCore(), request, &response); + EXPECT_EQ(status2.code(), tensorflow::error::INVALID_ARGUMENT); + EXPECT_THAT(status2.error_message(), + ::testing::HasSubstr("duplicate output tensor alias: y")); } TEST_F(PredictImplTest, InputTensorsHaveWrongType) { @@ -223,16 +237,17 @@ TEST_F(PredictImplTest, InputTensorsHaveWrongType) { model_spec->mutable_version()->set_value(kTestModelVersion); TensorProto tensor_proto; - tensor_proto.add_string_val("any_key"); + tensor_proto.add_string_val("any_value"); tensor_proto.set_dtype(tensorflow::DT_STRING); tensor_proto.mutable_tensor_shape()->add_dim()->set_size(1); (*request.mutable_inputs())[kInputTensorKey] = tensor_proto; request.add_output_filter(kOutputTensorKey); // Input tensors are all wrong. - EXPECT_EQ( - tensorflow::error::INVALID_ARGUMENT, - CallPredict(GetServerCore(), request, &response).code()); + Status status = CallPredict(GetServerCore(), request, &response); + EXPECT_EQ(status.code(), tensorflow::error::INVALID_ARGUMENT); + EXPECT_THAT(status.error_message(), + ::testing::HasSubstr("to be float but string is provided")); } TEST_F(PredictImplTest, ModelMissingSignatures) { From b3f5a6ec529e98aa327f58176d1ccd3bc695dbe3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 30 Oct 2018 04:01:42 -0700 Subject: [PATCH 1552/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219275574 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 924b1d94ba0..c949500e3ae 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "439fbb1262e7bf99b65781e449b00b3591e80f7b2af616e6c67b683fa47c387f", - git_commit = "e283ef23d9471882bef8a7f59150459d017fe5e6", + sha256 = "262326fcfcd3f38c026d590715cc537c11d39533e7e847b336d6c3a250d5822d", + git_commit = "bc3eef9ff0f8f36ac5ad163018741a7258e9a99e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From dc9e71559c797a8656a75dbea83963c5608c9080 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 30 Oct 2018 07:02:11 -0700 Subject: [PATCH 1553/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219292894 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c949500e3ae..a8d4707f283 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "262326fcfcd3f38c026d590715cc537c11d39533e7e847b336d6c3a250d5822d", - git_commit = "bc3eef9ff0f8f36ac5ad163018741a7258e9a99e", + sha256 = "47c557c04582e7d052ccb37bc06170f533d72d592d1f4f1ed329a1d14a7b9e5e", + git_commit = "e21a4cb14795691b8e97a8373eb2d231ef97c3b9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7094a0d9a48ca1f0b2f00294ba3722b37cc30fc0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 30 Oct 2018 14:02:06 -0700 Subject: [PATCH 1554/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219361416 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a8d4707f283..b8291878ac3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "47c557c04582e7d052ccb37bc06170f533d72d592d1f4f1ed329a1d14a7b9e5e", - git_commit = "e21a4cb14795691b8e97a8373eb2d231ef97c3b9", + sha256 = "c84519c84266bfa44fd4be852a30b68d90ec8274d9b6eb5dd6edf8d2a3be8dac", + git_commit = "56d8aa6cbd862917596cc7a1d9d600ddc6a84a09", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4d227c270090bd4e8e906dac56b5208ed951f169 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 30 Oct 2018 15:02:02 -0700 Subject: [PATCH 1555/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219372654 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b8291878ac3..222ea88ec06 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c84519c84266bfa44fd4be852a30b68d90ec8274d9b6eb5dd6edf8d2a3be8dac", - git_commit = "56d8aa6cbd862917596cc7a1d9d600ddc6a84a09", + sha256 = "b5e08a4a62d6906fbf99fba775f77bbd3fc6a3440cd05214c2fafc33eb9bb4ed", + git_commit = "ea42e8884392f7dc6a612ed7d316c7947628cd32", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From af3e1a9fb5207a673377f86e7bd30eae3f5c244a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 30 Oct 2018 16:02:18 -0700 Subject: [PATCH 1556/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219382915 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 222ea88ec06..8ceeb59323a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b5e08a4a62d6906fbf99fba775f77bbd3fc6a3440cd05214c2fafc33eb9bb4ed", - git_commit = "ea42e8884392f7dc6a612ed7d316c7947628cd32", + sha256 = "23765ec28951dbda19b759c7bd285c9e5918cc83217d6f84c5e04f846859bdb7", + git_commit = "616f9e466c105288456ee9fb0938d1c86cbb43e8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 23c9f45f3f18a4a0f38efa2ce57e349191136cfd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 30 Oct 2018 17:02:25 -0700 Subject: [PATCH 1557/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219392358 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8ceeb59323a..9c396046c0f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "23765ec28951dbda19b759c7bd285c9e5918cc83217d6f84c5e04f846859bdb7", - git_commit = "616f9e466c105288456ee9fb0938d1c86cbb43e8", + sha256 = "4b19448430114da0876b91527fcb1ec25c44e2dba5ac5cd7bebb102630f4e907", + git_commit = "6583e2cf2b81940ce052a7317fbcbab12a51bd75", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e9d434c3ead37186925fb71ee055e0425d0ca257 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 30 Oct 2018 18:01:43 -0700 Subject: [PATCH 1558/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219400037 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9c396046c0f..7383f85785a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4b19448430114da0876b91527fcb1ec25c44e2dba5ac5cd7bebb102630f4e907", - git_commit = "6583e2cf2b81940ce052a7317fbcbab12a51bd75", + sha256 = "958bd14855674cb4216f4ac31f8379e4c58ebcd29ccf63827e497558b4885780", + git_commit = "52caf951fb2df23047658c19269c2ada4285bad5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5ff03b27312ffca7032edd33468fedd0259c029f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 30 Oct 2018 19:01:47 -0700 Subject: [PATCH 1559/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219406067 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7383f85785a..88bf9d03064 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "958bd14855674cb4216f4ac31f8379e4c58ebcd29ccf63827e497558b4885780", - git_commit = "52caf951fb2df23047658c19269c2ada4285bad5", + sha256 = "d3eaf6d59db67614a84c7bfc28f6cdf67e41b8bc0aebb82b1dc2801083e4dc96", + git_commit = "1c65726d45766ff0c4f435ade785f7442b8ac648", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0f97a53442ae00b8da9f3810e9080d177a3dbec6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 30 Oct 2018 20:01:58 -0700 Subject: [PATCH 1560/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219410464 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 88bf9d03064..addba32b408 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d3eaf6d59db67614a84c7bfc28f6cdf67e41b8bc0aebb82b1dc2801083e4dc96", - git_commit = "1c65726d45766ff0c4f435ade785f7442b8ac648", + sha256 = "baa12f0bde3959e2f716578f6defcf5728e562a58f40104d8ec831f921bbc124", + git_commit = "95de98b58a35aaac2804716a70979e68596f3dae", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 62bc7a4a2bfd81cea031f87a2ed742e355bc3fa4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 30 Oct 2018 23:01:50 -0700 Subject: [PATCH 1561/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219423552 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index addba32b408..7c849c782e4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "baa12f0bde3959e2f716578f6defcf5728e562a58f40104d8ec831f921bbc124", - git_commit = "95de98b58a35aaac2804716a70979e68596f3dae", + sha256 = "bf4683ed976014b3ef19ee0a74c836b21143dc87bfec2bd1ffca2036b89d1017", + git_commit = "7975807cd8171ffc9f69dd24651d6d7ccb389621", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 80e38de8822a619f5c36e0e0c0933a49257130a2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 31 Oct 2018 01:01:58 -0700 Subject: [PATCH 1562/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219432407 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7c849c782e4..9b9000f36f0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bf4683ed976014b3ef19ee0a74c836b21143dc87bfec2bd1ffca2036b89d1017", - git_commit = "7975807cd8171ffc9f69dd24651d6d7ccb389621", + sha256 = "b507472c0bd79707a5d7628de5fc760752cef90fa9629c32ab47483ffeb1af12", + git_commit = "caff08f7a0863ab73678a9d36f5d97e0e8e9499b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 273a9f5906196a3222072173178618a991d382a2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 31 Oct 2018 05:01:51 -0700 Subject: [PATCH 1563/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219455175 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9b9000f36f0..c0e12da2118 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b507472c0bd79707a5d7628de5fc760752cef90fa9629c32ab47483ffeb1af12", - git_commit = "caff08f7a0863ab73678a9d36f5d97e0e8e9499b", + sha256 = "90b0a70386148c8986e275ddf2655487e479b7743ad7ff2bed77a4bff9473cb0", + git_commit = "d053da5dff68869b1fa5ac71f2639cd7d9e73a3a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e196bb06a283ccf2a119b7a2663e364a7b5fbf8e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 31 Oct 2018 08:02:49 -0700 Subject: [PATCH 1564/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219473820 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c0e12da2118..e2286ef2857 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "90b0a70386148c8986e275ddf2655487e479b7743ad7ff2bed77a4bff9473cb0", - git_commit = "d053da5dff68869b1fa5ac71f2639cd7d9e73a3a", + sha256 = "710ca8985f3fb207a1532e17392d44a7088636f18ca98a54fff7a390a0eb12c7", + git_commit = "8e32976fd49c3dd8d823b4eeec649157b98b2a8b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 359e14acd5475f57c7341c523452e7b7b8b3d3c0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 31 Oct 2018 10:01:57 -0700 Subject: [PATCH 1565/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219491360 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e2286ef2857..2d24dbc3dff 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "710ca8985f3fb207a1532e17392d44a7088636f18ca98a54fff7a390a0eb12c7", - git_commit = "8e32976fd49c3dd8d823b4eeec649157b98b2a8b", + sha256 = "3a1529358bae2fe4ca1599f4e051c5dbdf38757508e8ce3214b2eee97f0dc3bf", + git_commit = "7e9d19d39fdb8d10cd533bc5018348f973ae68da", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 74d7585bf5bda8da60d99dcdaf5219ec6e515100 Mon Sep 17 00:00:00 2001 From: blamb Date: Wed, 31 Oct 2018 12:52:41 -0700 Subject: [PATCH 1566/8103] Refactor books: - Move _menu_toc.yaml from versions/ to api_docs/ - Move _upper_tabs_versions.yaml from versions/ to api_docs/ - Consolidate _more_toc.yaml into api_docs/_book.yaml - Add links to ecosystem project api docs PiperOrigin-RevId: 219522643 --- tensorflow_serving/g3doc/_book.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/g3doc/_book.yaml b/tensorflow_serving/g3doc/_book.yaml index 96a7bd24282..fb4c806aea8 100644 --- a/tensorflow_serving/g3doc/_book.yaml +++ b/tensorflow_serving/g3doc/_book.yaml @@ -1,7 +1,7 @@ upper_tabs: # Tabs left of dropdown menu - include: /_upper_tabs_left.yaml -- include: /versions/_upper_tabs_versions.yaml +- include: /api_docs/_upper_tabs_api.yaml # Dropdown menu - name: Ecosystem path: /ecosystem From 706d4f5e98804edf7cc19e63753385a9522b413b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 31 Oct 2018 16:02:08 -0700 Subject: [PATCH 1567/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219553480 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2d24dbc3dff..f2f1e0593b7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3a1529358bae2fe4ca1599f4e051c5dbdf38757508e8ce3214b2eee97f0dc3bf", - git_commit = "7e9d19d39fdb8d10cd533bc5018348f973ae68da", + sha256 = "cfb80f7d880fd2fd6386d5b548d53261b4917218be16393849cd77b6e91f5d64", + git_commit = "ba1e7f71396b54ca4d02161d511c86f84c818ee3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b6d4ddf8baa9b3f942d5169f34aa471c34354d0b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 31 Oct 2018 17:01:56 -0700 Subject: [PATCH 1568/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219561795 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f2f1e0593b7..a661dc5a794 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cfb80f7d880fd2fd6386d5b548d53261b4917218be16393849cd77b6e91f5d64", - git_commit = "ba1e7f71396b54ca4d02161d511c86f84c818ee3", + sha256 = "3cd89a9db7825587f2915aa541612f231944d15c77003ba9607c48ae934efd21", + git_commit = "a22c5594d3a40932cf9a5926284929ae0640426e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 91e396afa42feffa04119ed45fa767b10f96b2d6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 31 Oct 2018 20:01:53 -0700 Subject: [PATCH 1569/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219577040 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a661dc5a794..f9cb325d5c1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3cd89a9db7825587f2915aa541612f231944d15c77003ba9607c48ae934efd21", - git_commit = "a22c5594d3a40932cf9a5926284929ae0640426e", + sha256 = "0f33d78d4c7e35bde7467bca321f883c2ad0ef9130a3d82c7c6430c5405b50ce", + git_commit = "bef87d7cd8f68f2ac80330dcf311579038aa89ff", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9c2005972d0b33aa3af7194505b7aae37f9c7ab8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 1 Nov 2018 04:01:49 -0700 Subject: [PATCH 1570/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219613202 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f9cb325d5c1..1a257874937 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0f33d78d4c7e35bde7467bca321f883c2ad0ef9130a3d82c7c6430c5405b50ce", - git_commit = "bef87d7cd8f68f2ac80330dcf311579038aa89ff", + sha256 = "e6e6ae49d9f1e402913862f03bb0f828b7e29b40731e53d8087c50e39502904c", + git_commit = "4b46a399d7a5a5c9cc262d08e0df1217364a5b9f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a08aa2a96001d2be33cb6a1cbe711a9c92a9e55c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 1 Nov 2018 09:02:46 -0700 Subject: [PATCH 1571/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219642855 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1a257874937..69bc5302a1c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e6e6ae49d9f1e402913862f03bb0f828b7e29b40731e53d8087c50e39502904c", - git_commit = "4b46a399d7a5a5c9cc262d08e0df1217364a5b9f", + sha256 = "1e18f681cf30d7aac696cfe91ee40dcdbf1b6d3c8c4d829ff9396dd8f61d2f70", + git_commit = "b21a78132f73f68bf636ba8e491d7f52a55523b3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6697a3d99635c3e6e4bc6003594f7c941a5a650a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 1 Nov 2018 11:02:12 -0700 Subject: [PATCH 1572/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219663179 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 69bc5302a1c..9f381060c27 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1e18f681cf30d7aac696cfe91ee40dcdbf1b6d3c8c4d829ff9396dd8f61d2f70", - git_commit = "b21a78132f73f68bf636ba8e491d7f52a55523b3", + sha256 = "79d0e1f63fe519cbec05271cfb502c16e24db4b324ac6a93a1453cb10927ae92", + git_commit = "b83f7207a55ac60e9fda2b57a766e6db563a5b88", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 676fa6566dbdc72b5ddadc520b390381f13993c0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 1 Nov 2018 12:58:21 -0700 Subject: [PATCH 1573/8103] Removed unnecessary dependency in static_source_router. PiperOrigin-RevId: 219683218 --- tensorflow_serving/core/BUILD | 1 - 1 file changed, 1 deletion(-) diff --git a/tensorflow_serving/core/BUILD b/tensorflow_serving/core/BUILD index 66ba8ee04fc..a3b15aae43b 100644 --- a/tensorflow_serving/core/BUILD +++ b/tensorflow_serving/core/BUILD @@ -205,7 +205,6 @@ cc_library( deps = [ ":source_router", "@org_tensorflow//tensorflow/core:lib", - "@org_tensorflow//tensorflow/core:tensorflow", ], ) From 2446a1c237e8cebb953b8f349060b4dcefe1b2c8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 1 Nov 2018 17:02:00 -0700 Subject: [PATCH 1574/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219724387 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9f381060c27..0d4ea189f12 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "79d0e1f63fe519cbec05271cfb502c16e24db4b324ac6a93a1453cb10927ae92", - git_commit = "b83f7207a55ac60e9fda2b57a766e6db563a5b88", + sha256 = "b54b1dc8960305df01460ab322cbcda410763cdc9238e2dc12e5d51159b86c4c", + git_commit = "0fe671dd0a14614edbbd50397777def3bff770cc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e81354b30b441f473f7747f74ba9de1e195f8747 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 1 Nov 2018 20:01:57 -0700 Subject: [PATCH 1575/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219741619 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0d4ea189f12..60aae71cbb2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b54b1dc8960305df01460ab322cbcda410763cdc9238e2dc12e5d51159b86c4c", - git_commit = "0fe671dd0a14614edbbd50397777def3bff770cc", + sha256 = "01c37be4b7e28c214b1cbc0a2f4f3f14437b5428cbc29432c1095897e4260f37", + git_commit = "a61fff3e1291ebc482fd6311bab013129d5fcf9e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ee7e02b4e83378e45948a7ad71ad2676c54ffb30 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 2 Nov 2018 00:01:53 -0700 Subject: [PATCH 1576/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219757438 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 60aae71cbb2..a8c70fa50a6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "01c37be4b7e28c214b1cbc0a2f4f3f14437b5428cbc29432c1095897e4260f37", - git_commit = "a61fff3e1291ebc482fd6311bab013129d5fcf9e", + sha256 = "f3a372c9a4f90c566926fe6250488fec70dad63090f5ee65308bfccd46c5ebcf", + git_commit = "a2f2c7b035fa8023d66146564afcb298fa8a379d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 84777e398310e555353aebe191e032d83f5224ba Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 2 Nov 2018 07:02:33 -0700 Subject: [PATCH 1577/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219792501 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a8c70fa50a6..8d800955f6c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f3a372c9a4f90c566926fe6250488fec70dad63090f5ee65308bfccd46c5ebcf", - git_commit = "a2f2c7b035fa8023d66146564afcb298fa8a379d", + sha256 = "3e44e7a225df55dbf23285660c8a842aef5992ca9f2971e6bfc2e62d35870b36", + git_commit = "1626046c80ead2bfce4f399db6db014ee3bbd14e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6e2890cfed0ba6c1e8d02207c451bb17755535f7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 2 Nov 2018 11:02:10 -0700 Subject: [PATCH 1578/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219827221 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8d800955f6c..442d4f897f1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3e44e7a225df55dbf23285660c8a842aef5992ca9f2971e6bfc2e62d35870b36", - git_commit = "1626046c80ead2bfce4f399db6db014ee3bbd14e", + sha256 = "8f4a38c077a8a429d01211c39ad351bdb3bdf38691647b193b2efeefe9962b0c", + git_commit = "5e2ddbd81c1e48fcdbaf75781a7bd6a52e5718b1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0b852e61deb57e24b309849ce3b7e80ac7f2dd13 Mon Sep 17 00:00:00 2001 From: blamb Date: Fri, 2 Nov 2018 11:26:46 -0700 Subject: [PATCH 1579/8103] Add blog post to landing page PiperOrigin-RevId: 219831953 --- tensorflow_serving/g3doc/_index.yaml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tensorflow_serving/g3doc/_index.yaml b/tensorflow_serving/g3doc/_index.yaml index 5a7f28f6248..5936dadff3b 100644 --- a/tensorflow_serving/g3doc/_index.yaml +++ b/tensorflow_serving/g3doc/_index.yaml @@ -36,17 +36,17 @@ landing_page: - classname: devsite-landing-row-cards items: + - heading: "Serving ML Quickly with TensorFlow Serving and Docker" + image_path: /ecosystem/images/tf-logo-card-16x9.png + path: https://medium.com/tensorflow/serving-ml-quickly-with-tensorflow-serving-and-docker-7df7094aa008 + buttons: + - label: Read on TensorFlow blog + path: https://medium.com/tensorflow/serving-ml-quickly-with-tensorflow-serving-and-docker-7df7094aa008 - heading: "TensorFlow Serving at the Dev Summit" youtube_id: q_IkJcPyNl0 buttons: - label: Watch the video path: https://www.youtube.com/watch?v=q_IkJcPyNl0 - - heading: Running your models in production with TensorFlow Serving - image_path: /ecosystem/images/google-research-card-16x9.png - path: https://ai.googleblog.com/2016/02/running-your-models-in-production-with.html - buttons: - - label: Read on Google Research blog - path: https://ai.googleblog.com/2016/02/running-your-models-in-production-with.html - heading: TensorFlow Serving on GitHub image_path: /ecosystem/images/github-card-16x9.png path: https://github.com/tensorflow/serving From 312355496fb0f651818bb619337c0df501c622d4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 2 Nov 2018 17:01:57 -0700 Subject: [PATCH 1580/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219885284 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 442d4f897f1..c6bd164801f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8f4a38c077a8a429d01211c39ad351bdb3bdf38691647b193b2efeefe9962b0c", - git_commit = "5e2ddbd81c1e48fcdbaf75781a7bd6a52e5718b1", + sha256 = "c2ee25559c8ef827a244ad14519b0690a387a24b143d988d77af2ebdbd3cd198", + git_commit = "0aef06590ec461e2e52dbf872dde85e64978e8f9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 915108955e7c4afd6b4a2287d6d61c4a6770f2c1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 3 Nov 2018 00:01:54 -0700 Subject: [PATCH 1581/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219911346 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c6bd164801f..37806038297 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c2ee25559c8ef827a244ad14519b0690a387a24b143d988d77af2ebdbd3cd198", - git_commit = "0aef06590ec461e2e52dbf872dde85e64978e8f9", + sha256 = "50c86490f2ab2ec74e1cf407db3ded74c08b32ded16ed5d20ff2b0aca813ed7d", + git_commit = "6aac0dcc8d72b3e5ad74d7d4168e31128f1a18ce", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 64832c669cb9918c5f3d1270fb0fd2b76a428a77 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 3 Nov 2018 04:01:38 -0700 Subject: [PATCH 1582/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219925849 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 37806038297..2675bfb7d06 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "50c86490f2ab2ec74e1cf407db3ded74c08b32ded16ed5d20ff2b0aca813ed7d", - git_commit = "6aac0dcc8d72b3e5ad74d7d4168e31128f1a18ce", + sha256 = "18fafec1de47221dba00318293189a816e0057cc845d1965d4150222e259fda8", + git_commit = "4f2a9acaff04bb81684c2b49c955f296315473ac", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3dd66e4f07ddff6eac3d081ee69bbb7234e51564 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 3 Nov 2018 11:02:00 -0700 Subject: [PATCH 1583/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 219942286 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2675bfb7d06..03530ea8004 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "18fafec1de47221dba00318293189a816e0057cc845d1965d4150222e259fda8", - git_commit = "4f2a9acaff04bb81684c2b49c955f296315473ac", + sha256 = "2f6039bb0e9790d09e05273e1106fe65cdc0d45ee80f635d9a8b68f1eeb675e9", + git_commit = "953ecfd6bb885dc9821b284c103ca6dc279e3888", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 61c290f54149aed35eb7ea1eb4e249af7d909aff Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 4 Nov 2018 09:01:55 -0800 Subject: [PATCH 1584/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 220002923 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 03530ea8004..224c4204590 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2f6039bb0e9790d09e05273e1106fe65cdc0d45ee80f635d9a8b68f1eeb675e9", - git_commit = "953ecfd6bb885dc9821b284c103ca6dc279e3888", + sha256 = "7be93867b9191f18782b888fd112b476d6d5538dd4b7c3dba8728e42673ad4cf", + git_commit = "718e991578752e6c388063c3847d6a56ef713828", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6c684ad0334348e64da695c6a90dd51f1cb7be62 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 4 Nov 2018 17:01:42 -0800 Subject: [PATCH 1585/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 220024945 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 224c4204590..33d6d7217f7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7be93867b9191f18782b888fd112b476d6d5538dd4b7c3dba8728e42673ad4cf", - git_commit = "718e991578752e6c388063c3847d6a56ef713828", + sha256 = "8cd0694a4f8c06109744f7f89b4868ac5e1a72c42e8139c8eba593e4ae9857ed", + git_commit = "50397855a83f166c6d531fb18965d63d633ca021", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f06ca424390b74756b8e28be4ee1563b558c901c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 4 Nov 2018 22:01:44 -0800 Subject: [PATCH 1586/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 220042420 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 33d6d7217f7..bb5c920dcbc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8cd0694a4f8c06109744f7f89b4868ac5e1a72c42e8139c8eba593e4ae9857ed", - git_commit = "50397855a83f166c6d531fb18965d63d633ca021", + sha256 = "df80b1ed0b6693607e4d5772f20e6963dd6d70652cfc4fabc3de84600d58a52f", + git_commit = "6a0b536a779f485edc25f6a11335b5e640acc8ab", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 701c6bc2e9b3d1cb2a692d81b4565fb2bdb50bbd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 5 Nov 2018 00:02:00 -0800 Subject: [PATCH 1587/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 220049582 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bb5c920dcbc..f259b97a02b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "df80b1ed0b6693607e4d5772f20e6963dd6d70652cfc4fabc3de84600d58a52f", - git_commit = "6a0b536a779f485edc25f6a11335b5e640acc8ab", + sha256 = "6d67bc6e57bef42b2377a415f388bab8f0f4382c8888dd50f08265290f4a3891", + git_commit = "aaecc4ec5e1d548d62834ac78da5de910ff58daa", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 78ccd3390b3645f9f7f9575bf70240bfd4c13f0a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 5 Nov 2018 03:02:08 -0800 Subject: [PATCH 1588/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 220069300 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f259b97a02b..a4a45bbc11e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6d67bc6e57bef42b2377a415f388bab8f0f4382c8888dd50f08265290f4a3891", - git_commit = "aaecc4ec5e1d548d62834ac78da5de910ff58daa", + sha256 = "2eb69c5e051dfa39bbdcbf45d5e90adb20cb7492e18273258920f85f15f5d9b3", + git_commit = "e66dce03cf5159a36434899c4e8a4c1d13bf07cf", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 665b9ed390e179ce2d30437180b1c50f7bdf4fd7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 5 Nov 2018 05:01:47 -0800 Subject: [PATCH 1589/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 220080860 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a4a45bbc11e..0daf4e2757d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2eb69c5e051dfa39bbdcbf45d5e90adb20cb7492e18273258920f85f15f5d9b3", - git_commit = "e66dce03cf5159a36434899c4e8a4c1d13bf07cf", + sha256 = "32ab7edf5547781a776749cea69cf4380e14ca9cf2f09ebbb854206cc2306edf", + git_commit = "b3050e86b8bc15d7c14ef645c0d5869c8b192013", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 161a32f5c012595cd40abd9d88d19ad017be17a7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 5 Nov 2018 10:02:06 -0800 Subject: [PATCH 1590/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 220122273 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0daf4e2757d..3a08158dd39 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "32ab7edf5547781a776749cea69cf4380e14ca9cf2f09ebbb854206cc2306edf", - git_commit = "b3050e86b8bc15d7c14ef645c0d5869c8b192013", + sha256 = "e403b80931e516b76bacc84e12e542c601ffca19e6a0650862a36103c54ee6cc", + git_commit = "32d73e410769228c78e100bc55242ac40e7875fe", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 698bb9a72aad3c198675a75de9ded8a98e20a7d6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 5 Nov 2018 11:01:51 -0800 Subject: [PATCH 1591/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 220134290 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3a08158dd39..6343b7e6fbc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e403b80931e516b76bacc84e12e542c601ffca19e6a0650862a36103c54ee6cc", - git_commit = "32d73e410769228c78e100bc55242ac40e7875fe", + sha256 = "dd1a8374d0543288346bed962fd666e1a998906d61dbe43e4aae4bb1716bc94f", + git_commit = "98f7a6760aab4c40c7eb2aebc14b2a9e96f9269a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fa3a491e600e3915677508ea1910bbc78b9f1d55 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 5 Nov 2018 13:25:48 -0800 Subject: [PATCH 1592/8103] Adding links to the TensorFlow Serving APIs PiperOrigin-RevId: 220161315 --- tensorflow_serving/g3doc/_book.yaml | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/tensorflow_serving/g3doc/_book.yaml b/tensorflow_serving/g3doc/_book.yaml index fb4c806aea8..95f253ea06a 100644 --- a/tensorflow_serving/g3doc/_book.yaml +++ b/tensorflow_serving/g3doc/_book.yaml @@ -13,6 +13,12 @@ upper_tabs: other: - name: Guide contents: + - heading: Quick Start + - title: "Server: Use TensorFlow Serving with Docker" + path: /serving/docker + - title: "Client: REST API" + path: /serving/api_rest + - heading: Understanding TensorFlow Serving - title: Overview path: /serving/overview - title: Installation @@ -36,7 +42,8 @@ upper_tabs: - name: API skip_translation: true contents: - - heading: C++ reference - - title: All symbols + - heading: Serving APIs + - title: Server API (C++) path: /serving/api_docs/cc/ - - include: /serving/api_docs/cc/_doxygen.yaml + - title: Client API (REST) + path: /serving/api_rest/ From 576236e3cf8b2e7f4d222400426098ca204d9952 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 5 Nov 2018 19:01:51 -0800 Subject: [PATCH 1593/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 220212265 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6343b7e6fbc..fc50682d390 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dd1a8374d0543288346bed962fd666e1a998906d61dbe43e4aae4bb1716bc94f", - git_commit = "98f7a6760aab4c40c7eb2aebc14b2a9e96f9269a", + sha256 = "2b750a590a1dc5e313040a8fb38447aef9904b22387dee53008105a7dbcb96e0", + git_commit = "db473ed111fdb87cd1796ac0c444fcb7254ec0f0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7b7e607a6d2d54a2b9eeeaee097473b40c1e33bd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 5 Nov 2018 20:02:03 -0800 Subject: [PATCH 1594/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 220217244 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fc50682d390..a060ce75a19 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2b750a590a1dc5e313040a8fb38447aef9904b22387dee53008105a7dbcb96e0", - git_commit = "db473ed111fdb87cd1796ac0c444fcb7254ec0f0", + sha256 = "c956c0761483d0adfd9325a41d51ee9e196a0db2bf48444314bd3ff4b5c7f0dc", + git_commit = "70ccf4212035170c5411c931d5e5957afafc6ff1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b81453e865edc30ceaec47c69ea173a019d064c7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 6 Nov 2018 01:01:59 -0800 Subject: [PATCH 1595/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 220239799 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a060ce75a19..aec9486e685 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c956c0761483d0adfd9325a41d51ee9e196a0db2bf48444314bd3ff4b5c7f0dc", - git_commit = "70ccf4212035170c5411c931d5e5957afafc6ff1", + sha256 = "51954a4bf66d4d93b08292aeaea47e3e966c2439f7c67035d7ee2bfc4b35a473", + git_commit = "1c73bd639bce5440a542c711f767a32a6b573ba4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 582bb39876453c458f8e4c93ef5a338d9494e48a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 6 Nov 2018 05:01:53 -0800 Subject: [PATCH 1596/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 220262992 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index aec9486e685..37f0caf2ac2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "51954a4bf66d4d93b08292aeaea47e3e966c2439f7c67035d7ee2bfc4b35a473", - git_commit = "1c73bd639bce5440a542c711f767a32a6b573ba4", + sha256 = "56df745acaeab04fdf3e3c84826d2578f416c61c13df62858993452620085dd6", + git_commit = "6fc90a958d678c9f79c7761b5df263b95926e10c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3a64efbcd48296c94a33129c647a35971d5c1e29 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 6 Nov 2018 07:02:27 -0800 Subject: [PATCH 1597/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 220274733 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 37f0caf2ac2..41a3c413b16 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "56df745acaeab04fdf3e3c84826d2578f416c61c13df62858993452620085dd6", - git_commit = "6fc90a958d678c9f79c7761b5df263b95926e10c", + sha256 = "4c179d4c2bc697e7891d5329d09ab6749a82d3a85099c1ab4e59c3340c40db83", + git_commit = "a9b647d2ea65c7bd77deb06b10f1e5e95a6092ef", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 048c05bc49040745fdc555fd4b878299811f6841 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 6 Nov 2018 08:02:17 -0800 Subject: [PATCH 1598/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 220282563 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 41a3c413b16..768d3e88ff8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4c179d4c2bc697e7891d5329d09ab6749a82d3a85099c1ab4e59c3340c40db83", - git_commit = "a9b647d2ea65c7bd77deb06b10f1e5e95a6092ef", + sha256 = "b6b681bafa16626a230a8a8f9bdcb7f4ee98f5adf4bd8bb08a0a149866b91ce1", + git_commit = "1e7b4eadb0b1ff5fdd0ae8915d558b934d19a168", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4b0d98092ff92965baff59dbe52aafd317b2f47d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 6 Nov 2018 09:02:05 -0800 Subject: [PATCH 1599/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 220291585 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 768d3e88ff8..04625b0d2f3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b6b681bafa16626a230a8a8f9bdcb7f4ee98f5adf4bd8bb08a0a149866b91ce1", - git_commit = "1e7b4eadb0b1ff5fdd0ae8915d558b934d19a168", + sha256 = "2faaa921c1441e993c1f1031645ed7b448a259f6082f2df3cc60c11927f1a3f3", + git_commit = "366dd0eabccbf5bf968c16cb985e79efffdf098a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1391fd15ce196899af713c53e26a9a4050dc0113 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 6 Nov 2018 12:01:56 -0800 Subject: [PATCH 1600/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 220325520 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 04625b0d2f3..43636230257 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2faaa921c1441e993c1f1031645ed7b448a259f6082f2df3cc60c11927f1a3f3", - git_commit = "366dd0eabccbf5bf968c16cb985e79efffdf098a", + sha256 = "4763f3ce3403ec92da8b84ecf6b080faa2d325e41ffa43ba4ea9ded671b47dd7", + git_commit = "8cbbc1bc51e78765b02d88702fefa3469cebb2e2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0f58e4fb8f8295a6801c640e9915d995f84fcd69 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 6 Nov 2018 13:02:18 -0800 Subject: [PATCH 1601/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 220336378 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 43636230257..a85174bdd03 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4763f3ce3403ec92da8b84ecf6b080faa2d325e41ffa43ba4ea9ded671b47dd7", - git_commit = "8cbbc1bc51e78765b02d88702fefa3469cebb2e2", + sha256 = "51b15915c2d3a3b8c7a4267f360b40a989fab617e1aef05aeb7e3200759de8d9", + git_commit = "f9e169ee10454138296aa425f336bec4d847c64f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1e417fb034037f41e6d75b43da1b2a1e0bd47e84 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 6 Nov 2018 14:02:06 -0800 Subject: [PATCH 1602/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 220347326 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a85174bdd03..8e7e539c7de 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "51b15915c2d3a3b8c7a4267f360b40a989fab617e1aef05aeb7e3200759de8d9", - git_commit = "f9e169ee10454138296aa425f336bec4d847c64f", + sha256 = "afe81dc3c5f9a3a1ba2ad889f009309694b024e757c0279206543a20289a9f86", + git_commit = "0130d4a67a2bf933710a0e575ad9713f1862a8f2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ff796b10206de9a8738e792346b1b1dd22c7091c Mon Sep 17 00:00:00 2001 From: blamb Date: Wed, 7 Nov 2018 10:27:03 -0800 Subject: [PATCH 1603/8103] Fix book.yaml Remove 'via' PiperOrigin-RevId: 220486241 --- tensorflow_serving/g3doc/_book.yaml | 4 ---- tensorflow_serving/g3doc/custom_servable.md | 2 +- tensorflow_serving/g3doc/docker.md | 10 +++++----- tensorflow_serving/g3doc/overview.md | 2 +- tensorflow_serving/g3doc/setup.md | 2 +- 5 files changed, 8 insertions(+), 12 deletions(-) diff --git a/tensorflow_serving/g3doc/_book.yaml b/tensorflow_serving/g3doc/_book.yaml index 95f253ea06a..8f64a4108be 100644 --- a/tensorflow_serving/g3doc/_book.yaml +++ b/tensorflow_serving/g3doc/_book.yaml @@ -25,12 +25,8 @@ upper_tabs: path: /serving/setup - title: Serve a TensorFlow model path: /serving/serving_basic - - title: REST API - path: /serving/api_rest - title: Build a TensorFlow ModelServer path: /serving/serving_advanced - - title: Use TensorFlow Serving with Docker - path: /serving/docker - title: Use TensorFlow Serving with Kubernetes path: /serving/serving_kubernetes - title: Create a new kind of servable diff --git a/tensorflow_serving/g3doc/custom_servable.md b/tensorflow_serving/g3doc/custom_servable.md index 28cce071d0b..a7333871414 100644 --- a/tensorflow_serving/g3doc/custom_servable.md +++ b/tensorflow_serving/g3doc/custom_servable.md @@ -30,7 +30,7 @@ document). In addition to your `Loader`, you will need to define a `SourceAdapter` that instantiates a `Loader` from a given storage path. Most simple use-cases can -specify the two objects concisely via the `SimpleLoaderSourceAdapter` class +specify the two objects concisely with the `SimpleLoaderSourceAdapter` class (in `core/simple_loader.h`). Advanced use-cases may opt to specify `Loader` and `SourceAdapter` classes separately using the lower-level APIs, e.g. if the `SourceAdapter` needs to retain some state, and/or if state needs to be shared diff --git a/tensorflow_serving/g3doc/docker.md b/tensorflow_serving/g3doc/docker.md index dfbfaba70dd..456fc82ba44 100644 --- a/tensorflow_serving/g3doc/docker.md +++ b/tensorflow_serving/g3doc/docker.md @@ -1,6 +1,6 @@ -# Using TensorFlow Serving via Docker +# Using TensorFlow Serving with Docker -One of the easiest ways to get started using TensorFlow Serving is via +One of the easiest ways to get started using TensorFlow Serving is with [Docker](http://www.docker.com/). ## Installing Docker @@ -136,8 +136,8 @@ deploy and will load your model for serving on startup. ### Serving example -Let's run through a full example where we load a SavedModel and call it via the -REST API. First pull the serving image: +Let's run through a full example where we load a SavedModel and call it using +the REST API. First pull the serving image: ```shell docker pull tensorflow/serving @@ -209,7 +209,7 @@ details, see [running a serving image](#running-a-serving-image). ### GPU Serving example Let's run through a full example where we load a model with GPU-bound ops and -call it via the REST API. +call it using the REST API. First install [`nvidia-docker`](#install-nvidia-docker). Next you can pull the latest TensorFlow Serving GPU docker image by running: diff --git a/tensorflow_serving/g3doc/overview.md b/tensorflow_serving/g3doc/overview.md index 4a85ae1982b..c24f59b0d9a 100644 --- a/tensorflow_serving/g3doc/overview.md +++ b/tensorflow_serving/g3doc/overview.md @@ -121,7 +121,7 @@ TensorFlow Serving Managers provide a simple, narrow interface -- ### Core -**TensorFlow Serving Core** manages (via standard TensorFlow Serving APIs) the +Using the standard TensorFlow Serving APis, *TensorFlow Serving Core* manages the following aspects of servables: * lifecycle diff --git a/tensorflow_serving/g3doc/setup.md b/tensorflow_serving/g3doc/setup.md index 70429202244..ccc419e7d45 100644 --- a/tensorflow_serving/g3doc/setup.md +++ b/tensorflow_serving/g3doc/setup.md @@ -4,7 +4,7 @@ ### Installing using Docker -The easiest and most straight-forward way of using TensorFlow Serving is via +The easiest and most straight-forward way of using TensorFlow Serving is with [Docker images](docker.md). We highly recommend this route unless you have specific needs that are not addressed by running in a container. From 79076e629f171ea021374d63b19c104602c789fd Mon Sep 17 00:00:00 2001 From: wenboz Date: Wed, 7 Nov 2018 19:45:02 -0800 Subject: [PATCH 1604/8103] No public changes. PiperOrigin-RevId: 220571517 --- .../util/net_http/compression/gzip_zlib.cc | 6 ++++-- .../util/net_http/compression/gzip_zlib.h | 2 +- .../net_http/compression/gzip_zlib_test.cc | 6 ++++-- .../server/internal/evhttp_request.cc | 16 ++++++++------- .../net_http/server/internal/evhttp_request.h | 3 ++- .../server/public/server_request_interface.h | 20 ++++++++++++++----- 6 files changed, 35 insertions(+), 18 deletions(-) diff --git a/tensorflow_serving/util/net_http/compression/gzip_zlib.cc b/tensorflow_serving/util/net_http/compression/gzip_zlib.cc index 1ce8820f0bd..a1e54a493b5 100644 --- a/tensorflow_serving/util/net_http/compression/gzip_zlib.cc +++ b/tensorflow_serving/util/net_http/compression/gzip_zlib.cc @@ -22,6 +22,8 @@ limitations under the License. #include #include +#include + #include "absl/base/casts.h" #include "absl/base/internal/raw_logging.h" #include "absl/base/macros.h" @@ -805,12 +807,12 @@ int ZLib::UncompressGzipAndAllocate(Bytef **dest, uLongf *destLen, *destLen = uncompress_length; - *dest = (Bytef *)malloc(*destLen); + *dest = std::allocator().allocate(*destLen); if (*dest == nullptr) return Z_MEM_ERROR; const int retval = Uncompress(*dest, destLen, source, sourceLen); if (retval != Z_OK) { // just to make life easier for them - free(*dest); + std::allocator().deallocate(*dest, *destLen); *dest = nullptr; } return retval; diff --git a/tensorflow_serving/util/net_http/compression/gzip_zlib.h b/tensorflow_serving/util/net_http/compression/gzip_zlib.h index 6ad674d9537..fbec6b0efc2 100644 --- a/tensorflow_serving/util/net_http/compression/gzip_zlib.h +++ b/tensorflow_serving/util/net_http/compression/gzip_zlib.h @@ -177,7 +177,7 @@ class ZLib { uLongf GzipUncompressedLength(const Bytef *source, uLong len); // Special helper function to help uncompress gzipped documents: - // We'll allocate (with malloc) a destination buffer exactly big + // We'll allocate (via std::allocator) a destination buffer exactly big // enough to hold the gzipped content. We set dest and destLen. // If we don't return Z_OK, *dest will be NULL, otherwise you // should free() it when you're done with it. diff --git a/tensorflow_serving/util/net_http/compression/gzip_zlib_test.cc b/tensorflow_serving/util/net_http/compression/gzip_zlib_test.cc index 394d170531d..2aa47452d68 100644 --- a/tensorflow_serving/util/net_http/compression/gzip_zlib_test.cc +++ b/tensorflow_serving/util/net_http/compression/gzip_zlib_test.cc @@ -359,7 +359,9 @@ void TestGzip(ZLib* zlib, const std::string& uncompbuf_str) { EXPECT_EQ(uncomplen, uncomplen2) << "Uncompression mismatch!"; EXPECT_EQ(0, memcmp(uncompbuf, uncompbuf2.data(), uncomplen)) << "Uncompression mismatch!"; - if (tmpbuf) free(tmpbuf); + if (tmpbuf) { + std::allocator().deallocate(tmpbuf, uncomplen2); + } } void TestChunkedGzip(ZLib* zlib, const std::string& uncompbuf_str, @@ -499,7 +501,7 @@ TEST(ZLibTest, HugeCompression) { std::string uncompbuf(HUGE_DATA_SIZE, 'A'); ZLib zlib; - zlib.SetCompressionLevel(6); + zlib.SetCompressionLevel(1); // as fast as possible TestCompression(&zlib, uncompbuf, nullptr); } diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_request.cc b/tensorflow_serving/util/net_http/server/internal/evhttp_request.cc index 309353a1a7b..16dcbbfc640 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_request.cc +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_request.cc @@ -146,7 +146,7 @@ void EvHTTPRequest::WriteResponseString(absl::string_view data) { WriteResponseBytes(data.data(), static_cast(data.size())); } -std::unique_ptr EvHTTPRequest::ReadRequestBytes( +std::unique_ptr EvHTTPRequest::ReadRequestBytes( int64_t* size) { evbuffer* input_buf = evhttp_request_get_input_buffer(parsed_request_->request); @@ -162,22 +162,24 @@ std::unique_ptr EvHTTPRequest::ReadRequestBytes( return nullptr; // EOF } - void* block = malloc(*buf_size); + char* block = std::allocator().allocate(*buf_size); int ret = evbuffer_remove(input_buf, block, *buf_size); if (ret != *buf_size) { ABSL_RAW_LOG(ERROR, "Unexpected: read less than specified num_bytes : %zu", *buf_size); - free(block); + std::allocator().deallocate(block, *buf_size); *buf_size = 0; return nullptr; // don't return corrupted buffer } // Uncompress the entire body if (NeedUncompressGzipContent()) { - void* new_block; - UncompressGzipContent(block, *buf_size, &new_block, buf_size); - free(block); + char* new_block; + size_t orig_size = *buf_size; + UncompressGzipContent(block, orig_size, + reinterpret_cast(&new_block), buf_size); + std::allocator().deallocate(block, orig_size); if (new_block != nullptr) { block = new_block; } else { @@ -187,7 +189,7 @@ std::unique_ptr EvHTTPRequest::ReadRequestBytes( } } - return std::unique_ptr(static_cast(block)); + return std::unique_ptr(block, BlockDeleter(*buf_size)); } bool EvHTTPRequest::NeedUncompressGzipContent() { diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_request.h b/tensorflow_serving/util/net_http/server/internal/evhttp_request.h index 7894b368a74..98d53d99207 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_request.h +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_request.h @@ -79,7 +79,8 @@ class EvHTTPRequest final : public ServerRequestInterface { void WriteResponseString(absl::string_view data) override; - std::unique_ptr ReadRequestBytes(int64_t* size) override; + std::unique_ptr ReadRequestBytes( + int64_t* size) override; absl::string_view GetRequestHeader(absl::string_view header) const override; diff --git a/tensorflow_serving/util/net_http/server/public/server_request_interface.h b/tensorflow_serving/util/net_http/server/public/server_request_interface.h index 9fd0c125f1f..e8439c17918 100644 --- a/tensorflow_serving/util/net_http/server/public/server_request_interface.h +++ b/tensorflow_serving/util/net_http/server/public/server_request_interface.h @@ -40,9 +40,18 @@ namespace tensorflow { namespace serving { namespace net_http { -// To be used with std::unique_ptr -struct FreeDeleter { - inline void operator()(char* ptr) const { free(ptr); } +// To be used with memory blocks returned via std::unique_ptr +struct BlockDeleter { + public: + BlockDeleter() : size_(0) {} // nullptr + explicit BlockDeleter(int64_t size) : size_(size) {} + inline void operator()(char* ptr) const { + // TODO: c++14 ::operator delete[](ptr, size_t) + std::allocator().deallocate(ptr, static_cast(size_)); + } + + private: + int64_t size_; }; class ServerRequestInterface { @@ -84,11 +93,12 @@ class ServerRequestInterface { // to the caller. Returns nullptr when EOF is reached or when there // is no request body. // - // The returned memory will be "free-ed" via the custom Deleter. + // The returned memory will be "free-ed" via the custom Deleter. Do not + // release the memory manually as its allocator is subject to change. // // Note this is not a streaming read API in that the complete request body // should have already been received. - virtual std::unique_ptr ReadRequestBytes( + virtual std::unique_ptr ReadRequestBytes( int64_t* size) = 0; // Returns the first value, including "", associated with a request From 3fdaaea69cbd065fa1507e933dffc48de8051676 Mon Sep 17 00:00:00 2001 From: robertcrowe Date: Thu, 8 Nov 2018 17:22:18 -0800 Subject: [PATCH 1605/8103] Improved navigation for Serving and TFX PiperOrigin-RevId: 220728732 --- tensorflow_serving/g3doc/_book.yaml | 5 ++++ tensorflow_serving/g3doc/_index.yaml | 35 ++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/tensorflow_serving/g3doc/_book.yaml b/tensorflow_serving/g3doc/_book.yaml index 8f64a4108be..5bdb3410be3 100644 --- a/tensorflow_serving/g3doc/_book.yaml +++ b/tensorflow_serving/g3doc/_book.yaml @@ -35,6 +35,11 @@ upper_tabs: path: /serving/custom_source - title: SignatureDefs in SavedModel for TensorFlow Serving path: /serving/signature_defs + - name: TFX + contents: + - title: TFX + path: /tfx + status: external - name: API skip_translation: true contents: diff --git a/tensorflow_serving/g3doc/_index.yaml b/tensorflow_serving/g3doc/_index.yaml index 5936dadff3b..2b864ddcd92 100644 --- a/tensorflow_serving/g3doc/_index.yaml +++ b/tensorflow_serving/g3doc/_index.yaml @@ -14,6 +14,41 @@ landing_page: keeping the same server architecture and APIs. TensorFlow Serving provides out-of-the-box integration with TensorFlow models, but can be easily extended to serve other types of models and data. + + h3 style='margin-top:1.5em; margin-bottom:0.5em'>Create a production pipeline + You can create a production pipeline by adding other components from + TensorFlow Extended (TFX) to your TensorFlow Serving deployment. TFX includes + components that enable your production deployment to monitor and validate your + data, create engineered features, and analyze your model's results. Along with + TensorFlow Serving, TFX also includes: + list: + - heading: TensorFlow Data Validation + description: > + A library for exploring and validating machine learning data. + path: /tfx/data_validation + icon: + icon_name: chevron_right + foreground: theme + background: grey + - heading: TensorFlow Transform + description: > + Perform full-pass analyze phases over data to create transformation + graphs that are consistently applied during training and serving. + path: /tfx/transform + icon: + icon_name: chevron_right + foreground: theme + background: grey + - heading: TensorFlow Model Analysis + description: > + Libraries and visualization components to compute full-pass and sliced + model metrics over large datasets, and analyze them in a notebook. + path: /tfx/model_analysis + icon: + icon_name: chevron_right + foreground: theme + background: grey + code_block: |
         # Download the TensorFlow Serving Docker image and repo

From 4c7e072ffee5f8ab1a0f0b1ccfdb2274d77b600e Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Sun, 11 Nov 2018 22:01:39 -0800
Subject: [PATCH 1606/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 221037359
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 8e7e539c7de..56f38f69e3b 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "afe81dc3c5f9a3a1ba2ad889f009309694b024e757c0279206543a20289a9f86",
-    git_commit = "0130d4a67a2bf933710a0e575ad9713f1862a8f2",
+    sha256 = "4f5a95fdac18fef38565298e4dc300761a7c46cf808dd1bc113b69085d6584b5",
+    git_commit = "19f97dc4bd9507c6c971372d5995f1e81cf045c9",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From 0ab94adcb3ad5efa0b8487dee726b6a500a03b39 Mon Sep 17 00:00:00 2001
From: olston 
Date: Mon, 12 Nov 2018 13:55:46 -0800
Subject: [PATCH 1607/8103] Automated rollback of commit
 70a599a09658d8c1474fa7a936545cf3e0547106

PiperOrigin-RevId: 221151697
---
 tensorflow_serving/apis/model.proto | 1 -
 1 file changed, 1 deletion(-)

diff --git a/tensorflow_serving/apis/model.proto b/tensorflow_serving/apis/model.proto
index 9c6427fe7d6..56493f68222 100644
--- a/tensorflow_serving/apis/model.proto
+++ b/tensorflow_serving/apis/model.proto
@@ -24,7 +24,6 @@ message ModelSpec {
     google.protobuf.Int64Value version = 2;
 
     // Use the version associated with the given label.
-    // EXPERIMENTAL. DO NOT USE AT THIS TIME.
     string version_label = 4;
   }
 

From 2724bfee911f1d2294a9ceb705bbd09a2701c344 Mon Sep 17 00:00:00 2001
From: olston 
Date: Tue, 13 Nov 2018 11:00:16 -0800
Subject: [PATCH 1608/8103] Document how to use the version policy to pin a
 specific version, or serve multiple versions, of a model.

PiperOrigin-RevId: 221296310
---
 tensorflow_serving/g3doc/_book.yaml        |  2 +
 tensorflow_serving/g3doc/serving_config.md | 70 ++++++++++++++++++++++
 2 files changed, 72 insertions(+)
 create mode 100644 tensorflow_serving/g3doc/serving_config.md

diff --git a/tensorflow_serving/g3doc/_book.yaml b/tensorflow_serving/g3doc/_book.yaml
index 5bdb3410be3..30dbd4b9660 100644
--- a/tensorflow_serving/g3doc/_book.yaml
+++ b/tensorflow_serving/g3doc/_book.yaml
@@ -25,6 +25,8 @@ upper_tabs:
         path: /serving/setup
       - title: Serve a TensorFlow model
         path: /serving/serving_basic
+      - title: Advanced model server configuration
+        path: /serving/serving_config
       - title: Build a TensorFlow ModelServer
         path: /serving/serving_advanced
       - title: Use TensorFlow Serving with Kubernetes
diff --git a/tensorflow_serving/g3doc/serving_config.md b/tensorflow_serving/g3doc/serving_config.md
new file mode 100644
index 00000000000..fc364b62361
--- /dev/null
+++ b/tensorflow_serving/g3doc/serving_config.md
@@ -0,0 +1,70 @@
+# How to Configure a Model Server
+
+Create a file containing an ASCII
+[ModelServerConfig](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/config/model_server_config.proto#L76)
+protocol buffer, and pass its path to the server using the --model_config_file
+flag. (Some useful references:
+[what an ASCII protocol buffer looks like](https://stackoverflow.com/questions/18873924/what-does-the-protobuf-text-format-look-like);
+[how to pass flags in Docker](docker.md#passing-additional-arguments).)
+
+For all but the most advanced use-cases, you'll want to use the ModelConfigList
+option, which is a list of
+[ModelConfig](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/config/model_server_config.proto#L19)
+protocol buffers. Here's a basic example, before we dive into advanced options
+below.
+
+```proto
+model_config_list {
+  config {
+    name: 'my_first_model'
+    base_path: '/tmp/my_first_model/'
+  }
+  config {
+    name: 'my_second_model'
+    base_path: '/tmp/my_second_model/'
+  }
+}
+```
+
+## Configuring One Model
+
+Each ModelConfig specifies one model to be served, including its name and the
+path where the Model Server should look for versions of the model to serve, as
+seen in the above example. By default the server will serve the version with the
+largest version number. This default can be overridden by changing the
+model_version_policy field.
+
+### Serving a Specific Version of a Model
+
+To serve a specific version of the model, rather than always transitioning to
+the one with the largest version number, set model_version_policy to "specific"
+and provide the version number you would like to serve. For example, to pin
+version 42 as the one to serve:
+
+```proto
+model_version_policy {
+  specific {
+    versions: 42
+  }
+}
+```
+
+This option is useful for rolling back to a know good version, in the event a
+problem is discovered with the latest version(s).
+
+### Serving Multiple Versions of a Model
+
+To serve multiple versions of the model simultaneously, e.g. to enable canarying
+a tentative new version with a slice of traffic, set model_version_policy to
+"specific" and provide multiple version numbers. For example, to serve versions
+42 and 43:
+
+```proto
+model_version_policy {
+  specific {
+    versions: 42
+    versions: 43
+  }
+}
+```
+

From f4890afdc42f10f125cba64c3c2f2c01309ba2e2 Mon Sep 17 00:00:00 2001
From: olston 
Date: Tue, 13 Nov 2018 15:35:17 -0800
Subject: [PATCH 1609/8103] Document config reloading and model version labels.

PiperOrigin-RevId: 221346741
---
 tensorflow_serving/g3doc/serving_config.md | 65 ++++++++++++++++++++++
 1 file changed, 65 insertions(+)

diff --git a/tensorflow_serving/g3doc/serving_config.md b/tensorflow_serving/g3doc/serving_config.md
index fc364b62361..6a115c9b7da 100644
--- a/tensorflow_serving/g3doc/serving_config.md
+++ b/tensorflow_serving/g3doc/serving_config.md
@@ -7,6 +7,14 @@ flag. (Some useful references:
 [what an ASCII protocol buffer looks like](https://stackoverflow.com/questions/18873924/what-does-the-protobuf-text-format-look-like);
 [how to pass flags in Docker](docker.md#passing-additional-arguments).)
 
+You can also reload the model config on the fly, after the server is running,
+via the
+[HandleReloadConfigRequest](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/apis/model_service.proto#L22)
+RPC endpoint. This will cause models in the new config that are not in the old
+config to be loaded, and models in the old config that are not in the new config
+to be unloaded; (models in both configs will remain in place, and will not be
+transiently unloaded).
+
 For all but the most advanced use-cases, you'll want to use the ModelConfigList
 option, which is a list of
 [ModelConfig](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/config/model_server_config.proto#L19)
@@ -68,3 +76,60 @@ model_version_policy {
 }
 ```
 
+### Assigning String Labels to Model Versions, To Simplify Canary and Rollback
+
+Sometimes it's helpful to add a level of indirection to model versions. Instead
+of letting all of your clients know that they should be querying version 42, you
+can assign an alias such as "stable" to whichever version is currently the one
+clients should query. If you want to redirect a slice of traffic to a tentative
+canary model version, you can use a second alias "canary".
+
+You can configure these model version aliases, or labels, like so:
+
+```proto
+model_version_policy {
+  specific {
+    versions: 42
+    versions: 43
+  }
+}
+version_labels {
+  key: 'stable'
+  value: 42
+}
+version_labels {
+  key: 'canary'
+  value: 43
+}
+```
+
+In the above example, you are serving versions 42 and 43, and associating the
+label "stable" with version 42 and the label "canary" with version 43. You can
+have your clients direct queries to one of "stable" or "canary" (perhaps based
+on hashing the user id) using the version_label field of the
+[ModelSpec](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/apis/model.proto#L27)
+protocol buffer, and move forward the label on the server without notifying the
+clients. Once you are done canarying version 43 and are ready to promote it to
+stable, you can update the config to:
+
+```proto
+model_version_policy {
+  specific {
+    versions: 42
+    versions: 43
+  }
+}
+version_labels {
+  key: 'stable'
+  value: 43
+}
+version_labels {
+  key: 'canary'
+  value: 43
+}
+```
+
+If you subsequently need to perform a rollback, you can revert to the old config
+that has version 42 as "stable". Otherwise, you can march forward by unloading
+version 42 and loading the new version 44 when it is ready, and then advancing
+the canary label to 44, and so on.

From 92e2c221c09ded1f57f2d10c17601d75062ea2fc Mon Sep 17 00:00:00 2001
From: blamb 
Date: Mon, 19 Nov 2018 17:53:39 -0800
Subject: [PATCH 1610/8103] Rename ecosystem to resources

PiperOrigin-RevId: 222170251
---
 tensorflow_serving/g3doc/_book.yaml  | 6 +++---
 tensorflow_serving/g3doc/_index.yaml | 4 ++--
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/tensorflow_serving/g3doc/_book.yaml b/tensorflow_serving/g3doc/_book.yaml
index 30dbd4b9660..4d12d3a6a8c 100644
--- a/tensorflow_serving/g3doc/_book.yaml
+++ b/tensorflow_serving/g3doc/_book.yaml
@@ -3,11 +3,11 @@ upper_tabs:
 - include: /_upper_tabs_left.yaml
 - include: /api_docs/_upper_tabs_api.yaml
 # Dropdown menu
-- name: Ecosystem
-  path: /ecosystem
+- name: Resources
+  path: /resources
   is_default: true
   menu:
-  - include: /ecosystem/_menu_toc.yaml
+  - include: /resources/_menu_toc.yaml
   lower_tabs:
     # Subsite tabs
     other:
diff --git a/tensorflow_serving/g3doc/_index.yaml b/tensorflow_serving/g3doc/_index.yaml
index 2b864ddcd92..4cda5dbbcdc 100644
--- a/tensorflow_serving/g3doc/_index.yaml
+++ b/tensorflow_serving/g3doc/_index.yaml
@@ -72,7 +72,7 @@ landing_page:
   - classname: devsite-landing-row-cards
     items:
     - heading: "Serving ML Quickly with TensorFlow Serving and Docker"
-      image_path: /ecosystem/images/tf-logo-card-16x9.png
+      image_path: /resources/images/tf-logo-card-16x9.png
       path: https://medium.com/tensorflow/serving-ml-quickly-with-tensorflow-serving-and-docker-7df7094aa008
       buttons:
       - label: Read on TensorFlow blog
@@ -83,7 +83,7 @@ landing_page:
       - label: Watch the video
         path: https://www.youtube.com/watch?v=q_IkJcPyNl0
     - heading: TensorFlow Serving on GitHub
-      image_path: /ecosystem/images/github-card-16x9.png
+      image_path: /resources/images/github-card-16x9.png
       path: https://github.com/tensorflow/serving
       buttons:
       - label: View on GitHub

From bcec7ac87be87689ffba727b24508d3636798b89 Mon Sep 17 00:00:00 2001
From: gvasudevan 
Date: Tue, 20 Nov 2018 11:45:42 -0800
Subject: [PATCH 1611/8103] Internal change

PiperOrigin-RevId: 222281176
---
 third_party/libevent.BUILD | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/third_party/libevent.BUILD b/third_party/libevent.BUILD
index 4083384e512..4a6dc97805f 100644
--- a/third_party/libevent.BUILD
+++ b/third_party/libevent.BUILD
@@ -72,8 +72,8 @@ cc_library(
         "libevent/lib/libevent_pthreads.a",
     ],
     hdrs = include_files,
-    linkopts = ["-lpthread"],
     includes = ["libevent/include"],
+    linkopts = ["-lpthread"],
     linkstatic = 1,
 )
 

From 1ff8aadf20d75294aa4d496a807320603c6887c6 Mon Sep 17 00:00:00 2001
From: robertcrowe 
Date: Mon, 26 Nov 2018 11:18:05 -0800
Subject: [PATCH 1612/8103] New Serving e2e colab!  Training with Keras,
 serving with Serving, and requesting inference with REST

PiperOrigin-RevId: 222855284
---
 tensorflow_serving/g3doc/_book.yaml           |   3 +
 tensorflow_serving/g3doc/tutorials/BUILD      |  34 ++
 .../g3doc/tutorials/Serving_REST_simple.ipynb | 526 ++++++++++++++++++
 3 files changed, 563 insertions(+)
 create mode 100644 tensorflow_serving/g3doc/tutorials/BUILD
 create mode 100644 tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb

diff --git a/tensorflow_serving/g3doc/_book.yaml b/tensorflow_serving/g3doc/_book.yaml
index 4d12d3a6a8c..a0b6305185f 100644
--- a/tensorflow_serving/g3doc/_book.yaml
+++ b/tensorflow_serving/g3doc/_book.yaml
@@ -18,6 +18,9 @@ upper_tabs:
         path: /serving/docker
       - title: "Client: REST API"
         path: /serving/api_rest
+      - heading: Examples
+      - title: Training and serving a model with REST
+        path: /serving/tutorials/Serving_REST_simple.md
       - heading: Understanding TensorFlow Serving
       - title: Overview
         path: /serving/overview
diff --git a/tensorflow_serving/g3doc/tutorials/BUILD b/tensorflow_serving/g3doc/tutorials/BUILD
new file mode 100644
index 00000000000..ffd28e45410
--- /dev/null
+++ b/tensorflow_serving/g3doc/tutorials/BUILD
@@ -0,0 +1,34 @@
+# Description: Test targets for tutorial notebooks.
+
+package(default_visibility = ["//tensorflow_serving:__subpackages__"])
+
+licenses(["notice"])  # Apache 2.0
+
+exports_files(["LICENSE"])
+
+load("//research/colab:build_defs.bzl", "colab_notebook_test")
+load("//research/colab:build_defs.bzl", "colab_binary")
+
+filegroup(
+    name = "files",
+    srcs = [
+    ] + glob(["*"]),
+)
+
+colab_binary(
+    name = "lite_notebook",
+    # Use hermetic python. This is necessary until c/31549734 is resolved
+    launcher = "//devtools/python/launcher",
+    deps = [
+        # We don't use:
+        #    ".../client:notebook_deps",
+        # in order to minimize deps. However this is a good place
+        # from which you can identify additional dependencies to add.
+        "//file/base",
+        "//file/liball",
+        "//file/localfile",
+        "//third_party/py/matplotlib",
+        "//third_party/py/numpy",
+        "@org_tensorflow//tensorflow:tensorflow_py",
+    ],
+)
diff --git a/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb b/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb
new file mode 100644
index 00000000000..dd9fd27550d
--- /dev/null
+++ b/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb
@@ -0,0 +1,526 @@
+{
+  "cells": [
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "colab_type": "text",
+        "id": "MhoQ0WE77laV"
+      },
+      "source": [
+        "##### Copyright 2018 The TensorFlow Authors."
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": 0,
+      "metadata": {
+        "cellView": "form",
+        "colab": {},
+        "colab_type": "code",
+        "id": "_ckMIh7O7s6D"
+      },
+      "outputs": [],
+      "source": [
+        "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n",
+        "# you may not use this file except in compliance with the License.\n",
+        "# You may obtain a copy of the License at\n",
+        "#\n",
+        "# https://www.apache.org/licenses/LICENSE-2.0\n",
+        "#\n",
+        "# Unless required by applicable law or agreed to in writing, software\n",
+        "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
+        "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
+        "# See the License for the specific language governing permissions and\n",
+        "# limitations under the License."
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "colab_type": "text",
+        "id": "jYysdyb-CaWM"
+      },
+      "source": [
+        "# Train and serve a TensorFlow model with TensorFlow Serving"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "colab_type": "text",
+        "id": "E6FwTNtl3S4v"
+      },
+      "source": [
+        "Note: You can run this example right now in a Jupyter-style notebook, no setup required!  Just click \"Run in Google Colab\"\n",
+        "\u003cdiv class=\"devsite-table-wrapper\"\u003e\u003ctable class=\"tfo-notebook-buttons\" align=\"left\"\u003e\n",
+        "\u003ctr\u003e\u003ctd\u003e\u003ca target=\"_blank\" href=\"https://www.tensorflow.org/serving/tutorials/Serving_REST_simple\"\u003e\n",
+        "\u003cimg src=\"https://www.tensorflow.org/images/tf_logo_32px.png\" /\u003eView on TensorFlow.org\u003c/a\u003e\u003c/td\u003e\n",
+        "\u003ctd\u003e\u003ca target=\"_blank\" href=\"https://colab.research.google.com/github/tensorflow/serving/tree/master/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb\"\u003e\n",
+        "\u003cimg src=\"https://www.tensorflow.org/images/colab_logo_32px.png\"\u003eRun in Google Colab\u003c/a\u003e\u003c/td\u003e\n",
+        "\u003ctd\u003e\u003ca target=\"_blank\" href=\"https://github.com/tensorflow/serving/tree/master/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb\"\u003e\n",
+        "\u003cimg width=32px src=\"https://www.tensorflow.org/images/GitHub-Mark-32px.png\"\u003eView source on GitHub\u003c/a\u003e\u003c/td\u003e\n",
+        "\u003c/tr\u003e\u003c/table\u003e\u003c/div\u003e"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "colab_type": "text",
+        "id": "FbVhjPpzn6BM"
+      },
+      "source": [
+        "This guide trains a neural network model to classify [images of clothing, like sneakers and shirts](https://github.com/zalandoresearch/fashion-mnist), saves the trained model, and then serves it with [TensorFlow Serving](https://www.tensorflow.org/serving/).  The focus is on TensorFlow Serving, rather than the modeling and training in TensorFlow, so for a complete example which focuses on the modeling and training see the [Basic Classification example](https://www.tensorflow.org/tutorials/keras/basic_classification).\n",
+        "\n",
+        "This guide uses [tf.keras](https://www.tensorflow.org/guide/keras), a high-level API to build and train models in TensorFlow."
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": 0,
+      "metadata": {
+        "colab": {},
+        "colab_type": "code",
+        "id": "dzLKpmZICaWN"
+      },
+      "outputs": [],
+      "source": [
+        "# TensorFlow and tf.keras\n",
+        "import tensorflow as tf\n",
+        "from tensorflow import keras\n",
+        "\n",
+        "# Helper libraries\n",
+        "import numpy as np\n",
+        "import matplotlib.pyplot as plt\n",
+        "import os\n",
+        "import subprocess\n",
+        "\n",
+        "print(tf.__version__)"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "colab_type": "text",
+        "id": "5jAk1ZXqTJqN"
+      },
+      "source": [
+        "##Create your model"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "colab_type": "text",
+        "id": "yR0EdgrLCaWR"
+      },
+      "source": [
+        "### Import the Fashion MNIST dataset\n",
+        "\n",
+        "This guide uses the [Fashion MNIST](https://github.com/zalandoresearch/fashion-mnist) dataset which contains 70,000 grayscale images in 10 categories. The images show individual articles of clothing at low resolution (28 by 28 pixels), as seen here:\n",
+        "\n",
+        "\u003ctable\u003e\n",
+        "  \u003ctr\u003e\u003ctd\u003e\n",
+        "    \u003cimg src=\"https://tensorflow.org/images/fashion-mnist-sprite.png\"\n",
+        "         alt=\"Fashion MNIST sprite\"  width=\"600\"\u003e\n",
+        "  \u003c/td\u003e\u003c/tr\u003e\n",
+        "  \u003ctr\u003e\u003ctd align=\"center\"\u003e\n",
+        "    \u003cb\u003eFigure 1.\u003c/b\u003e \u003ca href=\"https://github.com/zalandoresearch/fashion-mnist\"\u003eFashion-MNIST samples\u003c/a\u003e (by Zalando, MIT License).\u003cbr/\u003e\u0026nbsp;\n",
+        "  \u003c/td\u003e\u003c/tr\u003e\n",
+        "\u003c/table\u003e\n",
+        "\n",
+        "Fashion MNIST is intended as a drop-in replacement for the classic [MNIST](http://yann.lecun.com/exdb/mnist/) dataset—often used as the \"Hello, World\" of machine learning programs for computer vision. You can access the Fashion MNIST directly from TensorFlow, just import and load the data.\n",
+        "\n",
+        "Note: Although these are really images, they are loaded as NumPy arrays and not binary image objects."
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": 0,
+      "metadata": {
+        "colab": {},
+        "colab_type": "code",
+        "id": "7MqDQO0KCaWS"
+      },
+      "outputs": [],
+      "source": [
+        "fashion_mnist = keras.datasets.fashion_mnist\n",
+        "(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()\n",
+        "\n",
+        "# scale the values to 0.0 to 1.0\n",
+        "train_images = train_images / 255.0\n",
+        "test_images = test_images / 255.0\n",
+        "\n",
+        "# reshape for feeding into the model\n",
+        "train_images = train_images.reshape(train_images.shape[0], 28, 28, 1)\n",
+        "test_images = test_images.reshape(test_images.shape[0], 28, 28, 1)\n",
+        "\n",
+        "class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',\n",
+        "               'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']\n",
+        "\n",
+        "print('\\ntrain_images.shape: {}, of {}'.format(train_images.shape, train_images.dtype))\n",
+        "print('test_images.shape: {}, of {}'.format(test_images.shape, test_images.dtype))"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "colab_type": "text",
+        "id": "PDu7OX8Nf5PY"
+      },
+      "source": [
+        "###Train and evaluate your model\n",
+        "\n",
+        "Let's use the simplest possible CNN, since we're not focused on the modeling part."
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": 0,
+      "metadata": {
+        "colab": {},
+        "colab_type": "code",
+        "id": "LTNN0ANGgA36"
+      },
+      "outputs": [],
+      "source": [
+        "model = keras.Sequential([\n",
+        "  keras.layers.Conv2D(input_shape=(28,28,1), filters=8, kernel_size=3, \n",
+        "                      strides=2, activation='relu', name='Conv1'),\n",
+        "  keras.layers.Flatten(),\n",
+        "  keras.layers.Dense(10, activation=tf.nn.softmax, name='Softmax')\n",
+        "])\n",
+        "model.summary()\n",
+        "\n",
+        "testing = False\n",
+        "epochs = 5\n",
+        "#BEGIN GOOGLE-INTERNAL\n",
+        "testing = os.getenv(\"WEB_TEST_BROWSER\")\n",
+        "if testing:\n",
+        "  epochs = 1 \n",
+        "#END GOOGLE-INTERNAL\n",
+        "\n",
+        "model.compile(optimizer=tf.train.AdamOptimizer(), \n",
+        "              loss='sparse_categorical_crossentropy',\n",
+        "              metrics=['accuracy'])\n",
+        "model.fit(train_images, train_labels, epochs=epochs)\n",
+        "\n",
+        "test_loss, test_acc = model.evaluate(test_images, test_labels)\n",
+        "print('\\nTest accuracy: {}'.format(test_acc))"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "colab_type": "text",
+        "id": "AwGPItyphqXT"
+      },
+      "source": [
+        "##Save your model\n",
+        "\n",
+        "To load our trained model into TensorFlow Serving we first need to save it in [SavedModel](https://www.tensorflow.org/api_docs/python/tf/saved_model) format.  This will create a protobuf file in a well-defined directory hierarchy, and will include a version number.  TensorFlow Serving allows us to select [which version of a model, or \"servable\"](../overview) we want to use when we make inference requests.  Each version will be exported to a different sub-directory under the given path."
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": 0,
+      "metadata": {
+        "colab": {},
+        "colab_type": "code",
+        "id": "0w5Rq8SsgWE6"
+      },
+      "outputs": [],
+      "source": [
+        "# Fetch the Keras session and save the model\n",
+        "# The signature definition is defined by the input and output tensors,\n",
+        "# and stored with the default serving key\n",
+        "import tempfile\n",
+        "\n",
+        "version = 1\n",
+        "export_path = '{}/{}'.format(tempfile.gettempdir(), version)\n",
+        "print('export_path = {}\\n'.format(export_path))\n",
+        "if os.path.isdir(export_path):\n",
+        "  print('\\nAlready saved a model, cleaning up\\n')\n",
+        "  !rm -r {export_path}\n",
+        "\n",
+        "tf.saved_model.simple_save(\n",
+        "    keras.backend.get_session(),\n",
+        "    export_path,\n",
+        "    inputs={'input_image': model.input},\n",
+        "    outputs={t.name:t for t in model.outputs})\n",
+        "\n",
+        "print('\\nSaved model:')\n",
+        "!ls -l {export_path}"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "colab_type": "text",
+        "id": "FM7B_RuDYoIj"
+      },
+      "source": [
+        "##Examine your saved model\n",
+        "\n",
+        "We'll use the command line utility `saved_model_cli` to look at the [MetaGraphDefs](https://www.tensorflow.org/api_docs/python/tf/MetaGraphDef) (the models) and [SignatureDefs](../signature_defs) (the methods you can call) in our SavedModel.  See [this discussion of the SavedModel CLI](https://www.tensorflow.org/guide/saved_model#cli_to_inspect_and_execute_savedmodel) in the TensorFlow Guide."
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": 0,
+      "metadata": {
+        "colab": {},
+        "colab_type": "code",
+        "id": "LU4GDF_aYtfQ"
+      },
+      "outputs": [],
+      "source": [
+        "!saved_model_cli show --dir {export_path} --all"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "colab_type": "text",
+        "id": "lSPWuegUb7Eo"
+      },
+      "source": [
+        "That tells us a lot about our model!  In this case we just trained our model, so we already know the inputs and outputs, but if we didn't this would be important information.  It doesn't tell us everything, like the fact that this is grayscale image data for example, but it's a great start."
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "colab_type": "text",
+        "id": "DBgsyhytS6KD"
+      },
+      "source": [
+        "##Serve your model with TensorFlow Serving\n",
+        "\n",
+        "###Add TensorFlow Serving distribution URI as a package source:\n",
+        "\n",
+        "We're preparing to install TensorFlow Serving using [Aptitude](https://wiki.debian.org/Aptitude) since this Colab runs in a Debian environment.  We'll add the `tensorflow-model-server` package to the list of packages that Aptitude knows about.  Note that we're running as root.\n",
+        "\n",
+        "Note: This example is running TensorFlow Serving natively, but [you can also run it in a Docker container](../docker), which is one of the easiest ways to get started using TensorFlow Serving."
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": 0,
+      "metadata": {
+        "colab": {},
+        "colab_type": "code",
+        "id": "EWg9X2QHlbGS"
+      },
+      "outputs": [],
+      "source": [
+        "# This is the same as you would do from your command line, but without the [arch=amd64], and no sudo\n",
+        "# You would instead do:\n",
+        "# echo \"deb [arch=amd64] http://storage.googleapis.com/tensorflow-serving-apt stable tensorflow-model-server tensorflow-model-server-universal\" | sudo tee /etc/apt/sources.list.d/tensorflow-serving.list \u0026\u0026 \\\n",
+        "# curl https://storage.googleapis.com/tensorflow-serving-apt/tensorflow-serving.release.pub.gpg | sudo apt-key add -\n",
+        "\n",
+        "!echo \"deb http://storage.googleapis.com/tensorflow-serving-apt stable tensorflow-model-server tensorflow-model-server-universal\" | tee /etc/apt/sources.list.d/tensorflow-serving.list \u0026\u0026 \\\n",
+        "curl https://storage.googleapis.com/tensorflow-serving-apt/tensorflow-serving.release.pub.gpg | apt-key add -\n",
+        "!apt update"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "colab_type": "text",
+        "id": "W1ZVp_VOU7Wu"
+      },
+      "source": [
+        "###Install TensorFlow Serving\n",
+        "\n",
+        "This is all you need - one command line!"
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": 0,
+      "metadata": {
+        "colab": {},
+        "colab_type": "code",
+        "id": "ygwa9AgRloYy"
+      },
+      "outputs": [],
+      "source": [
+        "!apt-get install tensorflow-model-server"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "colab_type": "text",
+        "id": "k5NrYdQeVm52"
+      },
+      "source": [
+        "###Start running TensorFlow Serving\n",
+        "\n",
+        "This is where we start running TensorFlow Serving and load our model.  After it loads we can start making inference requests using REST.  There are some important parameters:\n",
+        "\n",
+        "* `rest_api_port`: The port that you'll use for REST requests.\n",
+        "* `model_name`: You'll use this in the URL of REST requests.  It can be anything.\n",
+        "* `model_base_path`: This is the path to the directory where you've saved your model.\n",
+        "\n",
+        "Note: This example starts the server using `nohup`, which you would not do when running the server normally.  We only need to do it here because of the Colab environment that we're running in."
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": 0,
+      "metadata": {
+        "colab": {},
+        "colab_type": "code",
+        "id": "kJDhHNJVnaLN"
+      },
+      "outputs": [],
+      "source": [
+        "if not testing:\n",
+        "  !nohup tensorflow_model_server \\\n",
+        "    --rest_api_port=8501 \\\n",
+        "    --model_name=fashion_model \\\n",
+        "    --model_base_path={tempfile.gettempdir()} \u0026\n",
+        "\n",
+        "  !tail nohup.out"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "colab_type": "text",
+        "id": "vwg1JKaGXWAg"
+      },
+      "source": [
+        "##Make a request to your model in TensorFlow Serving\n",
+        "\n",
+        "First, let's take a look at a random example from our test data."
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": 0,
+      "metadata": {
+        "colab": {},
+        "colab_type": "code",
+        "id": "Luqm_Jyff9iR"
+      },
+      "outputs": [],
+      "source": [
+        "def show(idx, title):\n",
+        "  plt.figure()\n",
+        "  plt.imshow(test_images[idx].reshape(28,28))\n",
+        "  plt.axis('off')\n",
+        "  plt.title('\\n\\n{}'.format(title), fontdict={'size': 16})\n",
+        "\n",
+        "import random\n",
+        "rando = random.randint(0,len(test_images)-1)\n",
+        "show(rando, 'An Example Image: {}'.format(class_names[test_labels[rando]]))"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "colab_type": "text",
+        "id": "TKnEHeTrbh3L"
+      },
+      "source": [
+        "Ok, that looks interesting.  How hard is that for you to recognize? Now let's create the JSON object for a batch of  three inference requests, and see how well our model recognizes things:"
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": 0,
+      "metadata": {
+        "colab": {},
+        "colab_type": "code",
+        "id": "2dsD7KQG1m-R"
+      },
+      "outputs": [],
+      "source": [
+        "import json\n",
+        "data = json.dumps({\"signature_name\": \"serving_default\", \"instances\": test_images[0:3].tolist()})\n",
+        "print('Data: {} ... {}'.format(data[:50], data[len(data)-52:]))"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "colab_type": "text",
+        "id": "iT3J-lHrhOYQ"
+      },
+      "source": [
+        "###Make REST requests\n",
+        "\n",
+        "We'll send a predict request as a POST to our server's REST endpoint, and pass it three examples.  We'll ask our server to give us the latest version of our servable by not specifying a particular version."
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": 0,
+      "metadata": {
+        "colab": {},
+        "colab_type": "code",
+        "id": "vGvFyuIzW6n6"
+      },
+      "outputs": [],
+      "source": [
+        "if not testing:\n",
+        "  import requests\n",
+        "  headers = {\"content-type\": \"application/json\"}\n",
+        "  json_response = requests.post('http://localhost:8501/v1/models/fashion_model:predict', data=data, headers=headers)\n",
+        "  predictions = json.loads(json_response.text)['predictions']\n",
+        "\n",
+        "  show(0, 'The model thought this was a {} (class {}), and it was actually a {} (class {})'.format(\n",
+        "    class_names[np.argmax(predictions[0])], test_labels[0], class_names[np.argmax(predictions[0])], test_labels[0]))"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "colab_type": "text",
+        "id": "YJH8LtM4XELp"
+      },
+      "source": [
+        "Now let's specify a particular version of our servable.  Since we only have one, let's select version 1.  We'll also look at all three results."
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": 0,
+      "metadata": {
+        "colab": {},
+        "colab_type": "code",
+        "id": "zRftRxeR1tZx"
+      },
+      "outputs": [],
+      "source": [
+        "if not testing:\n",
+        "  headers = {\"content-type\": \"application/json\"}\n",
+        "  json_response = requests.post('http://localhost:8501/v1/models/fashion_model/versions/1:predict', data=data, headers=headers)\n",
+        "  predictions = json.loads(json_response.text)['predictions']\n",
+        "\n",
+        "  for i in range(0,3):\n",
+        "    show(i, 'The model thought this was a {} (class {}), and it was actually a {} (class {})'.format(\n",
+        "      class_names[np.argmax(predictions[i])], test_labels[i], class_names[np.argmax(predictions[i])], test_labels[i]))"
+      ]
+    }
+  ],
+  "metadata": {
+    "accelerator": "GPU",
+    "colab": {
+      "collapsed_sections": [],
+      "name": "Serving_REST_simple.ipynb",
+      "private_outputs": true,
+      "provenance": [],
+      "toc_visible": true,
+      "version": "0.3.2"
+    },
+    "kernelspec": {
+      "display_name": "Python 2",
+      "name": "python2"
+    }
+  },
+  "nbformat": 4,
+  "nbformat_minor": 0
+}

From 44318969563f951d91b22f7cb5f827873abd6d99 Mon Sep 17 00:00:00 2001
From: gvasudevan 
Date: Tue, 27 Nov 2018 11:50:08 -0800
Subject: [PATCH 1613/8103] Expose unit tests for Docker images as build tests

PiperOrigin-RevId: 223030434
---
 .../servables/tensorflow/testdata/BUILD       |  14 ++
 tensorflow_serving/tools/docker/tests/BUILD   |  79 ++++++++
 .../tools/docker/tests/docker_test_lib.sh     | 170 ++++++++++++++++++
 .../docker/tests/dockerfile_devel_gpu_test.sh |  43 +++++
 .../docker/tests/dockerfile_devel_test.sh     |  43 +++++
 .../tools/docker/tests/dockerfile_gpu_test.sh |  43 +++++
 .../tools/docker/tests/dockerfile_test.sh     |  42 +++++
 7 files changed, 434 insertions(+)
 create mode 100644 tensorflow_serving/tools/docker/tests/BUILD
 create mode 100755 tensorflow_serving/tools/docker/tests/docker_test_lib.sh
 create mode 100755 tensorflow_serving/tools/docker/tests/dockerfile_devel_gpu_test.sh
 create mode 100755 tensorflow_serving/tools/docker/tests/dockerfile_devel_test.sh
 create mode 100755 tensorflow_serving/tools/docker/tests/dockerfile_gpu_test.sh
 create mode 100755 tensorflow_serving/tools/docker/tests/dockerfile_test.sh

diff --git a/tensorflow_serving/servables/tensorflow/testdata/BUILD b/tensorflow_serving/servables/tensorflow/testdata/BUILD
index 0ed3e6fe0fc..b5126e9c2bc 100644
--- a/tensorflow_serving/servables/tensorflow/testdata/BUILD
+++ b/tensorflow_serving/servables/tensorflow/testdata/BUILD
@@ -68,6 +68,20 @@ py_binary(
     ],
 )
 
+filegroup(
+    name = "saved_model_half_plus_two_cpu",
+    srcs = glob(
+        ["saved_model_half_plus_two_cpu/**"],
+    ),
+)
+
+filegroup(
+    name = "saved_model_half_plus_two_gpu",
+    srcs = glob(
+        ["saved_model_half_plus_two_gpu/**"],
+    ),
+)
+
 # Note: re-generate these files with :export_half_plus_two whenever model
 # changes.
 exports_files([
diff --git a/tensorflow_serving/tools/docker/tests/BUILD b/tensorflow_serving/tools/docker/tests/BUILD
new file mode 100644
index 00000000000..384774cec62
--- /dev/null
+++ b/tensorflow_serving/tools/docker/tests/BUILD
@@ -0,0 +1,79 @@
+# Description: Tests for Docker images.
+# These tests bring up a docker container based on a locally installed
+# image (passed via an argument), and verify that the functionality of
+# the docker image is intact. The tests require an environment to have
+# docker installed.
+#
+# Tests are local and manual as they require docker and the image to be
+# installed.
+
+licenses(["notice"])  # Apache 2.0
+
+sh_library(
+    name = "docker_test_lib",
+    srcs = ["docker_test_lib.sh"],
+)
+
+sh_test(
+    name = "unittest_dockerfile",
+    size = "small",
+    srcs = ["dockerfile_test.sh"],
+    args = ["tensorflow/serving:latest"],
+    data = [
+        "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_cpu",
+    ],
+    tags = [
+        "exclude_from_all",
+        "exclusive",
+        "local",
+    ],
+    deps = [":docker_test_lib"],
+)
+
+sh_test(
+    name = "unittest_dockerfile_devel",
+    size = "small",
+    srcs = ["dockerfile_devel_test.sh"],
+    args = ["tensorflow/serving:latest-devel"],
+    data = [
+        "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_cpu",
+    ],
+    tags = [
+        "exclude_from_all",
+        "exclusive",
+        "local",
+    ],
+    deps = [":docker_test_lib"],
+)
+
+sh_test(
+    name = "unittest_dockerfile_gpu",
+    size = "medium",
+    srcs = ["dockerfile_gpu_test.sh"],
+    args = ["tensorflow/serving:latest-gpu"],
+    data = [
+        "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_gpu",
+    ],
+    tags = [
+        "exclude_from_all",
+        "exclusive",
+        "local",
+    ],
+    deps = [":docker_test_lib"],
+)
+
+sh_test(
+    name = "unittest_dockerfile_devel_gpu",
+    size = "medium",
+    srcs = ["dockerfile_devel_gpu_test.sh"],
+    args = ["tensorflow/serving:latest-devel-gpu"],
+    data = [
+        "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_gpu",
+    ],
+    tags = [
+        "exclude_from_all",
+        "exclusive",
+        "local",
+    ],
+    deps = [":docker_test_lib"],
+)
diff --git a/tensorflow_serving/tools/docker/tests/docker_test_lib.sh b/tensorflow_serving/tools/docker/tests/docker_test_lib.sh
new file mode 100755
index 00000000000..6d79e2a689a
--- /dev/null
+++ b/tensorflow_serving/tools/docker/tests/docker_test_lib.sh
@@ -0,0 +1,170 @@
+#!/bin/bash
+# Copyright 2018 Google Inc. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+#
+# Helper functions for unit testing docker images.
+
+
+declare TMPDIR=""
+declare CONTAINER_ID=""
+declare IMAGE=""
+declare MODEL_FULL_PATH=""
+
+# Set PATH since it's cleared in a hermetic environment
+function _init_path {
+  export PATH=$PATH:/usr/bin/:/bin
+}
+
+# Copies model to a temp dir for mounting from Docker
+function _copy_modeldir {
+  if [[ ! -d ${MODELDIR} ]]; then
+    echo "Failed testing image. Missing model dir: ${MODELDIR}"
+    exit 1
+  fi
+
+  # Copy all data to tmp so it can be mounted by docker
+  TMPDIR="$(mktemp -d)"
+  cp -Lr ${MODELDIR}/${MODELNAME} ${TMPDIR}
+  chmod -R 755 "$TMPDIR"
+  MODEL_FULL_PATH=${TMPDIR}"/"${MODELNAME}
+}
+
+
+# Looks for the docker container when an image is spun up
+function _find_container {
+  local delay=1
+  local attempts=0
+  local max_attempts=60
+  # Wait for container to be loaded (max 60 seconds).
+  while (( attempts++ < max_attempts )) && [[ -z ${CONTAINER_ID} ]]; do
+    sleep $delay
+    echo "Polling for container ID for image ${IMAGE}..."
+    CONTAINER_ID=$(docker ps | grep "${IMAGE}" | awk '{print $1}')
+  done
+  if (( attempts > max_attempts )); then
+    echo "Failed to get container ID for image: ${IMAGE}."
+    echo "Running docker containers:"
+    docker ps
+    exit 1
+  fi
+  echo "Container ${CONTAINER_ID} Details:"
+  docker inspect ${CONTAINER_ID}
+}
+
+# Waits for the model server to indicate that its HTTP endpoint is up
+function _wait_for_http {
+  # Wait for HTTP end-point to be up
+  local delay=5
+  local attempts=0
+  local max_attempts=60
+  # May need to wait up to 5 minutes for the GPU build
+  echo "Waiting for HTTP endpoint"
+  while (( attempts++ < max_attempts )); do
+    sleep $delay
+    echo "Polling for HTTP endpoint for image ${IMAGE}..."
+    if [[ ! -z $(docker logs ${CONTAINER_ID} | grep "Exporting HTTP/REST API") ]]; then
+      break
+    fi
+  done
+  if (( attempts > max_attempts )); then
+    echo "HTTP endpoint never came up for image: ${IMAGE}."
+    echo "Docker logs:"
+    docker logs ${CONTAINER_ID}
+    exit 1
+  fi
+}
+
+# Queries the model server to validate the docker image
+function _query_model {
+  # Try querying model few times.
+  local delay=5
+  local attempts=0
+  local max_attempts=3
+  echo "Will query ModelServer for $max_attempts (max) attempts..."
+  while (( attempts++ < max_attempts )); do
+    echo "Querying TF ModelServer (attempt: ${attempts})"
+    result=$(curl -s -d "${REQUEST}" \
+      -X POST http://localhost:8501/v1/models/${MODELNAME}:predict)
+    if echo "$result" | tr -d '\n ' \
+      | grep -q -s -F "${RESPONSE}"; then
+      break
+    fi
+    echo -e "Unexpected response:\n${result}"
+
+    if (( attempts < max_attempts )); then
+      echo "Sleeping for $delay seconds and retrying again..."
+      sleep $delay
+    fi
+  done
+  if (( attempts > max_attempts )); then
+    echo "Failed to query model."
+    exit 1
+  fi
+  echo "Successfully queries model. Response:\n${result}"
+}
+
+# Cleans up test artifacts
+function _cleanup_test {
+  echo "Stopping TF ModelServer"
+  docker stop -t0 ${CONTAINER_ID}
+
+  echo "Clean up TMPDIR:${TMPDIR}"
+  [[ -z ${TMPDIR} ]] || rm -rf ${TMPDIR}
+}
+
+# Main test function
+# Args:
+#   $1: Docker image name
+function test_docker_image {
+  _init_path
+
+  IMAGE="$1"
+  _copy_modeldir
+
+  local rest_port="8501"
+  local model_base_path="/models/${MODELNAME}"
+  local docker_opts=" --privileged=true --rm -t -p ${rest_port}:${rest_port}"
+  docker_opts+=" -v ${MODEL_FULL_PATH}:${model_base_path}"
+  if [ "$USE_NVIDIA_RUNTIME" = true ] ; then
+      docker_opts+=" --runtime=nvidia"
+  fi
+
+  if [ -z $(docker images -q ${IMAGE}) ]; then
+    echo "Docker image ${IMAGE} doesn't exist, please create or pull"
+    exit 1
+  fi
+
+  echo "Starting TF ModelServer in Docker container from image:${IMAGE} ..."
+  if [[ "$IS_DEVEL_IMAGE" = true ]]; then
+    echo "Starting TF ModelServer in Docker container from image:${image} ..."
+    # Devel images do not run ModelServer but rather start interative shell.
+    # Hence we need to explicitly set entrypoint to modelserver and pass the
+    # required commandline options to serve the model.
+    docker run ${docker_opts} \
+      --entrypoint /usr/local/bin/tensorflow_model_server -- ${IMAGE} \
+      --rest_api_port=${rest_port} \
+      --model_name=${MODELNAME} --model_base_path=${model_base_path} &
+  else
+    docker run ${docker_opts} -e MODEL_NAME=${MODELNAME} ${IMAGE} &
+  fi
+  _find_container
+  _wait_for_http
+
+  _query_model
+
+  _cleanup_test
+}
+
+
diff --git a/tensorflow_serving/tools/docker/tests/dockerfile_devel_gpu_test.sh b/tensorflow_serving/tools/docker/tests/dockerfile_devel_gpu_test.sh
new file mode 100755
index 00000000000..4f48121fdff
--- /dev/null
+++ b/tensorflow_serving/tools/docker/tests/dockerfile_devel_gpu_test.sh
@@ -0,0 +1,43 @@
+#!/bin/bash
+# Copyright 2018 Google Inc. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+#
+# Tests if a Docker image built from Dockerfile.devel-gpu basically functions.
+#
+# It does this by loading up a half plus two toy model in the Docker image
+# and querying it, validating the response. This model will only load on a GPU.
+#
+# The image passed to this test must be already available locally.
+#
+# Ex: $ bazel test :unittest_Dockerfile.devel-gpu \
+#         --test_arg=tensorflow/serving:latest-devel-gpu \
+#         --test_output=streamed --verbose_failures
+
+declare -r PROJDIR=$(pwd)/tensorflow_serving
+source ${PROJDIR}/tools/docker/tests/docker_test_lib.sh || exit 1
+
+# Values to fill in for test
+# ------------------------------------------------------------------------------
+declare -r USE_NVIDIA_RUNTIME=true
+declare -r IS_DEVEL_IMAGE=true
+declare -r MODELNAME="saved_model_half_plus_two_gpu"
+declare -r MODELDIR="${PROJDIR}/servables/tensorflow/testdata"
+declare -r REQUEST='{"instances": [1.0,2.0,5.0]}'
+declare -r RESPONSE='{"predictions":[2.5,3.0,4.5]}'
+# ------------------------------------------------------------------------------
+
+# Grab the last argument as the image, so we can override the test arg in
+# the BUILD file
+test_docker_image ${@: -1}
diff --git a/tensorflow_serving/tools/docker/tests/dockerfile_devel_test.sh b/tensorflow_serving/tools/docker/tests/dockerfile_devel_test.sh
new file mode 100755
index 00000000000..919830863fa
--- /dev/null
+++ b/tensorflow_serving/tools/docker/tests/dockerfile_devel_test.sh
@@ -0,0 +1,43 @@
+#!/bin/bash
+# Copyright 2018 Google Inc. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+#
+# Tests if a Docker image built from Dockerfile.devel basically functions.
+#
+# It does this by loading up a half plus two toy model in the Docker image
+# and querying it, validating the response.
+#
+# The image passed to this test must be already available locally.
+#
+# Ex: $ bazel test :unittest_Dockerfile.devel \
+#         --test_arg=tensorflow/serving:latest-devel \
+#         --test_output=streamed --verbose_failures
+
+declare -r PROJDIR=$(pwd)/tensorflow_serving
+source ${PROJDIR}/tools/docker/tests/docker_test_lib.sh || exit 1
+
+# Values to fill in for test
+# ------------------------------------------------------------------------------
+declare -r USE_NVIDIA_RUNTIME=false
+declare -r IS_DEVEL_IMAGE=true
+declare -r MODELDIR="${PROJDIR}/servables/tensorflow/testdata"
+declare -r MODELNAME="saved_model_half_plus_two_cpu"
+declare -r REQUEST='{"instances": [1.0,2.0,5.0]}'
+declare -r RESPONSE='{"predictions":[2.5,3.0,4.5]}'
+# ------------------------------------------------------------------------------
+
+# Grab the last argument as the image, so we can override the test arg in
+# the BUILD file
+test_docker_image ${@: -1}
diff --git a/tensorflow_serving/tools/docker/tests/dockerfile_gpu_test.sh b/tensorflow_serving/tools/docker/tests/dockerfile_gpu_test.sh
new file mode 100755
index 00000000000..7182e201dbe
--- /dev/null
+++ b/tensorflow_serving/tools/docker/tests/dockerfile_gpu_test.sh
@@ -0,0 +1,43 @@
+#!/bin/bash
+# Copyright 2018 Google Inc. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+#
+# Tests if a Docker image built from Dockerfile.gpu basically functions.
+#
+# It does this by loading up a half plus two toy model in the Docker image
+# and querying it, validating the response. This model will only load on a GPU.
+#
+# The image passed to this test must be already available locally.
+#
+# Ex: $ bazel test :unittest_Dockerfile.gpu \
+#         --test_arg=tensorflow/serving:latest-gpu \
+#         --test_output=streamed --verbose_failures
+
+declare -r PROJDIR=$(pwd)/tensorflow_serving
+source ${PROJDIR}/tools/docker/tests/docker_test_lib.sh || exit 1
+
+# Values to fill in for test
+# ------------------------------------------------------------------------------
+declare -r USE_NVIDIA_RUNTIME=true
+declare -r IS_DEVEL_IMAGE=false
+declare -r MODELNAME="saved_model_half_plus_two_gpu"
+declare -r MODELDIR="${PROJDIR}/servables/tensorflow/testdata"
+declare -r REQUEST='{"instances": [1.0,2.0,5.0]}'
+declare -r RESPONSE='{"predictions":[2.5,3.0,4.5]}'
+# ------------------------------------------------------------------------------
+
+# Grab the last argument as the image, so we can override the test arg in
+# the BUILD file
+test_docker_image ${@: -1}
diff --git a/tensorflow_serving/tools/docker/tests/dockerfile_test.sh b/tensorflow_serving/tools/docker/tests/dockerfile_test.sh
new file mode 100755
index 00000000000..d3a9485a8db
--- /dev/null
+++ b/tensorflow_serving/tools/docker/tests/dockerfile_test.sh
@@ -0,0 +1,42 @@
+#!/bin/bash
+# Copyright 2018 Google Inc. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+#
+# Tests if a Docker image built from Dockerfile basically functions.
+#
+# It does this by loading up a half plus two toy model in the Docker image
+# and querying it, validating the response.
+#
+# The image passed to this test must be already available locally.
+#
+# Ex: $ bazel test :unittest_Dockerfile --test_arg=tensorflow/serving \
+#         --test_output=streamed --verbose_failures
+
+declare -r PROJDIR=$(pwd)/tensorflow_serving
+source ${PROJDIR}/tools/docker/tests/docker_test_lib.sh || exit 1
+
+# Values to fill in for test
+# ------------------------------------------------------------------------------
+declare -r USE_NVIDIA_RUNTIME=false
+declare -r IS_DEVEL_IMAGE=false
+declare -r MODELDIR="${PROJDIR}/servables/tensorflow/testdata"
+declare -r MODELNAME="saved_model_half_plus_two_cpu"
+declare -r REQUEST='{"instances": [1.0,2.0,5.0]}'
+declare -r RESPONSE='{"predictions":[2.5,3.0,4.5]}'
+# ------------------------------------------------------------------------------
+
+# Grab the last argument as the image, so we can override the test arg in
+# the BUILD file
+test_docker_image ${@: -1}

From 1baf77dc72768bfea050017059b225259e9b9d9e Mon Sep 17 00:00:00 2001
From: markdaoust 
Date: Tue, 27 Nov 2018 13:39:20 -0800
Subject: [PATCH 1614/8103] Delete broken build file.

PiperOrigin-RevId: 223049314
---
 tensorflow_serving/g3doc/tutorials/BUILD      | 34 -------------------
 .../g3doc/tutorials/Serving_REST_simple.ipynb |  2 +-
 2 files changed, 1 insertion(+), 35 deletions(-)
 delete mode 100644 tensorflow_serving/g3doc/tutorials/BUILD

diff --git a/tensorflow_serving/g3doc/tutorials/BUILD b/tensorflow_serving/g3doc/tutorials/BUILD
deleted file mode 100644
index ffd28e45410..00000000000
--- a/tensorflow_serving/g3doc/tutorials/BUILD
+++ /dev/null
@@ -1,34 +0,0 @@
-# Description: Test targets for tutorial notebooks.
-
-package(default_visibility = ["//tensorflow_serving:__subpackages__"])
-
-licenses(["notice"])  # Apache 2.0
-
-exports_files(["LICENSE"])
-
-load("//research/colab:build_defs.bzl", "colab_notebook_test")
-load("//research/colab:build_defs.bzl", "colab_binary")
-
-filegroup(
-    name = "files",
-    srcs = [
-    ] + glob(["*"]),
-)
-
-colab_binary(
-    name = "lite_notebook",
-    # Use hermetic python. This is necessary until c/31549734 is resolved
-    launcher = "//devtools/python/launcher",
-    deps = [
-        # We don't use:
-        #    ".../client:notebook_deps",
-        # in order to minimize deps. However this is a good place
-        # from which you can identify additional dependencies to add.
-        "//file/base",
-        "//file/liball",
-        "//file/localfile",
-        "//third_party/py/matplotlib",
-        "//third_party/py/numpy",
-        "@org_tensorflow//tensorflow:tensorflow_py",
-    ],
-)
diff --git a/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb b/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb
index dd9fd27550d..4f1d7fa133a 100644
--- a/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb
+++ b/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb
@@ -55,7 +55,7 @@
         "\u003cdiv class=\"devsite-table-wrapper\"\u003e\u003ctable class=\"tfo-notebook-buttons\" align=\"left\"\u003e\n",
         "\u003ctr\u003e\u003ctd\u003e\u003ca target=\"_blank\" href=\"https://www.tensorflow.org/serving/tutorials/Serving_REST_simple\"\u003e\n",
         "\u003cimg src=\"https://www.tensorflow.org/images/tf_logo_32px.png\" /\u003eView on TensorFlow.org\u003c/a\u003e\u003c/td\u003e\n",
-        "\u003ctd\u003e\u003ca target=\"_blank\" href=\"https://colab.research.google.com/github/tensorflow/serving/tree/master/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb\"\u003e\n",
+        "\u003ctd\u003e\u003ca target=\"_blank\" href=\"https://colab.research.google.com/github/tensorflow/serving/blob/master/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb\"\u003e\n",
         "\u003cimg src=\"https://www.tensorflow.org/images/colab_logo_32px.png\"\u003eRun in Google Colab\u003c/a\u003e\u003c/td\u003e\n",
         "\u003ctd\u003e\u003ca target=\"_blank\" href=\"https://github.com/tensorflow/serving/tree/master/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb\"\u003e\n",
         "\u003cimg width=32px src=\"https://www.tensorflow.org/images/GitHub-Mark-32px.png\"\u003eView source on GitHub\u003c/a\u003e\u003c/td\u003e\n",

From 6f75dbe060d20fff200502aef127d2efe237afee Mon Sep 17 00:00:00 2001
From: robertcrowe 
Date: Tue, 27 Nov 2018 14:29:15 -0800
Subject: [PATCH 1615/8103] Serving Colab - Adding local Jupyter warning and
 misc cleanup

PiperOrigin-RevId: 223058408
---
 .../g3doc/tutorials/Serving_REST_simple.ipynb | 37 +++++++++++++------
 1 file changed, 26 insertions(+), 11 deletions(-)

diff --git a/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb b/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb
index 4f1d7fa133a..9a2d9850377 100644
--- a/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb
+++ b/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb
@@ -51,7 +51,10 @@
         "id": "E6FwTNtl3S4v"
       },
       "source": [
+        "Warning: **This notebook is designed to be run in a Google Colab only**.  It installs packages on the system and requires root access.  If you want to run it in a local Jupyter notebook, please proceed with caution.\n",
+        "\n",
         "Note: You can run this example right now in a Jupyter-style notebook, no setup required!  Just click \"Run in Google Colab\"\n",
+        "\n",
         "\u003cdiv class=\"devsite-table-wrapper\"\u003e\u003ctable class=\"tfo-notebook-buttons\" align=\"left\"\u003e\n",
         "\u003ctr\u003e\u003ctd\u003e\u003ca target=\"_blank\" href=\"https://www.tensorflow.org/serving/tutorials/Serving_REST_simple\"\u003e\n",
         "\u003cimg src=\"https://www.tensorflow.org/images/tf_logo_32px.png\" /\u003eView on TensorFlow.org\u003c/a\u003e\u003c/td\u003e\n",
@@ -104,7 +107,7 @@
         "id": "5jAk1ZXqTJqN"
       },
       "source": [
-        "##Create your model"
+        "## Create your model"
       ]
     },
     {
@@ -168,7 +171,7 @@
         "id": "PDu7OX8Nf5PY"
       },
       "source": [
-        "###Train and evaluate your model\n",
+        "### Train and evaluate your model\n",
         "\n",
         "Let's use the simplest possible CNN, since we're not focused on the modeling part."
       ]
@@ -215,7 +218,7 @@
         "id": "AwGPItyphqXT"
       },
       "source": [
-        "##Save your model\n",
+        "## Save your model\n",
         "\n",
         "To load our trained model into TensorFlow Serving we first need to save it in [SavedModel](https://www.tensorflow.org/api_docs/python/tf/saved_model) format.  This will create a protobuf file in a well-defined directory hierarchy, and will include a version number.  TensorFlow Serving allows us to select [which version of a model, or \"servable\"](../overview) we want to use when we make inference requests.  Each version will be exported to a different sub-directory under the given path."
       ]
@@ -236,7 +239,7 @@
         "import tempfile\n",
         "\n",
         "version = 1\n",
-        "export_path = '{}/{}'.format(tempfile.gettempdir(), version)\n",
+        "export_path = os.path.join(tempfile.gettempdir(), version)\n",
         "print('export_path = {}\\n'.format(export_path))\n",
         "if os.path.isdir(export_path):\n",
         "  print('\\nAlready saved a model, cleaning up\\n')\n",
@@ -259,7 +262,7 @@
         "id": "FM7B_RuDYoIj"
       },
       "source": [
-        "##Examine your saved model\n",
+        "## Examine your saved model\n",
         "\n",
         "We'll use the command line utility `saved_model_cli` to look at the [MetaGraphDefs](https://www.tensorflow.org/api_docs/python/tf/MetaGraphDef) (the models) and [SignatureDefs](../signature_defs) (the methods you can call) in our SavedModel.  See [this discussion of the SavedModel CLI](https://www.tensorflow.org/guide/saved_model#cli_to_inspect_and_execute_savedmodel) in the TensorFlow Guide."
       ]
@@ -294,9 +297,9 @@
         "id": "DBgsyhytS6KD"
       },
       "source": [
-        "##Serve your model with TensorFlow Serving\n",
+        "## Serve your model with TensorFlow Serving\n",
         "\n",
-        "###Add TensorFlow Serving distribution URI as a package source:\n",
+        "### Add TensorFlow Serving distribution URI as a package source:\n",
         "\n",
         "We're preparing to install TensorFlow Serving using [Aptitude](https://wiki.debian.org/Aptitude) since this Colab runs in a Debian environment.  We'll add the `tensorflow-model-server` package to the list of packages that Aptitude knows about.  Note that we're running as root.\n",
         "\n",
@@ -330,7 +333,7 @@
         "id": "W1ZVp_VOU7Wu"
       },
       "source": [
-        "###Install TensorFlow Serving\n",
+        "### Install TensorFlow Serving\n",
         "\n",
         "This is all you need - one command line!"
       ]
@@ -355,7 +358,7 @@
         "id": "k5NrYdQeVm52"
       },
       "source": [
-        "###Start running TensorFlow Serving\n",
+        "### Start running TensorFlow Serving\n",
         "\n",
         "This is where we start running TensorFlow Serving and load our model.  After it loads we can start making inference requests using REST.  There are some important parameters:\n",
         "\n",
@@ -392,7 +395,7 @@
         "id": "vwg1JKaGXWAg"
       },
       "source": [
-        "##Make a request to your model in TensorFlow Serving\n",
+        "## Make a request to your model in TensorFlow Serving\n",
         "\n",
         "First, let's take a look at a random example from our test data."
       ]
@@ -443,6 +446,16 @@
         "print('Data: {} ... {}'.format(data[:50], data[len(data)-52:]))"
       ]
     },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "colab_type": "text",
+        "id": "ReQd4QESIwXN"
+      },
+      "source": [
+        "### Make REST requests"
+      ]
+    },
     {
       "cell_type": "markdown",
       "metadata": {
@@ -450,7 +463,7 @@
         "id": "iT3J-lHrhOYQ"
       },
       "source": [
-        "###Make REST requests\n",
+        "#### Newest version of the servable\n",
         "\n",
         "We'll send a predict request as a POST to our server's REST endpoint, and pass it three examples.  We'll ask our server to give us the latest version of our servable by not specifying a particular version."
       ]
@@ -482,6 +495,8 @@
         "id": "YJH8LtM4XELp"
       },
       "source": [
+        "#### A particular version of the servable\n",
+        "\n",
         "Now let's specify a particular version of our servable.  Since we only have one, let's select version 1.  We'll also look at all three results."
       ]
     },

From 65d99b61e262ce3d8dd2538f3daba99efae90801 Mon Sep 17 00:00:00 2001
From: Daniel Shi 
Date: Tue, 27 Nov 2018 21:40:17 -0500
Subject: [PATCH 1616/8103] Update the code snippet in the tutorial to reflect
 the latest version of mnist_saved_model.py

---
 tensorflow_serving/g3doc/serving_basic.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tensorflow_serving/g3doc/serving_basic.md b/tensorflow_serving/g3doc/serving_basic.md
index 75fff7cdf85..9928ee4bf6d 100644
--- a/tensorflow_serving/g3doc/serving_basic.md
+++ b/tensorflow_serving/g3doc/serving_basic.md
@@ -53,7 +53,7 @@ export_path = os.path.join(
 print 'Exporting trained model to', export_path
 builder = tf.saved_model.builder.SavedModelBuilder(export_path)
 builder.add_meta_graph_and_variables(
-      sess, [tag_constants.SERVING],
+      sess, [tf.saved_model.tag_constants.SERVING],
       signature_def_map={
            'predict_images':
                prediction_signature,

From 5446fd973de228693c1652acd4922dc4b177f77a Mon Sep 17 00:00:00 2001
From: wenboz 
Date: Wed, 28 Nov 2018 06:53:29 -0800
Subject: [PATCH 1617/8103] Fix the compile error on ARM-32 in net_http/server.

Fixes https://github.com/tensorflow/serving/issues/1188

PiperOrigin-RevId: 223158998
---
 .../util/net_http/server/internal/evhttp_request.cc          | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_request.cc b/tensorflow_serving/util/net_http/server/internal/evhttp_request.cc
index 16dcbbfc640..905b28d6f82 100644
--- a/tensorflow_serving/util/net_http/server/internal/evhttp_request.cc
+++ b/tensorflow_serving/util/net_http/server/internal/evhttp_request.cc
@@ -216,8 +216,9 @@ void EvHTTPRequest::UncompressGzipContent(void* input, size_t input_size,
 
   ZLib zlib;
   int err = zlib.UncompressGzipAndAllocate(
-      reinterpret_cast(uncompressed_input), uncompressed_input_size,
-      reinterpret_cast(input), input_size);
+      reinterpret_cast(uncompressed_input),
+      reinterpret_cast(uncompressed_input_size),
+      static_cast(input), static_cast(input_size));
   if (err != Z_OK) {
     ABSL_RAW_LOG(ERROR, "Got zlib error: %d", err);
   }

From 9c3d4303f79641aba856058f5705c93c19ba0d81 Mon Sep 17 00:00:00 2001
From: markdaoust 
Date: Wed, 28 Nov 2018 13:39:08 -0800
Subject: [PATCH 1618/8103] You can't pass an int as a path component.

PiperOrigin-RevId: 223227315
---
 tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb b/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb
index 9a2d9850377..12f12320c3c 100644
--- a/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb
+++ b/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb
@@ -239,7 +239,7 @@
         "import tempfile\n",
         "\n",
         "version = 1\n",
-        "export_path = os.path.join(tempfile.gettempdir(), version)\n",
+        "export_path = os.path.join(tempfile.gettempdir(), str(version))\n",
         "print('export_path = {}\\n'.format(export_path))\n",
         "if os.path.isdir(export_path):\n",
         "  print('\\nAlready saved a model, cleaning up\\n')\n",

From 535604455509267c1bc6b52eeef3ead05da0980d Mon Sep 17 00:00:00 2001
From: markdaoust 
Date: Wed, 28 Nov 2018 15:20:50 -0800
Subject: [PATCH 1619/8103] Use `%%bash -bg` for jupyter/ipython compatibility.

PiperOrigin-RevId: 223245715
---
 .../g3doc/tutorials/Serving_REST_simple.ipynb | 71 ++++++++++++-------
 1 file changed, 46 insertions(+), 25 deletions(-)

diff --git a/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb b/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb
index 12f12320c3c..449441ba9e8 100644
--- a/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb
+++ b/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb
@@ -238,8 +238,9 @@
         "# and stored with the default serving key\n",
         "import tempfile\n",
         "\n",
+        "MODEL_DIR = tempfile.gettempdir()\n",
         "version = 1\n",
-        "export_path = os.path.join(tempfile.gettempdir(), str(version))\n",
+        "export_path = os.path.join(MODEL_DIR, str(version))\n",
         "print('export_path = {}\\n'.format(export_path))\n",
         "if os.path.isdir(export_path):\n",
         "  print('\\nAlready saved a model, cleaning up\\n')\n",
@@ -364,9 +365,20 @@
         "\n",
         "* `rest_api_port`: The port that you'll use for REST requests.\n",
         "* `model_name`: You'll use this in the URL of REST requests.  It can be anything.\n",
-        "* `model_base_path`: This is the path to the directory where you've saved your model.\n",
-        "\n",
-        "Note: This example starts the server using `nohup`, which you would not do when running the server normally.  We only need to do it here because of the Colab environment that we're running in."
+        "* `model_base_path`: This is the path to the directory where you've saved your model.\n"
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": 0,
+      "metadata": {
+        "colab": {},
+        "colab_type": "code",
+        "id": "aUgp3vUdU5GS"
+      },
+      "outputs": [],
+      "source": [
+        "os.environ[\"MODEL_DIR\"] = MODEL_DIR"
       ]
     },
     {
@@ -379,13 +391,24 @@
       },
       "outputs": [],
       "source": [
-        "if not testing:\n",
-        "  !nohup tensorflow_model_server \\\n",
-        "    --rest_api_port=8501 \\\n",
-        "    --model_name=fashion_model \\\n",
-        "    --model_base_path={tempfile.gettempdir()} \u0026\n",
-        "\n",
-        "  !tail nohup.out"
+        "%%bash --bg \n",
+        "nohup tensorflow_model_server \\\n",
+        "  --rest_api_port=8501 \\\n",
+        "  --model_name=fashion_model \\\n",
+        "  --model_base_path=\"${MODEL_DIR}\" \u003eserver.log 2\u003e\u00261\n"
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": 0,
+      "metadata": {
+        "colab": {},
+        "colab_type": "code",
+        "id": "IxbeiOCUUs2z"
+      },
+      "outputs": [],
+      "source": [
+        "!tail server.log"
       ]
     },
     {
@@ -478,14 +501,13 @@
       },
       "outputs": [],
       "source": [
-        "if not testing:\n",
-        "  import requests\n",
-        "  headers = {\"content-type\": \"application/json\"}\n",
-        "  json_response = requests.post('http://localhost:8501/v1/models/fashion_model:predict', data=data, headers=headers)\n",
-        "  predictions = json.loads(json_response.text)['predictions']\n",
+        "import requests\n",
+        "headers = {\"content-type\": \"application/json\"}\n",
+        "json_response = requests.post('http://localhost:8501/v1/models/fashion_model:predict', data=data, headers=headers)\n",
+        "predictions = json.loads(json_response.text)['predictions']\n",
         "\n",
-        "  show(0, 'The model thought this was a {} (class {}), and it was actually a {} (class {})'.format(\n",
-        "    class_names[np.argmax(predictions[0])], test_labels[0], class_names[np.argmax(predictions[0])], test_labels[0]))"
+        "show(0, 'The model thought this was a {} (class {}), and it was actually a {} (class {})'.format(\n",
+        "  class_names[np.argmax(predictions[0])], test_labels[0], class_names[np.argmax(predictions[0])], test_labels[0]))"
       ]
     },
     {
@@ -510,14 +532,13 @@
       },
       "outputs": [],
       "source": [
-        "if not testing:\n",
-        "  headers = {\"content-type\": \"application/json\"}\n",
-        "  json_response = requests.post('http://localhost:8501/v1/models/fashion_model/versions/1:predict', data=data, headers=headers)\n",
-        "  predictions = json.loads(json_response.text)['predictions']\n",
+        "headers = {\"content-type\": \"application/json\"}\n",
+        "json_response = requests.post('http://localhost:8501/v1/models/fashion_model/versions/1:predict', data=data, headers=headers)\n",
+        "predictions = json.loads(json_response.text)['predictions']\n",
         "\n",
-        "  for i in range(0,3):\n",
-        "    show(i, 'The model thought this was a {} (class {}), and it was actually a {} (class {})'.format(\n",
-        "      class_names[np.argmax(predictions[i])], test_labels[i], class_names[np.argmax(predictions[i])], test_labels[i]))"
+        "for i in range(0,3):\n",
+        "  show(i, 'The model thought this was a {} (class {}), and it was actually a {} (class {})'.format(\n",
+        "    class_names[np.argmax(predictions[i])], test_labels[i], class_names[np.argmax(predictions[i])], test_labels[i]))"
       ]
     }
   ],

From 525c1af73ca543ce0165b3d22f0bbf21094fc443 Mon Sep 17 00:00:00 2001
From: gvasudevan 
Date: Wed, 28 Nov 2018 16:28:10 -0800
Subject: [PATCH 1620/8103] Release a "GPU" version of TensorFlow Serving APIs.
 This depends on the tensorflow-gpu instead of tensorflow PIP package, but is
 otherwise identical.

Fixes https://github.com/tensorflow/serving/issues/1142

PiperOrigin-RevId: 223256799
---
 .../tools/pip_package/build_pip_package.sh    | 10 +++++---
 tensorflow_serving/tools/pip_package/setup.py | 23 ++++++++++++++++---
 2 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/tensorflow_serving/tools/pip_package/build_pip_package.sh b/tensorflow_serving/tools/pip_package/build_pip_package.sh
index 5ddfe37756e..2569420ef7b 100755
--- a/tensorflow_serving/tools/pip_package/build_pip_package.sh
+++ b/tensorflow_serving/tools/pip_package/build_pip_package.sh
@@ -23,7 +23,7 @@ function main() {
   fi
 
   if [[ ! -d "bazel-bin/tensorflow_serving" ]]; then
-    echo "Could not find bazel-bin. Did you run from the root of the build "\
+    echo "Could not find bazel-bin. Did you run from the root of the build"\
       "tree?"
     exit 1
   fi
@@ -74,8 +74,12 @@ function main() {
   cp ${PIP_SRC_DIR}/setup.py "${TMPDIR}"
 
   pushd "${TMPDIR}"
-  echo $(date) : "=== Building wheel"
-  python setup.py bdist_wheel --universal # >/dev/null
+  echo $(date) : "=== Building wheel (CPU)"
+  python setup.py bdist_wheel --universal \
+    --project_name tensorflow-serving-api # >/dev/null
+  echo $(date) : "=== Building wheel (GPU)"
+  python setup.py bdist_wheel --universal \
+    --project_name tensorflow-serving-api-gpu # >/dev/null
   mkdir -p "${DEST}"
   cp dist/* "${DEST}"
   popd
diff --git a/tensorflow_serving/tools/pip_package/setup.py b/tensorflow_serving/tools/pip_package/setup.py
index c68adc73431..73d42e56c14 100644
--- a/tensorflow_serving/tools/pip_package/setup.py
+++ b/tensorflow_serving/tools/pip_package/setup.py
@@ -23,6 +23,8 @@
 This package contains the TensorFlow Serving Python APIs.
 """
 
+import sys
+
 from setuptools import find_packages
 from setuptools import setup
 
@@ -31,14 +33,29 @@
 # Set when releasing a new version of TensorFlow Serving (e.g. 1.0.0).
 _VERSION = '0.0.0'
 
+project_name = 'tensorflow-serving-api'
+# Set when building the pip package
+if '--project_name' in sys.argv:
+  project_name_idx = sys.argv.index('--project_name')
+  project_name = sys.argv[project_name_idx + 1]
+  sys.argv.remove('--project_name')
+  sys.argv.pop(project_name_idx)
+
+_TF_REQ = ['tensorflow>=1.2.0,<2']
+
+# GPU build (note: the only difference is we depend on tensorflow-gpu so
+# pip doesn't overwrite it with the CPU build)
+if 'tensorflow-serving-api-gpu' in project_name:
+  _TF_REQ = ['tensorflow-gpu>=1.2.0,<2']
+
+
 REQUIRED_PACKAGES = [
-    'tensorflow>=1.2.0,<2',
     'grpcio>=1.0<2',
     'protobuf>=3.6.0',
-]
+] + _TF_REQ
 
 setup(
-    name='tensorflow-serving-api',
+    name=project_name,
     version=_VERSION.replace('-', ''),
     author='Google Inc.',
     author_email='tensorflow-serving-dev@googlegroups.com',

From 9e48d0cb5f42184c70d7b02a382aede4d46be67e Mon Sep 17 00:00:00 2001
From: robertcrowe 
Date: Thu, 29 Nov 2018 11:07:23 -0800
Subject: [PATCH 1621/8103] Adding requests install for rendering

PiperOrigin-RevId: 223376182
---
 tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb b/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb
index 449441ba9e8..914318e1bfa 100644
--- a/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb
+++ b/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb
@@ -501,6 +501,8 @@
       },
       "outputs": [],
       "source": [
+        "!pip install -q requests\n",
+        "\n",
         "import requests\n",
         "headers = {\"content-type\": \"application/json\"}\n",
         "json_response = requests.post('http://localhost:8501/v1/models/fashion_model:predict', data=data, headers=headers)\n",

From ff3167717201d32ebb805d5f324027a5ef858ed4 Mon Sep 17 00:00:00 2001
From: gvasudevan 
Date: Thu, 29 Nov 2018 11:56:02 -0800
Subject: [PATCH 1622/8103] Internal change

PiperOrigin-RevId: 223385304
---
 tensorflow_serving/tools/docker/tests/BUILD | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/tensorflow_serving/tools/docker/tests/BUILD b/tensorflow_serving/tools/docker/tests/BUILD
index 384774cec62..7075f06a6af 100644
--- a/tensorflow_serving/tools/docker/tests/BUILD
+++ b/tensorflow_serving/tools/docker/tests/BUILD
@@ -23,9 +23,9 @@ sh_test(
         "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_cpu",
     ],
     tags = [
-        "exclude_from_all",
         "exclusive",
         "local",
+        "manual",
     ],
     deps = [":docker_test_lib"],
 )
@@ -39,9 +39,9 @@ sh_test(
         "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_cpu",
     ],
     tags = [
-        "exclude_from_all",
         "exclusive",
         "local",
+        "manual",
     ],
     deps = [":docker_test_lib"],
 )
@@ -55,9 +55,9 @@ sh_test(
         "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_gpu",
     ],
     tags = [
-        "exclude_from_all",
         "exclusive",
         "local",
+        "manual",
     ],
     deps = [":docker_test_lib"],
 )
@@ -71,9 +71,9 @@ sh_test(
         "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_gpu",
     ],
     tags = [
-        "exclude_from_all",
         "exclusive",
         "local",
+        "manual",
     ],
     deps = [":docker_test_lib"],
 )

From cd7345b2d2924892abd0847f45817c7d7369a723 Mon Sep 17 00:00:00 2001
From: gvasudevan 
Date: Thu, 29 Nov 2018 12:52:22 -0800
Subject: [PATCH 1623/8103] Docker GPU Devel image should install
 tensorflow-serving-api-gpu package

PiperOrigin-RevId: 223394699
---
 tensorflow_serving/tools/docker/Dockerfile.devel     | 3 ++-
 tensorflow_serving/tools/docker/Dockerfile.devel-gpu | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel
index 601415955ca..9d27cccbe71 100644
--- a/tensorflow_serving/tools/docker/Dockerfile.devel
+++ b/tensorflow_serving/tools/docker/Dockerfile.devel
@@ -104,7 +104,8 @@ RUN bazel build --color=yes --curses=yes \
     tensorflow_serving/tools/pip_package:build_pip_package && \
     bazel-bin/tensorflow_serving/tools/pip_package/build_pip_package \
     /tmp/pip && \
-    pip --no-cache-dir install --upgrade /tmp/pip/tensorflow_serving*.whl && \
+    pip --no-cache-dir install --upgrade \
+    /tmp/pip/tensorflow_serving_api-*.whl && \
     rm -rf /tmp/pip
 
 FROM binary_build as clean_build
diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu
index 617a7783c10..8cbfe5e34e3 100644
--- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu
+++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu
@@ -175,7 +175,8 @@ RUN bazel build --color=yes --curses=yes \
     tensorflow_serving/tools/pip_package:build_pip_package && \
     bazel-bin/tensorflow_serving/tools/pip_package/build_pip_package \
     /tmp/pip && \
-    pip --no-cache-dir install --upgrade /tmp/pip/tensorflow_serving*.whl && \
+    pip --no-cache-dir install --upgrade \
+    /tmp/pip/tensorflow_serving_api_gpu-*.whl && \
     rm -rf /tmp/pip
 
 FROM binary_build as clean_build

From 7386928d1212ad5c2fcf333e5188fdeb17cc3890 Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Thu, 29 Nov 2018 13:02:07 -0800
Subject: [PATCH 1624/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223396229
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 56f38f69e3b..d40dbd65dab 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "4f5a95fdac18fef38565298e4dc300761a7c46cf808dd1bc113b69085d6584b5",
-    git_commit = "19f97dc4bd9507c6c971372d5995f1e81cf045c9",
+    sha256 = "0e1101166b6ca2ee4c970422bf450c44eea2a32f7d899b2ca521c18296cb5196",
+    git_commit = "20179793c2c96bbcbbaaf400b247e35aa81d9deb",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From ccddf3f582400b3633510bdbcadd5c7847861b91 Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Thu, 29 Nov 2018 14:02:16 -0800
Subject: [PATCH 1625/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223406941
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index d40dbd65dab..5d17f3ba635 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "0e1101166b6ca2ee4c970422bf450c44eea2a32f7d899b2ca521c18296cb5196",
-    git_commit = "20179793c2c96bbcbbaaf400b247e35aa81d9deb",
+    sha256 = "6062dbf2c648dd14283f36dc03dfcee22cb5c3f19e33f70c736aab410f4dc4f0",
+    git_commit = "886fab08090cb9048e5cb6169b1e8ab260f650a1",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From 8c759ced61b83192b50a3dddb70902e48e574c6a Mon Sep 17 00:00:00 2001
From: gvasudevan 
Date: Thu, 29 Nov 2018 14:08:21 -0800
Subject: [PATCH 1626/8103] Remove circular link

Fixes https://github.com/tensorflow/serving/issues/1192

PiperOrigin-RevId: 223408194
---
 tensorflow_serving/tools/docker/Dockerfile.devel-gpu | 1 -
 1 file changed, 1 deletion(-)

diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu
index 8cbfe5e34e3..088fd01faf0 100644
--- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu
+++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu
@@ -120,7 +120,6 @@ ENV TF_CUDNN_VERSION=7
 # Fix paths so that CUDNN can be found: https://github.com/tensorflow/tensorflow/issues/8264
 WORKDIR /
 RUN mkdir /usr/lib/x86_64-linux-gnu/include/ && \
-  ln -s /usr/lib/x86_64-linux-gnu/include/cudnn.h /usr/lib/x86_64-linux-gnu/include/cudnn.h && \
   ln -s /usr/include/cudnn.h /usr/local/cuda/include/cudnn.h && \
   ln -s /usr/lib/x86_64-linux-gnu/libcudnn.so /usr/local/cuda/lib64/libcudnn.so && \
   ln -s /usr/lib/x86_64-linux-gnu/libcudnn.so.${TF_CUDNN_VERSION} /usr/local/cuda/lib64/libcudnn.so.${TF_CUDNN_VERSION}

From 5bacc84d1a37c04a301f6c7df1036f185ca10356 Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Thu, 29 Nov 2018 15:01:57 -0800
Subject: [PATCH 1627/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223417702
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 5d17f3ba635..71682b234df 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "6062dbf2c648dd14283f36dc03dfcee22cb5c3f19e33f70c736aab410f4dc4f0",
-    git_commit = "886fab08090cb9048e5cb6169b1e8ab260f650a1",
+    sha256 = "3ba252479dc8064125c55dcfd91174852bbc65f2a6ffe11647837c9c4550da04",
+    git_commit = "29574450f8701385b821f8b6701e19df1d41dbe5",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From 995e017f8521cf8ec40d558fe3ae910120d51247 Mon Sep 17 00:00:00 2001
From: markdaoust 
Date: Thu, 29 Nov 2018 15:15:14 -0800
Subject: [PATCH 1628/8103] remove .md in _book.yaml

PiperOrigin-RevId: 223420178
---
 tensorflow_serving/g3doc/_book.yaml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tensorflow_serving/g3doc/_book.yaml b/tensorflow_serving/g3doc/_book.yaml
index a0b6305185f..eca2c81eda0 100644
--- a/tensorflow_serving/g3doc/_book.yaml
+++ b/tensorflow_serving/g3doc/_book.yaml
@@ -20,7 +20,7 @@ upper_tabs:
         path: /serving/api_rest
       - heading: Examples
       - title: Training and serving a model with REST
-        path: /serving/tutorials/Serving_REST_simple.md
+        path: /serving/tutorials/Serving_REST_simple
       - heading: Understanding TensorFlow Serving
       - title: Overview
         path: /serving/overview

From f2328395d2f9123fe703d32a2b244581e79c1316 Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Thu, 29 Nov 2018 16:02:50 -0800
Subject: [PATCH 1629/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223428510
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 71682b234df..3eb14f819f6 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "3ba252479dc8064125c55dcfd91174852bbc65f2a6ffe11647837c9c4550da04",
-    git_commit = "29574450f8701385b821f8b6701e19df1d41dbe5",
+    sha256 = "295a983fc22a656707b09f6f0848ba32fda159c46900d10490cc293e9cb9b561",
+    git_commit = "ee5f4ebbf4b93283372ba708925318a2a8ce83a5",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From 61b6dd3c9ec4d2b15b1df328cad67b038e70a7ce Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Thu, 29 Nov 2018 17:01:57 -0800
Subject: [PATCH 1630/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223437812
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 3eb14f819f6..118e6cb0799 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "295a983fc22a656707b09f6f0848ba32fda159c46900d10490cc293e9cb9b561",
-    git_commit = "ee5f4ebbf4b93283372ba708925318a2a8ce83a5",
+    sha256 = "fe103840edeca8b9599efa06e1770349cdfa92919c367ae053eb1a64fd1eab6d",
+    git_commit = "0ec0dbe21a74956ec3a31d775e7679b9e8d2d03e",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From 54a3813f4e7420a882f65c68a40a2886fab11686 Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Thu, 29 Nov 2018 18:02:16 -0800
Subject: [PATCH 1631/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223445081
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 118e6cb0799..4a52fa7ab9a 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "fe103840edeca8b9599efa06e1770349cdfa92919c367ae053eb1a64fd1eab6d",
-    git_commit = "0ec0dbe21a74956ec3a31d775e7679b9e8d2d03e",
+    sha256 = "3b80cb402c4b1b080f6386faf6bf4353fcf74162767ee85e8ceb6953673a6330",
+    git_commit = "771f3a4385a2f054f6747acffd3217aff224fd50",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From 8c7370686668deeb33475283eb4c58b96853895d Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Thu, 29 Nov 2018 19:02:16 -0800
Subject: [PATCH 1632/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223450700
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 4a52fa7ab9a..067ca2ad373 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "3b80cb402c4b1b080f6386faf6bf4353fcf74162767ee85e8ceb6953673a6330",
-    git_commit = "771f3a4385a2f054f6747acffd3217aff224fd50",
+    sha256 = "fe2e0ab770a1176375b24da4e679707cd813da28ef311716d509ee9b6ad91607",
+    git_commit = "48714769a1df93198fecddb39e809871b89e210b",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From da9e28820dc670515b09f680d6ec691ea62a8391 Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Thu, 29 Nov 2018 20:02:01 -0800
Subject: [PATCH 1633/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223455238
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 067ca2ad373..8cfba5d81e5 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "fe2e0ab770a1176375b24da4e679707cd813da28ef311716d509ee9b6ad91607",
-    git_commit = "48714769a1df93198fecddb39e809871b89e210b",
+    sha256 = "a416f1bf2294f32ce0a1c75f422605923f20357b7e53c0d93064ba963fc64e73",
+    git_commit = "af4417be821c1e0e1af2d4324fd3e5cac2ac9887",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From 021265e70fe30e65a73c406c448ac3b074bce524 Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Thu, 29 Nov 2018 21:02:02 -0800
Subject: [PATCH 1634/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223459885
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 8cfba5d81e5..9dc3b8cc21d 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "a416f1bf2294f32ce0a1c75f422605923f20357b7e53c0d93064ba963fc64e73",
-    git_commit = "af4417be821c1e0e1af2d4324fd3e5cac2ac9887",
+    sha256 = "baabdd00eda97d87b62c0401067f72e912bdc6bbd1cdf6ac131cb1bec4a6b7df",
+    git_commit = "19a1dd5268a67bb2fb0c1b034e9c0d6f63db230b",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From 62d053a5b389ec7da00eab6b5bdc1c8536d23e21 Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Thu, 29 Nov 2018 22:02:22 -0800
Subject: [PATCH 1635/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223464455
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 9dc3b8cc21d..8ca391e5903 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "baabdd00eda97d87b62c0401067f72e912bdc6bbd1cdf6ac131cb1bec4a6b7df",
-    git_commit = "19a1dd5268a67bb2fb0c1b034e9c0d6f63db230b",
+    sha256 = "adbef7826eb61b8bdcc77c9d75def5185cf33bf4f1ab8b59717b1917393a30d6",
+    git_commit = "ecf27945d551bea2ebccb1262d28f2b89ecd61bd",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From a6b6d2d0d6323b4be71f5c22db62f106d0b37a54 Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Thu, 29 Nov 2018 23:02:02 -0800
Subject: [PATCH 1636/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223468847
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 8ca391e5903..5f358a81ecd 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "adbef7826eb61b8bdcc77c9d75def5185cf33bf4f1ab8b59717b1917393a30d6",
-    git_commit = "ecf27945d551bea2ebccb1262d28f2b89ecd61bd",
+    sha256 = "bf2dce2c79fb03eaedac57385e9217d6f10e09dc3f4ad60cde98a0e693d3eb13",
+    git_commit = "ba14318eee9d2bf11d49eadde9a525b5b2cfea02",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From 49216ba92aa3f4a3a021697cf1c36c298769856d Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Fri, 30 Nov 2018 00:02:20 -0800
Subject: [PATCH 1637/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223473046
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 5f358a81ecd..54de84195c2 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "bf2dce2c79fb03eaedac57385e9217d6f10e09dc3f4ad60cde98a0e693d3eb13",
-    git_commit = "ba14318eee9d2bf11d49eadde9a525b5b2cfea02",
+    sha256 = "298bb33d776ca8ff6da066b72e433dcb3347b3f9b15be4d1742bdbf8a03df9ac",
+    git_commit = "9bed21b402bba91254e341b0645c8a1d3d399f5a",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From 1a03c8512fd5ab35c1df2f46dbe3e6775cb2ea98 Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Fri, 30 Nov 2018 03:02:16 -0800
Subject: [PATCH 1638/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223490015
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 54de84195c2..76c4b252bed 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "298bb33d776ca8ff6da066b72e433dcb3347b3f9b15be4d1742bdbf8a03df9ac",
-    git_commit = "9bed21b402bba91254e341b0645c8a1d3d399f5a",
+    sha256 = "2b9d0f427aabc166f740349f302bd9762b474a80d9cac26a5a3d8fcb13100cd9",
+    git_commit = "9ac3f6152458c762a620e61d9fbc248b2357dfb6",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From af13144bcbd99ec49a08f3f49b891562027ac1a6 Mon Sep 17 00:00:00 2001
From: gvasudevan 
Date: Fri, 30 Nov 2018 08:59:21 -0800
Subject: [PATCH 1639/8103] Internal change

PiperOrigin-RevId: 223523050
---
 tensorflow_serving/workspace.bzl | 99 ++++++++++++++------------------
 1 file changed, 44 insertions(+), 55 deletions(-)

diff --git a/tensorflow_serving/workspace.bzl b/tensorflow_serving/workspace.bzl
index 6af90cf3c24..5d055628dbc 100644
--- a/tensorflow_serving/workspace.bzl
+++ b/tensorflow_serving/workspace.bzl
@@ -1,60 +1,49 @@
 # TensorFlow Serving external dependencies that can be loaded in WORKSPACE
 # files.
 
-load('@org_tensorflow//tensorflow:workspace.bzl', 'tf_workspace')
+load("@org_tensorflow//tensorflow:workspace.bzl", "tf_workspace")
 
 def tf_serving_workspace():
-  '''All TensorFlow Serving external dependencies.'''
-  # The inception model's BUILD file is written as if it is the root BUILD
-  # file. We use strip_prefix to make the inception model directory the root.
-  native.http_archive(
-      name = "inception_model",
-      urls = [
-          "https://mirror.bazel.build/github.com/tensorflow/models/archive/6fc65ee60ac39be0445e5a311b40dc7ccce214d0.tar.gz",
-          "https://github.com/tensorflow/models/archive/6fc65ee60ac39be0445e5a311b40dc7ccce214d0.tar.gz",
-      ],
-      sha256 = "7a908017d60fca54c80405527576f08dbf8d130efe6a53791639ff3b26afffbc",
-      strip_prefix = "models-6fc65ee60ac39be0445e5a311b40dc7ccce214d0/research/inception",
-  )
-
-  tf_workspace(path_prefix = "", tf_repo_name = "org_tensorflow")
-
-  # ===== gRPC dependencies =====
-  native.bind(
-      name = "libssl",
-      actual = "@boringssl//:ssl",
-  )
-
-  native.bind(
-      name = "zlib",
-      actual = "@zlib_archive//:zlib",
-  )
-
-  # gRPC wants the existence of a cares dependence but its contents are not
-  # actually important since we have set GRPC_ARES=0 in tools/bazel.rc
-  native.bind(
-      name = "cares",
-      actual = "@grpc//third_party/nanopb:nanopb",
-  )
-
-  # ===== RapidJSON (rapidjson.org) dependencies =====
-  native.new_http_archive(
-      name = "com_github_tencent_rapidjson",
-      urls = [
-          "https://github.com/Tencent/rapidjson/archive/v1.1.0.zip",
-      ],
-      sha256 = "8e00c38829d6785a2dfb951bb87c6974fa07dfe488aa5b25deec4b8bc0f6a3ab",
-      strip_prefix = "rapidjson-1.1.0",
-      build_file = "third_party/rapidjson.BUILD"
-  )
-
-  # ===== libevent (libevent.org) dependencies =====
-  native.new_http_archive(
-      name = "com_github_libevent_libevent",
-      urls = [
-          "https://github.com/libevent/libevent/archive/release-2.1.8-stable.zip"
-      ],
-      sha256 = "70158101eab7ed44fd9cc34e7f247b3cae91a8e4490745d9d6eb7edc184e4d96",
-      strip_prefix = "libevent-release-2.1.8-stable",
-      build_file = "third_party/libevent.BUILD"
-  )
+    """All TensorFlow Serving external dependencies."""
+
+    tf_workspace(path_prefix = "", tf_repo_name = "org_tensorflow")
+
+    # ===== gRPC dependencies =====
+    native.bind(
+        name = "libssl",
+        actual = "@boringssl//:ssl",
+    )
+
+    native.bind(
+        name = "zlib",
+        actual = "@zlib_archive//:zlib",
+    )
+
+    # gRPC wants the existence of a cares dependence but its contents are not
+    # actually important since we have set GRPC_ARES=0 in tools/bazel.rc
+    native.bind(
+        name = "cares",
+        actual = "@grpc//third_party/nanopb:nanopb",
+    )
+
+    # ===== RapidJSON (rapidjson.org) dependencies =====
+    native.new_http_archive(
+        name = "com_github_tencent_rapidjson",
+        urls = [
+            "https://github.com/Tencent/rapidjson/archive/v1.1.0.zip",
+        ],
+        sha256 = "8e00c38829d6785a2dfb951bb87c6974fa07dfe488aa5b25deec4b8bc0f6a3ab",
+        strip_prefix = "rapidjson-1.1.0",
+        build_file = "third_party/rapidjson.BUILD",
+    )
+
+    # ===== libevent (libevent.org) dependencies =====
+    native.new_http_archive(
+        name = "com_github_libevent_libevent",
+        urls = [
+            "https://github.com/libevent/libevent/archive/release-2.1.8-stable.zip",
+        ],
+        sha256 = "70158101eab7ed44fd9cc34e7f247b3cae91a8e4490745d9d6eb7edc184e4d96",
+        strip_prefix = "libevent-release-2.1.8-stable",
+        build_file = "third_party/libevent.BUILD",
+    )

From 80aac94a1aa99f589e2a43ddb8e887bd16888012 Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Fri, 30 Nov 2018 10:01:49 -0800
Subject: [PATCH 1640/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223531987
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 76c4b252bed..c3152b76d6f 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "2b9d0f427aabc166f740349f302bd9762b474a80d9cac26a5a3d8fcb13100cd9",
-    git_commit = "9ac3f6152458c762a620e61d9fbc248b2357dfb6",
+    sha256 = "c2dd306e60fb556fa6273aef93aed5be8c521be6ca79977f1e0a4bb946fb3ae9",
+    git_commit = "5d45c7e715eb1ea8b69133da52228b34ccb3d29d",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From 8023fba48c5b47a81fec25c17ba385a720650ef8 Mon Sep 17 00:00:00 2001
From: gvasudevan 
Date: Fri, 30 Nov 2018 10:29:00 -0800
Subject: [PATCH 1641/8103] Update non-GPU images to Ubuntu 18.04

PiperOrigin-RevId: 223536597
---
 tensorflow_serving/tools/docker/Dockerfile       | 2 +-
 tensorflow_serving/tools/docker/Dockerfile.devel | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/tensorflow_serving/tools/docker/Dockerfile b/tensorflow_serving/tools/docker/Dockerfile
index 4ba889cb93c..48e5fa5ee25 100644
--- a/tensorflow_serving/tools/docker/Dockerfile
+++ b/tensorflow_serving/tools/docker/Dockerfile
@@ -16,7 +16,7 @@ ARG TF_SERVING_VERSION=latest
 ARG TF_SERVING_BUILD_IMAGE=tensorflow/serving:${TF_SERVING_VERSION}-devel
 
 FROM ${TF_SERVING_BUILD_IMAGE} as build_image
-FROM ubuntu:16.04
+FROM ubuntu:18.04
 
 ARG TF_SERVING_VERSION_GIT_BRANCH=master
 ARG TF_SERVING_VERSION_GIT_COMMIT=head
diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel
index 9d27cccbe71..e47460f2be0 100644
--- a/tensorflow_serving/tools/docker/Dockerfile.devel
+++ b/tensorflow_serving/tools/docker/Dockerfile.devel
@@ -11,7 +11,7 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-FROM ubuntu:16.04 as base_build
+FROM ubuntu:18.04 as base_build
 
 ARG TF_SERVING_VERSION_GIT_BRANCH=master
 ARG TF_SERVING_VERSION_GIT_COMMIT=head
@@ -28,7 +28,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
         git \
         libcurl3-dev \
         libfreetype6-dev \
-        libpng12-dev \
+        libpng-dev \
         libtool \
         libzmq3-dev \
         mlocate \

From bcdb87f0ea2cb331c7b99aa65488f39f5e6eb2a7 Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Fri, 30 Nov 2018 11:14:27 -0800
Subject: [PATCH 1642/8103] No op

PiperOrigin-RevId: 223544804
---
 tensorflow_serving/model_servers/BUILD | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD
index 8d5bc96a02c..3f4c7aae2d9 100644
--- a/tensorflow_serving/model_servers/BUILD
+++ b/tensorflow_serving/model_servers/BUILD
@@ -15,6 +15,14 @@ licenses(["notice"])  # Apache 2.0
 # or other implementation details.
 package_group(name = "tensorflow_model_server_custom_op_clients")
 
+package_group(
+    name = "testing",
+    packages = [
+        # tensorflow_transform for testing only
+        "//third_party/py/tensorflow_transform/examples/...",
+    ],
+)
+
 filegroup(
     name = "all_files",
     srcs = glob(
@@ -356,7 +364,10 @@ cc_library(
 cc_binary(
     name = "tensorflow_model_server",
     stamp = 1,
-    visibility = ["//tensorflow_serving:internal"],
+    visibility = [
+        ":testing",
+        "//tensorflow_serving:internal",
+    ],
     deps = [
         ":tensorflow_model_server_main_lib",
     ],

From cb24c96cbc9d2ebe292457f466521cd3dbbc8038 Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Fri, 30 Nov 2018 12:03:51 -0800
Subject: [PATCH 1643/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223553553
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index c3152b76d6f..aca95207419 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "c2dd306e60fb556fa6273aef93aed5be8c521be6ca79977f1e0a4bb946fb3ae9",
-    git_commit = "5d45c7e715eb1ea8b69133da52228b34ccb3d29d",
+    sha256 = "7d081cf522eec21566f43e7a3c6eb325d191c8e20229d8ba7d38d3dfdc548167",
+    git_commit = "5b14577d42842871f1cb0eb8dfe77d32db1eb654",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From c658524725f7d0c6d38904ab065260e0b6a2ebba Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Fri, 30 Nov 2018 13:01:45 -0800
Subject: [PATCH 1644/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223561883
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index aca95207419..3447a85ba05 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "7d081cf522eec21566f43e7a3c6eb325d191c8e20229d8ba7d38d3dfdc548167",
-    git_commit = "5b14577d42842871f1cb0eb8dfe77d32db1eb654",
+    sha256 = "7f049bc9d9f1dbeeb395462a9f3e7643ed3867a246b695fd680cd209e76cf0fc",
+    git_commit = "a46412b9384b82593f69df04df49bfbe2c7f245c",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From 8166fb7e4d0ab0541c1df95e3d2c6aa488e89361 Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Fri, 30 Nov 2018 15:01:46 -0800
Subject: [PATCH 1645/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223581076
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 3447a85ba05..c39b75f06de 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "7f049bc9d9f1dbeeb395462a9f3e7643ed3867a246b695fd680cd209e76cf0fc",
-    git_commit = "a46412b9384b82593f69df04df49bfbe2c7f245c",
+    sha256 = "472336f315ec48e7175a6e2c54325b09a6fc9ae57d5843311ce98d9ce610e49e",
+    git_commit = "32715d16b4d810d8fe711855ee68a5279481e252",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From ad0a0ec5d9b3bf172de9ee1110bf2c2380949550 Mon Sep 17 00:00:00 2001
From: markdaoust 
Date: Fri, 30 Nov 2018 15:55:23 -0800
Subject: [PATCH 1646/8103] Remove test block

PiperOrigin-RevId: 223589068
---
 tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb b/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb
index 914318e1bfa..52ea4bf5ddb 100644
--- a/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb
+++ b/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb
@@ -196,11 +196,6 @@
         "\n",
         "testing = False\n",
         "epochs = 5\n",
-        "#BEGIN GOOGLE-INTERNAL\n",
-        "testing = os.getenv(\"WEB_TEST_BROWSER\")\n",
-        "if testing:\n",
-        "  epochs = 1 \n",
-        "#END GOOGLE-INTERNAL\n",
         "\n",
         "model.compile(optimizer=tf.train.AdamOptimizer(), \n",
         "              loss='sparse_categorical_crossentropy',\n",

From d588092fe19aa3d98d24d61e91f6e00ce67c61ad Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Fri, 30 Nov 2018 16:02:31 -0800
Subject: [PATCH 1647/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223590049
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index c39b75f06de..7cf00296887 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "472336f315ec48e7175a6e2c54325b09a6fc9ae57d5843311ce98d9ce610e49e",
-    git_commit = "32715d16b4d810d8fe711855ee68a5279481e252",
+    sha256 = "0feca2a43f9f3472b56cb39b2578a4210ba02b0db914ce2b3d90db0dfca05dc3",
+    git_commit = "767631fbcb3890d4d42b84bcac12682fb2e8a79a",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From 58a22637ef5e3c50153eb42eff652137eb18c94a Mon Sep 17 00:00:00 2001
From: haiming 
Date: Fri, 30 Nov 2018 16:03:27 -0800
Subject: [PATCH 1648/8103] Adds ModelSpec to SessionRunResponse.

PiperOrigin-RevId: 223590212
---
 tensorflow_serving/apis/session_service.proto | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/tensorflow_serving/apis/session_service.proto b/tensorflow_serving/apis/session_service.proto
index 0c42131cf58..cda4bad868c 100644
--- a/tensorflow_serving/apis/session_service.proto
+++ b/tensorflow_serving/apis/session_service.proto
@@ -30,6 +30,9 @@ message SessionRunRequest {
 }
 
 message SessionRunResponse {
+  // Effective Model Specification used for session run.
+  ModelSpec model_spec = 3;
+
   // NOTE: The order of the returned tensors may or may not match
   // the fetch order specified in RunRequest.
   repeated NamedTensorProto tensor = 1;

From 95932972affb3514fa855565087c8010410489b1 Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Fri, 30 Nov 2018 17:01:51 -0800
Subject: [PATCH 1649/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223598378
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 7cf00296887..20e7b558e37 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "0feca2a43f9f3472b56cb39b2578a4210ba02b0db914ce2b3d90db0dfca05dc3",
-    git_commit = "767631fbcb3890d4d42b84bcac12682fb2e8a79a",
+    sha256 = "816a87ee4a6b37ccadcc6f823fed532a3edbe1babc9af6100c404b4482f66eed",
+    git_commit = "644e58cd69263cd87f678d1d90ca7b7d4bfc9634",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From 9616196519c64bc9935b0203e0cf89cb72a9efe9 Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Fri, 30 Nov 2018 18:02:25 -0800
Subject: [PATCH 1650/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223604083
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 20e7b558e37..5c4ee5029e0 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "816a87ee4a6b37ccadcc6f823fed532a3edbe1babc9af6100c404b4482f66eed",
-    git_commit = "644e58cd69263cd87f678d1d90ca7b7d4bfc9634",
+    sha256 = "990698e13bf9c25024126117b9753ba10cdcaf02417d850d511857c436dd87f6",
+    git_commit = "4f3d18dc2fa32e9714a1da3118a1c0402809315c",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From a33d2e5c9d437987091edd615bf579811934897e Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Fri, 30 Nov 2018 19:02:53 -0800
Subject: [PATCH 1651/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223608413
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 5c4ee5029e0..a5671a01009 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "990698e13bf9c25024126117b9753ba10cdcaf02417d850d511857c436dd87f6",
-    git_commit = "4f3d18dc2fa32e9714a1da3118a1c0402809315c",
+    sha256 = "40549c02340d5d9cd581cf4225aa6894892b9370349a3b6bae51abf9bd8fcb94",
+    git_commit = "32f729c59e8ebae55b6c460cf863eec3bbe51256",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From fbd63912c84ed2f7500de4b10eeed7e74e9b3eed Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Fri, 30 Nov 2018 20:02:06 -0800
Subject: [PATCH 1652/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223611672
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index a5671a01009..3b1ddcb85da 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "40549c02340d5d9cd581cf4225aa6894892b9370349a3b6bae51abf9bd8fcb94",
-    git_commit = "32f729c59e8ebae55b6c460cf863eec3bbe51256",
+    sha256 = "46735cf9f85e36f61557462806d7bd34926f1b1a57dd35332f398a312e469ecf",
+    git_commit = "3d02e033aab4ba988025056d633b2aa9414c1a04",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From ae06e8330d83a5369b5bb993e988081fd96df2b8 Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Fri, 30 Nov 2018 21:01:55 -0800
Subject: [PATCH 1653/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223614749
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 3b1ddcb85da..8325ee81e83 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "46735cf9f85e36f61557462806d7bd34926f1b1a57dd35332f398a312e469ecf",
-    git_commit = "3d02e033aab4ba988025056d633b2aa9414c1a04",
+    sha256 = "718789ce5e9c8f489a312ad897aae811e495f7a5c775f2583bc8ad0fb1de970b",
+    git_commit = "e9158f0268e71b1c5e3384e6552e6083263aa4a8",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From fef45e977db674665230dd6b519b5218ab48e440 Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Fri, 30 Nov 2018 22:01:52 -0800
Subject: [PATCH 1654/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223617489
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 8325ee81e83..023837e86b3 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "718789ce5e9c8f489a312ad897aae811e495f7a5c775f2583bc8ad0fb1de970b",
-    git_commit = "e9158f0268e71b1c5e3384e6552e6083263aa4a8",
+    sha256 = "185cd150864d92b7f9cf7438d8100b9c554a996eaaad5368249c4f97b51c041b",
+    git_commit = "b69dce1d9fd31ed88abff8bf8bbbf87023655533",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From 76340ac4bcc305429b2288ca42ca0b1db3eefc55 Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Sat, 1 Dec 2018 03:01:54 -0800
Subject: [PATCH 1655/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223632081
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 023837e86b3..859d42f9359 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "185cd150864d92b7f9cf7438d8100b9c554a996eaaad5368249c4f97b51c041b",
-    git_commit = "b69dce1d9fd31ed88abff8bf8bbbf87023655533",
+    sha256 = "8eb4fa6e7e48ed5ae7a5511a07ff93e1caafbffe8701c43489c8957fab869d46",
+    git_commit = "d15b49732f9bec02571f20b2c8c3a0b62d9888fb",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From 7abcc2ff6b3a81024887857e0accd86a157d01e1 Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Sat, 1 Dec 2018 10:02:01 -0800
Subject: [PATCH 1656/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223648240
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 859d42f9359..80bb36e9859 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "8eb4fa6e7e48ed5ae7a5511a07ff93e1caafbffe8701c43489c8957fab869d46",
-    git_commit = "d15b49732f9bec02571f20b2c8c3a0b62d9888fb",
+    sha256 = "e496e31d481453ea8975e6a31288ab47028b4fea2bbac997c27ccbc9df4b929e",
+    git_commit = "35c19c850a2c0cfb13cda56a493fa9163936d66c",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From 29631fc6796dd4fc2fcc656c24221e540d150857 Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Sat, 1 Dec 2018 11:01:49 -0800
Subject: [PATCH 1657/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223650134
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 80bb36e9859..3d4a9d4982d 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "e496e31d481453ea8975e6a31288ab47028b4fea2bbac997c27ccbc9df4b929e",
-    git_commit = "35c19c850a2c0cfb13cda56a493fa9163936d66c",
+    sha256 = "a5757d57d8dc82814387f3bc48845117df2c8cf37422ae5bc2afcb37c563e3f6",
+    git_commit = "f1edf205b290c7fdeefe0b73d27c50a3cab67dcb",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From 5fe4bba90a5712066a22b5f9386f353683fc8ad1 Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Sat, 1 Dec 2018 14:01:46 -0800
Subject: [PATCH 1658/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223656667
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 3d4a9d4982d..8a5671f5ec7 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "a5757d57d8dc82814387f3bc48845117df2c8cf37422ae5bc2afcb37c563e3f6",
-    git_commit = "f1edf205b290c7fdeefe0b73d27c50a3cab67dcb",
+    sha256 = "0e94887b7f058f42dc959bd7e0cbbbd3cf5e29f09e4850b085ae886f53042f15",
+    git_commit = "a4f06947c61ef6f69057f1207c2532a3551ff4f0",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From 43187c06dbf343b3c1a5a7c072a4ab60557be7b1 Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Sat, 1 Dec 2018 20:01:48 -0800
Subject: [PATCH 1659/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223671303
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 8a5671f5ec7..6368b421755 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "0e94887b7f058f42dc959bd7e0cbbbd3cf5e29f09e4850b085ae886f53042f15",
-    git_commit = "a4f06947c61ef6f69057f1207c2532a3551ff4f0",
+    sha256 = "fc5fff8a728c8c496e17cd41144f9dfdbe79116a58c4a8edbea834117bb184eb",
+    git_commit = "e81ef04a628aceb78571b3ef5e784253e2d15501",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From b259b99fb5289cc9eb0267de9b3853960ddf5b85 Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Sun, 2 Dec 2018 03:01:58 -0800
Subject: [PATCH 1660/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223690711
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 6368b421755..885bfeb2fd8 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "fc5fff8a728c8c496e17cd41144f9dfdbe79116a58c4a8edbea834117bb184eb",
-    git_commit = "e81ef04a628aceb78571b3ef5e784253e2d15501",
+    sha256 = "f5f6a1bd5fb2209016d2411fcfff074d9d4843a277dc0bdecc53d12127914e51",
+    git_commit = "c297ff16bc798fb78e06460d00bcef52853601fd",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From b00c3d95a3a26cdfcb339faffb3e5d76cb4914fe Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Sun, 2 Dec 2018 05:02:00 -0800
Subject: [PATCH 1661/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223695921
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 885bfeb2fd8..29c3ddebeb8 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "f5f6a1bd5fb2209016d2411fcfff074d9d4843a277dc0bdecc53d12127914e51",
-    git_commit = "c297ff16bc798fb78e06460d00bcef52853601fd",
+    sha256 = "7bc0f89efbf9dbce5093dd14ae8ffe7eed268f60ad5aa600fe2be8e00760e6e5",
+    git_commit = "3188c2a38b9327e58940e7040a4ba7c72c014718",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From f1aa9ec26e64651de847f328f3f2e517e12d40cc Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Sun, 2 Dec 2018 13:01:47 -0800
Subject: [PATCH 1662/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223715749
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 29c3ddebeb8..68cdd7a92f9 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "7bc0f89efbf9dbce5093dd14ae8ffe7eed268f60ad5aa600fe2be8e00760e6e5",
-    git_commit = "3188c2a38b9327e58940e7040a4ba7c72c014718",
+    sha256 = "c5d9ab11f13b9ef14d81af2a967f7b662c87c66df5f54437e8daafcca4eeb36b",
+    git_commit = "e4e93916658de21aa4b22ca37e2629a664585852",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From fef35bccf8f84f3430845ab40a1349001cf4a99b Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Sun, 2 Dec 2018 14:02:02 -0800
Subject: [PATCH 1663/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223718657
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 68cdd7a92f9..a3cc37a070c 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "c5d9ab11f13b9ef14d81af2a967f7b662c87c66df5f54437e8daafcca4eeb36b",
-    git_commit = "e4e93916658de21aa4b22ca37e2629a664585852",
+    sha256 = "d7b728adf1f6f15975a0b9d8775be3e42f9fbc46dbb3241adb1f1cb5ccd2e761",
+    git_commit = "bd962d8cdfcda01a23c7051fa05e3db86dd9c30f",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From f5d49744b413664270e849fefa664cd579580c69 Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Sun, 2 Dec 2018 21:01:40 -0800
Subject: [PATCH 1664/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223739268
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index a3cc37a070c..734d442c6e6 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "d7b728adf1f6f15975a0b9d8775be3e42f9fbc46dbb3241adb1f1cb5ccd2e761",
-    git_commit = "bd962d8cdfcda01a23c7051fa05e3db86dd9c30f",
+    sha256 = "87a81f0980d46e0e1b36bf5efeb477eb52264840c394470d4011c275f2553d37",
+    git_commit = "bb058ae291d565aa985e3fa8437ee026ad5c10f6",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From ab83b4cc8dd1124144327e89851f483f913218b6 Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Sun, 2 Dec 2018 23:01:55 -0800
Subject: [PATCH 1665/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223746390
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 734d442c6e6..a5bb9b0cdb1 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "87a81f0980d46e0e1b36bf5efeb477eb52264840c394470d4011c275f2553d37",
-    git_commit = "bb058ae291d565aa985e3fa8437ee026ad5c10f6",
+    sha256 = "f3a6f61d975558fe4b55e41109a3b9b3e9fedcea7a72774c25c2cbead0dddd41",
+    git_commit = "2e2f34b0922f98798befbceb14a150f816390ed3",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From c1edd85482e3eacf64438533b8d4b0923796c969 Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Mon, 3 Dec 2018 01:01:53 -0800
Subject: [PATCH 1666/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223756163
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index a5bb9b0cdb1..83f87c2f71e 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "f3a6f61d975558fe4b55e41109a3b9b3e9fedcea7a72774c25c2cbead0dddd41",
-    git_commit = "2e2f34b0922f98798befbceb14a150f816390ed3",
+    sha256 = "9c6667ee838e9be5341ceaeead6feb20d1b8fa4a5b6fce20e606faf4cf53a1e7",
+    git_commit = "2ce0bec9da49d1848ff72233e187b2d12e59b182",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From fd75184f32c5c2a99ecff58b2274daae404f38d3 Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Mon, 3 Dec 2018 02:01:53 -0800
Subject: [PATCH 1667/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223762357
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 83f87c2f71e..deb42315df5 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "9c6667ee838e9be5341ceaeead6feb20d1b8fa4a5b6fce20e606faf4cf53a1e7",
-    git_commit = "2ce0bec9da49d1848ff72233e187b2d12e59b182",
+    sha256 = "5cf57c034105b4342cfccf4b5d9555f837f28343d0c086a7bf087c0c004bf117",
+    git_commit = "d8b89170d98d200d3538a6435159f561aa888015",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From 98f70f8c692786438f77560274c99937397b8938 Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Mon, 3 Dec 2018 04:01:57 -0800
Subject: [PATCH 1668/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223773190
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index deb42315df5..c86050b1f44 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "5cf57c034105b4342cfccf4b5d9555f837f28343d0c086a7bf087c0c004bf117",
-    git_commit = "d8b89170d98d200d3538a6435159f561aa888015",
+    sha256 = "c0b197373258cd11632b4b209558086e6a7636242559dda1d661a4e9f6e213cf",
+    git_commit = "6798656ce64201afe7d8d9ed5445cd5114bfd9b4",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From bb14df7095f93f8e93727899a4c13bd38bc6e63a Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Mon, 3 Dec 2018 09:01:45 -0800
Subject: [PATCH 1669/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223804399
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index c86050b1f44..2715e2dbd75 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "c0b197373258cd11632b4b209558086e6a7636242559dda1d661a4e9f6e213cf",
-    git_commit = "6798656ce64201afe7d8d9ed5445cd5114bfd9b4",
+    sha256 = "f8b6442c5f3de27f940eab9945033f232ace0344b314f59536f72372f54f9ea7",
+    git_commit = "caabd16692077c7e1e705c6bf5b5e0606b680a00",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From fc3fa4044e556827dfd1659cf2b878c85bce257f Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Mon, 3 Dec 2018 10:01:48 -0800
Subject: [PATCH 1670/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223813989
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 2715e2dbd75..acfe84fe3f3 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "f8b6442c5f3de27f940eab9945033f232ace0344b314f59536f72372f54f9ea7",
-    git_commit = "caabd16692077c7e1e705c6bf5b5e0606b680a00",
+    sha256 = "a7b5ebc10d67e0d35df5bc8a2e3768e2d735e3e6573be78bbf549cac1096e99c",
+    git_commit = "244da6a4ffa5ff8de80d18baceedcf947ef6b68e",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From df76261f38fc4ef8bbe4cd581a1912235c0ec460 Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Mon, 3 Dec 2018 11:02:17 -0800
Subject: [PATCH 1671/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223825076
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index acfe84fe3f3..8dc3c1c205f 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "a7b5ebc10d67e0d35df5bc8a2e3768e2d735e3e6573be78bbf549cac1096e99c",
-    git_commit = "244da6a4ffa5ff8de80d18baceedcf947ef6b68e",
+    sha256 = "c928ffc084a18faae775b4e4f087d3523e1e7a76733d8719c3c1a455c8b45a93",
+    git_commit = "686b8afd8ba74b95d0533076e215c8708ddec422",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From bcae8638b77854e93fb052f3169ca3df8781cc3b Mon Sep 17 00:00:00 2001
From: "A. Unique TensorFlower" 
Date: Mon, 3 Dec 2018 12:02:26 -0800
Subject: [PATCH 1672/8103] Updating TensorFlow to latest green.

PiperOrigin-RevId: 223837113
---
 WORKSPACE | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/WORKSPACE b/WORKSPACE
index 8dc3c1c205f..a53ad7a2b54 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive")
 
 tensorflow_http_archive(
     name = "org_tensorflow",
-    sha256 = "c928ffc084a18faae775b4e4f087d3523e1e7a76733d8719c3c1a455c8b45a93",
-    git_commit = "686b8afd8ba74b95d0533076e215c8708ddec422",
+    sha256 = "06c16235bc49694052b035ba146429e71db229058cd6b43c02dbaa25101d25d0",
+    git_commit = "dab4e7a725b0c92d5bad8dca683ba055d4a66584",
 )
 
 # TensorFlow depends on "io_bazel_rules_closure" so we need this here.

From da94f0ac054b8b71f9e7fbe66f34be7328db17fa Mon Sep 17 00:00:00 2001
From: robertcrowe 
Date: Mon, 3 Dec 2018 15:32:59 -0800
Subject: [PATCH 1673/8103] Fixing typo on Serving index page

PiperOrigin-RevId: 223875253
---
 tensorflow_serving/g3doc/_index.yaml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tensorflow_serving/g3doc/_index.yaml b/tensorflow_serving/g3doc/_index.yaml
index 4cda5dbbcdc..62c8d6b5a20 100644
--- a/tensorflow_serving/g3doc/_index.yaml
+++ b/tensorflow_serving/g3doc/_index.yaml
@@ -15,7 +15,7 @@ landing_page:
         provides out-of-the-box integration with TensorFlow models, but can be
         easily extended to serve other types of models and data.
         
-        h3 style='margin-top:1.5em; margin-bottom:0.5em'>Create a production pipeline
+        

Create a production pipeline

You can create a production pipeline by adding other components from TensorFlow Extended (TFX) to your TensorFlow Serving deployment. TFX includes components that enable your production deployment to monitor and validate your From 5702caf341c675e1c613d3ecbbbbe96211b0c66b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 4 Dec 2018 19:02:13 -0800 Subject: [PATCH 1674/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224086305 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a53ad7a2b54..dc59b819a58 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "06c16235bc49694052b035ba146429e71db229058cd6b43c02dbaa25101d25d0", - git_commit = "dab4e7a725b0c92d5bad8dca683ba055d4a66584", + sha256 = "ff1921608f2be24d760a9cf8bc6eb06ed0585c64c7b75a448c77b6d82bce073d", + git_commit = "8c764edcf80351e1d6a5392e9f5cfe0391556f9b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From aafbf19b1337374d0c45ba986fa70c6ef0afd1e2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 4 Dec 2018 20:02:17 -0800 Subject: [PATCH 1675/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224090992 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dc59b819a58..4e78c470534 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ff1921608f2be24d760a9cf8bc6eb06ed0585c64c7b75a448c77b6d82bce073d", - git_commit = "8c764edcf80351e1d6a5392e9f5cfe0391556f9b", + sha256 = "ef4e33fe61c6046d25515bc86111d39eab2ed8988077a9d30cc0666c87dc790c", + git_commit = "be68e120ccd8c1034760e0b52d5421a93d22a366", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 654a2e45412f1f84f5a0bfe232a36eb33b1aef15 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 4 Dec 2018 23:01:43 -0800 Subject: [PATCH 1676/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224103931 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4e78c470534..ad7c3633048 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ef4e33fe61c6046d25515bc86111d39eab2ed8988077a9d30cc0666c87dc790c", - git_commit = "be68e120ccd8c1034760e0b52d5421a93d22a366", + sha256 = "c5802c781fef7f7f63697da9bc7db262081be7835be20c037c4d050e1b8206c2", + git_commit = "2114ed7447c8239531aae073336140c8ca861303", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f87665e32c1303ba579f556abac53df7e07a3954 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Dec 2018 01:02:05 -0800 Subject: [PATCH 1677/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224113656 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ad7c3633048..6c19a22a165 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c5802c781fef7f7f63697da9bc7db262081be7835be20c037c4d050e1b8206c2", - git_commit = "2114ed7447c8239531aae073336140c8ca861303", + sha256 = "07a0b1649430dc42814ae1fffabdce6af0acbb6455894ce4f9c39555e9774568", + git_commit = "7c7ed2b64c6eeee3f92a215e872046c95d722020", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d01a8caa56d9b92f487b2812bcd199e99ae112fe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Dec 2018 02:01:46 -0800 Subject: [PATCH 1678/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224120045 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6c19a22a165..b1aaa0ed3b3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "07a0b1649430dc42814ae1fffabdce6af0acbb6455894ce4f9c39555e9774568", - git_commit = "7c7ed2b64c6eeee3f92a215e872046c95d722020", + sha256 = "5c939f4917c6e08f7c089202e43d1fa178e9b68ba01bfe4e151734d50fecef45", + git_commit = "f821b6aac05d24917efa985fdde9293bc1534470", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0485a8f4d6e2e2f3e18210daea2761b1c84659b1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Dec 2018 04:02:19 -0800 Subject: [PATCH 1679/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224130997 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b1aaa0ed3b3..90d21b6a99f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5c939f4917c6e08f7c089202e43d1fa178e9b68ba01bfe4e151734d50fecef45", - git_commit = "f821b6aac05d24917efa985fdde9293bc1534470", + sha256 = "d016fdc35466cbc14759b872e5385064d2fafbc7ec890615cfdd8209a1ecd875", + git_commit = "3a6181ae34e73301247553983b406c8e01539b01", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b6a347aabb5e63d270001de838b29817dc3f3015 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Dec 2018 09:02:28 -0800 Subject: [PATCH 1680/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224162888 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 90d21b6a99f..384d9b038ac 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d016fdc35466cbc14759b872e5385064d2fafbc7ec890615cfdd8209a1ecd875", - git_commit = "3a6181ae34e73301247553983b406c8e01539b01", + sha256 = "0b23240557d014252abad20d20e41f06bc55c485053e3d1a426a7996a74e33e2", + git_commit = "264e6520c56f588a7e0f222f657f291e4620965d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a4f9a86bef708b6aefdf1c0b7c9c6db5b5e3f5e2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Dec 2018 10:01:51 -0800 Subject: [PATCH 1681/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224172242 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 384d9b038ac..45677042231 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0b23240557d014252abad20d20e41f06bc55c485053e3d1a426a7996a74e33e2", - git_commit = "264e6520c56f588a7e0f222f657f291e4620965d", + sha256 = "198f019ebf078c11741b29da5d462b4268106b9f30d8fd082831e234d342f084", + git_commit = "56a5b2a87cc1782ee26da5a3535a61b5afd7bb8d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4cd49448719ae741573e84e1db2473661e766a18 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Dec 2018 11:02:13 -0800 Subject: [PATCH 1682/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224184926 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 45677042231..69f425a699d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "198f019ebf078c11741b29da5d462b4268106b9f30d8fd082831e234d342f084", - git_commit = "56a5b2a87cc1782ee26da5a3535a61b5afd7bb8d", + sha256 = "7fc9a59d76591e6fc22c1c48abae4b8d79e613d265a6027a4709d14928108cea", + git_commit = "3f172b5db576d548007230c385db9e8be76d540c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5031527261d62b1ef6388d4f7cac6e78a3c2c99a Mon Sep 17 00:00:00 2001 From: blamb Date: Wed, 5 Dec 2018 11:43:09 -0800 Subject: [PATCH 1683/8103] Move Community upper-tab to right. PiperOrigin-RevId: 224193154 --- tensorflow_serving/g3doc/_book.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tensorflow_serving/g3doc/_book.yaml b/tensorflow_serving/g3doc/_book.yaml index eca2c81eda0..a836f825748 100644 --- a/tensorflow_serving/g3doc/_book.yaml +++ b/tensorflow_serving/g3doc/_book.yaml @@ -40,11 +40,13 @@ upper_tabs: path: /serving/custom_source - title: SignatureDefs in SavedModel for TensorFlow Serving path: /serving/signature_defs + - name: TFX contents: - title: TFX path: /tfx status: external + - name: API skip_translation: true contents: @@ -53,3 +55,5 @@ upper_tabs: path: /serving/api_docs/cc/ - title: Client API (REST) path: /serving/api_rest/ + +- include: /_upper_tabs_right.yaml From 884d8c9cc655fcc6efec7e12d274fc4550dca60f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Dec 2018 12:03:04 -0800 Subject: [PATCH 1684/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224196902 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 69f425a699d..287d025f9e2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7fc9a59d76591e6fc22c1c48abae4b8d79e613d265a6027a4709d14928108cea", - git_commit = "3f172b5db576d548007230c385db9e8be76d540c", + sha256 = "d4467fd7d89fbf4ce960a683607196bfb5d73a5491dd0d4f6062d1485f77a5a4", + git_commit = "dd6b19f3667e7f09de0e0552e76a53eece7fa281", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9fbc00e9174a872a4488fd46661bd59d416a3c95 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Dec 2018 13:01:57 -0800 Subject: [PATCH 1685/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224206577 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 287d025f9e2..05c1b293504 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d4467fd7d89fbf4ce960a683607196bfb5d73a5491dd0d4f6062d1485f77a5a4", - git_commit = "dd6b19f3667e7f09de0e0552e76a53eece7fa281", + sha256 = "ae46228fccb13d27c0f2d1e8778a74d809ee801201cd6cb13e7468c64e6e52fb", + git_commit = "c95ca05536144451ef78ca6e2c15f0f65ebaaf95", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f6c3982340e8c673f28f2fba2bef78a76e5ec131 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Dec 2018 14:02:24 -0800 Subject: [PATCH 1686/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224217069 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 05c1b293504..f691355b934 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ae46228fccb13d27c0f2d1e8778a74d809ee801201cd6cb13e7468c64e6e52fb", - git_commit = "c95ca05536144451ef78ca6e2c15f0f65ebaaf95", + sha256 = "d73bb73509a0d7ea363b490398728db6b699b994c67b2539d3774de3a00b6723", + git_commit = "7474ffa1a67d111eb71c77da324cfc19fadbfbd7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6b7081bcb8cf7c3de66c05287cabe856c9282dca Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Dec 2018 15:01:53 -0800 Subject: [PATCH 1687/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224227720 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f691355b934..33f2f2e5ba1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d73bb73509a0d7ea363b490398728db6b699b994c67b2539d3774de3a00b6723", - git_commit = "7474ffa1a67d111eb71c77da324cfc19fadbfbd7", + sha256 = "26f839553c291fd7b9d6979cbb88e6b18262edd1cf1e7bf91daf4b5201604275", + git_commit = "249fc1e331fdee277b0b1ce0b0ef4d0ff7e47fcb", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c651eae4494f292ca1386ae5e8569559b0888d30 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Dec 2018 16:03:09 -0800 Subject: [PATCH 1688/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224237931 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 33f2f2e5ba1..7b4fb351f12 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "26f839553c291fd7b9d6979cbb88e6b18262edd1cf1e7bf91daf4b5201604275", - git_commit = "249fc1e331fdee277b0b1ce0b0ef4d0ff7e47fcb", + sha256 = "ae6e771d5147e256c306d9dfd4e742883ef1def2962c0ab984223998c14518f7", + git_commit = "c5d064bd4b1e15d811550023a17f6ac3eadbadc9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5b5e2610d6c67b1723b8fff33044ceadcb0d9435 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Dec 2018 17:01:36 -0800 Subject: [PATCH 1689/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224246821 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7b4fb351f12..f43877a87ee 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ae6e771d5147e256c306d9dfd4e742883ef1def2962c0ab984223998c14518f7", - git_commit = "c5d064bd4b1e15d811550023a17f6ac3eadbadc9", + sha256 = "873f87a45c555a4ca6666a6716ac3a3e9e5ce6bd15898d2ead861906e446bdbb", + git_commit = "f102c3c0515ac1f5e714420b780961dbcd17d058", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From caa747194ff465b4460da3594228be5e3a9a50bd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Dec 2018 18:02:11 -0800 Subject: [PATCH 1690/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224254822 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f43877a87ee..6986a259e37 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "873f87a45c555a4ca6666a6716ac3a3e9e5ce6bd15898d2ead861906e446bdbb", - git_commit = "f102c3c0515ac1f5e714420b780961dbcd17d058", + sha256 = "989fceadb586d586ce54fc63040504c33bc93c7b448f1612a83174f1423557df", + git_commit = "0c17cac8c2ce8a29c25ad23358e77b5463231abc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9329cf42ec5b02dcd536f8a8be4540713a65a97a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Dec 2018 19:01:58 -0800 Subject: [PATCH 1691/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224261200 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6986a259e37..a9b9b76b535 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "989fceadb586d586ce54fc63040504c33bc93c7b448f1612a83174f1423557df", - git_commit = "0c17cac8c2ce8a29c25ad23358e77b5463231abc", + sha256 = "d09f5b1ef5d0ccc2ae59aac7463079509b6eb85b80fafd7830f3b96da008f627", + git_commit = "b5ca1e4ab42a1b08770d54ff06c4f6b481e79ff3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c8ecda7fdaff1675152f4d6225655b1427ffb464 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Dec 2018 20:01:47 -0800 Subject: [PATCH 1692/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224266017 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a9b9b76b535..1f0810cfc60 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d09f5b1ef5d0ccc2ae59aac7463079509b6eb85b80fafd7830f3b96da008f627", - git_commit = "b5ca1e4ab42a1b08770d54ff06c4f6b481e79ff3", + sha256 = "a0d5a2924e0ca4826d8a41eefafc05ebd33187d6bfa568d5549580fbbca71350", + git_commit = "7165d2bcec13e18760aa68f3295fb6795fc995bc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 963bedacc3288742b45d8451e01a7b0f34705df1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Dec 2018 23:01:57 -0800 Subject: [PATCH 1693/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224280315 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1f0810cfc60..04234e6f35c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a0d5a2924e0ca4826d8a41eefafc05ebd33187d6bfa568d5549580fbbca71350", - git_commit = "7165d2bcec13e18760aa68f3295fb6795fc995bc", + sha256 = "c5f292fd93559b14557c2c178295ba8a5cbbc102cf6fd3d2cdd4c4dcff81c234", + git_commit = "21e223fb76cef1bcaedfcd1eac44df646da66abb", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d51ce823fcfe81044048878898a437d9f5c91284 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Dec 2018 00:01:53 -0800 Subject: [PATCH 1694/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224284536 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 04234e6f35c..f2798cd7024 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c5f292fd93559b14557c2c178295ba8a5cbbc102cf6fd3d2cdd4c4dcff81c234", - git_commit = "21e223fb76cef1bcaedfcd1eac44df646da66abb", + sha256 = "8a5f3f7326cd36041d37e05e9f72295cc0cb846deaf019079c6d8ef3be88f20c", + git_commit = "8599c9722f677e6d94c9d287a996e9cb66d148e8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e68c04fbb902899a698c9e1b70c4b1cf2a7be49e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Dec 2018 02:02:03 -0800 Subject: [PATCH 1695/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224297965 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f2798cd7024..5df21ad8778 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8a5f3f7326cd36041d37e05e9f72295cc0cb846deaf019079c6d8ef3be88f20c", - git_commit = "8599c9722f677e6d94c9d287a996e9cb66d148e8", + sha256 = "6436e8021038610438abdc1924aa3d14b07397c596e09c65bb393cb8c87039c3", + git_commit = "eaf2b9cc3edaf16855dc26f1c8947631a1680992", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d9cac8cf7099c0f7f215ddcbb38cde626fbb57f3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Dec 2018 03:02:13 -0800 Subject: [PATCH 1696/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224304425 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5df21ad8778..d16f22ce913 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6436e8021038610438abdc1924aa3d14b07397c596e09c65bb393cb8c87039c3", - git_commit = "eaf2b9cc3edaf16855dc26f1c8947631a1680992", + sha256 = "38be76ac535c0be7136aedd0d3568e52d81b7c0ff9181765951d1576afad5aec", + git_commit = "a34ba5855ea8ddcceeac5f70ff4c7693cd9ca411", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4854080c2a13f432be559cbe794444d642797776 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Dec 2018 05:01:54 -0800 Subject: [PATCH 1697/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224316540 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d16f22ce913..eddfc11751b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "38be76ac535c0be7136aedd0d3568e52d81b7c0ff9181765951d1576afad5aec", - git_commit = "a34ba5855ea8ddcceeac5f70ff4c7693cd9ca411", + sha256 = "50470e26a490fa4a4e96719928393b80ba1c4c6d9481378dd5ec1a441af504fd", + git_commit = "2c382ef260e75b399541690b9d53fc96a87fb955", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 82b33becbab805ed8407c01a3de964491752933f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Dec 2018 07:02:13 -0800 Subject: [PATCH 1698/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224330785 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index eddfc11751b..8e137a6b416 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "50470e26a490fa4a4e96719928393b80ba1c4c6d9481378dd5ec1a441af504fd", - git_commit = "2c382ef260e75b399541690b9d53fc96a87fb955", + sha256 = "8a87ad0b33ae59954e9b72235e206b3409a73527755a8702eed41976f8786cac", + git_commit = "60a23f7ee0b54aa6d2a99607ec927b6e0e687e5c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8becfcef6048a57e3b316919da7da0d30be11ae1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Dec 2018 08:02:31 -0800 Subject: [PATCH 1699/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224338550 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8e137a6b416..c35d18cb88b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8a87ad0b33ae59954e9b72235e206b3409a73527755a8702eed41976f8786cac", - git_commit = "60a23f7ee0b54aa6d2a99607ec927b6e0e687e5c", + sha256 = "dccd52030b173ee803191134215f712df7b18ee97a7c7d00437014002d29c26b", + git_commit = "8ccf1ebdbf4475bc7af6d79b2fa7e1fd8221e3fd", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b97040d195a5c4d7091d32f6714803130b739413 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Dec 2018 09:02:17 -0800 Subject: [PATCH 1700/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224347073 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c35d18cb88b..b5c64aca119 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dccd52030b173ee803191134215f712df7b18ee97a7c7d00437014002d29c26b", - git_commit = "8ccf1ebdbf4475bc7af6d79b2fa7e1fd8221e3fd", + sha256 = "3b70737b7114d89637888229619a2335ceffed1d96b40951003a29ef0e0672c5", + git_commit = "1f40e575745e1d110aa8be6c7409c209bc17408d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From af821955786678d7d4e048abb5dfbfe176680654 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Dec 2018 10:02:15 -0800 Subject: [PATCH 1701/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224357558 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b5c64aca119..96a83708887 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3b70737b7114d89637888229619a2335ceffed1d96b40951003a29ef0e0672c5", - git_commit = "1f40e575745e1d110aa8be6c7409c209bc17408d", + sha256 = "13ff2533a76417bd9cc6d607a4b91fc2bcdcd54a2ee63bf336448456491e0b79", + git_commit = "be4b5c34ecc0a99929b590cc6f956a4dc4eece55", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4203a8903b56d7b355f6185e8730764131818512 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Dec 2018 11:02:06 -0800 Subject: [PATCH 1702/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224369262 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 96a83708887..e503585365c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "13ff2533a76417bd9cc6d607a4b91fc2bcdcd54a2ee63bf336448456491e0b79", - git_commit = "be4b5c34ecc0a99929b590cc6f956a4dc4eece55", + sha256 = "47735ee8902404e819e4c05cfeaea3e58afb9b1e39937a8eec7e8bdf11cfa02b", + git_commit = "322254f7e00bb739ded8611a925cca450f214ec2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7df9401d128cbb9bf58f787b102f0bb9212dd3b5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Dec 2018 12:02:02 -0800 Subject: [PATCH 1703/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224381527 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e503585365c..fd49d031d06 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "47735ee8902404e819e4c05cfeaea3e58afb9b1e39937a8eec7e8bdf11cfa02b", - git_commit = "322254f7e00bb739ded8611a925cca450f214ec2", + sha256 = "3733ad21051d156971059e916249d86048a16691076183bc8829b9a8b6fef99d", + git_commit = "d3106e4138e28f62179cd6a7b8041729f5163190", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From faf55a3316576317dd335f457d00f490a86d2c9a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Dec 2018 13:02:31 -0800 Subject: [PATCH 1704/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224391952 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fd49d031d06..b7703a66c6a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3733ad21051d156971059e916249d86048a16691076183bc8829b9a8b6fef99d", - git_commit = "d3106e4138e28f62179cd6a7b8041729f5163190", + sha256 = "c8b8381171389bdfdad46d42ad5c64734ee77b0acf331e81741d547ed492fd92", + git_commit = "2947a2851011782a020d59ef8624d191bef5c279", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d4dfab7db98a628532cd96a2b882a87257c13298 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Dec 2018 14:02:23 -0800 Subject: [PATCH 1705/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224402999 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b7703a66c6a..7ff24e991a7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c8b8381171389bdfdad46d42ad5c64734ee77b0acf331e81741d547ed492fd92", - git_commit = "2947a2851011782a020d59ef8624d191bef5c279", + sha256 = "a3236dcb7bfe3cf51780343d5db4b6b239fff8af92b1694584b038e3eb65f7ed", + git_commit = "7a9363e16590c3a713ce06dbf5857149b460b8aa", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 71c0a2b3aa312ffa1accbf3092fc7a6a84f58a33 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Dec 2018 15:02:03 -0800 Subject: [PATCH 1706/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224414401 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7ff24e991a7..31fcf7703a0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a3236dcb7bfe3cf51780343d5db4b6b239fff8af92b1694584b038e3eb65f7ed", - git_commit = "7a9363e16590c3a713ce06dbf5857149b460b8aa", + sha256 = "3fac08970b81312e558b0b1c8afce5501a5f861eb7c917e8d1b8ab5012fce8a8", + git_commit = "3c257d337439f863759d1884c88d17c2b0d685b5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e13ce7b612250be2172735420d0966ae2edd6fa5 Mon Sep 17 00:00:00 2001 From: lapolonio Date: Thu, 6 Dec 2018 18:56:53 -0500 Subject: [PATCH 1707/8103] Need space after curl `filename` Added space to bash command to allow for copy pasting --- tensorflow_serving/g3doc/serving_kubernetes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/g3doc/serving_kubernetes.md b/tensorflow_serving/g3doc/serving_kubernetes.md index 4022025e328..2d44f464389 100644 --- a/tensorflow_serving/g3doc/serving_kubernetes.md +++ b/tensorflow_serving/g3doc/serving_kubernetes.md @@ -35,7 +35,7 @@ for the ImageNet dataset. ```shell mkdir /tmp/resnet -curl -s http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v2_fp32_savedmodel_NHWC_jpg.tar.gz| \ +curl -s http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v2_fp32_savedmodel_NHWC_jpg.tar.gz | \ tar --strip-components=2 -C /tmp/resnet -xvz ``` From b5ad917acb632409789a4bb47f2c426ecdae1eda Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Dec 2018 16:02:54 -0800 Subject: [PATCH 1708/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224425133 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 31fcf7703a0..fd122645568 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3fac08970b81312e558b0b1c8afce5501a5f861eb7c917e8d1b8ab5012fce8a8", - git_commit = "3c257d337439f863759d1884c88d17c2b0d685b5", + sha256 = "706aab39584c339ae2826a9c6e0c85ad278fd9d998eb775fac9b9f64f8e21b3f", + git_commit = "ac7864268b480abf216e437d64c1311c7d1362b5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 78615cf9c2c70ff01d6bd73afa43e9280a48530f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Dec 2018 17:02:02 -0800 Subject: [PATCH 1709/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224434467 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fd122645568..9cd292f7c7b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "706aab39584c339ae2826a9c6e0c85ad278fd9d998eb775fac9b9f64f8e21b3f", - git_commit = "ac7864268b480abf216e437d64c1311c7d1362b5", + sha256 = "e3e077949d1eb1bfcc764d4cf6f1ab450bf9008c543003fa1f4462746ba7b307", + git_commit = "d3cf56c7280629bccfd4a1015d60dd4f2fda3ac7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3250768b07eceb0c8a48f2dd139469075f219963 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Dec 2018 18:02:06 -0800 Subject: [PATCH 1710/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224441791 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9cd292f7c7b..b1ff387b0a3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e3e077949d1eb1bfcc764d4cf6f1ab450bf9008c543003fa1f4462746ba7b307", - git_commit = "d3cf56c7280629bccfd4a1015d60dd4f2fda3ac7", + sha256 = "c40004608da20cf81c67aa84d2f3550a279b757884b4a80cf5fb1bd155b4add6", + git_commit = "fe2799dfb0e92eab722d52dd8b54e8256a290753", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7a46904dbdd2d21fae43bea0df928a0e3601a102 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Dec 2018 19:02:16 -0800 Subject: [PATCH 1711/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224447909 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b1ff387b0a3..18dfeaf91a8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c40004608da20cf81c67aa84d2f3550a279b757884b4a80cf5fb1bd155b4add6", - git_commit = "fe2799dfb0e92eab722d52dd8b54e8256a290753", + sha256 = "874d3114d50ad86fb498e5ed53c0ad22c1846a134991a923e50421a3affcdfaa", + git_commit = "24cd8686127694c5fadc1abc3e5183c7f8e2bb87", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6f7973c95015b54c45eb2faa4527d5aa99cc5d96 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Dec 2018 20:01:51 -0800 Subject: [PATCH 1712/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224452613 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 18dfeaf91a8..d173af3813e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "874d3114d50ad86fb498e5ed53c0ad22c1846a134991a923e50421a3affcdfaa", - git_commit = "24cd8686127694c5fadc1abc3e5183c7f8e2bb87", + sha256 = "67489a499c9a5c567699409f6afb99fca2aaabc4a688d43b3dfb9d0088255287", + git_commit = "3640da49c3731807a3dbc27d813e8ab68a86328a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 15405ab0540e0a9cfdc552f0a0395f4eeff30522 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Dec 2018 00:02:23 -0800 Subject: [PATCH 1713/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224470084 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d173af3813e..3eaf8d3e6d8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "67489a499c9a5c567699409f6afb99fca2aaabc4a688d43b3dfb9d0088255287", - git_commit = "3640da49c3731807a3dbc27d813e8ab68a86328a", + sha256 = "93d2ba89e60abbefdd52f4d831f8133589959e0647928e707e6ce86547d34d8c", + git_commit = "faa7db2df4b467cc97fab6184faa6de5ea88f7f0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fb39cfaeae14beb7571bde1858a5c349d05fa5bd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Dec 2018 01:02:22 -0800 Subject: [PATCH 1714/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224475911 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3eaf8d3e6d8..68915f0a4f5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "93d2ba89e60abbefdd52f4d831f8133589959e0647928e707e6ce86547d34d8c", - git_commit = "faa7db2df4b467cc97fab6184faa6de5ea88f7f0", + sha256 = "a401e22c5f87993b42aa38038d838ae471e4a6e6cd93bf4a943a17eb7d26aaf8", + git_commit = "f18170fa7ab54ed7ad486d0744bcc5e19fca44c5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 85ca8eeea4d9a2859496c941fc3a06fbc391c6b2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Dec 2018 02:02:02 -0800 Subject: [PATCH 1715/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224482855 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 68915f0a4f5..ac8f543ff91 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a401e22c5f87993b42aa38038d838ae471e4a6e6cd93bf4a943a17eb7d26aaf8", - git_commit = "f18170fa7ab54ed7ad486d0744bcc5e19fca44c5", + sha256 = "a23da32ffd216098e739604d1dc81084ec3f0951bdcf0f7110f46e0d7f7d1f67", + git_commit = "c2e2ecedfef715b8f756c5e2df4dab3b88531253", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 65af743d52af050dcd20dfc6ec79d89f5bd28863 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Dec 2018 05:01:37 -0800 Subject: [PATCH 1716/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224498314 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ac8f543ff91..927c1d9aeda 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a23da32ffd216098e739604d1dc81084ec3f0951bdcf0f7110f46e0d7f7d1f67", - git_commit = "c2e2ecedfef715b8f756c5e2df4dab3b88531253", + sha256 = "f8a20732234cf7a3fa31fa5078ba1356fb0045009f7e308e17715633bd75b4f4", + git_commit = "3bd4a240020d1c62d84c1c940e8b1f5b3d838d3d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b9928101ff00831115307e9c64c10eaaafe0f537 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Dec 2018 06:02:18 -0800 Subject: [PATCH 1717/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224503171 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 927c1d9aeda..1df892884ff 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f8a20732234cf7a3fa31fa5078ba1356fb0045009f7e308e17715633bd75b4f4", - git_commit = "3bd4a240020d1c62d84c1c940e8b1f5b3d838d3d", + sha256 = "63771c0ef86d0f251e7824f683841cb50734e1e5f73b8f7fd0f4e18fdd49d97b", + git_commit = "0d3b58cfe91c6b865a14701345d7a84ce949c0e3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 771889a27e15852222ec9bea9ff6cd9d21fb4170 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Dec 2018 09:02:10 -0800 Subject: [PATCH 1718/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224523806 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1df892884ff..3b7c4d67195 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "63771c0ef86d0f251e7824f683841cb50734e1e5f73b8f7fd0f4e18fdd49d97b", - git_commit = "0d3b58cfe91c6b865a14701345d7a84ce949c0e3", + sha256 = "56ee4b036c6b72473c05de3f171a5e4acc283b8fbcddc61bf85965b033243e5f", + git_commit = "9109842678c385b4ab31825c53bf4373fcadf15e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d4fa04fc0d3ae13b25b541005acfcbe56cff15c5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Dec 2018 10:01:46 -0800 Subject: [PATCH 1719/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224532559 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3b7c4d67195..494ba4beba2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "56ee4b036c6b72473c05de3f171a5e4acc283b8fbcddc61bf85965b033243e5f", - git_commit = "9109842678c385b4ab31825c53bf4373fcadf15e", + sha256 = "254a45f294617a30c5165393b4199f794510fdf25cd57b94ef6546ae80c08548", + git_commit = "840be3029ce5ee97b345a8c317a76a68eb4e5374", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9e71a4fef5f631a1c5af12ed845e44eb5a040a09 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Dec 2018 11:02:12 -0800 Subject: [PATCH 1720/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224543783 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 494ba4beba2..347294f5e50 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "254a45f294617a30c5165393b4199f794510fdf25cd57b94ef6546ae80c08548", - git_commit = "840be3029ce5ee97b345a8c317a76a68eb4e5374", + sha256 = "f1a1178a23f4dd18df8dc36d41dc7e59e9f406df7abda5ee9ac4dc6a18ac2fc8", + git_commit = "19b07482d6a80943c832d167df6f49c0a4008462", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c5c814db0af2b49258f0a418050fea1518c99232 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Dec 2018 12:02:31 -0800 Subject: [PATCH 1721/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224555041 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 347294f5e50..8935da15228 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f1a1178a23f4dd18df8dc36d41dc7e59e9f406df7abda5ee9ac4dc6a18ac2fc8", - git_commit = "19b07482d6a80943c832d167df6f49c0a4008462", + sha256 = "398bb5252b67171d282a18f4e4a8caf97fb16ac85e5242a6bf0ff6b55324b118", + git_commit = "629834552e79edf13dbdf2306420698b3d64def2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b0df2cade120e3287635e4195d5389d6b9aed2fb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Dec 2018 13:01:48 -0800 Subject: [PATCH 1722/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224564036 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8935da15228..85b631d8f89 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "398bb5252b67171d282a18f4e4a8caf97fb16ac85e5242a6bf0ff6b55324b118", - git_commit = "629834552e79edf13dbdf2306420698b3d64def2", + sha256 = "491bfa3630a35604c7b6938e56372905b327c737c12302d85d6dde81a60546b3", + git_commit = "49aa21b5b6468309e0acef82a6a15314ba8f5a8f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c98c1acd837b2c713ef7f1b3279b297696281c72 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Dec 2018 14:02:11 -0800 Subject: [PATCH 1723/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224573557 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 85b631d8f89..99436b3ecb0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "491bfa3630a35604c7b6938e56372905b327c737c12302d85d6dde81a60546b3", - git_commit = "49aa21b5b6468309e0acef82a6a15314ba8f5a8f", + sha256 = "23761e2e281f41e31026421cd861f01fe8225fefa3c1265ba71a11f03246da0f", + git_commit = "32b16083085c0bf954228e8c9160561a576ec405", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c484f95e5054d0a264693cba295812ea06acce13 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Dec 2018 15:01:55 -0800 Subject: [PATCH 1724/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224583813 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 99436b3ecb0..72164c9d06b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "23761e2e281f41e31026421cd861f01fe8225fefa3c1265ba71a11f03246da0f", - git_commit = "32b16083085c0bf954228e8c9160561a576ec405", + sha256 = "042bffd4076906c17a4f6dbada324a2531195fef630a37dd8103a3ced8c1b2c1", + git_commit = "3377ad3dd4cb1aeb95f77b1fcfeac997ddac8959", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c060735546eb024af4e591b90ec3fc246dd00d9d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Dec 2018 16:03:03 -0800 Subject: [PATCH 1725/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224593206 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 72164c9d06b..286609d2496 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "042bffd4076906c17a4f6dbada324a2531195fef630a37dd8103a3ced8c1b2c1", - git_commit = "3377ad3dd4cb1aeb95f77b1fcfeac997ddac8959", + sha256 = "903b24939067eb05564e780e66d1f9634099797d73d9526f75a24efb49eada40", + git_commit = "cd231a62a664e577aa5171d7b3a44a04867f2035", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ebf59debada1cdb5999ff64ca21970f69265a1e9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Dec 2018 17:02:10 -0800 Subject: [PATCH 1726/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224600835 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 286609d2496..4e110df9118 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "903b24939067eb05564e780e66d1f9634099797d73d9526f75a24efb49eada40", - git_commit = "cd231a62a664e577aa5171d7b3a44a04867f2035", + sha256 = "912e0d310bfbe517f099b97d5ed127d707b53556a23f3af30c63e2e15acd71b6", + git_commit = "294ad7140234fb383e28bd059d6d761ba879c09e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c48f524656119d3d41152df64b715bfabeca9f3a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Dec 2018 18:02:12 -0800 Subject: [PATCH 1727/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224606750 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4e110df9118..d282e851f5d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "912e0d310bfbe517f099b97d5ed127d707b53556a23f3af30c63e2e15acd71b6", - git_commit = "294ad7140234fb383e28bd059d6d761ba879c09e", + sha256 = "a935a713ced2e1f16a3f86c3392961390e98a3bd82cc8f63a7bea8a9616e5720", + git_commit = "bcd4d48cee1ec070f00a401107a85ae416c57abc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ae8fc676a4e7bc484c414dda7f5d0db64b8d2499 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Dec 2018 19:01:54 -0800 Subject: [PATCH 1728/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224610892 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d282e851f5d..d4dc1aff7c6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a935a713ced2e1f16a3f86c3392961390e98a3bd82cc8f63a7bea8a9616e5720", - git_commit = "bcd4d48cee1ec070f00a401107a85ae416c57abc", + sha256 = "7fe259c99fdc941b616c8da6145d4d3d118a54404917f67086bcc775fab04a64", + git_commit = "1881396166c56fb04963683998e6a1569ebf3b19", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 822782e806d0e2c7d0ef052ab8f3e50c5df30743 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Dec 2018 22:02:08 -0800 Subject: [PATCH 1729/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224621070 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d4dc1aff7c6..d777f22dd13 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7fe259c99fdc941b616c8da6145d4d3d118a54404917f67086bcc775fab04a64", - git_commit = "1881396166c56fb04963683998e6a1569ebf3b19", + sha256 = "99874891d4c0e67aaf792fcb9f609372dfd0bdb586278de218a919639a23a0d5", + git_commit = "237851c57093edd5126561b2651f216d1726487b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From dc98f9af4501b9b266a43df05ec76e541e839746 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 8 Dec 2018 01:01:43 -0800 Subject: [PATCH 1730/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224631382 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d777f22dd13..37450f3d093 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "99874891d4c0e67aaf792fcb9f609372dfd0bdb586278de218a919639a23a0d5", - git_commit = "237851c57093edd5126561b2651f216d1726487b", + sha256 = "f209cd5cc0ab4269241f27eb554bc4caa3ead70c7c07cc04d1608269c94427a4", + git_commit = "a3f24855d6697c37f1842e097a4563d6613d906b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 97a0ff3bd6563adc951e6f9b296be28c64c24ef3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 8 Dec 2018 02:01:53 -0800 Subject: [PATCH 1731/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224635915 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 37450f3d093..32590b6e39e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f209cd5cc0ab4269241f27eb554bc4caa3ead70c7c07cc04d1608269c94427a4", - git_commit = "a3f24855d6697c37f1842e097a4563d6613d906b", + sha256 = "d4898c4352e3eadfe5af546ea86ca1f3e80b24724d95ddec10987883ca498d29", + git_commit = "ee0f5b839d47ef35b1c42321ffb7ddecc3c8a4ba", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c287919e5b5cda1e384c20f453292e473f5966bf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 8 Dec 2018 06:02:13 -0800 Subject: [PATCH 1732/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224646008 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 32590b6e39e..9e610d3f9ec 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d4898c4352e3eadfe5af546ea86ca1f3e80b24724d95ddec10987883ca498d29", - git_commit = "ee0f5b839d47ef35b1c42321ffb7ddecc3c8a4ba", + sha256 = "85cd79225f7a5bff739d3ef9f0a74cba702ddda502682fab032b519174dc7076", + git_commit = "e5bb37762ea4597b1d855e89009041b94dcc30dc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 17735352dd89af06ee937c0af47500144d2f069a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 8 Dec 2018 13:01:37 -0800 Subject: [PATCH 1733/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224664458 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9e610d3f9ec..3672517437c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "85cd79225f7a5bff739d3ef9f0a74cba702ddda502682fab032b519174dc7076", - git_commit = "e5bb37762ea4597b1d855e89009041b94dcc30dc", + sha256 = "6c7160be194490fad50c1c2bab1d0035e1efc4851af4953d8c35cf1e3d5c7580", + git_commit = "01ecd5b53121be09de84f9e3e0a09f033bd2a3ca", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d5bbf946a476f05d8da8bf19216bd1a66b380f39 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 9 Dec 2018 03:02:36 -0800 Subject: [PATCH 1734/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224704034 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3672517437c..f4fff004bef 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6c7160be194490fad50c1c2bab1d0035e1efc4851af4953d8c35cf1e3d5c7580", - git_commit = "01ecd5b53121be09de84f9e3e0a09f033bd2a3ca", + sha256 = "8da5ef34c2fc4b40da9f758173f058d2f6719aa2b6d1df5f0faf6a216b21e32f", + git_commit = "766eb63f2f3e43cd8b23c1cbb05fe63dd918ffa3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6856ccea6db49ff204f9430987d8ab6c998e63cc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 9 Dec 2018 13:02:11 -0800 Subject: [PATCH 1735/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224731095 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f4fff004bef..6db88e6df0b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8da5ef34c2fc4b40da9f758173f058d2f6719aa2b6d1df5f0faf6a216b21e32f", - git_commit = "766eb63f2f3e43cd8b23c1cbb05fe63dd918ffa3", + sha256 = "13ee5d5227113d7760995a4750d09ed6b859370005a4675c3305e3f3e2fe6801", + git_commit = "160ad88c3a247cea08644f59d9494b45acc09af5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From dfd8f20ac635d0cf5a8d6c6476d361e53f3abe68 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 9 Dec 2018 22:02:14 -0800 Subject: [PATCH 1736/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224758076 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6db88e6df0b..3024c4b92c7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "13ee5d5227113d7760995a4750d09ed6b859370005a4675c3305e3f3e2fe6801", - git_commit = "160ad88c3a247cea08644f59d9494b45acc09af5", + sha256 = "47c06d2489d0aca21bc0d1c05dd4eae42e5bd26211ae2549f7daa0f8bbbc858e", + git_commit = "36999ac8c0d3854e1637381e689c7c0016c11364", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6ed5aa38923102b5718c5e6b99e914d825fdaacf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 9 Dec 2018 23:01:49 -0800 Subject: [PATCH 1737/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224761230 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3024c4b92c7..1e6b58ee64c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "47c06d2489d0aca21bc0d1c05dd4eae42e5bd26211ae2549f7daa0f8bbbc858e", - git_commit = "36999ac8c0d3854e1637381e689c7c0016c11364", + sha256 = "5c81ab2cf89291cc0673899f5ea05a97c648408d59be3ddab8181d15a3491e1d", + git_commit = "54b110ae4369f86518f3950f11be749df2507c29", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6470eea9c849403a18d94c11f4a268fc1cda37af Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Dec 2018 03:02:54 -0800 Subject: [PATCH 1738/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224783876 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1e6b58ee64c..f348e7fbc5f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5c81ab2cf89291cc0673899f5ea05a97c648408d59be3ddab8181d15a3491e1d", - git_commit = "54b110ae4369f86518f3950f11be749df2507c29", + sha256 = "ec72645065904855cddfd633342582706af3d82a9085f694110626824086c7aa", + git_commit = "2ae0b450a741c37959a9fb9322f79e4ad476e8b7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7ba46d69fe6eb236294f655b7f8f39cf5cbb4b73 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Dec 2018 06:01:56 -0800 Subject: [PATCH 1739/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224798929 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f348e7fbc5f..2ed7ba90dde 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ec72645065904855cddfd633342582706af3d82a9085f694110626824086c7aa", - git_commit = "2ae0b450a741c37959a9fb9322f79e4ad476e8b7", + sha256 = "4ae63c2ead54165f14b86781b53f5be7b0670a81aacb56875472da62b7ca16ef", + git_commit = "18e98e57a7b9db07017d2f4f953e3b820b2e01e6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b2231dff06ce00c6b33179c5b5767c228debe3af Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Dec 2018 07:02:23 -0800 Subject: [PATCH 1740/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224805582 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2ed7ba90dde..cd958216b6f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4ae63c2ead54165f14b86781b53f5be7b0670a81aacb56875472da62b7ca16ef", - git_commit = "18e98e57a7b9db07017d2f4f953e3b820b2e01e6", + sha256 = "a3cc06bc509c6365e453044eb21c1ef1f350387173c7e93c193033bdda6a6902", + git_commit = "8855358cff24b8b29296a01eabf3bf9bbff3509c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 101ee2a90b6bb0d2da3b9de9543af7571accea66 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Dec 2018 11:03:06 -0800 Subject: [PATCH 1741/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224844955 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cd958216b6f..b96b29bc814 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a3cc06bc509c6365e453044eb21c1ef1f350387173c7e93c193033bdda6a6902", - git_commit = "8855358cff24b8b29296a01eabf3bf9bbff3509c", + sha256 = "5c4f404b37e0a31bf38dde9db57b0d7eb8e152908ee8b55c899a7778bb2aa201", + git_commit = "1d850778ac31dfe4a6fdb0846739f3294e47b8c4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From cfef5236e7bb4cebb0cc6cd072414eb0c063ea9c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Dec 2018 12:02:12 -0800 Subject: [PATCH 1742/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224856408 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b96b29bc814..fd225d601a1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5c4f404b37e0a31bf38dde9db57b0d7eb8e152908ee8b55c899a7778bb2aa201", - git_commit = "1d850778ac31dfe4a6fdb0846739f3294e47b8c4", + sha256 = "f6962238f2908b4899db98039b97d0d67e04db6914cba692ea8cdf451e1f49ef", + git_commit = "b5cbac921ea41197faa97ec2031650cb008e0832", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 857695521f1bea5eebe2469177cecf9fa2566573 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Dec 2018 13:02:02 -0800 Subject: [PATCH 1743/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224867203 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fd225d601a1..0e7575803d9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f6962238f2908b4899db98039b97d0d67e04db6914cba692ea8cdf451e1f49ef", - git_commit = "b5cbac921ea41197faa97ec2031650cb008e0832", + sha256 = "9262f94dc570600e8d35fe90ab37b2b6eaa0b505ec319b1c3a979f293fb07cc8", + git_commit = "95358d2da35254bd0bcef84faf5094522178f4ea", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fc5262297d5770672edeb6d53da17c21085a22d6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Dec 2018 14:02:12 -0800 Subject: [PATCH 1744/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224878519 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0e7575803d9..632a0c82a45 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9262f94dc570600e8d35fe90ab37b2b6eaa0b505ec319b1c3a979f293fb07cc8", - git_commit = "95358d2da35254bd0bcef84faf5094522178f4ea", + sha256 = "f0deffbe8ccedad932f400f46b54d9b15d1ce87a32fad48db70aed081b026741", + git_commit = "c0627e1f71de4cc1473899dfa5fad1c1666327f8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5653be78d3091502989e83708d2961a8f98360c2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Dec 2018 15:02:14 -0800 Subject: [PATCH 1745/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224890132 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 632a0c82a45..6c9c0565d96 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f0deffbe8ccedad932f400f46b54d9b15d1ce87a32fad48db70aed081b026741", - git_commit = "c0627e1f71de4cc1473899dfa5fad1c1666327f8", + sha256 = "47cdbd36fa1dbe82a2a051a398482bb19487e99e945c15150c71c2e814625201", + git_commit = "341452772c51cf66fc8785081437cddc38ce1081", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9fe6240194f5550470c01fe6dc174bf3dc16919b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Dec 2018 16:02:29 -0800 Subject: [PATCH 1746/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224901032 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6c9c0565d96..3c15b0f449f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "47cdbd36fa1dbe82a2a051a398482bb19487e99e945c15150c71c2e814625201", - git_commit = "341452772c51cf66fc8785081437cddc38ce1081", + sha256 = "7eedebd7871b6afb696f99592603c6d02dee0e36c0d0c8a3e67b84eaac377c2a", + git_commit = "a571aba264f9cc2e8273a4411b193229efce34cb", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ffa5c88ca4f0a606dc72618fe4ae95fb2e77c52c Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Mon, 10 Dec 2018 16:13:19 -0800 Subject: [PATCH 1747/8103] Update release notes PiperOrigin-RevId: 224903015 --- RELEASE.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/RELEASE.md b/RELEASE.md index e1788368dcb..f64e8bed6bc 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,3 +1,30 @@ +# Release 1.12.0 + +## Major Features and Improvements +* Add new REST API to [get model status](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/g3doc/api_rest.md#model-status-api) from ModelServer (commit: 00e459f1604c40c073cbb9cb92d72cb6a88be9cd) +* Add new REST API to [get model metadata](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/g3doc/api_rest.md#model-metadata-api) from ModelServer (fixes #1115) (commit: 97687024c3b7515d2f2979c35054f44c8f84d146) +* Support accepting gzipped REST API requests (fixes #1091) (commit: b94f6c89335782a7f175e8973c4f326375c55120) + +## Breaking Changes + +None + +## Bug Fixes and Other Changes + +* Update MKL build (commit: e11bd51540212242911dae00c8507e2852a5ad5a) +* Remove version pinning on pip packages (commit: 462072c2d78124c2769f820f7b63ee086de4e305) +* Update basic serving tutorials (commit: 33a4b052cedc39c21107bc99a090b59ca64ec568) +* Replacing legacy_init_op argument in SavedModelBuilder with main_op. (commit: 2fda31f905eefd2d108e9c84b8d7d55e4e482833) +* Add git hash for version metadata of model server and add tags for dev and nightly builds. (commit: 5c7740fc3d8d5c017643a8cc40a7202717b10dd6) +* Add error messages for specific cases when json for REST requests (commit: a17c89202e68bf19f369b9cbc97db7ced283b874) +* Python examples now run in a hermetic environment with all required dependencies (commit: 793fd90ee41ac34fa4c9261eef2d2c908dca9735) + +## Thanks to our Contributors + +This release contains contributions from many people at Google, as well as: + +Charles Verge, demfier, Kamidi Preetham, Lihang Li, naurril, vfdev, Yu Zheng + # Release 1.11.1 ## Bug Fixes and Other Changes From ab6f1c5ab411a9b002289b8b80d02620a28aec87 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Dec 2018 17:02:23 -0800 Subject: [PATCH 1748/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224911279 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3c15b0f449f..6cec8db3660 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7eedebd7871b6afb696f99592603c6d02dee0e36c0d0c8a3e67b84eaac377c2a", - git_commit = "a571aba264f9cc2e8273a4411b193229efce34cb", + sha256 = "9a5ce76d6abce46aecd215dd9cf982b7e10c6e351b369a396680d0d179154e73", + git_commit = "97ea1e6c5e9c1881edc7f2c1aa25d4f66ea46be9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 59b40173a6e5dd2e178d4baa4ac994342b8207a4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Dec 2018 18:02:13 -0800 Subject: [PATCH 1749/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224919279 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6cec8db3660..a0f238f5bb1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9a5ce76d6abce46aecd215dd9cf982b7e10c6e351b369a396680d0d179154e73", - git_commit = "97ea1e6c5e9c1881edc7f2c1aa25d4f66ea46be9", + sha256 = "e280ef6d34999934e74afbe590a1f9e8603e5fcab8685c5e59bc6178ae2a0d63", + git_commit = "c136aa8255c2abfc068db18fff7c043e9da324db", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d87f21ced1c22403f261943157601d7a4067ebf4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Dec 2018 19:02:16 -0800 Subject: [PATCH 1750/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224925988 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a0f238f5bb1..25c36247520 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e280ef6d34999934e74afbe590a1f9e8603e5fcab8685c5e59bc6178ae2a0d63", - git_commit = "c136aa8255c2abfc068db18fff7c043e9da324db", + sha256 = "aa9e8f9ca48457340240c405cdf957e13572bbb37100dee533114a4b5ae90f64", + git_commit = "e5165302eb1593b8f52eb15c8668e1c81cc771ae", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From bd29888fa9b66b9dd28300e12af6c9dc7cedf297 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Dec 2018 20:02:53 -0800 Subject: [PATCH 1751/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224930994 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 25c36247520..77071eceb4e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "aa9e8f9ca48457340240c405cdf957e13572bbb37100dee533114a4b5ae90f64", - git_commit = "e5165302eb1593b8f52eb15c8668e1c81cc771ae", + sha256 = "84df33512d8faeaaf4fa17aa1398ec5e70a64df1b61a7bb89554b3bc85ddf3b2", + git_commit = "ce6087616869670e0331cd4c873a0eb3d2296e0e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7cc2db854d5cf992c467a60c6bdf66796f0aeca6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Dec 2018 21:01:44 -0800 Subject: [PATCH 1752/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224935547 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 77071eceb4e..a17fdc9e3e3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "84df33512d8faeaaf4fa17aa1398ec5e70a64df1b61a7bb89554b3bc85ddf3b2", - git_commit = "ce6087616869670e0331cd4c873a0eb3d2296e0e", + sha256 = "2208b8296a0fb53a97c9c12b9ca0eabdb45f3d4c90ae2edea7b3f5c1e9ef3673", + git_commit = "0d822c01e54126dd7e38e9c5bb186039b736121b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5273a23c37a7980f5fc897a7d09bfc69c97c16a9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Dec 2018 22:01:54 -0800 Subject: [PATCH 1753/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224940404 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a17fdc9e3e3..4578c803cde 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2208b8296a0fb53a97c9c12b9ca0eabdb45f3d4c90ae2edea7b3f5c1e9ef3673", - git_commit = "0d822c01e54126dd7e38e9c5bb186039b736121b", + sha256 = "79399d50573d0e9accbf14b3cf3b4a88f824164ac87de178788c0cbba75a777d", + git_commit = "68834966daf6bd27add401f6d9402b5a0e3da5ec", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From bf0c8dc0af6cbd4bcfc61448536e053d632c537d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Dec 2018 01:02:29 -0800 Subject: [PATCH 1754/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224956635 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4578c803cde..9bcb2cde276 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "79399d50573d0e9accbf14b3cf3b4a88f824164ac87de178788c0cbba75a777d", - git_commit = "68834966daf6bd27add401f6d9402b5a0e3da5ec", + sha256 = "d61099656dd21e56b3730e6995d54b76c3d200727558ca5198ac893544453fb7", + git_commit = "c2255b0f32991813a4bfbcc3e1ee178a5b5eeecd", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 312e633d2f398fe128a98d7a95faaa77aec7379b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Dec 2018 02:02:02 -0800 Subject: [PATCH 1755/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224964648 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9bcb2cde276..c7afec20ab9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d61099656dd21e56b3730e6995d54b76c3d200727558ca5198ac893544453fb7", - git_commit = "c2255b0f32991813a4bfbcc3e1ee178a5b5eeecd", + sha256 = "f1921bc8635e4fc8d0adccb014ae02114686e4d1f8af3ac64b92ed6307c8ab44", + git_commit = "f5aed4f8f10fdd3c3910bdb544c882a0dc96ba14", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5661cb267294335c1ee5ff803a5b232e5ba3f496 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Dec 2018 03:02:08 -0800 Subject: [PATCH 1756/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224970860 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c7afec20ab9..89b26fe87db 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f1921bc8635e4fc8d0adccb014ae02114686e4d1f8af3ac64b92ed6307c8ab44", - git_commit = "f5aed4f8f10fdd3c3910bdb544c882a0dc96ba14", + sha256 = "312b5fc86ed47961945846719ec5b7874dcf812791ce4c42ebbaa3266f25d380", + git_commit = "221f4d23c6cffa2ad5fb492a300fafda2a640cd8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4d85b25eef420efca88df7995a26c9059263bdc6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Dec 2018 07:02:07 -0800 Subject: [PATCH 1757/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 224995502 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 89b26fe87db..bb3ff429eb7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "312b5fc86ed47961945846719ec5b7874dcf812791ce4c42ebbaa3266f25d380", - git_commit = "221f4d23c6cffa2ad5fb492a300fafda2a640cd8", + sha256 = "e8d28e8f719de1f005c8cfc98925f96a4fec14d82eaba4ac8cca2978cb459fd2", + git_commit = "0f2e0d1037be7f8423700e1d8dd455ef969cfbec", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 84299d39bdfa52d6c064b159e17c762985859108 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Dec 2018 11:02:16 -0800 Subject: [PATCH 1758/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225034071 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bb3ff429eb7..790cacb6baa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e8d28e8f719de1f005c8cfc98925f96a4fec14d82eaba4ac8cca2978cb459fd2", - git_commit = "0f2e0d1037be7f8423700e1d8dd455ef969cfbec", + sha256 = "106fdb48289f155a5fd7fda6e1c644a8151bfcd46ab2bd5e344fa8fee5884ad4", + git_commit = "73b5a64e38c0fb03eb1b860464ea48f5eb03e288", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 84fee300042291a7955d7ab8eb471ef2783924d0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Dec 2018 12:02:06 -0800 Subject: [PATCH 1759/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225045471 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 790cacb6baa..9f8dc9b345b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "106fdb48289f155a5fd7fda6e1c644a8151bfcd46ab2bd5e344fa8fee5884ad4", - git_commit = "73b5a64e38c0fb03eb1b860464ea48f5eb03e288", + sha256 = "f8341e9447e6ab1b1712005e6d1214f6ea5ac9dc5325ed3c308adb81d608aac2", + git_commit = "c99ecfa992eaa09a799e841fcdcfadd60b98f0c2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5384b71b385efb13fba1e723e733b044c1ea4b41 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Dec 2018 13:02:03 -0800 Subject: [PATCH 1760/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225055713 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9f8dc9b345b..740e2a6c289 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f8341e9447e6ab1b1712005e6d1214f6ea5ac9dc5325ed3c308adb81d608aac2", - git_commit = "c99ecfa992eaa09a799e841fcdcfadd60b98f0c2", + sha256 = "eef300e7ae0bbfdfca329cdb231e4ff9bf08aef561450dcad4c406625e070236", + git_commit = "06c60fb179befb6011ad85cf8632315c70ddcba1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c4f9343aa26831cb13758c8c178f2cba0bb1f524 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Dec 2018 14:02:22 -0800 Subject: [PATCH 1761/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225066549 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 740e2a6c289..d1685187e81 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eef300e7ae0bbfdfca329cdb231e4ff9bf08aef561450dcad4c406625e070236", - git_commit = "06c60fb179befb6011ad85cf8632315c70ddcba1", + sha256 = "63d704578cbdf1f5512d03ea9eed443cddc83688982cb53438fa11296d9b6be7", + git_commit = "f9dbe98610790fff9ccec148e3ec088bc779460f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3be6381b1f7de35dcbfa320c93f0b21320a06e19 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Dec 2018 15:02:24 -0800 Subject: [PATCH 1762/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225077253 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d1685187e81..67d2e3b3311 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "63d704578cbdf1f5512d03ea9eed443cddc83688982cb53438fa11296d9b6be7", - git_commit = "f9dbe98610790fff9ccec148e3ec088bc779460f", + sha256 = "092693a36baf4149725ab8d6eadd780dc0be4f8f672825a8c0a165fc384cea9e", + git_commit = "5dd912f2d734342441d9649a7b5259150d197f23", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4ae92c23da149d5d3183f1432eafc9c30032a4aa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Dec 2018 16:02:52 -0800 Subject: [PATCH 1763/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225087805 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 67d2e3b3311..3e06b1c3dd9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "092693a36baf4149725ab8d6eadd780dc0be4f8f672825a8c0a165fc384cea9e", - git_commit = "5dd912f2d734342441d9649a7b5259150d197f23", + sha256 = "cf5e43c8e23ed7a7e0093b80cdd5d8a2614074995562e6a3f349ee2df9899211", + git_commit = "3dfe44784dcfdc8cca87e59ce8eb1a47b9d95bfd", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 06b604d307d8154fb7a63d2e36d2c4fa280dfd07 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Dec 2018 17:02:01 -0800 Subject: [PATCH 1764/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225097477 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3e06b1c3dd9..dabf75658eb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cf5e43c8e23ed7a7e0093b80cdd5d8a2614074995562e6a3f349ee2df9899211", - git_commit = "3dfe44784dcfdc8cca87e59ce8eb1a47b9d95bfd", + sha256 = "ed6ad2245eec639cd23a52967c7e91d13dad0a8e3c6d3f2d43b4e7577872d5fc", + git_commit = "9748092a5dbc67f59983f9361c932530bbfdfe68", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 40ca4d14e4a9ebb19cf5a49a27f8637597412d49 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Dec 2018 18:02:35 -0800 Subject: [PATCH 1765/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225105295 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dabf75658eb..2f3ebd96a13 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ed6ad2245eec639cd23a52967c7e91d13dad0a8e3c6d3f2d43b4e7577872d5fc", - git_commit = "9748092a5dbc67f59983f9361c932530bbfdfe68", + sha256 = "442902c13d3438cf1ce523e3a9284db6a2f26dc682451b9689896eecc416e2c1", + git_commit = "5269f8acf996052f8fcf2587f4f929d9de67b6e4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b42339460f95ee48082a532a70ad6d2805eb9af3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Dec 2018 19:02:44 -0800 Subject: [PATCH 1766/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225111363 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2f3ebd96a13..3c89a7c2719 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "442902c13d3438cf1ce523e3a9284db6a2f26dc682451b9689896eecc416e2c1", - git_commit = "5269f8acf996052f8fcf2587f4f929d9de67b6e4", + sha256 = "0d890748f4e98b78b44ee4368c99ba660e8130c58e60ac5257646657150ecbe7", + git_commit = "0bdd941c2adca373b91b74925ccd3528a565b8bc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2f2e944eb98c73d01f923cc15d7b8cd8dd7a0f38 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Dec 2018 20:02:06 -0800 Subject: [PATCH 1767/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225116342 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3c89a7c2719..65330666ab6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0d890748f4e98b78b44ee4368c99ba660e8130c58e60ac5257646657150ecbe7", - git_commit = "0bdd941c2adca373b91b74925ccd3528a565b8bc", + sha256 = "a4e3c15bff5a32bf9ddc385f41c8f85540829be00cfc74537bea1b190e49a365", + git_commit = "8ac99aa0ec18f65f9976af0eb0e3fc2fef6536c4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 298fc94e11541b1901f66ccf3e3e6fb079d192b3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Dec 2018 21:01:46 -0800 Subject: [PATCH 1768/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225121421 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 65330666ab6..294a5230fdd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a4e3c15bff5a32bf9ddc385f41c8f85540829be00cfc74537bea1b190e49a365", - git_commit = "8ac99aa0ec18f65f9976af0eb0e3fc2fef6536c4", + sha256 = "d3057aec9310b6475b2b4ec5cff9171e725f4d17f77792a80d351d8f752e7af3", + git_commit = "c6245fa0b4efaf5e75b12e8aea4588c0d25c5519", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 123b891e97c5f05d7f793921cae62ca79716124b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Dec 2018 22:01:55 -0800 Subject: [PATCH 1769/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225126060 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 294a5230fdd..8d0c13b5500 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d3057aec9310b6475b2b4ec5cff9171e725f4d17f77792a80d351d8f752e7af3", - git_commit = "c6245fa0b4efaf5e75b12e8aea4588c0d25c5519", + sha256 = "cdfbe5904425e04a176eeb1e99835dbb48ba6274113b9ac687ba22d15700b275", + git_commit = "23810678737d40c00227252e5efffaaaa8fc94d6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9b8ebdfa5d30203e77476f282345a00e5a66d56a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Dec 2018 23:02:05 -0800 Subject: [PATCH 1770/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225130279 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8d0c13b5500..ea6861ba3b9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cdfbe5904425e04a176eeb1e99835dbb48ba6274113b9ac687ba22d15700b275", - git_commit = "23810678737d40c00227252e5efffaaaa8fc94d6", + sha256 = "6ac7d053f0bdaea88cdfc206cbcf88469431028937f6e83e081c017013988511", + git_commit = "92f67536b78895c47065fb9b35f775ee4326f9e1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e5d15f0dcbb94f86b7de5b24e49115c24f818a06 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Dec 2018 00:02:15 -0800 Subject: [PATCH 1771/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225134752 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ea6861ba3b9..5b4083c2621 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6ac7d053f0bdaea88cdfc206cbcf88469431028937f6e83e081c017013988511", - git_commit = "92f67536b78895c47065fb9b35f775ee4326f9e1", + sha256 = "5ac6197d78b70b5104af2c4c299fd1ce0e0cb7f13f9adaec87e5ff049eebf949", + git_commit = "b4c28561416e97f8029ad0c009cbe15e4fb75563", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 151fb85ead6737e111a7e70d7dd2691568d48637 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Dec 2018 01:02:16 -0800 Subject: [PATCH 1772/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225140488 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5b4083c2621..3278e5a242a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5ac6197d78b70b5104af2c4c299fd1ce0e0cb7f13f9adaec87e5ff049eebf949", - git_commit = "b4c28561416e97f8029ad0c009cbe15e4fb75563", + sha256 = "0556c04d62cd4219ec649d4418c44ea9b9e2510b5027eb774fb2f6c5ef3baddc", + git_commit = "9585202ed095ec63c1a6f947a0197fce852e9036", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 67af5f046daf79556dfc80fef5f60009d3798800 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Dec 2018 02:01:59 -0800 Subject: [PATCH 1773/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225147967 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3278e5a242a..477d93cf762 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0556c04d62cd4219ec649d4418c44ea9b9e2510b5027eb774fb2f6c5ef3baddc", - git_commit = "9585202ed095ec63c1a6f947a0197fce852e9036", + sha256 = "413b2a398c51d5764eb7fb7ce12ce9b095c42de4287ee26e24e13f8b68892f9d", + git_commit = "25337d2065bd3ef79b9018714c0cb5af46ca06dc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d1f668577e925b5f151f74f1c0f4c177c52ccc86 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Dec 2018 09:01:51 -0800 Subject: [PATCH 1774/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225195028 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 477d93cf762..7ad4df668dc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "413b2a398c51d5764eb7fb7ce12ce9b095c42de4287ee26e24e13f8b68892f9d", - git_commit = "25337d2065bd3ef79b9018714c0cb5af46ca06dc", + sha256 = "29e784a954d0d110176a973af605a9e7c516d843b1123bff7af44f2175aaf78d", + git_commit = "bf16a7511a2d29c460d4e1a771d53ef692a2d32b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7ba150023d487b6911ae58744f67b0cffc814e5e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Dec 2018 10:01:54 -0800 Subject: [PATCH 1775/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225204642 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7ad4df668dc..37d211d5832 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "29e784a954d0d110176a973af605a9e7c516d843b1123bff7af44f2175aaf78d", - git_commit = "bf16a7511a2d29c460d4e1a771d53ef692a2d32b", + sha256 = "07ea81099f74d63daf7005659e2fcdc3762959c577fbb96e3eeeb8287a5cecf6", + git_commit = "51900856e93d9708a602c01e877c1eb6488aa6f1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fa2ed951e3ec3a560f0a284708570489394d07c8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Dec 2018 11:02:01 -0800 Subject: [PATCH 1776/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225216652 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 37d211d5832..f92097fe6ae 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "07ea81099f74d63daf7005659e2fcdc3762959c577fbb96e3eeeb8287a5cecf6", - git_commit = "51900856e93d9708a602c01e877c1eb6488aa6f1", + sha256 = "155907b8d91013e22672819bac51586f683cdd1338527eb7017be8ba010667b0", + git_commit = "4a2abacb2ab8c53245ff293f23b58468f9f52db5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 272177430453925108e974e272718d47905f2e77 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Dec 2018 12:01:58 -0800 Subject: [PATCH 1777/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225227751 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f92097fe6ae..8f93d19cda6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "155907b8d91013e22672819bac51586f683cdd1338527eb7017be8ba010667b0", - git_commit = "4a2abacb2ab8c53245ff293f23b58468f9f52db5", + sha256 = "39ba4468ea1e15c4834c295ac311afd680acb50adad302a33a875fe45a2d99b0", + git_commit = "3ae0654d41b74538920d1d1cf812f83e35895fc6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 94e9503e59d6e9769f73ebb476b063306a35747d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Dec 2018 13:02:15 -0800 Subject: [PATCH 1778/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225237910 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8f93d19cda6..0ffd960d338 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "39ba4468ea1e15c4834c295ac311afd680acb50adad302a33a875fe45a2d99b0", - git_commit = "3ae0654d41b74538920d1d1cf812f83e35895fc6", + sha256 = "5deaacaef7c263294a1b792ca0ac6b8cea233663817cf7f60f1d6391211d3df6", + git_commit = "16069bf8745b029a82ee8eae194909f578b3dea0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 61fca86d83a0dd5ebcedadbaf1cf4ac7fccaee0f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Dec 2018 14:01:56 -0800 Subject: [PATCH 1779/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225249446 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0ffd960d338..e25d84c3179 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5deaacaef7c263294a1b792ca0ac6b8cea233663817cf7f60f1d6391211d3df6", - git_commit = "16069bf8745b029a82ee8eae194909f578b3dea0", + sha256 = "7eabb7009214be800a2dd8e3de4b4fab12a3d0eef91bdd5588b35fac149ea421", + git_commit = "06f9c2e7021c1154ccf1439b137172479455f5a0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fe316b8dea8112de2c912f1d55c82b0189300a47 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Dec 2018 15:02:38 -0800 Subject: [PATCH 1780/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225261520 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e25d84c3179..a98fa71202e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7eabb7009214be800a2dd8e3de4b4fab12a3d0eef91bdd5588b35fac149ea421", - git_commit = "06f9c2e7021c1154ccf1439b137172479455f5a0", + sha256 = "1bdd05dc19fcd7c98b25568254bb680ed79e9ed701a7482e31c0fd50a0827dc0", + git_commit = "686ba58692349a8f414d9a48ec1ee6ea296a9a6e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1bc7948e576883e635e4242e270ed4f7f99143d7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Dec 2018 16:02:33 -0800 Subject: [PATCH 1781/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225272235 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a98fa71202e..2bcf3cb2b9e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1bdd05dc19fcd7c98b25568254bb680ed79e9ed701a7482e31c0fd50a0827dc0", - git_commit = "686ba58692349a8f414d9a48ec1ee6ea296a9a6e", + sha256 = "32ba32a5d9a589171fae039a3c902dfe29121d8f49cae1902171405da3fb853c", + git_commit = "515f9575629a2521fe4d0e7fef3e1f252d8b8f6e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c69b116b7ed793880d74c70172b600c0b2c5bd64 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Dec 2018 17:01:59 -0800 Subject: [PATCH 1782/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225282056 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2bcf3cb2b9e..f00e1940926 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "32ba32a5d9a589171fae039a3c902dfe29121d8f49cae1902171405da3fb853c", - git_commit = "515f9575629a2521fe4d0e7fef3e1f252d8b8f6e", + sha256 = "9f1b61309326a2cea3737946752a143a9964a90cd1ed03a9f8f691b6ac8b5e59", + git_commit = "8b8adf8598b53503675447f391fdca7d0ed4f30a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4ab5a21375c5c548680796aadf55e18670fd148c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Dec 2018 18:02:35 -0800 Subject: [PATCH 1783/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225290239 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f00e1940926..16548dcb967 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9f1b61309326a2cea3737946752a143a9964a90cd1ed03a9f8f691b6ac8b5e59", - git_commit = "8b8adf8598b53503675447f391fdca7d0ed4f30a", + sha256 = "c865913a71dc96be1262ef3472a5a3454d3a6172db70cbc826ff41e27201432c", + git_commit = "00d91e7bc3111b00c2e679627362ec21dab64833", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 94ba9692c13844e970cc0b494cf9ad7434182a2d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Dec 2018 19:02:13 -0800 Subject: [PATCH 1784/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225296242 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 16548dcb967..7507cfc41b2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c865913a71dc96be1262ef3472a5a3454d3a6172db70cbc826ff41e27201432c", - git_commit = "00d91e7bc3111b00c2e679627362ec21dab64833", + sha256 = "bd4f36232670c8b928430b32c9f1b3d0734583e589a2c60fc2ab1911ed5628bb", + git_commit = "3eb7616b5459aec3dabaa4152a00de14a1fa0914", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d125798a4d9230012be9e3e00ecc14bee586b567 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Dec 2018 20:02:03 -0800 Subject: [PATCH 1785/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225301379 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7507cfc41b2..92e0406d1b2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bd4f36232670c8b928430b32c9f1b3d0734583e589a2c60fc2ab1911ed5628bb", - git_commit = "3eb7616b5459aec3dabaa4152a00de14a1fa0914", + sha256 = "e3ff1ca4caf0c4bd37c1a7227718205850f4e21eaf7edeb434c65ef35e1d09d1", + git_commit = "306cf4b2834cca1f1fc1fc58ba16c3248516dfd9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7a4fa6e8d566c6a7b1bb494e08e429dab50764fb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Dec 2018 21:01:51 -0800 Subject: [PATCH 1786/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225306382 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 92e0406d1b2..306d5f72eff 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e3ff1ca4caf0c4bd37c1a7227718205850f4e21eaf7edeb434c65ef35e1d09d1", - git_commit = "306cf4b2834cca1f1fc1fc58ba16c3248516dfd9", + sha256 = "4abd34f1452946d7317f0f243b61b1f556ab6c24351f61f5388eebef99f477ce", + git_commit = "7b9f418c374b3e919fe88e22ddcaf5528222eef7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 483620743e1f29aaf002823870e606f0305dd059 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Dec 2018 22:01:54 -0800 Subject: [PATCH 1787/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225311477 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 306d5f72eff..29d479fa76e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4abd34f1452946d7317f0f243b61b1f556ab6c24351f61f5388eebef99f477ce", - git_commit = "7b9f418c374b3e919fe88e22ddcaf5528222eef7", + sha256 = "fad312aca53da6e2255a42a61b04ab532af450447827c1f678291364d614ec73", + git_commit = "c2cb414e546556b887e28c9d0b1e4e6a2f918479", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 30b656b4f6aa851871a1402380b6ddc02e2156d4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Dec 2018 23:01:59 -0800 Subject: [PATCH 1788/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225316192 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 29d479fa76e..6cc470158e4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fad312aca53da6e2255a42a61b04ab532af450447827c1f678291364d614ec73", - git_commit = "c2cb414e546556b887e28c9d0b1e4e6a2f918479", + sha256 = "739bfcca04bd1f25192bf7c4be683614ab568adb164ad40a940b1ff6076ed478", + git_commit = "ad26fe7015ce03a08862a69b3556215b3d62911b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a44a519a25f0e0196ce0104a6c67f9ead2c84581 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Dec 2018 01:02:05 -0800 Subject: [PATCH 1789/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225327596 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6cc470158e4..d291b7a154d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "739bfcca04bd1f25192bf7c4be683614ab568adb164ad40a940b1ff6076ed478", - git_commit = "ad26fe7015ce03a08862a69b3556215b3d62911b", + sha256 = "954d556874efa2e837afe837b611cf133ae4532948d9b8da2a3f118ec1ab34e3", + git_commit = "b99d914cfc1122eab717999324032a60cc0204db", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7c008279261e70426afb28efebe885eea73b798d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Dec 2018 02:03:32 -0800 Subject: [PATCH 1790/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225336162 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d291b7a154d..de181b32113 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "954d556874efa2e837afe837b611cf133ae4532948d9b8da2a3f118ec1ab34e3", - git_commit = "b99d914cfc1122eab717999324032a60cc0204db", + sha256 = "a4ff58df240273d34c8b5a97b01ee98bcf1f60b03849ab0bb5ceecb7b8b73c25", + git_commit = "5dfb096b53315e3b4768d570e0ff31f5340a587f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9b69eef6ed18f1765c22adb475938a7c08d0ce9c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Dec 2018 05:02:01 -0800 Subject: [PATCH 1791/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225353483 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index de181b32113..0484b91141c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a4ff58df240273d34c8b5a97b01ee98bcf1f60b03849ab0bb5ceecb7b8b73c25", - git_commit = "5dfb096b53315e3b4768d570e0ff31f5340a587f", + sha256 = "3ede341a52c8bb6e3347fd78ebae0dd0b497e9b50a435e16c05fd8aa6d1fe7f3", + git_commit = "045ac6c3ca349a5aa289fec7e0f0282283112c17", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 37d7d1f09aeb528c8e952915658e8fe16f12b9b7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Dec 2018 06:02:31 -0800 Subject: [PATCH 1792/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225358641 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0484b91141c..d5adb344452 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3ede341a52c8bb6e3347fd78ebae0dd0b497e9b50a435e16c05fd8aa6d1fe7f3", - git_commit = "045ac6c3ca349a5aa289fec7e0f0282283112c17", + sha256 = "a87e3bc1d2b14a6fb1441297324c8d40b0d38b8475929d4b1d63887079fdf6f4", + git_commit = "67d2144c6b3118730090883fb7b598ba30191ab4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d592b5bc65a4bd99f699d22d4e8b547eec1ea5d5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Dec 2018 07:02:15 -0800 Subject: [PATCH 1793/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225364865 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d5adb344452..34cc4a76144 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a87e3bc1d2b14a6fb1441297324c8d40b0d38b8475929d4b1d63887079fdf6f4", - git_commit = "67d2144c6b3118730090883fb7b598ba30191ab4", + sha256 = "9d4b6aeae909bbaa7cac00bf3e8200f561219f478f80f44e073443032184becc", + git_commit = "3169f3295a9b1956c069e8708902dcdc4913cdb3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 56ac676dec07538bb554de9a9177afbc3ed245d2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Dec 2018 08:02:33 -0800 Subject: [PATCH 1794/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225372133 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 34cc4a76144..463e0b4af09 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9d4b6aeae909bbaa7cac00bf3e8200f561219f478f80f44e073443032184becc", - git_commit = "3169f3295a9b1956c069e8708902dcdc4913cdb3", + sha256 = "cd470f16117e07434fd4652af5d35d22d8e4d0d3e4e5e6e56d5de3f277ba0613", + git_commit = "199fe84d7432ad6371ea6cd5169cb604b7dc5dac", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a61f9f9de648e958245116bacddb517d41323bce Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Dec 2018 09:01:57 -0800 Subject: [PATCH 1795/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225379759 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 463e0b4af09..720f152d7cd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cd470f16117e07434fd4652af5d35d22d8e4d0d3e4e5e6e56d5de3f277ba0613", - git_commit = "199fe84d7432ad6371ea6cd5169cb604b7dc5dac", + sha256 = "811ac88a2f5d7f8bdf0565b5471dd565ffc4b65b05c0f219d063b0b32fdf4b1f", + git_commit = "04f51da57eb77486368c223412df2487c0f8f423", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a24f4da61bcc84167e56143757b531183bbbc4b2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Dec 2018 10:02:09 -0800 Subject: [PATCH 1796/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225388882 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 720f152d7cd..ee093877716 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "811ac88a2f5d7f8bdf0565b5471dd565ffc4b65b05c0f219d063b0b32fdf4b1f", - git_commit = "04f51da57eb77486368c223412df2487c0f8f423", + sha256 = "6be6b5449e91e0dbb4e7976af0d518ebb5b5e7ae4bc28beaedd579aa9b79c981", + git_commit = "e3f1e41ac6e5dc529b6d40730a0e0298223b3cc8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 60a62b1eae1ceb1e297a88283748ae067a7cdc3f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Dec 2018 11:02:21 -0800 Subject: [PATCH 1797/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225400376 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ee093877716..9c19cefc187 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6be6b5449e91e0dbb4e7976af0d518ebb5b5e7ae4bc28beaedd579aa9b79c981", - git_commit = "e3f1e41ac6e5dc529b6d40730a0e0298223b3cc8", + sha256 = "04ecd04178c477f3ba98b416bbfc6c7647b2715fae3b3de50688ebb4d81d7cf2", + git_commit = "a1ff9d7a2e4170af288e69934fd33980f9e5e40f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fc5ebc51e03942f89c4abd031cd465eae643b234 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Dec 2018 12:03:10 -0800 Subject: [PATCH 1798/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225411692 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9c19cefc187..b89c329224b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "04ecd04178c477f3ba98b416bbfc6c7647b2715fae3b3de50688ebb4d81d7cf2", - git_commit = "a1ff9d7a2e4170af288e69934fd33980f9e5e40f", + sha256 = "a4d9ff256c2cf7b4ddc7b032714d09aee4cb597c38993d275bf863bd2855a199", + git_commit = "4b83eaab63f3082cbee21a35dac1a2f89821b7f3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 80ee7c97ec8011d9a1f0f14db353696bf98d2dac Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Dec 2018 13:02:22 -0800 Subject: [PATCH 1799/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225421587 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b89c329224b..bc8fd649fd1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a4d9ff256c2cf7b4ddc7b032714d09aee4cb597c38993d275bf863bd2855a199", - git_commit = "4b83eaab63f3082cbee21a35dac1a2f89821b7f3", + sha256 = "64692a38c7295d0daacae5c3025fbf5925bb0ea8530689a63e1da39ed8647fbd", + git_commit = "bd1aaf9f95497671e43fa9436844bab2da5e0d64", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From bd331b98325189d6bfce6edffdd22b2acdd99873 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Thu, 13 Dec 2018 13:34:51 -0800 Subject: [PATCH 1800/8103] Move Half Plus Two example to TF Serving PiperOrigin-RevId: 225426867 --- .../servables/tensorflow/testdata/BUILD | 11 + .../testdata/saved_model_half_plus_two.py | 272 ++++++++++++++++++ 2 files changed, 283 insertions(+) create mode 100644 tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two.py diff --git a/tensorflow_serving/servables/tensorflow/testdata/BUILD b/tensorflow_serving/servables/tensorflow/testdata/BUILD index b5126e9c2bc..9066165b70a 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/BUILD +++ b/tensorflow_serving/servables/tensorflow/testdata/BUILD @@ -68,6 +68,17 @@ py_binary( ], ) +py_binary( + name = "saved_model_half_plus_two", + srcs = [ + "saved_model_half_plus_two.py", + ], + srcs_version = "PY2AND3", + deps = [ + "@org_tensorflow//tensorflow:tensorflow_py", + ], +) + filegroup( name = "saved_model_half_plus_two_cpu", srcs = glob( diff --git a/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two.py b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two.py new file mode 100644 index 00000000000..9aa635e088d --- /dev/null +++ b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two.py @@ -0,0 +1,272 @@ +## Copyright 2015 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +r"""Exports an example linear regression inference graph. + +Exports a TensorFlow graph to `/tmp/saved_model/half_plus_two/` based on the +`SavedModel` format. + +This graph calculates, + +\\( + y = a*x + b +\\) + +and/or, independently, + +\\( + y2 = a*x2 + c +\\) + +where `a`, `b` and `c` are variables with `a=0.5` and `b=2` and `c=3`. + +Output from this program is typically used to exercise SavedModel load and +execution code. + +To create a CPU model: + bazel run -c opt saved_model_half_plus_two -- --device=cpu + +To create GPU model: + bazel run --config=cuda -c opt saved_model_half_plus_two -- \ + --device=gpu +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import os +import sys + +# This is a placeholder for a Google-internal import. +import tensorflow as tf + +from tensorflow.python.lib.io import file_io + +FLAGS = None + + +def _write_assets(assets_directory, assets_filename): + """Writes asset files to be used with SavedModel for half plus two. + + Args: + assets_directory: The directory to which the assets should be written. + assets_filename: Name of the file to which the asset contents should be + written. + + Returns: + The path to which the assets file was written. + """ + if not file_io.file_exists(assets_directory): + file_io.recursive_create_dir(assets_directory) + + path = os.path.join( + tf.compat.as_bytes(assets_directory), tf.compat.as_bytes(assets_filename)) + file_io.write_string_to_file(path, "asset-file-contents") + return path + + +def _build_regression_signature(input_tensor, output_tensor): + """Helper function for building a regression SignatureDef.""" + input_tensor_info = tf.saved_model.utils.build_tensor_info(input_tensor) + signature_inputs = { + tf.saved_model.signature_constants.REGRESS_INPUTS: input_tensor_info + } + output_tensor_info = tf.saved_model.utils.build_tensor_info(output_tensor) + signature_outputs = { + tf.saved_model.signature_constants.REGRESS_OUTPUTS: output_tensor_info + } + return tf.saved_model.signature_def_utils.build_signature_def( + signature_inputs, signature_outputs, + tf.saved_model.signature_constants.REGRESS_METHOD_NAME) + + +# Possibly extend this to allow passing in 'classes', but for now this is +# sufficient for testing purposes. +def _build_classification_signature(input_tensor, scores_tensor): + """Helper function for building a classification SignatureDef.""" + input_tensor_info = tf.saved_model.utils.build_tensor_info(input_tensor) + signature_inputs = { + tf.saved_model.signature_constants.CLASSIFY_INPUTS: input_tensor_info + } + output_tensor_info = tf.saved_model.utils.build_tensor_info(scores_tensor) + signature_outputs = { + tf.saved_model.signature_constants.CLASSIFY_OUTPUT_SCORES: + output_tensor_info + } + return tf.saved_model.signature_def_utils.build_signature_def( + signature_inputs, signature_outputs, + tf.saved_model.signature_constants.CLASSIFY_METHOD_NAME) + + +def _generate_saved_model_for_half_plus_two(export_dir, + as_text=False, + use_main_op=False, + device_type="cpu"): + """Generates SavedModel for half plus two. + + Args: + export_dir: The directory to which the SavedModel should be written. + as_text: Writes the SavedModel protocol buffer in text format to disk. + use_main_op: Whether to supply a main op during SavedModel build time. + device_name: Device to force ops to run on. + """ + builder = tf.saved_model.builder.SavedModelBuilder(export_dir) + + device_name = "/cpu:0" + if device_type == "gpu": + device_name = "/gpu:0" + + with tf.Session( + graph=tf.Graph(), + config=tf.ConfigProto(log_device_placement=True)) as sess: + with tf.device(device_name): + # Set up the model parameters as variables to exercise variable loading + # functionality upon restore. + a = tf.Variable(0.5, name="a") + b = tf.Variable(2.0, name="b") + c = tf.Variable(3.0, name="c") + + # Create a placeholder for serialized tensorflow.Example messages to be + # fed. + serialized_tf_example = tf.placeholder(tf.string, name="tf_example") + + # Parse the tensorflow.Example looking for a feature named "x" with a + # single floating point value. + feature_configs = { + "x": tf.FixedLenFeature([1], dtype=tf.float32), + "x2": tf.FixedLenFeature([1], dtype=tf.float32, default_value=[0.0]) + } + # parse_example only works on CPU + with tf.device("/cpu:0"): + tf_example = tf.parse_example(serialized_tf_example, feature_configs) + # Use tf.identity() to assign name + x = tf.identity(tf_example["x"], name="x") + y = tf.add(tf.multiply(a, x), b) + y = tf.identity(y, name="y") + y2 = tf.add(tf.multiply(a, x), c) + y2 = tf.identity(y2, name="y2") + + x2 = tf.identity(tf_example["x2"], name="x2") + y3 = tf.add(tf.multiply(a, x2), c) + y3 = tf.identity(y3, name="y3") + + # Create an assets file that can be saved and restored as part of the + # SavedModel. + original_assets_directory = "/tmp/original/export/assets" + original_assets_filename = "foo.txt" + original_assets_filepath = _write_assets(original_assets_directory, + original_assets_filename) + + # Set up the assets collection. + assets_filepath = tf.constant(original_assets_filepath) + tf.add_to_collection(tf.GraphKeys.ASSET_FILEPATHS, assets_filepath) + filename_tensor = tf.Variable( + original_assets_filename, + name="filename_tensor", + trainable=False, + collections=[]) + assign_filename_op = filename_tensor.assign(original_assets_filename) + + # Set up the signature for Predict with input and output tensor + # specification. + predict_input_tensor = tf.saved_model.utils.build_tensor_info(x) + predict_signature_inputs = {"x": predict_input_tensor} + + predict_output_tensor = tf.saved_model.utils.build_tensor_info(y) + predict_signature_outputs = {"y": predict_output_tensor} + predict_signature_def = ( + tf.saved_model.signature_def_utils.build_signature_def( + predict_signature_inputs, predict_signature_outputs, + tf.saved_model.signature_constants.PREDICT_METHOD_NAME)) + + signature_def_map = { + "regress_x_to_y": + _build_regression_signature(serialized_tf_example, y), + "regress_x_to_y2": + _build_regression_signature(serialized_tf_example, y2), + "regress_x2_to_y3": + _build_regression_signature(x2, y3), + "classify_x_to_y": + _build_classification_signature(serialized_tf_example, y), + tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: + predict_signature_def + } + # Initialize all variables and then save the SavedModel. + sess.run(tf.global_variables_initializer()) + + if use_main_op: + builder.add_meta_graph_and_variables( + sess, [tf.saved_model.tag_constants.SERVING], + signature_def_map=signature_def_map, + assets_collection=tf.get_collection(tf.GraphKeys.ASSET_FILEPATHS), + main_op=tf.group(tf.saved_model.main_op.main_op(), + assign_filename_op)) + else: + builder.add_meta_graph_and_variables( + sess, [tf.saved_model.tag_constants.SERVING], + signature_def_map=signature_def_map, + assets_collection=tf.get_collection(tf.GraphKeys.ASSET_FILEPATHS), + main_op=tf.group(assign_filename_op)) + builder.save(as_text) + + +def main(_): + _generate_saved_model_for_half_plus_two( + FLAGS.output_dir, device_type=FLAGS.device) + print("SavedModel generated for %(device)s at: %(dir)s" % { + "device": FLAGS.device, + "dir": FLAGS.output_dir + }) + + _generate_saved_model_for_half_plus_two( + FLAGS.output_dir_pbtxt, as_text=True, device_type=FLAGS.device) + print("SavedModel generated for %(device)s at: %(dir)s" % { + "device": FLAGS.device, + "dir": FLAGS.output_dir_pbtxt + }) + + _generate_saved_model_for_half_plus_two( + FLAGS.output_dir_main_op, use_main_op=True, device_type=FLAGS.device) + print("SavedModel generated for %(device)s at: %(dir)s " % { + "device": FLAGS.device, + "dir": FLAGS.output_dir_main_op + }) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "--output_dir", + type=str, + default="/tmp/saved_model_half_plus_two", + help="Directory where to output SavedModel.") + parser.add_argument( + "--output_dir_pbtxt", + type=str, + default="/tmp/saved_model_half_plus_two_pbtxt", + help="Directory where to output the text format of SavedModel.") + parser.add_argument( + "--output_dir_main_op", + type=str, + default="/tmp/saved_model_half_plus_two_main_op", + help="Directory where to output the SavedModel with a main op.") + parser.add_argument( + "--device", + type=str, + default="cpu", + help="Force model to run on 'cpu' or 'gpu'") + FLAGS, unparsed = parser.parse_known_args() + tf.app.run(main=main, argv=[sys.argv[0]] + unparsed) From 373da3d047bf7c40a1537848bc5506ba556cde90 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Dec 2018 14:02:01 -0800 Subject: [PATCH 1801/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225431576 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bc8fd649fd1..f28f0d83064 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "64692a38c7295d0daacae5c3025fbf5925bb0ea8530689a63e1da39ed8647fbd", - git_commit = "bd1aaf9f95497671e43fa9436844bab2da5e0d64", + sha256 = "e47b69accb9a788e9932ede6d64de385e09fa8f79264e09ea81eded327ccabfb", + git_commit = "9a24e6be709eed3bad45c8a9ef0a00d9a49dd180", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c20366dbdc56b561d7e58e9ccd8a4a5bad820c05 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Dec 2018 15:02:18 -0800 Subject: [PATCH 1802/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225441828 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f28f0d83064..574f4b6dde1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e47b69accb9a788e9932ede6d64de385e09fa8f79264e09ea81eded327ccabfb", - git_commit = "9a24e6be709eed3bad45c8a9ef0a00d9a49dd180", + sha256 = "39c3c9e6c9da407aeec9a55e646c802332a250d33554d3fca94cd9fed826cb42", + git_commit = "99f853f3fb695b3757287409a3256ce6b9426da0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 124f3e888040000f1fd9e7d865871af3c36acaf8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Dec 2018 16:03:01 -0800 Subject: [PATCH 1803/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225452765 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 574f4b6dde1..2fc91363af0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "39c3c9e6c9da407aeec9a55e646c802332a250d33554d3fca94cd9fed826cb42", - git_commit = "99f853f3fb695b3757287409a3256ce6b9426da0", + sha256 = "fce9a63a460164520077d3f61b8ffb4d141fc8c40cf297a7625dc1aa090c2e3c", + git_commit = "23b92345f4f6e049b702399a34398cc690bff7c3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a731714ad6269d253d816108d75c76393561d306 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Dec 2018 17:02:00 -0800 Subject: [PATCH 1804/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225461275 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2fc91363af0..6a7c422da08 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fce9a63a460164520077d3f61b8ffb4d141fc8c40cf297a7625dc1aa090c2e3c", - git_commit = "23b92345f4f6e049b702399a34398cc690bff7c3", + sha256 = "95b3379fc0cf3d11867fa06310ee30cd6e4b3faca77d9336132785c9e618d3c2", + git_commit = "47b5a7e3e1b1b8a122536a16a463f0cc5df8d9ea", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From aeb66b66167776c945d44a1ab5b15935b39360c4 Mon Sep 17 00:00:00 2001 From: Daniel Shi Date: Thu, 13 Dec 2018 20:25:20 -0500 Subject: [PATCH 1805/8103] Update the tutorial code snippet to match the latest mnist_saved_model.py --- tensorflow_serving/g3doc/serving_basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/g3doc/serving_basic.md b/tensorflow_serving/g3doc/serving_basic.md index 9928ee4bf6d..64e099ed3c9 100644 --- a/tensorflow_serving/g3doc/serving_basic.md +++ b/tensorflow_serving/g3doc/serving_basic.md @@ -60,7 +60,7 @@ builder.add_meta_graph_and_variables( signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: classification_signature, }, - main_op=main_op) + main_op=tf.tables_initializer()) builder.save() ``` From e2a6dc8345888d00c90a4309146e08ef9b536afb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Dec 2018 18:02:24 -0800 Subject: [PATCH 1806/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225468391 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6a7c422da08..b86d93406fa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "95b3379fc0cf3d11867fa06310ee30cd6e4b3faca77d9336132785c9e618d3c2", - git_commit = "47b5a7e3e1b1b8a122536a16a463f0cc5df8d9ea", + sha256 = "ec687fed2d9049c2c512c6af641e8f67186646f7e807780f8ddc46548c4b491f", + git_commit = "97fe55e68bca159f1e2e7d5d5925f560edeac24e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a944dbe2688174e98389e65abadce08216f67934 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Dec 2018 19:02:23 -0800 Subject: [PATCH 1807/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225474231 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b86d93406fa..437b421b7c4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ec687fed2d9049c2c512c6af641e8f67186646f7e807780f8ddc46548c4b491f", - git_commit = "97fe55e68bca159f1e2e7d5d5925f560edeac24e", + sha256 = "d6779a9706eecdd53a5aeb4c11f43b8477986f0a4f79c9f363f3b4e514b0c77b", + git_commit = "45a6f48469023f1c7615f80e6d026f85350fa051", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 095824dd9819ff9b0a0d0d8f2da0aa4c5727b2ca Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Dec 2018 20:01:59 -0800 Subject: [PATCH 1808/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225479079 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 437b421b7c4..b219a9236d1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d6779a9706eecdd53a5aeb4c11f43b8477986f0a4f79c9f363f3b4e514b0c77b", - git_commit = "45a6f48469023f1c7615f80e6d026f85350fa051", + sha256 = "5819dd456aa44c97496957f5552499ac6b0c52f4aa1cad77228ad1ad1f48bc74", + git_commit = "0b0dea8cf10801e8786008bccf3269a6776ca811", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1d41a9ff7582e5101bc035cc2afd053d0829ee64 Mon Sep 17 00:00:00 2001 From: Siju Date: Fri, 14 Dec 2018 10:14:43 +0530 Subject: [PATCH 1809/8103] Update run_in_docker.sh Wrong path fixed --- tools/run_in_docker.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/run_in_docker.sh b/tools/run_in_docker.sh index 4b9f05af80a..54a912be7f5 100755 --- a/tools/run_in_docker.sh +++ b/tools/run_in_docker.sh @@ -43,7 +43,7 @@ function usage() { echo "" echo "Examples:" echo " ${progname} bazel build tensorflow_serving/model_servers:tensorflow_model_server" - echo " ${progname} python tensorflow_serving/examples/mnist_saved_model.py /tmp/mnist" + echo " ${progname} python tensorflow_serving/example/mnist_saved_model.py /tmp/mnist" echo " ${progname} -d tensorflow/serving:latest-devel bazel version" exit 1 } From 41b662fc226da29feaa9168e45862fbe53b4f8fa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Dec 2018 21:02:02 -0800 Subject: [PATCH 1810/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225483600 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b219a9236d1..95c6cdb9efb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5819dd456aa44c97496957f5552499ac6b0c52f4aa1cad77228ad1ad1f48bc74", - git_commit = "0b0dea8cf10801e8786008bccf3269a6776ca811", + sha256 = "1cf5c22b5438b20abc1eb25bb9ed0cf3ffcbe08d7f26f6ed2a05f083c225ebb0", + git_commit = "f0c4d5814ad6ecbba06bd813d94a2fefb2caba3d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b9522f0b13d45735cf731ef95ec8fb0f3354a409 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Dec 2018 22:02:11 -0800 Subject: [PATCH 1811/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225488158 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 95c6cdb9efb..69f66a65368 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1cf5c22b5438b20abc1eb25bb9ed0cf3ffcbe08d7f26f6ed2a05f083c225ebb0", - git_commit = "f0c4d5814ad6ecbba06bd813d94a2fefb2caba3d", + sha256 = "4775400554ebf8b69cbb91f09776e67c6b847a4aa03b60dce35796117b488077", + git_commit = "d050d65a63085ebb1ce9980098e5b1b3fde583e7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From af1b0d0190620e3879abaf016ae81e8c6e6c6f5c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Dec 2018 23:02:12 -0800 Subject: [PATCH 1812/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225492039 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 69f66a65368..6a0a6c20ac6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4775400554ebf8b69cbb91f09776e67c6b847a4aa03b60dce35796117b488077", - git_commit = "d050d65a63085ebb1ce9980098e5b1b3fde583e7", + sha256 = "6873f43febae695738c8d45adddb8b799723aac510059502ddaa715cd9ff8e03", + git_commit = "16f68575b53e7528e7d8fd2d6449fc8369259ab7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 57bccb6c5acfa69848070e54cbf4020afd12a65f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Dec 2018 01:02:12 -0800 Subject: [PATCH 1813/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225502320 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6a0a6c20ac6..15dc8d2b4d8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6873f43febae695738c8d45adddb8b799723aac510059502ddaa715cd9ff8e03", - git_commit = "16f68575b53e7528e7d8fd2d6449fc8369259ab7", + sha256 = "1989382f0cef7b47ffd1ae9a4ec6c654eb7cd260b345b0cdd22b9ef376420ab2", + git_commit = "040ee45aa83607fd057b21251407d20c7eb8bf18", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 950abd5f2be2c027af8fb1a49896acd5d34a348b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Dec 2018 02:01:52 -0800 Subject: [PATCH 1814/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225508867 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 15dc8d2b4d8..c7ed9eee3a4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1989382f0cef7b47ffd1ae9a4ec6c654eb7cd260b345b0cdd22b9ef376420ab2", - git_commit = "040ee45aa83607fd057b21251407d20c7eb8bf18", + sha256 = "c2ab8ebe33c03649c817505129c347487c807d87843b9efb381843cf0b2574c9", + git_commit = "c364a5d786335e2993893a6789aeec4ca6879810", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4b5de51364c39938a73acce221aa1264119f02d8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Dec 2018 03:02:06 -0800 Subject: [PATCH 1815/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225514683 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c7ed9eee3a4..f04520e4e6b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c2ab8ebe33c03649c817505129c347487c807d87843b9efb381843cf0b2574c9", - git_commit = "c364a5d786335e2993893a6789aeec4ca6879810", + sha256 = "942a690d9d62277ad4b6cf3e03ed30116a9d779526e4084dd26deed84ec87e02", + git_commit = "61e9a72b112f93461f83e868db732d30ad6665e8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fbf476d3833f92bf9af120efa20e68ddcd09fbb0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Dec 2018 07:02:59 -0800 Subject: [PATCH 1816/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225535520 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f04520e4e6b..3b824b049c5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "942a690d9d62277ad4b6cf3e03ed30116a9d779526e4084dd26deed84ec87e02", - git_commit = "61e9a72b112f93461f83e868db732d30ad6665e8", + sha256 = "a85e2d7fcda2b1d9cc564f4291ad458066d23959b1a55a6613519c453a34b411", + git_commit = "d65c7fea40861351882626a6b42e281e11f35792", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 086f997e2973f9938826402b4a838ef82a049f62 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Dec 2018 08:02:41 -0800 Subject: [PATCH 1817/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225542333 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3b824b049c5..1b0f371db46 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a85e2d7fcda2b1d9cc564f4291ad458066d23959b1a55a6613519c453a34b411", - git_commit = "d65c7fea40861351882626a6b42e281e11f35792", + sha256 = "0cefe4a209a6bac1c1869609987d74d58b9670a525ac2924de9125b4e55ae8a8", + git_commit = "7979eff9bfaf1001e4b916c9ee4c7744587e36a1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 969001fcc105987e10d84a7dafae2cc592f1b144 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Dec 2018 09:02:30 -0800 Subject: [PATCH 1818/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225550455 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1b0f371db46..86024f6529a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0cefe4a209a6bac1c1869609987d74d58b9670a525ac2924de9125b4e55ae8a8", - git_commit = "7979eff9bfaf1001e4b916c9ee4c7744587e36a1", + sha256 = "81423733f993307e9a434feeab82b3fec510c26d31d7f786bf0f2dc8c7217f0c", + git_commit = "13187e1566e74a1f9434f5bb16c0cddc076ac497", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ee9778158b1faeb07e43b3488b95efd0e3e7120c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Dec 2018 10:01:57 -0800 Subject: [PATCH 1819/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225559090 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 86024f6529a..015a1cf5ba9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "81423733f993307e9a434feeab82b3fec510c26d31d7f786bf0f2dc8c7217f0c", - git_commit = "13187e1566e74a1f9434f5bb16c0cddc076ac497", + sha256 = "4b80c0831c92b07326a64f487c544a58074a8a8b3755805f187e749963cfdc69", + git_commit = "b02f50c0ee8ca37f05cc21fe1f8e9c2d9b65d6e4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3018e37743f45def3b76f56d0597c876fb4cf949 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Dec 2018 11:02:30 -0800 Subject: [PATCH 1820/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225570067 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 015a1cf5ba9..3cb3141735d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4b80c0831c92b07326a64f487c544a58074a8a8b3755805f187e749963cfdc69", - git_commit = "b02f50c0ee8ca37f05cc21fe1f8e9c2d9b65d6e4", + sha256 = "eda372e571a3de48758cbd22d48fc95941f08500dc16a615a202f787d9f1499e", + git_commit = "1c6491126ba6d961cc367a19018a877ca3803222", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8f792532bea10d82fd3c3b126412d0546f54ae28 Mon Sep 17 00:00:00 2001 From: Karthik Vadla Date: Wed, 24 Oct 2018 12:29:03 -0700 Subject: [PATCH 1821/8103] Add MKL support Comment out installing tfserving api Update feedback changes Add back tensorflow serving api Add comments for -march flag Remove cloning of MKL, copying mkl libraries from cache Remove tensorflow session parallelism env export settings Fix arg issue Add comments Add envs Add unit tests Add MKL library paths update example bazel test update .gitignore safe delete Add MKL support Comment out installing tfserving api Update feedback changes Add back tensorflow serving api Add comments for -march flag Remove cloning of MKL, copying mkl libraries from cache Remove tensorflow session parallelism env export settings Fix arg issue Add comments Add envs Add unit tests Add MKL library paths update example bazel test update .gitignore Add feedbackc changes Roll back to 16.04 version of ubuntu change to libping12 Add saved_model_half_plus_two_mkl testdata and fix unit tests undo update mkl saved model and files Remove redundant unit tests Add feedbackc changes Remove comment Update saved_model_half_plus_two with mkl switch --- .../servables/tensorflow/testdata/BUILD | 8 + .../generate_saved_model_half_plus_two_mkl.py | 291 ++++++++++++++++++ .../testdata/saved_model_half_plus_two.py | 42 ++- .../00000123/assets/foo.txt | 1 + .../00000123/saved_model.pb | Bin 0 -> 29084 bytes .../variables/variables.data-00000-of-00001 | Bin 0 -> 36 bytes .../00000123/variables/variables.index | Bin 0 -> 349 bytes .../tools/docker/Dockerfile.devel-mkl | 128 ++++++++ .../tools/docker/Dockerfile.mkl | 98 ++++++ tensorflow_serving/tools/docker/tests/BUILD | 32 ++ .../tools/docker/tests/docker_test_lib.sh | 20 +- .../docker/tests/dockerfile_devel_gpu_test.sh | 1 + .../docker/tests/dockerfile_devel_mkl_test.sh | 44 +++ .../docker/tests/dockerfile_devel_test.sh | 1 + .../tools/docker/tests/dockerfile_gpu_test.sh | 1 + .../tools/docker/tests/dockerfile_mkl_test.sh | 43 +++ .../tools/docker/tests/dockerfile_test.sh | 1 + 17 files changed, 699 insertions(+), 12 deletions(-) create mode 100644 tensorflow_serving/servables/tensorflow/testdata/generate_saved_model_half_plus_two_mkl.py create mode 100644 tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_mkl/00000123/assets/foo.txt create mode 100644 tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_mkl/00000123/saved_model.pb create mode 100644 tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_mkl/00000123/variables/variables.data-00000-of-00001 create mode 100644 tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_mkl/00000123/variables/variables.index create mode 100644 tensorflow_serving/tools/docker/Dockerfile.devel-mkl create mode 100644 tensorflow_serving/tools/docker/Dockerfile.mkl create mode 100755 tensorflow_serving/tools/docker/tests/dockerfile_devel_mkl_test.sh create mode 100755 tensorflow_serving/tools/docker/tests/dockerfile_mkl_test.sh diff --git a/tensorflow_serving/servables/tensorflow/testdata/BUILD b/tensorflow_serving/servables/tensorflow/testdata/BUILD index 9066165b70a..0a7fade4d38 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/BUILD +++ b/tensorflow_serving/servables/tensorflow/testdata/BUILD @@ -93,6 +93,14 @@ filegroup( ), ) +filegroup( + name = "saved_model_half_plus_two_mkl", + srcs = glob( + ["saved_model_half_plus_two_mkl/**"], + ), +) + + # Note: re-generate these files with :export_half_plus_two whenever model # changes. exports_files([ diff --git a/tensorflow_serving/servables/tensorflow/testdata/generate_saved_model_half_plus_two_mkl.py b/tensorflow_serving/servables/tensorflow/testdata/generate_saved_model_half_plus_two_mkl.py new file mode 100644 index 00000000000..643f3852c87 --- /dev/null +++ b/tensorflow_serving/servables/tensorflow/testdata/generate_saved_model_half_plus_two_mkl.py @@ -0,0 +1,291 @@ +## Copyright 2015 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +r"""Exports an example linear regression inference graph. + +Exports a TensorFlow graph to `/tmp/saved_model/half_plus_two/` based on the +`SavedModel` format. + +This graph calculates, + +\\( + y = a*x + b +\\) + +and/or, independently, + +\\( + y2 = a*x2 + c +\\) + +where `a`, `b` and `c` are variables with `a=0.5` and `b=2` and `c=3`. + +Output from this program is typically used to exercise SavedModel load and +execution code. + +To create a model to use MKL optimizations: + python generate_saved_model_half_plus_two_mkl.py + +This will generate saved models in 3 different formats in /tmp directory. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import os +import sys + +import tensorflow as tf + +from tensorflow.python.lib.io import file_io + +FLAGS = None + + +def _write_assets(assets_directory, assets_filename): + """Writes asset files to be used with SavedModel for half plus two. + + Args: + assets_directory: The directory to which the assets should be written. + assets_filename: Name of the file to which the asset contents should be + written. + + Returns: + The path to which the assets file was written. + """ + if not file_io.file_exists(assets_directory): + file_io.recursive_create_dir(assets_directory) + + path = os.path.join( + tf.compat.as_bytes(assets_directory), tf.compat.as_bytes(assets_filename)) + file_io.write_string_to_file(path, "asset-file-contents") + return path + + +def _build_regression_signature(input_tensor, output_tensor): + """Helper function for building a regression SignatureDef.""" + input_tensor_info = tf.saved_model.utils.build_tensor_info(input_tensor) + signature_inputs = { + tf.saved_model.signature_constants.REGRESS_INPUTS: input_tensor_info + } + output_tensor_info = tf.saved_model.utils.build_tensor_info(output_tensor) + signature_outputs = { + tf.saved_model.signature_constants.REGRESS_OUTPUTS: output_tensor_info + } + return tf.saved_model.signature_def_utils.build_signature_def( + signature_inputs, signature_outputs, + tf.saved_model.signature_constants.REGRESS_METHOD_NAME) + + +# Possibly extend this to allow passing in 'classes', but for now this is +# sufficient for testing purposes. +def _build_classification_signature(input_tensor, scores_tensor): + """Helper function for building a classification SignatureDef.""" + input_tensor_info = tf.saved_model.utils.build_tensor_info(input_tensor) + signature_inputs = { + tf.saved_model.signature_constants.CLASSIFY_INPUTS: input_tensor_info + } + output_tensor_info = tf.saved_model.utils.build_tensor_info(scores_tensor) + signature_outputs = { + tf.saved_model.signature_constants.CLASSIFY_OUTPUT_SCORES: + output_tensor_info + } + return tf.saved_model.signature_def_utils.build_signature_def( + signature_inputs, signature_outputs, + tf.saved_model.signature_constants.CLASSIFY_METHOD_NAME) + + +def _generate_saved_model_for_half_plus_two(export_dir, + as_text=False, + use_main_op=False, + device_type="cpu"): + """Generates SavedModel for half plus two. + + Args: + export_dir: The directory to which the SavedModel should be written. + as_text: Writes the SavedModel protocol buffer in text format to disk. + use_main_op: Whether to supply a main op during SavedModel build time. + device_name: Device to force ops to run on. + """ + builder = tf.saved_model.builder.SavedModelBuilder(export_dir) + + device_name = "/cpu:0" + if device_type == "gpu": + device_name = "/gpu:0" + + with tf.Session( + graph=tf.Graph(), + config=tf.ConfigProto(log_device_placement=True)) as sess: + with tf.device(device_name): + # Set up the model parameters as variables to exercise variable loading + # functionality upon restore. + a = tf.Variable(0.5, name="a") + b = tf.Variable(2.0, name="b") + c = tf.Variable(3.0, name="c") + + # Create a placeholder for serialized tensorflow.Example messages to be + # fed. + serialized_tf_example = tf.placeholder(tf.string, name="tf_example") + + # Parse the tensorflow.Example looking for a feature named "x" with a + # single floating point value. + feature_configs = { + "x": tf.FixedLenFeature([1], dtype=tf.float32), + "x2": tf.FixedLenFeature([1], dtype=tf.float32, default_value=[0.0]) + } + # parse_example only works on CPU + with tf.device("/cpu:0"): + tf_example = tf.parse_example(serialized_tf_example, feature_configs) + # Use tf.identity() to assign name + + x = tf.identity(tf_example["x"], name="x") + + # This operation just performs a convolution + # but the output is zero. This way we can keep + # the same output as the original code but trigger MKL-DNN. + o1 = tf.keras.layers.Conv2D(1,[1,1])(tf.zeros((1,10,10,1))) + o2 = o1[0,0,0,0] + + y = o2 + tf.add(tf.multiply(a, x), b) + y = tf.identity(y, name="y") + + # This operation just performs a convolution + # but the output is zero. This way we can keep + # the same output as the original code but trigger MKL-DNN. + o3 = tf.keras.layers.Conv2D(1,[1,1])(tf.zeros((1,10,10,1))) + o4 = o3[0,0,0,0] + + y2 = o3 + tf.add(tf.multiply(a, x), c) + y2 = tf.identity(y2, name="y2") + + x2 = tf.identity(tf_example["x2"], name="x2") + + # This operation just performs a convolution + # but the output is zero. This way we can keep + # the same output as the original code but trigger MKL-DNN. + o6 = tf.keras.layers.Conv2D(1,[1,1])(tf.zeros((1,10,10,1))) + o7 = o6[0,0,0,0] + + y3 = o6 + tf.add(tf.multiply(a, x2), c) + y3 = tf.identity(y3, name="y3") + + # Create an assets file that can be saved and restored as part of the + # SavedModel. + original_assets_directory = "/tmp/original/export/assets" + original_assets_filename = "foo.txt" + original_assets_filepath = _write_assets(original_assets_directory, + original_assets_filename) + + # Set up the assets collection. + assets_filepath = tf.constant(original_assets_filepath) + tf.add_to_collection(tf.GraphKeys.ASSET_FILEPATHS, assets_filepath) + filename_tensor = tf.Variable( + original_assets_filename, + name="filename_tensor", + trainable=False, + collections=[]) + assign_filename_op = filename_tensor.assign(original_assets_filename) + + # Set up the signature for Predict with input and output tensor + # specification. + predict_input_tensor = tf.saved_model.utils.build_tensor_info(x) + predict_signature_inputs = {"x": predict_input_tensor} + + predict_output_tensor = tf.saved_model.utils.build_tensor_info(y) + predict_signature_outputs = {"y": predict_output_tensor} + predict_signature_def = ( + tf.saved_model.signature_def_utils.build_signature_def( + predict_signature_inputs, predict_signature_outputs, + tf.saved_model.signature_constants.PREDICT_METHOD_NAME)) + + signature_def_map = { + "regress_x_to_y": + _build_regression_signature(serialized_tf_example, y), + "regress_x_to_y2": + _build_regression_signature(serialized_tf_example, y2), + "regress_x2_to_y3": + _build_regression_signature(x2, y3), + "classify_x_to_y": + _build_classification_signature(serialized_tf_example, y), + tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: + predict_signature_def + } + # Initialize all variables and then save the SavedModel. + sess.run(tf.global_variables_initializer()) + + if use_main_op: + builder.add_meta_graph_and_variables( + sess, [tf.saved_model.tag_constants.SERVING], + signature_def_map=signature_def_map, + assets_collection=tf.get_collection(tf.GraphKeys.ASSET_FILEPATHS), + main_op=tf.group(tf.saved_model.main_op.main_op(), + assign_filename_op)) + else: + builder.add_meta_graph_and_variables( + sess, [tf.saved_model.tag_constants.SERVING], + signature_def_map=signature_def_map, + assets_collection=tf.get_collection(tf.GraphKeys.ASSET_FILEPATHS), + main_op=tf.group(assign_filename_op)) + builder.save(as_text) + + +def main(_): + _generate_saved_model_for_half_plus_two( + FLAGS.output_dir, device_type=FLAGS.device) + print("SavedModel generated for %(device)s at: %(dir)s" % { + "device": FLAGS.device, + "dir": FLAGS.output_dir + }) + + _generate_saved_model_for_half_plus_two( + FLAGS.output_dir_pbtxt, as_text=True, device_type=FLAGS.device) + print("SavedModel generated for %(device)s at: %(dir)s" % { + "device": FLAGS.device, + "dir": FLAGS.output_dir_pbtxt + }) + + _generate_saved_model_for_half_plus_two( + FLAGS.output_dir_main_op, use_main_op=True, device_type=FLAGS.device) + print("SavedModel generated for %(device)s at: %(dir)s " % { + "device": FLAGS.device, + "dir": FLAGS.output_dir_main_op + }) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "--output_dir", + type=str, + default="/tmp/saved_model_half_plus_two", + help="Directory where to output SavedModel.") + parser.add_argument( + "--output_dir_pbtxt", + type=str, + default="/tmp/saved_model_half_plus_two_pbtxt", + help="Directory where to output the text format of SavedModel.") + parser.add_argument( + "--output_dir_main_op", + type=str, + default="/tmp/saved_model_half_plus_two_main_op", + help="Directory where to output the SavedModel with a main op.") + parser.add_argument( + "--device", + type=str, + default="cpu", + help="Force model to run on 'cpu' or 'gpu'") + FLAGS, unparsed = parser.parse_known_args() + tf.app.run(main=main, argv=[sys.argv[0]] + unparsed) diff --git a/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two.py b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two.py index 9aa635e088d..7a84169109c 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two.py +++ b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two.py @@ -35,10 +35,13 @@ execution code. To create a CPU model: - bazel run -c opt saved_model_half_plus_two -- --device=cpu + bazel run -c opt saved_half_plus_two -- --device=cpu + +To create a CPU model with Intel MKL-DNN optimizations: + bazel run -c opt saved_half_plus_two -- --device=mkl To create GPU model: - bazel run --config=cuda -c opt saved_model_half_plus_two -- \ + bazel run --config=cuda -c opt saved_half_plus_two -- \ --device=gpu """ @@ -50,7 +53,6 @@ import os import sys -# This is a placeholder for a Google-internal import. import tensorflow as tf from tensorflow.python.lib.io import file_io @@ -154,13 +156,39 @@ def _generate_saved_model_for_half_plus_two(export_dir, tf_example = tf.parse_example(serialized_tf_example, feature_configs) # Use tf.identity() to assign name x = tf.identity(tf_example["x"], name="x") - y = tf.add(tf.multiply(a, x), b) + if device_type == "mkl": + # Create a small convolution op to trigger MKL + # The op will return 0s so this won't affect the + # resulting calculation. + o1 = tf.keras.layers.Conv2D(1,[1,1])(tf.zeros((1,16,16,1))) + y = o1[0,0,0,0] + tf.add(tf.multiply(a, x), b) + else: + y = tf.add(tf.multiply(a, x), b) + y = tf.identity(y, name="y") - y2 = tf.add(tf.multiply(a, x), c) + + if device_type == "mkl": + # Create a small convolution op to trigger MKL + # The op will return 0s so this won't affect the + # resulting calculation. + o2 = tf.keras.layers.Conv2D(1,[1,1])(tf.zeros((1,16,16,1))) + y2 = o2[0,0,0,0] + tf.add(tf.multiply(a, x), c) + else: + y2 = tf.add(tf.multiply(a, x), c) + y2 = tf.identity(y2, name="y2") x2 = tf.identity(tf_example["x2"], name="x2") - y3 = tf.add(tf.multiply(a, x2), c) + + if device_type == "mkl": + # Create a small convolution op to trigger MKL + # The op will return 0s so this won't affect the + # resulting calculation. + o3 = tf.keras.layers.Conv2D(1,[1,1])(tf.zeros((1,16,16,1))) + y3 = o3[0,0,0,0] + tf.add(tf.multiply(a, x2), c) + else: + y3 = tf.add(tf.multiply(a, x2), c) + y3 = tf.identity(y3, name="y3") # Create an assets file that can be saved and restored as part of the @@ -267,6 +295,6 @@ def main(_): "--device", type=str, default="cpu", - help="Force model to run on 'cpu' or 'gpu'") + help="Force model to run on 'cpu', 'mkl', or 'gpu'") FLAGS, unparsed = parser.parse_known_args() tf.app.run(main=main, argv=[sys.argv[0]] + unparsed) diff --git a/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_mkl/00000123/assets/foo.txt b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_mkl/00000123/assets/foo.txt new file mode 100644 index 00000000000..f9ff0366880 --- /dev/null +++ b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_mkl/00000123/assets/foo.txt @@ -0,0 +1 @@ +asset-file-contents \ No newline at end of file diff --git a/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_mkl/00000123/saved_model.pb b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_mkl/00000123/saved_model.pb new file mode 100644 index 0000000000000000000000000000000000000000..5389e6345fe0380d42abf684cba3e380763f589a GIT binary patch literal 29084 zcmeHQZ;TvAR^OhTo!Nc+zjnRewCyC!T@q(PJiEQN&mINE87Cn|#24bk0UdbMJJVhd zo}JlD&u-Q^2q4|*0HG6q#DR4D`+x*Uzz5(1pEy1N;u|1=galuZ5E4j$K=%=N)m7D9 zRo&H7z3U`G%0|xabXV8=Q}4Zc^{eVPvkv*jKRNK#4f0oKpb68jbi1Si&T-9ohyH$q zzg_(OA^xtN1H4!sKRO7SE3o7(EUh`Ea%EF{TSrSalbSd|>MPPq0VSW<( z_z0@4o*z=_C637)ly~tmWquwijCrbwr(>?0XJE}+bxPCanab?k{KDeWDp}h&TYC}a zQ4qgmFr$D|UDN65HaA?4d|ymzy?1Pkmh{Qu22-h*o}b8|Qd$L?}WhV#12c_)=| zFbIbujd}Pt2P*jJk@qU)yf;AgB8NB#mHWN^I2fgPUrTtOg^E{RTXIUZb*NGfyFp0i z`n_;`u{Rh$Upo&gRO_9??qJX!4%&MMhl%QIHK-o=-7XyuE?#pP7D@TeD{sC=X70Z7 zy|-R1s0P&QT({Tv$34`A#E6TGx@8A{;1bN<>IQ>xZ~RD>R~??js2~9HW-!_d?s_*L z1f7QmLli6|XJM@qe{3J1Irff&aI;D_fS?Y>y+OnSzq46I(_iie{Qxa<*zdNxy-}Db zg4)k_!StJl{eqse8oAET;^P%4-yVMP0N#Z1TYl#u8f+!<8ftlU=e8={0ywwHG|F+& z*>YqDT86TJ+zX?7ZfSE0{=EbXZ~3DzceyWS1%`-lB;=vCf{F1Y7liTBkTbbB4_ ze=hFMy#R~+CKJ(H;2)`LhOQgmj$(lF=msn>iu_4VueJg)vrI2FbR*6szwitwWC%o7 zPDwt0(P>s;#+!ELsRqeZLbtKr;zOX>V2|54zn9 zi*)RlTW*#%9r%9OkUDvMud{ z?SRRIA&!ScjCU9&nIM&SqTi~^Bmn_u8Qy{gf48(X-Q*m?5azJ+@oc`*a>2b;HeR7aQVy!W+W39ay*% z%@^G}RCYNOQzP9C_IiWb%&kE;I7S-N!JsQXp|A3phF>v`)EVF%u#|%jQtb>t)O~y3 z4<9C$xCXOGMZ35Oi$TBNI|zGW`pzKupiSeYcIO-&S)8mNX556^095Y5-uK`{LKdMC zxg!mi7^Tr-Sc-rXh8m>L!dw_&boJ4;#ANA~$P~@E?i}u(Xx@PLVICdn4KzTS^3V}V zQXWj0<~qZ{*zXMjg<|aqjPp3CK{qmGnHep!sA<82+Us>7Nb**AYtS3>Swv5^Fw0v) zo%WIzn?N580fgJ%^)S{%IU);Vm?!GQbY4y%4ic?lxEdV=b=bbN?Oob>an#xJ&hI{V zlze>A`@+?&7x%6N+y3tLtIv@?_+tk;u@*tx* zQPL3=f+Xsz>PS;_`$Y$4{RYp|dA{yCzN-tYbAw&U={IKN^(qbURKj(rv^#x23^54I zk_x8i%^N;m)suPpkVzX~f{Nc5;mknd><-z|xtKuG)H#mluGM&2={$4LZ_x4F{dC52 zH#MHSt}bvPP3{&OJZfi}aR83zZfZPt3v!V&o*k?4%o?g2H>~}$GhsaQJk5$o%6}vO z?4-uC<1T9g7t&Dm1JK#$cIe*p(VD`+E9_7ihj;nQCjc9=u z6NV_A?gEh)L5*mkZ3yYBBBal@Dj3pvOpQ{xDA*aOU}zn}nnDFvQSD>TK;{WSW~H@+ zWXhy8>qN6h6v7j72#IJyVTRp|n&X7(Dg=32++Z5Yp0PFr-Nn}Y>@=g>bR1ce)Ac-} zKkvYL7F8m$ayLs0ZVspV7{@_=Ax_jWMbBmGeRxXYN%;^Z?1o`bM!Twyw$Y|=v_F7n z6)MUHwnnAP==PR@G7$qY*Q(A|$yCcZmIt9~oGFhj32z$+OLLr&NPSIk2d&wNyV9`- z|5Jh|6fxxwM8O$c$)VjzW8+$C(z4yQo8j$lrqSxAw-PV@qqPS51==8o5lWk-dNbvX z7vb6FDw&`CU-5$>W7f&IR9{RW3Pfh=Piim%;(^Sq+5hWAgDXlf1wDjirToY|7`j}s zOFfqo0MW|~Zs8Hkd>D*|p}~lr5%zJup+^RN8xu6X-$)i4qsAygFWQF;zEEOaUEzuaw{mU8!JJ(FSAROrS2tjtkSJeO2+EF_ z7kJ9>3l4mz@@O8f`?z3aQ8{Db@OOXs58o=rnK_v*#+838xROGHvGZ)!U!Kf5{D%Wq zt#ze>R4QiW7BmmBQkkC2BprDMa8Vys^pS7Ak=s)*r~@#}jKZ&fUBo;>gaIfP;1;kb z|F}r&-ax3ru~3C6Tf_Z^0vsYHPJwavghO9IJk(zi@hry^{?UPpwq{G{?pXnr_fatg zbXjctYz6#N2No3piHs`gQ;Fge1{1-_O@Ww}iAuo2_)@^eIg$A%Q%3A_@L_7kkO8Vj z24ac>=jeu)yRyr$%CNKwn+kx*;IiwJLL&M>h)Xy5T zr(>aRYl}bazy;1K-F8)GQ#l{0=d7QejHh?ZFUX2Kz0*F`sGhgf`F#iGC1y_V7UxyB zSR``y=rjUG%jP@f5@N@Lhy~$M9GIE%PT~YIOZuRjT;S^t5J^#H2ar2=^9Nd|JxM!q zT!L>n@RZDujlIjforZYsLUkO+3bD)G#w~%skY!&GS@wF1@WpzmHY;*j*^u+H)DrxJ z1LwIqZbkY1(z)}+*}Uz0a=UpkVt$o05end#05KFfeY#M z83qbPljQV5m7i9aAWgEoIU^raNH`GdEChpvb+_1|l1UoRvpz-Nc>(L!99ZJx%*hgQ zs3i{PO!=|%WwWQNTgYWnaejD@)dpXNHMaG~cT5}Mm>zb>hN`kxbGVpOer&y<3_l8I zGKjZLI7v2n;e6uvsmYrF!pBYi=Sq02f^FEc-D;xj-@2ONxLE_`W-BoJvZosn`eABY zwY0fhUs1Mm>AGu8-?Zfy)%{v}aY@?qrJoHmRI)BWUt)XG2r0r{c4jA9pYZJ`7Z1K^ zn|!vINlXNfZ$zi)qQwB~ob832zGok1@W2(?Y}B_ppf0_plZZXnRtk6*&-_Us6Qieh zYuj6*lP^OxO5lwCrbIc*fTAKkMjQ%$&w(u#7~9)LK_!W=yjixa@?u7xYH^yk2^(Zx zN>5|n;Fn?uEWW0s!WsxB0ZS6M1tFYo)jtl-5^yQK7l)A7%Qi&i7;6-Yo=CY?V2pDC zrozS|?0ni*p2r9>{e3ZGiD4#=qS;v(0!@Y5%TR@dU6}$m{C6?o5Kv)o(}_)?keCYO zWFuyNTuT6re|Dg5Z_I2qC^S9@JQZq><7vsea0SQ472wYtSk?qR{W|+;b)CIRbP_hK z)l=*3TnOr;j2Y%6>u;S^edaY}IPhBzY-ox!ufugBZUJM{8L}~Zc~%01RX(S4YO_Gs znLaHewgwFdZ*VjLVNJh9K!0JefDxV}|^;HL+jDy5YE6{3Ee2~>{?fd^J&rghx7`PG(8g~Mxx`lj< zz!NT=#o_7`17r9iS7P(o_z*E{78smT(R^ND`%MQ{;!#gQSjhmhfskA?n@wHu@nYD3 z6y|3*35=y9NhtOw31s~koK=t}T@%r&Xf zbRz|8oeF}Y;Pm4L#Sng)!5w!B648x!Gq4rAgDsi^KL|63F}3maAG*)YsJIn&FjRLo z+fL*40=}siflWKC_w)!d+B%(B3R~}e7fO#j9pT#1yS3~s;l2-eMo#MXoP0X2A%AFY z>%@xdDu&anT+WD$sfnGX%rczj6@}9*V^PkkLXebs&qd~BI88ik38!U(R=G%-ARu#R z2CXEZPdu2*SpugibE+ZhHJ#P6P_7K8*>GkBr`dEA9bQ(Imv5FaXd<7y5^kA`#|d^Q zwHS{B2~HCY@`fY@r`bHTFTrV6?JeOn(U%RJCfeo+mx9x59#TvpMwx7$w1v||U)EW? z1gD8-bHrBRG>ZossHZ}LB495pG#4flw5r_bs61M5hv#FB=KWdDq(|xnZYv7eGZ1h zT1apjyKpiG5l9m2L$^i)_cENuiBE*nSi5-5E_l|FRGou~dQj925}d{<*!V)e5{j{q zYibFc<~2SgIL&JmgVRJ%(FaCJKrK@=kl-}IhYqKCF`On^XlJK%MkbuadK{40Y0ipC zaGKZ1#;J^O8Z%*CU`6wma9T_{IT4mj02-VYx1FH)c;)@L;WY2lh0{2BBb+AbKX=_} zc_IW-aGGGiYHe>mX=2MKq~SEr0H?*Kp~GpMWgRsWl5Cr9q~J7UIzFJ4C6JngcCr+Fqkt$6PoPrIVxX~_^qc-m#76!|edLBlDY zwj%*w5r}t1@7A)nc*yZ(M|Lb!yqtDf9EN_O^?dY7>gO8c{e#AE)Wb?Me!meM9}Gw1 z29}`+#$n_BaCm8aJeHFKqfjafK?b?uT~hd}4w zgnksG`wlFyoVFoXfH|!V{3@1uyh|+4@UDB|EL{NF^`ethayA z-no9|>hArmovYWkz000=eYfN7T=%bCxpM8=_4_+lyNv^XWI3ZA;{Gg^HsOLuWz$?q z6|Rw88s=^jT6V#JLeQBnDXK=RTYVoVn-s1SwxX2Vm?l%HnkNPt@DN-kiCQ<079JRN z4R5Zbi7D@rPn!gSpTSc~S=5MLw$Iho>*jFD8z)N9BBha?zln_r$MUY%kSib>L|1&$ zyf&Sy9}6QKw)W8oX+@j4mgBda-Imj7$*)7TI6A{;2l0{5A}z6u6|+ZtpUoQaeKA`A zy2yE^WF}RVD@j!x4U#DvmxAG`miC|OvN;NXe<|T9)yPL8HVCf+>1G;$@RIa6xVf^> z(r(VK>vRO}#^&h^Ow679im+%R=I^XtY)*E@{g@FtSM(!BErKE@;1OrzLYs>)@6FL_ z!O;)=hJz<&sH!nn8IOj2IyYje$Y9Ws-*m}V{K7qHkSrZ1Nzk5)U-q~F=g1S$%O0#h zHJrfjI`BetBVDVwkx{6aL{)-Kw!&CW3#+rw1FVw=SthbzVT-7^FurF+0~OO~nq87n zZrLp&n>;({9G^*7Va8WE;ivFGY^1%oGIUZ!P?>9(X3|W%n+0@6s~#E?4)|LK&PBY$ zg=B5w=BE}8?E}`=@EEivm}Tg+o)qk2Ec`jX=c;l-lCr(B`M7x_;ZBl9H@<7B0!Gim z=V^htN&o7`$b{!V*d)NRUn16o7`8PDb!O5v7lo%jo`Rg;6fVU$!|XBUZP#5RG&P%xKq_|4~b%jckrWfE7N}qP1&C^g3jZk?>JkoWSI(cTOFu0kJ#R9cw zq7h(YBdY4+QZId)UCyLL^<(XWkPtu%YieF>{I(jFpor@2Mg@>~Sk<`$omL_bL2>6wep zm8l!&U%ytWJ&E9$3i;#>#*_(6!@-ZBSO-dpYKRahI3u#!6k`mi85`;wcGe7i#a ztAbyMGVLSDxU9E}e~kja+uZV2wKC?-t!wx`Ellsy_A#7`e~I>5nQYO%L)*ugFa9Ok zYgLJ(_CF%t=;RA_d^WQ{mRREn)Hh=}+1$G5c>LW&(d?FVVnlrpKBE3GE@rlil~<5< zMr9(g05vX#Bf3fjA(?9Q#$QAXp@dajW?`wy7`#S`hW9YtXSAkSYubo1F9{d-nR9$B zVgomp;;y;WnJ>Eujpr=jBl;W)5X~maE+UO2ySOAkej$5&-89-l_PC);J!8BR*%_LU zSX*1&Hb@W!sv@KAh3x!cnR-0#wdWWvjbAoFv1I)Eh#r1B5@uh3Ra|9oyY@pYn2Lsx zmxtuL>#yPW#JoVid*;&KaJbhG{DWSI?_=-trQ-em@PkVjKZEh>7!mNhU&y)?4~W=y ztbL^lbDxC+{zVjeZP?Gk0e4`@CHVWxY-;{29AMlwV~|QH%nJwg_i??4Uo(PV3WLaE z^i5dg9y~>hHM=l<+}v7m+;oj-f(;(g29FF4T$kbPG#E5^{|)>?BK$tBas3dMM!_ED z6Jh(fJs!3nkq%&qJoaTY7%di(g8JBf)kTzoJOfqsMI>QivYb}^2$of{UQxQ`M_wdv zs_t{9xDwsy8%BEfv8KMQyq||k*cqaZa>YHDp=Cj<{t>Li@_G^79rDBQOswd0P(Ehz PWDKyP@A9La;&T5V@=(5l literal 0 HcmV?d00001 diff --git a/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_mkl/00000123/variables/variables.data-00000-of-00001 b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_mkl/00000123/variables/variables.data-00000-of-00001 new file mode 100644 index 0000000000000000000000000000000000000000..a0d0c613090276cf881375c70a2070b3f1802860 GIT binary patch literal 36 jcmZQzV6bOkU~m8;AZB3Lx0`i8h_*h~3Z}V#owNr4Vjl;O literal 0 HcmV?d00001 diff --git a/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_mkl/00000123/variables/variables.index b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_mkl/00000123/variables/variables.index new file mode 100644 index 0000000000000000000000000000000000000000..a920fdc162cc9c885069e193432cca33cd00f344 GIT binary patch literal 349 zcmZQzVB=tvV&Y(AVB}8ZU=(7|U@>L0P?u+5(iXJA8nN0j3A^afxcSE;IsrzjJnMgJX literal 0 HcmV?d00001 diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl new file mode 100644 index 00000000000..6a1ec25b3b5 --- /dev/null +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl @@ -0,0 +1,128 @@ +# Copyright 2018 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +FROM ubuntu:16.04 as base_build + +ARG TF_SERVING_VERSION_GIT_BRANCH=master +ARG TF_SERVING_VERSION_GIT_COMMIT=head + +LABEL maintainer="Karthik Vadla " +LABEL tensorflow_serving_github_branchtag=${TF_SERVING_VERSION_GIT_BRANCH} +LABEL tensorflow_serving_github_commit=${TF_SERVING_VERSION_GIT_COMMIT} + +RUN apt-get update && apt-get install -y --no-install-recommends \ + automake \ + build-essential \ + ca-certificates \ + curl \ + git \ + libcurl3-dev \ + libfreetype6-dev \ + libpng12-dev \ + libtool \ + libzmq3-dev \ + mlocate \ + openjdk-8-jdk\ + openjdk-8-jre-headless \ + pkg-config \ + python-dev \ + software-properties-common \ + swig \ + unzip \ + wget \ + zip \ + zlib1g-dev \ + && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +RUN curl -fSsL -O https://bootstrap.pypa.io/get-pip.py && \ + python get-pip.py && \ + rm get-pip.py + +RUN pip --no-cache-dir install \ + grpcio \ + h5py \ + keras_applications \ + keras_preprocessing \ + mock \ + numpy \ + requests + +# Set up Bazel +# Need >= 0.15.0 so bazel compiles work with docker bind mounts. +ENV BAZEL_VERSION 0.15.0 +WORKDIR / +RUN mkdir /bazel && \ + cd /bazel && \ + curl -H "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36" -fSsL -O https://github.com/bazelbuild/bazel/releases/download/$BAZEL_VERSION/bazel-$BAZEL_VERSION-installer-linux-x86_64.sh && \ + curl -H "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36" -fSsL -o /bazel/LICENSE.txt https://raw.githubusercontent.com/bazelbuild/bazel/master/LICENSE && \ + chmod +x bazel-*.sh && \ + ./bazel-$BAZEL_VERSION-installer-linux-x86_64.sh && \ + cd / && \ + rm -f /bazel/bazel-$BAZEL_VERSION-installer-linux-x86_64.sh + +# Download TF Serving sources (optionally at specific commit). +WORKDIR /tensorflow-serving +RUN git clone --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tensorflow/serving . && \ + git remote add upstream https://github.com/tensorflow/serving.git && \ + if [ "${TF_SERVING_VERSION_GIT_COMMIT}" != "head" ]; then git checkout ${TF_SERVING_VERSION_GIT_COMMIT} ; fi + + +FROM base_build as binary_build + +# Build, and install TensorFlow Serving +# Use --copt=-march values to get optimized builds appropriate for the hardware +# platform of your choice. +# For ivy-bridge or sandy-bridge +# --copt=-march="avx" \ +# For haswell, broadwell, or skylake +# --copt=-march="avx2" \ +ARG TF_SERVING_BUILD_OPTIONS="--config=mkl --config=nativeopt" +RUN echo "Building with build options: ${TF_SERVING_BUILD_OPTIONS}" + +ARG TF_SERVING_BAZEL_OPTIONS="" +RUN echo "Building with Bazel options: ${TF_SERVING_BAZEL_OPTIONS}" + +RUN bazel build --color=yes --curses=yes \ + ${TF_SERVING_BAZEL_OPTIONS} \ + --verbose_failures \ + --output_filter=DONT_MATCH_ANYTHING \ + ${TF_SERVING_BUILD_OPTIONS} \ + tensorflow_serving/model_servers:tensorflow_model_server && \ + cp bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server \ + /usr/local/bin/ + +# Build and install TensorFlow Serving API +RUN bazel build --color=yes --curses=yes \ + ${TF_SERVING_BAZEL_OPTIONS} \ + --verbose_failures \ + --output_filter=DONT_MATCH_ANYTHING \ + ${TF_SERVING_BUILD_OPTIONS} \ + tensorflow_serving/tools/pip_package:build_pip_package && \ + bazel-bin/tensorflow_serving/tools/pip_package/build_pip_package \ + /tmp/pip && \ + pip --no-cache-dir install --upgrade /tmp/pip/tensorflow_serving*.whl && \ + rm -rf /tmp/pip + +# Copy MKL libraries +RUN cp /root/.cache/bazel/_bazel_root/*/external/mkl_linux/lib/* /usr/local/lib + +ENV LIBRARY_PATH '/usr/local/lib:$LIBRARY_PATH' +ENV LD_LIBRARY_PATH '/usr/local/lib:$LD_LIBRARY_PATH' + +FROM binary_build as clean_build +# Clean up Bazel cache when done. +RUN bazel clean --expunge --color=yes && \ + rm -rf /root/.cache +CMD ["/bin/bash"] diff --git a/tensorflow_serving/tools/docker/Dockerfile.mkl b/tensorflow_serving/tools/docker/Dockerfile.mkl new file mode 100644 index 00000000000..f3706b245a4 --- /dev/null +++ b/tensorflow_serving/tools/docker/Dockerfile.mkl @@ -0,0 +1,98 @@ +# Copyright 2018 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +ARG TF_SERVING_VERSION=latest +ARG TF_SERVING_BUILD_IMAGE=tensorflow/serving:${TF_SERVING_VERSION}-devel-mkl + +FROM ${TF_SERVING_BUILD_IMAGE} as build_image +FROM ubuntu:16.04 + +ARG TF_SERVING_VERSION_GIT_BRANCH=master +ARG TF_SERVING_VERSION_GIT_COMMIT=head + +LABEL maintainer="Karthik Vadla " +LABEL tensorflow_serving_github_branchtag=${TF_SERVING_VERSION_GIT_BRANCH} +LABEL tensorflow_serving_github_commit=${TF_SERVING_VERSION_GIT_COMMIT} + +RUN apt-get update && apt-get install -y --no-install-recommends \ + ca-certificates htop \ + && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +# Install TF Serving pkg +COPY --from=build_image /usr/local/bin/tensorflow_model_server /usr/bin/tensorflow_model_server + +# Install MKL libraries +COPY --from=build_image /usr/local/lib/libiomp5.so /usr/local/lib +COPY --from=build_image /usr/local/lib/libmklml_gnu.so /usr/local/lib +COPY --from=build_image /usr/local/lib/libmklml_intel.so /usr/local/lib + +ENV LIBRARY_PATH '/usr/local/lib:$LIBRARY_PATH' +ENV LD_LIBRARY_PATH '/usr/local/lib:$LD_LIBRARY_PATH' + + +# Expose ports +# gRPC +EXPOSE 8500 + +# REST +EXPOSE 8501 + +# Set where models should be stored in the container +ENV MODEL_BASE_PATH=/models +RUN mkdir -p ${MODEL_BASE_PATH} + +# The only required piece is the model name in order to differentiate endpoints +ENV MODEL_NAME=model + +# Create a script that runs the model server so we can use environment variables +# while also passing in arguments from the docker command line + +# Setting MKL environment variables gave better performance. +# https://www.tensorflow.org/guide/performance/overview +# Read about Tuning MKL for the best performance +# Add export MKLDNN_VERBOSE=1 to the below script, +# to see MKL messages in the docker logs when you send predict request. + +# Based on our observations during experiments, +# setting tensorflow_session_parallelism=<1/4th of physical cores> and +# setting OMP_NUM_THREADS= +# gave optimal performance results with MKL +# KMP_BLOCKTIME= + +# NOTE: We don't gurantee same settings to give optimal peformance across all hardwares +# please tune variables as required. + +ENV OMP_NUM_THREADS=2 +ENV KMP_BLOCKTIME=1 +ENV KMP_SETTINGS=1 +ENV KMP_AFFINITY='granularity=fine,verbose,compact,1,0' +ENV MKLDNN_VERBOSE=0 + +ENV TENSORFLOW_SESSION_PARALLELISM=2 + +RUN echo '#!/bin/bash \n\n\ +export OMP_NUM_THREADS=${OMP_NUM_THREADS} \n\ +export KMP_BLOCKTIME=${KMP_BLOCKTIME} \n\ +export KMP_SETTINGS=${KMP_SETTINGS} \n\ +export KMP_AFFINITY=${KMP_AFFINITY} \n\ +export MKLDNN_VERBOSE=${MKLDNN_VERBOSE} \n\ +tensorflow_model_server --port=8500 --rest_api_port=8501 \ +--tensorflow_session_parallelism=${TENSORFLOW_SESSION_PARALLELISM} \ +--model_name=${MODEL_NAME} --model_base_path=${MODEL_BASE_PATH}/${MODEL_NAME} \ +"$@"' > /usr/bin/tf_serving_entrypoint.sh \ +&& chmod +x /usr/bin/tf_serving_entrypoint.sh + +ENTRYPOINT ["/usr/bin/tf_serving_entrypoint.sh"] diff --git a/tensorflow_serving/tools/docker/tests/BUILD b/tensorflow_serving/tools/docker/tests/BUILD index 7075f06a6af..f0aaf26a233 100644 --- a/tensorflow_serving/tools/docker/tests/BUILD +++ b/tensorflow_serving/tools/docker/tests/BUILD @@ -46,6 +46,38 @@ sh_test( deps = [":docker_test_lib"], ) +sh_test( + name = "unittest_dockerfile_mkl", + size = "small", + srcs = ["dockerfile_mkl_test.sh"], + args = ["tensorflow/serving:latest-mkl"], + data = [ + "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_mkl", + ], + tags = [ + "exclusive", + "local", + "manual", + ], + deps = [":docker_test_lib"], +) + +sh_test( + name = "unittest_dockerfile_devel_mkl", + size = "small", + srcs = ["dockerfile_devel_mkl_test.sh"], + args = ["tensorflow/serving:latest-devel-mkl"], + data = [ + "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_mkl", + ], + tags = [ + "exclusive", + "local", + "manual", + ], + deps = [":docker_test_lib"], +) + sh_test( name = "unittest_dockerfile_gpu", size = "medium", diff --git a/tensorflow_serving/tools/docker/tests/docker_test_lib.sh b/tensorflow_serving/tools/docker/tests/docker_test_lib.sh index 6d79e2a689a..c0d8ed25d76 100755 --- a/tensorflow_serving/tools/docker/tests/docker_test_lib.sh +++ b/tensorflow_serving/tools/docker/tests/docker_test_lib.sh @@ -141,13 +141,17 @@ function test_docker_image { docker_opts+=" --runtime=nvidia" fi - if [ -z $(docker images -q ${IMAGE}) ]; then + if [[ "$IS_MKL_IMAGE" = true ]] ; then + docker_opts+=" -e MKLDNN_VERBOSE=1" + fi + + if [ -z $(docker images -q ${IMAGE}) ] ; then echo "Docker image ${IMAGE} doesn't exist, please create or pull" exit 1 fi echo "Starting TF ModelServer in Docker container from image:${IMAGE} ..." - if [[ "$IS_DEVEL_IMAGE" = true ]]; then + if [[ "$IS_DEVEL_IMAGE" = true ]] ; then echo "Starting TF ModelServer in Docker container from image:${image} ..." # Devel images do not run ModelServer but rather start interative shell. # Hence we need to explicitly set entrypoint to modelserver and pass the @@ -161,10 +165,16 @@ function test_docker_image { fi _find_container _wait_for_http - _query_model - _cleanup_test -} + if [[ "$IS_MKL_IMAGE" = true ]] ; then + echo "Checking for mkldnn_verbose in logs of container: ${CONTAINER_ID}" + if [[ -z $(docker logs --tail 1 ${CONTAINER_ID} | grep "mkldnn_verbose") ]]; then + echo "${IMAGE}: does not use MKL optimizations" + exit 1 + fi + fi + _cleanup_test +} diff --git a/tensorflow_serving/tools/docker/tests/dockerfile_devel_gpu_test.sh b/tensorflow_serving/tools/docker/tests/dockerfile_devel_gpu_test.sh index 4f48121fdff..da0f0b6db52 100755 --- a/tensorflow_serving/tools/docker/tests/dockerfile_devel_gpu_test.sh +++ b/tensorflow_serving/tools/docker/tests/dockerfile_devel_gpu_test.sh @@ -31,6 +31,7 @@ source ${PROJDIR}/tools/docker/tests/docker_test_lib.sh || exit 1 # Values to fill in for test # ------------------------------------------------------------------------------ declare -r USE_NVIDIA_RUNTIME=true +declare -r IS_MKL_IMAGE=false declare -r IS_DEVEL_IMAGE=true declare -r MODELNAME="saved_model_half_plus_two_gpu" declare -r MODELDIR="${PROJDIR}/servables/tensorflow/testdata" diff --git a/tensorflow_serving/tools/docker/tests/dockerfile_devel_mkl_test.sh b/tensorflow_serving/tools/docker/tests/dockerfile_devel_mkl_test.sh new file mode 100755 index 00000000000..036926068f8 --- /dev/null +++ b/tensorflow_serving/tools/docker/tests/dockerfile_devel_mkl_test.sh @@ -0,0 +1,44 @@ +#!/bin/bash +# Copyright 2018 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +# +# Tests if a Docker image built from Dockerfile.devel basically functions. +# +# It does this by loading up a half plus two toy model in the Docker image +# and querying it, validating the response. +# +# The image passed to this test must be already available locally. +# +# Ex: $ bazel test :unittest_dockerfile_devel_mkl \ +# --test_arg=tensorflow/serving:latest-devel-mkl \ +# --test_output=streamed --verbose_failures + +declare -r PROJDIR=$(pwd)/tensorflow_serving +source ${PROJDIR}/tools/docker/tests/docker_test_lib.sh || exit 1 + +# Values to fill in for test +# ------------------------------------------------------------------------------ +declare -r USE_NVIDIA_RUNTIME=false +declare -r IS_MKL_IMAGE=true +declare -r IS_DEVEL_IMAGE=true +declare -r MODELDIR="${PROJDIR}/servables/tensorflow/testdata" +declare -r MODELNAME="saved_model_half_plus_two_mkl" +declare -r REQUEST='{"instances": [1.0,2.0,5.0]}' +declare -r RESPONSE='{"predictions":[2.5,3.0,4.5]}' +# ------------------------------------------------------------------------------ + +# Grab the last argument as the image, so we can override the test arg in +# the BUILD file +test_docker_image ${@: -1} diff --git a/tensorflow_serving/tools/docker/tests/dockerfile_devel_test.sh b/tensorflow_serving/tools/docker/tests/dockerfile_devel_test.sh index 919830863fa..24e15a81180 100755 --- a/tensorflow_serving/tools/docker/tests/dockerfile_devel_test.sh +++ b/tensorflow_serving/tools/docker/tests/dockerfile_devel_test.sh @@ -31,6 +31,7 @@ source ${PROJDIR}/tools/docker/tests/docker_test_lib.sh || exit 1 # Values to fill in for test # ------------------------------------------------------------------------------ declare -r USE_NVIDIA_RUNTIME=false +declare -r IS_MKL_IMAGE=false declare -r IS_DEVEL_IMAGE=true declare -r MODELDIR="${PROJDIR}/servables/tensorflow/testdata" declare -r MODELNAME="saved_model_half_plus_two_cpu" diff --git a/tensorflow_serving/tools/docker/tests/dockerfile_gpu_test.sh b/tensorflow_serving/tools/docker/tests/dockerfile_gpu_test.sh index 7182e201dbe..d15da79e82f 100755 --- a/tensorflow_serving/tools/docker/tests/dockerfile_gpu_test.sh +++ b/tensorflow_serving/tools/docker/tests/dockerfile_gpu_test.sh @@ -31,6 +31,7 @@ source ${PROJDIR}/tools/docker/tests/docker_test_lib.sh || exit 1 # Values to fill in for test # ------------------------------------------------------------------------------ declare -r USE_NVIDIA_RUNTIME=true +declare -r IS_MKL_IMAGE=false declare -r IS_DEVEL_IMAGE=false declare -r MODELNAME="saved_model_half_plus_two_gpu" declare -r MODELDIR="${PROJDIR}/servables/tensorflow/testdata" diff --git a/tensorflow_serving/tools/docker/tests/dockerfile_mkl_test.sh b/tensorflow_serving/tools/docker/tests/dockerfile_mkl_test.sh new file mode 100755 index 00000000000..fa724779609 --- /dev/null +++ b/tensorflow_serving/tools/docker/tests/dockerfile_mkl_test.sh @@ -0,0 +1,43 @@ +#!/bin/bash +# Copyright 2018 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +# +# Tests if a Docker image built from Dockerfile basically functions. +# +# It does this by loading up a half plus two toy model in the Docker image +# and querying it, validating the response. +# +# The image passed to this test must be already available locally. +# +# Ex: $ bazel test :unittest_dockerfile_mkl --test_arg=tensorflow/serving:latest-mkl \ +# --test_output=streamed --verbose_failures + +declare -r PROJDIR=$(pwd)/tensorflow_serving +source ${PROJDIR}/tools/docker/tests/docker_test_lib.sh || exit 1 + +# Values to fill in for test +# ------------------------------------------------------------------------------ +declare -r USE_NVIDIA_RUNTIME=false +declare -r IS_MKL_IMAGE=true +declare -r IS_DEVEL_IMAGE=false +declare -r MODELDIR="${PROJDIR}/servables/tensorflow/testdata" +declare -r MODELNAME="saved_model_half_plus_two_mkl" +declare -r REQUEST='{"instances": [1.0,2.0,5.0]}' +declare -r RESPONSE='{"predictions":[2.5,3.0,4.5]}' +# ------------------------------------------------------------------------------ + +# Grab the last argument as the image, so we can override the test arg in +# the BUILD file +test_docker_image ${@: -1} diff --git a/tensorflow_serving/tools/docker/tests/dockerfile_test.sh b/tensorflow_serving/tools/docker/tests/dockerfile_test.sh index d3a9485a8db..5ed4641c6f7 100755 --- a/tensorflow_serving/tools/docker/tests/dockerfile_test.sh +++ b/tensorflow_serving/tools/docker/tests/dockerfile_test.sh @@ -30,6 +30,7 @@ source ${PROJDIR}/tools/docker/tests/docker_test_lib.sh || exit 1 # Values to fill in for test # ------------------------------------------------------------------------------ declare -r USE_NVIDIA_RUNTIME=false +declare -r IS_MKL_IMAGE=false declare -r IS_DEVEL_IMAGE=false declare -r MODELDIR="${PROJDIR}/servables/tensorflow/testdata" declare -r MODELNAME="saved_model_half_plus_two_cpu" From 83f64a90674c77e37277e0bef2f28290f07e2996 Mon Sep 17 00:00:00 2001 From: Karthik Vadla Date: Fri, 14 Dec 2018 11:33:51 -0800 Subject: [PATCH 1822/8103] Remove redundant file --- .../generate_saved_model_half_plus_two_mkl.py | 291 ------------------ 1 file changed, 291 deletions(-) delete mode 100644 tensorflow_serving/servables/tensorflow/testdata/generate_saved_model_half_plus_two_mkl.py diff --git a/tensorflow_serving/servables/tensorflow/testdata/generate_saved_model_half_plus_two_mkl.py b/tensorflow_serving/servables/tensorflow/testdata/generate_saved_model_half_plus_two_mkl.py deleted file mode 100644 index 643f3852c87..00000000000 --- a/tensorflow_serving/servables/tensorflow/testdata/generate_saved_model_half_plus_two_mkl.py +++ /dev/null @@ -1,291 +0,0 @@ -## Copyright 2015 The TensorFlow Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== -r"""Exports an example linear regression inference graph. - -Exports a TensorFlow graph to `/tmp/saved_model/half_plus_two/` based on the -`SavedModel` format. - -This graph calculates, - -\\( - y = a*x + b -\\) - -and/or, independently, - -\\( - y2 = a*x2 + c -\\) - -where `a`, `b` and `c` are variables with `a=0.5` and `b=2` and `c=3`. - -Output from this program is typically used to exercise SavedModel load and -execution code. - -To create a model to use MKL optimizations: - python generate_saved_model_half_plus_two_mkl.py - -This will generate saved models in 3 different formats in /tmp directory. -""" - -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - -import argparse -import os -import sys - -import tensorflow as tf - -from tensorflow.python.lib.io import file_io - -FLAGS = None - - -def _write_assets(assets_directory, assets_filename): - """Writes asset files to be used with SavedModel for half plus two. - - Args: - assets_directory: The directory to which the assets should be written. - assets_filename: Name of the file to which the asset contents should be - written. - - Returns: - The path to which the assets file was written. - """ - if not file_io.file_exists(assets_directory): - file_io.recursive_create_dir(assets_directory) - - path = os.path.join( - tf.compat.as_bytes(assets_directory), tf.compat.as_bytes(assets_filename)) - file_io.write_string_to_file(path, "asset-file-contents") - return path - - -def _build_regression_signature(input_tensor, output_tensor): - """Helper function for building a regression SignatureDef.""" - input_tensor_info = tf.saved_model.utils.build_tensor_info(input_tensor) - signature_inputs = { - tf.saved_model.signature_constants.REGRESS_INPUTS: input_tensor_info - } - output_tensor_info = tf.saved_model.utils.build_tensor_info(output_tensor) - signature_outputs = { - tf.saved_model.signature_constants.REGRESS_OUTPUTS: output_tensor_info - } - return tf.saved_model.signature_def_utils.build_signature_def( - signature_inputs, signature_outputs, - tf.saved_model.signature_constants.REGRESS_METHOD_NAME) - - -# Possibly extend this to allow passing in 'classes', but for now this is -# sufficient for testing purposes. -def _build_classification_signature(input_tensor, scores_tensor): - """Helper function for building a classification SignatureDef.""" - input_tensor_info = tf.saved_model.utils.build_tensor_info(input_tensor) - signature_inputs = { - tf.saved_model.signature_constants.CLASSIFY_INPUTS: input_tensor_info - } - output_tensor_info = tf.saved_model.utils.build_tensor_info(scores_tensor) - signature_outputs = { - tf.saved_model.signature_constants.CLASSIFY_OUTPUT_SCORES: - output_tensor_info - } - return tf.saved_model.signature_def_utils.build_signature_def( - signature_inputs, signature_outputs, - tf.saved_model.signature_constants.CLASSIFY_METHOD_NAME) - - -def _generate_saved_model_for_half_plus_two(export_dir, - as_text=False, - use_main_op=False, - device_type="cpu"): - """Generates SavedModel for half plus two. - - Args: - export_dir: The directory to which the SavedModel should be written. - as_text: Writes the SavedModel protocol buffer in text format to disk. - use_main_op: Whether to supply a main op during SavedModel build time. - device_name: Device to force ops to run on. - """ - builder = tf.saved_model.builder.SavedModelBuilder(export_dir) - - device_name = "/cpu:0" - if device_type == "gpu": - device_name = "/gpu:0" - - with tf.Session( - graph=tf.Graph(), - config=tf.ConfigProto(log_device_placement=True)) as sess: - with tf.device(device_name): - # Set up the model parameters as variables to exercise variable loading - # functionality upon restore. - a = tf.Variable(0.5, name="a") - b = tf.Variable(2.0, name="b") - c = tf.Variable(3.0, name="c") - - # Create a placeholder for serialized tensorflow.Example messages to be - # fed. - serialized_tf_example = tf.placeholder(tf.string, name="tf_example") - - # Parse the tensorflow.Example looking for a feature named "x" with a - # single floating point value. - feature_configs = { - "x": tf.FixedLenFeature([1], dtype=tf.float32), - "x2": tf.FixedLenFeature([1], dtype=tf.float32, default_value=[0.0]) - } - # parse_example only works on CPU - with tf.device("/cpu:0"): - tf_example = tf.parse_example(serialized_tf_example, feature_configs) - # Use tf.identity() to assign name - - x = tf.identity(tf_example["x"], name="x") - - # This operation just performs a convolution - # but the output is zero. This way we can keep - # the same output as the original code but trigger MKL-DNN. - o1 = tf.keras.layers.Conv2D(1,[1,1])(tf.zeros((1,10,10,1))) - o2 = o1[0,0,0,0] - - y = o2 + tf.add(tf.multiply(a, x), b) - y = tf.identity(y, name="y") - - # This operation just performs a convolution - # but the output is zero. This way we can keep - # the same output as the original code but trigger MKL-DNN. - o3 = tf.keras.layers.Conv2D(1,[1,1])(tf.zeros((1,10,10,1))) - o4 = o3[0,0,0,0] - - y2 = o3 + tf.add(tf.multiply(a, x), c) - y2 = tf.identity(y2, name="y2") - - x2 = tf.identity(tf_example["x2"], name="x2") - - # This operation just performs a convolution - # but the output is zero. This way we can keep - # the same output as the original code but trigger MKL-DNN. - o6 = tf.keras.layers.Conv2D(1,[1,1])(tf.zeros((1,10,10,1))) - o7 = o6[0,0,0,0] - - y3 = o6 + tf.add(tf.multiply(a, x2), c) - y3 = tf.identity(y3, name="y3") - - # Create an assets file that can be saved and restored as part of the - # SavedModel. - original_assets_directory = "/tmp/original/export/assets" - original_assets_filename = "foo.txt" - original_assets_filepath = _write_assets(original_assets_directory, - original_assets_filename) - - # Set up the assets collection. - assets_filepath = tf.constant(original_assets_filepath) - tf.add_to_collection(tf.GraphKeys.ASSET_FILEPATHS, assets_filepath) - filename_tensor = tf.Variable( - original_assets_filename, - name="filename_tensor", - trainable=False, - collections=[]) - assign_filename_op = filename_tensor.assign(original_assets_filename) - - # Set up the signature for Predict with input and output tensor - # specification. - predict_input_tensor = tf.saved_model.utils.build_tensor_info(x) - predict_signature_inputs = {"x": predict_input_tensor} - - predict_output_tensor = tf.saved_model.utils.build_tensor_info(y) - predict_signature_outputs = {"y": predict_output_tensor} - predict_signature_def = ( - tf.saved_model.signature_def_utils.build_signature_def( - predict_signature_inputs, predict_signature_outputs, - tf.saved_model.signature_constants.PREDICT_METHOD_NAME)) - - signature_def_map = { - "regress_x_to_y": - _build_regression_signature(serialized_tf_example, y), - "regress_x_to_y2": - _build_regression_signature(serialized_tf_example, y2), - "regress_x2_to_y3": - _build_regression_signature(x2, y3), - "classify_x_to_y": - _build_classification_signature(serialized_tf_example, y), - tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: - predict_signature_def - } - # Initialize all variables and then save the SavedModel. - sess.run(tf.global_variables_initializer()) - - if use_main_op: - builder.add_meta_graph_and_variables( - sess, [tf.saved_model.tag_constants.SERVING], - signature_def_map=signature_def_map, - assets_collection=tf.get_collection(tf.GraphKeys.ASSET_FILEPATHS), - main_op=tf.group(tf.saved_model.main_op.main_op(), - assign_filename_op)) - else: - builder.add_meta_graph_and_variables( - sess, [tf.saved_model.tag_constants.SERVING], - signature_def_map=signature_def_map, - assets_collection=tf.get_collection(tf.GraphKeys.ASSET_FILEPATHS), - main_op=tf.group(assign_filename_op)) - builder.save(as_text) - - -def main(_): - _generate_saved_model_for_half_plus_two( - FLAGS.output_dir, device_type=FLAGS.device) - print("SavedModel generated for %(device)s at: %(dir)s" % { - "device": FLAGS.device, - "dir": FLAGS.output_dir - }) - - _generate_saved_model_for_half_plus_two( - FLAGS.output_dir_pbtxt, as_text=True, device_type=FLAGS.device) - print("SavedModel generated for %(device)s at: %(dir)s" % { - "device": FLAGS.device, - "dir": FLAGS.output_dir_pbtxt - }) - - _generate_saved_model_for_half_plus_two( - FLAGS.output_dir_main_op, use_main_op=True, device_type=FLAGS.device) - print("SavedModel generated for %(device)s at: %(dir)s " % { - "device": FLAGS.device, - "dir": FLAGS.output_dir_main_op - }) - - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument( - "--output_dir", - type=str, - default="/tmp/saved_model_half_plus_two", - help="Directory where to output SavedModel.") - parser.add_argument( - "--output_dir_pbtxt", - type=str, - default="/tmp/saved_model_half_plus_two_pbtxt", - help="Directory where to output the text format of SavedModel.") - parser.add_argument( - "--output_dir_main_op", - type=str, - default="/tmp/saved_model_half_plus_two_main_op", - help="Directory where to output the SavedModel with a main op.") - parser.add_argument( - "--device", - type=str, - default="cpu", - help="Force model to run on 'cpu' or 'gpu'") - FLAGS, unparsed = parser.parse_known_args() - tf.app.run(main=main, argv=[sys.argv[0]] + unparsed) From 0950412b41244612118eb35ebe5722f03b339633 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Dec 2018 12:07:22 -0800 Subject: [PATCH 1823/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225582082 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3cb3141735d..2132ee0a5b5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eda372e571a3de48758cbd22d48fc95941f08500dc16a615a202f787d9f1499e", - git_commit = "1c6491126ba6d961cc367a19018a877ca3803222", + sha256 = "a2db08160c0c8ad9fc24a23d0f7e0222e1f93a6fedf79bdf09960d041f26ce6c", + git_commit = "0b1086a6f8cc51c5a230a299ee26c5353a7600cd", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a5c06959853fb421f4c8e7ddf58763c8feccdde5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Dec 2018 13:02:12 -0800 Subject: [PATCH 1824/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225590808 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2132ee0a5b5..7b9ac15bacc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a2db08160c0c8ad9fc24a23d0f7e0222e1f93a6fedf79bdf09960d041f26ce6c", - git_commit = "0b1086a6f8cc51c5a230a299ee26c5353a7600cd", + sha256 = "713e9ea3051b30069aef3f2aec26f4b99dcd295d05e8d92624d30941694fe9b1", + git_commit = "690bd62639abc6638d3de9e5c9300d368fea49c8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 09ac9383f64e0323034b0c60c9dab8dd824d6700 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Dec 2018 14:02:26 -0800 Subject: [PATCH 1825/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225600413 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7b9ac15bacc..95f5c0095e9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "713e9ea3051b30069aef3f2aec26f4b99dcd295d05e8d92624d30941694fe9b1", - git_commit = "690bd62639abc6638d3de9e5c9300d368fea49c8", + sha256 = "655d13d64f12a9c24f5449f6e6be5092128b8a353e3d9250c2780732772dff4e", + git_commit = "e9e534f3239d7cb7e2a815b49c1c3520d9566d70", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1d213bd408bdebd2fb66bf21a1bf1d32435a505f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Dec 2018 15:02:37 -0800 Subject: [PATCH 1826/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225610192 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 95f5c0095e9..d79bae010f8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "655d13d64f12a9c24f5449f6e6be5092128b8a353e3d9250c2780732772dff4e", - git_commit = "e9e534f3239d7cb7e2a815b49c1c3520d9566d70", + sha256 = "72bc2dbc8e9c02da1f503d2312c170f0d1853bddaccbca6578d4207e341c701e", + git_commit = "f75043367565fb071329580568e2b06b63bc7777", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7cc9647b3b1f30d6688912c641a6b42ec4035a42 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Dec 2018 16:02:16 -0800 Subject: [PATCH 1827/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225618834 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d79bae010f8..42754ed7817 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "72bc2dbc8e9c02da1f503d2312c170f0d1853bddaccbca6578d4207e341c701e", - git_commit = "f75043367565fb071329580568e2b06b63bc7777", + sha256 = "288b857e7805243f53a78d53f13769e85fd25d374ae859dbc5edd13179f2b0bc", + git_commit = "e2acc3dfd9e4757a1a4be894428e3f3683e30348", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1706e9a4e8f33f0eec4124979805daa303dd8e9d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Dec 2018 17:02:06 -0800 Subject: [PATCH 1828/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225626460 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 42754ed7817..2f57562484a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "288b857e7805243f53a78d53f13769e85fd25d374ae859dbc5edd13179f2b0bc", - git_commit = "e2acc3dfd9e4757a1a4be894428e3f3683e30348", + sha256 = "f65af00d8cdbf29d6a273db7850188ff362ccc30091181202dc2a1cf2f78f629", + git_commit = "c152e8c1a8a27dda8d733493a64c3598d196053d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9f46e5fa391fe356acb07af56d8d0036112981e7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Dec 2018 18:02:21 -0800 Subject: [PATCH 1829/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225632120 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2f57562484a..c94b5ce2704 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f65af00d8cdbf29d6a273db7850188ff362ccc30091181202dc2a1cf2f78f629", - git_commit = "c152e8c1a8a27dda8d733493a64c3598d196053d", + sha256 = "c4b789dfcfb76afd11fb18310f280eaa2b0de16f35c9e1c46f813cedda662703", + git_commit = "2a0561d6875e43410275b8b9d3edb99e1bb14fab", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a62ed409b10f922e09a3b5a16e5ff1b54211c25d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Dec 2018 19:02:22 -0800 Subject: [PATCH 1830/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225636211 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c94b5ce2704..f32d9574c8a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c4b789dfcfb76afd11fb18310f280eaa2b0de16f35c9e1c46f813cedda662703", - git_commit = "2a0561d6875e43410275b8b9d3edb99e1bb14fab", + sha256 = "3ba10a215f01786bccffe434e6ac63b17c1f63cea69aed74944ae3eedc5d532b", + git_commit = "c7c0a76f1d6b8ac2057434fbf638b77993c6b88e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e5b101b1dc4ffabeee8d3d8801629baa7da76e25 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Dec 2018 20:02:00 -0800 Subject: [PATCH 1831/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225639576 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f32d9574c8a..27a49c947bd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3ba10a215f01786bccffe434e6ac63b17c1f63cea69aed74944ae3eedc5d532b", - git_commit = "c7c0a76f1d6b8ac2057434fbf638b77993c6b88e", + sha256 = "154101ca037720130257a1a2dd4ff20e9f39701f16e6187ee95a193d51bfd246", + git_commit = "5138caa12031a953ff877b0a785233b957e0993a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8bad5ffab1cf4294923f754b1af95ebb315f6770 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Dec 2018 21:01:59 -0800 Subject: [PATCH 1832/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225642676 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 27a49c947bd..bdeb9828528 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "154101ca037720130257a1a2dd4ff20e9f39701f16e6187ee95a193d51bfd246", - git_commit = "5138caa12031a953ff877b0a785233b957e0993a", + sha256 = "85378046a2fff9d1d65d444a880ce41a83988ca56619e63bbca6c8b9545e5039", + git_commit = "65470e7364d9566accafc9df52349533cdc3ea0a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b4a9c59ea04de6a561164ee3c384a590a09c64ca Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Dec 2018 22:02:21 -0800 Subject: [PATCH 1833/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225645557 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bdeb9828528..80ae75406c7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "85378046a2fff9d1d65d444a880ce41a83988ca56619e63bbca6c8b9545e5039", - git_commit = "65470e7364d9566accafc9df52349533cdc3ea0a", + sha256 = "408eaad149d07bcc779f7b8d43e254cbdbd78230c1cf6ed91bca6f6484dbd5b7", + git_commit = "65a0a3a05b53477e09cff1bd027d4942231893c3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3e4645975de07ca0d5fb131ffecb5272b848dcf9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 15 Dec 2018 03:02:48 -0800 Subject: [PATCH 1834/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225661967 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 80ae75406c7..9f3c9388ad4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "408eaad149d07bcc779f7b8d43e254cbdbd78230c1cf6ed91bca6f6484dbd5b7", - git_commit = "65a0a3a05b53477e09cff1bd027d4942231893c3", + sha256 = "f37f229b2c8fddef3bc423f7cd52215dae0ca5c5e7172987d942774c8f0ae6eb", + git_commit = "b37a329a6fc4aaf94767ebf5158689a3ee233b89", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4cde384b07bb1ddda6bb115a764adcc7add36dd6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 15 Dec 2018 19:02:00 -0800 Subject: [PATCH 1835/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225700210 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9f3c9388ad4..abc3c60cf99 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f37f229b2c8fddef3bc423f7cd52215dae0ca5c5e7172987d942774c8f0ae6eb", - git_commit = "b37a329a6fc4aaf94767ebf5158689a3ee233b89", + sha256 = "cc5e48fe9f5924882f6b68263d7e40771e48349c42431a436f7af7777bd17b53", + git_commit = "39d9c9e0a28231085fb86090c853de4535fecd1b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1724c41f15abdc0868a40769ed792dbc3ea3d5f3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 16 Dec 2018 03:02:18 -0800 Subject: [PATCH 1836/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225721653 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index abc3c60cf99..025fdc49de6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cc5e48fe9f5924882f6b68263d7e40771e48349c42431a436f7af7777bd17b53", - git_commit = "39d9c9e0a28231085fb86090c853de4535fecd1b", + sha256 = "390ca15e1bb4afe017e18207204e46918f49c85fb028c7b39eec52c5faef613f", + git_commit = "ebe98d94a5340386429da4b6e930b8cda9c7e854", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f8caef10f84d75686c4b92c1ef5c5c23a4d540a4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 16 Dec 2018 23:01:57 -0800 Subject: [PATCH 1837/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225775322 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 025fdc49de6..947f3cc89a1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "390ca15e1bb4afe017e18207204e46918f49c85fb028c7b39eec52c5faef613f", - git_commit = "ebe98d94a5340386429da4b6e930b8cda9c7e854", + sha256 = "5849afe8165155a3b8773361ff05bd239f41534d2053e8525ee5ea80f038df20", + git_commit = "feaaa82259a204b037eb9bd72ab2f74f9f4fe431", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0663f1f3ee31ac5a0ea617af28d039d2c44c4452 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Dec 2018 03:02:25 -0800 Subject: [PATCH 1838/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225797098 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 947f3cc89a1..2bedf231a6e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5849afe8165155a3b8773361ff05bd239f41534d2053e8525ee5ea80f038df20", - git_commit = "feaaa82259a204b037eb9bd72ab2f74f9f4fe431", + sha256 = "3aa0123f745774d71e99586435fd87019e3e081ad2893880fe340c535a751798", + git_commit = "1a85cf6170cdcf86c8a88595e07d237bc24ac3ea", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From aeca8a4295045763bce63b8a28b4a5d98618b65b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Dec 2018 04:02:45 -0800 Subject: [PATCH 1839/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225802343 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2bedf231a6e..79ae46011ef 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3aa0123f745774d71e99586435fd87019e3e081ad2893880fe340c535a751798", - git_commit = "1a85cf6170cdcf86c8a88595e07d237bc24ac3ea", + sha256 = "7db442af628f0974d3b9b212c584905837213e0d4218e6bc278baf6d3edf494f", + git_commit = "6decf0842b1f7ec17c7d8957d453cd5132b7a128", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f04d03dc1d86180629a5ac28ab462ad6a6f32a05 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Dec 2018 09:01:56 -0800 Subject: [PATCH 1840/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225834621 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 79ae46011ef..591d18a7f3d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7db442af628f0974d3b9b212c584905837213e0d4218e6bc278baf6d3edf494f", - git_commit = "6decf0842b1f7ec17c7d8957d453cd5132b7a128", + sha256 = "2ef2e0be02195d5f033394b27e58a6a5d9d1337931c58b24caeb38858358dbdd", + git_commit = "5f1c0c1c8d85ec0a4b9746e61ccf3dcb6c4a4220", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e31dcdd0c814ef82f8067d35d44011641547d2ff Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Dec 2018 10:01:45 -0800 Subject: [PATCH 1841/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225843708 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 591d18a7f3d..2cca916d7aa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2ef2e0be02195d5f033394b27e58a6a5d9d1337931c58b24caeb38858358dbdd", - git_commit = "5f1c0c1c8d85ec0a4b9746e61ccf3dcb6c4a4220", + sha256 = "60a305104a6b0ec691eee194c3047f190c80568e19d9359f5fce8bf8bf7a1c2a", + git_commit = "9fd825312972ad2f4235432b4b4e7b46b1068bbc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ecf3f9709a86b6d04207645584f0c4fa733bf1db Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Dec 2018 11:02:45 -0800 Subject: [PATCH 1842/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225855015 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2cca916d7aa..b4637689324 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "60a305104a6b0ec691eee194c3047f190c80568e19d9359f5fce8bf8bf7a1c2a", - git_commit = "9fd825312972ad2f4235432b4b4e7b46b1068bbc", + sha256 = "47b6482d1428dd83813a6a953ac9c43e0b1b8565c9c2f0042e7261fb9cd1198d", + git_commit = "fa7b38a5eae1e0818c8a1ac6a099fbbefa53727e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From bec7bb0049766226e103dc7b54668aa2b81410ac Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Dec 2018 12:02:27 -0800 Subject: [PATCH 1843/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225865843 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b4637689324..b7ecc4fd799 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "47b6482d1428dd83813a6a953ac9c43e0b1b8565c9c2f0042e7261fb9cd1198d", - git_commit = "fa7b38a5eae1e0818c8a1ac6a099fbbefa53727e", + sha256 = "e54b70320e042b43a495b798e8e573efcc89f68e54161684af398618e45d2891", + git_commit = "86a9610e8ac3340fdfbd5fceab5a6b3f402edc93", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 804bbc1aa5c307629b51a802c33182df4386c2f4 Mon Sep 17 00:00:00 2001 From: Karthik Vadla Date: Mon, 17 Dec 2018 13:01:24 -0800 Subject: [PATCH 1844/8103] Update to 18.04 and fix typos --- .../tensorflow/testdata/saved_model_half_plus_two.py | 6 +++--- tensorflow_serving/tools/docker/Dockerfile.devel-mkl | 4 ++-- tensorflow_serving/tools/docker/Dockerfile.mkl | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two.py b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two.py index 7a84169109c..db3377eb564 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two.py +++ b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two.py @@ -35,13 +35,13 @@ execution code. To create a CPU model: - bazel run -c opt saved_half_plus_two -- --device=cpu + bazel run -c opt saved_model_half_plus_two -- --device=cpu To create a CPU model with Intel MKL-DNN optimizations: - bazel run -c opt saved_half_plus_two -- --device=mkl + bazel run -c opt saved_model_half_plus_two -- --device=mkl To create GPU model: - bazel run --config=cuda -c opt saved_half_plus_two -- \ + bazel run --config=cuda -c opt saved_model_half_plus_two -- \ --device=gpu """ diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl index 6a1ec25b3b5..e3d65da6763 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl @@ -11,7 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -FROM ubuntu:16.04 as base_build +FROM ubuntu:18.04 as base_build ARG TF_SERVING_VERSION_GIT_BRANCH=master ARG TF_SERVING_VERSION_GIT_COMMIT=head @@ -28,7 +28,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ git \ libcurl3-dev \ libfreetype6-dev \ - libpng12-dev \ + libpng-dev \ libtool \ libzmq3-dev \ mlocate \ diff --git a/tensorflow_serving/tools/docker/Dockerfile.mkl b/tensorflow_serving/tools/docker/Dockerfile.mkl index f3706b245a4..6f27d291754 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.mkl +++ b/tensorflow_serving/tools/docker/Dockerfile.mkl @@ -16,7 +16,7 @@ ARG TF_SERVING_VERSION=latest ARG TF_SERVING_BUILD_IMAGE=tensorflow/serving:${TF_SERVING_VERSION}-devel-mkl FROM ${TF_SERVING_BUILD_IMAGE} as build_image -FROM ubuntu:16.04 +FROM ubuntu:18.04 ARG TF_SERVING_VERSION_GIT_BRANCH=master ARG TF_SERVING_VERSION_GIT_COMMIT=head From c93fe82b9dd990c2731f4a9ea4e8b8b34eaeeef7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Dec 2018 13:02:11 -0800 Subject: [PATCH 1845/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225875065 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b7ecc4fd799..549fef10ab8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e54b70320e042b43a495b798e8e573efcc89f68e54161684af398618e45d2891", - git_commit = "86a9610e8ac3340fdfbd5fceab5a6b3f402edc93", + sha256 = "1ef36490f91bc1f9b4f0917d6bf1e82ec26bf4f07c3eb5061a315827669ecd4a", + git_commit = "dc0aa75a0514ca51c1c70c27a37c77f893439561", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b06509141d14c19b8694d6cb41ee3f571a797e91 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Dec 2018 14:03:11 -0800 Subject: [PATCH 1846/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225885741 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 549fef10ab8..777d481f19a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1ef36490f91bc1f9b4f0917d6bf1e82ec26bf4f07c3eb5061a315827669ecd4a", - git_commit = "dc0aa75a0514ca51c1c70c27a37c77f893439561", + sha256 = "875e967d9812cf5b4cde8c7714327d84f9e74c62467c01ae3063b948d895b23e", + git_commit = "66f83978fed9a9292a5e4524206328734d006ac7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8d5589e8b899825b3e1319c2c250c9b7caf6d139 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Dec 2018 15:02:23 -0800 Subject: [PATCH 1847/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225896788 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 777d481f19a..edfa67af76c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "875e967d9812cf5b4cde8c7714327d84f9e74c62467c01ae3063b948d895b23e", - git_commit = "66f83978fed9a9292a5e4524206328734d006ac7", + sha256 = "d6ce22f29f43062b2cfb1d3eff583a294baf53e6c723271b67b69d7c742e0a8b", + git_commit = "f7e1f72cf63e3df0698ab1ce471cc014e057544f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d331bfc4a88b94e75dc49a3fa7288a63cebcd3d6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Dec 2018 16:03:00 -0800 Subject: [PATCH 1848/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225906449 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index edfa67af76c..f97d7a0ebd0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d6ce22f29f43062b2cfb1d3eff583a294baf53e6c723271b67b69d7c742e0a8b", - git_commit = "f7e1f72cf63e3df0698ab1ce471cc014e057544f", + sha256 = "25707e6e53029f8217af994e4d8dabca53567d567faf0a2dfd90b7a3a86f92ab", + git_commit = "36304bc4ceb6140e470420b65ce470092fc47ab2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2ab8008f54e1cba5bf15ee01283a69b45dda1baf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Dec 2018 17:02:24 -0800 Subject: [PATCH 1849/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225915103 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f97d7a0ebd0..2b34dcfe0b0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "25707e6e53029f8217af994e4d8dabca53567d567faf0a2dfd90b7a3a86f92ab", - git_commit = "36304bc4ceb6140e470420b65ce470092fc47ab2", + sha256 = "3dc002728ed5def626b4f35b0667de4f80b5296256d9b38dc4378cc398d2c3f3", + git_commit = "43fb1b497d2488e1460a50a3bffce9f3ead6df09", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e4484e29b7fd9e7e73ceb868d12cb6db33e4c502 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Dec 2018 18:01:54 -0800 Subject: [PATCH 1850/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225921993 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2b34dcfe0b0..756e56fd215 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3dc002728ed5def626b4f35b0667de4f80b5296256d9b38dc4378cc398d2c3f3", - git_commit = "43fb1b497d2488e1460a50a3bffce9f3ead6df09", + sha256 = "aa1fe44edd66a8c44bf03f9b5d7d3ce01892620d0136ea6c52462173ba2039d7", + git_commit = "8854a473a625ab59c66101573d770f0710a3076f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9f1254e19523b51eeb165d17da01c4c43b3654a8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Dec 2018 19:01:58 -0800 Subject: [PATCH 1851/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225927354 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 756e56fd215..955117f4288 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "aa1fe44edd66a8c44bf03f9b5d7d3ce01892620d0136ea6c52462173ba2039d7", - git_commit = "8854a473a625ab59c66101573d770f0710a3076f", + sha256 = "d04ca84e2d39d2fe6c90745edf21f4a5e029a42a117f228d0b40e65d70a9b7e5", + git_commit = "601a65952851d4ddb959a8481d9ea6e00c76bb04", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5e547c5586b5f37ce7c91938eff27df5f052a49a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Dec 2018 20:01:48 -0800 Subject: [PATCH 1852/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225931910 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 955117f4288..0d6e0bf831a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d04ca84e2d39d2fe6c90745edf21f4a5e029a42a117f228d0b40e65d70a9b7e5", - git_commit = "601a65952851d4ddb959a8481d9ea6e00c76bb04", + sha256 = "40ec6f6cd47043b7a2e0d9f6372016e2217f5475457a79155499f3402708a90b", + git_commit = "b447374e6646498b18e9fe945af633dc28d566e3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e4845d91507af024cac951b20d602f5cfae17fdc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Dec 2018 21:01:56 -0800 Subject: [PATCH 1853/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225936352 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0d6e0bf831a..9ddf9dd1990 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "40ec6f6cd47043b7a2e0d9f6372016e2217f5475457a79155499f3402708a90b", - git_commit = "b447374e6646498b18e9fe945af633dc28d566e3", + sha256 = "36688d200e368d9a63fe58d8ca7d5be05552d9c62f54b04297259fbfa42928f2", + git_commit = "d32dee99a1e0ed31e24ea7f0d6a08fcf69d3a474", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9d05b0c17be47d3260ab58c2b9ac97e202699b96 Mon Sep 17 00:00:00 2001 From: Shintaro Murakami Date: Fri, 9 Nov 2018 20:06:14 +0900 Subject: [PATCH 1854/8103] Fix default path of metrics endpoint --- tensorflow_serving/model_servers/http_server.cc | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tensorflow_serving/model_servers/http_server.cc b/tensorflow_serving/model_servers/http_server.cc index 584b5db541d..259b278897c 100644 --- a/tensorflow_serving/model_servers/http_server.cc +++ b/tensorflow_serving/model_servers/http_server.cc @@ -83,16 +83,16 @@ net_http::HTTPStatusCode ToHTTPStatusCode(const Status& status) { } void ProcessPrometheusRequest(PrometheusExporter* exporter, - const PrometheusConfig& prometheus_config, + const string& path, net_http::ServerRequestInterface* req) { std::vector> headers; headers.push_back({"Content-Type", "text/plain"}); string output; Status status; // Check if url matches the path. - if (req->uri_path() != prometheus_config.path()) { + if (req->uri_path() != path) { output = absl::StrFormat("Unexpected path: %s. Should be %s", - req->uri_path(), prometheus_config.path()); + req->uri_path(), path); status = Status(error::Code::INVALID_ARGUMENT, output); } else { status = exporter->GeneratePage(&output); @@ -196,10 +196,11 @@ std::unique_ptr CreateAndStartHttpServer( std::make_shared(); net_http::RequestHandlerOptions prometheus_request_options; PrometheusConfig prometheus_config = monitoring_config.prometheus_config(); + auto path = prometheus_config.path().empty() ? PrometheusExporter::kPrometheusPath : prometheus_config.path(); server->RegisterRequestHandler( - monitoring_config.prometheus_config().path(), - [exporter, prometheus_config](net_http::ServerRequestInterface* req) { - ProcessPrometheusRequest(exporter.get(), prometheus_config, req); + path, + [exporter, path](net_http::ServerRequestInterface* req) { + ProcessPrometheusRequest(exporter.get(), path, req); }, prometheus_request_options); } From a06401d2f8e55ff1b7898392c80b15b5c6d5f60e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Dec 2018 22:01:56 -0800 Subject: [PATCH 1855/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225940842 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9ddf9dd1990..65e3720e09b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "36688d200e368d9a63fe58d8ca7d5be05552d9c62f54b04297259fbfa42928f2", - git_commit = "d32dee99a1e0ed31e24ea7f0d6a08fcf69d3a474", + sha256 = "71358db441a2481580890f8ed2ee1f36156c656b31b53ebcfe41dca6c7b9c863", + git_commit = "27cb1211103f5962d984c71c16b1655dee92fc0a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d5831b20df320b31984ad9adaa4b76dfa5c2742a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Dec 2018 23:02:09 -0800 Subject: [PATCH 1856/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225944851 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 65e3720e09b..bf46b905ddb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "71358db441a2481580890f8ed2ee1f36156c656b31b53ebcfe41dca6c7b9c863", - git_commit = "27cb1211103f5962d984c71c16b1655dee92fc0a", + sha256 = "8976061421566e6d8e0e8738d1cadb32a3273e3e0f921b31296c2083fb703c7a", + git_commit = "e4d5cde00cde622794cfd375f19e1556870607d0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 073a737bce4f6aad93af6211391ae5562f21cc2d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Dec 2018 01:02:35 -0800 Subject: [PATCH 1857/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225954936 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bf46b905ddb..a31d24c5954 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8976061421566e6d8e0e8738d1cadb32a3273e3e0f921b31296c2083fb703c7a", - git_commit = "e4d5cde00cde622794cfd375f19e1556870607d0", + sha256 = "dc7501ec5b5cc49bcd8385cb13c788d230c57b3c4dc6450839e2f03ae4a395dc", + git_commit = "a4bb2859cfa8f92fc0318b70116eb7cd02eaaae8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5b3d409487eacf242ff259ad7548c7ef64501c8f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Dec 2018 02:02:06 -0800 Subject: [PATCH 1858/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225961696 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a31d24c5954..8cb4c72af84 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dc7501ec5b5cc49bcd8385cb13c788d230c57b3c4dc6450839e2f03ae4a395dc", - git_commit = "a4bb2859cfa8f92fc0318b70116eb7cd02eaaae8", + sha256 = "f87e240fd918198fb72eac251a15b737485dee8d8e80dc434915d728966138e5", + git_commit = "a5b6dcd084b76714d104492b49bf2a7c512a13c8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4f601c9e36bdfb887e52426603747f800b084fa0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Dec 2018 03:02:36 -0800 Subject: [PATCH 1859/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225968674 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8cb4c72af84..0c1aa84150f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f87e240fd918198fb72eac251a15b737485dee8d8e80dc434915d728966138e5", - git_commit = "a5b6dcd084b76714d104492b49bf2a7c512a13c8", + sha256 = "55c72ba4b448d0953423b0c89e86d61ef4b0d71cf4856acca92447671c840b59", + git_commit = "15fa7c49e27963df5304d7f827e6c4459079cc18", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8b03361ae60640d73c18f6e7a63ccc37280a45c6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Dec 2018 04:03:38 -0800 Subject: [PATCH 1860/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225974023 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0c1aa84150f..e368b446092 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "55c72ba4b448d0953423b0c89e86d61ef4b0d71cf4856acca92447671c840b59", - git_commit = "15fa7c49e27963df5304d7f827e6c4459079cc18", + sha256 = "8f878404a5322e63a21999d039a936081372f5d26b797855668a80ee90503466", + git_commit = "868a11a8de788134caeadc895625583e8b44b660", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From dff4826d2dd7edc36acdf8a64826444ba4af5d14 Mon Sep 17 00:00:00 2001 From: Tom Forbes Date: Tue, 18 Dec 2018 15:00:42 +0000 Subject: [PATCH 1861/8103] Correct docker command in tutorial --- tensorflow_serving/g3doc/docker.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/g3doc/docker.md b/tensorflow_serving/g3doc/docker.md index 456fc82ba44..0e575d80e28 100644 --- a/tensorflow_serving/g3doc/docker.md +++ b/tensorflow_serving/g3doc/docker.md @@ -92,7 +92,7 @@ to the serving docker containers. For example, if we wanted to pass a model config file instead of specifying the model name, we could do the following: ```shell -docker run -p 8500:8500 8501:8501 \ +docker run -p 8500:8500 -p 8501:8501 \ --mount type=bind,source=/path/to/my_model/,target=/models/my_model \ --mount type=bind,source=/path/to/my/models.config,target=/models/models.config \ -t tensorflow/serving --model_config_file=/models/models.config From 180277654870b5a322be7cb2b4f8e45b45c40c9d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Dec 2018 08:02:23 -0800 Subject: [PATCH 1862/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 225997032 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e368b446092..d8ba33ab674 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8f878404a5322e63a21999d039a936081372f5d26b797855668a80ee90503466", - git_commit = "868a11a8de788134caeadc895625583e8b44b660", + sha256 = "7fe6e2bb7b544113223bd27d51364d9c28313a728385060e04247862733183f3", + git_commit = "23c920fd443d160913976b3b75254c9023aa8791", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3fb2fd0e21582fffc3f6d338f0bda7917a731c91 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Dec 2018 09:02:08 -0800 Subject: [PATCH 1863/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226004862 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d8ba33ab674..98a8a85d7d8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7fe6e2bb7b544113223bd27d51364d9c28313a728385060e04247862733183f3", - git_commit = "23c920fd443d160913976b3b75254c9023aa8791", + sha256 = "97b17c84387acd26a33f41ac2c717d8fa0f8bb14a338d1a4cc0394c0471a89f7", + git_commit = "b1801cd34cf6a77efc37dd4e25a62a9f69f8732c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 54ba75ebd1686894b053b8c112c69cf7dae8e34e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Dec 2018 10:02:05 -0800 Subject: [PATCH 1864/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226014012 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 98a8a85d7d8..bf13cabf9e5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "97b17c84387acd26a33f41ac2c717d8fa0f8bb14a338d1a4cc0394c0471a89f7", - git_commit = "b1801cd34cf6a77efc37dd4e25a62a9f69f8732c", + sha256 = "0510c5bc654e50cca42e9a1824006e4b28927bdfa7024084a2c16a08c35ce256", + git_commit = "7ed1c1e26303e78cbddc11283fd193e4e49c4e3f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 858f0ccd785e25e7e23b6a4059c21cd212b9a32f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Dec 2018 11:02:08 -0800 Subject: [PATCH 1865/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226024936 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bf13cabf9e5..4e5f4a85386 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0510c5bc654e50cca42e9a1824006e4b28927bdfa7024084a2c16a08c35ce256", - git_commit = "7ed1c1e26303e78cbddc11283fd193e4e49c4e3f", + sha256 = "e280e3f27e842a7b6f6916a81aa165e7175c7a80ad89bd7befa96722e7687856", + git_commit = "cdc14f67360a11452490252bd4742ee862b0dc60", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1dd4055e6a8f7a71b814b18fa2a61bf479110fe5 Mon Sep 17 00:00:00 2001 From: Karthik Vadla Date: Tue, 18 Dec 2018 11:08:19 -0800 Subject: [PATCH 1866/8103] Add feedback changes --- .../tensorflow/testdata/saved_model_half_plus_two.py | 2 ++ tensorflow_serving/tools/docker/Dockerfile.devel-mkl | 6 ------ tensorflow_serving/tools/docker/Dockerfile.mkl | 6 +++--- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two.py b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two.py index db3377eb564..8bf4a51eabc 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two.py +++ b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two.py @@ -53,6 +53,8 @@ import os import sys +# This is a placeholder for a Google-internal import. + import tensorflow as tf from tensorflow.python.lib.io import file_io diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl index e3d65da6763..a91370f4382 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl @@ -82,12 +82,6 @@ RUN git clone --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tenso FROM base_build as binary_build # Build, and install TensorFlow Serving -# Use --copt=-march values to get optimized builds appropriate for the hardware -# platform of your choice. -# For ivy-bridge or sandy-bridge -# --copt=-march="avx" \ -# For haswell, broadwell, or skylake -# --copt=-march="avx2" \ ARG TF_SERVING_BUILD_OPTIONS="--config=mkl --config=nativeopt" RUN echo "Building with build options: ${TF_SERVING_BUILD_OPTIONS}" diff --git a/tensorflow_serving/tools/docker/Dockerfile.mkl b/tensorflow_serving/tools/docker/Dockerfile.mkl index 6f27d291754..d03f9feca39 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.mkl +++ b/tensorflow_serving/tools/docker/Dockerfile.mkl @@ -26,7 +26,7 @@ LABEL tensorflow_serving_github_branchtag=${TF_SERVING_VERSION_GIT_BRANCH} LABEL tensorflow_serving_github_commit=${TF_SERVING_VERSION_GIT_COMMIT} RUN apt-get update && apt-get install -y --no-install-recommends \ - ca-certificates htop \ + ca-certificates \ && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* @@ -60,7 +60,7 @@ ENV MODEL_NAME=model # Create a script that runs the model server so we can use environment variables # while also passing in arguments from the docker command line -# Setting MKL environment variables gave better performance. +# Setting MKL environment variables can improve performance. # https://www.tensorflow.org/guide/performance/overview # Read about Tuning MKL for the best performance # Add export MKLDNN_VERBOSE=1 to the below script, @@ -72,7 +72,7 @@ ENV MODEL_NAME=model # gave optimal performance results with MKL # KMP_BLOCKTIME= -# NOTE: We don't gurantee same settings to give optimal peformance across all hardwares +# NOTE: We don't guarantee same settings to give optimal peformance across all hardware # please tune variables as required. ENV OMP_NUM_THREADS=2 From c2a4716d8874fac274a51478ff8f1ed6f8a0ae1f Mon Sep 17 00:00:00 2001 From: Karthik Vadla Date: Tue, 18 Dec 2018 12:01:58 -0800 Subject: [PATCH 1867/8103] Remove extra line and exports --- .../tensorflow/testdata/saved_model_half_plus_two.py | 1 - tensorflow_serving/tools/docker/Dockerfile.mkl | 5 ----- 2 files changed, 6 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two.py b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two.py index 8bf4a51eabc..d15d52246b9 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two.py +++ b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two.py @@ -54,7 +54,6 @@ import sys # This is a placeholder for a Google-internal import. - import tensorflow as tf from tensorflow.python.lib.io import file_io diff --git a/tensorflow_serving/tools/docker/Dockerfile.mkl b/tensorflow_serving/tools/docker/Dockerfile.mkl index d03f9feca39..16a244a5d03 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.mkl +++ b/tensorflow_serving/tools/docker/Dockerfile.mkl @@ -84,11 +84,6 @@ ENV MKLDNN_VERBOSE=0 ENV TENSORFLOW_SESSION_PARALLELISM=2 RUN echo '#!/bin/bash \n\n\ -export OMP_NUM_THREADS=${OMP_NUM_THREADS} \n\ -export KMP_BLOCKTIME=${KMP_BLOCKTIME} \n\ -export KMP_SETTINGS=${KMP_SETTINGS} \n\ -export KMP_AFFINITY=${KMP_AFFINITY} \n\ -export MKLDNN_VERBOSE=${MKLDNN_VERBOSE} \n\ tensorflow_model_server --port=8500 --rest_api_port=8501 \ --tensorflow_session_parallelism=${TENSORFLOW_SESSION_PARALLELISM} \ --model_name=${MODEL_NAME} --model_base_path=${MODEL_BASE_PATH}/${MODEL_NAME} \ From 0f0ec4d969074f22c11870dd53eb72d51c7e4869 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Dec 2018 12:02:26 -0800 Subject: [PATCH 1868/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226035601 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4e5f4a85386..82739f8515b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e280e3f27e842a7b6f6916a81aa165e7175c7a80ad89bd7befa96722e7687856", - git_commit = "cdc14f67360a11452490252bd4742ee862b0dc60", + sha256 = "959dea3b861fb1191745d3e934d9918d73783c3adb0714928b6f628ffa3e0180", + git_commit = "507b30a43ad8c5fee7a21c9abcb0c99fc183ec83", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From bba4fe581685743165bc0bf24b3ab1975f366724 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Dec 2018 13:01:59 -0800 Subject: [PATCH 1869/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226044993 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 82739f8515b..e5f442424c7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "959dea3b861fb1191745d3e934d9918d73783c3adb0714928b6f628ffa3e0180", - git_commit = "507b30a43ad8c5fee7a21c9abcb0c99fc183ec83", + sha256 = "f10fbc64cc4cd5ada4ebddcdd26f8f76cd97e6aff8e25956172ee18f98a705ea", + git_commit = "787c2a684e39d9c21525c07da3e56bc68621e9b7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 88e6b2c14ced41b8978af964e2dad34ba6c50bb3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Dec 2018 14:02:17 -0800 Subject: [PATCH 1870/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226055157 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e5f442424c7..a73b2a73a8d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f10fbc64cc4cd5ada4ebddcdd26f8f76cd97e6aff8e25956172ee18f98a705ea", - git_commit = "787c2a684e39d9c21525c07da3e56bc68621e9b7", + sha256 = "825b0cbd8fd53036e14c5427f4b9c0d9a44d13cb068a5d67208a1f3e3d10be8c", + git_commit = "28e306d6c1e7146e0c9eb73842a116607b4391fd", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7331adc1cfde65aa2c602e87efeb723cc4c86874 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Dec 2018 15:02:29 -0800 Subject: [PATCH 1871/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226066297 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a73b2a73a8d..c7cd9616eab 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "825b0cbd8fd53036e14c5427f4b9c0d9a44d13cb068a5d67208a1f3e3d10be8c", - git_commit = "28e306d6c1e7146e0c9eb73842a116607b4391fd", + sha256 = "79ada82145bcafa6f3499519aa6a546a18982fd60ffe3ca0b6b0efcbaedb42fc", + git_commit = "13fce1e3bea288bf08c695a078ac42853e69182a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3d7ed91c4cfe0bec5465285c39cc91b05274f684 Mon Sep 17 00:00:00 2001 From: Karthik Vadla Date: Tue, 18 Dec 2018 15:38:29 -0800 Subject: [PATCH 1872/8103] Remove extra line --- tensorflow_serving/servables/tensorflow/testdata/BUILD | 1 - 1 file changed, 1 deletion(-) diff --git a/tensorflow_serving/servables/tensorflow/testdata/BUILD b/tensorflow_serving/servables/tensorflow/testdata/BUILD index 0a7fade4d38..cc23480778d 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/BUILD +++ b/tensorflow_serving/servables/tensorflow/testdata/BUILD @@ -100,7 +100,6 @@ filegroup( ), ) - # Note: re-generate these files with :export_half_plus_two whenever model # changes. exports_files([ From 27a1462893d1c9c590200a45291bcc80656e60d4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Dec 2018 16:03:23 -0800 Subject: [PATCH 1873/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226075670 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c7cd9616eab..3fde0a677c2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "79ada82145bcafa6f3499519aa6a546a18982fd60ffe3ca0b6b0efcbaedb42fc", - git_commit = "13fce1e3bea288bf08c695a078ac42853e69182a", + sha256 = "6ee9da0e4c6d5ce53670f13071ba5c1b31a22226fedf9e12f5d5de7e36c08638", + git_commit = "8d1099b51f7ff8a5ac0bae8cad5bd91fc0b43815", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 47b7bef00574e1ee224f8e7b2d969cac92d14732 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Dec 2018 17:01:42 -0800 Subject: [PATCH 1874/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226085377 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3fde0a677c2..70a515f2f70 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6ee9da0e4c6d5ce53670f13071ba5c1b31a22226fedf9e12f5d5de7e36c08638", - git_commit = "8d1099b51f7ff8a5ac0bae8cad5bd91fc0b43815", + sha256 = "bc8f10d632097584daaf78532dd3d04db179a0127ecb78efaa25ab75bb05ad1d", + git_commit = "a2bf042d36b7b1abe3dc2b81e074aa9f0abea03d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c507bc77b25b6156ff0f1140e1c92171fbdf3d03 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Dec 2018 18:02:28 -0800 Subject: [PATCH 1875/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226093921 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 70a515f2f70..a2f4a09a552 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bc8f10d632097584daaf78532dd3d04db179a0127ecb78efaa25ab75bb05ad1d", - git_commit = "a2bf042d36b7b1abe3dc2b81e074aa9f0abea03d", + sha256 = "9749e8b2fdd061937a7b317256abf462f798b9ce5033da7a9d63a1c0d0f38eed", + git_commit = "09feb6963d691ce12c41fd20ff7638daa89aea11", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0bfacd34cab4cdbbf1dca9dbc3cbc72f1632d2d5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Dec 2018 19:02:57 -0800 Subject: [PATCH 1876/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226100496 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a2f4a09a552..c37b9d6b7a3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9749e8b2fdd061937a7b317256abf462f798b9ce5033da7a9d63a1c0d0f38eed", - git_commit = "09feb6963d691ce12c41fd20ff7638daa89aea11", + sha256 = "db3aaa325ba677ba206d63aeadf897277f9898bf1ab0918d581eee9eb853b13f", + git_commit = "433fc205600e725365430c07a04eaa292a6cc1a1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 44561476cb3175060298f1d5a8e42e25298ea230 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Dec 2018 20:02:08 -0800 Subject: [PATCH 1877/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226105390 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c37b9d6b7a3..fad0bb8655d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "db3aaa325ba677ba206d63aeadf897277f9898bf1ab0918d581eee9eb853b13f", - git_commit = "433fc205600e725365430c07a04eaa292a6cc1a1", + sha256 = "b7924bc9a93b7601fa5d9824252e1bf63b240a82294bd6752f8b7b92a151e6c1", + git_commit = "eb1d13e031069994b9deb55b79f704e2c840dcde", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e9be2862fcc893cffb91468c73450744a6992d90 Mon Sep 17 00:00:00 2001 From: Siju Date: Wed, 19 Dec 2018 10:28:02 +0530 Subject: [PATCH 1878/8103] Update api_rest.md documentation issue 'Inifinity' --- tensorflow_serving/g3doc/api_rest.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/g3doc/api_rest.md b/tensorflow_serving/g3doc/api_rest.md index ff7d59e054a..058f58dfbbb 100644 --- a/tensorflow_serving/g3doc/api_rest.md +++ b/tensorflow_serving/g3doc/api_rest.md @@ -382,7 +382,7 @@ such values. This implies that requests like the following one are valid: ``` A (strict) standards compliant JSON parser will reject this with a parse error -(due to `NaN` and `Inifinity` tokens mixed with actual numbers). To correctly +(due to `NaN` and `Infinity` tokens mixed with actual numbers). To correctly handle requests/responses in your code, use a JSON parser that supports these tokens. From 7dc7d7929dcb5dfa0fcac48d13d83aa33b9cad95 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Dec 2018 21:01:54 -0800 Subject: [PATCH 1879/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226110380 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fad0bb8655d..ec176e2bf96 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b7924bc9a93b7601fa5d9824252e1bf63b240a82294bd6752f8b7b92a151e6c1", - git_commit = "eb1d13e031069994b9deb55b79f704e2c840dcde", + sha256 = "8e52bc6513097c3b0ee20ba37caf9e16aa04c6d33c2244347e15b43b9bbfad52", + git_commit = "f73a4f9951d065c3586994b0850b4d2ce843a252", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1ad2815576886991c3ea6982d0dff3844d970753 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Dec 2018 22:02:08 -0800 Subject: [PATCH 1880/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226115181 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ec176e2bf96..e482f0125b7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8e52bc6513097c3b0ee20ba37caf9e16aa04c6d33c2244347e15b43b9bbfad52", - git_commit = "f73a4f9951d065c3586994b0850b4d2ce843a252", + sha256 = "39ca11f491528537400033459322daf582277c0ef6745e8cf9d9f1a56710d0b5", + git_commit = "0e1f4418b84170533b3d388ac29042fe486403ee", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fcc7cde2812d77d8505bb11950fed123ee4e7d87 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Dec 2018 23:02:09 -0800 Subject: [PATCH 1881/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226119718 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e482f0125b7..ac4eba3f372 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "39ca11f491528537400033459322daf582277c0ef6745e8cf9d9f1a56710d0b5", - git_commit = "0e1f4418b84170533b3d388ac29042fe486403ee", + sha256 = "19ff24e00d593df7bd71cfee51a43423d0bc8af278482c11df32d48a45f07f09", + git_commit = "af92068a66f0f089be46d40ca00b4c3ce2e7c5ab", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b7ef40a774b6fcf9284f5d207353ec7515fd308d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 19 Dec 2018 00:02:29 -0800 Subject: [PATCH 1882/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226124563 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ac4eba3f372..6885839d2e4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "19ff24e00d593df7bd71cfee51a43423d0bc8af278482c11df32d48a45f07f09", - git_commit = "af92068a66f0f089be46d40ca00b4c3ce2e7c5ab", + sha256 = "3e5b24dd5243629aab85e8fc00f2e69534282d6b47b13f4cb51c4d79091b0d08", + git_commit = "627fd023a0899d43f1129d9852b4ece72567c8b9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 79f5c95ddd21530320e5c2b3fe4e32cd8fc85b97 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 19 Dec 2018 01:02:30 -0800 Subject: [PATCH 1883/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226130983 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6885839d2e4..d33d8d0765b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3e5b24dd5243629aab85e8fc00f2e69534282d6b47b13f4cb51c4d79091b0d08", - git_commit = "627fd023a0899d43f1129d9852b4ece72567c8b9", + sha256 = "3d088214ba8bdb0901c7ab98be11c5962d0debf50afbf67dc1365520d601fe4b", + git_commit = "1fc046c3a8eb62690cd78a6da1b62463e9133f6d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From eedb19ed55d82351723475213eba8dfde39db564 Mon Sep 17 00:00:00 2001 From: Siju Date: Wed, 19 Dec 2018 17:11:11 +0530 Subject: [PATCH 1884/8103] Update README.md typo numbrer->number --- tensorflow_serving/batching/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/batching/README.md b/tensorflow_serving/batching/README.md index 4d584587d13..f152fa72e7b 100644 --- a/tensorflow_serving/batching/README.md +++ b/tensorflow_serving/batching/README.md @@ -74,7 +74,7 @@ some number of times with a delay; again, see below. A final configuration parameter is `allowed_batch_sizes`. This parameter is optional. If unset, then batch sizes can vary freely between 1 and the maximum -allowed size, say 1024. Depending on your environment, having a large numbrer +allowed size, say 1024. Depending on your environment, having a large number of possible batch sizes may cause problems. The `allowed_batch_sizes` parameter lets you limit the batch sizes to a fixed set, say 128, 256, 512, 1024. `BatchingSession` adheres to this restriction by padding invalid-size batches From 04ada4652dbff8f8124b632b184d848ca98f7c65 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 19 Dec 2018 17:02:42 -0800 Subject: [PATCH 1885/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226257765 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d33d8d0765b..4dbae0ce42f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3d088214ba8bdb0901c7ab98be11c5962d0debf50afbf67dc1365520d601fe4b", - git_commit = "1fc046c3a8eb62690cd78a6da1b62463e9133f6d", + sha256 = "8bf9fb4bc821aeb1df81793928ace797a20782464e4a8922832a91d0bf895cb3", + git_commit = "23057a683adb1b5af4d202c44001bf0aa66c982c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d2f5b0724cd505beca84d82bf60a528679aebdfb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 19 Dec 2018 18:02:04 -0800 Subject: [PATCH 1886/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226264482 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4dbae0ce42f..a8596d2e018 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8bf9fb4bc821aeb1df81793928ace797a20782464e4a8922832a91d0bf895cb3", - git_commit = "23057a683adb1b5af4d202c44001bf0aa66c982c", + sha256 = "6bb67c05b89135614d3622f7264536df72bbebdcfec760ca0f280a5486426464", + git_commit = "5df47b8808bf29d9b9ae9d7a56448dd70a5687be", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 43954f0f6cb85257fefba84878a295df59ae9df0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 19 Dec 2018 19:01:57 -0800 Subject: [PATCH 1887/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226269780 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a8596d2e018..42e32dcbd6f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6bb67c05b89135614d3622f7264536df72bbebdcfec760ca0f280a5486426464", - git_commit = "5df47b8808bf29d9b9ae9d7a56448dd70a5687be", + sha256 = "f561d8434de5a444443a41bd4bc4229cedaf4bff1e65ca59257cba19c81a6274", + git_commit = "43aa760a71c7da8f2f89c988849a1116acd34b38", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2c2ac60aa4f71c7a2c5191834160d12e0524485e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 19 Dec 2018 20:02:03 -0800 Subject: [PATCH 1888/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226274368 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 42e32dcbd6f..9f59b21bdc4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f561d8434de5a444443a41bd4bc4229cedaf4bff1e65ca59257cba19c81a6274", - git_commit = "43aa760a71c7da8f2f89c988849a1116acd34b38", + sha256 = "bdc976916fe2287085392202157d357fc5ead55bcd26c8c69f220cbecaa93897", + git_commit = "9b46c486fd50eb44a3403f16e68a661e9273ef59", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ed1f09624d727cadeb82e8e6563d18491e05a0e4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 19 Dec 2018 21:01:55 -0800 Subject: [PATCH 1889/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226278360 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9f59b21bdc4..7f8e2ab9618 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bdc976916fe2287085392202157d357fc5ead55bcd26c8c69f220cbecaa93897", - git_commit = "9b46c486fd50eb44a3403f16e68a661e9273ef59", + sha256 = "b3f68dec54cae97438752f1c0a8839803fee7977a8153e93dd036ca9aaa6723a", + git_commit = "31c0a32740d70bb0f4c1787e1087d4bd70d59dfe", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From aa1b35c8d121af9656afda5d71487d5648d8e0d9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 19 Dec 2018 22:01:50 -0800 Subject: [PATCH 1890/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226282142 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7f8e2ab9618..662cdf1aa44 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b3f68dec54cae97438752f1c0a8839803fee7977a8153e93dd036ca9aaa6723a", - git_commit = "31c0a32740d70bb0f4c1787e1087d4bd70d59dfe", + sha256 = "f79d6de41e13995d1073e30713e62def94661f2914f6ffa3175d0671f2915002", + git_commit = "67cd0544a60a7b018e2adb18293855f156d18c25", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4553e273517099a74054375653845343528c1b24 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 19 Dec 2018 23:02:24 -0800 Subject: [PATCH 1891/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226285962 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 662cdf1aa44..3e364bb1903 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f79d6de41e13995d1073e30713e62def94661f2914f6ffa3175d0671f2915002", - git_commit = "67cd0544a60a7b018e2adb18293855f156d18c25", + sha256 = "90f251ed38ccd4862e5a9731598c7fecafa88a8498d41ae5469e21c9f013350d", + git_commit = "01b5dfc86cfc0ff341caf39724b9c48499c076b1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 804fbeda4dfa7112693a453b6d02c0b93b99b836 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Dec 2018 03:02:27 -0800 Subject: [PATCH 1892/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226308047 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3e364bb1903..d114af997b5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "90f251ed38ccd4862e5a9731598c7fecafa88a8498d41ae5469e21c9f013350d", - git_commit = "01b5dfc86cfc0ff341caf39724b9c48499c076b1", + sha256 = "b180575a9fbdb90e2401b1262e933a780a723857277caa97d092403721b5075a", + git_commit = "a5e8aac5fb85101ab8aa96bfa14a32d85c1c7d7b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f7a9f6868ea369b1345f06ffb12b23df84e51dd0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Dec 2018 04:02:24 -0800 Subject: [PATCH 1893/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226312531 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d114af997b5..dd812f46af7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b180575a9fbdb90e2401b1262e933a780a723857277caa97d092403721b5075a", - git_commit = "a5e8aac5fb85101ab8aa96bfa14a32d85c1c7d7b", + sha256 = "314669350bbb63a3c2b5ee459ac88d2395ae0e86ca82ccc3ec146814c0fa62af", + git_commit = "7cd0a903f69628ca8dd758f6dfad96c3b84fdeee", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2fbf3bf8b52d2981699881edb2320f706aa9d9f8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Dec 2018 07:02:04 -0800 Subject: [PATCH 1894/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226329926 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dd812f46af7..164341962d3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "314669350bbb63a3c2b5ee459ac88d2395ae0e86ca82ccc3ec146814c0fa62af", - git_commit = "7cd0a903f69628ca8dd758f6dfad96c3b84fdeee", + sha256 = "1435dbff08815f3d451ffb9a7471b15adf2f2199be7c6fba33696c72ba586bcf", + git_commit = "90524712e34b568e5c2ae57ae36a21a72f4b43f1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ac5569464945c909278d957f1a2e43e43894437e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Dec 2018 09:01:56 -0800 Subject: [PATCH 1895/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226343665 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 164341962d3..bb878b32e9c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1435dbff08815f3d451ffb9a7471b15adf2f2199be7c6fba33696c72ba586bcf", - git_commit = "90524712e34b568e5c2ae57ae36a21a72f4b43f1", + sha256 = "bd853d278f73ab90b7c9d6fc7bc233c2a69dd7b26815f8376427822ea9091030", + git_commit = "fe84b75a8c30792b404d5cd81a8fdb2dd4d16732", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 63634ccad177fab070eb424f161670b80f47b712 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Dec 2018 11:01:47 -0800 Subject: [PATCH 1896/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226361531 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bb878b32e9c..d36309c1cc6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bd853d278f73ab90b7c9d6fc7bc233c2a69dd7b26815f8376427822ea9091030", - git_commit = "fe84b75a8c30792b404d5cd81a8fdb2dd4d16732", + sha256 = "7eb2f63527be7cf9271289bafe4da46efe534bf5f6949966e2ac66bb4183c30e", + git_commit = "b0667edeb9b444c95299bef1e754f8c83b08d68c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 35d01e80cf9d9976cbb875924fb126b65591dcab Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Dec 2018 12:03:10 -0800 Subject: [PATCH 1897/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226371950 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d36309c1cc6..10895cd5d6e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7eb2f63527be7cf9271289bafe4da46efe534bf5f6949966e2ac66bb4183c30e", - git_commit = "b0667edeb9b444c95299bef1e754f8c83b08d68c", + sha256 = "16137a44bb9428fe7052e335a1d74ef79961b4a75d68767c5b714f058469437e", + git_commit = "56c0758d5eb48772793a1e05473c6a6b4b266a62", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 506ac523e1bbbde08a5d39a1ca0d2fdad085f949 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Dec 2018 13:02:15 -0800 Subject: [PATCH 1898/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226380582 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 10895cd5d6e..d2fb62aa1f9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "16137a44bb9428fe7052e335a1d74ef79961b4a75d68767c5b714f058469437e", - git_commit = "56c0758d5eb48772793a1e05473c6a6b4b266a62", + sha256 = "1d4b33167065452536dbd18a3ed94b87681f9335eab3f6767949992095467f14", + git_commit = "d969cd8ff9a337503963c8f4a02f56b7d776171e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a58956adc7a05d0a7ddb2601c6456bebd994620e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Dec 2018 14:02:21 -0800 Subject: [PATCH 1899/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226389785 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d2fb62aa1f9..926eafc60e6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1d4b33167065452536dbd18a3ed94b87681f9335eab3f6767949992095467f14", - git_commit = "d969cd8ff9a337503963c8f4a02f56b7d776171e", + sha256 = "9c3a3eaacf16f736271a329591e77397d2b1c410f77e7d1bd83a2a0da29637c5", + git_commit = "d573107b32371d28bce06ffb041d01c23c34a6d2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 281e53b1daade529d5a287a5864769415220d7c0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Dec 2018 15:02:49 -0800 Subject: [PATCH 1900/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226399388 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 926eafc60e6..8347e02460a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9c3a3eaacf16f736271a329591e77397d2b1c410f77e7d1bd83a2a0da29637c5", - git_commit = "d573107b32371d28bce06ffb041d01c23c34a6d2", + sha256 = "1aa8f9c2096e391943526cfdc41287b6d0b1448f36f9a19ba01950b24b64e365", + git_commit = "43cb5e8be4e954dba9abe74c472f732b5a7604d6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 20be1d9d2cce7d925bc0474b660b5134dfd95782 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Dec 2018 16:02:27 -0800 Subject: [PATCH 1901/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226408729 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8347e02460a..0339c3fbd66 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1aa8f9c2096e391943526cfdc41287b6d0b1448f36f9a19ba01950b24b64e365", - git_commit = "43cb5e8be4e954dba9abe74c472f732b5a7604d6", + sha256 = "a00a6f9e90d80549919d33556f78a1413499a5e9964c5e430e09d4883fd2a079", + git_commit = "23178bd4985caa7a2ad3c1dcb0c876874f70dd19", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d319793f2aa4b58261ff52b57350917dc41f839e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Dec 2018 17:02:09 -0800 Subject: [PATCH 1902/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226417079 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0339c3fbd66..0c92a306cff 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a00a6f9e90d80549919d33556f78a1413499a5e9964c5e430e09d4883fd2a079", - git_commit = "23178bd4985caa7a2ad3c1dcb0c876874f70dd19", + sha256 = "8992976545d0d1d8b14162a3801b6465187491198db926510e50b1064ea99516", + git_commit = "cb92d9f3aafa65796737ccf834f254c719147ffc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6c95f6c0a853795a8b5b175ede65f68271088702 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Dec 2018 18:02:22 -0800 Subject: [PATCH 1903/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226423847 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0c92a306cff..d0853b4b384 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8992976545d0d1d8b14162a3801b6465187491198db926510e50b1064ea99516", - git_commit = "cb92d9f3aafa65796737ccf834f254c719147ffc", + sha256 = "dad18afde76d3f1c84d3412e39df2e654ecc5dd824f75f151b02827871d2ca45", + git_commit = "01b7f2441e7549b97c1a2228bd6f79c6fd61bed2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5377a9e3436c6c211b3a432a1e927665438bcb71 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Dec 2018 19:02:14 -0800 Subject: [PATCH 1904/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226429284 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d0853b4b384..743a50c8087 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dad18afde76d3f1c84d3412e39df2e654ecc5dd824f75f151b02827871d2ca45", - git_commit = "01b7f2441e7549b97c1a2228bd6f79c6fd61bed2", + sha256 = "32a108d26806dec01986307ce3bda609ac4fe2406a032fe24d46e16d36be9694", + git_commit = "83dbe37b4be4cb289da6d1a4d92e17c583e2668e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From dda0a47bb7a6f9a848cb4b7240da62583a591065 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Dec 2018 20:01:46 -0800 Subject: [PATCH 1905/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226433663 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 743a50c8087..191a3282985 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "32a108d26806dec01986307ce3bda609ac4fe2406a032fe24d46e16d36be9694", - git_commit = "83dbe37b4be4cb289da6d1a4d92e17c583e2668e", + sha256 = "8d9ea8e4f0b2a661c5b4af8b9efc20656aa07af11250ef9a9632fda1d1e3cef3", + git_commit = "03d9c44ed47510f8a7c0f00153b314b419379bf4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d8f193af60acc90a4daedaa36ee01c14881a4680 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Dec 2018 21:02:13 -0800 Subject: [PATCH 1906/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226437861 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 191a3282985..c1e59a648ef 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8d9ea8e4f0b2a661c5b4af8b9efc20656aa07af11250ef9a9632fda1d1e3cef3", - git_commit = "03d9c44ed47510f8a7c0f00153b314b419379bf4", + sha256 = "5a758b8ea52056239b4f0ce5f3cd6ac4160bc299c3212fdf667350b533e9c421", + git_commit = "1b2c81745d87c956b156dfd85d69cc89523e86eb", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b75127c1bbdf327aa298e652b1a53f7b98722ed2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Dec 2018 22:02:06 -0800 Subject: [PATCH 1907/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226441925 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c1e59a648ef..222fbba4e0f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5a758b8ea52056239b4f0ce5f3cd6ac4160bc299c3212fdf667350b533e9c421", - git_commit = "1b2c81745d87c956b156dfd85d69cc89523e86eb", + sha256 = "a085bcdcb210d8146f7aad016cd891e6a89c4d9968c9d7f9c0f04178d296c704", + git_commit = "bb479118c9fed7be0186f98a3939ec28b162f2fe", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8708cb16b265d4a5b53b704f6910ef01a01c5283 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Dec 2018 23:02:01 -0800 Subject: [PATCH 1908/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226445876 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 222fbba4e0f..284c8ad0eb4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a085bcdcb210d8146f7aad016cd891e6a89c4d9968c9d7f9c0f04178d296c704", - git_commit = "bb479118c9fed7be0186f98a3939ec28b162f2fe", + sha256 = "a859c3d48f2ecbcd08d53b7cb4539cc1a5effa11f6e9ae84491384ea4296b962", + git_commit = "d4ddccd3cca4fc837c66ae1dfa190739420ad122", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5e5e8dab69e8104b02c6d14a217f8afa45c5d254 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 21 Dec 2018 03:02:42 -0800 Subject: [PATCH 1909/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226465627 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 284c8ad0eb4..b9069f648f7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a859c3d48f2ecbcd08d53b7cb4539cc1a5effa11f6e9ae84491384ea4296b962", - git_commit = "d4ddccd3cca4fc837c66ae1dfa190739420ad122", + sha256 = "2cdbe6b2be3832c47c7bb207eb4f20d7770bdb2a863057386efdbd4f284316dd", + git_commit = "69803fb6f8d142c1d78b1c423a53ee797444fdf1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 59176f8bca7e37942e1691b8583264353d04de20 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 21 Dec 2018 05:02:26 -0800 Subject: [PATCH 1910/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226474715 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b9069f648f7..51fdac9061f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2cdbe6b2be3832c47c7bb207eb4f20d7770bdb2a863057386efdbd4f284316dd", - git_commit = "69803fb6f8d142c1d78b1c423a53ee797444fdf1", + sha256 = "4e61ef8e413e94cb525523c87c02ca1a7fd381acbc9811eaed0c87f32026bea5", + git_commit = "9972577e17c14e1526f59d18f9e17bea1c3eec22", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 82594977c65a3dd6f4656b4c354dd3e0d2105d75 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 21 Dec 2018 06:02:27 -0800 Subject: [PATCH 1911/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226479473 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 51fdac9061f..215edbd354f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4e61ef8e413e94cb525523c87c02ca1a7fd381acbc9811eaed0c87f32026bea5", - git_commit = "9972577e17c14e1526f59d18f9e17bea1c3eec22", + sha256 = "6c95875a877ffd9d5ddb588056a5a7ebd1fa2d111ac782f13e6431210174a8f1", + git_commit = "c016d41682895ee3a61bc0946ecf2ca421d17655", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7b02a45fa0f81fb307005c5c19104ef5839a1d1c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 21 Dec 2018 08:02:13 -0800 Subject: [PATCH 1912/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226490725 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 215edbd354f..42b0ec8b3d8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6c95875a877ffd9d5ddb588056a5a7ebd1fa2d111ac782f13e6431210174a8f1", - git_commit = "c016d41682895ee3a61bc0946ecf2ca421d17655", + sha256 = "fa7a301a90d009bde6186c4d5cebddc90edfdfad6305575b9363ecbda20b8015", + git_commit = "2a240b1d1319842bf360bf08d7fc5cb8458bbb0a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 72326a2310f76074298992b0785762e351fd8752 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 21 Dec 2018 09:02:02 -0800 Subject: [PATCH 1913/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226497132 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 42b0ec8b3d8..e8c530753da 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fa7a301a90d009bde6186c4d5cebddc90edfdfad6305575b9363ecbda20b8015", - git_commit = "2a240b1d1319842bf360bf08d7fc5cb8458bbb0a", + sha256 = "31c7644ab9d76893482463af869de152d31925093b75982dd0e5498f650737bd", + git_commit = "64812d4ca383552453a8269e8bc011fe2a0e47ca", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b87d52ca4261394e97b4a678963d18d44d5d5313 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 21 Dec 2018 10:01:50 -0800 Subject: [PATCH 1914/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226504304 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e8c530753da..efcb4b34654 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "31c7644ab9d76893482463af869de152d31925093b75982dd0e5498f650737bd", - git_commit = "64812d4ca383552453a8269e8bc011fe2a0e47ca", + sha256 = "8f4a9592f01c51666678f17e5b1ffa301095663ccb79f6683600437f88ad7e21", + git_commit = "8aa05f01046dddcfca29faa0714789e2be31fbc4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6f0510dddcc37a28d038b87283c01ca41f49d0a0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 21 Dec 2018 11:01:56 -0800 Subject: [PATCH 1915/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226513486 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index efcb4b34654..44d9f53defd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8f4a9592f01c51666678f17e5b1ffa301095663ccb79f6683600437f88ad7e21", - git_commit = "8aa05f01046dddcfca29faa0714789e2be31fbc4", + sha256 = "a6168511ea93f8943ce7e5f59d95b562cd3c1573944fad5690cc70d2d7fd8587", + git_commit = "5c06cceb449da594e439ea16c78b075ef09de31c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c9c910cd29777fb205e414082907e5de2aba03a2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 21 Dec 2018 12:02:46 -0800 Subject: [PATCH 1916/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226522717 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 44d9f53defd..bb28d954a27 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a6168511ea93f8943ce7e5f59d95b562cd3c1573944fad5690cc70d2d7fd8587", - git_commit = "5c06cceb449da594e439ea16c78b075ef09de31c", + sha256 = "b20ba763d01e3b952e7751f563b1b7cf5bbeffccd6fec7833fec8ee4d622acdd", + git_commit = "a4fc501faa66dbf2584b0fdb2810407df935f84c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5fd65f3d4b12f9983cc2c539bf1a054590cd3173 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 21 Dec 2018 13:01:53 -0800 Subject: [PATCH 1917/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226530699 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bb28d954a27..da94cbdb9d2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b20ba763d01e3b952e7751f563b1b7cf5bbeffccd6fec7833fec8ee4d622acdd", - git_commit = "a4fc501faa66dbf2584b0fdb2810407df935f84c", + sha256 = "b7edffa0199874d7b6aa523cc720f27221e5fba09a69c5719de432a9a17429f1", + git_commit = "6a194ad3a1c2f4b3f471833edb4d3dd7a1996f8d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 80c14f00c15b8aa9e2d17190ef5c952f21989e09 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 21 Dec 2018 14:02:03 -0800 Subject: [PATCH 1918/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226539292 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index da94cbdb9d2..e29220f3e3f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b7edffa0199874d7b6aa523cc720f27221e5fba09a69c5719de432a9a17429f1", - git_commit = "6a194ad3a1c2f4b3f471833edb4d3dd7a1996f8d", + sha256 = "2e332508c0ec2e2301cfffb3b8caa154d0d45604cd68442c3ceebfe0570daf3b", + git_commit = "88a88a6f02ca199d0edb41b7937b0dedad772f66", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2955e8f1eca0006995a77935b15866eba46e5d66 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 21 Dec 2018 15:02:37 -0800 Subject: [PATCH 1919/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226547461 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e29220f3e3f..4dbbd7bd5f2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2e332508c0ec2e2301cfffb3b8caa154d0d45604cd68442c3ceebfe0570daf3b", - git_commit = "88a88a6f02ca199d0edb41b7937b0dedad772f66", + sha256 = "9e9bd8fbe3d05c805241237e0f953ec4e489c2fe80ae6ec9fa232b0b83c9979b", + git_commit = "a15adadb7cc945b6a142d2454a02d98c44d1325b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 099d96c917d6d1aaf3b79fada50d17cd06b7fe88 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 21 Dec 2018 16:03:23 -0800 Subject: [PATCH 1920/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226555101 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4dbbd7bd5f2..31fe904c39b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9e9bd8fbe3d05c805241237e0f953ec4e489c2fe80ae6ec9fa232b0b83c9979b", - git_commit = "a15adadb7cc945b6a142d2454a02d98c44d1325b", + sha256 = "f9f3e53841ee2bd40f311e1c64da882d5e557c46d1f75a7dae3a5179f27967c4", + git_commit = "c2f188866e5ffe0f4abac4f305cd32a86ddbec58", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6dac4e0e1c399ed75825c5de1c13034ff2a2be2a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 21 Dec 2018 17:02:42 -0800 Subject: [PATCH 1921/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226561313 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 31fe904c39b..5222c1e7726 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f9f3e53841ee2bd40f311e1c64da882d5e557c46d1f75a7dae3a5179f27967c4", - git_commit = "c2f188866e5ffe0f4abac4f305cd32a86ddbec58", + sha256 = "7b1e36edabdf083dee69909cdb3c49777d06ebefd34d18dc94e7c9bf08ff3c6c", + git_commit = "9a486811ca07b5ca3f60f6fd96e69fc1df889818", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6085ed8d2f3b7dfbc52f4bdba7d703fe4ed0fd7c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 21 Dec 2018 18:02:18 -0800 Subject: [PATCH 1922/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226565947 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5222c1e7726..9753f149685 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7b1e36edabdf083dee69909cdb3c49777d06ebefd34d18dc94e7c9bf08ff3c6c", - git_commit = "9a486811ca07b5ca3f60f6fd96e69fc1df889818", + sha256 = "238900d10b0b4d7dbc4de33fef7e842fe50dd0185fbb19dbdacc984a7c2cf324", + git_commit = "4132f1ed08e4780f0f8f2da73f1bef9bcf3acfc7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b41231a60e5e819273a194a42c029f767e907807 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 21 Dec 2018 19:02:53 -0800 Subject: [PATCH 1923/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226570100 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9753f149685..60559523028 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "238900d10b0b4d7dbc4de33fef7e842fe50dd0185fbb19dbdacc984a7c2cf324", - git_commit = "4132f1ed08e4780f0f8f2da73f1bef9bcf3acfc7", + sha256 = "6ab55a71cd926a76e1d324f749357f3bcc2ba340e3a37465c6ead73624344036", + git_commit = "2be34049dd9d2c89b1eb30f0096586fbb4b6a6ae", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 92a524624f6cb0cfe00b22a9177ea3aecbeb81ec Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 21 Dec 2018 20:02:02 -0800 Subject: [PATCH 1924/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226573595 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 60559523028..de76bff4cda 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6ab55a71cd926a76e1d324f749357f3bcc2ba340e3a37465c6ead73624344036", - git_commit = "2be34049dd9d2c89b1eb30f0096586fbb4b6a6ae", + sha256 = "bf9e68be8ca9392f1c9d633e70060059b181138b20eeece4b46e8311e0a46abc", + git_commit = "6f81b31a7feceff27089c681e33f549e7b777561", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 264776e04fd77878ad8670cd5646a4f52ef0262d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 22 Dec 2018 00:02:46 -0800 Subject: [PATCH 1925/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226586916 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index de76bff4cda..8fdcb98aa05 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bf9e68be8ca9392f1c9d633e70060059b181138b20eeece4b46e8311e0a46abc", - git_commit = "6f81b31a7feceff27089c681e33f549e7b777561", + sha256 = "6281542d7715e56a1ac5ab4dcc5703c663ca4d802f9dd13dd764600780947a43", + git_commit = "b13f1e5b690e1784bc84ec118814baa9c29e1cb8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 25b912606e267013a2adec2748b4d1a23979881c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 22 Dec 2018 01:01:57 -0800 Subject: [PATCH 1926/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226590664 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8fdcb98aa05..488eb1d9981 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6281542d7715e56a1ac5ab4dcc5703c663ca4d802f9dd13dd764600780947a43", - git_commit = "b13f1e5b690e1784bc84ec118814baa9c29e1cb8", + sha256 = "87583e4f8c8fed9ec49728575fc0c0c4e73c95959f9be24b76d2bbb2ce88a6f6", + git_commit = "fa7685879360b8c23a603dbba8875fd4c00508e9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From dedf6ef4be9893044d4785cb5d210a92f545f8ce Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 22 Dec 2018 02:02:05 -0800 Subject: [PATCH 1927/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226594564 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 488eb1d9981..ee5dec5090f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "87583e4f8c8fed9ec49728575fc0c0c4e73c95959f9be24b76d2bbb2ce88a6f6", - git_commit = "fa7685879360b8c23a603dbba8875fd4c00508e9", + sha256 = "39626238e5c875846b0703c722fbd38d1f3b3d58756722ab48f4b1571a59dacf", + git_commit = "bc8170639bc5ed0419ed2cf25eaede3f5616a0dd", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 161092854c4517978e750b23d7ce4ec2b2dcae6b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 22 Dec 2018 03:02:22 -0800 Subject: [PATCH 1928/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226598032 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ee5dec5090f..401c1653cf5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "39626238e5c875846b0703c722fbd38d1f3b3d58756722ab48f4b1571a59dacf", - git_commit = "bc8170639bc5ed0419ed2cf25eaede3f5616a0dd", + sha256 = "0f6842d135a6c6ee1c69a1f92348e9b530dcfe1790c1ac6024df1fb47dff7c6c", + git_commit = "cd8c6c995e0b29e793854e712d2fbd683b5cbd3f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f708d5de46ba7179d173ae0e3f4face182529e4f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 22 Dec 2018 15:02:08 -0800 Subject: [PATCH 1929/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226632306 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 401c1653cf5..263cb3272fa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0f6842d135a6c6ee1c69a1f92348e9b530dcfe1790c1ac6024df1fb47dff7c6c", - git_commit = "cd8c6c995e0b29e793854e712d2fbd683b5cbd3f", + sha256 = "04840c50ebea3cdf2f9fe7d81ff305a1cb2c4f8aa0cc1cd44c928882dbe4379c", + git_commit = "b27d50f234e88ff2aea90c085dcac4b47c0d4cea", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4a677a5e4590bfce705401f64764772e1634d6eb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 22 Dec 2018 20:02:16 -0800 Subject: [PATCH 1930/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226645947 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 263cb3272fa..34d0f1d96a5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "04840c50ebea3cdf2f9fe7d81ff305a1cb2c4f8aa0cc1cd44c928882dbe4379c", - git_commit = "b27d50f234e88ff2aea90c085dcac4b47c0d4cea", + sha256 = "d3bbe726f9a6d3121cd72bd0b05705558879fd007ea7da48d46e8a0eea06cbd9", + git_commit = "3785cffbdbcf91901996f61a2fddd5107b16da06", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8bedc2006d7af641ca0697a8dd68278bae5b6c0b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 22 Dec 2018 23:01:59 -0800 Subject: [PATCH 1931/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226654290 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 34d0f1d96a5..c61872e79b8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d3bbe726f9a6d3121cd72bd0b05705558879fd007ea7da48d46e8a0eea06cbd9", - git_commit = "3785cffbdbcf91901996f61a2fddd5107b16da06", + sha256 = "bec557517c6c8e72b892377b6d11d57a132199d0a49cd6ada54a3c4eb0b971b7", + git_commit = "0a708f8da4afc5099cae1493dfb60a5680dadf2f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3af0dc82f2fe690283ebc725142a9b20ba6264cb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 23 Dec 2018 03:02:02 -0800 Subject: [PATCH 1932/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226668118 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c61872e79b8..0866edac077 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bec557517c6c8e72b892377b6d11d57a132199d0a49cd6ada54a3c4eb0b971b7", - git_commit = "0a708f8da4afc5099cae1493dfb60a5680dadf2f", + sha256 = "b40c01b712b0a843e0b85eda93ef183ccb9ee9a7d7814d6d710acfcf8875eae4", + git_commit = "ad6d0cb82ba92594cf443183111bb87f59a8895c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From cd9ce8981232cf504cb47d29f9ec5b88e68ec9cc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 23 Dec 2018 11:02:17 -0800 Subject: [PATCH 1933/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226691377 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0866edac077..90552eb4846 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b40c01b712b0a843e0b85eda93ef183ccb9ee9a7d7814d6d710acfcf8875eae4", - git_commit = "ad6d0cb82ba92594cf443183111bb87f59a8895c", + sha256 = "1f5500b856797c8c25ad224cb63ed31215ee5ea128e0d18047f1ed17fdb74abb", + git_commit = "1853b08d9cdbc6178099c666a508427f67d42887", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 537544bb2826099c1124283d38e4781e30cd9e8b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 23 Dec 2018 16:02:13 -0800 Subject: [PATCH 1934/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226707108 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 90552eb4846..d5d20932b65 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1f5500b856797c8c25ad224cb63ed31215ee5ea128e0d18047f1ed17fdb74abb", - git_commit = "1853b08d9cdbc6178099c666a508427f67d42887", + sha256 = "53149f7a4c2660787aeb05efaecdb416b8dd6a15314751cb708444a1c6b130f6", + git_commit = "6e304fadf83e8b75c113cfac46e879df672e1803", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e7be8dbf0e10088f20b3b459f40f48c47d1be675 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 23 Dec 2018 20:02:00 -0800 Subject: [PATCH 1935/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226718742 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d5d20932b65..8397b0c054f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "53149f7a4c2660787aeb05efaecdb416b8dd6a15314751cb708444a1c6b130f6", - git_commit = "6e304fadf83e8b75c113cfac46e879df672e1803", + sha256 = "e6d99ebada74bbee08d49cb6bfa3dd16938bb40680c398eae137a2def2e0653f", + git_commit = "9f23c56c7ed3bbbce31a22af61e87aa559c2bafe", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4797398b44ffc62b09f6d23cbe4b3d28040cd819 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 24 Dec 2018 03:02:37 -0800 Subject: [PATCH 1936/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226745815 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8397b0c054f..1786c59c64b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e6d99ebada74bbee08d49cb6bfa3dd16938bb40680c398eae137a2def2e0653f", - git_commit = "9f23c56c7ed3bbbce31a22af61e87aa559c2bafe", + sha256 = "e0e6e40ca8669d51c98513f0f34ff57f4c385a1f2ef55b2e65ac758ac2033317", + git_commit = "c6f3c5dc482d8f052c37ecf99accee28d1be86a9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 69c9c7dc347dcabd336ad20e24792c413d919714 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 25 Dec 2018 03:02:06 -0800 Subject: [PATCH 1937/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226825442 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1786c59c64b..dc880a7fd22 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e0e6e40ca8669d51c98513f0f34ff57f4c385a1f2ef55b2e65ac758ac2033317", - git_commit = "c6f3c5dc482d8f052c37ecf99accee28d1be86a9", + sha256 = "6806f16a496bcb550e6b523a4043fa74ca76518fde47bcf0693a997bf3c3638d", + git_commit = "432f4e90686258dd40ebfb9f2b8da993c9d6009d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0f15587f8d8e5de30b2d8a1be876127974c40693 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 25 Dec 2018 23:02:36 -0800 Subject: [PATCH 1938/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226884197 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dc880a7fd22..b6b81bd8d06 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6806f16a496bcb550e6b523a4043fa74ca76518fde47bcf0693a997bf3c3638d", - git_commit = "432f4e90686258dd40ebfb9f2b8da993c9d6009d", + sha256 = "ee5f6ed5b606897e1217a96e04882ad9735b0d8ff0950470b183ba109a7a9fa0", + git_commit = "c343196842202fc4b270b57780b8951b38184310", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5175266200294a5f3efec3b3cb46ca7cccfcb7cf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 Dec 2018 03:02:50 -0800 Subject: [PATCH 1939/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226901016 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b6b81bd8d06..2492d1e16f2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ee5f6ed5b606897e1217a96e04882ad9735b0d8ff0950470b183ba109a7a9fa0", - git_commit = "c343196842202fc4b270b57780b8951b38184310", + sha256 = "fc04e5bc98662795516504e42959624c8393171f8e6d394249cfb9099418b1eb", + git_commit = "2fc6decf7bbedadda0e41aa8f185bd9394a0c311", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 07db332ef5bcea65c153383e7872820898c27d5b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 Dec 2018 11:01:52 -0800 Subject: [PATCH 1940/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226934361 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2492d1e16f2..d28b4176f53 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fc04e5bc98662795516504e42959624c8393171f8e6d394249cfb9099418b1eb", - git_commit = "2fc6decf7bbedadda0e41aa8f185bd9394a0c311", + sha256 = "af1815ded5c13bd4937dc210fd4568d8eb367c40109115646d1f000d28066fa9", + git_commit = "2696015d8539ea68f27a519ac908ed538f8085ae", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5f9aa6fbb0d5a12eb809ad02a9d0dfa46683bf54 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 Dec 2018 12:01:59 -0800 Subject: [PATCH 1941/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226940551 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d28b4176f53..aa7032d1de3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "af1815ded5c13bd4937dc210fd4568d8eb367c40109115646d1f000d28066fa9", - git_commit = "2696015d8539ea68f27a519ac908ed538f8085ae", + sha256 = "932b234b9f29ffc3f62b8fcc24149b2060106cac4b7b66d62c47a552e373373c", + git_commit = "b58527bd2d5c7c3b072a629616ecefd27c4cdcce", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 97e474821afe380845bfc329a0a75807ecb85ee7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 Dec 2018 13:02:20 -0800 Subject: [PATCH 1942/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226946378 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index aa7032d1de3..979189e45bc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "932b234b9f29ffc3f62b8fcc24149b2060106cac4b7b66d62c47a552e373373c", - git_commit = "b58527bd2d5c7c3b072a629616ecefd27c4cdcce", + sha256 = "f842a54362c6026d109cc63f67798c255e38c1f8c3888d5faaa8bd9bab6b6ac1", + git_commit = "48f2893491fdc7352590a7d93b9ec317f2850c64", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 076cb10cc2268924f6e677a985b92a533a0d1b65 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 Dec 2018 14:02:00 -0800 Subject: [PATCH 1943/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226951853 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 979189e45bc..a251d17fe1f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f842a54362c6026d109cc63f67798c255e38c1f8c3888d5faaa8bd9bab6b6ac1", - git_commit = "48f2893491fdc7352590a7d93b9ec317f2850c64", + sha256 = "87fbdf9566f5965b8a92c7427034da0c71822a1a3fca3be640e8de7ed771cb76", + git_commit = "83cb1f1c5ebf47793ad594f0ed368f9c1cc9e28d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 79a74e77acd6abfca70df95721aaf5d0ae198461 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 Dec 2018 15:01:53 -0800 Subject: [PATCH 1944/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226957379 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a251d17fe1f..ccaf2eb3304 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "87fbdf9566f5965b8a92c7427034da0c71822a1a3fca3be640e8de7ed771cb76", - git_commit = "83cb1f1c5ebf47793ad594f0ed368f9c1cc9e28d", + sha256 = "4f7ef53993424f2054ef51c33a663f4aa6162af76cf34d4d4e1bae1d0764bf43", + git_commit = "97acfa47fac0ced993951cac267a69cdea3c2321", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b84630e3459f3ab1498fea3e36b3a463387b239e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 Dec 2018 16:02:32 -0800 Subject: [PATCH 1945/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226962994 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ccaf2eb3304..e0a45ae3f17 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4f7ef53993424f2054ef51c33a663f4aa6162af76cf34d4d4e1bae1d0764bf43", - git_commit = "97acfa47fac0ced993951cac267a69cdea3c2321", + sha256 = "65e789bbf4452ab37b3d12d804b1b569d5fa586989521433494fd8f69b661585", + git_commit = "bc7d032d4f3d6fb0bb75d0ba61718395b02f9556", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 834f8766810c4861ee37139d652d17e6668bddc2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 Dec 2018 17:02:02 -0800 Subject: [PATCH 1946/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226967734 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e0a45ae3f17..db6a934d502 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "65e789bbf4452ab37b3d12d804b1b569d5fa586989521433494fd8f69b661585", - git_commit = "bc7d032d4f3d6fb0bb75d0ba61718395b02f9556", + sha256 = "5599d325d6e0eea4abaaa1eba67ce3789ae319c26488742b7026c25bda649d11", + git_commit = "42846f59790db989054fc6cf2f8ea52cc3effc1f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2b265a5a72b94dfd76e17af0c288280c8eaf18b4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 Dec 2018 18:02:00 -0800 Subject: [PATCH 1947/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226971920 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index db6a934d502..ba4e91f3f55 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5599d325d6e0eea4abaaa1eba67ce3789ae319c26488742b7026c25bda649d11", - git_commit = "42846f59790db989054fc6cf2f8ea52cc3effc1f", + sha256 = "7a1fb4a3694bdf00f96340a9a907aa9a4987615617ef9a47b0aebcb369c0d42d", + git_commit = "259072f5f77a5e7b5aecf6108cb4d1429e3113ef", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 943c18bf8c5038de1496b4ae85af300763d5d053 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 Dec 2018 19:02:19 -0800 Subject: [PATCH 1948/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226975981 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ba4e91f3f55..9bee353bbc7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7a1fb4a3694bdf00f96340a9a907aa9a4987615617ef9a47b0aebcb369c0d42d", - git_commit = "259072f5f77a5e7b5aecf6108cb4d1429e3113ef", + sha256 = "f0be367cb5cfe3b370149611f204e777565a38eb12cae5a977f6523de73a5ecc", + git_commit = "1ec7cf635319bde3de4510d26ff7bfa27fea68c8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c2b852650aeeecaaddd5bc4e6b26fa1d5fd99469 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 Dec 2018 20:02:47 -0800 Subject: [PATCH 1949/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226979662 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9bee353bbc7..be2d98a19e0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f0be367cb5cfe3b370149611f204e777565a38eb12cae5a977f6523de73a5ecc", - git_commit = "1ec7cf635319bde3de4510d26ff7bfa27fea68c8", + sha256 = "cc8e3380416280b072f742e003bd5d116328f746f38136c137d5ccd2537a7cfa", + git_commit = "8674eeeda61a51b3e5e3693f7bd7281813467a15", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c806c8098956dab359efe02dadd971c86c3df114 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 Dec 2018 21:02:06 -0800 Subject: [PATCH 1950/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226983069 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index be2d98a19e0..defd2e2ebf5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cc8e3380416280b072f742e003bd5d116328f746f38136c137d5ccd2537a7cfa", - git_commit = "8674eeeda61a51b3e5e3693f7bd7281813467a15", + sha256 = "01991f6621e113472c3554ed43906ce48a975787d3116a8879bec881b4031c23", + git_commit = "a9624a5c257bcc37c7af47e6d0da986f53133423", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e20c8b32bee7961ea9ac090990fe583d5c0dc1f0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 Dec 2018 22:02:08 -0800 Subject: [PATCH 1951/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226986774 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index defd2e2ebf5..d85fca223c5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "01991f6621e113472c3554ed43906ce48a975787d3116a8879bec881b4031c23", - git_commit = "a9624a5c257bcc37c7af47e6d0da986f53133423", + sha256 = "c71663e448b4d09e71a313559ce6d85fbcf4608058b67dcf3143c5f31f2fb26c", + git_commit = "f1ac8dba0c7506d4382d4edc88217eff7ed5ac62", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c2e75f94a20d5abb1d2da78d088cc8b458c43811 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Dec 2018 01:02:18 -0800 Subject: [PATCH 1952/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 226998728 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d85fca223c5..3db17940d28 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c71663e448b4d09e71a313559ce6d85fbcf4608058b67dcf3143c5f31f2fb26c", - git_commit = "f1ac8dba0c7506d4382d4edc88217eff7ed5ac62", + sha256 = "7bd5a2c72cf2c0e674054e93bdfe70a99015f1dd510ac4cb56ad39eb3f7b486d", + git_commit = "8d95234db405f3a5b7d59ba95f561b71ac537811", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9580af3359f731cea998660e66b3a8bf448a06f3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Dec 2018 02:01:55 -0800 Subject: [PATCH 1953/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227003600 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3db17940d28..a1f60a13d27 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7bd5a2c72cf2c0e674054e93bdfe70a99015f1dd510ac4cb56ad39eb3f7b486d", - git_commit = "8d95234db405f3a5b7d59ba95f561b71ac537811", + sha256 = "b77226afdb46bd861078bb1ed93c45a568da31f2c6155222707c91c308207fc7", + git_commit = "9fe0cb41cedd0ddd1b5c28488be5f4d62916bf62", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c05084cff2dc41dd05173bb784d05c1ddd90115d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Dec 2018 06:02:04 -0800 Subject: [PATCH 1954/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227019494 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a1f60a13d27..268e1baabfc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b77226afdb46bd861078bb1ed93c45a568da31f2c6155222707c91c308207fc7", - git_commit = "9fe0cb41cedd0ddd1b5c28488be5f4d62916bf62", + sha256 = "e34aca7a9f3cdbfab9acfa169313edad6d308834a6f2d54cd3636ec07726da99", + git_commit = "b1480635fbb3c89b8c0335955546c3a1af04e598", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0d24ffc7af72692c1cae316f5d24ca72dd09aa75 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Dec 2018 10:02:02 -0800 Subject: [PATCH 1955/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227037967 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 268e1baabfc..4dee946cc42 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e34aca7a9f3cdbfab9acfa169313edad6d308834a6f2d54cd3636ec07726da99", - git_commit = "b1480635fbb3c89b8c0335955546c3a1af04e598", + sha256 = "7f0d7c042d505fac011b7e17a946b669e12a5fce7c01bebdb9eee0c72c24a6c1", + git_commit = "5f09bc6050226cbdfc67bda19396f9708805e299", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 126ab51533945d5c14bb1beb62af7ec07e5e8c6a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Dec 2018 11:01:53 -0800 Subject: [PATCH 1956/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227043645 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4dee946cc42..57cd3b852ae 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7f0d7c042d505fac011b7e17a946b669e12a5fce7c01bebdb9eee0c72c24a6c1", - git_commit = "5f09bc6050226cbdfc67bda19396f9708805e299", + sha256 = "afc7aa73ceba594e7349122126735bae8603c1c427cb41501740edc544cce2f8", + git_commit = "c46e8af38cffc348eb73dd9ac6d92204dc7d8d35", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9ec8a8ce3ab80dff73ee80efe1173a8ab3d93f5d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Dec 2018 12:02:12 -0800 Subject: [PATCH 1957/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227049632 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 57cd3b852ae..1b46e192ba0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "afc7aa73ceba594e7349122126735bae8603c1c427cb41501740edc544cce2f8", - git_commit = "c46e8af38cffc348eb73dd9ac6d92204dc7d8d35", + sha256 = "b5fe58dc6bed42899be565d6608d5d9ca78113cb291eafc2f1d0edae8d032f92", + git_commit = "6645134ec093407dff43c6e78b3b3de313136f6c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a02b69f5f56b3d7df593117b0ba6921edc86ef33 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Dec 2018 13:02:12 -0800 Subject: [PATCH 1958/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227055374 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1b46e192ba0..a8f8e705b3f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b5fe58dc6bed42899be565d6608d5d9ca78113cb291eafc2f1d0edae8d032f92", - git_commit = "6645134ec093407dff43c6e78b3b3de313136f6c", + sha256 = "2317191add910948f5959148ba263121237d108b7b91b7c0f04ed572b6adfc2c", + git_commit = "8f4567a13902fcc095c443f73643d2f8a3b9e952", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fc577e9d16310a3b08971f81c4e5868a7bab5da2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Dec 2018 14:01:55 -0800 Subject: [PATCH 1959/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227061124 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a8f8e705b3f..1c83aba3b20 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2317191add910948f5959148ba263121237d108b7b91b7c0f04ed572b6adfc2c", - git_commit = "8f4567a13902fcc095c443f73643d2f8a3b9e952", + sha256 = "d1b5ed43e19ab886f8678ff541a01c9842242ecbbb87b4dfb3e8b4178c9d626d", + git_commit = "331bf7a11ab6c41cbe84c5b2a515359ced97864b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 98b9a3a2792876a7201deb45ec040ee4d1a84775 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Dec 2018 15:02:05 -0800 Subject: [PATCH 1960/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227067032 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1c83aba3b20..a91e8e8e0f0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d1b5ed43e19ab886f8678ff541a01c9842242ecbbb87b4dfb3e8b4178c9d626d", - git_commit = "331bf7a11ab6c41cbe84c5b2a515359ced97864b", + sha256 = "99edea8d30cf4f9a4cd182a0bc7e99097b56513b51f6aedd8578f76f2563d23b", + git_commit = "b97698834d03e70c3b331e3a7842cdcf890decb8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 984cb440de219070fb689a94ac37a68d22823dbe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Dec 2018 16:02:33 -0800 Subject: [PATCH 1961/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227072593 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a91e8e8e0f0..d55bfb2d82b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "99edea8d30cf4f9a4cd182a0bc7e99097b56513b51f6aedd8578f76f2563d23b", - git_commit = "b97698834d03e70c3b331e3a7842cdcf890decb8", + sha256 = "2ae54998da5203282323ce1e2392f8b063abfbc061c5026eee18f2d2120d975d", + git_commit = "9ce461cdc0602221e39f57b2b68f7f772ec7366c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2c3545d3e25d74dff02612714f0fafeaa72c71ed Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Dec 2018 17:02:21 -0800 Subject: [PATCH 1962/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227077501 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d55bfb2d82b..44196c21245 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2ae54998da5203282323ce1e2392f8b063abfbc061c5026eee18f2d2120d975d", - git_commit = "9ce461cdc0602221e39f57b2b68f7f772ec7366c", + sha256 = "37c5970bd5315ba3e44c94356db076b739b51f767a45ad007aa1f12effb88a1b", + git_commit = "6d5095a052deba4eb8db2d2a90534a52e454a5c5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6e3b111a57b2915d52ab546e1b4a27270178894f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Dec 2018 18:02:00 -0800 Subject: [PATCH 1963/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227081397 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 44196c21245..d73afa73250 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "37c5970bd5315ba3e44c94356db076b739b51f767a45ad007aa1f12effb88a1b", - git_commit = "6d5095a052deba4eb8db2d2a90534a52e454a5c5", + sha256 = "999f329dfad6016d87110516b8f341725fa161695b53d4b86c974a0bed9f543e", + git_commit = "3d0e65ade7c073e278ae1f1e95f76bcc628f706f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2adcc554d512f3ffa811a1c5eaefa9656dd503c5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Dec 2018 19:01:46 -0800 Subject: [PATCH 1964/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227085094 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d73afa73250..d9d57a772c0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "999f329dfad6016d87110516b8f341725fa161695b53d4b86c974a0bed9f543e", - git_commit = "3d0e65ade7c073e278ae1f1e95f76bcc628f706f", + sha256 = "e8b93beb4f5d53aee47c49eef6ece4088453d0a56a6e3c8ce1f559e2c1e55ac5", + git_commit = "770b26ea0844b4b20d022ddd622bcce98f5c9f0a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a4d795ec23c9d323d2d9e9d3349db38ec5f98756 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Dec 2018 20:02:12 -0800 Subject: [PATCH 1965/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227088876 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d9d57a772c0..68b8a401465 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e8b93beb4f5d53aee47c49eef6ece4088453d0a56a6e3c8ce1f559e2c1e55ac5", - git_commit = "770b26ea0844b4b20d022ddd622bcce98f5c9f0a", + sha256 = "a2a1816c4d74fad597a404776d5faa3cfdb8ed60522bf18089f71b76b029ae81", + git_commit = "add19e0e569601fba9294950399d77f5ffb3824d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9247c8c570f92f287e958cb86fc9c68ea928e5ab Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Dec 2018 21:01:54 -0800 Subject: [PATCH 1966/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227092379 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 68b8a401465..4b7b74c730f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a2a1816c4d74fad597a404776d5faa3cfdb8ed60522bf18089f71b76b029ae81", - git_commit = "add19e0e569601fba9294950399d77f5ffb3824d", + sha256 = "96db0101e75d4c5ec98118aa015be91f6183c56d346dc4f6b962a959c5f49c53", + git_commit = "c0e5ac795e01dc266a42f72f96407c6d68bfcaee", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c5ecdc0d00cb47f18d89a9f7c9e5d2deff28416a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Dec 2018 22:02:21 -0800 Subject: [PATCH 1967/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227096104 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4b7b74c730f..4f59975481c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "96db0101e75d4c5ec98118aa015be91f6183c56d346dc4f6b962a959c5f49c53", - git_commit = "c0e5ac795e01dc266a42f72f96407c6d68bfcaee", + sha256 = "4b7b8504b0585094df4e2b51f241c94a6c13e1870421f0857700beb2da3246d9", + git_commit = "796305b0b7810260f7b606bf5da875026fb5c10a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c37e14d41687894781e6c8dacc4b4f18019d2d06 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 28 Dec 2018 03:01:59 -0800 Subject: [PATCH 1968/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227116522 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4f59975481c..3398e01b020 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4b7b8504b0585094df4e2b51f241c94a6c13e1870421f0857700beb2da3246d9", - git_commit = "796305b0b7810260f7b606bf5da875026fb5c10a", + sha256 = "354e1a7d0e034df14e1cf5448c7962728c60497e8ae1568feac2fc36f3f9b07c", + git_commit = "ab795aebe033f1faa69808599706f88c27b2f54f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b6f76ce70536d781e575f7bc9e657977757cde75 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 28 Dec 2018 11:02:02 -0800 Subject: [PATCH 1969/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227150896 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3398e01b020..40478a2432e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "354e1a7d0e034df14e1cf5448c7962728c60497e8ae1568feac2fc36f3f9b07c", - git_commit = "ab795aebe033f1faa69808599706f88c27b2f54f", + sha256 = "af76be172fc3410773dfc8e093e14023882e2c841a36d2384cd45338de37b3a5", + git_commit = "12721dc8ad78c6beb9b0e4868d9409854d1ea8dd", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f496d831a3f49a4e41201827d57f9c0a36fce8f2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 28 Dec 2018 12:02:26 -0800 Subject: [PATCH 1970/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227156833 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 40478a2432e..21d2bee7268 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "af76be172fc3410773dfc8e093e14023882e2c841a36d2384cd45338de37b3a5", - git_commit = "12721dc8ad78c6beb9b0e4868d9409854d1ea8dd", + sha256 = "b1b223fa555e96e1b7879578a94717c24698d22847de08914a461c4fccb8d2aa", + git_commit = "25c536db0876c4f1f2ec8c492ae6ca978e10a7a9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5ab67d993828d6b8bfdbc79280e5420368061f5a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 28 Dec 2018 13:02:02 -0800 Subject: [PATCH 1971/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227162406 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 21d2bee7268..ce1e62e40ca 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b1b223fa555e96e1b7879578a94717c24698d22847de08914a461c4fccb8d2aa", - git_commit = "25c536db0876c4f1f2ec8c492ae6ca978e10a7a9", + sha256 = "641fa6ace363ba9f02a2ea8a6b18592968ad0d9322a6109f90dddb097d4efb59", + git_commit = "00fd6acd0b80cbc2be73e8b89cfebc01cb4cf9e8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4765dfd75862f9b3c8c524e4d761cced1e785c33 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 28 Dec 2018 15:02:00 -0800 Subject: [PATCH 1972/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227172988 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ce1e62e40ca..734c10bffea 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "641fa6ace363ba9f02a2ea8a6b18592968ad0d9322a6109f90dddb097d4efb59", - git_commit = "00fd6acd0b80cbc2be73e8b89cfebc01cb4cf9e8", + sha256 = "59b152c5c49b814a3570e8e333dc4d227b1d4facb3fc0db742d267305c20c0fd", + git_commit = "cd2f18ff27fc2a9b502c80bf1d4a0abfc3577460", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6073ec581860c197d54307c530039a4a8fed6b7f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 28 Dec 2018 16:02:18 -0800 Subject: [PATCH 1973/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227177828 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 734c10bffea..9a850f8ee43 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "59b152c5c49b814a3570e8e333dc4d227b1d4facb3fc0db742d267305c20c0fd", - git_commit = "cd2f18ff27fc2a9b502c80bf1d4a0abfc3577460", + sha256 = "e4202a28799a6965b053e32b97000a431517a9435c97711105b21df9a22872ca", + git_commit = "35f2d889bc136094c6f6b200f3b2913950ed9bbe", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From db612d675b8c1d37ea8023e53ab42b28f8e7df98 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 28 Dec 2018 17:02:22 -0800 Subject: [PATCH 1974/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227182299 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9a850f8ee43..a69c2132a3f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e4202a28799a6965b053e32b97000a431517a9435c97711105b21df9a22872ca", - git_commit = "35f2d889bc136094c6f6b200f3b2913950ed9bbe", + sha256 = "e3fbc3895a4bba87efdf995e0e8d45e40c1fc0c34d437599f7aba2cd180e26a6", + git_commit = "a4781da6b85f9b1e327dcdf8cd35b6a6385c600f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0a873df0bcc1662de4aab698725b3712282b53d4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 28 Dec 2018 18:02:33 -0800 Subject: [PATCH 1975/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227185930 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a69c2132a3f..c790c423c33 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e3fbc3895a4bba87efdf995e0e8d45e40c1fc0c34d437599f7aba2cd180e26a6", - git_commit = "a4781da6b85f9b1e327dcdf8cd35b6a6385c600f", + sha256 = "9754af889fb0117f84ad2a2e5868f4af2d01cb2589eab01cbf16eecd323e724a", + git_commit = "447b5edf2acb49a0b4fbaa4d37b099f0304894a1", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 607ef47901d437fd168b6132ff67e8b9b69c1ab7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 28 Dec 2018 20:01:54 -0800 Subject: [PATCH 1976/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227191866 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c790c423c33..dfcd4b48fe2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9754af889fb0117f84ad2a2e5868f4af2d01cb2589eab01cbf16eecd323e724a", - git_commit = "447b5edf2acb49a0b4fbaa4d37b099f0304894a1", + sha256 = "277669721b4edf9ebf13a22ca720efa3b31fc1f8c908ced01a544a6ca615e4e4", + git_commit = "3aaebcbcada0bb861ebfee0eea6068de0c7f37be", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c12f7f212c0d562292fbcd1668327fbd9cb8ec3a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 29 Dec 2018 03:02:07 -0800 Subject: [PATCH 1977/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227212812 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dfcd4b48fe2..c7a563a4acd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "277669721b4edf9ebf13a22ca720efa3b31fc1f8c908ced01a544a6ca615e4e4", - git_commit = "3aaebcbcada0bb861ebfee0eea6068de0c7f37be", + sha256 = "bec4c024c58a10e29f14cad8dcf909919e8f2400b571d51552c7f0fb001b4d37", + git_commit = "e0aa9387258df040e296f18c6b6fdb560bce6fcc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8069e0a896d53747bcfa81608585831cd6bc8167 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 29 Dec 2018 11:01:55 -0800 Subject: [PATCH 1978/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227233005 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c7a563a4acd..6d96f471b55 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bec4c024c58a10e29f14cad8dcf909919e8f2400b571d51552c7f0fb001b4d37", - git_commit = "e0aa9387258df040e296f18c6b6fdb560bce6fcc", + sha256 = "8efbb2d696a14970e2a8312f40b16dffb7ae548a09fd75264b39a72993d73154", + git_commit = "d2dd369f9dadb5dd3220ababa299ad89cd8e8574", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5f0d07b2158cf7868c8cab3267c62a8c5b11c120 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 30 Dec 2019 00:01:59 -0800 Subject: [PATCH 1979/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227264284 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6d96f471b55..8e9951dbd5e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8efbb2d696a14970e2a8312f40b16dffb7ae548a09fd75264b39a72993d73154", - git_commit = "d2dd369f9dadb5dd3220ababa299ad89cd8e8574", + sha256 = "400f66b643703e6aa41a0ac167140de80838458320bd57109156e6d6dc016bba", + git_commit = "1fadc3b6fc51b0d93bb9ebed32bc9d8e30f563d0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ffc54e4300dea764a815654ed4d01fce2d01e9de Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 30 Dec 2019 03:02:26 -0800 Subject: [PATCH 1980/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227274103 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8e9951dbd5e..dd44d7d4a9f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "400f66b643703e6aa41a0ac167140de80838458320bd57109156e6d6dc016bba", - git_commit = "1fadc3b6fc51b0d93bb9ebed32bc9d8e30f563d0", + sha256 = "d48878b23ac1ab55767980d7bf2d52daa0b09ef51394b3e8350d05bd1b0c89eb", + git_commit = "bbc8c15b85358b9df029f16e31bc663b8f9d1fef", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b8380bf26ada5c1fe5a1521b29114e4a7af7b3ad Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 30 Dec 2019 04:02:56 -0800 Subject: [PATCH 1981/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227276999 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dd44d7d4a9f..d40d3c676d7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d48878b23ac1ab55767980d7bf2d52daa0b09ef51394b3e8350d05bd1b0c89eb", - git_commit = "bbc8c15b85358b9df029f16e31bc663b8f9d1fef", + sha256 = "1d95d1c0cac8292251dfb7e47bd70bf4cab8e292a04cd35805816e3da534ccfc", + git_commit = "c985bd0dce0f8a7ccf334c9782d051c81ad00f1d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 12677a09ab45d7776ff4f698c50be5b65eb5a95a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 30 Dec 2019 08:02:06 -0800 Subject: [PATCH 1982/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227287384 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d40d3c676d7..7594a4d9cad 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1d95d1c0cac8292251dfb7e47bd70bf4cab8e292a04cd35805816e3da534ccfc", - git_commit = "c985bd0dce0f8a7ccf334c9782d051c81ad00f1d", + sha256 = "7167f8973050b98622934cd1b7fb1b63ff31f333ee88d50e6fedd60457a5098e", + git_commit = "44bb7adf1d04f090817f008fc47e4d81a23b1049", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6911291da3b14c5cc07f3b845e6fd1648320dc0a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 30 Dec 2019 11:02:10 -0800 Subject: [PATCH 1983/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227294805 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7594a4d9cad..e1a35856dbe 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7167f8973050b98622934cd1b7fb1b63ff31f333ee88d50e6fedd60457a5098e", - git_commit = "44bb7adf1d04f090817f008fc47e4d81a23b1049", + sha256 = "abb66f52af5cfc3c3d73d24cbac2dbc427e55f59c293a74352962d4e422b5177", + git_commit = "8f60a381d210478f21762a6cf14f547a05e98878", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From cf272c2c3304fe46e509c29f0794310ab6709f62 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 31 Dec 2019 03:02:38 -0800 Subject: [PATCH 1984/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227344188 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e1a35856dbe..a3b608374ac 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "abb66f52af5cfc3c3d73d24cbac2dbc427e55f59c293a74352962d4e422b5177", - git_commit = "8f60a381d210478f21762a6cf14f547a05e98878", + sha256 = "2729dfd25e009d263d012c1c798a6a60433b6d1fdef028f8ef5b7be5c0b7b4c8", + git_commit = "75557c1e21c89cddb23c66c661655075371ac28b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ab85a7782f4b4fb7c2b3eb0a9febf996eb1b8599 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 31 Dec 2019 04:02:13 -0800 Subject: [PATCH 1985/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227347933 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a3b608374ac..7b94e9a7af8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2729dfd25e009d263d012c1c798a6a60433b6d1fdef028f8ef5b7be5c0b7b4c8", - git_commit = "75557c1e21c89cddb23c66c661655075371ac28b", + sha256 = "04771e58ae5d117b4491a63e33abe0a7c77d3f3f0a150e03ddf56e987e13e008", + git_commit = "a36fc1c38b9cf0541cffc8ea053dfb8bf01c58e0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 6faf1a5968479a49a2d19b3366bb8bbd9fac717d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 31 Dec 2019 05:02:05 -0800 Subject: [PATCH 1986/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227351325 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7b94e9a7af8..83bc8ceca27 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "04771e58ae5d117b4491a63e33abe0a7c77d3f3f0a150e03ddf56e987e13e008", - git_commit = "a36fc1c38b9cf0541cffc8ea053dfb8bf01c58e0", + sha256 = "283e21e89e798eef57346e076ad9bd9789cc10445d53d54c2d585d1d89a4a677", + git_commit = "853d417a891ecdc893bc2c448d426833df74c7e0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 611e6a9c9b1c0ea046f4d3bcca6167cb3eb65034 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 31 Dec 2019 08:02:12 -0800 Subject: [PATCH 1987/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227361815 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 83bc8ceca27..d4287656793 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "283e21e89e798eef57346e076ad9bd9789cc10445d53d54c2d585d1d89a4a677", - git_commit = "853d417a891ecdc893bc2c448d426833df74c7e0", + sha256 = "3344f7d0e3f445698cfd0dea4865af2e2c9f6a7f8f27e3d4cac8a65799ceaec2", + git_commit = "7914dbf7a2b9c2b555e3e55423905bdb22c6d759", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4a9ddda6ca535eda559b44d429004674a2bc32e0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 31 Dec 2019 14:02:08 -0800 Subject: [PATCH 1988/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227379219 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d4287656793..13e431f6b94 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3344f7d0e3f445698cfd0dea4865af2e2c9f6a7f8f27e3d4cac8a65799ceaec2", - git_commit = "7914dbf7a2b9c2b555e3e55423905bdb22c6d759", + sha256 = "c2c7606257a161071407566c393ec38e0d4a2dd347ac1c32b680ee7de9317f1c", + git_commit = "3ae375aa92fbb6155f82393735d0b98d8fb9c1b2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 776e028bfc36125fa8a4e3e21391f57eb54936a7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 1 Jan 2019 03:02:06 -0800 Subject: [PATCH 1989/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227418328 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 13e431f6b94..b25069e3269 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c2c7606257a161071407566c393ec38e0d4a2dd347ac1c32b680ee7de9317f1c", - git_commit = "3ae375aa92fbb6155f82393735d0b98d8fb9c1b2", + sha256 = "1c46e1855753994400a24f75654608cbb1fd829f5ba64c99ddff147b0b3a5311", + git_commit = "d60d04b68a91ac3086b93d8a83c148db8e84edc6", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From e8d676f0a8fd6e928464d6b80d1382189defefb8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 1 Jan 2019 06:01:59 -0800 Subject: [PATCH 1990/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227427914 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b25069e3269..6434ac3f224 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1c46e1855753994400a24f75654608cbb1fd829f5ba64c99ddff147b0b3a5311", - git_commit = "d60d04b68a91ac3086b93d8a83c148db8e84edc6", + sha256 = "ec0fc939178963af920198bc8d00602380695ef939eb5b11febd11c197f9289d", + git_commit = "c9de778aa12004428ae99186965655c97c8a1c5a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9d3cf76f690d4069905f89cc522428336fb55705 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 1 Jan 2019 07:02:21 -0800 Subject: [PATCH 1991/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227431219 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6434ac3f224..e0fd78262da 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ec0fc939178963af920198bc8d00602380695ef939eb5b11febd11c197f9289d", - git_commit = "c9de778aa12004428ae99186965655c97c8a1c5a", + sha256 = "904210d5e46d585169123f4d7cdffebbbb198f754a9f9e932f53ef24770a8349", + git_commit = "dd06c3959737752fe84cd133e0b5137a8ee2d956", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a171fb07099636f281242d0db716a669a81d2436 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 1 Jan 2019 11:02:32 -0800 Subject: [PATCH 1992/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227442890 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e0fd78262da..a6e84db2f30 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "904210d5e46d585169123f4d7cdffebbbb198f754a9f9e932f53ef24770a8349", - git_commit = "dd06c3959737752fe84cd133e0b5137a8ee2d956", + sha256 = "c25acbf2efdaf0ebadc453aef2c7dbec5b319d6e336275743d2101f80e9fac0f", + git_commit = "07ab5fa7f9dab3fb644a0261382c95e5be072741", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 26c7f5291e949e2cc400c65e01064a203a68f9c6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 1 Jan 2019 15:02:31 -0800 Subject: [PATCH 1993/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227453763 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a6e84db2f30..f67eff7f056 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c25acbf2efdaf0ebadc453aef2c7dbec5b319d6e336275743d2101f80e9fac0f", - git_commit = "07ab5fa7f9dab3fb644a0261382c95e5be072741", + sha256 = "74c02064a8f27a81d3278efe809b7271270d709de3e0b6daf9b1d2901ad18e01", + git_commit = "d1959dddd107c79db8c8d33d0a37ebc9fe8b0a21", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2470aa7cf3777b3df175901c7d0006478f42863e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 1 Jan 2019 20:02:02 -0800 Subject: [PATCH 1994/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227468630 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f67eff7f056..526c96cec2c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "74c02064a8f27a81d3278efe809b7271270d709de3e0b6daf9b1d2901ad18e01", - git_commit = "d1959dddd107c79db8c8d33d0a37ebc9fe8b0a21", + sha256 = "9bfdfbbdac727a1529b223aeecc94038ee6d339df57c9a6ba36cfc8416292a1e", + git_commit = "efb14346f9344db2f07c94428ee86f86100720b0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7f02d663a207b42054eaa976da6653f8ed9eb505 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 2 Jan 2019 02:02:02 -0800 Subject: [PATCH 1995/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227492713 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 526c96cec2c..1062eee3fe5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9bfdfbbdac727a1529b223aeecc94038ee6d339df57c9a6ba36cfc8416292a1e", - git_commit = "efb14346f9344db2f07c94428ee86f86100720b0", + sha256 = "9e803fcce5da114a9ea154fc1a35953a03540bb35790e15d7a8d49a7be0babec", + git_commit = "b277e326766ac3a0eff3e72e9e53dadcc31674e2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From a2727f2ee6eaf7fd979416998d2a51f523b3f6fe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 2 Jan 2019 03:02:13 -0800 Subject: [PATCH 1996/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227497687 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1062eee3fe5..531c7a66806 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9e803fcce5da114a9ea154fc1a35953a03540bb35790e15d7a8d49a7be0babec", - git_commit = "b277e326766ac3a0eff3e72e9e53dadcc31674e2", + sha256 = "4b084e9e51f9df19e01634f245f1920328a241cc5415cae86e74619df7eba8b7", + git_commit = "5ed6676c75192429132bbc0da179ad3e3367089c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From db99603b8309e72c597e9da656081049dadf1f1b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 2 Jan 2019 04:02:13 -0800 Subject: [PATCH 1997/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227502079 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 531c7a66806..82ad0e6f2f8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4b084e9e51f9df19e01634f245f1920328a241cc5415cae86e74619df7eba8b7", - git_commit = "5ed6676c75192429132bbc0da179ad3e3367089c", + sha256 = "0943336f3125727214c776f47cb8797684d71420dffbc678857226cd78ef3875", + git_commit = "26d81c48681c17fbfe1c586b54512d8a89062183", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c2b0b8c06b70580d4a0406f00d4f568fa66626c7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 2 Jan 2019 06:02:00 -0800 Subject: [PATCH 1998/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227510725 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 82ad0e6f2f8..481fa324c70 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0943336f3125727214c776f47cb8797684d71420dffbc678857226cd78ef3875", - git_commit = "26d81c48681c17fbfe1c586b54512d8a89062183", + sha256 = "332520bba6715ee3b4ec2a2140e449836c163533fce9e45182d16dd7af9c413d", + git_commit = "2b5cbcdd8d84d9673c9f17b4400ec6d70e2c8d73", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1204955e56caef885e86c574d89c5147f7b64901 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 2 Jan 2019 07:02:08 -0800 Subject: [PATCH 1999/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227516112 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 481fa324c70..190d89064c8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "332520bba6715ee3b4ec2a2140e449836c163533fce9e45182d16dd7af9c413d", - git_commit = "2b5cbcdd8d84d9673c9f17b4400ec6d70e2c8d73", + sha256 = "bb8c8d9c16817fe5f5d881691fff18468868aa43f25d7be44acbd88b6a5fcd2a", + git_commit = "44442969c0596728dbdb98035bffc2baf1790f13", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 692daa9f73615d3a779bcd49e059f0200565285e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 2 Jan 2019 11:01:55 -0800 Subject: [PATCH 2000/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227547607 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 190d89064c8..4ab0a3f69b5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bb8c8d9c16817fe5f5d881691fff18468868aa43f25d7be44acbd88b6a5fcd2a", - git_commit = "44442969c0596728dbdb98035bffc2baf1790f13", + sha256 = "ddd646e243754e346a10951080e36d7b5d4288273f54e9f540f5bcb8f360e7e8", + git_commit = "b978ad9b3c0327d406301f1b32f6d6d11688ec6e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From defa122ba8012192bee24795b5259f852c8d9cde Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 2 Jan 2019 12:02:19 -0800 Subject: [PATCH 2001/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227558226 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4ab0a3f69b5..72ba0918611 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ddd646e243754e346a10951080e36d7b5d4288273f54e9f540f5bcb8f360e7e8", - git_commit = "b978ad9b3c0327d406301f1b32f6d6d11688ec6e", + sha256 = "35913b6e054dafdbb481d329c5e660328d16822c5127f9e744e2651466f28816", + git_commit = "e859bba35844942f1c60e3ea9f3d82bd574ed7e4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 506095589dfae6cbfd8eb5b63aa5bc9e2a300c5a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 2 Jan 2019 13:02:21 -0800 Subject: [PATCH 2002/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227567521 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 72ba0918611..4633d9ac209 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "35913b6e054dafdbb481d329c5e660328d16822c5127f9e744e2651466f28816", - git_commit = "e859bba35844942f1c60e3ea9f3d82bd574ed7e4", + sha256 = "297efb46a9b4c80779ec6ca4c60b6d0e1c683a43735aa86ef79cb7f0c1fcd325", + git_commit = "39ce126739b88ed6ecfe65bf4b765f32fb0e1e8a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From df8171babb1546b9be101e6ddd6ace7f3c705c46 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 2 Jan 2019 14:02:36 -0800 Subject: [PATCH 2003/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227577590 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4633d9ac209..3ccd46fef41 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "297efb46a9b4c80779ec6ca4c60b6d0e1c683a43735aa86ef79cb7f0c1fcd325", - git_commit = "39ce126739b88ed6ecfe65bf4b765f32fb0e1e8a", + sha256 = "78412458c3860e27303afcee5fecb81b716abe7fbfdcfc7fc93a3d44ce9e0834", + git_commit = "e6bcd45dd01ce2bbcf58a9444a669e2c127d79ab", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f1db990735186be8d4e148441ca93ba55389e4b2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 2 Jan 2019 15:02:35 -0800 Subject: [PATCH 2004/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227587831 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3ccd46fef41..6c7080feb98 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "78412458c3860e27303afcee5fecb81b716abe7fbfdcfc7fc93a3d44ce9e0834", - git_commit = "e6bcd45dd01ce2bbcf58a9444a669e2c127d79ab", + sha256 = "e708d6c49068cc90149155fd85583d2a7cee02041ba7fb2716c3d4439ccff8cf", + git_commit = "869f7cc28f6078e2dd7db759e0249cdfc27f5419", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0589677d60eeca884c715a5a849ac1180cfc31d2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 2 Jan 2019 16:02:55 -0800 Subject: [PATCH 2005/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227597565 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6c7080feb98..182b2b563ae 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e708d6c49068cc90149155fd85583d2a7cee02041ba7fb2716c3d4439ccff8cf", - git_commit = "869f7cc28f6078e2dd7db759e0249cdfc27f5419", + sha256 = "0aac2db442b364da9f9cf18da013ae1f7253e45e9758274a082c9d36ad53e846", + git_commit = "26d8486baa67d2c545aa4384f9d666dc7b9ad530", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5290c3c94deadab857263ae60a5919e5cb4c4687 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 2 Jan 2019 17:02:10 -0800 Subject: [PATCH 2006/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227605813 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 182b2b563ae..5f0e604abdc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0aac2db442b364da9f9cf18da013ae1f7253e45e9758274a082c9d36ad53e846", - git_commit = "26d8486baa67d2c545aa4384f9d666dc7b9ad530", + sha256 = "177972bf15079b3d83ed9bb367a0e88a5e5526a71da37ac359a34120e35b661e", + git_commit = "4435d81822bef10437b3ec7a73300db62a5a53ad", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From bf6dcaa7b4418fe63cd20b5805884a4a79501363 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 2 Jan 2019 18:03:19 -0800 Subject: [PATCH 2007/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227612282 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5f0e604abdc..a7e929147c2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "177972bf15079b3d83ed9bb367a0e88a5e5526a71da37ac359a34120e35b661e", - git_commit = "4435d81822bef10437b3ec7a73300db62a5a53ad", + sha256 = "b4b760c047f1aa20b84d49484077c3df25debad670a6f1600584576027aed6a0", + git_commit = "563ff22e7f6c9431072d2d9af6e876b3b4843920", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9e5335d1a05e604e7530af4e13dd62f7be246826 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 2 Jan 2019 19:01:57 -0800 Subject: [PATCH 2008/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227617116 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a7e929147c2..a61da7a7517 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b4b760c047f1aa20b84d49484077c3df25debad670a6f1600584576027aed6a0", - git_commit = "563ff22e7f6c9431072d2d9af6e876b3b4843920", + sha256 = "61690b98aaa2ba0f03185fb4345bb6257d488ca682561a892ed8e3add2006e2c", + git_commit = "894278658bf6da29831371670862688f46153be0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 22bafabfdd6f3d332889f22765dab78eb2144785 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 3 Jan 2019 00:02:13 -0800 Subject: [PATCH 2009/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227639645 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a61da7a7517..a8d96eb1f1c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "61690b98aaa2ba0f03185fb4345bb6257d488ca682561a892ed8e3add2006e2c", - git_commit = "894278658bf6da29831371670862688f46153be0", + sha256 = "3236bdaeecb401b342a7612f1a80958e8f08d5bcea4de693af2ce426569c5476", + git_commit = "a8bf983c60f3684220996cd518d2b86e31dd6e1e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 9fea6858da5e64932bcae5e492e9236b1aefba88 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 3 Jan 2019 02:02:10 -0800 Subject: [PATCH 2010/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227653581 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a8d96eb1f1c..991f6fcf77f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3236bdaeecb401b342a7612f1a80958e8f08d5bcea4de693af2ce426569c5476", - git_commit = "a8bf983c60f3684220996cd518d2b86e31dd6e1e", + sha256 = "a5541dabe0e2d71598947dbb66b5b1d1952d9e5af3f9d8d21c36255cbb2a44e4", + git_commit = "df0bd2904e2ace75c53e0e7663a2f9cff23f261d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ed465f09971edd805b5daf195b5a093553287220 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 3 Jan 2019 03:02:31 -0800 Subject: [PATCH 2011/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227659961 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 991f6fcf77f..6c9885be966 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a5541dabe0e2d71598947dbb66b5b1d1952d9e5af3f9d8d21c36255cbb2a44e4", - git_commit = "df0bd2904e2ace75c53e0e7663a2f9cff23f261d", + sha256 = "f08d0c27dea00c20cea14e0adeea1cfeefa6d49e6d6f493b540da21aaa7104db", + git_commit = "37326d1497de6de3ea32a1b121f99b2e50ac2dbc", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 44dd81cecbe8c3c2ad95e0f4f974ce7c357d9aa3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 3 Jan 2019 04:02:45 -0800 Subject: [PATCH 2012/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227665416 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6c9885be966..96ba709e573 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f08d0c27dea00c20cea14e0adeea1cfeefa6d49e6d6f493b540da21aaa7104db", - git_commit = "37326d1497de6de3ea32a1b121f99b2e50ac2dbc", + sha256 = "6ceccc2b8dbba6655fc253aa136a90081ef50809012552454b8cb2ed781a6ec6", + git_commit = "eb54349cb4274ab797917a9e0699decec0b9794c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 217a128a9cfed3ed6db2301a3590e02e6063bf40 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 3 Jan 2019 09:02:01 -0800 Subject: [PATCH 2013/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227696935 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 96ba709e573..a2aa7e54c75 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6ceccc2b8dbba6655fc253aa136a90081ef50809012552454b8cb2ed781a6ec6", - git_commit = "eb54349cb4274ab797917a9e0699decec0b9794c", + sha256 = "75a87e2988651eafb0c77d8aa2deeeca09c3643ae44ec78d16d5026fd8bc7fed", + git_commit = "31cf2b97f0f3b1a90d26a56016c4b984f62dea3e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 82b5d85916d2f11eb87b152d020bfc9c70c80f1a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 3 Jan 2019 10:02:03 -0800 Subject: [PATCH 2014/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227705361 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a2aa7e54c75..3fda9252144 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "75a87e2988651eafb0c77d8aa2deeeca09c3643ae44ec78d16d5026fd8bc7fed", - git_commit = "31cf2b97f0f3b1a90d26a56016c4b984f62dea3e", + sha256 = "125025699f15a539ee979e6754d2bf83091aa07f4e35e6c1cc8e8b3e3e89d9bb", + git_commit = "dfad4e97b2d00df768e9e8df16179a6f7ceda43c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c7b3d944f6b5b6398f90384221e5f303b48dedcb Mon Sep 17 00:00:00 2001 From: laigd Date: Thu, 3 Jan 2019 10:10:18 -0800 Subject: [PATCH 2015/8103] Add half_plus_two SavedModel for TRT and corresponding docker image test. Related changes include: - the test input shape is changed to two-dimensional since TRT requires input to be of at least two dimensional. - the python script to generate the half_plus_two SavedModel is changed, so that the constants are not shared between the paths to compute y/y2 and y3, and it won't fuse the two paths into single node when applying optimizations like TF-TRT, which will break the 'serving_default' signature. PiperOrigin-RevId: 227706980 --- .../servables/tensorflow/testdata/BUILD | 7 +++ .../testdata/saved_model_half_plus_two.py | 6 ++- .../00000123/saved_model.pb | Bin 0 -> 13551 bytes tensorflow_serving/tools/docker/tests/BUILD | 32 +++++++++++++ .../tests/dockerfile_devel_gpu_trt_test.sh | 44 ++++++++++++++++++ .../docker/tests/dockerfile_gpu_trt_test.sh | 44 ++++++++++++++++++ 6 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_gpu_trt/00000123/saved_model.pb create mode 100755 tensorflow_serving/tools/docker/tests/dockerfile_devel_gpu_trt_test.sh create mode 100755 tensorflow_serving/tools/docker/tests/dockerfile_gpu_trt_test.sh diff --git a/tensorflow_serving/servables/tensorflow/testdata/BUILD b/tensorflow_serving/servables/tensorflow/testdata/BUILD index cc23480778d..0381e2b2fd8 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/BUILD +++ b/tensorflow_serving/servables/tensorflow/testdata/BUILD @@ -100,6 +100,13 @@ filegroup( ), ) +filegroup( + name = "saved_model_half_plus_two_gpu_trt", + srcs = glob( + ["saved_model_half_plus_two_gpu_trt/**"], + ), +) + # Note: re-generate these files with :export_half_plus_two whenever model # changes. exports_files([ diff --git a/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two.py b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two.py index b793a8e58ff..b06ee1e007b 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two.py +++ b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two.py @@ -188,7 +188,11 @@ def _generate_saved_model_for_half_plus_two(export_dir, o3 = tf.keras.layers.Conv2D(1, [1, 1])(tf.zeros((1, 16, 16, 1))) y3 = o3[0, 0, 0, 0] + tf.add(tf.multiply(a, x2), c) else: - y3 = tf.add(tf.multiply(a, x2), c) + # Add separate constants for x2, to prevent optimizers like TF-TRT from + # fusing the paths to compute y/y2 and y3 together. + a2 = tf.Variable(0.5, name="a2") + c2 = tf.Variable(3.0, name="c2") + y3 = tf.add(tf.multiply(a2, x2), c2) y3 = tf.identity(y3, name="y3") diff --git a/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_gpu_trt/00000123/saved_model.pb b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_gpu_trt/00000123/saved_model.pb new file mode 100644 index 0000000000000000000000000000000000000000..5a25a431f6ba3328f8af80bd3bcd8a1bee6e91be GIT binary patch literal 13551 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 literal 0 HcmV?d00001 diff --git a/tensorflow_serving/tools/docker/tests/BUILD b/tensorflow_serving/tools/docker/tests/BUILD index f0aaf26a233..4d60def5caa 100644 --- a/tensorflow_serving/tools/docker/tests/BUILD +++ b/tensorflow_serving/tools/docker/tests/BUILD @@ -109,3 +109,35 @@ sh_test( ], deps = [":docker_test_lib"], ) + +sh_test( + name = "unittest_dockerfile_gpu_trt", + size = "medium", + srcs = ["dockerfile_gpu_trt_test.sh"], + args = ["tensorflow/serving:latest-gpu"], + data = [ + "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_gpu_trt", + ], + tags = [ + "exclusive", + "local", + "manual", + ], + deps = [":docker_test_lib"], +) + +sh_test( + name = "unittest_dockerfile_devel_gpu_trt", + size = "medium", + srcs = ["dockerfile_devel_gpu_trt_test.sh"], + args = ["tensorflow/serving:latest-devel-gpu"], + data = [ + "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_gpu_trt", + ], + tags = [ + "exclusive", + "local", + "manual", + ], + deps = [":docker_test_lib"], +) diff --git a/tensorflow_serving/tools/docker/tests/dockerfile_devel_gpu_trt_test.sh b/tensorflow_serving/tools/docker/tests/dockerfile_devel_gpu_trt_test.sh new file mode 100755 index 00000000000..2c097f01bdd --- /dev/null +++ b/tensorflow_serving/tools/docker/tests/dockerfile_devel_gpu_trt_test.sh @@ -0,0 +1,44 @@ +#!/bin/bash +# Copyright 2018 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +# +# Tests if a Docker image built from Dockerfile.devel-gpu basically functions. +# +# It does this by loading up a half plus two toy model in the Docker image +# and querying it, validating the response. This model will only load on a GPU. +# +# The image passed to this test must be already available locally. +# +# Ex: $ bazel test :unittest_Dockerfile.devel-gpu \ +# --test_arg=tensorflow/serving:latest-devel-gpu \ +# --test_output=streamed --verbose_failures + +declare -r PROJDIR=$(pwd)/tensorflow_serving +source ${PROJDIR}/tools/docker/tests/docker_test_lib.sh || exit 1 + +# Values to fill in for test +# ------------------------------------------------------------------------------ +declare -r USE_NVIDIA_RUNTIME=true +declare -r IS_DEVEL_IMAGE=true +declare -r MODELNAME="saved_model_half_plus_two_gpu_trt" +declare -r MODELDIR="${PROJDIR}/servables/tensorflow/testdata" +# TF-TRT requires input to be at minimum two dimentional. +declare -r REQUEST='{"instances": [[1.0],[2.0],[5.0]]}' +declare -r RESPONSE='{"predictions":[[2.5],[3.0],[4.5]]}' +# ------------------------------------------------------------------------------ + +# Grab the last argument as the image, so we can override the test arg in +# the BUILD file +test_docker_image ${@: -1} diff --git a/tensorflow_serving/tools/docker/tests/dockerfile_gpu_trt_test.sh b/tensorflow_serving/tools/docker/tests/dockerfile_gpu_trt_test.sh new file mode 100755 index 00000000000..ed474f89dde --- /dev/null +++ b/tensorflow_serving/tools/docker/tests/dockerfile_gpu_trt_test.sh @@ -0,0 +1,44 @@ +#!/bin/bash +# Copyright 2018 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +# +# Tests if a Docker image built from Dockerfile.gpu basically functions. +# +# It does this by loading up a half plus two toy model in the Docker image +# and querying it, validating the response. This model will only load on a GPU. +# +# The image passed to this test must be already available locally. +# +# Ex: $ bazel test :unittest_Dockerfile.gpu \ +# --test_arg=tensorflow/serving:latest-gpu \ +# --test_output=streamed --verbose_failures + +declare -r PROJDIR=$(pwd)/tensorflow_serving +source ${PROJDIR}/tools/docker/tests/docker_test_lib.sh || exit 1 + +# Values to fill in for test +# ------------------------------------------------------------------------------ +declare -r USE_NVIDIA_RUNTIME=true +declare -r IS_DEVEL_IMAGE=false +declare -r MODELNAME="saved_model_half_plus_two_gpu_trt" +declare -r MODELDIR="${PROJDIR}/servables/tensorflow/testdata" +# TF-TRT requires input to be at minimum two dimentional. +declare -r REQUEST='{"instances": [[1.0],[2.0],[5.0]]}' +declare -r RESPONSE='{"predictions":[[2.5],[3.0],[4.5]]}' +# ------------------------------------------------------------------------------ + +# Grab the last argument as the image, so we can override the test arg in +# the BUILD file +test_docker_image ${@: -1} From d8a3a0bcf7991a6d0f50112dd419eacaa798fc34 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 3 Jan 2019 11:02:12 -0800 Subject: [PATCH 2016/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227715781 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3fda9252144..dd8c9006727 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "125025699f15a539ee979e6754d2bf83091aa07f4e35e6c1cc8e8b3e3e89d9bb", - git_commit = "dfad4e97b2d00df768e9e8df16179a6f7ceda43c", + sha256 = "8933ae9281c6f0bf8cbe7cf1d05e26c42775f1b85c91d7f2e9e176c440a3e5ff", + git_commit = "c2ec7217a8b122d6a561da5d7d96b94ede9b7684", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 557a9076e40519a5865dbd251d639c8a46ff696e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 3 Jan 2019 12:02:52 -0800 Subject: [PATCH 2017/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227726449 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dd8c9006727..507f0045bfe 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8933ae9281c6f0bf8cbe7cf1d05e26c42775f1b85c91d7f2e9e176c440a3e5ff", - git_commit = "c2ec7217a8b122d6a561da5d7d96b94ede9b7684", + sha256 = "2443c458b4ba86f7af8be6380bc8f1ef3fbee8834950f6c515e298e5b19c6d8e", + git_commit = "e018e12b4c18b8ce3d683100ddedde5481cd8c1c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From f5613882bd7d498c3484972347fde7a11914cdc2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 3 Jan 2019 13:02:18 -0800 Subject: [PATCH 2018/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227735489 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 507f0045bfe..08ee9836861 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2443c458b4ba86f7af8be6380bc8f1ef3fbee8834950f6c515e298e5b19c6d8e", - git_commit = "e018e12b4c18b8ce3d683100ddedde5481cd8c1c", + sha256 = "23592c0da389f4c30fc50a50096ee06c9f99d71e878a02775b987449c9e29645", + git_commit = "41c30afbfb6a752f09f9b26db807b1a1ac494e8a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 60c22e5a9302ed7596b427983bc0c9e426605aa6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 3 Jan 2019 14:02:39 -0800 Subject: [PATCH 2019/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227746122 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 08ee9836861..b30e3cd6c82 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "23592c0da389f4c30fc50a50096ee06c9f99d71e878a02775b987449c9e29645", - git_commit = "41c30afbfb6a752f09f9b26db807b1a1ac494e8a", + sha256 = "be225bbe6447738211dd414cfcbc0dfc4da6c1ab2f32f568cfeae36f64ade0fc", + git_commit = "7e2d53c1c371f38c7f0ef13c1c06336b22a195c0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3e90bab1afa82e75585050cf8cb8457e429c0d22 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 3 Jan 2019 15:02:08 -0800 Subject: [PATCH 2020/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227756321 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b30e3cd6c82..f747ba52d65 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "be225bbe6447738211dd414cfcbc0dfc4da6c1ab2f32f568cfeae36f64ade0fc", - git_commit = "7e2d53c1c371f38c7f0ef13c1c06336b22a195c0", + sha256 = "4b4b69acc43c6887a6d8d586d740034bf1cf7963317c076d293b35e7a9c9e240", + git_commit = "4ee52f8b0751004e76164464938cafed9f1f3623", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2c280b017b5f3bfdc8e4c12581cb42d10651b40e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 3 Jan 2019 16:03:28 -0800 Subject: [PATCH 2021/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227766395 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f747ba52d65..f8f2aeab452 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4b4b69acc43c6887a6d8d586d740034bf1cf7963317c076d293b35e7a9c9e240", - git_commit = "4ee52f8b0751004e76164464938cafed9f1f3623", + sha256 = "0571ed1d35c977850df878d69819be3c35c93a262f610556c3fa9e57be498cb8", + git_commit = "8f1e280350d1a0a6b4134327ecd029195438e767", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 1c44b44b720a0b12729dda9d7ed81b964685510a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 3 Jan 2019 17:02:09 -0800 Subject: [PATCH 2022/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227775114 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f8f2aeab452..6993d437b07 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0571ed1d35c977850df878d69819be3c35c93a262f610556c3fa9e57be498cb8", - git_commit = "8f1e280350d1a0a6b4134327ecd029195438e767", + sha256 = "f1aaa231bde748172adfc63a758ee3f3f7a8f582ec1e8e64339f3a07a0d8aaa7", + git_commit = "6932e795621a76a7e520bee529d915265b40e9bd", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5c566693fe911e95f532060ac7a868b5ca2fea55 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 3 Jan 2019 18:02:27 -0800 Subject: [PATCH 2023/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227782015 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6993d437b07..22f86dbb22d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f1aaa231bde748172adfc63a758ee3f3f7a8f582ec1e8e64339f3a07a0d8aaa7", - git_commit = "6932e795621a76a7e520bee529d915265b40e9bd", + sha256 = "0e369a7c0f8efa77616a770c3ea8fd9bded4d1e5bb74fe69351af5e05dafb82a", + git_commit = "03258acbf396a1241dee813e86848dc768394afd", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c7caedb1c201168e8aa187bcff405bc88b082268 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 3 Jan 2019 19:02:02 -0800 Subject: [PATCH 2024/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227787470 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 22f86dbb22d..7e0f5912431 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0e369a7c0f8efa77616a770c3ea8fd9bded4d1e5bb74fe69351af5e05dafb82a", - git_commit = "03258acbf396a1241dee813e86848dc768394afd", + sha256 = "3dbbd01086167734d12065c8e9070a561b01083829c24e453d13265f4867419c", + git_commit = "846dba8e81fde8a47196c9b04d31f847e5cc336f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 27b88de8bd0e0213830ad9e13bb17fb6375f597a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 3 Jan 2019 20:02:26 -0800 Subject: [PATCH 2025/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227792647 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7e0f5912431..e5ec8fecab0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3dbbd01086167734d12065c8e9070a561b01083829c24e453d13265f4867419c", - git_commit = "846dba8e81fde8a47196c9b04d31f847e5cc336f", + sha256 = "3eee8cb987688e743eebc59ef76cb75ba3fe3f7a51f1e51594dafa44aee6bd8e", + git_commit = "31c6f4b71526db08ba895f7f2c61f30d0eb3475c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 4cdb133f9653ad46de267eaefc84a831687e1d05 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 3 Jan 2019 21:02:03 -0800 Subject: [PATCH 2026/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227797310 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e5ec8fecab0..266a065a78c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3eee8cb987688e743eebc59ef76cb75ba3fe3f7a51f1e51594dafa44aee6bd8e", - git_commit = "31c6f4b71526db08ba895f7f2c61f30d0eb3475c", + sha256 = "89882ac60bf51e15202b22212aa00d2307cb7318dec4093ae3b4c98deecf2407", + git_commit = "a2f7f39d982682fa8de050e001522581570c510f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 99dd95fc75a3af016e8508e7e153c644f4991146 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 4 Jan 2019 02:01:51 -0800 Subject: [PATCH 2027/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227824181 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 266a065a78c..9a428c72cad 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "89882ac60bf51e15202b22212aa00d2307cb7318dec4093ae3b4c98deecf2407", - git_commit = "a2f7f39d982682fa8de050e001522581570c510f", + sha256 = "4f3b7416bf62805d2f16bfe192e30a9aad3c8ff4d4d34e39bd7f92acdd8b7957", + git_commit = "72f0dadfffd8c2f635ec58ded5c38154644c6f3f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 78ffe52cd0761b763f0c49672b7af99d57135b29 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 4 Jan 2019 03:02:53 -0800 Subject: [PATCH 2028/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227830123 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9a428c72cad..62121ae1d0d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4f3b7416bf62805d2f16bfe192e30a9aad3c8ff4d4d34e39bd7f92acdd8b7957", - git_commit = "72f0dadfffd8c2f635ec58ded5c38154644c6f3f", + sha256 = "14ea4370beee6e200e664d19347b898b4a9f5e9f66873e35d3bcecc3608e0746", + git_commit = "6965d80c135a7c0008d2e17ce74529ab5798a5e4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ff668676c6f03673d7a45709c70b546c7040e9a0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 4 Jan 2019 06:02:21 -0800 Subject: [PATCH 2029/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227844804 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 62121ae1d0d..a2ec9f6c9a4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "14ea4370beee6e200e664d19347b898b4a9f5e9f66873e35d3bcecc3608e0746", - git_commit = "6965d80c135a7c0008d2e17ce74529ab5798a5e4", + sha256 = "5364f6dd7e49394840edb8fa198d846a8a30a68c43827f6edc9d1f71e25bc63a", + git_commit = "8e4ca33c8b5861526bcdc43eb1af6d73e1670e92", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ea1c637d9b45a046cbbc0fb206335f6babb5f7bc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 4 Jan 2019 09:02:18 -0800 Subject: [PATCH 2030/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227864115 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a2ec9f6c9a4..d94df565256 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5364f6dd7e49394840edb8fa198d846a8a30a68c43827f6edc9d1f71e25bc63a", - git_commit = "8e4ca33c8b5861526bcdc43eb1af6d73e1670e92", + sha256 = "b9e9e85d2a9c6bb7096d6c1b86cba7d34784f87d7c395b21098632c6c2e835ab", + git_commit = "0bc20afeec2b06437a7196b0d191d61f181cd81a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 354e43a39386a54656c124e204f1a9de805e5acf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 4 Jan 2019 10:02:01 -0800 Subject: [PATCH 2031/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227871914 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d94df565256..8cb7283ce7d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b9e9e85d2a9c6bb7096d6c1b86cba7d34784f87d7c395b21098632c6c2e835ab", - git_commit = "0bc20afeec2b06437a7196b0d191d61f181cd81a", + sha256 = "5a366089abfee9b1dd41caa699684588a7f12bc9f1eae6ddfbb4e4a5dd20ff4f", + git_commit = "bd2f78fd205faa739c657d26156bd27e02223df0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 15164d27fd4abaaa60974ec1f1c2b0961d7d2941 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 4 Jan 2019 11:02:54 -0800 Subject: [PATCH 2032/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227881885 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8cb7283ce7d..917ea8e8f0d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5a366089abfee9b1dd41caa699684588a7f12bc9f1eae6ddfbb4e4a5dd20ff4f", - git_commit = "bd2f78fd205faa739c657d26156bd27e02223df0", + sha256 = "fe84b36924996c3573bd8c4fb005ea92f489b1524a966682594c0756e93a33ed", + git_commit = "2a3d6401a3f21e4c9d043d90da48444d6e24e057", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 79890973d73497d9ec5aff2955f0d69d8cbee95e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 4 Jan 2019 12:03:13 -0800 Subject: [PATCH 2033/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227892161 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 917ea8e8f0d..a5e3d712dc6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fe84b36924996c3573bd8c4fb005ea92f489b1524a966682594c0756e93a33ed", - git_commit = "2a3d6401a3f21e4c9d043d90da48444d6e24e057", + sha256 = "b7285beae081f2bd31b3f22cc48936b4c50896202bfd53058b2f518e73a7a894", + git_commit = "d76c2d0a570495854617c318a2708636f5530f27", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2f2c21db403bc57d28677d04061e46d36629bd5b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 4 Jan 2019 13:02:38 -0800 Subject: [PATCH 2034/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227900956 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a5e3d712dc6..969586d9ede 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b7285beae081f2bd31b3f22cc48936b4c50896202bfd53058b2f518e73a7a894", - git_commit = "d76c2d0a570495854617c318a2708636f5530f27", + sha256 = "b9e12a5fc8131dc0348609c56ff79b058653e4f5af1692d6f9abaec19d3f4ce8", + git_commit = "37afc40b6f33073193114c081bcda939289deca0", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From ee74536c4c40a10e767da74f07c02ee5839d2e7a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 4 Jan 2019 14:02:12 -0800 Subject: [PATCH 2035/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227910155 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 969586d9ede..b41225b162b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b9e12a5fc8131dc0348609c56ff79b058653e4f5af1692d6f9abaec19d3f4ce8", - git_commit = "37afc40b6f33073193114c081bcda939289deca0", + sha256 = "b6119a586d85f8baab8ddf6b34ef152d8e961cfa8db50ebcd850e86eff35a7b9", + git_commit = "e2071f6a0502a5bc81abd0cb533f3b52ba0e7855", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c30ddd357ed9b7b6c8d7d9bdba598d636250da42 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 4 Jan 2019 15:02:16 -0800 Subject: [PATCH 2036/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227919829 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b41225b162b..0e9755fa58a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b6119a586d85f8baab8ddf6b34ef152d8e961cfa8db50ebcd850e86eff35a7b9", - git_commit = "e2071f6a0502a5bc81abd0cb533f3b52ba0e7855", + sha256 = "091d8f9a043485ce27526cd858716c53fa60848119fec55ee3a4c0aa48515153", + git_commit = "efe565bc0981e80a52a97f3961cfba3e87023b42", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b60b02d64ece1248b623e71905f3f6fee57ae099 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 4 Jan 2019 16:03:26 -0800 Subject: [PATCH 2037/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227928868 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0e9755fa58a..ed9b12ce4ed 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "091d8f9a043485ce27526cd858716c53fa60848119fec55ee3a4c0aa48515153", - git_commit = "efe565bc0981e80a52a97f3961cfba3e87023b42", + sha256 = "6481e807781a76eae009604352560f74df2f2e501ca3932c5caf22c495b6f068", + git_commit = "07777005d9b3feff4c8d74348739ad17de510131", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From eae3707a7bc2f5c7d852fd70d2197d1883813e75 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 4 Jan 2019 17:02:07 -0800 Subject: [PATCH 2038/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227935983 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ed9b12ce4ed..35a22b4e4fe 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6481e807781a76eae009604352560f74df2f2e501ca3932c5caf22c495b6f068", - git_commit = "07777005d9b3feff4c8d74348739ad17de510131", + sha256 = "42d85c3ba4e8c85f885807346cda34e169e9464c08103944f55cb0731dded604", + git_commit = "571d0114eda553e2d1b5c9c71f77c2211b5914e3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 24c7d9cd3e4bea0fe84b9d9d37a63834f2783f9e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 4 Jan 2019 18:02:28 -0800 Subject: [PATCH 2039/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227941738 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 35a22b4e4fe..08f7f04ec30 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "42d85c3ba4e8c85f885807346cda34e169e9464c08103944f55cb0731dded604", - git_commit = "571d0114eda553e2d1b5c9c71f77c2211b5914e3", + sha256 = "bdf4e059cbfdb274d0a9a187452c9ae25e867859651a4beda97c1ad8c39e845b", + git_commit = "774ede5790c6cf11da05ca1082e9870db7b843f9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 14d9f10c5dadf04e2bd6567a1c2d9f464bdc8a02 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 4 Jan 2019 19:02:14 -0800 Subject: [PATCH 2040/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227946067 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 08f7f04ec30..c1d67dcde30 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bdf4e059cbfdb274d0a9a187452c9ae25e867859651a4beda97c1ad8c39e845b", - git_commit = "774ede5790c6cf11da05ca1082e9870db7b843f9", + sha256 = "2ab60d37d5da32e413f4af1406d25fe4b102a4af858d5e310800b0374f9e5483", + git_commit = "1814e22d3cf78fd6e5b172c6de1a44cd6abc25f3", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b3a6889e27f0b28679f9cff8b6425559a929e150 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 4 Jan 2019 20:03:07 -0800 Subject: [PATCH 2041/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227949971 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c1d67dcde30..0ba9b6f082f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2ab60d37d5da32e413f4af1406d25fe4b102a4af858d5e310800b0374f9e5483", - git_commit = "1814e22d3cf78fd6e5b172c6de1a44cd6abc25f3", + sha256 = "36591c40a722c9ec0b6cf11bec8dd7a14a8abb440c193e55f256f76c76dd3682", + git_commit = "d93409b9dfc3bfaacfa452fab603a089931b3335", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 32b6497bff3b0a975d4fa0a14c5107282bade632 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 4 Jan 2019 21:02:48 -0800 Subject: [PATCH 2042/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227953614 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0ba9b6f082f..861be4aa292 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "36591c40a722c9ec0b6cf11bec8dd7a14a8abb440c193e55f256f76c76dd3682", - git_commit = "d93409b9dfc3bfaacfa452fab603a089931b3335", + sha256 = "e6d3d5b58e454bced3f4586f309499a0f0c2885a535c0a6871e5375e4b9c3438", + git_commit = "47c68e37dee827d9c3fe95f39e5fb49d07a573a5", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 776054246282770fd25ca9024c3d71f2cba63576 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 4 Jan 2019 23:02:02 -0800 Subject: [PATCH 2043/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227960155 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 861be4aa292..998b0b1e6e8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e6d3d5b58e454bced3f4586f309499a0f0c2885a535c0a6871e5375e4b9c3438", - git_commit = "47c68e37dee827d9c3fe95f39e5fb49d07a573a5", + sha256 = "736754358c137244ebcea162c1bfa7fc4e6e1250cddb58d2d88205a8685b9474", + git_commit = "20dc97f0f11534adca40d66e5268eb74e012e254", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8aaea5bdc92f5bbb33a73b8d2c58e4e5da631f59 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 5 Jan 2019 00:02:13 -0800 Subject: [PATCH 2044/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227963600 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 998b0b1e6e8..5179dc095cf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "736754358c137244ebcea162c1bfa7fc4e6e1250cddb58d2d88205a8685b9474", - git_commit = "20dc97f0f11534adca40d66e5268eb74e012e254", + sha256 = "aefcf27625ebbc96914d5d1c7b17d5197ab4a1d39b029340717497c0dfe8c92e", + git_commit = "058bb7c3512455d2d83d2094a6f6e60b0ca6ee05", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 53da0763b7b026dbd86c34b4a441994c98c976c6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 5 Jan 2019 03:02:17 -0800 Subject: [PATCH 2045/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 227976045 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5179dc095cf..78156b60deb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "aefcf27625ebbc96914d5d1c7b17d5197ab4a1d39b029340717497c0dfe8c92e", - git_commit = "058bb7c3512455d2d83d2094a6f6e60b0ca6ee05", + sha256 = "9a8fa8e7062b5ab09e9e87f6d4cec020e25dc25e958b743203e37e585c66bef3", + git_commit = "9e8962b78b3c514cb1163c01fa7ab767592f952f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 16f6443586013bf9b4089795f72ee3256f9aab5f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 5 Jan 2019 15:02:18 -0800 Subject: [PATCH 2046/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228010778 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 78156b60deb..816175d6758 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9a8fa8e7062b5ab09e9e87f6d4cec020e25dc25e958b743203e37e585c66bef3", - git_commit = "9e8962b78b3c514cb1163c01fa7ab767592f952f", + sha256 = "17ddc2c718af7b4797f3b7360c02c83f8f8ac320b3cd82f2393d6f0cff2506c1", + git_commit = "f69eca8cef2e8536364bb5a6e5f966a5e071812f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 62eaa73c961ac232e2bc2dce8f2805c27a231eee Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 6 Jan 2019 03:01:58 -0800 Subject: [PATCH 2047/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228044869 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 816175d6758..3da2ddc0d92 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "17ddc2c718af7b4797f3b7360c02c83f8f8ac320b3cd82f2393d6f0cff2506c1", - git_commit = "f69eca8cef2e8536364bb5a6e5f966a5e071812f", + sha256 = "c140655251a65dc9b41b4685a08ee924afefd86bc52641b6a002f37450ff5154", + git_commit = "933109e06a36d1e85daa59214ee37f0e3d170cc8", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b5aaa3c5f77c38573c73d1da613eaf023cf21d3f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 6 Jan 2019 04:02:13 -0800 Subject: [PATCH 2048/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228047942 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3da2ddc0d92..c9da1213b9f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c140655251a65dc9b41b4685a08ee924afefd86bc52641b6a002f37450ff5154", - git_commit = "933109e06a36d1e85daa59214ee37f0e3d170cc8", + sha256 = "7b5045a11e5356ba56f261bc2ab1189a839e7df5032dfea9ce7ec85c87d36f33", + git_commit = "a0804de99207eb89b38a315b7baa0eb2976931c7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 51aa6d7355eb4b9f9883cdb7a7e4cb8e47e09f1d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 6 Jan 2019 05:02:32 -0800 Subject: [PATCH 2049/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228051038 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c9da1213b9f..a7f1535acd3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7b5045a11e5356ba56f261bc2ab1189a839e7df5032dfea9ce7ec85c87d36f33", - git_commit = "a0804de99207eb89b38a315b7baa0eb2976931c7", + sha256 = "36ab58f5888da5f65d379fafaa8f16c46ca2abe3fdaa780f6cb6d16c5c339ddb", + git_commit = "92985e67564c119203f0aaca94b5a334d87c35e4", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3524d48830de6cec40937acd5193001dced925f7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 6 Jan 2019 16:03:18 -0800 Subject: [PATCH 2050/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228083373 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a7f1535acd3..733fdc23757 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "36ab58f5888da5f65d379fafaa8f16c46ca2abe3fdaa780f6cb6d16c5c339ddb", - git_commit = "92985e67564c119203f0aaca94b5a334d87c35e4", + sha256 = "9f9d11ab54d81714b0eb485a5118ffdbfdf2a2465c09ca38864cec8002de73f0", + git_commit = "1c7de3473c6b9eb6c5b3bd63ee75c203f7a5296c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c8aedaa040799d0b509f6a5ff5a5d2902334b1b2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 6 Jan 2019 18:02:26 -0800 Subject: [PATCH 2051/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228089629 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 733fdc23757..ced8643e158 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9f9d11ab54d81714b0eb485a5118ffdbfdf2a2465c09ca38864cec8002de73f0", - git_commit = "1c7de3473c6b9eb6c5b3bd63ee75c203f7a5296c", + sha256 = "2434ae2aebbf681534fca88f3ec547f49bab3968fb838b6589c3f1ccbde617ee", + git_commit = "38c91321421694432117b077294df43aa31d1193", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 081a2639777c9074f354d637fee00884b89b0b4d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 6 Jan 2019 21:02:15 -0800 Subject: [PATCH 2052/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228101459 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ced8643e158..8213b957488 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2434ae2aebbf681534fca88f3ec547f49bab3968fb838b6589c3f1ccbde617ee", - git_commit = "38c91321421694432117b077294df43aa31d1193", + sha256 = "eb2f0b9241d1b74959c3aa42c8dc498ebc10db7b7393293a2796ef256aa77c0d", + git_commit = "187a8cba72aae56ed8dfbe5c2d5779664b7683f2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5ba1b45f56cd739b3fc4221da94dc2b1492c8c5d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 7 Jan 2019 02:02:17 -0800 Subject: [PATCH 2053/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228126888 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8213b957488..f4442ae1fbb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eb2f0b9241d1b74959c3aa42c8dc498ebc10db7b7393293a2796ef256aa77c0d", - git_commit = "187a8cba72aae56ed8dfbe5c2d5779664b7683f2", + sha256 = "8413e1e240479bf8c12d5d3e3a24e48878ed90caff59e3221eea5431f18c7aab", + git_commit = "b8f2207ead5c6ce6e7e98479a88a08e4977aa83d", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 47547050fcc53fa817ea1966371933eef5293a76 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 7 Jan 2019 03:02:44 -0800 Subject: [PATCH 2054/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228133388 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f4442ae1fbb..c36c6c6192e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8413e1e240479bf8c12d5d3e3a24e48878ed90caff59e3221eea5431f18c7aab", - git_commit = "b8f2207ead5c6ce6e7e98479a88a08e4977aa83d", + sha256 = "40940639295e6ed56e0c6ec172638c52062bde0c01e5962848417e5ab1c21cbe", + git_commit = "48d0e4d813b914fc480c51de5c48903b9bcc4cc7", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 8f21caa269c01066c903ce1509c46a2a11f9c61f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 7 Jan 2019 04:02:23 -0800 Subject: [PATCH 2055/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228139342 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c36c6c6192e..a54be99d5b5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "40940639295e6ed56e0c6ec172638c52062bde0c01e5962848417e5ab1c21cbe", - git_commit = "48d0e4d813b914fc480c51de5c48903b9bcc4cc7", + sha256 = "7b6393db1e7b41f324e6a04693a8fe8cb847eb1bbe0789bbd3f9e0c7789cb67c", + git_commit = "f64f7f787d3596cb7c9228f131f06c159a0ec188", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c10ecab595f6781f70bf893a3074bb8659b4411c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 7 Jan 2019 09:01:55 -0800 Subject: [PATCH 2056/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228175251 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a54be99d5b5..13d6cf05e61 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7b6393db1e7b41f324e6a04693a8fe8cb847eb1bbe0789bbd3f9e0c7789cb67c", - git_commit = "f64f7f787d3596cb7c9228f131f06c159a0ec188", + sha256 = "45d2c99be9bd7a0a4e0eb6eddc8c5920feab874bd2a41e1e0a11acc1f80f53b3", + git_commit = "2703d8e84aced78a05ec7ad1ea0e5f4d0fe70f9f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5fcc63302b182de2d99c4ae4f7a4ad858bd892d2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 7 Jan 2019 13:01:57 -0800 Subject: [PATCH 2057/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228220212 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 13d6cf05e61..e260928488c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "45d2c99be9bd7a0a4e0eb6eddc8c5920feab874bd2a41e1e0a11acc1f80f53b3", - git_commit = "2703d8e84aced78a05ec7ad1ea0e5f4d0fe70f9f", + sha256 = "5702f9344bec4b150c36fae1cdb5b1f61d8aa37fc8443e900e97bf191f061fab", + git_commit = "2c0a8c16477999cc791705112f501d4530649938", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2bfbf6d40fbb722efecb34a1df7c6600aadd97b7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 7 Jan 2019 14:02:03 -0800 Subject: [PATCH 2058/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228231255 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e260928488c..fbbc53a41f1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5702f9344bec4b150c36fae1cdb5b1f61d8aa37fc8443e900e97bf191f061fab", - git_commit = "2c0a8c16477999cc791705112f501d4530649938", + sha256 = "d76da29b193f3c8375e9f92b53128b65bc5300c747b3eb4b96d97ad4300adf63", + git_commit = "021a8fe8a70b880031958f596b6c96e819e14386", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 7e5de6b8b05ed8bde63b800806d1f78dd76fedfa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 7 Jan 2019 15:03:03 -0800 Subject: [PATCH 2059/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228242933 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fbbc53a41f1..b2d7bc288cf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d76da29b193f3c8375e9f92b53128b65bc5300c747b3eb4b96d97ad4300adf63", - git_commit = "021a8fe8a70b880031958f596b6c96e819e14386", + sha256 = "08c15d23868f590e60160e0ca63c0c265fb7ae01dea7c221b9a7a0a5048c3090", + git_commit = "95d708d7b9e3f22c09ca77004e68f2cadb295226", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 23b2438600468a67843ce408d26c9e87175fe78f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 7 Jan 2019 16:02:43 -0800 Subject: [PATCH 2060/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228253337 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b2d7bc288cf..dc199bd817b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "08c15d23868f590e60160e0ca63c0c265fb7ae01dea7c221b9a7a0a5048c3090", - git_commit = "95d708d7b9e3f22c09ca77004e68f2cadb295226", + sha256 = "4d53db734ce11c83cb7f91384f94378683c4af578a25f230ee6343f929573c3b", + git_commit = "0c0046922a1b06de7431179e4e7b79d96e9091c2", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 155c58fcdbb9b11da6d035d0e6f527dc2659ca8d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 7 Jan 2019 17:02:49 -0800 Subject: [PATCH 2061/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228261451 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dc199bd817b..a57178d62db 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4d53db734ce11c83cb7f91384f94378683c4af578a25f230ee6343f929573c3b", - git_commit = "0c0046922a1b06de7431179e4e7b79d96e9091c2", + sha256 = "60d18f3a8dbe05af13034065ea9b7e7b121c13ecace5e8a72db669cc3f7c52fd", + git_commit = "6d26622733a3f55861c135b857b2cbce981b2467", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 2b05bc2fabf83b51896f3bc38bee82a6c3a8c346 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 7 Jan 2019 18:02:05 -0800 Subject: [PATCH 2062/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228267924 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a57178d62db..fa046dea4cb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "60d18f3a8dbe05af13034065ea9b7e7b121c13ecace5e8a72db669cc3f7c52fd", - git_commit = "6d26622733a3f55861c135b857b2cbce981b2467", + sha256 = "4ed3cfd17b04809b91c471843a827cf38d95af3f345047bf0832da3bbca649da", + git_commit = "a253b9eab582307315567ba36d2b25033ad29b8b", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From cef769a690a67b5d093425a7e66db91de28db3c8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 7 Jan 2019 19:02:31 -0800 Subject: [PATCH 2063/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228272745 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fa046dea4cb..1cc26919d75 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4ed3cfd17b04809b91c471843a827cf38d95af3f345047bf0832da3bbca649da", - git_commit = "a253b9eab582307315567ba36d2b25033ad29b8b", + sha256 = "6bf3b21eea20e4a078e5952d9d2e373e8e650f7d5abef6bc647ee603967168d7", + git_commit = "fbbecc81be3b1eab0c15020ce3b0566e60e25c7f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 92adcee773b269323bbe5fbe63351f6aa06020cf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 7 Jan 2019 20:02:52 -0800 Subject: [PATCH 2064/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228276492 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1cc26919d75..d7c1f1cf2f0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6bf3b21eea20e4a078e5952d9d2e373e8e650f7d5abef6bc647ee603967168d7", - git_commit = "fbbecc81be3b1eab0c15020ce3b0566e60e25c7f", + sha256 = "4911517c9ba74048b46b89022ebddaf6526747a1476c81622fbb14926a020658", + git_commit = "5ed2c498eddc0b95ae43d6f4c39e29011cd97694", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 644a1c19e2fd72532c50dbb8b4ec9e0cdcfe113c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 7 Jan 2019 21:02:51 -0800 Subject: [PATCH 2065/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228279776 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d7c1f1cf2f0..8f72e62fd65 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4911517c9ba74048b46b89022ebddaf6526747a1476c81622fbb14926a020658", - git_commit = "5ed2c498eddc0b95ae43d6f4c39e29011cd97694", + sha256 = "3bbdb4c4ffc77feaf24183f8ae01d39530081f0f54bfabf7fee37d95d9c224eb", + git_commit = "4cff2f464cf195fedd8165a11319e8379746456f", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c83d556468e355cd496c99e7682b10b26789f573 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 7 Jan 2019 22:02:07 -0800 Subject: [PATCH 2066/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228283403 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8f72e62fd65..3da930dbd67 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3bbdb4c4ffc77feaf24183f8ae01d39530081f0f54bfabf7fee37d95d9c224eb", - git_commit = "4cff2f464cf195fedd8165a11319e8379746456f", + sha256 = "12f899723f6b00d3f1a29c698192be071a958de8759537dff6130d35dd76a367", + git_commit = "35c4a0c9b970ba6afcd19f21d6c69a112f6df09a", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 44a877b59736bb9fd7879c82e824529111b37d90 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 7 Jan 2019 23:01:53 -0800 Subject: [PATCH 2067/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228286648 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3da930dbd67..9e3d4dca61d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "12f899723f6b00d3f1a29c698192be071a958de8759537dff6130d35dd76a367", - git_commit = "35c4a0c9b970ba6afcd19f21d6c69a112f6df09a", + sha256 = "7a6654d60b479b0e24233b4ba05f96d757e50db47795daab37c76d44c5d34394", + git_commit = "246780be77509fa4bea195d05fa73faa99467c58", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 5f2dccabaee433dea738af61d612b365cac75d22 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 8 Jan 2019 00:02:39 -0800 Subject: [PATCH 2068/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228290086 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9e3d4dca61d..2f7eda7e3d7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7a6654d60b479b0e24233b4ba05f96d757e50db47795daab37c76d44c5d34394", - git_commit = "246780be77509fa4bea195d05fa73faa99467c58", + sha256 = "70995d5b27e42cc7a6c56b454fd7943cd900280c179b96b4aefd3bd901451704", + git_commit = "2ca0bf7cf4e16cbed6affd7dd844fea4ed3a62df", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 3b1399a69f37a88ff1d143fe2149d3faa647e514 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 8 Jan 2019 01:02:33 -0800 Subject: [PATCH 2069/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228294282 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2f7eda7e3d7..112f0862f2d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "70995d5b27e42cc7a6c56b454fd7943cd900280c179b96b4aefd3bd901451704", - git_commit = "2ca0bf7cf4e16cbed6affd7dd844fea4ed3a62df", + sha256 = "58b8247ad6ee5035023fd02d582dfb6f77bb8d208ea9ea1c31e0b10a65cc7790", + git_commit = "94c604bdd72717b0c18a1648927529b27aeea320", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 548adf1a0d44f284dff57bc797e15bb6ec8cc325 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 8 Jan 2019 02:01:59 -0800 Subject: [PATCH 2070/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228298896 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 112f0862f2d..f3f8fdac51c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "58b8247ad6ee5035023fd02d582dfb6f77bb8d208ea9ea1c31e0b10a65cc7790", - git_commit = "94c604bdd72717b0c18a1648927529b27aeea320", + sha256 = "e5efa97f47a6895bfd8f06f641caa5ce56e8e592ff36a1e6c69bf34c4372986f", + git_commit = "b504d86ca21f9ce57700d017ab8f6d411ca5afde", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From d65b410ce5eb93a2f7ecd4c02a4d92e42a96bedc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 8 Jan 2019 03:02:26 -0800 Subject: [PATCH 2071/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228302952 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f3f8fdac51c..9cba4e2bc91 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e5efa97f47a6895bfd8f06f641caa5ce56e8e592ff36a1e6c69bf34c4372986f", - git_commit = "b504d86ca21f9ce57700d017ab8f6d411ca5afde", + sha256 = "7508a05f762c8927e0c6d718362a8446c264502a0e77d921631ef94d59f4f3d6", + git_commit = "f09a6224bac04fd8b45d72b5babee08212dcf836", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 03cfa3ed0fa41a058a9b3e11b45117413fad3912 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 8 Jan 2019 04:02:27 -0800 Subject: [PATCH 2072/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228307010 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9cba4e2bc91..145ddb23602 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7508a05f762c8927e0c6d718362a8446c264502a0e77d921631ef94d59f4f3d6", - git_commit = "f09a6224bac04fd8b45d72b5babee08212dcf836", + sha256 = "5743e6563517c47c76c181a2e57d722773346a72552bc58e00af10195658963d", + git_commit = "0ef4b190443a2f7b3b2330f053df5503af6b0191", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From 0bea824db85321580ec6e0edadf51dd9c228319b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 8 Jan 2019 05:02:38 -0800 Subject: [PATCH 2073/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228310603 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 145ddb23602..45b59ef4ed1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5743e6563517c47c76c181a2e57d722773346a72552bc58e00af10195658963d", - git_commit = "0ef4b190443a2f7b3b2330f053df5503af6b0191", + sha256 = "955972652f3ffe489808627c99783a6fab49f16131177bcdbfc82dde39ccc54b", + git_commit = "137c142341c9f10a1e105403fbfb1123a1802eb9", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From b4d4f1bc855f933d95db44785bfcc73773a50aae Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 8 Jan 2019 06:02:14 -0800 Subject: [PATCH 2074/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228315439 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 45b59ef4ed1..25488010636 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "955972652f3ffe489808627c99783a6fab49f16131177bcdbfc82dde39ccc54b", - git_commit = "137c142341c9f10a1e105403fbfb1123a1802eb9", + sha256 = "d1053739eb12e9c3e7a39d72cee1a3d88549aee523b886ae991ab893fea7d9cb", + git_commit = "c503c6254608a622b06340f1f7ddd8f31565ab5e", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From c01e64713f68bb49836da579d0874614510cdeb7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 8 Jan 2019 07:01:56 -0800 Subject: [PATCH 2075/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228322705 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 25488010636..6a9766a28bb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d1053739eb12e9c3e7a39d72cee1a3d88549aee523b886ae991ab893fea7d9cb", - git_commit = "c503c6254608a622b06340f1f7ddd8f31565ab5e", + sha256 = "146370a33620b4aba9eac11d46fa11886e1bc0e09dd06371ae4d236bee5abad4", + git_commit = "114f0d81404e7f9a93297f11ebc2fbceee8dbf7c", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fdc5bdf51c001e9301cc36c11934379d24e1ce40 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 8 Jan 2019 09:02:01 -0800 Subject: [PATCH 2076/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228339433 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6a9766a28bb..c886c0048c2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "146370a33620b4aba9eac11d46fa11886e1bc0e09dd06371ae4d236bee5abad4", - git_commit = "114f0d81404e7f9a93297f11ebc2fbceee8dbf7c", + sha256 = "12ed8036746a82eb91055c2fa9fb57f3b0a87ab650f13344066c070a59e97f95", + git_commit = "7fa90cddf07c6aac532306dac15e02216a83b9fa", ) # TensorFlow depends on "io_bazel_rules_closure" so we need this here. From fc0b75f2e325a187794bf437ff3227510d261afb Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Tue, 8 Jan 2019 10:38:51 -0800 Subject: [PATCH 2077/8103] Upgrade to Bazel 0.20.0 PiperOrigin-RevId: 228356571 --- tools/bazel.rc => .bazelrc | 0 WORKSPACE | 4 +++- tensorflow_serving/tools/docker/Dockerfile.devel | 3 +-- tensorflow_serving/tools/docker/Dockerfile.devel-gpu | 3 +-- tensorflow_serving/tools/docker/Dockerfile.devel-mkl | 3 +-- tensorflow_serving/workspace.bzl | 9 +++++---- third_party/{libevent.BUILD => libevent/BUILD} | 0 third_party/{rapidjson.BUILD => rapidjson/BUILD} | 0 8 files changed, 11 insertions(+), 11 deletions(-) rename tools/bazel.rc => .bazelrc (100%) rename third_party/{libevent.BUILD => libevent/BUILD} (100%) rename third_party/{rapidjson.BUILD => rapidjson/BUILD} (100%) diff --git a/tools/bazel.rc b/.bazelrc similarity index 100% rename from tools/bazel.rc rename to .bazelrc diff --git a/WORKSPACE b/WORKSPACE index c886c0048c2..2f6defb1c43 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,6 +15,8 @@ tensorflow_http_archive( git_commit = "7fa90cddf07c6aac532306dac15e02216a83b9fa", ) +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + # TensorFlow depends on "io_bazel_rules_closure" so we need this here. # Needs to be kept in sync with the same target in TensorFlow's WORKSPACE file. http_archive( @@ -35,4 +37,4 @@ tf_serving_workspace() # Specify the minimum required bazel version. load("@org_tensorflow//tensorflow:version_check.bzl", "check_bazel_version_at_least") -check_bazel_version_at_least("0.15.0") +check_bazel_version_at_least("0.20.0") diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index e47460f2be0..edccb909310 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -60,8 +60,7 @@ RUN pip --no-cache-dir install \ requests # Set up Bazel -# Need >= 0.15.0 so bazel compiles work with docker bind mounts. -ENV BAZEL_VERSION 0.15.0 +ENV BAZEL_VERSION 0.20.0 WORKDIR / RUN mkdir /bazel && \ cd /bazel && \ diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 088fd01faf0..ab988983cb1 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -95,8 +95,7 @@ RUN pip --no-cache-dir install \ requests # Set up Bazel -# Need >= 0.15.0 so bazel compiles work with docker bind mounts. -ENV BAZEL_VERSION 0.15.0 +ENV BAZEL_VERSION 0.20.0 WORKDIR / RUN mkdir /bazel && \ cd /bazel && \ diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl index a91370f4382..d59d6273f54 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl @@ -60,8 +60,7 @@ RUN pip --no-cache-dir install \ requests # Set up Bazel -# Need >= 0.15.0 so bazel compiles work with docker bind mounts. -ENV BAZEL_VERSION 0.15.0 +ENV BAZEL_VERSION 0.20.0 WORKDIR / RUN mkdir /bazel && \ cd /bazel && \ diff --git a/tensorflow_serving/workspace.bzl b/tensorflow_serving/workspace.bzl index 5d055628dbc..7c6ab3308b5 100644 --- a/tensorflow_serving/workspace.bzl +++ b/tensorflow_serving/workspace.bzl @@ -2,6 +2,7 @@ # files. load("@org_tensorflow//tensorflow:workspace.bzl", "tf_workspace") +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") def tf_serving_workspace(): """All TensorFlow Serving external dependencies.""" @@ -27,23 +28,23 @@ def tf_serving_workspace(): ) # ===== RapidJSON (rapidjson.org) dependencies ===== - native.new_http_archive( + http_archive( name = "com_github_tencent_rapidjson", urls = [ "https://github.com/Tencent/rapidjson/archive/v1.1.0.zip", ], sha256 = "8e00c38829d6785a2dfb951bb87c6974fa07dfe488aa5b25deec4b8bc0f6a3ab", strip_prefix = "rapidjson-1.1.0", - build_file = "third_party/rapidjson.BUILD", + build_file = "@//third_party/rapidjson:BUILD", ) # ===== libevent (libevent.org) dependencies ===== - native.new_http_archive( + http_archive( name = "com_github_libevent_libevent", urls = [ "https://github.com/libevent/libevent/archive/release-2.1.8-stable.zip", ], sha256 = "70158101eab7ed44fd9cc34e7f247b3cae91a8e4490745d9d6eb7edc184e4d96", strip_prefix = "libevent-release-2.1.8-stable", - build_file = "third_party/libevent.BUILD", + build_file = "@//third_party/libevent:BUILD", ) diff --git a/third_party/libevent.BUILD b/third_party/libevent/BUILD similarity index 100% rename from third_party/libevent.BUILD rename to third_party/libevent/BUILD diff --git a/third_party/rapidjson.BUILD b/third_party/rapidjson/BUILD similarity index 100% rename from third_party/rapidjson.BUILD rename to third_party/rapidjson/BUILD From 2c38c215be297be65c157a9c76e20711e9f5966f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 8 Jan 2019 11:02:16 -0800 Subject: [PATCH 2078/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228361486 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2f6defb1c43..096f9e69553 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "12ed8036746a82eb91055c2fa9fb57f3b0a87ab650f13344066c070a59e97f95", - git_commit = "7fa90cddf07c6aac532306dac15e02216a83b9fa", + sha256 = "34f9c78e3fbc0c315c8c24a75b4111b79ab334cb6552b3c5418570432b7cbee3", + git_commit = "aa5e17a2dc94ba47d41a74021d6701a8c10de4a5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 828c9e7fd45e940b4339d2b2c56e3a9494dd3e00 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 8 Jan 2019 12:02:14 -0800 Subject: [PATCH 2079/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228373580 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 096f9e69553..acb733ba1ea 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "34f9c78e3fbc0c315c8c24a75b4111b79ab334cb6552b3c5418570432b7cbee3", - git_commit = "aa5e17a2dc94ba47d41a74021d6701a8c10de4a5", + sha256 = "327339280868f3f9dbdc97ec76ec0dbeadaf97f189f26095c66d93948c821577", + git_commit = "2ce3e3758d0fc1eea31b3e16c94321198c121953", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 28a76406951c6b7e15c1cebc758fa7c00981b1a7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 8 Jan 2019 13:02:17 -0800 Subject: [PATCH 2080/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228383714 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index acb733ba1ea..e5f5a73f84c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "327339280868f3f9dbdc97ec76ec0dbeadaf97f189f26095c66d93948c821577", - git_commit = "2ce3e3758d0fc1eea31b3e16c94321198c121953", + sha256 = "678071539d3652d561a00d1885203732b0c5fb5905f8466ae106011b2518f23c", + git_commit = "989c8b40a9b3b7bd45aedef43315675b0d4baf8d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a84f1a62f852c38fb41ad1b32d3064357d25a75c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 8 Jan 2019 14:02:01 -0800 Subject: [PATCH 2081/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228394981 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e5f5a73f84c..544dc9711cf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "678071539d3652d561a00d1885203732b0c5fb5905f8466ae106011b2518f23c", - git_commit = "989c8b40a9b3b7bd45aedef43315675b0d4baf8d", + sha256 = "5c92844d54e81869981d9af34bb165ccf19a50e7025e7efd911341ffc08acb2d", + git_commit = "495b3eeef0386b1b89b7aa9df42f2cf438de6ebc", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0483a73b7ad3d00fb92a96f28d24d19dafdc76a4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 8 Jan 2019 15:02:15 -0800 Subject: [PATCH 2082/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228406310 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 544dc9711cf..fb75ffecb85 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5c92844d54e81869981d9af34bb165ccf19a50e7025e7efd911341ffc08acb2d", - git_commit = "495b3eeef0386b1b89b7aa9df42f2cf438de6ebc", + sha256 = "49a121f6e88a2a68985fad06ab1e683558a911d7972b470aef4a3803eab8578d", + git_commit = "fd54d400ba60e57daf431afe209133226e03acfc", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 66ca16ee374790516c6d2e04be7ca76ceaaa4865 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 8 Jan 2019 16:03:23 -0800 Subject: [PATCH 2083/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228417304 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fb75ffecb85..01c7aefa3dc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "49a121f6e88a2a68985fad06ab1e683558a911d7972b470aef4a3803eab8578d", - git_commit = "fd54d400ba60e57daf431afe209133226e03acfc", + sha256 = "3bf3035a70f8b137c3fbf99e7e54e95b20e9490950d6906a5093bcdef7c489c4", + git_commit = "9f0ab258f7d715171f878080e6ed5c880aea004c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From bbd0d91c92a66c435a81db43f45b1182f47ee72b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 8 Jan 2019 17:02:02 -0800 Subject: [PATCH 2084/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228426631 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 01c7aefa3dc..8308303ff5f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3bf3035a70f8b137c3fbf99e7e54e95b20e9490950d6906a5093bcdef7c489c4", - git_commit = "9f0ab258f7d715171f878080e6ed5c880aea004c", + sha256 = "3b2dc50d392b3ebc6474677e6bfc0c926799486185739f2390866d0e96febff0", + git_commit = "0b53b291f31d9ac9d1bb9cffbc037fe978f593fd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3e8ccebc8341dfbe4d39e4e8858067d9daa91fd0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 8 Jan 2019 18:02:20 -0800 Subject: [PATCH 2085/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228434491 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8308303ff5f..89e685aa548 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3b2dc50d392b3ebc6474677e6bfc0c926799486185739f2390866d0e96febff0", - git_commit = "0b53b291f31d9ac9d1bb9cffbc037fe978f593fd", + sha256 = "431290f11460f0f5c2cd8b2ebe837d3eeabd5f04caab96003a4c99fe44db9c2e", + git_commit = "c842394896de32c4160fc0f5f94dabf06890476d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9673728d1bdfca8611168962f936a3f2d06f0023 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 8 Jan 2019 19:02:20 -0800 Subject: [PATCH 2086/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228440592 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 89e685aa548..57d2628cf88 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "431290f11460f0f5c2cd8b2ebe837d3eeabd5f04caab96003a4c99fe44db9c2e", - git_commit = "c842394896de32c4160fc0f5f94dabf06890476d", + sha256 = "4e4703271c0327e5d4e4b9e3ba1617f72511db4fd32425607950c929e9243355", + git_commit = "fb8a14fde29f2dc19331d73795c2ead0e8ef0e8e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4471072e08d2c2dc86487e92109e5b59b9a05c78 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 8 Jan 2019 20:02:17 -0800 Subject: [PATCH 2087/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228445625 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 57d2628cf88..67d54ef13d8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4e4703271c0327e5d4e4b9e3ba1617f72511db4fd32425607950c929e9243355", - git_commit = "fb8a14fde29f2dc19331d73795c2ead0e8ef0e8e", + sha256 = "2da181bbf5bfb6170bd9ccbdf7b9384c9bbb1308096b15b0c509fd3986c88c0e", + git_commit = "e3b8fedc923d03fd5f388daf444b42b22dd909b8", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5f5ece315bbf1966d281175cfef751c0ad3db849 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 8 Jan 2019 21:01:46 -0800 Subject: [PATCH 2088/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228450347 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 67d54ef13d8..2ce90570696 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2da181bbf5bfb6170bd9ccbdf7b9384c9bbb1308096b15b0c509fd3986c88c0e", - git_commit = "e3b8fedc923d03fd5f388daf444b42b22dd909b8", + sha256 = "85981ba8dd2a41709c3c5e1f1ee3dc21e8a10e0521354c6f3fc62e369518a292", + git_commit = "8d4893d6efa971b35db9f4eb654adb1559b7186c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0caebd472e264cbed10b2ed9879cba83d7090495 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 9 Jan 2019 03:02:33 -0800 Subject: [PATCH 2089/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228486504 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2ce90570696..82e42abff80 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "85981ba8dd2a41709c3c5e1f1ee3dc21e8a10e0521354c6f3fc62e369518a292", - git_commit = "8d4893d6efa971b35db9f4eb654adb1559b7186c", + sha256 = "ef2f4970bbdb6671ac75419be382a6ffc5d7b50a885b4e1347f66ff694aa3a25", + git_commit = "746a9750f49d98b975a4cd0ee8c0f353426ffbc0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8bd650178904f84b41b11da3601951cc2059b7c6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 9 Jan 2019 04:02:20 -0800 Subject: [PATCH 2090/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228492222 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 82e42abff80..d8b58b6f036 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ef2f4970bbdb6671ac75419be382a6ffc5d7b50a885b4e1347f66ff694aa3a25", - git_commit = "746a9750f49d98b975a4cd0ee8c0f353426ffbc0", + sha256 = "8e6e77fd7ea46bf804b2d95beb63958d08469f5acf8119f9a93ecfbabed7f9f5", + git_commit = "41b0fb94457c0de1688ed595e5ff2ada068fc93f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 31cc14f40cb615a3c7e65c2b7d08bba4742636c6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 9 Jan 2019 05:01:52 -0800 Subject: [PATCH 2091/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228497861 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d8b58b6f036..187cea29fec 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8e6e77fd7ea46bf804b2d95beb63958d08469f5acf8119f9a93ecfbabed7f9f5", - git_commit = "41b0fb94457c0de1688ed595e5ff2ada068fc93f", + sha256 = "24704cc8deedbd4e57f34192d2f390c6816e4f695a60625504a194c7ed878e87", + git_commit = "964e3d0bd8bcfbfc8bcc1de16f32df8190cd7b75", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 019d526a35309f165ec5bf04b2895a7a8fb4d287 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 9 Jan 2019 06:02:25 -0800 Subject: [PATCH 2092/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228504052 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 187cea29fec..9ae32a13098 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "24704cc8deedbd4e57f34192d2f390c6816e4f695a60625504a194c7ed878e87", - git_commit = "964e3d0bd8bcfbfc8bcc1de16f32df8190cd7b75", + sha256 = "b28bad4ed7770886f2fea9b6c53341c106afae5f8514f6fec73ba22a99aa92e1", + git_commit = "6e6d7aad7300294425933bd053afce55107ccd35", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 40875e7c17b6a1b07ff4b6d8b37d94ed947c983c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 9 Jan 2019 09:02:03 -0800 Subject: [PATCH 2093/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228526749 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9ae32a13098..88a7e147410 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b28bad4ed7770886f2fea9b6c53341c106afae5f8514f6fec73ba22a99aa92e1", - git_commit = "6e6d7aad7300294425933bd053afce55107ccd35", + sha256 = "b916da3cc2e6bd3aa561093368ac9be76a4802d7f587c4cdcde9166f4d1ea4b8", + git_commit = "b5fdd811998d495950c4b736879454be39acf163", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3ea28987a4d59db122199d6550924e2bd40b54b9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 9 Jan 2019 10:02:17 -0800 Subject: [PATCH 2094/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228536850 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 88a7e147410..d37a53c1398 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b916da3cc2e6bd3aa561093368ac9be76a4802d7f587c4cdcde9166f4d1ea4b8", - git_commit = "b5fdd811998d495950c4b736879454be39acf163", + sha256 = "91a26177441c3548f9778dca5c4fd1d5a9607588bc6dd215f2d09f7208648593", + git_commit = "beae80428e5a7d67417dc18561b8ed74724fe4bf", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a83206a37ae184be4f5f81123df6ef281c3d765f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 9 Jan 2019 11:02:15 -0800 Subject: [PATCH 2095/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228549300 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d37a53c1398..064f7985ab0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "91a26177441c3548f9778dca5c4fd1d5a9607588bc6dd215f2d09f7208648593", - git_commit = "beae80428e5a7d67417dc18561b8ed74724fe4bf", + sha256 = "1169456fbd030cb4333f533f18dfb3c2d55b54928f623a417303d8b2230242bf", + git_commit = "1ee193a2563d51ee45b401f2cff91f6e480e21db", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 10f3b1476fa9c5f297809d79ffe52f9083aedf8a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 9 Jan 2019 12:02:12 -0800 Subject: [PATCH 2096/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228561309 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 064f7985ab0..8fcaf4acfe3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1169456fbd030cb4333f533f18dfb3c2d55b54928f623a417303d8b2230242bf", - git_commit = "1ee193a2563d51ee45b401f2cff91f6e480e21db", + sha256 = "46d0743eb837a393a3a94f051c88f27fe0849eb2d1a93a78afb86df60b4fb032", + git_commit = "65cfc6a54bc76912dd16c25b9e13610c4359a6d9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ab94fc0c04357831a6600d0ee4e5d0c24b8bb560 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 9 Jan 2019 13:02:04 -0800 Subject: [PATCH 2097/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228572059 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8fcaf4acfe3..41486fb07bf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "46d0743eb837a393a3a94f051c88f27fe0849eb2d1a93a78afb86df60b4fb032", - git_commit = "65cfc6a54bc76912dd16c25b9e13610c4359a6d9", + sha256 = "a9e76fd9e6f9cfe48eb7f42597280f6558ba98e0b7c69a414b9e4e5ece6c373c", + git_commit = "01d9a34786ea0da087855f88ac32d0d7085c8266", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5afed9b030d940d41186445ad7fed2740207cc04 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 9 Jan 2019 14:01:50 -0800 Subject: [PATCH 2098/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228583395 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 41486fb07bf..0c6272a880b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a9e76fd9e6f9cfe48eb7f42597280f6558ba98e0b7c69a414b9e4e5ece6c373c", - git_commit = "01d9a34786ea0da087855f88ac32d0d7085c8266", + sha256 = "f30f3c28886c0dcf6e4c2f08b95b28fc7f7103d3a050a30116e291cc24902c0a", + git_commit = "8fefcf7b8b236baf94674ca8fcb0777fd48c2ccd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 68fc6aa61d1ef83689848e8255489687af3a777f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 9 Jan 2019 15:02:11 -0800 Subject: [PATCH 2099/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228595361 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0c6272a880b..bddcd44cc69 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f30f3c28886c0dcf6e4c2f08b95b28fc7f7103d3a050a30116e291cc24902c0a", - git_commit = "8fefcf7b8b236baf94674ca8fcb0777fd48c2ccd", + sha256 = "20acdc8da692830e5bc4b173e906121e4e93122408e9dc3c95c0decf664d4fdd", + git_commit = "0a88318ac73a3d30dfee4ab1541070cbf82fe05c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From fddf74820f61053e76a495b96ef24a09708b3b5b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 9 Jan 2019 16:02:24 -0800 Subject: [PATCH 2100/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228605609 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bddcd44cc69..f34e83ebe12 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "20acdc8da692830e5bc4b173e906121e4e93122408e9dc3c95c0decf664d4fdd", - git_commit = "0a88318ac73a3d30dfee4ab1541070cbf82fe05c", + sha256 = "1f2fba5073466bb7849067f30882ddac1dd292e225a36eab5618209267238c1f", + git_commit = "4b2b456ea4353864478e608a587ea9b5f7eb696c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1e011b90a9546b68ea9759074a73d049500e81be Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 9 Jan 2019 17:02:04 -0800 Subject: [PATCH 2101/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228615960 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f34e83ebe12..5c1cea7a7ce 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1f2fba5073466bb7849067f30882ddac1dd292e225a36eab5618209267238c1f", - git_commit = "4b2b456ea4353864478e608a587ea9b5f7eb696c", + sha256 = "931652e05dbc3875948d92feefb1f438c0d77b5b8884e712a0b3d01d7f2d3d93", + git_commit = "615182adb3d01fd8357e574bd8920c0995c6bbb8", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1633a7ab57a35eb03581861b39f1433c0529af2a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 9 Jan 2019 18:02:20 -0800 Subject: [PATCH 2102/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228624338 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5c1cea7a7ce..02346b7e504 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "931652e05dbc3875948d92feefb1f438c0d77b5b8884e712a0b3d01d7f2d3d93", - git_commit = "615182adb3d01fd8357e574bd8920c0995c6bbb8", + sha256 = "fff8fb6fafc40a6f4b583befa8ef05fd4157b4f6323d1945c87c6cb792dffe1c", + git_commit = "7f9c7afd8829d20df25ee04f1999074290d7a45a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a9cfca57bbd74a8ec1bcc5a8cc4e139f09f69648 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 9 Jan 2019 19:01:53 -0800 Subject: [PATCH 2103/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228630755 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 02346b7e504..5f539b26016 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fff8fb6fafc40a6f4b583befa8ef05fd4157b4f6323d1945c87c6cb792dffe1c", - git_commit = "7f9c7afd8829d20df25ee04f1999074290d7a45a", + sha256 = "62f493aac5eec2f020e19691f2d9bbfc82899978d3aa01c4e9b39864e20e1b3a", + git_commit = "d852dec831a4a4c30c3018187e52e25010bf9711", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b7c8d782d2a38f4954e9308d3ff458c2e37e118f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 9 Jan 2019 20:01:52 -0800 Subject: [PATCH 2104/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228635836 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5f539b26016..00467629e4f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "62f493aac5eec2f020e19691f2d9bbfc82899978d3aa01c4e9b39864e20e1b3a", - git_commit = "d852dec831a4a4c30c3018187e52e25010bf9711", + sha256 = "20dffb90568142c56208483e2d3a10b036f49bc93e7429b9b3245f824dfc2645", + git_commit = "767a1fe74600fadee070fbaa88cbb5f5917170bd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 350ad4a4f4aa8751a64c7a9aad5a401586b1d0ea Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 10 Jan 2019 03:02:18 -0800 Subject: [PATCH 2105/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228676913 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 00467629e4f..53a9511be9c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "20dffb90568142c56208483e2d3a10b036f49bc93e7429b9b3245f824dfc2645", - git_commit = "767a1fe74600fadee070fbaa88cbb5f5917170bd", + sha256 = "ecb8f911af9a2ebe4a18291096136953b1d11454f6e1265b336eb85affc3c644", + git_commit = "439d4ec9568a259f665efd878791530a6f5ca8f2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f891e78ee0476bc6eea6ffaedcb2736eda720f8d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 10 Jan 2019 04:02:17 -0800 Subject: [PATCH 2106/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228683164 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 53a9511be9c..8b0f50f0f09 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ecb8f911af9a2ebe4a18291096136953b1d11454f6e1265b336eb85affc3c644", - git_commit = "439d4ec9568a259f665efd878791530a6f5ca8f2", + sha256 = "b0761be0dc070df8a61fd7174b36983d708676e0961f81d5f4807275fa022a0a", + git_commit = "2f7e56a65104aeca0a7fcc98a7b10fb2cff9b1a3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1f07e06fae1d87dc45b3c38f86eb261f03c65692 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 10 Jan 2019 06:02:51 -0800 Subject: [PATCH 2107/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228696713 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8b0f50f0f09..8db4de505a6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b0761be0dc070df8a61fd7174b36983d708676e0961f81d5f4807275fa022a0a", - git_commit = "2f7e56a65104aeca0a7fcc98a7b10fb2cff9b1a3", + sha256 = "bdf2248bb5c203fa07ac195f3cc1923ddc8016850eb5e87bdfe50b7646b3901d", + git_commit = "ef088e54734e0412bc47e4f33d1df7c0672fdd87", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4a15d238147a85e95db35977be14f54b26dc83c7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 10 Jan 2019 12:02:14 -0800 Subject: [PATCH 2108/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228751241 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8db4de505a6..8f07320a83d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bdf2248bb5c203fa07ac195f3cc1923ddc8016850eb5e87bdfe50b7646b3901d", - git_commit = "ef088e54734e0412bc47e4f33d1df7c0672fdd87", + sha256 = "f8ad8fd9ba510594b8f3bc66bf0f67337f12792032917a23b7c5421c0368b4b8", + git_commit = "1210b6506dbde52a5bf5c33d56f3c52dfbd505e7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From fa3beb1a2fbcf16b45e169d597df2b953df2f49e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 10 Jan 2019 13:02:25 -0800 Subject: [PATCH 2109/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228761621 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8f07320a83d..eb2027a37c2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f8ad8fd9ba510594b8f3bc66bf0f67337f12792032917a23b7c5421c0368b4b8", - git_commit = "1210b6506dbde52a5bf5c33d56f3c52dfbd505e7", + sha256 = "06f86163f088c12c3a59597cd676e055c96c6c1313c7dcde97431d8255c88a9c", + git_commit = "1095ed8fe6808a70edb66d7970e9462db791e690", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 24ece4046168e7c063fb96196b38474c5dad672d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 10 Jan 2019 14:01:59 -0800 Subject: [PATCH 2110/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228772466 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index eb2027a37c2..4320042160e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "06f86163f088c12c3a59597cd676e055c96c6c1313c7dcde97431d8255c88a9c", - git_commit = "1095ed8fe6808a70edb66d7970e9462db791e690", + sha256 = "2953247aa7c88e768b7fb3ecdfdfb1e51e13d54e3c678298d9dbe06e7b6571ab", + git_commit = "0418e820833f88bc3545644d0aed81f51022a359", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3ad53c6a05769aaa812aa039500fea0aef5f36f5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 10 Jan 2019 15:02:15 -0800 Subject: [PATCH 2111/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228783739 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4320042160e..855258cd204 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2953247aa7c88e768b7fb3ecdfdfb1e51e13d54e3c678298d9dbe06e7b6571ab", - git_commit = "0418e820833f88bc3545644d0aed81f51022a359", + sha256 = "9ec78050c00dc99906345ffc4501b01111ac56d93ed9275aab711d0455bfdaf0", + git_commit = "80e29253740b251d7632f613ceb414205248ce93", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9ad3a13f114c39c58dfc027a0b2258ea6cbd5f0b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 10 Jan 2019 16:02:45 -0800 Subject: [PATCH 2112/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228795015 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 855258cd204..bb1674f8e6e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9ec78050c00dc99906345ffc4501b01111ac56d93ed9275aab711d0455bfdaf0", - git_commit = "80e29253740b251d7632f613ceb414205248ce93", + sha256 = "7f1ad0a6154157ddf4ff68fedcd635e9408a5399d819c57de742b5bb7e903a34", + git_commit = "7e3077a22530e253ab31417abb18de5bb60779ef", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d2f035c8088602a1483bfb75d7b0b699112787d2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 10 Jan 2019 17:01:51 -0800 Subject: [PATCH 2113/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228804058 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bb1674f8e6e..2c76d8d0811 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7f1ad0a6154157ddf4ff68fedcd635e9408a5399d819c57de742b5bb7e903a34", - git_commit = "7e3077a22530e253ab31417abb18de5bb60779ef", + sha256 = "6857c07cf4fd7b46070e9061dc449964905c20c556225f239ecb95dbe6261c23", + git_commit = "d6623c9341cda24851827e5069fec810860f1616", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 57e2eecac0b65b18285001c91a44d25f0bbf765c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 10 Jan 2019 18:01:55 -0800 Subject: [PATCH 2114/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228811499 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2c76d8d0811..bd538a5d8bf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6857c07cf4fd7b46070e9061dc449964905c20c556225f239ecb95dbe6261c23", - git_commit = "d6623c9341cda24851827e5069fec810860f1616", + sha256 = "9e1ca109216d4737a77a106240e6100a29e7a95fe4a0a630e7786abf4ebf6f78", + git_commit = "3fc2b09b601e9d2c3e1bdd80d299c31b3adb0c0d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d7ab401a522e3b8675003bc52c151ac9b4750876 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 10 Jan 2019 19:02:10 -0800 Subject: [PATCH 2115/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228817268 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bd538a5d8bf..a11ce4e6858 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9e1ca109216d4737a77a106240e6100a29e7a95fe4a0a630e7786abf4ebf6f78", - git_commit = "3fc2b09b601e9d2c3e1bdd80d299c31b3adb0c0d", + sha256 = "a3cadd92fb628ca90f5a850ea21cecc4c4482ddd3e6fd3bad545a86ccd1bf0ea", + git_commit = "bdd76e2f04b17512d5c64a294975e7feb1231fab", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c6a0494cb13c1d755c9014f9b91588ac30b1dc7f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 10 Jan 2019 20:02:59 -0800 Subject: [PATCH 2116/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228821794 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a11ce4e6858..a7f20c73223 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a3cadd92fb628ca90f5a850ea21cecc4c4482ddd3e6fd3bad545a86ccd1bf0ea", - git_commit = "bdd76e2f04b17512d5c64a294975e7feb1231fab", + sha256 = "bf508887fd525516851aa58112bbaa204dea912d12234fb090a05dc123d0eee2", + git_commit = "03fb5daa9cc0c84c52ab800843dcef22580f64c2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7dc4311e62a7e71f3ceb6650400cb87a665df34d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 10 Jan 2019 22:02:08 -0800 Subject: [PATCH 2117/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228830938 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a7f20c73223..ebc5f0acb2c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bf508887fd525516851aa58112bbaa204dea912d12234fb090a05dc123d0eee2", - git_commit = "03fb5daa9cc0c84c52ab800843dcef22580f64c2", + sha256 = "ca46551eb50891f9f96bb233976e4960dc0d910379694ed6a6956ad487c8fb2d", + git_commit = "764109a35299f55f7da5cbf6d3d8fc01a06668b6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c87948f208ee002a538e24beb4182fdda9ec64cb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 10 Jan 2019 23:02:01 -0800 Subject: [PATCH 2118/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228834850 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ebc5f0acb2c..f4e6e1b34fa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ca46551eb50891f9f96bb233976e4960dc0d910379694ed6a6956ad487c8fb2d", - git_commit = "764109a35299f55f7da5cbf6d3d8fc01a06668b6", + sha256 = "ccd700bcf75df5486b440104ddca79a3b1fd8a7fdeec03cc95df3ebd46e3528f", + git_commit = "489f1dc4573eabbff59c149031984ea8319a7bf8", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1985504028f7b2bdbed8e5b6719bf6435c38e648 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 11 Jan 2019 00:02:28 -0800 Subject: [PATCH 2119/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228838745 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f4e6e1b34fa..09577ac874c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ccd700bcf75df5486b440104ddca79a3b1fd8a7fdeec03cc95df3ebd46e3528f", - git_commit = "489f1dc4573eabbff59c149031984ea8319a7bf8", + sha256 = "91656c273c86a952a202fc1bf429f0ae482cebc2bcfbe1ce67af45b7930fb104", + git_commit = "30afb286a47474dc68b61e572028e3b96b43af6a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 10adf48d82eaa4d327a144b1777a3f350be7c4a5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 11 Jan 2019 01:01:59 -0800 Subject: [PATCH 2120/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228843974 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 09577ac874c..ba4f519f50e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "91656c273c86a952a202fc1bf429f0ae482cebc2bcfbe1ce67af45b7930fb104", - git_commit = "30afb286a47474dc68b61e572028e3b96b43af6a", + sha256 = "b4df7babc0089275b36a49bf08eab08cc8c27a16ffa3d0283c1943bbd7bbb459", + git_commit = "cfe3f839c852bb590f7b349376a2c3bfeb0a031f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 81af1c67c6ea27e743de793aed5279c75b6b8977 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 11 Jan 2019 02:01:48 -0800 Subject: [PATCH 2121/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228850615 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ba4f519f50e..50709f3f1d7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b4df7babc0089275b36a49bf08eab08cc8c27a16ffa3d0283c1943bbd7bbb459", - git_commit = "cfe3f839c852bb590f7b349376a2c3bfeb0a031f", + sha256 = "39b792ed7f97954eee756c24d6680f2c57e808e4eabcdee21a47054fbd787cf7", + git_commit = "bac29e41394d029e94659b6d1df833237056b764", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8bd34d071987e5576000743227eea7ad3b4b6503 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 11 Jan 2019 03:02:15 -0800 Subject: [PATCH 2122/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228855947 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 50709f3f1d7..fceee680027 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "39b792ed7f97954eee756c24d6680f2c57e808e4eabcdee21a47054fbd787cf7", - git_commit = "bac29e41394d029e94659b6d1df833237056b764", + sha256 = "849973ab91cf68ad6ca24e384e3537bf602dc837cdb53859facb71d5ec255662", + git_commit = "c2ab6dc7a19cb121d22f36e03107315aeb5e3513", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d3d2387ae74a6028e41856735d51fc61d1aa1af6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 11 Jan 2019 04:01:54 -0800 Subject: [PATCH 2123/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228860363 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fceee680027..f5631e236c6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "849973ab91cf68ad6ca24e384e3537bf602dc837cdb53859facb71d5ec255662", - git_commit = "c2ab6dc7a19cb121d22f36e03107315aeb5e3513", + sha256 = "aacb11d72b93e13bb06ef66b1b593ef48cc342779b2972ab93e4ff06a96c4499", + git_commit = "cdbaf19b7bb6b6ccfc1f4123f5121448683cbfa3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 173654108d6082265af43a09f62c6735965535c5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 11 Jan 2019 08:02:03 -0800 Subject: [PATCH 2124/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228882706 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f5631e236c6..e83ca8c2d3e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "aacb11d72b93e13bb06ef66b1b593ef48cc342779b2972ab93e4ff06a96c4499", - git_commit = "cdbaf19b7bb6b6ccfc1f4123f5121448683cbfa3", + sha256 = "d4d63a324b683d9b571e47d020ed8706570920dbcac6680811f8241b6cda58e6", + git_commit = "b044b5977e6c0425d4eab66d7f9daa11e161e3ee", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d6cf266ae12ed5a30389e11bb7faf0206f56331b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 11 Jan 2019 11:03:46 -0800 Subject: [PATCH 2125/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228910269 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e83ca8c2d3e..444dee3d849 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d4d63a324b683d9b571e47d020ed8706570920dbcac6680811f8241b6cda58e6", - git_commit = "b044b5977e6c0425d4eab66d7f9daa11e161e3ee", + sha256 = "0a0e3e4c4815496444b1520635a7fdd543f914ad704e15dd9a83e7d1cfa9bc86", + git_commit = "196715b526a695678891ec11d13b7290b3f6861a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e5801239e5f7bf30be84dd34641b20be21451fe8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 11 Jan 2019 12:02:06 -0800 Subject: [PATCH 2126/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228921283 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 444dee3d849..100f1c303a7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0a0e3e4c4815496444b1520635a7fdd543f914ad704e15dd9a83e7d1cfa9bc86", - git_commit = "196715b526a695678891ec11d13b7290b3f6861a", + sha256 = "b336b616074baa4e33b197a8208fc8c965d882075d9cf60fb23cec9fba9f65a5", + git_commit = "99ed07a8e162e2c30b591ee6f7dcc8e5fb57838d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2abc9ef99594bd70dee59937cf9fea930fd4ab8d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 11 Jan 2019 13:01:48 -0800 Subject: [PATCH 2127/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228930868 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 100f1c303a7..b56eeba6a71 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b336b616074baa4e33b197a8208fc8c965d882075d9cf60fb23cec9fba9f65a5", - git_commit = "99ed07a8e162e2c30b591ee6f7dcc8e5fb57838d", + sha256 = "bbd5a2cff89ec42690836e9df7da55587771b77e2a98839485f1bb9496c11517", + git_commit = "d2d8584845253fe30e1a43394f281d045b23492c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2bfa9cd6b60f48d7b0d5fa3161e1a378d6ff1cee Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 11 Jan 2019 14:02:17 -0800 Subject: [PATCH 2128/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228941025 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b56eeba6a71..3309a9bb90a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bbd5a2cff89ec42690836e9df7da55587771b77e2a98839485f1bb9496c11517", - git_commit = "d2d8584845253fe30e1a43394f281d045b23492c", + sha256 = "f8be1160bff1ebfe802faf67c1d5218d0ff86eaab561e379110735dd7070cdb3", + git_commit = "5bc8f987097b9cccc63c3aa310595f719edd1344", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ddd454523df8a0f4dbed0b64ecb0fd3b17c76604 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 11 Jan 2019 15:02:22 -0800 Subject: [PATCH 2129/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228951720 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3309a9bb90a..f661b8c1f23 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f8be1160bff1ebfe802faf67c1d5218d0ff86eaab561e379110735dd7070cdb3", - git_commit = "5bc8f987097b9cccc63c3aa310595f719edd1344", + sha256 = "7dbb0281ba6eb7a6b2e35c12f4ac889a49042f238bfb2a4cb3434047bb9829f8", + git_commit = "b6e1f16f12ad9408fb8c983bc98bd62234ed8e39", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a8b1cedf94acb6faef4545b38c97ecd54746ef0e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 11 Jan 2019 16:02:47 -0800 Subject: [PATCH 2130/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228961655 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f661b8c1f23..684960ab9f5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7dbb0281ba6eb7a6b2e35c12f4ac889a49042f238bfb2a4cb3434047bb9829f8", - git_commit = "b6e1f16f12ad9408fb8c983bc98bd62234ed8e39", + sha256 = "e1c99f1aefaee00f00ca0b97a619192c0c701e97c26945e070b397ccc635c03b", + git_commit = "67c18c4f8be9544dac4f65e932327872228b8cec", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e25907d1e252b4059c5abe38d6a3199fc9e52c75 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 11 Jan 2019 17:01:58 -0800 Subject: [PATCH 2131/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228969672 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 684960ab9f5..1334f2e753a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e1c99f1aefaee00f00ca0b97a619192c0c701e97c26945e070b397ccc635c03b", - git_commit = "67c18c4f8be9544dac4f65e932327872228b8cec", + sha256 = "c1019d4f4317784fe0f4d8d3f2be60a2e6330d51c5f01e1db2ec8d8f408abfcb", + git_commit = "5704143a6790225f7f08533fa0225136095688b1", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8471d584d289dbf34e1ae2bc2a00d3b9aa788a65 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 11 Jan 2019 18:02:04 -0800 Subject: [PATCH 2132/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228975717 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1334f2e753a..e36480c9b1a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c1019d4f4317784fe0f4d8d3f2be60a2e6330d51c5f01e1db2ec8d8f408abfcb", - git_commit = "5704143a6790225f7f08533fa0225136095688b1", + sha256 = "7e1c0a4c94c768dfbe3fd7de43f4a6e547572838f39067aca7c375becad6ea8b", + git_commit = "3bf87a030a7d05a347b541047dc9308edaafb7d7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e8931c3261046f1d1f862ff1ce3c3a97fc8838dc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 11 Jan 2019 19:02:50 -0800 Subject: [PATCH 2133/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228980334 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e36480c9b1a..1743f9c855d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7e1c0a4c94c768dfbe3fd7de43f4a6e547572838f39067aca7c375becad6ea8b", - git_commit = "3bf87a030a7d05a347b541047dc9308edaafb7d7", + sha256 = "fecd6c2b7bd9b225287f7f5a2b610be5dc70e8b55759ab63f63d465d3731e43e", + git_commit = "32f4097f8ac09039c010e59200f4f0e056990fcc", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 738b029f072a924ac18d43446ee8336acaeb311a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 11 Jan 2019 20:01:49 -0800 Subject: [PATCH 2134/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228983669 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1743f9c855d..c51a9258d7f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fecd6c2b7bd9b225287f7f5a2b610be5dc70e8b55759ab63f63d465d3731e43e", - git_commit = "32f4097f8ac09039c010e59200f4f0e056990fcc", + sha256 = "c729125ff38fb0cff06fcc2e976abb4c4425183fb214caf10a826e38d02ddd05", + git_commit = "bf87f8347ce24735d9d22173e289d7860a40498f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f2b03367dda658b520fd70eb068cacf040ed6947 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 11 Jan 2019 23:01:49 -0800 Subject: [PATCH 2135/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 228992497 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c51a9258d7f..dcec7365006 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c729125ff38fb0cff06fcc2e976abb4c4425183fb214caf10a826e38d02ddd05", - git_commit = "bf87f8347ce24735d9d22173e289d7860a40498f", + sha256 = "afa1caa98d09c6dedd94fd6fbafb24b1acd4a7704d20cdfb54417a1383af5a1b", + git_commit = "66e36030a8fce773c883ae1857fd067564138b27", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1bf8e5347d2b10affe571e1a88ea6f89ffb868a5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 12 Jan 2019 03:02:39 -0800 Subject: [PATCH 2136/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229006367 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dcec7365006..f858c766fc0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "afa1caa98d09c6dedd94fd6fbafb24b1acd4a7704d20cdfb54417a1383af5a1b", - git_commit = "66e36030a8fce773c883ae1857fd067564138b27", + sha256 = "43223f0e35cec63fdeb88b199e184842d74ed4595a97b129d68d504341ce4383", + git_commit = "7d707dcce6f7755790a23271bedc1c737b643dc7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 588ba5bb2bfbc80f93384a50af34bbc88f4e1687 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 12 Jan 2019 18:01:58 -0800 Subject: [PATCH 2137/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229043054 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f858c766fc0..58a58a7e646 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "43223f0e35cec63fdeb88b199e184842d74ed4595a97b129d68d504341ce4383", - git_commit = "7d707dcce6f7755790a23271bedc1c737b643dc7", + sha256 = "11a172854fa1ab8659c3771ea03d20246c6b67e81802a39e0173d2f7d0f81e8c", + git_commit = "3a10998daf52ea922aa7ff895af3012afe956866", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f9320a9d76f640fd63746f26baf678becce73773 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 12 Jan 2019 19:01:51 -0800 Subject: [PATCH 2138/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229045391 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 58a58a7e646..ac06a424bc6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "11a172854fa1ab8659c3771ea03d20246c6b67e81802a39e0173d2f7d0f81e8c", - git_commit = "3a10998daf52ea922aa7ff895af3012afe956866", + sha256 = "af10c4e71d6c7b2cd51a9617b5d6377273bd2fd80c867ae322813a657fa8916e", + git_commit = "8b6251446c730269bc698db83acd0787f44f3645", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b765e4d88f4b9073c1e000aa7ad813aa3c4e008b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 13 Jan 2019 03:02:20 -0800 Subject: [PATCH 2139/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229067550 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ac06a424bc6..fb07886e681 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "af10c4e71d6c7b2cd51a9617b5d6377273bd2fd80c867ae322813a657fa8916e", - git_commit = "8b6251446c730269bc698db83acd0787f44f3645", + sha256 = "2700e509cac16f080a5eb204359d737c7ed7cb99ff8e0d313896873844605dcb", + git_commit = "898738bce44c0cfdaa36b1dfc865239eb48fa999", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6ca39eeea32e9297255123cef2058ec7838a0baf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 13 Jan 2019 20:02:30 -0800 Subject: [PATCH 2140/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229117220 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fb07886e681..d6b3836a70e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2700e509cac16f080a5eb204359d737c7ed7cb99ff8e0d313896873844605dcb", - git_commit = "898738bce44c0cfdaa36b1dfc865239eb48fa999", + sha256 = "7057dc7effca555558a82276b37ed631cb981f73c95157c0816208cec453b1ac", + git_commit = "ac4d3682939dac303082097d25ebda805409acde", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0bee3fb17638dc7651b542f75e95caa68cb9f2a6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 14 Jan 2019 03:02:05 -0800 Subject: [PATCH 2141/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229151920 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d6b3836a70e..db24abdedb1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7057dc7effca555558a82276b37ed631cb981f73c95157c0816208cec453b1ac", - git_commit = "ac4d3682939dac303082097d25ebda805409acde", + sha256 = "3c28e9883316eb294ee92bef1bff6601df54f692b8d6ef34e989b71f07f4fe84", + git_commit = "6dd6ad9fd7353d945227fd87a93ef1f11eccc75e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 72598ada05530579f9422bdd39f563ee09e471c2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 14 Jan 2019 04:02:23 -0800 Subject: [PATCH 2142/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229157781 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index db24abdedb1..ab7eaa930ff 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3c28e9883316eb294ee92bef1bff6601df54f692b8d6ef34e989b71f07f4fe84", - git_commit = "6dd6ad9fd7353d945227fd87a93ef1f11eccc75e", + sha256 = "7c519d3900f69af95e73fceb64f7267d49b6aeac8663e5cde64ab8cb122e7a9a", + git_commit = "8f593c48c84a2d52d2ba8becf2eaef20250325a0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d02609bc57c022ef06d587c645b69b65b7ce252c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 14 Jan 2019 05:02:05 -0800 Subject: [PATCH 2143/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229163660 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ab7eaa930ff..ba39a70e8b2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7c519d3900f69af95e73fceb64f7267d49b6aeac8663e5cde64ab8cb122e7a9a", - git_commit = "8f593c48c84a2d52d2ba8becf2eaef20250325a0", + sha256 = "ac36b26afbf9aaf2800b653df61547b546b58e2b0c2f7dbe804bbcc99bb1c273", + git_commit = "3ed46c325f70e2f1521b850b43d2b174101d9472", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2f34aa62f0df3dad28a7f1194020a9807d7dc7fd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 14 Jan 2019 09:01:50 -0800 Subject: [PATCH 2144/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229192106 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ba39a70e8b2..97f6faef430 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ac36b26afbf9aaf2800b653df61547b546b58e2b0c2f7dbe804bbcc99bb1c273", - git_commit = "3ed46c325f70e2f1521b850b43d2b174101d9472", + sha256 = "a29fb8dc0bd71e94f81485205bd7709ed4209f0f7d404dfb319010d4cf6bd992", + git_commit = "6dae7e3ebbfd83b9f1d318ba5f2f2baeae17b9f5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 85ff418e20f29c92804eb626d48a033344d2534e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 14 Jan 2019 10:02:03 -0800 Subject: [PATCH 2145/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229201748 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 97f6faef430..79b11d4c186 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a29fb8dc0bd71e94f81485205bd7709ed4209f0f7d404dfb319010d4cf6bd992", - git_commit = "6dae7e3ebbfd83b9f1d318ba5f2f2baeae17b9f5", + sha256 = "82ec32c9f434af6a3912ada6b86101773dad45dca0e3f00d2b0d4309190e4294", + git_commit = "dbb3f15afb2ee8d6af7c4a4adc9843314ecfa1cc", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c44ccd259a90ec8a80be57ad85b5357a4d30d12e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 14 Jan 2019 11:02:10 -0800 Subject: [PATCH 2146/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229214405 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 79b11d4c186..e2d6d5776c8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "82ec32c9f434af6a3912ada6b86101773dad45dca0e3f00d2b0d4309190e4294", - git_commit = "dbb3f15afb2ee8d6af7c4a4adc9843314ecfa1cc", + sha256 = "d281641594e32c3f6c35cd42a5c5351ccfc99daf41671039d24e1fd66186e453", + git_commit = "558974db23ee0ea8845ba4b0b7fa94f70408ac1b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From cda3f9ea320b501045a06b03a98fe9e4fbdd9c91 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 14 Jan 2019 12:02:12 -0800 Subject: [PATCH 2147/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229227121 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e2d6d5776c8..fc131b84751 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d281641594e32c3f6c35cd42a5c5351ccfc99daf41671039d24e1fd66186e453", - git_commit = "558974db23ee0ea8845ba4b0b7fa94f70408ac1b", + sha256 = "d92c4dbcc22a272298c992af9a6f7883b305ce61e8f884ae2caaf6b3afa11970", + git_commit = "adf8dac492adb33d4c71a4271f6f003a156eae22", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2754d3818a10fc9592212a28748c4a202134dd05 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 14 Jan 2019 13:01:44 -0800 Subject: [PATCH 2148/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229237752 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fc131b84751..3b15966098f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d92c4dbcc22a272298c992af9a6f7883b305ce61e8f884ae2caaf6b3afa11970", - git_commit = "adf8dac492adb33d4c71a4271f6f003a156eae22", + sha256 = "ebb52b8f49cf70314705de4f06583886110e0e610858ef41d7fdc3fb6486b64c", + git_commit = "30796c730b0d137b0367d425cbfbfae66c43a9ff", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6de43e5c97b19b3a2a71ca411ccffd5ad4b3db3f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 14 Jan 2019 14:02:00 -0800 Subject: [PATCH 2149/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229249658 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3b15966098f..12b65d37dab 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ebb52b8f49cf70314705de4f06583886110e0e610858ef41d7fdc3fb6486b64c", - git_commit = "30796c730b0d137b0367d425cbfbfae66c43a9ff", + sha256 = "ac77dc2ead22a9d18d925537143746fd300086b0a249f27b7234e97a6459e197", + git_commit = "419c28411c2499511b3cafb4773085e5906da090", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 73b3eb0de05ac9bf0e9ae322b709e4c5f88fa1c5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 14 Jan 2019 15:02:21 -0800 Subject: [PATCH 2150/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229261785 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 12b65d37dab..a61eb2c32fc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ac77dc2ead22a9d18d925537143746fd300086b0a249f27b7234e97a6459e197", - git_commit = "419c28411c2499511b3cafb4773085e5906da090", + sha256 = "a9ec8c96fddf34d581080d1ebf5d95ce5b321d1fbab4e20bf88b7425904ab55f", + git_commit = "fec769a899962e2b4792041b4b6baf80b30111c6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 11f1cb22a82ad9f42882489ade73ebb20d3472ce Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 14 Jan 2019 16:02:17 -0800 Subject: [PATCH 2151/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229274001 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a61eb2c32fc..0b77744864b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a9ec8c96fddf34d581080d1ebf5d95ce5b321d1fbab4e20bf88b7425904ab55f", - git_commit = "fec769a899962e2b4792041b4b6baf80b30111c6", + sha256 = "f745ff4e8d27c7172885fb15ddba87376e16fcc68c7f016b1d920fb92c29a740", + git_commit = "01c19850c0fd6b587f44ab5938e2d874744a2cbf", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f8ba4c258082ad13ceb52798bbf3e4919d74bf48 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 14 Jan 2019 17:01:50 -0800 Subject: [PATCH 2152/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229284188 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0b77744864b..7cea9611e19 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f745ff4e8d27c7172885fb15ddba87376e16fcc68c7f016b1d920fb92c29a740", - git_commit = "01c19850c0fd6b587f44ab5938e2d874744a2cbf", + sha256 = "c7368de6bba9033a862be6e0a70d6acdcb79b82d481bd82e98598e22556db881", + git_commit = "681f6a6ac9344425549c8a38fcbfae854e7deddf", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From bca2008f55d1e19e5ebdc2bc5c041eaa2909fca3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 14 Jan 2019 18:02:27 -0800 Subject: [PATCH 2153/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229292043 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7cea9611e19..7e148935d7f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c7368de6bba9033a862be6e0a70d6acdcb79b82d481bd82e98598e22556db881", - git_commit = "681f6a6ac9344425549c8a38fcbfae854e7deddf", + sha256 = "b0e6a7bb5122a69dccbc5820554ec4f781ecb277ea1f5e3f12d2135d0d9b90bb", + git_commit = "3c922d7df747ce3c25a0ad75a41f23c7e8d1df1e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From cea933ed6d7edea3eaa2aa7be40a01087ac5f068 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 14 Jan 2019 19:01:42 -0800 Subject: [PATCH 2154/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229298064 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7e148935d7f..0e1e15825ca 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b0e6a7bb5122a69dccbc5820554ec4f781ecb277ea1f5e3f12d2135d0d9b90bb", - git_commit = "3c922d7df747ce3c25a0ad75a41f23c7e8d1df1e", + sha256 = "8324ae3b8fffb4557e20385f536f4db08a5f0c52c4bdb3ee44e20b719f1e4163", + git_commit = "7648a9554792d77a1506e39cc3a7bfc361126786", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f15b135adaa63c11197a312fa84e4f1f46a236c5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 14 Jan 2019 20:02:08 -0800 Subject: [PATCH 2155/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229303172 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0e1e15825ca..7236a346abe 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8324ae3b8fffb4557e20385f536f4db08a5f0c52c4bdb3ee44e20b719f1e4163", - git_commit = "7648a9554792d77a1506e39cc3a7bfc361126786", + sha256 = "260ee3d61fdb05f060dacc27b5ee3aee43663657b30050a82a5c06a157f0800a", + git_commit = "5634719232f2aa801adf3f9718cb92eb019da754", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e5525cdfe38d8f683cf89b43ef2df168c2d457f3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 14 Jan 2019 21:01:48 -0800 Subject: [PATCH 2156/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229308254 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7236a346abe..efab9ed300a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "260ee3d61fdb05f060dacc27b5ee3aee43663657b30050a82a5c06a157f0800a", - git_commit = "5634719232f2aa801adf3f9718cb92eb019da754", + sha256 = "7133751d84d469c47572796f2cb30f993282ed2586f6bde5af2ac89bd2384381", + git_commit = "b74605a932fe9b7bc878fa83999d09d12d0e5e55", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b911d05eb6a700e1ad59b6ecfaa8efd70de107b0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 14 Jan 2019 22:01:36 -0800 Subject: [PATCH 2157/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229312812 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index efab9ed300a..c50da1b960c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7133751d84d469c47572796f2cb30f993282ed2586f6bde5af2ac89bd2384381", - git_commit = "b74605a932fe9b7bc878fa83999d09d12d0e5e55", + sha256 = "918a68fe6627ef3201fd848d0b8cfa38e02fbb0d9f8b165c7afaf0d17c7e5da3", + git_commit = "a6de72009482036ef3c367e59a267ca30d0903ee", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 83c0a24141fa9df6510ffe07eb0911622d66f1f5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 14 Jan 2019 23:01:59 -0800 Subject: [PATCH 2158/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229316911 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c50da1b960c..30bb7c65894 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "918a68fe6627ef3201fd848d0b8cfa38e02fbb0d9f8b165c7afaf0d17c7e5da3", - git_commit = "a6de72009482036ef3c367e59a267ca30d0903ee", + sha256 = "ec3e02d3dc3efe1aa59e0d386d2fa61a294d60bb870b40596264875f084764e0", + git_commit = "e3aa49701d60a006d09786f5a240530ee5f47e25", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a5af90e516836f6b30dbbb4a0f3b5c83a9d982b9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 15 Jan 2019 02:02:20 -0800 Subject: [PATCH 2159/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229335123 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 30bb7c65894..4df053d9f5f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ec3e02d3dc3efe1aa59e0d386d2fa61a294d60bb870b40596264875f084764e0", - git_commit = "e3aa49701d60a006d09786f5a240530ee5f47e25", + sha256 = "f2048baabd895cd6985e7d7450ddffdc22e27c48d686ab6ece2f7124e2460268", + git_commit = "82e9fd50c1fd44a96b322e6317b645db338e9f25", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 608f801a1604c1c2686b8f969aa53a1f1055ab1f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 15 Jan 2019 03:02:42 -0800 Subject: [PATCH 2160/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229341144 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4df053d9f5f..14df122caff 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f2048baabd895cd6985e7d7450ddffdc22e27c48d686ab6ece2f7124e2460268", - git_commit = "82e9fd50c1fd44a96b322e6317b645db338e9f25", + sha256 = "4ffb1b879fd97c73b9ebfd327e8cf0400b923cc1a25a21450c724f18e24d24ed", + git_commit = "dc07d3662531af7b3f049c6f3d3b010d4252df50", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From eea2d2db8ec4f9779828464acc49a488a6281ef7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 15 Jan 2019 08:44:30 -0800 Subject: [PATCH 2161/8103] Replace calls to deprecated googletest macros *TEST_CASE() with *TEST_SUITE() PiperOrigin-RevId: 229378038 --- tensorflow_serving/core/aspired_versions_manager_test.cc | 2 +- tensorflow_serving/core/basic_manager_test.cc | 6 +++--- tensorflow_serving/core/caching_manager_test.cc | 2 +- tensorflow_serving/model_servers/server_core_test.cc | 4 ++-- tensorflow_serving/servables/tensorflow/classifier_test.cc | 2 +- .../servables/tensorflow/get_model_metadata_impl_test.cc | 4 ++-- .../servables/tensorflow/predict_impl_test.cc | 2 +- tensorflow_serving/servables/tensorflow/regressor_test.cc | 2 +- .../tensorflow/saved_model_bundle_source_adapter_test.cc | 4 ++-- tensorflow_serving/util/json_tensor_test.cc | 2 +- 10 files changed, 15 insertions(+), 15 deletions(-) diff --git a/tensorflow_serving/core/aspired_versions_manager_test.cc b/tensorflow_serving/core/aspired_versions_manager_test.cc index e216e5f3061..eb06057f6e5 100644 --- a/tensorflow_serving/core/aspired_versions_manager_test.cc +++ b/tensorflow_serving/core/aspired_versions_manager_test.cc @@ -154,7 +154,7 @@ class AspiredVersionsManagerTest std::unique_ptr manager_; }; -INSTANTIATE_TEST_CASE_P( +INSTANTIATE_TEST_SUITE_P( WithOrWithoutThreadPools, AspiredVersionsManagerTest, ::testing::Values( ThreadPoolSizes{0, 0} /* without load or unload threadpools */, diff --git a/tensorflow_serving/core/basic_manager_test.cc b/tensorflow_serving/core/basic_manager_test.cc index 0c3630a677d..f982ff0c789 100644 --- a/tensorflow_serving/core/basic_manager_test.cc +++ b/tensorflow_serving/core/basic_manager_test.cc @@ -123,7 +123,7 @@ class BasicManagerTest : public ::testing::TestWithParam { std::unique_ptr basic_manager_; }; -INSTANTIATE_TEST_CASE_P( +INSTANTIATE_TEST_SUITE_P( WithOrWithoutThreadPools, BasicManagerTest, ::testing::Values( ThreadPoolSizes{0, 0} /* without load or unload threadpools */, @@ -1017,8 +1017,8 @@ TEST_P(FlushFileSystemCachesTest, Load) { basic_manager_.reset(); } -INSTANTIATE_TEST_CASE_P(WithOrWithoutFlush, FlushFileSystemCachesTest, - ::testing::Bool()); +INSTANTIATE_TEST_SUITE_P(WithOrWithoutFlush, FlushFileSystemCachesTest, + ::testing::Bool()); TEST_P(BasicManagerTest, ConcurrentLoadsOnlyOneSucceeds) { const ServableId id = {kServableName3, 0}; diff --git a/tensorflow_serving/core/caching_manager_test.cc b/tensorflow_serving/core/caching_manager_test.cc index b59cd27a88c..a3af73d10c4 100644 --- a/tensorflow_serving/core/caching_manager_test.cc +++ b/tensorflow_serving/core/caching_manager_test.cc @@ -214,7 +214,7 @@ class CachingManagerTest : public ::testing::TestWithParam { StringLoaderFactory* string_loader_factory_; }; -INSTANTIATE_TEST_CASE_P( +INSTANTIATE_TEST_SUITE_P( WithOrWithoutThreadPools, CachingManagerTest, ::testing::Values( ThreadPoolSizes{0, 0} /* without load or unload threadpools */, diff --git a/tensorflow_serving/model_servers/server_core_test.cc b/tensorflow_serving/model_servers/server_core_test.cc index ca9e956c3ac..acd8629972c 100644 --- a/tensorflow_serving/model_servers/server_core_test.cc +++ b/tensorflow_serving/model_servers/server_core_test.cc @@ -790,13 +790,13 @@ TEST_P(ServerCoreTest, VersionLabelsNotAllowed) { ::testing::HasSubstr("Model version labels are not currently allowed")); } -INSTANTIATE_TEST_CASE_P( +INSTANTIATE_TEST_SUITE_P( TestType, ServerCoreTest, ::testing::Combine( ::testing::Range(0, static_cast(ServerCoreTest::NUM_TEST_TYPES)), ::testing::Bool())); -INSTANTIATE_TEST_CASE_P( +INSTANTIATE_TEST_SUITE_P( TestType, RelativePathsServerCoreTest, ::testing::Combine( ::testing::Range(0, static_cast(ServerCoreTest::NUM_TEST_TYPES)), diff --git a/tensorflow_serving/servables/tensorflow/classifier_test.cc b/tensorflow_serving/servables/tensorflow/classifier_test.cc index 4dc7df9a3cf..cbc427481a9 100644 --- a/tensorflow_serving/servables/tensorflow/classifier_test.cc +++ b/tensorflow_serving/servables/tensorflow/classifier_test.cc @@ -1187,7 +1187,7 @@ TEST_P(ClassifierTest, MismatchedNumberOfTensorClasses) { } // Test all ClassifierTest test cases with both SessionBundle and SavedModel. -INSTANTIATE_TEST_CASE_P(UseSavedModel, ClassifierTest, ::testing::Bool()); +INSTANTIATE_TEST_SUITE_P(UseSavedModel, ClassifierTest, ::testing::Bool()); } // namespace } // namespace serving diff --git a/tensorflow_serving/servables/tensorflow/get_model_metadata_impl_test.cc b/tensorflow_serving/servables/tensorflow/get_model_metadata_impl_test.cc index 081f5de0a3a..59f0b6bf780 100644 --- a/tensorflow_serving/servables/tensorflow/get_model_metadata_impl_test.cc +++ b/tensorflow_serving/servables/tensorflow/get_model_metadata_impl_test.cc @@ -231,8 +231,8 @@ TEST_P(GetModelMetadataImplTest, ModelSpecOverride) { } // Test all ClassifierTest test cases with both SessionBundle and SavedModel. -INSTANTIATE_TEST_CASE_P(UseSavedModel, GetModelMetadataImplTest, - ::testing::Bool()); +INSTANTIATE_TEST_SUITE_P(UseSavedModel, GetModelMetadataImplTest, + ::testing::Bool()); } // namespace } // namespace serving diff --git a/tensorflow_serving/servables/tensorflow/predict_impl_test.cc b/tensorflow_serving/servables/tensorflow/predict_impl_test.cc index 0c83d3cea33..073a7af861f 100644 --- a/tensorflow_serving/servables/tensorflow/predict_impl_test.cc +++ b/tensorflow_serving/servables/tensorflow/predict_impl_test.cc @@ -507,7 +507,7 @@ TEST_P(PredictImplTest, ModelSpecOverride) { } // Test all PredictImplTest test cases with both SessionBundle and SavedModel. -INSTANTIATE_TEST_CASE_P(UseSavedModel, PredictImplTest, ::testing::Bool()); +INSTANTIATE_TEST_SUITE_P(UseSavedModel, PredictImplTest, ::testing::Bool()); } // namespace } // namespace serving diff --git a/tensorflow_serving/servables/tensorflow/regressor_test.cc b/tensorflow_serving/servables/tensorflow/regressor_test.cc index 0d6ace4463e..57adb907309 100644 --- a/tensorflow_serving/servables/tensorflow/regressor_test.cc +++ b/tensorflow_serving/servables/tensorflow/regressor_test.cc @@ -675,7 +675,7 @@ TEST_P(RegressorTest, MissingRegressionSignature) { } // Test all RegressorTest test cases with both SessionBundle and SavedModel. -INSTANTIATE_TEST_CASE_P(UseSavedModel, RegressorTest, ::testing::Bool()); +INSTANTIATE_TEST_SUITE_P(UseSavedModel, RegressorTest, ::testing::Bool()); } // namespace } // namespace serving diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter_test.cc b/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter_test.cc index 7d1770b7744..9c4a9903a19 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter_test.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter_test.cc @@ -122,8 +122,8 @@ TEST_P(SavedModelBundleSourceAdapterTest, BackwardCompatibility) { // Test all SavedModelBundleSourceAdapterTest test cases with // warmup enabled/disabled. -INSTANTIATE_TEST_CASE_P(EnableWarmup, SavedModelBundleSourceAdapterTest, - ::testing::Bool()); +INSTANTIATE_TEST_SUITE_P(EnableWarmup, SavedModelBundleSourceAdapterTest, + ::testing::Bool()); } // namespace } // namespace serving diff --git a/tensorflow_serving/util/json_tensor_test.cc b/tensorflow_serving/util/json_tensor_test.cc index 7e1c057e81e..2b4daa4eb7d 100644 --- a/tensorflow_serving/util/json_tensor_test.cc +++ b/tensorflow_serving/util/json_tensor_test.cc @@ -1028,7 +1028,7 @@ class ClassifyRegressRequestTest : public ::testing::Test { }; typedef ::testing::Types RequestTypes; -TYPED_TEST_CASE(ClassifyRegressRequestTest, RequestTypes); +TYPED_TEST_SUITE(ClassifyRegressRequestTest, RequestTypes); TYPED_TEST(ClassifyRegressRequestTest, RequestNoContext) { TypeParam req; From d1df9aa6940131fdab28f2adda59a8057ca5b714 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 15 Jan 2019 09:02:07 -0800 Subject: [PATCH 2162/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229380455 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 14df122caff..180925171aa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4ffb1b879fd97c73b9ebfd327e8cf0400b923cc1a25a21450c724f18e24d24ed", - git_commit = "dc07d3662531af7b3f049c6f3d3b010d4252df50", + sha256 = "19015e8c1909283e0d6599270f847b77b9ba3169a8ddfb725052c5dda5b2e266", + git_commit = "b329214d7bbf2e451e8631fee86ae40694869dd2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5be272a34052e365661c776121707ff01f2faf4a Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Tue, 15 Jan 2019 13:10:40 -0800 Subject: [PATCH 2163/8103] Automated rollback of commit eea2d2db8ec4f9779828464acc49a488a6281ef7 PiperOrigin-RevId: 229426289 --- tensorflow_serving/core/aspired_versions_manager_test.cc | 2 +- tensorflow_serving/core/basic_manager_test.cc | 6 +++--- tensorflow_serving/core/caching_manager_test.cc | 2 +- tensorflow_serving/model_servers/server_core_test.cc | 4 ++-- tensorflow_serving/servables/tensorflow/classifier_test.cc | 2 +- .../servables/tensorflow/get_model_metadata_impl_test.cc | 4 ++-- .../servables/tensorflow/predict_impl_test.cc | 2 +- tensorflow_serving/servables/tensorflow/regressor_test.cc | 2 +- .../tensorflow/saved_model_bundle_source_adapter_test.cc | 4 ++-- tensorflow_serving/util/json_tensor_test.cc | 2 +- 10 files changed, 15 insertions(+), 15 deletions(-) diff --git a/tensorflow_serving/core/aspired_versions_manager_test.cc b/tensorflow_serving/core/aspired_versions_manager_test.cc index eb06057f6e5..e216e5f3061 100644 --- a/tensorflow_serving/core/aspired_versions_manager_test.cc +++ b/tensorflow_serving/core/aspired_versions_manager_test.cc @@ -154,7 +154,7 @@ class AspiredVersionsManagerTest std::unique_ptr manager_; }; -INSTANTIATE_TEST_SUITE_P( +INSTANTIATE_TEST_CASE_P( WithOrWithoutThreadPools, AspiredVersionsManagerTest, ::testing::Values( ThreadPoolSizes{0, 0} /* without load or unload threadpools */, diff --git a/tensorflow_serving/core/basic_manager_test.cc b/tensorflow_serving/core/basic_manager_test.cc index f982ff0c789..0c3630a677d 100644 --- a/tensorflow_serving/core/basic_manager_test.cc +++ b/tensorflow_serving/core/basic_manager_test.cc @@ -123,7 +123,7 @@ class BasicManagerTest : public ::testing::TestWithParam { std::unique_ptr basic_manager_; }; -INSTANTIATE_TEST_SUITE_P( +INSTANTIATE_TEST_CASE_P( WithOrWithoutThreadPools, BasicManagerTest, ::testing::Values( ThreadPoolSizes{0, 0} /* without load or unload threadpools */, @@ -1017,8 +1017,8 @@ TEST_P(FlushFileSystemCachesTest, Load) { basic_manager_.reset(); } -INSTANTIATE_TEST_SUITE_P(WithOrWithoutFlush, FlushFileSystemCachesTest, - ::testing::Bool()); +INSTANTIATE_TEST_CASE_P(WithOrWithoutFlush, FlushFileSystemCachesTest, + ::testing::Bool()); TEST_P(BasicManagerTest, ConcurrentLoadsOnlyOneSucceeds) { const ServableId id = {kServableName3, 0}; diff --git a/tensorflow_serving/core/caching_manager_test.cc b/tensorflow_serving/core/caching_manager_test.cc index a3af73d10c4..b59cd27a88c 100644 --- a/tensorflow_serving/core/caching_manager_test.cc +++ b/tensorflow_serving/core/caching_manager_test.cc @@ -214,7 +214,7 @@ class CachingManagerTest : public ::testing::TestWithParam { StringLoaderFactory* string_loader_factory_; }; -INSTANTIATE_TEST_SUITE_P( +INSTANTIATE_TEST_CASE_P( WithOrWithoutThreadPools, CachingManagerTest, ::testing::Values( ThreadPoolSizes{0, 0} /* without load or unload threadpools */, diff --git a/tensorflow_serving/model_servers/server_core_test.cc b/tensorflow_serving/model_servers/server_core_test.cc index acd8629972c..ca9e956c3ac 100644 --- a/tensorflow_serving/model_servers/server_core_test.cc +++ b/tensorflow_serving/model_servers/server_core_test.cc @@ -790,13 +790,13 @@ TEST_P(ServerCoreTest, VersionLabelsNotAllowed) { ::testing::HasSubstr("Model version labels are not currently allowed")); } -INSTANTIATE_TEST_SUITE_P( +INSTANTIATE_TEST_CASE_P( TestType, ServerCoreTest, ::testing::Combine( ::testing::Range(0, static_cast(ServerCoreTest::NUM_TEST_TYPES)), ::testing::Bool())); -INSTANTIATE_TEST_SUITE_P( +INSTANTIATE_TEST_CASE_P( TestType, RelativePathsServerCoreTest, ::testing::Combine( ::testing::Range(0, static_cast(ServerCoreTest::NUM_TEST_TYPES)), diff --git a/tensorflow_serving/servables/tensorflow/classifier_test.cc b/tensorflow_serving/servables/tensorflow/classifier_test.cc index cbc427481a9..4dc7df9a3cf 100644 --- a/tensorflow_serving/servables/tensorflow/classifier_test.cc +++ b/tensorflow_serving/servables/tensorflow/classifier_test.cc @@ -1187,7 +1187,7 @@ TEST_P(ClassifierTest, MismatchedNumberOfTensorClasses) { } // Test all ClassifierTest test cases with both SessionBundle and SavedModel. -INSTANTIATE_TEST_SUITE_P(UseSavedModel, ClassifierTest, ::testing::Bool()); +INSTANTIATE_TEST_CASE_P(UseSavedModel, ClassifierTest, ::testing::Bool()); } // namespace } // namespace serving diff --git a/tensorflow_serving/servables/tensorflow/get_model_metadata_impl_test.cc b/tensorflow_serving/servables/tensorflow/get_model_metadata_impl_test.cc index 59f0b6bf780..081f5de0a3a 100644 --- a/tensorflow_serving/servables/tensorflow/get_model_metadata_impl_test.cc +++ b/tensorflow_serving/servables/tensorflow/get_model_metadata_impl_test.cc @@ -231,8 +231,8 @@ TEST_P(GetModelMetadataImplTest, ModelSpecOverride) { } // Test all ClassifierTest test cases with both SessionBundle and SavedModel. -INSTANTIATE_TEST_SUITE_P(UseSavedModel, GetModelMetadataImplTest, - ::testing::Bool()); +INSTANTIATE_TEST_CASE_P(UseSavedModel, GetModelMetadataImplTest, + ::testing::Bool()); } // namespace } // namespace serving diff --git a/tensorflow_serving/servables/tensorflow/predict_impl_test.cc b/tensorflow_serving/servables/tensorflow/predict_impl_test.cc index 073a7af861f..0c83d3cea33 100644 --- a/tensorflow_serving/servables/tensorflow/predict_impl_test.cc +++ b/tensorflow_serving/servables/tensorflow/predict_impl_test.cc @@ -507,7 +507,7 @@ TEST_P(PredictImplTest, ModelSpecOverride) { } // Test all PredictImplTest test cases with both SessionBundle and SavedModel. -INSTANTIATE_TEST_SUITE_P(UseSavedModel, PredictImplTest, ::testing::Bool()); +INSTANTIATE_TEST_CASE_P(UseSavedModel, PredictImplTest, ::testing::Bool()); } // namespace } // namespace serving diff --git a/tensorflow_serving/servables/tensorflow/regressor_test.cc b/tensorflow_serving/servables/tensorflow/regressor_test.cc index 57adb907309..0d6ace4463e 100644 --- a/tensorflow_serving/servables/tensorflow/regressor_test.cc +++ b/tensorflow_serving/servables/tensorflow/regressor_test.cc @@ -675,7 +675,7 @@ TEST_P(RegressorTest, MissingRegressionSignature) { } // Test all RegressorTest test cases with both SessionBundle and SavedModel. -INSTANTIATE_TEST_SUITE_P(UseSavedModel, RegressorTest, ::testing::Bool()); +INSTANTIATE_TEST_CASE_P(UseSavedModel, RegressorTest, ::testing::Bool()); } // namespace } // namespace serving diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter_test.cc b/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter_test.cc index 9c4a9903a19..7d1770b7744 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter_test.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter_test.cc @@ -122,8 +122,8 @@ TEST_P(SavedModelBundleSourceAdapterTest, BackwardCompatibility) { // Test all SavedModelBundleSourceAdapterTest test cases with // warmup enabled/disabled. -INSTANTIATE_TEST_SUITE_P(EnableWarmup, SavedModelBundleSourceAdapterTest, - ::testing::Bool()); +INSTANTIATE_TEST_CASE_P(EnableWarmup, SavedModelBundleSourceAdapterTest, + ::testing::Bool()); } // namespace } // namespace serving diff --git a/tensorflow_serving/util/json_tensor_test.cc b/tensorflow_serving/util/json_tensor_test.cc index 2b4daa4eb7d..7e1c057e81e 100644 --- a/tensorflow_serving/util/json_tensor_test.cc +++ b/tensorflow_serving/util/json_tensor_test.cc @@ -1028,7 +1028,7 @@ class ClassifyRegressRequestTest : public ::testing::Test { }; typedef ::testing::Types RequestTypes; -TYPED_TEST_SUITE(ClassifyRegressRequestTest, RequestTypes); +TYPED_TEST_CASE(ClassifyRegressRequestTest, RequestTypes); TYPED_TEST(ClassifyRegressRequestTest, RequestNoContext) { TypeParam req; From de0935b64ec972879ae623aa4f438282a4281dcc Mon Sep 17 00:00:00 2001 From: mingmingl Date: Tue, 15 Jan 2019 13:58:08 -0800 Subject: [PATCH 2164/8103] Add monitoring metrics for saved model (export_dir) warm up latency. PiperOrigin-RevId: 229435118 --- .../servables/tensorflow/saved_model_warmup.cc | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tensorflow_serving/servables/tensorflow/saved_model_warmup.cc b/tensorflow_serving/servables/tensorflow/saved_model_warmup.cc index 218868f2da4..a3df771a4fb 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_warmup.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_warmup.cc @@ -18,6 +18,7 @@ limitations under the License. #include "tensorflow/cc/saved_model/constants.h" #include "tensorflow/core/lib/io/path.h" #include "tensorflow/core/lib/io/record_reader.h" +#include "tensorflow/core/lib/monitoring/counter.h" #include "tensorflow/core/lib/strings/strcat.h" #include "tensorflow/core/protobuf/config.pb.h" #include "tensorflow_serving/apis/prediction_log.pb.h" @@ -32,6 +33,17 @@ namespace serving { namespace { +auto* model_warmup_latency = monitoring::Counter<1>::New( + "/tensorflow/serving/model_warmup_latency", + "Latency in microseconds for model warm up.", "model_path"); + +uint64 GetLatencyMicroseconds(const uint64 start_microseconds) { + const uint64 end_microseconds = Env::Default()->NowMicros(); + // Avoid clock skew. + if (end_microseconds < start_microseconds) return 0; + return end_microseconds - start_microseconds; +} + Status RunWarmupRequest(const PredictionLog& warmup_record, const RunOptions& run_options, const MetaGraphDef& meta_graph_def, Session* session) { @@ -76,6 +88,7 @@ constexpr int WarmupConsts::kMaxNumRecords; Status RunSavedModelWarmup(const RunOptions& run_options, const string& export_dir, SavedModelBundle* bundle) { + const uint64 start_microseconds = Env::Default()->NowMicros(); const string warmup_path = io::JoinPath(export_dir, kSavedModelAssetsExtraDirectory, WarmupConsts::kRequestsFileName); @@ -118,6 +131,9 @@ Status RunSavedModelWarmup(const RunOptions& run_options, return status; } + model_warmup_latency->GetCell(export_dir) + ->IncrementBy(GetLatencyMicroseconds(start_microseconds)); + LOG(INFO) << "Finished reading warmup data for model at " << warmup_path << ". Number of warmup records read: " << num_warmup_records << "."; return Status::OK(); From 5aa7fe1428fd63a75e11fd890b6af926763d9904 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 15 Jan 2019 14:02:17 -0800 Subject: [PATCH 2165/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229435916 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 180925171aa..b8d2f16c471 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "19015e8c1909283e0d6599270f847b77b9ba3169a8ddfb725052c5dda5b2e266", - git_commit = "b329214d7bbf2e451e8631fee86ae40694869dd2", + sha256 = "aee66ee13de21a39a61af125caab0ac2374d77f1fb6f6a1d5706fed384a9e32e", + git_commit = "02f36e7cc1e83ff2b12a318dbf6942a4a97d90d2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From fe9d80b03c36fa603b86ee0c2d10507f95a2addc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 15 Jan 2019 15:02:07 -0800 Subject: [PATCH 2166/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229447183 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b8d2f16c471..bca182ece28 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "aee66ee13de21a39a61af125caab0ac2374d77f1fb6f6a1d5706fed384a9e32e", - git_commit = "02f36e7cc1e83ff2b12a318dbf6942a4a97d90d2", + sha256 = "bd3150c319cb211437a2e1746a90abea3329f0bff24e05d4e3574d6dcc3e4d41", + git_commit = "bcde9269af0b177e1047ca9b250234b57c5522e2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f0877d33a3be1ad053d4125c33745cc25d6df2d0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 15 Jan 2019 16:02:29 -0800 Subject: [PATCH 2167/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229458397 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bca182ece28..1025c6188dc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bd3150c319cb211437a2e1746a90abea3329f0bff24e05d4e3574d6dcc3e4d41", - git_commit = "bcde9269af0b177e1047ca9b250234b57c5522e2", + sha256 = "bd6d553ab253cef2ab85597b8c12c034543ac7fe09d789c55b9f7c45ac726ac1", + git_commit = "750b30d2aa9e41802028a1c6693f73fa6ec6be1b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 261ab02430a8c36e159f9e4a6ba06f7df773b0c2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 15 Jan 2019 17:01:46 -0800 Subject: [PATCH 2168/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229468271 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1025c6188dc..b0efac4fdbb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bd6d553ab253cef2ab85597b8c12c034543ac7fe09d789c55b9f7c45ac726ac1", - git_commit = "750b30d2aa9e41802028a1c6693f73fa6ec6be1b", + sha256 = "149e194700bb26a119f1531f362bb6ba35d178e6fcdba092a79ce7135645d934", + git_commit = "eeed0360137913e5daeb14de5da89282a494921b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3638370e8d7594b83678370fcca00c5d6dffaf2c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 15 Jan 2019 18:02:20 -0800 Subject: [PATCH 2169/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229476206 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b0efac4fdbb..4a3a2648000 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "149e194700bb26a119f1531f362bb6ba35d178e6fcdba092a79ce7135645d934", - git_commit = "eeed0360137913e5daeb14de5da89282a494921b", + sha256 = "e8a7ebbaa4f75653ff951776559cc55af8acfdcc43b00c2818d4f502401fe75a", + git_commit = "7e090f6a5412fd5f22b5b75ca7ae7844c3d025e9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 710e386f8eedfc0cc82204ee705de6994373d4f6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 15 Jan 2019 19:02:08 -0800 Subject: [PATCH 2170/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229482663 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4a3a2648000..1dafdccecec 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e8a7ebbaa4f75653ff951776559cc55af8acfdcc43b00c2818d4f502401fe75a", - git_commit = "7e090f6a5412fd5f22b5b75ca7ae7844c3d025e9", + sha256 = "67f3f858eb068a9c874df39d537b194597b58df966e24c862dd26de6ee780584", + git_commit = "5838c93f43f26218079d279a3a0ca708ab2b1a95", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7b3a2c2e6f7a5e877780c434a5bc43459cc9b134 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 15 Jan 2019 20:02:13 -0800 Subject: [PATCH 2171/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229488023 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1dafdccecec..94491f010d2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "67f3f858eb068a9c874df39d537b194597b58df966e24c862dd26de6ee780584", - git_commit = "5838c93f43f26218079d279a3a0ca708ab2b1a95", + sha256 = "cf06731179696524e7b4c76b713def47267529a0291ec9fb64b17e149d921cdc", + git_commit = "7c6f3e1a092685da3ca5cace971d8a6cf455ed3e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0585100ab3f018b8e3e96e5d8f3af24b743cb641 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 15 Jan 2019 21:01:38 -0800 Subject: [PATCH 2172/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229493131 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 94491f010d2..ed656389189 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cf06731179696524e7b4c76b713def47267529a0291ec9fb64b17e149d921cdc", - git_commit = "7c6f3e1a092685da3ca5cace971d8a6cf455ed3e", + sha256 = "bd4dafa0ffb16c4843e3cdb39adf185ad724bc7eb76794bbb90b101224ee9645", + git_commit = "bc4a279ca963a901576a9a7a35b189dfae7f5c85", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f555acae265232119120717a84b73c77b9f9832f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 16 Jan 2019 01:02:03 -0800 Subject: [PATCH 2173/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229512929 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ed656389189..a2612b4c834 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bd4dafa0ffb16c4843e3cdb39adf185ad724bc7eb76794bbb90b101224ee9645", - git_commit = "bc4a279ca963a901576a9a7a35b189dfae7f5c85", + sha256 = "05370535e3255ca82459cecaef06384d0a4830704f3baf1d610698d1e3028c84", + git_commit = "0bc02af7db9e43c37a89278a2e7c99ecdfe4fb00", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 92459f0b9fabe74520da53e396603683330c2101 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 16 Jan 2019 02:02:11 -0800 Subject: [PATCH 2174/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229520701 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a2612b4c834..1429b8ce634 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "05370535e3255ca82459cecaef06384d0a4830704f3baf1d610698d1e3028c84", - git_commit = "0bc02af7db9e43c37a89278a2e7c99ecdfe4fb00", + sha256 = "1669041e0f5a61a4c98919f7507c182a1f93a71efd9cfd9d2948114246d8ca41", + git_commit = "9fd5c9930dc714c089ed137d57e8ba09e0e1a6af", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 427a0db89356621a8807ec3b97855f82eb73e4cb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 16 Jan 2019 04:02:38 -0800 Subject: [PATCH 2175/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229533056 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1429b8ce634..67217016b78 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1669041e0f5a61a4c98919f7507c182a1f93a71efd9cfd9d2948114246d8ca41", - git_commit = "9fd5c9930dc714c089ed137d57e8ba09e0e1a6af", + sha256 = "2da28e0d9e67f498faee813cfcbf7f6d35efe996a05730b238f936d98709c298", + git_commit = "a331eaf593bb91eaafd8953f1bd7d502eaeee53a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 463c75919ed9bdfe776bfd0cd12e27a5528382d2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 16 Jan 2019 08:03:11 -0800 Subject: [PATCH 2176/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229558492 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 67217016b78..b6330db2c76 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2da28e0d9e67f498faee813cfcbf7f6d35efe996a05730b238f936d98709c298", - git_commit = "a331eaf593bb91eaafd8953f1bd7d502eaeee53a", + sha256 = "5e550acd9a22c1827af118d953519f52a17257cf206b7ee56a07f23e4f193673", + git_commit = "2225d4d16dcec29f5c4eeda4485618bc3ac4de99", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e49d91d13738f96c89d60cab522b3a23901c330c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 16 Jan 2019 09:01:48 -0800 Subject: [PATCH 2177/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229566713 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b6330db2c76..1153b27c38f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5e550acd9a22c1827af118d953519f52a17257cf206b7ee56a07f23e4f193673", - git_commit = "2225d4d16dcec29f5c4eeda4485618bc3ac4de99", + sha256 = "07fcd59c1664881af7989f69ec18c33b6b64b06b43f03314d5f3adb392c3c64f", + git_commit = "060b6e32adbcee5504377f5bd54a2e4044d78273", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f0e91bc8e6104915704e4070d3dfbc84e5e1d565 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 16 Jan 2019 10:02:04 -0800 Subject: [PATCH 2178/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229576475 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1153b27c38f..b66b393bc00 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "07fcd59c1664881af7989f69ec18c33b6b64b06b43f03314d5f3adb392c3c64f", - git_commit = "060b6e32adbcee5504377f5bd54a2e4044d78273", + sha256 = "c70d943ebbb7439b1c682691c7aca32915046a27b4d90ccb91d7659080551fef", + git_commit = "d122a13913a1d058cb872b9c443ecbfef8c8bc8d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From bb49f13ca30d315843610ad1eefd5c44d40ca206 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 16 Jan 2019 11:02:01 -0800 Subject: [PATCH 2179/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229588144 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b66b393bc00..ce71eebdcda 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c70d943ebbb7439b1c682691c7aca32915046a27b4d90ccb91d7659080551fef", - git_commit = "d122a13913a1d058cb872b9c443ecbfef8c8bc8d", + sha256 = "616672aab965aa0f69753aa51ce56dd8b150072c7b8d2b91242822a3194c9568", + git_commit = "899f788738014fe438105fe30100e768b5f7900c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f9e6ac4d60a4044fc3b8c07719d0faaeae401dda Mon Sep 17 00:00:00 2001 From: christis Date: Wed, 16 Jan 2019 11:25:42 -0800 Subject: [PATCH 2180/8103] Add more details/clarification to model version labels documentation. PiperOrigin-RevId: 229593205 --- tensorflow_serving/g3doc/serving_config.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tensorflow_serving/g3doc/serving_config.md b/tensorflow_serving/g3doc/serving_config.md index 6a115c9b7da..881ef46ad54 100644 --- a/tensorflow_serving/g3doc/serving_config.md +++ b/tensorflow_serving/g3doc/serving_config.md @@ -133,3 +133,10 @@ If you subsequently need to perform a rollback, you can revert to the old config that has version 42 as "stable". Otherwise, you can march forward by unloading version 42 and loading the new version 44 when it is ready, and then advancing the canary label to 44, and so on. + +Please note that labels can only be assigned to model versions that are loaded +and available for serving. Once a model version is available, one may reload +the model config on the fly, to assign a label to it +(can be achieved using +[HandleReloadConfigRequest](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/apis/model_service.proto#L22) +RPC endpoint). From 1f0c315df9893e05a1315327309cedb63e0e61ab Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 16 Jan 2019 12:02:27 -0800 Subject: [PATCH 2181/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229600518 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ce71eebdcda..d874b49ab57 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "616672aab965aa0f69753aa51ce56dd8b150072c7b8d2b91242822a3194c9568", - git_commit = "899f788738014fe438105fe30100e768b5f7900c", + sha256 = "50f5ea2fa951e99ea3f56d3b976faab6dd08429733a526de6f6140cf10a0e624", + git_commit = "168eca540fc3b2090b15535d6728ed88520fae49", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 75354f0aee8a34b35b2dd74f04508cbab818e1b7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 16 Jan 2019 13:02:04 -0800 Subject: [PATCH 2182/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229610188 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d874b49ab57..d9b08865277 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "50f5ea2fa951e99ea3f56d3b976faab6dd08429733a526de6f6140cf10a0e624", - git_commit = "168eca540fc3b2090b15535d6728ed88520fae49", + sha256 = "51a5c51ce56ad5769dfda4329e4ab85633adbcb494120a09e1a273cf04e19b1a", + git_commit = "ee5d6e6deaac2b129bd9ac0c5ac3a82bb4bde8b8", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From aee4233cceaac92f17762d94e089d733fabd6c93 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 16 Jan 2019 14:02:44 -0800 Subject: [PATCH 2183/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229621933 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d9b08865277..7951fbc7ee5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "51a5c51ce56ad5769dfda4329e4ab85633adbcb494120a09e1a273cf04e19b1a", - git_commit = "ee5d6e6deaac2b129bd9ac0c5ac3a82bb4bde8b8", + sha256 = "7f09c108b77018550a12f81c4ce45544452cefc054d9ccc66891ed268877a05b", + git_commit = "b2723af89145e5238df417b9bfd47fef29d00354", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ddf5c087d72dffd87e52da5659133c7b90fcef34 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 16 Jan 2019 15:02:28 -0800 Subject: [PATCH 2184/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229632955 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7951fbc7ee5..910ed1abd0f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7f09c108b77018550a12f81c4ce45544452cefc054d9ccc66891ed268877a05b", - git_commit = "b2723af89145e5238df417b9bfd47fef29d00354", + sha256 = "a40f3d9cc965cef283e1dc8d34bc35127333db17d614860b5764c6688912556e", + git_commit = "955d8f1377c3f8e7a2ec4b548126d20d70e063f0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6aa2c9ce169438eeacac0cc963e1bdd44dbf1d50 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 16 Jan 2019 16:02:42 -0800 Subject: [PATCH 2185/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229643780 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 910ed1abd0f..eeca6ed0175 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a40f3d9cc965cef283e1dc8d34bc35127333db17d614860b5764c6688912556e", - git_commit = "955d8f1377c3f8e7a2ec4b548126d20d70e063f0", + sha256 = "9ae7bf3c96e622f2d64a27b631c40ed761be1702389ffd63255f2380b13e1a06", + git_commit = "29b51d42ba4950658c566a0ca531b799e019ef7f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1bfa0fbb5983d9396d6d8ea0b70bf201da55f936 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 16 Jan 2019 17:01:53 -0800 Subject: [PATCH 2186/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229653544 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index eeca6ed0175..597b5d8cad7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9ae7bf3c96e622f2d64a27b631c40ed761be1702389ffd63255f2380b13e1a06", - git_commit = "29b51d42ba4950658c566a0ca531b799e019ef7f", + sha256 = "1f6f6df493613583c8ed0eec959e625e1b33bfdbf0e922e57e89cc69aaf5c727", + git_commit = "1d2e3ab3f291bd887a8dc292bb3fd31f9106204e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 87498e9878ed6c8e2bbf6d51a771171901444acf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 16 Jan 2019 18:02:50 -0800 Subject: [PATCH 2187/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229661502 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 597b5d8cad7..e2af6e74797 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1f6f6df493613583c8ed0eec959e625e1b33bfdbf0e922e57e89cc69aaf5c727", - git_commit = "1d2e3ab3f291bd887a8dc292bb3fd31f9106204e", + sha256 = "02e10053f533e7ce7603162d62302cb8b30eeb607e106816f84089f4b7d27fdd", + git_commit = "8b0e7dfcf0e5f4d0a15a1c32dd379292f2b344fb", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0ea71bf453f9838a2574c87c4017e53893c550f9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 16 Jan 2019 19:02:11 -0800 Subject: [PATCH 2188/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229667522 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e2af6e74797..e201d789fc6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "02e10053f533e7ce7603162d62302cb8b30eeb607e106816f84089f4b7d27fdd", - git_commit = "8b0e7dfcf0e5f4d0a15a1c32dd379292f2b344fb", + sha256 = "4b81d5ae42becc14dcc468a4360d6425f65272d5c2b783417e244695f7e3f8c9", + git_commit = "1d669ac6ccaa343add66d652f48b2ae943932a43", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d3325c433d57bcc50f7bdc1d37cbbd2eca8a8114 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 16 Jan 2019 20:01:48 -0800 Subject: [PATCH 2189/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229672791 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e201d789fc6..1fe035e5a75 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4b81d5ae42becc14dcc468a4360d6425f65272d5c2b783417e244695f7e3f8c9", - git_commit = "1d669ac6ccaa343add66d652f48b2ae943932a43", + sha256 = "01a3d37bad9f6b5631e9d928a6ddde0035cb71bdf3cb257e748e39a5b130c89c", + git_commit = "f26f17f1b86b449fbdbe52f8384b91d9e92f2962", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 05e523945aedeaf33c8a393bcb07db140f364ae3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 16 Jan 2019 21:02:52 -0800 Subject: [PATCH 2190/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229678026 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1fe035e5a75..f54abeb5747 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "01a3d37bad9f6b5631e9d928a6ddde0035cb71bdf3cb257e748e39a5b130c89c", - git_commit = "f26f17f1b86b449fbdbe52f8384b91d9e92f2962", + sha256 = "a1d01b5af13e95f0924d4fca92e4893ebc9ba816c9b8583218d1374e10a6e521", + git_commit = "52af2770f94f0f660e4019d95821052c08b18a41", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2f10eedfdb41d75db4e18c91c4c6d31d1490358e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 16 Jan 2019 22:03:22 -0800 Subject: [PATCH 2191/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229683007 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f54abeb5747..ac9cbb08608 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a1d01b5af13e95f0924d4fca92e4893ebc9ba816c9b8583218d1374e10a6e521", - git_commit = "52af2770f94f0f660e4019d95821052c08b18a41", + sha256 = "01c82303797a341e43d18264791a0c778a97db00ae72f41f335907273c5a2eaf", + git_commit = "77e2ba9188f4343214adc30de63a98d4999103f7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3a081e7b600cbb529a8743020abdede66fee997d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 16 Jan 2019 23:01:57 -0800 Subject: [PATCH 2192/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229687443 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ac9cbb08608..3feefc93bae 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "01c82303797a341e43d18264791a0c778a97db00ae72f41f335907273c5a2eaf", - git_commit = "77e2ba9188f4343214adc30de63a98d4999103f7", + sha256 = "6e55a488c799d68e294a99cda1378637b3489e6f3605cc5ee9ea0a7b2e8e8254", + git_commit = "69b9e5358b7e64efd52f742847eeaf5f893762ab", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0bc6715eb1f909af6143817a3e48d472ff738aa5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 17 Jan 2019 01:02:03 -0800 Subject: [PATCH 2193/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229698441 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3feefc93bae..6307f210dca 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6e55a488c799d68e294a99cda1378637b3489e6f3605cc5ee9ea0a7b2e8e8254", - git_commit = "69b9e5358b7e64efd52f742847eeaf5f893762ab", + sha256 = "98c4758da68e8171337910bf43f862d65d47490d2d419bb110aec8c96dd1ccae", + git_commit = "8eb3cbcb423c4d840e88a910c5db47404207b8a4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 00412e77ecb07ce76da7bbbd055375c4d08f8e8a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 17 Jan 2019 02:03:59 -0800 Subject: [PATCH 2194/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229706751 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6307f210dca..3e38ec209df 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "98c4758da68e8171337910bf43f862d65d47490d2d419bb110aec8c96dd1ccae", - git_commit = "8eb3cbcb423c4d840e88a910c5db47404207b8a4", + sha256 = "cd7330d16f9d766132cd202be1fa1c3ee5a791930025b651ccd056da6a90c364", + git_commit = "ca2d0b652e1bc8e6d637318a1fbcb56bd4e6f0d0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 623fc30f465b807a8e89602116e0b3c9ce9538a6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 17 Jan 2019 08:02:24 -0800 Subject: [PATCH 2195/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229747810 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3e38ec209df..3a3273bab0a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cd7330d16f9d766132cd202be1fa1c3ee5a791930025b651ccd056da6a90c364", - git_commit = "ca2d0b652e1bc8e6d637318a1fbcb56bd4e6f0d0", + sha256 = "de25ae0b7f72ceb3cf12413689f7eef5fe663bf009c4a7452260c57be8242129", + git_commit = "9331096d56002c7fcb8bae411684b8b78fc196c4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b108ac872d88f4a433f489226cab7596955005ba Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 17 Jan 2019 09:02:02 -0800 Subject: [PATCH 2196/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229756990 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3a3273bab0a..bd6ff529e0a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "de25ae0b7f72ceb3cf12413689f7eef5fe663bf009c4a7452260c57be8242129", - git_commit = "9331096d56002c7fcb8bae411684b8b78fc196c4", + sha256 = "bd8e52a427f125ad78a37f052d98bc1024944c57104f695a85f3f2505c01f6fd", + git_commit = "202525cd4bbab377e9ee67f1e4098e40b0925d9c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a91ee3d0398a14c1f862f8f14fc234a91041d427 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 17 Jan 2019 10:02:23 -0800 Subject: [PATCH 2197/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229768358 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bd6ff529e0a..0ddd676f8d7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bd8e52a427f125ad78a37f052d98bc1024944c57104f695a85f3f2505c01f6fd", - git_commit = "202525cd4bbab377e9ee67f1e4098e40b0925d9c", + sha256 = "ade7fecd62adf2428775d2dc34f4a1f808d522bb7b744a88ab1d26bbf5dd57db", + git_commit = "ac7f91ee3cd48c01f9ff253440e81c36a729526a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ac198ae3bfca2a0aeb1a3035859310ec260f8c10 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 17 Jan 2019 11:01:49 -0800 Subject: [PATCH 2198/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229780395 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0ddd676f8d7..f14b6867d68 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ade7fecd62adf2428775d2dc34f4a1f808d522bb7b744a88ab1d26bbf5dd57db", - git_commit = "ac7f91ee3cd48c01f9ff253440e81c36a729526a", + sha256 = "eca0c98bd8bbe4b867e63cc942a7cb89b6ef8863f45bfbd86386d05d5e22e1b2", + git_commit = "557d6bebf085ff8c1f78715b5cfcec123cf5e6f5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From da8054329bc6d1964bc7a2afc449afcdcbd7e55f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 17 Jan 2019 12:02:40 -0800 Subject: [PATCH 2199/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229792788 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f14b6867d68..552d7499d75 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eca0c98bd8bbe4b867e63cc942a7cb89b6ef8863f45bfbd86386d05d5e22e1b2", - git_commit = "557d6bebf085ff8c1f78715b5cfcec123cf5e6f5", + sha256 = "b2e9f65357f27444cb4a7d6681d0c83f7850e3e97ce42b7d8979bc08f6c8bb63", + git_commit = "568b9e56038d2d2fe8927f9e0b538bf5e49116f6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e714d789114fa2193b5e555cf55324c78d754eb8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 17 Jan 2019 13:01:48 -0800 Subject: [PATCH 2200/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229802592 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 552d7499d75..8f3a3a09d4e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b2e9f65357f27444cb4a7d6681d0c83f7850e3e97ce42b7d8979bc08f6c8bb63", - git_commit = "568b9e56038d2d2fe8927f9e0b538bf5e49116f6", + sha256 = "24174874324dbd4851167d58b3d5622b82d40fae6267c0fad69485687d7abf60", + git_commit = "f5465080e9d3b2544c5b0fe364070d55b469e516", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 630228259cd807b2be9b61285a7e4f770610f992 Mon Sep 17 00:00:00 2001 From: mingmingl Date: Thu, 17 Jan 2019 13:30:56 -0800 Subject: [PATCH 2201/8103] Use Sampler to record warm up latency distribution (by status). PiperOrigin-RevId: 229807679 --- .../tensorflow/saved_model_warmup.cc | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/saved_model_warmup.cc b/tensorflow_serving/servables/tensorflow/saved_model_warmup.cc index a3df771a4fb..9d1d81b98dd 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_warmup.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_warmup.cc @@ -18,7 +18,7 @@ limitations under the License. #include "tensorflow/cc/saved_model/constants.h" #include "tensorflow/core/lib/io/path.h" #include "tensorflow/core/lib/io/record_reader.h" -#include "tensorflow/core/lib/monitoring/counter.h" +#include "tensorflow/core/lib/monitoring/sampler.h" #include "tensorflow/core/lib/strings/strcat.h" #include "tensorflow/core/protobuf/config.pb.h" #include "tensorflow_serving/apis/prediction_log.pb.h" @@ -33,9 +33,14 @@ namespace serving { namespace { -auto* model_warmup_latency = monitoring::Counter<1>::New( - "/tensorflow/serving/model_warmup_latency", - "Latency in microseconds for model warm up.", "model_path"); +auto* model_warm_up_latency = monitoring::Sampler<2>::New( + { + "/tensorflow/serving/model_warmup_latency", + "Distribution of wall time (in microseconds) for warming up the model.", + "model_path", + "status", + }, // Scale of 10, power of 1.8 with bucket count 33 (~20 minutes). + monitoring::Buckets::Exponential(10, 1.8, 33)); uint64 GetLatencyMicroseconds(const uint64 start_microseconds) { const uint64 end_microseconds = Env::Default()->NowMicros(); @@ -126,14 +131,15 @@ Status RunSavedModelWarmup(const RunOptions& run_options, } status = tf_record_file_reader->ReadRecord(&record); } + + model_warm_up_latency->GetCell(export_dir, status.ToString()) + ->Add(GetLatencyMicroseconds(start_microseconds)); + // OUT_OF_RANGE error means EOF was reached, do not return error in this case if (!errors::IsOutOfRange(status)) { return status; } - model_warmup_latency->GetCell(export_dir) - ->IncrementBy(GetLatencyMicroseconds(start_microseconds)); - LOG(INFO) << "Finished reading warmup data for model at " << warmup_path << ". Number of warmup records read: " << num_warmup_records << "."; return Status::OK(); From 4fff47b6d4e904232d44a5ea6a817ec6df0d14d2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 17 Jan 2019 14:02:14 -0800 Subject: [PATCH 2202/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229813341 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8f3a3a09d4e..ba3ad4fedfb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "24174874324dbd4851167d58b3d5622b82d40fae6267c0fad69485687d7abf60", - git_commit = "f5465080e9d3b2544c5b0fe364070d55b469e516", + sha256 = "92ccac902368775319b20be10391af5bedea533c782f373f8b88620ceb919d08", + git_commit = "76c2a2512c3fefe065415e338a98c1043acbb131", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 451a1a0908ecd8259736afcbfb0872a297c7c2af Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 17 Jan 2019 15:01:47 -0800 Subject: [PATCH 2203/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229824424 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ba3ad4fedfb..e168fc10770 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "92ccac902368775319b20be10391af5bedea533c782f373f8b88620ceb919d08", - git_commit = "76c2a2512c3fefe065415e338a98c1043acbb131", + sha256 = "f4725c813ca7787f7de59305fa7d4080bde7dc32be633c143531e5f30b4c9919", + git_commit = "8879131afb5e0470279a838f4b47bb969a361cf2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c5f1c154a91e0291caf14f07d7ecf15251cca7bf Mon Sep 17 00:00:00 2001 From: laigd Date: Thu, 17 Jan 2019 15:57:19 -0800 Subject: [PATCH 2204/8103] Upgrade to CUDA 10 and TRT 5.0 for TF Serving docker build. Fixes https://github.com/tensorflow/serving/issues/1195 PiperOrigin-RevId: 229833975 --- .../tools/docker/Dockerfile.devel-gpu | 61 ++++++++----------- .../tools/docker/Dockerfile.gpu | 38 ++++++------ 2 files changed, 42 insertions(+), 57 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index ab988983cb1..b026b69f787 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -11,7 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -FROM nvidia/cuda:9.0-base-ubuntu16.04 as base_build +FROM nvidia/cuda:10.0-base-ubuntu16.04 as base_build ARG TF_SERVING_VERSION_GIT_BRANCH=master ARG TF_SERVING_VERSION_GIT_COMMIT=head @@ -20,31 +20,28 @@ LABEL maintainer=gvasudevan@google.com LABEL tensorflow_serving_github_branchtag=${TF_SERVING_VERSION_GIT_BRANCH} LABEL tensorflow_serving_github_commit=${TF_SERVING_VERSION_GIT_COMMIT} -ENV NCCL_VERSION=2.2.13 -ENV CUDNN_VERSION=7.2.1.38 -ENV TF_TENSORRT_VERSION=4.1.2 +ENV CUDNN_VERSION=7.4.1.5 +ENV TF_TENSORRT_VERSION=5.0.2 RUN apt-get update && apt-get install -y --no-install-recommends \ automake \ build-essential \ ca-certificates \ - cuda-command-line-tools-9-0 \ - cuda-cublas-dev-9-0 \ - cuda-cudart-dev-9-0 \ - cuda-cufft-dev-9-0 \ - cuda-curand-dev-9-0 \ - cuda-cusolver-dev-9-0 \ - cuda-cusparse-dev-9-0 \ + cuda-command-line-tools-10-0 \ + cuda-cublas-dev-10-0 \ + cuda-cudart-dev-10-0 \ + cuda-cufft-dev-10-0 \ + cuda-curand-dev-10-0 \ + cuda-cusolver-dev-10-0 \ + cuda-cusparse-dev-10-0 \ curl \ git \ libfreetype6-dev \ libpng12-dev \ libtool \ - libcudnn7=${CUDNN_VERSION}-1+cuda9.0 \ - libcudnn7-dev=${CUDNN_VERSION}-1+cuda9.0 \ + libcudnn7=${CUDNN_VERSION}-1+cuda10.0 \ + libcudnn7-dev=${CUDNN_VERSION}-1+cuda10.0 \ libcurl3-dev \ - libnccl2=${NCCL_VERSION}-1+cuda9.0 \ - libnccl-dev=${NCCL_VERSION}-1+cuda9.0 \ libzmq3-dev \ mlocate \ openjdk-8-jdk\ @@ -60,23 +57,22 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* && \ - find /usr/local/cuda-9.0/lib64/ -type f -name 'lib*_static.a' -not -name 'libcudart_static.a' -delete && \ + find /usr/local/cuda-10.0/lib64/ -type f -name 'lib*_static.a' -not -name 'libcudart_static.a' -delete && \ rm /usr/lib/x86_64-linux-gnu/libcudnn_static_v7.a -# The 'apt-get install' of nvinfer-runtime-trt-repo-ubuntu1604-4.0.1-ga-cuda9.0 -# adds a new list which contains libnvinfer library, so it needs another -# 'apt-get update' to retrieve that list before it can actually install the -# library. +# The 'apt-get install' of the nvinfer-runtime-trt-repo-* library adds a new +# list which contains libnvinfer library, so it needs another 'apt-get update' +# to retrieve that list before it can actually install the library. RUN apt-get update && \ apt-get install --no-install-recommends \ - nvinfer-runtime-trt-repo-ubuntu1604-4.0.1-ga-cuda9.0 && \ + nvinfer-runtime-trt-repo-ubuntu1604-${TF_TENSORRT_VERSION}-ga-cuda10.0 && \ apt-get update && \ apt-get install --no-install-recommends \ - libnvinfer4=${TF_TENSORRT_VERSION}-1+cuda9.0 \ - libnvinfer-dev=${TF_TENSORRT_VERSION}-1+cuda9.0 && \ + libnvinfer5=${TF_TENSORRT_VERSION}-1+cuda10.0 \ + libnvinfer-dev=${TF_TENSORRT_VERSION}-1+cuda10.0 && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* && \ - rm /usr/lib/x86_64-linux-gnu/libnvinfer.a && \ + rm /usr/lib/x86_64-linux-gnu/libnvinfer_static.a && \ rm /usr/lib/x86_64-linux-gnu/libnvinfer_plugin* && \ rm /usr/lib/x86_64-linux-gnu/libnvcaffe_parser* && \ rm /usr/lib/x86_64-linux-gnu/libnvparsers* @@ -123,18 +119,9 @@ RUN mkdir /usr/lib/x86_64-linux-gnu/include/ && \ ln -s /usr/lib/x86_64-linux-gnu/libcudnn.so /usr/local/cuda/lib64/libcudnn.so && \ ln -s /usr/lib/x86_64-linux-gnu/libcudnn.so.${TF_CUDNN_VERSION} /usr/local/cuda/lib64/libcudnn.so.${TF_CUDNN_VERSION} -# NCCL 2.x -ENV TF_NCCL_VERSION=2 -ENV NCCL_INSTALL_PATH=/usr/lib/nccl/lib -ENV NCCL_HDR_PATH=/usr/lib/nccl/include - -# Fix paths so that NCCL can be found -WORKDIR / -RUN mkdir -p ${NCCL_INSTALL_PATH} && \ - mkdir -p ${NCCL_HDR_PATH} && \ - ln -s /usr/include/nccl.h ${NCCL_HDR_PATH}/nccl.h && \ - ln -s /usr/lib/x86_64-linux-gnu/libnccl.so ${NCCL_INSTALL_PATH}/libnccl.so && \ - ln -s /usr/lib/x86_64-linux-gnu/libnccl.so.${TF_NCCL_VERSION} ${NCCL_INSTALL_PATH}/libnccl.so.${TF_NCCL_VERSION} +# For backward compatibility we need this line. After 1.13 we can safely remove +# it. +ENV TF_NCCL_VERSION= # Set TMP for nvidia build environment ENV TMP="/tmp" @@ -181,4 +168,4 @@ FROM binary_build as clean_build # Clean up Bazel cache when done. RUN bazel clean --expunge --color=yes && \ rm -rf /root/.cache -CMD ["/bin/bash"] \ No newline at end of file +CMD ["/bin/bash"] diff --git a/tensorflow_serving/tools/docker/Dockerfile.gpu b/tensorflow_serving/tools/docker/Dockerfile.gpu index 1d13b5c7214..bab9f06d112 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.gpu @@ -16,7 +16,7 @@ ARG TF_SERVING_VERSION=latest ARG TF_SERVING_BUILD_IMAGE=tensorflow/serving:${TF_SERVING_VERSION}-devel-gpu FROM ${TF_SERVING_BUILD_IMAGE} as build_image -FROM nvidia/cuda:9.0-base-ubuntu16.04 +FROM nvidia/cuda:10.0-base-ubuntu16.04 ARG TF_SERVING_VERSION_GIT_BRANCH=master ARG TF_SERVING_VERSION_GIT_COMMIT=head @@ -25,38 +25,36 @@ LABEL maintainer="gvasudevan@google.com" LABEL tensorflow_serving_github_branchtag=${TF_SERVING_VERSION_GIT_BRANCH} LABEL tensorflow_serving_github_commit=${TF_SERVING_VERSION_GIT_COMMIT} -ENV NCCL_VERSION=2.2.13 -ENV CUDNN_VERSION=7.2.1.38 -ENV TF_TENSORRT_VERSION=4.1.2 +ENV CUDNN_VERSION=7.4.1.5 +ENV TF_TENSORRT_VERSION=5.0.2 RUN apt-get update && apt-get install -y --no-install-recommends \ ca-certificates \ - cuda-command-line-tools-9-0 \ - cuda-command-line-tools-9-0 \ - cuda-cublas-9-0 \ - cuda-cufft-9-0 \ - cuda-curand-9-0 \ - cuda-cusolver-9-0 \ - cuda-cusparse-9-0 \ - libcudnn7=${CUDNN_VERSION}-1+cuda9.0 \ - libnccl2=${NCCL_VERSION}-1+cuda9.0 \ + cuda-command-line-tools-10-0 \ + cuda-command-line-tools-10-0 \ + cuda-cublas-10-0 \ + cuda-cufft-10-0 \ + cuda-curand-10-0 \ + cuda-cusolver-10-0 \ + cuda-cusparse-10-0 \ + libcudnn7=${CUDNN_VERSION}-1+cuda10.0 \ libgomp1 \ && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* -# The 'apt-get install' of nvinfer-runtime-trt-repo-ubuntu1604-4.0.1-ga-cuda9.0 -# adds a new list which contains libnvinfer library, so it needs another -# 'apt-get update' to retrieve that list before it can actually install the -# library. +# The 'apt-get install' of nvinfer-runtime-trt-repo-* library adds a new list +# which contains libnvinfer library, so it needs another 'apt-get update' to +# retrieve that list before it can actually install the library. +# # We don't install libnvinfer-dev since we don't need to build against TensorRT, -# and libnvinfer4 doesn't contain libnvinfer.a static library. +# and libnvinfer4 doesn't contain libnvinfer_static.a static library. RUN apt-get update && \ apt-get install --no-install-recommends \ - nvinfer-runtime-trt-repo-ubuntu1604-4.0.1-ga-cuda9.0 && \ + nvinfer-runtime-trt-repo-ubuntu1604-${TF_TENSORRT_VERSION}-ga-cuda10.0 && \ apt-get update && \ apt-get install --no-install-recommends \ - libnvinfer4=${TF_TENSORRT_VERSION}-1+cuda9.0 && \ + libnvinfer5=${TF_TENSORRT_VERSION}-1+cuda10.0 && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* && \ rm /usr/lib/x86_64-linux-gnu/libnvinfer_plugin* && \ From ed79837a99ab2c0811007373d84e2694d916a0d7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 17 Jan 2019 16:02:12 -0800 Subject: [PATCH 2205/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229834886 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e168fc10770..d18df9e8a7b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f4725c813ca7787f7de59305fa7d4080bde7dc32be633c143531e5f30b4c9919", - git_commit = "8879131afb5e0470279a838f4b47bb969a361cf2", + sha256 = "777aba2efb5ca76b553eed1f4a0356644751ca09fa0412d1f1b3745f9150b769", + git_commit = "ee0cc9c80dfbc52ce63dea5e9bd9d789bdbb4893", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From dbb25a214b1bf16cc43c3fc42c0d5e11f6523da5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 17 Jan 2019 17:01:57 -0800 Subject: [PATCH 2206/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229844579 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d18df9e8a7b..e017c253d32 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "777aba2efb5ca76b553eed1f4a0356644751ca09fa0412d1f1b3745f9150b769", - git_commit = "ee0cc9c80dfbc52ce63dea5e9bd9d789bdbb4893", + sha256 = "7037aaa1e520af45476f6d5c65738666c5f234dfb7464aa6f75256c5b35e33cb", + git_commit = "28401a50f1839f44c76f7b202c8766ecb61fc569", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ecda9e713de59e1eaa2fbf9c91e2f8e246fce76e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 17 Jan 2019 18:03:21 -0800 Subject: [PATCH 2207/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229852951 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e017c253d32..6f59c90c200 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7037aaa1e520af45476f6d5c65738666c5f234dfb7464aa6f75256c5b35e33cb", - git_commit = "28401a50f1839f44c76f7b202c8766ecb61fc569", + sha256 = "81ef80cef65487e9962e7107189db12273ee9bb8de68c9f57f5675da96828d88", + git_commit = "ef10203524cd332afb96ce0fcd3a911654d40284", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 884661843bc04cefe0cba66c1113a7a28dba2776 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 17 Jan 2019 19:02:59 -0800 Subject: [PATCH 2208/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229859107 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6f59c90c200..17860fc874a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "81ef80cef65487e9962e7107189db12273ee9bb8de68c9f57f5675da96828d88", - git_commit = "ef10203524cd332afb96ce0fcd3a911654d40284", + sha256 = "38eb9a323d9662c6ab15a215365b33cd90e9cc418827123e2b6541cb39ce56fc", + git_commit = "4e8bf7f9ca79e085c37c5d2d3a32c7f409faf999", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From faf6e5219694afb16c2323c198bb8715ec689da1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 17 Jan 2019 20:02:46 -0800 Subject: [PATCH 2209/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229864355 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 17860fc874a..c26907643d7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "38eb9a323d9662c6ab15a215365b33cd90e9cc418827123e2b6541cb39ce56fc", - git_commit = "4e8bf7f9ca79e085c37c5d2d3a32c7f409faf999", + sha256 = "4608c212eb089a020493299974f45ed8a59aa592a99c08eefa8e6b4b13a77fa1", + git_commit = "79aeb13673a9107e76622fbc3181a92b398bee28", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0c270a289f18492d7e2abcffe5bc1a16bceda9bc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 17 Jan 2019 21:02:43 -0800 Subject: [PATCH 2210/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229869428 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c26907643d7..513ce983aeb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4608c212eb089a020493299974f45ed8a59aa592a99c08eefa8e6b4b13a77fa1", - git_commit = "79aeb13673a9107e76622fbc3181a92b398bee28", + sha256 = "e96dbdf58192ab5b9a86f373061e3cd6b1ff0ac5264d10f896959bfd6bfe0c28", + git_commit = "a33ceb20cfa9af339e79ce814d3eb849b68e8398", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From dcabd895cfe9c66545b3b765b3a857a1670f2027 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 17 Jan 2019 23:02:59 -0800 Subject: [PATCH 2211/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229878381 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 513ce983aeb..8522cc89564 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e96dbdf58192ab5b9a86f373061e3cd6b1ff0ac5264d10f896959bfd6bfe0c28", - git_commit = "a33ceb20cfa9af339e79ce814d3eb849b68e8398", + sha256 = "95933d55774b7f9cf700b9640799a55730e0f7ac320df5c7de5b186eb94816f1", + git_commit = "a45e7253c19ec04cbbc116ceda4052a018d9cc09", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 381f3cfad83644c29f642c08aa713162e31565bb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 18 Jan 2019 00:02:54 -0800 Subject: [PATCH 2212/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229882428 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8522cc89564..362d792c54e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "95933d55774b7f9cf700b9640799a55730e0f7ac320df5c7de5b186eb94816f1", - git_commit = "a45e7253c19ec04cbbc116ceda4052a018d9cc09", + sha256 = "ad95311aebf46c4bf9e3985595d0c8ff2f6c973578b6c05c4b264713fa71679c", + git_commit = "a3335403457d1005f5bd556f740a2dd4324edf60", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6191b2951f65939f793ee81bd90404d4272270cd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 18 Jan 2019 01:02:42 -0800 Subject: [PATCH 2213/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229888174 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 362d792c54e..ef5421be050 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ad95311aebf46c4bf9e3985595d0c8ff2f6c973578b6c05c4b264713fa71679c", - git_commit = "a3335403457d1005f5bd556f740a2dd4324edf60", + sha256 = "c15ebd889b91eb26731b126725621a4d6566850040fac3a7d5f17f7084822bd2", + git_commit = "0f26909a5a33e2ae265ce550bf5ddba734d2f0d9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4b11ae6e0c620f59549fc65e743b299bde1d393b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 18 Jan 2019 02:03:06 -0800 Subject: [PATCH 2214/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229895811 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ef5421be050..fc5bef13552 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c15ebd889b91eb26731b126725621a4d6566850040fac3a7d5f17f7084822bd2", - git_commit = "0f26909a5a33e2ae265ce550bf5ddba734d2f0d9", + sha256 = "aa0af3e19fd7551eb95e7e16645c5b15a34ac2bd9ae07f95fedb3506f3f338e2", + git_commit = "d29b2faa5fe9c79679171bcafe930b819f74dca5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 68188e1ecbfda88e7303b9b63963b1a6be1fad38 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 18 Jan 2019 03:02:48 -0800 Subject: [PATCH 2215/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229901152 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fc5bef13552..3bf891af477 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "aa0af3e19fd7551eb95e7e16645c5b15a34ac2bd9ae07f95fedb3506f3f338e2", - git_commit = "d29b2faa5fe9c79679171bcafe930b819f74dca5", + sha256 = "4938c9697b8ce31332e4c676b22b5a497cbab0d1587f5249f52c6a7e5dd9fe56", + git_commit = "815d49bb5855f121707b2a5b03656a18e22062f6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7c0205addf6cda08b21e0de9836214fa0e635b43 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 18 Jan 2019 04:02:43 -0800 Subject: [PATCH 2216/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229906166 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3bf891af477..14169f8f86a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4938c9697b8ce31332e4c676b22b5a497cbab0d1587f5249f52c6a7e5dd9fe56", - git_commit = "815d49bb5855f121707b2a5b03656a18e22062f6", + sha256 = "a1db38f0f469195f920ff6651b31d4f75d8855431b91cba5eaccd069c830e824", + git_commit = "c188ec5ca9481fe35ce8420fa12d60a62b30c82c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2c95c7d3d1450a2ab4afb5386f8796320d31a3ff Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 18 Jan 2019 07:02:45 -0800 Subject: [PATCH 2217/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229923560 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 14169f8f86a..cb3ea25c10f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a1db38f0f469195f920ff6651b31d4f75d8855431b91cba5eaccd069c830e824", - git_commit = "c188ec5ca9481fe35ce8420fa12d60a62b30c82c", + sha256 = "1f2cf6b843b5931c81fc504435b1e3463a9e4c0dffa83716c559170c3f799e3d", + git_commit = "c861dc1dcfb1c9f6182335b3fbd611a1e225e8cd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f06310d66ec1b5e69177521c89c1742d135c82e9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 18 Jan 2019 08:03:14 -0800 Subject: [PATCH 2218/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229929092 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cb3ea25c10f..7b95253622e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1f2cf6b843b5931c81fc504435b1e3463a9e4c0dffa83716c559170c3f799e3d", - git_commit = "c861dc1dcfb1c9f6182335b3fbd611a1e225e8cd", + sha256 = "359da31a4a9b84f59e66347789ccf4bb369be7f9de0b072809327b1357de4f3c", + git_commit = "faad607b60e6bed6e780a2ac93afcdfc96f01429", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 455bc7ad173901fab1e0bf5daf6762ff48443bf5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 18 Jan 2019 09:02:47 -0800 Subject: [PATCH 2219/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229937559 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7b95253622e..8c95f4efce3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "359da31a4a9b84f59e66347789ccf4bb369be7f9de0b072809327b1357de4f3c", - git_commit = "faad607b60e6bed6e780a2ac93afcdfc96f01429", + sha256 = "919b241eed69e57c3840e42756b2f1f57e04fd501d3189926cacfde2c873d8f3", + git_commit = "f6b81f458da1f7b68e06c6a4501c5c380d33d590", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e480a07e23978894d8b20b3e6870ace78403a3c2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 18 Jan 2019 10:03:20 -0800 Subject: [PATCH 2220/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229947010 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8c95f4efce3..ac2a234102b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "919b241eed69e57c3840e42756b2f1f57e04fd501d3189926cacfde2c873d8f3", - git_commit = "f6b81f458da1f7b68e06c6a4501c5c380d33d590", + sha256 = "9a7e34ff9a691dfa238668fc6306691c50a8c9a8c1751c232d35a78447a70cdc", + git_commit = "8eafc6c7941e8488db6452af68851a6f531528d9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 39057e70002c23202ff9949f166b4d8cd1986494 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 18 Jan 2019 11:04:06 -0800 Subject: [PATCH 2221/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229958690 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ac2a234102b..cf49c300818 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9a7e34ff9a691dfa238668fc6306691c50a8c9a8c1751c232d35a78447a70cdc", - git_commit = "8eafc6c7941e8488db6452af68851a6f531528d9", + sha256 = "03be6bdf22db0a0b13746ed99a109aad7bbe0f2637a2a845c14e7fdc03607986", + git_commit = "26f4194fe4c26ea723e7828091801846fad44487", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 846d443bb506f07242cd99347901f3ad5b7efe6a Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Fri, 18 Jan 2019 11:09:26 -0800 Subject: [PATCH 2222/8103] Update Python 2 scripts to be compatible with both Python 2 and 3? PiperOrigin-RevId: 229959686 --- tensorflow_serving/example/resnet_client.py | 8 +- tensorflow_serving/model_servers/BUILD | 3 + .../tensorflow_model_server_beta_grpc_test.py | 98 +++++++++-------- .../tensorflow_model_server_test.py | 103 ++++++++++-------- .../tensorflow_model_server_test_client.py | 9 +- .../servables/tensorflow/testdata/BUILD | 3 +- .../tensorflow/testdata/export_counter.py | 4 +- 7 files changed, 123 insertions(+), 105 deletions(-) diff --git a/tensorflow_serving/example/resnet_client.py b/tensorflow_serving/example/resnet_client.py index d4ec0825f7d..95a892b0215 100644 --- a/tensorflow_serving/example/resnet_client.py +++ b/tensorflow_serving/example/resnet_client.py @@ -48,18 +48,18 @@ def main(): dl_request.raise_for_status() # Compose a JSON Predict request (send JPEG image in base64). - predict_request = '{"instances" : [{"b64": "%s"}]}' % base64.b64encode( - dl_request.content) + jpeg_bytes = base64.b64encode(dl_request.content).decode('utf-8') + predict_request = '{"instances" : [{"b64": "%s"}]}' % jpeg_bytes # Send few requests to warm-up the model. - for _ in xrange(3): + for _ in range(3): response = requests.post(SERVER_URL, data=predict_request) response.raise_for_status() # Send few actual requests and report average latency. total_time = 0 num_requests = 10 - for _ in xrange(num_requests): + for _ in range(num_requests): response = requests.post(SERVER_URL, data=predict_request) response.raise_for_status() total_time += response.elapsed.total_seconds() diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 3f4c7aae2d9..9d8a2f2c875 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -395,10 +395,12 @@ py_test( "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_three/00000123/variables/variables.index", "@org_tensorflow//tensorflow/cc/saved_model:saved_model_half_plus_two", ], + srcs_version = "PY2AND3", deps = [ "//tensorflow_serving/apis:model_service_proto_py_pb2", "//tensorflow_serving/apis:prediction_service_proto_py_pb2", "@org_tensorflow//tensorflow:tensorflow_py", + "@six_archive//:six", ], ) @@ -416,6 +418,7 @@ py_test( "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_three/00000123/variables/variables.data-00000-of-00001", "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_three/00000123/variables/variables.index", ], + srcs_version = "PY2AND3", tags = ["notsan"], deps = [ "//tensorflow_serving/apis:prediction_service_proto_py_pb2", diff --git a/tensorflow_serving/model_servers/tensorflow_model_server_beta_grpc_test.py b/tensorflow_serving/model_servers/tensorflow_model_server_beta_grpc_test.py index 00a9b32fb39..ac8d31a2c03 100644 --- a/tensorflow_serving/model_servers/tensorflow_model_server_beta_grpc_test.py +++ b/tensorflow_serving/model_servers/tensorflow_model_server_beta_grpc_test.py @@ -16,6 +16,10 @@ #!/usr/bin/env python2.7 """Minimal sanity tests for tensorflow_model_server with beta gRPC APIs.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + import atexit import os import shlex @@ -68,7 +72,7 @@ def WaitForServerReady(port): except Exception as e: # pylint: disable=broad-except # Missing model error will have details containing 'Servable' if 'Servable' in e.details(): - print 'Server is ready' + print('Server is ready') break @@ -120,9 +124,9 @@ def RunServer(model_name, if args_key in TensorflowModelServerTest.model_servers_dict: return TensorflowModelServerTest.model_servers_dict[args_key] port = PickUnusedPort() - print('Starting test server on port: {} for model_name: ' - '{}/model_config_file: {}'.format(port, model_name, - model_config_file)) + print(('Starting test server on port: {} for model_name: ' + '{}/model_config_file: {}'.format(port, model_name, + model_config_file))) command = os.path.join( TensorflowModelServerTest.__TestSrcDirPath('model_servers'), 'tensorflow_model_server') @@ -141,10 +145,10 @@ def RunServer(model_name, command += ' --batching_parameters_file=' + batching_parameters_file if grpc_channel_arguments: command += ' --grpc_channel_arguments=' + grpc_channel_arguments - print command + print(command) proc = subprocess.Popen(shlex.split(command), stderr=pipe) atexit.register(proc.kill) - print 'Server started' + print('Server started') if wait_for_server_ready: WaitForServerReady(port) hostports = (proc, 'localhost:' + str(port), None) @@ -184,17 +188,16 @@ def _MakeStub(self, hostport): channel = implementations.insecure_channel(host, int(port)) return prediction_service_pb2.beta_create_PredictionService_stub(channel) - def VerifyPredictRequest(self, - model_server_address, - expected_output, - expected_version, - model_name='default', - specify_output=True, - signature_name= - signature_constants. - DEFAULT_SERVING_SIGNATURE_DEF_KEY): + def VerifyPredictRequest( + self, + model_server_address, + expected_output, + expected_version, + model_name='default', + specify_output=True, + signature_name=signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY): """Send PredictionService.Predict request and verify output.""" - print 'Sending Predict request...' + print('Sending Predict request...') # Prepare request request = predict_pb2.PredictRequest() request.model_spec.name = model_name @@ -211,8 +214,8 @@ def VerifyPredictRequest(self, # Verify response self.assertTrue('y' in result.outputs) self.assertIs(types_pb2.DT_FLOAT, result.outputs['y'].dtype) - self.assertEquals(1, len(result.outputs['y'].float_val)) - self.assertEquals(expected_output, result.outputs['y'].float_val[0]) + self.assertEqual(1, len(result.outputs['y'].float_val)) + self.assertEqual(expected_output, result.outputs['y'].float_val[0]) self._VerifyModelSpec(result.model_spec, request.model_spec.name, signature_name, expected_version) @@ -251,11 +254,8 @@ def _GetGoodModelConfigFile(self): """Returns a path to a working configuration file.""" return os.path.join(self.temp_dir, 'good_model_config.conf') - def _VerifyModelSpec(self, - actual_model_spec, - exp_model_name, - exp_signature_name, - exp_version): + def _VerifyModelSpec(self, actual_model_spec, exp_model_name, + exp_signature_name, exp_version): """Verifies model_spec matches expected model name, signature, version. Args: @@ -267,9 +267,9 @@ def _VerifyModelSpec(self, Returns: None. """ - self.assertEquals(actual_model_spec.name, exp_model_name) - self.assertEquals(actual_model_spec.signature_name, exp_signature_name) - self.assertEquals(actual_model_spec.version.value, exp_version) + self.assertEqual(actual_model_spec.name, exp_model_name) + self.assertEqual(actual_model_spec.signature_name, exp_signature_name) + self.assertEqual(actual_model_spec.version.value, exp_version) def testClassify(self): """Test PredictionService.Classify implementation.""" @@ -277,7 +277,7 @@ def testClassify(self): model_server_address = TensorflowModelServerTest.RunServer( 'default', model_path)[1] - print 'Sending Classify request...' + print('Sending Classify request...') # Prepare request request = classification_pb2.ClassificationRequest() request.model_spec.name = 'default' @@ -290,11 +290,11 @@ def testClassify(self): result = self._MakeStub(model_server_address).Classify(request, RPC_TIMEOUT) # Verify response - self.assertEquals(1, len(result.result.classifications)) - self.assertEquals(1, len(result.result.classifications[0].classes)) + self.assertEqual(1, len(result.result.classifications)) + self.assertEqual(1, len(result.result.classifications[0].classes)) expected_output = 3.0 - self.assertEquals(expected_output, - result.result.classifications[0].classes[0].score) + self.assertEqual(expected_output, + result.result.classifications[0].classes[0].score) self._VerifyModelSpec(result.model_spec, request.model_spec.name, request.model_spec.signature_name, self._GetModelVersion(model_path)) @@ -305,7 +305,7 @@ def testRegress(self): model_server_address = TensorflowModelServerTest.RunServer( 'default', model_path)[1] - print 'Sending Regress request...' + print('Sending Regress request...') # Prepare request request = regression_pb2.RegressionRequest() request.model_spec.name = 'default' @@ -318,9 +318,9 @@ def testRegress(self): result = self._MakeStub(model_server_address).Regress(request, RPC_TIMEOUT) # Verify response - self.assertEquals(1, len(result.result.regressions)) + self.assertEqual(1, len(result.result.regressions)) expected_output = 3.0 - self.assertEquals(expected_output, result.result.regressions[0].value) + self.assertEqual(expected_output, result.result.regressions[0].value) self._VerifyModelSpec(result.model_spec, request.model_spec.name, request.model_spec.signature_name, self._GetModelVersion(model_path)) @@ -331,7 +331,7 @@ def testMultiInference(self): model_server_address = TensorflowModelServerTest.RunServer( 'default', model_path)[1] - print 'Sending MultiInference request...' + print('Sending MultiInference request...') # Prepare request request = inference_pb2.MultiInferenceRequest() request.tasks.add().model_spec.name = 'default' @@ -349,13 +349,14 @@ def testMultiInference(self): request, RPC_TIMEOUT) # Verify response - self.assertEquals(2, len(result.results)) + self.assertEqual(2, len(result.results)) expected_output = 3.0 - self.assertEquals(expected_output, - result.results[0].regression_result.regressions[0].value) - self.assertEquals(expected_output, result.results[ - 1].classification_result.classifications[0].classes[0].score) - for i in xrange(2): + self.assertEqual(expected_output, + result.results[0].regression_result.regressions[0].value) + self.assertEqual( + expected_output, result.results[1].classification_result + .classifications[0].classes[0].score) + for i in range(2): self._VerifyModelSpec(result.results[i].model_spec, request.tasks[i].model_spec.name, request.tasks[i].model_spec.signature_name, @@ -368,12 +369,17 @@ def testPredict(self): 'default', model_path)[1] expected_version = self._GetModelVersion(model_path) signature_name = signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY - self.VerifyPredictRequest(model_server_address, expected_output=3.0, - expected_version=expected_version, - signature_name=signature_name) self.VerifyPredictRequest( - model_server_address, expected_output=3.0, specify_output=False, - expected_version=expected_version, signature_name=signature_name) + model_server_address, + expected_output=3.0, + expected_version=expected_version, + signature_name=signature_name) + self.VerifyPredictRequest( + model_server_address, + expected_output=3.0, + specify_output=False, + expected_version=expected_version, + signature_name=signature_name) if __name__ == '__main__': diff --git a/tensorflow_serving/model_servers/tensorflow_model_server_test.py b/tensorflow_serving/model_servers/tensorflow_model_server_test.py index 442481133f5..e0308d52d11 100644 --- a/tensorflow_serving/model_servers/tensorflow_model_server_test.py +++ b/tensorflow_serving/model_servers/tensorflow_model_server_test.py @@ -13,9 +13,12 @@ # limitations under the License. # ============================================================================== -#!/usr/bin/env python2.7 """Tests for tensorflow_model_server.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + import atexit import json import os @@ -24,11 +27,12 @@ import subprocess import sys import time -import urllib2 # This is a placeholder for a Google-internal import. import grpc +from six.moves import range +from six.moves import urllib import tensorflow as tf from tensorflow.core.framework import types_pb2 @@ -42,6 +46,7 @@ from tensorflow_serving.apis import prediction_service_pb2_grpc from tensorflow_serving.apis import regression_pb2 + FLAGS = flags.FLAGS RPC_TIMEOUT = 5.0 @@ -73,7 +78,7 @@ def WaitForServerReady(port): except grpc.RpcError as error: # Missing model error will have details containing 'Servable' if 'Servable' in error.details(): - print 'Server is ready' + print('Server is ready') break @@ -81,20 +86,19 @@ def CallREST(url, req, max_attempts=60): """Returns HTTP response body from a REST API call.""" for attempt in range(max_attempts): try: - print 'Attempt {}: Sending request to {} with data:\n{}'.format( - attempt, url, req) - resp = urllib2.urlopen( - urllib2.Request( - url, data=json.dumps(req) if req is not None else None)) + print('Attempt {}: Sending request to {} with data:\n{}'.format( + attempt, url, req)) + json_data = json.dumps(req).encode('utf-8') if req is not None else None + resp = urllib.request.urlopen(urllib.request.Request(url, data=json_data)) resp_data = resp.read() - print 'Received response:\n{}'.format(resp_data) + print('Received response:\n{}'.format(resp_data)) resp.close() return resp_data except Exception as e: # pylint: disable=broad-except - print 'Failed attempt {}. Error: {}'.format(attempt, e) + print('Failed attempt {}. Error: {}'.format(attempt, e)) if attempt == max_attempts - 1: raise - print 'Retrying...' + print('Retrying...') time.sleep(1) @@ -149,9 +153,9 @@ def RunServer(model_name, return TensorflowModelServerTest.model_servers_dict[args_key] port = PickUnusedPort() rest_api_port = PickUnusedPort() - print('Starting test server on port: {} for model_name: ' - '{}/model_config_file: {}'.format(port, model_name, - model_config_file)) + print(('Starting test server on port: {} for model_name: ' + '{}/model_config_file: {}'.format(port, model_name, + model_config_file))) command = os.path.join( TensorflowModelServerTest.__TestSrcDirPath('model_servers'), 'tensorflow_model_server') @@ -175,10 +179,10 @@ def RunServer(model_name, command += ' --batching_parameters_file=' + batching_parameters_file if grpc_channel_arguments: command += ' --grpc_channel_arguments=' + grpc_channel_arguments - print command + print(command) proc = subprocess.Popen(shlex.split(command), stderr=pipe) atexit.register(proc.kill) - print 'Server started' + print('Server started') if wait_for_server_ready: WaitForServerReady(port) hostports = ( @@ -226,7 +230,7 @@ def VerifyPredictRequest(self, signature_constants. DEFAULT_SERVING_SIGNATURE_DEF_KEY): """Send PredictionService.Predict request and verify output.""" - print 'Sending Predict request...' + print('Sending Predict request...') # Prepare request request = predict_pb2.PredictRequest() request.model_spec.name = model_name @@ -244,8 +248,8 @@ def VerifyPredictRequest(self, # Verify response self.assertTrue('y' in result.outputs) self.assertIs(types_pb2.DT_FLOAT, result.outputs['y'].dtype) - self.assertEquals(1, len(result.outputs['y'].float_val)) - self.assertEquals(expected_output, result.outputs['y'].float_val[0]) + self.assertEqual(1, len(result.outputs['y'].float_val)) + self.assertEqual(expected_output, result.outputs['y'].float_val[0]) self._VerifyModelSpec(result.model_spec, request.model_spec.name, signature_name, expected_version) @@ -316,9 +320,9 @@ def _VerifyModelSpec(self, Returns: None. """ - self.assertEquals(actual_model_spec.name, exp_model_name) - self.assertEquals(actual_model_spec.signature_name, exp_signature_name) - self.assertEquals(actual_model_spec.version.value, exp_version) + self.assertEqual(actual_model_spec.name, exp_model_name) + self.assertEqual(actual_model_spec.signature_name, exp_signature_name) + self.assertEqual(actual_model_spec.version.value, exp_version) def testGetModelStatus(self): """Test ModelService.GetModelStatus implementation.""" @@ -326,7 +330,7 @@ def testGetModelStatus(self): model_server_address = TensorflowModelServerTest.RunServer( 'default', model_path)[1] - print 'Sending GetModelStatus request...' + print('Sending GetModelStatus request...') # Send request request = get_model_status_pb2.GetModelStatusRequest() request.model_spec.name = 'default' @@ -334,10 +338,10 @@ def testGetModelStatus(self): stub = model_service_pb2_grpc.ModelServiceStub(channel) result = stub.GetModelStatus(request, RPC_TIMEOUT) # 5 secs timeout # Verify response - self.assertEquals(1, len(result.model_version_status)) - self.assertEquals(123, result.model_version_status[0].version) + self.assertEqual(1, len(result.model_version_status)) + self.assertEqual(123, result.model_version_status[0].version) # OK error code (0) indicates no error occurred - self.assertEquals(0, result.model_version_status[0].status.error_code) + self.assertEqual(0, result.model_version_status[0].status.error_code) def testClassify(self): """Test PredictionService.Classify implementation.""" @@ -345,7 +349,7 @@ def testClassify(self): model_server_address = TensorflowModelServerTest.RunServer( 'default', model_path)[1] - print 'Sending Classify request...' + print('Sending Classify request...') # Prepare request request = classification_pb2.ClassificationRequest() request.model_spec.name = 'default' @@ -359,11 +363,11 @@ def testClassify(self): stub = prediction_service_pb2_grpc.PredictionServiceStub(channel) result = stub.Classify(request, RPC_TIMEOUT) # 5 secs timeout # Verify response - self.assertEquals(1, len(result.result.classifications)) - self.assertEquals(1, len(result.result.classifications[0].classes)) + self.assertEqual(1, len(result.result.classifications)) + self.assertEqual(1, len(result.result.classifications[0].classes)) expected_output = 3.0 - self.assertEquals(expected_output, - result.result.classifications[0].classes[0].score) + self.assertEqual(expected_output, + result.result.classifications[0].classes[0].score) self._VerifyModelSpec(result.model_spec, request.model_spec.name, request.model_spec.signature_name, self._GetModelVersion(model_path)) @@ -374,7 +378,7 @@ def testRegress(self): model_server_address = TensorflowModelServerTest.RunServer( 'default', model_path)[1] - print 'Sending Regress request...' + print('Sending Regress request...') # Prepare request request = regression_pb2.RegressionRequest() request.model_spec.name = 'default' @@ -388,9 +392,9 @@ def testRegress(self): stub = prediction_service_pb2_grpc.PredictionServiceStub(channel) result = stub.Regress(request, RPC_TIMEOUT) # 5 secs timeout # Verify response - self.assertEquals(1, len(result.result.regressions)) + self.assertEqual(1, len(result.result.regressions)) expected_output = 3.0 - self.assertEquals(expected_output, result.result.regressions[0].value) + self.assertEqual(expected_output, result.result.regressions[0].value) self._VerifyModelSpec(result.model_spec, request.model_spec.name, request.model_spec.signature_name, self._GetModelVersion(model_path)) @@ -401,7 +405,7 @@ def testMultiInference(self): model_server_address = TensorflowModelServerTest.RunServer( 'default', model_path)[1] - print 'Sending MultiInference request...' + print('Sending MultiInference request...') # Prepare request request = inference_pb2.MultiInferenceRequest() request.tasks.add().model_spec.name = 'default' @@ -420,13 +424,14 @@ def testMultiInference(self): result = stub.MultiInference(request, RPC_TIMEOUT) # 5 secs timeout # Verify response - self.assertEquals(2, len(result.results)) + self.assertEqual(2, len(result.results)) expected_output = 3.0 - self.assertEquals(expected_output, - result.results[0].regression_result.regressions[0].value) - self.assertEquals(expected_output, result.results[ - 1].classification_result.classifications[0].classes[0].score) - for i in xrange(2): + self.assertEqual(expected_output, + result.results[0].regression_result.regressions[0].value) + self.assertEqual( + expected_output, result.results[1].classification_result + .classifications[0].classes[0].score) + for i in range(2): self._VerifyModelSpec(result.results[i].model_spec, request.tasks[i].model_spec.name, request.tasks[i].model_spec.signature_name, @@ -529,6 +534,7 @@ def testBadModelConfig(self): error_message = ( 'Invalid protobuf file: \'%s\'') % self._GetBadModelConfigFile() + error_message = error_message.encode('utf-8') self.assertNotEqual(proc.stderr, None) self.assertGreater(proc.stderr.read().find(error_message), -1) @@ -564,7 +570,7 @@ def testClassifyREST(self): self.fail('Request failed with error: {}'.format(e)) # Verify response - self.assertEquals(json.loads(resp_data), {'results': [[['', 3.0]]]}) + self.assertEqual(json.loads(resp_data), {'results': [[['', 3.0]]]}) def testRegressREST(self): """Test Regress implementation over REST API.""" @@ -584,7 +590,7 @@ def testRegressREST(self): self.fail('Request failed with error: {}'.format(e)) # Verify response - self.assertEquals(json.loads(resp_data), {'results': [3.0]}) + self.assertEqual(json.loads(resp_data), {'results': [3.0]}) def testPredictREST(self): """Test Predict implementation over REST API.""" @@ -604,7 +610,7 @@ def testPredictREST(self): self.fail('Request failed with error: {}'.format(e)) # Verify response - self.assertEquals(json.loads(resp_data), {'predictions': [3.0, 3.5, 4.0]}) + self.assertEqual(json.loads(resp_data), {'predictions': [3.0, 3.5, 4.0]}) def testPredictColumnarREST(self): """Test Predict implementation over REST API with columnar inputs.""" @@ -624,7 +630,7 @@ def testPredictColumnarREST(self): self.fail('Request failed with error: {}'.format(e)) # Verify response - self.assertEquals(json.loads(resp_data), {'outputs': [3.0, 3.5, 4.0]}) + self.assertEqual(json.loads(resp_data), {'outputs': [3.0, 3.5, 4.0]}) def testGetStatusREST(self): """Test ModelStatus implementation over REST API with columnar inputs.""" @@ -643,7 +649,7 @@ def testGetStatusREST(self): self.fail('Request failed with error: {}'.format(e)) # Verify response - self.assertEquals( + self.assertEqual( json.loads(resp_data), { 'model_version_status': [{ 'version': '123', @@ -676,7 +682,7 @@ def testGetModelMetadataREST(self): with open(model_metadata_file) as f: expected_metadata = json.load(f) # Verify response - self.assertEquals(json.loads(resp_data), expected_metadata) + self.assertEqual(json.loads(resp_data), expected_metadata) except Exception as e: # pylint: disable=broad-except self.fail('Request failed with error: {}'.format(e)) @@ -699,7 +705,8 @@ def testPrometheusEndpoint(self): self.fail('Request failed with error: {}'.format(e)) # Verify that there should be some metric type information. - self.assertIn('# TYPE', resp_data) + self.assertIn('# TYPE', + resp_data.decode('utf-8') if resp_data is not None else None) if __name__ == '__main__': diff --git a/tensorflow_serving/model_servers/tensorflow_model_server_test_client.py b/tensorflow_serving/model_servers/tensorflow_model_server_test_client.py index f5bcb972036..1bd3617606e 100644 --- a/tensorflow_serving/model_servers/tensorflow_model_server_test_client.py +++ b/tensorflow_serving/model_servers/tensorflow_model_server_test_client.py @@ -12,11 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. # ============================================================================== - -#!/usr/bin/env python2.7 - """Manual test client for tensorflow_model_server.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + # This is a placeholder for a Google-internal import. import grpc @@ -43,7 +44,7 @@ def main(_): # Send request channel = grpc.insecure_channel(FLAGS.server) stub = prediction_service_pb2_grpc.PredictionServiceStub(channel) - print stub.Predict(request, 5.0) # 5 secs timeout + print(stub.Predict(request, 5.0)) # 5 secs timeout if __name__ == '__main__': diff --git a/tensorflow_serving/servables/tensorflow/testdata/BUILD b/tensorflow_serving/servables/tensorflow/testdata/BUILD index 0381e2b2fd8..543637eb666 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/BUILD +++ b/tensorflow_serving/servables/tensorflow/testdata/BUILD @@ -62,7 +62,8 @@ py_binary( srcs = [ "export_counter.py", ], - srcs_version = "PY2AND3", + default_python_version = "PY3", + srcs_version = "PY3", deps = [ "@org_tensorflow//tensorflow:tensorflow_py", ], diff --git a/tensorflow_serving/servables/tensorflow/testdata/export_counter.py b/tensorflow_serving/servables/tensorflow/testdata/export_counter.py index ee1b73914b8..7a304cc1078 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/export_counter.py +++ b/tensorflow_serving/servables/tensorflow/testdata/export_counter.py @@ -40,11 +40,11 @@ def build_signature_def_from_tensors(inputs, outputs, method_name): return tf.saved_model.signature_def_utils.build_signature_def( inputs={ key: tf.saved_model.utils.build_tensor_info(tensor) - for key, tensor in inputs.iteritems() + for key, tensor in inputs.items() }, outputs={ key: tf.saved_model.utils.build_tensor_info(tensor) - for key, tensor in outputs.iteritems() + for key, tensor in outputs.items() }, method_name=method_name) From 3314b43e0b6eff67794398650dedd83a1709643a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 18 Jan 2019 12:02:57 -0800 Subject: [PATCH 2223/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229969600 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cf49c300818..641890b8dae 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "03be6bdf22db0a0b13746ed99a109aad7bbe0f2637a2a845c14e7fdc03607986", - git_commit = "26f4194fe4c26ea723e7828091801846fad44487", + sha256 = "b0845bfd4dafa9d55c08795f39f9733e0bcb07e8005f0c9a4779467927842348", + git_commit = "9f3a726641379b3c11c60693e3fc44c40e71d4fd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0f112a0722c086130dadf8dd9fa6aa1591a47daf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 18 Jan 2019 13:02:54 -0800 Subject: [PATCH 2224/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229979443 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 641890b8dae..8984fd91b57 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b0845bfd4dafa9d55c08795f39f9733e0bcb07e8005f0c9a4779467927842348", - git_commit = "9f3a726641379b3c11c60693e3fc44c40e71d4fd", + sha256 = "435b327eb920bc82a4dfbbc6a5ac8cfaee105b783671de46e96296fc1496c9fb", + git_commit = "b3c326376263f8e1af0d44f29ac1dc6106f699de", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2406e472fc37c263108206eebb068c4a40ab366c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 18 Jan 2019 13:27:38 -0800 Subject: [PATCH 2225/8103] Internal change. PiperOrigin-RevId: 229983604 --- tensorflow_serving/util/net_http/server/public/BUILD | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tensorflow_serving/util/net_http/server/public/BUILD b/tensorflow_serving/util/net_http/server/public/BUILD index 513c88cbc0a..58298449888 100644 --- a/tensorflow_serving/util/net_http/server/public/BUILD +++ b/tensorflow_serving/util/net_http/server/public/BUILD @@ -2,11 +2,14 @@ package( default_visibility = [ + ":http_server_clients", "//tensorflow_serving:internal", "//tensorflow_serving/util/net_http:__subpackages__", ], ) +package_group(name = "http_server_clients") + licenses(["notice"]) # Apache 2.0 cc_library( From a0ba35bc7c7f235d3262ac1ac6bd4f4941e2a86e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 18 Jan 2019 14:02:52 -0800 Subject: [PATCH 2226/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 229990143 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8984fd91b57..e2500a62139 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "435b327eb920bc82a4dfbbc6a5ac8cfaee105b783671de46e96296fc1496c9fb", - git_commit = "b3c326376263f8e1af0d44f29ac1dc6106f699de", + sha256 = "0da6340423a121bacac57ab867b2715c79847d8ba78e6e3bd142cd7324b2372b", + git_commit = "49cd875b9ae1bc9da96871c321010c25e7ae3b32", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4d184321b986d6e0e4dd5aa3257657bff0999527 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 18 Jan 2019 15:03:16 -0800 Subject: [PATCH 2227/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230000744 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e2500a62139..f64f97cedbc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0da6340423a121bacac57ab867b2715c79847d8ba78e6e3bd142cd7324b2372b", - git_commit = "49cd875b9ae1bc9da96871c321010c25e7ae3b32", + sha256 = "ff2445bab558d8870869eb360ee14e4ed7cae5e86ed50506f101a679f78889ed", + git_commit = "916df403fbfc799ac5b6af49a0c1cdf3846e66aa", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7bbcc6d60785d9f5af0bc93139d6ff51bc169a6d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 18 Jan 2019 16:03:09 -0800 Subject: [PATCH 2228/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230010510 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f64f97cedbc..9d5205c52de 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ff2445bab558d8870869eb360ee14e4ed7cae5e86ed50506f101a679f78889ed", - git_commit = "916df403fbfc799ac5b6af49a0c1cdf3846e66aa", + sha256 = "a42524e09fc320dd5ccc848a0e66536be5d69f0e7c0372d30deddcfedbbbb698", + git_commit = "84edc28bcf8cb73f17acd1d267c17d76c417ccfe", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 00aa28201ef325898ec73b1b500b5734ebc5a991 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 18 Jan 2019 17:03:24 -0800 Subject: [PATCH 2229/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230018855 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9d5205c52de..98a49fcdca1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a42524e09fc320dd5ccc848a0e66536be5d69f0e7c0372d30deddcfedbbbb698", - git_commit = "84edc28bcf8cb73f17acd1d267c17d76c417ccfe", + sha256 = "a4b09aa45614fb609214c5f636037447d6b45d198c0c1de3e6df4d6909e319a6", + git_commit = "6108a72eafbbec6a161f70691b9dcef1798dbbbe", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2640526dbab4a1582a7227706b973abae0d95044 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 18 Jan 2019 18:03:11 -0800 Subject: [PATCH 2230/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230025450 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 98a49fcdca1..4d219e15fdd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a4b09aa45614fb609214c5f636037447d6b45d198c0c1de3e6df4d6909e319a6", - git_commit = "6108a72eafbbec6a161f70691b9dcef1798dbbbe", + sha256 = "55839798c6f473e5c6c7fde08a6582020e3a441f5185b5fbbc2e3de32b14a474", + git_commit = "a6924e6affd935f537cdaf8977094df0e15a7957", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3755d134b0ca49a627f4b51c5213d4cb928ca664 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 18 Jan 2019 19:02:57 -0800 Subject: [PATCH 2231/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230029664 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4d219e15fdd..639b3cb85b9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "55839798c6f473e5c6c7fde08a6582020e3a441f5185b5fbbc2e3de32b14a474", - git_commit = "a6924e6affd935f537cdaf8977094df0e15a7957", + sha256 = "9b7f9ac7d3afe1cd5072933d992308b2a7f8ee8a500b6f62db55e080a1a49467", + git_commit = "502ca3eed27ea4b096a707dd88b56d339482a4f6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2ac42482a0746dddfa69988e1190f5768cbef6f0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 18 Jan 2019 20:02:42 -0800 Subject: [PATCH 2232/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230033181 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 639b3cb85b9..df8f1d89e63 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9b7f9ac7d3afe1cd5072933d992308b2a7f8ee8a500b6f62db55e080a1a49467", - git_commit = "502ca3eed27ea4b096a707dd88b56d339482a4f6", + sha256 = "b60465dcfd79986556be0070e53814b4b14468bff6cda62356dfcb56cad1411a", + git_commit = "e2968144a0a1d0344166a7996afc3cedd4381a9d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 72ba27d3ceda63c432ff3d8ec5d0c531335cbae8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 18 Jan 2019 21:02:49 -0800 Subject: [PATCH 2233/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230036615 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index df8f1d89e63..c93f33c6f20 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b60465dcfd79986556be0070e53814b4b14468bff6cda62356dfcb56cad1411a", - git_commit = "e2968144a0a1d0344166a7996afc3cedd4381a9d", + sha256 = "d1c2bb4d619a0e2584c5025136b3a9fc396c073c3a6cb6fe431f771e64bdf712", + git_commit = "467c1c2e215c5481372ba4e685869ae504b9e74f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4c42e63d2a453d90554bf27f8a07a08f0445c899 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 19 Jan 2019 03:02:43 -0800 Subject: [PATCH 2234/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230056928 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c93f33c6f20..b3ab041433e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d1c2bb4d619a0e2584c5025136b3a9fc396c073c3a6cb6fe431f771e64bdf712", - git_commit = "467c1c2e215c5481372ba4e685869ae504b9e74f", + sha256 = "a9b8fcd8e6eadc267ecbb7e4b9db21f007927801cf3553c025c12506c9d1f350", + git_commit = "f52351444551016d7dd949a5aa599da489a97045", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9b2df2de8749ebf312b2aae992f342e0a8602b16 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 19 Jan 2019 16:02:15 -0800 Subject: [PATCH 2235/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230085300 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b3ab041433e..0cf21480a99 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a9b8fcd8e6eadc267ecbb7e4b9db21f007927801cf3553c025c12506c9d1f350", - git_commit = "f52351444551016d7dd949a5aa599da489a97045", + sha256 = "95d96926657b7c599aff0cb9369d0ce28b3052201511f9ecb5e4b0ddf105b833", + git_commit = "d28aabb83228524df1b906c66b35bdb5657a59b5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c647b8d439b81c860e6dd82240880f4dbcad727f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 20 Jan 2019 03:02:09 -0800 Subject: [PATCH 2236/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230117326 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0cf21480a99..125378de015 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "95d96926657b7c599aff0cb9369d0ce28b3052201511f9ecb5e4b0ddf105b833", - git_commit = "d28aabb83228524df1b906c66b35bdb5657a59b5", + sha256 = "221aea22ffed5c06f823e0cd8d53812d2042548a8b8820f6f3d172e4f275ce76", + git_commit = "12e86468e2a9b57e636c1d0afcdf3f657f6df0b6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From fe9a143001a0fc34a02d7c2f94bb38f317504614 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 20 Jan 2019 17:01:51 -0800 Subject: [PATCH 2237/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230155238 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 125378de015..a9f0a775671 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "221aea22ffed5c06f823e0cd8d53812d2042548a8b8820f6f3d172e4f275ce76", - git_commit = "12e86468e2a9b57e636c1d0afcdf3f657f6df0b6", + sha256 = "10651d66b29d4953c8aba5cb32a74acdd6e3b50c68e814d579b9b4f6ba1d39c4", + git_commit = "eb17145a7e8f8d50418d0238e8dbd445ea2bd1d7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5913efc8a02252de70dfc81c6c42e9024de4055f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 20 Jan 2019 18:01:44 -0800 Subject: [PATCH 2238/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230157955 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a9f0a775671..fa43130086e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "10651d66b29d4953c8aba5cb32a74acdd6e3b50c68e814d579b9b4f6ba1d39c4", - git_commit = "eb17145a7e8f8d50418d0238e8dbd445ea2bd1d7", + sha256 = "230d706119c256da69f46f292466d295fcee3459b6a277f7a79b00ec48c8e7a3", + git_commit = "4f1b0ee65a652743ede11d95a33513588ba7f772", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 526769a41f8d2b1eb1f473509bb554cf6b82a153 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 20 Jan 2019 19:01:59 -0800 Subject: [PATCH 2239/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230161292 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fa43130086e..c4ab872cd67 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "230d706119c256da69f46f292466d295fcee3459b6a277f7a79b00ec48c8e7a3", - git_commit = "4f1b0ee65a652743ede11d95a33513588ba7f772", + sha256 = "660da73e445c509032dbae437fef9ff71fd20820e4cae9a04ae17585c40d258f", + git_commit = "48998029e313b9206daa2d49f55aeb810242361e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From fa9cabf05fea519501de7bab77ca2c4d765f5003 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 21 Jan 2019 00:02:18 -0800 Subject: [PATCH 2240/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230179240 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c4ab872cd67..d9c8009fe98 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "660da73e445c509032dbae437fef9ff71fd20820e4cae9a04ae17585c40d258f", - git_commit = "48998029e313b9206daa2d49f55aeb810242361e", + sha256 = "b6f1a3f7c099fac2cc8e70590d35ea1323689cf7a3eb04aa9295a3e6d3df507a", + git_commit = "e6dbfa1790419a6bd857bdb14240a7f67165fc42", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 56f17399a11e3cb4d0bd233771fdf0a8f50a8110 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 21 Jan 2019 02:01:59 -0800 Subject: [PATCH 2241/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230193479 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d9c8009fe98..520b027a4de 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b6f1a3f7c099fac2cc8e70590d35ea1323689cf7a3eb04aa9295a3e6d3df507a", - git_commit = "e6dbfa1790419a6bd857bdb14240a7f67165fc42", + sha256 = "ffafe0b7135b0e4c5610aa9e86db8be3cb3be33bdbba9e8f61955ab7d9ffb1aa", + git_commit = "858a402b9386ead2026945f0553f95fa84d5c101", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e070dcb44731feeba982e08daf336c7be9d70fac Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 21 Jan 2019 04:02:02 -0800 Subject: [PATCH 2242/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230205242 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 520b027a4de..05a0e148c07 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ffafe0b7135b0e4c5610aa9e86db8be3cb3be33bdbba9e8f61955ab7d9ffb1aa", - git_commit = "858a402b9386ead2026945f0553f95fa84d5c101", + sha256 = "c29fc3518ccb714244101b250e78479cb4ff45ccdc9abbbeebcbc4d3308f4915", + git_commit = "9b271631359c61b3c979cac1c79801b4067ee6b4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2f7b27a2c5c445fa15068f4b442fc920b45aabbb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 21 Jan 2019 07:02:03 -0800 Subject: [PATCH 2243/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230222325 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 05a0e148c07..897a40bcdd3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c29fc3518ccb714244101b250e78479cb4ff45ccdc9abbbeebcbc4d3308f4915", - git_commit = "9b271631359c61b3c979cac1c79801b4067ee6b4", + sha256 = "5b05430c4de7a4872e93304a6e0e07bb628f8e9d92b704f1bd457b6eaa7d0bd3", + git_commit = "d9bdbbdc1a6c94524650549189d76dba5bc5ddc3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 86d7cd3c123d1f3337b70e1281046ac7d36dc6fb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 21 Jan 2019 08:02:27 -0800 Subject: [PATCH 2244/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230227662 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 897a40bcdd3..f73a2a403f5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5b05430c4de7a4872e93304a6e0e07bb628f8e9d92b704f1bd457b6eaa7d0bd3", - git_commit = "d9bdbbdc1a6c94524650549189d76dba5bc5ddc3", + sha256 = "5470cca5a623b53bf6500b0ff59cccc9f5917edfd5038cd9ce023c0245ab637f", + git_commit = "187091a7f9d1390a557d39949134ab08cf497bae", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 19131a307f44c8c32535dac9273e7c24fb316d86 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 21 Jan 2019 09:01:53 -0800 Subject: [PATCH 2245/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230233452 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f73a2a403f5..1d20d332972 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5470cca5a623b53bf6500b0ff59cccc9f5917edfd5038cd9ce023c0245ab637f", - git_commit = "187091a7f9d1390a557d39949134ab08cf497bae", + sha256 = "7206ec5dd05b19ad634846af0e4a8e95799c5123dc7f7c8f75d5aa700033de37", + git_commit = "4bfa2359152e9d106c2c20e9fff67643c8578c81", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2628f3a4c29ec530e84e41de30737a921f8f7d1a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 21 Jan 2019 10:02:10 -0800 Subject: [PATCH 2246/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230238712 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1d20d332972..ada7517925f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7206ec5dd05b19ad634846af0e4a8e95799c5123dc7f7c8f75d5aa700033de37", - git_commit = "4bfa2359152e9d106c2c20e9fff67643c8578c81", + sha256 = "c54bb041cde269ad3a01200372fd583b2b5b182dfe322f64eff84bd8351e2f44", + git_commit = "dad786f9638bc7be6d79e0d4bb087a955d973a6a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8aca1a5c58911d9bc969649f97d6b402f4e4bfbf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 21 Jan 2019 13:01:55 -0800 Subject: [PATCH 2247/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230250769 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ada7517925f..4c5785dc81c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c54bb041cde269ad3a01200372fd583b2b5b182dfe322f64eff84bd8351e2f44", - git_commit = "dad786f9638bc7be6d79e0d4bb087a955d973a6a", + sha256 = "cf4ee86b8f4e737ef6da05eba9394503b68b440c2676efff34cc981985fccebf", + git_commit = "ff91cd691027076e6128afbd902d3d38e3672787", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 883260f089924058008d0cae39d92a1c818133ef Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 21 Jan 2019 22:01:55 -0800 Subject: [PATCH 2248/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230283129 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4c5785dc81c..757ff5a1d15 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cf4ee86b8f4e737ef6da05eba9394503b68b440c2676efff34cc981985fccebf", - git_commit = "ff91cd691027076e6128afbd902d3d38e3672787", + sha256 = "4a25582622258d1e9b061fff5bc424ccf9652b13df5fde40919e0e044a88b51d", + git_commit = "125ecf68ccb6d94dfc2f05d68017e37232ad59c2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 56dbad5f0bc7612c383eba85ab6e39e5603f9bad Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 22 Jan 2019 00:02:04 -0800 Subject: [PATCH 2249/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230291389 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 757ff5a1d15..dbc3f6bba95 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4a25582622258d1e9b061fff5bc424ccf9652b13df5fde40919e0e044a88b51d", - git_commit = "125ecf68ccb6d94dfc2f05d68017e37232ad59c2", + sha256 = "82f21c8ccd4202a6faeaed2fb811571bcce4729b60f16dd2e98702e8f92db337", + git_commit = "58d76bb520d0f10e7008a96789252de52dac18e7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d0badd4cfefb001e59872c746aa5ff6de4fe6974 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 22 Jan 2019 02:02:00 -0800 Subject: [PATCH 2250/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230304020 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dbc3f6bba95..f05ff61d565 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "82f21c8ccd4202a6faeaed2fb811571bcce4729b60f16dd2e98702e8f92db337", - git_commit = "58d76bb520d0f10e7008a96789252de52dac18e7", + sha256 = "3aea52d73abac3a99e5eaf5171ee2e7a32ef6d89ee730248da9f75979bc44697", + git_commit = "f44c86305911b1066d916d2c289a7a429b6f2a69", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c97ebc33f8d93d9c12e68e40e3cbc4d5fe3d9e81 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 22 Jan 2019 07:01:57 -0800 Subject: [PATCH 2251/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230333169 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f05ff61d565..4c7c866d85a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3aea52d73abac3a99e5eaf5171ee2e7a32ef6d89ee730248da9f75979bc44697", - git_commit = "f44c86305911b1066d916d2c289a7a429b6f2a69", + sha256 = "0d8386480f8309d62a6573802aea5960091248fbc3e280cd984daa3e0caf9e39", + git_commit = "4b45dcc63dd043acbe6bb90475d356d2f3149b0c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 34d204504e1787eab5070a348606854400afe163 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 22 Jan 2019 11:02:00 -0800 Subject: [PATCH 2252/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230372361 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4c7c866d85a..0298d08d526 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0d8386480f8309d62a6573802aea5960091248fbc3e280cd984daa3e0caf9e39", - git_commit = "4b45dcc63dd043acbe6bb90475d356d2f3149b0c", + sha256 = "96c7efe0c6477c0bc638a44a293cd438b71cd2c8d977d94b8e438da640a074f0", + git_commit = "80f47caee4bca375b8285e3b3185c7d29113b9e8", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 088bc67fd8e0200db5cf7f4197538367f7df84e2 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Tue, 22 Jan 2019 11:33:43 -0800 Subject: [PATCH 2253/8103] Update setup to fix incorrect flag options Fixes https://github.com/tensorflow/serving/issues/1241 PiperOrigin-RevId: 230379099 --- tensorflow_serving/g3doc/setup.md | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/tensorflow_serving/g3doc/setup.md b/tensorflow_serving/g3doc/setup.md index ccc419e7d45..1bb1a845e18 100644 --- a/tensorflow_serving/g3doc/setup.md +++ b/tensorflow_serving/g3doc/setup.md @@ -167,19 +167,27 @@ tools/run_in_docker.sh bazel build --config=nativeopt tensorflow_serving/... It's also possible to compile using specific instruction sets (e.g. AVX). Wherever you see `bazel build` in the documentation, simply add the -corresponding flag: +corresponding flags: Instruction Set | Flags -------------------------- | ---------------------- -AVX | `--copt=mavx` -AVX2 | `--copt=mavx2` -FMA | `--copt=mfma` -SSE 4.1 | `--copt=msse4.1` -SSE 4.2 | `--copt=msse4.2` +AVX | `--copt=-mavx` +AVX2 | `--copt=-mavx2` +FMA | `--copt=-mfma` +SSE 4.1 | `--copt=-msse4.1` +SSE 4.2 | `--copt=-msse4.2` All supported by processor | `--copt=-march=native` +For example: + +```shell +tools/run_in_docker.sh bazel build --copt=-mavx2 tensorflow_serving/... +``` + Note: These instruction sets are not available on all machines, especially with -older processors. Use `--copt=-march=native` if you're unsure what you need. +older processors. Use the default `--config=nativeopt` to build an optimized +version of TensorFlow Serving for your processor if you are in doubt. + ##### Building with GPU Support From 7fa3f720724f729be6f6b571068dc27455672920 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 22 Jan 2019 12:02:41 -0800 Subject: [PATCH 2254/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230384308 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0298d08d526..57f92cbbb87 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "96c7efe0c6477c0bc638a44a293cd438b71cd2c8d977d94b8e438da640a074f0", - git_commit = "80f47caee4bca375b8285e3b3185c7d29113b9e8", + sha256 = "b468797e6f0ecd4ac75e1bfe2df27747d72eda8a3c0ecafe51b503dc87a697d1", + git_commit = "94ea59c903e00a0ffde07d541aea4a1aee3c563d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1a5fdb4720afaad50a2f29fdd7763a5525b06af5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 22 Jan 2019 13:02:02 -0800 Subject: [PATCH 2255/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230394607 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 57f92cbbb87..b2a45a5431d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b468797e6f0ecd4ac75e1bfe2df27747d72eda8a3c0ecafe51b503dc87a697d1", - git_commit = "94ea59c903e00a0ffde07d541aea4a1aee3c563d", + sha256 = "c1cc39cf5a590a44b19270d593226a753ed7944e8a123c2d0fb12c750ab78253", + git_commit = "79e040fd8a7e09bc4754f4635aed7a3e1a91ce40", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ebb34114c8dfbe9afcdc27eadb3fbf90eebf04d7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 22 Jan 2019 14:02:33 -0800 Subject: [PATCH 2256/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230405929 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b2a45a5431d..61117980834 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c1cc39cf5a590a44b19270d593226a753ed7944e8a123c2d0fb12c750ab78253", - git_commit = "79e040fd8a7e09bc4754f4635aed7a3e1a91ce40", + sha256 = "147cfd9ebe275a5390df16410020f5f4b433ae15048f9421e1ad4b4c6148da9d", + git_commit = "bfcddf733e85c790921afccec4ca80849e9eb9ab", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3bb80268d8440511b95d7e32863b729bdb525c23 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 22 Jan 2019 15:01:56 -0800 Subject: [PATCH 2257/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230417513 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 61117980834..7f371fa2605 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "147cfd9ebe275a5390df16410020f5f4b433ae15048f9421e1ad4b4c6148da9d", - git_commit = "bfcddf733e85c790921afccec4ca80849e9eb9ab", + sha256 = "491c4a915a3c785088fd8c6caf4338567fc05c4d6dc741e64387adc36b1b94b8", + git_commit = "a4d4392677f58eb26eed7e7e8ec7604d3d21335b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5d2dfb047a2cc6e6b00cadee895ad025000c80e7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 22 Jan 2019 16:02:28 -0800 Subject: [PATCH 2258/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230429161 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7f371fa2605..c9b6886592d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "491c4a915a3c785088fd8c6caf4338567fc05c4d6dc741e64387adc36b1b94b8", - git_commit = "a4d4392677f58eb26eed7e7e8ec7604d3d21335b", + sha256 = "0ce292d2734a265bcf18c0ddf4f1554d7ce57c7dbd4378bb824c2a6712991c46", + git_commit = "4e15557ac4c92f219f51ed94883d1e47dca88417", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 51040816de34cd3e155069885f14c8ed23336b3f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 22 Jan 2019 17:01:56 -0800 Subject: [PATCH 2259/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230439994 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c9b6886592d..b1109602ff1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0ce292d2734a265bcf18c0ddf4f1554d7ce57c7dbd4378bb824c2a6712991c46", - git_commit = "4e15557ac4c92f219f51ed94883d1e47dca88417", + sha256 = "86604ec925851901ed2cd4d92f34d724daf4993d49127b206e1f1739be32636c", + git_commit = "632658950c5f3acb1e05bc375bbcff90479934f0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 15c07593d986dd556a4beba211cabd43d5fc4bc8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 22 Jan 2019 18:02:07 -0800 Subject: [PATCH 2260/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230448876 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b1109602ff1..8fb32944800 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "86604ec925851901ed2cd4d92f34d724daf4993d49127b206e1f1739be32636c", - git_commit = "632658950c5f3acb1e05bc375bbcff90479934f0", + sha256 = "bd830e59e999c839ff36800824c726b637025ffe04e0a92f627e39c878f0c6de", + git_commit = "6fa83a643f148c78a9bf4e50a8a7572accde5e09", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5101a0beb1b80fe285d7ffa9c03989aa2041cb9a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 22 Jan 2019 19:02:02 -0800 Subject: [PATCH 2261/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230455391 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8fb32944800..4c587191ccc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bd830e59e999c839ff36800824c726b637025ffe04e0a92f627e39c878f0c6de", - git_commit = "6fa83a643f148c78a9bf4e50a8a7572accde5e09", + sha256 = "2e46c5882c712a47074aa4724cb198d09f1adcb8032dd1a2a083ba99a2b3facc", + git_commit = "09bdeffbcd2c4f8f9c0da8d101eaf9edc1faf54d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 17c707b3f34d96750549b8646b32d1bd40fcfc1d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 22 Jan 2019 21:01:57 -0800 Subject: [PATCH 2262/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230465139 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4c587191ccc..92753864b74 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2e46c5882c712a47074aa4724cb198d09f1adcb8032dd1a2a083ba99a2b3facc", - git_commit = "09bdeffbcd2c4f8f9c0da8d101eaf9edc1faf54d", + sha256 = "46d8f4590beb96d32bcb9b099c1b8132880ceb1a8db5579d5e58f4791f25ddc0", + git_commit = "701ad58880ae7b4d317d0bda5f1497346273b2af", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7df4a8d6b1ccdc050712fc603fcdb7a6820d0dab Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 22 Jan 2019 22:02:04 -0800 Subject: [PATCH 2263/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230469977 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 92753864b74..4139ef3701c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "46d8f4590beb96d32bcb9b099c1b8132880ceb1a8db5579d5e58f4791f25ddc0", - git_commit = "701ad58880ae7b4d317d0bda5f1497346273b2af", + sha256 = "96f042d89769207cf7a18de56bf868d3b6fbaa1ec38ce8a1a9ce8b8beb861a52", + git_commit = "59931a8956263293be02884f195745afa2125246", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 726b4d1ca83478e9097c0446299a0a470e61715b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 22 Jan 2019 23:01:58 -0800 Subject: [PATCH 2264/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230474151 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4139ef3701c..87203a014ae 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "96f042d89769207cf7a18de56bf868d3b6fbaa1ec38ce8a1a9ce8b8beb861a52", - git_commit = "59931a8956263293be02884f195745afa2125246", + sha256 = "7a42bf7f3cff239470f899eeea5e31f413ebd194cf571530d2f2dd1db08f7720", + git_commit = "bba3f6a4e733dfd5865dfb14943624c13a7ba9fd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ee37802437b863b7715c5ad0b5eb9e31b7240c1b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 23 Jan 2019 00:02:09 -0800 Subject: [PATCH 2265/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230479289 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 87203a014ae..b3df452a1d7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7a42bf7f3cff239470f899eeea5e31f413ebd194cf571530d2f2dd1db08f7720", - git_commit = "bba3f6a4e733dfd5865dfb14943624c13a7ba9fd", + sha256 = "cb2acee8e6720d1d5c0b8ddd2086badd9ea2782a270a9bb99f8a5a768047e25a", + git_commit = "76aa6cf917d719183a82d47970a6f98333740420", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f9bf715dc59c03256ed5cb9a5529fca09fc058ff Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 23 Jan 2019 01:02:12 -0800 Subject: [PATCH 2266/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230486181 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b3df452a1d7..2335693d836 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cb2acee8e6720d1d5c0b8ddd2086badd9ea2782a270a9bb99f8a5a768047e25a", - git_commit = "76aa6cf917d719183a82d47970a6f98333740420", + sha256 = "975ba9ede8f398ee8824893a3dbb2fe24427b795777baa73171d52599c42e140", + git_commit = "7cfe43a11d95af0df88bf6e84479b6297df7117f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7a134bab820548e1919e7e3970c6a89386af2736 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 23 Jan 2019 02:02:09 -0800 Subject: [PATCH 2267/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230492575 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2335693d836..ce6d4398e11 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "975ba9ede8f398ee8824893a3dbb2fe24427b795777baa73171d52599c42e140", - git_commit = "7cfe43a11d95af0df88bf6e84479b6297df7117f", + sha256 = "3d56be1a2d17e6ad5f325e9d3437280dc95cb5c038e9370fcd07d106de8605c6", + git_commit = "d072d4d3a638c3764a05cfefa68df5d0d0a80e57", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From cc50de2737ab3fc611cf519d9e15419d8113d9a0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 23 Jan 2019 03:01:59 -0800 Subject: [PATCH 2268/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230498812 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ce6d4398e11..2f5d7411dde 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3d56be1a2d17e6ad5f325e9d3437280dc95cb5c038e9370fcd07d106de8605c6", - git_commit = "d072d4d3a638c3764a05cfefa68df5d0d0a80e57", + sha256 = "66cff9af38cb388881809541c357ff9927b7cf29ccf711ebe14f08a4b8e82727", + git_commit = "2283fefab6fbd77da2388f54ebaf860311742fe2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 82365dac8dc03f0ded3fc3430ccd08220b1a5874 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 23 Jan 2019 05:01:58 -0800 Subject: [PATCH 2269/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230510159 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2f5d7411dde..99d9ed6a93d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "66cff9af38cb388881809541c357ff9927b7cf29ccf711ebe14f08a4b8e82727", - git_commit = "2283fefab6fbd77da2388f54ebaf860311742fe2", + sha256 = "471c68d885e639f3f8f20f8cd9d16fb09eb3591f8d4edfc060458f346efbcf7b", + git_commit = "2691e6746fd96583802a821b202e7fa6316f32c2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5d9ca2b2363297752c3d48f22e523b78e37ecd6e Mon Sep 17 00:00:00 2001 From: robert Date: Wed, 23 Jan 2019 14:14:01 +0000 Subject: [PATCH 2270/8103] Fix mismatched parentheses --- tensorflow_serving/model_servers/main.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index 6353c396b8f..3d0783cc8b2 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -84,7 +84,7 @@ int main(int argc, char** argv) { "used, --model_name, --model_base_path are ignored.)"), tensorflow::Flag("model_name", &options.model_name, "name of model (ignored " - "if --model_config_file flag is set"), + "if --model_config_file flag is set)"), tensorflow::Flag("model_base_path", &options.model_base_path, "path to export (ignored if --model_config_file flag " "is set, otherwise required)"), From e57fd2f3995c7e24c03e6e7521373bcafa83c9f3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 23 Jan 2019 07:02:11 -0800 Subject: [PATCH 2271/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230522615 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 99d9ed6a93d..5776f05bf4d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "471c68d885e639f3f8f20f8cd9d16fb09eb3591f8d4edfc060458f346efbcf7b", - git_commit = "2691e6746fd96583802a821b202e7fa6316f32c2", + sha256 = "22b708e6df5451e6610c929bdec0bbc8c0cfbebe0873fc16a45bd9b7ad13e341", + git_commit = "f3919b99b1e0f8f3efe7634a43731e1dd9c220a0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a11c80ad8b2446b70024d564b74d5c573193fda6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 23 Jan 2019 09:01:54 -0800 Subject: [PATCH 2272/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230539253 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5776f05bf4d..97c843fc867 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "22b708e6df5451e6610c929bdec0bbc8c0cfbebe0873fc16a45bd9b7ad13e341", - git_commit = "f3919b99b1e0f8f3efe7634a43731e1dd9c220a0", + sha256 = "7462e8d25c04e05781e62018e43ec0a9ca46bbb312c1b97488c5578e90de0d98", + git_commit = "4a9ebc33bc2e72a8efc8b360277856f38fd7692d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From cf000bd820077e7e6fa8a57451c88e0b1567261f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20T=C3=B6rh=C3=B6nen?= Date: Thu, 24 Jan 2019 19:33:42 +0200 Subject: [PATCH 2273/8103] Modify based on review --- tensorflow_serving/model_servers/server.cc | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index ca42b84fab7..c65df3daa08 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -264,9 +264,8 @@ Status Server::BuildAndStart(const Options& server_options) { server_address, BuildServerCredentialsFromSSLConfigFile(server_options.ssl_config_file)); // If defined, listen to a UNIX socket for gRPC. - const string grpc_socket_path = server_options.grpc_socket_path; - const string grpc_socket_uri = "unix:" + grpc_socket_path; - if (!grpc_socket_path.empty()) { + if (!server_options.grpc_socket_path.empty()) { + const string grpc_socket_uri = "unix:" + server_options.grpc_socket_path; builder.AddListeningPort( grpc_socket_uri, BuildServerCredentialsFromSSLConfigFile(server_options.ssl_config_file)); @@ -292,9 +291,9 @@ Status Server::BuildAndStart(const Options& server_options) { return errors::InvalidArgument("Failed to BuildAndStart gRPC server"); } LOG(INFO) << "Running gRPC ModelServer at " << server_address << " ..."; - if (!grpc_socket_path.empty()) { + if (!server_options.grpc_socket_path.empty()) { LOG(INFO) << "Running gRPC ModelServer at UNIX socket " - << grpc_socket_uri << "..."; + << server_options.grpc_socket_path << "..."; } if (server_options.http_port != 0) { From 53679016e8336aaed9b001b06afda4898f76de09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20T=C3=B6rh=C3=B6nen?= Date: Thu, 24 Jan 2019 19:38:04 +0200 Subject: [PATCH 2274/8103] Add test for running prediction over domain socket --- .../model_servers/tensorflow_model_server_test.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tensorflow_serving/model_servers/tensorflow_model_server_test.py b/tensorflow_serving/model_servers/tensorflow_model_server_test.py index 090ca0f4245..41a52a319f4 100644 --- a/tensorflow_serving/model_servers/tensorflow_model_server_test.py +++ b/tensorflow_serving/model_servers/tensorflow_model_server_test.py @@ -48,6 +48,7 @@ HTTP_REST_TIMEOUT_MS = 5000 CHANNEL_WAIT_TIMEOUT = 5.0 WAIT_FOR_SERVER_READY_INT_SECS = 60 +GRPC_SOCKET_PATH = "/tmp/tf-serving.sock" def PickUnusedPort(): @@ -158,6 +159,7 @@ def RunServer(model_name, command += ' --port=' + str(port) command += ' --rest_api_port=' + str(rest_api_port) command += ' --rest_api_timeout_in_ms=' + str(HTTP_REST_TIMEOUT_MS) + command += ' --grpc_socket_path=' + GRPC_SOCKET_PATH if model_config_file: command += ' --model_config_file=' + model_config_file @@ -672,6 +674,18 @@ def testPrometheusEndpoint(self): # Verify that there should be some metric type information. self.assertIn('# TYPE', resp_data) + def testPredictUDS(self): + """Test saved model prediction over a Unix domain socket.""" + _ = TensorflowModelServerTest.RunServer( + 'default', + self._GetSavedModelBundlePath()) + model_server_address = "unix:%s" % GRPC_SOCKET_PATH + self.VerifyPredictRequest( + model_server_address, + expected_output=3.0, + specify_output=False, + expected_version=self._GetModelVersion( + self._GetSavedModelHalfPlusThreePath())) if __name__ == '__main__': tf.test.main() From dbab51d80749d3b4ac97ef6f3d7cce6083e53a18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20T=C3=B6rh=C3=B6nen?= Date: Thu, 24 Jan 2019 20:50:15 +0200 Subject: [PATCH 2275/8103] Fix whitespace --- tensorflow_serving/model_servers/server.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index c65df3daa08..dd59d4ccefb 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -293,7 +293,7 @@ Status Server::BuildAndStart(const Options& server_options) { LOG(INFO) << "Running gRPC ModelServer at " << server_address << " ..."; if (!server_options.grpc_socket_path.empty()) { LOG(INFO) << "Running gRPC ModelServer at UNIX socket " - << server_options.grpc_socket_path << "..."; + << server_options.grpc_socket_path << " ..."; } if (server_options.http_port != 0) { From fd1cb87bee1036d7eb5c91b85224ef30141436da Mon Sep 17 00:00:00 2001 From: jtkeeling Date: Thu, 24 Jan 2019 15:17:33 -0800 Subject: [PATCH 2276/8103] Change prometheous_exporter_test to check for substrings instead of equality These tests verify that Prometheus metrics are correctly exported. However the tests previously assumed that no other metrics would be registered and asserted that the test's metrics exactly matched the exported metrics. This change instead verifies that the test's metrics are a subset of the exported metrics. This change was required because TensorFlow recently changed to export additional metrics on graph building time. PiperOrigin-RevId: 230799512 --- tensorflow_serving/util/BUILD | 2 +- tensorflow_serving/util/prometheus_exporter_test.cc | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/tensorflow_serving/util/BUILD b/tensorflow_serving/util/BUILD index 7716baba520..f793ebe81d1 100644 --- a/tensorflow_serving/util/BUILD +++ b/tensorflow_serving/util/BUILD @@ -330,7 +330,7 @@ cc_library( srcs = ["status_util.cc"], hdrs = ["status_util.h"], deps = [ - "//tensorflow_serving/util:status_proto", + ":status_proto", "@org_tensorflow//tensorflow/core:lib", ], ) diff --git a/tensorflow_serving/util/prometheus_exporter_test.cc b/tensorflow_serving/util/prometheus_exporter_test.cc index 847449753c2..435a28844d4 100644 --- a/tensorflow_serving/util/prometheus_exporter_test.cc +++ b/tensorflow_serving/util/prometheus_exporter_test.cc @@ -40,7 +40,7 @@ TEST(PrometheusExporterTest, Counter) { {"# TYPE :test:path:total counter", ":test:path:total{name=\"abc\"} 2"}, "\n"); absl::StrAppend(&expected_result, "\n"); - EXPECT_EQ(http_page, expected_result); + EXPECT_PRED_FORMAT2(testing::IsSubstring, expected_result, http_page); } TEST(PrometheusExporterTest, Gauge) { @@ -56,7 +56,7 @@ TEST(PrometheusExporterTest, Gauge) { ":test:path:gague{x=\"abc\",y=\"def\"} 5"}, "\n"); absl::StrAppend(&expected_result, "\n"); - EXPECT_EQ(http_page, expected_result); + EXPECT_PRED_FORMAT2(testing::IsSubstring, expected_result, http_page); } TEST(PrometheusExporterTest, Histogram) { @@ -87,7 +87,7 @@ TEST(PrometheusExporterTest, Histogram) { ":test:path:histogram_count{status=\"good\"} 3"}, "\n"); absl::StrAppend(&expected_result, "\n"); - EXPECT_EQ(http_page, expected_result); + EXPECT_PRED_FORMAT2(testing::IsSubstring, expected_result, http_page); } TEST(PrometheusExporterTest, SanitizeLabelValue) { @@ -105,7 +105,7 @@ TEST(PrometheusExporterTest, SanitizeLabelValue) { ":test:path:total{name=\"\\\"abc\\\\\\\"\"} 2"}, "\n"); absl::StrAppend(&expected_result, "\n"); - EXPECT_EQ(http_page, expected_result); + EXPECT_PRED_FORMAT2(testing::IsSubstring, expected_result, http_page); } TEST(PrometheusExporterTest, SanitizeLabelName) { @@ -122,7 +122,7 @@ TEST(PrometheusExporterTest, SanitizeLabelName) { ":test:path:total{my_name_1=\"abc\"} 2"}, "\n"); absl::StrAppend(&expected_result, "\n"); - EXPECT_EQ(http_page, expected_result); + EXPECT_PRED_FORMAT2(testing::IsSubstring, expected_result, http_page); } TEST(PrometheusExporterTest, SanitizeMetricName) { @@ -139,7 +139,7 @@ TEST(PrometheusExporterTest, SanitizeMetricName) { "_0:path:total_count{name=\"abc\"} 2"}, "\n"); absl::StrAppend(&expected_result, "\n"); - EXPECT_EQ(http_page, expected_result); + EXPECT_PRED_FORMAT2(testing::IsSubstring, expected_result, http_page); } } // namespace From af054f81d03239886365a0e46d6e22b472acc3fc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 24 Jan 2019 17:01:51 -0800 Subject: [PATCH 2277/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230817394 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 97c843fc867..dd6cd5d794b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7462e8d25c04e05781e62018e43ec0a9ca46bbb312c1b97488c5578e90de0d98", - git_commit = "4a9ebc33bc2e72a8efc8b360277856f38fd7692d", + sha256 = "f78971cbcb80e596c54e83e944203d3402e240b176b6ada6927314955000bc6e", + git_commit = "e40ffed186331743127ddaaccaac5f1c193daa5f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 076316d9fe8f0077e6f65e334ccf4101a2363c96 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 24 Jan 2019 18:01:56 -0800 Subject: [PATCH 2278/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230825730 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dd6cd5d794b..82a6862c775 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f78971cbcb80e596c54e83e944203d3402e240b176b6ada6927314955000bc6e", - git_commit = "e40ffed186331743127ddaaccaac5f1c193daa5f", + sha256 = "7cdb81b91047dde3e1bcff56779c6018f6061536d0876e26990c8e60521535a3", + git_commit = "b682bdd374ff453f2ebb85d9e8a2b3eeed79df4f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From aa030c97f166da24cc9fe2622b85c5f82f69a898 Mon Sep 17 00:00:00 2001 From: laigd Date: Thu, 24 Jan 2019 18:36:17 -0800 Subject: [PATCH 2279/8103] Fix the TF_CUDA_VERSION in docker gpu build. PiperOrigin-RevId: 230829547 --- tensorflow_serving/tools/docker/Dockerfile.devel-gpu | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index b026b69f787..bdec5578467 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -109,7 +109,7 @@ ENV TF_NEED_CUDA 1 ENV TF_NEED_TENSORRT 1 ENV TENSORRT_INSTALL_PATH=/usr/lib/x86_64-linux-gnu ENV TF_CUDA_COMPUTE_CAPABILITIES=3.0,3.5,5.2,6.0,6.1,7.0 -ENV TF_CUDA_VERSION=9.0 +ENV TF_CUDA_VERSION=10.0 ENV TF_CUDNN_VERSION=7 # Fix paths so that CUDNN can be found: https://github.com/tensorflow/tensorflow/issues/8264 From fd3f1150b1bf50ac957a69b72207f52c55aa154d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 24 Jan 2019 19:01:53 -0800 Subject: [PATCH 2280/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230832326 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 82a6862c775..9ff118a0abe 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7cdb81b91047dde3e1bcff56779c6018f6061536d0876e26990c8e60521535a3", - git_commit = "b682bdd374ff453f2ebb85d9e8a2b3eeed79df4f", + sha256 = "7cb4d45bf75d8334b10fda123b6717d0584f47a04cafb87156393e240e8e1eb5", + git_commit = "862b9f19d17af6bcdc3c8208c88723acf52bc6cf", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4afddbe44d71063c6142f8346ff6cf069e78c833 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 24 Jan 2019 20:01:52 -0800 Subject: [PATCH 2281/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230837849 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9ff118a0abe..4050c6d6d46 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7cb4d45bf75d8334b10fda123b6717d0584f47a04cafb87156393e240e8e1eb5", - git_commit = "862b9f19d17af6bcdc3c8208c88723acf52bc6cf", + sha256 = "37b86210f758886763f7ed395012b745722dcc8bc7e76069a6c1e3a1b6e0d1ab", + git_commit = "6291988afae9a4663a73ed323491518f85b5a9ef", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 66e40b0178e9662018cb8941adec7b033b19e07a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 24 Jan 2019 21:01:49 -0800 Subject: [PATCH 2282/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230842532 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4050c6d6d46..947066d867c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "37b86210f758886763f7ed395012b745722dcc8bc7e76069a6c1e3a1b6e0d1ab", - git_commit = "6291988afae9a4663a73ed323491518f85b5a9ef", + sha256 = "1ed9bf9236ce77a2fa23b0cf8f5154770015c7c9d9bb5b9d282160374c34b0a9", + git_commit = "5a901abe024d7abb6bf78b92426fc4e34b533542", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a4c1fd0c43b6dfb8952fbee054cd3e53cbdb0aa3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 25 Jan 2019 00:02:10 -0800 Subject: [PATCH 2283/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230857141 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 947066d867c..26ec2cb630d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1ed9bf9236ce77a2fa23b0cf8f5154770015c7c9d9bb5b9d282160374c34b0a9", - git_commit = "5a901abe024d7abb6bf78b92426fc4e34b533542", + sha256 = "4fef15cb66ac5eed995aa84cfe3cdc136128b5bbe28a69ed9b57de8d174dbcdb", + git_commit = "d4b0f635bc1d72271ae7fafff6797b9381823d79", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From af069d0a18d09df11af393121382b5ea9b844548 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 25 Jan 2019 02:01:55 -0800 Subject: [PATCH 2284/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230869011 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 26ec2cb630d..2ee3f00884c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4fef15cb66ac5eed995aa84cfe3cdc136128b5bbe28a69ed9b57de8d174dbcdb", - git_commit = "d4b0f635bc1d72271ae7fafff6797b9381823d79", + sha256 = "6640f87e01445ecea6bcf6fc5b234590d8b86be10b682f289698a85588799d1b", + git_commit = "da2c471248c92526e429f031c45ee7f8824139a7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a9e465b5765f98e4de16402fae87b27718582aad Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 25 Jan 2019 04:02:44 -0800 Subject: [PATCH 2285/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230880013 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2ee3f00884c..f5e600a647c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6640f87e01445ecea6bcf6fc5b234590d8b86be10b682f289698a85588799d1b", - git_commit = "da2c471248c92526e429f031c45ee7f8824139a7", + sha256 = "9951fe99492f98cab28d477f9ff4023de72d47a4978f8f8097ff39bf6d511c9b", + git_commit = "bdca83b71c0f47628321bafc29056fb2467144db", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 40990eb49f06756f384928e68f64d62f5f36cc14 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 25 Jan 2019 05:01:44 -0800 Subject: [PATCH 2286/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230884791 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f5e600a647c..c6dbd38c4e9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9951fe99492f98cab28d477f9ff4023de72d47a4978f8f8097ff39bf6d511c9b", - git_commit = "bdca83b71c0f47628321bafc29056fb2467144db", + sha256 = "bcd96a3d3fdbc32588937c55da06019ca782f9757174860c995181babef81c15", + git_commit = "53d3a75b7b7237b0582220913b17b811741f9b70", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8b3c4a84f9a63e74ca5602a0ab0b66f908d6d667 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 25 Jan 2019 06:02:17 -0800 Subject: [PATCH 2287/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230890159 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c6dbd38c4e9..2a16e74e5e0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bcd96a3d3fdbc32588937c55da06019ca782f9757174860c995181babef81c15", - git_commit = "53d3a75b7b7237b0582220913b17b811741f9b70", + sha256 = "337d4ecad2041050593766832eb4974f8523ab588065240148857797cf134e7c", + git_commit = "3296f42b0f6dbdd68dcd492f10d4b3aa5bfc2235", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4604d0d8c99f4d63d4ee1ebb07da6a2dd41c0df0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 25 Jan 2019 08:02:02 -0800 Subject: [PATCH 2288/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230903139 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2a16e74e5e0..a6b70fea98b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "337d4ecad2041050593766832eb4974f8523ab588065240148857797cf134e7c", - git_commit = "3296f42b0f6dbdd68dcd492f10d4b3aa5bfc2235", + sha256 = "50bdbbc3a0146cb4b5b6e3b27a41c62fed621d592c16da5e310105c3885309f4", + git_commit = "720691477d84934e852e89f917e23f4ff55eb2da", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7e821a75f7598a94ce3a79abf961e81cd5bc2934 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 25 Jan 2019 10:02:06 -0800 Subject: [PATCH 2289/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230920741 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a6b70fea98b..b0b25be22bb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "50bdbbc3a0146cb4b5b6e3b27a41c62fed621d592c16da5e310105c3885309f4", - git_commit = "720691477d84934e852e89f917e23f4ff55eb2da", + sha256 = "0685556c068554b01fd8069b1e04aede40f654b7302093ad9c7f8e50a2e23c86", + git_commit = "850cfa2c58e70dbc05536a20e2d5d0740a946bd3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a84486e860297ec04462945e774780e1a0e91fd6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 25 Jan 2019 11:02:09 -0800 Subject: [PATCH 2290/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230932449 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b0b25be22bb..cdb7a2e2794 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0685556c068554b01fd8069b1e04aede40f654b7302093ad9c7f8e50a2e23c86", - git_commit = "850cfa2c58e70dbc05536a20e2d5d0740a946bd3", + sha256 = "4703eacebab540405250d12de87689da88a6044678d12a3cddc905044b9d1838", + git_commit = "4cc8976ed8aec119752dffda278ce1b909e6657c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 75d032c13bcf93410899bc06d41aea3c432a688b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 25 Jan 2019 12:02:24 -0800 Subject: [PATCH 2291/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230943990 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cdb7a2e2794..c361ecf10a4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4703eacebab540405250d12de87689da88a6044678d12a3cddc905044b9d1838", - git_commit = "4cc8976ed8aec119752dffda278ce1b909e6657c", + sha256 = "371b5dc7c5b75ad8e19d8ef3a8c59d457c29ed2b894be0cd01147f1e5c5b36db", + git_commit = "c6a4b8600cd7288e709b63fee1426cc34aeda6d8", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1d68489519050c534d2f1f001eaa590a489ef1f3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 25 Jan 2019 13:01:51 -0800 Subject: [PATCH 2292/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230953723 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c361ecf10a4..e88441d4377 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "371b5dc7c5b75ad8e19d8ef3a8c59d457c29ed2b894be0cd01147f1e5c5b36db", - git_commit = "c6a4b8600cd7288e709b63fee1426cc34aeda6d8", + sha256 = "643d3251d9e0734c3ccec8e4ac3a4b05e3c8464ed73b89061a5598fb9cc80b62", + git_commit = "5522d670af8efa43125325d741793eca12eb16f4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 727ed94ab9f93f808e343de7649e9d36b033bfa7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 25 Jan 2019 14:02:34 -0800 Subject: [PATCH 2293/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230964602 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e88441d4377..d67f9109eff 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "643d3251d9e0734c3ccec8e4ac3a4b05e3c8464ed73b89061a5598fb9cc80b62", - git_commit = "5522d670af8efa43125325d741793eca12eb16f4", + sha256 = "20a49deea46354ef03110e7e2ae4bd2a45a0f56e956d02997b3861a8df6b50b2", + git_commit = "4c0c199222fdcffbfb548aefa0ea82c853aea609", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 873aa26807132dd588e63ae2099909035bb76d07 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 25 Jan 2019 15:02:19 -0800 Subject: [PATCH 2294/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230975608 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d67f9109eff..a1dd1e76624 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "20a49deea46354ef03110e7e2ae4bd2a45a0f56e956d02997b3861a8df6b50b2", - git_commit = "4c0c199222fdcffbfb548aefa0ea82c853aea609", + sha256 = "ab9f77321cc9b38e8bb29596c312199fb99af8cb6fb53509b4a6cd5744be07e5", + git_commit = "d2d19330dfd2af040bcc11e7a7fa5b322d3de8ab", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a7c868dffe76002a0932bf584f4e811ba4882048 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 25 Jan 2019 16:02:11 -0800 Subject: [PATCH 2295/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230986107 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a1dd1e76624..6f799b9dcaf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ab9f77321cc9b38e8bb29596c312199fb99af8cb6fb53509b4a6cd5744be07e5", - git_commit = "d2d19330dfd2af040bcc11e7a7fa5b322d3de8ab", + sha256 = "caabe3de4fade0b76cf9151bd967c12d5e39e9a1970b12ad9505795f8549e121", + git_commit = "b46eac4b90ddc45dfd374e4000654113789b12ec", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b5818341f8f9e43bb60a8992536ae7f4f6e7bb9b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 25 Jan 2019 17:01:57 -0800 Subject: [PATCH 2296/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 230995629 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6f799b9dcaf..85c0a148aa2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "caabe3de4fade0b76cf9151bd967c12d5e39e9a1970b12ad9505795f8549e121", - git_commit = "b46eac4b90ddc45dfd374e4000654113789b12ec", + sha256 = "92525d276ba52e7234f53b0aabfc17294575f304f70552fa55ad67fd5bafbe2c", + git_commit = "7db3e40453d9792c05b6346144d6988f9c928569", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ba403f18707c728d57c6d66a07815ee71bd50576 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 25 Jan 2019 18:01:51 -0800 Subject: [PATCH 2297/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231002973 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 85c0a148aa2..97005489d0e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "92525d276ba52e7234f53b0aabfc17294575f304f70552fa55ad67fd5bafbe2c", - git_commit = "7db3e40453d9792c05b6346144d6988f9c928569", + sha256 = "32c2026ec2dac5d3e743e050a15188cb6d5e0a693b6b4b1ecbef9c7b507fe83e", + git_commit = "02dfd621d05d690f485b008085a5e9ab92b3434a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e26778c3ce31713faba048562d7ed8497f7b8b4f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 25 Jan 2019 19:02:07 -0800 Subject: [PATCH 2298/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231007749 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 97005489d0e..95282a1e13c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "32c2026ec2dac5d3e743e050a15188cb6d5e0a693b6b4b1ecbef9c7b507fe83e", - git_commit = "02dfd621d05d690f485b008085a5e9ab92b3434a", + sha256 = "6dd5f54bc0ea63328498d5d36d43a7cc4fa6b690f1b11925fc8b0a50ea4a300c", + git_commit = "0cb1d4de125a31eb5f32e56a446d182833674ba4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ac1508a0265b7ce022284c794a2bd26b1b88540f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 25 Jan 2019 20:01:58 -0800 Subject: [PATCH 2299/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231011532 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 95282a1e13c..63374e3df81 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6dd5f54bc0ea63328498d5d36d43a7cc4fa6b690f1b11925fc8b0a50ea4a300c", - git_commit = "0cb1d4de125a31eb5f32e56a446d182833674ba4", + sha256 = "79fa068f1698d45f364af1f9fe0433a55dd8906748f9340439fb00d5df1fe0aa", + git_commit = "28a624fb66d0ff72f547888c234105ab578e0f49", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From dda10e9b5f5c72bbeb27b575eabdbf1338305ac6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 25 Jan 2019 21:01:43 -0800 Subject: [PATCH 2300/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231015276 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 63374e3df81..b14f0090d64 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "79fa068f1698d45f364af1f9fe0433a55dd8906748f9340439fb00d5df1fe0aa", - git_commit = "28a624fb66d0ff72f547888c234105ab578e0f49", + sha256 = "8e2d0344e824505e60581a6e8181362f9c4bf000764d2f9924c479b412fa8ec1", + git_commit = "a29d085d97a90a315e319b67810a98476c92d34e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5e37b7312472f8c771b3690b27ebc41b4f11101d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 25 Jan 2019 22:02:09 -0800 Subject: [PATCH 2301/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231018639 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b14f0090d64..71cba667240 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8e2d0344e824505e60581a6e8181362f9c4bf000764d2f9924c479b412fa8ec1", - git_commit = "a29d085d97a90a315e319b67810a98476c92d34e", + sha256 = "04f55f1c3c2b7c89354f9ba4a9a4f3e1c9b3484a393712e22faee5082d5a720d", + git_commit = "371791b1490b5109b0695e6065374428cc57703b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 10b5e18264b8ffb4baf9388a847c577f4beec1fc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 25 Jan 2019 23:01:49 -0800 Subject: [PATCH 2302/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231021543 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 71cba667240..0eb136e236f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "04f55f1c3c2b7c89354f9ba4a9a4f3e1c9b3484a393712e22faee5082d5a720d", - git_commit = "371791b1490b5109b0695e6065374428cc57703b", + sha256 = "7accd32ef5f545e36060eb26c2381af8c30c21a86adfee8a012b032c717158aa", + git_commit = "8a1aca3da83e9ef451c73ac428a1da242c4913ce", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From fd0460dec40ed2250a9ad1bcf3eb37e3f161e2ab Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 26 Jan 2019 00:02:06 -0800 Subject: [PATCH 2303/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231024563 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0eb136e236f..5db36c515b7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7accd32ef5f545e36060eb26c2381af8c30c21a86adfee8a012b032c717158aa", - git_commit = "8a1aca3da83e9ef451c73ac428a1da242c4913ce", + sha256 = "56b75acaa5776fdf58572c20e7585e1896d2344daef8e9b16a43d372a1177f30", + git_commit = "01dec19e827ab46ff7ff5dbd6142ba5a26efc4da", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4282a87d24ccf17541d10858b164cd4e7094f3d3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 26 Jan 2019 03:01:54 -0800 Subject: [PATCH 2304/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231036184 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5db36c515b7..3c089e07578 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "56b75acaa5776fdf58572c20e7585e1896d2344daef8e9b16a43d372a1177f30", - git_commit = "01dec19e827ab46ff7ff5dbd6142ba5a26efc4da", + sha256 = "a814d718e5b7f2ec90b724872de75b511d3cbf93dc966745943c3d59875b272b", + git_commit = "676ff175114a0642003e9b55be0173473e1e5140", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From dca02b85bf275094da75b41f765c4ec780ce997d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 26 Jan 2019 11:01:48 -0800 Subject: [PATCH 2305/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231059480 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3c089e07578..4daadfa67a5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a814d718e5b7f2ec90b724872de75b511d3cbf93dc966745943c3d59875b272b", - git_commit = "676ff175114a0642003e9b55be0173473e1e5140", + sha256 = "cdf198d2128b67166f40ee323728ed49a286bae9a1fdd66105e1601ba387500d", + git_commit = "441ea6de36ab7cf77364ce95e9fce8799eb4adf2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1cfe9c8d8a897ad313136cc8585970d108273a42 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 26 Jan 2019 12:02:12 -0800 Subject: [PATCH 2306/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231062212 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4daadfa67a5..bae1e6a91db 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cdf198d2128b67166f40ee323728ed49a286bae9a1fdd66105e1601ba387500d", - git_commit = "441ea6de36ab7cf77364ce95e9fce8799eb4adf2", + sha256 = "d56bc25b20c038a8425bf5998111aecb69b278cc3b5792747d64bb079b1f4589", + git_commit = "52c8bdba0081e4ed428add13e3c0da7ccbfc8f06", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From dbcd028b8295630a7ab42bcc2e07df868b965f33 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 26 Jan 2019 15:02:00 -0800 Subject: [PATCH 2307/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231070471 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bae1e6a91db..fe4077c6e05 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d56bc25b20c038a8425bf5998111aecb69b278cc3b5792747d64bb079b1f4589", - git_commit = "52c8bdba0081e4ed428add13e3c0da7ccbfc8f06", + sha256 = "e1b5c4c0b7951a098ea30911f570ba29c54d183286d8b2b6b3847d52eb761f6e", + git_commit = "9b91ea70e84501d0e264d783d54907bac8cca92b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 14cc8836c9ae3fe45eccb703f52aba2f8de4e661 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 26 Jan 2019 17:01:55 -0800 Subject: [PATCH 2308/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231075881 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fe4077c6e05..64a74bfbe90 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e1b5c4c0b7951a098ea30911f570ba29c54d183286d8b2b6b3847d52eb761f6e", - git_commit = "9b91ea70e84501d0e264d783d54907bac8cca92b", + sha256 = "2c89966adf87c78d0b2f4825de7d44d7436cfbdb9194b946dd272605db310e5d", + git_commit = "e9e5028139701661522cbaa5847fa8371fb849df", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From dc851fbeb66ab15f24389335a41afa85f24b7874 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 26 Jan 2019 20:02:02 -0800 Subject: [PATCH 2309/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231083691 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 64a74bfbe90..e55e6a22752 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2c89966adf87c78d0b2f4825de7d44d7436cfbdb9194b946dd272605db310e5d", - git_commit = "e9e5028139701661522cbaa5847fa8371fb849df", + sha256 = "16687f142c8bccff36c607951ff4f5c95d4494f98329ff80561d7553892fec30", + git_commit = "7f67f065ca32b055d27d42b99f2fe74aa5a1ce4d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 056906efb429815da7a5b2505d4c5753973e4459 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 26 Jan 2019 22:01:56 -0800 Subject: [PATCH 2310/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231089044 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e55e6a22752..3f1984a39a1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "16687f142c8bccff36c607951ff4f5c95d4494f98329ff80561d7553892fec30", - git_commit = "7f67f065ca32b055d27d42b99f2fe74aa5a1ce4d", + sha256 = "7326154a814d6940efba121ce893480d093bbd93d9b448d5578799604b6e0205", + git_commit = "9eca1a045a8233958e7e8be494ed8e0ab5a712d6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d31e8a57d9bc67524d5450bd7e56b6c7a165fd35 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 27 Jan 2019 03:02:01 -0800 Subject: [PATCH 2311/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231103582 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3f1984a39a1..8642f037302 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7326154a814d6940efba121ce893480d093bbd93d9b448d5578799604b6e0205", - git_commit = "9eca1a045a8233958e7e8be494ed8e0ab5a712d6", + sha256 = "bf6cbd7c6ea607cb76f7465054777f7de0012c818f7cd7c1fcba5af2f6be3b48", + git_commit = "c1162e860fe15d03ab8d98647f8f4a66208c28a3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a13e4ac3e4c325d4b8860bba1ed141d959b9ec7e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 27 Jan 2019 14:01:53 -0800 Subject: [PATCH 2312/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231133039 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8642f037302..8647a9faec9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bf6cbd7c6ea607cb76f7465054777f7de0012c818f7cd7c1fcba5af2f6be3b48", - git_commit = "c1162e860fe15d03ab8d98647f8f4a66208c28a3", + sha256 = "786b621add038631f3dcfccfb7cba4a179f07effa835d257f7704cf03e8c1b03", + git_commit = "e4b4b2e4ffe28e6b49fa6924af0764eb2fad1676", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f541bba22dd255ab773b57eaaf48f87c17f0d57c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 27 Jan 2019 16:02:16 -0800 Subject: [PATCH 2313/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231139496 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8647a9faec9..12a9c8b85b3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "786b621add038631f3dcfccfb7cba4a179f07effa835d257f7704cf03e8c1b03", - git_commit = "e4b4b2e4ffe28e6b49fa6924af0764eb2fad1676", + sha256 = "8b02a51d0d43f97352186cb11c0b1d0a2bfd49712ed8ad8ae8057e5e7463aad3", + git_commit = "0f59cbd29738833655eeffe314b9b7f6667e6005", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7519da81ea0dafb833c8338dea4dbd86648ebc25 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Jan 2019 03:02:12 -0800 Subject: [PATCH 2314/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231186747 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 12a9c8b85b3..596e8c9bd92 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8b02a51d0d43f97352186cb11c0b1d0a2bfd49712ed8ad8ae8057e5e7463aad3", - git_commit = "0f59cbd29738833655eeffe314b9b7f6667e6005", + sha256 = "37f33977a4d4829879f13eefbaeaea2547e28885069d994068946410990269f8", + git_commit = "e0585bc351b19da39610cc20f6d7622b439dca4d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1ca8171120d3f33068d5bf1f7b3207b2acf5b07f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Jan 2019 07:02:05 -0800 Subject: [PATCH 2315/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231211908 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 596e8c9bd92..a44e3638e64 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "37f33977a4d4829879f13eefbaeaea2547e28885069d994068946410990269f8", - git_commit = "e0585bc351b19da39610cc20f6d7622b439dca4d", + sha256 = "28c37e7dd7955db91ee5570be37b5265d962f6c20d2dddf9d159dc784399b8d0", + git_commit = "e4a09e402b3f57ad29d8dfee29b4106347cac8a0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From baa41080b4c8aa016e3dbd1056954de8f12428b2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Jan 2019 08:02:03 -0800 Subject: [PATCH 2316/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231219567 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a44e3638e64..7f57bbc47b5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "28c37e7dd7955db91ee5570be37b5265d962f6c20d2dddf9d159dc784399b8d0", - git_commit = "e4a09e402b3f57ad29d8dfee29b4106347cac8a0", + sha256 = "1fe48dd1e0b4e6db0bfb80a86bd3e6ff6094539703a712422ba7a03614c0efc1", + git_commit = "e89b1a0999a9c1ececded21dbf7079a92ace6bee", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a21bc5e16932f1e1b6d48f2acbb125c8a220a116 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Jan 2019 09:02:12 -0800 Subject: [PATCH 2317/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231228731 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7f57bbc47b5..c926e4dbd01 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1fe48dd1e0b4e6db0bfb80a86bd3e6ff6094539703a712422ba7a03614c0efc1", - git_commit = "e89b1a0999a9c1ececded21dbf7079a92ace6bee", + sha256 = "af836b2a5114c16c2814031821834f475a2996e8edb4ce35329c128980e7f382", + git_commit = "80a2144b58ac183ea72f86f1918254fb1a38fb4a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2e77c934906fd87a8ba64988d9de700136a55309 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Mon, 28 Jan 2019 09:58:32 -0800 Subject: [PATCH 2318/8103] Update docker instructions on using mnist PiperOrigin-RevId: 231238017 --- tensorflow_serving/g3doc/docker.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/tensorflow_serving/g3doc/docker.md b/tensorflow_serving/g3doc/docker.md index 0e575d80e28..814268fdabf 100644 --- a/tensorflow_serving/g3doc/docker.md +++ b/tensorflow_serving/g3doc/docker.md @@ -319,16 +319,12 @@ docker run -it -p 8500:8500 tensorflow/serving:latest-devel To test a model, from inside the container try: ```shell -# build the exporter -bazel build -c opt //tensorflow_serving/example:mnist_saved_model # train the mnist model -bazel-bin/tensorflow_serving/example/mnist_saved_model /tmp/mnist_model +python tensorflow_serving/example/mnist_saved_model.py /tmp/mnist_model # serve the model tensorflow_model_server --port=8500 --model_name=mnist --model_base_path=/tmp/mnist_model/ & -# build the client -bazel build -c opt //tensorflow_serving/example:mnist_client # test the client -bazel-bin/tensorflow_serving/example/mnist_client --num_tests=1000 --server=localhost:8500 +python tensorflow_serving/example/mnist_client.py --num_tests=1000 --server=localhost:8500 ``` ## Dockerfiles From 8b4f2b0ce5b68575c32045fd300d547cbd1c7e99 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Jan 2019 10:01:55 -0800 Subject: [PATCH 2319/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231238679 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c926e4dbd01..3d7f38019b4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "af836b2a5114c16c2814031821834f475a2996e8edb4ce35329c128980e7f382", - git_commit = "80a2144b58ac183ea72f86f1918254fb1a38fb4a", + sha256 = "6f657aca01d6471da8e307214fdafc8f861274ff6ee550fbac67be5017450d46", + git_commit = "e2a201283f4c924e0fda8f3e3deb9ecfff266387", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From dd9688e3c7223ed518a117c70247d9f12839c0b5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Jan 2019 11:01:46 -0800 Subject: [PATCH 2320/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231251239 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3d7f38019b4..312bb3031e2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6f657aca01d6471da8e307214fdafc8f861274ff6ee550fbac67be5017450d46", - git_commit = "e2a201283f4c924e0fda8f3e3deb9ecfff266387", + sha256 = "ce2dee720821fdfb3d4b75f8ceea7b4bb73ee79068f3dbcc3f350dfbefe92ae5", + git_commit = "4b433090add559ce0dbe1db42ae73bba233c1363", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ddd25d6575b49b1f8f13535e079b9e573babe725 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Jan 2019 12:02:20 -0800 Subject: [PATCH 2321/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231264090 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 312bb3031e2..dd60018984b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ce2dee720821fdfb3d4b75f8ceea7b4bb73ee79068f3dbcc3f350dfbefe92ae5", - git_commit = "4b433090add559ce0dbe1db42ae73bba233c1363", + sha256 = "4056a00dcdd2cd83679a7d8e4864c93385e981a96bc663b69cf13d5385ca050f", + git_commit = "5a5e93e4f245146e6c2b3eac5173b48d15755a27", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 62d2081c2eee9884d4392680259f872d60b4e863 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Jan 2019 13:01:42 -0800 Subject: [PATCH 2322/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231274434 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dd60018984b..44939c994a6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4056a00dcdd2cd83679a7d8e4864c93385e981a96bc663b69cf13d5385ca050f", - git_commit = "5a5e93e4f245146e6c2b3eac5173b48d15755a27", + sha256 = "b8b6136e1c69ce3a609e1e86f593ea036a41b99e3ff2395b620c3198a9e92f84", + git_commit = "37d538a626814f1a3cb83b7392bc6af9a7e9e1f7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b58b494b3062849a6ba2f437e5a755e8565d348e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Jan 2019 13:39:14 -0800 Subject: [PATCH 2323/8103] Add HTTP request's query and fragment portions of the URI to uri_path()'s return value. PiperOrigin-RevId: 231280855 --- .../server/internal/evhttp_request.cc | 15 ++++++- .../net_http/server/internal/evhttp_request.h | 2 + .../server/internal/evhttp_request_test.cc | 40 +++++++++++++++++++ .../server/public/server_request_interface.h | 5 ++- 4 files changed, 59 insertions(+), 3 deletions(-) diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_request.cc b/tensorflow_serving/util/net_http/server/internal/evhttp_request.cc index 905b28d6f82..302a8121fef 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_request.cc +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_request.cc @@ -98,6 +98,19 @@ bool ParsedEvRequest::decode() { path = "/"; } + path_and_query = path; + const char* query = evhttp_uri_get_query(decoded_uri); + if (query != nullptr) { + path_and_query.push_back('?'); + path_and_query.append(query); + } + + const char* fragment = evhttp_uri_get_fragment(decoded_uri); + if (fragment != nullptr) { + path_and_query.push_back('#'); + path_and_query.append(fragment); + } + headers = evhttp_request_get_input_headers(request); return true; @@ -116,7 +129,7 @@ EvHTTPRequest::~EvHTTPRequest() { } absl::string_view EvHTTPRequest::uri_path() const { - return parsed_request_->path; + return parsed_request_->path_and_query; } absl::string_view EvHTTPRequest::http_method() const { diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_request.h b/tensorflow_serving/util/net_http/server/internal/evhttp_request.h index 98d53d99207..e89b40f0efc 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_request.h +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_request.h @@ -20,6 +20,7 @@ limitations under the License. #include #include +#include #include "tensorflow_serving/util/net_http/server/internal/server_support.h" #include "tensorflow_serving/util/net_http/server/public/httpserver_interface.h" @@ -54,6 +55,7 @@ struct ParsedEvRequest { // TODO(wenboz): do we need escaped path for dispatching requests? // evhttp_uridecode(path) const char* path = nullptr; // owned by uri + std::string path_and_query; evkeyvalq* headers = nullptr; // owned by raw request }; diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_request_test.cc b/tensorflow_serving/util/net_http/server/internal/evhttp_request_test.cc index 402e5d465c2..801fbeae4a4 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_request_test.cc +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_request_test.cc @@ -146,6 +146,46 @@ TEST_F(EvHTTPRequestTest, SimplePOST) { server->WaitForTermination(); } +// Test request's uri_path() method. +TEST_F(EvHTTPRequestTest, RequestUri) { + static const char* const kUriPath[] = { + "/", + "/path", + "/path/", + "/path?query=value", + "/path#fragment", + "/path?param=value#fragment", + "/path?param=value%20value", + }; + + int counter = 0; + auto handler = [&counter](ServerRequestInterface* request) { + EXPECT_EQ(kUriPath[counter++], request->uri_path()); + request->Reply(); + }; + server->RegisterRequestDispatcher( + [&handler](ServerRequestInterface* request) -> RequestHandler { + return handler; + }, + RequestHandlerOptions()); + + server->StartAcceptingRequests(); + + auto connection = + EvHTTPConnection::Connect("localhost", server->listen_port()); + ASSERT_TRUE(connection != nullptr); + + for (const char* path : kUriPath) { + ClientRequest request = {path, "GET", {}, nullptr}; + ClientResponse response = {}; + + EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); + } + + server->Terminate(); + server->WaitForTermination(); +} + // Test request headers TEST_F(EvHTTPRequestTest, RequestHeaders) { auto handler = [](ServerRequestInterface* request) { diff --git a/tensorflow_serving/util/net_http/server/public/server_request_interface.h b/tensorflow_serving/util/net_http/server/public/server_request_interface.h index e8439c17918..e866a6a3925 100644 --- a/tensorflow_serving/util/net_http/server/public/server_request_interface.h +++ b/tensorflow_serving/util/net_http/server/public/server_request_interface.h @@ -62,8 +62,9 @@ class ServerRequestInterface { ServerRequestInterface& operator=(const ServerRequestInterface& other) = delete; - // The relative portion of the request URI (without host). - // No escape decoding. + // The portion of the request URI after the host and port. + // E.g. "/path/to/resource?param=value¶m=value#fragment". + // Doesn't unescape the contents; returns "/" at least. virtual absl::string_view uri_path() const = 0; // HTTP request method. From 5ee22015c4a2242c03f297468ba67d6d8fa8ffcf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Jan 2019 14:01:52 -0800 Subject: [PATCH 2324/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231284476 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 44939c994a6..b1ab3f34be3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b8b6136e1c69ce3a609e1e86f593ea036a41b99e3ff2395b620c3198a9e92f84", - git_commit = "37d538a626814f1a3cb83b7392bc6af9a7e9e1f7", + sha256 = "ce650f14fbe88f062bf9e904163d18359c69f773e1314b5f9b5b2c9a3b0829e4", + git_commit = "b24783482f452b9aa0f1756360fd453a24230275", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c48f52722d790f02fb34f5f6623618b9dd5c12e9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Jan 2019 15:02:22 -0800 Subject: [PATCH 2325/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231295537 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b1ab3f34be3..303dd95c6f3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ce650f14fbe88f062bf9e904163d18359c69f773e1314b5f9b5b2c9a3b0829e4", - git_commit = "b24783482f452b9aa0f1756360fd453a24230275", + sha256 = "91e9de76add43b1d7b9fefcd3e632b3c8702d2a3f74cf5ec01a049a27ac6d6b6", + git_commit = "f9f590d185afe072272c3e02cd3f3e34013fc85b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 199c74e10108e8d6aecd27bf793287f5aab3efbc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Jan 2019 16:02:11 -0800 Subject: [PATCH 2326/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231305797 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 303dd95c6f3..e0a230ce7da 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "91e9de76add43b1d7b9fefcd3e632b3c8702d2a3f74cf5ec01a049a27ac6d6b6", - git_commit = "f9f590d185afe072272c3e02cd3f3e34013fc85b", + sha256 = "8e986af967d62fa0ef887050fad365d830cd2e27a035d74d0dfd223395ab0266", + git_commit = "ad0af72a1c071ed53932efc0a3ccde81b27f3992", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e4065b77ebed2a3a5d71208bec27468d2865e629 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Jan 2019 17:01:41 -0800 Subject: [PATCH 2327/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231315647 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e0a230ce7da..25b1940a380 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8e986af967d62fa0ef887050fad365d830cd2e27a035d74d0dfd223395ab0266", - git_commit = "ad0af72a1c071ed53932efc0a3ccde81b27f3992", + sha256 = "eb4ef2b4e005d324374e5d182ad604c4014b0296c00a63f921ca8ed1fa4a5145", + git_commit = "b9ae2eaaee733e2f072cb1d9b28a5a2a22df7a02", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f02b947d64401e97d6d1b62a0dd295beb2aa0935 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Jan 2019 18:01:57 -0800 Subject: [PATCH 2328/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231324015 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 25b1940a380..a16b8fe95d6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eb4ef2b4e005d324374e5d182ad604c4014b0296c00a63f921ca8ed1fa4a5145", - git_commit = "b9ae2eaaee733e2f072cb1d9b28a5a2a22df7a02", + sha256 = "45f1e9826e8c988f01ca5716e19c93502dd55b21998b70528bcc470ec1473665", + git_commit = "cbfbbcc1d5cb039888f8ee340224a51b7dcff565", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 75cb742824e94ec9bf2cea29e93e7967cedf588b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Jan 2019 19:02:23 -0800 Subject: [PATCH 2329/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231330253 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a16b8fe95d6..b475039f408 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "45f1e9826e8c988f01ca5716e19c93502dd55b21998b70528bcc470ec1473665", - git_commit = "cbfbbcc1d5cb039888f8ee340224a51b7dcff565", + sha256 = "e192f0354fb00c3fc7346d8de2d17ea5abfddc710b9dcc8ced87ae49b4dd37ca", + git_commit = "3b24c98659e87ff753f09ded2ae5b95c30610812", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 11544bcde79d0be36ce3de7c36e55e36288ed0ac Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Jan 2019 20:01:55 -0800 Subject: [PATCH 2330/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231335046 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b475039f408..52e199c5ec9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e192f0354fb00c3fc7346d8de2d17ea5abfddc710b9dcc8ced87ae49b4dd37ca", - git_commit = "3b24c98659e87ff753f09ded2ae5b95c30610812", + sha256 = "0fbff53aae764ded7489ebe00d8de5b1782b8427895785e322f24016c3d2d967", + git_commit = "79548341efa79db02c2f2e8685ef0a4c96b2d4ee", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8a37935b76b37404876a1b7aa5a534ccfc40f4ba Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Jan 2019 21:01:42 -0800 Subject: [PATCH 2331/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231340059 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 52e199c5ec9..45ea9784aff 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0fbff53aae764ded7489ebe00d8de5b1782b8427895785e322f24016c3d2d967", - git_commit = "79548341efa79db02c2f2e8685ef0a4c96b2d4ee", + sha256 = "439fc3a1f571676609a9a206b0b6a8b1c1c8a95aacee2321c168532f0be44191", + git_commit = "90901d44547e99f2cef0349a220032f9cee40762", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0bd5525ea799eb71f191754397aabd4eab167df2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Jan 2019 22:02:03 -0800 Subject: [PATCH 2332/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231345063 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 45ea9784aff..283f640b3f8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "439fc3a1f571676609a9a206b0b6a8b1c1c8a95aacee2321c168532f0be44191", - git_commit = "90901d44547e99f2cef0349a220032f9cee40762", + sha256 = "994bee37d47f93de699b42f9d881a541c17b3742ae29645f92cc200c32d4c270", + git_commit = "01cf6233d62d476676ffbea0fad46660a0ba9a16", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0a416ef6949a6c52c35d5d21bd43dae625a4c484 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Jan 2019 23:02:00 -0800 Subject: [PATCH 2333/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231350048 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 283f640b3f8..974da3d80f8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "994bee37d47f93de699b42f9d881a541c17b3742ae29645f92cc200c32d4c270", - git_commit = "01cf6233d62d476676ffbea0fad46660a0ba9a16", + sha256 = "13a5153b4a3380e5276bdeea835d68162a9d6b879665d89732979d6be349e302", + git_commit = "fc4dbb6ab580776cfe0c5e88374c425f49728621", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9dbc074362ce7b975c8c4d976781b0cce8ce4025 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Jan 2019 01:01:52 -0800 Subject: [PATCH 2334/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231362458 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 974da3d80f8..4bce4d1cbc3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "13a5153b4a3380e5276bdeea835d68162a9d6b879665d89732979d6be349e302", - git_commit = "fc4dbb6ab580776cfe0c5e88374c425f49728621", + sha256 = "087b38b68c2574b7b907a3ebef9e6f3bc120552d9ad606399284ee7c363d3f0e", + git_commit = "4be94e9e266fc363974d5945b8ca66d4977cfa98", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 975cfe5700dc9f099b19bcd3002b0c9fcbda58ff Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Jan 2019 02:02:06 -0800 Subject: [PATCH 2335/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231369123 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4bce4d1cbc3..0efd2fc3c67 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "087b38b68c2574b7b907a3ebef9e6f3bc120552d9ad606399284ee7c363d3f0e", - git_commit = "4be94e9e266fc363974d5945b8ca66d4977cfa98", + sha256 = "fa57b5eda33198b1383ead040e2994b3d49e856e6dbdb88f558bfc9052bed080", + git_commit = "967a0feae32776687a6ba15df985ece6db80e7c6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 36df176b54431cca4b14a7b113d34d1dd64fae7b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Jan 2019 03:02:04 -0800 Subject: [PATCH 2336/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231374995 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0efd2fc3c67..c6139e5f712 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fa57b5eda33198b1383ead040e2994b3d49e856e6dbdb88f558bfc9052bed080", - git_commit = "967a0feae32776687a6ba15df985ece6db80e7c6", + sha256 = "ea0574be3751d3532e3e32124e9a0dbde198a4a3d5370fae0abe0efb2fedb10d", + git_commit = "823b694639a3f49b6adbf9e73a08c529d583878e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1086b768b8fec323a1f3f15e6c2e19970c6a5eac Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Jan 2019 05:02:27 -0800 Subject: [PATCH 2337/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231385980 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c6139e5f712..6afcb2ee1ac 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ea0574be3751d3532e3e32124e9a0dbde198a4a3d5370fae0abe0efb2fedb10d", - git_commit = "823b694639a3f49b6adbf9e73a08c529d583878e", + sha256 = "d36b6ada86fa86c857270d5adaa572f3c942fe1317492ef22b228a6252d397d9", + git_commit = "3bc0eda0ba5d9d7b52e497c216a354de69af81a5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 21c3ea7b5c7ea333cf6ece60e8f48c7cb64cd53d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Jan 2019 06:02:44 -0800 Subject: [PATCH 2338/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231391629 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6afcb2ee1ac..a7ad086d118 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d36b6ada86fa86c857270d5adaa572f3c942fe1317492ef22b228a6252d397d9", - git_commit = "3bc0eda0ba5d9d7b52e497c216a354de69af81a5", + sha256 = "b2a6581887b380c9d5b06a03b9fd51f27c1896e949445f2071ae33dec89902df", + git_commit = "827d9b2c2abe25518ea7cf37aa54b5a39123f297", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1e84060d54f20574c3c2a0e07ee261b6226369b7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Jan 2019 08:02:08 -0800 Subject: [PATCH 2339/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231404724 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a7ad086d118..ebd49ed9eba 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b2a6581887b380c9d5b06a03b9fd51f27c1896e949445f2071ae33dec89902df", - git_commit = "827d9b2c2abe25518ea7cf37aa54b5a39123f297", + sha256 = "c3d4b514cf10a1f0eb55420e9ff17edc17c51b9504ef317931c63a2634d10f8e", + git_commit = "512621ac80d66c00e6a4ae57fd3e8fcff86d3de9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e64e85358755af4cf796a360e7137413abe09245 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Jan 2019 09:02:03 -0800 Subject: [PATCH 2340/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231412799 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ebd49ed9eba..93020647473 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c3d4b514cf10a1f0eb55420e9ff17edc17c51b9504ef317931c63a2634d10f8e", - git_commit = "512621ac80d66c00e6a4ae57fd3e8fcff86d3de9", + sha256 = "c55c3f576079364567817c05f09634c1f8a1d07feee42554a2a0685cb3940845", + git_commit = "c956c9d38f07eb96cb00a054e9c268b91c27cbff", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4ac85c5ba3e446990c577b4bb80d4229d5bffe5e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Jan 2019 11:02:08 -0800 Subject: [PATCH 2341/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231434569 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 93020647473..d973b93d404 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c55c3f576079364567817c05f09634c1f8a1d07feee42554a2a0685cb3940845", - git_commit = "c956c9d38f07eb96cb00a054e9c268b91c27cbff", + sha256 = "2c462b7079744e4072c4e6e33a04529b4fc435fc6b37d52ad244315b60e86ed2", + git_commit = "0aee82add196a6f0796bc8215c3d4bff90780a4e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From da444577d115decfef1a5e7c604ab716e0aec7f2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Jan 2019 12:02:33 -0800 Subject: [PATCH 2342/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231446886 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d973b93d404..bda41c9b87c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2c462b7079744e4072c4e6e33a04529b4fc435fc6b37d52ad244315b60e86ed2", - git_commit = "0aee82add196a6f0796bc8215c3d4bff90780a4e", + sha256 = "684e47661ad7d962c5bc779769aff14caa39cf1287e32b0a3ce5f88cd17449a5", + git_commit = "5b16e7079aa7bb8ae6b6db9d74f21afa92bfccbf", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f5ef129dab33682294409c05dedf5ee28c40118f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Jan 2019 13:01:48 -0800 Subject: [PATCH 2343/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231457444 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bda41c9b87c..223dd6adb49 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "684e47661ad7d962c5bc779769aff14caa39cf1287e32b0a3ce5f88cd17449a5", - git_commit = "5b16e7079aa7bb8ae6b6db9d74f21afa92bfccbf", + sha256 = "501c3de5e1bc72936082356e8a1e9765220ab268d5a8090c43a936768a00ce53", + git_commit = "038675489fbf35542f6b0e1b6192876a83e8c5b6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b9a7d908c207ee745603d72cc4b8ff8a92b60b86 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Jan 2019 14:01:48 -0800 Subject: [PATCH 2344/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231468616 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 223dd6adb49..bafaaac924e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "501c3de5e1bc72936082356e8a1e9765220ab268d5a8090c43a936768a00ce53", - git_commit = "038675489fbf35542f6b0e1b6192876a83e8c5b6", + sha256 = "934e515f70c2c9163df103cb220006db99a2cb7d05a7cc8a6489f98aff19ed6b", + git_commit = "8a1dcea0acb7fde84b43d7c922b2b1bffd6824d8", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 205fa39816c871b42712582d6297e47acf087810 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Jan 2019 15:02:08 -0800 Subject: [PATCH 2345/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231480256 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bafaaac924e..b288000609b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "934e515f70c2c9163df103cb220006db99a2cb7d05a7cc8a6489f98aff19ed6b", - git_commit = "8a1dcea0acb7fde84b43d7c922b2b1bffd6824d8", + sha256 = "179b859f867f1b35b0732026023b1b2154b76f6811f4348afda119fe88cd1d31", + git_commit = "0863d6286c91aba585849266851a08af657c4f91", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e2c95c58898ef95d2e5f1b5d6c586e09472a43bc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Jan 2019 16:02:08 -0800 Subject: [PATCH 2346/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231491220 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b288000609b..ce65f515692 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "179b859f867f1b35b0732026023b1b2154b76f6811f4348afda119fe88cd1d31", - git_commit = "0863d6286c91aba585849266851a08af657c4f91", + sha256 = "61dcb73c8a2c01806c0198c036636e159adb9e2d18c0e0bf307df009d5018d68", + git_commit = "5870add5d332b8bb1c69f0f1f64797649ccd8902", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1f9be7cf1f0e538d10efac95230a0856cbc52151 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Jan 2019 17:02:07 -0800 Subject: [PATCH 2347/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231501897 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ce65f515692..93b1e387895 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "61dcb73c8a2c01806c0198c036636e159adb9e2d18c0e0bf307df009d5018d68", - git_commit = "5870add5d332b8bb1c69f0f1f64797649ccd8902", + sha256 = "52655d714006b6d9e95e7aff48f859b1286184bb06eb24d5caf97d213c6bf116", + git_commit = "ec0b21d5631de16380186c15769550bdcbec0865", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1d4f20fa6b8e849e7f57d183be9f560ae3cfcfa0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Jan 2019 18:02:15 -0800 Subject: [PATCH 2348/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231510537 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 93b1e387895..e438955be76 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "52655d714006b6d9e95e7aff48f859b1286184bb06eb24d5caf97d213c6bf116", - git_commit = "ec0b21d5631de16380186c15769550bdcbec0865", + sha256 = "a0b8f86bfdd9f6e09724f778d349c531a02dab8600d33664bfb1b40196cabd44", + git_commit = "7b48d11a5a45ca5d19a994f5a60a53f47339f57a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0612b97267acedd65155d7604a70ca39f59a70ff Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Jan 2019 19:01:59 -0800 Subject: [PATCH 2349/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231517628 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e438955be76..c866f9a6658 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a0b8f86bfdd9f6e09724f778d349c531a02dab8600d33664bfb1b40196cabd44", - git_commit = "7b48d11a5a45ca5d19a994f5a60a53f47339f57a", + sha256 = "76bd687bd814dce2fc9aae9f628e6042d81d4c417ec4cdc10631489682b36850", + git_commit = "e55946355883c75a9d306e6a456e42ac6fe1f0dc", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3f7935c326abe60f43da3163ea4312bff535c61b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Jan 2019 20:02:54 -0800 Subject: [PATCH 2350/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231523286 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c866f9a6658..be3a4b23a68 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "76bd687bd814dce2fc9aae9f628e6042d81d4c417ec4cdc10631489682b36850", - git_commit = "e55946355883c75a9d306e6a456e42ac6fe1f0dc", + sha256 = "7a648f7e7d7f925760e054d92bda225b99441be2d555c330402db6240e00c5a9", + git_commit = "6161367d8942561f2eeb640b3798cfd8397ea35c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6210cefe41dcc57d56cea8cb16917ed21d0b207e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Jan 2019 21:02:08 -0800 Subject: [PATCH 2351/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231527943 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index be3a4b23a68..851aee0845d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7a648f7e7d7f925760e054d92bda225b99441be2d555c330402db6240e00c5a9", - git_commit = "6161367d8942561f2eeb640b3798cfd8397ea35c", + sha256 = "7af8a9af334ab5c56ec885d0cb86905adf863e7fa39a1512d2b02f58ea00a0d0", + git_commit = "1afd37f416f9cafd37ca9b3652384855cb472a3c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 71b2ff572ca2f6bd138c47c0e81461dfbed3aa9e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Jan 2019 22:02:45 -0800 Subject: [PATCH 2352/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231532998 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 851aee0845d..fd05736164c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7af8a9af334ab5c56ec885d0cb86905adf863e7fa39a1512d2b02f58ea00a0d0", - git_commit = "1afd37f416f9cafd37ca9b3652384855cb472a3c", + sha256 = "a876506837a74b0beca8adc08053f5aa1559dc46f6faeb7f71bb133a58c69565", + git_commit = "724a264c4e1a86879feabf2fa43b9d2c42320058", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ba69ce841f68c0e2290b658f572cb3ef3e6b5c30 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Jan 2019 23:02:26 -0800 Subject: [PATCH 2353/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231537607 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fd05736164c..95339fbff3e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a876506837a74b0beca8adc08053f5aa1559dc46f6faeb7f71bb133a58c69565", - git_commit = "724a264c4e1a86879feabf2fa43b9d2c42320058", + sha256 = "af307b3f50e9a8d844adcd7666d309cab6357a386dfd33f04c1a5a430d622cc7", + git_commit = "79d86aca647b5a3b8300eb104519332871d00947", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 439b1e13e3c33c23206e9811c391aec01c03804c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Jan 2019 00:02:46 -0800 Subject: [PATCH 2354/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231542340 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 95339fbff3e..ca6bc18ec76 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "af307b3f50e9a8d844adcd7666d309cab6357a386dfd33f04c1a5a430d622cc7", - git_commit = "79d86aca647b5a3b8300eb104519332871d00947", + sha256 = "f3cf0f724362b069cf7a83b24ff5cad1fa73699e30505a87eeb40d7b960b6549", + git_commit = "799acd00e2d317f8ad4ae2cd9a27c502577d9a8c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b0f3d2365c70465f7ebc2cb9f5123afe89a58ae4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Jan 2019 02:01:58 -0800 Subject: [PATCH 2355/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231554965 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ca6bc18ec76..95f6bd398d3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f3cf0f724362b069cf7a83b24ff5cad1fa73699e30505a87eeb40d7b960b6549", - git_commit = "799acd00e2d317f8ad4ae2cd9a27c502577d9a8c", + sha256 = "744e0009ab054f01f4eddedf942ab6e5759d79f375617b79dcdb445e4954a9a1", + git_commit = "9ffbf1aa5e90ed33defc1ea5cf1eaa45bf8f587b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From aade867c97fcc0d71a77dc937a7fd1558ee76def Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Jan 2019 03:02:15 -0800 Subject: [PATCH 2356/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231562440 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 95f6bd398d3..ebfb0b633e0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "744e0009ab054f01f4eddedf942ab6e5759d79f375617b79dcdb445e4954a9a1", - git_commit = "9ffbf1aa5e90ed33defc1ea5cf1eaa45bf8f587b", + sha256 = "ec149f4e3be02aae99e482da3bb5410da77f7db2c9dafb7f2379125779d2b051", + git_commit = "a93f06d160955c99bc279a419902ac40824a2cab", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From bfad4a606bf69fd659675f4e085b6eba1651e27d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Jan 2019 04:02:20 -0800 Subject: [PATCH 2357/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231568723 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ebfb0b633e0..1c9da3eeefd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ec149f4e3be02aae99e482da3bb5410da77f7db2c9dafb7f2379125779d2b051", - git_commit = "a93f06d160955c99bc279a419902ac40824a2cab", + sha256 = "e42bb0ca05f4afd747df97633f7dd5e99e81e03afa7423cf60bff8a5bda09dd2", + git_commit = "24a7280bd173a15437a7e52e2544ca4d009f16f4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b42ee9b4200bc4eac25be3b479f5e68ccc419735 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Jan 2019 05:02:28 -0800 Subject: [PATCH 2358/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231574274 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1c9da3eeefd..0b497d0288e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e42bb0ca05f4afd747df97633f7dd5e99e81e03afa7423cf60bff8a5bda09dd2", - git_commit = "24a7280bd173a15437a7e52e2544ca4d009f16f4", + sha256 = "0f3026550e482bc89f3c1def53c375fb20d5608956c0a2b9ccb7e87d7657371e", + git_commit = "b34901da3f3e052ad7a930bce2084cc5478cbf1d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From eb56c58fa3598d69172245e836979ae7b7d7236c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Jan 2019 07:02:19 -0800 Subject: [PATCH 2359/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231587271 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0b497d0288e..180e5300c28 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0f3026550e482bc89f3c1def53c375fb20d5608956c0a2b9ccb7e87d7657371e", - git_commit = "b34901da3f3e052ad7a930bce2084cc5478cbf1d", + sha256 = "7c83dd50ae5766e5db3aa2dddf5a6e0ca367146eaac3be90310f0885290cbe28", + git_commit = "e114d880ac993b4af6428be4aa7772a947a1ad86", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 459f7224ce294b031697f00c739a6d0ae6b64a6a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Jan 2019 09:02:11 -0800 Subject: [PATCH 2360/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231604367 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 180e5300c28..e93c3de0a6b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7c83dd50ae5766e5db3aa2dddf5a6e0ca367146eaac3be90310f0885290cbe28", - git_commit = "e114d880ac993b4af6428be4aa7772a947a1ad86", + sha256 = "c58c1d57397203685821d9edf3b09bb15a42bd808285010d74817f308d3db7ec", + git_commit = "6631cd5e0e43e672d2de3cf1f0e29da17b57824e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a8050da027d193cbb5ecba1608a893369e9edba8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Jan 2019 10:02:02 -0800 Subject: [PATCH 2361/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231614615 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e93c3de0a6b..e3f3e081b04 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c58c1d57397203685821d9edf3b09bb15a42bd808285010d74817f308d3db7ec", - git_commit = "6631cd5e0e43e672d2de3cf1f0e29da17b57824e", + sha256 = "3c96bf4794ebca633adb3a22e69de8c1fcf4842c771be49c2cb61e44dee86c78", + git_commit = "00d159b19863b570dba216d0311c723c1dcccc6a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 02a39223a1ceac167bbf5adc8a3758dff136b392 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Jan 2019 11:01:58 -0800 Subject: [PATCH 2362/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231627861 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e3f3e081b04..536b8106f2c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3c96bf4794ebca633adb3a22e69de8c1fcf4842c771be49c2cb61e44dee86c78", - git_commit = "00d159b19863b570dba216d0311c723c1dcccc6a", + sha256 = "406e1cae88ca6ca281a6f34ee0c988a20ebb338be5d3349c5e530ebf23f530f2", + git_commit = "edfb0bba7f6d93c3179c395f78cd938e52a988da", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 276de48b754cfdb474ada96c6057dac98118d745 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Jan 2019 12:02:39 -0800 Subject: [PATCH 2363/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231640930 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 536b8106f2c..da2260bdd15 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "406e1cae88ca6ca281a6f34ee0c988a20ebb338be5d3349c5e530ebf23f530f2", - git_commit = "edfb0bba7f6d93c3179c395f78cd938e52a988da", + sha256 = "83d36dd51e82a03347adf153785d8adb809474061382f398046769f32c572b7f", + git_commit = "609992a3a0c20757c0a839b0c2bb9de8a42ab5e5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3ba7d0904e1503e690b323b8af095e34d884a1ba Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Jan 2019 13:02:00 -0800 Subject: [PATCH 2364/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231652198 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index da2260bdd15..ddc7f31101e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "83d36dd51e82a03347adf153785d8adb809474061382f398046769f32c572b7f", - git_commit = "609992a3a0c20757c0a839b0c2bb9de8a42ab5e5", + sha256 = "fcb3f25f0a378f82cfce606c312b2f34bfff5e88fa6ed1651d9e7818e10a41bd", + git_commit = "9f7901630972ca5e53441c81f628c18d1137ab08", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 687550c737acaff417816b6294714336475340ef Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Jan 2019 14:02:01 -0800 Subject: [PATCH 2365/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231663399 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ddc7f31101e..8d160eff336 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fcb3f25f0a378f82cfce606c312b2f34bfff5e88fa6ed1651d9e7818e10a41bd", - git_commit = "9f7901630972ca5e53441c81f628c18d1137ab08", + sha256 = "b566c19bff2bf08b49ef3017085d16ab3104bbe1a7b60a0c97892f0fe70d3d86", + git_commit = "8fa8b44eaf92870143c18cf6da719b05bccbdd68", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b9bb95dc9d928afe9d75da3ea0439e2fc98d1b48 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Jan 2019 15:01:59 -0800 Subject: [PATCH 2366/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231674442 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8d160eff336..862986e6259 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b566c19bff2bf08b49ef3017085d16ab3104bbe1a7b60a0c97892f0fe70d3d86", - git_commit = "8fa8b44eaf92870143c18cf6da719b05bccbdd68", + sha256 = "c43d57fccedf7f7fe4228d5cf94c9275a8b2018a07bbf7ea703edcb6ed143803", + git_commit = "2757750e4c7805e1f42e46be8a21d08693ee9ddd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c7c7a28b5ec87da7bc04c0a69e7bb838c6a7ee90 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Jan 2019 16:02:59 -0800 Subject: [PATCH 2367/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231686405 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 862986e6259..340f8321b7b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c43d57fccedf7f7fe4228d5cf94c9275a8b2018a07bbf7ea703edcb6ed143803", - git_commit = "2757750e4c7805e1f42e46be8a21d08693ee9ddd", + sha256 = "93f84c609b7da0eddfb503590c5bebcaaaa21f917454a4eedede6a2a940d7dfd", + git_commit = "41bf5782a38a29aafc6fa3856f800540f56c817f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5d0a2c827657e063728f9c8c8a2e4cef6d1f7eba Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Jan 2019 17:01:51 -0800 Subject: [PATCH 2368/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231696660 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 340f8321b7b..c235be40571 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "93f84c609b7da0eddfb503590c5bebcaaaa21f917454a4eedede6a2a940d7dfd", - git_commit = "41bf5782a38a29aafc6fa3856f800540f56c817f", + sha256 = "a6866bd9d45e82416ab904173fdc0384f2294767c3c995e682a0b8d4d1dd019a", + git_commit = "4e19402174593095a0837d6e7a8ca3f686b67543", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4e2b11f29742db0a4c156c48ba1005a51d09088a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Jan 2019 18:02:28 -0800 Subject: [PATCH 2369/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231705290 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c235be40571..7419928f609 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a6866bd9d45e82416ab904173fdc0384f2294767c3c995e682a0b8d4d1dd019a", - git_commit = "4e19402174593095a0837d6e7a8ca3f686b67543", + sha256 = "f191857f3bed13db5321ef6ec5ef3cb187b7cca36895d68f23412b7352e0046a", + git_commit = "9f75ff921b59d12b17afdc33597f190b646e6c01", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 32b5be0cfbc7da081ee6f2ed28769c1738d2d2e1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Jan 2019 19:02:08 -0800 Subject: [PATCH 2370/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231711532 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7419928f609..35266ac2704 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f191857f3bed13db5321ef6ec5ef3cb187b7cca36895d68f23412b7352e0046a", - git_commit = "9f75ff921b59d12b17afdc33597f190b646e6c01", + sha256 = "a7f53eb02403a6acb8de41b73cf80078b7cc3e20bbbcb84310ce2a1a4c257169", + git_commit = "7d8bfd88cddd536cd35e0ccb3082fb9f4bd91b28", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 34f09480630e9d6ac8985770858c91ec3442a7eb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Jan 2019 20:02:52 -0800 Subject: [PATCH 2371/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231716811 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 35266ac2704..439bbeeb5a5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a7f53eb02403a6acb8de41b73cf80078b7cc3e20bbbcb84310ce2a1a4c257169", - git_commit = "7d8bfd88cddd536cd35e0ccb3082fb9f4bd91b28", + sha256 = "8f17b4bde7dc40ac60552c85ba7b70e5a45d96bc68bfa78ce03bdf59153363cd", + git_commit = "6ec5dfe9a88814aac007e683905f4c648421393e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f8ea0eb2912517993ed97ca5426531d49d9e63b8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Jan 2019 21:02:11 -0800 Subject: [PATCH 2372/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231721572 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 439bbeeb5a5..3fc3e80d8a7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8f17b4bde7dc40ac60552c85ba7b70e5a45d96bc68bfa78ce03bdf59153363cd", - git_commit = "6ec5dfe9a88814aac007e683905f4c648421393e", + sha256 = "6c3ee1cf5ea1a0eaf4720db2f1e97974affa253453011a434a7c3cbd212b7540", + git_commit = "9051c1696acd6f727462adeab67747db0c660ddc", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From bb779029e4824dce3e226fc6335d4d2a3521eb81 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Jan 2019 22:02:33 -0800 Subject: [PATCH 2373/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231726445 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3fc3e80d8a7..951b57acc13 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6c3ee1cf5ea1a0eaf4720db2f1e97974affa253453011a434a7c3cbd212b7540", - git_commit = "9051c1696acd6f727462adeab67747db0c660ddc", + sha256 = "664527ed20507a40ad6a21a418485eafcb235971556992e2eaa792a4f7c3e970", + git_commit = "40cf0a02e3b0803788f7da09b90bc83829a047e8", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a3736c88049d0738449e19e25acdf443fab512f9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 31 Jan 2019 00:02:34 -0800 Subject: [PATCH 2374/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231735502 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 951b57acc13..194f62e4b19 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "664527ed20507a40ad6a21a418485eafcb235971556992e2eaa792a4f7c3e970", - git_commit = "40cf0a02e3b0803788f7da09b90bc83829a047e8", + sha256 = "9d0bf2c07b57062785b2fa72540c1040ed7420d439644aef9e5bdc8450676651", + git_commit = "ee2929ecab4cab0e2be6de5d03738a6642fc2916", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 320d9449a52ba58d3abe743b150df5e8f9fd0ec5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 31 Jan 2019 01:02:26 -0800 Subject: [PATCH 2375/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231742860 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 194f62e4b19..b02775ee5ac 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9d0bf2c07b57062785b2fa72540c1040ed7420d439644aef9e5bdc8450676651", - git_commit = "ee2929ecab4cab0e2be6de5d03738a6642fc2916", + sha256 = "0386e221615440b37f424e5caab8ee533a29b7e4f2f4deef09b2ff8d769474b8", + git_commit = "f77d3d94cc48948bc2ce3f28bf1e3fae396b1458", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 577293f6491f9ad6a198dcfc0e10db687586c356 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 31 Jan 2019 02:02:10 -0800 Subject: [PATCH 2376/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231749247 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b02775ee5ac..3cc5ef6c8d3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0386e221615440b37f424e5caab8ee533a29b7e4f2f4deef09b2ff8d769474b8", - git_commit = "f77d3d94cc48948bc2ce3f28bf1e3fae396b1458", + sha256 = "ae5441851ab2be973e15290445232ff90daa603c87fe3dec35513c1023defd96", + git_commit = "0a4a1c803f2456d3ba8df837a746f4d1b7963961", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 119ff6831212214eb5ed33d329aa69185e447e82 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 31 Jan 2019 03:03:02 -0800 Subject: [PATCH 2377/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231755834 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3cc5ef6c8d3..81ab089d29b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ae5441851ab2be973e15290445232ff90daa603c87fe3dec35513c1023defd96", - git_commit = "0a4a1c803f2456d3ba8df837a746f4d1b7963961", + sha256 = "76aee50a64cfd4fe82aa4e9d338e68f4dfc45ffa1598f6b54747400be916f81d", + git_commit = "31da2ab1401b933e031a91aac2aa474e4099aa58", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a80336e509b35a14356051fb747bbe347ea5ff6a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 31 Jan 2019 05:02:36 -0800 Subject: [PATCH 2378/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231766244 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 81ab089d29b..dce1d20d6a8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "76aee50a64cfd4fe82aa4e9d338e68f4dfc45ffa1598f6b54747400be916f81d", - git_commit = "31da2ab1401b933e031a91aac2aa474e4099aa58", + sha256 = "ef574a1c163be32503e3d437dd1c39101a2b838ee83767f102ce261c7adcc8e9", + git_commit = "bbe8343f3ef8534506cea4b064d127734a9f55fb", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1eaab2ed75e6ee1b3f4452f39b76495d943a73ad Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 31 Jan 2019 08:02:10 -0800 Subject: [PATCH 2379/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231786954 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dce1d20d6a8..97737f2cef3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ef574a1c163be32503e3d437dd1c39101a2b838ee83767f102ce261c7adcc8e9", - git_commit = "bbe8343f3ef8534506cea4b064d127734a9f55fb", + sha256 = "1da9e2942f9c1f72789aa50f25bb54ddd9c3fc60bceaec2547012b18ef9785c0", + git_commit = "d3d6fed6ae2e01e14ec8cd7e5e61f651c0b4c173", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e16490d83a3000c3dc7358d51b1e4a9b30326348 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 31 Jan 2019 12:02:25 -0800 Subject: [PATCH 2380/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231828258 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 97737f2cef3..bf8fbfdf487 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1da9e2942f9c1f72789aa50f25bb54ddd9c3fc60bceaec2547012b18ef9785c0", - git_commit = "d3d6fed6ae2e01e14ec8cd7e5e61f651c0b4c173", + sha256 = "23979560e1937a9f7e121fd667197550c569880bdd2405eecf77a144fc6f5220", + git_commit = "9a4c3a2eaaa1ca9a6a7d5bdb97c59814afa3c98b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 449b15e37658ed6715c50076913a7661b5b69fac Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 31 Jan 2019 13:02:21 -0800 Subject: [PATCH 2381/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231837908 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bf8fbfdf487..f5f4ffa9331 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "23979560e1937a9f7e121fd667197550c569880bdd2405eecf77a144fc6f5220", - git_commit = "9a4c3a2eaaa1ca9a6a7d5bdb97c59814afa3c98b", + sha256 = "999769d80afc983902eb9a6e2f1c40db3c540bf8fcf326d9956b93616e02bb56", + git_commit = "aad38dc01185350c30812dbe4e9c7c8114d2647e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6608a11abd0357f78f19ea9932cf358e7b2ac3a6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 31 Jan 2019 14:01:56 -0800 Subject: [PATCH 2382/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231848970 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f5f4ffa9331..5bdb5b3a714 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "999769d80afc983902eb9a6e2f1c40db3c540bf8fcf326d9956b93616e02bb56", - git_commit = "aad38dc01185350c30812dbe4e9c7c8114d2647e", + sha256 = "0a29679fb5b30477146e96f2c8a9784e8e73643a2879513b319786ffa2f81777", + git_commit = "31723c74caf0cf3effb46e12de00eb80ae86a899", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6ae7207d8df4657f7be35448dd67b6f9aef9c0f9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 31 Jan 2019 15:03:12 -0800 Subject: [PATCH 2383/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231861387 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5bdb5b3a714..bc07c0ee2df 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0a29679fb5b30477146e96f2c8a9784e8e73643a2879513b319786ffa2f81777", - git_commit = "31723c74caf0cf3effb46e12de00eb80ae86a899", + sha256 = "3eb4e96b3ee9023edf4517715b63d7fa42c78b34da5fedea4db50b77311942cc", + git_commit = "82686a2cc8107d8a99a5cab04ca95f2373c4f152", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 73a6653a31bb38696663fb21350be6bf1d85fbe6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 31 Jan 2019 16:02:35 -0800 Subject: [PATCH 2384/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231872340 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bc07c0ee2df..f2e78d6da23 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3eb4e96b3ee9023edf4517715b63d7fa42c78b34da5fedea4db50b77311942cc", - git_commit = "82686a2cc8107d8a99a5cab04ca95f2373c4f152", + sha256 = "fb3c5011ae88a283ac53706319d398f763f67d9f73ac2e034f2ab0a61fdf292a", + git_commit = "28ae789bd65c3b512d6ee90a238c2a37088b3dee", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 915fd2b45c05196cf2cf8cd2b398aae37da18eee Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 31 Jan 2019 17:01:50 -0800 Subject: [PATCH 2385/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231882521 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f2e78d6da23..1f3b0ae687e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fb3c5011ae88a283ac53706319d398f763f67d9f73ac2e034f2ab0a61fdf292a", - git_commit = "28ae789bd65c3b512d6ee90a238c2a37088b3dee", + sha256 = "21024efccdd153eca63ca189dc59847f9ed653290183fdbeeacbd53059ade51c", + git_commit = "6d166402a2e4c566549bb0a0f8ea39f455bf06aa", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e0f662f90d7ef5381e62183717e7253a53760246 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 31 Jan 2019 18:02:03 -0800 Subject: [PATCH 2386/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231890992 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1f3b0ae687e..96e204fdae6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "21024efccdd153eca63ca189dc59847f9ed653290183fdbeeacbd53059ade51c", - git_commit = "6d166402a2e4c566549bb0a0f8ea39f455bf06aa", + sha256 = "6e3fb9d4570718255b6cb4652df699932c3a94e3adea9668568ee69edb7ca615", + git_commit = "dd84a42ab04d98133bf3108accd2face08e6aa16", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3f13d2958d3d06db49c91be1cdefce10857d098e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 31 Jan 2019 19:01:55 -0800 Subject: [PATCH 2387/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231897965 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 96e204fdae6..7956e52a248 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6e3fb9d4570718255b6cb4652df699932c3a94e3adea9668568ee69edb7ca615", - git_commit = "dd84a42ab04d98133bf3108accd2face08e6aa16", + sha256 = "d024f85bbd86de985576da781c0ba532c1f2be966ac8ecc3d46a8d48456b59a7", + git_commit = "e8b2f12a84e0fbedc94d797174eb87d2d72a5866", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 31461aae3f1d920963bf7b55969f140e4272a9b4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 31 Jan 2019 20:02:20 -0800 Subject: [PATCH 2388/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231903386 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7956e52a248..af519e83ae6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d024f85bbd86de985576da781c0ba532c1f2be966ac8ecc3d46a8d48456b59a7", - git_commit = "e8b2f12a84e0fbedc94d797174eb87d2d72a5866", + sha256 = "dd631862cb994e31501ab2e450c2d36337b8dece1806028cd3d530879a41c8da", + git_commit = "17e4b9a0c63cb8a278d28d3459f03b83a2224b21", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3017df87767226da5ec9fb9defe176d887967a11 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 31 Jan 2019 21:02:19 -0800 Subject: [PATCH 2389/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231908443 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index af519e83ae6..33d437b4d5d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dd631862cb994e31501ab2e450c2d36337b8dece1806028cd3d530879a41c8da", - git_commit = "17e4b9a0c63cb8a278d28d3459f03b83a2224b21", + sha256 = "f6cb1f6b11ca467040a0c6643adc43d655269d3a54a05bb7ec5c799b01ae916c", + git_commit = "65d8d1c41bf1677230f0256eee1580ebf2f0d1d4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c170b9054f0458a99281ae428064acb4e4451e3d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 31 Jan 2019 22:02:07 -0800 Subject: [PATCH 2390/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231913610 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 33d437b4d5d..2b2c3a90775 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f6cb1f6b11ca467040a0c6643adc43d655269d3a54a05bb7ec5c799b01ae916c", - git_commit = "65d8d1c41bf1677230f0256eee1580ebf2f0d1d4", + sha256 = "d99645e365180f0b97b00cd1155b3cbd24b59042e5808d598c1e5cef0b789400", + git_commit = "d3554d47d718fd35f84442b06df96fa5df9d173d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9582f89ef0d4b38bf28bd6260a0f5cf609d7e28f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 31 Jan 2019 23:02:34 -0800 Subject: [PATCH 2391/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231918389 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2b2c3a90775..c95d17bdff7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d99645e365180f0b97b00cd1155b3cbd24b59042e5808d598c1e5cef0b789400", - git_commit = "d3554d47d718fd35f84442b06df96fa5df9d173d", + sha256 = "fe25a1d5ea6b82dcab53a507407868d860a2fa9e832eaf91fa9067fc98a38478", + git_commit = "6e84333e15bc1609b49351dfa82fe8ac37e83a72", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f7ad442283c0f364918713c04ecbf9ebb6789c36 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Feb 2019 02:02:26 -0800 Subject: [PATCH 2392/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231936758 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c95d17bdff7..63cbbb7187a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fe25a1d5ea6b82dcab53a507407868d860a2fa9e832eaf91fa9067fc98a38478", - git_commit = "6e84333e15bc1609b49351dfa82fe8ac37e83a72", + sha256 = "93553895eb71736cc7c851669bbc770d0d5c5ad7149bd60028aac0378dc65372", + git_commit = "9fc9fd672afd6f2d01cb1f1667a80da6d78638be", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 47fbaa2b00a3d10de078998ffa0e785a40045e5f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Feb 2019 03:02:06 -0800 Subject: [PATCH 2393/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231942569 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 63cbbb7187a..f838bf0ff3f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "93553895eb71736cc7c851669bbc770d0d5c5ad7149bd60028aac0378dc65372", - git_commit = "9fc9fd672afd6f2d01cb1f1667a80da6d78638be", + sha256 = "b74b5cdf16fda4a26636c76f1f22213048ba41d3999da401090d55b3c1ca95f5", + git_commit = "3aa6c5c20264fb3ae3564a59298f6ce4e49a3a44", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 197c286ca2b21ac487525530494d55cc8613c13b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Feb 2019 04:02:23 -0800 Subject: [PATCH 2394/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231947941 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f838bf0ff3f..6cd9d432c5f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b74b5cdf16fda4a26636c76f1f22213048ba41d3999da401090d55b3c1ca95f5", - git_commit = "3aa6c5c20264fb3ae3564a59298f6ce4e49a3a44", + sha256 = "9cc9fd637f3a50f532012cd248efb8f18747cd2187e8a5905b53954974f20104", + git_commit = "aa9a1127a894f66eaffe3ee60191a39ffa6cc66d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3cca78119d4aa60c6e777f42722de2286f1915d8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Feb 2019 09:01:59 -0800 Subject: [PATCH 2395/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 231980011 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6cd9d432c5f..a1fa5b1e8ae 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9cc9fd637f3a50f532012cd248efb8f18747cd2187e8a5905b53954974f20104", - git_commit = "aa9a1127a894f66eaffe3ee60191a39ffa6cc66d", + sha256 = "4140dc82a34e162f2d091c034bed2909ad9f4074f1ad9f5c084c43912e4518d9", + git_commit = "f08bc174d86b5756c01e8f4ac16d8804e01d4b6d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b11006659cda9d36ba780284bab7360390318e85 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Feb 2019 11:02:20 -0800 Subject: [PATCH 2396/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232001941 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a1fa5b1e8ae..1ee804db34d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4140dc82a34e162f2d091c034bed2909ad9f4074f1ad9f5c084c43912e4518d9", - git_commit = "f08bc174d86b5756c01e8f4ac16d8804e01d4b6d", + sha256 = "f5a61b32da1387736f0680b85b319b41e014b73e7c20448b960ec507b9d22349", + git_commit = "0dc200d8da26a9a42281df160168fe905c6126d0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a43bbccf8f6d7b067f75bb7ed86ea8a7fa9b0775 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Feb 2019 12:02:04 -0800 Subject: [PATCH 2397/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232013513 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1ee804db34d..17fe38328c9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f5a61b32da1387736f0680b85b319b41e014b73e7c20448b960ec507b9d22349", - git_commit = "0dc200d8da26a9a42281df160168fe905c6126d0", + sha256 = "d2543e47827429129b536a8a54455fad516d0448e7e04012254a4fa2a5e8f07f", + git_commit = "0b9429168e73df0fbec61cc9176913920d183ac2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From bb52123932a9dc4305ce5395657b5891cd223231 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Feb 2019 13:02:06 -0800 Subject: [PATCH 2398/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232023286 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 17fe38328c9..163decb9a2f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d2543e47827429129b536a8a54455fad516d0448e7e04012254a4fa2a5e8f07f", - git_commit = "0b9429168e73df0fbec61cc9176913920d183ac2", + sha256 = "8bb381b173f389c89599e654694859eb2b182ce3a116dcf6fd2a25c2dd66543a", + git_commit = "97866b03d5c7180af1d843ec20be6ae8a3802550", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 845356d274a19e371de5f8867ecbd5ac97af6210 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Feb 2019 14:03:08 -0800 Subject: [PATCH 2399/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232034084 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 163decb9a2f..8bb77071f4f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8bb381b173f389c89599e654694859eb2b182ce3a116dcf6fd2a25c2dd66543a", - git_commit = "97866b03d5c7180af1d843ec20be6ae8a3802550", + sha256 = "c27f2014982509b5945c7fd7cc4cc851d1dc79aa4b1a4ef96f8ec23221be10e4", + git_commit = "28958d61baef4c828aec6dbc02ce878075701a4b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 531a67b181f35048f57ea6e6e3e9b3fdc75d418e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Feb 2019 15:02:05 -0800 Subject: [PATCH 2400/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232043836 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8bb77071f4f..196d0697afa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c27f2014982509b5945c7fd7cc4cc851d1dc79aa4b1a4ef96f8ec23221be10e4", - git_commit = "28958d61baef4c828aec6dbc02ce878075701a4b", + sha256 = "9ba73c7feb44ac63b29ae9855b292c57f2b3db3e44dad902983c2a4f452933a5", + git_commit = "c7fd42e2d5738f491b0cd88eab8d307c04a19b62", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 113d2a434fd28fb72f605dadd12709834a7aeb05 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Feb 2019 16:02:33 -0800 Subject: [PATCH 2401/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232054203 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 196d0697afa..ec1d3fd88ba 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9ba73c7feb44ac63b29ae9855b292c57f2b3db3e44dad902983c2a4f452933a5", - git_commit = "c7fd42e2d5738f491b0cd88eab8d307c04a19b62", + sha256 = "2715e1693cc5e9882803953afb4103f878d35d6521f8425597914e4f1c9ddb89", + git_commit = "2e93ffc56a9ff655fc83906133c3da1d6a08a213", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a223d093e16a5cf809dced52920cc21140a96f3c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Feb 2019 17:01:53 -0800 Subject: [PATCH 2402/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232063152 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ec1d3fd88ba..822d9ee676e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2715e1693cc5e9882803953afb4103f878d35d6521f8425597914e4f1c9ddb89", - git_commit = "2e93ffc56a9ff655fc83906133c3da1d6a08a213", + sha256 = "f396733d60fd6d4ea89110def9880ffbc82d67b1ebdfce1a22a97a529821c8b7", + git_commit = "2e6cd2f99508d9ebd7f0f340852d209f8e1dfd99", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 64f50602342e3a998f87b5340ed40082ab650fcb Mon Sep 17 00:00:00 2001 From: allenl Date: Fri, 1 Feb 2019 17:37:01 -0800 Subject: [PATCH 2403/8103] Add a tf.saved_model.save / tensorflow_serving integration test PiperOrigin-RevId: 232067553 --- .../tensorflow_model_server_test.py | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/tensorflow_serving/model_servers/tensorflow_model_server_test.py b/tensorflow_serving/model_servers/tensorflow_model_server_test.py index b5679e3eade..df292862a07 100644 --- a/tensorflow_serving/model_servers/tensorflow_model_server_test.py +++ b/tensorflow_serving/model_servers/tensorflow_model_server_test.py @@ -236,6 +236,7 @@ def VerifyPredictRequest(self, # Prepare request request = predict_pb2.PredictRequest() request.model_spec.name = model_name + request.model_spec.signature_name = signature_name request.inputs['x'].dtype = types_pb2.DT_FLOAT request.inputs['x'].float_val.append(2.0) dim = request.inputs['x'].tensor_shape.dim.add() @@ -722,6 +723,52 @@ def testPredictUDS(self): expected_version=self._GetModelVersion( self._GetSavedModelHalfPlusThreePath())) + def test_tf_saved_model_save(self): + base_path = os.path.join(self.get_temp_dir(), 'tf_saved_model_save') + export_path = os.path.join(base_path, '00000123') + root = tf.train.Checkpoint() + root.v1 = tf.Variable(3.) + root.v2 = tf.Variable(2.) + root.f = tf.function( + lambda x: {'y': root.v1 * root.v2 * x}) + to_save = root.f.get_concrete_function(tf.TensorSpec(None, tf.float32)) + tf.saved_model.experimental.save(root, export_path, to_save) + _, model_server_address, _ = TensorflowModelServerTest.RunServer( + 'default', base_path) + expected_version = self._GetModelVersion(base_path) + self.VerifyPredictRequest( + model_server_address, + expected_output=12.0, + specify_output=False, + expected_version=expected_version) + + def test_tf_saved_model_save_multiple_signatures(self): + base_path = os.path.join(self.get_temp_dir(), 'tf_saved_model_save') + export_path = os.path.join(base_path, '00000123') + root = tf.train.Checkpoint() + root.f = tf.function(lambda x: {'y': 1.}, + input_signature=[tf.TensorSpec(None, tf.float32)]) + root.g = tf.function(lambda x: {'y': 2.}, + input_signature=[tf.TensorSpec(None, tf.float32)]) + tf.saved_model.experimental.save( + root, export_path, + signatures={ + signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: root.f, + 'custom_signature_key': root.g}) + _, model_server_address, _ = TensorflowModelServerTest.RunServer( + 'default', base_path) + expected_version = self._GetModelVersion(base_path) + self.VerifyPredictRequest( + model_server_address, + expected_output=2.0, + expected_version=expected_version, + signature_name='custom_signature_key') + self.VerifyPredictRequest( + model_server_address, + expected_output=1.0, + expected_version=expected_version) + if __name__ == '__main__': + tf.enable_eager_execution() tf.test.main() From 5d7b0dc8a5264267d0d032b2f56e4018d54e73f2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Feb 2019 18:02:18 -0800 Subject: [PATCH 2404/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232070232 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 822d9ee676e..182c937fa44 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f396733d60fd6d4ea89110def9880ffbc82d67b1ebdfce1a22a97a529821c8b7", - git_commit = "2e6cd2f99508d9ebd7f0f340852d209f8e1dfd99", + sha256 = "1cf5cb1bef9b206e0d743a26f2467723da036cc0591c533973ac8dc9b1d75177", + git_commit = "9ad0f778676331ad76978498859d88a8d50acd4c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ad2fa39637ce43ec5dbadc35a63e887d8eab3344 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Feb 2019 19:02:04 -0800 Subject: [PATCH 2405/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232075115 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 182c937fa44..d4b48d32f57 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1cf5cb1bef9b206e0d743a26f2467723da036cc0591c533973ac8dc9b1d75177", - git_commit = "9ad0f778676331ad76978498859d88a8d50acd4c", + sha256 = "35293a2dcfb6dd06e840752c220e62863ea62aa7ef011d436161a5453031be95", + git_commit = "0c07b9435f1c243982a90563275f3eafdf7569cc", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0dfb0764bc9e1ab6dd68396b92ecbe7c92c3d810 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Feb 2019 20:02:08 -0800 Subject: [PATCH 2406/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232079009 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d4b48d32f57..90c42ff9c65 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "35293a2dcfb6dd06e840752c220e62863ea62aa7ef011d436161a5453031be95", - git_commit = "0c07b9435f1c243982a90563275f3eafdf7569cc", + sha256 = "99a42471c430681d0945f37f864669bcee2fe37d75102bd74fcf27fde8154543", + git_commit = "9018715ac3e7652e247deec9bf72d632143fe0d7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3468b98dfb409e322a35f4b9253a429a8e971679 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Feb 2019 21:01:54 -0800 Subject: [PATCH 2407/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232082707 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 90c42ff9c65..f95d6f4c403 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "99a42471c430681d0945f37f864669bcee2fe37d75102bd74fcf27fde8154543", - git_commit = "9018715ac3e7652e247deec9bf72d632143fe0d7", + sha256 = "d3a2a01095b79a7d297a66bef1086c2a0e3a741f58701c14cd52ff1339a5b80b", + git_commit = "3c2dabf53dd085c21e38a28b467e52c566c0dfaf", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d2067e0b30532c92e957553791ab6eca187fdb86 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Feb 2019 23:02:32 -0800 Subject: [PATCH 2408/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232089645 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f95d6f4c403..f005e22fd16 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d3a2a01095b79a7d297a66bef1086c2a0e3a741f58701c14cd52ff1339a5b80b", - git_commit = "3c2dabf53dd085c21e38a28b467e52c566c0dfaf", + sha256 = "2b84199a768a22dd4bccd4a97b944ec9db89e17332efeb0b3b19f093486e0ff5", + git_commit = "d08271d73c9f7d399d16917b47fcfda74806dd02", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 75cc76841e4c51ac6b995d7b9bf7676abcde6f7e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 2 Feb 2019 02:02:38 -0800 Subject: [PATCH 2409/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232102082 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f005e22fd16..d49099af31d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2b84199a768a22dd4bccd4a97b944ec9db89e17332efeb0b3b19f093486e0ff5", - git_commit = "d08271d73c9f7d399d16917b47fcfda74806dd02", + sha256 = "9f11bf342c1dcf06c6825d3c902e122373e992c1ab747ef163436ddaffe5e5e0", + git_commit = "eeaca34ce368eae8cf54c053678f464fd05bcaa6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8ef123f0af0cf05bdbef9aa97cd7fca690dc89b1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 2 Feb 2019 03:02:12 -0800 Subject: [PATCH 2410/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232105160 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d49099af31d..6e5f4900935 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9f11bf342c1dcf06c6825d3c902e122373e992c1ab747ef163436ddaffe5e5e0", - git_commit = "eeaca34ce368eae8cf54c053678f464fd05bcaa6", + sha256 = "3cae89463383bf39538884cc0c66bfb90ea9c8b251740bfac24cb29bb8c0c7a9", + git_commit = "6d594251b7bb55b88dafca53f28959ab92bf079b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8681ad21057034c6fa59b2c1a75133b72982bc60 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 2 Feb 2019 14:02:27 -0800 Subject: [PATCH 2411/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232138532 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6e5f4900935..9705e0e1895 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3cae89463383bf39538884cc0c66bfb90ea9c8b251740bfac24cb29bb8c0c7a9", - git_commit = "6d594251b7bb55b88dafca53f28959ab92bf079b", + sha256 = "e34038a75a9f39388e5e99665ffdf4fc89d770191bb32550589bba478cddd4a6", + git_commit = "f22fc30109a637c7be65657709104ee899da9f5e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3d11e557ef856f4032445d6ccdd223ebcf673a90 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 2 Feb 2019 15:01:58 -0800 Subject: [PATCH 2412/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232141422 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9705e0e1895..86b1d89809f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e34038a75a9f39388e5e99665ffdf4fc89d770191bb32550589bba478cddd4a6", - git_commit = "f22fc30109a637c7be65657709104ee899da9f5e", + sha256 = "4914140eddad5dcf804c004f9f70e71992d798bd3dd710bd391bc2d91231f4b0", + git_commit = "14c78f9675a29190460d6cd5e10ce38e3be84fad", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2bac4fdb39b539f252cafbae5836dd86953db106 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 2 Feb 2019 22:02:06 -0800 Subject: [PATCH 2413/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232161651 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 86b1d89809f..316c13bcee7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4914140eddad5dcf804c004f9f70e71992d798bd3dd710bd391bc2d91231f4b0", - git_commit = "14c78f9675a29190460d6cd5e10ce38e3be84fad", + sha256 = "d4862d505a91c6f87a8e5512122cfa83b82fbba736b0f2c19c2f6d13b29089b0", + git_commit = "2cfa7dc2da11731545b189d08628685b009a889d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3f527123f7ba69b8300e1b65bbe366d17320d261 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 3 Feb 2019 00:02:23 -0800 Subject: [PATCH 2414/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232167409 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 316c13bcee7..48a2124c6e9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d4862d505a91c6f87a8e5512122cfa83b82fbba736b0f2c19c2f6d13b29089b0", - git_commit = "2cfa7dc2da11731545b189d08628685b009a889d", + sha256 = "5fa20af4081d01031d20a1423028be6996a919502fd573500e488ba8953f917e", + git_commit = "edbd8a15b91ef0d5ac3fdf3f573ce2b99cdd8a63", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 41ddbd7ef5430a36a41deed77a4ce3fb3e1c3fd4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 3 Feb 2019 02:03:06 -0800 Subject: [PATCH 2415/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232174866 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 48a2124c6e9..83aaf2c0574 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5fa20af4081d01031d20a1423028be6996a919502fd573500e488ba8953f917e", - git_commit = "edbd8a15b91ef0d5ac3fdf3f573ce2b99cdd8a63", + sha256 = "dddd5fba5301b3942ee42ce6a380c6d4d34230b6108df77ae30b22ede684fa5a", + git_commit = "226398bd70d6369dd97fa9cf4bee94af9a05f1d0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d84ea3195557495371d60be789ecf65e8434b914 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 3 Feb 2019 16:02:39 -0800 Subject: [PATCH 2416/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232217904 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 83aaf2c0574..68b3dff4131 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dddd5fba5301b3942ee42ce6a380c6d4d34230b6108df77ae30b22ede684fa5a", - git_commit = "226398bd70d6369dd97fa9cf4bee94af9a05f1d0", + sha256 = "9d1c46f331b64c9cf38dd4f909a0b2eed03cac71ca4f8988293b096862d92538", + git_commit = "f97802de4bb8ecf49941fd7499e35d02603622e8", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3961daf03c20d7eefe6550a1dd9754a40e8b9ba4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 3 Feb 2019 20:01:54 -0800 Subject: [PATCH 2417/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232231528 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 68b3dff4131..3c33f765da4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9d1c46f331b64c9cf38dd4f909a0b2eed03cac71ca4f8988293b096862d92538", - git_commit = "f97802de4bb8ecf49941fd7499e35d02603622e8", + sha256 = "778994f1e6d00b9c5711143aa162af4fdf56a278387e2aa830377e7cbfb7e755", + git_commit = "656c8f1da9656e21e7d7502b367b87e037341cbb", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 23b2addf5b98bf7958e01bbefe970ec2e1d20483 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 3 Feb 2019 22:02:54 -0800 Subject: [PATCH 2418/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232239481 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3c33f765da4..904317892cc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "778994f1e6d00b9c5711143aa162af4fdf56a278387e2aa830377e7cbfb7e755", - git_commit = "656c8f1da9656e21e7d7502b367b87e037341cbb", + sha256 = "f7b9a05b83a54d5c49d0987203dbaab0906afc414e770fed9efd60d20c2f440d", + git_commit = "68052b3303153c4e2ada0865e93bb3f9e729ba13", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 99dedefe36b045853ea464accdd6388e27129592 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 4 Feb 2019 02:02:11 -0800 Subject: [PATCH 2419/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232260128 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 904317892cc..a32afe8fa9a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f7b9a05b83a54d5c49d0987203dbaab0906afc414e770fed9efd60d20c2f440d", - git_commit = "68052b3303153c4e2ada0865e93bb3f9e729ba13", + sha256 = "0ed608f924a5ddac526cbca686e2c5cabd94ead7c526e3b24674f730aac9d1f9", + git_commit = "3e713f9a47931611c05f1762415ae723661ef969", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 15461b0b0a25bca50f691cdf0ee2ddf540b9f08e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 4 Feb 2019 03:02:09 -0800 Subject: [PATCH 2420/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232266265 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a32afe8fa9a..a26e58b8370 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0ed608f924a5ddac526cbca686e2c5cabd94ead7c526e3b24674f730aac9d1f9", - git_commit = "3e713f9a47931611c05f1762415ae723661ef969", + sha256 = "112f52db5b72d9e48d36c37989820b20c299761d3c4b43fcde5fe9122c50fb61", + git_commit = "cb011e1dd8d79757fea01be39e19cb1155681e7e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7f33a6602df2ec379494fbb7e0d7cc497b305770 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 4 Feb 2019 04:03:22 -0800 Subject: [PATCH 2421/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232272301 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a26e58b8370..59ebce3926b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "112f52db5b72d9e48d36c37989820b20c299761d3c4b43fcde5fe9122c50fb61", - git_commit = "cb011e1dd8d79757fea01be39e19cb1155681e7e", + sha256 = "f638394ce07c2fc923bc2bfa3e3b278dc8e7fd24b45549499fcb044292a4d254", + git_commit = "e907e94bc3586fba29603c73cd93b75b35794a93", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From bf589a8da79dd3d409e75ed3af58f8d5412db10f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 4 Feb 2019 08:02:22 -0800 Subject: [PATCH 2422/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232297593 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 59ebce3926b..4a57173ed3c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f638394ce07c2fc923bc2bfa3e3b278dc8e7fd24b45549499fcb044292a4d254", - git_commit = "e907e94bc3586fba29603c73cd93b75b35794a93", + sha256 = "0d007fbbd7b2edbe301a1bd23f1c597d386877666f1d6a05a60377953255e5ed", + git_commit = "1f21340b1ef115f643d1c41f952e655274f934e9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 98d5335d644b73687db9bfbd147886973efab8f9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 4 Feb 2019 09:02:00 -0800 Subject: [PATCH 2423/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232306396 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4a57173ed3c..0ac9da68653 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0d007fbbd7b2edbe301a1bd23f1c597d386877666f1d6a05a60377953255e5ed", - git_commit = "1f21340b1ef115f643d1c41f952e655274f934e9", + sha256 = "7dec567be2541f56762b90d83b07bf7844b7e5fae9c51b4b8876ef38e6516de1", + git_commit = "62eec96637f0d7c4cf3493a676fada4a2b903821", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6aa89049b8d778ae80a8704dd912897f5628e802 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 4 Feb 2019 10:02:03 -0800 Subject: [PATCH 2424/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232316276 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0ac9da68653..c042893ee35 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7dec567be2541f56762b90d83b07bf7844b7e5fae9c51b4b8876ef38e6516de1", - git_commit = "62eec96637f0d7c4cf3493a676fada4a2b903821", + sha256 = "a83cd32858f2cfec3c4f5ee3de22bfac99e6b22964f2093a1421296d626a7508", + git_commit = "84db8371a3a52d68a7c59fe87a80a1c5d1d93b75", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c3d69a64cd624ba8240b98dadab64aa1b1f90193 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 4 Feb 2019 11:02:03 -0800 Subject: [PATCH 2425/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232328250 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c042893ee35..790497cb1a7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a83cd32858f2cfec3c4f5ee3de22bfac99e6b22964f2093a1421296d626a7508", - git_commit = "84db8371a3a52d68a7c59fe87a80a1c5d1d93b75", + sha256 = "837dedf17d9863d389d56b32ff9a9d6454a207879c8d3f9dc394003bd0afbdff", + git_commit = "a127a0b5ceb9531456a9965c673327bc0f64ec14", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From dee3058a8404313139b9033f08a52893d838d6da Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 4 Feb 2019 12:02:29 -0800 Subject: [PATCH 2426/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232340315 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 790497cb1a7..73e9202b515 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "837dedf17d9863d389d56b32ff9a9d6454a207879c8d3f9dc394003bd0afbdff", - git_commit = "a127a0b5ceb9531456a9965c673327bc0f64ec14", + sha256 = "a48c38de2791259f566fa8eea27bd8fe60d8832bf736f1861facec4bd8c0f408", + git_commit = "3111198adef9a3b56bd380588d38168e63a2e3f0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9c52ef9e307f23a469050dbe11a35073d5ee3015 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 4 Feb 2019 13:01:51 -0800 Subject: [PATCH 2427/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232350827 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 73e9202b515..fb2837b5e8a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a48c38de2791259f566fa8eea27bd8fe60d8832bf736f1861facec4bd8c0f408", - git_commit = "3111198adef9a3b56bd380588d38168e63a2e3f0", + sha256 = "bba5216ec095a3f577a724545a143146f372d0a6cbe75dbc1f53b9eab14d062b", + git_commit = "187f876271debd58b20c4eb489c100b7f8d571ed", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1fef9be45d0d3d0c6c92f5667689016a3c2890b0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 4 Feb 2019 14:02:23 -0800 Subject: [PATCH 2428/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232361941 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fb2837b5e8a..e889028f5a4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bba5216ec095a3f577a724545a143146f372d0a6cbe75dbc1f53b9eab14d062b", - git_commit = "187f876271debd58b20c4eb489c100b7f8d571ed", + sha256 = "465725ce47734ab2c5a0a1faf9dd5294391c99fd94f7d8db165a66c6dca1c323", + git_commit = "fb6ce4462da4b6ebe5dfd2199001d5c869b309fc", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From bd060ea9c622c2781d62c914a0d0233475217abd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 4 Feb 2019 15:03:25 -0800 Subject: [PATCH 2429/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232373957 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e889028f5a4..f1421fa0492 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "465725ce47734ab2c5a0a1faf9dd5294391c99fd94f7d8db165a66c6dca1c323", - git_commit = "fb6ce4462da4b6ebe5dfd2199001d5c869b309fc", + sha256 = "756cfcd14709d931d47eaf4cd6394bc2ca5d1f8b7b62195c3ac2b6037ca953ca", + git_commit = "3abed38c6ed4144a3a8faac1a818298a3b80c5de", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3caf7ce2d8ba3d281faab73ce467765b26d02f97 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 4 Feb 2019 16:02:35 -0800 Subject: [PATCH 2430/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232384396 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f1421fa0492..5740d2f2cf0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "756cfcd14709d931d47eaf4cd6394bc2ca5d1f8b7b62195c3ac2b6037ca953ca", - git_commit = "3abed38c6ed4144a3a8faac1a818298a3b80c5de", + sha256 = "e6fd24dd8bb0881b8fc206f55de80c9f531e09f3ef4acb802f993e9b94f10307", + git_commit = "ae0fd7300f8077a5cca198da9a55fc6f81dbfe48", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 49c7d68a3f9d2b8202efa6a65d3f4dfdcf0a3c7a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 4 Feb 2019 17:02:03 -0800 Subject: [PATCH 2431/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232394136 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5740d2f2cf0..af1089191c6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e6fd24dd8bb0881b8fc206f55de80c9f531e09f3ef4acb802f993e9b94f10307", - git_commit = "ae0fd7300f8077a5cca198da9a55fc6f81dbfe48", + sha256 = "c7c76a282f238e4bd117eea1dc0790fdac0e4a42e52ec193a11debda4804e904", + git_commit = "8b491637336083b40e9d4a38524463b18ba2825c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d61e6634b6157f77f41c11071b91bbec4ddc12c9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 4 Feb 2019 18:02:34 -0800 Subject: [PATCH 2432/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232402411 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index af1089191c6..06ef7a5d92d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c7c76a282f238e4bd117eea1dc0790fdac0e4a42e52ec193a11debda4804e904", - git_commit = "8b491637336083b40e9d4a38524463b18ba2825c", + sha256 = "b2619e660becd1247eb070d0679875b18004b00121a4f112dc66b2709ac9e798", + git_commit = "038a9fd67b7f7e0284bb24269d81ac076409e077", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5504833d7a0afc4dbdee2ce6c4bbdab665b3917e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 4 Feb 2019 19:02:23 -0800 Subject: [PATCH 2433/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232408574 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 06ef7a5d92d..b9e677ba187 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b2619e660becd1247eb070d0679875b18004b00121a4f112dc66b2709ac9e798", - git_commit = "038a9fd67b7f7e0284bb24269d81ac076409e077", + sha256 = "7bc18d30a3bc88890483017fdb42484e4449dab39acb108afe19844b3a868428", + git_commit = "be6d1285be1a15708a434ba5777a4194113e4a2a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 89c3035932b786237f97a53d64645decdff27a57 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 4 Feb 2019 20:02:05 -0800 Subject: [PATCH 2434/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232413625 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b9e677ba187..f179a0e5c8b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7bc18d30a3bc88890483017fdb42484e4449dab39acb108afe19844b3a868428", - git_commit = "be6d1285be1a15708a434ba5777a4194113e4a2a", + sha256 = "a018c20d70bff24f3783938f1231e9972e66479ea63e99ef107d07e0fd76fe03", + git_commit = "ea71fdda0a336a03efd2679cb0559f9d0c293bb9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b44b6c3709dcb6e0e499460aa8f63cea91d131d6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 4 Feb 2019 21:01:50 -0800 Subject: [PATCH 2435/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232418452 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f179a0e5c8b..d5b5e7d482c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a018c20d70bff24f3783938f1231e9972e66479ea63e99ef107d07e0fd76fe03", - git_commit = "ea71fdda0a336a03efd2679cb0559f9d0c293bb9", + sha256 = "3cb49dd0972fdedf151104ffa74289f51850933a12fbf054eae93a78de6b5152", + git_commit = "4eb175485c45a93ff56cf731622b57f4cb26b5be", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 54f100f326658ccf9e96478b45f644c1143ccd23 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 4 Feb 2019 22:02:19 -0800 Subject: [PATCH 2436/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232423436 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d5b5e7d482c..b1fe0ea6e98 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3cb49dd0972fdedf151104ffa74289f51850933a12fbf054eae93a78de6b5152", - git_commit = "4eb175485c45a93ff56cf731622b57f4cb26b5be", + sha256 = "aa5ec9d34e3da092f5ef1efd4fa7f21244e4bc2206aec01dcfe50a1a27f0727c", + git_commit = "08dfb770b18f82d11de3c11c491ab9e97820a435", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6c1d05a5bfe08d32ce59c92db5ea59ae0c5cfede Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 5 Feb 2019 00:02:55 -0800 Subject: [PATCH 2437/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232432501 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b1fe0ea6e98..483d9eab54b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "aa5ec9d34e3da092f5ef1efd4fa7f21244e4bc2206aec01dcfe50a1a27f0727c", - git_commit = "08dfb770b18f82d11de3c11c491ab9e97820a435", + sha256 = "df5a01f852cd3b0b31a0fba30d1ac5981a80a0b37d24c52e45f1aaa2cd09b785", + git_commit = "783cdae78c3fdce1de859f974dfdcafdb38d4251", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1c20b6f34595e2e90ed0c9ab06451631688093f0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 5 Feb 2019 03:03:08 -0800 Subject: [PATCH 2438/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232453147 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 483d9eab54b..917490c2129 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "df5a01f852cd3b0b31a0fba30d1ac5981a80a0b37d24c52e45f1aaa2cd09b785", - git_commit = "783cdae78c3fdce1de859f974dfdcafdb38d4251", + sha256 = "81dce247dc5bd2664f3b801c3bf40ca2f8ff1b5db2b156c9cc60d228e6b89466", + git_commit = "f4df3fcb00a7b3acd86443c6550c48f890cb71ff", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 73a3e5f451578f70d99542bf03dab2de92f08b34 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 5 Feb 2019 05:02:04 -0800 Subject: [PATCH 2439/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232464548 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 917490c2129..9af3a8889ad 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "81dce247dc5bd2664f3b801c3bf40ca2f8ff1b5db2b156c9cc60d228e6b89466", - git_commit = "f4df3fcb00a7b3acd86443c6550c48f890cb71ff", + sha256 = "0c26b62166eabcbfbaf086dc54acbfcae1e8d6f968df10226b97f8d3aae52fc6", + git_commit = "134f3fbeadacb8a1096a77e36d4208f20086751f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b9fc52b821e2069b5b06773c447021d7dc4ef2db Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 5 Feb 2019 08:03:10 -0800 Subject: [PATCH 2440/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232486926 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9af3a8889ad..43eae5b5926 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0c26b62166eabcbfbaf086dc54acbfcae1e8d6f968df10226b97f8d3aae52fc6", - git_commit = "134f3fbeadacb8a1096a77e36d4208f20086751f", + sha256 = "180a438762c2f37bcee6b4fb2fbab52dfb8316b7bdacc4df9de921065b839afe", + git_commit = "441fb2b81ebd947ab287f0191ed69160e71eece5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 380c3fd8473b467089afcd4248d9c2fdb5e9046e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 5 Feb 2019 10:02:47 -0800 Subject: [PATCH 2441/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232506805 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 43eae5b5926..14ecd611566 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "180a438762c2f37bcee6b4fb2fbab52dfb8316b7bdacc4df9de921065b839afe", - git_commit = "441fb2b81ebd947ab287f0191ed69160e71eece5", + sha256 = "afc7b27377c75232dbd5247ab5ecd708d529c5d96be9eeb64de36954ce90cf89", + git_commit = "95a722499340d2ee9b9f4d7e3af6d9be3d71276d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 49d3642ebe53501f4cc7bc8deecc370371975c2c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 5 Feb 2019 11:02:14 -0800 Subject: [PATCH 2442/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232519055 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 14ecd611566..fdf924cc570 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "afc7b27377c75232dbd5247ab5ecd708d529c5d96be9eeb64de36954ce90cf89", - git_commit = "95a722499340d2ee9b9f4d7e3af6d9be3d71276d", + sha256 = "52009d1d7f733744187386349e1d0045847cd11991e59289ebcb1a496361b8f0", + git_commit = "15f93e11b05802ca9318a5707cdcd859a15cd019", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ac8b8f6cacbf8cfd5e585d4e740dc4e24f4d6d7f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 5 Feb 2019 12:02:08 -0800 Subject: [PATCH 2443/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232531324 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fdf924cc570..6667c1576e4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "52009d1d7f733744187386349e1d0045847cd11991e59289ebcb1a496361b8f0", - git_commit = "15f93e11b05802ca9318a5707cdcd859a15cd019", + sha256 = "6d13fe6088e4fbe0df19d1ba3cd069ac131be31e35c49c68a5de15f0949bae12", + git_commit = "cc79252c0b5949506fce1d01b78e96e564a9c20f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3609df63fb18dc00d965ab605b1e83733a5edbd2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 5 Feb 2019 13:01:53 -0800 Subject: [PATCH 2444/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232541802 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6667c1576e4..866d3de5752 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6d13fe6088e4fbe0df19d1ba3cd069ac131be31e35c49c68a5de15f0949bae12", - git_commit = "cc79252c0b5949506fce1d01b78e96e564a9c20f", + sha256 = "7956b6728c9c04cc2fb2b190920d5441119a9a958ce9ec0b3df80412acf08185", + git_commit = "a751c3d1f52ad161ffaa5fd0ef9a3cdbf46bbb8a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From fce7e191adb8ae1c34ef3872fd62696131dc780c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 5 Feb 2019 14:01:56 -0800 Subject: [PATCH 2445/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232553367 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 866d3de5752..d67347b9553 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7956b6728c9c04cc2fb2b190920d5441119a9a958ce9ec0b3df80412acf08185", - git_commit = "a751c3d1f52ad161ffaa5fd0ef9a3cdbf46bbb8a", + sha256 = "f4875583266bf27b4592306e6488da8e36bb230abf6f591bd1a341258a383a42", + git_commit = "761a98c6f12c4e3714d47cc402aef30fafe2ba6b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 71092e448c5432f4411f7333a02b274f0a3cdd3f Mon Sep 17 00:00:00 2001 From: Karthik Vadla Date: Wed, 16 Jan 2019 12:29:18 -0800 Subject: [PATCH 2446/8103] split tensorflow_session_parallelis fix syntax Rename Remove comments Update dockerfile envs Fix typo Add Feedback changes Update feedback changes Add backward compatability for TENSORFLOW_SESSION_PARALLELISM env Update feedback changes Logic tweaks Reformat --- tensorflow_serving/model_servers/main.cc | 12 ++++++++++ tensorflow_serving/model_servers/server.cc | 24 +++++++++++++++++-- tensorflow_serving/model_servers/server.h | 4 ++++ .../tools/docker/Dockerfile.devel-mkl | 1 - .../tools/docker/Dockerfile.mkl | 16 +++++++++++-- 5 files changed, 52 insertions(+), 5 deletions(-) diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index 3dc01a84db7..72c5aa5116a 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -121,6 +121,18 @@ int main(int argc, char** argv) { "Tensorflow session. Auto-configured by default." "Note that this option is ignored if " "--platform_config_file is non-empty."), + tensorflow::Flag("tensorflow_intra_op_parallelism", + &options.tensorflow_intra_op_parallelism, + "Number of threads to use to parallelize the execution" + "of an individual op. Auto-configured by default." + "Note that this option is ignored if " + "--platform_config_file is non-empty."), + tensorflow::Flag("tensorflow_inter_op_parallelism", + &options.tensorflow_inter_op_parallelism, + "Controls the number of operators that can be executed " + "simultaneously. Auto-configured by default." + "Note that this option is ignored if " + "--platform_config_file is non-empty."), tensorflow::Flag( "ssl_config_file", &options.ssl_config_file, "If non-empty, read an ascii SSLConfig protobuf from " diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index 7833ec1d8d8..fcf4465f97d 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -221,12 +221,32 @@ Status Server::BuildAndStart(const Options& server_options) { ->mutable_gpu_options() ->set_per_process_gpu_memory_fraction( server_options.per_process_gpu_memory_fraction); - session_bundle_config.mutable_session_config() + + if(server_options.tensorflow_intra_op_parallelism > 0 && + server_options.tensorflow_inter_op_parallelism > 0 && + server_options.tensorflow_session_parallelism > 0){ + return errors::InvalidArgument("Either configure " + "server_options.tensorflow_session_parallelism " + "or (server_options.tensorflow_intra_op_parallelism, " + "server_options.tensorflow_inter_op_parallelism). " + "You cannot configure all."); + }else if(server_options.tensorflow_intra_op_parallelism > 0 || + server_options.tensorflow_inter_op_parallelism > 0){ + session_bundle_config.mutable_session_config() + ->set_intra_op_parallelism_threads( + server_options.tensorflow_intra_op_parallelism); + session_bundle_config.mutable_session_config() + ->set_inter_op_parallelism_threads( + server_options.tensorflow_inter_op_parallelism); + }else{ + session_bundle_config.mutable_session_config() ->set_intra_op_parallelism_threads( server_options.tensorflow_session_parallelism); - session_bundle_config.mutable_session_config() + session_bundle_config.mutable_session_config() ->set_inter_op_parallelism_threads( server_options.tensorflow_session_parallelism); + } + const std::vector tags = tensorflow::str_util::Split(server_options.saved_model_tags, ","); for (const string& tag : tags) { diff --git a/tensorflow_serving/model_servers/server.h b/tensorflow_serving/model_servers/server.h index 85f177cffe1..e6776392d7b 100644 --- a/tensorflow_serving/model_servers/server.h +++ b/tensorflow_serving/model_servers/server.h @@ -64,6 +64,10 @@ class Server { // Tensorflow session parallelism of zero means that both inter and intra op // thread pools will be auto configured. tensorflow::int64 tensorflow_session_parallelism = 0; + + // Zero means that the thread pools will be auto configured. + tensorflow::int64 tensorflow_intra_op_parallelism = 0; + tensorflow::int64 tensorflow_inter_op_parallelism = 0; tensorflow::string platform_config_file; tensorflow::string ssl_config_file; string model_config_file; diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl index d59d6273f54..46cc2ff17e0 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl @@ -77,7 +77,6 @@ RUN git clone --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tenso git remote add upstream https://github.com/tensorflow/serving.git && \ if [ "${TF_SERVING_VERSION_GIT_COMMIT}" != "head" ]; then git checkout ${TF_SERVING_VERSION_GIT_COMMIT} ; fi - FROM base_build as binary_build # Build, and install TensorFlow Serving diff --git a/tensorflow_serving/tools/docker/Dockerfile.mkl b/tensorflow_serving/tools/docker/Dockerfile.mkl index 16a244a5d03..54e40bca772 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.mkl +++ b/tensorflow_serving/tools/docker/Dockerfile.mkl @@ -81,11 +81,23 @@ ENV KMP_SETTINGS=1 ENV KMP_AFFINITY='granularity=fine,verbose,compact,1,0' ENV MKLDNN_VERBOSE=0 -ENV TENSORFLOW_SESSION_PARALLELISM=2 +# You can set either TENSORFLOW_SESSION_PARALLELISM or +# TENSORFLOW_INTRA_OP_PARALLELISM and TENSORFLOW_INTER_OP_PARALLELISM envs separately. +# Please comment or uncomment as required. +# If you want to set TENSORFLOW_SESSION_PARALLELISM, uncomment respective env and line in bash script below +# and comment out TENSORFLOW_INTRA_OP_PARALLELISM and TENSORFLOW_INTER_OP_PARALLELISM along with respective +# lines in below bash script. + +#ENV TENSORFLOW_SESSION_PARALLELISM=2 + +ENV TENSORFLOW_INTRA_OP_PARALLELISM=2 +ENV TENSORFLOW_INTER_OP_PARALLELISM=2 RUN echo '#!/bin/bash \n\n\ tensorflow_model_server --port=8500 --rest_api_port=8501 \ ---tensorflow_session_parallelism=${TENSORFLOW_SESSION_PARALLELISM} \ +#--tensorflow_session_parallelism=${TENSORFLOW_SESSION_PARALLELISM} \ +--tensorflow_intra_op_parallelism=${TENSORFLOW_INTRA_OP_PARALLELISM} \ +--tensorflow_inter_op_parallelism=${TENSORFLOW_INTER_OP_PARALLELISM} \ --model_name=${MODEL_NAME} --model_base_path=${MODEL_BASE_PATH}/${MODEL_NAME} \ "$@"' > /usr/bin/tf_serving_entrypoint.sh \ && chmod +x /usr/bin/tf_serving_entrypoint.sh From e1d4a0c082d318861d0d27648013245846447e64 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 5 Feb 2019 15:01:55 -0800 Subject: [PATCH 2447/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232565023 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d67347b9553..581c2d1a4ff 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f4875583266bf27b4592306e6488da8e36bb230abf6f591bd1a341258a383a42", - git_commit = "761a98c6f12c4e3714d47cc402aef30fafe2ba6b", + sha256 = "2b367dcf97b4a0bfeb90432b962cba9da9300992bf8836828e78709e118cc76c", + git_commit = "37479879a931a298986999f15d4c1bd4ec2345a9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 65e1d0b3748ef7d1d6ae6aed9a9942e7253612c1 Mon Sep 17 00:00:00 2001 From: Karthik Vadla Date: Tue, 5 Feb 2019 15:23:02 -0800 Subject: [PATCH 2448/8103] Remove TENSORFLOW_SESSION_PARALLELISM comments --- tensorflow_serving/tools/docker/Dockerfile.mkl | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.mkl b/tensorflow_serving/tools/docker/Dockerfile.mkl index 54e40bca772..c69967855fd 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.mkl +++ b/tensorflow_serving/tools/docker/Dockerfile.mkl @@ -81,21 +81,18 @@ ENV KMP_SETTINGS=1 ENV KMP_AFFINITY='granularity=fine,verbose,compact,1,0' ENV MKLDNN_VERBOSE=0 -# You can set either TENSORFLOW_SESSION_PARALLELISM or -# TENSORFLOW_INTRA_OP_PARALLELISM and TENSORFLOW_INTER_OP_PARALLELISM envs separately. -# Please comment or uncomment as required. -# If you want to set TENSORFLOW_SESSION_PARALLELISM, uncomment respective env and line in bash script below -# and comment out TENSORFLOW_INTRA_OP_PARALLELISM and TENSORFLOW_INTER_OP_PARALLELISM along with respective -# lines in below bash script. - -#ENV TENSORFLOW_SESSION_PARALLELISM=2 +# Recommended settings, may vary depending on the model. +# Set TENSORFLOW_INTRA_OP_PARALLELISM=#No.of Physical cores +# Set TENSORFLOW_INTER_OP_PARALLELISM=#No.of Sockets +# For more information vist below reference +# https://www.tensorflow.org/guide/performance/overview#tuning_mkl_for_the_best_performance +# Defaults ENV TENSORFLOW_INTRA_OP_PARALLELISM=2 ENV TENSORFLOW_INTER_OP_PARALLELISM=2 RUN echo '#!/bin/bash \n\n\ tensorflow_model_server --port=8500 --rest_api_port=8501 \ -#--tensorflow_session_parallelism=${TENSORFLOW_SESSION_PARALLELISM} \ --tensorflow_intra_op_parallelism=${TENSORFLOW_INTRA_OP_PARALLELISM} \ --tensorflow_inter_op_parallelism=${TENSORFLOW_INTER_OP_PARALLELISM} \ --model_name=${MODEL_NAME} --model_base_path=${MODEL_BASE_PATH}/${MODEL_NAME} \ From 2da8fa30adfa43be13176d03136bd3ff7232ae03 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 5 Feb 2019 16:02:16 -0800 Subject: [PATCH 2449/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232576544 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 581c2d1a4ff..5d1fc4b3ef9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2b367dcf97b4a0bfeb90432b962cba9da9300992bf8836828e78709e118cc76c", - git_commit = "37479879a931a298986999f15d4c1bd4ec2345a9", + sha256 = "8213a471830029d2a9b010ea0e0ed758b116775c26d0b87dd495054340c9773a", + git_commit = "9b73a8ee12dbc4e442baf93e566c8696bdbfebe1", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From abcd65b81f99d9260c0610461f1c7cf511a3cc33 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 5 Feb 2019 17:01:52 -0800 Subject: [PATCH 2450/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232586723 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5d1fc4b3ef9..463597191d4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8213a471830029d2a9b010ea0e0ed758b116775c26d0b87dd495054340c9773a", - git_commit = "9b73a8ee12dbc4e442baf93e566c8696bdbfebe1", + sha256 = "68c08d0024bcc502791fce0935b382a5a59b7516e21e410fefc2c86a2b57ff45", + git_commit = "e35778a865142289dd749ea2c907e13b7756af8b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f3ff7e87662b620afe96cbc2c2a684a153ad2428 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 5 Feb 2019 18:02:05 -0800 Subject: [PATCH 2451/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232594857 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 463597191d4..e7d3479e8c2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "68c08d0024bcc502791fce0935b382a5a59b7516e21e410fefc2c86a2b57ff45", - git_commit = "e35778a865142289dd749ea2c907e13b7756af8b", + sha256 = "eedc4cc335f5cecc5efe2a0663a42055a75bd5b08a072f7d833dbc40fc6f9cbb", + git_commit = "fbd1d1752adb388fc00c409de0ec7952e36ed8b6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From dcf13b4eaad204458d3f201928fbd76df7cc90b1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 5 Feb 2019 19:02:17 -0800 Subject: [PATCH 2452/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232601350 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e7d3479e8c2..f362c5c6b0d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eedc4cc335f5cecc5efe2a0663a42055a75bd5b08a072f7d833dbc40fc6f9cbb", - git_commit = "fbd1d1752adb388fc00c409de0ec7952e36ed8b6", + sha256 = "5b54fdd906d89479f4a579d9dc371e060e21a3fb4c195e11ef9dc3efd5187ed0", + git_commit = "05d9d59f14555c1111f9398bcc267817c981e688", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d6377d0078c8c5058268a4f5972e303c13933bc0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 5 Feb 2019 20:02:07 -0800 Subject: [PATCH 2453/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232606341 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f362c5c6b0d..c0ce9b70677 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5b54fdd906d89479f4a579d9dc371e060e21a3fb4c195e11ef9dc3efd5187ed0", - git_commit = "05d9d59f14555c1111f9398bcc267817c981e688", + sha256 = "882012a690d70529284327bde2e4cb44bf26208067377667b6a7a1227721a865", + git_commit = "6a8670aa2c512afdbbcab1682857f26826f54f91", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a53a8c0cbd0f5c01050b4981a48148a6a504d2b1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 5 Feb 2019 22:01:56 -0800 Subject: [PATCH 2454/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232616075 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c0ce9b70677..b4691a03d24 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "882012a690d70529284327bde2e4cb44bf26208067377667b6a7a1227721a865", - git_commit = "6a8670aa2c512afdbbcab1682857f26826f54f91", + sha256 = "10dd7be5320ed921d0c1c5217ae1a666a95677551506408c5a0877ccd3d40011", + git_commit = "ebb2e9f4efe0eb3ff54d159b536ad99b06c8a6fe", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b2fea157bbb25b99bac50f248bdda3f1b7cf73af Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 6 Feb 2019 02:02:06 -0800 Subject: [PATCH 2455/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232638179 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b4691a03d24..d1855581c10 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "10dd7be5320ed921d0c1c5217ae1a666a95677551506408c5a0877ccd3d40011", - git_commit = "ebb2e9f4efe0eb3ff54d159b536ad99b06c8a6fe", + sha256 = "7c55c72fdcb159bd74cbcf6c1fc1a4d861092d671bc3f5fc884d28a168eb28ee", + git_commit = "2102c1226816b82d2f34b6348b0f2ac302611f02", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From bba321460c252c6fd8a8ed28200f547ae983198f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 6 Feb 2019 03:02:13 -0800 Subject: [PATCH 2456/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232644420 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d1855581c10..7ea84b87a6a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7c55c72fdcb159bd74cbcf6c1fc1a4d861092d671bc3f5fc884d28a168eb28ee", - git_commit = "2102c1226816b82d2f34b6348b0f2ac302611f02", + sha256 = "eac42900e781606faec52be28ff341f8d5219038844c02ca2c7f758895302e1d", + git_commit = "e5b9fdd4c77b0240b06996e15122741120d97685", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 09676d031843e2bda0062bfa53f0fd5d72b7cfa6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 6 Feb 2019 07:02:48 -0800 Subject: [PATCH 2457/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232668364 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7ea84b87a6a..084e48de1b3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eac42900e781606faec52be28ff341f8d5219038844c02ca2c7f758895302e1d", - git_commit = "e5b9fdd4c77b0240b06996e15122741120d97685", + sha256 = "9911d8d7ab528de83ef20108ee3ba17de3f64f5da092c797af331c43adfc8619", + git_commit = "d20954874dab39dc67fd2222003b9ab5ea4840d5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 590088975aa0fb5dc3e047c62ceb4572570685f1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 6 Feb 2019 08:02:38 -0800 Subject: [PATCH 2458/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232675774 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 084e48de1b3..c3e94cfd5d0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9911d8d7ab528de83ef20108ee3ba17de3f64f5da092c797af331c43adfc8619", - git_commit = "d20954874dab39dc67fd2222003b9ab5ea4840d5", + sha256 = "416b2d78f5137159006d2e103b6262fa6f24550e157c4834b0b5c21661009339", + git_commit = "2f672ee9562a452f8dbfa259a8ccec56367e9b17", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 83e1c5ca0ff4c08cee0b5591d408d0647fd87966 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 6 Feb 2019 09:01:56 -0800 Subject: [PATCH 2459/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232684494 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c3e94cfd5d0..912196a3df7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "416b2d78f5137159006d2e103b6262fa6f24550e157c4834b0b5c21661009339", - git_commit = "2f672ee9562a452f8dbfa259a8ccec56367e9b17", + sha256 = "679c03c7034c2cbc995588efa22c0a4b38fab77f7c7bd929c0efe694d0f21ef4", + git_commit = "2ccb446ecf92dc01df0a60d965561944d82e405b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 86ffa55773c8c8e0684fe9b90b4da01c41821c9a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 6 Feb 2019 10:02:42 -0800 Subject: [PATCH 2460/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232694220 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 912196a3df7..143ad2d976f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "679c03c7034c2cbc995588efa22c0a4b38fab77f7c7bd929c0efe694d0f21ef4", - git_commit = "2ccb446ecf92dc01df0a60d965561944d82e405b", + sha256 = "6e707fd5a16d58e87bc47ec180147d58b9a9dffb691ad73b5536dd9943f0ae61", + git_commit = "4eef6deec6995e07a2d07a94f647f208d43fecfa", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3b7e8c721f05d110735abee5fd59e7cbd8481df7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 6 Feb 2019 11:02:19 -0800 Subject: [PATCH 2461/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232706432 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 143ad2d976f..b8ef0ffdaec 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6e707fd5a16d58e87bc47ec180147d58b9a9dffb691ad73b5536dd9943f0ae61", - git_commit = "4eef6deec6995e07a2d07a94f647f208d43fecfa", + sha256 = "ebb5b7d8fadc6be5034a0082bb9e3dfc2bb98729088830041c681ed2d214ba92", + git_commit = "1f856fb5d978177123ddd5ac5a3e4bb669288d65", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ec1ac2f6b3d7cc81948f1aa70ca1b72961dec8b1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 6 Feb 2019 12:03:10 -0800 Subject: [PATCH 2462/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232719008 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b8ef0ffdaec..102466c7084 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ebb5b7d8fadc6be5034a0082bb9e3dfc2bb98729088830041c681ed2d214ba92", - git_commit = "1f856fb5d978177123ddd5ac5a3e4bb669288d65", + sha256 = "d05f6f700959786fd5334f92c1a11b4c2df4cd08fa4f354c2febb0b481c75558", + git_commit = "1362eaa98e3e7778446eb767473450ef484996ca", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 11d2ec1608e41d0621bddbe8381b6fa528f4cb90 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 6 Feb 2019 13:01:44 -0800 Subject: [PATCH 2463/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232729297 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 102466c7084..096542fb9ed 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d05f6f700959786fd5334f92c1a11b4c2df4cd08fa4f354c2febb0b481c75558", - git_commit = "1362eaa98e3e7778446eb767473450ef484996ca", + sha256 = "97facb5f2745bc8945102a05b7d0b956d1d01ad23067eb1c1d75c067b1444a33", + git_commit = "86950c2c440be956a9fcb3a25868a1df15444467", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d802ca945b957a722d13904c7f980921c7c57b26 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 6 Feb 2019 14:01:53 -0800 Subject: [PATCH 2464/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232741414 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 096542fb9ed..b70c0d1055f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "97facb5f2745bc8945102a05b7d0b956d1d01ad23067eb1c1d75c067b1444a33", - git_commit = "86950c2c440be956a9fcb3a25868a1df15444467", + sha256 = "4c7bf2a65a97fe076e87682b1bf8328afc0300d6322f0a7696128e91afa51f48", + git_commit = "ba9f4c017cdd95e5d507635215133bb97fc7216d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 390eb8946f90032876b65daebe90cc5971e09cf1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 6 Feb 2019 15:01:52 -0800 Subject: [PATCH 2465/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232753863 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b70c0d1055f..5f4ab2c6517 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4c7bf2a65a97fe076e87682b1bf8328afc0300d6322f0a7696128e91afa51f48", - git_commit = "ba9f4c017cdd95e5d507635215133bb97fc7216d", + sha256 = "08a68720db9023580f8e0528c1825332b89ba1651ee32459da165fd75b847f8c", + git_commit = "1a5abfb53c00bb37173bfd858be5a20d1d00f39d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0e1ef6eec8d92d44798b2b09044fcac925b3a8c4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 6 Feb 2019 16:02:23 -0800 Subject: [PATCH 2466/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232765979 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5f4ab2c6517..a1904038778 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "08a68720db9023580f8e0528c1825332b89ba1651ee32459da165fd75b847f8c", - git_commit = "1a5abfb53c00bb37173bfd858be5a20d1d00f39d", + sha256 = "9a933645e0ab56c53b6dcaf4f9cb208951bb773474cf754302be30e44617efe3", + git_commit = "95d958336276d1b054242ca2506f267c7de145dc", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3c97f3c3b5e859eee094ee7e9d20cbc6e9fd5d3b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 6 Feb 2019 17:02:09 -0800 Subject: [PATCH 2467/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232776907 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a1904038778..a6206450b2a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9a933645e0ab56c53b6dcaf4f9cb208951bb773474cf754302be30e44617efe3", - git_commit = "95d958336276d1b054242ca2506f267c7de145dc", + sha256 = "c9cb29dc19cba1e242b697acdaafd5efdc051451d400077d8cfff92b0a4df86e", + git_commit = "2b7686e953b9964addb95170b6f613eb2d3d9f41", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 398e9f53ad6852b2bb685b3c99aeacee944ef870 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 6 Feb 2019 18:02:07 -0800 Subject: [PATCH 2468/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232785395 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a6206450b2a..5f739606abd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c9cb29dc19cba1e242b697acdaafd5efdc051451d400077d8cfff92b0a4df86e", - git_commit = "2b7686e953b9964addb95170b6f613eb2d3d9f41", + sha256 = "727446cfa8922ab117c52db9baef47f63e75a0741dec33ab1b855073895e0f32", + git_commit = "124b6e16b4b3d49b05d4660993e2884dc0aac703", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4df577ad67eb6b0baf0e6d2d1219be8bf2aae6db Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 6 Feb 2019 19:01:58 -0800 Subject: [PATCH 2469/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232792142 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5f739606abd..43a3ff84718 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "727446cfa8922ab117c52db9baef47f63e75a0741dec33ab1b855073895e0f32", - git_commit = "124b6e16b4b3d49b05d4660993e2884dc0aac703", + sha256 = "d2365e90b7cc558c0dd2d529375af274f0ccd59160839829956d1d9a5dca3e46", + git_commit = "9e9f25fbe8dab6013448e6ceae36f60115065f41", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 25fdc4f08d96e35294070cd9d8d4996aa9912983 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 6 Feb 2019 21:01:57 -0800 Subject: [PATCH 2470/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232803470 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 43a3ff84718..87342b0b82e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d2365e90b7cc558c0dd2d529375af274f0ccd59160839829956d1d9a5dca3e46", - git_commit = "9e9f25fbe8dab6013448e6ceae36f60115065f41", + sha256 = "69f2d96c35d5ac0b5b18e659966b96231b35bc33233537b2acba8e2cd26bef84", + git_commit = "dd1d9f654988695b86e854818b65ccda8e84515d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 00dc795732f7861013b0c197494dfa9c5dfc2cd5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 6 Feb 2019 22:02:15 -0800 Subject: [PATCH 2471/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232808672 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 87342b0b82e..da62b2ac4b6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "69f2d96c35d5ac0b5b18e659966b96231b35bc33233537b2acba8e2cd26bef84", - git_commit = "dd1d9f654988695b86e854818b65ccda8e84515d", + sha256 = "c85a2de5729e6ad9a1799a5b6097a7b8d5bfe9ce1eac05111622ad4cf08fa6c0", + git_commit = "a252fe83f4dc29c0614983046825ec75a3529cb9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 435e49f41e1472cd2ff8ee46a932e75567c43bbf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 6 Feb 2019 23:02:01 -0800 Subject: [PATCH 2472/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232813416 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index da62b2ac4b6..953d98087ec 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c85a2de5729e6ad9a1799a5b6097a7b8d5bfe9ce1eac05111622ad4cf08fa6c0", - git_commit = "a252fe83f4dc29c0614983046825ec75a3529cb9", + sha256 = "95b05d52d1e850b75f56b8175ae2725d755be73eab98fea59e41762604a641bf", + git_commit = "6a7c03870ade37d2f29b8314a1628af71c6bf094", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 517a2bb96d4001b39520f0c7fbdd51a00f7c571a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Feb 2019 00:01:59 -0800 Subject: [PATCH 2473/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232818624 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 953d98087ec..9bf679a7595 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "95b05d52d1e850b75f56b8175ae2725d755be73eab98fea59e41762604a641bf", - git_commit = "6a7c03870ade37d2f29b8314a1628af71c6bf094", + sha256 = "0ed2c1023e25700fae3d1564c46c8ba7d1ee2656c7df3f79e1a8aec71aa50b4b", + git_commit = "ab842858b00d3fed43c3476990c13bdb0086b8ce", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b27e38ab7ed1b58853e50a6d1fc3a3034d99057e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Feb 2019 01:02:29 -0800 Subject: [PATCH 2474/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232826436 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9bf679a7595..9fc704f65f2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0ed2c1023e25700fae3d1564c46c8ba7d1ee2656c7df3f79e1a8aec71aa50b4b", - git_commit = "ab842858b00d3fed43c3476990c13bdb0086b8ce", + sha256 = "134a7f638cce6bed51276e0d6a1b05412463a035d67fa020874b1e0da0785529", + git_commit = "4987df47a13b8243900ab78eee9a14a7c589880d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 89dc369e1168939e4c044635f8d663e7f054dc59 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Feb 2019 02:02:35 -0800 Subject: [PATCH 2475/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232833215 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9fc704f65f2..a977a264d10 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "134a7f638cce6bed51276e0d6a1b05412463a035d67fa020874b1e0da0785529", - git_commit = "4987df47a13b8243900ab78eee9a14a7c589880d", + sha256 = "ab9149ce86be3cd9944b5b5c34d02c32b2ad3b1f430e8884c0139873e1a9bf2d", + git_commit = "3a4b3241eec5fe75c55bb4844966700ba7cb4906", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6959cb18023fd5f97ee38995b13e2307b1670a03 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Feb 2019 03:02:14 -0800 Subject: [PATCH 2476/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232839508 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a977a264d10..ffe0435afb1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ab9149ce86be3cd9944b5b5c34d02c32b2ad3b1f430e8884c0139873e1a9bf2d", - git_commit = "3a4b3241eec5fe75c55bb4844966700ba7cb4906", + sha256 = "8d44badaeb9bc26ef6df2b6236ce140e7404008eea98ea2f3967f51b286c28b8", + git_commit = "42d8403ace8f494dfd1207a6a1f641f1ad6706ea", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e62fd77f08d6721277f789de46defcaebe1d540f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Feb 2019 04:02:52 -0800 Subject: [PATCH 2477/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232845289 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ffe0435afb1..ec702b1d71d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8d44badaeb9bc26ef6df2b6236ce140e7404008eea98ea2f3967f51b286c28b8", - git_commit = "42d8403ace8f494dfd1207a6a1f641f1ad6706ea", + sha256 = "d1be0de53e9cd857de8e3af8605022b4d2d4d43d47d072655e443ff41c0faa1a", + git_commit = "101143e8d6cf124efc357858b5f60373aed834b9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From fe95050f48bd251f8fdd36688ddd1e252909d614 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Feb 2019 07:02:01 -0800 Subject: [PATCH 2478/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232867604 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ec702b1d71d..cd8d1c8f683 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d1be0de53e9cd857de8e3af8605022b4d2d4d43d47d072655e443ff41c0faa1a", - git_commit = "101143e8d6cf124efc357858b5f60373aed834b9", + sha256 = "f758622a3017d5279e5f2ac152746e446e931454d6660806c372510cf73f17be", + git_commit = "e199bac06979bdfc621758a4306a95ac24b8c467", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ca6a3572d7b8b4d4c4cb8ecedd70c21366edf851 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Feb 2019 09:01:54 -0800 Subject: [PATCH 2479/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232883990 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cd8d1c8f683..49a013357d5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f758622a3017d5279e5f2ac152746e446e931454d6660806c372510cf73f17be", - git_commit = "e199bac06979bdfc621758a4306a95ac24b8c467", + sha256 = "486e331eaf6e13b5958a76bfa95cbafdf9cc0671b001ef8cb65a41c6d52d4088", + git_commit = "f321e3c900dfda328edb946ff95c4eaba4cf4928", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e640266af24d2d026f6f24f8e0e4001ef9f4eda7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Feb 2019 10:02:09 -0800 Subject: [PATCH 2480/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232894167 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 49a013357d5..1f377625db1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "486e331eaf6e13b5958a76bfa95cbafdf9cc0671b001ef8cb65a41c6d52d4088", - git_commit = "f321e3c900dfda328edb946ff95c4eaba4cf4928", + sha256 = "f1245a678bb06d2fe04629d4dc9f709660b738d9510eadcfec5fb302789a0e4e", + git_commit = "9596d6dfaed8cac0f03279bd51e9839ff3bfe085", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9f9479ccf867ac5b37511c4231b6af83ba1e0021 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Feb 2019 11:02:22 -0800 Subject: [PATCH 2481/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232906909 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1f377625db1..7ac36e82950 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f1245a678bb06d2fe04629d4dc9f709660b738d9510eadcfec5fb302789a0e4e", - git_commit = "9596d6dfaed8cac0f03279bd51e9839ff3bfe085", + sha256 = "948845b0847e414acdf3ff9e299237d958bc0f4164b9eb450c0e8595aff91d6a", + git_commit = "81b9a950453a5ce4964f2e7bb535589da3708840", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f9befa015232b74b0627e137c5ade9f069972a86 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Feb 2019 12:03:12 -0800 Subject: [PATCH 2482/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232919090 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7ac36e82950..338b09ccd8a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "948845b0847e414acdf3ff9e299237d958bc0f4164b9eb450c0e8595aff91d6a", - git_commit = "81b9a950453a5ce4964f2e7bb535589da3708840", + sha256 = "b0070a0d502c999f5841d1e34fe450614069bf823068db528b0baf3e27dff189", + git_commit = "345788754c025534d487bb8cd01f535b840474b4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From dc26e574cf8ff03dc1f7c04b976e33f66010b213 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Feb 2019 13:02:01 -0800 Subject: [PATCH 2483/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232929066 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 338b09ccd8a..0335f890428 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b0070a0d502c999f5841d1e34fe450614069bf823068db528b0baf3e27dff189", - git_commit = "345788754c025534d487bb8cd01f535b840474b4", + sha256 = "9168d27f85049fba3ca887e96a146015e3a550620d77da956facfe7e7ba6b59b", + git_commit = "45a97891f26621e75754b08d01f75eff273554cb", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 64cb810c07444f7caa51f3ff2c22ed2cf066875c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Feb 2019 14:02:13 -0800 Subject: [PATCH 2484/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232940372 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0335f890428..fe1b97e2d1a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9168d27f85049fba3ca887e96a146015e3a550620d77da956facfe7e7ba6b59b", - git_commit = "45a97891f26621e75754b08d01f75eff273554cb", + sha256 = "8e87d6aa0a1753def9b9b2467ec4c5b3ce8bb35d40c6140ad5aae9e3c5c255af", + git_commit = "5b7063a3cfdc7710721924c5b4350c8265d5ff2d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 40845f90cabb57e8c1debaaf75445107b39aa5fe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Feb 2019 15:02:12 -0800 Subject: [PATCH 2485/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232951939 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fe1b97e2d1a..2f0fc36ac1a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8e87d6aa0a1753def9b9b2467ec4c5b3ce8bb35d40c6140ad5aae9e3c5c255af", - git_commit = "5b7063a3cfdc7710721924c5b4350c8265d5ff2d", + sha256 = "ae35509aa676e653d56eaec0646398b52a99fe838f581af26761721fb408f9e8", + git_commit = "670207218cd0af11c9fba210b4d4478fd731cf2a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 443019007214d044b85519d0e3327e5f7d21b070 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Feb 2019 16:02:12 -0800 Subject: [PATCH 2486/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232963385 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2f0fc36ac1a..4cf95965517 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ae35509aa676e653d56eaec0646398b52a99fe838f581af26761721fb408f9e8", - git_commit = "670207218cd0af11c9fba210b4d4478fd731cf2a", + sha256 = "b2cbb0cc4746f3530961de4301a277aaa1a3989d2f772281dcc84e627cfc3efa", + git_commit = "92b4da0f8e34139135c40c5b54a9dce2ddff9dc3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 41cfc060e4dbfa06a58b63055d341ea6f92266db Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Feb 2019 17:02:02 -0800 Subject: [PATCH 2487/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232973765 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4cf95965517..985b4ce9064 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b2cbb0cc4746f3530961de4301a277aaa1a3989d2f772281dcc84e627cfc3efa", - git_commit = "92b4da0f8e34139135c40c5b54a9dce2ddff9dc3", + sha256 = "787af65813be06f867498a320803d7bfcdfdb7c6d1ebc982f734693a1af25e0d", + git_commit = "20e1089c40941f585f0e4a1918b29272f078d5d0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From bb4bd5968aba36c95c920e59079639a0c2e6ec37 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Feb 2019 18:01:49 -0800 Subject: [PATCH 2488/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232981942 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 985b4ce9064..0cfe808a1cc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "787af65813be06f867498a320803d7bfcdfdb7c6d1ebc982f734693a1af25e0d", - git_commit = "20e1089c40941f585f0e4a1918b29272f078d5d0", + sha256 = "8ffcc2c8895d9d32f3b590a6e22a3ee18c1042d06c7830735b7484cfb862f243", + git_commit = "6699f80fde980fb2ebf8742733636130b05d6356", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8288cbdd5e72cb318f20d3c9b90ab0179984380c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Feb 2019 19:02:19 -0800 Subject: [PATCH 2489/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232988151 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0cfe808a1cc..487cff90ef5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8ffcc2c8895d9d32f3b590a6e22a3ee18c1042d06c7830735b7484cfb862f243", - git_commit = "6699f80fde980fb2ebf8742733636130b05d6356", + sha256 = "ae36ec5a417bd49eb442ecf2c15facc08bace26b0c33c05e624816adb2716716", + git_commit = "9edfbd753c403613d56f51893271a74acdaa46ef", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From dcb06fb63ef283a3035a4be2b45747d1317bbe3e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Feb 2019 20:02:19 -0800 Subject: [PATCH 2490/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232993498 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 487cff90ef5..75cea7b23e1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ae36ec5a417bd49eb442ecf2c15facc08bace26b0c33c05e624816adb2716716", - git_commit = "9edfbd753c403613d56f51893271a74acdaa46ef", + sha256 = "167721572ba903708585ff041cf6ba2cac8ebe182f578dc9c88d7d5842e8a078", + git_commit = "831f1d3aaef4cbce6ea61c229bd5531f35fc71dc", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e3629c5ec97a20f860dc3f20987f5a78572a2337 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Feb 2019 21:02:12 -0800 Subject: [PATCH 2491/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 232998443 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 75cea7b23e1..2b66d82bbde 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "167721572ba903708585ff041cf6ba2cac8ebe182f578dc9c88d7d5842e8a078", - git_commit = "831f1d3aaef4cbce6ea61c229bd5531f35fc71dc", + sha256 = "b16fb630ff1bf55f68960932203258a49b4c4841ca250b0e3a6be2f82ebd06fa", + git_commit = "063c51df5dfbca6bc0805118819aa8184292966a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f2d4c41f4e047f4d315253accfa747fa5e028633 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Feb 2019 23:03:30 -0800 Subject: [PATCH 2492/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233007866 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2b66d82bbde..e01f40dd66c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b16fb630ff1bf55f68960932203258a49b4c4841ca250b0e3a6be2f82ebd06fa", - git_commit = "063c51df5dfbca6bc0805118819aa8184292966a", + sha256 = "11c14d99d9c6442f326b4d888ad02323ad18796abcc12ace49481be0245cb205", + git_commit = "228421cebf60190bf2b8b300b34941e0a837757b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c0fe3e36b6de2c1d384b3e30c7a43fba2c8210a6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Feb 2019 00:02:07 -0800 Subject: [PATCH 2493/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233011881 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e01f40dd66c..6b9fc9edbbe 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "11c14d99d9c6442f326b4d888ad02323ad18796abcc12ace49481be0245cb205", - git_commit = "228421cebf60190bf2b8b300b34941e0a837757b", + sha256 = "aed1b5dc51e3d9efd4d71c86882377598a5364e04b8caf1404a41c925c82d073", + git_commit = "6b83e5ba308df15db0705c5662145b386b741280", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b963a2da458de26a9ae1de61ac3955c681df465d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Feb 2019 01:02:32 -0800 Subject: [PATCH 2494/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233019491 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6b9fc9edbbe..24f7cbc8e14 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "aed1b5dc51e3d9efd4d71c86882377598a5364e04b8caf1404a41c925c82d073", - git_commit = "6b83e5ba308df15db0705c5662145b386b741280", + sha256 = "c7bc8bde5fccfa8945c1dab99f0a3b0ec5f4365f9b950c9366dfb4b6001957e7", + git_commit = "4301ac109e5873682072b15ebebcb27916c32a4a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 229f1fa0d9317859bc5e1319a1a4a7b704ee52ab Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Feb 2019 03:02:22 -0800 Subject: [PATCH 2495/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233031304 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 24f7cbc8e14..5dc1c5bd483 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c7bc8bde5fccfa8945c1dab99f0a3b0ec5f4365f9b950c9366dfb4b6001957e7", - git_commit = "4301ac109e5873682072b15ebebcb27916c32a4a", + sha256 = "2c2ecb5fd8f7847425e8cc0391dd71d005a4895b15a39d51f923328ff1ee1158", + git_commit = "246f6482a240f5693bb28c326b9aa36ba48098ec", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1f0e052ca1175c667c48e6af3192ff29e3fd4cbe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Feb 2019 04:02:27 -0800 Subject: [PATCH 2496/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233036627 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5dc1c5bd483..b5f64f09e9d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2c2ecb5fd8f7847425e8cc0391dd71d005a4895b15a39d51f923328ff1ee1158", - git_commit = "246f6482a240f5693bb28c326b9aa36ba48098ec", + sha256 = "19fe60c807673909c1dbd0a623bd6768dbc6c8988ca5c4421a355db3e937c42c", + git_commit = "875785cd913b1b6b0d3eedac5b524a94207fda94", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5b031f47cd9616ed60c34851d4fd31e1f4d03b37 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Feb 2019 05:01:52 -0800 Subject: [PATCH 2497/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233041605 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b5f64f09e9d..d856e9e0a8f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "19fe60c807673909c1dbd0a623bd6768dbc6c8988ca5c4421a355db3e937c42c", - git_commit = "875785cd913b1b6b0d3eedac5b524a94207fda94", + sha256 = "ab194454af9a6d46912238c4c3664f31456ce4ea838b4e80d3acbf72c3d5a608", + git_commit = "a6671ccfc6d46f38eddfd80e506773d4fbd75e77", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 38a3451236af9346af670c7e46d2a7406964111d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Feb 2019 06:01:56 -0800 Subject: [PATCH 2498/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233046938 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d856e9e0a8f..d3784b76ab1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ab194454af9a6d46912238c4c3664f31456ce4ea838b4e80d3acbf72c3d5a608", - git_commit = "a6671ccfc6d46f38eddfd80e506773d4fbd75e77", + sha256 = "c08d2fb24ce063aed3fd1745a762033674b785bc2ea0d52983aad554a8767102", + git_commit = "34c4e686f4a5c17c88c64ee9825ef6ad92d05c32", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2a09f7d13257b12eff503cd59e8416147111e2b5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Feb 2019 07:02:06 -0800 Subject: [PATCH 2499/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233053528 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d3784b76ab1..338db123a9f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c08d2fb24ce063aed3fd1745a762033674b785bc2ea0d52983aad554a8767102", - git_commit = "34c4e686f4a5c17c88c64ee9825ef6ad92d05c32", + sha256 = "843c586787eb5aaab9c55eef107f8ecf3e2be66ecfc547cb12d27c35cd55a1a3", + git_commit = "dae9cabbe8fa18cee697c197f10c3a12658f7f10", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 79d4125dd50bef4d730a63542db3f2e2751b7567 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Feb 2019 08:01:57 -0800 Subject: [PATCH 2500/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233060739 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 338db123a9f..ab958659772 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "843c586787eb5aaab9c55eef107f8ecf3e2be66ecfc547cb12d27c35cd55a1a3", - git_commit = "dae9cabbe8fa18cee697c197f10c3a12658f7f10", + sha256 = "07a45f7c1860f38a2ea29e4011f2f545e8e6f40e446cd60e6c3b4bd8b7edd1f0", + git_commit = "f259cb4ac2cbe69c450d956bd3262a23d4a44291", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e1bca749345dc3104b303573b139fb8c4b6879a3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Feb 2019 09:01:50 -0800 Subject: [PATCH 2501/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233069165 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ab958659772..a2de88085aa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "07a45f7c1860f38a2ea29e4011f2f545e8e6f40e446cd60e6c3b4bd8b7edd1f0", - git_commit = "f259cb4ac2cbe69c450d956bd3262a23d4a44291", + sha256 = "65fac88763d29f5e65b7308d7a3ba35f5958d9e408b73656f39111b1979d7378", + git_commit = "ede109fc7bf32f7a7ef2763908b2606cfa4fa303", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a2cdc9e0618b12ca795e60476b542d958ef209fd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Feb 2019 10:01:52 -0800 Subject: [PATCH 2502/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233078434 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a2de88085aa..54dd4ef4c45 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "65fac88763d29f5e65b7308d7a3ba35f5958d9e408b73656f39111b1979d7378", - git_commit = "ede109fc7bf32f7a7ef2763908b2606cfa4fa303", + sha256 = "01e5426d83228d0a060110883f625c6ce5ebe80ea8ae515f8ba5799ff7fe6b64", + git_commit = "82cae29a5e82a241c5704998bd19457c56dbcee3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8aeb15b61502fb8694041f08f899ac77b31834bc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Feb 2019 12:02:04 -0800 Subject: [PATCH 2503/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233101551 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 54dd4ef4c45..db2098ac6cf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "01e5426d83228d0a060110883f625c6ce5ebe80ea8ae515f8ba5799ff7fe6b64", - git_commit = "82cae29a5e82a241c5704998bd19457c56dbcee3", + sha256 = "bbf7646faced270938d38f0115f8cd220b236ecf7243dc8f90446adc267841d5", + git_commit = "d7df4b9d0c82cec238c7c8bc5f6d93f95ba0705d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d8762dad82388da8ded7d2605e717797e6a82c6b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Feb 2019 13:01:45 -0800 Subject: [PATCH 2504/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233111481 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index db2098ac6cf..64892d14467 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bbf7646faced270938d38f0115f8cd220b236ecf7243dc8f90446adc267841d5", - git_commit = "d7df4b9d0c82cec238c7c8bc5f6d93f95ba0705d", + sha256 = "0d7e92afb147ef7b1047ba654af47c7067a176e4b6e0ce2aeae22e5fa3d51a52", + git_commit = "5c738693ad5d714eeba413b53a0f037f12fc2c82", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9d62ff5f5f664fdcd8c5547753223786c1d37a1c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Feb 2019 14:01:52 -0800 Subject: [PATCH 2505/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233122007 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 64892d14467..5cf48abec78 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0d7e92afb147ef7b1047ba654af47c7067a176e4b6e0ce2aeae22e5fa3d51a52", - git_commit = "5c738693ad5d714eeba413b53a0f037f12fc2c82", + sha256 = "d057a4c2dd1187b23e70dbe87f6cdfcf46c02d89bd447f88bbf8797bb0a2662a", + git_commit = "588b577e2cfb1848a48c11914bf4a7d580e377d6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 794e041798620deaac0f2f9339154b1d93e1b191 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Feb 2019 15:01:54 -0800 Subject: [PATCH 2506/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233132981 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5cf48abec78..63b30d992c3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d057a4c2dd1187b23e70dbe87f6cdfcf46c02d89bd447f88bbf8797bb0a2662a", - git_commit = "588b577e2cfb1848a48c11914bf4a7d580e377d6", + sha256 = "d0f6805251d28223967227ab76093694095e184b5a6c2b78df418de6e0151774", + git_commit = "96837731fec65f64c6ede565d895e9b38b22d13b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c6d367d1baa0a55217e13c32e8635cb8dd7b7b9d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Feb 2019 16:02:13 -0800 Subject: [PATCH 2507/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233143090 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 63b30d992c3..e7bc5da7922 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d0f6805251d28223967227ab76093694095e184b5a6c2b78df418de6e0151774", - git_commit = "96837731fec65f64c6ede565d895e9b38b22d13b", + sha256 = "8d54e64ca249dd0f07f0147a2f1267f76d0da0d65a377ae50c19be14d0c12e78", + git_commit = "0f5fd00006e6ef8bae5a5f62304f1cbb3c78e584", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 80d4d25d401c9952d359256c24390baa6710219a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Feb 2019 17:01:44 -0800 Subject: [PATCH 2508/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233152153 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e7bc5da7922..5e01f70b265 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8d54e64ca249dd0f07f0147a2f1267f76d0da0d65a377ae50c19be14d0c12e78", - git_commit = "0f5fd00006e6ef8bae5a5f62304f1cbb3c78e584", + sha256 = "b79dd43ae48abc0b8fb05f3a59a202860e17ebf74435da259b949873c1f973af", + git_commit = "882bf2ecae29d8f7c22942ac40110c13e1321380", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ede21fc0262c87fe363199f23d70686a614b3743 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Feb 2019 18:01:50 -0800 Subject: [PATCH 2509/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233158954 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5e01f70b265..533ecb45fd0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b79dd43ae48abc0b8fb05f3a59a202860e17ebf74435da259b949873c1f973af", - git_commit = "882bf2ecae29d8f7c22942ac40110c13e1321380", + sha256 = "e129f0d998378dd31260a3bf8314cc5be8b6b723d27eef75c49b4b8009361828", + git_commit = "9913382f56957d2880a1990a3eff97303373ffe8", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a1faf9e7af59a5a74d7b56a2663f75a711a05f38 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Feb 2019 19:01:50 -0800 Subject: [PATCH 2510/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233163957 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 533ecb45fd0..1c315573dc8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e129f0d998378dd31260a3bf8314cc5be8b6b723d27eef75c49b4b8009361828", - git_commit = "9913382f56957d2880a1990a3eff97303373ffe8", + sha256 = "e75a05e86cf5a6c4efd112499116c9b81ce295b62e823eca57812c6db9e6480e", + git_commit = "f2ff301db51c7891b75f60f0ac7c0c1cf8c0f49c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 34c105c3db95f661fa3a43b70b9d02e27d32dbdd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Feb 2019 20:02:02 -0800 Subject: [PATCH 2511/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233168202 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1c315573dc8..0786427dd49 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e75a05e86cf5a6c4efd112499116c9b81ce295b62e823eca57812c6db9e6480e", - git_commit = "f2ff301db51c7891b75f60f0ac7c0c1cf8c0f49c", + sha256 = "71ea16ebcd14c37b77e52c2bdac70d0e61bd456e1b7a0cddb101e2ca352ce30b", + git_commit = "9b41335f9d131ad97a41aec290aa788e403c178d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 45b8b9d4a9a3ba035aa85704e0deb0def2e3b6d8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Feb 2019 23:01:49 -0800 Subject: [PATCH 2512/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233178755 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0786427dd49..8bf8055ede8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "71ea16ebcd14c37b77e52c2bdac70d0e61bd456e1b7a0cddb101e2ca352ce30b", - git_commit = "9b41335f9d131ad97a41aec290aa788e403c178d", + sha256 = "81ec38268a0a74ac833252e86f2fb5f0cc29ba7165da7aff9b0560bdaee3d306", + git_commit = "57b954d6b9f979c6ef3bb527d8e0e881799adf64", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a2b4c6a42ac3f1d64b96abb6c748176d6ddb52e2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 9 Feb 2019 01:01:46 -0800 Subject: [PATCH 2513/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233187357 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8bf8055ede8..4245d0e908c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "81ec38268a0a74ac833252e86f2fb5f0cc29ba7165da7aff9b0560bdaee3d306", - git_commit = "57b954d6b9f979c6ef3bb527d8e0e881799adf64", + sha256 = "9d15b799376cb904d7e050c075e48df9eb612bf4fa3ab557db54b82e5a4ca3c5", + git_commit = "6d924a1564a1dbc26f1e334873a54ab169350c49", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4667e7c320185aa6522e20d822268e35ce12e6eb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 9 Feb 2019 03:02:11 -0800 Subject: [PATCH 2514/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233195091 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4245d0e908c..f83e32e04d4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9d15b799376cb904d7e050c075e48df9eb612bf4fa3ab557db54b82e5a4ca3c5", - git_commit = "6d924a1564a1dbc26f1e334873a54ab169350c49", + sha256 = "066785ef047f5e7916e0cc0d4b4d9c7aca412862b84af70acd3aa804eba347dd", + git_commit = "b85cb440e257a367fb70f8321ddaa669d1bd9fae", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2e9fa990a4bde1b9fe668b0037c65631f8be76e8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 9 Feb 2019 17:01:46 -0800 Subject: [PATCH 2515/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233239757 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f83e32e04d4..3d8ba403fd2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "066785ef047f5e7916e0cc0d4b4d9c7aca412862b84af70acd3aa804eba347dd", - git_commit = "b85cb440e257a367fb70f8321ddaa669d1bd9fae", + sha256 = "87ea4b6d8fff92275c3c2919f084e6a550a88470bca600820b0d73721ca1d48c", + git_commit = "969e17fc37f595dbb372af4ce8308f991a96608c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ec06c82aaf63caae04b3d03b877253a9f414b43c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 9 Feb 2019 18:01:46 -0800 Subject: [PATCH 2516/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233242771 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3d8ba403fd2..462e1bdb2a2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "87ea4b6d8fff92275c3c2919f084e6a550a88470bca600820b0d73721ca1d48c", - git_commit = "969e17fc37f595dbb372af4ce8308f991a96608c", + sha256 = "4a88b318fc95cc41784bda7f795e51bcb76791eb9a6d37d4e1e3a05e75ec1826", + git_commit = "d0a7af2368df44430513903398f63426ba1c8800", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a1e945eacc9a1529e41e0946de3f60d3cbaf6144 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 9 Feb 2019 21:01:42 -0800 Subject: [PATCH 2517/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233252384 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 462e1bdb2a2..bda8d67c3b9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4a88b318fc95cc41784bda7f795e51bcb76791eb9a6d37d4e1e3a05e75ec1826", - git_commit = "d0a7af2368df44430513903398f63426ba1c8800", + sha256 = "c15d77f686be919914c083337ebf3a93eda24e9c3e291f370354d1305328b5e1", + git_commit = "ead36c50c1865dc0fc8fdc1b4b20eb37e4879420", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 13f2f49943e12c8d3447babfffe7b89f843a905a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 9 Feb 2019 22:02:18 -0800 Subject: [PATCH 2518/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233255446 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bda8d67c3b9..c9091853905 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c15d77f686be919914c083337ebf3a93eda24e9c3e291f370354d1305328b5e1", - git_commit = "ead36c50c1865dc0fc8fdc1b4b20eb37e4879420", + sha256 = "1945249d72f772233c3b296e82d2b6a7fe77534893c0d78fe669ef2311ea355e", + git_commit = "43947b9efcc9fc4a3f525d51e80e164e7e3c0221", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5138105307de39e817d7797499637ba152fa95bb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 9 Feb 2019 23:02:09 -0800 Subject: [PATCH 2519/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233258185 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c9091853905..db611f415a4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1945249d72f772233c3b296e82d2b6a7fe77534893c0d78fe669ef2311ea355e", - git_commit = "43947b9efcc9fc4a3f525d51e80e164e7e3c0221", + sha256 = "f9ad72146d31bbc543ad155c28709f9456be00719246a86482e2aa426d0e8e72", + git_commit = "8658f093ce3518d26b192ec9c58d5bf8564e5852", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 420edfa543243fb51214d81766335165d9e36668 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 10 Feb 2019 03:01:56 -0800 Subject: [PATCH 2520/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233273044 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index db611f415a4..2c0e22991e7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f9ad72146d31bbc543ad155c28709f9456be00719246a86482e2aa426d0e8e72", - git_commit = "8658f093ce3518d26b192ec9c58d5bf8564e5852", + sha256 = "6beb71794434bd30b32cc9b92a9b8872b9db9bfefc58aeceb205b216081e0554", + git_commit = "beccb5be1d9a71082b74d8fa90367b0faf6e5226", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5f98dd6f0e914c8d639b024f871ac508315e7daf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 10 Feb 2019 13:02:39 -0800 Subject: [PATCH 2521/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233306723 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2c0e22991e7..b6487d41798 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6beb71794434bd30b32cc9b92a9b8872b9db9bfefc58aeceb205b216081e0554", - git_commit = "beccb5be1d9a71082b74d8fa90367b0faf6e5226", + sha256 = "c5f08d8d57658a4eb076074130f8f461ca6f5065407e16cd2036a4be048b8892", + git_commit = "753cb67ab58f7b55fc5061f263654bce3828765b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5ea3451e2b6e433f7975576f1e05300d5086e74e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 10 Feb 2019 20:01:52 -0800 Subject: [PATCH 2522/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233333920 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b6487d41798..f1f01257906 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c5f08d8d57658a4eb076074130f8f461ca6f5065407e16cd2036a4be048b8892", - git_commit = "753cb67ab58f7b55fc5061f263654bce3828765b", + sha256 = "c8bbc9daccca538fde206562d1c181707687aa591f57e916cc50efbbd458dfae", + git_commit = "f5015045833910b60731a487b77eedad1d322c2e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 18b84b3cddce9efb17bf8484fd3b047eed55430a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 10 Feb 2019 22:01:55 -0800 Subject: [PATCH 2523/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233342912 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f1f01257906..ac9ac60d0d9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c8bbc9daccca538fde206562d1c181707687aa591f57e916cc50efbbd458dfae", - git_commit = "f5015045833910b60731a487b77eedad1d322c2e", + sha256 = "a9fdf6b8d0df0e03fb9e781348bfaa2f7779c035ba2a804d1a1c5dbdf028a566", + git_commit = "29b27f3066ac99d3f01c65115bdd2b6cd4e2ccc7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f1ca7febe5fe6c3e01966e588e26619d3ea6b32a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Feb 2019 03:02:08 -0800 Subject: [PATCH 2524/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233373418 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ac9ac60d0d9..9d26d42a9e3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a9fdf6b8d0df0e03fb9e781348bfaa2f7779c035ba2a804d1a1c5dbdf028a566", - git_commit = "29b27f3066ac99d3f01c65115bdd2b6cd4e2ccc7", + sha256 = "fe90c2053f85f2a220c1abff849db58bf06886ee4ccabe08c2080578667e9ccd", + git_commit = "126679b2e517ba5668c885a17acb75fe8d3cceef", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ccf1a15eed959402bf7d42f3410832e4330eec43 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Feb 2019 05:02:07 -0800 Subject: [PATCH 2525/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233386305 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9d26d42a9e3..e802de9dae9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fe90c2053f85f2a220c1abff849db58bf06886ee4ccabe08c2080578667e9ccd", - git_commit = "126679b2e517ba5668c885a17acb75fe8d3cceef", + sha256 = "71cc6ca1e4cbdce2620388b6ba971a039874db170e125fa7f8df00ed549869c3", + git_commit = "bfba64f11e102bf77342b990d7b0fe0406cd839f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 366d825480a97cdd71ffd35c281e2685894ec0cd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Feb 2019 10:01:57 -0800 Subject: [PATCH 2526/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233427845 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e802de9dae9..d385a1092f8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "71cc6ca1e4cbdce2620388b6ba971a039874db170e125fa7f8df00ed549869c3", - git_commit = "bfba64f11e102bf77342b990d7b0fe0406cd839f", + sha256 = "8517438091ebbf281bc4369e79e0f9f2eea0286aaa5be397bd63d0f98920119b", + git_commit = "577a21198418c3931ed8701ece0b5c503691a802", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From aee952b2391b85b1a91bff9e4845d04a13430f53 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Feb 2019 11:01:59 -0800 Subject: [PATCH 2527/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233439338 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d385a1092f8..5367d7e2f5d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8517438091ebbf281bc4369e79e0f9f2eea0286aaa5be397bd63d0f98920119b", - git_commit = "577a21198418c3931ed8701ece0b5c503691a802", + sha256 = "54edef83869e0e25f63d5f897e7bca5727079d52ddb36253fd1a3ca24521d7af", + git_commit = "858a246f20b188f7526784f29f588d68f4b518c6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From dfc9892a439d8391732af16bdc7b289205ee4f85 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Feb 2019 12:02:05 -0800 Subject: [PATCH 2528/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233451639 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5367d7e2f5d..bf50ee13065 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "54edef83869e0e25f63d5f897e7bca5727079d52ddb36253fd1a3ca24521d7af", - git_commit = "858a246f20b188f7526784f29f588d68f4b518c6", + sha256 = "ffa251789cbbd3c9c87d06c377d67530906908ffca090db188375ab1f143fde9", + git_commit = "a1c1eacca5aaf3a0fea2e8c230972a52a4d7f5f5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f7d2127e0dc903c475f5dca1c366f35b50dcfbe4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Feb 2019 13:01:56 -0800 Subject: [PATCH 2529/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233462244 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bf50ee13065..de334a46089 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ffa251789cbbd3c9c87d06c377d67530906908ffca090db188375ab1f143fde9", - git_commit = "a1c1eacca5aaf3a0fea2e8c230972a52a4d7f5f5", + sha256 = "095bf35194ac2052efab294498e659d0c65269d745966c55c58e2ed82160612b", + git_commit = "f5593ff7620dd0f8085f152c3e2539db37e3f53b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 98ee638ed73c2cb67e38d7e2992b335bbfaac61b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Feb 2019 14:02:07 -0800 Subject: [PATCH 2530/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233474040 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index de334a46089..47398e8117e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "095bf35194ac2052efab294498e659d0c65269d745966c55c58e2ed82160612b", - git_commit = "f5593ff7620dd0f8085f152c3e2539db37e3f53b", + sha256 = "375c79888afc575d820c070da129b6bba0f34bfeaf9473833f83c21bcf79a5ca", + git_commit = "4bdb229d2b1f1be776615875085df0a47927862c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From eafeaca08e686f94e6387d58ea8fac2c7cab3b90 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Feb 2019 15:02:05 -0800 Subject: [PATCH 2531/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233485995 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 47398e8117e..1b016087980 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "375c79888afc575d820c070da129b6bba0f34bfeaf9473833f83c21bcf79a5ca", - git_commit = "4bdb229d2b1f1be776615875085df0a47927862c", + sha256 = "9ccca9cc498e3511703428bf268cc83989602ca89ad7db6bcf8afa4d122cf48b", + git_commit = "2199d3064c3f7778d51b9d62f6e81d1640d980f4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c118820a7c1beeecb4e3682fc86ab9bba7895483 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Feb 2019 16:02:35 -0800 Subject: [PATCH 2532/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233497179 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1b016087980..74fbf6fd790 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9ccca9cc498e3511703428bf268cc83989602ca89ad7db6bcf8afa4d122cf48b", - git_commit = "2199d3064c3f7778d51b9d62f6e81d1640d980f4", + sha256 = "edd6bba00090addeb39df621a696fc66b030296f39c853b573ace50c8b4adfe9", + git_commit = "d584984e82ceb20a34d344f1df40445f5469541a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6cc3fe1908a58fed25e1a88e8930872a4f48cdfc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Feb 2019 17:02:02 -0800 Subject: [PATCH 2533/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233506933 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 74fbf6fd790..27a8c0950bf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "edd6bba00090addeb39df621a696fc66b030296f39c853b573ace50c8b4adfe9", - git_commit = "d584984e82ceb20a34d344f1df40445f5469541a", + sha256 = "22802faf84ad71294deda8e6d09641f79772fdb3f8b1e826c18b7a0d9fbdb2d9", + git_commit = "8bb8258646e47ef96e40eb684ac50601a3af5106", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b03e4299b6e1b3963abbfa965af4f483eec5a0f4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Feb 2019 18:02:08 -0800 Subject: [PATCH 2534/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233515906 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 27a8c0950bf..75d8ea0e357 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "22802faf84ad71294deda8e6d09641f79772fdb3f8b1e826c18b7a0d9fbdb2d9", - git_commit = "8bb8258646e47ef96e40eb684ac50601a3af5106", + sha256 = "48fc422cf6137e803b781d5ac205a7c272a47d7b5e4309c7fd86e989fcbb3dee", + git_commit = "50f0b210ce8a7b47f6fb4ed85229772dbd4d22a4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From bffc489471ade9e368ccd419e210abeaef03797d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Feb 2019 19:02:02 -0800 Subject: [PATCH 2535/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233523061 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 75d8ea0e357..1f237ab8aab 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "48fc422cf6137e803b781d5ac205a7c272a47d7b5e4309c7fd86e989fcbb3dee", - git_commit = "50f0b210ce8a7b47f6fb4ed85229772dbd4d22a4", + sha256 = "43072913bff943cb8069cfa503e963d6e80b90453271eac74622b7dafb84ee7c", + git_commit = "320eec98eedd63d1d3082ab1d3133b8249abd366", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 70217f5253d5cd3d68498f69fe474e87b733bf6c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Feb 2019 20:01:55 -0800 Subject: [PATCH 2536/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233529065 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1f237ab8aab..c8ab89cbd36 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "43072913bff943cb8069cfa503e963d6e80b90453271eac74622b7dafb84ee7c", - git_commit = "320eec98eedd63d1d3082ab1d3133b8249abd366", + sha256 = "604efddb7758110888afcfcc8935e3482ef448d7554977d934fa3096d70803c8", + git_commit = "07cea8cc4ca430ded136bef94f247ffbd1207c46", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0b71b88995a50ea3b0aa8a0c31a6e91c50ddcd14 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Feb 2019 22:02:07 -0800 Subject: [PATCH 2537/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233540548 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c8ab89cbd36..ca14fea375d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "604efddb7758110888afcfcc8935e3482ef448d7554977d934fa3096d70803c8", - git_commit = "07cea8cc4ca430ded136bef94f247ffbd1207c46", + sha256 = "033457822ade81969cacf73d5635373aa09b03bb9b43d59b4c1c99e5b7b4f33d", + git_commit = "078228441f09ca07c8060de23167c6c08381de8a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5fc0651c1f007d96d5ee6bab9064f1fb26115415 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Feb 2019 23:01:53 -0800 Subject: [PATCH 2538/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233545599 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ca14fea375d..9f3481f0d45 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "033457822ade81969cacf73d5635373aa09b03bb9b43d59b4c1c99e5b7b4f33d", - git_commit = "078228441f09ca07c8060de23167c6c08381de8a", + sha256 = "62e88d9950ac36762facea0c3a44f7bcffec4643eb0863d721db77073e08d363", + git_commit = "7350b35e27ee063bf4b2d81ffde612e64f668a27", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9a357ffa5b3a80366d9c108dd30606b0a4fb9395 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Feb 2019 00:02:19 -0800 Subject: [PATCH 2539/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233551805 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9f3481f0d45..831eaa88073 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "62e88d9950ac36762facea0c3a44f7bcffec4643eb0863d721db77073e08d363", - git_commit = "7350b35e27ee063bf4b2d81ffde612e64f668a27", + sha256 = "5db4437b59ebe58ac7bd4ad8f7571017f07922efc088cec7adc5a9b483f685b7", + git_commit = "27e04b6a92461c9429d6506bd1312c6b1be47258", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1d903b52f115be6c659b550e1a61a0e481bd9f79 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Feb 2019 01:02:26 -0800 Subject: [PATCH 2540/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233559439 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 831eaa88073..50cfc2f522e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5db4437b59ebe58ac7bd4ad8f7571017f07922efc088cec7adc5a9b483f685b7", - git_commit = "27e04b6a92461c9429d6506bd1312c6b1be47258", + sha256 = "65bb78f44954ee026f91bc1a6c604e460c37a55f6f3e3e409c39cbb7f783b26b", + git_commit = "d84330946a9c49ea7970a5f83784b5ec52112ad1", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2e1c3a1aeb876492bc494ecb3c95610cd37c83fd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Feb 2019 02:02:03 -0800 Subject: [PATCH 2541/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233566576 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 50cfc2f522e..ad4da249041 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "65bb78f44954ee026f91bc1a6c604e460c37a55f6f3e3e409c39cbb7f783b26b", - git_commit = "d84330946a9c49ea7970a5f83784b5ec52112ad1", + sha256 = "64aa8c7c174255b4af96a26e2757b2e6295a4112fc11df0f2acda7d355327f8f", + git_commit = "c4d25405fb3c6060d9bc74520f56f35f6a596ab6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6598f11d1e2012b8e20f0544baa052ab37919224 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Feb 2019 04:02:28 -0800 Subject: [PATCH 2542/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233580597 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ad4da249041..c86b7ea6c96 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "64aa8c7c174255b4af96a26e2757b2e6295a4112fc11df0f2acda7d355327f8f", - git_commit = "c4d25405fb3c6060d9bc74520f56f35f6a596ab6", + sha256 = "8d78cc5126bd32b5810efe44560540338312fb172acc0c1899ff8a426caa9625", + git_commit = "5dc6710aaf1f920f9bb9b24f4260ed5fa67a1b8f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 96e510982e835b388cbee617fa3698cdee6cc5d4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Feb 2019 05:02:05 -0800 Subject: [PATCH 2543/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233586249 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c86b7ea6c96..8cb940b5384 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8d78cc5126bd32b5810efe44560540338312fb172acc0c1899ff8a426caa9625", - git_commit = "5dc6710aaf1f920f9bb9b24f4260ed5fa67a1b8f", + sha256 = "2b229c46a02ef352bdc81c314be3d1229922adb7dd1b17c01132707e20fa86dd", + git_commit = "aebf4964a20c4bc24340d92ae82504a41bca98e1", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 68fd7ac5ba6d2ccba449c5543b31e036830019fa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Feb 2019 06:02:13 -0800 Subject: [PATCH 2544/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233592418 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8cb940b5384..bddafba2575 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2b229c46a02ef352bdc81c314be3d1229922adb7dd1b17c01132707e20fa86dd", - git_commit = "aebf4964a20c4bc24340d92ae82504a41bca98e1", + sha256 = "ecd1bd598738b6f3fb7028a728ee11933f5e2258ce85006adea3fe4e038d9d7d", + git_commit = "09e2c39fcf55c2efadede9a573548c28398e6b33", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5f0d424aebded0db149da0e4c0acdc863bccae9b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Feb 2019 08:02:03 -0800 Subject: [PATCH 2545/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233606864 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bddafba2575..eb0d146ebe9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ecd1bd598738b6f3fb7028a728ee11933f5e2258ce85006adea3fe4e038d9d7d", - git_commit = "09e2c39fcf55c2efadede9a573548c28398e6b33", + sha256 = "6b187e49f5a32c3a5133645f7324e573089b3d231d918275d234af0fac3ee86a", + git_commit = "628a91d49808161620e6e13eedd9361095515287", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4dd761c9052bccbf253e58c0c25834b1dacbb528 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Feb 2019 09:01:55 -0800 Subject: [PATCH 2546/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233616037 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index eb0d146ebe9..ef5f023f0e6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6b187e49f5a32c3a5133645f7324e573089b3d231d918275d234af0fac3ee86a", - git_commit = "628a91d49808161620e6e13eedd9361095515287", + sha256 = "c688a57349d9d4444b078cdcae630e00a3322428619ca676c8cba69dd66819a6", + git_commit = "40ebea073b2168be0ad507b7eab385c670b84678", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9a0b7d58a5e9b32d99571f1f3fe6581918ec856d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Feb 2019 10:02:11 -0800 Subject: [PATCH 2547/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233626879 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ef5f023f0e6..e456dcaf48a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c688a57349d9d4444b078cdcae630e00a3322428619ca676c8cba69dd66819a6", - git_commit = "40ebea073b2168be0ad507b7eab385c670b84678", + sha256 = "e28ff36cbffde740421eff54804b1e79c7f95e2eeda04b765227242c41ac9ebf", + git_commit = "768844843859a721888fd325b2f9b361e09d58b1", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8d7cbc56f2776c325630d81dfdb895a347c1ca99 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Feb 2019 11:01:56 -0800 Subject: [PATCH 2548/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233639136 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e456dcaf48a..1bf6d405fde 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e28ff36cbffde740421eff54804b1e79c7f95e2eeda04b765227242c41ac9ebf", - git_commit = "768844843859a721888fd325b2f9b361e09d58b1", + sha256 = "5e296600c022834b3e2eee2f795217e06989036af16565fefbcbe1e3931ef388", + git_commit = "c8c1f5f95ed1870d3154bd01438190c92a245378", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2e8384a26891c6c2166c52de8897929b53304d41 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Feb 2019 12:02:00 -0800 Subject: [PATCH 2549/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233652093 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1bf6d405fde..02f64320866 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5e296600c022834b3e2eee2f795217e06989036af16565fefbcbe1e3931ef388", - git_commit = "c8c1f5f95ed1870d3154bd01438190c92a245378", + sha256 = "da0efaa37ee2c8d5267a82614df189ef410004d1d850122ba4b38f9fdf007f05", + git_commit = "24e639413dc8eaa7182e828cebf4abad435bfe84", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f07292d24f3a33ae79157da2b9d43a50061c1536 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Feb 2019 13:02:09 -0800 Subject: [PATCH 2550/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233662290 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 02f64320866..56376a6f745 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "da0efaa37ee2c8d5267a82614df189ef410004d1d850122ba4b38f9fdf007f05", - git_commit = "24e639413dc8eaa7182e828cebf4abad435bfe84", + sha256 = "bd2a42829f40c899c230586ce36d77d42ef42a9f6bf6b856c0dfa4a465405f31", + git_commit = "ce3ee9b6a45913c82d88331f12cf693cbe5e6014", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From cea277be2ea770748ed381122dd1677438e9bd3d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Feb 2019 19:01:45 -0800 Subject: [PATCH 2551/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233671091 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 56376a6f745..84384e4a626 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bd2a42829f40c899c230586ce36d77d42ef42a9f6bf6b856c0dfa4a465405f31", - git_commit = "ce3ee9b6a45913c82d88331f12cf693cbe5e6014", + sha256 = "9ac37a2e542eb053d5801834cc6a493e027165a4b119618c276ec15532d659fb", + git_commit = "89927e863b1ad96184ab09188f62b7e391c896d9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 92e4a865e25c765b3094551c6dae7428180519b9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Feb 2019 20:02:07 -0800 Subject: [PATCH 2552/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233677460 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 84384e4a626..8b299a90451 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9ac37a2e542eb053d5801834cc6a493e027165a4b119618c276ec15532d659fb", - git_commit = "89927e863b1ad96184ab09188f62b7e391c896d9", + sha256 = "7b73040c56c0e35dc29a01f8915619d6d803aaf019e9c646b4cd03f5f2423dd8", + git_commit = "380629f7ff991038f31acc0d7d0c5b74cc9f3d3a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From de030640ec6ed2cd504ee0ad9335fb93aebe51b5 Mon Sep 17 00:00:00 2001 From: hongkuny Date: Tue, 12 Feb 2019 20:35:23 -0800 Subject: [PATCH 2553/8103] Add enforce_session_run_timeout inside Server::Options. PiperOrigin-RevId: 233680987 --- tensorflow_serving/model_servers/BUILD | 8 +++++- .../model_servers/prediction_service_impl.cc | 25 +++++++++++++------ .../model_servers/prediction_service_impl.h | 17 ++++++++++--- tensorflow_serving/model_servers/server.cc | 10 ++++++-- tensorflow_serving/model_servers/server.h | 2 ++ 5 files changed, 47 insertions(+), 15 deletions(-) diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 9d8a2f2c875..45e6485c731 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -222,14 +222,20 @@ cc_library( deps = [ ":grpc_status_util", ":server_core", + "//tensorflow_serving/apis:classification_proto", + "//tensorflow_serving/apis:get_model_metadata_proto", + "//tensorflow_serving/apis:inference_proto", + "//tensorflow_serving/apis:predict_proto", "//tensorflow_serving/apis:prediction_service_proto", + "//tensorflow_serving/apis:regression_proto", "//tensorflow_serving/servables/tensorflow:classification_service", "//tensorflow_serving/servables/tensorflow:get_model_metadata_impl", "//tensorflow_serving/servables/tensorflow:multi_inference_helper", "//tensorflow_serving/servables/tensorflow:predict_impl", "//tensorflow_serving/servables/tensorflow:regression_service", - "//tensorflow_serving/util:status_util", "@grpc//:grpc++", + "@org_tensorflow//tensorflow/core:lib", + "@org_tensorflow//tensorflow/core:protos_all_cc", ], ) diff --git a/tensorflow_serving/model_servers/prediction_service_impl.cc b/tensorflow_serving/model_servers/prediction_service_impl.cc index b347d39eb9b..1fdbf20f352 100644 --- a/tensorflow_serving/model_servers/prediction_service_impl.cc +++ b/tensorflow_serving/model_servers/prediction_service_impl.cc @@ -14,6 +14,7 @@ limitations under the License. ==============================================================================*/ #include "tensorflow_serving/model_servers/prediction_service_impl.h" + #include "grpc/grpc.h" #include "tensorflow_serving/model_servers/grpc_status_util.h" #include "tensorflow_serving/servables/tensorflow/classification_service.h" @@ -38,8 +39,10 @@ ::grpc::Status PredictionServiceImpl::Predict(::grpc::ServerContext *context, const PredictRequest *request, PredictResponse *response) { tensorflow::RunOptions run_options = tensorflow::RunOptions(); - run_options.set_timeout_in_ms( - DeadlineToTimeoutMillis(context->raw_deadline())); + if (enforce_session_run_timeout_) { + run_options.set_timeout_in_ms( + DeadlineToTimeoutMillis(context->raw_deadline())); + } const ::grpc::Status status = ToGRPCStatus(predictor_->Predict(run_options, core_, *request, response)); @@ -71,8 +74,10 @@ ::grpc::Status PredictionServiceImpl::Classify( ClassificationResponse *response) { tensorflow::RunOptions run_options = tensorflow::RunOptions(); // By default, this is infinite which is the same default as RunOptions. - run_options.set_timeout_in_ms( - DeadlineToTimeoutMillis(context->raw_deadline())); + if (enforce_session_run_timeout_) { + run_options.set_timeout_in_ms( + DeadlineToTimeoutMillis(context->raw_deadline())); + } const ::grpc::Status status = ToGRPCStatus(TensorflowClassificationServiceImpl::Classify( run_options, core_, *request, response)); @@ -87,8 +92,10 @@ ::grpc::Status PredictionServiceImpl::Regress(::grpc::ServerContext *context, RegressionResponse *response) { tensorflow::RunOptions run_options = tensorflow::RunOptions(); // By default, this is infinite which is the same default as RunOptions. - run_options.set_timeout_in_ms( - DeadlineToTimeoutMillis(context->raw_deadline())); + if (enforce_session_run_timeout_) { + run_options.set_timeout_in_ms( + DeadlineToTimeoutMillis(context->raw_deadline())); + } const ::grpc::Status status = ToGRPCStatus(TensorflowRegressionServiceImpl::Regress( run_options, core_, *request, response)); @@ -103,8 +110,10 @@ ::grpc::Status PredictionServiceImpl::MultiInference( MultiInferenceResponse *response) { tensorflow::RunOptions run_options = tensorflow::RunOptions(); // By default, this is infinite which is the same default as RunOptions. - run_options.set_timeout_in_ms( - DeadlineToTimeoutMillis(context->raw_deadline())); + if (enforce_session_run_timeout_) { + run_options.set_timeout_in_ms( + DeadlineToTimeoutMillis(context->raw_deadline())); + } const ::grpc::Status status = ToGRPCStatus( RunMultiInferenceWithServerCore(run_options, core_, *request, response)); if (!status.ok()) { diff --git a/tensorflow_serving/model_servers/prediction_service_impl.h b/tensorflow_serving/model_servers/prediction_service_impl.h index e23436df41c..a90e64975b3 100644 --- a/tensorflow_serving/model_servers/prediction_service_impl.h +++ b/tensorflow_serving/model_servers/prediction_service_impl.h @@ -25,10 +25,18 @@ namespace serving { class PredictionServiceImpl final : public PredictionService::Service { public: - explicit PredictionServiceImpl(ServerCore* core, bool use_saved_model) - : core_(core), - predictor_(new TensorflowPredictor(use_saved_model)), - use_saved_model_(use_saved_model) {} + // Options for configuring a PredictionServiceImpl object. + struct Options { + ServerCore* server_core; + bool use_saved_model; + bool enforce_session_run_timeout; + }; + + explicit PredictionServiceImpl(const Options& options) + : core_(options.server_core), + predictor_(new TensorflowPredictor(options.use_saved_model)), + use_saved_model_(options.use_saved_model), + enforce_session_run_timeout_(options.enforce_session_run_timeout) {} ::grpc::Status Predict(::grpc::ServerContext* context, const PredictRequest* request, @@ -54,6 +62,7 @@ class PredictionServiceImpl final : public PredictionService::Service { ServerCore* core_; std::unique_ptr predictor_; const bool use_saved_model_; + const bool enforce_session_run_timeout_; }; } // namespace serving diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index ed40328d789..7582cd527a4 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -277,8 +277,14 @@ Status Server::BuildAndStart(const Options& server_options) { const string server_address = "0.0.0.0:" + std::to_string(server_options.grpc_port); model_service_ = absl::make_unique(server_core_.get()); - prediction_service_ = absl::make_unique( - server_core_.get(), use_saved_model); + + PredictionServiceImpl::Options predict_server_options; + predict_server_options.server_core = server_core_.get(); + predict_server_options.use_saved_model = use_saved_model; + predict_server_options.enforce_session_run_timeout = + server_options.enforce_session_run_timeout; + prediction_service_ = + absl::make_unique(predict_server_options); ::grpc::ServerBuilder builder; builder.AddListeningPort( server_address, diff --git a/tensorflow_serving/model_servers/server.h b/tensorflow_serving/model_servers/server.h index e6776392d7b..78a97a3fbc2 100644 --- a/tensorflow_serving/model_servers/server.h +++ b/tensorflow_serving/model_servers/server.h @@ -73,6 +73,8 @@ class Server { string model_config_file; bool enable_model_warmup = true; tensorflow::string monitoring_config_file; + // Tensorflow session run options. + bool enforce_session_run_timeout = true; Options(); }; From e44584cdcc68a61c24a0f686d22df9c4354f95ae Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Feb 2019 21:02:14 -0800 Subject: [PATCH 2554/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233683519 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8b299a90451..f7a10d74d0c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7b73040c56c0e35dc29a01f8915619d6d803aaf019e9c646b4cd03f5f2423dd8", - git_commit = "380629f7ff991038f31acc0d7d0c5b74cc9f3d3a", + sha256 = "1df3089bd56f5fdf6c9aa9ea583c35a1daf0824093043076eb526154ccb8d5f6", + git_commit = "bda27b553ff54b43e9af75c59616d7aa48d2f19a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 82374a4753dd7122b549fe55e7556dbbbc148c27 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Feb 2019 22:01:49 -0800 Subject: [PATCH 2555/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233689360 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f7a10d74d0c..2c1d642f680 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1df3089bd56f5fdf6c9aa9ea583c35a1daf0824093043076eb526154ccb8d5f6", - git_commit = "bda27b553ff54b43e9af75c59616d7aa48d2f19a", + sha256 = "9c53b17574589a2c8dd01d4e1935be0f71aca778af1eacb107324d4c21504386", + git_commit = "a5d1f3e596a80ec8a9e3efcdb93c9a90e65fbeda", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f3233ffbe9b9d47ce1d963658dc564b217acc629 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Feb 2019 23:01:47 -0800 Subject: [PATCH 2556/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233694653 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2c1d642f680..e75c1189d17 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9c53b17574589a2c8dd01d4e1935be0f71aca778af1eacb107324d4c21504386", - git_commit = "a5d1f3e596a80ec8a9e3efcdb93c9a90e65fbeda", + sha256 = "9467cdf3701f054974bda5adca6bc3cfc739fbac76c296a3a4df264669cfb518", + git_commit = "f8ac1089f89455528f23a869ea9cad6705a70b66", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 41e0f8c5439688ca50983f986565c4d480f77709 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Feb 2019 00:02:07 -0800 Subject: [PATCH 2557/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233699426 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e75c1189d17..c9b4f1dbaa4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9467cdf3701f054974bda5adca6bc3cfc739fbac76c296a3a4df264669cfb518", - git_commit = "f8ac1089f89455528f23a869ea9cad6705a70b66", + sha256 = "89cdbaeae8c49935a5e5a49579f10dee62487174b23479f733e8bc16c7a02075", + git_commit = "7ad1f3d479eaf46042c5254487cb74f7143010cd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 29bf4ca0e0d2d0806b9d9477b240cd0762c2052f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Feb 2019 01:01:58 -0800 Subject: [PATCH 2558/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233705712 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c9b4f1dbaa4..2e7b44039ba 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "89cdbaeae8c49935a5e5a49579f10dee62487174b23479f733e8bc16c7a02075", - git_commit = "7ad1f3d479eaf46042c5254487cb74f7143010cd", + sha256 = "924e8333aff37e7276b4492387b9d6dfaf243bca1771dc221851be151179c77e", + git_commit = "fdf126150df00574b54040b608c7148b72d71019", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c718eb7379cf90cb88afb3ed1bc7c2a9ff8daa0e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Feb 2019 02:01:42 -0800 Subject: [PATCH 2559/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233713235 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2e7b44039ba..2571012f2ff 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "924e8333aff37e7276b4492387b9d6dfaf243bca1771dc221851be151179c77e", - git_commit = "fdf126150df00574b54040b608c7148b72d71019", + sha256 = "f08c9857492d5cd9ab9640a929dded8241a0a3b33ab52c37fcbcf46f4e924f87", + git_commit = "6f742555bb681364b7eaf3cc84ecd1d74e03e7d0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f32d0bb249b5dbe246d3b08e6ac382d2a56fab6c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Feb 2019 03:01:59 -0800 Subject: [PATCH 2560/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233719521 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2571012f2ff..96a2d7ce18d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f08c9857492d5cd9ab9640a929dded8241a0a3b33ab52c37fcbcf46f4e924f87", - git_commit = "6f742555bb681364b7eaf3cc84ecd1d74e03e7d0", + sha256 = "dfa8e62e2ecd5664f5efb17b9204a48f62eb49ad000036ddfedb375b85c2e8b5", + git_commit = "8a3407d7ec8d2a79534cc1b4c587eae0fd8dd924", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6b30d801a9fe7e21bd41623fc3bf5e937e78d70e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Feb 2019 08:01:55 -0800 Subject: [PATCH 2561/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233753932 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 96a2d7ce18d..765ed880879 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dfa8e62e2ecd5664f5efb17b9204a48f62eb49ad000036ddfedb375b85c2e8b5", - git_commit = "8a3407d7ec8d2a79534cc1b4c587eae0fd8dd924", + sha256 = "ab17f2e86d7321282d8cbc4c3a45fc781dfddd856a5b03c215fe2bd21454b3a9", + git_commit = "00bc2b202be2baff4beb19a740bffdbf40d4015f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9e0efdf2d61fbeccc38593572859872391c59718 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Feb 2019 09:00:45 -0800 Subject: [PATCH 2562/8103] refactor tests PiperOrigin-RevId: 233763447 --- tensorflow_serving/model_servers/BUILD | 1 + 1 file changed, 1 insertion(+) diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 45e6485c731..ff146e4b075 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -20,6 +20,7 @@ package_group( packages = [ # tensorflow_transform for testing only "//third_party/py/tensorflow_transform/examples/...", + "//third_party/py/tensorflow_transform/google/examples/...", ], ) From 9cd5d1697a6f6ce6ce3aa3a536f191956857d480 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Feb 2019 11:02:15 -0800 Subject: [PATCH 2563/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233788616 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 765ed880879..335f1e5720f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ab17f2e86d7321282d8cbc4c3a45fc781dfddd856a5b03c215fe2bd21454b3a9", - git_commit = "00bc2b202be2baff4beb19a740bffdbf40d4015f", + sha256 = "f520cb61aa212c6cadb6f07d8c721edbe3823b35da0069b3eb13d42679d9aa3f", + git_commit = "8de10cba2aab1b18338910c4906848c8160c4339", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 931e7277c8caef61bf2d41cde49d24423f40f9cf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Feb 2019 12:02:06 -0800 Subject: [PATCH 2564/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233801607 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 335f1e5720f..52fefa8a134 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f520cb61aa212c6cadb6f07d8c721edbe3823b35da0069b3eb13d42679d9aa3f", - git_commit = "8de10cba2aab1b18338910c4906848c8160c4339", + sha256 = "616f553b4b72629c91a09081e94e8decbf7312cf50fbaf7a6052f184709f0d60", + git_commit = "24ed0299b4537ae2ffe4a8c2c7b7051f6d8b5494", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9c6def2cd09ec272dbbf3b5348f0010c02589f49 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Feb 2019 13:01:41 -0800 Subject: [PATCH 2565/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233812583 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 52fefa8a134..4902c4b2d5f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "616f553b4b72629c91a09081e94e8decbf7312cf50fbaf7a6052f184709f0d60", - git_commit = "24ed0299b4537ae2ffe4a8c2c7b7051f6d8b5494", + sha256 = "d07872af9dc8aeb4471f0e66ca15f814b6ffb63e13cff8c3501e121ab145c20f", + git_commit = "8db35dbd8916efc6bc0766f0ccf0573cb49d2131", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From aa75845be9a6bae7f9f719cb917ca140e0b234b3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Feb 2019 14:01:54 -0800 Subject: [PATCH 2566/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233824792 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4902c4b2d5f..a2345124721 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d07872af9dc8aeb4471f0e66ca15f814b6ffb63e13cff8c3501e121ab145c20f", - git_commit = "8db35dbd8916efc6bc0766f0ccf0573cb49d2131", + sha256 = "84b3931691ae17da95c9cb7a431b1062816ce18e1d5b805a9905b24730744729", + git_commit = "e09fa816e71fa38086dee3fad2b98eb40f2abf12", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f938e70ff9bc3de604a5f4421872a5662c85d478 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Feb 2019 15:01:58 -0800 Subject: [PATCH 2567/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233836787 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a2345124721..bb13d6ac2ec 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "84b3931691ae17da95c9cb7a431b1062816ce18e1d5b805a9905b24730744729", - git_commit = "e09fa816e71fa38086dee3fad2b98eb40f2abf12", + sha256 = "0ffaef6aa9d0daf49a2e4e5ab17c25edbbb321c99aa90cc210e258fe79cffa8e", + git_commit = "1e3981b63885401e9a308d02d6468eec7bad2d4d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ae9cee0a80f9c008acc3f360ff3a38595377296e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Feb 2019 16:02:19 -0800 Subject: [PATCH 2568/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233848339 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bb13d6ac2ec..0617e2b4f6f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0ffaef6aa9d0daf49a2e4e5ab17c25edbbb321c99aa90cc210e258fe79cffa8e", - git_commit = "1e3981b63885401e9a308d02d6468eec7bad2d4d", + sha256 = "93a1d4ff29a1adc714f779a00fc3154ff234ef9fa44b9758c221745199b8d491", + git_commit = "bcc12d401f234745a2636d24f5365082a734e42f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From fe8ad3b1d406acaa92f8136000a4f4863fc1cf17 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Feb 2019 17:01:39 -0800 Subject: [PATCH 2569/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233859631 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0617e2b4f6f..216f63eb6d1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "93a1d4ff29a1adc714f779a00fc3154ff234ef9fa44b9758c221745199b8d491", - git_commit = "bcc12d401f234745a2636d24f5365082a734e42f", + sha256 = "5f368cad52a7df91bf06988f30a05010783c93794eb33e3ed65503584a4e70f8", + git_commit = "e9129a758fd135c4fa19f95f40b70e6985774bfe", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ea74b6aaa6f925fbe414d56a21cc1893d11de4e2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Feb 2019 18:02:09 -0800 Subject: [PATCH 2570/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233868146 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 216f63eb6d1..04d1bc09e01 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5f368cad52a7df91bf06988f30a05010783c93794eb33e3ed65503584a4e70f8", - git_commit = "e9129a758fd135c4fa19f95f40b70e6985774bfe", + sha256 = "330f7b88bef32d480000f97b21e9753113710b9fceec44b274da031181afa7db", + git_commit = "d98406b2d52abfa8010437da7456da24d68976e2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 56d93d4bdc4dd2748b6f6c9475b381fcca76daea Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Feb 2019 19:01:42 -0800 Subject: [PATCH 2571/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233875171 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 04d1bc09e01..49f6556e25a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "330f7b88bef32d480000f97b21e9753113710b9fceec44b274da031181afa7db", - git_commit = "d98406b2d52abfa8010437da7456da24d68976e2", + sha256 = "f3e5b8416d71b33d1122069feecfe8f8b8b1f0f82d122654aebe59bf0bd1901f", + git_commit = "08c9a5b865429b0daeeb5f1ffdcdbd2623e483e5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2363081217a1034124241a4843e461e9b98b1ba2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Feb 2019 20:01:52 -0800 Subject: [PATCH 2572/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233880950 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 49f6556e25a..2256f30b479 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f3e5b8416d71b33d1122069feecfe8f8b8b1f0f82d122654aebe59bf0bd1901f", - git_commit = "08c9a5b865429b0daeeb5f1ffdcdbd2623e483e5", + sha256 = "f3a1084f59c09610f8e67fe31e821fc4cd16c0c05b9ba377b0094d9d170c890a", + git_commit = "dc4a055054e9d3e2ac36551dce1b02d4c2268839", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 54c2d99ea31e3dbd30415946b3a9ddeb72ef54c3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Feb 2019 21:01:46 -0800 Subject: [PATCH 2573/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233886092 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2256f30b479..4146156c595 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f3a1084f59c09610f8e67fe31e821fc4cd16c0c05b9ba377b0094d9d170c890a", - git_commit = "dc4a055054e9d3e2ac36551dce1b02d4c2268839", + sha256 = "b0a95ccf2038bf6ee1b1f3e356403c89014ed743e8d87cf767d0bb34af18ba49", + git_commit = "269ec76458f44da3407f272adaa62c5e0d32403b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a65257ba645d17f5fcd0f640c4075046d8ac0b0d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Feb 2019 22:02:06 -0800 Subject: [PATCH 2574/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233891494 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4146156c595..27d8ad95f49 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b0a95ccf2038bf6ee1b1f3e356403c89014ed743e8d87cf767d0bb34af18ba49", - git_commit = "269ec76458f44da3407f272adaa62c5e0d32403b", + sha256 = "fc88222a054eca071cff59675ceb6f948f0ed1e4a7a798b6cc31027ebc27d5f8", + git_commit = "33f56f0290a169f5bb5c0fcfad96ffbfeb9ee211", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 18faf0430539c3586ea88ce2b110a2da8c40b416 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Feb 2019 23:02:01 -0800 Subject: [PATCH 2575/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233896433 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 27d8ad95f49..ed38af97781 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fc88222a054eca071cff59675ceb6f948f0ed1e4a7a798b6cc31027ebc27d5f8", - git_commit = "33f56f0290a169f5bb5c0fcfad96ffbfeb9ee211", + sha256 = "19d1f78f47a98b89971a006e23eb3219d2fe4a6476bcbb9517e421779e98deba", + git_commit = "368674dfe253eef39537fcabbb675f12be47ab05", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0941570a70529ae79099ada46449d8f2551a9f42 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Feb 2019 00:02:07 -0800 Subject: [PATCH 2576/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233901166 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ed38af97781..5f9d4109fd7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "19d1f78f47a98b89971a006e23eb3219d2fe4a6476bcbb9517e421779e98deba", - git_commit = "368674dfe253eef39537fcabbb675f12be47ab05", + sha256 = "087b03ef8069dc164cadfe64ec78367d332c2fbd218be04d2568583313556c8e", + git_commit = "59799045033e6357cb9daf6861baf7b005746400", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c4e7a93db570ded4625b09b28aec1e8f4f2804bf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Feb 2019 02:02:49 -0800 Subject: [PATCH 2577/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233916649 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5f9d4109fd7..d1618de9c09 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "087b03ef8069dc164cadfe64ec78367d332c2fbd218be04d2568583313556c8e", - git_commit = "59799045033e6357cb9daf6861baf7b005746400", + sha256 = "96a911d8bae6b81e14c20aa286f8c0fc7b0baa4c629d6eae1efece8e9600407b", + git_commit = "4dbec11094abacbcc62eec54e12d8b6a965ae64b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6e9e48e559571026acb2a63677673c7af0eeefb2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Feb 2019 03:02:24 -0800 Subject: [PATCH 2578/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233923102 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d1618de9c09..0989e211b64 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "96a911d8bae6b81e14c20aa286f8c0fc7b0baa4c629d6eae1efece8e9600407b", - git_commit = "4dbec11094abacbcc62eec54e12d8b6a965ae64b", + sha256 = "8e1c67a9867c9cdbccacef7773b53ff65acd81a91afd666485a24f24e82ca2c1", + git_commit = "880cc8c1366dd27b5c7e44c7d5b4ab5270ebd1cb", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d698c1d8750ae115f706233bea9b7431ce8eb365 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Feb 2019 04:01:57 -0800 Subject: [PATCH 2579/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233928539 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0989e211b64..4e0cc16a4c3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8e1c67a9867c9cdbccacef7773b53ff65acd81a91afd666485a24f24e82ca2c1", - git_commit = "880cc8c1366dd27b5c7e44c7d5b4ab5270ebd1cb", + sha256 = "b89ffab1524c78da20ae0fded2d7bcdfa4a6c5d7c9c666513039dbdf67f67a9e", + git_commit = "183ae6a8ca914d5f358e12d4c66f3f5eb0c0d934", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a2104a3949277633d529ccba2366d37a86537fc5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Feb 2019 08:02:22 -0800 Subject: [PATCH 2580/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233956476 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4e0cc16a4c3..694abe473f7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b89ffab1524c78da20ae0fded2d7bcdfa4a6c5d7c9c666513039dbdf67f67a9e", - git_commit = "183ae6a8ca914d5f358e12d4c66f3f5eb0c0d934", + sha256 = "01d3aaffe8f2fac32cdd3bf6296e8c66a44ea3c7dfa47e75e08e460113fc1431", + git_commit = "5cebc60244d54890620393bc6529f59612262e4b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d6df343bd1b3e1ef6c0ee126a811a49e05f240b5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Feb 2019 09:01:54 -0800 Subject: [PATCH 2581/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233966151 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 694abe473f7..ad90dec2c0f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "01d3aaffe8f2fac32cdd3bf6296e8c66a44ea3c7dfa47e75e08e460113fc1431", - git_commit = "5cebc60244d54890620393bc6529f59612262e4b", + sha256 = "fa5b86c1c2781963c0837d5dab06524b2f635ad8b3e9ef37ea833428c1a9fb69", + git_commit = "74e49b2b1771e01e697b0fffe6d0b1531784322e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1e33a8d7ecaa2761676f71c98375d7013caf62f5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Feb 2019 10:02:26 -0800 Subject: [PATCH 2582/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233976877 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ad90dec2c0f..60ec64fa82e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fa5b86c1c2781963c0837d5dab06524b2f635ad8b3e9ef37ea833428c1a9fb69", - git_commit = "74e49b2b1771e01e697b0fffe6d0b1531784322e", + sha256 = "f4aeed6664ce0e2113d60bf04b4cde385254938694baf9e657b8cabb30fd5fe2", + git_commit = "72c6be901e50b8402ad8f3f08c76910b63aa8ee9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 10a181b1246da1324e23547231cf797edaedf033 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Feb 2019 11:01:57 -0800 Subject: [PATCH 2583/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 233989860 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 60ec64fa82e..6d8b57a8feb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f4aeed6664ce0e2113d60bf04b4cde385254938694baf9e657b8cabb30fd5fe2", - git_commit = "72c6be901e50b8402ad8f3f08c76910b63aa8ee9", + sha256 = "e7806898713f6d5df6b11e470ddab118e3b50d23f77971bc55a04e5527eb2b5c", + git_commit = "03aa9d18f57a6cfe99229a7a25b6585d69948390", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From fe324e410c33db2580cd8e3693d6356532f5d876 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Feb 2019 12:02:27 -0800 Subject: [PATCH 2584/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234002055 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6d8b57a8feb..b52dccb3dd3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e7806898713f6d5df6b11e470ddab118e3b50d23f77971bc55a04e5527eb2b5c", - git_commit = "03aa9d18f57a6cfe99229a7a25b6585d69948390", + sha256 = "7d51fdacf04366cb2c2e9b639337809c232a7216a83c33aaaff3ebd7f978814a", + git_commit = "3d89145866b78b3ea5849e592ad9c61cf6ed91e5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8257b134bdc2516cc4960415ffad6570682df7e8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Feb 2019 13:01:52 -0800 Subject: [PATCH 2585/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234012798 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b52dccb3dd3..4a2a078ac14 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7d51fdacf04366cb2c2e9b639337809c232a7216a83c33aaaff3ebd7f978814a", - git_commit = "3d89145866b78b3ea5849e592ad9c61cf6ed91e5", + sha256 = "89cee4bfb9cd6b40925b9ac48a9986ca4c0d2c16d984406d56c7244464878dd4", + git_commit = "5f54f3d499bfb8d191ce426bf1325b9e5b564b06", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3e32a4eef1488b75c4a424a5d63492567fa9aaaa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Feb 2019 14:02:07 -0800 Subject: [PATCH 2586/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234024630 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4a2a078ac14..00f835e6aff 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "89cee4bfb9cd6b40925b9ac48a9986ca4c0d2c16d984406d56c7244464878dd4", - git_commit = "5f54f3d499bfb8d191ce426bf1325b9e5b564b06", + sha256 = "813842cf5d03b5a3556322ac7b1c2a79525e9fbb17dbc1c19a3a43955aa615bd", + git_commit = "b51e21629485ab6b6388304f19301cdf9c88502d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3f52636d04e3937c3d51fed47c10e2a178b6b144 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Feb 2019 15:02:21 -0800 Subject: [PATCH 2587/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234036704 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 00f835e6aff..7b3bc6aad6a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "813842cf5d03b5a3556322ac7b1c2a79525e9fbb17dbc1c19a3a43955aa615bd", - git_commit = "b51e21629485ab6b6388304f19301cdf9c88502d", + sha256 = "0e08556f07dc27b398b863f90ace666367d25298ca00765c19f3faf0b9dff770", + git_commit = "264745232beca4314ae5e2124e62c6bf7fab2be3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4a8a3fdb0484d4529a52565c2c978d4ad0bcb5e3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Feb 2019 16:02:46 -0800 Subject: [PATCH 2588/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234047096 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7b3bc6aad6a..fb4e7c7725b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0e08556f07dc27b398b863f90ace666367d25298ca00765c19f3faf0b9dff770", - git_commit = "264745232beca4314ae5e2124e62c6bf7fab2be3", + sha256 = "2152304748ca61e999bc0ca875ab809ba52cf9befb80cacaa46ccf080856ee7f", + git_commit = "40c7e8e319bc4384d67da4fd1be37960b0e8d565", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b1910ee9108357fc2c0844a6e1178a656570ac76 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Feb 2019 17:01:58 -0800 Subject: [PATCH 2589/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234056242 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fb4e7c7725b..07cd6bee83c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2152304748ca61e999bc0ca875ab809ba52cf9befb80cacaa46ccf080856ee7f", - git_commit = "40c7e8e319bc4384d67da4fd1be37960b0e8d565", + sha256 = "4911be9f3623d04c665b31885149f815aa1f18aa58316e4e522ee6506164f4ea", + git_commit = "68caba625c84605c86f84b976aed0d0fffdf85d7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5ae826ad4eca54a105ba6f515d0f224e82c689da Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Feb 2019 18:01:59 -0800 Subject: [PATCH 2590/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234063817 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 07cd6bee83c..18021fd9e77 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4911be9f3623d04c665b31885149f815aa1f18aa58316e4e522ee6506164f4ea", - git_commit = "68caba625c84605c86f84b976aed0d0fffdf85d7", + sha256 = "7989e107ee2c1f70eabfbb0ed5743d5c8ccb4f03af3d3089d79f39d27084c021", + git_commit = "2caa84e53bca411ba8ab6f8aa71327fc047c37fd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ab8f0a0e9da25ccb7b3fdb4d73da70c66b659e03 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Feb 2019 19:02:09 -0800 Subject: [PATCH 2591/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234070078 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 18021fd9e77..30d1c7d7800 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7989e107ee2c1f70eabfbb0ed5743d5c8ccb4f03af3d3089d79f39d27084c021", - git_commit = "2caa84e53bca411ba8ab6f8aa71327fc047c37fd", + sha256 = "74e39306fba8b6fd7862adc01147f5deb8385b85725371b475cf124d760a9cd5", + git_commit = "775f42a845353ea8525bc54a2ddb5852acf3c6eb", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From caacf9ca186938a44caf9ccbe67082facd82c021 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Feb 2019 20:02:23 -0800 Subject: [PATCH 2592/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234075630 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 30d1c7d7800..3aacefffa73 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "74e39306fba8b6fd7862adc01147f5deb8385b85725371b475cf124d760a9cd5", - git_commit = "775f42a845353ea8525bc54a2ddb5852acf3c6eb", + sha256 = "5d1c829755ed57afdddd35fbf0ca2762878dfd712a42dacb7a8be057579e074e", + git_commit = "b36a310b7d1dbe9bbcf65ea02b0164688a9b8143", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 339ce8df97f35b1bff0fee835d81a99e1667371d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Feb 2019 21:01:44 -0800 Subject: [PATCH 2593/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234080285 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3aacefffa73..35c08529148 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5d1c829755ed57afdddd35fbf0ca2762878dfd712a42dacb7a8be057579e074e", - git_commit = "b36a310b7d1dbe9bbcf65ea02b0164688a9b8143", + sha256 = "2f17e86cdfdb843b98ae2922b53be3752ba9a559b1478c10ed059bef176a965b", + git_commit = "44503d46e5426c8f4945f7b55480e66c1bd3835e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 40958adf9ad928b756fb61a562d8f4ee418d092a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Feb 2019 22:02:19 -0800 Subject: [PATCH 2594/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234084977 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 35c08529148..762ab3afbe8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2f17e86cdfdb843b98ae2922b53be3752ba9a559b1478c10ed059bef176a965b", - git_commit = "44503d46e5426c8f4945f7b55480e66c1bd3835e", + sha256 = "202ae6f187cbed836cdd576f170f9a872fc3f8f1244ee71d106d9aee7d0d13ca", + git_commit = "4938573f6b7053235d5963dc3ad7a313bab86abc", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b101afdd62910c4ee6975259ac14ca9f6c0d33d4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Feb 2019 23:02:00 -0800 Subject: [PATCH 2595/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234089243 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 762ab3afbe8..58e81fe602f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "202ae6f187cbed836cdd576f170f9a872fc3f8f1244ee71d106d9aee7d0d13ca", - git_commit = "4938573f6b7053235d5963dc3ad7a313bab86abc", + sha256 = "bef8cb1566ad689bc3e7291c7691498fae979ca7b8c760ada5866b9d0147b412", + git_commit = "e1ab41387a255fe4a98b76589cd36dc8206c7f77", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3c56dd5c3b66bc5cc3a126537f9dc2e2b4183d5e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 15 Feb 2019 01:02:20 -0800 Subject: [PATCH 2596/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234101466 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 58e81fe602f..2763e20f2d1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bef8cb1566ad689bc3e7291c7691498fae979ca7b8c760ada5866b9d0147b412", - git_commit = "e1ab41387a255fe4a98b76589cd36dc8206c7f77", + sha256 = "a9b92d50d47c11c5106d375b90ec312e62b52cbde9b602e65894bb55256eaec8", + git_commit = "472695a0da668e571739b74d9799d2843caebe63", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6440d614990f06a1c7a940cce4921ecc858322d6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 15 Feb 2019 02:02:04 -0800 Subject: [PATCH 2597/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234107432 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2763e20f2d1..dbbf84bae4a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a9b92d50d47c11c5106d375b90ec312e62b52cbde9b602e65894bb55256eaec8", - git_commit = "472695a0da668e571739b74d9799d2843caebe63", + sha256 = "b81433229131d9db7e11d5f0abb057334b7fa6c20d930d34e066205ee770355e", + git_commit = "fe89c1b0e5376c15ebd040e9e69382e5f837f5d5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 888c4b83081d571cdc934800899dfcfe8712ef6b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 15 Feb 2019 03:02:21 -0800 Subject: [PATCH 2598/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234113138 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dbbf84bae4a..bdee795e7fa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b81433229131d9db7e11d5f0abb057334b7fa6c20d930d34e066205ee770355e", - git_commit = "fe89c1b0e5376c15ebd040e9e69382e5f837f5d5", + sha256 = "1fff53ce46e42c8f361bdd9d10d1f95567584e5d1b476fb9e73ae38ee16a6c53", + git_commit = "02252244f194dae479391a4dd017d7f76c9b6778", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 45bf2ff19efd1cde294fceaae7304a87178b3974 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 15 Feb 2019 05:02:20 -0800 Subject: [PATCH 2599/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234123893 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bdee795e7fa..856747d80d6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1fff53ce46e42c8f361bdd9d10d1f95567584e5d1b476fb9e73ae38ee16a6c53", - git_commit = "02252244f194dae479391a4dd017d7f76c9b6778", + sha256 = "0ac49680b3cae8c80563ba7a001703a80000d69bbaadc330e98c280bb0426ba6", + git_commit = "081618315c8cd7c87db1e83493473da3a9030dc5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d69142b0b7a7031bcef7de23da54777ef076b39a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 15 Feb 2019 07:02:03 -0800 Subject: [PATCH 2600/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234137131 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 856747d80d6..b5b669d36cd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0ac49680b3cae8c80563ba7a001703a80000d69bbaadc330e98c280bb0426ba6", - git_commit = "081618315c8cd7c87db1e83493473da3a9030dc5", + sha256 = "01e3bb0b117e160ca35fa53abbae1c0ffc2778f5377da557193b622aa8f2512d", + git_commit = "789887e5bd4a74bc888fc192278578fb67cfc70a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 782459c01433ed8aa29b4720665fa4d76aa30ffc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 15 Feb 2019 08:02:17 -0800 Subject: [PATCH 2601/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234144567 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b5b669d36cd..adec546025c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "01e3bb0b117e160ca35fa53abbae1c0ffc2778f5377da557193b622aa8f2512d", - git_commit = "789887e5bd4a74bc888fc192278578fb67cfc70a", + sha256 = "3408cbcf50049ab026fd9128eca49578ba9dff50203354250d49fdc75df23a32", + git_commit = "4978c1e0280b6d49f58c06e2e40639f037efe9cc", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8009301550d1b3e99ee08d754138aa5d5699d322 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 15 Feb 2019 09:02:18 -0800 Subject: [PATCH 2602/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234153584 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index adec546025c..8e86009d9d3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3408cbcf50049ab026fd9128eca49578ba9dff50203354250d49fdc75df23a32", - git_commit = "4978c1e0280b6d49f58c06e2e40639f037efe9cc", + sha256 = "cffcac26c4b53f111ad937d7914ae9a9e00893256f34a28aca124588de478090", + git_commit = "ad78b5ea16e0fe76d9eb4de93bc1bcf9729fbf5a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e92e8313b433472e1d0699e7e2606da383b706bb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 15 Feb 2019 10:02:09 -0800 Subject: [PATCH 2603/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234163442 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8e86009d9d3..d9f2953a44b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cffcac26c4b53f111ad937d7914ae9a9e00893256f34a28aca124588de478090", - git_commit = "ad78b5ea16e0fe76d9eb4de93bc1bcf9729fbf5a", + sha256 = "9cddf0c5940d8f08f25146538f77a9eed821f15a5c2de1c024667921a089d5a3", + git_commit = "1258797b1110c46b4db33d49b0569d3e721b4e8f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0065b67c047c233ddee3d92b1075ba79769869a3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 15 Feb 2019 11:01:53 -0800 Subject: [PATCH 2604/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234175892 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d9f2953a44b..77444f794ef 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9cddf0c5940d8f08f25146538f77a9eed821f15a5c2de1c024667921a089d5a3", - git_commit = "1258797b1110c46b4db33d49b0569d3e721b4e8f", + sha256 = "9f993ad38c2adbae7860180c76518c02b6398e52f353a7c6f566f681d3e9e6fc", + git_commit = "637db0e2511ff60d1556923484d499ffeba5c5af", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d730be676ccc1f73fdee09afbe064e1da3fccf8c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 15 Feb 2019 12:02:10 -0800 Subject: [PATCH 2605/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234187691 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 77444f794ef..eafa109d322 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9f993ad38c2adbae7860180c76518c02b6398e52f353a7c6f566f681d3e9e6fc", - git_commit = "637db0e2511ff60d1556923484d499ffeba5c5af", + sha256 = "1ec2c293e350b0260b4493a49ac541c663e89e815437ce3a064fb1ae87e72500", + git_commit = "15f97c58e62336cf5fcf92561a7c7272726340e5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1fdd57cc1ebfa972e1f508f854462da79c2013da Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 15 Feb 2019 13:01:44 -0800 Subject: [PATCH 2606/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234197661 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index eafa109d322..53084d9146f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1ec2c293e350b0260b4493a49ac541c663e89e815437ce3a064fb1ae87e72500", - git_commit = "15f97c58e62336cf5fcf92561a7c7272726340e5", + sha256 = "d80cb31a6cb633ac7c201c10860b9398431f726a8376a24ac09aef8909d23fbf", + git_commit = "398fce03079f77d0933f941cba3de080a3116859", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0cfa9425d97a49a81135aa17c368276f3da168fc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 15 Feb 2019 14:02:06 -0800 Subject: [PATCH 2607/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234208222 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 53084d9146f..33a831bfdae 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d80cb31a6cb633ac7c201c10860b9398431f726a8376a24ac09aef8909d23fbf", - git_commit = "398fce03079f77d0933f941cba3de080a3116859", + sha256 = "f05c7b3b8fc78fd2616a27c705aa98fbb17ffb2b30c121cd6f790fd3746bda30", + git_commit = "fe6285cfbd18ecaaf5d17a28519e84e46a9825d9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6ea29733ff31ac12d6d8a83b78d9447c31fa0064 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 15 Feb 2019 15:01:57 -0800 Subject: [PATCH 2608/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234219466 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 33a831bfdae..987761a5531 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f05c7b3b8fc78fd2616a27c705aa98fbb17ffb2b30c121cd6f790fd3746bda30", - git_commit = "fe6285cfbd18ecaaf5d17a28519e84e46a9825d9", + sha256 = "cf57b7dbb20e14165205195596599dba4332afb6bbf44879d7c09f0ecf6c3f50", + git_commit = "d70ecce48903b8b249c73dede0e531165c630dcb", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d04fa2972ae50e3b65f6b13ed9548d93d24f0dcf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 15 Feb 2019 16:02:01 -0800 Subject: [PATCH 2609/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234229932 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 987761a5531..b300afc88a4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cf57b7dbb20e14165205195596599dba4332afb6bbf44879d7c09f0ecf6c3f50", - git_commit = "d70ecce48903b8b249c73dede0e531165c630dcb", + sha256 = "2ec18f2aea4bf901949a5e4922fb57bc3839e905134d1142315a0a7ca2e92fb5", + git_commit = "ebb39c81daf32c9182a0a2f4862814f347badc6f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a32bc432ed3c6366cfbb540d4b86b1cc6b3acf22 Mon Sep 17 00:00:00 2001 From: Karthik Vadla Date: Fri, 15 Feb 2019 15:43:06 -0800 Subject: [PATCH 2610/8103] Update comments as new envs TF_NUM_INTEROP_THREADS and TF_NUM_INTRAOP_THREADS are added in tensorflow Update git sha --- tensorflow_serving/tools/docker/Dockerfile.mkl | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tensorflow_serving/tools/docker/Dockerfile.mkl b/tensorflow_serving/tools/docker/Dockerfile.mkl index c69967855fd..3faeecbc2d8 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.mkl +++ b/tensorflow_serving/tools/docker/Dockerfile.mkl @@ -87,6 +87,12 @@ ENV MKLDNN_VERBOSE=0 # For more information vist below reference # https://www.tensorflow.org/guide/performance/overview#tuning_mkl_for_the_best_performance +# NOTE: As TENSORFLOW_INTRA_OP_PARALLELISM and TENSORFLOW_INTER_OP_PARALLELISM are +# configured via SessionOptions in tensorflow, these values +# will override the values configured via TF_NUM_INTEROP_THREADS and TF_NUM_INTRAOP_THREADS +# environment variables in tensorflow. +# https://github.com/tensorflow/tensorflow/commit/d1823e2e966e96ee4ea7baa202ad9f292ac7427b + # Defaults ENV TENSORFLOW_INTRA_OP_PARALLELISM=2 ENV TENSORFLOW_INTER_OP_PARALLELISM=2 From 04bde5099c799a0dfcfa3af038531e45b5443b4b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 15 Feb 2019 17:01:59 -0800 Subject: [PATCH 2611/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234239401 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b300afc88a4..d9bf84ea2fb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2ec18f2aea4bf901949a5e4922fb57bc3839e905134d1142315a0a7ca2e92fb5", - git_commit = "ebb39c81daf32c9182a0a2f4862814f347badc6f", + sha256 = "e64e82fbe7a39fae279bc4f8a77871eec537364650cf9750037ecbfa897a915c", + git_commit = "4f787752f93e171cf8554957e40f29667471275a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4b42298e7c985e26884cffd657badcfe77d87363 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 15 Feb 2019 18:01:56 -0800 Subject: [PATCH 2612/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234246802 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d9bf84ea2fb..bfb0bc412ae 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e64e82fbe7a39fae279bc4f8a77871eec537364650cf9750037ecbfa897a915c", - git_commit = "4f787752f93e171cf8554957e40f29667471275a", + sha256 = "fdbaa29ab7a8757e6d0b11ba70b67a4df09e3aba16ba86202af53deb09d3a01a", + git_commit = "5dfe49e2d8038b350da8550e31572c0a349fa4cf", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7f922fb7d68c50e2ea7d779d74053f079edc416e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 15 Feb 2019 19:01:53 -0800 Subject: [PATCH 2613/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234253034 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bfb0bc412ae..23e1e4cd6a9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fdbaa29ab7a8757e6d0b11ba70b67a4df09e3aba16ba86202af53deb09d3a01a", - git_commit = "5dfe49e2d8038b350da8550e31572c0a349fa4cf", + sha256 = "e46a16dd55adb55163a64a85ccba0515a7381a767f2b4f5a32f5b790ed86f586", + git_commit = "bd36b48c555b2d46c41a179ed9f27a04806e9e66", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2488c6a2e105f0e49a95dcb1f096e8186db9f627 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 15 Feb 2019 20:02:15 -0800 Subject: [PATCH 2614/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234257059 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 23e1e4cd6a9..e647961a6d5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e46a16dd55adb55163a64a85ccba0515a7381a767f2b4f5a32f5b790ed86f586", - git_commit = "bd36b48c555b2d46c41a179ed9f27a04806e9e66", + sha256 = "0fc033252d7a2a5f7031e4fba7dd36cf5a12f28c686fd370b162f3a2dbe7d225", + git_commit = "58e2e0d582a11c45476dba4ec94a14739a4f7fd4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From aa29a88f51e54ccbeff6e0a8b2d9b1ce9aadb725 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 15 Feb 2019 22:02:13 -0800 Subject: [PATCH 2615/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234264728 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e647961a6d5..2976dffdc36 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0fc033252d7a2a5f7031e4fba7dd36cf5a12f28c686fd370b162f3a2dbe7d225", - git_commit = "58e2e0d582a11c45476dba4ec94a14739a4f7fd4", + sha256 = "3d5bb1f969f02d3d235cfb0c9f2c39c02c883aa65bcd9f437ed42e0c00b5655b", + git_commit = "9328d750d9d9dd0334e59eaa88d4424de1e795a8", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e54f4441c772822d93ba23574ed5efb73f9d6b50 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 15 Feb 2019 23:03:01 -0800 Subject: [PATCH 2616/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234268259 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2976dffdc36..c682ad10b21 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3d5bb1f969f02d3d235cfb0c9f2c39c02c883aa65bcd9f437ed42e0c00b5655b", - git_commit = "9328d750d9d9dd0334e59eaa88d4424de1e795a8", + sha256 = "488b05efd79ca3d2395a83777670cc8f6e31f4cb5991c7b0a02f82a5b1cb07d0", + git_commit = "eb0ec180670825324932ad33ebb76e2918f7b362", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 84676c081148b6bdc9577978c95a62b674c03a21 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 16 Feb 2019 00:02:24 -0800 Subject: [PATCH 2617/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234271207 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c682ad10b21..26c09b9ae86 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "488b05efd79ca3d2395a83777670cc8f6e31f4cb5991c7b0a02f82a5b1cb07d0", - git_commit = "eb0ec180670825324932ad33ebb76e2918f7b362", + sha256 = "336f30fac3f6ba296c2c29ec65879f7f7193c6e68fa804dbd669700632ff6027", + git_commit = "6120bedc3d14ca953ab9e937d86d72c1f3ec25c9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7c26ab960048496fea8dece2e30c6f7bd9843fe1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 16 Feb 2019 03:02:04 -0800 Subject: [PATCH 2618/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234283767 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 26c09b9ae86..06905981c13 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "336f30fac3f6ba296c2c29ec65879f7f7193c6e68fa804dbd669700632ff6027", - git_commit = "6120bedc3d14ca953ab9e937d86d72c1f3ec25c9", + sha256 = "750138b7da2b5440ead4321a59b7cda41eaf03fc51be34e5f93dc0b40d5781c8", + git_commit = "67112a53a918002bee9dee3194bf775151b5e34f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 164900f786e761dfb2928fae084ac2ef436d5e86 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 16 Feb 2019 10:02:21 -0800 Subject: [PATCH 2619/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234305162 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 06905981c13..ef93da81efa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "750138b7da2b5440ead4321a59b7cda41eaf03fc51be34e5f93dc0b40d5781c8", - git_commit = "67112a53a918002bee9dee3194bf775151b5e34f", + sha256 = "512e2bd72163135facf4c47ea7c9d81b212542af77eb80cfd0e3c3dab267197b", + git_commit = "8095f8cd8b8b3c5404759977d0375c69a8eb3ae4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c037ccf50431bce21cc89c8b11bfbb0f2a3c03d5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 16 Feb 2019 12:02:00 -0800 Subject: [PATCH 2620/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234310986 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ef93da81efa..43432da4073 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "512e2bd72163135facf4c47ea7c9d81b212542af77eb80cfd0e3c3dab267197b", - git_commit = "8095f8cd8b8b3c5404759977d0375c69a8eb3ae4", + sha256 = "72b701faf727ca7acadf496fba54a5dd0d4da3eb2ea5f64b9db848320c0b9175", + git_commit = "81f03ae927a3904683c06c026b2d147e94e8aacf", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 377e9bb89084c14b3eb2fd2130c4795f0056c827 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 16 Feb 2019 13:01:37 -0800 Subject: [PATCH 2621/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234314214 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 43432da4073..f40c11e1b8f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "72b701faf727ca7acadf496fba54a5dd0d4da3eb2ea5f64b9db848320c0b9175", - git_commit = "81f03ae927a3904683c06c026b2d147e94e8aacf", + sha256 = "6f57d11c05843957b838650c542e7fa9a72b82eed4a94cc1af8eb9fec704cdc2", + git_commit = "bcbe9c76fe6d6e69a00b5792458d5595bc480df7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ba277364e4fbfaee46debb7f5c5567cdddd12298 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 16 Feb 2019 19:02:06 -0800 Subject: [PATCH 2622/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234332270 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f40c11e1b8f..f23186cf600 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6f57d11c05843957b838650c542e7fa9a72b82eed4a94cc1af8eb9fec704cdc2", - git_commit = "bcbe9c76fe6d6e69a00b5792458d5595bc480df7", + sha256 = "f593397795b93a98742dea4d863c5ad622687c27d6c75121a5ca2977e4a741bc", + git_commit = "597eeaa7545ad6fd059dbaceeeffc9801f6156ae", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3d78c9232c062aadc53908e54fd0149b0b78a553 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 16 Feb 2019 21:01:51 -0800 Subject: [PATCH 2623/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234338238 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f23186cf600..6e9bd0f02f7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f593397795b93a98742dea4d863c5ad622687c27d6c75121a5ca2977e4a741bc", - git_commit = "597eeaa7545ad6fd059dbaceeeffc9801f6156ae", + sha256 = "4faa074fac1b6753f5d43b2566fa1f3af5545181bedf011d6a11c174c0d164ab", + git_commit = "bf6c9fbfc2976aa4f26219faf815ec19c0582514", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d04a54ab1d58296f7fb88455702b963481529792 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 17 Feb 2019 02:02:05 -0800 Subject: [PATCH 2624/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234354891 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6e9bd0f02f7..77d4df32711 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4faa074fac1b6753f5d43b2566fa1f3af5545181bedf011d6a11c174c0d164ab", - git_commit = "bf6c9fbfc2976aa4f26219faf815ec19c0582514", + sha256 = "d65c101e34518f539ab799dc10eefa8e71de4931280cb842dfcf8a8865efb155", + git_commit = "79bb3858b911e15dda69576050ed3ed959d95d71", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a61029409c404c0e15e049d2aadcfc23996dc892 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 17 Feb 2019 03:02:18 -0800 Subject: [PATCH 2625/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234358443 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 77d4df32711..7e2c6cf219f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d65c101e34518f539ab799dc10eefa8e71de4931280cb842dfcf8a8865efb155", - git_commit = "79bb3858b911e15dda69576050ed3ed959d95d71", + sha256 = "a19b64d5c7aecb8487302843b27c8fde916dc08df8d9c2fdded20d94e0947c34", + git_commit = "355cc566efd2d86fe71fa9d755ceabe546d577a7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d551942a031ebb6950511dcfc38f470c656b3026 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 17 Feb 2019 14:02:11 -0800 Subject: [PATCH 2626/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234392769 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7e2c6cf219f..e1792bcd610 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a19b64d5c7aecb8487302843b27c8fde916dc08df8d9c2fdded20d94e0947c34", - git_commit = "355cc566efd2d86fe71fa9d755ceabe546d577a7", + sha256 = "71447750046fe75d8dcb35a097e0616f155bb112f2a85301f51b17c5de69fe43", + git_commit = "130aebaa1e9e802c155be415b0401256849a5351", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f64cee01731dcaf8e78d11450b83e9a5f94fd74d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 17 Feb 2019 15:02:40 -0800 Subject: [PATCH 2627/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234395924 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e1792bcd610..93db740e542 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "71447750046fe75d8dcb35a097e0616f155bb112f2a85301f51b17c5de69fe43", - git_commit = "130aebaa1e9e802c155be415b0401256849a5351", + sha256 = "e03c83973ca93dc3e7802ebb3548fc02328ff52df9790053c9177fffab8ea2ca", + git_commit = "ca228e7a8fdbfa2f9c389dd84ba9b96cdae8b3af", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 35ed0362362cb8fe57cf15c6e5a07ecc0d56d331 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 17 Feb 2019 16:02:00 -0800 Subject: [PATCH 2628/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234398888 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 93db740e542..b769da98400 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e03c83973ca93dc3e7802ebb3548fc02328ff52df9790053c9177fffab8ea2ca", - git_commit = "ca228e7a8fdbfa2f9c389dd84ba9b96cdae8b3af", + sha256 = "cb1cb44708d03635e77a7fc3d66b4daf0e4da725a7f8afebb13e2497e914c284", + git_commit = "439f3eb035a2ee0653937ab90c7d17cc0d665881", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 150c48a060bd55e7050d9b848e88c118c8c3430b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 17 Feb 2019 20:02:11 -0800 Subject: [PATCH 2629/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234413688 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b769da98400..edaa0517300 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cb1cb44708d03635e77a7fc3d66b4daf0e4da725a7f8afebb13e2497e914c284", - git_commit = "439f3eb035a2ee0653937ab90c7d17cc0d665881", + sha256 = "1cb061b05eb4ea549c9a6b0570ec53ab49227d92981aaaa1e65c95e533712abf", + git_commit = "585fff46e9ed3aa9a4c8323fa4882775f4e44d56", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b708293cb330f803ce9b0771a9d67b4c83c2ece3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 18 Feb 2019 03:02:44 -0800 Subject: [PATCH 2630/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234451937 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index edaa0517300..4111e197446 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1cb061b05eb4ea549c9a6b0570ec53ab49227d92981aaaa1e65c95e533712abf", - git_commit = "585fff46e9ed3aa9a4c8323fa4882775f4e44d56", + sha256 = "c4654bf1c3232a5ac729d954ed697717b7d52a9c97f720a63e8ec850299aeb46", + git_commit = "78c5320a2c9e08c6629b59e523413f2b9d80abc5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9ae4400e5ff8c0e3cdc9e8c39ac2aaf576cddf18 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 18 Feb 2019 04:02:44 -0800 Subject: [PATCH 2631/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234457809 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4111e197446..0cd8b400c3a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c4654bf1c3232a5ac729d954ed697717b7d52a9c97f720a63e8ec850299aeb46", - git_commit = "78c5320a2c9e08c6629b59e523413f2b9d80abc5", + sha256 = "2298fa05f429286011b8c4f480ecbe7324198b0f412345d7b1236462e941b289", + git_commit = "1c9b905c595ae34caf2cedd663b54310927cb7c6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f219b28a39cf735d69d34cd77586d7c8941f8787 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 18 Feb 2019 05:02:33 -0800 Subject: [PATCH 2632/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234464973 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0cd8b400c3a..a5f62f577ab 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2298fa05f429286011b8c4f480ecbe7324198b0f412345d7b1236462e941b289", - git_commit = "1c9b905c595ae34caf2cedd663b54310927cb7c6", + sha256 = "90ac69291c9d50df0901d80e8a4e819ab16122850a187ffd890ed00edd5d63f6", + git_commit = "bd46f91af99d2549417726147d32d7f5789efb20", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9926ab2e62447879813898c726316ebf02948390 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 18 Feb 2019 08:02:12 -0800 Subject: [PATCH 2633/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234482109 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a5f62f577ab..a31d0b8a2b7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "90ac69291c9d50df0901d80e8a4e819ab16122850a187ffd890ed00edd5d63f6", - git_commit = "bd46f91af99d2549417726147d32d7f5789efb20", + sha256 = "554b4ecaa6cdb697ea32e9f746b01b454701dd94a9932b86f8d7af36339c0393", + git_commit = "019b2d672e7d06e549297659ecfb2144afc48f3f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e4b2f19b65b4a324ab108df365bb483bf2f787f1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 18 Feb 2019 09:01:51 -0800 Subject: [PATCH 2634/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234487981 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a31d0b8a2b7..72f318fbbe1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "554b4ecaa6cdb697ea32e9f746b01b454701dd94a9932b86f8d7af36339c0393", - git_commit = "019b2d672e7d06e549297659ecfb2144afc48f3f", + sha256 = "19c6ef1969f33d6e163f34173d5acdd1e0c0af5a405e672acea95dbee95707d4", + git_commit = "d166674742b2cffcee20ecc8e9b7a7ddaca30cb6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7eb3c5c99ae97f99968a42ab5cebb6f53d5be735 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 18 Feb 2019 12:02:31 -0800 Subject: [PATCH 2635/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234501818 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 72f318fbbe1..36b679067d3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "19c6ef1969f33d6e163f34173d5acdd1e0c0af5a405e672acea95dbee95707d4", - git_commit = "d166674742b2cffcee20ecc8e9b7a7ddaca30cb6", + sha256 = "a6a62e1e9fad0f5422fcef3d9ed85915d8015fad95e31d1d2c79e9f29e6b285d", + git_commit = "6adb75f80028ad6c919e37f399c63b0a2b5fedf1", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3870ba59a764d859fc137a8363588c94906e0f5f Mon Sep 17 00:00:00 2001 From: mkim301 <46167196+mkim301@users.noreply.github.com> Date: Mon, 18 Feb 2019 16:41:47 -0500 Subject: [PATCH 2636/8103] Update Serving_REST_simple.ipynb --- tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb b/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb index 52ea4bf5ddb..d9cd36ea291 100644 --- a/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb +++ b/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb @@ -535,7 +535,7 @@ "\n", "for i in range(0,3):\n", " show(i, 'The model thought this was a {} (class {}), and it was actually a {} (class {})'.format(\n", - " class_names[np.argmax(predictions[i])], test_labels[i], class_names[np.argmax(predictions[i])], test_labels[i]))" + " class_names[np.argmax(predictions[i])], np.argmax(predictions[i]), class_names[test_labels[i]], test_labels[i]))" ] } ], From 718ad435c32d3bffb4992bc31d5be80520152867 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 18 Feb 2019 17:01:36 -0800 Subject: [PATCH 2637/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234521294 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 36b679067d3..9a5930604b7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a6a62e1e9fad0f5422fcef3d9ed85915d8015fad95e31d1d2c79e9f29e6b285d", - git_commit = "6adb75f80028ad6c919e37f399c63b0a2b5fedf1", + sha256 = "c749854c068a0b7f124936c64e974c6eaa5f6984946a0890f2f2f411c010f8ae", + git_commit = "6f7a0a83c11e4f16862989507e0c036f9ae9083e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5130815ac3584c2530342776c37242f7dea656f2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 19 Feb 2019 00:03:15 -0800 Subject: [PATCH 2638/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234551142 --- WORKSPACE | 4 +-- tensorflow_serving/repo.bzl | 50 +++++++++++++++++++------------------ 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9a5930604b7..2f07df49a5c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c749854c068a0b7f124936c64e974c6eaa5f6984946a0890f2f2f411c010f8ae", - git_commit = "6f7a0a83c11e4f16862989507e0c036f9ae9083e", + sha256 = "a215971b660cc962efd5c0cf10f30536ef8b040e5f3988fd06f0c612050a4bab", + git_commit = "a0b0a503287d019a28ef4f670b157eb3605a12f3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") diff --git a/tensorflow_serving/repo.bzl b/tensorflow_serving/repo.bzl index 21fb4cd906a..91d4e331831 100644 --- a/tensorflow_serving/repo.bzl +++ b/tensorflow_serving/repo.bzl @@ -15,29 +15,31 @@ build: --action_env TF_REVISION="" _TF_REVISION = "TF_REVISION" def _tensorflow_http_archive(ctx): - git_commit = ctx.attr.git_commit - sha256 = ctx.attr.sha256 - - override_git_commit = ctx.os.environ.get(_TF_REVISION) - if override_git_commit: - sha256 = "" - git_commit = override_git_commit - - strip_prefix = "tensorflow-%s" % git_commit - urls = [ - "https://mirror.bazel.build/github.com/tensorflow/tensorflow/archive/%s.tar.gz" % git_commit, - "https://github.com/tensorflow/tensorflow/archive/%s.tar.gz" % git_commit, - ] - ctx.download_and_extract( - urls, - "", - sha256, - "", - strip_prefix) + git_commit = ctx.attr.git_commit + sha256 = ctx.attr.sha256 + + override_git_commit = ctx.os.environ.get(_TF_REVISION) + if override_git_commit: + sha256 = "" + git_commit = override_git_commit + + strip_prefix = "tensorflow-%s" % git_commit + urls = [ + "https://mirror.bazel.build/github.com/tensorflow/tensorflow/archive/%s.tar.gz" % git_commit, + "https://github.com/tensorflow/tensorflow/archive/%s.tar.gz" % git_commit, + ] + ctx.download_and_extract( + urls, + "", + sha256, + "", + strip_prefix, + ) tensorflow_http_archive = repository_rule( - implementation=_tensorflow_http_archive, - attrs={ - "git_commit": attr.string(mandatory=True), - "sha256": attr.string(mandatory=True), - }) + implementation = _tensorflow_http_archive, + attrs = { + "git_commit": attr.string(mandatory = True), + "sha256": attr.string(mandatory = True), + }, +) From 5be45827129d84c47f66b98a3140bc2755d29c5f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 19 Feb 2019 02:02:16 -0800 Subject: [PATCH 2639/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234564051 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2f07df49a5c..c9f178b4fe5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a215971b660cc962efd5c0cf10f30536ef8b040e5f3988fd06f0c612050a4bab", - git_commit = "a0b0a503287d019a28ef4f670b157eb3605a12f3", + sha256 = "241ecad76c33f0c6164ebadfa575fdf43c4e4b58d5d250ead4305cb9c49a64c0", + git_commit = "ee46b37963e54713e119294f8f657926fa537d53", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 06636a76e346632aa88a5ecffa7bce2de366dffa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 19 Feb 2019 03:07:02 -0800 Subject: [PATCH 2640/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234571139 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c9f178b4fe5..614b915a22f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "241ecad76c33f0c6164ebadfa575fdf43c4e4b58d5d250ead4305cb9c49a64c0", - git_commit = "ee46b37963e54713e119294f8f657926fa537d53", + sha256 = "ffc2b4821413bb6a1b9cebcdd486d9131a8f148cc5c4b443ea826c5ad911bcf8", + git_commit = "5f561241785462a7d866d6c92265f5d7ab63120d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 902f170124b5f0cdc5650bfc70d503f6a3502115 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 19 Feb 2019 10:04:47 -0800 Subject: [PATCH 2641/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234622703 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 614b915a22f..430a5fba8e4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ffc2b4821413bb6a1b9cebcdd486d9131a8f148cc5c4b443ea826c5ad911bcf8", - git_commit = "5f561241785462a7d866d6c92265f5d7ab63120d", + sha256 = "80deeea50523f38245f51a536b960d8c995a40cd5ec11587cdf55744a537ae20", + git_commit = "478013a477cfc5349faf7f8719e8242c00e2feba", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 235a9b064c07cd99be77b585e0dd3f0213db0ae1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 19 Feb 2019 11:03:01 -0800 Subject: [PATCH 2642/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234634628 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 430a5fba8e4..7e8dc94caaa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "80deeea50523f38245f51a536b960d8c995a40cd5ec11587cdf55744a537ae20", - git_commit = "478013a477cfc5349faf7f8719e8242c00e2feba", + sha256 = "3a9759d8f0bdf2417cd0e250e42b29613265fa576ea3ee3b20744598b845c673", + git_commit = "c96b09b062fcb23c4bb4e2adb5bd6cc7a3e50aec", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5bc5d2dd2d24f23f875f4233fec47c0eff27b0f1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 19 Feb 2019 12:04:09 -0800 Subject: [PATCH 2643/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234646994 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7e8dc94caaa..da4a5c6c952 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3a9759d8f0bdf2417cd0e250e42b29613265fa576ea3ee3b20744598b845c673", - git_commit = "c96b09b062fcb23c4bb4e2adb5bd6cc7a3e50aec", + sha256 = "c6a7daeb0e0fa27525edabb39b7a2f62524073f7b6951b12d3016d7c1f690855", + git_commit = "660623db8f393e4e9dfa9ff8cace41870c9325a3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ec895f3507a21a7dffd07bd2902cf8bbc95ee388 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 19 Feb 2019 13:03:01 -0800 Subject: [PATCH 2644/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234658099 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index da4a5c6c952..77995f85e4f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c6a7daeb0e0fa27525edabb39b7a2f62524073f7b6951b12d3016d7c1f690855", - git_commit = "660623db8f393e4e9dfa9ff8cace41870c9325a3", + sha256 = "1955b573cb2461e5a373adaa55d6b07cd46f7999cfb8550ec992a40e00c25fbd", + git_commit = "3981aa560b1353c5a5a5d63f95925e0d79470ac7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9d017bc2665f65efe4e3d43d400af9fc1070f637 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 19 Feb 2019 14:03:01 -0800 Subject: [PATCH 2645/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234669713 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 77995f85e4f..091d51bdbaa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1955b573cb2461e5a373adaa55d6b07cd46f7999cfb8550ec992a40e00c25fbd", - git_commit = "3981aa560b1353c5a5a5d63f95925e0d79470ac7", + sha256 = "26fbab446d9fa6ebe756d731ac800892ee19f9ed5029eec42fa7de4d72717131", + git_commit = "893eb2fd5697f4af43642505a780d016c2d47ade", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5f4d8f5baf7205e6684b7b026aca7882e9d3a031 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 19 Feb 2019 15:02:44 -0800 Subject: [PATCH 2646/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234681678 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 091d51bdbaa..a2835c2962f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "26fbab446d9fa6ebe756d731ac800892ee19f9ed5029eec42fa7de4d72717131", - git_commit = "893eb2fd5697f4af43642505a780d016c2d47ade", + sha256 = "1d006af5a068cd58dc3e0aa216e45bde8853bdeb44a12d7b5abe963ead4fa07e", + git_commit = "5111ab390591c226a45e3cd1a3be442fad3da1bb", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2cd6615b061b6041cdea91c578a1a0fdc03a1b28 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 19 Feb 2019 16:03:23 -0800 Subject: [PATCH 2647/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234693157 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a2835c2962f..86135086226 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1d006af5a068cd58dc3e0aa216e45bde8853bdeb44a12d7b5abe963ead4fa07e", - git_commit = "5111ab390591c226a45e3cd1a3be442fad3da1bb", + sha256 = "a3a47c48e8d8d6f3f8c7ffcd4cd09283d4aafb9c7e526d9aab4f411d8448cec3", + git_commit = "863df3e93d0b97aae82d580a47a823c68981949d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8862b6dadd593d645f655044d3209e16242eded6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 19 Feb 2019 17:02:10 -0800 Subject: [PATCH 2648/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234703189 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 86135086226..2b8602fd685 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a3a47c48e8d8d6f3f8c7ffcd4cd09283d4aafb9c7e526d9aab4f411d8448cec3", - git_commit = "863df3e93d0b97aae82d580a47a823c68981949d", + sha256 = "885e969db41aa13793b2737db484c1dc22a3509202ce8dc1409a2b800a8c70d9", + git_commit = "68055e84c503f9b9bf1dce0be0c0b939ff703408", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f08addfb38cc1a957d65bcd717c7eadadc95ac06 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 19 Feb 2019 18:02:29 -0800 Subject: [PATCH 2649/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234712004 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2b8602fd685..086ae25f669 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "885e969db41aa13793b2737db484c1dc22a3509202ce8dc1409a2b800a8c70d9", - git_commit = "68055e84c503f9b9bf1dce0be0c0b939ff703408", + sha256 = "cd0e579c836c3186792096753b09e57776ae42f311b3a38292e29124a1a848f6", + git_commit = "b89e1790170e47fa1809e9548d569f8d04708ffe", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a35e8cf02843b8f8aab46c29c1ab863ca1791812 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 19 Feb 2019 19:02:10 -0800 Subject: [PATCH 2650/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234718890 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 086ae25f669..c717fbc57e7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cd0e579c836c3186792096753b09e57776ae42f311b3a38292e29124a1a848f6", - git_commit = "b89e1790170e47fa1809e9548d569f8d04708ffe", + sha256 = "89b41876baad0b6622d322b66f897dbafdbff87eee33d4c78536c19125e51d68", + git_commit = "aaef4e8e43036ef13812af5dbdf8e66eb28789f1", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b072345c6fc45e84f71984f6c2859257512ef2b7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 19 Feb 2019 20:02:43 -0800 Subject: [PATCH 2651/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234724526 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c717fbc57e7..b1bcd524fdf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "89b41876baad0b6622d322b66f897dbafdbff87eee33d4c78536c19125e51d68", - git_commit = "aaef4e8e43036ef13812af5dbdf8e66eb28789f1", + sha256 = "a5932d28ae0e87aae0662fdb37516aab72733a850eb4641276f72b4a3b4cd5af", + git_commit = "406590fceb48066c45d2737daf51fc090399b986", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 95d49c5a1853bfcdf645a59eb3e285edfe61dffc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 19 Feb 2019 21:02:01 -0800 Subject: [PATCH 2652/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234729487 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b1bcd524fdf..40c2546f5fe 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a5932d28ae0e87aae0662fdb37516aab72733a850eb4641276f72b4a3b4cd5af", - git_commit = "406590fceb48066c45d2737daf51fc090399b986", + sha256 = "8df2280533e31219276364b2ecf170c58d0edff6880fb97048145e0cb92a3f15", + git_commit = "d9313fd4617dd5e062307ec16c9a3b082c6003d4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 177cbd14d610c02da50ce2d74695ebd12b3cc806 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 19 Feb 2019 22:02:15 -0800 Subject: [PATCH 2653/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234734643 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 40c2546f5fe..652ec188d41 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8df2280533e31219276364b2ecf170c58d0edff6880fb97048145e0cb92a3f15", - git_commit = "d9313fd4617dd5e062307ec16c9a3b082c6003d4", + sha256 = "e087d0e4bcd19d914a6ae260e4c487b2d2cc825a650b3ad83cb16f7d20efd9b6", + git_commit = "95147fbbf7b62b421c3a4da7f770249abc3f1287", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ece5c40937cdfe6d22d0b8cec15b8b423f1eeab8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Feb 2019 00:02:24 -0800 Subject: [PATCH 2654/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234744466 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 652ec188d41..3b8ca36c55b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e087d0e4bcd19d914a6ae260e4c487b2d2cc825a650b3ad83cb16f7d20efd9b6", - git_commit = "95147fbbf7b62b421c3a4da7f770249abc3f1287", + sha256 = "bbc6e1ca8fb77a6d14386c7df22e7a49147cabb655e27c621231ff2e25926f8a", + git_commit = "551d1f971961384d67a39e4b22bbe47fe73d4e55", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 561959776c95c83b6bdb2350c3479d155c105d4d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Feb 2019 01:02:05 -0800 Subject: [PATCH 2655/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234752069 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3b8ca36c55b..03cd4a772c9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bbc6e1ca8fb77a6d14386c7df22e7a49147cabb655e27c621231ff2e25926f8a", - git_commit = "551d1f971961384d67a39e4b22bbe47fe73d4e55", + sha256 = "c097acd072dcb5f9de8cd5b8b883958ca1e90e033a5821f307072f2cd5f911bf", + git_commit = "cd813a15ef83f06afa5b22f9a3fc9cb9e3f81bc7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b77ec82ca70988ef6f20251b1492254937bcd3ca Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Feb 2019 02:02:18 -0800 Subject: [PATCH 2656/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234758812 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 03cd4a772c9..bd98b6a1fd8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c097acd072dcb5f9de8cd5b8b883958ca1e90e033a5821f307072f2cd5f911bf", - git_commit = "cd813a15ef83f06afa5b22f9a3fc9cb9e3f81bc7", + sha256 = "1ca4163847ced38d5aca8621e2e5b7d4da5030cf660ba47f12c3d15f55f3b761", + git_commit = "8501ea4c417de4ced5d3c3212f01624c76145ba4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5abf7c5ad6469c81f5c251dbeec48841aca7ac54 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Feb 2019 03:02:16 -0800 Subject: [PATCH 2657/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234765392 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bd98b6a1fd8..c59a806d9af 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1ca4163847ced38d5aca8621e2e5b7d4da5030cf660ba47f12c3d15f55f3b761", - git_commit = "8501ea4c417de4ced5d3c3212f01624c76145ba4", + sha256 = "495f6da1cb597acf057767c5b0cb72f391a658fa46d18effd9543c2577de2515", + git_commit = "f6d8f50fb187e9f7017d5a502635d397d9108030", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9270e25517d6d70fffd6b4dfe63eb4b4b98d6fd1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Feb 2019 04:02:29 -0800 Subject: [PATCH 2658/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234771048 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c59a806d9af..d28c85f7ad5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "495f6da1cb597acf057767c5b0cb72f391a658fa46d18effd9543c2577de2515", - git_commit = "f6d8f50fb187e9f7017d5a502635d397d9108030", + sha256 = "061505c6e6ae1ec840459fc019fcdac32c65da67ac36a50ddc7e178f58f78300", + git_commit = "b0d8082d0ba3da0ac9c54ed802838ac7ba5882db", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 355d5640bea4f8831ba24c2bbde2c2bf91cc0283 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Feb 2019 06:02:26 -0800 Subject: [PATCH 2659/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234780789 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d28c85f7ad5..60505c8933e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "061505c6e6ae1ec840459fc019fcdac32c65da67ac36a50ddc7e178f58f78300", - git_commit = "b0d8082d0ba3da0ac9c54ed802838ac7ba5882db", + sha256 = "7f1553aad394a5ec742b6808d2bea813b0a34a28ad42665ff894100de32db522", + git_commit = "e889ea1dd965c31c391106aa3518fc23d2689954", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e7a116b62b53345b4b7cbbfa223defeb4be21744 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Feb 2019 09:02:05 -0800 Subject: [PATCH 2660/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234806389 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 60505c8933e..4efda87023a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7f1553aad394a5ec742b6808d2bea813b0a34a28ad42665ff894100de32db522", - git_commit = "e889ea1dd965c31c391106aa3518fc23d2689954", + sha256 = "d7c24c1cf1c44d30b74b9f34a6dc9c9af2a70df19f1a62efdfef18cabc38b25b", + git_commit = "1b03e255e395238ac38b26037787800c5ec9b0e7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From fc9d724fbd0e589f7d5ce023453461569daec1e1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Feb 2019 10:01:56 -0800 Subject: [PATCH 2661/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234816964 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4efda87023a..ad082f8a0e9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d7c24c1cf1c44d30b74b9f34a6dc9c9af2a70df19f1a62efdfef18cabc38b25b", - git_commit = "1b03e255e395238ac38b26037787800c5ec9b0e7", + sha256 = "0fcf0dcb72693db12e3625c3bfb65e1be1c5d7c8860fd225000b50aee7e3bb18", + git_commit = "aeec59402e68368407d1c3dd6c141ab9e52d3164", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7ae94a2a55b4e7c6a2825b8f5bd1f73389dd8c97 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Feb 2019 11:02:11 -0800 Subject: [PATCH 2662/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234829564 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ad082f8a0e9..eaac70a5271 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0fcf0dcb72693db12e3625c3bfb65e1be1c5d7c8860fd225000b50aee7e3bb18", - git_commit = "aeec59402e68368407d1c3dd6c141ab9e52d3164", + sha256 = "b45b1f067b9e3dd4ff4de14a63adbae05914dce9e2d22b1d919d09f0cdea24e9", + git_commit = "e0f5241e4cceabbe0422bd7593b2ac9d824ec1b5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8c9b397c848902e88c82a64823eee5f31c760c5b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Feb 2019 12:02:14 -0800 Subject: [PATCH 2663/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234841787 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index eaac70a5271..1ce8864ff26 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b45b1f067b9e3dd4ff4de14a63adbae05914dce9e2d22b1d919d09f0cdea24e9", - git_commit = "e0f5241e4cceabbe0422bd7593b2ac9d824ec1b5", + sha256 = "d58ebd291cfb59da96e8e7279a8b2f62933005f547e1d8cf2c75009391ea8051", + git_commit = "a8aa6977015eb1038626b4124efb7324e98f682d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f9b102c3363312d48172fe8fa1aa5cf50d55f0e1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Feb 2019 13:01:49 -0800 Subject: [PATCH 2664/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234852302 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1ce8864ff26..140836edcaa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d58ebd291cfb59da96e8e7279a8b2f62933005f547e1d8cf2c75009391ea8051", - git_commit = "a8aa6977015eb1038626b4124efb7324e98f682d", + sha256 = "4a22afb77ae5c4d0477376737ed79f388e2f8e72c654f2a3e2d1979c5ac0e5d8", + git_commit = "9f769c72fa6c8a33742b1a5a09537bed2160c5b2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 27e02fd07d9144c9f6a80b630da103a56b651f80 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Feb 2019 14:01:58 -0800 Subject: [PATCH 2665/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234863982 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 140836edcaa..9d9d9a45393 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4a22afb77ae5c4d0477376737ed79f388e2f8e72c654f2a3e2d1979c5ac0e5d8", - git_commit = "9f769c72fa6c8a33742b1a5a09537bed2160c5b2", + sha256 = "0b25d83666f7251dc35638008dcb24b6789d5c0d8476f9d40d09bf953c401b8a", + git_commit = "26a9094f711d6a1cd0961aa3acff053b18c7573f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5e0ad65fc5e35881c49898f4833c2939b7b726d1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Feb 2019 15:02:42 -0800 Subject: [PATCH 2666/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234876183 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9d9d9a45393..b610e0006b8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0b25d83666f7251dc35638008dcb24b6789d5c0d8476f9d40d09bf953c401b8a", - git_commit = "26a9094f711d6a1cd0961aa3acff053b18c7573f", + sha256 = "a8d7abd3a01419b4c84dc34c35d7905f98dc2a974bc4e3885cf52e629e586cf2", + git_commit = "5c019aacdc6d0768ec8cd40fac29931a37192ab9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2474f116f0d1770f428fa43e445af038b3774acc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Feb 2019 16:02:52 -0800 Subject: [PATCH 2667/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234888105 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b610e0006b8..866463a6278 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a8d7abd3a01419b4c84dc34c35d7905f98dc2a974bc4e3885cf52e629e586cf2", - git_commit = "5c019aacdc6d0768ec8cd40fac29931a37192ab9", + sha256 = "40c0f3c2edd42f8cc4490de85296826df0972e74e28bd38c48d1abcb36ccb425", + git_commit = "95e1847a2e58f8e6174772a8b52f284ea58d01cd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 595694a8cd619d586385c8a9240568d7171745b8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Feb 2019 17:02:01 -0800 Subject: [PATCH 2668/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234898472 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 866463a6278..62f9eb12d1d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "40c0f3c2edd42f8cc4490de85296826df0972e74e28bd38c48d1abcb36ccb425", - git_commit = "95e1847a2e58f8e6174772a8b52f284ea58d01cd", + sha256 = "79bf0d6ec398f894030e1c032218aad3e58b22411553d49f43347319c20eb380", + git_commit = "b44b443436bd8f9f036fb1dbf3130eca270203ed", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c3dc4e55bfde56510c863425d6ccf110b4a0a137 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Feb 2019 18:01:59 -0800 Subject: [PATCH 2669/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234907025 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 62f9eb12d1d..1a2c2c9e2d9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "79bf0d6ec398f894030e1c032218aad3e58b22411553d49f43347319c20eb380", - git_commit = "b44b443436bd8f9f036fb1dbf3130eca270203ed", + sha256 = "0142e7329a5b27afdbb7f8626707c23900fbe17a6033b7657c017fde46764a8f", + git_commit = "9ddbdf1258f30d95ec46b499f2b37d5ac5c5e0b0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6ac044af384bb0529d68ee1dd4fe287c2c55dc04 Mon Sep 17 00:00:00 2001 From: blamb Date: Wed, 20 Feb 2019 19:00:55 -0800 Subject: [PATCH 2670/8103] Update TF Serving subsite config to import to /tfx/serving PiperOrigin-RevId: 234914157 --- tensorflow_serving/g3doc/_book.yaml | 59 -------------------------- tensorflow_serving/g3doc/_index.yaml | 47 +++----------------- tensorflow_serving/g3doc/_project.yaml | 11 ----- tensorflow_serving/g3doc/_toc.yaml | 28 ++++++++++++ 4 files changed, 35 insertions(+), 110 deletions(-) delete mode 100644 tensorflow_serving/g3doc/_book.yaml delete mode 100644 tensorflow_serving/g3doc/_project.yaml create mode 100644 tensorflow_serving/g3doc/_toc.yaml diff --git a/tensorflow_serving/g3doc/_book.yaml b/tensorflow_serving/g3doc/_book.yaml deleted file mode 100644 index a836f825748..00000000000 --- a/tensorflow_serving/g3doc/_book.yaml +++ /dev/null @@ -1,59 +0,0 @@ -upper_tabs: -# Tabs left of dropdown menu -- include: /_upper_tabs_left.yaml -- include: /api_docs/_upper_tabs_api.yaml -# Dropdown menu -- name: Resources - path: /resources - is_default: true - menu: - - include: /resources/_menu_toc.yaml - lower_tabs: - # Subsite tabs - other: - - name: Guide - contents: - - heading: Quick Start - - title: "Server: Use TensorFlow Serving with Docker" - path: /serving/docker - - title: "Client: REST API" - path: /serving/api_rest - - heading: Examples - - title: Training and serving a model with REST - path: /serving/tutorials/Serving_REST_simple - - heading: Understanding TensorFlow Serving - - title: Overview - path: /serving/overview - - title: Installation - path: /serving/setup - - title: Serve a TensorFlow model - path: /serving/serving_basic - - title: Advanced model server configuration - path: /serving/serving_config - - title: Build a TensorFlow ModelServer - path: /serving/serving_advanced - - title: Use TensorFlow Serving with Kubernetes - path: /serving/serving_kubernetes - - title: Create a new kind of servable - path: /serving/custom_servable - - title: Create a module that discovers new servable paths - path: /serving/custom_source - - title: SignatureDefs in SavedModel for TensorFlow Serving - path: /serving/signature_defs - - - name: TFX - contents: - - title: TFX - path: /tfx - status: external - - - name: API - skip_translation: true - contents: - - heading: Serving APIs - - title: Server API (C++) - path: /serving/api_docs/cc/ - - title: Client API (REST) - path: /serving/api_rest/ - -- include: /_upper_tabs_right.yaml diff --git a/tensorflow_serving/g3doc/_index.yaml b/tensorflow_serving/g3doc/_index.yaml index 62c8d6b5a20..c55a5982438 100644 --- a/tensorflow_serving/g3doc/_index.yaml +++ b/tensorflow_serving/g3doc/_index.yaml @@ -1,54 +1,20 @@ -book_path: /serving/_book.yaml -project_path: /serving/_project.yaml +book_path: /tfx/_book.yaml +project_path: /tfx/_project.yaml description: landing_page: custom_css_path: /site-assets/css/style.css + nav: left rows: - - heading: TensorFlow Serving for model deployment in production + - classname: devsite-landing-row-100 + heading: TensorFlow Serving for model deployment in production items: - - classname: devsite-landing-row-50 - description: > + - description: > TensorFlow Serving is a flexible, high-performance serving system for machine learning models, designed for production environments. TensorFlow Serving makes it easy to deploy new algorithms and experiments, while keeping the same server architecture and APIs. TensorFlow Serving provides out-of-the-box integration with TensorFlow models, but can be easily extended to serve other types of models and data. - -

Create a production pipeline

- You can create a production pipeline by adding other components from - TensorFlow Extended (TFX) to your TensorFlow Serving deployment. TFX includes - components that enable your production deployment to monitor and validate your - data, create engineered features, and analyze your model's results. Along with - TensorFlow Serving, TFX also includes: - list: - - heading: TensorFlow Data Validation - description: > - A library for exploring and validating machine learning data. - path: /tfx/data_validation - icon: - icon_name: chevron_right - foreground: theme - background: grey - - heading: TensorFlow Transform - description: > - Perform full-pass analyze phases over data to create transformation - graphs that are consistently applied during training and serving. - path: /tfx/transform - icon: - icon_name: chevron_right - foreground: theme - background: grey - - heading: TensorFlow Model Analysis - description: > - Libraries and visualization components to compute full-pass and sliced - model metrics over large datasets, and analyze them in a notebook. - path: /tfx/model_analysis - icon: - icon_name: chevron_right - foreground: theme - background: grey - code_block: |
         # Download the TensorFlow Serving Docker image and repo
@@ -68,6 +34,7 @@ landing_page:
            -X POST http://localhost:8501/v1/models/half_plus_two:predict
# Returns => { "predictions": [2.5, 3.0, 4.5] }
+

For additional serving endpoints, see the Client REST API.

- classname: devsite-landing-row-cards items: diff --git a/tensorflow_serving/g3doc/_project.yaml b/tensorflow_serving/g3doc/_project.yaml deleted file mode 100644 index 62ffe13693f..00000000000 --- a/tensorflow_serving/g3doc/_project.yaml +++ /dev/null @@ -1,11 +0,0 @@ -name: TensorFlow Serving -breadcrumb_name: Serving -home_url: /serving/ -parent_project_metadata_path: /_project.yaml -description: > - TensorFlow Serving is a flexible, high-performance serving system for machine - learning models, designed for production environments. -use_site_branding: true -hide_from_products_list: true -content_license: cc3-apache2 -buganizer_id: 162465 diff --git a/tensorflow_serving/g3doc/_toc.yaml b/tensorflow_serving/g3doc/_toc.yaml new file mode 100644 index 00000000000..9d3833abbbf --- /dev/null +++ b/tensorflow_serving/g3doc/_toc.yaml @@ -0,0 +1,28 @@ +toc: +- heading: Quick Start +- title: Use TensorFlow Serving with Docker + path: /tfx/serving/docker + +- heading: Examples +- title: Train and serve a model with REST + path: /tfx/serving/tutorials/Serving_REST_simple + +- heading: Understanding TensorFlow Serving +- title: Overview + path: /tfx/serving/overview +- title: Installation + path: /tfx/serving/setup +- title: Serve a TensorFlow model + path: /tfx/serving/serving_basic +- title: Advanced model server configuration + path: /tfx/serving/serving_config +- title: Build a TensorFlow ModelServer + path: /tfx/serving/serving_advanced +- title: Use TensorFlow Serving with Kubernetes + path: /tfx/serving/serving_kubernetes +- title: Create a new kind of servable + path: /tfx/serving/custom_servable +- title: Create a module that discovers new servable paths + path: /tfx/serving/custom_source +- title: SignatureDefs in SavedModel for TensorFlow Serving + path: /tfx/serving/signature_defs From 2f884f2f925f570c686e238fe172e152c7970497 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Feb 2019 19:01:51 -0800 Subject: [PATCH 2671/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234914248 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1a2c2c9e2d9..a8f3b52d168 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0142e7329a5b27afdbb7f8626707c23900fbe17a6033b7657c017fde46764a8f", - git_commit = "9ddbdf1258f30d95ec46b499f2b37d5ac5c5e0b0", + sha256 = "f86059166baa601f97731165cdac878def4b7a7b47f73bc7972ab2e5b276e141", + git_commit = "212794822976c6eba967a25d1401a862c9ebd94f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e7c06ce932702c1c7df8f68e583e08357693c6b8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Feb 2019 20:02:04 -0800 Subject: [PATCH 2672/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234920195 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a8f3b52d168..650df04c186 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f86059166baa601f97731165cdac878def4b7a7b47f73bc7972ab2e5b276e141", - git_commit = "212794822976c6eba967a25d1401a862c9ebd94f", + sha256 = "64636eedb72ea33c52fa08d317cbcf26cfd03e264dd1b55e3c3d066e2626622d", + git_commit = "384312df9e39c8935fdbaca1fc08df8f271aaf35", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f6340f902c8602d3368a4443b295634895e4f189 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Feb 2019 21:01:49 -0800 Subject: [PATCH 2673/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234925522 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 650df04c186..bfc96208b08 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "64636eedb72ea33c52fa08d317cbcf26cfd03e264dd1b55e3c3d066e2626622d", - git_commit = "384312df9e39c8935fdbaca1fc08df8f271aaf35", + sha256 = "0759306aea9cc14b428226acade608b09c381a29e62fea464e6ab002da470c99", + git_commit = "d64564682dd494c54bf3249e3d945d93de4a9b30", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 74314681a2a3e1b1df287afe16adaab7ec42f0e2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Feb 2019 23:02:09 -0800 Subject: [PATCH 2674/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234935650 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bfc96208b08..bb22976f831 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0759306aea9cc14b428226acade608b09c381a29e62fea464e6ab002da470c99", - git_commit = "d64564682dd494c54bf3249e3d945d93de4a9b30", + sha256 = "34c8664b5a3ea8bc91b2dd24d7438c5e39b245f24385e0fbdca9218ce8c7147a", + git_commit = "3864f82e017ca2de7d9e2bb387eb60dc4d73d540", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b4026691abd6757097a2401e31d686b706d3709f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Feb 2019 00:02:01 -0800 Subject: [PATCH 2675/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234941021 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bb22976f831..60d65429560 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "34c8664b5a3ea8bc91b2dd24d7438c5e39b245f24385e0fbdca9218ce8c7147a", - git_commit = "3864f82e017ca2de7d9e2bb387eb60dc4d73d540", + sha256 = "0b846ab56c0a60be69eb8bdc39e84e9db247367af962471dd438c156f3e3b73b", + git_commit = "f4206a652aea3f9d50e2ae52bae078136f1a754a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 43221e235e75b653d2a05894cbf3b1c9ad2e188f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Feb 2019 03:02:26 -0800 Subject: [PATCH 2676/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234961947 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 60d65429560..9939285bd39 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0b846ab56c0a60be69eb8bdc39e84e9db247367af962471dd438c156f3e3b73b", - git_commit = "f4206a652aea3f9d50e2ae52bae078136f1a754a", + sha256 = "4be6ca658fede9bbe58d210bdd3ee86bea8fd96974fc53acdcfb4f59fcd75c8f", + git_commit = "00bd52b61dc7be94c09cbd7be3c3e14629ceee7c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e8866e1592509a03ad9f70933c45487afc9c1a99 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Feb 2019 04:02:09 -0800 Subject: [PATCH 2677/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234968180 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9939285bd39..558031e1e0d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4be6ca658fede9bbe58d210bdd3ee86bea8fd96974fc53acdcfb4f59fcd75c8f", - git_commit = "00bd52b61dc7be94c09cbd7be3c3e14629ceee7c", + sha256 = "43dba3fa569632ce0b7a49fcd1433d1f45e96b1a5dbf1dbbecd96c61ecc5a171", + git_commit = "86c8647f110220835c7783f96bf563fcc369378b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c191e05df15e696244ae144a6127d44c2aed2676 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Feb 2019 06:01:58 -0800 Subject: [PATCH 2678/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234981319 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 558031e1e0d..1fcaa6a3782 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "43dba3fa569632ce0b7a49fcd1433d1f45e96b1a5dbf1dbbecd96c61ecc5a171", - git_commit = "86c8647f110220835c7783f96bf563fcc369378b", + sha256 = "97e8e11e7485fa2139e411ecf8d804d3fe543398ee6bf5743580a88a78a4572b", + git_commit = "641d3f1ed1324229ae6a003b00fca08b8ddf516b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 52a4c1adcd0e7cedccbad741c2c0c01125b7d7a8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Feb 2019 07:02:08 -0800 Subject: [PATCH 2679/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234988068 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1fcaa6a3782..a8a8bf98c8a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "97e8e11e7485fa2139e411ecf8d804d3fe543398ee6bf5743580a88a78a4572b", - git_commit = "641d3f1ed1324229ae6a003b00fca08b8ddf516b", + sha256 = "9547325e2e90f4583d4b729a53326e1c34686eddb78a1c2274ca033e5ba7e5fd", + git_commit = "8fd92b5f05b5a48742215fb5c820b8b08492757a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0daf3266ea300cef8024e29adccb9d45f0aa18f5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Feb 2019 08:02:07 -0800 Subject: [PATCH 2680/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 234995582 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a8a8bf98c8a..e5b9c3ad2ef 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9547325e2e90f4583d4b729a53326e1c34686eddb78a1c2274ca033e5ba7e5fd", - git_commit = "8fd92b5f05b5a48742215fb5c820b8b08492757a", + sha256 = "3b16899bb190a2f8c458372efdc2719e2532edf8a5d849a5a73f8e78e961c952", + git_commit = "933f41aab7b8983459475f376acd5bb44e45d606", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c4c37b79f80bea0efee59e32ec5d9834eb1e4960 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Feb 2019 09:01:50 -0800 Subject: [PATCH 2681/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235004741 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e5b9c3ad2ef..876c963c2c4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3b16899bb190a2f8c458372efdc2719e2532edf8a5d849a5a73f8e78e961c952", - git_commit = "933f41aab7b8983459475f376acd5bb44e45d606", + sha256 = "6fd33243e6aaac2265a10ad2b5ac113e33c406ae4c64f51de1e8314fe660f2c1", + git_commit = "11f4ecb54708865ec757ca64e4805957b05d7570", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9d32be68ef95622cf576e709d2b12b0d1a4e9bc5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Feb 2019 10:02:02 -0800 Subject: [PATCH 2682/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235014866 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 876c963c2c4..da1b812e13b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6fd33243e6aaac2265a10ad2b5ac113e33c406ae4c64f51de1e8314fe660f2c1", - git_commit = "11f4ecb54708865ec757ca64e4805957b05d7570", + sha256 = "b3e5cdb6d4e703584b408847c335096374293da5a2120e64f59b77231cfce90e", + git_commit = "fbcea3501f6a7123ca4c6594b1b553fb4eca76b6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ca874e5c59285196a6cd7251745e0a96aca0a5cb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Feb 2019 11:02:04 -0800 Subject: [PATCH 2683/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235027430 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index da1b812e13b..926a119fad9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b3e5cdb6d4e703584b408847c335096374293da5a2120e64f59b77231cfce90e", - git_commit = "fbcea3501f6a7123ca4c6594b1b553fb4eca76b6", + sha256 = "c8a2c04ba8458c497f5b7a82cdec192ee92bb13dcf611cfef883e831f936039b", + git_commit = "813410d7135ae21b19956e3ed60f49692a1cc0ad", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6eae2c2090db3c7e86448dd432226bd1ba0c2f40 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Feb 2019 12:02:16 -0800 Subject: [PATCH 2684/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235041122 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 926a119fad9..b2dfa55ab82 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c8a2c04ba8458c497f5b7a82cdec192ee92bb13dcf611cfef883e831f936039b", - git_commit = "813410d7135ae21b19956e3ed60f49692a1cc0ad", + sha256 = "06bbb309bd984cd2331e941aef25d98b6a03dd51dbf4f4be5348e1782ff73a58", + git_commit = "3ac33ac88dc62c2b01581f00d35c247041b29481", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6be59f3f4e8a40ed0d52a13b08fc9ef3f56df748 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Feb 2019 13:01:46 -0800 Subject: [PATCH 2685/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235052442 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b2dfa55ab82..a4892bacdf4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "06bbb309bd984cd2331e941aef25d98b6a03dd51dbf4f4be5348e1782ff73a58", - git_commit = "3ac33ac88dc62c2b01581f00d35c247041b29481", + sha256 = "9e4a004cbc719755c97f2a5cda4844de72b7e78a394534917b91634923872233", + git_commit = "1e1e9fe6ead7eb2a166fd7bc02e2e80b8cf7e4bc", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 27702f62bc3b12e71e224b675c57fc5b0df3bca4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Feb 2019 14:01:54 -0800 Subject: [PATCH 2686/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235064003 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a4892bacdf4..6abf977c8da 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9e4a004cbc719755c97f2a5cda4844de72b7e78a394534917b91634923872233", - git_commit = "1e1e9fe6ead7eb2a166fd7bc02e2e80b8cf7e4bc", + sha256 = "5bbeddd127b0324c205a75ff6586e936c405c3757eb5811d2ec5f39bd69e810c", + git_commit = "b78cce682053438c96d882ecaa9328e8baf5ef62", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ddf6b3198d5b4c30fe87f681400af812c7dba9ce Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Feb 2019 15:02:30 -0800 Subject: [PATCH 2687/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235076732 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6abf977c8da..71b2b4a0c3f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5bbeddd127b0324c205a75ff6586e936c405c3757eb5811d2ec5f39bd69e810c", - git_commit = "b78cce682053438c96d882ecaa9328e8baf5ef62", + sha256 = "acfb147ad1febb497fb22187105d581c3c54685d4ef19a9b317b299b0c1300cf", + git_commit = "e27d4fdcfc04bbd70fa990957acbc7fd387eee3f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b1b049362404a8aa2b699e0dcda2d9f932fbd15f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Feb 2019 16:02:58 -0800 Subject: [PATCH 2688/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235088670 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 71b2b4a0c3f..c5ba5704736 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "acfb147ad1febb497fb22187105d581c3c54685d4ef19a9b317b299b0c1300cf", - git_commit = "e27d4fdcfc04bbd70fa990957acbc7fd387eee3f", + sha256 = "83474f8db0b8dd502d7bc6770b2de45294937310cf0a3575df660b002e0f18e3", + git_commit = "4dc63f8012b776e9d0e4d9cc20813bb95ce8b64d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1941146c13b70dda540a28d9812e89464cb9a557 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Feb 2019 17:01:59 -0800 Subject: [PATCH 2689/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235098952 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c5ba5704736..752954afdcc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "83474f8db0b8dd502d7bc6770b2de45294937310cf0a3575df660b002e0f18e3", - git_commit = "4dc63f8012b776e9d0e4d9cc20813bb95ce8b64d", + sha256 = "e0e9ff67a10cacb98e0cd19e9b618fec0a95be1e186bac644c274a9ec3d03ed4", + git_commit = "b32297eaa1976ed74e52c3eea698dcf1c8ff4392", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8cc244accb6ae2721414772a917a70d8cab5e137 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Feb 2019 18:02:06 -0800 Subject: [PATCH 2690/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235108094 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 752954afdcc..fbccd5eac9c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e0e9ff67a10cacb98e0cd19e9b618fec0a95be1e186bac644c274a9ec3d03ed4", - git_commit = "b32297eaa1976ed74e52c3eea698dcf1c8ff4392", + sha256 = "e3dd3ca8135c5c61490b00657c5f698dfd4c3147472c22c78de29c9d2876fb27", + git_commit = "253f0b905111412911d8b4c579fb4bbd99ec7f53", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 748dfbe6c71f9028cadc2f38844165d254450cb9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Feb 2019 19:02:10 -0800 Subject: [PATCH 2691/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235115234 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fbccd5eac9c..d65e51dd008 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e3dd3ca8135c5c61490b00657c5f698dfd4c3147472c22c78de29c9d2876fb27", - git_commit = "253f0b905111412911d8b4c579fb4bbd99ec7f53", + sha256 = "282f6623d2cc5f62251ad5290ec8c141809fc3fbe1df3cf7e687cba89227777c", + git_commit = "ad09e7584b824378782b1c7a2f67e6ccb1b83c18", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5308d714b249074b36ae34c56802c6c0c7937641 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Feb 2019 20:02:05 -0800 Subject: [PATCH 2692/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235121087 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d65e51dd008..6282546f4da 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "282f6623d2cc5f62251ad5290ec8c141809fc3fbe1df3cf7e687cba89227777c", - git_commit = "ad09e7584b824378782b1c7a2f67e6ccb1b83c18", + sha256 = "25e5ffb8d7386b6f7ea0bfdf46b03a599b7cc3d2a4caf4f86c6d94dd9e15678f", + git_commit = "1babcf8125f60b3ff05c6fd4c6fa73e33d9c510f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 704ce741af45f573e845eacb3b16cfe0041efb13 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Feb 2019 21:01:41 -0800 Subject: [PATCH 2693/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235126535 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6282546f4da..b8cfc3e1442 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "25e5ffb8d7386b6f7ea0bfdf46b03a599b7cc3d2a4caf4f86c6d94dd9e15678f", - git_commit = "1babcf8125f60b3ff05c6fd4c6fa73e33d9c510f", + sha256 = "584dff33e6b113ccf6ccd171e1bc865cc12518f0528e884d4c949cdfc7b389bd", + git_commit = "796ce572939922ccbacf5b7fcb39195904de0f95", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b8ac21c90c3b56418472e435ee71bc8a500864be Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Feb 2019 22:02:33 -0800 Subject: [PATCH 2694/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235132019 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b8cfc3e1442..c98ef8870b0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "584dff33e6b113ccf6ccd171e1bc865cc12518f0528e884d4c949cdfc7b389bd", - git_commit = "796ce572939922ccbacf5b7fcb39195904de0f95", + sha256 = "54a31cc1a8d186820c39f7fdb5602cbada072438d6f6693b73eeb6cd8d069816", + git_commit = "5295cfc0966aa497ac34bd3affa7af34ed3476e9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0a21715ff70d38204c0c3a68deb885a04c9d3cce Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Feb 2019 23:02:09 -0800 Subject: [PATCH 2695/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235136807 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c98ef8870b0..be5c3c7e9ac 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "54a31cc1a8d186820c39f7fdb5602cbada072438d6f6693b73eeb6cd8d069816", - git_commit = "5295cfc0966aa497ac34bd3affa7af34ed3476e9", + sha256 = "71d0a561b656dede338e6ec2bd3e346d1746e19d72554cfe7536aec0a9c6ecbb", + git_commit = "2b8badc120ce8f852fb5a4cc5d646e38c54b6b3c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2968dabfe615e1dcffe8d2ba0db35624e332b488 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Feb 2019 00:02:12 -0800 Subject: [PATCH 2696/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235142430 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index be5c3c7e9ac..187e1196b9d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "71d0a561b656dede338e6ec2bd3e346d1746e19d72554cfe7536aec0a9c6ecbb", - git_commit = "2b8badc120ce8f852fb5a4cc5d646e38c54b6b3c", + sha256 = "7fc8e688450549d6a060c5fac291be7ecff95cf42f3cc6f1ca6cb4ad8d96979a", + git_commit = "057117afa53fe48cc877d509b835d67c1d465b07", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e4eada775f169312d9871c8aef55166ff1cbadb1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Feb 2019 01:01:54 -0800 Subject: [PATCH 2697/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235149284 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 187e1196b9d..2b7ce155d99 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7fc8e688450549d6a060c5fac291be7ecff95cf42f3cc6f1ca6cb4ad8d96979a", - git_commit = "057117afa53fe48cc877d509b835d67c1d465b07", + sha256 = "f5510b1c67340cdcc47de1ae20ff57f72a4d6537314fb1f356f2220f9c93bcb8", + git_commit = "4bf9ea4295a0eff68ab737ab41399ab8bb3464ef", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 65cce288d9da8e419648bfa8291c98540a8ea956 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Feb 2019 02:02:02 -0800 Subject: [PATCH 2698/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235156337 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2b7ce155d99..19f0f0cd9aa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f5510b1c67340cdcc47de1ae20ff57f72a4d6537314fb1f356f2220f9c93bcb8", - git_commit = "4bf9ea4295a0eff68ab737ab41399ab8bb3464ef", + sha256 = "21375dd3ea498037d74e7d092f5f791752aaa91e0700192d4b3c79c0ae658333", + git_commit = "8853e47acc6423d5274bc42e25001f97bba104fe", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 586873e4173c790b4daedb34d251fbab3f6d3159 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Feb 2019 03:01:55 -0800 Subject: [PATCH 2699/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235162329 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 19f0f0cd9aa..d28fba9b86f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "21375dd3ea498037d74e7d092f5f791752aaa91e0700192d4b3c79c0ae658333", - git_commit = "8853e47acc6423d5274bc42e25001f97bba104fe", + sha256 = "ba008bb7b820169eddf5df867ad5f3b67adacdb1a934c7b08a2e70a9aa409c82", + git_commit = "c4cec011deb2da0bc1fb60eef72ddd5e4083cf3f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 38bda17a6b7229f9b3f6e6a936ed9f45e41ca51f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Feb 2019 04:02:03 -0800 Subject: [PATCH 2700/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235167719 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d28fba9b86f..17363d4b3d8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ba008bb7b820169eddf5df867ad5f3b67adacdb1a934c7b08a2e70a9aa409c82", - git_commit = "c4cec011deb2da0bc1fb60eef72ddd5e4083cf3f", + sha256 = "b5681bb6f1a54460c9aa77be9dd4733f367be09f8d09b32246faf49b04e24e56", + git_commit = "9d508106b32eb6518912501d29a80ff9967dfe05", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5b6cd05db0b169d36a53f1bdfb5e3ef16d4c3c2b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Feb 2019 09:02:16 -0800 Subject: [PATCH 2701/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235200468 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 17363d4b3d8..1f3257c6dfc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b5681bb6f1a54460c9aa77be9dd4733f367be09f8d09b32246faf49b04e24e56", - git_commit = "9d508106b32eb6518912501d29a80ff9967dfe05", + sha256 = "7a83e65df2bb9951bf765bedcc77a7e1e0f4dd08e854ce9e0eb2eb2e0c0e756b", + git_commit = "a2bb5db1bf7931b0dc2cd08e53b8798489568198", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7d33d26474881107ddd2b535b1d4e06fe6608c02 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Feb 2019 10:02:06 -0800 Subject: [PATCH 2702/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235209883 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1f3257c6dfc..a71f3eefecd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7a83e65df2bb9951bf765bedcc77a7e1e0f4dd08e854ce9e0eb2eb2e0c0e756b", - git_commit = "a2bb5db1bf7931b0dc2cd08e53b8798489568198", + sha256 = "46db1042a13d65d4f11764f53b84da8e4db20d980eccddc40966194d51ac3f72", + git_commit = "6f2eaa3b99c241a9c09c345e1029513bc4cd470a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2caf781458da7fe798af2f60e9634332e073959e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Feb 2019 11:02:06 -0800 Subject: [PATCH 2703/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235221503 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a71f3eefecd..c266ba07973 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "46db1042a13d65d4f11764f53b84da8e4db20d980eccddc40966194d51ac3f72", - git_commit = "6f2eaa3b99c241a9c09c345e1029513bc4cd470a", + sha256 = "0fcca7640ea659c7acbef7def4fb3620d1eebaa7189c57311fe61fa81f9e180a", + git_commit = "e17c55f2de83ee32e8fc372a1133ebb03a0637b3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1f80bf34b96db62084ecf1669a9284988c25efc9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Feb 2019 12:02:15 -0800 Subject: [PATCH 2704/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235233162 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c266ba07973..2d3af831970 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0fcca7640ea659c7acbef7def4fb3620d1eebaa7189c57311fe61fa81f9e180a", - git_commit = "e17c55f2de83ee32e8fc372a1133ebb03a0637b3", + sha256 = "a70a21ee53d05779c0ba59b96a7cbba2a89ef9a55a8b9fa5060a75559ba6921e", + git_commit = "74347cdb0454702ff95c337c7bedcb9a61f3fb97", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8fce7e5bba27a11715f9420e2b34506628519dbf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Feb 2019 13:01:47 -0800 Subject: [PATCH 2705/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235243405 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2d3af831970..b6dcb76d0b9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a70a21ee53d05779c0ba59b96a7cbba2a89ef9a55a8b9fa5060a75559ba6921e", - git_commit = "74347cdb0454702ff95c337c7bedcb9a61f3fb97", + sha256 = "38763d59e111a7f576dd741d0c0c3de1350d29c2052aa63f471ecbc582e6d0ed", + git_commit = "a0c1fec6449109f357ef57e2933626a4e9bf6348", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5903ef6907dd41f7300f09f5b355e12c3a92860a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Feb 2019 14:01:44 -0800 Subject: [PATCH 2706/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235254095 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b6dcb76d0b9..f999d99b5bb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "38763d59e111a7f576dd741d0c0c3de1350d29c2052aa63f471ecbc582e6d0ed", - git_commit = "a0c1fec6449109f357ef57e2933626a4e9bf6348", + sha256 = "a3c055686026f42b4089bd9dfb3dfbd42052fd9ab52be4ad1cb4808d8fb264ca", + git_commit = "eb741cedf304b411af6cae8ec2d60578cd3980a1", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2acc8db71e789e9c4cd84b9c7cff08d1e649b6c6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Feb 2019 15:01:49 -0800 Subject: [PATCH 2707/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235265412 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f999d99b5bb..c55d0735d83 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a3c055686026f42b4089bd9dfb3dfbd42052fd9ab52be4ad1cb4808d8fb264ca", - git_commit = "eb741cedf304b411af6cae8ec2d60578cd3980a1", + sha256 = "b01cfc07f53e5f1718b0ceca46f6169477e0793ce596d4fb1444fc62c8089dc5", + git_commit = "e42a66b26372845ea41aea6c12bc3e4f09f1efc5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6e4d7ecd7f9f6afe900de04cfcac4085e4759155 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Feb 2019 16:02:18 -0800 Subject: [PATCH 2708/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235275796 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c55d0735d83..2c235d96cf6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b01cfc07f53e5f1718b0ceca46f6169477e0793ce596d4fb1444fc62c8089dc5", - git_commit = "e42a66b26372845ea41aea6c12bc3e4f09f1efc5", + sha256 = "dd0e366bc7e09c305280094d9645d3360cfc1d3931f55feaee6d641fa8817ca3", + git_commit = "e937cf22ddcbc1dd6bdc410ce2c9f9b5493fb69b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From fc262f6a989d5b20b3e6d4d4e83551a0f08f6564 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Feb 2019 17:02:09 -0800 Subject: [PATCH 2709/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235285185 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2c235d96cf6..cf8d361ce94 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dd0e366bc7e09c305280094d9645d3360cfc1d3931f55feaee6d641fa8817ca3", - git_commit = "e937cf22ddcbc1dd6bdc410ce2c9f9b5493fb69b", + sha256 = "17f2b25caebbeb39c93dd5ffc67161f37a0491993b21bdad6dcc4ed1144c8af5", + git_commit = "61368b23ac560d158a27e679ac570a9b7ae94e0a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 86ceb4df91f5c96cfca53088b47ab42163faa4aa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Feb 2019 18:01:47 -0800 Subject: [PATCH 2710/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235292673 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cf8d361ce94..160df703591 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "17f2b25caebbeb39c93dd5ffc67161f37a0491993b21bdad6dcc4ed1144c8af5", - git_commit = "61368b23ac560d158a27e679ac570a9b7ae94e0a", + sha256 = "13db9c3dac04caec0c1996f379f36f136a14cf4849f12dcffec8b4db3e943057", + git_commit = "dfb34a1a69d3024ee808e0c2cf01cb2110811e86", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d37451312000772e457113ddd539d94b8c38dc46 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Feb 2019 19:02:20 -0800 Subject: [PATCH 2711/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235298126 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 160df703591..9125a2c0d65 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "13db9c3dac04caec0c1996f379f36f136a14cf4849f12dcffec8b4db3e943057", - git_commit = "dfb34a1a69d3024ee808e0c2cf01cb2110811e86", + sha256 = "bed8ccdf5afe17fe4990bda310f61af6a7da694b6922f4f33bffc803cd0eb887", + git_commit = "f45257b640ac784fc9252ac2bd4814aaa977a539", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 28588c52a571a7c4386660598c232e03bc39ccc7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Feb 2019 20:01:49 -0800 Subject: [PATCH 2712/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235302208 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9125a2c0d65..3365fa89897 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bed8ccdf5afe17fe4990bda310f61af6a7da694b6922f4f33bffc803cd0eb887", - git_commit = "f45257b640ac784fc9252ac2bd4814aaa977a539", + sha256 = "4d3ddf8a5746b2dce0c25570932790297cbd9f33026a567464ca0037b66f937a", + git_commit = "16d954d8c4dc6cca905306bcfa323793afab7a0b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 344ad9ea27ec65d45cbf8698caac4776b2c6705a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Feb 2019 22:02:07 -0800 Subject: [PATCH 2713/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235309351 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3365fa89897..9713bc3ab0a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4d3ddf8a5746b2dce0c25570932790297cbd9f33026a567464ca0037b66f937a", - git_commit = "16d954d8c4dc6cca905306bcfa323793afab7a0b", + sha256 = "7602b89e921261fc860f7c6c795a13acf488f4011d1b8cfb25269f8ae4aee937", + git_commit = "d0494a8920186a759cb1135c3d4c7bd59989ed3f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b0700471093973883b0c40cafe3f045f9ad62b0d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 23 Feb 2019 00:02:03 -0800 Subject: [PATCH 2714/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235316288 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9713bc3ab0a..20522b2886f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7602b89e921261fc860f7c6c795a13acf488f4011d1b8cfb25269f8ae4aee937", - git_commit = "d0494a8920186a759cb1135c3d4c7bd59989ed3f", + sha256 = "bbb3f7e80e5f21f0fc77683eec06fcf6bd7ce05991082f6365e844bbdcbe5cd3", + git_commit = "2ae06ca49145bfee2e5e98c64ae5cbe064a58a33", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f42265fcff4b780a49150580c1a4a49fe0a95d71 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 23 Feb 2019 02:02:01 -0800 Subject: [PATCH 2715/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235324079 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 20522b2886f..36e2a5a2a30 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bbb3f7e80e5f21f0fc77683eec06fcf6bd7ce05991082f6365e844bbdcbe5cd3", - git_commit = "2ae06ca49145bfee2e5e98c64ae5cbe064a58a33", + sha256 = "9012fe4035e431aa3e0c8ad639e1e4039500cd21bee69f58f348c2fe51f4215d", + git_commit = "13910e7b426defd0dfc9435ff818f2bfea67d6a7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e06b762650e65813d0d3c6075510363a0177529a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 23 Feb 2019 03:01:54 -0800 Subject: [PATCH 2716/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235327192 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 36e2a5a2a30..c9fb6cf9f67 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9012fe4035e431aa3e0c8ad639e1e4039500cd21bee69f58f348c2fe51f4215d", - git_commit = "13910e7b426defd0dfc9435ff818f2bfea67d6a7", + sha256 = "e4c3fb9164de9f3a0a06a15dff1488e777cc056804cb7f84632bfb16d6b0940d", + git_commit = "7ef266852ddb8ffe3e7d5dd5747c6f58f0e02008", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f13192c5f1fabc6788dd8e6719373ecaa126c9bc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 23 Feb 2019 09:01:41 -0800 Subject: [PATCH 2717/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235345259 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c9fb6cf9f67..e60876eb6ce 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e4c3fb9164de9f3a0a06a15dff1488e777cc056804cb7f84632bfb16d6b0940d", - git_commit = "7ef266852ddb8ffe3e7d5dd5747c6f58f0e02008", + sha256 = "c7d250c24aab1a450b16ffb5bab4339673f05ff77b90b7994ab16a0e0f56247c", + git_commit = "14523a55c81b5f92e6f732edca18cdb85fda2b0c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 56926c6bba2c8b5fd5606299e385bc64f7bfc282 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 23 Feb 2019 19:01:51 -0800 Subject: [PATCH 2718/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235376281 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e60876eb6ce..2c6d4625e25 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c7d250c24aab1a450b16ffb5bab4339673f05ff77b90b7994ab16a0e0f56247c", - git_commit = "14523a55c81b5f92e6f732edca18cdb85fda2b0c", + sha256 = "83f48e2a63ce37adae1f2ddc92fb0402ec06b2b4de1a9acfe292faa4e5a56491", + git_commit = "6aa83398ab03bfae822f36772757097bcb98b6ed", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 02f6b97cfd627cafcdccffe3f2ff0aaedb546927 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 24 Feb 2019 03:02:09 -0800 Subject: [PATCH 2719/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235402236 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2c6d4625e25..5af28721333 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "83f48e2a63ce37adae1f2ddc92fb0402ec06b2b4de1a9acfe292faa4e5a56491", - git_commit = "6aa83398ab03bfae822f36772757097bcb98b6ed", + sha256 = "45f449055e2dc109ccb6ddc82f77a5a03596fa86e34d205bc2d26817aa429f5a", + git_commit = "781fb01584a92bf82a9335061c723f02bfbc445c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8282f40964f11de524f8804f0483a0fe7c674c2b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 24 Feb 2019 07:01:52 -0800 Subject: [PATCH 2720/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235414406 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5af28721333..139fd470c03 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "45f449055e2dc109ccb6ddc82f77a5a03596fa86e34d205bc2d26817aa429f5a", - git_commit = "781fb01584a92bf82a9335061c723f02bfbc445c", + sha256 = "023b53eef1b9dba812855d42a5a02b54991fbb4f321c08eddbed79a99acb6d5f", + git_commit = "1ad34b4f2432dc71a03d5d71fda60d944f14b3fa", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f39deed4ff006637c3add40c4f9225303b91db23 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 24 Feb 2019 08:02:00 -0800 Subject: [PATCH 2721/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235417238 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 139fd470c03..93bf2a1a52c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "023b53eef1b9dba812855d42a5a02b54991fbb4f321c08eddbed79a99acb6d5f", - git_commit = "1ad34b4f2432dc71a03d5d71fda60d944f14b3fa", + sha256 = "69bcb20f9ff14a5f462bb8d2318bbaa76577a883a45e3d3810b48435a5008631", + git_commit = "1721fa8be7d7751e1d18cc6ea5508464fc51c890", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b751496dd597e26d6e96b69b12a74a456dbb8462 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 24 Feb 2019 10:02:00 -0800 Subject: [PATCH 2722/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235423342 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 93bf2a1a52c..68ad0b7819d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "69bcb20f9ff14a5f462bb8d2318bbaa76577a883a45e3d3810b48435a5008631", - git_commit = "1721fa8be7d7751e1d18cc6ea5508464fc51c890", + sha256 = "03f050498ea8618b02d5e088b74cb04a2a81bf4d6a3d32aa0fcc4b832cf3ed19", + git_commit = "3c2033678feb046caede91832045ac8bacb2f95a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 20b38186180f63eb49f2bd47bea19548af2123ea Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 24 Feb 2019 16:02:19 -0800 Subject: [PATCH 2723/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235442727 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 68ad0b7819d..ae0b81faaa2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "03f050498ea8618b02d5e088b74cb04a2a81bf4d6a3d32aa0fcc4b832cf3ed19", - git_commit = "3c2033678feb046caede91832045ac8bacb2f95a", + sha256 = "b5fa0a039a4bfa1134ca8d2e523ef2d945c0b00ec2e9bb8d40f468a1875e1c4d", + git_commit = "9ca8321d68b74ce4f30756366919c80282ca2b68", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From cf2764b42b596209591a855373e20ef3f8b22ba6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 24 Feb 2019 17:01:38 -0800 Subject: [PATCH 2724/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235446173 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ae0b81faaa2..0e54b730efc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b5fa0a039a4bfa1134ca8d2e523ef2d945c0b00ec2e9bb8d40f468a1875e1c4d", - git_commit = "9ca8321d68b74ce4f30756366919c80282ca2b68", + sha256 = "96ef8a03a602e1f8b2cf4b1bc89974cfc2754235d545691547651b9b437bdcc9", + git_commit = "9f9efff916ed427b24216a739465842a09a8e136", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 31bd3a9781a0b239c255edb5ab393c5e52b2f1b1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Feb 2019 02:01:58 -0800 Subject: [PATCH 2725/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235491921 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0e54b730efc..58a2f11aaa4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "96ef8a03a602e1f8b2cf4b1bc89974cfc2754235d545691547651b9b437bdcc9", - git_commit = "9f9efff916ed427b24216a739465842a09a8e136", + sha256 = "18c8ccf5622efa8c5867f13d31ee8ac2e02cfaec34a15459eb331964e22ed7d2", + git_commit = "af82e5f08705612386c19a1c700fb379c976f477", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ae75c7e4d1a9d73a1a42594285ffb4f8c7cdc1e2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Feb 2019 03:02:01 -0800 Subject: [PATCH 2726/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235498201 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 58a2f11aaa4..69440cd0a00 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "18c8ccf5622efa8c5867f13d31ee8ac2e02cfaec34a15459eb331964e22ed7d2", - git_commit = "af82e5f08705612386c19a1c700fb379c976f477", + sha256 = "c7d2f5d5b75ebaa0d2bd82800a90f17b881ffbdf94eb1a210b36cc2eb50e21df", + git_commit = "ad675e014848c2262c1532d9cb7000a216911a45", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f4700c2eef17c18166ebf49786ec2571c55f3ebb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Feb 2019 04:02:08 -0800 Subject: [PATCH 2727/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235504385 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 69440cd0a00..f5c7bc6494e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c7d2f5d5b75ebaa0d2bd82800a90f17b881ffbdf94eb1a210b36cc2eb50e21df", - git_commit = "ad675e014848c2262c1532d9cb7000a216911a45", + sha256 = "35b6948f9bf9547f3d9a783891fd1ee85f65d00b82acceb00c4d7263b3d08072", + git_commit = "64e7e114ef1757fad52eaeedb3f22216165587ab", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a6d954267daa9e1a59861fe79c1d62a6c67a007b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Feb 2019 05:02:08 -0800 Subject: [PATCH 2728/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235509999 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f5c7bc6494e..2b1cb0e4078 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "35b6948f9bf9547f3d9a783891fd1ee85f65d00b82acceb00c4d7263b3d08072", - git_commit = "64e7e114ef1757fad52eaeedb3f22216165587ab", + sha256 = "ce836c3f29faee5309585f5d4df6f928382aadf3280dc10e7e72498930bbf754", + git_commit = "0da7f0fd4a063cec61323f0974056c67be5f4bcb", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 15393ef5a31c674d500f88ddbb7256dd53d1cfb5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Feb 2019 06:02:07 -0800 Subject: [PATCH 2729/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235515848 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2b1cb0e4078..4c03e03868c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ce836c3f29faee5309585f5d4df6f928382aadf3280dc10e7e72498930bbf754", - git_commit = "0da7f0fd4a063cec61323f0974056c67be5f4bcb", + sha256 = "eecde9c543621a2fa7b5c4ba391263203971ad02f839a17e9bfe70e10751d7a4", + git_commit = "8a653bd99c69602675fc9926f201985e65c980be", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 20ed77a7a560f6306243e29f5a69a032a240e315 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Feb 2019 07:02:37 -0800 Subject: [PATCH 2730/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235522766 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4c03e03868c..8799b515272 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eecde9c543621a2fa7b5c4ba391263203971ad02f839a17e9bfe70e10751d7a4", - git_commit = "8a653bd99c69602675fc9926f201985e65c980be", + sha256 = "0530fc22c530221aecd6d2af1242e1b5da084ba21b072c6d1c5720267127f978", + git_commit = "2e1ea48763cac7b0db0a4b781195617e62d832e7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9efd5eb4b9f3633b9031c7de104a18c931a85bfc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Feb 2019 08:02:09 -0800 Subject: [PATCH 2731/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235530307 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8799b515272..ca0cc33b0ae 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0530fc22c530221aecd6d2af1242e1b5da084ba21b072c6d1c5720267127f978", - git_commit = "2e1ea48763cac7b0db0a4b781195617e62d832e7", + sha256 = "53dbf2ab05026fe33db80c0893156e07c4d47e3cd78eac94d443e1ce9c57cf1f", + git_commit = "6fac047274daad84d93fea937de612f43e7d212e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7fc2405c5f62bc58f865ca89b1e463e4d841d0aa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Feb 2019 09:01:58 -0800 Subject: [PATCH 2732/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235539038 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ca0cc33b0ae..e29e8dfda8a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "53dbf2ab05026fe33db80c0893156e07c4d47e3cd78eac94d443e1ce9c57cf1f", - git_commit = "6fac047274daad84d93fea937de612f43e7d212e", + sha256 = "37b23f117f6f96d39b6d141e286f11395da681ac6f1683a8af83297e2120b312", + git_commit = "ebcc4f6887df1ad1a2ffdb2dc2da1f541e24e2af", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From fd9a0defcd5fc84edeea4c85470ef5547e984ad6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Feb 2019 10:01:53 -0800 Subject: [PATCH 2733/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235549861 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e29e8dfda8a..e5602b79004 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "37b23f117f6f96d39b6d141e286f11395da681ac6f1683a8af83297e2120b312", - git_commit = "ebcc4f6887df1ad1a2ffdb2dc2da1f541e24e2af", + sha256 = "1a92098ee01ab3b63c19b6150d416e7b651cf8ad79bc75d0fca1f614f1157947", + git_commit = "e866995aff7d0e59a5506665e44e323465cbe17d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9560ba91710411990a09da3813c128e8fcd3cfbc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Feb 2019 11:01:53 -0800 Subject: [PATCH 2734/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235562242 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e5602b79004..101473f1a7c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1a92098ee01ab3b63c19b6150d416e7b651cf8ad79bc75d0fca1f614f1157947", - git_commit = "e866995aff7d0e59a5506665e44e323465cbe17d", + sha256 = "04071e79967cbb1b35e383e3383d48c8b030e08d7ff70845e110f25e0889d10a", + git_commit = "5ce288b17c226ef35470e213e22cad69176bd65c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a36280146e62f19254da059c9d4396b0f7e4c833 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Feb 2019 12:02:11 -0800 Subject: [PATCH 2735/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235575311 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 101473f1a7c..21670866575 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "04071e79967cbb1b35e383e3383d48c8b030e08d7ff70845e110f25e0889d10a", - git_commit = "5ce288b17c226ef35470e213e22cad69176bd65c", + sha256 = "f6ff379bd4cb4a65acb6e95ed1949b19fe44c327eb41b7843f8b46bdac2913a1", + git_commit = "b6ed9186089de852c933244a7d772f836cc3eb27", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0d1635c1f45c5764d4b6f475905549442ab1a286 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Feb 2019 13:02:54 -0800 Subject: [PATCH 2736/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235587715 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 21670866575..87632e0b2b6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f6ff379bd4cb4a65acb6e95ed1949b19fe44c327eb41b7843f8b46bdac2913a1", - git_commit = "b6ed9186089de852c933244a7d772f836cc3eb27", + sha256 = "4ecf0663cff59f0b1e0de96bdef607bbe89afc1c4e01840398492a898471b828", + git_commit = "2b6f49620bc5f02a288d522d634cfe94f4e824f6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d7eb48c7e8b2ffa34f10ba4e1d084c49f709b70f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Feb 2019 14:01:51 -0800 Subject: [PATCH 2737/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235598180 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 87632e0b2b6..0facc08eb94 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4ecf0663cff59f0b1e0de96bdef607bbe89afc1c4e01840398492a898471b828", - git_commit = "2b6f49620bc5f02a288d522d634cfe94f4e824f6", + sha256 = "e236860f38edc54d893bb9a4160a6f2a5e156af826f1ceb85af75e5335e28923", + git_commit = "4d6f8114b0c917046d47ad6faf8a0b79d00197e0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4730a2d1304467eed17caf4c7e391cd0b4911c31 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Feb 2019 15:01:56 -0800 Subject: [PATCH 2738/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235609239 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0facc08eb94..42292dc9e66 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e236860f38edc54d893bb9a4160a6f2a5e156af826f1ceb85af75e5335e28923", - git_commit = "4d6f8114b0c917046d47ad6faf8a0b79d00197e0", + sha256 = "4ab83e291165df2baffa4539b3c7b5a7d745e68141605c73021751790c747657", + git_commit = "d75b5505ac5e393d08aef7bf07e6ccecbd6773a9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0e53c7ee14c4f990db6ba4ebd60d12304b07ee35 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Feb 2019 16:02:16 -0800 Subject: [PATCH 2739/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235619513 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 42292dc9e66..81bcd03fc0c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4ab83e291165df2baffa4539b3c7b5a7d745e68141605c73021751790c747657", - git_commit = "d75b5505ac5e393d08aef7bf07e6ccecbd6773a9", + sha256 = "08aabedf277da3cb3e27d33463c78c4fe65c4684d440e6f6860dc88d62ee5659", + git_commit = "99f369b1e4bb43ff4e9f37665c76305843e21a07", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 31973855ef9517e2cbb5a68cedf7b549fb031301 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Feb 2019 17:01:45 -0800 Subject: [PATCH 2740/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235628955 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 81bcd03fc0c..7502bcec5a6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "08aabedf277da3cb3e27d33463c78c4fe65c4684d440e6f6860dc88d62ee5659", - git_commit = "99f369b1e4bb43ff4e9f37665c76305843e21a07", + sha256 = "0502fc935e49bfd8312c669351d97a32eb6085107eccdcb629d6e230520cdc1e", + git_commit = "831addfea46847836fa47e76055ec4ed4cd880ff", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3d110b9be51ecebff61020aac024b288d0c3f3ec Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Feb 2019 18:02:12 -0800 Subject: [PATCH 2741/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235637196 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7502bcec5a6..9a0339518b7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0502fc935e49bfd8312c669351d97a32eb6085107eccdcb629d6e230520cdc1e", - git_commit = "831addfea46847836fa47e76055ec4ed4cd880ff", + sha256 = "e029ff510d21acc1f9fc38345ea1d00abe14cb57da24277a21300360d331f3de", + git_commit = "18b649e159b4a03103797fd541bfe8028b31cc18", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From faa5fda4515f50cc2a022acb83f4967daa673584 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Feb 2019 19:01:50 -0800 Subject: [PATCH 2742/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235643710 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9a0339518b7..0a964ad6ecc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e029ff510d21acc1f9fc38345ea1d00abe14cb57da24277a21300360d331f3de", - git_commit = "18b649e159b4a03103797fd541bfe8028b31cc18", + sha256 = "6a1d368f91bb9137e987d927dab346bd815f39cb1d9cb3ec81617ae8ac1fa309", + git_commit = "6f2cb0ae006dc1d02c7898a68f8fdd9e22f1af58", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2bdfc5c923be293187607349b1a23262d5acfd1e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Feb 2019 20:02:04 -0800 Subject: [PATCH 2743/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235649272 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0a964ad6ecc..0ea481f4f9d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6a1d368f91bb9137e987d927dab346bd815f39cb1d9cb3ec81617ae8ac1fa309", - git_commit = "6f2cb0ae006dc1d02c7898a68f8fdd9e22f1af58", + sha256 = "b7c9ee391bd1a3e7a2214b2cea044326a4c2f6cb093a07014e6f550806dc619d", + git_commit = "5bce34fe7de3b39092d54b315aa31592e3cbaff0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3648f7da01db3826e426f5058a57d8789f09cc02 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Feb 2019 21:01:42 -0800 Subject: [PATCH 2744/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235654502 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0ea481f4f9d..bcc62034167 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b7c9ee391bd1a3e7a2214b2cea044326a4c2f6cb093a07014e6f550806dc619d", - git_commit = "5bce34fe7de3b39092d54b315aa31592e3cbaff0", + sha256 = "48ebda31f1d01dfba76887c8fff3da97a8a1b6468a2cd3971aeb7b451f1ee932", + git_commit = "60089e430e34c870e074c6d5746ed88ea9b39909", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5dd408a10c4c0c087a8f96ab9bc5bb8b7cf6d9b2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Feb 2019 23:01:47 -0800 Subject: [PATCH 2745/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235664395 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bcc62034167..be76efe809e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "48ebda31f1d01dfba76887c8fff3da97a8a1b6468a2cd3971aeb7b451f1ee932", - git_commit = "60089e430e34c870e074c6d5746ed88ea9b39909", + sha256 = "54c6de63fce75edb9e87fc152892f0c8b7a438f66401a416f7af6144db4f3039", + git_commit = "f4d29bb3635d2a7a9bb1f557d486de7fdaa3b101", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 26888452a8326b03d913f9bd77ae0f3435437d3b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Feb 2019 00:02:12 -0800 Subject: [PATCH 2746/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235669124 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index be76efe809e..12b35c1b077 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "54c6de63fce75edb9e87fc152892f0c8b7a438f66401a416f7af6144db4f3039", - git_commit = "f4d29bb3635d2a7a9bb1f557d486de7fdaa3b101", + sha256 = "b06e8a4887fddc09096fe3a95da0dcf4eeeffb4b3a16f07fc41d68ae235a9087", + git_commit = "0ae3728b74462fc2548cc9ebc330708c775fb387", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7ef8a81521fc4105ffb72effc2f78a66a6554ec5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Feb 2019 01:01:53 -0800 Subject: [PATCH 2747/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235675401 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 12b35c1b077..60b7160c853 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b06e8a4887fddc09096fe3a95da0dcf4eeeffb4b3a16f07fc41d68ae235a9087", - git_commit = "0ae3728b74462fc2548cc9ebc330708c775fb387", + sha256 = "ba253da211d3d22255ca6afa204eedd8348cae4a1e3a726684eb76e18de90df6", + git_commit = "00afc7bb81d6d36a0f619c08c011abe08965a25b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f3912a53e96b93a0dc87f5f4d405d0df400710fe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Feb 2019 02:02:09 -0800 Subject: [PATCH 2748/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235682683 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 60b7160c853..4401b50f093 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ba253da211d3d22255ca6afa204eedd8348cae4a1e3a726684eb76e18de90df6", - git_commit = "00afc7bb81d6d36a0f619c08c011abe08965a25b", + sha256 = "86a778bc76dcd2ca68db1a7f02c58a753e0b2e0e3c2002a1cef93e6b2f247f94", + git_commit = "e5afc00873bc58ed7cd7a7a7b36dc32eb8090e37", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2d29e29060e0757ceaeeffd54e9355d7a76bb678 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Feb 2019 03:02:02 -0800 Subject: [PATCH 2749/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235689370 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4401b50f093..b10014d24a2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "86a778bc76dcd2ca68db1a7f02c58a753e0b2e0e3c2002a1cef93e6b2f247f94", - git_commit = "e5afc00873bc58ed7cd7a7a7b36dc32eb8090e37", + sha256 = "6b216085ac74dd98180a00ba621a7b8c37d37defbed4c6ad182f4d2373d2bbff", + git_commit = "441245330a99ecd232cf71ecbacd0b3da0d91f7e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8b9cbb4f66398716cd7ce8f494c046253b0e45c5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Feb 2019 04:01:58 -0800 Subject: [PATCH 2750/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235695275 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b10014d24a2..e2f58799509 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6b216085ac74dd98180a00ba621a7b8c37d37defbed4c6ad182f4d2373d2bbff", - git_commit = "441245330a99ecd232cf71ecbacd0b3da0d91f7e", + sha256 = "cf58d7486d738fa810ca2cfcb6e5f06d69ea86bf6265dd91a566a53985e3b410", + git_commit = "193b391512c78776fbbc808c21371d7a92acce4b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3863d3e3c3edc1210d27125e4bf71803f3b65bbd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Feb 2019 07:02:02 -0800 Subject: [PATCH 2751/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235714558 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e2f58799509..ec372dcfb22 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cf58d7486d738fa810ca2cfcb6e5f06d69ea86bf6265dd91a566a53985e3b410", - git_commit = "193b391512c78776fbbc808c21371d7a92acce4b", + sha256 = "260130ae1f140e754636ac4c4e5299e7e9d5398d246c5dd28fd6fd60428b537c", + git_commit = "2de01b1a7334522314b410d53aeeb0262057369a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3caf4291889237cd75e0e00c56dd0ba00c000d4f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Feb 2019 08:02:06 -0800 Subject: [PATCH 2752/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235722248 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ec372dcfb22..8f6ea1a4b1a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "260130ae1f140e754636ac4c4e5299e7e9d5398d246c5dd28fd6fd60428b537c", - git_commit = "2de01b1a7334522314b410d53aeeb0262057369a", + sha256 = "1ff428b1752c273f1944686cd73f329ab3ab369b1f9ab62fd74b933e101a68e9", + git_commit = "4ede94e8a3c817ecb80f41eafd73c0058e58c6d7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 30f0959c3d800f60291c1967883b895593d83386 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Feb 2019 09:01:49 -0800 Subject: [PATCH 2753/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235730952 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8f6ea1a4b1a..f95b0f5cb36 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1ff428b1752c273f1944686cd73f329ab3ab369b1f9ab62fd74b933e101a68e9", - git_commit = "4ede94e8a3c817ecb80f41eafd73c0058e58c6d7", + sha256 = "d33e5176bc2b7194c9655d8b7ddca271fd26e1f27b20750fb3e7fd720b68e884", + git_commit = "458e0e300bbb8e9c9824a960fef13877983369f4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2271eec3078ce4a93dcdf96cb65df248f2c27d00 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Feb 2019 10:01:59 -0800 Subject: [PATCH 2754/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235741139 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f95b0f5cb36..99f36422729 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d33e5176bc2b7194c9655d8b7ddca271fd26e1f27b20750fb3e7fd720b68e884", - git_commit = "458e0e300bbb8e9c9824a960fef13877983369f4", + sha256 = "69307a2268348e4fd624fa3af3b5764b737e5b44cef3bb1699862616fbeb161c", + git_commit = "c5739a813578636a75de131956510ed222e47ce6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c1c411e6d2bad83482dc3a74f04d2f2d4fdf98eb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Feb 2019 11:04:23 -0800 Subject: [PATCH 2755/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235754237 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 99f36422729..5c7fd18d29e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "69307a2268348e4fd624fa3af3b5764b737e5b44cef3bb1699862616fbeb161c", - git_commit = "c5739a813578636a75de131956510ed222e47ce6", + sha256 = "17ed8f92babc6571a57e7be6bde9aab489fdbe48fd51da46d1e332f37f7c5bf9", + git_commit = "b62f98547c3f9c15749f8a58101fd3edc3dd1168", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6e95b84826f8f176f11d59a070ef4d82f0538e29 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Feb 2019 12:02:08 -0800 Subject: [PATCH 2756/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235765714 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5c7fd18d29e..3fdde3641ea 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "17ed8f92babc6571a57e7be6bde9aab489fdbe48fd51da46d1e332f37f7c5bf9", - git_commit = "b62f98547c3f9c15749f8a58101fd3edc3dd1168", + sha256 = "a0a839599379c001300cc738a1557b62842395adac739cbfc4b4458036bc37f8", + git_commit = "ba843434822a7de44d74f7620582f5240d23b26f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ed4e0c31b6ede5bcd8b7a240d18bd4f88ce02e62 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Feb 2019 13:02:17 -0800 Subject: [PATCH 2757/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235776497 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3fdde3641ea..d9f9827371f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a0a839599379c001300cc738a1557b62842395adac739cbfc4b4458036bc37f8", - git_commit = "ba843434822a7de44d74f7620582f5240d23b26f", + sha256 = "0be33c13ead7394f1f2fa9d0f61f79679aee678a911c1c3a86271eb45549e72d", + git_commit = "854a7b1dad4f4c3d3dd94780bf96e7eaf65876ec", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e19e3abdcbc0203beb45c27edbe98b9e8ba9ec22 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Feb 2019 14:01:45 -0800 Subject: [PATCH 2758/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235788025 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d9f9827371f..e73f666b812 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0be33c13ead7394f1f2fa9d0f61f79679aee678a911c1c3a86271eb45549e72d", - git_commit = "854a7b1dad4f4c3d3dd94780bf96e7eaf65876ec", + sha256 = "3bb089a4ac54e1befb75c45b44beae70f18a1997b29efb39ce37115f4ed4f87c", + git_commit = "3bf1ea84e9164e50507cf2d3351071d9848bc967", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 01bdf818facf32ef1807c0c01e99bf64ff42059d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Feb 2019 15:01:47 -0800 Subject: [PATCH 2759/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235800542 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e73f666b812..337793e4f1e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3bb089a4ac54e1befb75c45b44beae70f18a1997b29efb39ce37115f4ed4f87c", - git_commit = "3bf1ea84e9164e50507cf2d3351071d9848bc967", + sha256 = "b0edcc2bb1610ea093ade032c51228ff0c8a595ca0207c106c823ae8d707438c", + git_commit = "e5c53b63b098cf67a32f4102f97852683cdbee6c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5d363defece2398e33e6b4e1e825b735dc6bde89 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Feb 2019 16:02:33 -0800 Subject: [PATCH 2760/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235811848 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 337793e4f1e..e483709ef4a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b0edcc2bb1610ea093ade032c51228ff0c8a595ca0207c106c823ae8d707438c", - git_commit = "e5c53b63b098cf67a32f4102f97852683cdbee6c", + sha256 = "5f2d9d442bafc59da671ab828150ba9e086bcd2e2284b5cfa55d9a4c73b61f32", + git_commit = "a6953fb989c182035addf841b5250ae98a906f66", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7d10fa69c1025be27d1b8e6d3953d61b846b86ae Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Feb 2019 17:01:37 -0800 Subject: [PATCH 2761/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235821994 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e483709ef4a..98085565fe1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5f2d9d442bafc59da671ab828150ba9e086bcd2e2284b5cfa55d9a4c73b61f32", - git_commit = "a6953fb989c182035addf841b5250ae98a906f66", + sha256 = "fb5dcede4f50c3185d9d1b208703c1cc5e8be131883f6e18c7ae74dc944a014f", + git_commit = "76a22b340814425b6a8b6e0c0bb81bcd162c458b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4cf7b0553e888026d96033c1abea95c911d2b239 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Feb 2019 18:01:41 -0800 Subject: [PATCH 2762/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235830290 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 98085565fe1..8277c77de4a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fb5dcede4f50c3185d9d1b208703c1cc5e8be131883f6e18c7ae74dc944a014f", - git_commit = "76a22b340814425b6a8b6e0c0bb81bcd162c458b", + sha256 = "e63c4e753c647dc75d4fb0d1d7664f7f81c544c79f31040a09f810bb3d4ac1f0", + git_commit = "b2de021c0e294e20e1e02e356770a3d3e43247a9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3690cf5fc3f0e0e41f1f1525eef985138f2c547e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Feb 2019 19:01:48 -0800 Subject: [PATCH 2763/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235836988 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8277c77de4a..fee29a41069 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e63c4e753c647dc75d4fb0d1d7664f7f81c544c79f31040a09f810bb3d4ac1f0", - git_commit = "b2de021c0e294e20e1e02e356770a3d3e43247a9", + sha256 = "db2eccdd240fd6935b44f1a090fa997c2568cd17034b2349fac67cf0aa5eba0b", + git_commit = "91d3b3add93dc530abb91b2e6a8913f55aefe867", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c0b6c8418505182cfc8f0e96481a6195ca6a7d6a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Feb 2019 20:01:44 -0800 Subject: [PATCH 2764/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235842802 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fee29a41069..2b2986544d2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "db2eccdd240fd6935b44f1a090fa997c2568cd17034b2349fac67cf0aa5eba0b", - git_commit = "91d3b3add93dc530abb91b2e6a8913f55aefe867", + sha256 = "bc7bfafdc228514a3fbf90c27c34a2d277961ee9a90b4c05522de90fd1aecc50", + git_commit = "017ff8237239f794a899727365158323fb36e7f2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e71dbdf25db6ec1b4e80b24a5c2b3851d6b27671 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Feb 2019 22:02:03 -0800 Subject: [PATCH 2765/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235853925 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2b2986544d2..e88266f89a4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bc7bfafdc228514a3fbf90c27c34a2d277961ee9a90b4c05522de90fd1aecc50", - git_commit = "017ff8237239f794a899727365158323fb36e7f2", + sha256 = "2045e96156da27595508f2583f9c3c0e01d789e24dee72a419e156e72621ce16", + git_commit = "23f78239169810a542dfa853fa524460070db004", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d215c958e26477ae67aff4a70e6bce53e02d5da8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Feb 2019 23:01:47 -0800 Subject: [PATCH 2766/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235859038 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e88266f89a4..610f905ba88 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2045e96156da27595508f2583f9c3c0e01d789e24dee72a419e156e72621ce16", - git_commit = "23f78239169810a542dfa853fa524460070db004", + sha256 = "026cba181b90d3c672c437acf865043c1c8ddcae467942612f51b6399ee8cf32", + git_commit = "571e140e13577624c71f16ba7101680f8fbe70dd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2b4178d57a5a03f6043eb628615ee551f15debdc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Feb 2019 03:01:57 -0800 Subject: [PATCH 2767/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235886184 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 610f905ba88..433dc7db9e9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "026cba181b90d3c672c437acf865043c1c8ddcae467942612f51b6399ee8cf32", - git_commit = "571e140e13577624c71f16ba7101680f8fbe70dd", + sha256 = "a376b83b6457cfff57f2fd1d2218d6b9b1f13873798798b9e3fda3d5d9aed502", + git_commit = "42092c5253be7d39d598a22f9d4169d25dbc72a0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 428022e152982ad4ac6763a576ab03a8567d1f14 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Feb 2019 04:02:53 -0800 Subject: [PATCH 2768/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235892283 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 433dc7db9e9..b1d90cc0bea 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a376b83b6457cfff57f2fd1d2218d6b9b1f13873798798b9e3fda3d5d9aed502", - git_commit = "42092c5253be7d39d598a22f9d4169d25dbc72a0", + sha256 = "2d706c24917dfb1b5ac94f8bc394d1a9f133ae2c5e2039fd3503bdc8873b48af", + git_commit = "31f770fa9fa8e32606fca7333349ce5c722fc199", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 32afda0d8998b8968ca82ba63f1dd05b12fd2d06 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Feb 2019 08:02:09 -0800 Subject: [PATCH 2769/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235919822 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b1d90cc0bea..3c61bdc9d96 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2d706c24917dfb1b5ac94f8bc394d1a9f133ae2c5e2039fd3503bdc8873b48af", - git_commit = "31f770fa9fa8e32606fca7333349ce5c722fc199", + sha256 = "12b240ae81ae28d04ccaacb73db4a8f76b5dee6b1f0c840eaa51366a6eb8a7a0", + git_commit = "6deb1c30f9c961c8cf1504eca0a1b11f15922a85", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2720c1fa959b38bc49f94bc8b18e2b16899bd8f7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Feb 2019 10:02:02 -0800 Subject: [PATCH 2770/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235939814 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3c61bdc9d96..33b12e8f0b4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "12b240ae81ae28d04ccaacb73db4a8f76b5dee6b1f0c840eaa51366a6eb8a7a0", - git_commit = "6deb1c30f9c961c8cf1504eca0a1b11f15922a85", + sha256 = "c5f64f2f90c1505eccede288f0ff48cd52618151aa047f6329b7aee9b8eda97b", + git_commit = "423c4b9af1179b959082b2efa6d9f4b2dea492ff", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From bf6e3cd8ef58fb42632592de54beffbcb7fe725d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Feb 2019 11:02:24 -0800 Subject: [PATCH 2771/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235953050 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 33b12e8f0b4..b209ebbb60e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c5f64f2f90c1505eccede288f0ff48cd52618151aa047f6329b7aee9b8eda97b", - git_commit = "423c4b9af1179b959082b2efa6d9f4b2dea492ff", + sha256 = "1301aad185cd59396b4618904cd85993e3764852f587ee859b873745ead09d99", + git_commit = "e19750eea63fba54b1b955a081afa8ccf5574df3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c7313322af8940a6cb9ebf7b8ebe2c7d59e5a366 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Feb 2019 12:01:52 -0800 Subject: [PATCH 2772/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235965218 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b209ebbb60e..f40c4c82a9e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1301aad185cd59396b4618904cd85993e3764852f587ee859b873745ead09d99", - git_commit = "e19750eea63fba54b1b955a081afa8ccf5574df3", + sha256 = "eeeb25dc350979115e9231fd20bdc2ae7ec6e6e23619b35970a1ab39e8fc099a", + git_commit = "a659294de6abcfc6115733282f8359c74832d57b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 916f317702293f78ac41e3fabfb42949fbcb08d5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Feb 2019 13:01:44 -0800 Subject: [PATCH 2773/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235975941 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f40c4c82a9e..a46eed43566 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eeeb25dc350979115e9231fd20bdc2ae7ec6e6e23619b35970a1ab39e8fc099a", - git_commit = "a659294de6abcfc6115733282f8359c74832d57b", + sha256 = "7ee95bc2c0639f7897e6dd82a2c5ef9ba34a1af7fff1ffc9364db2bff56ca0bc", + git_commit = "7eda28c730e6602528d7c8bb528918e538ba6d72", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 05111e1fd459d448e8d511f965d3a4570445e93d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Feb 2019 15:02:02 -0800 Subject: [PATCH 2774/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 235999601 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a46eed43566..c7ec2019c0d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7ee95bc2c0639f7897e6dd82a2c5ef9ba34a1af7fff1ffc9364db2bff56ca0bc", - git_commit = "7eda28c730e6602528d7c8bb528918e538ba6d72", + sha256 = "7a9a19670e4157aa2da7d3baef56e70822d371cfa2a6af6e65202efc04984502", + git_commit = "c88385b4aac877c00df18148ffbba86846dd871b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 304319c9c324bbe2eb49773afd08334702200fcf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Feb 2019 16:02:13 -0800 Subject: [PATCH 2775/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 236011076 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c7ec2019c0d..cf83009a42f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7a9a19670e4157aa2da7d3baef56e70822d371cfa2a6af6e65202efc04984502", - git_commit = "c88385b4aac877c00df18148ffbba86846dd871b", + sha256 = "66dd926638b9723169f1bd867479d2fa24c663dc9e5132d1d4ee1498272c843d", + git_commit = "963b4c574057c9b499a03954f5fa0675508333cd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 103ddc0a32f40808385c92e36611a6fb173f37df Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Feb 2019 17:01:47 -0800 Subject: [PATCH 2776/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 236021616 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cf83009a42f..7c23d257a20 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "66dd926638b9723169f1bd867479d2fa24c663dc9e5132d1d4ee1498272c843d", - git_commit = "963b4c574057c9b499a03954f5fa0675508333cd", + sha256 = "02acdb0cd50f26c3e4a48d2659904b53c02cecdd177fcc25e21dff103ec220ed", + git_commit = "11799bd3c0c880063766dbed5c02ac386a7ce277", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c0cf3bdfdb14889a150b7d785eb69732c7bdf3f0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Feb 2019 18:01:47 -0800 Subject: [PATCH 2777/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 236030924 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7c23d257a20..6193b608799 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "02acdb0cd50f26c3e4a48d2659904b53c02cecdd177fcc25e21dff103ec220ed", - git_commit = "11799bd3c0c880063766dbed5c02ac386a7ce277", + sha256 = "7aa3d0340fe2e04906b9a6ae500529c7c66f976dd4a70e5fa6e78e5231e7b885", + git_commit = "08e48b61382f049fd35bdf45ced93f809512a7b9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a4317662033ba67910b3c4ab6118794e2dc644c5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Feb 2019 19:02:05 -0800 Subject: [PATCH 2778/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 236037600 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6193b608799..6fdb58aafd5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7aa3d0340fe2e04906b9a6ae500529c7c66f976dd4a70e5fa6e78e5231e7b885", - git_commit = "08e48b61382f049fd35bdf45ced93f809512a7b9", + sha256 = "8dc788966c8420a069345b0d1115efd2cf3956d3ccfb5bf34004bc329519efe0", + git_commit = "27e990375dd248603cf1e7794c3ad23352b4ea44", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e665ff41793a2f6e926a1a22a4b7137dbbb4a952 Mon Sep 17 00:00:00 2001 From: awk Date: Wed, 27 Feb 2019 19:28:33 -0800 Subject: [PATCH 2779/8103] Update TF Serving 1.13.0 release notes. PiperOrigin-RevId: 236040118 --- RELEASE.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/RELEASE.md b/RELEASE.md index f64e8bed6bc..e46df0df534 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,3 +1,38 @@ +# Release 1.13.0 + +## Major Features and Improvements + +* Support for TensorRT 5.0 (GPU docker image built against CUDA 10 and TensorRT 5.0) +* Support for listening gRPC over UNIX socket (commit: a25b0dad3984d3b154db1144df9d3b447b19aae6) +* New [GPU version of TensorFlow Serving API PIP package](https://pypi.org/project/tensorflow-serving-api-gpu/). This depends on the `tensorflow-gpu` instead of `tensorflow` PIP package, but is otherwise identical. (commit: 525c1af73ca543ce0165b3d22f0bbf21094fc443) +* [TF Serving end-to-end colab](tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb)! Training with Keras, serving with TF Serving and REST API (commit: 1ff8aadf20d75294aa4d496a807320603c6887c6) + +## Breaking Changes + +* No breaking changes. + +## Bug Fixes and Other Changes + +* Make error message for input size mismatch in `Predict` call even more actionable. (commit: 7237fb54c8d5898713e0bba7573add60cd19c25e) +* Document how to use the version policy to pin a specific version, or serve multiple versions, of a model. (commit: 2724bfee911f1d2294a9ceb705bbd09a2701c344) +* Document config reloading and model version labels. (commit: f4890afdc42f10f125cba64c3c2f2c01309ba2e2) +* Fix the compile error on ARM-32 in net_http/server. (commit: 5446fd973de228693c1652acd4922dc4b177f77a) +* Adds ModelSpec to SessionRunResponse. (commit: 58a22637ef5e3c50153eb42eff652137eb18c94a) +* Add MKL support (commit: 8f792532bea10d82fd3c3b126412d0546f54ae28) +* Fix default path of Prometheus metrics endpoint (commit: 9d05b0c17be47d3260ab58c2b9ac97e202699b96) +* Add monitoring metrics for saved model (export_dir) warm up latency. (commit: de0935b64ec972879ae623aa4f438282a4281dcc) +* Add more details/clarification to model version labels documentation. (commit: f9e6ac4d60a4044fc3b8c07719d0faaeae401dda) +* Split `--tensorflow_session_parallelism` flag into two new flags: `--tensorflow_intra_op_parallelism` and `--tensorflow_inter_op_parallelism` (commit: 71092e448c5432f4411f7333a02b274f0a3cdd3f) +* Update CPU Docker images to Ubuntu 18.04 (commit: 8023fba48c5b47a81fec25c17ba385a720650ef8) +* Upgrade to Bazel 0.20.0 (commit: fc0b75f2e325a187794bf437ff3227510d261afb) +* Update Python 2 scripts to be compatible with both Python 2 and 3 (commit: 846d443bb506f07242cd99347901f3ad5b7efe6a) + +## Thanks to our Contributors + +This release contains contributions from many people at Google, as well as: + +Daniel Shi, Karthik Vadla, lapolonio, robert, Shintaro Murakami, Siju, Tom Forbes, Ville TöRhöNen + # Release 1.12.0 ## Major Features and Improvements From ab7e71dfe8a65a8b51301734202517d232a5960f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Feb 2019 20:02:01 -0800 Subject: [PATCH 2780/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 236043103 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6fdb58aafd5..ae157972aeb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8dc788966c8420a069345b0d1115efd2cf3956d3ccfb5bf34004bc329519efe0", - git_commit = "27e990375dd248603cf1e7794c3ad23352b4ea44", + sha256 = "fbbaf5643699e385ee68793a798f71d2063f94c775f1b79e04f4ff4ca60b3990", + git_commit = "53b19b5106a10dbf4795534365d838daaac4091e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8f9756546f43a1d9c7b691a1052e05c2da1856ea Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Feb 2019 21:01:40 -0800 Subject: [PATCH 2781/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 236048388 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ae157972aeb..bb673db9d57 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fbbaf5643699e385ee68793a798f71d2063f94c775f1b79e04f4ff4ca60b3990", - git_commit = "53b19b5106a10dbf4795534365d838daaac4091e", + sha256 = "f0978cb6f73705599d920e7f1e0887fb2a2dbee558abc1b79fc5ba01d6164dca", + git_commit = "3e21fe5faedab3a8258d344c8ad1cec2612a8aa8", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From cb84d6b2fd86b62fd69c2c00e6469a342dfbf6ac Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Feb 2019 12:02:32 -0800 Subject: [PATCH 2782/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 236168595 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bb673db9d57..d1d56e9e02a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f0978cb6f73705599d920e7f1e0887fb2a2dbee558abc1b79fc5ba01d6164dca", - git_commit = "3e21fe5faedab3a8258d344c8ad1cec2612a8aa8", + sha256 = "3b46204a0e0e0ea6c9148825acd0cf465684bd45d1660b6483952a7dfd2e1d80", + git_commit = "f9a5fdc6d8d8a2a5bafe08c8a9775753bada4d95", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 85a3de98aab0e046163c39edb068ca87d90f2280 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Feb 2019 13:01:54 -0800 Subject: [PATCH 2783/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 236180958 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d1d56e9e02a..fe7fd16017f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3b46204a0e0e0ea6c9148825acd0cf465684bd45d1660b6483952a7dfd2e1d80", - git_commit = "f9a5fdc6d8d8a2a5bafe08c8a9775753bada4d95", + sha256 = "20caf01a772e7c847900d784c7ad50912e908f82833423064df3e5de71f38ce9", + git_commit = "29c3a37307142a0c0e413e5c2d85d8797ff60e7b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 865c1c25b8832d4c0aced1a5fb23038d7838ecbc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Feb 2019 14:01:55 -0800 Subject: [PATCH 2784/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 236192817 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fe7fd16017f..3f3e14536ff 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "20caf01a772e7c847900d784c7ad50912e908f82833423064df3e5de71f38ce9", - git_commit = "29c3a37307142a0c0e413e5c2d85d8797ff60e7b", + sha256 = "0e15ccf32a1eb2a2c3a1eb7f662f514a44934f4fd5bcca6093b3c16e257b8e44", + git_commit = "fec5b73955e39cdfa9d8ba710aaa7f555aa0c4e6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f754a878a6060fb5cfa3fa931868faa7775224b3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Feb 2019 15:01:54 -0800 Subject: [PATCH 2785/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 236204118 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3f3e14536ff..54634875366 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0e15ccf32a1eb2a2c3a1eb7f662f514a44934f4fd5bcca6093b3c16e257b8e44", - git_commit = "fec5b73955e39cdfa9d8ba710aaa7f555aa0c4e6", + sha256 = "23e8b6c44fde553046631a275cf608002d036c17a7732013c0602fa4c6e9541f", + git_commit = "a4a4d4bd0472d6e23cbfb11269da95504fd7b233", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 504e61cff9cf4f003c503bd5e7811109899f147d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Feb 2019 16:02:54 -0800 Subject: [PATCH 2786/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 236215002 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 54634875366..8383f64b90d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "23e8b6c44fde553046631a275cf608002d036c17a7732013c0602fa4c6e9541f", - git_commit = "a4a4d4bd0472d6e23cbfb11269da95504fd7b233", + sha256 = "7911529f5c7cf1b6c1f8a76d699e9c197e570631d1e9b725ea58c5d824cd8192", + git_commit = "21ec9b010d7ff97f49642d67709e01fcad7619e4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1433f7a86d7fccbfaf0c7f65249c8668e36af35f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Feb 2019 17:02:17 -0800 Subject: [PATCH 2787/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 236225287 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8383f64b90d..fc2bb3204aa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7911529f5c7cf1b6c1f8a76d699e9c197e570631d1e9b725ea58c5d824cd8192", - git_commit = "21ec9b010d7ff97f49642d67709e01fcad7619e4", + sha256 = "d22c153319a338eca55396b08514a07d4fdc29562d1ae8830fc30a18b8b6a4ca", + git_commit = "26ed3b23f2df9ad2e32e493cbd87ea3360481e00", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b7fc56616d9353632539f05fe9698590bfe359ac Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Feb 2019 18:02:48 -0800 Subject: [PATCH 2788/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 236233744 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fc2bb3204aa..6e8058b01af 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d22c153319a338eca55396b08514a07d4fdc29562d1ae8830fc30a18b8b6a4ca", - git_commit = "26ed3b23f2df9ad2e32e493cbd87ea3360481e00", + sha256 = "d01f067d8762cab669444eb4e409d376b599fdd817d68d662fd0ec8ffbde408c", + git_commit = "a472e8ee6fb706ce54e43639384ef3714d0c62ce", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From aefc1c51fbcdf30cd7e718cbce3177375c9ea6e6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Feb 2019 19:02:49 -0800 Subject: [PATCH 2789/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 236240830 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6e8058b01af..82049c39b8f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d01f067d8762cab669444eb4e409d376b599fdd817d68d662fd0ec8ffbde408c", - git_commit = "a472e8ee6fb706ce54e43639384ef3714d0c62ce", + sha256 = "01231c134097271df090225726b520cb8052f851eb1e2ee12f64d8bb5c1ab67c", + git_commit = "b06d8e846fe0d295898b035e372749e65cc01fe2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c68245aef4f2b48b889ccd9e1917df4ef5069be4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Feb 2019 20:02:29 -0800 Subject: [PATCH 2790/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 236246811 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 82049c39b8f..ba869d33445 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "01231c134097271df090225726b520cb8052f851eb1e2ee12f64d8bb5c1ab67c", - git_commit = "b06d8e846fe0d295898b035e372749e65cc01fe2", + sha256 = "92322426807e1502990bb5154678a5b0a6177466b5adee6840bec479f372a34d", + git_commit = "589fb0dfdb694d6318784e1523672fc2833b736d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3cd013b76f9590374e51fdd53a07391f9ceaf1ce Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Feb 2019 21:01:56 -0800 Subject: [PATCH 2791/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 236252108 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ba869d33445..b89055dd5e9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "92322426807e1502990bb5154678a5b0a6177466b5adee6840bec479f372a34d", - git_commit = "589fb0dfdb694d6318784e1523672fc2833b736d", + sha256 = "57527e64466074c4ef31f2c992cb3e84e370fbd8748febfdca05acf0a447b25a", + git_commit = "67192f80d4c03eeb0a87c4f6361f2080447d2ee9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6bca32f371b37f11456503c5d757275a024dac0e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Feb 2019 22:02:17 -0800 Subject: [PATCH 2792/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 236257698 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b89055dd5e9..0cf37752285 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "57527e64466074c4ef31f2c992cb3e84e370fbd8748febfdca05acf0a447b25a", - git_commit = "67192f80d4c03eeb0a87c4f6361f2080447d2ee9", + sha256 = "cd642d0aebe9f2b0c3e6275237035774f8dbe26d684e7c5cc248e2acd00afbba", + git_commit = "191f3dbb5df3905c64a337af070f2e20829ee48e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0f6d956c34b31dfd920ec96dba2a8d748677f9e5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Feb 2019 23:02:39 -0800 Subject: [PATCH 2793/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 236262857 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0cf37752285..379bd28b9a6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cd642d0aebe9f2b0c3e6275237035774f8dbe26d684e7c5cc248e2acd00afbba", - git_commit = "191f3dbb5df3905c64a337af070f2e20829ee48e", + sha256 = "1a011702efb83050df3756a4b26407732c49b0c18ec74cbc3512e0191b6c6cc7", + git_commit = "542e6f3905d02974aa56b96133bc1e59d4c8d1ee", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5fb314ccb24ce60b59e8e333e8ca09842cfca6f4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Mar 2019 00:02:19 -0800 Subject: [PATCH 2794/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 236268477 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 379bd28b9a6..2810ce61868 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1a011702efb83050df3756a4b26407732c49b0c18ec74cbc3512e0191b6c6cc7", - git_commit = "542e6f3905d02974aa56b96133bc1e59d4c8d1ee", + sha256 = "8a2ab10e33cd02bbafa13ff2b2d705383096fd46489fc08e51ddc7c0bd7ba41e", + git_commit = "23d8e38f8728b7107d78a773e03f8b1a8166237a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From aa2331292e2dc6a6505d70a3df45243ba2e4e311 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Mar 2019 02:02:19 -0800 Subject: [PATCH 2795/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 236281831 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2810ce61868..b63d3e029b7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8a2ab10e33cd02bbafa13ff2b2d705383096fd46489fc08e51ddc7c0bd7ba41e", - git_commit = "23d8e38f8728b7107d78a773e03f8b1a8166237a", + sha256 = "fedc0f93992aead0cabd3f3ceb4d3ad777a00abe8853a5c8434767c01f2b3d4d", + git_commit = "8cd79be185bb1a09b5745954cfb238b586bef601", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From fe64d01d1728e44d399b9443faf9ea2010da6cab Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Mar 2019 03:02:36 -0800 Subject: [PATCH 2796/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 236288095 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b63d3e029b7..77290ab6a4a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fedc0f93992aead0cabd3f3ceb4d3ad777a00abe8853a5c8434767c01f2b3d4d", - git_commit = "8cd79be185bb1a09b5745954cfb238b586bef601", + sha256 = "9c69a3182f689bdf3b619399817c0afed71bea3b9bc395e88c90939c6939002b", + git_commit = "26f24af01f4f02cdf9e60fee7da400277b4ab6ff", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d6f1154680f6007c87ab9f275755767dd0ae5597 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Mar 2019 04:02:19 -0800 Subject: [PATCH 2797/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 236293212 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 77290ab6a4a..468189c5c1e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9c69a3182f689bdf3b619399817c0afed71bea3b9bc395e88c90939c6939002b", - git_commit = "26f24af01f4f02cdf9e60fee7da400277b4ab6ff", + sha256 = "30904513b2dc2d94a115f9dab81041faff546351aad2ec581bd252463ab0e844", + git_commit = "0f6774024b0ad7143b390e3e7b196b879fbc6145", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3432e0a0effa6c2a88b58bda7668dbe38f6800df Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Mar 2019 05:02:08 -0800 Subject: [PATCH 2798/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 236298281 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 468189c5c1e..0d4dd742ac7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "30904513b2dc2d94a115f9dab81041faff546351aad2ec581bd252463ab0e844", - git_commit = "0f6774024b0ad7143b390e3e7b196b879fbc6145", + sha256 = "f31cd83be283f881c52833f30ec17f0e016ebbc9288166c095eb26ebc11668ac", + git_commit = "13c7c20f4fd24fd73275d2ca4306582ac85ce926", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d42ed22bb05228539ae5361179cc27a8f07c444d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Mar 2019 06:02:09 -0800 Subject: [PATCH 2799/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 236303191 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0d4dd742ac7..3f2fa2b5036 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f31cd83be283f881c52833f30ec17f0e016ebbc9288166c095eb26ebc11668ac", - git_commit = "13c7c20f4fd24fd73275d2ca4306582ac85ce926", + sha256 = "d68bdc602311e238004782197f5a512f7386c273470c2127bc2e48c11c6b224f", + git_commit = "a9b386407034529769a7fc6f95e7aaf4c1c0a15f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 45ce401af9e9d6648a9d8bb8584c98b028893252 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Mar 2019 07:03:10 -0800 Subject: [PATCH 2800/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 236308911 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3f2fa2b5036..3bd251ee66b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d68bdc602311e238004782197f5a512f7386c273470c2127bc2e48c11c6b224f", - git_commit = "a9b386407034529769a7fc6f95e7aaf4c1c0a15f", + sha256 = "8f95addeec36ccc3f5d2bbe55b54d931fddc0d3556096ce07d8b2cae0d7431ec", + git_commit = "d00fa72a0fba1775b385ccca24c7fa5a42f63ed1", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 082e16ef7cbdaa7aee087e777ea9edd2839e441e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Mar 2019 11:03:11 -0800 Subject: [PATCH 2801/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 236342138 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3bd251ee66b..c3a202e1b33 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8f95addeec36ccc3f5d2bbe55b54d931fddc0d3556096ce07d8b2cae0d7431ec", - git_commit = "d00fa72a0fba1775b385ccca24c7fa5a42f63ed1", + sha256 = "1a2a76133993996ce3b553e3b1a666c24aab38c4d341995d3517764ba0f5f3a7", + git_commit = "efcf00759d180c5558dc5cead2f2c66113f5a42c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6797a4dd737edfc99d397aad980128740cadba0c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Mar 2019 12:03:40 -0800 Subject: [PATCH 2802/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 236353242 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c3a202e1b33..e45a7a2ac95 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1a2a76133993996ce3b553e3b1a666c24aab38c4d341995d3517764ba0f5f3a7", - git_commit = "efcf00759d180c5558dc5cead2f2c66113f5a42c", + sha256 = "7e2a1008181e1f88c6ac761e29fe16e6532d07b2f3f12a6144d536225012ce42", + git_commit = "98074f8769ec822de7354c2ea63a198fbc009d0e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2b7c1c633f3ca54aef102e1e9bd6992123c1ed23 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Mar 2019 13:03:02 -0800 Subject: [PATCH 2803/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 236363258 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e45a7a2ac95..363a353a27b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7e2a1008181e1f88c6ac761e29fe16e6532d07b2f3f12a6144d536225012ce42", - git_commit = "98074f8769ec822de7354c2ea63a198fbc009d0e", + sha256 = "ff9e345688932e0e6cfd0775b792a97e410b0b05befd7389ddadb6ade90b8aef", + git_commit = "b02330ec037198726726cf339b165e7716085617", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 496742f53d02d5b0db84647998f380630925bfd0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Mar 2019 14:03:15 -0800 Subject: [PATCH 2804/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 236374147 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 363a353a27b..16cc3527c57 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ff9e345688932e0e6cfd0775b792a97e410b0b05befd7389ddadb6ade90b8aef", - git_commit = "b02330ec037198726726cf339b165e7716085617", + sha256 = "21367006a4471697da8263e43061245d7c3d6bdc6c12f4211b7ffbd95cfcf4d0", + git_commit = "a31e317e8bb4a568b1b314953cf6db2a5d8f1431", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 592fa79ef9216c8053000f71bea4619db6e0a02a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Mar 2019 15:03:03 -0800 Subject: [PATCH 2805/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 236385013 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 16cc3527c57..55c0a25baef 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "21367006a4471697da8263e43061245d7c3d6bdc6c12f4211b7ffbd95cfcf4d0", - git_commit = "a31e317e8bb4a568b1b314953cf6db2a5d8f1431", + sha256 = "95f9897d008b3bed0ba34610dd39f0c36168ca00de54ebf08f827b5a37cab93f", + git_commit = "8fa58e776283de8d1e877fe6d57d6a3f6e4dc556", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7cced4b5b1de5ff0721b1f83d3e4bef8f4a80b26 Mon Sep 17 00:00:00 2001 From: blamb Date: Sun, 3 Mar 2019 01:19:02 -0800 Subject: [PATCH 2806/8103] Move TFX library docs into user guide. PiperOrigin-RevId: 236518035 --- tensorflow_serving/g3doc/_index.yaml | 57 ------------------- tensorflow_serving/g3doc/_toc.yaml | 13 +---- .../g3doc/{overview.md => architecture.md} | 2 +- tensorflow_serving/g3doc/docker.md | 25 +++++++- tensorflow_serving/g3doc/tutorials/README.md | 3 + 5 files changed, 30 insertions(+), 70 deletions(-) delete mode 100644 tensorflow_serving/g3doc/_index.yaml rename tensorflow_serving/g3doc/{overview.md => architecture.md} (99%) create mode 100644 tensorflow_serving/g3doc/tutorials/README.md diff --git a/tensorflow_serving/g3doc/_index.yaml b/tensorflow_serving/g3doc/_index.yaml deleted file mode 100644 index c55a5982438..00000000000 --- a/tensorflow_serving/g3doc/_index.yaml +++ /dev/null @@ -1,57 +0,0 @@ -book_path: /tfx/_book.yaml -project_path: /tfx/_project.yaml -description: -landing_page: - custom_css_path: /site-assets/css/style.css - nav: left - rows: - - classname: devsite-landing-row-100 - heading: TensorFlow Serving for model deployment in production - items: - - description: > - TensorFlow Serving is a flexible, high-performance serving system for - machine learning models, designed for production environments. TensorFlow - Serving makes it easy to deploy new algorithms and experiments, while - keeping the same server architecture and APIs. TensorFlow Serving - provides out-of-the-box integration with TensorFlow models, but can be - easily extended to serve other types of models and data. - code_block: | -
-        # Download the TensorFlow Serving Docker image and repo
-        docker pull tensorflow/serving
- git clone https://github.com/tensorflow/serving - # Location of demo models - TESTDATA="$(pwd)/serving/tensorflow_serving/servables/tensorflow/testdata" - - # Start TensorFlow Serving container and open the REST API port - docker run -t --rm -p 8501:8501 \ - -v "$TESTDATA/saved_model_half_plus_two_cpu:/models/half_plus_two" \ - -e MODEL_NAME=half_plus_two \ - tensorflow/serving & - - # Query the model using the predict API - curl -d '{"instances": [1.0, 2.0, 5.0]}' \ - -X POST http://localhost:8501/v1/models/half_plus_two:predict
- # Returns => { "predictions": [2.5, 3.0, 4.5] } -
-

For additional serving endpoints, see the Client REST API.

- - - classname: devsite-landing-row-cards - items: - - heading: "Serving ML Quickly with TensorFlow Serving and Docker" - image_path: /resources/images/tf-logo-card-16x9.png - path: https://medium.com/tensorflow/serving-ml-quickly-with-tensorflow-serving-and-docker-7df7094aa008 - buttons: - - label: Read on TensorFlow blog - path: https://medium.com/tensorflow/serving-ml-quickly-with-tensorflow-serving-and-docker-7df7094aa008 - - heading: "TensorFlow Serving at the Dev Summit" - youtube_id: q_IkJcPyNl0 - buttons: - - label: Watch the video - path: https://www.youtube.com/watch?v=q_IkJcPyNl0 - - heading: TensorFlow Serving on GitHub - image_path: /resources/images/github-card-16x9.png - path: https://github.com/tensorflow/serving - buttons: - - label: View on GitHub - path: https://github.com/tensorflow/serving diff --git a/tensorflow_serving/g3doc/_toc.yaml b/tensorflow_serving/g3doc/_toc.yaml index 9d3833abbbf..9c82857de1f 100644 --- a/tensorflow_serving/g3doc/_toc.yaml +++ b/tensorflow_serving/g3doc/_toc.yaml @@ -1,19 +1,12 @@ toc: -- heading: Quick Start -- title: Use TensorFlow Serving with Docker +- title: TensorFlow Serving with Docker path: /tfx/serving/docker - -- heading: Examples -- title: Train and serve a model with REST - path: /tfx/serving/tutorials/Serving_REST_simple - -- heading: Understanding TensorFlow Serving -- title: Overview - path: /tfx/serving/overview - title: Installation path: /tfx/serving/setup - title: Serve a TensorFlow model path: /tfx/serving/serving_basic +- title: Architecture + path: /tfx/serving/architecture - title: Advanced model server configuration path: /tfx/serving/serving_config - title: Build a TensorFlow ModelServer diff --git a/tensorflow_serving/g3doc/overview.md b/tensorflow_serving/g3doc/architecture.md similarity index 99% rename from tensorflow_serving/g3doc/overview.md rename to tensorflow_serving/g3doc/architecture.md index c24f59b0d9a..7afb9aa5c60 100644 --- a/tensorflow_serving/g3doc/overview.md +++ b/tensorflow_serving/g3doc/architecture.md @@ -1,4 +1,4 @@ -# Architecture Overview +# Architecture TensorFlow Serving is a flexible, high-performance serving system for machine learning models, designed for production environments. TensorFlow Serving diff --git a/tensorflow_serving/g3doc/docker.md b/tensorflow_serving/g3doc/docker.md index 814268fdabf..c35ddfef160 100644 --- a/tensorflow_serving/g3doc/docker.md +++ b/tensorflow_serving/g3doc/docker.md @@ -1,9 +1,30 @@ -# Using TensorFlow Serving with Docker +# TensorFlow Serving with Docker One of the easiest ways to get started using TensorFlow Serving is with [Docker](http://www.docker.com/). -## Installing Docker +
+# Download the TensorFlow Serving Docker image and repo
+docker pull tensorflow/serving
+git clone https://github.com/tensorflow/serving +# Location of demo models +TESTDATA="$(pwd)/serving/tensorflow_serving/servables/tensorflow/testdata" + +# Start TensorFlow Serving container and open the REST API port +docker run -t --rm -p 8501:8501 \ + -v "$TESTDATA/saved_model_half_plus_two_cpu:/models/half_plus_two" \ + -e MODEL_NAME=half_plus_two \ + tensorflow/serving & + +# Query the model using the predict API +curl -d '{"instances": [1.0, 2.0, 5.0]}' \ + -X POST http://localhost:8501/v1/models/half_plus_two:predict
+# Returns => { "predictions": [2.5, 3.0, 4.5] } +
+ +For additional serving endpoints, see the Client REST API. + +## Install Docker General installation instructions are [on the Docker site](https://docs.docker.com/install/), but we give some quick diff --git a/tensorflow_serving/g3doc/tutorials/README.md b/tensorflow_serving/g3doc/tutorials/README.md new file mode 100644 index 00000000000..4ce6c94beed --- /dev/null +++ b/tensorflow_serving/g3doc/tutorials/README.md @@ -0,0 +1,3 @@ +# TensorFlow Serving tutorials + +Tutorials moved to: https://github.com/tensorflow/tfx/tree/master/docs/tutorials From d9b99a3efe4077a8936bd586b252486c8b24dd6f Mon Sep 17 00:00:00 2001 From: awk Date: Mon, 4 Mar 2019 11:57:59 -0800 Subject: [PATCH 2807/8103] Allow multiple logging configs to be associated with a single model. This provides ability to a log request for a model to multiple sinks. PiperOrigin-RevId: 236697350 --- tensorflow_serving/core/BUILD | 4 + .../core/server_request_logger.cc | 66 ++++------ .../core/server_request_logger.h | 19 +-- .../core/server_request_logger_test.cc | 118 ++++++++++++++---- .../test_util/mock_server_request_logger.h | 7 +- .../model_servers/server_core.cc | 5 +- 6 files changed, 142 insertions(+), 77 deletions(-) diff --git a/tensorflow_serving/core/BUILD b/tensorflow_serving/core/BUILD index a3b15aae43b..e424882827d 100644 --- a/tensorflow_serving/core/BUILD +++ b/tensorflow_serving/core/BUILD @@ -824,12 +824,16 @@ cc_test( ":server_request_logger", "//tensorflow_serving/apis:model_proto", "//tensorflow_serving/apis:predict_proto", + "//tensorflow_serving/config:log_collector_config_proto", "//tensorflow_serving/config:logging_config_proto", "//tensorflow_serving/core/test_util:fake_log_collector", "//tensorflow_serving/core/test_util:mock_request_logger", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", + "@com_google_absl//absl/strings", "@org_tensorflow//tensorflow/core:lib", + "@org_tensorflow//tensorflow/core:test", + "@protobuf_archive//:cc_wkt_protos", "@protobuf_archive//:protobuf", ], ) diff --git a/tensorflow_serving/core/server_request_logger.cc b/tensorflow_serving/core/server_request_logger.cc index f3e3fd196d7..64cd8335b81 100644 --- a/tensorflow_serving/core/server_request_logger.cc +++ b/tensorflow_serving/core/server_request_logger.cc @@ -25,30 +25,6 @@ limitations under the License. namespace tensorflow { namespace serving { -namespace { - -// Validate the logging config map. For now only check for duplicate filename -// prefixes and emit warnings. -Status ValidateLoggingConfigMap( - const std::map& logging_config_map) { - std::set filename_prefixes; - for (const auto& model_and_logging_config : logging_config_map) { - const string& filename_prefix = - model_and_logging_config.second.log_collector_config() - .filename_prefix(); - if (!gtl::InsertIfNotPresent(&filename_prefixes, filename_prefix)) { - // Each model's logs are supposed to be separated from each other, - // though there could be systems which can distinguish based on the - // model-spec in the logging proto, so we issue only a warning. - LOG(WARNING) << "Duplicate LogCollectorConfig::filename_prefix(): " - << filename_prefix << ". Possibly a misconfiguration."; - } - } - return Status::OK(); -} - -} // namespace - // static Status ServerRequestLogger::Create( LoggerCreator request_logger_creator, @@ -100,29 +76,30 @@ Status ServerRequestLogger::FindOrCreateLogger( } Status ServerRequestLogger::Update( - const std::map& logging_config_map) { + const std::map>& logging_config_map) { if (!logging_config_map.empty() && !request_logger_creator_) { return errors::InvalidArgument("No request-logger-creator provided."); } - TF_RETURN_IF_ERROR(ValidateLoggingConfigMap(logging_config_map)); // Those new maps will only contain loggers from logging_config_map and // replace the current versions further down. - std::unique_ptr new_model_to_logger_map( - new StringToRequestLoggerMap()); + std::unique_ptr new_model_to_loggers_map( + new StringToRequestLoggersMap()); StringToUniqueRequestLoggerMap new_config_to_logger_map; mutex_lock l(update_mu_); for (const auto& model_and_logging_config : logging_config_map) { - RequestLogger* logger; - TF_RETURN_IF_ERROR(FindOrCreateLogger(model_and_logging_config.second, - &new_config_to_logger_map, &logger)); - const string& model_name = model_and_logging_config.first; - new_model_to_logger_map->emplace(std::make_pair(model_name, logger)); + for (const auto& logging_config : model_and_logging_config.second) { + RequestLogger* logger; + TF_RETURN_IF_ERROR(FindOrCreateLogger( + logging_config, &new_config_to_logger_map, &logger)); + const string& model_name = model_and_logging_config.first; + (*new_model_to_loggers_map)[model_name].push_back(logger); + } } - model_to_logger_map_.Update(std::move(new_model_to_logger_map)); + model_to_loggers_map_.Update(std::move(new_model_to_loggers_map)); // Any remaining loggers in config_to_logger_map_ will not be needed anymore // and destructed at this point. config_to_logger_map_ = std::move(new_config_to_logger_map); @@ -134,18 +111,23 @@ Status ServerRequestLogger::Log(const google::protobuf::Message& request, const google::protobuf::Message& response, const LogMetadata& log_metadata) { const string& model_name = log_metadata.model_spec().name(); - auto model_to_logger_map = model_to_logger_map_.get(); - if (!model_to_logger_map || model_to_logger_map->empty()) { - VLOG(2) << "Request logger map is empty."; + auto model_to_loggers_map = model_to_loggers_map_.get(); + if (!model_to_loggers_map || model_to_loggers_map->empty()) { + VLOG(2) << "Request loggers map is empty."; return Status::OK(); } - auto found_it = model_to_logger_map->find(model_name); - if (found_it == model_to_logger_map->end()) { - VLOG(2) << "Cannot find request-logger for model: " << model_name; + auto found_it = model_to_loggers_map->find(model_name); + if (found_it == model_to_loggers_map->end()) { + VLOG(2) << "Cannot find request-loggers for model: " << model_name; return Status::OK(); } - auto& request_logger = found_it->second; - return request_logger->Log(request, response, log_metadata); + + Status status; + for (const auto& logger : found_it->second) { + // Note: Only first error will be tracked/returned. + status.Update(logger->Log(request, response, log_metadata)); + } + return status; } } // namespace serving diff --git a/tensorflow_serving/core/server_request_logger.h b/tensorflow_serving/core/server_request_logger.h index 8ac7f630d69..4f7a7162487 100644 --- a/tensorflow_serving/core/server_request_logger.h +++ b/tensorflow_serving/core/server_request_logger.h @@ -21,6 +21,7 @@ limitations under the License. #include #include #include +#include #include "google/protobuf/message.h" #include "tensorflow/core/lib/core/status.h" @@ -57,9 +58,12 @@ class ServerRequestLogger { // request_logger_creator, this will return an error if a non-empty // logging_config_map is passed in. virtual Status Update( - const std::map& logging_config_map); + const std::map>& logging_config_map); // Similar to RequestLogger::Log(). + // + // If request is logged/written to multiple sinks, we return error from + // the first failed write (and continue attempting to write to all). virtual Status Log(const google::protobuf::Message& request, const google::protobuf::Message& response, const LogMetadata& log_metadata); @@ -68,7 +72,8 @@ class ServerRequestLogger { explicit ServerRequestLogger(LoggerCreator request_logger_creator); private: - using StringToRequestLoggerMap = std::unordered_map; + using StringToRequestLoggersMap = + std::unordered_map>; using StringToUniqueRequestLoggerMap = std::unordered_map>; @@ -85,15 +90,15 @@ class ServerRequestLogger { // Mutex to ensure concurrent calls to Update() are serialized. mutable mutex update_mu_; - // A map from serialized model config to its corresponding RequestLogger. - // If two models have the same logging config, they will share the - // RequestLogger. + // A map from serialized model logging config to its corresponding + // RequestLogger. If two models have the same logging config, they + // will share the RequestLogger. // This is only used during calls to Update(). StringToUniqueRequestLoggerMap config_to_logger_map_; - // A map from model_name to its corresponding RequestLogger. + // A map from model_name to its corresponding RequestLoggers. // The RequestLoggers are owned by config_to_logger_map_. - FastReadDynamicPtr model_to_logger_map_; + FastReadDynamicPtr model_to_loggers_map_; LoggerCreator request_logger_creator_; }; diff --git a/tensorflow_serving/core/server_request_logger_test.cc b/tensorflow_serving/core/server_request_logger_test.cc index 28920f8fdba..2ea79091631 100644 --- a/tensorflow_serving/core/server_request_logger_test.cc +++ b/tensorflow_serving/core/server_request_logger_test.cc @@ -15,13 +15,16 @@ limitations under the License. #include "tensorflow_serving/core/server_request_logger.h" +#include #include #include +#include #include "google/protobuf/any.pb.h" #include "google/protobuf/message.h" #include #include +#include "absl/strings/str_cat.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/lib/core/status_test_util.h" @@ -53,14 +56,27 @@ LogCollectorConfig CreateLogCollectorConfig(const string& type, } std::pair CreateLoggingConfigForModel( - const string& model_name) { + const string& model_name, const string& log_filename_suffix = "") { + string filename_prefix = absl::StrCat("/file/", model_name); + if (!log_filename_suffix.empty()) { + absl::StrAppend(&filename_prefix, "-", log_filename_suffix); + } LoggingConfig logging_config; *logging_config.mutable_log_collector_config() = - CreateLogCollectorConfig("", strings::StrCat("/file/", model_name)); + CreateLogCollectorConfig("", filename_prefix); logging_config.mutable_sampling_config()->set_sampling_rate(1.0); return {model_name, logging_config}; } +std::map> CreateLoggingConfigMap( + const std::vector>& model_configs) { + std::map> config_map; + for (const auto& model_config : model_configs) { + config_map[model_config.first].push_back(model_config.second); + } + return config_map; +} + class ServerRequestLoggerTest : public ::testing::Test { protected: ServerRequestLoggerTest() { @@ -86,7 +102,7 @@ class ServerRequestLoggerTest : public ::testing::Test { std::unique_ptr* log) { *log = std::unique_ptr( new google::protobuf::Any()); - return Status::OK(); + return request_logger_status_cb_(); })); *request_logger = std::move(mock_request_logger); return Status::OK(); @@ -117,6 +133,9 @@ class ServerRequestLoggerTest : public ::testing::Test { mutable mutex m_; int created_logger_counter_ = 0; int deleted_logger_counter_ = 0; + std::function request_logger_status_cb_ = []() { + return Status::OK(); + }; std::unordered_map log_collector_map_; std::unique_ptr server_request_logger_; }; @@ -130,9 +149,8 @@ TEST_F(ServerRequestLoggerTest, Empty) { } TEST_F(ServerRequestLoggerTest, AbsentModel) { - std::map model_logging_configs; - model_logging_configs.insert(CreateLoggingConfigForModel("model0")); - TF_ASSERT_OK(server_request_logger_->Update(model_logging_configs)); + TF_ASSERT_OK(server_request_logger_->Update( + CreateLoggingConfigMap({CreateLoggingConfigForModel("model0")}))); LogMetadata log_metadata; auto* const model_spec = log_metadata.mutable_model_spec(); model_spec->set_name("absent_model"); @@ -143,10 +161,9 @@ TEST_F(ServerRequestLoggerTest, AbsentModel) { } TEST_F(ServerRequestLoggerTest, MultipleModels) { - std::map model_logging_configs; - model_logging_configs.insert(CreateLoggingConfigForModel("model0")); - model_logging_configs.insert(CreateLoggingConfigForModel("model1")); - TF_ASSERT_OK(server_request_logger_->Update(model_logging_configs)); + TF_ASSERT_OK(server_request_logger_->Update( + CreateLoggingConfigMap({CreateLoggingConfigForModel("model0"), + CreateLoggingConfigForModel("model1")}))); LogMetadata log_metadata0; auto* const model_spec0 = log_metadata0.mutable_model_spec(); @@ -168,8 +185,8 @@ TEST_F(ServerRequestLoggerTest, MultipleModels) { } TEST_F(ServerRequestLoggerTest, CreateAndDeleteLogger) { - std::map model_logging_configs; - model_logging_configs.insert(CreateLoggingConfigForModel("model0")); + auto model_logging_configs = + CreateLoggingConfigMap({CreateLoggingConfigForModel("model0")}); TF_ASSERT_OK(server_request_logger_->Update(model_logging_configs)); EXPECT_EQ(1, created_logger_counter()); EXPECT_EQ(0, deleted_logger_counter()); @@ -181,14 +198,15 @@ TEST_F(ServerRequestLoggerTest, CreateAndDeleteLogger) { } TEST_F(ServerRequestLoggerTest, CreateAndModifyLogger) { - std::map model_logging_configs; - model_logging_configs.insert(CreateLoggingConfigForModel("model0")); + auto model_logging_configs = + CreateLoggingConfigMap({CreateLoggingConfigForModel("model0")}); TF_ASSERT_OK(server_request_logger_->Update(model_logging_configs)); EXPECT_EQ(1, created_logger_counter()); EXPECT_EQ(0, deleted_logger_counter()); - model_logging_configs["model0"].mutable_sampling_config()->set_sampling_rate( - 0.17); + model_logging_configs["model0"][0] + .mutable_sampling_config() + ->set_sampling_rate(0.17); TF_ASSERT_OK(server_request_logger_->Update(model_logging_configs)); EXPECT_EQ(2, created_logger_counter()); @@ -196,23 +214,77 @@ TEST_F(ServerRequestLoggerTest, CreateAndModifyLogger) { } TEST_F(ServerRequestLoggerTest, SameConfigForTwoModelsCreatesOneLogger) { - std::map model_logging_configs; std::pair model_and_config1 = CreateLoggingConfigForModel("model"); std::pair model_and_config2 = { "model2", model_and_config1.second}; - model_logging_configs.insert(model_and_config1); - model_logging_configs.insert(model_and_config2); - TF_ASSERT_OK(server_request_logger_->Update(model_logging_configs)); + TF_ASSERT_OK(server_request_logger_->Update( + CreateLoggingConfigMap({model_and_config1, model_and_config2}))); EXPECT_EQ(1, created_logger_counter()); EXPECT_EQ(0, deleted_logger_counter()); } +TEST_F(ServerRequestLoggerTest, MultipleConfigForOneModel) { + TF_ASSERT_OK(server_request_logger_->Update(CreateLoggingConfigMap( + {CreateLoggingConfigForModel("model0"), + CreateLoggingConfigForModel("model0", "infra")}))); + EXPECT_EQ(2, created_logger_counter()); + EXPECT_EQ(0, deleted_logger_counter()); +} + +TEST_F(ServerRequestLoggerTest, MultipleLoggersForOneModel) { + TF_ASSERT_OK(server_request_logger_->Update(CreateLoggingConfigMap( + {CreateLoggingConfigForModel("model0"), + CreateLoggingConfigForModel("model0", "infra")}))); + + LogMetadata log_metadata0; + auto* const model_spec0 = log_metadata0.mutable_model_spec(); + model_spec0->set_name("model0"); + TF_ASSERT_OK(server_request_logger_->Log(PredictRequest(), PredictResponse(), + log_metadata0)); + ASSERT_EQ(2, log_collector_map_.size()); + EXPECT_EQ(1, log_collector_map_["/file/model0"]->collect_count()); + EXPECT_EQ(1, log_collector_map_["/file/model0-infra"]->collect_count()); + + LogMetadata log_metadata1; + auto* const model_spec = log_metadata1.mutable_model_spec(); + model_spec->set_name("model1"); + TF_ASSERT_OK(server_request_logger_->Log(PredictRequest(), PredictResponse(), + log_metadata1)); + ASSERT_EQ(2, log_collector_map_.size()); + EXPECT_EQ(1, log_collector_map_["/file/model0"]->collect_count()); + EXPECT_EQ(1, log_collector_map_["/file/model0-infra"]->collect_count()); + EXPECT_EQ(log_collector_map_.end(), log_collector_map_.find("/file/model1")); +} + +TEST_F(ServerRequestLoggerTest, MultipleLoggersOneModelErrors) { + TF_ASSERT_OK(server_request_logger_->Update(CreateLoggingConfigMap( + {CreateLoggingConfigForModel("model0"), + CreateLoggingConfigForModel("model0", "infra")}))); + + // Inject errors for all Log() calls. + int req_count = 0; + request_logger_status_cb_ = [&]() { + return errors::InvalidArgument(absl::StrCat(req_count++)); + }; + + LogMetadata log_metadata0; + auto* const model_spec0 = log_metadata0.mutable_model_spec(); + model_spec0->set_name("model0"); + EXPECT_EQ(errors::InvalidArgument("0"), + server_request_logger_->Log(PredictRequest(), PredictResponse(), + log_metadata0)); + + ASSERT_EQ(2, log_collector_map_.size()); + EXPECT_EQ(0, log_collector_map_["/file/model0"]->collect_count()); + EXPECT_EQ(0, log_collector_map_["/file/model0-infra"]->collect_count()); +} + TEST_F(ServerRequestLoggerTest, MultipleUpdatesSingleCreation) { - std::map model_logging_configs; - model_logging_configs.insert(CreateLoggingConfigForModel("model0")); - model_logging_configs.insert(CreateLoggingConfigForModel("model1")); + const auto& model_logging_configs = + CreateLoggingConfigMap({CreateLoggingConfigForModel("model0"), + CreateLoggingConfigForModel("model1")}); for (int i = 0; i < 100; i++) { TF_ASSERT_OK(server_request_logger_->Update(model_logging_configs)); } diff --git a/tensorflow_serving/core/test_util/mock_server_request_logger.h b/tensorflow_serving/core/test_util/mock_server_request_logger.h index 7460c39c059..0104a0e285b 100644 --- a/tensorflow_serving/core/test_util/mock_server_request_logger.h +++ b/tensorflow_serving/core/test_util/mock_server_request_logger.h @@ -17,6 +17,7 @@ limitations under the License. #define TENSORFLOW_SERVING_CORE_TEST_UTIL_MOCK_SERVER_REQUEST_LOGGER_H_ #include +#include #include #include "tensorflow_serving/core/server_request_logger.h" @@ -29,9 +30,9 @@ class MockServerRequestLogger : public ServerRequestLogger { public: MockServerRequestLogger() : ServerRequestLogger({}) {} - MOCK_METHOD1( - Update, - Status(const std::map& logging_config_map)); + MOCK_METHOD1(Update, + Status(const std::map>& + logging_config_map)); MOCK_METHOD3(Log, Status(const google::protobuf::Message& request, const google::protobuf::Message& response, diff --git a/tensorflow_serving/model_servers/server_core.cc b/tensorflow_serving/model_servers/server_core.cc index 4c29f0587b4..66d41a0eb75 100644 --- a/tensorflow_serving/model_servers/server_core.cc +++ b/tensorflow_serving/model_servers/server_core.cc @@ -16,6 +16,7 @@ limitations under the License. #include "tensorflow_serving/model_servers/server_core.h" #include +#include #include "google/protobuf/any.pb.h" #include "google/protobuf/wrappers.pb.h" @@ -411,11 +412,11 @@ Status ServerCore::MaybeUpdateServerRequestLogger( } if (config_case == ModelServerConfig::kModelConfigList) { - std::map logging_config_map; + std::map> logging_config_map; for (const auto& model_config : config_.model_config_list().config()) { if (model_config.has_logging_config()) { logging_config_map.insert( - {model_config.name(), model_config.logging_config()}); + {model_config.name(), {model_config.logging_config()}}); } } return options_.server_request_logger->Update(logging_config_map); From d233a82e0a569d5ccd23a0cbada8099644698dc6 Mon Sep 17 00:00:00 2001 From: "G. Hussain Chinoy" Date: Wed, 6 Mar 2019 16:27:20 -0700 Subject: [PATCH 2808/8103] Updates README with link to architecture overview --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 43f7b604a0f..7dfc0a93bb5 100644 --- a/README.md +++ b/README.md @@ -52,5 +52,5 @@ See [install instructions](tensorflow_serving/g3doc/setup.md). ## For more information -* [Serving architecture overview](tensorflow_serving/g3doc/overview.md) +* [Serving architecture overview](tensorflow_serving/g3doc/architecture.md) * [TensorFlow website](http://tensorflow.org) From cbf3fce754b24ea1df088de8354961912692751a Mon Sep 17 00:00:00 2001 From: mingmingl Date: Fri, 8 Mar 2019 15:04:40 -0800 Subject: [PATCH 2809/8103] Correct one typo in directory path. PiperOrigin-RevId: 237526735 --- tensorflow_serving/g3doc/api_rest.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/g3doc/api_rest.md b/tensorflow_serving/g3doc/api_rest.md index 058f58dfbbb..093acff4a22 100644 --- a/tensorflow_serving/g3doc/api_rest.md +++ b/tensorflow_serving/g3doc/api_rest.md @@ -414,7 +414,7 @@ Start the ModelServer with `--rest_api_port` option to export REST API endpoint: ```shell $ tensorflow_model_server --rest_api_port=8501 \ --model_name=half_plus_three \ - --model_base_path=$(pwd)/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_three/ + --model_base_path=$(pwd)/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_three/ ``` ### Make REST API calls to ModelServer From dd59021d3f807f23390afa8a2bc34a6f7029ed24 Mon Sep 17 00:00:00 2001 From: awk Date: Fri, 8 Mar 2019 15:32:58 -0800 Subject: [PATCH 2810/8103] Add -o option, to pass params to `docker` command. PiperOrigin-RevId: 237531813 --- tools/run_in_docker.sh | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/tools/run_in_docker.sh b/tools/run_in_docker.sh index 54a912be7f5..ee64f6ed830 100755 --- a/tools/run_in_docker.sh +++ b/tools/run_in_docker.sh @@ -39,7 +39,7 @@ set -e function usage() { local progname=$(basename $0) echo "Usage:" - echo " ${progname} [-d ] [args ...]" + echo " ${progname} [-d ] [-o ] [args ...]" echo "" echo "Examples:" echo " ${progname} bazel build tensorflow_serving/model_servers:tensorflow_model_server" @@ -68,13 +68,21 @@ function get_python_cmd() { } (( $# < 1 )) && usage -[[ "$1" = "-"* ]] && [[ "$1" != "-d" ]] && usage IMAGE="tensorflow/serving:nightly-devel" -[[ "$1" = "-d" ]] && IMAGE=$2 && shift 2 || true -[[ "${IMAGE}" = "" ]] && usage +RUN_OPTS=() +while [[ $# > 1 ]]; do + case "$1" in + -d) + IMAGE="$2"; shift 2;; + -o) + RUN_OPTS=($2); shift 2;; + *) + break;; + esac +done -RUN_OPTS=(--rm -it --network=host) +RUN_OPTS+=(--rm -it --network=host) # Map the working directory and /tmp to allow scripts/binaries to run and also # output data that might be used by other scripts/binaries RUN_OPTS+=("-v $(pwd):$(pwd)") From 7acaec7c594cddfe2f06b6536c579b1b58078807 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Mar 2019 17:42:45 -0800 Subject: [PATCH 2811/8103] Change SerializedExampleListWithContext dependency. PiperOrigin-RevId: 237551105 --- tensorflow_serving/apis/internal/BUILD | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tensorflow_serving/apis/internal/BUILD b/tensorflow_serving/apis/internal/BUILD index 1e46511dec1..6416d42000f 100644 --- a/tensorflow_serving/apis/internal/BUILD +++ b/tensorflow_serving/apis/internal/BUILD @@ -15,6 +15,10 @@ serving_proto_library( name = "serialized_input_proto", srcs = ["serialized_input.proto"], cc_api_version = 2, + visibility = [ + "//tensorflow_serving:internal", + "@org_tensorflow//tensorflow_ranking/google:__pkg__", + ], deps = [ ], ) From e384bf406a5411a0539973c4c3aa13f0f889ebb3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Mar 2019 12:12:53 -0700 Subject: [PATCH 2812/8103] Add servable_name to debugging log. PiperOrigin-RevId: 238068691 --- tensorflow_serving/core/aspired_versions_manager.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/core/aspired_versions_manager.cc b/tensorflow_serving/core/aspired_versions_manager.cc index b5e1059ecf3..738fd33f4b1 100644 --- a/tensorflow_serving/core/aspired_versions_manager.cc +++ b/tensorflow_serving/core/aspired_versions_manager.cc @@ -238,7 +238,7 @@ void AspiredVersionsManager::EnqueueAspiredVersionsRequest( { mutex_lock l(pending_aspired_versions_requests_mu_); - VLOG(1) << "Enqueueing aspired versions request: " + VLOG(1) << "Enqueueing aspired versions request: " << servable_name << ": " << ServableVersionsDebugString(versions); pending_aspired_versions_requests_[string(servable_name)] = std::move(versions); @@ -248,7 +248,7 @@ void AspiredVersionsManager::EnqueueAspiredVersionsRequest( void AspiredVersionsManager::ProcessAspiredVersionsRequest( const StringPiece servable_name, std::vector>> versions) { - VLOG(1) << "Processing aspired versions request: " + VLOG(1) << "Processing aspired versions request: " << servable_name << ": " << ServableVersionsDebugString(versions); const std::set next_aspired_versions = GetVersionNumbers(versions); From fa9752fde1b24ec4d49578071cedb9eeb543cd24 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 18 Mar 2019 09:51:00 -0700 Subject: [PATCH 2813/8103] Replace default_python_version with python_version. PiperOrigin-RevId: 239004018 --- tensorflow_serving/servables/tensorflow/testdata/BUILD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/servables/tensorflow/testdata/BUILD b/tensorflow_serving/servables/tensorflow/testdata/BUILD index 543637eb666..1e8c59b0e9c 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/BUILD +++ b/tensorflow_serving/servables/tensorflow/testdata/BUILD @@ -62,7 +62,7 @@ py_binary( srcs = [ "export_counter.py", ], - default_python_version = "PY3", + python_version = "PY3", srcs_version = "PY3", deps = [ "@org_tensorflow//tensorflow:tensorflow_py", From a316dfb3bbaf7aff5afa4663ad679f46d431a6b3 Mon Sep 17 00:00:00 2001 From: mingmingl Date: Wed, 20 Mar 2019 11:59:37 -0700 Subject: [PATCH 2814/8103] Switch back to default_python_version() for bazel 0.20.0 compatibility. PiperOrigin-RevId: 239445736 --- tensorflow_serving/servables/tensorflow/testdata/BUILD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/servables/tensorflow/testdata/BUILD b/tensorflow_serving/servables/tensorflow/testdata/BUILD index 1e8c59b0e9c..543637eb666 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/BUILD +++ b/tensorflow_serving/servables/tensorflow/testdata/BUILD @@ -62,7 +62,7 @@ py_binary( srcs = [ "export_counter.py", ], - python_version = "PY3", + default_python_version = "PY3", srcs_version = "PY3", deps = [ "@org_tensorflow//tensorflow:tensorflow_py", From f04e583a6a700a4943a57b6758b3e131b0865e97 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Mar 2019 14:37:00 -0700 Subject: [PATCH 2815/8103] Stop using reader locks (tf_shared_lock) on the read path of FastReadDynamicPtr. For use cases where readers do very little work, the extra contention induced by taking read locks (CAS looping on reader count) can make things slower than just regular mutex locking. For use cases with a modest amount of work (representative of model server use cases), our benchmarks found the best case scenario to be about even. PiperOrigin-RevId: 239477077 --- tensorflow_serving/util/BUILD | 3 ++- .../util/fast_read_dynamic_ptr.h | 5 ++++- .../util/fast_read_dynamic_ptr_benchmark.cc | 21 ++++++++++--------- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/tensorflow_serving/util/BUILD b/tensorflow_serving/util/BUILD index f793ebe81d1..efc1087c177 100644 --- a/tensorflow_serving/util/BUILD +++ b/tensorflow_serving/util/BUILD @@ -148,10 +148,11 @@ cc_test( srcs = ["fast_read_dynamic_ptr_benchmark.cc"], deps = [ ":fast_read_dynamic_ptr", + "@com_google_absl//absl/time", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:tensorflow", "@org_tensorflow//tensorflow/core:test", - "@org_tensorflow//tensorflow/core/kernels/batching_util:periodic_function", + "@org_tensorflow//tensorflow/core/kernels/batching_util:periodic_function_dynamic", ], ) diff --git a/tensorflow_serving/util/fast_read_dynamic_ptr.h b/tensorflow_serving/util/fast_read_dynamic_ptr.h index 5ec0fc386ac..6ba95274f77 100644 --- a/tensorflow_serving/util/fast_read_dynamic_ptr.h +++ b/tensorflow_serving/util/fast_read_dynamic_ptr.h @@ -204,7 +204,10 @@ std::unique_ptr FastReadDynamicPtr::Update(std::unique_ptr object) { template typename FastReadDynamicPtr::ReadPtr FastReadDynamicPtr::get() const { - tf_shared_lock lock(mutex_); + // Note: tf_shared_lock (a reader/writer lock vs a normal mutex lock) was + // found to generally perform worse in our benchmarks. Before changing this + // back to a reader lock, please do careful benchmarks. + mutex_lock lock(mutex_); return object_->reference(); } diff --git a/tensorflow_serving/util/fast_read_dynamic_ptr_benchmark.cc b/tensorflow_serving/util/fast_read_dynamic_ptr_benchmark.cc index 5ce49c4d394..61af6f0943c 100644 --- a/tensorflow_serving/util/fast_read_dynamic_ptr_benchmark.cc +++ b/tensorflow_serving/util/fast_read_dynamic_ptr_benchmark.cc @@ -38,6 +38,8 @@ limitations under the License. #include #include +#include "absl/time/clock.h" +#include "absl/time/time.h" #include "tensorflow/core/kernels/batching_util/periodic_function.h" #include "tensorflow/core/lib/core/notification.h" #include "tensorflow/core/lib/core/threadpool.h" @@ -50,8 +52,12 @@ limitations under the License. namespace tensorflow { namespace serving { +namespace { -typedef FastReadDynamicPtr FastReadIntPtr; +using FastReadIntPtr = FastReadDynamicPtr; + +// The amount of time to sleep for the cases where we simulate doing work. +constexpr absl::Duration kWorkSleepTime = absl::Milliseconds(5); // This class maintains all state for a benchmark and handles the concurrency // concerns around the concurrent read and update threads. @@ -146,17 +152,11 @@ void BenchmarkState::RunBenchmarkReads(int iters) { for (int i = 0; i < iters; i++) { std::shared_ptr current = fast_ptr_.get(); + int bigger = *current + 1; + testing::DoNotOptimize(bigger); if (do_work_) { - // Let's do some work, so that we are not just measuring contention in the - // mutex. - float count = 0; - for (int i = 1; i < 10000; ++i) { - count *= i; - } - CHECK_GE(count, 0); + absl::SleepFor(kWorkSleepTime); } - // Prevent compiler optimizing this away. - CHECK(*current != INT_MAX); } } @@ -252,6 +252,7 @@ BENCHMARK(BM_NoWork_FrequentUpdates_Reads) ->Arg(32) ->Arg(64); +} // namespace } // namespace serving } // namespace tensorflow From 5456ac57343a7962450eb80e9d4870dcb4b31ed4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Mar 2019 00:43:53 -0700 Subject: [PATCH 2816/8103] Clarify which model is being initialized. PiperOrigin-RevId: 239549766 --- .../servables/tensorflow/saved_model_warmup.cc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/saved_model_warmup.cc b/tensorflow_serving/servables/tensorflow/saved_model_warmup.cc index 9d1d81b98dd..2fa46116141 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_warmup.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_warmup.cc @@ -103,6 +103,7 @@ Status RunSavedModelWarmup(const RunOptions& run_options, return Status::OK(); } + LOG(INFO) << "Starting to read warmup data for model at " << warmup_path; std::unique_ptr tf_record_file; TF_RETURN_IF_ERROR(tensorflow::Env::Default()->NewRandomAccessFile( warmup_path, &tf_record_file)); @@ -132,8 +133,9 @@ Status RunSavedModelWarmup(const RunOptions& run_options, status = tf_record_file_reader->ReadRecord(&record); } + const auto warmup_latency = GetLatencyMicroseconds(start_microseconds); model_warm_up_latency->GetCell(export_dir, status.ToString()) - ->Add(GetLatencyMicroseconds(start_microseconds)); + ->Add(warmup_latency); // OUT_OF_RANGE error means EOF was reached, do not return error in this case if (!errors::IsOutOfRange(status)) { @@ -141,7 +143,8 @@ Status RunSavedModelWarmup(const RunOptions& run_options, } LOG(INFO) << "Finished reading warmup data for model at " << warmup_path - << ". Number of warmup records read: " << num_warmup_records << "."; + << ". Number of warmup records read: " << num_warmup_records + << ". Elapsed time (microseconds): " << warmup_latency << "."; return Status::OK(); } From 6320701645d5aeceac49a4f02cc629159559f143 Mon Sep 17 00:00:00 2001 From: awk Date: Thu, 21 Mar 2019 14:53:01 -0700 Subject: [PATCH 2817/8103] Add saved model tags to logging metadata. These tags are used by the model server to load the relevant metagraphdef for the model from its on-disk SavedModel directory (note, presently these tags are configured at the model server level, causing these to be applied to ALL the models loaded on the server process). Adding these tags, will allow us to identify queries destined to specific graphdef. Notably, it allows us to distinguish between queries sent to CPU/GPU/TPU models. This is required as same model name can be used across multiple hardware platforms (though the graphdef loaded will be different based on the tag). PiperOrigin-RevId: 239678955 --- tensorflow_serving/core/BUILD | 2 ++ tensorflow_serving/core/logging.proto | 5 ++++- tensorflow_serving/core/request_logger.cc | 7 +++++++ tensorflow_serving/core/request_logger.h | 3 +++ tensorflow_serving/core/request_logger_test.cc | 10 +++++++++- tensorflow_serving/core/server_request_logger_test.cc | 4 +++- .../core/test_util/mock_request_logger.h | 5 ++++- tensorflow_serving/model_servers/server_core_test.cc | 4 +++- 8 files changed, 35 insertions(+), 5 deletions(-) diff --git a/tensorflow_serving/core/BUILD b/tensorflow_serving/core/BUILD index e424882827d..105c892f67f 100644 --- a/tensorflow_serving/core/BUILD +++ b/tensorflow_serving/core/BUILD @@ -791,6 +791,7 @@ cc_test( "//tensorflow_serving/core/test_util:mock_request_logger", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", + "@org_tensorflow//tensorflow/cc/saved_model:tag_constants", "@org_tensorflow//tensorflow/core:lib", "@protobuf_archive//:protobuf", ], @@ -831,6 +832,7 @@ cc_test( "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", "@com_google_absl//absl/strings", + "@org_tensorflow//tensorflow/cc/saved_model:tag_constants", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:test", "@protobuf_archive//:cc_wkt_protos", diff --git a/tensorflow_serving/core/logging.proto b/tensorflow_serving/core/logging.proto index a8c756f310c..6298bb4b244 100644 --- a/tensorflow_serving/core/logging.proto +++ b/tensorflow_serving/core/logging.proto @@ -1,14 +1,17 @@ syntax = "proto3"; package tensorflow.serving; -option cc_enable_arenas = true; import "tensorflow_serving/apis/model.proto"; import "tensorflow_serving/config/logging_config.proto"; +option cc_enable_arenas = true; + // Metadata logged along with the request logs. message LogMetadata { ModelSpec model_spec = 1; SamplingConfig sampling_config = 2; + // List of tags used to load the relevant MetaGraphDef from SavedModel. + repeated string saved_model_tags = 3; // TODO(b/33279154): Add more metadata as mentioned in the bug. } diff --git a/tensorflow_serving/core/request_logger.cc b/tensorflow_serving/core/request_logger.cc index 8474957e44f..6db237aa955 100644 --- a/tensorflow_serving/core/request_logger.cc +++ b/tensorflow_serving/core/request_logger.cc @@ -16,6 +16,7 @@ limitations under the License. #include "tensorflow_serving/core/request_logger.h" #include +#include #include "tensorflow/core/lib/core/error_codes.pb.h" #include "tensorflow/core/lib/core/errors.h" @@ -35,8 +36,10 @@ auto* request_log_count = monitoring::Counter<2>::New( } RequestLogger::RequestLogger(const LoggingConfig& logging_config, + const std::vector& saved_model_tags, std::unique_ptr log_collector) : logging_config_(logging_config), + saved_model_tags_(saved_model_tags), log_collector_(std::move(log_collector)), uniform_sampler_() {} @@ -48,6 +51,10 @@ Status RequestLogger::Log(const google::protobuf::Message& request, LogMetadata log_metadata_with_config = log_metadata; *log_metadata_with_config.mutable_sampling_config() = logging_config_.sampling_config(); + if (!saved_model_tags_.empty()) { + *log_metadata_with_config.mutable_saved_model_tags() = { + saved_model_tags_.begin(), saved_model_tags_.end()}; + } if (uniform_sampler_.Sample(sampling_rate)) { const auto status = [&]() { std::unique_ptr log; diff --git a/tensorflow_serving/core/request_logger.h b/tensorflow_serving/core/request_logger.h index de9754d844f..de0c3293c99 100644 --- a/tensorflow_serving/core/request_logger.h +++ b/tensorflow_serving/core/request_logger.h @@ -17,6 +17,7 @@ limitations under the License. #define TENSORFLOW_SERVING_CORE_REQUEST_LOGGER_H_ #include +#include #include "google/protobuf/message.h" #include "tensorflow/core/lib/core/status.h" @@ -32,6 +33,7 @@ namespace serving { class RequestLogger { public: RequestLogger(const LoggingConfig& logging_config, + const std::vector& saved_model_tags, std::unique_ptr log_collector); virtual ~RequestLogger() = default; @@ -68,6 +70,7 @@ class RequestLogger { }; const LoggingConfig logging_config_; + const std::vector saved_model_tags_; std::unique_ptr log_collector_; UniformSampler uniform_sampler_; }; diff --git a/tensorflow_serving/core/request_logger_test.cc b/tensorflow_serving/core/request_logger_test.cc index 1ece4ef79d5..c2ba4cfd3a2 100644 --- a/tensorflow_serving/core/request_logger_test.cc +++ b/tensorflow_serving/core/request_logger_test.cc @@ -22,6 +22,7 @@ limitations under the License. #include "google/protobuf/message.h" #include #include +#include "tensorflow/cc/saved_model/tag_constants.h" #include "tensorflow/core/framework/tensor.pb.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/lib/core/status.h" @@ -45,6 +46,8 @@ using ::testing::Invoke; using ::testing::NiceMock; using ::testing::Return; +constexpr char kSavedModelTags[] = "server,tpu"; + class RequestLoggerTest : public ::testing::Test { protected: RequestLoggerTest() { @@ -52,9 +55,12 @@ class RequestLoggerTest : public ::testing::Test { logging_config.mutable_sampling_config()->set_sampling_rate(1.0); log_collector_ = new NiceMock(); request_logger_ = std::unique_ptr>( - new NiceMock(logging_config, log_collector_)); + new NiceMock(logging_config, model_tags_, + log_collector_)); } + const std::vector model_tags_ = {kSavedModelTagServe, + kSavedModelTagTpu}; NiceMock* log_collector_; std::unique_ptr> request_logger_; }; @@ -83,6 +89,8 @@ TEST_F(RequestLoggerTest, Simple) { test_util::EqualsProto(PredictResponse())); LogMetadata expected_log_metadata = log_metadata; expected_log_metadata.mutable_sampling_config()->set_sampling_rate(1.0); + *expected_log_metadata.mutable_saved_model_tags() = { + model_tags_.begin(), model_tags_.end()}; EXPECT_THAT(actual_log_metadata, test_util::EqualsProto(expected_log_metadata)); *log = diff --git a/tensorflow_serving/core/server_request_logger_test.cc b/tensorflow_serving/core/server_request_logger_test.cc index 2ea79091631..ad2bca95e4e 100644 --- a/tensorflow_serving/core/server_request_logger_test.cc +++ b/tensorflow_serving/core/server_request_logger_test.cc @@ -25,6 +25,7 @@ limitations under the License. #include #include #include "absl/strings/str_cat.h" +#include "tensorflow/cc/saved_model/tag_constants.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/lib/core/status_test_util.h" @@ -90,10 +91,11 @@ class ServerRequestLoggerTest : public ::testing::Test { auto logger_destruction_notifier = [this]() { increment_deleted_logger_counter(); }; + const std::vector& tags = {kSavedModelTagServe}; auto mock_request_logger = std::unique_ptr>( new NiceMock( - logging_config, log_collector_map_[filename_prefix], + logging_config, tags, log_collector_map_[filename_prefix], logger_destruction_notifier)); ON_CALL(*mock_request_logger, CreateLogMessage(_, _, _, _)) .WillByDefault(Invoke([&](const google::protobuf::Message& actual_request, diff --git a/tensorflow_serving/core/test_util/mock_request_logger.h b/tensorflow_serving/core/test_util/mock_request_logger.h index 922681c6ba7..11961e3a30d 100644 --- a/tensorflow_serving/core/test_util/mock_request_logger.h +++ b/tensorflow_serving/core/test_util/mock_request_logger.h @@ -16,6 +16,8 @@ limitations under the License. #ifndef TENSORFLOW_SERVING_CORE_TEST_UTIL_MOCK_REQUEST_LOGGER_H_ #define TENSORFLOW_SERVING_CORE_TEST_UTIL_MOCK_REQUEST_LOGGER_H_ +#include + #include "google/protobuf/message.h" #include #include "tensorflow/core/lib/core/status.h" @@ -32,10 +34,11 @@ class MockRequestLogger : public RequestLogger { // Unfortunately NiceMock doesn't support ctors with move-only types, so we // have to do this workaround. MockRequestLogger(const LoggingConfig& logging_config, + const std::vector& saved_model_tags, LogCollector* log_collector, std::function notify_destruction = std::function()) - : RequestLogger(logging_config, + : RequestLogger(logging_config, saved_model_tags, std::unique_ptr(log_collector)), notify_destruction_(std::move(notify_destruction)) {} diff --git a/tensorflow_serving/model_servers/server_core_test.cc b/tensorflow_serving/model_servers/server_core_test.cc index ca9e956c3ac..f64416329e2 100644 --- a/tensorflow_serving/model_servers/server_core_test.cc +++ b/tensorflow_serving/model_servers/server_core_test.cc @@ -16,6 +16,7 @@ limitations under the License. #include "tensorflow_serving/model_servers/server_core.h" #include "google/protobuf/any.pb.h" +#include "tensorflow/cc/saved_model/tag_constants.h" #include "tensorflow/core/lib/core/error_codes.pb.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/lib/core/status_test_util.h" @@ -590,9 +591,10 @@ TEST_P(ServerCoreTest, RequestLoggingOn) { const string& filename_prefix = logging_config.log_collector_config().filename_prefix(); log_collector_map[filename_prefix] = new FakeLogCollector(); + const std::vector& tags = {kSavedModelTagServe}; auto mock_request_logger = std::unique_ptr>( new NiceMock( - logging_config, log_collector_map[filename_prefix])); + logging_config, tags, log_collector_map[filename_prefix])); ON_CALL(*mock_request_logger, CreateLogMessage(_, _, _, _)) .WillByDefault(Invoke([&](const google::protobuf::Message& actual_request, const google::protobuf::Message& actual_response, From c283ea580e4a51ececfacaa2b255fd0bb751c9ab Mon Sep 17 00:00:00 2001 From: awk Date: Thu, 21 Mar 2019 18:59:00 -0700 Subject: [PATCH 2818/8103] Updates Apple platform config settings and allows TF serving to build against TF head sources. This change replicates TF bazelrc change [0], as such configs are not picked/applied from external repos (TF is external to TF Serving), at bazel build time. [0] https://github.com/tensorflow/tensorflow/commit/dc34ddc6ddcc0581050322a98abbfc19203484e4 PiperOrigin-RevId: 239719689 --- .bazelrc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.bazelrc b/.bazelrc index bcc008657e6..9ce62fe2046 100644 --- a/.bazelrc +++ b/.bazelrc @@ -29,6 +29,9 @@ build --genrule_strategy=standalone build --define=grpc_no_ares=true +# Sets the default Apple platform to macOS. +build --apple_platform_type=macos + build -c opt # Adding --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0" creates parity with TF @@ -36,4 +39,4 @@ build -c opt # copy-on-write semantics of std::strings of the older ABI. build --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0 -build --workspace_status_command=/proc/self/cwd/tools/gen_status_stamp.sh \ No newline at end of file +build --workspace_status_command=/proc/self/cwd/tools/gen_status_stamp.sh From d015eeb5f5c7bee94b690a3b7ca9844a72ab1b26 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Mar 2019 20:02:11 -0700 Subject: [PATCH 2819/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 239725489 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 55c0a25baef..4d2d805ac5d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "95f9897d008b3bed0ba34610dd39f0c36168ca00de54ebf08f827b5a37cab93f", - git_commit = "8fa58e776283de8d1e877fe6d57d6a3f6e4dc556", + sha256 = "0dd56b470a495c5cff563e01865a77acd1e0b9ab6c1a81888c2b28b94cc3bdec", + git_commit = "9eb453a230590d49478c716b6bb5ace09d33087c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a1dac2c1eaa739ac920894acf68de9bb06d2bd60 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Mar 2019 21:02:10 -0700 Subject: [PATCH 2820/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 239731074 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4d2d805ac5d..cb5540ff2f7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0dd56b470a495c5cff563e01865a77acd1e0b9ab6c1a81888c2b28b94cc3bdec", - git_commit = "9eb453a230590d49478c716b6bb5ace09d33087c", + sha256 = "baf1981f5d94d40b16790ab300c3d212f7903e997f9e9f0588ec0ca965a4fad4", + git_commit = "62b52262b1fc9907300c0d41889ea2a97541546a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d4187d8d415b4b99307845faa73783b3d1bcdcfe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Mar 2019 22:02:12 -0700 Subject: [PATCH 2821/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 239736383 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cb5540ff2f7..d6f107871ce 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "baf1981f5d94d40b16790ab300c3d212f7903e997f9e9f0588ec0ca965a4fad4", - git_commit = "62b52262b1fc9907300c0d41889ea2a97541546a", + sha256 = "c34fefc077a697a743355012e9dfa687c4c96d4b34fe7e6d03608106bc0d8343", + git_commit = "50b3d0f00f089a8a1d3297204d6f022c31fe74be", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 175491154ea1064fd7710fd530e5e3c9e0561d7b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Mar 2019 23:02:51 -0700 Subject: [PATCH 2822/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 239741762 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d6f107871ce..c6fa49434ce 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c34fefc077a697a743355012e9dfa687c4c96d4b34fe7e6d03608106bc0d8343", - git_commit = "50b3d0f00f089a8a1d3297204d6f022c31fe74be", + sha256 = "50c2e9baf731d41a1099d87fcc1087ebc510b80f4b0a9f2bee6908f02139b2ef", + git_commit = "0ec5db4091723e5c88645552d0b5fb214698dc3a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3b444e7d5f67ae4ddda42f5d568e0bfed2c5b4c3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Mar 2019 00:03:47 -0700 Subject: [PATCH 2823/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 239746660 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c6fa49434ce..0714eb215bc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "50c2e9baf731d41a1099d87fcc1087ebc510b80f4b0a9f2bee6908f02139b2ef", - git_commit = "0ec5db4091723e5c88645552d0b5fb214698dc3a", + sha256 = "1a9c83a69735ce7496d7111748de64a3a00e0ec63bdcc7b2342451cecb822fd2", + git_commit = "139780745cae8f5841bb094b793a493266a8e6b3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7c3d7e51ae81f368cb13894da049d02c57236f1f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Mar 2019 01:02:03 -0700 Subject: [PATCH 2824/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 239752223 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0714eb215bc..ad5013c76ff 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1a9c83a69735ce7496d7111748de64a3a00e0ec63bdcc7b2342451cecb822fd2", - git_commit = "139780745cae8f5841bb094b793a493266a8e6b3", + sha256 = "902d98a5e7345d60b9742bfa4342b0aa138816ba4c2e011b55614afc515afc96", + git_commit = "684e02e03fb926ed0ad862a3fa5f611a77a4422b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f2804a6eaba7cfc2163d8dd0cbda91c215d4e185 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Mar 2019 02:02:21 -0700 Subject: [PATCH 2825/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 239758633 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ad5013c76ff..9999ae55023 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "902d98a5e7345d60b9742bfa4342b0aa138816ba4c2e011b55614afc515afc96", - git_commit = "684e02e03fb926ed0ad862a3fa5f611a77a4422b", + sha256 = "29642ae32531d327de967fc716283d7a92e5cef5508c27934610c8758d5e7802", + git_commit = "76e879d1c18c74ee5cbc5a1162ff254a0cfb221b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8618491829e68784d95aac55e8636059c705a0b4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Mar 2019 04:04:22 -0700 Subject: [PATCH 2826/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 239770814 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9999ae55023..0d451c07f32 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "29642ae32531d327de967fc716283d7a92e5cef5508c27934610c8758d5e7802", - git_commit = "76e879d1c18c74ee5cbc5a1162ff254a0cfb221b", + sha256 = "e0b078e27020de92706ac3545c86080f657ab5f00e39fdcafacf2879b6fe755a", + git_commit = "f5e0f9d520260b3a6009a9e792cf2316dc37b8e3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7efa3188ea73620faf2143c6d7734c006c2c6842 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Mar 2019 10:07:26 -0700 Subject: [PATCH 2827/8103] Fix proto example in the doc. PiperOrigin-RevId: 239815222 --- tensorflow_serving/apis/input.proto | 36 +++++++++++++++++------------ 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/tensorflow_serving/apis/input.proto b/tensorflow_serving/apis/input.proto index 2fffb526fcf..e47ff43d744 100644 --- a/tensorflow_serving/apis/input.proto +++ b/tensorflow_serving/apis/input.proto @@ -26,31 +26,37 @@ message ExampleList { // to perform some inference on. // // context: { -// feature: { -// key : "query" -// value: { -// bytes_list: { -// value: [ "pizza" ] +// features: { +// feature: { +// key : "query" +// value: { +// bytes_list: { +// value: [ "pizza" ] +// } // } // } // } // } // examples: { -// feature: { -// key : "cuisine" -// value: { -// bytes_list: { -// value: [ "Pizzeria" ] +// features: { +// feature: { +// key : "cuisine" +// value: { +// bytes_list: { +// value: [ "Pizzeria" ] +// } // } // } // } // } // examples: { -// feature: { -// key : "cuisine" -// value: { -// bytes_list: { -// value: [ "Taqueria" ] +// features: { +// feature: { +// key : "cuisine" +// value: { +// bytes_list: { +// value: [ "Taqueria" ] +// } // } // } // } From 8416073cc44ddab1ca0eca7fbc4b6159431f21eb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Mar 2019 11:02:28 -0700 Subject: [PATCH 2828/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 239826300 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0d451c07f32..e46e450fe0b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e0b078e27020de92706ac3545c86080f657ab5f00e39fdcafacf2879b6fe755a", - git_commit = "f5e0f9d520260b3a6009a9e792cf2316dc37b8e3", + sha256 = "a561875f08456630f2162139eddba70f2888777d5bd736ce7788df99038bde1b", + git_commit = "02b669895933d6e098f8ba1ce7ced675c818d163", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a5fc8bbc20f712fd6c4c148ff4d94a9231b79ceb Mon Sep 17 00:00:00 2001 From: awk Date: Fri, 22 Mar 2019 11:52:01 -0700 Subject: [PATCH 2829/8103] Update example section to use Docker PiperOrigin-RevId: 239836176 --- tensorflow_serving/g3doc/api_rest.md | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/tensorflow_serving/g3doc/api_rest.md b/tensorflow_serving/g3doc/api_rest.md index 093acff4a22..fa3a648cc12 100644 --- a/tensorflow_serving/g3doc/api_rest.md +++ b/tensorflow_serving/g3doc/api_rest.md @@ -399,9 +399,8 @@ model to see REST APIs in action. ### Start ModelServer with the REST API endpoint -Follow [setup instructions](https://www.tensorflow.org/serving/setup) to install -TensorFlow ModelServer on your system. Then download the `half_plus_three` model -from [git repository](https://github.com/tensorflow/serving): +Download the `half_plus_three` model from +[git repository](https://github.com/tensorflow/serving): ```shell $ mkdir -p /tmp/tfserving @@ -409,12 +408,21 @@ $ cd /tmp/tfserving $ git clone --depth=1 https://github.com/tensorflow/serving ``` -Start the ModelServer with `--rest_api_port` option to export REST API endpoint: +We will use Docker to run the ModelServer. If you want to install ModelServer +natively on your system, follow +[setup instructions](https://www.tensorflow.org/serving/setup) to install +instead, and start the ModelServer with `--rest_api_port` option to export +REST API endpoint (this is not needed when using Docker). ```shell -$ tensorflow_model_server --rest_api_port=8501 \ - --model_name=half_plus_three \ - --model_base_path=$(pwd)/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_three/ +$ cd /tmp/tfserving +$ docker pull tensorflow/serving:latest +$ docker run --rm -p 8501:8501 \ + --mount type=bind,source=$(pwd),target=$(pwd) \ + -e MODEL_BASE_PATH=$(pwd)/serving/tensorflow_serving/servables/tensorflow/testdata \ + -e MODEL_NAME=saved_model_half_plus_three -t tensorflow/serving:latest +... +.... Exporting HTTP/REST API at:localhost:8501 ... ``` ### Make REST API calls to ModelServer @@ -424,7 +432,7 @@ In a different terminal, use the `curl` tool to make REST API calls. Get status of the model as follows: ``` -$ curl http://localhost:8501/v1/models/half_plus_three +$ curl http://localhost:8501/v1/models/saved_model_half_plus_three { "model_version_status": [ { @@ -442,7 +450,7 @@ $ curl http://localhost:8501/v1/models/half_plus_three A `predict` call would look as follows: ```shell -$ curl -d '{"instances": [1.0,2.0,5.0]}' -X POST http://localhost:8501/v1/models/half_plus_three:predict +$ curl -d '{"instances": [1.0,2.0,5.0]}' -X POST http://localhost:8501/v1/models/saved_model_half_plus_three:predict { "predictions": [3.5, 4.0, 5.5] } @@ -452,7 +460,7 @@ And a `regress` call looks as follows: ```shell $ curl -d '{"signature_name": "tensorflow/serving/regress", "examples": [{"x": 1.0}, {"x": 2.0}]}' \ - -X POST http://localhost:8501/v1/models/half_plus_three:regress + -X POST http://localhost:8501/v1/models/saved_model_half_plus_three:regress { "results": [3.5, 4.0] } From f74c54b08b22df956f3b6c3630884828c529682b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Mar 2019 12:02:28 -0700 Subject: [PATCH 2830/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 239838175 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e46e450fe0b..7bd80ead7a6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a561875f08456630f2162139eddba70f2888777d5bd736ce7788df99038bde1b", - git_commit = "02b669895933d6e098f8ba1ce7ced675c818d163", + sha256 = "f979c03009a4988c1d9e9eedc4064cc94d2a703bff0ebcb146372de0dc104ae0", + git_commit = "0826c9aa3e327dc7187e105c59c5548ff8639520", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 411a119774b65a6284596ec985f998aa9bf623e8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Mar 2019 13:02:30 -0700 Subject: [PATCH 2831/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 239848671 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7bd80ead7a6..69ec9cdb4a5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f979c03009a4988c1d9e9eedc4064cc94d2a703bff0ebcb146372de0dc104ae0", - git_commit = "0826c9aa3e327dc7187e105c59c5548ff8639520", + sha256 = "64d250ec93ac10a02e75a82aff9ec34eedff253e4bf75df31cc69f45adf0380d", + git_commit = "b1ee0e4af30edc6f13fb265133672ff37a989403", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0947e35069808dc07b8e56c91f5b1a49a6c1da2d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Mar 2019 14:02:01 -0700 Subject: [PATCH 2832/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 239859774 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 69ec9cdb4a5..c9fa71b68eb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "64d250ec93ac10a02e75a82aff9ec34eedff253e4bf75df31cc69f45adf0380d", - git_commit = "b1ee0e4af30edc6f13fb265133672ff37a989403", + sha256 = "27b4f356034fbe7223051d1c0cf0f687c9f5d519e592a79e89a0c242bd33c467", + git_commit = "fb7065ff2b8f49295793df6c79c556930881a08b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 223b0f81da4a501cd47f6f86598f73810d5ce84e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Mar 2019 15:02:04 -0700 Subject: [PATCH 2833/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 239871170 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c9fa71b68eb..64636bb1774 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "27b4f356034fbe7223051d1c0cf0f687c9f5d519e592a79e89a0c242bd33c467", - git_commit = "fb7065ff2b8f49295793df6c79c556930881a08b", + sha256 = "ff074f410147cc684fea264616ff281fcec594bc09ced6f784eb21552ceb8685", + git_commit = "86efbd04bed90da0110a3ee9b4811a28c2f6fe87", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 61f540bdb43c9ee6a017eb7364b84efb3bc6bfaf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Mar 2019 16:02:31 -0700 Subject: [PATCH 2834/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 239882300 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 64636bb1774..e49f8b6641b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ff074f410147cc684fea264616ff281fcec594bc09ced6f784eb21552ceb8685", - git_commit = "86efbd04bed90da0110a3ee9b4811a28c2f6fe87", + sha256 = "2fbc1dcddbb75454f293f19c6d04e5ae5284f32d609ea8e259a11ace500d5f01", + git_commit = "745128a5fa2979d33d93051ede61f04a0ecc5423", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f524bb44ae16ac4ebd77a7f7b09784d7ba04ec53 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Mar 2019 17:02:37 -0700 Subject: [PATCH 2835/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 239891877 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e49f8b6641b..df4ae176435 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2fbc1dcddbb75454f293f19c6d04e5ae5284f32d609ea8e259a11ace500d5f01", - git_commit = "745128a5fa2979d33d93051ede61f04a0ecc5423", + sha256 = "dec096f50fc3b0b806ecd8062a874afc73e3341368b5f45b29e3c5cd7b6c4c86", + git_commit = "c9556307071a485f32fa81b83f501f17ed3c9895", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ff86cbfaedfc6ffe80abab5331a6217ac94de5fe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Mar 2019 18:05:26 -0700 Subject: [PATCH 2836/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 239899509 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index df4ae176435..e3ea5b3526b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dec096f50fc3b0b806ecd8062a874afc73e3341368b5f45b29e3c5cd7b6c4c86", - git_commit = "c9556307071a485f32fa81b83f501f17ed3c9895", + sha256 = "bbf520dfb9f3035cc4cc6d8b2046c358f03724ef4630d08514c2462cdc2cca69", + git_commit = "9a722b98fed75500b483b63838568408c0cc0649", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From afc5b996e06e44e28c5db113881573f6a69d57a8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Mar 2019 19:02:35 -0700 Subject: [PATCH 2837/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 239904777 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e3ea5b3526b..a6d3e3eb1ea 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bbf520dfb9f3035cc4cc6d8b2046c358f03724ef4630d08514c2462cdc2cca69", - git_commit = "9a722b98fed75500b483b63838568408c0cc0649", + sha256 = "b7c463cf773aee2293bb36b826acf2b3cac620d089e097ea5efda390747e2517", + git_commit = "e41a625a2ee8c6d2b2b941741855f47900312351", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c856f224fe6354bb01004d9cfa0a1ed601f6d207 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Mar 2019 20:06:32 -0700 Subject: [PATCH 2838/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 239909471 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a6d3e3eb1ea..844aea5f92e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b7c463cf773aee2293bb36b826acf2b3cac620d089e097ea5efda390747e2517", - git_commit = "e41a625a2ee8c6d2b2b941741855f47900312351", + sha256 = "51b754790fda6c82e8fe1917be1fe41828269e82082c3873845f108e2b4aa678", + git_commit = "8e2f15e897dd8604528aba3e154c2f0412df7c3a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From faf1e74b5df528339d75f6bdbafa407cfb2407f1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Mar 2019 21:01:55 -0700 Subject: [PATCH 2839/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 239913338 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 844aea5f92e..c71ee7fff89 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "51b754790fda6c82e8fe1917be1fe41828269e82082c3873845f108e2b4aa678", - git_commit = "8e2f15e897dd8604528aba3e154c2f0412df7c3a", + sha256 = "1974403a66aae902f698fc3c9631b08c2b459cb267f165dde2bb486154665dbc", + git_commit = "d82c766b445eea2a52a3f7b6dba05356d8b03648", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 44a649c28c54c43ed6cd783c30d0f1abf30b8e9f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Mar 2019 22:02:03 -0700 Subject: [PATCH 2840/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 239917032 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c71ee7fff89..4d82fd6bfd4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1974403a66aae902f698fc3c9631b08c2b459cb267f165dde2bb486154665dbc", - git_commit = "d82c766b445eea2a52a3f7b6dba05356d8b03648", + sha256 = "4e629f14ffa5a888d5731dfb21b17aca9e74dad5cfbd5ed58598117ff8828b5f", + git_commit = "0516f0b883d49b900aa070fa3db3adfb86bc4e34", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d64a42e97a4f71fea682fe42be14c0e9e60288e9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Mar 2019 23:02:24 -0700 Subject: [PATCH 2841/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 239920681 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4d82fd6bfd4..d28d4222ef4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4e629f14ffa5a888d5731dfb21b17aca9e74dad5cfbd5ed58598117ff8828b5f", - git_commit = "0516f0b883d49b900aa070fa3db3adfb86bc4e34", + sha256 = "b094d535e462dd29d6ff333cff22e7ab8a4c323fc8f8b262006148006b263358", + git_commit = "1e4725cf3be4c86f447434e37b1b9801513a9bff", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9cfe077e9da140662d021034e3d10fa6e94ca647 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 23 Mar 2019 02:02:12 -0700 Subject: [PATCH 2842/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 239932013 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d28d4222ef4..cf582b4e7e1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b094d535e462dd29d6ff333cff22e7ab8a4c323fc8f8b262006148006b263358", - git_commit = "1e4725cf3be4c86f447434e37b1b9801513a9bff", + sha256 = "8c0904ae7de1480841d22b33f00167f73fcfb03e2db1f4a679903d30ae89669d", + git_commit = "840022b021cb3d5fba9f67a5014b22f8cdef099b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ad501629cc5c1536183f0ec13a2e703d10010bc0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 23 Mar 2019 04:02:15 -0700 Subject: [PATCH 2843/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 239938770 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cf582b4e7e1..b95b48f0f09 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8c0904ae7de1480841d22b33f00167f73fcfb03e2db1f4a679903d30ae89669d", - git_commit = "840022b021cb3d5fba9f67a5014b22f8cdef099b", + sha256 = "ea1290292d2f7647d55f68fe087dfe4e020821b2b04aa6302a9917c8bc52b9c3", + git_commit = "36f817a9f3e7d2339cb53b91ddc508b3e25ab761", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 763eafba142d6c7d04a9b647d6de98819bf6adcd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 23 Mar 2019 12:02:35 -0700 Subject: [PATCH 2844/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 239963560 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b95b48f0f09..6bf22865410 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ea1290292d2f7647d55f68fe087dfe4e020821b2b04aa6302a9917c8bc52b9c3", - git_commit = "36f817a9f3e7d2339cb53b91ddc508b3e25ab761", + sha256 = "5d62151fbe6cf52a6ce05ab00ab02b03d4ff58ff7c0d7958d3a88fafbc28af23", + git_commit = "152095e319a0b6b79a13e689ea8decee819dbfcd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 78180fa4da7e766cf9d643e83415dedef347952a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 23 Mar 2019 18:02:00 -0700 Subject: [PATCH 2845/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 239980486 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6bf22865410..593b515aae7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5d62151fbe6cf52a6ce05ab00ab02b03d4ff58ff7c0d7958d3a88fafbc28af23", - git_commit = "152095e319a0b6b79a13e689ea8decee819dbfcd", + sha256 = "c2c3aaa558de9eefc802106a344ae368aeedec8181d3c8ec6a24ad7e78b2f312", + git_commit = "b481ac8b015bd16b5cdfc0945fd80ea9c5fa4284", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f06f9bd4046eb60161eeff9dd65163f10a725a67 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 23 Mar 2019 22:02:12 -0700 Subject: [PATCH 2846/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 239993371 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 593b515aae7..6ece212a30e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c2c3aaa558de9eefc802106a344ae368aeedec8181d3c8ec6a24ad7e78b2f312", - git_commit = "b481ac8b015bd16b5cdfc0945fd80ea9c5fa4284", + sha256 = "a7ed0fbc8299cc184b470d1abf7a9edfd1773fb282e00ddee4e7b0d2864afd94", + git_commit = "22ac557a38dae40ed322d5c0eb38ecd6a5f00448", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a69d4cd756c43f71db1e11e9f218376e566148cd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 23 Mar 2019 23:02:41 -0700 Subject: [PATCH 2847/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 239996342 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6ece212a30e..8d4ead1213e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a7ed0fbc8299cc184b470d1abf7a9edfd1773fb282e00ddee4e7b0d2864afd94", - git_commit = "22ac557a38dae40ed322d5c0eb38ecd6a5f00448", + sha256 = "5526e9f1b3680755ff08b65fc12b23c7b35b7a6e219903aff92d107f12d9bbe6", + git_commit = "044ff96ba3936529e4b79c10c2f6e54fa8657202", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d147359a2b8564708f91ffcc38361f09f9cf8acf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 24 Mar 2019 00:02:22 -0700 Subject: [PATCH 2848/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 239999163 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8d4ead1213e..6084aef0a81 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5526e9f1b3680755ff08b65fc12b23c7b35b7a6e219903aff92d107f12d9bbe6", - git_commit = "044ff96ba3936529e4b79c10c2f6e54fa8657202", + sha256 = "bf9d305023ee626b0e512fae1857b2ce3e1387115c99e58bb222f902d6b69284", + git_commit = "ae437225658dcad826951da2183949daf95f0894", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 909c9577a3490e6e093460cab44d9225f33833d1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 24 Mar 2019 04:02:42 -0700 Subject: [PATCH 2849/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 240015021 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6084aef0a81..22d51598a76 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bf9d305023ee626b0e512fae1857b2ce3e1387115c99e58bb222f902d6b69284", - git_commit = "ae437225658dcad826951da2183949daf95f0894", + sha256 = "3525a732703bb1277d73fe3d4a115c83567a0bb368a5dbf39e4f334643324220", + git_commit = "13fe6ef76e9f882584fe63a2b7f292266dedf847", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0122bba0af590f699c67338387bc5dc07bb06dcb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 24 Mar 2019 23:02:31 -0700 Subject: [PATCH 2850/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 240081760 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 22d51598a76..d1138442f0f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3525a732703bb1277d73fe3d4a115c83567a0bb368a5dbf39e4f334643324220", - git_commit = "13fe6ef76e9f882584fe63a2b7f292266dedf847", + sha256 = "02a3136be73be4bf755288a64266af88047ad903da8996cff9bb300d36dbd121", + git_commit = "b95c201d3961768f11a66cc1d1cf2651c8b683cf", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5d15f31e92ec3a91b1c210f616fbbe0c63bec7c1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Mar 2019 02:02:15 -0700 Subject: [PATCH 2851/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 240097911 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d1138442f0f..c79d6ccdca6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "02a3136be73be4bf755288a64266af88047ad903da8996cff9bb300d36dbd121", - git_commit = "b95c201d3961768f11a66cc1d1cf2651c8b683cf", + sha256 = "4380f825612af76882c2c1daf33b25b96ee6738e37dab2911946b24f0593ebb4", + git_commit = "4f63dfb6f674025f059cf64c1120065592e93585", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e45eaa60bbb686aa9c221f42d1477a9cb4b4e97c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Mar 2019 04:02:16 -0700 Subject: [PATCH 2852/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 240111693 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c79d6ccdca6..9ed918aebcd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4380f825612af76882c2c1daf33b25b96ee6738e37dab2911946b24f0593ebb4", - git_commit = "4f63dfb6f674025f059cf64c1120065592e93585", + sha256 = "2e8af217527661b265559d8ef7ca1f9f4cd2c545ebfdaa1b206b02114518b51c", + git_commit = "c1820b1552405a0a258af5331c98ef1f9d237882", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9eb55ffd48f6cc07d76724e4c65828564eca83dc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Mar 2019 05:02:41 -0700 Subject: [PATCH 2853/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 240117789 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9ed918aebcd..42fdf47f479 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2e8af217527661b265559d8ef7ca1f9f4cd2c545ebfdaa1b206b02114518b51c", - git_commit = "c1820b1552405a0a258af5331c98ef1f9d237882", + sha256 = "04ce613960a6ae56476ead95730924b20dd23e0494b11d0202a98ca0f8927027", + git_commit = "26aa3d515d98ba59d52c80f523beb226913b1d07", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d4cca67999d974d118d412eb1fdf62fc4afe59ac Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Mar 2019 06:02:31 -0700 Subject: [PATCH 2854/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 240124123 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 42fdf47f479..c5ad6abee81 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "04ce613960a6ae56476ead95730924b20dd23e0494b11d0202a98ca0f8927027", - git_commit = "26aa3d515d98ba59d52c80f523beb226913b1d07", + sha256 = "467d368461a164269a54550cd7f28e584659ea902cdee04accfce835757ccc26", + git_commit = "87fbb006573bbafbab27200314962b0a70931914", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e1b7fc6c317a1c5aaf68b92a21b18ac5e52e72cd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Mar 2019 07:02:35 -0700 Subject: [PATCH 2855/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 240131742 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c5ad6abee81..9c3a8b89f8c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "467d368461a164269a54550cd7f28e584659ea902cdee04accfce835757ccc26", - git_commit = "87fbb006573bbafbab27200314962b0a70931914", + sha256 = "8f138e47ec9413fb82c35556ea22d38f4a1767d714b35d98fbecf4453982b4e8", + git_commit = "f7e277d66d286acaf91e70cfbe98bcf258825cc1", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 687c1e426d06085436f0a470abcd60e4c99abfa2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Mar 2019 09:02:31 -0700 Subject: [PATCH 2856/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 240149917 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9c3a8b89f8c..82626e346cc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8f138e47ec9413fb82c35556ea22d38f4a1767d714b35d98fbecf4453982b4e8", - git_commit = "f7e277d66d286acaf91e70cfbe98bcf258825cc1", + sha256 = "e8cc3e0fc0f66e608c6bad4aef974e95ee4b93903abdcdfabf1b7928451aa9d8", + git_commit = "1056e30399af74b3a9d84145cb184eefaa121ef7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 07a69755af2bd61980358e46a3ff21cb974064fc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Mar 2019 12:02:14 -0700 Subject: [PATCH 2857/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 240189737 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 82626e346cc..ab106be66e3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e8cc3e0fc0f66e608c6bad4aef974e95ee4b93903abdcdfabf1b7928451aa9d8", - git_commit = "1056e30399af74b3a9d84145cb184eefaa121ef7", + sha256 = "632383b41bf91443dfb294bcb07b656052d210c2ba389a909aec30f104a3a41a", + git_commit = "a7e749250439905d24d1b17627435f948d6976a6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 986fde631672fcb31f10e200f1bbdf8b141374ad Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Mar 2019 13:02:24 -0700 Subject: [PATCH 2858/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 240200936 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ab106be66e3..fc938b5220d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "632383b41bf91443dfb294bcb07b656052d210c2ba389a909aec30f104a3a41a", - git_commit = "a7e749250439905d24d1b17627435f948d6976a6", + sha256 = "289d13b8286241b696fd8480ca04f9678b6b37186dd01a48f041374e36d55556", + git_commit = "9880cf39f61e69fcb76a2b8b4aebc99f9ebf878d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7442d1de286381997a7a82afb13bd2429cef96be Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Mar 2019 14:02:27 -0700 Subject: [PATCH 2859/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 240213092 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fc938b5220d..7443260caea 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "289d13b8286241b696fd8480ca04f9678b6b37186dd01a48f041374e36d55556", - git_commit = "9880cf39f61e69fcb76a2b8b4aebc99f9ebf878d", + sha256 = "6e23963ff6930735837e137ee5f2e2d636ab66c4b0122b05ba53b2efcb15916e", + git_commit = "dd4c705341d0e789fbfb68d5ec56107934198144", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3c2656e2781bed3db5bdc4e339d65f07e65df77f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Mar 2019 15:02:46 -0700 Subject: [PATCH 2860/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 240225754 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7443260caea..582424a27c8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6e23963ff6930735837e137ee5f2e2d636ab66c4b0122b05ba53b2efcb15916e", - git_commit = "dd4c705341d0e789fbfb68d5ec56107934198144", + sha256 = "91280cec220f8dececdfcc680d8ede64bc15486cf1e7a110317c1a0d30c57d46", + git_commit = "e56e4ab64e04f8c5f9d2bcecb9b86c1dc7f04197", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From fda06d5a18808f4b2a87b63a6b838324f1f4cda6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Mar 2019 16:02:22 -0700 Subject: [PATCH 2861/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 240237044 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 582424a27c8..2853fb32597 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "91280cec220f8dececdfcc680d8ede64bc15486cf1e7a110317c1a0d30c57d46", - git_commit = "e56e4ab64e04f8c5f9d2bcecb9b86c1dc7f04197", + sha256 = "ad2a573a83977a9788c76f1374c364a7ff24c6f89604642a8e58270aa3f4d985", + git_commit = "7818652c950b1b1922efe5f4345886058d0ffba5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 27b2ce127bf42cadbad9c96098487429e698ed36 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Mar 2019 17:03:20 -0700 Subject: [PATCH 2862/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 240248404 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2853fb32597..1e88f2bd5ea 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ad2a573a83977a9788c76f1374c364a7ff24c6f89604642a8e58270aa3f4d985", - git_commit = "7818652c950b1b1922efe5f4345886058d0ffba5", + sha256 = "32132c6ee5f6717afe848fb5ead56ee5dd0527d32f019836ea0789b2943caa20", + git_commit = "5ccdee64370dfe08f2c8914d72b50e70bf8d9640", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 649d85c4f57829d880228a50227b63a1ebf84f6e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Mar 2019 18:02:24 -0700 Subject: [PATCH 2863/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 240257783 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1e88f2bd5ea..e5bfd5b55c1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "32132c6ee5f6717afe848fb5ead56ee5dd0527d32f019836ea0789b2943caa20", - git_commit = "5ccdee64370dfe08f2c8914d72b50e70bf8d9640", + sha256 = "81d65ef450e1f266643779e878b3f8977f3f598db59021b67426b00364363221", + git_commit = "2819a6af7887864465f6760f50d9506dee1d135e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f2a6fabbaf82331d33bdc0e5f2226a914daab8ac Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Mar 2019 19:02:19 -0700 Subject: [PATCH 2864/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 240264771 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e5bfd5b55c1..462ebe1ca14 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "81d65ef450e1f266643779e878b3f8977f3f598db59021b67426b00364363221", - git_commit = "2819a6af7887864465f6760f50d9506dee1d135e", + sha256 = "64312719260be25dd4035ad81e30aaa60ff718a03b50af67cabfbfa7322b9328", + git_commit = "f730f585167035a4850bd66d753fb6330a72d961", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From fa0b3368da391c9cc0e249ea8229ae8cfb6ae7dd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Mar 2019 20:02:24 -0700 Subject: [PATCH 2865/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 240270450 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 462ebe1ca14..433c1450d93 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "64312719260be25dd4035ad81e30aaa60ff718a03b50af67cabfbfa7322b9328", - git_commit = "f730f585167035a4850bd66d753fb6330a72d961", + sha256 = "75f3c84ab1741221777b405f0bb284cc8255b73c198b21b062d56f92e1ded0ba", + git_commit = "c53c2488e475f3720dc5250ba470a1484b6176e0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7e51f1f72a98e5201190208951b3e48d33571b04 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Mar 2019 21:02:19 -0700 Subject: [PATCH 2866/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 240276190 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 433c1450d93..43940bcb8bd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "75f3c84ab1741221777b405f0bb284cc8255b73c198b21b062d56f92e1ded0ba", - git_commit = "c53c2488e475f3720dc5250ba470a1484b6176e0", + sha256 = "063ba09427817fb28af3aaba7c41570d80ddf21151f687415914e7e268f5b7f3", + git_commit = "305e7fd7f9bbcab5c77c6839a4ae9df379a63711", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1c9b5b94b56cc320f6f2a6cbdf5f1412d1d26100 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Mar 2019 22:37:26 -0700 Subject: [PATCH 2867/8103] Add the build rule for tensorflow_serving/example:mnist_saved_model PiperOrigin-RevId: 240284511 --- tensorflow_serving/example/BUILD | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tensorflow_serving/example/BUILD b/tensorflow_serving/example/BUILD index 8b9d098a205..364faf09ef7 100644 --- a/tensorflow_serving/example/BUILD +++ b/tensorflow_serving/example/BUILD @@ -33,3 +33,23 @@ cc_binary( "@protobuf_archive//:protobuf_lite", ], ) + +py_binary( + name = "mnist_saved_model", + srcs = [ + "mnist_saved_model.py", + ], + deps = [ + ":mnist_input_data", + "@org_tensorflow//tensorflow:tensorflow_py", + ], +) + +py_library( + name = "mnist_input_data", + srcs = ["mnist_input_data.py"], + deps = [ + "//third_party/py/numpy", + "@six_archive//:six", + ], +) From bcf6401348547a9083e2563c24438921bb1489f0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Mar 2019 23:02:12 -0700 Subject: [PATCH 2868/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 240286750 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 43940bcb8bd..526431403ba 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "063ba09427817fb28af3aaba7c41570d80ddf21151f687415914e7e268f5b7f3", - git_commit = "305e7fd7f9bbcab5c77c6839a4ae9df379a63711", + sha256 = "0424a804ed4b486fc6cc40b70b9499e8d594a59715d00bc994a31fc261b6d5ca", + git_commit = "32008c639ea57fe8a5fc9b2fb9f51c5d3f494633", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ce2c54f1d3e30aaa8dc380aad186ddfc9aa48cdd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Mar 2019 23:23:53 -0700 Subject: [PATCH 2869/8103] Automated rollback of commit 1c9b5b94b56cc320f6f2a6cbdf5f1412d1d26100 PiperOrigin-RevId: 240288824 --- tensorflow_serving/example/BUILD | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/tensorflow_serving/example/BUILD b/tensorflow_serving/example/BUILD index 364faf09ef7..8b9d098a205 100644 --- a/tensorflow_serving/example/BUILD +++ b/tensorflow_serving/example/BUILD @@ -33,23 +33,3 @@ cc_binary( "@protobuf_archive//:protobuf_lite", ], ) - -py_binary( - name = "mnist_saved_model", - srcs = [ - "mnist_saved_model.py", - ], - deps = [ - ":mnist_input_data", - "@org_tensorflow//tensorflow:tensorflow_py", - ], -) - -py_library( - name = "mnist_input_data", - srcs = ["mnist_input_data.py"], - deps = [ - "//third_party/py/numpy", - "@six_archive//:six", - ], -) From 9fab93b75dcfc34316037be09cc1720e55450f40 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Mar 2019 00:02:33 -0700 Subject: [PATCH 2870/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 240291728 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 526431403ba..a445401e359 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0424a804ed4b486fc6cc40b70b9499e8d594a59715d00bc994a31fc261b6d5ca", - git_commit = "32008c639ea57fe8a5fc9b2fb9f51c5d3f494633", + sha256 = "6f17987c78e211ca5639e0bfd033c46de473547aa9194e1392114eb98091e19b", + git_commit = "302acb768a8f00605f84430fabd28b6daa2c4c77", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 05d7a65c772af377f7ab92fd326c4157b258429a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Mar 2019 01:02:14 -0700 Subject: [PATCH 2871/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 240298186 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a445401e359..a6dabb4a4a0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6f17987c78e211ca5639e0bfd033c46de473547aa9194e1392114eb98091e19b", - git_commit = "302acb768a8f00605f84430fabd28b6daa2c4c77", + sha256 = "1099d69e6ed7aeb406de19ca50def0025e03bdd3929dfa010e1da71975b1482d", + git_commit = "ca1f0ce1b9e82e9577a2439c1c40cf38d4694c40", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 22b0f75fcbc6c94b363da03746b1c026b81cbf24 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Mar 2019 04:02:11 -0700 Subject: [PATCH 2872/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 240318374 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a6dabb4a4a0..1d55c50fef6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1099d69e6ed7aeb406de19ca50def0025e03bdd3929dfa010e1da71975b1482d", - git_commit = "ca1f0ce1b9e82e9577a2439c1c40cf38d4694c40", + sha256 = "8cfb7cbc2b2276b26d4a54bcf4bd3f33c4b8ce3391362b3d38c226bc116bbdbd", + git_commit = "1e43727d9c4ef56c66af8c63ecca9d8465b786c7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3b2841bfe0bed95fa764d416af847ff651102520 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Mar 2019 05:02:34 -0700 Subject: [PATCH 2873/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 240324768 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1d55c50fef6..2af3b482866 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8cfb7cbc2b2276b26d4a54bcf4bd3f33c4b8ce3391362b3d38c226bc116bbdbd", - git_commit = "1e43727d9c4ef56c66af8c63ecca9d8465b786c7", + sha256 = "6d82b92b098c47e690d921cfbd3172bf81e39ea91d497582597d836296d0a735", + git_commit = "09b7abd5beb0592af85fec492b8333b47f2fc223", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ca99cd27a5745700aaa0e6a5810bdd9c8f8b6b69 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Mar 2019 06:02:14 -0700 Subject: [PATCH 2874/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 240332015 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2af3b482866..846170b38f4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6d82b92b098c47e690d921cfbd3172bf81e39ea91d497582597d836296d0a735", - git_commit = "09b7abd5beb0592af85fec492b8333b47f2fc223", + sha256 = "cbd0156d65f2ce4ef165b1f3d0fd93993bf7ce0d0d4fc9910e08e10d975d8430", + git_commit = "9f9e3d21320b096d4f80fb20fc01180eab08ae0b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5ac27ce75274afef76feaddb418813c9423d1f74 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Mar 2019 09:02:09 -0700 Subject: [PATCH 2875/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 240358469 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 846170b38f4..ab2a3c5c04e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cbd0156d65f2ce4ef165b1f3d0fd93993bf7ce0d0d4fc9910e08e10d975d8430", - git_commit = "9f9e3d21320b096d4f80fb20fc01180eab08ae0b", + sha256 = "ef6d458e2953a90612117c9ccd7e9fd59d5e66146442891d32d5dcb6008ebdba", + git_commit = "9ab5be306a5baa4eb324fd3eccaae683462df92d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a3dd1b442b21fdc8e918d174e95421500bc44f81 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Mar 2019 10:02:19 -0700 Subject: [PATCH 2876/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 240369800 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ab2a3c5c04e..409da4be7af 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ef6d458e2953a90612117c9ccd7e9fd59d5e66146442891d32d5dcb6008ebdba", - git_commit = "9ab5be306a5baa4eb324fd3eccaae683462df92d", + sha256 = "4656d20ee2b973dd0b5d078f36312a78ef1c28adef150591ec98a905b08758bd", + git_commit = "49414867df30277c7ea7839837cc8e3397c712cb", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 498f707a12d0e6e3253f708b9d300194d07dfc83 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Mar 2019 11:02:32 -0700 Subject: [PATCH 2877/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 240384506 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 409da4be7af..63e9234d162 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4656d20ee2b973dd0b5d078f36312a78ef1c28adef150591ec98a905b08758bd", - git_commit = "49414867df30277c7ea7839837cc8e3397c712cb", + sha256 = "4e8f35eeb20b02bd6186cfe5db954ea056a0ef5b471589b15b24301396fcffb7", + git_commit = "23900d46dadaad68bafdaae5c5acb1c9fd093f9a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 19a3a02c3a9f8a6b3c944872de2df8c19c666708 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Mar 2019 12:02:21 -0700 Subject: [PATCH 2878/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 240398308 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 63e9234d162..e1119a97eb6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4e8f35eeb20b02bd6186cfe5db954ea056a0ef5b471589b15b24301396fcffb7", - git_commit = "23900d46dadaad68bafdaae5c5acb1c9fd093f9a", + sha256 = "4f52bcac52b97a893948d0ae99e81cbb68c640f72eec287f24f62f8f7a8b3e45", + git_commit = "2755ef6f9c15f201d0066c5722ea5e54ad6e7302", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 28ef014576a017f06fad0076fb587d4311f13017 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Mar 2019 13:02:20 -0700 Subject: [PATCH 2879/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 240410329 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e1119a97eb6..17c2cf021bb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4f52bcac52b97a893948d0ae99e81cbb68c640f72eec287f24f62f8f7a8b3e45", - git_commit = "2755ef6f9c15f201d0066c5722ea5e54ad6e7302", + sha256 = "e2d8ff1ae331a2b60e02f81a60ec9de140747fbeca56ad20bed7a8ad4dcf32e7", + git_commit = "c633ea8281e4ef730a5f15321388c0a796cb0eea", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From dd70b120dc44a5ab68e8d5f6cb843df6d0190826 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Mar 2019 13:19:13 -0700 Subject: [PATCH 2880/8103] \nInternal refactor\n PiperOrigin-RevId: 240413697 --- .../servables/tensorflow/bundle_factory_util_test.cc | 3 ++- tensorflow_serving/servables/tensorflow/testdata/BUILD | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc b/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc index 7a73480b8b8..31fd46afd5d 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc @@ -43,10 +43,11 @@ namespace tensorflow { namespace serving { namespace { +using test_util::EqualsProto; using ::testing::_; +using ::testing::DoAll; using ::testing::Return; using ::testing::SetArgPointee; -using test_util::EqualsProto; using Batcher = SharedBatchScheduler; class BundleFactoryUtilTest : public ::testing::Test { diff --git a/tensorflow_serving/servables/tensorflow/testdata/BUILD b/tensorflow_serving/servables/tensorflow/testdata/BUILD index 543637eb666..1e8c59b0e9c 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/BUILD +++ b/tensorflow_serving/servables/tensorflow/testdata/BUILD @@ -62,7 +62,7 @@ py_binary( srcs = [ "export_counter.py", ], - default_python_version = "PY3", + python_version = "PY3", srcs_version = "PY3", deps = [ "@org_tensorflow//tensorflow:tensorflow_py", From 3533ef3af516ae4c915e7c4f9ee1e95b9f3c4f15 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Mar 2019 14:02:35 -0700 Subject: [PATCH 2881/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 240422558 --- WORKSPACE | 4 ++-- tensorflow_serving/servables/tensorflow/testdata/BUILD | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 17c2cf021bb..5cf7ed59c11 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e2d8ff1ae331a2b60e02f81a60ec9de140747fbeca56ad20bed7a8ad4dcf32e7", - git_commit = "c633ea8281e4ef730a5f15321388c0a796cb0eea", + sha256 = "2591b5ae44853b26c5ab4001b068a9e11cc8710a3df1a9b880f6cf1de07db0e1", + git_commit = "6e2a7cd84d275bbc745c2731c6a9c6e282cbc29e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") diff --git a/tensorflow_serving/servables/tensorflow/testdata/BUILD b/tensorflow_serving/servables/tensorflow/testdata/BUILD index 1e8c59b0e9c..543637eb666 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/BUILD +++ b/tensorflow_serving/servables/tensorflow/testdata/BUILD @@ -62,7 +62,7 @@ py_binary( srcs = [ "export_counter.py", ], - python_version = "PY3", + default_python_version = "PY3", srcs_version = "PY3", deps = [ "@org_tensorflow//tensorflow:tensorflow_py", From 15cd20263c8362f534afecbdf98b9d929eac70fd Mon Sep 17 00:00:00 2001 From: vinuraja Date: Tue, 26 Mar 2019 21:12:21 -0700 Subject: [PATCH 2882/8103] Adds an option in SessionBundleConfig to repeat warmup replay n times per request. PiperOrigin-RevId: 240488711 --- tensorflow_serving/servables/tensorflow/BUILD | 12 ++-- .../saved_model_bundle_source_adapter.cc | 5 +- .../saved_model_bundle_source_adapter_test.cc | 19 ++++-- .../tensorflow/saved_model_warmup.cc | 23 +++++-- .../servables/tensorflow/saved_model_warmup.h | 4 +- .../tensorflow/saved_model_warmup_test.cc | 62 +++++++++++++------ .../tensorflow/session_bundle_config.proto | 7 +++ 7 files changed, 95 insertions(+), 37 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index fbb153b2506..0675e45a770 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -300,6 +300,7 @@ cc_test( "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:test", + "@protobuf_archive//:cc_wkt_protos", ], ) @@ -897,16 +898,15 @@ cc_library( ":multi_inference", ":predict_util", ":regressor", - "//tensorflow_serving/apis:classification_proto", - "//tensorflow_serving/apis:inference_proto", - "//tensorflow_serving/apis:predict_proto", + ":session_bundle_config_proto", + ":util", "//tensorflow_serving/apis:prediction_log_proto", - "//tensorflow_serving/apis:regression_proto", - "//tensorflow_serving/core:loader", "@org_tensorflow//tensorflow/cc/saved_model:constants", + "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", + "@protobuf_archive//:cc_wkt_protos", ], ) @@ -916,6 +916,7 @@ cc_test( srcs = ["saved_model_warmup_test.cc"], deps = [ ":saved_model_warmup", + ":session_bundle_config_proto", "//tensorflow_serving/apis:input_proto", "//tensorflow_serving/apis:model_proto", "//tensorflow_serving/apis:prediction_log_proto", @@ -929,5 +930,6 @@ cc_test( "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", "@org_tensorflow//tensorflow/core:testlib", + "@protobuf_archive//:cc_wkt_protos", ], ) diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter.cc b/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter.cc index d64ad34719f..ada32676f44 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter.cc @@ -54,8 +54,9 @@ Status SavedModelBundleSourceAdapter::Convert(const StoragePath& path, path](std::unique_ptr* bundle) { TF_RETURN_IF_ERROR(bundle_factory->CreateSavedModelBundle(path, bundle)); if (bundle_factory->config().enable_model_warmup()) { - return RunSavedModelWarmup(GetRunOptions(bundle_factory->config()), path, - bundle->get()); + return RunSavedModelWarmup( + bundle_factory->config().model_warmup_options(), + GetRunOptions(bundle_factory->config()), path, bundle->get()); } return Status::OK(); }; diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter_test.cc b/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter_test.cc index 7d1770b7744..4bc1932394c 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter_test.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter_test.cc @@ -20,6 +20,7 @@ limitations under the License. #include #include +#include "google/protobuf/wrappers.pb.h" #include #include #include "tensorflow/cc/saved_model/loader.h" @@ -42,7 +43,7 @@ namespace { using test_util::EqualsProto; class SavedModelBundleSourceAdapterTest - : public ::testing::TestWithParam { + : public ::testing::TestWithParam> { protected: SavedModelBundleSourceAdapterTest() { ResourceUtil::Options resource_util_options; @@ -53,6 +54,12 @@ class SavedModelBundleSourceAdapterTest ram_resource_ = resource_util_->CreateBoundResource( device_types::kMain, resource_kinds::kRamBytes); config_.mutable_config()->set_enable_model_warmup(EnableWarmup()); + if (EnableNumRequestIterations()) { + config_.mutable_config() + ->mutable_model_warmup_options() + ->mutable_num_request_iterations() + ->set_value(2); + } } void TestSavedModelBundleSourceAdapter(const string& export_dir) const { @@ -101,7 +108,8 @@ class SavedModelBundleSourceAdapterTest loader->Unload(); } - bool EnableWarmup() { return GetParam(); } + bool EnableWarmup() { return std::get<0>(GetParam()); } + bool EnableNumRequestIterations() { return std::get<1>(GetParam()); } std::unique_ptr resource_util_; Resource ram_resource_; @@ -121,9 +129,10 @@ TEST_P(SavedModelBundleSourceAdapterTest, BackwardCompatibility) { } // Test all SavedModelBundleSourceAdapterTest test cases with -// warmup enabled/disabled. -INSTANTIATE_TEST_CASE_P(EnableWarmup, SavedModelBundleSourceAdapterTest, - ::testing::Bool()); +// warmup and num_request_iterations enabled/disabled. +INSTANTIATE_TEST_CASE_P(ModelWarmup, SavedModelBundleSourceAdapterTest, + ::testing::Combine(::testing::Bool(), + ::testing::Bool())); } // namespace } // namespace serving diff --git a/tensorflow_serving/servables/tensorflow/saved_model_warmup.cc b/tensorflow_serving/servables/tensorflow/saved_model_warmup.cc index 2fa46116141..a37bd4582ed 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_warmup.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_warmup.cc @@ -15,6 +15,7 @@ limitations under the License. #include "tensorflow_serving/servables/tensorflow/saved_model_warmup.h" +#include "google/protobuf/wrappers.pb.h" #include "tensorflow/cc/saved_model/constants.h" #include "tensorflow/core/lib/io/path.h" #include "tensorflow/core/lib/io/record_reader.h" @@ -91,7 +92,8 @@ Status RunWarmupRequest(const PredictionLog& warmup_record, constexpr char WarmupConsts::kRequestsFileName[]; constexpr int WarmupConsts::kMaxNumRecords; -Status RunSavedModelWarmup(const RunOptions& run_options, +Status RunSavedModelWarmup(const ModelWarmupOptions& model_warmup_options, + const RunOptions& run_options, const string& export_dir, SavedModelBundle* bundle) { const uint64 start_microseconds = Env::Default()->NowMicros(); const string warmup_path = @@ -103,7 +105,16 @@ Status RunSavedModelWarmup(const RunOptions& run_options, return Status::OK(); } - LOG(INFO) << "Starting to read warmup data for model at " << warmup_path; + const int num_request_iterations = [&]() { + if (model_warmup_options.has_num_request_iterations()) { + return model_warmup_options.num_request_iterations().value(); + } + // Default of 1. + return 1; + }(); + LOG(INFO) << "Starting to read warmup data for model at " << warmup_path + << " with model-warmup-options " + << model_warmup_options.DebugString(); std::unique_ptr tf_record_file; TF_RETURN_IF_ERROR(tensorflow::Env::Default()->NewRandomAccessFile( warmup_path, &tf_record_file)); @@ -121,9 +132,11 @@ Status RunSavedModelWarmup(const RunOptions& run_options, "Failed to parse warmup record: ", record, " from ", warmup_path)); } - TF_RETURN_IF_ERROR(RunWarmupRequest(prediction_log, run_options, - bundle->meta_graph_def, - bundle->session.get())); + for (int i = 0; i < num_request_iterations; ++i) { + TF_RETURN_IF_ERROR(RunWarmupRequest(prediction_log, run_options, + bundle->meta_graph_def, + bundle->session.get())); + } ++num_warmup_records; if (num_warmup_records > WarmupConsts::kMaxNumRecords) { return errors::InvalidArgument( diff --git a/tensorflow_serving/servables/tensorflow/saved_model_warmup.h b/tensorflow_serving/servables/tensorflow/saved_model_warmup.h index 6709a19396d..e432ed7e880 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_warmup.h +++ b/tensorflow_serving/servables/tensorflow/saved_model_warmup.h @@ -21,6 +21,7 @@ limitations under the License. #include "tensorflow/cc/saved_model/loader.h" #include "tensorflow/core/protobuf/saved_model.pb.h" #include "tensorflow/core/public/session.h" +#include "tensorflow_serving/servables/tensorflow/session_bundle_config.pb.h" namespace tensorflow { namespace serving { @@ -36,7 +37,8 @@ struct WarmupConsts { // at load time, and consequently improve first request latency. // Warmup is skipped if no warmup file present. // Supported request types: Regress, Classify, Predict, MultiInference. -Status RunSavedModelWarmup(const RunOptions& run_options, +Status RunSavedModelWarmup(const ModelWarmupOptions& model_warmup_options, + const RunOptions& run_options, const string& export_dir, SavedModelBundle* bundle); } // namespace serving diff --git a/tensorflow_serving/servables/tensorflow/saved_model_warmup_test.cc b/tensorflow_serving/servables/tensorflow/saved_model_warmup_test.cc index 33d8f1d36b9..6031ba03907 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_warmup_test.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_warmup_test.cc @@ -15,9 +15,9 @@ limitations under the License. #include "tensorflow_serving/servables/tensorflow/saved_model_warmup.h" +#include "google/protobuf/wrappers.pb.h" #include #include - #include "tensorflow/cc/saved_model/constants.h" #include "tensorflow/cc/saved_model/signature_constants.h" #include "tensorflow/contrib/session_bundle/signature.h" @@ -38,6 +38,7 @@ limitations under the License. #include "tensorflow_serving/apis/prediction_log.pb.h" #include "tensorflow_serving/apis/regression.pb.h" #include "tensorflow_serving/core/test_util/mock_session.h" +#include "tensorflow_serving/servables/tensorflow/session_bundle_config.pb.h" namespace tensorflow { namespace serving { @@ -174,7 +175,28 @@ void AddSignatures(MetaGraphDef* meta_graph_def) { {kPredictOutputs}); } -TEST(SavedModelBundleWarmupTest, MixedWarmupData) { +class SavedModelBundleWarmupOptionsTest + : public ::testing::TestWithParam { + public: + bool EnableNumRequestIterations() { return GetParam(); } + + ModelWarmupOptions GetModelWarmupOptions() { + ModelWarmupOptions options; + if (EnableNumRequestIterations()) { + options.mutable_num_request_iterations()->set_value(2); + } + return options; + } + + int GetNumRequestIterations() { + if (EnableNumRequestIterations()) { + return 2; + } + return 1; + } +}; + +TEST_P(SavedModelBundleWarmupOptionsTest, MixedWarmupData) { string base_path = io::JoinPath(testing::TmpDir(), "MixedWarmupData"); TF_ASSERT_OK(Env::Default()->RecursivelyCreateDir( io::JoinPath(base_path, kSavedModelAssetsExtraDirectory))); @@ -193,24 +215,26 @@ TEST(SavedModelBundleWarmupTest, MixedWarmupData) { Tensor classes(DT_STRING, TensorShape({1, 1})); // Regress and Predict case EXPECT_CALL(*mock, Run(_, _, SizeIs(1), _, _, _)) - .Times(num_warmup_records * 2) + .Times(num_warmup_records * 2 * GetNumRequestIterations()) .WillRepeatedly(DoAll(SetArgPointee<4>(std::vector({scores})), Return(Status::OK()))); // Classify case EXPECT_CALL(*mock, Run(_, _, SizeIs(2), _, _, _)) - .Times(num_warmup_records) + .Times(num_warmup_records * GetNumRequestIterations()) .WillRepeatedly( DoAll(SetArgPointee<4>(std::vector({classes, scores})), Return(Status::OK()))); // MultiInference case EXPECT_CALL(*mock, Run(_, _, SizeIs(3), _, _, _)) - .Times(num_warmup_records) + .Times(num_warmup_records * GetNumRequestIterations()) .WillRepeatedly(DoAll( SetArgPointee<4>(std::vector({classes, scores, scores})), Return(Status::OK()))); - TF_EXPECT_OK( - RunSavedModelWarmup(RunOptions(), base_path, &saved_model_bundle)); + TF_EXPECT_OK(RunSavedModelWarmup(GetModelWarmupOptions(), RunOptions(), + base_path, &saved_model_bundle)); } +INSTANTIATE_TEST_SUITE_P(WarmupOptions, SavedModelBundleWarmupOptionsTest, + ::testing::Bool()); TEST(SavedModelBundleWarmupTest, NoWarmupDataFile) { string base_path = io::JoinPath(testing::TmpDir(), "NoWarmupDataFile"); @@ -222,8 +246,8 @@ TEST(SavedModelBundleWarmupTest, NoWarmupDataFile) { MockSession* mock = new MockSession; saved_model_bundle.session.reset(mock); EXPECT_CALL(*mock, Run(_, _, _, _, _, _)).Times(0); - TF_EXPECT_OK( - RunSavedModelWarmup(RunOptions(), base_path, &saved_model_bundle)); + TF_EXPECT_OK(RunSavedModelWarmup(ModelWarmupOptions(), RunOptions(), + base_path, &saved_model_bundle)); } TEST(SavedModelBundleWarmupTest, WarmupDataFileEmpty) { @@ -240,8 +264,8 @@ TEST(SavedModelBundleWarmupTest, WarmupDataFileEmpty) { MockSession* mock = new MockSession; saved_model_bundle.session.reset(mock); EXPECT_CALL(*mock, Run(_, _, _, _, _, _)).Times(0); - TF_EXPECT_OK( - RunSavedModelWarmup(RunOptions(), base_path, &saved_model_bundle)); + TF_EXPECT_OK(RunSavedModelWarmup(ModelWarmupOptions(), RunOptions(), + base_path, &saved_model_bundle)); } TEST(SavedModelBundleWarmupTest, UnsupportedLogType) { @@ -263,8 +287,8 @@ TEST(SavedModelBundleWarmupTest, UnsupportedLogType) { saved_model_bundle.session.reset(mock); EXPECT_CALL(*mock, Run(_, _, _, _, _, _)) .WillRepeatedly(Return(Status::OK())); - const Status status = - RunSavedModelWarmup(RunOptions(), base_path, &saved_model_bundle); + const Status status = RunSavedModelWarmup(ModelWarmupOptions(), RunOptions(), + base_path, &saved_model_bundle); ASSERT_FALSE(status.ok()); EXPECT_EQ(::tensorflow::error::UNIMPLEMENTED, status.code()) << status; EXPECT_THAT(status.ToString(), @@ -302,8 +326,8 @@ TEST(SavedModelBundleWarmupTest, TooManyWarmupRecords) { .WillRepeatedly(DoAll( SetArgPointee<4>(std::vector({classes, scores, scores})), Return(Status::OK()))); - const Status status = - RunSavedModelWarmup(RunOptions(), base_path, &saved_model_bundle); + const Status status = RunSavedModelWarmup(ModelWarmupOptions(), RunOptions(), + base_path, &saved_model_bundle); ASSERT_FALSE(status.ok()); EXPECT_EQ(::tensorflow::error::INVALID_ARGUMENT, status.code()) << status; EXPECT_THAT( @@ -324,8 +348,8 @@ TEST(SavedModelBundleWarmupTest, UnparsableRecord) { MockSession* mock = new MockSession; saved_model_bundle.session.reset(mock); EXPECT_CALL(*mock, Run(_, _, _, _, _, _)).Times(0); - const Status status = - RunSavedModelWarmup(RunOptions(), base_path, &saved_model_bundle); + const Status status = RunSavedModelWarmup(ModelWarmupOptions(), RunOptions(), + base_path, &saved_model_bundle); ASSERT_FALSE(status.ok()); EXPECT_EQ(::tensorflow::error::INVALID_ARGUMENT, status.code()) << status; EXPECT_THAT(status.ToString(), @@ -349,8 +373,8 @@ TEST(SavedModelBundleWarmupTest, RunFailure) { saved_model_bundle.session.reset(mock); EXPECT_CALL(*mock, Run(_, _, _, _, _, _)) .WillOnce(::testing::Return(errors::InvalidArgument("Run failed"))); - const Status status = - RunSavedModelWarmup(RunOptions(), base_path, &saved_model_bundle); + const Status status = RunSavedModelWarmup(ModelWarmupOptions(), RunOptions(), + base_path, &saved_model_bundle); ASSERT_FALSE(status.ok()); EXPECT_EQ(::tensorflow::error::INVALID_ARGUMENT, status.code()) << status; EXPECT_THAT(status.ToString(), ::testing::HasSubstr("Run failed")); diff --git a/tensorflow_serving/servables/tensorflow/session_bundle_config.proto b/tensorflow_serving/servables/tensorflow/session_bundle_config.proto index 3d521fc080c..16d63d2830e 100644 --- a/tensorflow_serving/servables/tensorflow/session_bundle_config.proto +++ b/tensorflow_serving/servables/tensorflow/session_bundle_config.proto @@ -6,6 +6,12 @@ import "tensorflow/core/protobuf/named_tensor.proto"; package tensorflow.serving; +// Options related to model-warmup. +message ModelWarmupOptions { + // Number of times a request is iterated during warmup replay. By default 1. + google.protobuf.Int32Value num_request_iterations = 1; +} + // Configuration parameters for a SessionBundle, with optional batching. message SessionBundleConfig { // The TensorFlow runtime to connect to. @@ -62,6 +68,7 @@ message SessionBundleConfig { // Enables model warmup. bool enable_model_warmup = 779; + ModelWarmupOptions model_warmup_options = 780; } // Batching parameters. Each individual parameter is optional. If omitted, the From b8a377cbeea07d6173f1938e4fe507b7ff9d17cd Mon Sep 17 00:00:00 2001 From: awk Date: Thu, 28 Mar 2019 16:43:06 -0700 Subject: [PATCH 2883/8103] o Update to Bazel 0.23.2 (this is the minimum required). o Update tensorflow and io_bazel_rules_closure archives to latest. PiperOrigin-RevId: 240880670 --- WORKSPACE | 14 +++++++------- .../servables/tensorflow/testdata/BUILD | 2 +- tensorflow_serving/tools/docker/Dockerfile.devel | 2 +- .../tools/docker/Dockerfile.devel-gpu | 2 +- .../tools/docker/Dockerfile.devel-mkl | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5cf7ed59c11..866e804d56c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2591b5ae44853b26c5ab4001b068a9e11cc8710a3df1a9b880f6cf1de07db0e1", - git_commit = "6e2a7cd84d275bbc745c2731c6a9c6e282cbc29e", + sha256 = "7f6b02d7ebf163c3f3c31b66fd7398b51346a875b9e70cc7c4859297d71975f6", + git_commit = "a6d4836b119cf4e6d553d072ac3b0af34cc00fd2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") @@ -21,11 +21,11 @@ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") # Needs to be kept in sync with the same target in TensorFlow's WORKSPACE file. http_archive( name = "io_bazel_rules_closure", - sha256 = "a38539c5b5c358548e75b44141b4ab637bba7c4dc02b46b1f62a96d6433f56ae", - strip_prefix = "rules_closure-dbb96841cc0a5fb2664c37822803b06dab20c7d1", + sha256 = "ddce3b3a3909f99b28b25071c40b7fec7e2e1d1d1a4b2e933f3082aa99517105", + strip_prefix = "rules_closure-316e6133888bfc39fb860a4f1a31cfcbae485aef", urls = [ - "https://mirror.bazel.build/github.com/bazelbuild/rules_closure/archive/dbb96841cc0a5fb2664c37822803b06dab20c7d1.tar.gz", - "https://github.com/bazelbuild/rules_closure/archive/dbb96841cc0a5fb2664c37822803b06dab20c7d1.tar.gz", # 2018-04-13 + "https://mirror.bazel.build/github.com/bazelbuild/rules_closure/archive/316e6133888bfc39fb860a4f1a31cfcbae485aef.tar.gz", + "https://github.com/bazelbuild/rules_closure/archive/316e6133888bfc39fb860a4f1a31cfcbae485aef.tar.gz", # 2019-03-21 ], ) @@ -37,4 +37,4 @@ tf_serving_workspace() # Specify the minimum required bazel version. load("@org_tensorflow//tensorflow:version_check.bzl", "check_bazel_version_at_least") -check_bazel_version_at_least("0.20.0") +check_bazel_version_at_least("0.23.2") diff --git a/tensorflow_serving/servables/tensorflow/testdata/BUILD b/tensorflow_serving/servables/tensorflow/testdata/BUILD index 543637eb666..1e8c59b0e9c 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/BUILD +++ b/tensorflow_serving/servables/tensorflow/testdata/BUILD @@ -62,7 +62,7 @@ py_binary( srcs = [ "export_counter.py", ], - default_python_version = "PY3", + python_version = "PY3", srcs_version = "PY3", deps = [ "@org_tensorflow//tensorflow:tensorflow_py", diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index edccb909310..15d080a9dfe 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -60,7 +60,7 @@ RUN pip --no-cache-dir install \ requests # Set up Bazel -ENV BAZEL_VERSION 0.20.0 +ENV BAZEL_VERSION 0.23.2 WORKDIR / RUN mkdir /bazel && \ cd /bazel && \ diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index bdec5578467..2cba1ec4a2a 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -91,7 +91,7 @@ RUN pip --no-cache-dir install \ requests # Set up Bazel -ENV BAZEL_VERSION 0.20.0 +ENV BAZEL_VERSION 0.23.2 WORKDIR / RUN mkdir /bazel && \ cd /bazel && \ diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl index 46cc2ff17e0..6aba9ef27d8 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl @@ -60,7 +60,7 @@ RUN pip --no-cache-dir install \ requests # Set up Bazel -ENV BAZEL_VERSION 0.20.0 +ENV BAZEL_VERSION 0.23.2 WORKDIR / RUN mkdir /bazel && \ cd /bazel && \ From 2a626659a2031cc3ca1e2481f7cfa4c2c1df00a2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Mar 2019 17:02:08 -0700 Subject: [PATCH 2884/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 240883883 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 866e804d56c..2284ce07b64 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7f6b02d7ebf163c3f3c31b66fd7398b51346a875b9e70cc7c4859297d71975f6", - git_commit = "a6d4836b119cf4e6d553d072ac3b0af34cc00fd2", + sha256 = "2591b5ae44853b26c5ab4001b068a9e11cc8710a3df1a9b880f6cf1de07db0e1", + git_commit = "6e2a7cd84d275bbc745c2731c6a9c6e282cbc29e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a7f98b67e3f054e20bec86459a4f5dbf8eb45b08 Mon Sep 17 00:00:00 2001 From: gvasudevan Date: Fri, 29 Mar 2019 12:25:58 -0700 Subject: [PATCH 2885/8103] Disable MKLDNN contraction kernels by default PiperOrigin-RevId: 241028930 --- .bazelrc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.bazelrc b/.bazelrc index 9ce62fe2046..083f8e23e6b 100644 --- a/.bazelrc +++ b/.bazelrc @@ -10,11 +10,13 @@ build:cuda --define=using_cuda=true --define=using_cuda_nvcc=true # If you would like to use a local MKL instead of downloading, please set the # environment variable "TF_MKL_ROOT" every time before build. build:mkl --define=build_with_mkl=true --define=enable_mkl=true +build:mkl --define=tensorflow_mkldnn_contraction_kernel=0 # This config option is used to enable MKL-DNN open source library only, # without depending on MKL binary version. build:mkl_open_source_only --define=build_with_mkl_dnn_only=true build:mkl_open_source_only --define=build_with_mkl=true --define=enable_mkl=true +build:mkl_open_source_only --define=tensorflow_mkldnn_contraction_kernel=0 # Processor native optimizations (depends on build host capabilities). build:nativeopt --copt=-march=native @@ -32,6 +34,9 @@ build --define=grpc_no_ares=true # Sets the default Apple platform to macOS. build --apple_platform_type=macos +# Disable MKL-DNN contraction kernels by default. +build --define=tensorflow_mkldnn_contraction_kernel=0 + build -c opt # Adding --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0" creates parity with TF From 45f4276d9e2ae2b92a0065d71ab7637ebef632c8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 29 Mar 2019 14:02:29 -0700 Subject: [PATCH 2886/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241046188 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2284ce07b64..b83e2b74912 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2591b5ae44853b26c5ab4001b068a9e11cc8710a3df1a9b880f6cf1de07db0e1", - git_commit = "6e2a7cd84d275bbc745c2731c6a9c6e282cbc29e", + sha256 = "720fa92f9d8627824ea8cf65dd828fbf5a90f570206b4126009a2f0636a0056c", + git_commit = "90af03f657e37c0b7297c31b9d754c5517f08bc3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From fb5b75ed7a70a9d4d4ce1b058e68e7d9fcbd4bf8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 29 Mar 2019 15:02:10 -0700 Subject: [PATCH 2887/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241058273 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b83e2b74912..0dd9dbf61a8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "720fa92f9d8627824ea8cf65dd828fbf5a90f570206b4126009a2f0636a0056c", - git_commit = "90af03f657e37c0b7297c31b9d754c5517f08bc3", + sha256 = "d603311f94be76151fd9e10ae442b374ab14c0601c6c49975546d287cc5fc4fc", + git_commit = "47ab68d265a96b6e7be06afd1b4b47e0114c0ee9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 983c49291a8bae854d9c8062e6247313aaa77ea0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 29 Mar 2019 16:02:14 -0700 Subject: [PATCH 2888/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241068626 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0dd9dbf61a8..9ff6dae0e73 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d603311f94be76151fd9e10ae442b374ab14c0601c6c49975546d287cc5fc4fc", - git_commit = "47ab68d265a96b6e7be06afd1b4b47e0114c0ee9", + sha256 = "bf87589b796ca2c903f82acb7be25af982ae308ea49a86dab570419b86c26586", + git_commit = "fda92bd9a0b5b54195bc4509deda79f81853925c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d6b9df920d4fc4dbaa0913a25446d291037982dd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 29 Mar 2019 17:02:30 -0700 Subject: [PATCH 2889/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241077212 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9ff6dae0e73..8c51ba84925 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bf87589b796ca2c903f82acb7be25af982ae308ea49a86dab570419b86c26586", - git_commit = "fda92bd9a0b5b54195bc4509deda79f81853925c", + sha256 = "7e8d46ca2130c53ee612ef3fbcf894ed92da8b7652e9d87869829c7c3517d8ca", + git_commit = "cdb521e6ef021a387b124ce7cfc5aaee0fb5fdd3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d3bd231d921d91f21a1e4590a1caaed8dd717125 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 29 Mar 2019 18:02:24 -0700 Subject: [PATCH 2890/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241084057 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8c51ba84925..3977152f231 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7e8d46ca2130c53ee612ef3fbcf894ed92da8b7652e9d87869829c7c3517d8ca", - git_commit = "cdb521e6ef021a387b124ce7cfc5aaee0fb5fdd3", + sha256 = "cd2d404f85048bc0b717bf38124c2bbf60b4a580817c555d75afae347326a6b3", + git_commit = "f537fae3b88532af592bc964e7a10682ac3c7d85", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From dd6a74837dc56f3e8f80ae2d15717b83cb9741e8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 29 Mar 2019 19:03:03 -0700 Subject: [PATCH 2891/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241089915 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3977152f231..75c01ac3f95 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cd2d404f85048bc0b717bf38124c2bbf60b4a580817c555d75afae347326a6b3", - git_commit = "f537fae3b88532af592bc964e7a10682ac3c7d85", + sha256 = "ceceb7c101bf5ae5a8f907c8f6d32e657c8fc32be5bd1fcaecd9d1d9e0681aef", + git_commit = "215dc6b55cc90495eb34e3bae4581c9d27585f49", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6a2ce1d0adedf4133d1c15f5ddb2e6d3f097d97b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 29 Mar 2019 21:02:19 -0700 Subject: [PATCH 2892/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241097903 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 75c01ac3f95..e5d0918ca4a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ceceb7c101bf5ae5a8f907c8f6d32e657c8fc32be5bd1fcaecd9d1d9e0681aef", - git_commit = "215dc6b55cc90495eb34e3bae4581c9d27585f49", + sha256 = "a0328908b7d53bef690978c794af9bdf2ad090b97a601f111daf78760dc67ec4", + git_commit = "1200c7d7d09aa7ad671b7c2936c73b56626ff14c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8ef12e93fe0e43a736c301b313cbe80052eb2081 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 29 Mar 2019 22:02:07 -0700 Subject: [PATCH 2893/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241101493 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e5d0918ca4a..38ebfd14e3b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a0328908b7d53bef690978c794af9bdf2ad090b97a601f111daf78760dc67ec4", - git_commit = "1200c7d7d09aa7ad671b7c2936c73b56626ff14c", + sha256 = "f99e37e2024494af0f3d9ce6de81802681453d0c2cbabeb453904036a74c5888", + git_commit = "5d24d0e06038af8ab6c9964a3888958f2f3667aa", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c886eb6947deb3e10aac040835a2cdad554086f8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 29 Mar 2019 23:02:15 -0700 Subject: [PATCH 2894/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241104948 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 38ebfd14e3b..47211020c2e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f99e37e2024494af0f3d9ce6de81802681453d0c2cbabeb453904036a74c5888", - git_commit = "5d24d0e06038af8ab6c9964a3888958f2f3667aa", + sha256 = "8dc3b770edc5f9d00a24f254c3df1a93b03014836807a9db9fd4c8e6063653f8", + git_commit = "20cd697a020e7d39ab113c58b162370e092f4d0d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a30b065c2af40ec06b707e17936e5444d9c40011 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 30 Mar 2019 04:02:37 -0700 Subject: [PATCH 2895/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241123217 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 47211020c2e..92374914fcb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8dc3b770edc5f9d00a24f254c3df1a93b03014836807a9db9fd4c8e6063653f8", - git_commit = "20cd697a020e7d39ab113c58b162370e092f4d0d", + sha256 = "4677c17425cb14d7903f5d4a29ec9b081ebf649d19aba81f37d253c627673b16", + git_commit = "d1f28d005128bff1bf92246bbc7ef59907c469bc", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1b32faedc9940d499f26dcc2c1a121546a3c2a82 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 30 Mar 2019 08:02:16 -0700 Subject: [PATCH 2896/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241135475 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 92374914fcb..87d51b9bfb5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4677c17425cb14d7903f5d4a29ec9b081ebf649d19aba81f37d253c627673b16", - git_commit = "d1f28d005128bff1bf92246bbc7ef59907c469bc", + sha256 = "a643088f1ffc9e07bf1f69f2762b289991dd9f176bd32a6d51b5dcccc40b632a", + git_commit = "1bf6646b871d0ce601715f8ed2f50430ca504da7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From db09f0ad62c13bc0bb6bd908df0bc30e8e8cfdba Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 30 Mar 2019 10:01:57 -0700 Subject: [PATCH 2897/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241142247 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 87d51b9bfb5..7dad38ac250 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a643088f1ffc9e07bf1f69f2762b289991dd9f176bd32a6d51b5dcccc40b632a", - git_commit = "1bf6646b871d0ce601715f8ed2f50430ca504da7", + sha256 = "c67567bf1025af1296a41c88e3fdb608d8ac4c8d9416647b4ac943e89bb21d1e", + git_commit = "66a0c2a8ab7662be546de5c5f297d7ed995d64bf", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ee669f073003033aaa50ddac69b96f2d84326325 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 30 Mar 2019 11:02:14 -0700 Subject: [PATCH 2898/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241145618 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7dad38ac250..5e076e649cc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c67567bf1025af1296a41c88e3fdb608d8ac4c8d9416647b4ac943e89bb21d1e", - git_commit = "66a0c2a8ab7662be546de5c5f297d7ed995d64bf", + sha256 = "6feada26849aabfc77b73c9e4f2b9203a7036e2521ecf8d1798066e106a3d657", + git_commit = "6353d940289a225cfbc104cc647b3c6970077faa", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ec46170ea69d7426e268ae52ce3144ee9b7cc679 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 30 Mar 2019 21:03:08 -0700 Subject: [PATCH 2899/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241175689 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5e076e649cc..d6a680de55a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6feada26849aabfc77b73c9e4f2b9203a7036e2521ecf8d1798066e106a3d657", - git_commit = "6353d940289a225cfbc104cc647b3c6970077faa", + sha256 = "831aaabc1189bd94f79ce31e8f5208be8bcb68e8fbead3839ad0a014640438e5", + git_commit = "c6b4b2c791a398450737e83461d14ee463006810", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 95490ea60fc0327de3b55fa9909740ee73773b77 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 30 Mar 2019 22:02:28 -0700 Subject: [PATCH 2900/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241178771 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d6a680de55a..071ab56097b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "831aaabc1189bd94f79ce31e8f5208be8bcb68e8fbead3839ad0a014640438e5", - git_commit = "c6b4b2c791a398450737e83461d14ee463006810", + sha256 = "1ce2d959fd7208b3569ff18928ffc55970f5e6447fc6cb451bf403f15c81f60e", + git_commit = "097fc1cdef5c56d4bb239a5a44bf950f0b1c4d37", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 371f93d0f012ce147b8b49e42e62c03492221b28 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 30 Mar 2019 23:03:10 -0700 Subject: [PATCH 2901/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241181901 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 071ab56097b..001b4433b08 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1ce2d959fd7208b3569ff18928ffc55970f5e6447fc6cb451bf403f15c81f60e", - git_commit = "097fc1cdef5c56d4bb239a5a44bf950f0b1c4d37", + sha256 = "f35bb27ed9d45515d3f656f8006c64f559aa7285a2d87872fb28c5bbce787408", + git_commit = "87827d55c5a814692898517c0473ea580641bf91", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 14196683601438f5a895464c65d5916801b4c2f1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 31 Mar 2019 04:02:11 -0700 Subject: [PATCH 2902/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241199191 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 001b4433b08..f98b0763df1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f35bb27ed9d45515d3f656f8006c64f559aa7285a2d87872fb28c5bbce787408", - git_commit = "87827d55c5a814692898517c0473ea580641bf91", + sha256 = "2f64c0463074f6512c83aa5279e78a3568536b85368820606d9afbd8325c2fe4", + git_commit = "03feb935c5f98eee0e726836ea30a9cfa562e9fd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8f395c3e8630c5c75ba52a16c746353f15bd3281 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 31 Mar 2019 07:02:36 -0700 Subject: [PATCH 2903/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241209027 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f98b0763df1..09f9911ff08 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2f64c0463074f6512c83aa5279e78a3568536b85368820606d9afbd8325c2fe4", - git_commit = "03feb935c5f98eee0e726836ea30a9cfa562e9fd", + sha256 = "f2313b4da0b70573996c889903660f63f17a7ac6636c11c01a01cefd116136c2", + git_commit = "4ac9871fded47468cb9128ebfbddb81db56e958d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 43635307d3a10d497d6e0e8e4f0b12c3a6dec401 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 31 Mar 2019 10:02:30 -0700 Subject: [PATCH 2904/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241218198 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 09f9911ff08..7de6d0ef33d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f2313b4da0b70573996c889903660f63f17a7ac6636c11c01a01cefd116136c2", - git_commit = "4ac9871fded47468cb9128ebfbddb81db56e958d", + sha256 = "5eb1e6594b659f77370d8cbc3e8764bbc20849c0ba5f9aa15924801f8e2d6751", + git_commit = "937c81c97cf2d3222cb5d75781c7c5abd999b47c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 05caaeabb63a78234d555d88102430106cc42abd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 31 Mar 2019 12:02:16 -0700 Subject: [PATCH 2905/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241224127 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7de6d0ef33d..d002de0b9bd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5eb1e6594b659f77370d8cbc3e8764bbc20849c0ba5f9aa15924801f8e2d6751", - git_commit = "937c81c97cf2d3222cb5d75781c7c5abd999b47c", + sha256 = "1db7390bd4c51be7526dc22d665b451109cdce56eb101f9e70996ed91dbdf746", + git_commit = "5e8df789cc30098d791475c14a623ec68b50b4ed", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2298db294d2ca0bc01768bbcf792099c1204aff7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Apr 2019 00:02:44 -0700 Subject: [PATCH 2906/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241268683 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d002de0b9bd..ca71ea8daf7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1db7390bd4c51be7526dc22d665b451109cdce56eb101f9e70996ed91dbdf746", - git_commit = "5e8df789cc30098d791475c14a623ec68b50b4ed", + sha256 = "ab62bcd4d1defc994c49778a41c7d7082d282f0758610d1b843cee1624762150", + git_commit = "9fd90ad4c7815a9f3bdafe433034012857a158f5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a172944e5a472d5d11d8b7745aeb577d34748eda Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Apr 2019 02:02:11 -0700 Subject: [PATCH 2907/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241283229 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ca71ea8daf7..d8673cdf64c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ab62bcd4d1defc994c49778a41c7d7082d282f0758610d1b843cee1624762150", - git_commit = "9fd90ad4c7815a9f3bdafe433034012857a158f5", + sha256 = "8f80070cac48d954e60de896aefde4cc5829288b4a248db034b6e071eec18f1f", + git_commit = "6ff8dd7b5b07b039b3af025b447aa22ed055c507", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 498e0d69d7153d89bace435ec979906afc5ba373 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Apr 2019 04:02:28 -0700 Subject: [PATCH 2908/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241296777 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d8673cdf64c..7a01ef8e2ad 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8f80070cac48d954e60de896aefde4cc5829288b4a248db034b6e071eec18f1f", - git_commit = "6ff8dd7b5b07b039b3af025b447aa22ed055c507", + sha256 = "bbf0eb847ddc5c6124ad86618287a0c600f1bd6008599b201959101e23884a22", + git_commit = "9ccf10c72a71512e2e492b8968eb4e80f7ea7d0c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 84af1c3bc2a670d6fa97ca51aa53a7779ab831aa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Apr 2019 07:02:17 -0700 Subject: [PATCH 2909/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241317281 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7a01ef8e2ad..4f897be05d5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bbf0eb847ddc5c6124ad86618287a0c600f1bd6008599b201959101e23884a22", - git_commit = "9ccf10c72a71512e2e492b8968eb4e80f7ea7d0c", + sha256 = "35e806487e8148f0f05b83cc7790969ea088d0d5cfadc6b5c71386a5c515afeb", + git_commit = "b06f06148e8adf156702e43e421d78a5bd2ca79b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 54576476fdca14ac931ea8a91035df0725f137c0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Apr 2019 10:02:37 -0700 Subject: [PATCH 2910/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241345710 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4f897be05d5..21afe335265 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "35e806487e8148f0f05b83cc7790969ea088d0d5cfadc6b5c71386a5c515afeb", - git_commit = "b06f06148e8adf156702e43e421d78a5bd2ca79b", + sha256 = "ba9368c95b8f7975ec6434903e239a1f2388018ae4e8f4bcdab8dc28ac89b024", + git_commit = "fad7651026efb5dcbfe42a6b0c146118432cf340", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a1b7ce2a0719a9a77f971441c0451444e00a2b64 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Apr 2019 11:02:32 -0700 Subject: [PATCH 2911/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241358743 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 21afe335265..5630804cd6a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ba9368c95b8f7975ec6434903e239a1f2388018ae4e8f4bcdab8dc28ac89b024", - git_commit = "fad7651026efb5dcbfe42a6b0c146118432cf340", + sha256 = "f40909fd0e4a5de08832e189dc4f39525c389f8d2d81f756f62148fd394f22d7", + git_commit = "c864df4158796fb1fb19425c7b2bb0e04459c62d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e7a8b2c867390aa89e0ec761f21c9fcbdbef456d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Apr 2019 12:02:56 -0700 Subject: [PATCH 2912/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241371745 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5630804cd6a..fab682d31ff 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f40909fd0e4a5de08832e189dc4f39525c389f8d2d81f756f62148fd394f22d7", - git_commit = "c864df4158796fb1fb19425c7b2bb0e04459c62d", + sha256 = "8f91ab1e79a3bf27300b2756bb40f7b6791914ceda7ce77d6bce753db55e209b", + git_commit = "bf955a8662d9de869d24aa57c0a5c5b2f310367a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f9adbf357cd722f7fd78966f19501163da4edfe3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Apr 2019 13:02:11 -0700 Subject: [PATCH 2913/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241382829 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fab682d31ff..137da2b01e2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8f91ab1e79a3bf27300b2756bb40f7b6791914ceda7ce77d6bce753db55e209b", - git_commit = "bf955a8662d9de869d24aa57c0a5c5b2f310367a", + sha256 = "3c52f90dda75ecf68b9f3fba0e58f6f209f96e92b15ccb9c6121092bb8e3d478", + git_commit = "bd0d17f39740ab47bc5be5bd9aa3a1bd7991dc71", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3d11a367ddccf3f4d32f4081449188306464e0d0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Apr 2019 14:02:32 -0700 Subject: [PATCH 2914/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241394524 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 137da2b01e2..5e2fd2e3d54 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3c52f90dda75ecf68b9f3fba0e58f6f209f96e92b15ccb9c6121092bb8e3d478", - git_commit = "bd0d17f39740ab47bc5be5bd9aa3a1bd7991dc71", + sha256 = "939aeb83328c12956a50375fd93f9661d307810a88c39919c094088f7665f467", + git_commit = "a89be16e7a60e75147c9add575c8191a2ceb9a48", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5e300acc73e1030d50ad83686b1b1f25805fdd09 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Apr 2019 15:02:05 -0700 Subject: [PATCH 2915/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241407060 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5e2fd2e3d54..96afe7105c5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "939aeb83328c12956a50375fd93f9661d307810a88c39919c094088f7665f467", - git_commit = "a89be16e7a60e75147c9add575c8191a2ceb9a48", + sha256 = "ffe816173d16cb86be72508ee6ecea5855d2fffe3912ea8428be8b9bf83ff622", + git_commit = "2699ef10f22ef7b79412b215dfcb79f26aeb5d54", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 89608b34cdf93d08d4a15237e19dcf1b65b4f95d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Apr 2019 16:02:06 -0700 Subject: [PATCH 2916/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241418710 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 96afe7105c5..e0ca57241d5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ffe816173d16cb86be72508ee6ecea5855d2fffe3912ea8428be8b9bf83ff622", - git_commit = "2699ef10f22ef7b79412b215dfcb79f26aeb5d54", + sha256 = "c10484c91ef11d412e6fcf81d62434c7ed91b15713b393238bdf3c60f7fd3a3a", + git_commit = "764fdc6fb1a9ac377440e1b537ff8a6b7e9f2063", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 104a5464dff7bbfcdeae7a1f83016c6862bb6d16 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Apr 2019 17:02:33 -0700 Subject: [PATCH 2917/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241429888 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e0ca57241d5..fabd2e737a6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c10484c91ef11d412e6fcf81d62434c7ed91b15713b393238bdf3c60f7fd3a3a", - git_commit = "764fdc6fb1a9ac377440e1b537ff8a6b7e9f2063", + sha256 = "58825cb97f5bbe957b129093c251d5b50a1672d7d3a4be6db9ff04419a610f67", + git_commit = "d6aa41f1e21d4876ef208cc2e06bf45dcfeee473", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 25e3585a9e344e21ce52ec8685dde7b408406816 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Apr 2019 18:02:27 -0700 Subject: [PATCH 2918/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241438909 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fabd2e737a6..51a544dcd23 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "58825cb97f5bbe957b129093c251d5b50a1672d7d3a4be6db9ff04419a610f67", - git_commit = "d6aa41f1e21d4876ef208cc2e06bf45dcfeee473", + sha256 = "5e877309d7aab50f9b87a99aa74a911ee6ddee9765b7eed854963128d017916f", + git_commit = "7362d37521d3c14617f3355c66a0f6e5d1e80409", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From dd2f22b59632b08e2d5341eeed902b72ab50a4b1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Apr 2019 19:03:15 -0700 Subject: [PATCH 2919/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 241446347 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 51a544dcd23..1ba4fc51a12 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5e877309d7aab50f9b87a99aa74a911ee6ddee9765b7eed854963128d017916f", - git_commit = "7362d37521d3c14617f3355c66a0f6e5d1e80409", + sha256 = "043dd78fcc42347ecc15fdce13666633999388cb08da4a0e53f94c68915ef917", + git_commit = "269e8a35bdfd35b2c4923ac4867524109c6e9b55", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 63d31a33b4f6faeb0764bb159d403f2b49061aed Mon Sep 17 00:00:00 2001 From: hongkuny Date: Tue, 2 Apr 2019 11:50:25 -0700 Subject: [PATCH 2920/8103] improve tpu server warm up PiperOrigin-RevId: 241573130 --- tensorflow_serving/model_servers/server.cc | 5 +++++ tensorflow_serving/model_servers/server.h | 2 ++ 2 files changed, 7 insertions(+) diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index 7582cd527a4..d0cd970615a 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -254,6 +254,11 @@ Status Server::BuildAndStart(const Options& server_options) { } session_bundle_config.set_enable_model_warmup( server_options.enable_model_warmup); + if (server_options.num_request_iterations_for_warmup > 0) { + session_bundle_config.mutable_model_warmup_options() + ->mutable_num_request_iterations() + ->set_value(server_options.num_request_iterations_for_warmup); + } options.platform_config_map = CreateTensorFlowPlatformConfigMap( session_bundle_config, use_saved_model); } else { diff --git a/tensorflow_serving/model_servers/server.h b/tensorflow_serving/model_servers/server.h index 78a97a3fbc2..4fe15908924 100644 --- a/tensorflow_serving/model_servers/server.h +++ b/tensorflow_serving/model_servers/server.h @@ -72,6 +72,8 @@ class Server { tensorflow::string ssl_config_file; string model_config_file; bool enable_model_warmup = true; + // This value is used only if > 0. + tensorflow::int32 num_request_iterations_for_warmup = 0; tensorflow::string monitoring_config_file; // Tensorflow session run options. bool enforce_session_run_timeout = true; From b64a666b3eacf797a105e4b95bed996c12b36aa3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Apr 2019 15:02:22 -0700 Subject: [PATCH 2921/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242015620 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1ba4fc51a12..2b1beb063d7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "043dd78fcc42347ecc15fdce13666633999388cb08da4a0e53f94c68915ef917", - git_commit = "269e8a35bdfd35b2c4923ac4867524109c6e9b55", + sha256 = "aa5e09602670e40e44452f3aeab39e379c1428a35b0b812e197e0629718b6545", + git_commit = "862d326bffbf053753fce3f293ccc4704c771474", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c4674867aa4d57225b1d802dd9db9a0442231432 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Apr 2019 16:02:27 -0700 Subject: [PATCH 2922/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242027443 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2b1beb063d7..ec1859b7db7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "aa5e09602670e40e44452f3aeab39e379c1428a35b0b812e197e0629718b6545", - git_commit = "862d326bffbf053753fce3f293ccc4704c771474", + sha256 = "43b3d52b2f6bce6162583b085fff1889fc43e34107c70b33835886f142a2b8fa", + git_commit = "27590b0e09c9cc3a17d0a3bcef2c73bdce2bdd55", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 275bc2ee1b76a74691bd4bf4a03dc9f98b3c7f4a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Apr 2019 17:02:46 -0700 Subject: [PATCH 2923/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242037644 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ec1859b7db7..df73abf883e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "43b3d52b2f6bce6162583b085fff1889fc43e34107c70b33835886f142a2b8fa", - git_commit = "27590b0e09c9cc3a17d0a3bcef2c73bdce2bdd55", + sha256 = "9972e055dc3204783839e63f3b4a3dc1ce565ce9f8359f54d1b0ef68cddb14d4", + git_commit = "def33ac1861108f79f04cd2edee8892cb6e09539", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d81471b539e06dc00aaece62b30fb2d573d92f7e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Apr 2019 18:02:21 -0700 Subject: [PATCH 2924/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242046921 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index df73abf883e..c34033141c2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9972e055dc3204783839e63f3b4a3dc1ce565ce9f8359f54d1b0ef68cddb14d4", - git_commit = "def33ac1861108f79f04cd2edee8892cb6e09539", + sha256 = "a83b55a2bd7ed2a65a7a582d85ab43c840e4aaa3886100ff0ffd369e15c3b1af", + git_commit = "621d18e896a8bc42205afd438ec12b6a2b018533", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1e679c1aac1c127e6e8b6a405b665732f0ee913c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Apr 2019 19:02:38 -0700 Subject: [PATCH 2925/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242053874 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c34033141c2..0c463bceb21 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a83b55a2bd7ed2a65a7a582d85ab43c840e4aaa3886100ff0ffd369e15c3b1af", - git_commit = "621d18e896a8bc42205afd438ec12b6a2b018533", + sha256 = "3e681c57890babba7add76b3ff707cb35ab537f87de759915d4ec21d25e6c58c", + git_commit = "51a3acd6a00e155a3ff0c1bf54981d7c5b885af5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5f72882f079fecbdad5cabe62094588bdd9bb215 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Apr 2019 20:02:34 -0700 Subject: [PATCH 2926/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242059189 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0c463bceb21..b51d40c6f2e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3e681c57890babba7add76b3ff707cb35ab537f87de759915d4ec21d25e6c58c", - git_commit = "51a3acd6a00e155a3ff0c1bf54981d7c5b885af5", + sha256 = "c8573ffa818012a6a6e610faf10b9d00acb4f26883387fa637be3a7f5274c6fd", + git_commit = "82735fd7a6ede82a7c9fa04d21de7fcfd09edd2e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5b5bba18cb204612ba30916f5071b435eaa51e59 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Apr 2019 21:02:25 -0700 Subject: [PATCH 2927/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242064531 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b51d40c6f2e..9e0a634b81a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c8573ffa818012a6a6e610faf10b9d00acb4f26883387fa637be3a7f5274c6fd", - git_commit = "82735fd7a6ede82a7c9fa04d21de7fcfd09edd2e", + sha256 = "30da61d0eb070f7dbe055b37a1f1837392c3ceaef5dba71869bfcf4c14099771", + git_commit = "3bf4628d7523c28cf08524123ef50b7bcd03ad4b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1aeeb2ec87f35912bb8cde484671b11d3288deff Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Apr 2019 23:02:27 -0700 Subject: [PATCH 2928/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242074775 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9e0a634b81a..c543359d489 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "30da61d0eb070f7dbe055b37a1f1837392c3ceaef5dba71869bfcf4c14099771", - git_commit = "3bf4628d7523c28cf08524123ef50b7bcd03ad4b", + sha256 = "89633cb66236944f46bf2bea915cb37907cb1495fa0b527abcc061bb6b8cf1ea", + git_commit = "a1e3d4490d66d731102b282f5eedfcfed592054b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a075ebe5eff56f3311d6e2cc2d23e4e82567596b Mon Sep 17 00:00:00 2001 From: awk Date: Fri, 5 Apr 2019 08:40:11 -0700 Subject: [PATCH 2929/8103] Re-enable MKLDNN contraction kernels by default. PiperOrigin-RevId: 242130768 --- .bazelrc | 3 --- 1 file changed, 3 deletions(-) diff --git a/.bazelrc b/.bazelrc index 083f8e23e6b..42093509a47 100644 --- a/.bazelrc +++ b/.bazelrc @@ -34,9 +34,6 @@ build --define=grpc_no_ares=true # Sets the default Apple platform to macOS. build --apple_platform_type=macos -# Disable MKL-DNN contraction kernels by default. -build --define=tensorflow_mkldnn_contraction_kernel=0 - build -c opt # Adding --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0" creates parity with TF From b5700c75291848e32d2e298f372253a113bef754 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Apr 2019 13:02:27 -0700 Subject: [PATCH 2930/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242178462 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c543359d489..89fc4e0e4dd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "89633cb66236944f46bf2bea915cb37907cb1495fa0b527abcc061bb6b8cf1ea", - git_commit = "a1e3d4490d66d731102b282f5eedfcfed592054b", + sha256 = "b8a95ac81d3632cab97fb5fedd62cd65c8829e7fbb89ec83ea7e22f78fd59eaa", + git_commit = "0d4d88c0514a6026fd90efc06e1adb5f8aa9255c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 65e235c9ced7d72a53f98336f4418929159dca73 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Apr 2019 14:02:44 -0700 Subject: [PATCH 2931/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242189525 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 89fc4e0e4dd..6048ebcdb2e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b8a95ac81d3632cab97fb5fedd62cd65c8829e7fbb89ec83ea7e22f78fd59eaa", - git_commit = "0d4d88c0514a6026fd90efc06e1adb5f8aa9255c", + sha256 = "ab604cf7b0b8a2604c73698c123f2bb6c74678f45f3236bfaf66df9854bcc69e", + git_commit = "ee77551db7c76334e6a94ce1920aa26fb4049b70", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f9fef1b18512ac8f577f3a02b2e3c55cc1bedf39 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Apr 2019 15:02:20 -0700 Subject: [PATCH 2932/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242200958 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6048ebcdb2e..4c6f6866e2b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ab604cf7b0b8a2604c73698c123f2bb6c74678f45f3236bfaf66df9854bcc69e", - git_commit = "ee77551db7c76334e6a94ce1920aa26fb4049b70", + sha256 = "78813451e905f0b989ecb6f38231892e8a818892259677ad88b6fc1632a69a5d", + git_commit = "112e128f391ac2acc08d4145468c3536589d106e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5e6aac54079c5800c26a1988a779e8deb1422b9e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Apr 2019 16:02:33 -0700 Subject: [PATCH 2933/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242211258 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4c6f6866e2b..02c4e6dcfad 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "78813451e905f0b989ecb6f38231892e8a818892259677ad88b6fc1632a69a5d", - git_commit = "112e128f391ac2acc08d4145468c3536589d106e", + sha256 = "fab3b38d119d51d390f21206cfcdc3e3202c8fc4824cd2c89b6c9dea5f469c12", + git_commit = "13b4bbdffdeddc1b754d7141f70934577ae8c053", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 23ceb08d771118a2abdd28835f126c8675ba2f60 Mon Sep 17 00:00:00 2001 From: laigd Date: Fri, 5 Apr 2019 16:41:40 -0700 Subject: [PATCH 2934/8103] Stop removing libnvinfer_plugin.so since future version of TF GPU builds depends on it. PiperOrigin-RevId: 242217476 --- tensorflow_serving/tools/docker/Dockerfile.devel-gpu | 2 +- tensorflow_serving/tools/docker/Dockerfile.gpu | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 2cba1ec4a2a..21bfebf6c7d 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -73,7 +73,7 @@ RUN apt-get update && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* && \ rm /usr/lib/x86_64-linux-gnu/libnvinfer_static.a && \ - rm /usr/lib/x86_64-linux-gnu/libnvinfer_plugin* && \ + rm /usr/lib/x86_64-linux-gnu/libnvinfer_plugin_static.a && \ rm /usr/lib/x86_64-linux-gnu/libnvcaffe_parser* && \ rm /usr/lib/x86_64-linux-gnu/libnvparsers* diff --git a/tensorflow_serving/tools/docker/Dockerfile.gpu b/tensorflow_serving/tools/docker/Dockerfile.gpu index bab9f06d112..d34856eb217 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.gpu @@ -47,8 +47,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ # which contains libnvinfer library, so it needs another 'apt-get update' to # retrieve that list before it can actually install the library. # -# We don't install libnvinfer-dev since we don't need to build against TensorRT, -# and libnvinfer4 doesn't contain libnvinfer_static.a static library. +# We don't install libnvinfer-dev since we don't need to build against TensorRT. RUN apt-get update && \ apt-get install --no-install-recommends \ nvinfer-runtime-trt-repo-ubuntu1604-${TF_TENSORRT_VERSION}-ga-cuda10.0 && \ @@ -57,7 +56,6 @@ RUN apt-get update && \ libnvinfer5=${TF_TENSORRT_VERSION}-1+cuda10.0 && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* && \ - rm /usr/lib/x86_64-linux-gnu/libnvinfer_plugin* && \ rm /usr/lib/x86_64-linux-gnu/libnvcaffe_parser* && \ rm /usr/lib/x86_64-linux-gnu/libnvparsers* From d81a46c4ab320053f8e3356c1d6e21fde442b99a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Apr 2019 17:02:22 -0700 Subject: [PATCH 2935/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242220453 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 02c4e6dcfad..e019af5e88c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fab3b38d119d51d390f21206cfcdc3e3202c8fc4824cd2c89b6c9dea5f469c12", - git_commit = "13b4bbdffdeddc1b754d7141f70934577ae8c053", + sha256 = "0a288f83826f26b296d673adbf2f8ee50ac68231df791718b4b3d1ced48a1f76", + git_commit = "1b57563032f5020b59a5276e7694c37f278b482a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b1089ee21100dae3c83d440be0c3e77ca4a189b3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Apr 2019 18:02:13 -0700 Subject: [PATCH 2936/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242227192 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e019af5e88c..367de582a9a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0a288f83826f26b296d673adbf2f8ee50ac68231df791718b4b3d1ced48a1f76", - git_commit = "1b57563032f5020b59a5276e7694c37f278b482a", + sha256 = "fbbe3d93638ec4022371d6584dc8238a4006a9d64dc2e4d4fcbd7daed7514e77", + git_commit = "dcc3313598a82ae689918a73e59552eb53d44710", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 29a58137b9393dc4b7ea299ef8b86b8dac45bda2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Apr 2019 19:02:23 -0700 Subject: [PATCH 2937/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242232441 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 367de582a9a..c2cdb4db76e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fbbe3d93638ec4022371d6584dc8238a4006a9d64dc2e4d4fcbd7daed7514e77", - git_commit = "dcc3313598a82ae689918a73e59552eb53d44710", + sha256 = "7804f38f97badcffc45769fd208a4487d4f64ed0964757111ceb6ab33d0efb4e", + git_commit = "2147192998edc8e211d594af51709fbb628ed09d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 149ebc2fd8f343d82f147da90318c76cea40a69b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Apr 2019 20:02:28 -0700 Subject: [PATCH 2938/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242236405 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c2cdb4db76e..b52d5a4cf7a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7804f38f97badcffc45769fd208a4487d4f64ed0964757111ceb6ab33d0efb4e", - git_commit = "2147192998edc8e211d594af51709fbb628ed09d", + sha256 = "6f7ee6daa642b0d136f8c67630dadcc9cdddae199e63e48f35d5890370c133ea", + git_commit = "d78a3d1cbe3720a9b471cfba57696014dc8eaab0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3b9c97375e9230716314fe25b46405f9cbcf28f2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 6 Apr 2019 01:02:24 -0700 Subject: [PATCH 2939/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242254553 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b52d5a4cf7a..a9b4f119a6a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6f7ee6daa642b0d136f8c67630dadcc9cdddae199e63e48f35d5890370c133ea", - git_commit = "d78a3d1cbe3720a9b471cfba57696014dc8eaab0", + sha256 = "57afe12167108824b78d3930eb845644c7b669e37245c21328389451409680cf", + git_commit = "b43029085bfa48caaef718c9d44abdc116efc600", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 79d5237bbd381bd7a11ed7bb6625f8c34590f45a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 6 Apr 2019 03:02:21 -0700 Subject: [PATCH 2940/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242262094 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a9b4f119a6a..295b6142aed 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "57afe12167108824b78d3930eb845644c7b669e37245c21328389451409680cf", - git_commit = "b43029085bfa48caaef718c9d44abdc116efc600", + sha256 = "fbed8f9b85917f50254c6379b544bdb26b1cc7a67e4dc2147326608ef9fadf14", + git_commit = "378f773e9a8fa8de2d130f700265caf6878dcd0b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 302eae9dc42be6b6a9b67e6cb124fd24f3d5c108 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 6 Apr 2019 19:02:17 -0700 Subject: [PATCH 2941/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242311999 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 295b6142aed..910529d6c24 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fbed8f9b85917f50254c6379b544bdb26b1cc7a67e4dc2147326608ef9fadf14", - git_commit = "378f773e9a8fa8de2d130f700265caf6878dcd0b", + sha256 = "c62260175df3803d96631348c28eec80674d9bb25b4a443df3e88dc219e66732", + git_commit = "ebfd5e0a65e15a3c95a0feafa3afb3cf23cf1db9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 726afba41908b56d3c1eadd6cfd9ee412472ab57 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 6 Apr 2019 20:02:16 -0700 Subject: [PATCH 2942/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242314563 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 910529d6c24..6c5dd4a50c3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c62260175df3803d96631348c28eec80674d9bb25b4a443df3e88dc219e66732", - git_commit = "ebfd5e0a65e15a3c95a0feafa3afb3cf23cf1db9", + sha256 = "39e3ff74c557af0e41c46281b82f6483f26da3ea101abad16dd13adbe971097c", + git_commit = "d957d0c6ff191aad84e6b99b75085b02b83ea64b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 69dfc2888aae66906e0fea0332bd669dcb7a6e7b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 6 Apr 2019 21:02:12 -0700 Subject: [PATCH 2943/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242317466 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6c5dd4a50c3..86918dbe8ad 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "39e3ff74c557af0e41c46281b82f6483f26da3ea101abad16dd13adbe971097c", - git_commit = "d957d0c6ff191aad84e6b99b75085b02b83ea64b", + sha256 = "8859bcb743318a23eef9cdd0ce4fae887ae7809da6b7665d436429abf0879265", + git_commit = "20bbe5a17eeda011c4de74aa48d59ff4fc2f2090", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 91dfe2e9abc7e8637d07dcc9d9badbe09338b16f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 7 Apr 2019 04:03:33 -0700 Subject: [PATCH 2944/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242339955 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 86918dbe8ad..8e18aecdbe4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8859bcb743318a23eef9cdd0ce4fae887ae7809da6b7665d436429abf0879265", - git_commit = "20bbe5a17eeda011c4de74aa48d59ff4fc2f2090", + sha256 = "7e9b4dc678d6aa11e62248094e1e23ba22186b57948f80615a2d0d22d765c439", + git_commit = "ea1d14f364cfe54cac82bae96161788e0e057c83", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 44bf6f17ad20be7638cecad6cda43288aee80b63 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 7 Apr 2019 07:05:32 -0700 Subject: [PATCH 2945/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242349617 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8e18aecdbe4..cd4b75e055f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7e9b4dc678d6aa11e62248094e1e23ba22186b57948f80615a2d0d22d765c439", - git_commit = "ea1d14f364cfe54cac82bae96161788e0e057c83", + sha256 = "3dbafa3bb905f3b479f9ada07b1901ecfcf4305156191893c7e06292c8db4029", + git_commit = "ea467873261d27218a20d366f3027c071afdf32e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 346cff47e98f7e73be8e73fbb9ffb848fcc8c2fd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 7 Apr 2019 18:02:12 -0700 Subject: [PATCH 2946/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242385094 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cd4b75e055f..b315ef5b9c2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3dbafa3bb905f3b479f9ada07b1901ecfcf4305156191893c7e06292c8db4029", - git_commit = "ea467873261d27218a20d366f3027c071afdf32e", + sha256 = "f29e7bcfb310c9fc8db29af321ff48b177ef6924f317403d92d1cb00f6349772", + git_commit = "333a9268e94a0f5c36f9aab70963f7ffddf924cb", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 16532cc9a3838463ce53c4e64efb1eff6fd5b081 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 7 Apr 2019 21:02:15 -0700 Subject: [PATCH 2947/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242397454 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b315ef5b9c2..be932e4ed69 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f29e7bcfb310c9fc8db29af321ff48b177ef6924f317403d92d1cb00f6349772", - git_commit = "333a9268e94a0f5c36f9aab70963f7ffddf924cb", + sha256 = "7d79aece4d5aeded47774f5ebb2947d75c740c218a1ccc8040adfa07aeea7591", + git_commit = "961bb02b882a8bb921e5be1c09c34b51fffd25dc", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d26da2e9ddc0abcbae8d1eaddce748c280348750 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 7 Apr 2019 23:02:12 -0700 Subject: [PATCH 2948/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242406019 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index be932e4ed69..e1e8437be3a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7d79aece4d5aeded47774f5ebb2947d75c740c218a1ccc8040adfa07aeea7591", - git_commit = "961bb02b882a8bb921e5be1c09c34b51fffd25dc", + sha256 = "8cb4db4b9897d27df7b1a016c50d947304663f78775320e5f6c825642dab9033", + git_commit = "07e820fc5ecaa7356f208fabb8f326932434db6d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ec1fa61cb695709e192dac018291de6e95a10ddc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 8 Apr 2019 00:02:25 -0700 Subject: [PATCH 2949/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242410300 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e1e8437be3a..ff67cf0e1ef 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8cb4db4b9897d27df7b1a016c50d947304663f78775320e5f6c825642dab9033", - git_commit = "07e820fc5ecaa7356f208fabb8f326932434db6d", + sha256 = "321946fadf62a692f32208ebdd7f531fe454479347b692c401eea59dbde503a0", + git_commit = "0b490162f7a275ba91e102848e254beab59acadc", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4d7b002265fcf214768336c906f0314fa1f94748 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 8 Apr 2019 03:02:52 -0700 Subject: [PATCH 2950/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242431527 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ff67cf0e1ef..82e98c008ae 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "321946fadf62a692f32208ebdd7f531fe454479347b692c401eea59dbde503a0", - git_commit = "0b490162f7a275ba91e102848e254beab59acadc", + sha256 = "bde3de7b32c41106896fc9a1203cdde1f904101da74cebb237e32a200f3f6169", + git_commit = "50f1ccacc69d9bd228cd7ac351aa0a72a9a594d8", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4cb67ede10382fa26e46154f81d6f059da5687e9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 8 Apr 2019 06:02:32 -0700 Subject: [PATCH 2951/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242449229 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 82e98c008ae..8d922558986 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bde3de7b32c41106896fc9a1203cdde1f904101da74cebb237e32a200f3f6169", - git_commit = "50f1ccacc69d9bd228cd7ac351aa0a72a9a594d8", + sha256 = "706fa4969aea73f9ecd56db47bf77153bbc445ead21ae57787efd93175f4eaf7", + git_commit = "34fd2a5e9bcdb40957ece90fec46a37e6e9248b2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4f47768cc940997f5c2279e735b619f8d99483b2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 8 Apr 2019 08:02:44 -0700 Subject: [PATCH 2952/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242463453 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8d922558986..2f8c13d1b33 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "706fa4969aea73f9ecd56db47bf77153bbc445ead21ae57787efd93175f4eaf7", - git_commit = "34fd2a5e9bcdb40957ece90fec46a37e6e9248b2", + sha256 = "fdd1ce69d66dfd943c20601ed092c3e7934528fd081bdd3940e68892aa8a369b", + git_commit = "d38aee5165fc4033612e270e1ee222aeb9f60860", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3059ec9db7fb68933c8396966002a58179a58d53 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 8 Apr 2019 11:02:23 -0700 Subject: [PATCH 2953/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242496255 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2f8c13d1b33..b66ebdb90d1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fdd1ce69d66dfd943c20601ed092c3e7934528fd081bdd3940e68892aa8a369b", - git_commit = "d38aee5165fc4033612e270e1ee222aeb9f60860", + sha256 = "3c48f9707a0a1d64ec76e4b302714d26f1b9af1df83fda00b980c337d250fbaf", + git_commit = "7902c2e51b16eb1c504e7dd105717de57f0735b1", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c2a8a95041ed8b48b028a1c6e8c2759f4d8af965 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 8 Apr 2019 12:02:33 -0700 Subject: [PATCH 2954/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242509278 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b66ebdb90d1..3fb3f9a6d85 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3c48f9707a0a1d64ec76e4b302714d26f1b9af1df83fda00b980c337d250fbaf", - git_commit = "7902c2e51b16eb1c504e7dd105717de57f0735b1", + sha256 = "5eb14741db42d40a82865ac7be0b4142e3dc8f3d8de7dc79018bfb7c867f18d4", + git_commit = "4e2fbd87d8221ee7878b744e85fd75a3d6473ae7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1ccd01fbc6d4180e725aa7e0f45e44966273914f Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Mon, 8 Apr 2019 16:53:54 -0700 Subject: [PATCH 2955/8103] Minor comment update. PiperOrigin-RevId: 242566495 --- tools/run_in_docker.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/run_in_docker.sh b/tools/run_in_docker.sh index ee64f6ed830..65bc67d21bd 100755 --- a/tools/run_in_docker.sh +++ b/tools/run_in_docker.sh @@ -22,8 +22,8 @@ # track down dependencies (that are covered by the docker container). # # Note: This script binds your working directory (via pwd) and /tmp to the -# Docker container. Any scripts or programs you run will need to have its output -# routed to one of the above locations in order to persist. +# Docker container. Any scripts or programs you run will need to have its +# output files/dirs written to one of the above locations for persistence. # # Typical usage (to build from lastest upstream source): # $ git clone https://github.com/tensorflow/serving.git From a02687e3fe96edc57c9ed4ad08cfbe5d9ba6e838 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Wed, 10 Apr 2019 16:21:07 -0700 Subject: [PATCH 2956/8103] Fix build failure with TF head sources. Upstream TF bazel build rules now require `bazel_skylib`. PiperOrigin-RevId: 242962953 --- WORKSPACE | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3fb3f9a6d85..b4c03d4340b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -17,8 +17,9 @@ tensorflow_http_archive( load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") -# TensorFlow depends on "io_bazel_rules_closure" so we need this here. -# Needs to be kept in sync with the same target in TensorFlow's WORKSPACE file. +# START: Upstream TensorFlow dependencies +# TensorFlow build depends on these dependencies. +# Needs to be in-sync with TensorFlow sources. http_archive( name = "io_bazel_rules_closure", sha256 = "ddce3b3a3909f99b28b25071c40b7fec7e2e1d1d1a4b2e933f3082aa99517105", @@ -28,6 +29,13 @@ http_archive( "https://github.com/bazelbuild/rules_closure/archive/316e6133888bfc39fb860a4f1a31cfcbae485aef.tar.gz", # 2019-03-21 ], ) +http_archive( + name = "bazel_skylib", + sha256 = "2c62d8cd4ab1e65c08647eb4afe38f51591f43f7f0885e7769832fa137633dcb", + strip_prefix = "bazel-skylib-0.7.0", + urls = ["https://github.com/bazelbuild/bazel-skylib/archive/0.7.0.tar.gz"], +) +# END: Upstream TensorFlow dependencies # Please add all new TensorFlow Serving dependencies in workspace.bzl. load("//tensorflow_serving:workspace.bzl", "tf_serving_workspace") From 000b7edbf7e258caf21ac3444979857a101d3992 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Apr 2019 18:02:21 -0700 Subject: [PATCH 2957/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242979112 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b4c03d4340b..14f45f60ffd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5eb14741db42d40a82865ac7be0b4142e3dc8f3d8de7dc79018bfb7c867f18d4", - git_commit = "4e2fbd87d8221ee7878b744e85fd75a3d6473ae7", + sha256 = "55cf539934aef3435e7275d61c9c886ffd5e49fd1b9ac8c4d7a05876a3bb39b2", + git_commit = "afa13f4c5cdecab5dc4fac195adc6ffb4366ece5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 329b26f4e6602a6002c97f54bceda5c6bcbd08b1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Apr 2019 19:02:08 -0700 Subject: [PATCH 2958/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242985939 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 14f45f60ffd..d07cbd59554 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "55cf539934aef3435e7275d61c9c886ffd5e49fd1b9ac8c4d7a05876a3bb39b2", - git_commit = "afa13f4c5cdecab5dc4fac195adc6ffb4366ece5", + sha256 = "73019018218d42b010f9eb5e93cbe9b525feca4e31c628c74a340a7d53f54730", + git_commit = "906a85ac307821961774aa16553ebb5f0adbe633", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ce2a9a1a27e5dddc6d5204ed1c0cd488f512ffe4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Apr 2019 20:03:01 -0700 Subject: [PATCH 2959/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242992031 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d07cbd59554..c6baa2c711a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "73019018218d42b010f9eb5e93cbe9b525feca4e31c628c74a340a7d53f54730", - git_commit = "906a85ac307821961774aa16553ebb5f0adbe633", + sha256 = "5f476b50a33698589410aac50541489f9b2a5011c5e654eeb49c1a84b64d2933", + git_commit = "fa958c9346854505d67291680d1ed4f816e592c9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6b03214642b3ddf98bafc45faf0cbce19982a32f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Apr 2019 21:02:16 -0700 Subject: [PATCH 2960/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 242997708 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c6baa2c711a..93f1e98c312 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5f476b50a33698589410aac50541489f9b2a5011c5e654eeb49c1a84b64d2933", - git_commit = "fa958c9346854505d67291680d1ed4f816e592c9", + sha256 = "1845afe7a57ff9374907af1a65f87c6a183c32403850cebeac54cb37203320d8", + git_commit = "c38699ce8377640c345dd669b3f71edacdbba810", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 647ee0f4acae6bed186cf7eab18b0ba1c2dd7dda Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Apr 2019 22:02:43 -0700 Subject: [PATCH 2961/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243003326 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 93f1e98c312..a5c55045312 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1845afe7a57ff9374907af1a65f87c6a183c32403850cebeac54cb37203320d8", - git_commit = "c38699ce8377640c345dd669b3f71edacdbba810", + sha256 = "cfea6958e990d843581cbefb5374aca0296613bff2adc50fa59dab6d969c6bba", + git_commit = "c39738021bdc719d6c8763556d63ff5abcab6a9b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7f18875112cac96bec82e6b727cb4ed03916e6e6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Apr 2019 23:02:30 -0700 Subject: [PATCH 2962/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243008689 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a5c55045312..419b277b265 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cfea6958e990d843581cbefb5374aca0296613bff2adc50fa59dab6d969c6bba", - git_commit = "c39738021bdc719d6c8763556d63ff5abcab6a9b", + sha256 = "cb9affe6015ed9f11ca08b1e054df9efe3a6f1e2e1e694a925af49adf16ada14", + git_commit = "514dd74c5b34f318ed23c6bfbcf0992d6f622e9a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4604b51c0f1ba0d5d135b6e9d96ed3f42d477359 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Apr 2019 00:02:43 -0700 Subject: [PATCH 2963/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243013911 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 419b277b265..e6b16255b55 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cb9affe6015ed9f11ca08b1e054df9efe3a6f1e2e1e694a925af49adf16ada14", - git_commit = "514dd74c5b34f318ed23c6bfbcf0992d6f622e9a", + sha256 = "ec5cb557b8849e02c0c512a476afa424a128c726e3b389e47bb50d5ca24c7ed4", + git_commit = "5581b91ada226f1ec20f55cd6423853072b2813c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 01247edd3512d401c6be3943c3d43a03c256e272 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Apr 2019 01:02:19 -0700 Subject: [PATCH 2964/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243020671 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e6b16255b55..a8ae5bace81 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ec5cb557b8849e02c0c512a476afa424a128c726e3b389e47bb50d5ca24c7ed4", - git_commit = "5581b91ada226f1ec20f55cd6423853072b2813c", + sha256 = "455751280e363c2fd0c61412ecaaa4977bb2521ba8592dc95f2b88a79870c069", + git_commit = "e9a474d3d26a62da845545868dfdde73a2ad8a6f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 307c6ef06ea3f9e61e4ff0a511a20fee814e8328 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Apr 2019 02:02:13 -0700 Subject: [PATCH 2965/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243027782 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a8ae5bace81..8088830b122 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "455751280e363c2fd0c61412ecaaa4977bb2521ba8592dc95f2b88a79870c069", - git_commit = "e9a474d3d26a62da845545868dfdde73a2ad8a6f", + sha256 = "91877b6592baa287323ba96f9c70c464d551b3e33a85a3983ff224b0e9d87df5", + git_commit = "1cdae4922cfe6821eafb163d9f825e29b4f1fc80", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b028cc07862d3de2022f45fefc4313751f53e8a9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Apr 2019 03:02:27 -0700 Subject: [PATCH 2966/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243035409 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8088830b122..b6726c0a27c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "91877b6592baa287323ba96f9c70c464d551b3e33a85a3983ff224b0e9d87df5", - git_commit = "1cdae4922cfe6821eafb163d9f825e29b4f1fc80", + sha256 = "fbc94d328046f4fc56d9af4595c2381076f2aff23995e017de2708f8a052e572", + git_commit = "7c191a71ac00f8554ef3fd095134fc8aad5b3c34", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 392b5754be3bd6a70288fb8043a14aea50e2b3c0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Apr 2019 04:02:14 -0700 Subject: [PATCH 2967/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243041379 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b6726c0a27c..e1682cd5c4f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fbc94d328046f4fc56d9af4595c2381076f2aff23995e017de2708f8a052e572", - git_commit = "7c191a71ac00f8554ef3fd095134fc8aad5b3c34", + sha256 = "00f71725925f41f317d048ceff7de2fe50a0ba77d68f59151f90edfd131508e0", + git_commit = "f9a8664a55bfdf71d3cb85a8b202ee3f97cc4827", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c2e9056c8a2755f0d31af3bd19e7cb5aab8dc9bf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Apr 2019 05:02:40 -0700 Subject: [PATCH 2968/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243047529 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e1682cd5c4f..eefaf6480f6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "00f71725925f41f317d048ceff7de2fe50a0ba77d68f59151f90edfd131508e0", - git_commit = "f9a8664a55bfdf71d3cb85a8b202ee3f97cc4827", + sha256 = "9d3fbe8dd6e006e2f0bec4f35a83007a81c6a32db57280287c58adba2d1e02fc", + git_commit = "7bdb14a0bbfa98433e0e24e18d31d87592ffdc64", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5221226347143a14bd656f62ac81f29c2172a7b5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Apr 2019 10:03:09 -0700 Subject: [PATCH 2969/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243090160 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index eefaf6480f6..9ca26f5c2af 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9d3fbe8dd6e006e2f0bec4f35a83007a81c6a32db57280287c58adba2d1e02fc", - git_commit = "7bdb14a0bbfa98433e0e24e18d31d87592ffdc64", + sha256 = "2713e865a3d25cf57d0045bc90f53f721e343c5f68fc9efa7be13dc0dd91a6b7", + git_commit = "d6a7c6a4a6894cfc2de38bab192d6f615071e419", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 979dd778f9248065e3ecd03a86a189694015cd2a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Apr 2019 11:07:05 -0700 Subject: [PATCH 2970/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243103207 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9ca26f5c2af..66b2a296107 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2713e865a3d25cf57d0045bc90f53f721e343c5f68fc9efa7be13dc0dd91a6b7", - git_commit = "d6a7c6a4a6894cfc2de38bab192d6f615071e419", + sha256 = "f69a1a44c800cf552ab32e1518f360586b5c712d1c09350d767af3cc4e1500fe", + git_commit = "04edd26a5a2f73a4c7bdd1b3ef6a6ef7e5643af7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5660d69552b8df766fba2d20cf9f2534b9f78330 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Apr 2019 12:02:22 -0700 Subject: [PATCH 2971/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243114542 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 66b2a296107..7bf4a049b1e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f69a1a44c800cf552ab32e1518f360586b5c712d1c09350d767af3cc4e1500fe", - git_commit = "04edd26a5a2f73a4c7bdd1b3ef6a6ef7e5643af7", + sha256 = "dd23ef3bfa3b1fc2e49e0b128b72046df1e7c907aa73d4fbdd427cb8081783d3", + git_commit = "36e10587b556c5f61d7c7d2c9728cc076fbdac79", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 50498f430952738ddf31ec6a5bdeee646c51de44 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Apr 2019 13:02:14 -0700 Subject: [PATCH 2972/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243125564 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7bf4a049b1e..1e981bd2427 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dd23ef3bfa3b1fc2e49e0b128b72046df1e7c907aa73d4fbdd427cb8081783d3", - git_commit = "36e10587b556c5f61d7c7d2c9728cc076fbdac79", + sha256 = "56ff3bc1cd53f6d466f2996bbbb59cd4fc21ba51e6be2c96d027f908f676d723", + git_commit = "1942fea1b8a2be3e9eaad93cc9bd6af5a285a71f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 60d93474077a54332b8a22bcd1a84e913c1988b1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Apr 2019 14:02:17 -0700 Subject: [PATCH 2973/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243137423 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1e981bd2427..fcad8890c0f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "56ff3bc1cd53f6d466f2996bbbb59cd4fc21ba51e6be2c96d027f908f676d723", - git_commit = "1942fea1b8a2be3e9eaad93cc9bd6af5a285a71f", + sha256 = "fa0be597a439a195822227df7f4fa1a9f11440dcdbdae79835a20373fa777b33", + git_commit = "c43ab94a05c0c9aedec20bf2a4b4a94733c7596c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c0a1f188f2699a542a819f7770d2782b7ca75053 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Apr 2019 15:02:34 -0700 Subject: [PATCH 2974/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243149581 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fcad8890c0f..c63f5a4866e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fa0be597a439a195822227df7f4fa1a9f11440dcdbdae79835a20373fa777b33", - git_commit = "c43ab94a05c0c9aedec20bf2a4b4a94733c7596c", + sha256 = "792bf7ac5b5e60708143dca81d8dc93bd6fac313bc56a47032ed93431fb3e20e", + git_commit = "c855c42727f67abded9217250f71b5b6c8d03829", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From df3f1b7abd0daeb97294bfaac13d349b360f3de8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Apr 2019 16:02:23 -0700 Subject: [PATCH 2975/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243160822 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c63f5a4866e..3157522a8be 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "792bf7ac5b5e60708143dca81d8dc93bd6fac313bc56a47032ed93431fb3e20e", - git_commit = "c855c42727f67abded9217250f71b5b6c8d03829", + sha256 = "741d6825a67fcc57f54b15c740d3603a71618f4e6e0e404906e2ea76ac138630", + git_commit = "bcd52c501568b7f5f8a9dd1eda754f97707685fa", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 793c9491490a6b76fa68a64fcc4dfa865be43715 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Apr 2019 17:02:24 -0700 Subject: [PATCH 2976/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243171544 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3157522a8be..e25c5ff4a1d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "741d6825a67fcc57f54b15c740d3603a71618f4e6e0e404906e2ea76ac138630", - git_commit = "bcd52c501568b7f5f8a9dd1eda754f97707685fa", + sha256 = "549125691dbdbb2498fdd31994d4d71f6568bf8da2aec332975fd3792fb2e5e7", + git_commit = "1500609ed646324d3245d004fcabe6fe86c84fd4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2f64f0f88b16b53b4db1e8a37084153fb38b0222 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Apr 2019 18:02:10 -0700 Subject: [PATCH 2977/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243179755 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e25c5ff4a1d..f3d3e0e8ec3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "549125691dbdbb2498fdd31994d4d71f6568bf8da2aec332975fd3792fb2e5e7", - git_commit = "1500609ed646324d3245d004fcabe6fe86c84fd4", + sha256 = "8ec539ddbedf63c0561ee894bc25852958954524583f3981d8dbdd1c148d4fb8", + git_commit = "cf838c4bf711d013d9ffe9f40e7daffdf3a60491", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 719fa3630c446dc7eff0fd11cda02023573ff306 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Apr 2019 19:02:12 -0700 Subject: [PATCH 2978/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243186724 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f3d3e0e8ec3..3a6aeb6500f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8ec539ddbedf63c0561ee894bc25852958954524583f3981d8dbdd1c148d4fb8", - git_commit = "cf838c4bf711d013d9ffe9f40e7daffdf3a60491", + sha256 = "dc43d72dabc8c5b1d3fc47a226b2807e1c3d6f2b5cfee42606da61bbaecd9e42", + git_commit = "4fc3d561ede79a505ed121464c0d17a3533c7190", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b61bbc99aef21347e666fa7c714da5c0fc1f382e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Apr 2019 20:02:03 -0700 Subject: [PATCH 2979/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243191969 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3a6aeb6500f..efa66af11c5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dc43d72dabc8c5b1d3fc47a226b2807e1c3d6f2b5cfee42606da61bbaecd9e42", - git_commit = "4fc3d561ede79a505ed121464c0d17a3533c7190", + sha256 = "e69f41c65b18fe9212f89ab0a2899de26be85f0bbfc7190a278c95427d2acccb", + git_commit = "b4c1a02653f2e7f41d305e89738d0ab747a9427b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b9afaa0cd73582815a18f919a963de1e2d7a8771 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Apr 2019 21:02:10 -0700 Subject: [PATCH 2980/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243197503 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index efa66af11c5..753815416db 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e69f41c65b18fe9212f89ab0a2899de26be85f0bbfc7190a278c95427d2acccb", - git_commit = "b4c1a02653f2e7f41d305e89738d0ab747a9427b", + sha256 = "a5431a7b9b6d770418c1b3d518628f26dc3eaff5e46d4ca955b8a3d076657b34", + git_commit = "aa6c26f4d8e1572226c23cc2b7ab7b25a8251029", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 914aca551d41969f9f47d05ae094476381a0cf97 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Apr 2019 22:02:25 -0700 Subject: [PATCH 2981/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243202806 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 753815416db..2d2dcb0bb5f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a5431a7b9b6d770418c1b3d518628f26dc3eaff5e46d4ca955b8a3d076657b34", - git_commit = "aa6c26f4d8e1572226c23cc2b7ab7b25a8251029", + sha256 = "b174c240caa381cf7040787b4bdcbaeba39b1553756afbbeda809486d90fd1bf", + git_commit = "2afc6f8862ec04708f166627dd7c9a3d045649b4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0a6472eb281f3970b5383186b749941767debeb5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Apr 2019 23:02:53 -0700 Subject: [PATCH 2982/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243207938 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2d2dcb0bb5f..7d205a9262b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b174c240caa381cf7040787b4bdcbaeba39b1553756afbbeda809486d90fd1bf", - git_commit = "2afc6f8862ec04708f166627dd7c9a3d045649b4", + sha256 = "3dc5cf2121dda7c4c6d4d08f94ce7c4f108d4f2d6d23522ea58eda8c61800a4f", + git_commit = "6d43308884139bb120ebeefba7d69d83f796a90d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1e0e3cfe3efc62b910bf5cdb3b48df13c51ce9af Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Apr 2019 00:02:20 -0700 Subject: [PATCH 2983/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243213217 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7d205a9262b..951ee0e6a0d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3dc5cf2121dda7c4c6d4d08f94ce7c4f108d4f2d6d23522ea58eda8c61800a4f", - git_commit = "6d43308884139bb120ebeefba7d69d83f796a90d", + sha256 = "659c03f5cd6b5b914bc720dd62f53000ac1161039502cedf7fda29627872be9c", + git_commit = "7e4c43bbe8b98e3ec794268e562ec31c387a4527", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ae0f1fcac4810b071842e52391278c262e84fcc2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Apr 2019 01:02:18 -0700 Subject: [PATCH 2984/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243219975 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 951ee0e6a0d..0e3a4b79efc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "659c03f5cd6b5b914bc720dd62f53000ac1161039502cedf7fda29627872be9c", - git_commit = "7e4c43bbe8b98e3ec794268e562ec31c387a4527", + sha256 = "3b60f94a2e1ad824a4f9f977c294e38745306062a81104ce39404c98a6e8393d", + git_commit = "32b84a462a7f4320700450bac6b8c2eeb2ccba0a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From cddfa689732f845b81b0da0ff64a45973aeba72f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Apr 2019 03:02:35 -0700 Subject: [PATCH 2985/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243233744 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0e3a4b79efc..a20d6fcfecb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3b60f94a2e1ad824a4f9f977c294e38745306062a81104ce39404c98a6e8393d", - git_commit = "32b84a462a7f4320700450bac6b8c2eeb2ccba0a", + sha256 = "f36e23a165ce4708d64d7606c32378d1f16f5dcba17b55005d25abea07307f50", + git_commit = "02b60049d00d179e54713ceb250849c74486ab45", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 67fadebecbe5596845e50b0a18bbfbec0060cb03 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Apr 2019 04:19:11 -0700 Subject: [PATCH 2986/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243240586 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a20d6fcfecb..65a715a457f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f36e23a165ce4708d64d7606c32378d1f16f5dcba17b55005d25abea07307f50", - git_commit = "02b60049d00d179e54713ceb250849c74486ab45", + sha256 = "e69649894f095744fab69fad80ac667ab27958dd0b41a0cde30509c46fe4bc3c", + git_commit = "22464428b83ffe95f70e27859d84d30c426a0183", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3f6f2ef9b5f60e7d5ba8cc6cb27c9d6446c54b2e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Apr 2019 05:03:57 -0700 Subject: [PATCH 2987/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243244753 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 65a715a457f..3795291ef9a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e69649894f095744fab69fad80ac667ab27958dd0b41a0cde30509c46fe4bc3c", - git_commit = "22464428b83ffe95f70e27859d84d30c426a0183", + sha256 = "fecf9f40a3f1f7bc135b7b139fd57e36d1cbd7a60002588921e45637ee56b991", + git_commit = "bc6499d1fb195d8af740d769aae640b80fe16b51", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From baf75777447eb9a1c1659ffd6d53bd080aece29b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Apr 2019 08:13:03 -0700 Subject: [PATCH 2988/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243266117 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3795291ef9a..25f35b474a6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fecf9f40a3f1f7bc135b7b139fd57e36d1cbd7a60002588921e45637ee56b991", - git_commit = "bc6499d1fb195d8af740d769aae640b80fe16b51", + sha256 = "aba926bcb9c9d4524dce387008d06f88740f47b1114249e9423ebc483fc8e224", + git_commit = "8fd880bca01cdfbc79f8d59821697b38e7a7a4f5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f770d53188b0431838b582c69885dca832ea9364 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Apr 2019 10:07:18 -0700 Subject: [PATCH 2989/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243284338 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 25f35b474a6..0863046b0c5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "aba926bcb9c9d4524dce387008d06f88740f47b1114249e9423ebc483fc8e224", - git_commit = "8fd880bca01cdfbc79f8d59821697b38e7a7a4f5", + sha256 = "0daca5cea6872092bf263b98b21c4695312a32297e131d77d7cc2f183f0452f8", + git_commit = "b86b5c6c871d011f342b6ea897d91d2396d29012", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From fadc11b1fd8f8ec4113c688ba3171345045426f4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Apr 2019 11:03:29 -0700 Subject: [PATCH 2990/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243295195 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0863046b0c5..eb874ff0fe5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0daca5cea6872092bf263b98b21c4695312a32297e131d77d7cc2f183f0452f8", - git_commit = "b86b5c6c871d011f342b6ea897d91d2396d29012", + sha256 = "88af9797ea263de4b16b0df5b2f143eb014ec2d79a694ddaf879cdc6ef1f7ecc", + git_commit = "4c540c1b8eec589f370f10c0fa197fcb31554fde", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4f7fbbdaf3e1b4b364f0fb56cc7be10ef6cf56ef Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Apr 2019 12:02:19 -0700 Subject: [PATCH 2991/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243307085 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index eb874ff0fe5..eef8996cdad 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "88af9797ea263de4b16b0df5b2f143eb014ec2d79a694ddaf879cdc6ef1f7ecc", - git_commit = "4c540c1b8eec589f370f10c0fa197fcb31554fde", + sha256 = "83beb8fea0ca5ee8dfbbd4c6e67aaf7279389073184523590a69abe7fb567335", + git_commit = "a751f01a829b069ba9f184975c7d0ad26783e085", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d9468290f87e7610dcdbb961908d9e2ab0260421 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Apr 2019 13:02:12 -0700 Subject: [PATCH 2992/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243317560 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index eef8996cdad..67b734751a1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "83beb8fea0ca5ee8dfbbd4c6e67aaf7279389073184523590a69abe7fb567335", - git_commit = "a751f01a829b069ba9f184975c7d0ad26783e085", + sha256 = "77bfcaa942c34c37775a6f15989c428d84c4fdb559315c867f85c3fc3904db48", + git_commit = "8c149fc659bc9640bb9554121b83949c21bb0139", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1681a0c80dce6ec0d18ac1492eab06169628b648 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Apr 2019 14:02:02 -0700 Subject: [PATCH 2993/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243328256 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 67b734751a1..22764030456 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "77bfcaa942c34c37775a6f15989c428d84c4fdb559315c867f85c3fc3904db48", - git_commit = "8c149fc659bc9640bb9554121b83949c21bb0139", + sha256 = "73f9df5c516fc7a15d5c97d38919f0151a16cd47b98279316f3b15a4137eb3eb", + git_commit = "8fa0c87bd2d0370606b2cf08e57f5d6c9a80798e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From dff185b7ec4136696801c3b989950748c040fa10 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Apr 2019 15:02:33 -0700 Subject: [PATCH 2994/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243339527 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 22764030456..db6f39fe971 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "73f9df5c516fc7a15d5c97d38919f0151a16cd47b98279316f3b15a4137eb3eb", - git_commit = "8fa0c87bd2d0370606b2cf08e57f5d6c9a80798e", + sha256 = "59b1577ccde6b7fc6fbe958f32fe901e6667f75190abedd5a1293171a60cde83", + git_commit = "01893d648f42c716c57b4c98ae9c6f2f3d16bacd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9456b5a7dce29356ab3ca7737196a088f04ad014 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Apr 2019 16:02:15 -0700 Subject: [PATCH 2995/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 243350127 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index db6f39fe971..322eb213e7d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "59b1577ccde6b7fc6fbe958f32fe901e6667f75190abedd5a1293171a60cde83", - git_commit = "01893d648f42c716c57b4c98ae9c6f2f3d16bacd", + sha256 = "4777430c365661e2fa029c04537a3125ef392435cb7c36ce30ace886054ca8d7", + git_commit = "6c6e798a1549361561ada58371cab962cbd6a23d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 28da549e382fa027897886afec83fca6e92da33c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 15 Apr 2019 11:59:55 -0700 Subject: [PATCH 2996/8103] AspiredVersionsManager, CachingManager: forward Env to BasicManager. AspiredVersionsManager::Create and CachingManager::Create copied most fields from their own Options structs to BasicManager::Options, but they skipped "env". Assume a client overriding Env wants that override active at all lower layers. PiperOrigin-RevId: 243660876 --- tensorflow_serving/core/aspired_versions_manager.cc | 1 + tensorflow_serving/core/caching_manager.cc | 1 + 2 files changed, 2 insertions(+) diff --git a/tensorflow_serving/core/aspired_versions_manager.cc b/tensorflow_serving/core/aspired_versions_manager.cc index 738fd33f4b1..c14f3e321dd 100644 --- a/tensorflow_serving/core/aspired_versions_manager.cc +++ b/tensorflow_serving/core/aspired_versions_manager.cc @@ -158,6 +158,7 @@ Status AspiredVersionsManager::Create( options.load_retry_interval_micros; basic_manager_options.flush_filesystem_caches = options.flush_filesystem_caches; + basic_manager_options.env = options.env; basic_manager_options.servable_event_bus = options.servable_event_bus; basic_manager_options.pre_load_hook = std::move(options.pre_load_hook); std::unique_ptr basic_manager; diff --git a/tensorflow_serving/core/caching_manager.cc b/tensorflow_serving/core/caching_manager.cc index e69ad18ccef..338086d0336 100644 --- a/tensorflow_serving/core/caching_manager.cc +++ b/tensorflow_serving/core/caching_manager.cc @@ -40,6 +40,7 @@ Status CachingManager::Create( basic_manager_options.max_num_load_retries = options.max_num_load_retries; basic_manager_options.load_retry_interval_micros = options.load_retry_interval_micros; + basic_manager_options.env = options.env; basic_manager_options.servable_event_bus = options.servable_event_bus; // Create a basic manager and use it to construct the caching manager. From 9514c37d22f0b728e2db9e8c6f28fb11ebde0fad Mon Sep 17 00:00:00 2001 From: Gautam Vasudevan Date: Mon, 15 Apr 2019 18:27:13 -0700 Subject: [PATCH 2997/8103] Released versions of PIP package will require the corresponding version of TF PiperOrigin-RevId: 243727286 --- tensorflow_serving/tools/pip_package/setup.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/tools/pip_package/setup.py b/tensorflow_serving/tools/pip_package/setup.py index 73d42e56c14..158e822e228 100644 --- a/tensorflow_serving/tools/pip_package/setup.py +++ b/tensorflow_serving/tools/pip_package/setup.py @@ -32,6 +32,8 @@ # Set when releasing a new version of TensorFlow Serving (e.g. 1.0.0). _VERSION = '0.0.0' +# Have this by default be open; releasing a new version will lock to TF version +_TF_VERSION = '>=1.2.0,<2' project_name = 'tensorflow-serving-api' # Set when building the pip package @@ -41,12 +43,12 @@ sys.argv.remove('--project_name') sys.argv.pop(project_name_idx) -_TF_REQ = ['tensorflow>=1.2.0,<2'] +_TF_REQ = ['tensorflow'+_TF_VERSION] # GPU build (note: the only difference is we depend on tensorflow-gpu so # pip doesn't overwrite it with the CPU build) if 'tensorflow-serving-api-gpu' in project_name: - _TF_REQ = ['tensorflow-gpu>=1.2.0,<2'] + _TF_REQ = ['tensorflow-gpu'+_TF_VERSION] REQUIRED_PACKAGES = [ From f26deea38a506512690096ad81ffa5bb6c32a4b2 Mon Sep 17 00:00:00 2001 From: Pedram Pejman Date: Tue, 16 Apr 2019 10:14:36 -0700 Subject: [PATCH 2998/8103] Improves top-level README documentation; Breaks up Docker guide (into running and building) PiperOrigin-RevId: 243830252 --- README.md | 142 +++++++++---- .../g3doc/building_with_docker.md | 195 ++++++++++++++++++ tensorflow_serving/g3doc/docker.md | 195 +----------------- tensorflow_serving/g3doc/setup.md | 5 +- 4 files changed, 301 insertions(+), 236 deletions(-) create mode 100644 tensorflow_serving/g3doc/building_with_docker.md diff --git a/README.md b/README.md index 7dfc0a93bb5..4f41c91dd34 100644 --- a/README.md +++ b/README.md @@ -4,53 +4,113 @@ ![Docker CPU Nightly Build Status](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges/docker-cpu-nightly.svg) ![Docker GPU Nightly Build Status](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges/docker-gpu-nightly.svg) -TensorFlow Serving is an open-source software library for serving -machine learning models. It deals with the *inference* aspect of machine -learning, taking models after *training* and managing their lifetimes, providing -clients with versioned access via a high-performance, reference-counted lookup -table. - -Multiple models, or indeed multiple versions of the same model, can be served -simultaneously. This flexibility facilitates canarying new versions, -non-atomically migrating clients to new models or versions, and A/B testing -experimental models. - -The primary use-case is high-performance production serving, but the same -serving infrastructure can also be used in bulk-processing (e.g. map-reduce) -jobs to pre-compute inference results or analyze model performance. In both -scenarios, GPUs can substantially increase inference throughput. TensorFlow -Serving comes with a scheduler that groups individual inference requests into -batches for joint execution on a GPU, with configurable latency controls. - -TensorFlow Serving has out-of-the-box support for TensorFlow models (naturally), -but at its core it manages arbitrary versioned items (*servables*) with -pass-through to their native APIs. In addition to trained TensorFlow models, -servables can include other assets needed for inference such as embeddings, -vocabularies and feature transformation configs, or even non-TensorFlow-based -machine learning models. - -The architecture is highly modular. You can use some parts individually (e.g. -batch scheduling) or use all the parts together. There are numerous plug-in -points; perhaps the most useful ways to extend the system are: -(a) [creating a new type of servable](tensorflow_serving/g3doc/custom_servable.md); -(b) [creating a custom source of servable versions](tensorflow_serving/g3doc/custom_source.md). +---- +TensorFlow Serving is a flexible, high-performance serving system for +machine learning models, designed for production environments. It deals with +the *inference* aspect of machine learning, taking models after *training* and +managing their lifetimes, providing clients with versioned access via +a high-performance, reference-counted lookup table. +TensorFlow Serving provides out-of-the-box integration with TensorFlow models, +but can be easily extended to serve other types of models and data. -**If you'd like to contribute to TensorFlow Serving, be sure to review the -[contribution guidelines](CONTRIBUTING.md).** +To note a few features: + +- Can serve multiple models, or multiple versions of the same model + simultaneously +- Exposes both gRPC as well as HTTP inference endpoints +- Allows deployment of new model versions without changing any client code +- Supports canarying new versions and A/B testing experimental models +- Adds minimal latency to inference time due to efficient, low-overhead + implementation +- Features a scheduler that groups individual inference requests into batches + for joint execution on GPU, with configurable latency controls +- Supports many *servables*: Tensorflow models, embeddings, vocabularies, + feature transformations and even non-Tensorflow-based machine learning + models + +## Serve a Tensorflow model in 60 seconds +```bash +# Download the TensorFlow Serving Docker image and repo +docker pull tensorflow/serving + +git clone https://github.com/tensorflow/serving +# Location of demo models +TESTDATA="$(pwd)/serving/tensorflow_serving/servables/tensorflow/testdata" + +# Start TensorFlow Serving container and open the REST API port +docker run -t --rm -p 8501:8501 \ + -v "$TESTDATA/saved_model_half_plus_two_cpu:/models/half_plus_two" \ + -e MODEL_NAME=half_plus_two \ + tensorflow/serving & + +# Query the model using the predict API +curl -d '{"instances": [1.0, 2.0, 5.0]}' \ + -X POST http://localhost:8501/v1/models/half_plus_two:predict + +# Returns => { "predictions": [2.5, 3.0, 4.5] } +``` + +## End-to-End Training & Serving Tutorial + +Refer to the official Tensorflow documentations site for [a complete tutorial to train and serve a Tensorflow Model](https://www.tensorflow.org/tfx/tutorials/serving/rest_simple). + + +## Documentation + +### Set up -**We use [GitHub issues](https://github.com/tensorflow/serving/issues) for -tracking requests and bugs.** +The easiest and most straight-forward way of using TensorFlow Serving is with +Docker images. We highly recommend this route unless you have specific needs +that are not addressed by running in a container. -# Download and Setup +* [Install Tensorflow Serving using Docker](tensorflow_serving/g3doc/docker.md) + *(Recommended)* +* [Install Tensorflow Serving without Docker](tensorflow_serving/g3doc/setup.md) + *(Not Recommended)* +* [Build Tensorflow Serving from Source with Docker](tensorflow_serving/g3doc/building_with_docker.md) +* [Deploy Tensorflow Serving on Kubernetes](tensorflow_serving/g3doc/serving_kubernetes.md) -See [install instructions](tensorflow_serving/g3doc/setup.md). +### Use -## Tutorials +#### Export your Tensorflow model + +In order to serve a Tensorflow model, simply export a SavedModel from your +Tensorflow program. +[SavedModel](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/saved_model/README.md) +is a language-neutral, recoverable, hermetic serialization format that enables +higher-level systems and tools to produce, consume, and transform TensorFlow +models. + +Please refer to [Tensorflow documentation](https://www.tensorflow.org/guide/saved_model#save_and_restore_models) +for detailed instructions on how to export SavedModels. + +#### Configure and Use Tensorflow Serving + +* [Follow a tutorial on Serving Tensorflow models](tensorflow_serving/g3doc/serving_basic.md) +* Read the [REST API Guide](tensorflow_serving/g3doc/api_rest.md) or [gRPC API definition](https://github.com/tensorflow/serving/tree/master/tensorflow_serving/apis) +* [Use SavedModel Warmup if initial inference requests are slow due to lazy initialization of graph](tensorflow_serving/g3doc/saved_model_warmup.md) +* [Configure models, version and version policy via Serving Config](tensorflow_serving/g3doc/serving_config.md) +* [If encountering issues regarding model signatures, please read the SignatureDef documentation](tensorflow_serving/g3doc/signature_defs.md) + +### Extend + +Tensorflow Serving's architecture is highly modular. You can use some parts +individually (e.g. batch scheduling) and/or extend it to serve new use cases. + +* [Ensure you are familiar with building Tensorflow Serving](tensorflow_serving/g3doc/building_with_docker.md) +* [Learn about Tensorflow Serving's architecture](tensorflow_serving/g3doc/architecture.md) +* [Explore the Tensorflow Serving C++ API reference](https://www.tensorflow.org/tfx/serving/api_docs/cc/) +* [Create a new type of Servable](tensorflow_serving/g3doc/custom_servable.md) +* [Create a custom Source of Servable versions](tensorflow_serving/g3doc/custom_source.md) + +## Contribute + + +**If you'd like to contribute to TensorFlow Serving, be sure to review the +[contribution guidelines](CONTRIBUTING.md).** -* [Basic tutorial](tensorflow_serving/g3doc/serving_basic.md) -* [Advanced tutorial](tensorflow_serving/g3doc/serving_advanced.md) ## For more information -* [Serving architecture overview](tensorflow_serving/g3doc/architecture.md) -* [TensorFlow website](http://tensorflow.org) +Please refer to the official [TensorFlow website](http://tensorflow.org) for +more information. diff --git a/tensorflow_serving/g3doc/building_with_docker.md b/tensorflow_serving/g3doc/building_with_docker.md new file mode 100644 index 00000000000..49f8098af35 --- /dev/null +++ b/tensorflow_serving/g3doc/building_with_docker.md @@ -0,0 +1,195 @@ +## Developing with Docker + +### Pulling a development image + +For a development environment where you can build TensorFlow Serving, you can +try: + +```shell +docker pull tensorflow/serving:latest-devel +``` + +For a development environment where you can build TensorFlow Serving with GPU +support, use: + +```shell +docker pull tensorflow/serving:latest-devel-gpu +``` + +See the Docker Hub +[tensorflow/serving repo](http://hub.docker.com/r/tensorflow/serving/tags/) for +other versions of images you can pull. + +### Development example + +After pulling one of the development Docker images, you can run it while opening +the gRPC port (8500): + +```shell +docker run -it -p 8500:8500 tensorflow/serving:latest-devel +``` + +#### Testing the development environment + +To test a model, from inside the container try: + +```shell +# train the mnist model +python tensorflow_serving/example/mnist_saved_model.py /tmp/mnist_model +# serve the model +tensorflow_model_server --port=8500 --model_name=mnist --model_base_path=/tmp/mnist_model/ & +# test the client +python tensorflow_serving/example/mnist_client.py --num_tests=1000 --server=localhost:8500 +``` + +## Dockerfiles + +We currently maintain the following Dockerfiles: + +* [`Dockerfile`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile), + which is a minimal VM with TensorFlow Serving installed. + +* [`Dockerfile.gpu`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.gpu), + which is a minimal VM with TensorFlow Serving with GPU support to be used + with `nvidia-docker`. + +* [`Dockerfile.devel`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.devel), + which is a minimal VM with all of the dependencies needed to build + TensorFlow Serving. + +* [`Dockerfile.devel-gpu`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.devel-gpu), + which is a minimal VM with all of the dependencies needed to build + TensorFlow Serving with GPU support. + +### Building a container from a Dockerfile + +If you'd like to build your own Docker image from a Dockerfile, you can do so by +running the Docker build command: + +`Dockerfile`: + +```shell +docker build --pull -t $USER/tensorflow-serving . +``` + +`Dockerfile.gpu`: + +```shell +docker build --pull -t $USER/tensorflow-serving-gpu -f Dockerfile.gpu . +``` + +`Dockerfile.devel`: + +```shell +docker build --pull -t $USER/tensorflow-serving-devel -f Dockerfile.devel . +``` + +`Dockerfile.devel-gpu`: + +```shell +docker build --pull -t $USER/tensorflow-serving-devel-gpu -f Dockerfile.devel-gpu . +``` + +TIP: Before attempting to build an image, check the Docker Hub +[tensorflow/serving repo](http://hub.docker.com/r/tensorflow/serving/tags/) to +make sure an image that meets your needs doesn't already exist. + +Building from sources consumes a lot of RAM. If RAM is an issue on your system, +you may limit RAM usage by specifying `--local_resources=2048,.5,1.0` while +invoking Bazel. See the +[Bazel docs](https://docs.bazel.build/versions/master/user-manual.html#flag--local_resources) +for more information. You can use this same mechanism to tweak the optmizations +you're building TensorFlow Serving with. For example: + +```shell +docker build --pull --build-arg TF_SERVING_BUILD_OPTIONS="--copt=-mavx \ + --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0 --local_resources 2048,.5,1.0" -t \ + $USER/tensorflow-serving-devel -f Dockerfile.devel . +``` + +### Running a container + +This assumes you have built the `Dockerfile.devel` container. + +To run the container opening the gRPC port (8500): + +```shell +docker run -it -p 8500:8500 $USER/tensorflow-serving-devel +``` + +TIP: If you're running a GPU image, be sure to run using the NVIDIA runtime +[`--runtime=nvidia`](https://github.com/NVIDIA/nvidia-docker#quick-start). + +From here, you can follow the instructions for +[testing a development environment](#testing-the-development-environment). + +### Building an optimized serving binary + +When running TensorFlow Serving's ModelServer, you may notice a log message that +looks like this: + +```console +I external/org_tensorflow/tensorflow/core/platform/cpu_feature_guard.cc:141] +Your CPU supports instructions that this TensorFlow binary was not compiled to +use: AVX2 FMA +``` + +This indicates that your ModelServer binary isn't fully optimized for the CPU +its running on. Depending on the model you are serving, further optimizations +may not be necessary. However, building an optimized binary is straight-forward. + +When building a Docker image from the provided `Dockerfile.devel` or +`Dockerfile.devel-gpu` files, the ModelServer binary will be built with the flag +`-march=native`. This will cause Bazel to build a ModelServer binary with all of +the CPU optimizations the host you're building the Docker image on supports. + +To create a serving image that's fully optimized for your host, simply: + +1. Clone the TensorFlow Serving project + + ```shell + git clone https://github.com/tensorflow/serving + cd serving + ``` + +2. Build an image with an optimized ModelServer + + * For CPU: + + ```shell + docker build --pull -t $USER/tensorflow-serving-devel \ + -f tensorflow_serving/tools/docker/Dockerfile.devel . + ``` + + * For GPU: ` + + ```shell + docker build --pull -t $USER/tensorflow-serving-devel-gpu \ + -f tensorflow_serving/tools/docker/Dockerfile.devel-gpu . + ``` + +3. Build a serving image with the development image as a base + + * For CPU: + + ```shell + docker build -t $USER/tensorflow-serving \ + --build-arg TF_SERVING_BUILD_IMAGE=$USER/tensorflow-serving-devel \ + -f tensorflow_serving/tools/docker/Dockerfile . + ``` + + Your new optimized Docker image is now `$USER/tensorflow-serving`, which + you can [use](#running-a-serving-image) just as you would the standard + `tensorflow/serving:latest` image. + + * For GPU: + + ```shell + docker build -t $USER/tensorflow-serving-gpu \ + --build-arg TF_SERVING_BUILD_IMAGE=$USER/tensorflow-serving-devel-gpu \ + -f tensorflow_serving/tools/docker/Dockerfile.gpu . + ``` + + Your new optimized Docker image is now `$USER/tensorflow-serving-gpu`, + which you can [use](#running-a-gpu-serving-image) just as you would the + standard `tensorflow/serving:latest-gpu` image. diff --git a/tensorflow_serving/g3doc/docker.md b/tensorflow_serving/g3doc/docker.md index c35ddfef160..0cfac91d4dd 100644 --- a/tensorflow_serving/g3doc/docker.md +++ b/tensorflow_serving/g3doc/docker.md @@ -306,196 +306,5 @@ More information on using the RESTful API can be found [here](api_rest.md). ## Developing with Docker -### Pulling a development image - -For a development environment where you can build TensorFlow Serving, you can -try: - -```shell -docker pull tensorflow/serving:latest-devel -``` - -For a development environment where you can build TensorFlow Serving with GPU -support, use: - -```shell -docker pull tensorflow/serving:latest-devel-gpu -``` - -See the Docker Hub -[tensorflow/serving repo](http://hub.docker.com/r/tensorflow/serving/tags/) for -other versions of images you can pull. - -### Development example - -After pulling one of the development Docker images, you can run it while opening -the gRPC port (8500): - -```shell -docker run -it -p 8500:8500 tensorflow/serving:latest-devel -``` - -#### Testing the development environment - -To test a model, from inside the container try: - -```shell -# train the mnist model -python tensorflow_serving/example/mnist_saved_model.py /tmp/mnist_model -# serve the model -tensorflow_model_server --port=8500 --model_name=mnist --model_base_path=/tmp/mnist_model/ & -# test the client -python tensorflow_serving/example/mnist_client.py --num_tests=1000 --server=localhost:8500 -``` - -## Dockerfiles - -We currently maintain the following Dockerfiles: - -* [`Dockerfile`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile), - which is a minimal VM with TensorFlow Serving installed. - -* [`Dockerfile.gpu`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.gpu), - which is a minimal VM with TensorFlow Serving with GPU support to be used - with `nvidia-docker`. - -* [`Dockerfile.devel`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.devel), - which is a minimal VM with all of the dependencies needed to build - TensorFlow Serving. - -* [`Dockerfile.devel-gpu`](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.devel-gpu), - which is a minimal VM with all of the dependencies needed to build - TensorFlow Serving with GPU support. - -### Building a container from a Dockerfile - -If you'd like to build your own Docker image from a Dockerfile, you can do so by -running the Docker build command: - -`Dockerfile`: - -```shell -docker build --pull -t $USER/tensorflow-serving . -``` - -`Dockerfile.gpu`: - -```shell -docker build --pull -t $USER/tensorflow-serving-gpu -f Dockerfile.gpu . -``` - -`Dockerfile.devel`: - -```shell -docker build --pull -t $USER/tensorflow-serving-devel -f Dockerfile.devel . -``` - -`Dockerfile.devel-gpu`: - -```shell -docker build --pull -t $USER/tensorflow-serving-devel-gpu -f Dockerfile.devel-gpu . -``` - -TIP: Before attempting to build an image, check the Docker Hub -[tensorflow/serving repo](http://hub.docker.com/r/tensorflow/serving/tags/) to -make sure an image that meets your needs doesn't already exist. - -Building from sources consumes a lot of RAM. If RAM is an issue on your system, -you may limit RAM usage by specifying `--local_resources=2048,.5,1.0` while -invoking Bazel. See the -[Bazel docs](https://docs.bazel.build/versions/master/user-manual.html#flag--local_resources) -for more information. You can use this same mechanism to tweak the optmizations -you're building TensorFlow Serving with. For example: - -```shell -docker build --pull --build-arg TF_SERVING_BUILD_OPTIONS="--copt=-mavx \ - --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0 --local_resources 2048,.5,1.0" -t \ - $USER/tensorflow-serving-devel -f Dockerfile.devel . -``` - -### Running a container - -This assumes you have built the `Dockerfile.devel` container. - -To run the container opening the gRPC port (8500): - -```shell -docker run -it -p 8500:8500 $USER/tensorflow-serving-devel -``` - -TIP: If you're running a GPU image, be sure to run using the NVIDIA runtime -[`--runtime=nvidia`](https://github.com/NVIDIA/nvidia-docker#quick-start). - -From here, you can follow the instructions for -[testing a development environment](#testing-the-development-environment). - -### Building an optimized serving binary - -When running TensorFlow Serving's ModelServer, you may notice a log message that -looks like this: - -```console -I external/org_tensorflow/tensorflow/core/platform/cpu_feature_guard.cc:141] -Your CPU supports instructions that this TensorFlow binary was not compiled to -use: AVX2 FMA -``` - -This indicates that your ModelServer binary isn't fully optimized for the CPU -its running on. Depending on the model you are serving, further optimizations -may not be necessary. However, building an optimized binary is straight-forward. - -When building a Docker image from the provided `Dockerfile.devel` or -`Dockerfile.devel-gpu` files, the ModelServer binary will be built with the flag -`-march=native`. This will cause Bazel to build a ModelServer binary with all of -the CPU optimizations the host you're building the Docker image on supports. - -To create a serving image that's fully optimized for your host, simply: - -1. Clone the TensorFlow Serving project - - ```shell - git clone https://github.com/tensorflow/serving - cd serving - ``` - -2. Build an image with an optimized ModelServer - - * For CPU: - - ```shell - docker build --pull -t $USER/tensorflow-serving-devel \ - -f tensorflow_serving/tools/docker/Dockerfile.devel . - ``` - - * For GPU: ` - - ```shell - docker build --pull -t $USER/tensorflow-serving-devel-gpu \ - -f tensorflow_serving/tools/docker/Dockerfile.devel-gpu . - ``` - -3. Build a serving image with the development image as a base - - * For CPU: - - ```shell - docker build -t $USER/tensorflow-serving \ - --build-arg TF_SERVING_BUILD_IMAGE=$USER/tensorflow-serving-devel \ - -f tensorflow_serving/tools/docker/Dockerfile . - ``` - - Your new optimized Docker image is now `$USER/tensorflow-serving`, which - you can [use](#running-a-serving-image) just as you would the standard - `tensorflow/serving:latest` image. - - * For GPU: - - ```shell - docker build -t $USER/tensorflow-serving-gpu \ - --build-arg TF_SERVING_BUILD_IMAGE=$USER/tensorflow-serving-devel-gpu \ - -f tensorflow_serving/tools/docker/Dockerfile.gpu . - ``` - - Your new optimized Docker image is now `$USER/tensorflow-serving-gpu`, - which you can [use](#running-a-gpu-serving-image) just as you would the - standard `tensorflow/serving:latest-gpu` image. +For instructions on how to build and develop Tensorflow Serving, please refer to +[Developing with Docker guide](building_with_docker.md). diff --git a/tensorflow_serving/g3doc/setup.md b/tensorflow_serving/g3doc/setup.md index 1bb1a845e18..eab8cbde867 100644 --- a/tensorflow_serving/g3doc/setup.md +++ b/tensorflow_serving/g3doc/setup.md @@ -192,8 +192,9 @@ version of TensorFlow Serving for your processor if you are in doubt. ##### Building with GPU Support In order to build a custom version of TensorFlow Serving with GPU support, we -recommend either building with the [provided Docker images](docker.md#developing-with-docker), or -following the approach in the +recommend either building with the +[provided Docker images](building_with_docker.md), or following the approach in +the [GPU Dockerfile](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/tools/docker/Dockerfile.devel-gpu). ## TensorFlow Serving Python API PIP package From 96a716ca31f753b0c3efc1ef60779b77f5c60845 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Wed, 17 Apr 2019 12:42:47 -0700 Subject: [PATCH 2999/8103] Bump the minimal Bazel version to 0.24.1. This is in response to TF requiring this version due to: https://github.com/tensorflow/tensorflow/commit/407a4f3b9d39055a981b91c15f6911fdb38135d5 PiperOrigin-RevId: 244047973 --- WORKSPACE | 2 +- tensorflow_serving/tools/docker/Dockerfile.devel | 2 +- tensorflow_serving/tools/docker/Dockerfile.devel-gpu | 2 +- tensorflow_serving/tools/docker/Dockerfile.devel-mkl | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 322eb213e7d..53ec7f561f5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -45,4 +45,4 @@ tf_serving_workspace() # Specify the minimum required bazel version. load("@org_tensorflow//tensorflow:version_check.bzl", "check_bazel_version_at_least") -check_bazel_version_at_least("0.23.2") +check_bazel_version_at_least("0.24.1") diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index 15d080a9dfe..49d0cf96992 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -60,7 +60,7 @@ RUN pip --no-cache-dir install \ requests # Set up Bazel -ENV BAZEL_VERSION 0.23.2 +ENV BAZEL_VERSION 0.24.1 WORKDIR / RUN mkdir /bazel && \ cd /bazel && \ diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 21bfebf6c7d..066350be879 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -91,7 +91,7 @@ RUN pip --no-cache-dir install \ requests # Set up Bazel -ENV BAZEL_VERSION 0.23.2 +ENV BAZEL_VERSION 0.24.1 WORKDIR / RUN mkdir /bazel && \ cd /bazel && \ diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl index 6aba9ef27d8..932ef2b9d11 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl @@ -60,7 +60,7 @@ RUN pip --no-cache-dir install \ requests # Set up Bazel -ENV BAZEL_VERSION 0.23.2 +ENV BAZEL_VERSION 0.24.1 WORKDIR / RUN mkdir /bazel && \ cd /bazel && \ From 2b8ba4777031dcc12b5a2d5b23a8a677378ea4ba Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Apr 2019 14:09:01 -0700 Subject: [PATCH 3000/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244063763 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 53ec7f561f5..208f505b836 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4777430c365661e2fa029c04537a3125ef392435cb7c36ce30ace886054ca8d7", - git_commit = "6c6e798a1549361561ada58371cab962cbd6a23d", + sha256 = "e4e7657330bc4a0fe0ebaed80b6ce0b71a464aaed93180f66c8cd5793151792c", + git_commit = "ce8fea5874d6a09ffb7e77f7d4398e3480bde9ca", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 807a87890e217a55b0d4b9d610ee133f4393e32b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Apr 2019 15:02:14 -0700 Subject: [PATCH 3001/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244074954 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 208f505b836..e4a8918d34a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e4e7657330bc4a0fe0ebaed80b6ce0b71a464aaed93180f66c8cd5793151792c", - git_commit = "ce8fea5874d6a09ffb7e77f7d4398e3480bde9ca", + sha256 = "3c43732a88898fb6ea0ec7009b53f9b31ca2e6a3f2fe4bfbf4f6daf6459377bc", + git_commit = "d4117804299f0a22ac88f56dcbd2cd360c3fac17", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 302d88a0b228b18fd18680099286948f4496ef24 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Apr 2019 16:03:04 -0700 Subject: [PATCH 3002/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244085762 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e4a8918d34a..44964113480 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3c43732a88898fb6ea0ec7009b53f9b31ca2e6a3f2fe4bfbf4f6daf6459377bc", - git_commit = "d4117804299f0a22ac88f56dcbd2cd360c3fac17", + sha256 = "049628e417a69928f2e8eae28c914a6652730c051c62114cf7481a8f0c50f8c4", + git_commit = "650d0b1b533352bf837da23e0e8e271bc3363e2e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 58898c303b3f85d9d98f4fc2f7e1b15ce5a2a49b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Apr 2019 17:08:57 -0700 Subject: [PATCH 3003/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244096767 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 44964113480..f99c3831481 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "049628e417a69928f2e8eae28c914a6652730c051c62114cf7481a8f0c50f8c4", - git_commit = "650d0b1b533352bf837da23e0e8e271bc3363e2e", + sha256 = "9a7adb8204a83eae86922f577b568249f70ca6470d922bdd32ad8e847e5809df", + git_commit = "d6619b7e3bfa25879d6427ef60d2ec41f522e661", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From db022de87da71abc65dd355e721664d9981977d2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Apr 2019 18:08:16 -0700 Subject: [PATCH 3004/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244105015 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f99c3831481..2b2457e1eb7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9a7adb8204a83eae86922f577b568249f70ca6470d922bdd32ad8e847e5809df", - git_commit = "d6619b7e3bfa25879d6427ef60d2ec41f522e661", + sha256 = "fe66710c8c1bb432ebc1af0b444abb7a0661808e1976e80dbde494ab663c7134", + git_commit = "7e9e8e22882aa49b41938017a1e891a7c8138624", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5ed896baffb4db9fc3c973ec8d0ab11c8c1f00bd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Apr 2019 19:03:10 -0700 Subject: [PATCH 3005/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244111282 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2b2457e1eb7..1ea5176a30b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fe66710c8c1bb432ebc1af0b444abb7a0661808e1976e80dbde494ab663c7134", - git_commit = "7e9e8e22882aa49b41938017a1e891a7c8138624", + sha256 = "2974dbcb90816200652f2a7dbcc6333cd80a78baefcf134cbc2389f142fc12ce", + git_commit = "a65b6411d99d310d00ef5d1d6a0045df406c2104", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 43f6583c6d1294d670d8836dafcb825bf1aed04d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Apr 2019 20:02:15 -0700 Subject: [PATCH 3006/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244116276 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1ea5176a30b..d6485fd4c63 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2974dbcb90816200652f2a7dbcc6333cd80a78baefcf134cbc2389f142fc12ce", - git_commit = "a65b6411d99d310d00ef5d1d6a0045df406c2104", + sha256 = "f21b0530e0cc4ce0e277114e651918c54743dae04ede40d2ba1c17db81d49df2", + git_commit = "9d5d35bf74c2dd4b65303a76b817fd1cf060df9b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4d2f6fd7eab12eabcd9457c7d19a1471a6db32c9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Apr 2019 23:02:19 -0700 Subject: [PATCH 3007/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244131411 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d6485fd4c63..fff21673c85 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f21b0530e0cc4ce0e277114e651918c54743dae04ede40d2ba1c17db81d49df2", - git_commit = "9d5d35bf74c2dd4b65303a76b817fd1cf060df9b", + sha256 = "ecf1ec1b073eef9daaf641c1d73ca20267758cc44b5847c712981c9fd953542e", + git_commit = "871e65a186156cf4ffe781b4bc491ddabdebd906", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From fcc78b1e9f5e859e5be5fd2351d82b359e3a7be9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Apr 2019 00:02:33 -0700 Subject: [PATCH 3008/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244136280 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fff21673c85..8806bb8eebb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ecf1ec1b073eef9daaf641c1d73ca20267758cc44b5847c712981c9fd953542e", - git_commit = "871e65a186156cf4ffe781b4bc491ddabdebd906", + sha256 = "53bf2423b811bbf7f7102852cf3a579a7b1ec80368d9487dd21f9770017f3ecf", + git_commit = "7fdccd5ca00b0c649d0e49498e1d42fdb8c9089c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From fdd2cd1b81efeee04f8ba0cd9c481ae4c340036b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Apr 2019 01:02:15 -0700 Subject: [PATCH 3009/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244143109 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8806bb8eebb..b3b6ba81102 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "53bf2423b811bbf7f7102852cf3a579a7b1ec80368d9487dd21f9770017f3ecf", - git_commit = "7fdccd5ca00b0c649d0e49498e1d42fdb8c9089c", + sha256 = "29dc4f7a1e92652aa1bb1cf7b906b8587ab841b7dff639143d9559a81c72ad64", + git_commit = "06cba4142f57249770073619a642978611a699f8", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9604e8817e974bae571e7e640ad36f71ee666ba6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Apr 2019 02:02:11 -0700 Subject: [PATCH 3010/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244149548 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b3b6ba81102..c0c803f0d9c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "29dc4f7a1e92652aa1bb1cf7b906b8587ab841b7dff639143d9559a81c72ad64", - git_commit = "06cba4142f57249770073619a642978611a699f8", + sha256 = "fa3319dc3d5c0bf11c9f12cf81d6c688ed12ca0fbd9af592a8676e29755475b2", + git_commit = "7bdabf55ad0950d73b241cfa9ebf1256cfccd758", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8f0271def4434bc852534f04729d0036377b2808 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Apr 2019 04:02:13 -0700 Subject: [PATCH 3011/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244162054 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c0c803f0d9c..166cf547e77 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fa3319dc3d5c0bf11c9f12cf81d6c688ed12ca0fbd9af592a8676e29755475b2", - git_commit = "7bdabf55ad0950d73b241cfa9ebf1256cfccd758", + sha256 = "e552187014a93ef9c2e5cfbaff08cb3dfca68a5cfa9aeca5b1d6c76ed88f2469", + git_commit = "bc802d2ce78376bd1e7ee219a2d44efb334e299e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7e8cd2fa3c6b261442c3cab4c7cbeb3cecb3369d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Apr 2019 06:02:46 -0700 Subject: [PATCH 3012/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244172540 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 166cf547e77..2ee48258eb7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e552187014a93ef9c2e5cfbaff08cb3dfca68a5cfa9aeca5b1d6c76ed88f2469", - git_commit = "bc802d2ce78376bd1e7ee219a2d44efb334e299e", + sha256 = "45500b8352c168cceacb196476ae2516e75cb3b07b823d635b9471fd8f186ca2", + git_commit = "41cc606be8dbdc2555236e069711d4c91f00efb9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3387d0d4afaee333f0c6a7a7e9e6607600cfcd8c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Apr 2019 07:04:24 -0700 Subject: [PATCH 3013/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244179212 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2ee48258eb7..5501fc777e0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "45500b8352c168cceacb196476ae2516e75cb3b07b823d635b9471fd8f186ca2", - git_commit = "41cc606be8dbdc2555236e069711d4c91f00efb9", + sha256 = "a875d6bf1dc3e859bc224b6ef0ea4237dddfa2f7453a5514ef5c40326bab78e2", + git_commit = "cc494eee4c6173ccca6b0517696d40368aae8f4d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 45bb8e4bc46a561fd257653d2ec7ecc2c987d31c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Apr 2019 08:02:49 -0700 Subject: [PATCH 3014/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244186074 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5501fc777e0..de530574fc9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a875d6bf1dc3e859bc224b6ef0ea4237dddfa2f7453a5514ef5c40326bab78e2", - git_commit = "cc494eee4c6173ccca6b0517696d40368aae8f4d", + sha256 = "e02328e883026e019e493daa0c2defd6391ddc6cbf610a5f62faf90b9a16dd75", + git_commit = "c20310273f663b1dbf9ca9e68068784d44a95ae2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From cba28f35ff17244f80d5f43bb5a5db041ab0eb35 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Apr 2019 14:02:29 -0700 Subject: [PATCH 3015/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244253654 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index de530574fc9..cf448f339f0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e02328e883026e019e493daa0c2defd6391ddc6cbf610a5f62faf90b9a16dd75", - git_commit = "c20310273f663b1dbf9ca9e68068784d44a95ae2", + sha256 = "52b703621ff49f50ebc164007921a708ee6c4bd3f571149ee7f6ac00de774d4f", + git_commit = "e19be1a5888c975de239327126e58ab63baf43f1", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From bdbf73e0a5da751e5d9c6e2ce84e3a683a097346 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Apr 2019 15:02:30 -0700 Subject: [PATCH 3016/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244265796 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cf448f339f0..2a715d1e162 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "52b703621ff49f50ebc164007921a708ee6c4bd3f571149ee7f6ac00de774d4f", - git_commit = "e19be1a5888c975de239327126e58ab63baf43f1", + sha256 = "d971d476ec709415f8e6868a71a96dd5d6bea2ca5cf595102d9e709dc667792b", + git_commit = "f32566bb58a8eb6d48d2e26b505ddbc9612e0827", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0780a229aa0a01f08ba9812f1de1f25e4f20ab8d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Apr 2019 16:02:55 -0700 Subject: [PATCH 3017/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244276974 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2a715d1e162..fa7729a5a1a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d971d476ec709415f8e6868a71a96dd5d6bea2ca5cf595102d9e709dc667792b", - git_commit = "f32566bb58a8eb6d48d2e26b505ddbc9612e0827", + sha256 = "8445b7b0911224c49a4977bef3c9fbfbd6913ab3d370367b88bd2305b87bef38", + git_commit = "01d0542ed6b3e8450846b4b91ac0743f394537b5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5a97184e9c9af7552f4eb2770fcea58d0f206433 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Apr 2019 17:02:43 -0700 Subject: [PATCH 3018/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244287103 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fa7729a5a1a..36a7cc6916a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8445b7b0911224c49a4977bef3c9fbfbd6913ab3d370367b88bd2305b87bef38", - git_commit = "01d0542ed6b3e8450846b4b91ac0743f394537b5", + sha256 = "4456f12e22548f3404b6f50de8177825b2a39bc2ed760cc267d637aee93e8db3", + git_commit = "96072813ec96e6533455aede611dfcaf0cd9713f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c8496b199cedf3e38a7ad0dc4c46db2b341b28e5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Apr 2019 17:19:12 -0700 Subject: [PATCH 3019/8103] Add option to refuse to unload the last servable version. PiperOrigin-RevId: 244289594 --- .../model_servers/server_core.cc | 2 + .../model_servers/server_core.h | 9 ++++ .../file_system_storage_path_source.cc | 8 +++- .../file_system_storage_path_source.proto | 12 ++++- .../file_system_storage_path_source_test.cc | 47 +++++++++++++++++++ 5 files changed, 76 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/model_servers/server_core.cc b/tensorflow_serving/model_servers/server_core.cc index 66d41a0eb75..6df17fdd474 100644 --- a/tensorflow_serving/model_servers/server_core.cc +++ b/tensorflow_serving/model_servers/server_core.cc @@ -555,6 +555,8 @@ FileSystemStoragePathSourceConfig ServerCore::CreateStoragePathSourceConfig( options_.file_system_poll_wait_seconds); source_config.set_fail_if_zero_versions_at_startup( options_.fail_if_no_model_versions_found); + source_config.set_servable_versions_always_present( + options_.servable_versions_always_present); for (const auto& model : config.model_config_list().config()) { LOG(INFO) << " (Re-)adding model: " << model.name(); FileSystemStoragePathSourceConfig::ServableToMonitor* servable = diff --git a/tensorflow_serving/model_servers/server_core.h b/tensorflow_serving/model_servers/server_core.h index 272d8a7dc32..db447455e8c 100644 --- a/tensorflow_serving/model_servers/server_core.h +++ b/tensorflow_serving/model_servers/server_core.h @@ -23,6 +23,7 @@ limitations under the License. #include #include "google/protobuf/any.pb.h" +#include "absl/base/macros.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/platform/cpu_info.h" #include "tensorflow/core/platform/macros.h" @@ -154,8 +155,16 @@ class ServerCore : public Manager { // If set to true, the server will fail to start up (or fail a config // reload) if, for any configured model, no versions of the model are found // in the file system under the model's base path. + ABSL_DEPRECATED("Use servable_versions_always_present.") bool fail_if_no_model_versions_found = false; + // If set to true, the server will fail to start up (or fail a config + // reload) if, for any configured model, no versions of the model are found + // in the file system under the model's base path. In addition, if the + // filesystem polling finds no servables under the base path for a + // configured model, it will do nothing, rather than unloading all versions. + bool servable_versions_always_present = false; + // Logger used for logging requests hitting the server. std::unique_ptr server_request_logger; diff --git a/tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc b/tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc index ea49918fcdd..b90a8cd67b5 100644 --- a/tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc +++ b/tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc @@ -331,7 +331,8 @@ Status FileSystemStoragePathSource::UpdateConfig( const FileSystemStoragePathSourceConfig normalized_config = NormalizeConfig(config); - if (normalized_config.fail_if_zero_versions_at_startup()) { + if (normalized_config.fail_if_zero_versions_at_startup() || // NOLINT + normalized_config.servable_versions_always_present()) { TF_RETURN_IF_ERROR(FailIfZeroVersions(normalized_config)); } @@ -384,6 +385,11 @@ Status FileSystemStoragePathSource::PollFileSystemAndInvokeCallback() { for (const auto& entry : versions_by_servable_name) { const string& servable = entry.first; const std::vector>& versions = entry.second; + if (versions.empty() && config_.servable_versions_always_present()) { + LOG(ERROR) << "Refusing to unload all versions for Servable: " + << servable; + continue; + } for (const ServableData& version : versions) { if (version.status().ok()) { VLOG(1) << "File-system polling update: Servable:" << version.id() diff --git a/tensorflow_serving/sources/storage_path/file_system_storage_path_source.proto b/tensorflow_serving/sources/storage_path/file_system_storage_path_source.proto index 8fa7be5e55a..ba1db1cfe02 100644 --- a/tensorflow_serving/sources/storage_path/file_system_storage_path_source.proto +++ b/tensorflow_serving/sources/storage_path/file_system_storage_path_source.proto @@ -73,5 +73,15 @@ message FileSystemStoragePathSourceConfig { // contain at least one version under the base path. // (Otherwise, it will emit a warning and keep pinging the file system to // check for a version to appear later.) - bool fail_if_zero_versions_at_startup = 4; + // DEPRECATED: Use 'servable_versions_always_present' instead, which includes + // this behavior. + // TODO(b/30898016): Remove 2019-10-31 or later. + bool fail_if_zero_versions_at_startup = 4 [deprecated = true]; + + // If true, the servable is always expected to exist on the underlying + // filesystem. FileSystemStoragePathSource::Create() and ::UpdateConfig() will + // fail if, for any configured servables, the file system doesn't currently + // contain at least one version under the base path. In addition, if a polling + // loop find the base path empty, it will not unload existing servables. + bool servable_versions_always_present = 6; } diff --git a/tensorflow_serving/sources/storage_path/file_system_storage_path_source_test.cc b/tensorflow_serving/sources/storage_path/file_system_storage_path_source_test.cc index cc18864a67b..c82a7cec3ec 100644 --- a/tensorflow_serving/sources/storage_path/file_system_storage_path_source_test.cc +++ b/tensorflow_serving/sources/storage_path/file_system_storage_path_source_test.cc @@ -727,6 +727,53 @@ TEST(FileSystemStoragePathSourceTest, DuplicateVersions) { .PollFileSystemAndInvokeCallback()); } +TEST(FileSystemStoragePathSourceTest, LastVersionNotRemoved) { + const string base_path = + io::JoinPath(testing::TmpDir(), "LastVersionNotRemoved"); + TF_ASSERT_OK(Env::Default()->CreateDir(base_path)); + + for (bool servable_versions_always_present : {false, true}) { + TF_ASSERT_OK( + Env::Default()->RecursivelyCreateDir(io::JoinPath(base_path, "42"))); + + auto config = test_util::CreateProto( + strings::Printf("servable_name: 'test_servable_name' " + "base_path: '%s' " + "servable_versions_always_present: %s " + // Disable the polling thread. + "file_system_poll_wait_seconds: -1 ", + base_path.c_str(), + servable_versions_always_present ? "true" : "false")); + std::unique_ptr source; + TF_ASSERT_OK(FileSystemStoragePathSource::Create(config, &source)); + std::unique_ptr target( + new StrictMock); + ConnectSourceToTarget(source.get(), target.get()); + + EXPECT_CALL(*target, + SetAspiredVersions(Eq("test_servable_name"), + ElementsAre(ServableData( + {"test_servable_name", 42}, + io::JoinPath(base_path, "42"))))); + TF_ASSERT_OK(internal::FileSystemStoragePathSourceTestAccess(source.get()) + .PollFileSystemAndInvokeCallback()); + + TF_ASSERT_OK(Env::Default()->DeleteDir(io::JoinPath(base_path, "42"))); + + if (servable_versions_always_present) { + EXPECT_CALL(*target, + SetAspiredVersions(Eq("test_servable_name"), IsEmpty())) + .Times(0); + } else { + EXPECT_CALL(*target, + SetAspiredVersions(Eq("test_servable_name"), IsEmpty())); + } + + TF_ASSERT_OK(internal::FileSystemStoragePathSourceTestAccess(source.get()) + .PollFileSystemAndInvokeCallback()); + } +} + } // namespace } // namespace serving } // namespace tensorflow From 2427fc740ddece82850a0146b83fd67c73fee532 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Apr 2019 18:02:31 -0700 Subject: [PATCH 3020/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244295245 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 36a7cc6916a..ae98e37227b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4456f12e22548f3404b6f50de8177825b2a39bc2ed760cc267d637aee93e8db3", - git_commit = "96072813ec96e6533455aede611dfcaf0cd9713f", + sha256 = "fcb33487245e3d16156f9f1d619842e6ea47fa0a8c0667acbafbc8a61adc045b", + git_commit = "85d83f9900aa2902f91aa5819a2671f7e3a43104", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d0e6537ae6facad4f3c2a4cd7961b624eb1779e9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Apr 2019 19:02:22 -0700 Subject: [PATCH 3021/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244301690 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ae98e37227b..9884018e23c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fcb33487245e3d16156f9f1d619842e6ea47fa0a8c0667acbafbc8a61adc045b", - git_commit = "85d83f9900aa2902f91aa5819a2671f7e3a43104", + sha256 = "d262717a9eaee9eefd000b12b27beb10acdf0e4468d2d89a38449562ce7ae5e7", + git_commit = "1062b2b2532e6b8b0637255b3728049ce7ee9cb6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7f05d731625528e70b771663edcca66a81e745ff Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Apr 2019 20:02:21 -0700 Subject: [PATCH 3022/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244306337 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9884018e23c..5f1f7c91a5c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d262717a9eaee9eefd000b12b27beb10acdf0e4468d2d89a38449562ce7ae5e7", - git_commit = "1062b2b2532e6b8b0637255b3728049ce7ee9cb6", + sha256 = "bb1a45a18e95927c782be3d7f7450e6772db67bcde862a3fb6b6aa32e784fb6c", + git_commit = "65a8c2b7af3f517eecc0d803a4bde194488cffa9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8a8a29789928d91c3054701d4a520c3e7aca8406 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Apr 2019 21:02:11 -0700 Subject: [PATCH 3023/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244311010 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5f1f7c91a5c..da26c4a36e6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bb1a45a18e95927c782be3d7f7450e6772db67bcde862a3fb6b6aa32e784fb6c", - git_commit = "65a8c2b7af3f517eecc0d803a4bde194488cffa9", + sha256 = "8e8c76b6115855e02cb2535e5dddf33ec31c3231559a4bd54635fc587df5e9b1", + git_commit = "06b85497d21a87488b750729662e2f4917e206b9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From be2848d967b6520e1c836c1c2408d8ae2d19ccb5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Apr 2019 22:03:10 -0700 Subject: [PATCH 3024/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244315658 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index da26c4a36e6..a3d4db9a6ab 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8e8c76b6115855e02cb2535e5dddf33ec31c3231559a4bd54635fc587df5e9b1", - git_commit = "06b85497d21a87488b750729662e2f4917e206b9", + sha256 = "d3bf1a7dcaa070b48c70c84de47e339df13326cf7974c4a8c128cb234074b26f", + git_commit = "34fa18c4ee048ba0a1ba0df1aee47e39e73c5f02", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f027c1e3b9ed4e56d0943cea9a51871ac5fa3a6f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Apr 2019 23:02:39 -0700 Subject: [PATCH 3025/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244319701 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a3d4db9a6ab..c292ea8f7d3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d3bf1a7dcaa070b48c70c84de47e339df13326cf7974c4a8c128cb234074b26f", - git_commit = "34fa18c4ee048ba0a1ba0df1aee47e39e73c5f02", + sha256 = "2839c07b31977b1aca3fc8265ec413da36d5647e48ae5be1e73058607ede0ad8", + git_commit = "ffd2e5b45f6c5ee472a6bd0431ab2bf473b0b87b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e137ebc7cb24901ce0a035ee90a9efdc67e3e31c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Apr 2019 03:02:42 -0700 Subject: [PATCH 3026/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244338526 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c292ea8f7d3..d6fbea1ea97 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2839c07b31977b1aca3fc8265ec413da36d5647e48ae5be1e73058607ede0ad8", - git_commit = "ffd2e5b45f6c5ee472a6bd0431ab2bf473b0b87b", + sha256 = "449a4b57da0421b6f54a09d5c4d6073aef8de6a3f00d7bd984e3ade0778c87be", + git_commit = "faf341817c36aacb8e5d130a438d8bee807b246c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 09c56cb7db570eee6535c250feda89cf2278cb87 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Apr 2019 04:02:25 -0700 Subject: [PATCH 3027/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244342064 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d6fbea1ea97..2ad038da663 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "449a4b57da0421b6f54a09d5c4d6073aef8de6a3f00d7bd984e3ade0778c87be", - git_commit = "faf341817c36aacb8e5d130a438d8bee807b246c", + sha256 = "abec2c9251cea6a0888bfcc8f6b6418841b00b1e1e04918058fe54cb187da6df", + git_commit = "f90532431c3785166cff35ff427b652fe460f60b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 09f3761a9e2e7691fb44dc2070046b755a82b5bd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Apr 2019 11:02:17 -0700 Subject: [PATCH 3028/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244386712 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2ad038da663..b0db7303b6a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "abec2c9251cea6a0888bfcc8f6b6418841b00b1e1e04918058fe54cb187da6df", - git_commit = "f90532431c3785166cff35ff427b652fe460f60b", + sha256 = "42d0d25100878e57e892e70e258014399dac75c17cf08419583f17fc9502e223", + git_commit = "b6e4bf24eb0f2c412a59a1c1031310bbd56ecf38", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b270aa5bf9d876b6c3526d1b1fdc05026707a326 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Apr 2019 12:02:19 -0700 Subject: [PATCH 3029/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244398156 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b0db7303b6a..4d035bdedc5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "42d0d25100878e57e892e70e258014399dac75c17cf08419583f17fc9502e223", - git_commit = "b6e4bf24eb0f2c412a59a1c1031310bbd56ecf38", + sha256 = "73ae0708d7811efd9734d027d4abcf7a3ea4b8ef3c01f27718d6f8ff956fdf48", + git_commit = "37b20d191a20e1f85e8535d78aaf3dd8b972e807", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9b272ab3fb15c8e93ab2bdf56e984a81a3d088c6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Apr 2019 13:02:39 -0700 Subject: [PATCH 3030/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244407984 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4d035bdedc5..1d2a9a08ac1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "73ae0708d7811efd9734d027d4abcf7a3ea4b8ef3c01f27718d6f8ff956fdf48", - git_commit = "37b20d191a20e1f85e8535d78aaf3dd8b972e807", + sha256 = "8225d8fd08ffe827733da98ed1e95cefc01ac79aa13483a8b6fa407821a07d8c", + git_commit = "40142b21654cf7c1f6baeff832d4d1c93ec1f00d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3c87181f1a754c92adf770a0e7bf5b5aaa04acc3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Apr 2019 14:02:10 -0700 Subject: [PATCH 3031/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244418213 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1d2a9a08ac1..06f91a44a0f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8225d8fd08ffe827733da98ed1e95cefc01ac79aa13483a8b6fa407821a07d8c", - git_commit = "40142b21654cf7c1f6baeff832d4d1c93ec1f00d", + sha256 = "ab5bac1d7b52f14ee9e515927b91aa89b4504c8fb30dc31642e4592ffb966835", + git_commit = "a3e8cdad802b7306cc5c8e95ad88644781167edf", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4a166126bc1f55e7e50791caeb4b8f82ce1fa43f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Apr 2019 15:02:52 -0700 Subject: [PATCH 3032/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244429132 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 06f91a44a0f..0860f597b52 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ab5bac1d7b52f14ee9e515927b91aa89b4504c8fb30dc31642e4592ffb966835", - git_commit = "a3e8cdad802b7306cc5c8e95ad88644781167edf", + sha256 = "4087864b1b924e636c87c18ea6c51ae12446df71b4d5ea6873ad08d9e0f11a4c", + git_commit = "844842a6b067cd521e54679f156dc793738d9691", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2d947837638e1904314b7836af9cac759030baa3 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Fri, 19 Apr 2019 16:07:30 -0700 Subject: [PATCH 3033/8103] Add build status for continuous builds with TensorFlow HEAD sources. PiperOrigin-RevId: 244439373 --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 4f41c91dd34..607d1f289a8 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # TensorFlow Serving [![Ubuntu Build Status](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges/ubuntu.svg)](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges/ubuntu.html) +[![Ubuntu Build Status at TF HEAD](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges/ubuntu-tf-head.svg)](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges/ubuntu-tf-head.html) ![Docker CPU Nightly Build Status](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges/docker-cpu-nightly.svg) ![Docker GPU Nightly Build Status](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges/docker-gpu-nightly.svg) From 479fb114647685c7f3ddaa149d14c03a96bde339 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Apr 2019 18:03:59 -0700 Subject: [PATCH 3034/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244453233 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0860f597b52..e1d1e88e470 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4087864b1b924e636c87c18ea6c51ae12446df71b4d5ea6873ad08d9e0f11a4c", - git_commit = "844842a6b067cd521e54679f156dc793738d9691", + sha256 = "689a0bc37843b6cf555ef927dacb1744b9cfc9e47fc0f0f9305eaccdc9702a0e", + git_commit = "a6acd6e8ed07996d1bcf3fbaef96fb7a1a4fcaff", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 53904c4ba1d903d199e581d6c3278e8d4084caa4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 20 Apr 2019 00:02:58 -0700 Subject: [PATCH 3035/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244474625 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e1d1e88e470..24b3f29d5de 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "689a0bc37843b6cf555ef927dacb1744b9cfc9e47fc0f0f9305eaccdc9702a0e", - git_commit = "a6acd6e8ed07996d1bcf3fbaef96fb7a1a4fcaff", + sha256 = "4603d11cc4b292310de50937f12b18c4dbe2d50f37b65c78d41f29c8b43c7548", + git_commit = "d4342f77b6b3e50c4986918b231b0ad7da167755", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1b6788b96a0ccd342f42baae0994c17c871f0020 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 20 Apr 2019 06:02:23 -0700 Subject: [PATCH 3036/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244493935 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 24b3f29d5de..d7b35cdcfb4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4603d11cc4b292310de50937f12b18c4dbe2d50f37b65c78d41f29c8b43c7548", - git_commit = "d4342f77b6b3e50c4986918b231b0ad7da167755", + sha256 = "dcf8e6fa022a82f262d246e253ae2abe2af0550adafd568c738daecc166c11e3", + git_commit = "08d449d0870c7fd9d9aaed6898867eff31a64772", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f6a9c574e85fdebc0e8e14d779b11dd4550fc3f9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 20 Apr 2019 18:02:02 -0700 Subject: [PATCH 3037/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244527312 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d7b35cdcfb4..264ce4771b4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dcf8e6fa022a82f262d246e253ae2abe2af0550adafd568c738daecc166c11e3", - git_commit = "08d449d0870c7fd9d9aaed6898867eff31a64772", + sha256 = "c1cd219a433c4b4dce9b25fb0c0f941bcf49d15590a55b3e94ab353f26c04623", + git_commit = "87633397404be5d13703788124f1bd5472401432", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 29cb8fdd157732a0037e1237ca46a858bd194dc9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 21 Apr 2019 00:02:21 -0700 Subject: [PATCH 3038/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244545127 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 264ce4771b4..5e464beea12 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c1cd219a433c4b4dce9b25fb0c0f941bcf49d15590a55b3e94ab353f26c04623", - git_commit = "87633397404be5d13703788124f1bd5472401432", + sha256 = "521cdc3827df55d443c16cb6eb2f14edf37ddbdbd2a11c282b22c73d0ec6f780", + git_commit = "d57b65578c6dc710554e57d1510e5ec389b007a7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c5b2ed300fe38e69733320fdf791183cb40b79f2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 21 Apr 2019 06:02:48 -0700 Subject: [PATCH 3039/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244565015 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5e464beea12..213d6e63c70 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "521cdc3827df55d443c16cb6eb2f14edf37ddbdbd2a11c282b22c73d0ec6f780", - git_commit = "d57b65578c6dc710554e57d1510e5ec389b007a7", + sha256 = "432978daad23cf4c7f741d06d4e84ea3551f3362435dc148faf932d78d2eda55", + git_commit = "8883e7c9e50c5e8f087a59a5ce45b44aeeee17d6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f9ff1ea1de31a545a2a3e96c2084a80ba2aebf8a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 21 Apr 2019 12:02:35 -0700 Subject: [PATCH 3040/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244581689 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 213d6e63c70..d340c50bde5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "432978daad23cf4c7f741d06d4e84ea3551f3362435dc148faf932d78d2eda55", - git_commit = "8883e7c9e50c5e8f087a59a5ce45b44aeeee17d6", + sha256 = "9a68680949effc7643a60afd0cfaf05af81e8dcda5b93050b4ba45a4e822b51b", + git_commit = "d8fe10aae9e6be9cd49ab7e68c1ca4989f0be42b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9f4ba828a785217b1f760d320dc49e620b8d7d6e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 22 Apr 2019 00:02:37 -0700 Subject: [PATCH 3041/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244621164 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d340c50bde5..f154d5ceb0f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9a68680949effc7643a60afd0cfaf05af81e8dcda5b93050b4ba45a4e822b51b", - git_commit = "d8fe10aae9e6be9cd49ab7e68c1ca4989f0be42b", + sha256 = "b5856cc6f043f7a11c99d61b1c06d461dc2c93438d371d6fce7123c0b133c8df", + git_commit = "12ee3420367f9a0f728c6b2e0493f5fb150eea47", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f915a696c53fc05f477230ebd5d11de06355d8e0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 22 Apr 2019 06:02:46 -0700 Subject: [PATCH 3042/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244651549 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f154d5ceb0f..2f21ce019bf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b5856cc6f043f7a11c99d61b1c06d461dc2c93438d371d6fce7123c0b133c8df", - git_commit = "12ee3420367f9a0f728c6b2e0493f5fb150eea47", + sha256 = "4b9f9f4a420f09912b66b51710255be9ae9f2a954d400e76af0e10a15a8ead01", + git_commit = "0a3777ff3e819e7208bc7e55bd36f79c9555704b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 248320c75bc96e359c6e4af7006560cf012a1210 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 22 Apr 2019 12:02:40 -0700 Subject: [PATCH 3043/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244705087 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2f21ce019bf..6ca6de68c26 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4b9f9f4a420f09912b66b51710255be9ae9f2a954d400e76af0e10a15a8ead01", - git_commit = "0a3777ff3e819e7208bc7e55bd36f79c9555704b", + sha256 = "53d279dce5ffa0f507ea3d8a2b885e2108904f40a2ee0c6703c0585339bdef2e", + git_commit = "7194906abf24361cc32ea1576ba8591681e76c7f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2d49ac8f34744b86d41fb4a9533e021391d16bf7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 22 Apr 2019 18:02:07 -0700 Subject: [PATCH 3044/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244771898 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6ca6de68c26..82d9ab0f642 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "53d279dce5ffa0f507ea3d8a2b885e2108904f40a2ee0c6703c0585339bdef2e", - git_commit = "7194906abf24361cc32ea1576ba8591681e76c7f", + sha256 = "e0a36f55d4aa637f7ec16c7a4e37850acedb38ceddc99d54acaf14dcb59abcba", + git_commit = "caf18b063e7e7419b3a0fcb5c3534d52c70eda5f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 96b67f523acf2eccfcd07efa06ea97a95cb52504 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 23 Apr 2019 00:02:36 -0700 Subject: [PATCH 3045/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244803664 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 82d9ab0f642..9e7e4790345 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e0a36f55d4aa637f7ec16c7a4e37850acedb38ceddc99d54acaf14dcb59abcba", - git_commit = "caf18b063e7e7419b3a0fcb5c3534d52c70eda5f", + sha256 = "ff65fd49f5c7d340d7f209c9ade17f33d539576c520e9ebe53cc91edd5602bbc", + git_commit = "a311216a9f028eec9e6b0d2ef175f5d46dff19b7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 94135c185cd38c30dc88789a99ad540d2b32ee01 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 23 Apr 2019 06:02:17 -0700 Subject: [PATCH 3046/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244840541 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9e7e4790345..e87a67adf75 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ff65fd49f5c7d340d7f209c9ade17f33d539576c520e9ebe53cc91edd5602bbc", - git_commit = "a311216a9f028eec9e6b0d2ef175f5d46dff19b7", + sha256 = "2798e0789a83036e5fea7f7b290bd90f1c156803f8dc9bae29479cdcc2073b00", + git_commit = "8dd0d951338278ac6295f7aafbf06774e9129c2f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9310c9e0d06d7cd271f76562d2cbaee43b71c8ce Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 23 Apr 2019 06:02:57 -0700 Subject: [PATCH 3047/8103] n/a PiperOrigin-RevId: 244840765 --- tensorflow_serving/batching/test_util/BUILD | 1 + tensorflow_serving/model_servers/BUILD | 3 +++ tensorflow_serving/servables/tensorflow/testdata/BUILD | 3 +++ 3 files changed, 7 insertions(+) diff --git a/tensorflow_serving/batching/test_util/BUILD b/tensorflow_serving/batching/test_util/BUILD index cf79be68122..4f92c1f142b 100644 --- a/tensorflow_serving/batching/test_util/BUILD +++ b/tensorflow_serving/batching/test_util/BUILD @@ -46,6 +46,7 @@ cc_test( py_binary( name = "matrix_half_plus_two_saved_model", srcs = ["matrix_half_plus_two_saved_model.py"], + python_version = "PY2", srcs_version = "PY2AND3", deps = ["@org_tensorflow//tensorflow:tensorflow_py"], ) diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index ff146e4b075..9cd7698de1e 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -402,6 +402,7 @@ py_test( "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_three/00000123/variables/variables.index", "@org_tensorflow//tensorflow/cc/saved_model:saved_model_half_plus_two", ], + python_version = "PY2", srcs_version = "PY2AND3", deps = [ "//tensorflow_serving/apis:model_service_proto_py_pb2", @@ -425,6 +426,7 @@ py_test( "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_three/00000123/variables/variables.data-00000-of-00001", "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_three/00000123/variables/variables.index", ], + python_version = "PY2", srcs_version = "PY2AND3", tags = ["notsan"], deps = [ @@ -436,6 +438,7 @@ py_test( py_binary( name = "tensorflow_model_server_test_client", srcs = ["tensorflow_model_server_test_client.py"], + python_version = "PY2", srcs_version = "PY2AND3", deps = [ "//tensorflow_serving/apis:prediction_service_proto_py_pb2", diff --git a/tensorflow_serving/servables/tensorflow/testdata/BUILD b/tensorflow_serving/servables/tensorflow/testdata/BUILD index 1e8c59b0e9c..b727a3eccde 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/BUILD +++ b/tensorflow_serving/servables/tensorflow/testdata/BUILD @@ -39,6 +39,7 @@ py_binary( srcs = [ "export_half_plus_two.py", ], + python_version = "PY2", srcs_version = "PY2AND3", deps = [ "@org_tensorflow//tensorflow:tensorflow_py", @@ -51,6 +52,7 @@ py_binary( srcs = [ "export_bad_half_plus_two.py", ], + python_version = "PY2", srcs_version = "PY2AND3", deps = [ "@org_tensorflow//tensorflow:tensorflow_py", @@ -74,6 +76,7 @@ py_binary( srcs = [ "saved_model_half_plus_two.py", ], + python_version = "PY2", srcs_version = "PY2AND3", deps = [ "@org_tensorflow//tensorflow:tensorflow_py", From 6f4536d0a40494e0f48b700c6f4eeae1ae11437f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 23 Apr 2019 12:02:04 -0700 Subject: [PATCH 3048/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244898328 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e87a67adf75..1799dc979bc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2798e0789a83036e5fea7f7b290bd90f1c156803f8dc9bae29479cdcc2073b00", - git_commit = "8dd0d951338278ac6295f7aafbf06774e9129c2f", + sha256 = "ed2afdd7f19c67d30f3555f5307a280e3feb950c689e9eb082c9450fc225f991", + git_commit = "a442e9ba05eb94ab9886df9ec39febb22d0d96bf", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0e8e270f3412e0004d09453ddbfd6fdd1001f89a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 23 Apr 2019 18:02:04 -0700 Subject: [PATCH 3049/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244961315 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1799dc979bc..4f93bbfbc11 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ed2afdd7f19c67d30f3555f5307a280e3feb950c689e9eb082c9450fc225f991", - git_commit = "a442e9ba05eb94ab9886df9ec39febb22d0d96bf", + sha256 = "a7292e55357becad51cbf7885f43592e6dca9b8ec906d471f496937d86f2803a", + git_commit = "0b5ec2e844c086453dd666179a9f726ac783ca8c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6419ceeaee037d2979d248cbd08c3136d4bb4abd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 24 Apr 2019 00:02:27 -0700 Subject: [PATCH 3050/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 244992952 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4f93bbfbc11..a5fcece32f5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a7292e55357becad51cbf7885f43592e6dca9b8ec906d471f496937d86f2803a", - git_commit = "0b5ec2e844c086453dd666179a9f726ac783ca8c", + sha256 = "eaac1a5acfe9c81c4e4f31bfd947cbca47ac82f62d2d5ac2d83437f77ddf1296", + git_commit = "d65760b805cdd729743ba3d7c7b4ae8897304dd6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5f296cf48597e184b7890093ad3a9ca059cf9f6f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 24 Apr 2019 06:02:08 -0700 Subject: [PATCH 3051/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 245030520 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a5fcece32f5..3530a256fa1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eaac1a5acfe9c81c4e4f31bfd947cbca47ac82f62d2d5ac2d83437f77ddf1296", - git_commit = "d65760b805cdd729743ba3d7c7b4ae8897304dd6", + sha256 = "53d777b871d82935dbcf32c9e8ceddf2e9e4319325ce6aa6e9518c94c6efaed8", + git_commit = "3c676a1cf6cc402f6ed7ccc9f52f15d62e4bb3ea", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 38ca9df58b1c03a3516514f814e1220825042cd1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 24 Apr 2019 12:02:33 -0700 Subject: [PATCH 3052/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 245089782 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3530a256fa1..7499e59c6a9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "53d777b871d82935dbcf32c9e8ceddf2e9e4319325ce6aa6e9518c94c6efaed8", - git_commit = "3c676a1cf6cc402f6ed7ccc9f52f15d62e4bb3ea", + sha256 = "4a56fc45c7adc748a181a62aad22b57c4ee1bba7de51d4d0ce6c344e36fe5be6", + git_commit = "c96dd5b1e06f267a3813acfefc5357b486af9bb7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c0f4cba885f3f5f3812ee9d9f904a1cefde5d102 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 24 Apr 2019 18:09:03 -0700 Subject: [PATCH 3053/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 245153987 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7499e59c6a9..6492321af29 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4a56fc45c7adc748a181a62aad22b57c4ee1bba7de51d4d0ce6c344e36fe5be6", - git_commit = "c96dd5b1e06f267a3813acfefc5357b486af9bb7", + sha256 = "3ca74e8fffc2d9c44a3d405f69f75b5f28504ffbbce2e76e7a8885f13e581436", + git_commit = "ed030f82935505a139afffca4bcb377fd0963d28", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 42d6ff8008d12bdefbe332bcd6f8b6d10c762d5c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 25 Apr 2019 00:02:03 -0700 Subject: [PATCH 3054/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 245183877 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6492321af29..d4c0bf7a540 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3ca74e8fffc2d9c44a3d405f69f75b5f28504ffbbce2e76e7a8885f13e581436", - git_commit = "ed030f82935505a139afffca4bcb377fd0963d28", + sha256 = "4b7a0fd241f924a18e8419aca077ae8f1e14a3db6a68865989a14b7054a7def1", + git_commit = "02badbcaba906d73fb9651d8800db27ac044136d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e8c04f37e9cd533027992f041295b21625929b7b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 25 Apr 2019 06:02:33 -0700 Subject: [PATCH 3055/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 245221113 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d4c0bf7a540..9b8d899eb6b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4b7a0fd241f924a18e8419aca077ae8f1e14a3db6a68865989a14b7054a7def1", - git_commit = "02badbcaba906d73fb9651d8800db27ac044136d", + sha256 = "18e77611c5db4000fab181a44528d1f514e0af181442e64c0f633b30feee2b04", + git_commit = "f076a43591854dfd27ef707351624fadcbedef1e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From db62a6ac389a3945d671228294c2fe1ae5e34e52 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 25 Apr 2019 12:02:36 -0700 Subject: [PATCH 3056/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 245280931 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9b8d899eb6b..07cf32154df 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "18e77611c5db4000fab181a44528d1f514e0af181442e64c0f633b30feee2b04", - git_commit = "f076a43591854dfd27ef707351624fadcbedef1e", + sha256 = "4189c84c177cb603312c8bd7af3963dc720857f3bc36604d25049d55d7dcd32f", + git_commit = "bb9fafd1b5bf020b8f255b6410b0e7a9992ee9d8", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9e3839d07566c1c546e32a02368b263136c807a7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 25 Apr 2019 18:02:01 -0700 Subject: [PATCH 3057/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 245343037 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 07cf32154df..dcfe8c1077b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4189c84c177cb603312c8bd7af3963dc720857f3bc36604d25049d55d7dcd32f", - git_commit = "bb9fafd1b5bf020b8f255b6410b0e7a9992ee9d8", + sha256 = "f56e076a1c912a480871c56f4efcf72245ca4d66443a5257b3eb5673c8bed322", + git_commit = "f28223f9a83d238590cd605863416928ce2778a5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From fd70c4c451fc558775c1ebad4c321b718072c963 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 26 Apr 2019 00:02:17 -0700 Subject: [PATCH 3058/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 245372918 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dcfe8c1077b..e614f3b1a7e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f56e076a1c912a480871c56f4efcf72245ca4d66443a5257b3eb5673c8bed322", - git_commit = "f28223f9a83d238590cd605863416928ce2778a5", + sha256 = "bdf6e73e1875b405d5cff8349ef669791cd22aaa61b504a1cbbc815d13b3ecf3", + git_commit = "8d4c4999c1138d503cabb9377a0b3a6da0eb35d9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f1bf4dce9a82e13ba677140e29f16d6c89780297 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 26 Apr 2019 06:02:16 -0700 Subject: [PATCH 3059/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 245408057 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e614f3b1a7e..fa2ec164fef 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bdf6e73e1875b405d5cff8349ef669791cd22aaa61b504a1cbbc815d13b3ecf3", - git_commit = "8d4c4999c1138d503cabb9377a0b3a6da0eb35d9", + sha256 = "cb01bf7e46531755d4c9c86df5fe01935a4c15a2504e816f48d401d87555832a", + git_commit = "55e854864fded7318c49daae0b634c5860f3e419", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f557e6b82d48a98fb3cf00a10ac8138bee8cba27 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 26 Apr 2019 12:02:20 -0700 Subject: [PATCH 3060/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 245462329 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fa2ec164fef..502af4b61ba 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cb01bf7e46531755d4c9c86df5fe01935a4c15a2504e816f48d401d87555832a", - git_commit = "55e854864fded7318c49daae0b634c5860f3e419", + sha256 = "6ff8e22e2e8115ffc3d60a6fdb1cb4a6eb849b10dbc0b1955f5488f0c9c99f3a", + git_commit = "9c6cc1a077fbadbd0b7bbd6f89b44d1ca2f46fb7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f99f42f04e790219a75132e11bd7a91204156671 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 26 Apr 2019 18:02:02 -0700 Subject: [PATCH 3061/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 245519327 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 502af4b61ba..6bd2dcc6f94 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6ff8e22e2e8115ffc3d60a6fdb1cb4a6eb849b10dbc0b1955f5488f0c9c99f3a", - git_commit = "9c6cc1a077fbadbd0b7bbd6f89b44d1ca2f46fb7", + sha256 = "aad0670300899c4d7c3c4ae5a5d28672d4018934405849a89c52b775edbc06c0", + git_commit = "034fc9e23e393bfbe4249e0d6ae4b94e87fca288", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 281fe19923468d580d529026a86aa047d5ad9346 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 27 Apr 2019 00:02:08 -0700 Subject: [PATCH 3062/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 245542400 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6bd2dcc6f94..4544e590612 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "aad0670300899c4d7c3c4ae5a5d28672d4018934405849a89c52b775edbc06c0", - git_commit = "034fc9e23e393bfbe4249e0d6ae4b94e87fca288", + sha256 = "f5683c7803fe3ff431225d69ff57a9d342b4ec8efb5ed3ca31358e9e6924c1ef", + git_commit = "64320bbddb72dda0c564b7eb9caa88a7b420b2c8", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a482e8bc71284a033087a47e521af5249c55ea55 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 27 Apr 2019 06:02:03 -0700 Subject: [PATCH 3063/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 245562472 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4544e590612..dcb35456d8d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f5683c7803fe3ff431225d69ff57a9d342b4ec8efb5ed3ca31358e9e6924c1ef", - git_commit = "64320bbddb72dda0c564b7eb9caa88a7b420b2c8", + sha256 = "bb8b766ccfa689a981219c1fc814b6c6683b125bc6a21eb7a6b3c18cecb5818a", + git_commit = "50e26060ca69eb55a19922e6580628b773905e05", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2524cee528ff82e56db3b57d4a9f20850ff3b808 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 27 Apr 2019 12:02:03 -0700 Subject: [PATCH 3064/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 245579115 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dcb35456d8d..1f1a3edeafe 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bb8b766ccfa689a981219c1fc814b6c6683b125bc6a21eb7a6b3c18cecb5818a", - git_commit = "50e26060ca69eb55a19922e6580628b773905e05", + sha256 = "dd7ed5fac9adb9bf081db3138ea28ed5a5c9d088a6034c0f5b8862d77074db93", + git_commit = "7ca022acc80c2194d7006dd5d9e4efc1b5150f54", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 03e3db28346929aa52a6b36037152c740436d534 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 27 Apr 2019 18:02:10 -0700 Subject: [PATCH 3065/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 245597538 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1f1a3edeafe..a613ca02491 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dd7ed5fac9adb9bf081db3138ea28ed5a5c9d088a6034c0f5b8862d77074db93", - git_commit = "7ca022acc80c2194d7006dd5d9e4efc1b5150f54", + sha256 = "0cc685cdaf04159d6d10dc9ab003b9a651edc9f7a4b7cbb095980a90996bf8f4", + git_commit = "d3e78f98ba5db7aecfc93f3289495c4819b3d4eb", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From bb7e1e8d4e10e1e73e4b6fbd2744dc202d40fd17 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 28 Apr 2019 06:02:23 -0700 Subject: [PATCH 3066/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 245635384 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a613ca02491..599f3a3eda9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0cc685cdaf04159d6d10dc9ab003b9a651edc9f7a4b7cbb095980a90996bf8f4", - git_commit = "d3e78f98ba5db7aecfc93f3289495c4819b3d4eb", + sha256 = "7adea27c6d5dc9fcbbfb35050b713363f362d297cda5ab15c4f659ee5701be92", + git_commit = "b1190ccd07bae59b2ed826d00a2a80edbdd14718", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a833e3ed41d67550ff7b75d049e8b3aac43a9cee Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 28 Apr 2019 18:01:56 -0700 Subject: [PATCH 3067/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 245670958 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 599f3a3eda9..a751f5608c1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7adea27c6d5dc9fcbbfb35050b713363f362d297cda5ab15c4f659ee5701be92", - git_commit = "b1190ccd07bae59b2ed826d00a2a80edbdd14718", + sha256 = "699b5e707be53d9fc7b2dabffd84a8e0a5526762aed87d1b598af5d4af71728e", + git_commit = "932874df5ff31e38fa6d38fc87d100525dd46e50", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a43216154eab1fcd2e53783ab67369f46d812768 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 29 Apr 2019 06:02:08 -0700 Subject: [PATCH 3068/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 245732131 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a751f5608c1..0290121d5e1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "699b5e707be53d9fc7b2dabffd84a8e0a5526762aed87d1b598af5d4af71728e", - git_commit = "932874df5ff31e38fa6d38fc87d100525dd46e50", + sha256 = "b31e7681fb1facd6dae654d9488174ad33d293ee9cce79cfb11534bf282c4b32", + git_commit = "2900bfa9b046f80d65edad1f8fca3bc6bc6b8736", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c74861d61131e2248a70d9c72317df8c49eb8f1a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 29 Apr 2019 11:26:43 -0700 Subject: [PATCH 3069/8103] Add new device type for TPU. PiperOrigin-RevId: 245786973 --- tensorflow_serving/resources/resource_values.cc | 2 ++ tensorflow_serving/resources/resource_values.h | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/tensorflow_serving/resources/resource_values.cc b/tensorflow_serving/resources/resource_values.cc index 6f3e05e531f..9538e9d962a 100644 --- a/tensorflow_serving/resources/resource_values.cc +++ b/tensorflow_serving/resources/resource_values.cc @@ -21,11 +21,13 @@ namespace serving { namespace device_types { const char* const kMain = "main"; const char* const kGpu = "gpu"; +const char* const kTpu = "tpu"; } // namespace device_types namespace resource_kinds { const char* const kNumModelSlots = "num_model_slots"; const char* const kRamBytes = "ram_in_bytes"; +const char* const kHeapRamBytes = "heap_ram_in_bytes"; const char* const kProcessingMillis = "processing_in_millicores"; } // namespace resource_kinds diff --git a/tensorflow_serving/resources/resource_values.h b/tensorflow_serving/resources/resource_values.h index 81616087043..dc880eac153 100644 --- a/tensorflow_serving/resources/resource_values.h +++ b/tensorflow_serving/resources/resource_values.h @@ -33,6 +33,9 @@ extern const char* const kMain; // Graphics processing unit(s). extern const char* const kGpu; +// TPU(s). +extern const char* const kTpu; + } // namespace device_types // Standard resource kinds. @@ -45,6 +48,9 @@ extern const char* const kNumModelSlots; // RAM in bytes. extern const char* const kRamBytes; +// RAM allocated on the heap. +extern const char* const kHeapRamBytes; + // Fraction of a processing unit's cycles, in thousandths. extern const char* const kProcessingMillis; From 5a81b85465104d02c6d336114f2e5af65cf92286 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 29 Apr 2019 12:02:18 -0700 Subject: [PATCH 3070/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 245794540 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0290121d5e1..034daf5983e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b31e7681fb1facd6dae654d9488174ad33d293ee9cce79cfb11534bf282c4b32", - git_commit = "2900bfa9b046f80d65edad1f8fca3bc6bc6b8736", + sha256 = "5ea2eea97fd41167e8ea66623f49b5ca5bc8006c5f703a72b3d1673a9118f9c8", + git_commit = "1bdd4e20c1e0dfcebd612b2b944e3959b8dfe3c1", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7349089cb7ca0c26d27903eec1d1579ba0ace87b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 29 Apr 2019 18:02:01 -0700 Subject: [PATCH 3071/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 245861844 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 034daf5983e..d7285545407 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5ea2eea97fd41167e8ea66623f49b5ca5bc8006c5f703a72b3d1673a9118f9c8", - git_commit = "1bdd4e20c1e0dfcebd612b2b944e3959b8dfe3c1", + sha256 = "3c81e3ea5b2e48b49f412f7d0fdd3ff2cbcf6184c9c8f3f7036ee6219324cd05", + git_commit = "4f7a7760cf39085fab9bc83e83bf921445541ef7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c810fda71c07abda0a40c1696279fd752670303e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 30 Apr 2019 00:02:42 -0700 Subject: [PATCH 3072/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 245893428 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d7285545407..c1c2108dac2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3c81e3ea5b2e48b49f412f7d0fdd3ff2cbcf6184c9c8f3f7036ee6219324cd05", - git_commit = "4f7a7760cf39085fab9bc83e83bf921445541ef7", + sha256 = "df06d7bbf20238052f902f3e3b4fc0f56593b84ef16afc0cdd4ded372b1a38f5", + git_commit = "79fca9af73b2634a64d10a0caad4e35bc6ca00d1", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2f42c693b22c946bf38a4a5934e95a335379caac Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 30 Apr 2019 06:02:09 -0700 Subject: [PATCH 3073/8103] Updating TensorFlow to latest green. PiperOrigin-RevId: 245932179 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c1c2108dac2..32c99566625 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "df06d7bbf20238052f902f3e3b4fc0f56593b84ef16afc0cdd4ded372b1a38f5", - git_commit = "79fca9af73b2634a64d10a0caad4e35bc6ca00d1", + sha256 = "ec240bfb7863a09af7de46044eb0cd0564ee182126d01497c596deffec03514a", + git_commit = "fc2ea0aa5142b5e2b8c322d58313ad13e0fb91dd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 97cc31fa6b83af56926731d8a4215fb694aaea94 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 30 Apr 2019 12:05:04 -0700 Subject: [PATCH 3074/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b104b017-9e50-467e-bc11-9c60e78875e3 PiperOrigin-RevId: 245994552 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 32c99566625..329529f3148 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ec240bfb7863a09af7de46044eb0cd0564ee182126d01497c596deffec03514a", - git_commit = "fc2ea0aa5142b5e2b8c322d58313ad13e0fb91dd", + sha256 = "d09769ca8c1cabbc55d1e7cd5fc91e6358f5311529ed63767166e22ddd930817", + git_commit = "0a82fed5e49b225d4fc46b248bc0bd78f86dd6d9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c982772a1fc0cd498f1f383bbb3bf1eb6dd36434 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 30 Apr 2019 18:02:00 -0700 Subject: [PATCH 3075/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fa04a436-98ef-4fb5-97bf-068f415f76fa PiperOrigin-RevId: 246059141 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 329529f3148..f945d168033 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d09769ca8c1cabbc55d1e7cd5fc91e6358f5311529ed63767166e22ddd930817", - git_commit = "0a82fed5e49b225d4fc46b248bc0bd78f86dd6d9", + sha256 = "db70b9dc66c35934d0457d978f91a14e0e2265932c7a8ba74a45205be8bd7e5e", + git_commit = "ead6286a5a4c51a21f28d2904140a4e0154a3f07", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6bea701692f391d2d2e50167f5ae1cbd6856eab9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 1 May 2019 00:02:23 -0700 Subject: [PATCH 3076/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7a63839e-937b-41ae-9756-49068a737b87 PiperOrigin-RevId: 246088796 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f945d168033..65bb64f9b53 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "db70b9dc66c35934d0457d978f91a14e0e2265932c7a8ba74a45205be8bd7e5e", - git_commit = "ead6286a5a4c51a21f28d2904140a4e0154a3f07", + sha256 = "885609658b3d9b79a514084181f1dca99ac25da9cdc8db7a98b268c8d1610914", + git_commit = "dd27bd0629ee77dce818f60add876c4ab267e1eb", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From fa2191505b4d66af9b8661cd8258c7230f8b7b0a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 1 May 2019 06:02:12 -0700 Subject: [PATCH 3077/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f9845b5e-66d4-4342-9835-005f318dc37e PiperOrigin-RevId: 246120156 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 65bb64f9b53..8fbd9436287 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "885609658b3d9b79a514084181f1dca99ac25da9cdc8db7a98b268c8d1610914", - git_commit = "dd27bd0629ee77dce818f60add876c4ab267e1eb", + sha256 = "7357ac0f23bbec93d64ddbba29d1a74e60ff4b44a000f515e0717987f6ef04d1", + git_commit = "4fea77c2e320871d14ae2c2c85459cd1a016d690", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e5664cee0b8a464d3a0665100deb44b44d277daa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 1 May 2019 12:05:55 -0700 Subject: [PATCH 3078/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0917989c-e34f-4e55-bdcf-e3ff7e89a7c0 PiperOrigin-RevId: 246173936 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8fbd9436287..366243555fb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7357ac0f23bbec93d64ddbba29d1a74e60ff4b44a000f515e0717987f6ef04d1", - git_commit = "4fea77c2e320871d14ae2c2c85459cd1a016d690", + sha256 = "7127bdd1b9d9206629b95af494bbf76ffa24af585c1ebc95153115e53de625f1", + git_commit = "ad9d0dcfecf931372be4a385db8a1083ab8f1cc7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 645492c79c0f3554090daf47870729047de21228 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 1 May 2019 18:02:01 -0700 Subject: [PATCH 3079/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2cbb0006-9b31-4f73-b883-24d1170f64dd PiperOrigin-RevId: 246234905 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 366243555fb..152d01c187e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7127bdd1b9d9206629b95af494bbf76ffa24af585c1ebc95153115e53de625f1", - git_commit = "ad9d0dcfecf931372be4a385db8a1083ab8f1cc7", + sha256 = "7808eb297db9eba9aaba0b353b47e81e5e696ed923c446e4d23fb06a08e09d86", + git_commit = "f9a682e70fbd2f6b19a40c2d923da2e5afe25586", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 72450555c83ea5e6d18d05362192ad85613b23b1 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Wed, 1 May 2019 21:08:23 -0700 Subject: [PATCH 3080/8103] Add ability to disable periodic filesystem polling for new model versions, by setting value of `--file_system_poll_wait_seconds` to zero. This causes the ModelServer to poll the filesystem *once* (to load the model) and never again. Useful in scenarios where periodic poll is deemed to be too expensive, and one wants to load the model just once (at startup) and never poll again. Fixes: https://github.com/tensorflow/serving/issues/1295 PiperOrigin-RevId: 246252089 --- tensorflow_serving/model_servers/main.cc | 9 +++- .../test_util/server_core_test_util.cc | 2 +- tensorflow_serving/sources/storage_path/BUILD | 1 + .../file_system_storage_path_source.cc | 39 +++++++++++------- .../file_system_storage_path_source.h | 28 ++++++++++++- .../file_system_storage_path_source.proto | 5 ++- .../file_system_storage_path_source_test.cc | 41 +++++++++++++++++++ 7 files changed, 103 insertions(+), 22 deletions(-) diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index 72c5aa5116a..e37fd1cb05c 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -104,8 +104,13 @@ int main(int argc, char** argv) { "Default: 1 minute"), tensorflow::Flag("file_system_poll_wait_seconds", &options.file_system_poll_wait_seconds, - "interval in seconds between each poll of the file " - "system for new model version"), + "Interval in seconds between each poll of the " + "filesystem for new model version. If set to zero " + "poll will be exactly done once and not periodically. " + "Setting this to negative value will disable polling " + "entirely causing ModelServer to indefinitely wait for " + "a new model at startup. Negative values are reserved " + "for testing purposes only."), tensorflow::Flag("flush_filesystem_caches", &options.flush_filesystem_caches, "If true (the default), filesystem caches will be " diff --git a/tensorflow_serving/model_servers/test_util/server_core_test_util.cc b/tensorflow_serving/model_servers/test_util/server_core_test_util.cc index ddb19f6cf66..c2aead0de5b 100644 --- a/tensorflow_serving/model_servers/test_util/server_core_test_util.cc +++ b/tensorflow_serving/model_servers/test_util/server_core_test_util.cc @@ -42,7 +42,7 @@ void AddSessionRunLoadThreadPool(SessionBundleConfig* const bundle_config) { ServerCore::Options GetDefaultOptions(const bool use_saved_model) { ServerCore::Options options; - options.file_system_poll_wait_seconds = 0; + options.file_system_poll_wait_seconds = 1; // Reduce the number of initial load threads to be num_load_threads to avoid // timing out in tests. options.num_initial_load_threads = options.num_load_threads; diff --git a/tensorflow_serving/sources/storage_path/BUILD b/tensorflow_serving/sources/storage_path/BUILD index ef040c6f710..940c0bda995 100644 --- a/tensorflow_serving/sources/storage_path/BUILD +++ b/tensorflow_serving/sources/storage_path/BUILD @@ -75,6 +75,7 @@ cc_library( "//tensorflow_serving/core:servable_id", "//tensorflow_serving/core:source", "//tensorflow_serving/core:storage_path", + "@com_google_absl//absl/types:variant", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:tensorflow", "@org_tensorflow//tensorflow/core/kernels/batching_util:periodic_function_dynamic", diff --git a/tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc b/tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc index b90a8cd67b5..a9d200f461d 100644 --- a/tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc +++ b/tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc @@ -23,7 +23,6 @@ limitations under the License. #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/lib/io/path.h" #include "tensorflow/core/lib/strings/numbers.h" -#include "tensorflow/core/platform/env.h" #include "tensorflow_serving/core/servable_data.h" #include "tensorflow_serving/core/servable_id.h" @@ -357,21 +356,30 @@ void FileSystemStoragePathSource::SetAspiredVersionsCallback( } aspired_versions_callback_ = callback; - if (config_.file_system_poll_wait_seconds() >= 0) { - // Kick off a thread to poll the file system periodically, and call the - // callback. + const auto thread_fn = [this](void) { + Status status = this->PollFileSystemAndInvokeCallback(); + if (!status.ok()) { + LOG(ERROR) << "FileSystemStoragePathSource encountered a " + "filesystem access error: " + << status.error_message(); + } + }; + + if (config_.file_system_poll_wait_seconds() == 0) { + // Start a thread to poll filesystem once and call the callback. + fs_polling_thread_.reset(new FileSystemStoragePathSource::ThreadType( + absl::in_place_type_t>(), + Env::Default()->StartThread( + ThreadOptions(), + "FileSystemStoragePathSource_filesystem_oneshot_thread", + thread_fn))); + } else if (config_.file_system_poll_wait_seconds() > 0) { + // Start a thread to poll the filesystem periodically and call the callback. PeriodicFunction::Options pf_options; pf_options.thread_name_prefix = "FileSystemStoragePathSource_filesystem_polling_thread"; - fs_polling_thread_.reset(new PeriodicFunction( - [this] { - Status status = this->PollFileSystemAndInvokeCallback(); - if (!status.ok()) { - LOG(ERROR) << "FileSystemStoragePathSource encountered a " - "file-system access error: " - << status.error_message(); - } - }, + fs_polling_thread_.reset(new FileSystemStoragePathSource::ThreadType( + absl::in_place_type_t(), thread_fn, config_.file_system_poll_wait_seconds() * 1000000, pf_options)); } } @@ -398,7 +406,7 @@ Status FileSystemStoragePathSource::PollFileSystemAndInvokeCallback() { << config_.file_system_poll_wait_seconds(); } } - aspired_versions_callback_(servable, versions); + CallAspiredVersionsCallback(servable, versions); } return Status::OK(); } @@ -406,7 +414,8 @@ Status FileSystemStoragePathSource::PollFileSystemAndInvokeCallback() { Status FileSystemStoragePathSource::UnaspireServables( const std::set& servable_names) { for (const string& servable_name : servable_names) { - aspired_versions_callback_(servable_name, {}); + CallAspiredVersionsCallback(servable_name, + std::vector>{}); } return Status::OK(); } diff --git a/tensorflow_serving/sources/storage_path/file_system_storage_path_source.h b/tensorflow_serving/sources/storage_path/file_system_storage_path_source.h index fd9af2d57f8..15ba88c8972 100644 --- a/tensorflow_serving/sources/storage_path/file_system_storage_path_source.h +++ b/tensorflow_serving/sources/storage_path/file_system_storage_path_source.h @@ -16,10 +16,14 @@ limitations under the License. #ifndef TENSORFLOW_SERVING_SOURCES_STORAGE_PATH_FILE_SYSTEM_STORAGE_PATH_SOURCE_H_ #define TENSORFLOW_SERVING_SOURCES_STORAGE_PATH_FILE_SYSTEM_STORAGE_PATH_SOURCE_H_ +#include #include +#include +#include "absl/types/variant.h" #include "tensorflow/core/kernels/batching_util/periodic_function.h" #include "tensorflow/core/lib/core/status.h" +#include "tensorflow/core/platform/env.h" #include "tensorflow/core/platform/macros.h" #include "tensorflow/core/platform/types.h" #include "tensorflow_serving/core/source.h" @@ -90,14 +94,34 @@ class FileSystemStoragePathSource : public Source { Status UnaspireServables(const std::set& servable_names) EXCLUSIVE_LOCKS_REQUIRED(mu_); + template + void CallAspiredVersionsCallback(Args&&... args) { + if (aspired_versions_callback_) { + aspired_versions_callback_(std::forward(args)...); + if (aspired_versions_callback_notifier_) { + aspired_versions_callback_notifier_(); + } + } + } + + // For testing. + void SetAspiredVersionsCallbackNotifier(std::function fn) { + mutex_lock l(mu_); + aspired_versions_callback_notifier_ = fn; + } + mutable mutex mu_; FileSystemStoragePathSourceConfig config_ GUARDED_BY(mu_); AspiredVersionsCallback aspired_versions_callback_ GUARDED_BY(mu_); - // A thread that periodically calls PollFileSystemAndInvokeCallback(). - std::unique_ptr fs_polling_thread_ GUARDED_BY(mu_); + std::function aspired_versions_callback_notifier_ GUARDED_BY(mu_); + + // A thread that calls PollFileSystemAndInvokeCallback() once or periodically. + using ThreadType = + absl::variant>; + std::unique_ptr fs_polling_thread_ GUARDED_BY(mu_); TF_DISALLOW_COPY_AND_ASSIGN(FileSystemStoragePathSource); }; diff --git a/tensorflow_serving/sources/storage_path/file_system_storage_path_source.proto b/tensorflow_serving/sources/storage_path/file_system_storage_path_source.proto index ba1db1cfe02..add7aa2a28e 100644 --- a/tensorflow_serving/sources/storage_path/file_system_storage_path_source.proto +++ b/tensorflow_serving/sources/storage_path/file_system_storage_path_source.proto @@ -51,7 +51,7 @@ message FileSystemStoragePathSourceConfig { servable_version_policy = 4; reserved 3; // Legacy version_policy definition. - }; + } // The servables to monitor for new versions, and aspire. repeated ServableToMonitor servables = 5; @@ -65,7 +65,8 @@ message FileSystemStoragePathSourceConfig { // How long to wait between file-system polling to look for children of // 'base_path', in seconds. // - // For testing use only: a negative value disables the polling thread. + // If set to zero, filesystem will be polled exactly once. If set to a + // negative value (for testing use only), polling will be entirely disabled. int64 file_system_poll_wait_seconds = 3; // If true, then FileSystemStoragePathSource::Create() and ::UpdateConfig() diff --git a/tensorflow_serving/sources/storage_path/file_system_storage_path_source_test.cc b/tensorflow_serving/sources/storage_path/file_system_storage_path_source_test.cc index c82a7cec3ec..7f812a69ff2 100644 --- a/tensorflow_serving/sources/storage_path/file_system_storage_path_source_test.cc +++ b/tensorflow_serving/sources/storage_path/file_system_storage_path_source_test.cc @@ -15,6 +15,7 @@ limitations under the License. #include "tensorflow_serving/sources/storage_path/file_system_storage_path_source.h" +#include #include #include @@ -54,6 +55,10 @@ class FileSystemStoragePathSourceTestAccess { return source_->PollFileSystemAndInvokeCallback(); } + void SetAspiredVersionsCallbackNotifier(std::function fn) { + source_->SetAspiredVersionsCallbackNotifier(fn); + } + private: FileSystemStoragePathSource* source_; @@ -774,6 +779,42 @@ TEST(FileSystemStoragePathSourceTest, LastVersionNotRemoved) { } } +TEST(FileSystemStoragePathSourceTest, PollFilesystemOnlyOnce) { + const string base_path = io::JoinPath(testing::TmpDir(), "OneShot"); + auto config = test_util::CreateProto( + strings::Printf("servable_name: 'test_servable_name' " + "base_path: '%s' " + "fail_if_zero_versions_at_startup: false " + // Poll only once (One shot mode). + "file_system_poll_wait_seconds: 0 ", + base_path.c_str())); + std::unique_ptr source; + TF_ASSERT_OK(FileSystemStoragePathSource::Create(config, &source)); + internal::FileSystemStoragePathSourceTestAccess source_test(source.get()); + std::atomic notify_count(0); + source_test.SetAspiredVersionsCallbackNotifier([&]() { notify_count++; }); + std::unique_ptr target( + new StrictMock); + // Inject the base-path and version. + TF_ASSERT_OK(Env::Default()->CreateDir(base_path)); + TF_ASSERT_OK(Env::Default()->CreateDir(io::JoinPath(base_path, "3"))); + EXPECT_CALL(*target, SetAspiredVersions(Eq("test_servable_name"), + ElementsAre(ServableData( + {"test_servable_name", 3}, + io::JoinPath(base_path, "3"))))); + EXPECT_EQ(notify_count.load(), 0); + ConnectSourceToTarget(source.get(), target.get()); + while (notify_count == 0) { + Env::Default()->SleepForMicroseconds(1000 /* 1 ms */); + } + EXPECT_EQ(notify_count.load(), 1); + + // Inject new version. + TF_ASSERT_OK(Env::Default()->CreateDir(io::JoinPath(base_path, "4"))); + Env::Default()->SleepForMicroseconds(1 * 1000 * 1000 /* 1 second */); + EXPECT_EQ(notify_count.load(), 1); +} + } // namespace } // namespace serving } // namespace tensorflow From 66bd863f910c49bc3bba63aa51fe7e1c137c00ac Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 May 2019 00:02:44 -0700 Subject: [PATCH 3081/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8ed1a11a-f2df-4bd9-adb3-68e448f99b52 PiperOrigin-RevId: 246265927 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 152d01c187e..e9273b45d10 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7808eb297db9eba9aaba0b353b47e81e5e696ed923c446e4d23fb06a08e09d86", - git_commit = "f9a682e70fbd2f6b19a40c2d923da2e5afe25586", + sha256 = "9822c9a96cf6a3121eb8bbd647605d3e78ecf33b54a4b7217c5dbb1457c54ce2", + git_commit = "cc3490f51c1070a0fe8bc7179d7d862978d74424", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 43f29ebb9d4a8d1291b3b91830b98c0aa77cc8e5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 May 2019 06:02:01 -0700 Subject: [PATCH 3082/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ebcf3fb5-e84e-4d9f-8bbd-66e6f85a7283 PiperOrigin-RevId: 246303500 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e9273b45d10..5e886b46a9a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9822c9a96cf6a3121eb8bbd647605d3e78ecf33b54a4b7217c5dbb1457c54ce2", - git_commit = "cc3490f51c1070a0fe8bc7179d7d862978d74424", + sha256 = "b8465a2c3588151736484d3866298cffc8f2123cc0e48b958ebdcd4480d13cd2", + git_commit = "64c4f34e982b8846330c00b1f489f07d9490927d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d7c3b3deacbabf763ed44fb6932535016852e90a Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Thu, 2 May 2019 09:14:52 -0700 Subject: [PATCH 3083/8103] Fix printing of decimal numbers. StrCat() can round numbers (e.g. 555557.5 > 555558) causing incorrect number to be written out in the JSON output. Detect this (via roundtrip conversion from number -> string -> number) and use full precision to output the number. We do not output full precision always, as that tends to not produce the shortest representation (adding noise bits in the resulting string). Fixes https://github.com/tensorflow/serving/issues/1332 PiperOrigin-RevId: 246330192 --- tensorflow_serving/util/BUILD | 1 + tensorflow_serving/util/json_tensor.cc | 23 +++++++++++++++++++++ tensorflow_serving/util/json_tensor_test.cc | 8 ++++--- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/tensorflow_serving/util/BUILD b/tensorflow_serving/util/BUILD index efc1087c177..0f3f6c6d1a7 100644 --- a/tensorflow_serving/util/BUILD +++ b/tensorflow_serving/util/BUILD @@ -348,6 +348,7 @@ cc_library( "//tensorflow_serving/apis:regression_proto", "@com_github_tencent_rapidjson//:rapidjson", "@com_google_absl//absl/strings", + "@com_google_absl//absl/strings:str_format", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", diff --git a/tensorflow_serving/util/json_tensor.cc b/tensorflow_serving/util/json_tensor.cc index a484aaf057e..f5db8b920c6 100644 --- a/tensorflow_serving/util/json_tensor.cc +++ b/tensorflow_serving/util/json_tensor.cc @@ -27,6 +27,8 @@ limitations under the License. #include "rapidjson/stringbuffer.h" #include "absl/strings/escaping.h" #include "absl/strings/match.h" +#include "absl/strings/numbers.h" +#include "absl/strings/str_format.h" #include "absl/strings/str_join.h" #include "tensorflow/core/example/example.pb.h" #include "tensorflow/core/example/feature.pb.h" @@ -99,6 +101,16 @@ string JsonTypeString(const rapidjson::Value& val) { } } +template +bool StringToDecimal(const absl::string_view s, dtype* out) { + return absl::SimpleAtof(s, out); +} + +template <> +bool StringToDecimal(const absl::string_view s, double* out) { + return absl::SimpleAtod(s, out); +} + template bool WriteDecimal(RapidJsonWriter* writer, dtype val) { static_assert( @@ -115,6 +127,17 @@ bool WriteDecimal(RapidJsonWriter* writer, dtype val) { string decimal_str; if (std::isfinite(val)) { decimal_str = absl::StrCat(val); + + // If converted number does not roundtrip, format using full precision. + dtype num; + if (!StringToDecimal(decimal_str, &num)) { + return false; + } + if (val != num) { + decimal_str = absl::StrFormat( + "%.*g", std::numeric_limits::max_digits10, val); + } + // Add trailing '.0' for whole numbers and those not in scientific notation. // StrCat() formats numbers in six-digit (printf "%g"), numbers like 9000000 // and .00003 get written as 9e+06 and 3e-05 (scientific notation). diff --git a/tensorflow_serving/util/json_tensor_test.cc b/tensorflow_serving/util/json_tensor_test.cc index 7e1c057e81e..e149625998b 100644 --- a/tensorflow_serving/util/json_tensor_test.cc +++ b/tensorflow_serving/util/json_tensor_test.cc @@ -794,12 +794,14 @@ TEST(JsontensorTest, FromJsonSingleFloatTensorSixDigitPrecision) { dtype: DT_FLOAT tensor_shape { dim { size: 2 } - dim { size: 2 } + dim { size: 3 } } float_val: 9000000 float_val: 999999 + float_val: 0.50000 float_val: .0003 float_val: .00003 + float_val: 555557.5 )", &tensormap["float_tensor"])); @@ -808,8 +810,8 @@ TEST(JsontensorTest, FromJsonSingleFloatTensorSixDigitPrecision) { MakeJsonFromTensors(tensormap, JsonPredictRequestFormat::kRow, &json)); TF_EXPECT_OK(CompareJsonAllValuesAsStrings(json, R"({ "predictions": [ - [9e+06, 999999.0], - [0.0003, 3e-05] + [9e+06, 999999.0, 0.5], + [0.0003, 3e-05, 555557.5] ]})")); } From 4b6225d99b41198d684dc70d75507c7365517e1a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 May 2019 12:02:18 -0700 Subject: [PATCH 3084/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4f1cc5d2-17b8-4347-9730-e3c24ba44a41 PiperOrigin-RevId: 246363530 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5e886b46a9a..cf11de4db01 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b8465a2c3588151736484d3866298cffc8f2123cc0e48b958ebdcd4480d13cd2", - git_commit = "64c4f34e982b8846330c00b1f489f07d9490927d", + sha256 = "015423ecb4b749024374faa35d45ddacc356f0cc6a850a2c8765a2529825575a", + git_commit = "0bd176ccd533622858306efca6274d4101a16c85", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 018502ae784641c8429e0f4d2c1436fb623073e2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 May 2019 18:02:04 -0700 Subject: [PATCH 3085/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7bc87d2e-7dda-4937-9207-c88a97e2eb70 PiperOrigin-RevId: 246427001 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cf11de4db01..ab1df16a297 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "015423ecb4b749024374faa35d45ddacc356f0cc6a850a2c8765a2529825575a", - git_commit = "0bd176ccd533622858306efca6274d4101a16c85", + sha256 = "e8b7295d3de3d3fb3ede7f68022b12602cc67d33483cd7c135ba8edc17900513", + git_commit = "96ef036c7969d442cba1abfed12409d01d8b787d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From fb7835c7cd95c5b6b163cb2abd6a8b9a1a283689 Mon Sep 17 00:00:00 2001 From: Wenbo Zhu Date: Thu, 2 May 2019 18:37:31 -0700 Subject: [PATCH 3086/8103] Fixed the gzip uncompression support in the HTTP server. PiperOrigin-RevId: 246431123 --- .../util/net_http/compression/gzip_zlib.cc | 16 +--- .../util/net_http/compression/gzip_zlib.h | 19 +--- .../net_http/compression/gzip_zlib_test.cc | 47 ++++++---- .../util/net_http/server/internal/BUILD | 1 + .../server/internal/evhttp_request.cc | 94 ++++++++++++++----- .../net_http/server/internal/evhttp_request.h | 9 +- .../server/internal/evhttp_request_test.cc | 68 ++++++++++++-- 7 files changed, 177 insertions(+), 77 deletions(-) diff --git a/tensorflow_serving/util/net_http/compression/gzip_zlib.cc b/tensorflow_serving/util/net_http/compression/gzip_zlib.cc index a1e54a493b5..af22df34898 100644 --- a/tensorflow_serving/util/net_http/compression/gzip_zlib.cc +++ b/tensorflow_serving/util/net_http/compression/gzip_zlib.cc @@ -430,11 +430,6 @@ int ZLib::CompressChunkOrAll(Bytef *dest, uLongf *destLen, const Bytef *source, return ret; } -int ZLib::CompressChunk(Bytef *dest, uLongf *destLen, const Bytef *source, - uLong sourceLen) { - return CompressChunkOrAll(dest, destLen, source, sourceLen, Z_SYNC_FLUSH); -} - int ZLib::CompressAtMost(Bytef *dest, uLongf *destLen, const Bytef *source, uLong *sourceLen) { return CompressAtMostOrAll(dest, destLen, source, sourceLen, Z_SYNC_FLUSH); @@ -555,7 +550,7 @@ int ZLib::UncompressInit(Bytef *dest, uLongf *destLen, const Bytef *source, // If you compressed your data a chunk at a time, with CompressChunk, // you can uncompress it a chunk at a time with UncompressChunk. -// Only difference bewteen chunked and unchunked uncompression +// Only difference between chunked and unchunked uncompression // is the flush mode we use: Z_SYNC_FLUSH (chunked) or Z_FINISH (unchunked). int ZLib::UncompressAtMostOrAll(Bytef *dest, uLongf *destLen, const Bytef *source, uLong *sourceLen, @@ -698,11 +693,6 @@ int ZLib::UncompressAtMost(Bytef *dest, uLongf *destLen, const Bytef *source, return UncompressAtMostOrAll(dest, destLen, source, sourceLen, Z_SYNC_FLUSH); } -int ZLib::UncompressChunk(Bytef *dest, uLongf *destLen, const Bytef *source, - uLong sourceLen) { - return UncompressChunkOrAll(dest, destLen, source, sourceLen, Z_SYNC_FLUSH); -} - // We make sure we've uncompressed everything, that is, the current // uncompress stream is at a compressed-buffer-EOF boundary. In gzip // mode, we also check the gzip footer to make sure we pass the gzip @@ -808,7 +798,9 @@ int ZLib::UncompressGzipAndAllocate(Bytef **dest, uLongf *destLen, *destLen = uncompress_length; *dest = std::allocator().allocate(*destLen); - if (*dest == nullptr) return Z_MEM_ERROR; + if (*dest == nullptr) { + return Z_MEM_ERROR; + } const int retval = Uncompress(*dest, destLen, source, sourceLen); if (retval != Z_OK) { // just to make life easier for them diff --git a/tensorflow_serving/util/net_http/compression/gzip_zlib.h b/tensorflow_serving/util/net_http/compression/gzip_zlib.h index fbec6b0efc2..e94f0e01197 100644 --- a/tensorflow_serving/util/net_http/compression/gzip_zlib.h +++ b/tensorflow_serving/util/net_http/compression/gzip_zlib.h @@ -97,7 +97,7 @@ class ZLib { ~ZLib(); // The max length of the buffer to store uncompressed data - static constexpr int64_t kMaxUncompressedBytes = 10 * 1024 * 1024; // 10MB + static constexpr int64_t kMaxUncompressedBytes = 100 * 1024 * 1024; // 100MB // Wipe a ZLib object to a virgin state. This differs from Reset() // in that it also breaks any dictionary, gzip, etc, state. @@ -173,7 +173,7 @@ class ZLib { int Uncompress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen); - // Get the uncompressed size from the gzip header. + // Get the uncompressed size from the gzip footer. uLongf GzipUncompressedLength(const Bytef *source, uLong len); // Special helper function to help uncompress gzipped documents: @@ -191,14 +191,10 @@ class ZLib { int UncompressGzipAndAllocate(Bytef **dest, uLongf *destLen, const Bytef *source, uLong sourceLen); - // Streaming compression and decompression methods come in two - // variations. {Unc,C}ompressAtMost() and {Unc,C}ompressChunk(). - // The former decrements sourceLen by the amount of data that was + // Streaming compression and decompression methods. + // {Unc,C}ompressAtMost() decrements sourceLen by the amount of data that was // consumed: if it returns Z_BUF_ERROR, set the source of the next // {Unc,C}ompressAtMost() to the unconsumed data. - // {Unc,C}ompressChunk() is the legacy interface and does not do - // this, thus it cannot recover from a Z_BUF_ERROR (except for in - // the first chunk). // Compresses data one chunk at a time -- ie you can call this more // than once. This is useful for a webserver, for instance, which @@ -212,9 +208,6 @@ class ZLib { int CompressAtMost(Bytef *dest, uLongf *destLen, const Bytef *source, uLong *sourceLen); - int CompressChunk(Bytef *dest, uLongf *destLen, const Bytef *source, - uLong sourceLen); - // Emits gzip footer information, as needed. // destLen should be at least MinFooterSize() long. // Returns Z_OK, Z_MEM_ERROR, and Z_BUF_ERROR as in CompressChunk(). @@ -230,8 +223,6 @@ class ZLib { int UncompressAtMost(Bytef *dest, uLongf *destLen, const Bytef *source, uLong *sourceLen); - int UncompressChunk(Bytef *dest, uLongf *destLen, const Bytef *source, - uLong sourceLen); // Checks gzip footer information, as needed. Mostly this just // makes sure the checksums match. Whenever you call this, it @@ -257,7 +248,7 @@ class ZLib { // so far? bool IsGzipFooterValid() const; - // Accessor for the uncompressed size (first added to address issue #509976) + // Accessor for the uncompressed size uLong uncompressed_size() const { return uncompressed_size_; } private: diff --git a/tensorflow_serving/util/net_http/compression/gzip_zlib_test.cc b/tensorflow_serving/util/net_http/compression/gzip_zlib_test.cc index 2aa47452d68..b67501103ad 100644 --- a/tensorflow_serving/util/net_http/compression/gzip_zlib_test.cc +++ b/tensorflow_serving/util/net_http/compression/gzip_zlib_test.cc @@ -236,9 +236,10 @@ void TestRandomGzipHeaderUncompress(ZLib* zlib) { ASSERT_GE(fragment_len, 0); if (fragment_len != 0) { // zlib doesn't like 0-length buffers uLongf uncomplen2 = uncompbuf2.size() - bytes_uncompressed; - int err = - zlib->UncompressChunk((Bytef*)&uncompbuf2[0] + bytes_uncompressed, - &uncomplen2, (const Bytef*)p, fragment_len); + auto complen_src = static_cast(fragment_len); + int err = zlib->UncompressAtMost( + (Bytef*)&uncompbuf2[0] + bytes_uncompressed, &uncomplen2, + (const Bytef*)p, &complen_src); ASSERT_EQ(err, Z_OK); bytes_uncompressed += uncomplen2; bytes_read += fragment_len; @@ -293,8 +294,9 @@ void TestErrors(ZLib* zlib, const std::string& uncompbuf_str) { EXPECT_EQ(Z_BUF_ERROR, err); uncomplen2 = uncompbuf2.size(); - err = zlib->UncompressChunk((Bytef*)&uncompbuf2[0], &uncomplen2, - (Bytef*)compbuf.data(), 23); + uLongf comlen2 = 23; + err = zlib->UncompressAtMost((Bytef*)&uncompbuf2[0], &uncomplen2, + (Bytef*)compbuf.data(), &comlen2); EXPECT_EQ(Z_OK, err); // it's ok if a single chunk is too small if (err == Z_OK) { EXPECT_FALSE(zlib->UncompressChunkDone()) @@ -383,9 +385,9 @@ void TestChunkedGzip(ZLib* zlib, const std::string& uncompbuf_str, for (chunknum = 0, i = 0; i < uncomplen; i += chunklen, chunknum++) { uLongf complen = compbuf.size() - cum_len[chunknum]; // Make sure the last chunk gets the correct chunksize. - int chunksize = (uncomplen - i) < chunklen ? (uncomplen - i) : chunklen; - err = zlib->CompressChunk((Bytef*)compbuf.data() + cum_len[chunknum], - &complen, (Bytef*)uncompbuf + i, chunksize); + uLongf chunksize = (uncomplen - i) < chunklen ? (uncomplen - i) : chunklen; + err = zlib->CompressAtMost((Bytef*)compbuf.data() + cum_len[chunknum], + &complen, (Bytef*)uncompbuf + i, &chunksize); ASSERT_EQ(Z_OK, err) << " " << uncomplen << " bytes down to " << complen << " bytes."; cum_len[chunknum + 1] = cum_len[chunknum] + complen; @@ -400,9 +402,10 @@ void TestChunkedGzip(ZLib* zlib, const std::string& uncompbuf_str, uLongf uncomplen2 = uncomplen - i; // Make sure the last chunk gets the correct chunksize. int expected = uncomplen2 < chunklen ? uncomplen2 : chunklen; - err = zlib->UncompressChunk((Bytef*)&uncompbuf2[0] + i, &uncomplen2, - (Bytef*)compbuf.data() + cum_len[chunknum], - cum_len[chunknum + 1] - cum_len[chunknum]); + uLongf complen_src = cum_len[chunknum + 1] - cum_len[chunknum]; + err = zlib->UncompressAtMost((Bytef*)&uncompbuf2[0] + i, &uncomplen2, + (Bytef*)compbuf.data() + cum_len[chunknum], + &complen_src); EXPECT_EQ(Z_OK, err); EXPECT_EQ(expected, uncomplen2) << "Uncompress size is " << uncomplen2 << ", not " << expected; @@ -410,9 +413,10 @@ void TestChunkedGzip(ZLib* zlib, const std::string& uncompbuf_str, // There should be no further uncompressed bytes, after uncomplen bytes. uLongf uncomplen2 = uncompbuf2.size() - uncomplen; EXPECT_NE(0, uncomplen2); - err = zlib->UncompressChunk((Bytef*)&uncompbuf2[0] + uncomplen, &uncomplen2, - (Bytef*)compbuf.data() + cum_len[chunknum], - cum_len[chunknum + 1] - cum_len[chunknum]); + uLongf complen_src = cum_len[chunknum + 1] - cum_len[chunknum]; + err = zlib->UncompressAtMost((Bytef*)&uncompbuf2[0] + uncomplen, &uncomplen2, + (Bytef*)compbuf.data() + cum_len[chunknum], + &complen_src); EXPECT_EQ(Z_OK, err); EXPECT_EQ(0, uncomplen2); EXPECT_TRUE(zlib->UncompressChunkDone()); @@ -424,8 +428,9 @@ void TestChunkedGzip(ZLib* zlib, const std::string& uncompbuf_str, // Now test to make sure resetting works properly // (1) First, uncompress the first chunk and make sure it's ok uncomplen2 = uncompbuf2.size(); - err = zlib->UncompressChunk((Bytef*)&uncompbuf2[0], &uncomplen2, - (Bytef*)compbuf.data(), cum_len[1]); + complen_src = cum_len[1]; + err = zlib->UncompressAtMost((Bytef*)&uncompbuf2[0], &uncomplen2, + (Bytef*)compbuf.data(), &complen_src); EXPECT_EQ(Z_OK, err); EXPECT_EQ(chunklen, uncomplen2) << "Uncompression mismatch!"; // The first uncomplen2 bytes should match, where uncomplen2 is the number of @@ -438,15 +443,17 @@ void TestChunkedGzip(ZLib* zlib, const std::string& uncompbuf_str, // (2) Now, try the first chunk again and see that there's an error uncomplen2 = uncompbuf2.size(); - err = zlib->UncompressChunk((Bytef*)&uncompbuf2[0], &uncomplen2, - (Bytef*)compbuf.data(), cum_len[1]); + complen_src = cum_len[1]; + err = zlib->UncompressAtMost((Bytef*)&uncompbuf2[0], &uncomplen2, + (Bytef*)compbuf.data(), &complen_src); EXPECT_EQ(Z_DATA_ERROR, err); // (3) Now reset it and try again, and see that it's ok zlib->Reset(); uncomplen2 = uncompbuf2.size(); - err = zlib->UncompressChunk((Bytef*)&uncompbuf2[0], &uncomplen2, - (Bytef*)compbuf.data(), cum_len[1]); + complen_src = cum_len[1]; + err = zlib->UncompressAtMost((Bytef*)&uncompbuf2[0], &uncomplen2, + (Bytef*)compbuf.data(), &complen_src); EXPECT_EQ(Z_OK, err); EXPECT_EQ(chunklen, uncomplen2) << "Uncompression mismatch!"; EXPECT_EQ(0, memcmp(uncompbuf, uncompbuf2.data(), uncomplen2)) diff --git a/tensorflow_serving/util/net_http/server/internal/BUILD b/tensorflow_serving/util/net_http/server/internal/BUILD index 52e8ab2c92b..76914783b3c 100644 --- a/tensorflow_serving/util/net_http/server/internal/BUILD +++ b/tensorflow_serving/util/net_http/server/internal/BUILD @@ -28,6 +28,7 @@ cc_library( "@com_google_absl//absl/memory", "@com_google_absl//absl/strings", "@com_google_absl//absl/synchronization", + "@com_google_absl//absl/types:span", "@zlib_archive//:zlib", ], ) diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_request.cc b/tensorflow_serving/util/net_http/server/internal/evhttp_request.cc index 302a8121fef..88023194e65 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_request.cc +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_request.cc @@ -22,16 +22,17 @@ limitations under the License. #include #include #include +#include #include +#include #include "absl/base/internal/raw_logging.h" #include "absl/strings/string_view.h" - +#include "absl/types/span.h" #include "libevent/include/event2/buffer.h" #include "libevent/include/event2/event.h" #include "libevent/include/event2/http.h" #include "libevent/include/event2/keyvalq_struct.h" - #include "tensorflow_serving/util/net_http/compression/gzip_zlib.h" #include "tensorflow_serving/util/net_http/server/public/header_names.h" @@ -164,16 +165,25 @@ std::unique_ptr EvHTTPRequest::ReadRequestBytes( evbuffer* input_buf = evhttp_request_get_input_buffer(parsed_request_->request); if (input_buf == nullptr) { + *size = 0; return nullptr; // no body } + // possible a reentry after gzip uncompression + if (evbuffer_get_length(input_buf) == 0) { + *size = 0; + return nullptr; // EOF + } + + // Uncompress the entire body + if (NeedUncompressGzipContent()) { + return ReadRequestGzipBytes(input_buf, size); + } + auto buf_size = reinterpret_cast(size); *buf_size = evbuffer_get_contiguous_space(input_buf); - - if (*buf_size == 0) { - return nullptr; // EOF - } + assert(*buf_size > 0); char* block = std::allocator().allocate(*buf_size); int ret = evbuffer_remove(input_buf, block, *buf_size); @@ -186,23 +196,63 @@ std::unique_ptr EvHTTPRequest::ReadRequestBytes( return nullptr; // don't return corrupted buffer } - // Uncompress the entire body - if (NeedUncompressGzipContent()) { - char* new_block; - size_t orig_size = *buf_size; - UncompressGzipContent(block, orig_size, - reinterpret_cast(&new_block), buf_size); - std::allocator().deallocate(block, orig_size); - if (new_block != nullptr) { - block = new_block; - } else { - ABSL_RAW_LOG(ERROR, "Failed to uncompress the gzipped body"); - *buf_size = 0; + return std::unique_ptr(block, BlockDeleter(*buf_size)); +} + +std::unique_ptr EvHTTPRequest::ReadRequestGzipBytes( + evbuffer* input_buf, int64_t* size) { + std::vector> buf_list; + + size_t body_length = 0; + while (true) { + auto buf_size = evbuffer_get_contiguous_space(input_buf); + + if (buf_size == 0) { + break; // EOF + } + + char* block = std::allocator().allocate(buf_size); + int ret = evbuffer_remove(input_buf, block, buf_size); + if (ret != buf_size) { + ABSL_RAW_LOG(ERROR, + "Unexpected: read less than specified num_bytes : %zu", + buf_size); + std::allocator().deallocate(block, buf_size); + for (auto buf : buf_list) { + std::allocator().deallocate(buf.data(), buf.size()); + } + *size = 0; return nullptr; // don't return corrupted buffer } + + body_length += buf_size; + buf_list.emplace_back(block, buf_size); } - return std::unique_ptr(block, BlockDeleter(*buf_size)); + char* comp_body = std::allocator().allocate(body_length); + + size_t pos = 0; + for (auto buf : buf_list) { + memcpy(comp_body + pos, buf.data(), buf.size()); + pos += buf.size(); + std::allocator().deallocate(buf.data(), buf.size()); + } + + char* uncomp_body; + auto uncomp_size = reinterpret_cast(size); + UncompressGzipBody(comp_body, body_length, + reinterpret_cast(&uncomp_body), uncomp_size); + + std::allocator().deallocate(comp_body, body_length); + + if (uncomp_body != nullptr) { + return std::unique_ptr(uncomp_body, + BlockDeleter(*uncomp_size)); + } else { + ABSL_RAW_LOG(ERROR, "Failed to uncompress the gzipped body"); + *uncomp_size = 0; + return nullptr; + } } bool EvHTTPRequest::NeedUncompressGzipContent() { @@ -217,9 +267,9 @@ bool EvHTTPRequest::NeedUncompressGzipContent() { return false; } -void EvHTTPRequest::UncompressGzipContent(void* input, size_t input_size, - void** uncompressed_input, - size_t* uncompressed_input_size) { +void EvHTTPRequest::UncompressGzipBody(void* input, size_t input_size, + void** uncompressed_input, + size_t* uncompressed_input_size) { int64_t max = handler_options_->auto_uncompress_max_size() > 0 ? handler_options_->auto_uncompress_max_size() : ZLib::kMaxUncompressedBytes; diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_request.h b/tensorflow_serving/util/net_http/server/internal/evhttp_request.h index e89b40f0efc..ba25f8c2633 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_request.h +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_request.h @@ -116,9 +116,12 @@ class EvHTTPRequest final : public ServerRequestInterface { bool NeedUncompressGzipContent(); // Must set uncompressed_input to nullptr if uncompression is failed - void UncompressGzipContent(void* input, size_t input_size, - void** uncompressed_input, - size_t* uncompressed_input_size); + void UncompressGzipBody(void* input, size_t input_size, + void** uncompressed_input, + size_t* uncompressed_input_size); + + std::unique_ptr ReadRequestGzipBytes( + evbuffer* input_buf, int64_t* size); ServerSupport* server_; diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_request_test.cc b/tensorflow_serving/util/net_http/server/internal/evhttp_request_test.cc index 801fbeae4a4..be7df2fb265 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_request_test.cc +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_request_test.cc @@ -13,18 +13,16 @@ See the License for the specific language governing permissions and limitations under the License. ==============================================================================*/ -#include "tensorflow_serving/util/net_http/server/internal/evhttp_server.h" - #include #include +#include #include - #include "absl/memory/memory.h" - #include "tensorflow_serving/util/net_http/client/evhttp_connection.h" #include "tensorflow_serving/util/net_http/compression/gzip_zlib.h" #include "tensorflow_serving/util/net_http/internal/fixed_thread_pool.h" +#include "tensorflow_serving/util/net_http/server/internal/evhttp_server.h" #include "tensorflow_serving/util/net_http/server/public/httpserver.h" #include "tensorflow_serving/util/net_http/server/public/httpserver_interface.h" #include "tensorflow_serving/util/net_http/server/public/server_request_interface.h" @@ -316,15 +314,20 @@ TEST_F(EvHTTPRequestTest, DisableGzipPost) { server->WaitForTermination(); } -std::string CompressString(const char* data, size_t size) { +std::string CompressLargeString(const char* data, size_t size, + size_t buf_size) { ZLib zlib; - std::string buf(1000, '\0'); + std::string buf(buf_size, '\0'); size_t compressed_size = buf.size(); zlib.Compress((Bytef*)buf.data(), &compressed_size, (Bytef*)data, size); return std::string(buf.data(), compressed_size); } +std::string CompressString(const char* data, size_t size) { + return CompressLargeString(data, size, 1024); +} + // Test valid gzip body TEST_F(EvHTTPRequestTest, ValidGzipPost) { constexpr char kBody[] = "abcdefg12345"; @@ -338,6 +341,9 @@ TEST_F(EvHTTPRequestTest, ValidGzipPost) { EXPECT_EQ(body_str, std::string(kBody)); EXPECT_EQ(sizeof(kBody) - 1, num_bytes); + EXPECT_EQ(nullptr, request->ReadRequestBytes(&num_bytes)); + EXPECT_EQ(0, num_bytes); + request->Reply(); }; server->RegisterRequestHandler("/ok", std::move(handler), @@ -396,6 +402,56 @@ TEST_F(EvHTTPRequestTest, GzipExceedingLimit) { server->WaitForTermination(); } +std::string MakeRandomString(int64_t len) { + std::random_device rd; + std::mt19937_64 gen(rd()); + std::uniform_int_distribution<> dis('a', 'z'); + std::string s(len, '0'); + for (char& c : s) { + c = dis(gen); + } + return s; +} + +// Test large gzip body +TEST_F(EvHTTPRequestTest, LargeGzipPost) { + constexpr int64_t uncompress_len = 1024 * 1024; + std::string uncompressed = MakeRandomString(uncompress_len); + std::string compressed = CompressLargeString( + uncompressed.data(), uncompressed.size(), 2 * uncompress_len); + + auto handler = [&](ServerRequestInterface* request) { + int64_t num_bytes; + auto request_body = request->ReadRequestBytes(&num_bytes); + + std::string body_str(request_body.get(), static_cast(num_bytes)); + EXPECT_EQ(body_str, uncompressed); + EXPECT_EQ(uncompressed.size(), num_bytes); + + EXPECT_EQ(nullptr, request->ReadRequestBytes(&num_bytes)); + EXPECT_EQ(0, num_bytes); + + request->Reply(); + }; + server->RegisterRequestHandler("/ok", std::move(handler), + RequestHandlerOptions()); + server->StartAcceptingRequests(); + + auto connection = + EvHTTPConnection::Connect("localhost", server->listen_port()); + ASSERT_TRUE(connection != nullptr); + + ClientRequest request = {"/ok", "POST", {}, compressed}; + request.headers.emplace_back("Content-Encoding", "my_gzip"); + ClientResponse response = {}; + + EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); + EXPECT_EQ(response.status, 200); + + server->Terminate(); + server->WaitForTermination(); +} + } // namespace } // namespace net_http } // namespace serving From b3d5787fe1f7b91a4637d6ef82b29047fca5c422 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 3 May 2019 00:02:18 -0700 Subject: [PATCH 3087/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/95f1bba8-a7cc-4cc6-916d-59ecd2291ac3 PiperOrigin-RevId: 246460044 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ab1df16a297..65f13ddfb2a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e8b7295d3de3d3fb3ede7f68022b12602cc67d33483cd7c135ba8edc17900513", - git_commit = "96ef036c7969d442cba1abfed12409d01d8b787d", + sha256 = "95f43caec705bc1313a52d94d4015f6488f35d875bba3b413b9c99b48ade9351", + git_commit = "edcfc1ca6ace6b87b500d95e51bb5a44fad147ce", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 10bf30b536ea136df5bd2ba74cf8be13b33b9677 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 3 May 2019 06:02:11 -0700 Subject: [PATCH 3088/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/41946667-3bda-43b1-85a2-dc76b2ae70f0 PiperOrigin-RevId: 246495592 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 65f13ddfb2a..805c1ae3e9a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "95f43caec705bc1313a52d94d4015f6488f35d875bba3b413b9c99b48ade9351", - git_commit = "edcfc1ca6ace6b87b500d95e51bb5a44fad147ce", + sha256 = "a4f967fe63d3dac07e39824179a35611f90e33ebce15aae0eb072bf4fbdb039d", + git_commit = "c58a4ec1eea98d1f07a5be4d473ad6eb51120c90", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e1137c6558ee53da830bca85c6f0f36344cfd177 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 3 May 2019 12:02:07 -0700 Subject: [PATCH 3089/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/94d03a88-5079-4781-a46c-5fe1233213f0 PiperOrigin-RevId: 246549774 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 805c1ae3e9a..5ce3586a21b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a4f967fe63d3dac07e39824179a35611f90e33ebce15aae0eb072bf4fbdb039d", - git_commit = "c58a4ec1eea98d1f07a5be4d473ad6eb51120c90", + sha256 = "0847b822db10d94f639381bc112e910c32c0dd3be4ffb1cbd08abc3ce5fc6ad8", + git_commit = "d03e2615bcef57c8f873a82f3c96ee6cade2b934", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8e18f3e7722e82d32061dfa1b0f6ae7a6c39899b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 3 May 2019 18:02:21 -0700 Subject: [PATCH 3090/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9d28b1ad-3939-466f-a601-3c8cea9f95bc PiperOrigin-RevId: 246606217 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5ce3586a21b..5a35f9b80d5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0847b822db10d94f639381bc112e910c32c0dd3be4ffb1cbd08abc3ce5fc6ad8", - git_commit = "d03e2615bcef57c8f873a82f3c96ee6cade2b934", + sha256 = "12cfcd2669d74240dd71be6f7a44d64ab7c13d02b59e438d91ac16b7fa9f5299", + git_commit = "e7b79cff161cd6f583a7eb32eef62916e9dc594e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e67d3c6c04df15e3efa708ce05dc324e473699a7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 4 May 2019 00:02:08 -0700 Subject: [PATCH 3091/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/acb3ede1-59d7-4112-9a48-b9837e139992 PiperOrigin-RevId: 246628482 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5a35f9b80d5..e47c5253304 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "12cfcd2669d74240dd71be6f7a44d64ab7c13d02b59e438d91ac16b7fa9f5299", - git_commit = "e7b79cff161cd6f583a7eb32eef62916e9dc594e", + sha256 = "e179398945ae06f2acf62bec699d993213d9dcc7813b15df6638c31172bf9b4d", + git_commit = "7e035d5e3d6ad1e0f12fcb8db56cd797722596ba", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9180fca5e1b09d8c078dbeb2dbd1735b04f44134 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 4 May 2019 06:01:58 -0700 Subject: [PATCH 3092/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4ee34a57-35f0-4245-953c-273ea528c384 PiperOrigin-RevId: 246647131 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e47c5253304..23e3841deb2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e179398945ae06f2acf62bec699d993213d9dcc7813b15df6638c31172bf9b4d", - git_commit = "7e035d5e3d6ad1e0f12fcb8db56cd797722596ba", + sha256 = "6c76b0e9372e28c373e564c09513602875cdd374d9eaa83d59b98cc63249aba5", + git_commit = "8fa823c345aebe3d789697aa2eddbc6773584078", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8c5d3411ec6d09475347421f5615ffddf764fd00 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 4 May 2019 12:03:50 -0700 Subject: [PATCH 3093/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c6e39e57-451c-41e1-bd0e-acd84fab7837 PiperOrigin-RevId: 246663914 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 23e3841deb2..b68c0e03c3e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6c76b0e9372e28c373e564c09513602875cdd374d9eaa83d59b98cc63249aba5", - git_commit = "8fa823c345aebe3d789697aa2eddbc6773584078", + sha256 = "482882ebe811edacfcb16a683bc58b674b492b3dff23b676fbf7f0ce4d22aedc", + git_commit = "49928131eb978a92b9b1f4921dd334799d8a7c6a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f5be4afc7e23e1111b60575b5fe50c967343bafa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 4 May 2019 18:02:02 -0700 Subject: [PATCH 3094/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0155e0f9-231f-4ebb-8eb1-ac2b43d5935f PiperOrigin-RevId: 246680189 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b68c0e03c3e..732f3281a3f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "482882ebe811edacfcb16a683bc58b674b492b3dff23b676fbf7f0ce4d22aedc", - git_commit = "49928131eb978a92b9b1f4921dd334799d8a7c6a", + sha256 = "ffa208bd00e86816495bc2ebca9503595eab44a86447a064de777a5b95f36204", + git_commit = "5dfad3cfa8ab3b6b21dccfe638c29a038427a115", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5c24c136ca495db06d41c3095568da3e5ad24096 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 5 May 2019 00:02:15 -0700 Subject: [PATCH 3095/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/97b0929f-8dad-4bdc-bfb0-51496807ab5e PiperOrigin-RevId: 246697450 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 732f3281a3f..8b3cc92c0cf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ffa208bd00e86816495bc2ebca9503595eab44a86447a064de777a5b95f36204", - git_commit = "5dfad3cfa8ab3b6b21dccfe638c29a038427a115", + sha256 = "2418027e68f69ded538887622799ae9e5a90c89b59dccb8ae069c6827b367881", + git_commit = "b14c390fc869b63fd2b1a4e6f4477ce410b9383e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 917221ef4cba21f923310eaa8d775de120f1e559 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 5 May 2019 06:02:12 -0700 Subject: [PATCH 3096/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/48b32d66-4a6e-432d-b41b-0659adc8e4cc PiperOrigin-RevId: 246717899 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8b3cc92c0cf..a64db3a9078 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2418027e68f69ded538887622799ae9e5a90c89b59dccb8ae069c6827b367881", - git_commit = "b14c390fc869b63fd2b1a4e6f4477ce410b9383e", + sha256 = "cab2225b645704bbf5181604cb1f62149129fab6b7bdeb0c54a9f72c7568869e", + git_commit = "1817b43eb20ce7a0841a8d7617a7172981a4798e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c9086bd38eb21a2e49edbcfd89c4a09310c84d81 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 5 May 2019 18:02:00 -0700 Subject: [PATCH 3097/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/701ee77e-ff1b-45cf-be59-0de03c94d014 PiperOrigin-RevId: 246753125 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a64db3a9078..f3ef32d60e1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cab2225b645704bbf5181604cb1f62149129fab6b7bdeb0c54a9f72c7568869e", - git_commit = "1817b43eb20ce7a0841a8d7617a7172981a4798e", + sha256 = "d2e1f566739d1e22bf454520917ce89f4746c2a46538974db24f4045fe96932d", + git_commit = "acc20217e6c00634359a5e21f620ad75141a5878", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ecb38f1d88d37dbe3f24f038b920b54120678e97 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 6 May 2019 06:04:19 -0700 Subject: [PATCH 3098/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/36bb5395-6bf5-4da1-9de1-822a6f39ffd6 PiperOrigin-RevId: 246813128 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f3ef32d60e1..7e40a9e8e70 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d2e1f566739d1e22bf454520917ce89f4746c2a46538974db24f4045fe96932d", - git_commit = "acc20217e6c00634359a5e21f620ad75141a5878", + sha256 = "309562c5e8ff0af8fb38721f3531bd619a1ea6a39439d950ac268867ea5ac10d", + git_commit = "3ef646727aa0762789f49a923b6c59c325cc7856", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From dbbc0b455a51f6cbe43a2c3d541322832c69c263 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 6 May 2019 12:02:35 -0700 Subject: [PATCH 3099/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/10d940f6-5d4d-46ee-b952-ac80c7b8770e PiperOrigin-RevId: 246870104 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7e40a9e8e70..fd18628da6f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "309562c5e8ff0af8fb38721f3531bd619a1ea6a39439d950ac268867ea5ac10d", - git_commit = "3ef646727aa0762789f49a923b6c59c325cc7856", + sha256 = "ae242ac2047396e7e4f6a47b7ca2925fea7f39075df19b2e1d8b07c4691bed03", + git_commit = "20c979ea235dfb6a923dde6b9c8f4c7e9f310efa", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 41e4656af58393c2aa39e7377cf8737b4c9ad001 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 6 May 2019 18:02:30 -0700 Subject: [PATCH 3100/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1285b602-08d7-4b48-8209-f1858f768e17 PiperOrigin-RevId: 246933898 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fd18628da6f..2c1f74aceab 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ae242ac2047396e7e4f6a47b7ca2925fea7f39075df19b2e1d8b07c4691bed03", - git_commit = "20c979ea235dfb6a923dde6b9c8f4c7e9f310efa", + sha256 = "87ce541ea53c46e07a8875d0ea453d83e67741721ac30e044eb95c55290745a0", + git_commit = "dc1f6e6c8b016d2f9b132a7ea419514d855693a2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8f2f78e22a2ff961c00ea079172f210c1fee2a14 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 May 2019 00:02:18 -0700 Subject: [PATCH 3101/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8504dd35-1f1e-4dfb-aa5b-1bebb4ce954f PiperOrigin-RevId: 246965658 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2c1f74aceab..936af0b5afc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "87ce541ea53c46e07a8875d0ea453d83e67741721ac30e044eb95c55290745a0", - git_commit = "dc1f6e6c8b016d2f9b132a7ea419514d855693a2", + sha256 = "18bd2fac33cb89a3fd074141f09db8edc524811511e6ab71d9c42280232c3779", + git_commit = "e9fc5a129b30e001b8d9ec9379803dc308fbeaba", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 11606116620686e51a2f398665114c6009483d25 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 May 2019 06:02:51 -0700 Subject: [PATCH 3102/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/818229c7-1ec9-4722-b9e7-8528730eb2d0 PiperOrigin-RevId: 247005728 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 936af0b5afc..3b2284f07d1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "18bd2fac33cb89a3fd074141f09db8edc524811511e6ab71d9c42280232c3779", - git_commit = "e9fc5a129b30e001b8d9ec9379803dc308fbeaba", + sha256 = "2b67500fe4754d770b6fb71563d49dd9e3dfded7ae1107516fbf5a6628a0dfc0", + git_commit = "dc77be8f92fd7b7ac57d69e35c4d0dbd994bf1a0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e56e72b3e4b9a597832734208a3da455f6db1a04 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 May 2019 11:41:07 -0700 Subject: [PATCH 3103/8103] Add stack memory resource kind. PiperOrigin-RevId: 247060031 --- tensorflow_serving/resources/resource_values.cc | 1 + tensorflow_serving/resources/resource_values.h | 3 +++ 2 files changed, 4 insertions(+) diff --git a/tensorflow_serving/resources/resource_values.cc b/tensorflow_serving/resources/resource_values.cc index 9538e9d962a..9caa45c292a 100644 --- a/tensorflow_serving/resources/resource_values.cc +++ b/tensorflow_serving/resources/resource_values.cc @@ -28,6 +28,7 @@ namespace resource_kinds { const char* const kNumModelSlots = "num_model_slots"; const char* const kRamBytes = "ram_in_bytes"; const char* const kHeapRamBytes = "heap_ram_in_bytes"; +const char* const kStackRamBytes = "stack_ram_in_bytes"; const char* const kProcessingMillis = "processing_in_millicores"; } // namespace resource_kinds diff --git a/tensorflow_serving/resources/resource_values.h b/tensorflow_serving/resources/resource_values.h index dc880eac153..85a70823bcc 100644 --- a/tensorflow_serving/resources/resource_values.h +++ b/tensorflow_serving/resources/resource_values.h @@ -51,6 +51,9 @@ extern const char* const kRamBytes; // RAM allocated on the heap. extern const char* const kHeapRamBytes; +// RAM reserved on the stack. +extern const char* const kStackRamBytes; + // Fraction of a processing unit's cycles, in thousandths. extern const char* const kProcessingMillis; From bc80f518f5bca2c2647149d1f09ff26376e52a4d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 May 2019 12:02:07 -0700 Subject: [PATCH 3104/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a7d35dcd-8f5a-41e9-9cf0-b9e32146b2e4 PiperOrigin-RevId: 247064096 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3b2284f07d1..bf6d2bc3d7b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2b67500fe4754d770b6fb71563d49dd9e3dfded7ae1107516fbf5a6628a0dfc0", - git_commit = "dc77be8f92fd7b7ac57d69e35c4d0dbd994bf1a0", + sha256 = "9d24e37b76555bff472b33e1741a476ae955c4167441f0fdb381ef31a4d115d8", + git_commit = "98765e41f94a1d2cd088c593f18a3a877f5059ca", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 44ed9d394d1d3cbe772a1b1a6b1979a700a956b3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 May 2019 18:02:35 -0700 Subject: [PATCH 3105/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/54bb469c-90e8-434b-b5e3-e8fc22f57dff PiperOrigin-RevId: 247127740 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bf6d2bc3d7b..38e781e1bac 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9d24e37b76555bff472b33e1741a476ae955c4167441f0fdb381ef31a4d115d8", - git_commit = "98765e41f94a1d2cd088c593f18a3a877f5059ca", + sha256 = "675e786ea6d2846b4718f5944cd9ff2709d7e9ae382052543e84858d9932115c", + git_commit = "e905b8b447977a62dfaa2538052dd9be5c7172ef", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 98c4cbe11413878a32a6028d1519ffe1a7cf3699 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 May 2019 00:02:24 -0700 Subject: [PATCH 3106/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c840c8ef-c559-4c13-96d2-cddc4042b8b7 PiperOrigin-RevId: 247159724 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 38e781e1bac..31b131d783f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "675e786ea6d2846b4718f5944cd9ff2709d7e9ae382052543e84858d9932115c", - git_commit = "e905b8b447977a62dfaa2538052dd9be5c7172ef", + sha256 = "eb648b667b3132642e810a0c26215f73c1ab49a0a44c55806268f86599c56f9b", + git_commit = "59f8d543239bc5c63890b9e0300172f9e4965f28", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 71a58850a91642643e72e7ff79df61e9640dff63 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 May 2019 06:02:31 -0700 Subject: [PATCH 3107/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9969405c-c6fa-4338-bbfe-bdce3c349b0d PiperOrigin-RevId: 247198538 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 31b131d783f..22477d698e2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eb648b667b3132642e810a0c26215f73c1ab49a0a44c55806268f86599c56f9b", - git_commit = "59f8d543239bc5c63890b9e0300172f9e4965f28", + sha256 = "c346465ea516c7580f9000c0989093502761fe0befa9f75da1097cd3ea32767c", + git_commit = "d58b53e19c3d06cea5909c66379d073aea153651", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a7637e57125fa2345b5b20cc063d176a3557936b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 May 2019 12:02:23 -0700 Subject: [PATCH 3108/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8a172fd9-6539-4f1f-baca-7d8352782293 PiperOrigin-RevId: 247261387 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 22477d698e2..5f5b07c7346 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c346465ea516c7580f9000c0989093502761fe0befa9f75da1097cd3ea32767c", - git_commit = "d58b53e19c3d06cea5909c66379d073aea153651", + sha256 = "d1a2d924a0f40c011f8a6ba901071b257bab9f4528c4ec67eb6b7e19a331caef", + git_commit = "bba56b4444f36ed9b223153f4b76bcdec6e7d7f0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5c82e4e89e80035d02a0930100b8f0fc6feca971 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 May 2019 18:02:40 -0700 Subject: [PATCH 3109/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7095406c-9beb-4280-b8cf-1f7dc12cee4d PiperOrigin-RevId: 247331620 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5f5b07c7346..5db2809a108 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d1a2d924a0f40c011f8a6ba901071b257bab9f4528c4ec67eb6b7e19a331caef", - git_commit = "bba56b4444f36ed9b223153f4b76bcdec6e7d7f0", + sha256 = "e0588ce69669abd5de347447401f1b2dd2b16ba26ca7382e2d3cddff0b9ddde4", + git_commit = "75700668d216508a0427dc0c451bc84d6b391cc4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 837f781397c438b73bb98a08d176a2d9969c3c44 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 9 May 2019 00:02:34 -0700 Subject: [PATCH 3110/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9e7b85ac-7f46-4ec8-b529-1ae4dba1d004 PiperOrigin-RevId: 247367215 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5db2809a108..2dda3b6ef56 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e0588ce69669abd5de347447401f1b2dd2b16ba26ca7382e2d3cddff0b9ddde4", - git_commit = "75700668d216508a0427dc0c451bc84d6b391cc4", + sha256 = "40ebac7d1c48e6618bae2fa3b55f842283f0e587a37c2fb14a47b4d940c75afe", + git_commit = "f4815551dc19b2149a70f20dba5a6c043e627a5b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f134cd52ff63202f47a8db4dbab82601a1895ccd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 9 May 2019 06:02:17 -0700 Subject: [PATCH 3111/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c88b3861-8c5f-40f4-911c-9470953a4b43 PiperOrigin-RevId: 247409543 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2dda3b6ef56..7b3cb760aa2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "40ebac7d1c48e6618bae2fa3b55f842283f0e587a37c2fb14a47b4d940c75afe", - git_commit = "f4815551dc19b2149a70f20dba5a6c043e627a5b", + sha256 = "d32b11d02dd9b402289f8b1ac253f6e124c4582cc236056b0df5b9bba3e6a2df", + git_commit = "b02f70947d603b0003d76178581e98eb4ca80de6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1a9bdfa777d1dba07a56373eca6aa708eb1f02b1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 9 May 2019 12:02:15 -0700 Subject: [PATCH 3112/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b16d939e-ef40-4284-9b36-9cbbcc59cf99 PiperOrigin-RevId: 247470852 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7b3cb760aa2..c0054221e66 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d32b11d02dd9b402289f8b1ac253f6e124c4582cc236056b0df5b9bba3e6a2df", - git_commit = "b02f70947d603b0003d76178581e98eb4ca80de6", + sha256 = "207d2210dfed8891966d18b8550bdafcc80463cca64f292c64fc21bf7c6c9302", + git_commit = "2060de397cec870bae9c808b551dc45183f4016f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b52664474b18c44a2d19f6056245a7aa7dbc010a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 9 May 2019 18:02:46 -0700 Subject: [PATCH 3113/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/75758b42-e924-4037-ab43-19dec7987166 PiperOrigin-RevId: 247531868 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c0054221e66..a9adc6ad5b5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "207d2210dfed8891966d18b8550bdafcc80463cca64f292c64fc21bf7c6c9302", - git_commit = "2060de397cec870bae9c808b551dc45183f4016f", + sha256 = "48c621fc47d64e43e51f26ef2e03878b8ab92195e12c6c9f98a0b880454aea95", + git_commit = "845180c8bc58d6ef8a3599f001984644f54e6cfd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 418d38ef56885575ba49fc28d9bf3e88cd51b6de Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 10 May 2019 00:03:02 -0700 Subject: [PATCH 3114/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c679a55e-e2a5-4df5-a09e-7c5209fc3cd6 PiperOrigin-RevId: 247562867 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a9adc6ad5b5..008de7c3706 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "48c621fc47d64e43e51f26ef2e03878b8ab92195e12c6c9f98a0b880454aea95", - git_commit = "845180c8bc58d6ef8a3599f001984644f54e6cfd", + sha256 = "9a8d7c98d89789d4e0855bd3e79403a5b5806f378ab758381ef56809ff464096", + git_commit = "d1bbb23e38d0260c61ada266d6bb5c4272cb25e3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f739e3469caf63a45008eaea001419e3db023d0a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 10 May 2019 06:03:23 -0700 Subject: [PATCH 3115/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d67e8355-9646-4961-b998-72702aeb88c0 PiperOrigin-RevId: 247598065 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 008de7c3706..19b8a997aec 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9a8d7c98d89789d4e0855bd3e79403a5b5806f378ab758381ef56809ff464096", - git_commit = "d1bbb23e38d0260c61ada266d6bb5c4272cb25e3", + sha256 = "faf3218de2e8687eaa636011b68f2f841cd2efcfaaaf5556301a518ef1a68522", + git_commit = "a6003151399ba48d855681ec8e736387960ef06e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b5111252516f56ffaa7aaecb6ed992411f26a8dc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 10 May 2019 12:02:42 -0700 Subject: [PATCH 3116/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ccf8b64c-d9d2-4505-8e95-519bf70ede98 PiperOrigin-RevId: 247652147 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 19b8a997aec..02d59367065 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "faf3218de2e8687eaa636011b68f2f841cd2efcfaaaf5556301a518ef1a68522", - git_commit = "a6003151399ba48d855681ec8e736387960ef06e", + sha256 = "fd3ec35a4605abd1cb89379a47f426a0a75aed13b3b1e3a9ae8f57cd7244ffc2", + git_commit = "625bb851903752ae6f3d735313351663b36cb9c9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 824a79ddf6c84f03dfe61d63bc3646727b3ceff9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 10 May 2019 18:02:15 -0700 Subject: [PATCH 3117/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/08bafa93-4568-4ae9-ab50-6da5e39fe4f4 PiperOrigin-RevId: 247707137 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 02d59367065..a00aeacd5b7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fd3ec35a4605abd1cb89379a47f426a0a75aed13b3b1e3a9ae8f57cd7244ffc2", - git_commit = "625bb851903752ae6f3d735313351663b36cb9c9", + sha256 = "5cb135bea10f7e501a8cf914feea64fd5805a877bc72fa24a28c8587c299eced", + git_commit = "7ad808993e1397f5fcd18ae305a18e36ab087fd6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 106a906c757fd3d3b1f48b01eabb0e7d7d534aaa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 11 May 2019 00:03:02 -0700 Subject: [PATCH 3118/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/09737fa2-afbc-4850-a1aa-decf96f6df16 PiperOrigin-RevId: 247730945 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a00aeacd5b7..c9c4bd7038d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5cb135bea10f7e501a8cf914feea64fd5805a877bc72fa24a28c8587c299eced", - git_commit = "7ad808993e1397f5fcd18ae305a18e36ab087fd6", + sha256 = "25f73cb333f891b79273ba146803a0311724c7ca0bd762e5e1fdafd57e87abf7", + git_commit = "d548ae0b9e6ddbf62b094ed2df75fb2c6cf0984a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f9d656422482fb3c94b8598cc23a7c6f2bf5104e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 11 May 2019 06:03:04 -0700 Subject: [PATCH 3119/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/73bb84d5-b076-450b-a36d-8c61fd4fbbe6 PiperOrigin-RevId: 247751168 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c9c4bd7038d..05907e222d1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "25f73cb333f891b79273ba146803a0311724c7ca0bd762e5e1fdafd57e87abf7", - git_commit = "d548ae0b9e6ddbf62b094ed2df75fb2c6cf0984a", + sha256 = "fe7b9e1d58b84bd04cab032799d630fd9af546ab518401ef55786a788d6e0feb", + git_commit = "f46e445c78843613be0cfb316217c394217001f4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f5d03c6b8526391cbdc6cb4c11d83576f3d73145 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 11 May 2019 12:02:15 -0700 Subject: [PATCH 3120/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2ddfb678-8458-4c73-b5da-83b46ab45d08 PiperOrigin-RevId: 247768674 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 05907e222d1..3a6b6b1f8af 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fe7b9e1d58b84bd04cab032799d630fd9af546ab518401ef55786a788d6e0feb", - git_commit = "f46e445c78843613be0cfb316217c394217001f4", + sha256 = "0a80a521b1db10c5254c15d533006c8dc081a47f785cd6cf6ad173d78d3be01b", + git_commit = "7bbd0940e8d52fcae03021a4b66e3d6b3e495f4c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 58b2a270d2730f359ee436833236650a8076ea4a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 11 May 2019 18:02:15 -0700 Subject: [PATCH 3121/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1653b6d5-d0b5-4021-bda9-2981f2a69cea PiperOrigin-RevId: 247786226 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3a6b6b1f8af..c5bad13838f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0a80a521b1db10c5254c15d533006c8dc081a47f785cd6cf6ad173d78d3be01b", - git_commit = "7bbd0940e8d52fcae03021a4b66e3d6b3e495f4c", + sha256 = "07b141d0a1023b78f995ecfa95d170d3f812266cdfe7382a2a179ffe87a5101a", + git_commit = "8bec6bfadf7ff0dd630a7fbe0063a812e1727652", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0e9ee16ae0a767e88b4d1e8836500be6b59b035d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 12 May 2019 00:02:15 -0700 Subject: [PATCH 3122/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/52585926-fb85-448f-a8c8-05c75fca09c1 PiperOrigin-RevId: 247804081 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c5bad13838f..09490445b76 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "07b141d0a1023b78f995ecfa95d170d3f812266cdfe7382a2a179ffe87a5101a", - git_commit = "8bec6bfadf7ff0dd630a7fbe0063a812e1727652", + sha256 = "d9c5ad96967541ff610d526d416980251dc5a08b3a654b50e192bcb765a48a4f", + git_commit = "696a6a0be22891163aee8160dad7c5ed653e2539", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5214c60759b4b055b1b0baded4e76db17e17cb33 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 12 May 2019 06:03:08 -0700 Subject: [PATCH 3123/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c09e006d-b896-4284-99af-102135cc6d0c PiperOrigin-RevId: 247825396 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 09490445b76..8446e100746 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d9c5ad96967541ff610d526d416980251dc5a08b3a654b50e192bcb765a48a4f", - git_commit = "696a6a0be22891163aee8160dad7c5ed653e2539", + sha256 = "da1c64d90b6560b4e7b2ad5e65713932d7e233ee72525b58af7ffee173b2a69d", + git_commit = "33141833284a81a5ab3300047d2845c7124f4a66", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1ce29dbaf7c6cee02b604348bbd6235fdc6430cf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 12 May 2019 12:02:35 -0700 Subject: [PATCH 3124/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/34b1fe84-3269-45e7-9ecf-496abfbf307a PiperOrigin-RevId: 247843111 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8446e100746..2c0ecee6b83 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "da1c64d90b6560b4e7b2ad5e65713932d7e233ee72525b58af7ffee173b2a69d", - git_commit = "33141833284a81a5ab3300047d2845c7124f4a66", + sha256 = "d95d9c9208eab85508382ebb20b4c4513428f7db347208a48ee7362b32be3c32", + git_commit = "6b76ef17b0c5b87c58a8c559c3d88fec06349db8", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 18acd92f175626cf401c69a27b4f4928a58e46e7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 13 May 2019 06:02:43 -0700 Subject: [PATCH 3125/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a3e89988-5e74-470c-b3b3-dc78d8bc4e7d PiperOrigin-RevId: 247920304 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2c0ecee6b83..25ffb6468a3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d95d9c9208eab85508382ebb20b4c4513428f7db347208a48ee7362b32be3c32", - git_commit = "6b76ef17b0c5b87c58a8c559c3d88fec06349db8", + sha256 = "20e2bf61302d6e1f862789b271490ca991c31cb46df40125ad5a78d04a7f694f", + git_commit = "30f682e776fbcff8d2da3c3cc0e8d12e1b3dde12", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8c9d8442025f0176c04e432a333238aa9a80d220 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 13 May 2019 12:02:31 -0700 Subject: [PATCH 3126/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bdbd85bd-5252-457d-8d03-07593f5f0a80 PiperOrigin-RevId: 247982635 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 25ffb6468a3..e079a49f4dc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "20e2bf61302d6e1f862789b271490ca991c31cb46df40125ad5a78d04a7f694f", - git_commit = "30f682e776fbcff8d2da3c3cc0e8d12e1b3dde12", + sha256 = "221d1aef127a681b8fb8e0aabebf6eb78569bfb4059d52eee5f2d00701ac39c6", + git_commit = "c8dfd42364ff3cdde02ef3ca1102d9892429f3ea", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0091b8e884c88e46421911210730ed12cd751b5e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 13 May 2019 18:02:40 -0700 Subject: [PATCH 3127/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b0e4230b-28fd-4cba-84c2-80c9795a37ad PiperOrigin-RevId: 248049029 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e079a49f4dc..0dd37c17ab4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "221d1aef127a681b8fb8e0aabebf6eb78569bfb4059d52eee5f2d00701ac39c6", - git_commit = "c8dfd42364ff3cdde02ef3ca1102d9892429f3ea", + sha256 = "63cac1ed1461dccf13f5e961517b3fe5fd71f3fe807114d91f908cb8726a536e", + git_commit = "37cb8bcb81655489c4737a31d5d6f4e03f0bf24a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 18db9a46168eadd4d3e28e9b0cdb27bd6a11add9 Mon Sep 17 00:00:00 2001 From: ynqa Date: Tue, 14 May 2019 10:52:34 +0900 Subject: [PATCH 3128/8103] Add monitoring config --- tensorflow_serving/g3doc/serving_config.md | 32 ++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/tensorflow_serving/g3doc/serving_config.md b/tensorflow_serving/g3doc/serving_config.md index 881ef46ad54..b5218628bd7 100644 --- a/tensorflow_serving/g3doc/serving_config.md +++ b/tensorflow_serving/g3doc/serving_config.md @@ -140,3 +140,35 @@ the model config on the fly, to assign a label to it (can be achieved using [HandleReloadConfigRequest](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/apis/model_service.proto#L22) RPC endpoint). + +# How to Configure for Monitoring + +Creating a monitoring config file containing a +[MonitoringConfig](https://github.com/tensorflow/serving/blob/1.13.0/tensorflow_serving/config/monitoring_config.proto#L17) +and set its path to --monitoring_config_file. It currently provides a monitoring +exporter for [Prometheus](https://prometheus.io/), and whose configs are +described +[PrometheusConfig](https://github.com/tensorflow/serving/blob/1.13.0/tensorflow_serving/config/monitoring_config.proto#L7) +protocol buffer. Here's an example: + +```proto +prometheus_config { + enable: true + path: '/metrics' +} +``` + +And also you must define also --rest_api_port for HTTP requests. +Prometheus Server pulls metrics from the serving which has specified endpoint. + +Tensorflow defines the basic metrics like +[load_attempt_count](https://github.com/tensorflow/tensorflow/blob/v1.13.1/tensorflow/cc/saved_model/loader.cc#L37-L40) +and +[load_latency](https://github.com/tensorflow/tensorflow/blob/v1.13.1/tensorflow/cc/saved_model/loader.cc#L41-L44) +which are arising on loading SavedModel. +Furthermore, Tensorflow Serving also has its own metrics: + +- [model_warmup_latency](https://github.com/tensorflow/serving/blob/1.13.0/tensorflow_serving/servables/tensorflow/saved_model_warmup.cc#L36-L43) +- [request_log_count](https://github.com/tensorflow/serving/blob/1.13.0/tensorflow_serving/core/request_logger.cc#L30-L35) +- [request_example_counts](https://github.com/tensorflow/serving/blob/1.13.0/tensorflow_serving/servables/tensorflow/util.cc#L36-L41) +- [request_example_count_total](https://github.com/tensorflow/serving/blob/1.13.0/tensorflow_serving/servables/tensorflow/util.cc#L43-L45) From 535ef7c6ed6383d13748cf876222fc3ea4c08e5b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 14 May 2019 00:02:30 -0700 Subject: [PATCH 3129/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e1baa434-fb6b-4eb8-9c77-adf6856b0d1d PiperOrigin-RevId: 248082921 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0dd37c17ab4..ae1634cbc47 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "63cac1ed1461dccf13f5e961517b3fe5fd71f3fe807114d91f908cb8726a536e", - git_commit = "37cb8bcb81655489c4737a31d5d6f4e03f0bf24a", + sha256 = "4822aa231ed574345f75f52e926d2179de763677b7ed3dae192d5faf327045cf", + git_commit = "27cfc615819dade9fcd8b9423a382da32f4f33f1", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From affda1238ec7ccf09108e748836fe495dd639c2b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 14 May 2019 06:02:18 -0700 Subject: [PATCH 3130/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5070f08e-aa55-4cdb-9682-f26333692795 PiperOrigin-RevId: 248121615 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ae1634cbc47..63b7a9cdea7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4822aa231ed574345f75f52e926d2179de763677b7ed3dae192d5faf327045cf", - git_commit = "27cfc615819dade9fcd8b9423a382da32f4f33f1", + sha256 = "83dcae4e3581a353c7baa789421b26a0f3806cc7840cbde06f30479fc862f99c", + git_commit = "f2d60b76cd45329f58a6e3abe0169d940b8b91c7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7d6af41b1b3937de44e5c0e820c4334515ea8c61 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 14 May 2019 12:03:28 -0700 Subject: [PATCH 3131/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bc1ebb8b-3eed-4be9-b682-6f751ebd8068 PiperOrigin-RevId: 248184970 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 63b7a9cdea7..2d933cb57a9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "83dcae4e3581a353c7baa789421b26a0f3806cc7840cbde06f30479fc862f99c", - git_commit = "f2d60b76cd45329f58a6e3abe0169d940b8b91c7", + sha256 = "962280c1cd95f663e399f646debb851c4c07eff3f17404c17d99e262fe1882de", + git_commit = "3c77cf763b2fe4aff2136e72a5148b7f5f43b470", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3cfaeea44a49bc44c0fa39f58939a1169ae9a0e9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 14 May 2019 18:02:35 -0700 Subject: [PATCH 3132/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/97dfdd23-0695-4487-a0dc-fcd8a1d6ff60 PiperOrigin-RevId: 248248906 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2d933cb57a9..84e0f703eef 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "962280c1cd95f663e399f646debb851c4c07eff3f17404c17d99e262fe1882de", - git_commit = "3c77cf763b2fe4aff2136e72a5148b7f5f43b470", + sha256 = "ccc2a44b510c9ac33b87775f64e73d53e54e049598ad429304e8927cf62663ee", + git_commit = "21f1d8056a5ef913742d80b69de0ffe36f6297b2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c1e085c6de50a20df485cc4e7efe3b4381717529 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 15 May 2019 00:02:32 -0700 Subject: [PATCH 3133/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/37a4dff5-151d-4b48-bfc9-bfe3200e2728 PiperOrigin-RevId: 248280758 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 84e0f703eef..4d327391ecd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ccc2a44b510c9ac33b87775f64e73d53e54e049598ad429304e8927cf62663ee", - git_commit = "21f1d8056a5ef913742d80b69de0ffe36f6297b2", + sha256 = "39dd7da5c70b56380bc7f0759bb2801162ef0e13393446a5e0c79a76fa268d76", + git_commit = "6ea3aa086514a808fca8c6769ad6ea22b335cc80", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8d430e4e388203173feec5ebb91ca31f6a4f58d3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 15 May 2019 06:02:36 -0700 Subject: [PATCH 3134/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9e17c34d-d147-4a14-92f4-8371e4efc96a PiperOrigin-RevId: 248319186 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4d327391ecd..2f3796d64ef 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "39dd7da5c70b56380bc7f0759bb2801162ef0e13393446a5e0c79a76fa268d76", - git_commit = "6ea3aa086514a808fca8c6769ad6ea22b335cc80", + sha256 = "68a5c9c832d1575a17e1deb306fa2670b4e9847f820bfc87174758d24ad2632a", + git_commit = "ba63891c8b2eb4776a0a2cac65df844bb141c37b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 702cc28cf1f2b3ba24e10c708fbfaba6586260cb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 15 May 2019 12:02:46 -0700 Subject: [PATCH 3135/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/662bf3cf-eeb6-4811-bc54-c4e8d3456203 PiperOrigin-RevId: 248377774 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2f3796d64ef..8135de4e31b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "68a5c9c832d1575a17e1deb306fa2670b4e9847f820bfc87174758d24ad2632a", - git_commit = "ba63891c8b2eb4776a0a2cac65df844bb141c37b", + sha256 = "8d7635d7a8c72e980ee5458045758f17ca8df6d7f093130c5e630b2ad719febd", + git_commit = "0210ef7cf2c360496e6056eb47bc338adf25ada9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8988aacf176e6587e8e015fb03e39912183c4324 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 15 May 2019 18:02:25 -0700 Subject: [PATCH 3136/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4e0fad69-f6b0-4923-94a1-ac9c6d6aeb48 PiperOrigin-RevId: 248442934 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8135de4e31b..e4a70d402d1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8d7635d7a8c72e980ee5458045758f17ca8df6d7f093130c5e630b2ad719febd", - git_commit = "0210ef7cf2c360496e6056eb47bc338adf25ada9", + sha256 = "d121ace409780f8d982bbd36ad67279ac91bfe14e64e40111b1b477aefd80fce", + git_commit = "e98a6a77ba6ad413e1967424d29768cc3fa0f5cc", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 83d09df85b336a248db6b55bd0604f52d2f75a84 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 16 May 2019 00:03:29 -0700 Subject: [PATCH 3137/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8edd946b-494c-4a2e-839a-a06ca37fd29d PiperOrigin-RevId: 248475496 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e4a70d402d1..a763f39992a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d121ace409780f8d982bbd36ad67279ac91bfe14e64e40111b1b477aefd80fce", - git_commit = "e98a6a77ba6ad413e1967424d29768cc3fa0f5cc", + sha256 = "d7b20217a9cb57fa980ab63715a5f9d23506ee63e9ed72b1deff7c52eb58527c", + git_commit = "e224546ee5247418be89a5e061d9232328aa90ab", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 041fa5729ba1580ab44a2aefdecd4e583b29c08e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 16 May 2019 06:02:26 -0700 Subject: [PATCH 3138/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/94de5ffb-58ea-472e-8a77-f0725da6544d PiperOrigin-RevId: 248511997 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a763f39992a..22b1604ae70 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d7b20217a9cb57fa980ab63715a5f9d23506ee63e9ed72b1deff7c52eb58527c", - git_commit = "e224546ee5247418be89a5e061d9232328aa90ab", + sha256 = "5e00abd653ff16b3c7355724e46912e52335c059aed6b40f80ffd8543d4296a2", + git_commit = "494cc6202904cd52eefea4b00ed4c8918100b382", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c675d205bf1189f814b08ce7ebc7f81007410d9e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 16 May 2019 12:02:29 -0700 Subject: [PATCH 3139/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4e197932-d77b-481c-9593-e398d31d1d7a PiperOrigin-RevId: 248572836 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 22b1604ae70..cf29a86f2ac 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5e00abd653ff16b3c7355724e46912e52335c059aed6b40f80ffd8543d4296a2", - git_commit = "494cc6202904cd52eefea4b00ed4c8918100b382", + sha256 = "2f64923fb27e9f1189ab39aa10250eb3cefd095009fe620af49c8b2bbc366bc1", + git_commit = "8abaa35efe0ac3400e81193c9d42e51dede16c17", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a9eacdf70216a6caa904190c20f99e67547156fc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 16 May 2019 18:02:21 -0700 Subject: [PATCH 3140/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d1493ded-1dfd-41c3-822d-0016ec5ebda6 PiperOrigin-RevId: 248638561 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cf29a86f2ac..d41da146c4c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2f64923fb27e9f1189ab39aa10250eb3cefd095009fe620af49c8b2bbc366bc1", - git_commit = "8abaa35efe0ac3400e81193c9d42e51dede16c17", + sha256 = "a569493213b06e9867d678f42f87df94eec62b98d8d9ac54ef4aa954c64b4d5f", + git_commit = "fb20a668e8332c4713f0613c682d885052a6af17", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7eb7ef6441b6b7665c3ed71a7c72a9c183d2a727 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 17 May 2019 00:02:30 -0700 Subject: [PATCH 3141/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f75dfd26-6c7d-4e2b-a69f-d1eadda80386 PiperOrigin-RevId: 248670803 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d41da146c4c..88737b86456 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a569493213b06e9867d678f42f87df94eec62b98d8d9ac54ef4aa954c64b4d5f", - git_commit = "fb20a668e8332c4713f0613c682d885052a6af17", + sha256 = "0a68e5b041647cb765ea008792ff78455c2ea9463fe5912cf23b547b0be588b2", + git_commit = "d7998bb26af28059b4311be995e8a9b6d42f96f3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3cbaf97578e5c285a728492a3aa912fbce95afd5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 17 May 2019 06:03:32 -0700 Subject: [PATCH 3142/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7442b6da-2005-41c1-871e-87f70e5cd623 PiperOrigin-RevId: 248706229 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 88737b86456..26a3f16301a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0a68e5b041647cb765ea008792ff78455c2ea9463fe5912cf23b547b0be588b2", - git_commit = "d7998bb26af28059b4311be995e8a9b6d42f96f3", + sha256 = "1d9f3129f758db2b7cab4738ec382d96a8f943ba5ea52efb87cf8fc026d21aa0", + git_commit = "e9f94d14e0ac65f2dd5b036c82bd341469beaef9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 62d11f8feb8a0030a83cf006c649e4cafcfa1c2a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 17 May 2019 12:02:08 -0700 Subject: [PATCH 3143/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a072d0fb-d236-4113-b94a-e135b9d041f6 PiperOrigin-RevId: 248762918 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 26a3f16301a..c7438ad28ac 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1d9f3129f758db2b7cab4738ec382d96a8f943ba5ea52efb87cf8fc026d21aa0", - git_commit = "e9f94d14e0ac65f2dd5b036c82bd341469beaef9", + sha256 = "d049bc722316c9709b693fe95cfada9d33f64a2e98c4733953020f60f91f4573", + git_commit = "860adb988fee17edb3d3a11b131b8c1670560805", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 249392e0f77af79af7affb4641a9131dfd57cb8c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 17 May 2019 18:02:02 -0700 Subject: [PATCH 3144/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2b157b1d-364f-44d8-8dfb-80a57d711014 PiperOrigin-RevId: 248819143 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c7438ad28ac..010c7d67ad7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d049bc722316c9709b693fe95cfada9d33f64a2e98c4733953020f60f91f4573", - git_commit = "860adb988fee17edb3d3a11b131b8c1670560805", + sha256 = "dca8fdbbcafce0c932e35eb2b52356bbeb4378c72eac381ef4064ab8ae3a8b6b", + git_commit = "49ea06d4d1ecedda87e3b7c43cef7a57588bae4e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 91cb74d106dc8fb96910c416ca344dd1ec8135ba Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 18 May 2019 00:02:21 -0700 Subject: [PATCH 3145/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3c501855-95d4-4596-b14a-ce147f097951 PiperOrigin-RevId: 248841780 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 010c7d67ad7..23fbfd9a039 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dca8fdbbcafce0c932e35eb2b52356bbeb4378c72eac381ef4064ab8ae3a8b6b", - git_commit = "49ea06d4d1ecedda87e3b7c43cef7a57588bae4e", + sha256 = "ceb2a1eb1ae1e45cbae980781fbfcfb57bb2213860377188e2cbd1861d0d827d", + git_commit = "564cc016d1ae4c209b9ed2de0bd7ee48f30e40b9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From bd8c67cd9590665ca1712c295ba9fd4ae5d7fc31 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 18 May 2019 06:02:04 -0700 Subject: [PATCH 3146/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bed908c1-173d-425d-8f28-f2abd1ebac0f PiperOrigin-RevId: 248860986 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 23fbfd9a039..26bc0146200 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ceb2a1eb1ae1e45cbae980781fbfcfb57bb2213860377188e2cbd1861d0d827d", - git_commit = "564cc016d1ae4c209b9ed2de0bd7ee48f30e40b9", + sha256 = "af1d68aab0b1e16b11e83313634d3d3a3ffebdcb671ee3591145b2b42f9fd2f2", + git_commit = "faf9db515c4bf550daacc1c3a22fedf3ff5dde63", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 445474a933f399aaccb52d20f1647ec054b8bd8e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 18 May 2019 12:02:18 -0700 Subject: [PATCH 3147/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3b0f0a22-aca1-4685-938c-24c1c32e036b PiperOrigin-RevId: 248879931 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 26bc0146200..2180171329a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "af1d68aab0b1e16b11e83313634d3d3a3ffebdcb671ee3591145b2b42f9fd2f2", - git_commit = "faf9db515c4bf550daacc1c3a22fedf3ff5dde63", + sha256 = "c583bb71eeff4b701e5d2d212e9b7fae4143932b9a3af8dbff0de823367bc81e", + git_commit = "bcbb1db93f67f5cb6888bbaa0a96676d5d8e5c65", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2734bddcbd49472b046e6bf545a81ea9489387ad Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 19 May 2019 06:02:06 -0700 Subject: [PATCH 3148/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f02549ad-8200-4ba1-bf97-c0bba78f3554 PiperOrigin-RevId: 248934393 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2180171329a..78c016b1d60 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c583bb71eeff4b701e5d2d212e9b7fae4143932b9a3af8dbff0de823367bc81e", - git_commit = "bcbb1db93f67f5cb6888bbaa0a96676d5d8e5c65", + sha256 = "3d086f318935b3b8e6eee7b4fb82317152826294991b4f389ec2297f1fea37ad", + git_commit = "64aee049de11cbf19f3704676a495e70ba69fe4a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8fb584da5486de0d76eaec8a2248d8221c1e99e8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 19 May 2019 12:02:14 -0700 Subject: [PATCH 3149/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/cdb18920-a23e-4891-bb3a-7d7aa0353751 PiperOrigin-RevId: 248951634 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 78c016b1d60..04546a2e199 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3d086f318935b3b8e6eee7b4fb82317152826294991b4f389ec2297f1fea37ad", - git_commit = "64aee049de11cbf19f3704676a495e70ba69fe4a", + sha256 = "78f4cfefb9fd82d9a7e9cafe407344aaeb7dff1e7c57e6ffab349ae15434dfce", + git_commit = "810b4541693f7aa8afd7eeed466e2b307ad3c1bd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From cf298a711fa8f19273d45e3e3b5c883d0a3f3831 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 19 May 2019 18:01:52 -0700 Subject: [PATCH 3150/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ed5103ef-69d5-4edc-a0e3-160d3a1674a9 PiperOrigin-RevId: 248969416 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 04546a2e199..a3c66c4e211 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "78f4cfefb9fd82d9a7e9cafe407344aaeb7dff1e7c57e6ffab349ae15434dfce", - git_commit = "810b4541693f7aa8afd7eeed466e2b307ad3c1bd", + sha256 = "d7190e2401e9eb7fb7821081401696c14a86d04adbb35745a226a59b937e5a99", + git_commit = "575ab84dabc8a4116abf20356f17dd0beaba011d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 46e24be5b9065c840141cc886b2305e188f4ad7e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 May 2019 00:02:07 -0700 Subject: [PATCH 3151/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/20fc33be-fd1c-49c1-b787-eff7ea04d756 PiperOrigin-RevId: 248993707 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a3c66c4e211..8760b649921 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d7190e2401e9eb7fb7821081401696c14a86d04adbb35745a226a59b937e5a99", - git_commit = "575ab84dabc8a4116abf20356f17dd0beaba011d", + sha256 = "fc5a60ce2cebd356d2452e240c89e7555ca6e90067d982482d691abc89a58933", + git_commit = "81f21655b972d981f5e31b1918c7f18fe72e699b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 08ca04c688fef2197efaf6fa1deae266da567292 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 May 2019 06:02:15 -0700 Subject: [PATCH 3152/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a4127437-6a7f-4249-a520-964d2d5c80c4 PiperOrigin-RevId: 249033582 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8760b649921..0c44cb748a8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fc5a60ce2cebd356d2452e240c89e7555ca6e90067d982482d691abc89a58933", - git_commit = "81f21655b972d981f5e31b1918c7f18fe72e699b", + sha256 = "791f0751cdd43dec3be5247bd01d1e2d94e9eab995cc4ea5fc96fe412021abf8", + git_commit = "e8dc3c76a83d415eef8a21757931171f71ba9c01", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9578f3d10c786c6714b9a8b481dd74f454402477 Mon Sep 17 00:00:00 2001 From: Pedram Pejman Date: Mon, 20 May 2019 09:47:16 -0700 Subject: [PATCH 3153/8103] Adds ModelServer test for loading SavedModel exported from Keras Sequential API PiperOrigin-RevId: 249067293 --- .../tensorflow_model_server_test.py | 45 +++++++++++++++---- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/tensorflow_serving/model_servers/tensorflow_model_server_test.py b/tensorflow_serving/model_servers/tensorflow_model_server_test.py index df292862a07..28d319630ba 100644 --- a/tensorflow_serving/model_servers/tensorflow_model_server_test.py +++ b/tensorflow_serving/model_servers/tensorflow_model_server_test.py @@ -222,15 +222,15 @@ def tearDown(self): """Deletes created configuration file.""" os.remove(self._GetGoodModelConfigFile()) - def VerifyPredictRequest(self, - model_server_address, - expected_output, - expected_version, - model_name='default', - specify_output=True, - signature_name= - signature_constants. - DEFAULT_SERVING_SIGNATURE_DEF_KEY): + def VerifyPredictRequest( + self, + model_server_address, + expected_output, + expected_version, + model_name='default', + specify_output=True, + batch_input=False, + signature_name=signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY): """Send PredictionService.Predict request and verify output.""" print('Sending Predict request...') # Prepare request @@ -241,6 +241,8 @@ def VerifyPredictRequest(self, request.inputs['x'].float_val.append(2.0) dim = request.inputs['x'].tensor_shape.dim.add() dim.size = 1 + if batch_input: + request.inputs['x'].tensor_shape.dim.add().size = 1 if specify_output: request.output_filter.append('y') @@ -768,6 +770,31 @@ def test_tf_saved_model_save_multiple_signatures(self): expected_output=1.0, expected_version=expected_version) + def test_sequential_keras_saved_model_save(self): + """Test loading a simple SavedModel created with Keras Sequential API.""" + + model = tf.keras.models.Sequential() + + model.add(tf.keras.layers.Input(dtype='float32', shape=(1,), name='x')) + model.add(tf.keras.layers.Lambda(lambda x: x, name='y')) + + base_path = os.path.join(self.get_temp_dir(), + 'keras_sequential_saved_model_save') + export_path = os.path.join(base_path, '00000123') + + tf.saved_model.save(model, export_path) + + _, model_server_address, _ = TensorflowModelServerTest.RunServer( + 'default', base_path) + + expected_version = self._GetModelVersion(base_path) + self.VerifyPredictRequest( + model_server_address, + batch_input=True, + specify_output=False, + expected_output=2.0, + expected_version=expected_version) + if __name__ == '__main__': tf.enable_eager_execution() From fd9b71063ef06f0b5aa54191ad9cc5e4e7d9076f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 May 2019 12:02:03 -0700 Subject: [PATCH 3154/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5f277dc7-1a15-45e1-9e47-cba06f35c230 PiperOrigin-RevId: 249097856 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0c44cb748a8..846ade1ff77 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "791f0751cdd43dec3be5247bd01d1e2d94e9eab995cc4ea5fc96fe412021abf8", - git_commit = "e8dc3c76a83d415eef8a21757931171f71ba9c01", + sha256 = "0975c05143f6afd5715033ea4831dda58ff6ddd11062bc8de90d9c52184cd964", + git_commit = "da6e53f4bd5d4af6cd5c147f9394bb0895e40aaa", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6b4f5675cd38b33a820a45a809b12a79e9af9465 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 May 2019 18:02:04 -0700 Subject: [PATCH 3155/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/11b769cb-134a-4110-9b76-0e1e5f798108 PiperOrigin-RevId: 249164455 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 846ade1ff77..3bad64a0f9d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0975c05143f6afd5715033ea4831dda58ff6ddd11062bc8de90d9c52184cd964", - git_commit = "da6e53f4bd5d4af6cd5c147f9394bb0895e40aaa", + sha256 = "4d1f36bb3b595517379f69ce5acbb9afccc00c375ad1f99015356bc79af3f503", + git_commit = "48c906cfdcfa1ec13d29adaa268a5924893c501b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8d88a5b3c4ac502113c798a470111ca65f47b0c2 Mon Sep 17 00:00:00 2001 From: yjhjstz Date: Thu, 16 May 2019 10:51:45 +0800 Subject: [PATCH 3156/8103] =?UTF-8?q?ignore=20SIGPIPE=20for=20libevent=20?= =?UTF-8?q?=EF=BC=8Cprevent=20the=20SIGPIPE=20signal=20from=20being=20rais?= =?UTF-8?q?ed,=20but=20you=20will=20get=20a=20read=20/=20write=20error=20w?= =?UTF-8?q?hen=20trying=20to=20use=20the=20socket,=20so=20you=20will=20nee?= =?UTF-8?q?d=20to=20check=20for=20that?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../util/net_http/server/internal/evhttp_server.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc b/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc index 8b4cb4216fa..e7ee14bc505 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc @@ -19,6 +19,7 @@ limitations under the License. #include #include +#include #include #include #include @@ -44,7 +45,8 @@ void InitLibEvent() { if (evthread_use_pthreads() != 0) { ABSL_RAW_LOG(FATAL, "Server requires pthread support."); } - + // Ignore SIGPIPE and allow errors to propagate through error codes. + signal(SIGPIPE, SIG_IGN); // TODO(wenboz): windows support needed? } From edaf22897637d7bf0192b399041b7f236111d810 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 May 2019 00:02:27 -0700 Subject: [PATCH 3157/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/04f66393-10b1-431d-ac61-9f5a3d4a0a92 PiperOrigin-RevId: 249197046 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3bad64a0f9d..b8223fe4353 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4d1f36bb3b595517379f69ce5acbb9afccc00c375ad1f99015356bc79af3f503", - git_commit = "48c906cfdcfa1ec13d29adaa268a5924893c501b", + sha256 = "2c6e1b3706d8d83ee13f3887e9018e3511d83e9e930307ce996d09a9a69a329d", + git_commit = "4c8328abbec92ace2f57cc2c51258948675b761e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 76ba463947b8596676ae80607e12377ef432ada0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 May 2019 06:02:14 -0700 Subject: [PATCH 3158/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e5541a4f-747f-415e-ad4a-171e17fae674 PiperOrigin-RevId: 249235254 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b8223fe4353..83ced1ac1b1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2c6e1b3706d8d83ee13f3887e9018e3511d83e9e930307ce996d09a9a69a329d", - git_commit = "4c8328abbec92ace2f57cc2c51258948675b761e", + sha256 = "7c725b868c773b7925a403f4fe35d91284f250fd40894c41fceb63acde6ca2b6", + git_commit = "592a1f97e479d382140f6691fa9432115b4a2ea1", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From cd3a53365a057b845a9efd8712567c719b2ada6e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 May 2019 12:02:09 -0700 Subject: [PATCH 3159/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/25d6c594-a731-4a52-8f54-c7c29293d14b PiperOrigin-RevId: 249297410 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 83ced1ac1b1..6bd11ea8f12 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7c725b868c773b7925a403f4fe35d91284f250fd40894c41fceb63acde6ca2b6", - git_commit = "592a1f97e479d382140f6691fa9432115b4a2ea1", + sha256 = "9dbaa5d3bcd1ca8d4786f4c4c505bb1842d40f08f9cb87da1b7c9dec592f7283", + git_commit = "34d4ee6214cf623208ceda61afbf9d0aee6e41fa", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0e5cbbff7d5ee0bda1b6605762e3c128df47717a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 May 2019 18:02:06 -0700 Subject: [PATCH 3160/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8908c4e3-eeef-4cf6-a22a-26382a0161cd PiperOrigin-RevId: 249363114 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6bd11ea8f12..632e7a7c6cc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9dbaa5d3bcd1ca8d4786f4c4c505bb1842d40f08f9cb87da1b7c9dec592f7283", - git_commit = "34d4ee6214cf623208ceda61afbf9d0aee6e41fa", + sha256 = "de4210be63505d3918e91f3349816a471b97104c69c63052ea80395b1854f6a8", + git_commit = "452c7ccd64f769a836a843df8e55fe04797c426a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 17dd5b04222415e78d46ef3b531f223b2e30faa3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 22 May 2019 00:02:32 -0700 Subject: [PATCH 3161/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4769f212-9bc2-444a-9cc8-7ad3af8b794c PiperOrigin-RevId: 249395389 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 632e7a7c6cc..b5814c930d3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "de4210be63505d3918e91f3349816a471b97104c69c63052ea80395b1854f6a8", - git_commit = "452c7ccd64f769a836a843df8e55fe04797c426a", + sha256 = "07fb0145dec073cef34c88d355d9ab585581722b19c6cffb610417c61456f758", + git_commit = "731409f8d227214cbd2302881133893b9106c05e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5417bf1f6d40d8a8af906deef6b6f2e069ec29d0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 22 May 2019 06:02:26 -0700 Subject: [PATCH 3162/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/da5ec58b-b243-46f7-bda4-890a126ac521 PiperOrigin-RevId: 249433179 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b5814c930d3..7ef3ae91abc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "07fb0145dec073cef34c88d355d9ab585581722b19c6cffb610417c61456f758", - git_commit = "731409f8d227214cbd2302881133893b9106c05e", + sha256 = "e6f135f2d2677512c9116f00e63e78a4b432c9cfdec53799efd78b44385d114c", + git_commit = "f2784b679d2890d24f747895c58ee695f0c639ff", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c2f95220d25cd948519d73c756a1b2bcebd2faef Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 22 May 2019 12:02:28 -0700 Subject: [PATCH 3163/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b32c73f0-7e80-4807-9fd7-c395732e42cb PiperOrigin-RevId: 249492911 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7ef3ae91abc..1a23741fbf7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e6f135f2d2677512c9116f00e63e78a4b432c9cfdec53799efd78b44385d114c", - git_commit = "f2784b679d2890d24f747895c58ee695f0c639ff", + sha256 = "868e0cea35a43771bd9ab6037cbc9b134cbd48e7acc86c24e83347bcedd3a17c", + git_commit = "201816011b1e65292ddd87130bb13f0cb7a76e99", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 06efba78bbcd9eff08df1ef744c489f650a9c549 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 22 May 2019 16:30:23 -0700 Subject: [PATCH 3164/8103] internal change PiperOrigin-RevId: 249545093 --- tensorflow_serving/batching/BUILD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/batching/BUILD b/tensorflow_serving/batching/BUILD index c38502555c1..0c7bf8ac05e 100644 --- a/tensorflow_serving/batching/BUILD +++ b/tensorflow_serving/batching/BUILD @@ -22,7 +22,7 @@ cc_library( name = "streaming_batch_scheduler", srcs = ["streaming_batch_scheduler.cc"], hdrs = ["streaming_batch_scheduler.h"], - visibility = ["//visibility:public"], + visibility = ["//visibility:private"], deps = [ ":batch_scheduler_retrier", "//tensorflow_serving/util:optional", From f3fe3af7ddd717eba98d60cebd030ab99f016e3c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 22 May 2019 18:02:10 -0700 Subject: [PATCH 3165/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/247cb02c-518a-4f9f-bbad-6a925517af0b PiperOrigin-RevId: 249559387 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1a23741fbf7..c39d3a1911d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "868e0cea35a43771bd9ab6037cbc9b134cbd48e7acc86c24e83347bcedd3a17c", - git_commit = "201816011b1e65292ddd87130bb13f0cb7a76e99", + sha256 = "0f702ddf15c8f29456ec5dd92a0ca3f2f369009685939e8f01718b83dfc84f33", + git_commit = "87ae6fb8ee46524761e9d163e1863811a4afec2d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5329ff3a866313cdbd6702dc3702e0702f6cf59f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 May 2019 00:02:57 -0700 Subject: [PATCH 3166/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/61ef2d67-1463-4d30-b6bf-71a93f12325e PiperOrigin-RevId: 249590674 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c39d3a1911d..b287a4348eb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0f702ddf15c8f29456ec5dd92a0ca3f2f369009685939e8f01718b83dfc84f33", - git_commit = "87ae6fb8ee46524761e9d163e1863811a4afec2d", + sha256 = "84b9b5164e60f9f0410015b5f90f1a5f54bc401c78d98b8a045334ba3dce6eb9", + git_commit = "f2b2c26cea13424cca5e88853d91dcca3340acb8", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 374c71137d2a97e4faddfefd907a67eac71c7c6b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 May 2019 06:02:14 -0700 Subject: [PATCH 3167/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8a13b23c-c475-4f3c-a308-97bb5f2746b4 PiperOrigin-RevId: 249627692 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b287a4348eb..57730e43c45 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "84b9b5164e60f9f0410015b5f90f1a5f54bc401c78d98b8a045334ba3dce6eb9", - git_commit = "f2b2c26cea13424cca5e88853d91dcca3340acb8", + sha256 = "9a2d1615f10e184c9f58e55935ed0a86d72a3b8c9658e17800a03ee98370e4eb", + git_commit = "fef5167133a7698d10c8af147a92a27628c2e701", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ac8ae549dd4883899ed8ab226171ffaa666ded42 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 May 2019 12:02:27 -0700 Subject: [PATCH 3168/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f0e06d1d-8f3a-431b-99bc-9e01209edd00 PiperOrigin-RevId: 249688604 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 57730e43c45..00f6dc32960 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9a2d1615f10e184c9f58e55935ed0a86d72a3b8c9658e17800a03ee98370e4eb", - git_commit = "fef5167133a7698d10c8af147a92a27628c2e701", + sha256 = "b69193fb07cce7ca83eca86e076b63728ef0967c5e07d16253ead944b1b5eec3", + git_commit = "0115db54c5d1d531e0ea0fcaef8b6cd181a1979d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1fd3bd2d83619b77d25dd05cba6b1f16e3ccd0f4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 May 2019 18:02:10 -0700 Subject: [PATCH 3169/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a9b33599-d520-4898-a7d4-204d79044b70 PiperOrigin-RevId: 249751967 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 00f6dc32960..834470d2f24 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b69193fb07cce7ca83eca86e076b63728ef0967c5e07d16253ead944b1b5eec3", - git_commit = "0115db54c5d1d531e0ea0fcaef8b6cd181a1979d", + sha256 = "16ed90074ac517e43a721b4280784c83d95e4c3b885ea27914cd10c9abf59010", + git_commit = "759964f19bddc843722642c8c4b0fa6604fc128f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7a1949545fe40494c9726d1bec9fd30e35e67196 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 May 2019 00:02:10 -0700 Subject: [PATCH 3170/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/752c4fcf-21cd-40aa-9198-1bc5985e276a PiperOrigin-RevId: 249784019 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 834470d2f24..6f7a8a96118 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "16ed90074ac517e43a721b4280784c83d95e4c3b885ea27914cd10c9abf59010", - git_commit = "759964f19bddc843722642c8c4b0fa6604fc128f", + sha256 = "b6d380a98e5524ad99dc4cea62edd39a9f80c50dd5d3b3eddc8772e95ad6ad0b", + git_commit = "2b2ea4ca374acf91a58e74677d633c97336c6652", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5ad617ab5e473cf5ca7e28e3ff393d776e56575c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 May 2019 06:03:41 -0700 Subject: [PATCH 3171/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/edbfa795-ced5-40a1-ae87-192a4a8cbacf PiperOrigin-RevId: 249820306 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6f7a8a96118..cb61ca31488 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b6d380a98e5524ad99dc4cea62edd39a9f80c50dd5d3b3eddc8772e95ad6ad0b", - git_commit = "2b2ea4ca374acf91a58e74677d633c97336c6652", + sha256 = "22b9884050f831c45813922f0be6791a9ce1967ee5b0381caafcea5bfdd5e764", + git_commit = "d21e3a618b28756a4b3fe3cc23447a10a3694055", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 24e6b69a57e5ae3d801a536cc1cac0b1986b9104 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 May 2019 12:02:26 -0700 Subject: [PATCH 3172/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ee52b0b4-d993-4bfe-b1bb-f23035fe912b PiperOrigin-RevId: 249874827 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cb61ca31488..16733be4752 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "22b9884050f831c45813922f0be6791a9ce1967ee5b0381caafcea5bfdd5e764", - git_commit = "d21e3a618b28756a4b3fe3cc23447a10a3694055", + sha256 = "a0f01bdb128a2826fd633d5efbc28402e317ed0024131e86b2aa6eece76591a7", + git_commit = "7eb6a3fefc3d23fd0925184e44259eafbea17df2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 585c1cfa4ee5baef35c3275ff8e361db333402fe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 May 2019 18:02:07 -0700 Subject: [PATCH 3173/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1e3fdb17-9e55-4015-ac35-ee29117fc115 PiperOrigin-RevId: 249929133 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 16733be4752..bfd51ad8130 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a0f01bdb128a2826fd633d5efbc28402e317ed0024131e86b2aa6eece76591a7", - git_commit = "7eb6a3fefc3d23fd0925184e44259eafbea17df2", + sha256 = "838b13032535f7006a34943a188e5bdc09a7028c7a62a7dae5c4aa96250e7487", + git_commit = "4b86bb5fb007e03e9d90e21cc6bb12cd3b2e2e84", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d582e5e0bb150bb3af1d08b875aa459a53734541 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 25 May 2019 00:02:14 -0700 Subject: [PATCH 3174/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/cc06791a-0c91-404e-b6b0-dfb6b2d30314 PiperOrigin-RevId: 249951643 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bfd51ad8130..877bfc9804a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "838b13032535f7006a34943a188e5bdc09a7028c7a62a7dae5c4aa96250e7487", - git_commit = "4b86bb5fb007e03e9d90e21cc6bb12cd3b2e2e84", + sha256 = "0cc3ca58f6a9599df7c12ec137f96f61ddccaa44c6afcee787eba55feebc485b", + git_commit = "81129f2cfc55d85153219afb4d63fbffb0cca8d5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 026a4cbfea45e0be79539fed85278e945ad0375a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 25 May 2019 06:02:18 -0700 Subject: [PATCH 3175/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/557b45a0-9980-4f51-8857-afb19a7978c6 PiperOrigin-RevId: 249971848 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 877bfc9804a..0999762e5e5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0cc3ca58f6a9599df7c12ec137f96f61ddccaa44c6afcee787eba55feebc485b", - git_commit = "81129f2cfc55d85153219afb4d63fbffb0cca8d5", + sha256 = "98841e10656f18965dcbd7f6c9fcf5a9ab838c4efcd190c248e644d7666f76ee", + git_commit = "4b9fe8421820bcfa685ccd3934d7c40fe3235b58", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 602af609764b1b904418b5edef7bb86ca12b513c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 25 May 2019 12:02:21 -0700 Subject: [PATCH 3176/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/91239a35-19d9-44bc-a42c-25e1f9ff600d PiperOrigin-RevId: 249988943 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0999762e5e5..958ac1d3034 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "98841e10656f18965dcbd7f6c9fcf5a9ab838c4efcd190c248e644d7666f76ee", - git_commit = "4b9fe8421820bcfa685ccd3934d7c40fe3235b58", + sha256 = "7d099d2fe604f61defa5f8f58f08bbc04cee3bbad104f89e69242894c37cb040", + git_commit = "a5c2e20205089a1ef0edd497de1c4fb7f3c5ec4a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 73f98e009a39cdafa2b3b4a9820eed066c785e01 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 26 May 2019 06:02:03 -0700 Subject: [PATCH 3177/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8df47c4c-154f-4cdf-ac1f-106f1ebf0a9d PiperOrigin-RevId: 250041719 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 958ac1d3034..edee49b8120 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7d099d2fe604f61defa5f8f58f08bbc04cee3bbad104f89e69242894c37cb040", - git_commit = "a5c2e20205089a1ef0edd497de1c4fb7f3c5ec4a", + sha256 = "e94b708b863ff1c67de79f59858b332eceb637d57fc0ee39d95ff97d95bf2909", + git_commit = "010599cb5005ec14c1021adec3079d1504c986a0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 92f38a37c5238666cd99f417958ecca2e213779f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 26 May 2019 18:02:10 -0700 Subject: [PATCH 3178/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/82a8ab43-df69-4d10-8ead-d684c0cba34b PiperOrigin-RevId: 250078415 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index edee49b8120..210f7e75325 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e94b708b863ff1c67de79f59858b332eceb637d57fc0ee39d95ff97d95bf2909", - git_commit = "010599cb5005ec14c1021adec3079d1504c986a0", + sha256 = "ff178a0ba95e9fecdc2a8161633e0b184e84b97f009345094dfb3953b59423c5", + git_commit = "85523ade7724ae0c7cd6aa55a1acc98f1603d278", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7fc2253157db1dff340d7b418a6cf5204db2ce09 Mon Sep 17 00:00:00 2001 From: ynqa Date: Mon, 27 May 2019 10:32:41 +0900 Subject: [PATCH 3179/8103] Fix docs --- tensorflow_serving/g3doc/serving_config.md | 31 +++++++++------------- 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/tensorflow_serving/g3doc/serving_config.md b/tensorflow_serving/g3doc/serving_config.md index b5218628bd7..35f505a0842 100644 --- a/tensorflow_serving/g3doc/serving_config.md +++ b/tensorflow_serving/g3doc/serving_config.md @@ -141,34 +141,29 @@ the model config on the fly, to assign a label to it [HandleReloadConfigRequest](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/apis/model_service.proto#L22) RPC endpoint). -# How to Configure for Monitoring +## How to Configure for Monitoring -Creating a monitoring config file containing a +Create a monitoring config file containing a [MonitoringConfig](https://github.com/tensorflow/serving/blob/1.13.0/tensorflow_serving/config/monitoring_config.proto#L17) -and set its path to --monitoring_config_file. It currently provides a monitoring -exporter for [Prometheus](https://prometheus.io/), and whose configs are -described +and set --monitoring_config_file flag to the path of this file. It currently +provides a monitoring exporter for [Prometheus](https://prometheus.io/), and +whose config is described in [PrometheusConfig](https://github.com/tensorflow/serving/blob/1.13.0/tensorflow_serving/config/monitoring_config.proto#L7) protocol buffer. Here's an example: ```proto prometheus_config { enable: true - path: '/metrics' } ``` -And also you must define also --rest_api_port for HTTP requests. -Prometheus Server pulls metrics from the serving which has specified endpoint. +The default monitoring endpoint is /monitoring/prometheus/metrics. +You add 'path' field into prometheus_config in case of changing the default +path. -Tensorflow defines the basic metrics like -[load_attempt_count](https://github.com/tensorflow/tensorflow/blob/v1.13.1/tensorflow/cc/saved_model/loader.cc#L37-L40) -and -[load_latency](https://github.com/tensorflow/tensorflow/blob/v1.13.1/tensorflow/cc/saved_model/loader.cc#L41-L44) -which are arising on loading SavedModel. -Furthermore, Tensorflow Serving also has its own metrics: +To read metrics from above monitoring URL, you need to set --rest_api_port to +enable HTTP requests. Prometheus Server pulls metrics from the serving which +has specified endpoint. -- [model_warmup_latency](https://github.com/tensorflow/serving/blob/1.13.0/tensorflow_serving/servables/tensorflow/saved_model_warmup.cc#L36-L43) -- [request_log_count](https://github.com/tensorflow/serving/blob/1.13.0/tensorflow_serving/core/request_logger.cc#L30-L35) -- [request_example_counts](https://github.com/tensorflow/serving/blob/1.13.0/tensorflow_serving/servables/tensorflow/util.cc#L36-L41) -- [request_example_count_total](https://github.com/tensorflow/serving/blob/1.13.0/tensorflow_serving/servables/tensorflow/util.cc#L43-L45) +Tensorflow Serving collects all metrics that are available on Tensorflow and the +serving itself. From 08cb506672d4c2ef289f79eee545df26d6577b45 Mon Sep 17 00:00:00 2001 From: ynqa Date: Mon, 27 May 2019 10:41:32 +0900 Subject: [PATCH 3180/8103] Use master as references --- tensorflow_serving/g3doc/serving_config.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/g3doc/serving_config.md b/tensorflow_serving/g3doc/serving_config.md index 35f505a0842..dc17b5ec145 100644 --- a/tensorflow_serving/g3doc/serving_config.md +++ b/tensorflow_serving/g3doc/serving_config.md @@ -144,11 +144,11 @@ RPC endpoint). ## How to Configure for Monitoring Create a monitoring config file containing a -[MonitoringConfig](https://github.com/tensorflow/serving/blob/1.13.0/tensorflow_serving/config/monitoring_config.proto#L17) +[MonitoringConfig](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/config/monitoring_config.proto#L17) and set --monitoring_config_file flag to the path of this file. It currently provides a monitoring exporter for [Prometheus](https://prometheus.io/), and whose config is described in -[PrometheusConfig](https://github.com/tensorflow/serving/blob/1.13.0/tensorflow_serving/config/monitoring_config.proto#L7) +[PrometheusConfig](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/config/monitoring_config.proto#L7) protocol buffer. Here's an example: ```proto From a5fe14a8f7beacc422e11a353f2ce6680d216ac3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 27 May 2019 00:02:26 -0700 Subject: [PATCH 3181/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6d2f08a4-3cf4-4732-a84a-33679c9e4dbc PiperOrigin-RevId: 250103959 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 210f7e75325..0f114e9557f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ff178a0ba95e9fecdc2a8161633e0b184e84b97f009345094dfb3953b59423c5", - git_commit = "85523ade7724ae0c7cd6aa55a1acc98f1603d278", + sha256 = "d98c18b1379128ab2b647f1fe000e5bbe82fe985dbded38ef5969bd055b73e05", + git_commit = "11281547d9192543b9000832bb79664970280834", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 33178030e9ea8c7bb07aa99f0e3ea4910a6571fa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 27 May 2019 06:03:58 -0700 Subject: [PATCH 3182/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b922f37c-b6ee-47d9-a651-08187632fcb4 PiperOrigin-RevId: 250143603 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0f114e9557f..69fc9a5558a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d98c18b1379128ab2b647f1fe000e5bbe82fe985dbded38ef5969bd055b73e05", - git_commit = "11281547d9192543b9000832bb79664970280834", + sha256 = "9abd8334893885780753223f49b33c7956d24f8d71978da153ae980a951bcd2b", + git_commit = "7cf2e5bc8923ca8f0b5040c9d4198e601c2c0215", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e863d38908dfe8f6a207f12e44bb4785f8e91584 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 27 May 2019 12:02:17 -0700 Subject: [PATCH 3183/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b17705c7-1d5c-4584-843a-f9b7fc6d072d PiperOrigin-RevId: 250173298 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 69fc9a5558a..d8d3932fb17 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9abd8334893885780753223f49b33c7956d24f8d71978da153ae980a951bcd2b", - git_commit = "7cf2e5bc8923ca8f0b5040c9d4198e601c2c0215", + sha256 = "7b5dc846c405d73a12495763ee97ab46010fe128d53f5cc099cc48aed1d487f3", + git_commit = "a26d43a5f8e06f5236d4117bbda702fac26ae93a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 94e780809fcfc883c165789f6c2cbf10e5154673 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 28 May 2019 00:02:17 -0700 Subject: [PATCH 3184/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e8d43c04-f78f-4e44-8624-f0ac83008596 PiperOrigin-RevId: 250223517 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d8d3932fb17..3af43224f11 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7b5dc846c405d73a12495763ee97ab46010fe128d53f5cc099cc48aed1d487f3", - git_commit = "a26d43a5f8e06f5236d4117bbda702fac26ae93a", + sha256 = "aaa99fd14d5341b6fb29b277cbc56669c60e347ba94a5698022f70fcece5145c", + git_commit = "a9a1a64d2556804d919cc85e66f92470743bbd73", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0e6957958ab5e0e5bffe174807eb988c3b4440a7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 28 May 2019 06:02:15 -0700 Subject: [PATCH 3185/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/28ee6d35-770c-4d56-9c58-b0f00977e3e7 PiperOrigin-RevId: 250263480 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3af43224f11..ced73e13c5e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "aaa99fd14d5341b6fb29b277cbc56669c60e347ba94a5698022f70fcece5145c", - git_commit = "a9a1a64d2556804d919cc85e66f92470743bbd73", + sha256 = "f710d047035fc42c35af1a15c99828694d2c15b598ced9a466dd5cf0e2a760b4", + git_commit = "3331d9347f6fab8d0f748d79accc56eb27f4b387", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4de10540d948e6dadaf746e3573afb506b6f7090 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 28 May 2019 12:02:07 -0700 Subject: [PATCH 3186/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/614b43d2-9827-42ef-bc5e-ff4dd7170959 PiperOrigin-RevId: 250332555 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ced73e13c5e..be26ca3396d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f710d047035fc42c35af1a15c99828694d2c15b598ced9a466dd5cf0e2a760b4", - git_commit = "3331d9347f6fab8d0f748d79accc56eb27f4b387", + sha256 = "b3cad5dc0453b5a87015152dfbd136d956f975e30e05514cce701f4b3b87d897", + git_commit = "c47ec542111140fffd8420023bab95ae21321a12", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a27f8f6dd61f3aede092e3d0d81da6cf71c4a605 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 28 May 2019 18:03:11 -0700 Subject: [PATCH 3187/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/332f3e01-658d-41e9-adc1-e32cd51a0841 PiperOrigin-RevId: 250399819 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index be26ca3396d..3560ae04d48 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b3cad5dc0453b5a87015152dfbd136d956f975e30e05514cce701f4b3b87d897", - git_commit = "c47ec542111140fffd8420023bab95ae21321a12", + sha256 = "afa96a342c8fc7ae7e4221d3b0c6455b6d78053837a149099bd9e060a6059371", + git_commit = "b211c7a053d35e1d957ec00698bfbdc5e4e14e26", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 53e45d511d443191ba56ed3a00d8e7ee511b4d52 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 29 May 2019 00:02:14 -0700 Subject: [PATCH 3188/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ded33c46-625d-46e9-917f-da285e3711fc PiperOrigin-RevId: 250434508 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3560ae04d48..5cf9de5c980 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "afa96a342c8fc7ae7e4221d3b0c6455b6d78053837a149099bd9e060a6059371", - git_commit = "b211c7a053d35e1d957ec00698bfbdc5e4e14e26", + sha256 = "f2cba31b4e63e2b4d197e0d8dc6c5ad709e5fafd91b46f3942c54d15add09e0b", + git_commit = "2e758833c3642cde938a87a4dff93b27606fe8bf", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9cc986beb742c485a62637fd20e841288774585d Mon Sep 17 00:00:00 2001 From: ynqa Date: Wed, 29 May 2019 18:59:29 +0900 Subject: [PATCH 3189/8103] Fix docs --- tensorflow_serving/g3doc/serving_config.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/tensorflow_serving/g3doc/serving_config.md b/tensorflow_serving/g3doc/serving_config.md index dc17b5ec145..3e5f13b841a 100644 --- a/tensorflow_serving/g3doc/serving_config.md +++ b/tensorflow_serving/g3doc/serving_config.md @@ -157,13 +157,12 @@ prometheus_config { } ``` -The default monitoring endpoint is /monitoring/prometheus/metrics. -You add 'path' field into prometheus_config in case of changing the default -path. +The default monitoring endpoint is `/monitoring/prometheus/metrics`. +You can set `path` field in prometheus_config to change the default path. -To read metrics from above monitoring URL, you need to set --rest_api_port to -enable HTTP requests. Prometheus Server pulls metrics from the serving which -has specified endpoint. +To read metrics from above monitoring URL, you need to set `--rest_api_port` +flag to enable HTTP requests. Configure your Prometheus Server to pulls metrics +from Model Server configured by `--rest_api_port` and `path`. Tensorflow Serving collects all metrics that are available on Tensorflow and the serving itself. From 5a3c268d3fe508466b8ccc7c7785032a1f1b5c1d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 29 May 2019 06:02:47 -0700 Subject: [PATCH 3190/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/76eed383-7919-46dc-814a-a6bf5d36a149 PiperOrigin-RevId: 250475526 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5cf9de5c980..a7ddc3c1e2c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f2cba31b4e63e2b4d197e0d8dc6c5ad709e5fafd91b46f3942c54d15add09e0b", - git_commit = "2e758833c3642cde938a87a4dff93b27606fe8bf", + sha256 = "2d734bbf78ec7683c9821830cebd894dda751d03c958535b245890447eecc071", + git_commit = "eabf465df283af3afde3efef41df88a12f9b53da", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4aa0cfc24098000163fdfe270c4eb205e98790b1 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Wed, 29 May 2019 10:37:21 -0700 Subject: [PATCH 3191/8103] Remove hyphen from version numbers to conform with PIP. PiperOrigin-RevId: 250520004 --- tensorflow_serving/tools/pip_package/setup.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/tools/pip_package/setup.py b/tensorflow_serving/tools/pip_package/setup.py index 158e822e228..2ddd3c0fc2e 100644 --- a/tensorflow_serving/tools/pip_package/setup.py +++ b/tensorflow_serving/tools/pip_package/setup.py @@ -34,6 +34,7 @@ _VERSION = '0.0.0' # Have this by default be open; releasing a new version will lock to TF version _TF_VERSION = '>=1.2.0,<2' +_TF_VERSION_SANITIZED = _TF_VERSION.replace('-', '') project_name = 'tensorflow-serving-api' # Set when building the pip package @@ -43,12 +44,12 @@ sys.argv.remove('--project_name') sys.argv.pop(project_name_idx) -_TF_REQ = ['tensorflow'+_TF_VERSION] +_TF_REQ = ['tensorflow'+_TF_VERSION_SANITIZED] # GPU build (note: the only difference is we depend on tensorflow-gpu so # pip doesn't overwrite it with the CPU build) if 'tensorflow-serving-api-gpu' in project_name: - _TF_REQ = ['tensorflow-gpu'+_TF_VERSION] + _TF_REQ = ['tensorflow-gpu'+_TF_VERSION_SANITIZED] REQUIRED_PACKAGES = [ From d018ef2049fd02772b9dc3a0b2f86f8540056323 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 29 May 2019 12:02:25 -0700 Subject: [PATCH 3192/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fe8f88bd-42f7-49b9-9766-363386989691 PiperOrigin-RevId: 250538798 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a7ddc3c1e2c..d2ceaa5bb18 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2d734bbf78ec7683c9821830cebd894dda751d03c958535b245890447eecc071", - git_commit = "eabf465df283af3afde3efef41df88a12f9b53da", + sha256 = "98775d09073425603bfd52d248250deb62b4b1a63da0afe9d921729f9deb70e6", + git_commit = "acf4e786f7ee01e1ccae4bafbe783238c5a35aef", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e8cbe4e94de30c5be76a1d2a1208ab536a27c222 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 29 May 2019 18:04:58 -0700 Subject: [PATCH 3193/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3bf00941-9d72-4fa6-bf02-59f1b544f07d PiperOrigin-RevId: 250605436 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d2ceaa5bb18..ab683dfbb51 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "98775d09073425603bfd52d248250deb62b4b1a63da0afe9d921729f9deb70e6", - git_commit = "acf4e786f7ee01e1ccae4bafbe783238c5a35aef", + sha256 = "423f2aea2ade55ca24982272d7ce2381b1e364748d21da5e4c942d9ed66c7731", + git_commit = "fc8de3b0bccbd75debdcaae4c0e8650f4cd72fed", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a750acf63bbd99313a939f805e217a78e6868c84 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 May 2019 00:02:23 -0700 Subject: [PATCH 3194/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/70061405-ef0a-4ebe-8e63-16052e99a03e PiperOrigin-RevId: 250638011 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ab683dfbb51..94fc6179ba1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "423f2aea2ade55ca24982272d7ce2381b1e364748d21da5e4c942d9ed66c7731", - git_commit = "fc8de3b0bccbd75debdcaae4c0e8650f4cd72fed", + sha256 = "6cb0d05282c476517a65fe82dd462a1b24981c058327c604df59a480f9a08249", + git_commit = "e4bfb451ae06592fe9bac2a6e5d572a963b31e29", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8fac78652d21748c92eecd323dd069776deb45ca Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 May 2019 06:02:21 -0700 Subject: [PATCH 3195/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9424c2fe-518d-41a5-8bb0-a2f3563ab6f9 PiperOrigin-RevId: 250674598 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 94fc6179ba1..aa538091e84 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6cb0d05282c476517a65fe82dd462a1b24981c058327c604df59a480f9a08249", - git_commit = "e4bfb451ae06592fe9bac2a6e5d572a963b31e29", + sha256 = "47e755639cc30f30f3d1ee23b7dc07b625b8b5aef273bedc19fc6b5a4a6d8f85", + git_commit = "babc6fd53108b9cde2ec4674252b16957a6e8ff4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e35ffff3999be3f971fa1503c158f33d721228c8 Mon Sep 17 00:00:00 2001 From: Abolfazl Shahbazi Date: Thu, 30 May 2019 11:17:38 -0700 Subject: [PATCH 3196/8103] Fix ImportError: No module named builtins --- tensorflow_serving/tools/docker/Dockerfile.devel | 1 + tensorflow_serving/tools/docker/Dockerfile.devel-mkl | 1 + tensorflow_serving/tools/pip_package/setup.py | 1 + 3 files changed, 3 insertions(+) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index 49d0cf96992..8e5816d436b 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -51,6 +51,7 @@ RUN curl -fSsL -O https://bootstrap.pypa.io/get-pip.py && \ rm get-pip.py RUN pip --no-cache-dir install \ + future>=0.17.1 \ grpcio \ h5py \ keras_applications \ diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl index 932ef2b9d11..cc56fc2708e 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl @@ -51,6 +51,7 @@ RUN curl -fSsL -O https://bootstrap.pypa.io/get-pip.py && \ rm get-pip.py RUN pip --no-cache-dir install \ + future>=0.17.1 \ grpcio \ h5py \ keras_applications \ diff --git a/tensorflow_serving/tools/pip_package/setup.py b/tensorflow_serving/tools/pip_package/setup.py index 2ddd3c0fc2e..6a0fca55147 100644 --- a/tensorflow_serving/tools/pip_package/setup.py +++ b/tensorflow_serving/tools/pip_package/setup.py @@ -53,6 +53,7 @@ REQUIRED_PACKAGES = [ + 'future>=0.17.1', 'grpcio>=1.0<2', 'protobuf>=3.6.0', ] + _TF_REQ From c73a268cf063b75732f9558cfc932c7b7e63f343 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 May 2019 12:02:12 -0700 Subject: [PATCH 3197/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0c1e9d52-1860-46f5-b993-74df1dba59b2 PiperOrigin-RevId: 250733841 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index aa538091e84..7e5214f5f35 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "47e755639cc30f30f3d1ee23b7dc07b625b8b5aef273bedc19fc6b5a4a6d8f85", - git_commit = "babc6fd53108b9cde2ec4674252b16957a6e8ff4", + sha256 = "86a1262752ad1014c232c6931407f91088c25d5fcdfec437bcf9bb9eb6be620e", + git_commit = "b736afec3b00849d7eafea7bf6b3c9d7d850ada2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8e3956cac1eec2213538d8d6c367398e2f883e70 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 May 2019 12:27:44 -0700 Subject: [PATCH 3198/8103] Cleanup visibility specs. PiperOrigin-RevId: 250738485 --- tensorflow_serving/model_servers/BUILD | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 9cd7698de1e..c5bad66d919 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -199,9 +199,6 @@ cc_library( name = "model_service_impl", srcs = ["model_service_impl.cc"], hdrs = ["model_service_impl.h"], - visibility = [ - "//visibility:public", - ], deps = [ ":get_model_status_impl", ":grpc_status_util", @@ -217,9 +214,6 @@ cc_library( name = "prediction_service_impl", srcs = ["prediction_service_impl.cc"], hdrs = ["prediction_service_impl.h"], - visibility = [ - "//visibility:public", - ], deps = [ ":grpc_status_util", ":server_core", @@ -244,9 +238,6 @@ cc_library( name = "grpc_status_util", srcs = ["grpc_status_util.cc"], hdrs = ["grpc_status_util.h"], - visibility = [ - "//visibility:public", - ], deps = [ "@grpc//:grpc++", "@org_tensorflow//tensorflow/core:lib", @@ -257,7 +248,6 @@ cc_library( name = "http_server", srcs = ["http_server.cc"], hdrs = ["http_server.h"], - visibility = ["//tensorflow_serving:internal"], deps = [ ":http_rest_api_handler", ":server_core", From d6bc261d869cad2aa87b733fc8a59326b910a69a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 May 2019 18:01:58 -0700 Subject: [PATCH 3199/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3b333dbd-2192-4b8d-af44-a244825edef3 PiperOrigin-RevId: 250800802 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7e5214f5f35..4a1a9e5b82d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "86a1262752ad1014c232c6931407f91088c25d5fcdfec437bcf9bb9eb6be620e", - git_commit = "b736afec3b00849d7eafea7bf6b3c9d7d850ada2", + sha256 = "4acd8a59019c3297eb962ecc44801e22e4d06862ee0b07b6fab487378857ab5d", + git_commit = "dbb0de2739e0921a885b4d167f83e12da80c5836", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 13a2688dd43a86dbbac75cb6fca18e0470911a9f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 31 May 2019 00:02:29 -0700 Subject: [PATCH 3200/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7ded41fe-6ff1-48d8-b68a-a3c57ab5012a PiperOrigin-RevId: 250835204 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4a1a9e5b82d..8110efc8f6e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4acd8a59019c3297eb962ecc44801e22e4d06862ee0b07b6fab487378857ab5d", - git_commit = "dbb0de2739e0921a885b4d167f83e12da80c5836", + sha256 = "3a4ce3c7610ad5afe4817b74ff87430aeb29efbd873934028635bba429690f4d", + git_commit = "4fa4929f8de1e2328dcad551558200b3fbe3637b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 722bb25793af97219a1bdc9066cef9cffcea5eee Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 31 May 2019 06:02:31 -0700 Subject: [PATCH 3201/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c1c2e939-83ae-43ff-a870-127ae079a77c PiperOrigin-RevId: 250872344 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8110efc8f6e..13e4a9c9723 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3a4ce3c7610ad5afe4817b74ff87430aeb29efbd873934028635bba429690f4d", - git_commit = "4fa4929f8de1e2328dcad551558200b3fbe3637b", + sha256 = "fdf42b7eda4d4a890ecc1cf9c881cf9443b44701c4e2c6a8a883b13425f497de", + git_commit = "94feeb1c0ade3c673a758c0794e19c82b6e868b6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 741d1f5a1ab25068da501f0abf0a7b6ac8ef773f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 31 May 2019 12:08:44 -0700 Subject: [PATCH 3202/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fb8148fa-21f4-4d0e-8111-4d6f9ac56d3c PiperOrigin-RevId: 250931324 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 13e4a9c9723..411dd55adbd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fdf42b7eda4d4a890ecc1cf9c881cf9443b44701c4e2c6a8a883b13425f497de", - git_commit = "94feeb1c0ade3c673a758c0794e19c82b6e868b6", + sha256 = "9cc55e69f321dda38bdd4b0c7b93ed1646b38fb4a16fb39bd6855a96a10e88fd", + git_commit = "0220960e02f5bf5c004afb6eb9acce263e8b3ab3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 87cc3f94c47b2f24e8cc763bb9983227f2f21d71 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 31 May 2019 18:03:08 -0700 Subject: [PATCH 3203/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2c5bb7ee-1623-4088-8e9e-f0a98e3847ed PiperOrigin-RevId: 250990794 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 411dd55adbd..c5b11fc1126 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9cc55e69f321dda38bdd4b0c7b93ed1646b38fb4a16fb39bd6855a96a10e88fd", - git_commit = "0220960e02f5bf5c004afb6eb9acce263e8b3ab3", + sha256 = "058366f5d0ffcb60803ad868e3dad0c28c735cd786744a4f319dcb93023e3474", + git_commit = "d99c5f634b02ff970bc2f9970db914376444413c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2d673bbfd3c3a9f59bfa230b4e4235e6fc38d755 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 1 Jun 2019 00:02:42 -0700 Subject: [PATCH 3204/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4299a14f-b321-4d24-aa2d-a67de1fd4f49 PiperOrigin-RevId: 251016651 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c5b11fc1126..b7ecbab183f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "058366f5d0ffcb60803ad868e3dad0c28c735cd786744a4f319dcb93023e3474", - git_commit = "d99c5f634b02ff970bc2f9970db914376444413c", + sha256 = "d96f9861d1a0c58c8acbad4306d17b844ed6899bc710e474c06036ec9af5da48", + git_commit = "68c9eacc8d8e3ed15cbb8d8fbf1c601f9ce0cdf8", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9a119c0ff8d557841290803d96dd3b863d9f675a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 1 Jun 2019 06:02:24 -0700 Subject: [PATCH 3205/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9962cde0-3d10-4fd1-9d8a-6495eda8a598 PiperOrigin-RevId: 251039176 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b7ecbab183f..f8e426f972f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d96f9861d1a0c58c8acbad4306d17b844ed6899bc710e474c06036ec9af5da48", - git_commit = "68c9eacc8d8e3ed15cbb8d8fbf1c601f9ce0cdf8", + sha256 = "5a20bc6cf87f639fa645bbef29799e9fd8ce0d5379b540d1868e7546e814c77e", + git_commit = "9628bc838b9f8f4a5abc2f9f76808f2c212c3182", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d54b9c6cac8830a57e442fd2d530a86e6c0af5df Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 1 Jun 2019 12:01:55 -0700 Subject: [PATCH 3206/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e4ce0464-9e39-4f8e-a3fa-acbb0ecbac62 PiperOrigin-RevId: 251059109 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f8e426f972f..f9338b0054f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5a20bc6cf87f639fa645bbef29799e9fd8ce0d5379b540d1868e7546e814c77e", - git_commit = "9628bc838b9f8f4a5abc2f9f76808f2c212c3182", + sha256 = "16df2310e1e3e86d5a562296ede4df92656e129c9d4c7b5831e85b0d5941fc89", + git_commit = "efdc88cf13827a22fbb7f4d58a14a3cfe57fd21c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 64a80dd955a384de776b6256f3abcaa28cf88e79 Mon Sep 17 00:00:00 2001 From: Abolfazl Shahbazi Date: Sat, 1 Jun 2019 12:42:59 -0700 Subject: [PATCH 3207/8103] Remove 'future' from setup.py --- tensorflow_serving/tools/pip_package/setup.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tensorflow_serving/tools/pip_package/setup.py b/tensorflow_serving/tools/pip_package/setup.py index 6a0fca55147..2ddd3c0fc2e 100644 --- a/tensorflow_serving/tools/pip_package/setup.py +++ b/tensorflow_serving/tools/pip_package/setup.py @@ -53,7 +53,6 @@ REQUIRED_PACKAGES = [ - 'future>=0.17.1', 'grpcio>=1.0<2', 'protobuf>=3.6.0', ] + _TF_REQ From 83b1a2a62f5113d395d1a62a680c96ac97e9c939 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 1 Jun 2019 18:02:04 -0700 Subject: [PATCH 3208/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/baf27d72-0e14-4673-bc92-efbdf3ecd55c PiperOrigin-RevId: 251078287 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f9338b0054f..0772a4ac8c9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "16df2310e1e3e86d5a562296ede4df92656e129c9d4c7b5831e85b0d5941fc89", - git_commit = "efdc88cf13827a22fbb7f4d58a14a3cfe57fd21c", + sha256 = "27205d744ba9d346b275b698bba5b581bc6b176da3b799f67342994a26fc1cf7", + git_commit = "98a0c57c44d9c4f1a1ad2f7003c83dbe2802f7ce", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 01fede2eaa8bf6da4121ece63a8a46f3f25075c9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 2 Jun 2019 00:02:02 -0700 Subject: [PATCH 3209/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4aa5cc87-d124-4e18-8348-5d68a479d26d PiperOrigin-RevId: 251097571 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0772a4ac8c9..8c0ab3e6a50 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "27205d744ba9d346b275b698bba5b581bc6b176da3b799f67342994a26fc1cf7", - git_commit = "98a0c57c44d9c4f1a1ad2f7003c83dbe2802f7ce", + sha256 = "76a48d5d816537c69f551bf48dd29f9eaf5358f5e6ae1b78245aa52490b08d24", + git_commit = "230e4ef82417e1d5fd41163f93e0ae9b9ab45ae0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 74c2d05f7c93bc289ce56c9ff94168f1678e054d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 2 Jun 2019 06:01:59 -0700 Subject: [PATCH 3210/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/426d9b26-96a0-4ec0-8141-ab1cc0c9259d PiperOrigin-RevId: 251119498 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8c0ab3e6a50..5d4e64b182e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "76a48d5d816537c69f551bf48dd29f9eaf5358f5e6ae1b78245aa52490b08d24", - git_commit = "230e4ef82417e1d5fd41163f93e0ae9b9ab45ae0", + sha256 = "b4603f1c1d1999cc46fcfb79692190fac7bde125e8dc1c42219e12a68d4fbf7a", + git_commit = "8f93f5c61cbcba20f90c867c83698285d900dc1a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From dc36c21df5117364a3390a8bfe1fd3bf7dc92cb7 Mon Sep 17 00:00:00 2001 From: Abolfazl Shahbazi Date: Sun, 2 Jun 2019 23:05:20 -0700 Subject: [PATCH 3211/8103] Install future>=0.17.1 during Dockerfile.devel-gpu build --- tensorflow_serving/tools/docker/Dockerfile.devel-gpu | 1 + 1 file changed, 1 insertion(+) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 066350be879..720efdc7fbb 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -82,6 +82,7 @@ RUN curl -fSsL -O https://bootstrap.pypa.io/get-pip.py && \ rm get-pip.py RUN pip --no-cache-dir install \ + future>=0.17.1 \ grpcio \ h5py \ keras_applications \ From c191acd25a8835b69e37a2bd1f0b4efc8e1f36b6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 3 Jun 2019 00:02:08 -0700 Subject: [PATCH 3212/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f91c6b87-5830-4864-8282-aef9da77e170 PiperOrigin-RevId: 251173412 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5d4e64b182e..d28c1334de6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b4603f1c1d1999cc46fcfb79692190fac7bde125e8dc1c42219e12a68d4fbf7a", - git_commit = "8f93f5c61cbcba20f90c867c83698285d900dc1a", + sha256 = "711f3fb3084e26547711743b633809fea045eb4812c9e830c3632e03c108bf9e", + git_commit = "41f9603a5f28a60b657b80ef3bd7ce96d66bb8ae", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ce0c82c11e6c738f81f3f5fe8df8c76a4c04e16a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 3 Jun 2019 06:02:17 -0700 Subject: [PATCH 3213/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2eb614e7-eaf8-448a-9330-a48b10a97adf PiperOrigin-RevId: 251215427 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d28c1334de6..64067bf57b8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "711f3fb3084e26547711743b633809fea045eb4812c9e830c3632e03c108bf9e", - git_commit = "41f9603a5f28a60b657b80ef3bd7ce96d66bb8ae", + sha256 = "83b28b1db3de7c4a1dbd97cf2d4351b6ee44503b4998d6f56060e149950f2b09", + git_commit = "8924e67e034909bea0343631b9f9024c5a6da5c4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 254f9bb460748c03c6b00c4b82ac769a929129b5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 3 Jun 2019 12:02:19 -0700 Subject: [PATCH 3214/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fd4205e4-dd5b-4e7b-ac55-e89b1b6882d6 PiperOrigin-RevId: 251280324 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 64067bf57b8..2bdf89c7f35 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "83b28b1db3de7c4a1dbd97cf2d4351b6ee44503b4998d6f56060e149950f2b09", - git_commit = "8924e67e034909bea0343631b9f9024c5a6da5c4", + sha256 = "0ec382f18d7300a2c443aa115dc5f06b8872af9fe150fb56df90553f90925d26", + git_commit = "5085774f0f4821399f7b245c8044ba6e206116f4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 39bbeb70dec8054d8ad81a7aa0423ec7e1a07c2a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 3 Jun 2019 16:06:50 -0700 Subject: [PATCH 3215/8103] Replace calls to deprecated googletest APIs SetUpTestCase/TearDownTestCase with SetUpTestSuite/TearDownTestSuite. PiperOrigin-RevId: 251328751 --- .../model_servers/get_model_status_impl_test.cc | 6 ++++-- .../model_servers/http_rest_api_handler_test.cc | 4 ++-- .../servables/tensorflow/classification_service_test.cc | 4 ++-- .../servables/tensorflow/get_model_metadata_impl_test.cc | 4 ++-- .../servables/tensorflow/multi_inference_helper_test.cc | 6 ++++-- .../servables/tensorflow/multi_inference_test.cc | 6 ++++-- .../servables/tensorflow/predict_impl_test.cc | 4 ++-- .../servables/tensorflow/predict_util_test.cc | 4 ++-- .../servables/tensorflow/regression_service_test.cc | 4 ++-- 9 files changed, 24 insertions(+), 18 deletions(-) diff --git a/tensorflow_serving/model_servers/get_model_status_impl_test.cc b/tensorflow_serving/model_servers/get_model_status_impl_test.cc index 9f8a22ce3ca..47aeb09fd0c 100644 --- a/tensorflow_serving/model_servers/get_model_status_impl_test.cc +++ b/tensorflow_serving/model_servers/get_model_status_impl_test.cc @@ -46,9 +46,11 @@ constexpr int kNonexistentModelVersion = 125; class GetModelStatusImplTest : public ::testing::Test { public: - static void SetUpTestCase() { TF_ASSERT_OK(CreateServerCore(&server_core_)); } + static void SetUpTestSuite() { + TF_ASSERT_OK(CreateServerCore(&server_core_)); + } - static void TearDownTestCase() { server_core_.reset(); } + static void TearDownTestSuite() { server_core_.reset(); } protected: static Status CreateServerCore(std::unique_ptr* server_core) { diff --git a/tensorflow_serving/model_servers/http_rest_api_handler_test.cc b/tensorflow_serving/model_servers/http_rest_api_handler_test.cc index af729a7bef7..41828d496b1 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler_test.cc +++ b/tensorflow_serving/model_servers/http_rest_api_handler_test.cc @@ -59,7 +59,7 @@ using HeaderList = std::vector>; class HttpRestApiHandlerTest : public ::testing::Test { public: - static void SetUpTestCase() { + static void SetUpTestSuite() { TF_ASSERT_OK(CreateServerCore(&server_core_)); const int total = 1; // Number of models expected to be loaded. @@ -73,7 +73,7 @@ class HttpRestApiHandlerTest : public ::testing::Test { } } - static void TearDownTestCase() { server_core_.reset(); } + static void TearDownTestSuite() { server_core_.reset(); } protected: HttpRestApiHandlerTest() : handler_(RunOptions(), GetServerCore()) {} diff --git a/tensorflow_serving/servables/tensorflow/classification_service_test.cc b/tensorflow_serving/servables/tensorflow/classification_service_test.cc index 86c012d7500..00bf58d61b8 100644 --- a/tensorflow_serving/servables/tensorflow/classification_service_test.cc +++ b/tensorflow_serving/servables/tensorflow/classification_service_test.cc @@ -42,7 +42,7 @@ constexpr int kTestModelVersion = 123; // pointing to the half_plus_two SavedModel. class ClassificationServiceTest : public ::testing::Test { public: - static void SetUpTestCase() { + static void SetUpTestSuite() { ModelServerConfig config; auto model_config = config.mutable_model_config_list()->add_config(); model_config->set_name(kTestModelName); @@ -64,7 +64,7 @@ class ClassificationServiceTest : public ::testing::Test { TF_ASSERT_OK(ServerCore::Create(std::move(options), &server_core_)); } - static void TearDownTestCase() { server_core_ = nullptr; } + static void TearDownTestSuite() { server_core_ = nullptr; } protected: static std::unique_ptr server_core_; diff --git a/tensorflow_serving/servables/tensorflow/get_model_metadata_impl_test.cc b/tensorflow_serving/servables/tensorflow/get_model_metadata_impl_test.cc index 081f5de0a3a..d0501fe2aee 100644 --- a/tensorflow_serving/servables/tensorflow/get_model_metadata_impl_test.cc +++ b/tensorflow_serving/servables/tensorflow/get_model_metadata_impl_test.cc @@ -53,7 +53,7 @@ constexpr int kTestModelVersion = 123; class GetModelMetadataImplTest : public ::testing::TestWithParam { public: - static void SetUpTestCase() { + static void SetUpTestSuite() { const string session_bundle_path = test_util::TestSrcDirPath( "/servables/tensorflow/testdata/half_plus_two"); TF_ASSERT_OK(CreateServerCore(session_bundle_path, false, &server_core_)); @@ -64,7 +64,7 @@ class GetModelMetadataImplTest : public ::testing::TestWithParam { CreateServerCore(saved_model_path, true, &saved_model_server_core_)); } - static void TearDownTestCase() { + static void TearDownTestSuite() { server_core_.reset(); saved_model_server_core_.reset(); } diff --git a/tensorflow_serving/servables/tensorflow/multi_inference_helper_test.cc b/tensorflow_serving/servables/tensorflow/multi_inference_helper_test.cc index b2a3e15f2ee..11ce1031aed 100644 --- a/tensorflow_serving/servables/tensorflow/multi_inference_helper_test.cc +++ b/tensorflow_serving/servables/tensorflow/multi_inference_helper_test.cc @@ -41,9 +41,11 @@ constexpr int kTestModelVersion = 123; class MultiInferenceTest : public ::testing::Test { public: - static void SetUpTestCase() { TF_ASSERT_OK(CreateServerCore(&server_core_)); } + static void SetUpTestSuite() { + TF_ASSERT_OK(CreateServerCore(&server_core_)); + } - static void TearDownTestCase() { server_core_.reset(); } + static void TearDownTestSuite() { server_core_.reset(); } protected: static Status CreateServerCore(std::unique_ptr* server_core) { diff --git a/tensorflow_serving/servables/tensorflow/multi_inference_test.cc b/tensorflow_serving/servables/tensorflow/multi_inference_test.cc index d4070f8e848..c7e77063cba 100644 --- a/tensorflow_serving/servables/tensorflow/multi_inference_test.cc +++ b/tensorflow_serving/servables/tensorflow/multi_inference_test.cc @@ -41,9 +41,11 @@ constexpr int kTestModelVersion = 123; class MultiInferenceTest : public ::testing::Test { public: - static void SetUpTestCase() { TF_ASSERT_OK(CreateServerCore(&server_core_)); } + static void SetUpTestSuite() { + TF_ASSERT_OK(CreateServerCore(&server_core_)); + } - static void TearDownTestCase() { server_core_.reset(); } + static void TearDownTestSuite() { server_core_.reset(); } protected: static Status CreateServerCore(std::unique_ptr* server_core) { diff --git a/tensorflow_serving/servables/tensorflow/predict_impl_test.cc b/tensorflow_serving/servables/tensorflow/predict_impl_test.cc index 0c83d3cea33..cb66f82e8d6 100644 --- a/tensorflow_serving/servables/tensorflow/predict_impl_test.cc +++ b/tensorflow_serving/servables/tensorflow/predict_impl_test.cc @@ -42,7 +42,7 @@ const char kOutputTensorKey[] = "y"; // Parameter is 'bool use_saved_model'. class PredictImplTest : public ::testing::TestWithParam { public: - static void SetUpTestCase() { + static void SetUpTestSuite() { TF_ASSERT_OK( CreateServerCore(test_util::TestSrcDirPath( "/servables/tensorflow/testdata/half_plus_two"), @@ -63,7 +63,7 @@ class PredictImplTest : public ::testing::TestWithParam { true, &saved_model_server_core_counter_model_)); } - static void TearDownTestCase() { + static void TearDownTestSuite() { server_core_.reset(); server_core_bad_model_.reset(); saved_model_server_core_.reset(); diff --git a/tensorflow_serving/servables/tensorflow/predict_util_test.cc b/tensorflow_serving/servables/tensorflow/predict_util_test.cc index 47a6809391e..0e017d782c8 100644 --- a/tensorflow_serving/servables/tensorflow/predict_util_test.cc +++ b/tensorflow_serving/servables/tensorflow/predict_util_test.cc @@ -44,7 +44,7 @@ const char kOutputTensorKey[] = "y"; // Parameter is 'bool use_saved_model'. class PredictImplTest : public ::testing::Test { public: - static void SetUpTestCase() { + static void SetUpTestSuite() { const string bad_half_plus_two_path = test_util::TestSrcDirPath( "/servables/tensorflow/testdata/bad_half_plus_two"); @@ -59,7 +59,7 @@ class PredictImplTest : public ::testing::Test { true, &saved_model_server_core_counter_model_)); } - static void TearDownTestCase() { + static void TearDownTestSuite() { saved_model_server_core_.reset(); saved_model_server_core_bad_model_.reset(); saved_model_server_core_counter_model_.reset(); diff --git a/tensorflow_serving/servables/tensorflow/regression_service_test.cc b/tensorflow_serving/servables/tensorflow/regression_service_test.cc index 37b6ec4a643..a34d651f42e 100644 --- a/tensorflow_serving/servables/tensorflow/regression_service_test.cc +++ b/tensorflow_serving/servables/tensorflow/regression_service_test.cc @@ -42,7 +42,7 @@ constexpr int kTestModelVersion = 123; // pointing to the half_plus_two SavedModel. class RegressionServiceTest : public ::testing::Test { public: - static void SetUpTestCase() { + static void SetUpTestSuite() { ModelServerConfig config; auto model_config = config.mutable_model_config_list()->add_config(); model_config->set_name(kTestModelName); @@ -64,7 +64,7 @@ class RegressionServiceTest : public ::testing::Test { TF_ASSERT_OK(ServerCore::Create(std::move(options), &server_core_)); } - static void TearDownTestCase() { server_core_ = nullptr; } + static void TearDownTestSuite() { server_core_ = nullptr; } protected: static std::unique_ptr server_core_; From a161f7b7c7d0698ef2880637f155bbed2744c369 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 3 Jun 2019 18:01:57 -0700 Subject: [PATCH 3216/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/74c538c8-70f4-4153-9736-66ff342ef3be PiperOrigin-RevId: 251347389 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2bdf89c7f35..70afc1dac83 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0ec382f18d7300a2c443aa115dc5f06b8872af9fe150fb56df90553f90925d26", - git_commit = "5085774f0f4821399f7b245c8044ba6e206116f4", + sha256 = "5599768eb51467bea68e4cc80595177ae4d9da976457750323c330eb9c1e5ccd", + git_commit = "3679396fb5676fed06d84a35c63fe29bd257a829", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1ee00a38e32fe712a54f57fdc878797c74852a78 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 4 Jun 2019 00:02:11 -0700 Subject: [PATCH 3217/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9c99a884-2a79-4c1f-94b4-ba9666d11e8d PiperOrigin-RevId: 251382959 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 70afc1dac83..706ad214271 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5599768eb51467bea68e4cc80595177ae4d9da976457750323c330eb9c1e5ccd", - git_commit = "3679396fb5676fed06d84a35c63fe29bd257a829", + sha256 = "f7abdc9e44f1fab424109ed8b3e4a48c795157bdcee96fad55e9d550b33586b6", + git_commit = "e665646714d4b4bd54ac69ee6c6fd47e07d34bee", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 82810ccbc2c28faade8ecfbc59c32af8c1c4357f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 4 Jun 2019 06:01:54 -0700 Subject: [PATCH 3218/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f274d462-69db-43bb-b424-267d5543255f PiperOrigin-RevId: 251423409 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 706ad214271..04c147e801c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f7abdc9e44f1fab424109ed8b3e4a48c795157bdcee96fad55e9d550b33586b6", - git_commit = "e665646714d4b4bd54ac69ee6c6fd47e07d34bee", + sha256 = "5b15d13ebb2cb16718f4935bd821e92e776ff41b9096e75ac06fad270c520168", + git_commit = "7ed79962bd025062010f82f306719dc17afa3767", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e8171526c732c6fa90b18275b76b9e6920223874 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 4 Jun 2019 12:02:22 -0700 Subject: [PATCH 3219/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1410e556-d99e-4a4d-8bfc-5e8cb1053500 PiperOrigin-RevId: 251487108 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 04c147e801c..db867e9c656 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5b15d13ebb2cb16718f4935bd821e92e776ff41b9096e75ac06fad270c520168", - git_commit = "7ed79962bd025062010f82f306719dc17afa3767", + sha256 = "35d310db1ff217d27ee36bbe6030dae7d0408bc716545f866eb11323cfc74d62", + git_commit = "180f28a26660ca2e1ba27477f4f9592db5f9c4e8", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f91c3f21e6f962aa2a6ec9113ceb66d1fa879be1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 4 Jun 2019 18:01:51 -0700 Subject: [PATCH 3220/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ed082a45-e395-42d8-8955-574dbd833797 PiperOrigin-RevId: 251554878 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index db867e9c656..676410879cc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "35d310db1ff217d27ee36bbe6030dae7d0408bc716545f866eb11323cfc74d62", - git_commit = "180f28a26660ca2e1ba27477f4f9592db5f9c4e8", + sha256 = "8fe81161544fa40e8ee5ac1ac0f8ee75365222bb498ad701f64dd0cb9b42e255", + git_commit = "fc61fa8725db3229fc7dd08de3d2f664f87abbb4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 359a0bb9a5ea2379d7c580b41eac91019a8208e1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Jun 2019 00:02:21 -0700 Subject: [PATCH 3221/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/eb0741a0-7653-4440-8444-726180ddefe4 PiperOrigin-RevId: 251587903 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 676410879cc..0d9f660ff0c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8fe81161544fa40e8ee5ac1ac0f8ee75365222bb498ad701f64dd0cb9b42e255", - git_commit = "fc61fa8725db3229fc7dd08de3d2f664f87abbb4", + sha256 = "0877f8d50372bebe60a952f6d432a510b835e10d7f336c360691f36272ad53b2", + git_commit = "2e66ef0ec90a03678984f2c461c18cf645cedee1", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 19a055a3a78174b39ddd2e70d9f6ae7531957836 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Jun 2019 06:18:14 -0700 Subject: [PATCH 3222/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/210accd2-d770-49d9-84fa-f50c70456d57 PiperOrigin-RevId: 251629429 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0d9f660ff0c..6dbb9787904 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0877f8d50372bebe60a952f6d432a510b835e10d7f336c360691f36272ad53b2", - git_commit = "2e66ef0ec90a03678984f2c461c18cf645cedee1", + sha256 = "0690772f4bbdf5db32aad40725ff1c2d991c25f4be9771d6a627f3e2782d2cf0", + git_commit = "58c796df1dfd750782a1d285ec0972969bd196c6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e19c914d62edf68859ec54ee41a58dee6bc5898a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Jun 2019 12:02:40 -0700 Subject: [PATCH 3223/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/97db0114-0ce5-448d-8cd6-192b1b2badea PiperOrigin-RevId: 251689738 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6dbb9787904..bc3758fac34 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0690772f4bbdf5db32aad40725ff1c2d991c25f4be9771d6a627f3e2782d2cf0", - git_commit = "58c796df1dfd750782a1d285ec0972969bd196c6", + sha256 = "51a2a3320aec7ff3971cdde204512f44549046361b90e85bf77a73ecc6c72473", + git_commit = "5664e42d50662ccb1bd9657eb489e0c20ea24954", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 41a4bc0e4bb6630abc400f2c5ffc9dbc70d88c2d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 Jun 2019 18:02:24 -0700 Subject: [PATCH 3224/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c2089094-a182-487c-94e0-ad0959cf8cd6 PiperOrigin-RevId: 251758363 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bc3758fac34..972821ba411 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "51a2a3320aec7ff3971cdde204512f44549046361b90e85bf77a73ecc6c72473", - git_commit = "5664e42d50662ccb1bd9657eb489e0c20ea24954", + sha256 = "e2d47799bb7a42f51b2f0c4e395cd16928766ece5d58901cb32ae2fbed1fb864", + git_commit = "0e94bbce8bcc065d7579b9e30aa538abfb1ff112", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 61ea0f082ec41ac53767164f2118308b1816b327 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Jun 2019 00:02:30 -0700 Subject: [PATCH 3225/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2916fe1d-3199-4c6b-8f55-89ed528efb99 PiperOrigin-RevId: 251795061 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 972821ba411..efda68ff978 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e2d47799bb7a42f51b2f0c4e395cd16928766ece5d58901cb32ae2fbed1fb864", - git_commit = "0e94bbce8bcc065d7579b9e30aa538abfb1ff112", + sha256 = "83342cc5ffe5ed5a140f593e3db56c31acc56da3d9898bd0cc0538c58c8116ac", + git_commit = "9d43c209ad4936af6bcf5f1150c74b9d7d43d774", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5e7bb37989510f1a71e299a8ba64a7f55b9a6582 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Jun 2019 06:02:29 -0700 Subject: [PATCH 3226/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/45924aa1-7bf4-441d-9dbb-2afe805ab7fb PiperOrigin-RevId: 251836620 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index efda68ff978..5f9e49dfa79 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "83342cc5ffe5ed5a140f593e3db56c31acc56da3d9898bd0cc0538c58c8116ac", - git_commit = "9d43c209ad4936af6bcf5f1150c74b9d7d43d774", + sha256 = "49b2bd65b165c0074c4a297513282418bb7e49e0120940187f7e0b529e6523fd", + git_commit = "1c0c9f2f6b7d6683c1aa16229ff9242c60ec760d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6c7ee0dd0588b2129b759f5b95ed594ae8396380 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Jun 2019 12:04:14 -0700 Subject: [PATCH 3227/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/024e63e0-557a-483c-9809-1e071a99ff3c PiperOrigin-RevId: 251898704 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5f9e49dfa79..a1572815195 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "49b2bd65b165c0074c4a297513282418bb7e49e0120940187f7e0b529e6523fd", - git_commit = "1c0c9f2f6b7d6683c1aa16229ff9242c60ec760d", + sha256 = "5044554782257c269bd6b28e30560aa1d18ed36fe38c6dc52d4bb90c46009592", + git_commit = "dada3c36881425c5824ac6cf7389548b76a8c91c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b59626aea4bb426f37cf2f2bd6654beee3a0f4d3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Jun 2019 18:02:22 -0700 Subject: [PATCH 3228/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/664651f9-69f4-424f-9d5e-94e744e49c6f PiperOrigin-RevId: 251966300 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a1572815195..1e426582a4d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5044554782257c269bd6b28e30560aa1d18ed36fe38c6dc52d4bb90c46009592", - git_commit = "dada3c36881425c5824ac6cf7389548b76a8c91c", + sha256 = "a135c6ba808fe8dd4134aba0da688d78f74ac7ac4e0ba472428252d109274a50", + git_commit = "097a0bb3e53bbbaaf0f62f2b1f01a457eddcba41", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1a84a95c3f35ece784714f52ed0fa49febc2a20b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Jun 2019 00:02:01 -0700 Subject: [PATCH 3229/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f99bea1a-ffcc-4851-b2bc-d6a58bba1295 PiperOrigin-RevId: 251999195 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1e426582a4d..0f945d3540d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a135c6ba808fe8dd4134aba0da688d78f74ac7ac4e0ba472428252d109274a50", - git_commit = "097a0bb3e53bbbaaf0f62f2b1f01a457eddcba41", + sha256 = "4b27b8d3ede6f3fddf13fbcec0ab6eb88483ff27a2b705910000626cc2cae492", + git_commit = "f5003f6315273180968c52affde1ae5679e0fa2b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a0fa4ec2a214dddc871c509f2715f9a197ad234d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Jun 2019 06:02:04 -0700 Subject: [PATCH 3230/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/129bab68-0189-49ae-a10e-eef433560b6b PiperOrigin-RevId: 252035272 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0f945d3540d..28f24767ad5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4b27b8d3ede6f3fddf13fbcec0ab6eb88483ff27a2b705910000626cc2cae492", - git_commit = "f5003f6315273180968c52affde1ae5679e0fa2b", + sha256 = "87b3a3e350ee711b113ff44bf329b134b567dfd0024d877fbdecb7f51750433c", + git_commit = "034f7b2ff8209f8516f7c27ffce1b772c59b4305", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4f32b26546957aec09716d278dd4e18245f53243 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Jun 2019 12:02:30 -0700 Subject: [PATCH 3231/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/45dc6698-b3b9-47d4-9f8a-b8f736a66f01 PiperOrigin-RevId: 252092932 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 28f24767ad5..db7a2ff5244 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "87b3a3e350ee711b113ff44bf329b134b567dfd0024d877fbdecb7f51750433c", - git_commit = "034f7b2ff8209f8516f7c27ffce1b772c59b4305", + sha256 = "46dc5c33fb5ea78b9f680d4cf33aec010681dee75a46b9215b3a30d66ee5aa88", + git_commit = "03b3a0f38c84a87ecf53f92d6b3df549cae998ec", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c1b1b4051b4c4e9378e89d128dd6ef32929b6e32 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Jun 2019 18:01:53 -0700 Subject: [PATCH 3232/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d5ed694c-fa0c-434e-b938-f5ca3b9811ee PiperOrigin-RevId: 252153627 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index db7a2ff5244..048ed41a476 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "46dc5c33fb5ea78b9f680d4cf33aec010681dee75a46b9215b3a30d66ee5aa88", - git_commit = "03b3a0f38c84a87ecf53f92d6b3df549cae998ec", + sha256 = "f9852f18cf74e3b61ea252ba766c4bd529fdcba18e64fb8d56ac4b44366a4594", + git_commit = "6f4bc2c5157cd75bda73ea67a17e4aae92c8a78c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 274e144c5528816576b29f4bbcdfe94f47116d0b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 8 Jun 2019 00:03:06 -0700 Subject: [PATCH 3233/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/cbe98a53-143d-46bd-aa1f-2cb89edcad16 PiperOrigin-RevId: 252178302 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 048ed41a476..eaaed8e2fb8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f9852f18cf74e3b61ea252ba766c4bd529fdcba18e64fb8d56ac4b44366a4594", - git_commit = "6f4bc2c5157cd75bda73ea67a17e4aae92c8a78c", + sha256 = "38e82c3e928b33572012b373c26e1ee75a3ead96a6527c616a04a6d86e873bb5", + git_commit = "3040de13726b5f594a28dadaf02b2e1d23f2e223", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 380fade1c23d7c504eca8f89b71520bd564bd86a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 8 Jun 2019 06:02:27 -0700 Subject: [PATCH 3234/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c3e99f07-c570-4ed4-879e-fb14a1306f5d PiperOrigin-RevId: 252200693 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index eaaed8e2fb8..07c79c5be0b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "38e82c3e928b33572012b373c26e1ee75a3ead96a6527c616a04a6d86e873bb5", - git_commit = "3040de13726b5f594a28dadaf02b2e1d23f2e223", + sha256 = "b3b15cf335485ed275b160093f97557d18f2853f5b6203d766076236644b64bc", + git_commit = "1670b46c095e207cbb107133005d61c212f2366e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b2af0661ae4af26d7df652944cef492046c7828f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 8 Jun 2019 12:01:59 -0700 Subject: [PATCH 3235/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e7f73c24-0e6b-4595-b989-58e8908aba82 PiperOrigin-RevId: 252221202 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 07c79c5be0b..a888a5f0150 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b3b15cf335485ed275b160093f97557d18f2853f5b6203d766076236644b64bc", - git_commit = "1670b46c095e207cbb107133005d61c212f2366e", + sha256 = "9ed899ba27125bede303240895a5a88103444161b7c426ca025d70fba8caf41e", + git_commit = "62586ee15a27334e547060b258d48e321e120b6e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 84fc42987e3f63e5c0b063194755f9083cc48dcd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 8 Jun 2019 18:01:55 -0700 Subject: [PATCH 3236/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/65fdba4a-bf3a-4010-a6ed-584dbed4bc20 PiperOrigin-RevId: 252241522 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a888a5f0150..22c461bc685 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9ed899ba27125bede303240895a5a88103444161b7c426ca025d70fba8caf41e", - git_commit = "62586ee15a27334e547060b258d48e321e120b6e", + sha256 = "85022522c8cd6dbf244273bfcc1818d10ccf01d7ca57b004de02b3786593c52d", + git_commit = "09399c04bfb7637e1cb6f75b6aa9ab5257d31bf1", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5694e1545f7cd734085c3fb7538e1539f6a65c27 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 9 Jun 2019 00:02:00 -0700 Subject: [PATCH 3237/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/10104b79-050c-4cad-90e1-201aa1698fc7 PiperOrigin-RevId: 252261982 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 22c461bc685..5ea58139251 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "85022522c8cd6dbf244273bfcc1818d10ccf01d7ca57b004de02b3786593c52d", - git_commit = "09399c04bfb7637e1cb6f75b6aa9ab5257d31bf1", + sha256 = "887b57c85352f65dc175f1c0b7f6440951465c6a7255730e6f64b0d70b604731", + git_commit = "9044c884bbc91a897af05cd8bdfd7ec1e4689837", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1c52e92c67588478dff72b57e0e32066ad686363 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 9 Jun 2019 06:01:52 -0700 Subject: [PATCH 3238/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f9bb3fd5-deef-471a-a7ee-2025554e4324 PiperOrigin-RevId: 252284829 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5ea58139251..7039a111e73 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "887b57c85352f65dc175f1c0b7f6440951465c6a7255730e6f64b0d70b604731", - git_commit = "9044c884bbc91a897af05cd8bdfd7ec1e4689837", + sha256 = "a42bed7f62bbaac8af31243f614810ed23451c8ce2b069e39069ffc61bf6ed6d", + git_commit = "98e30b8748eb018f33836ac9269db67ab60483ab", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a971f4f55c4064c0f91367779a244d36bd912294 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 9 Jun 2019 18:02:09 -0700 Subject: [PATCH 3239/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/52992ede-ec4b-4db4-acb2-54199ce9c227 PiperOrigin-RevId: 252326328 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7039a111e73..dcca3cfcd8d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a42bed7f62bbaac8af31243f614810ed23451c8ce2b069e39069ffc61bf6ed6d", - git_commit = "98e30b8748eb018f33836ac9269db67ab60483ab", + sha256 = "08510eb9f4760627ff753025fae82c707a5a6957a111e4117570badd8fda96fb", + git_commit = "1ddcd63186d39746f34205cd6d5342f3892c9e1b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From bb9d2f9848ea7df54b38eda1fac19e650914be47 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Jun 2019 00:02:27 -0700 Subject: [PATCH 3240/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/04926870-636b-469a-b47c-13ee53c90b85 PiperOrigin-RevId: 252353016 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dcca3cfcd8d..52fe85d5e5c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "08510eb9f4760627ff753025fae82c707a5a6957a111e4117570badd8fda96fb", - git_commit = "1ddcd63186d39746f34205cd6d5342f3892c9e1b", + sha256 = "f7fa4b38607c8e612a9aac58a00a272269af4e109a07dd8c025aa0abf92be813", + git_commit = "b96f29ddf9571db1ba900b13c83941c6a8ca39c5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 988f627e4c74894327bbc8e92f586a960cb219c8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Jun 2019 06:01:50 -0700 Subject: [PATCH 3241/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bef91ea7-5e4c-4341-ab00-5727c3847182 PiperOrigin-RevId: 252389887 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 52fe85d5e5c..d1e34be3ec6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f7fa4b38607c8e612a9aac58a00a272269af4e109a07dd8c025aa0abf92be813", - git_commit = "b96f29ddf9571db1ba900b13c83941c6a8ca39c5", + sha256 = "0556ea80c5d762eadb190de48d09ad9dcf638b0040ba53177309fe6ce66ea486", + git_commit = "dac4bd775037b7b53cac98fbab2d8796fac627fc", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d546d315b0b1d963a90b1a3453985694f2a1f996 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Jun 2019 12:02:03 -0700 Subject: [PATCH 3242/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4d7335b7-e29d-444c-a263-241df7634daf PiperOrigin-RevId: 252454267 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d1e34be3ec6..eef2a9731f3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0556ea80c5d762eadb190de48d09ad9dcf638b0040ba53177309fe6ce66ea486", - git_commit = "dac4bd775037b7b53cac98fbab2d8796fac627fc", + sha256 = "55c924318ae8fe2c7602047e1677bdc6bb36a55588c6c727847a3f1bd41f9c1f", + git_commit = "b81e2151affb4a3389e832d7db3a2d66d46cb7ac", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 67b6a76b7a02d31ab16333e42a214264c19f535f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Jun 2019 18:01:56 -0700 Subject: [PATCH 3243/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b2433af8-8a26-44f6-a022-b25c5dd72c61 PiperOrigin-RevId: 252525149 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index eef2a9731f3..e5e3ab9db71 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "55c924318ae8fe2c7602047e1677bdc6bb36a55588c6c727847a3f1bd41f9c1f", - git_commit = "b81e2151affb4a3389e832d7db3a2d66d46cb7ac", + sha256 = "4c3d6252e827a63140f3dcf7c07c4b694171c81831b914ac778f1f3e6c62c884", + git_commit = "9f3cbdf0bc6bd8b840be3ed9271eb728faf46fe5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7b857f13fcf80df3fd340bba41275913894598bb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Jun 2019 00:02:10 -0700 Subject: [PATCH 3244/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/392441f0-1277-4f93-b60e-699b79764110 PiperOrigin-RevId: 252560409 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e5e3ab9db71..2b910b2afca 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4c3d6252e827a63140f3dcf7c07c4b694171c81831b914ac778f1f3e6c62c884", - git_commit = "9f3cbdf0bc6bd8b840be3ed9271eb728faf46fe5", + sha256 = "1d9325c717504483c8fc736ce0b6014fa021958d13d33373137546d4e00b5e77", + git_commit = "c148a2d7b8ac5a2535232c4c51e6a1c1fa9b82ce", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1cb3f88b4bcff65e4fee1cb185eb270a4b4c10a7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Jun 2019 06:02:23 -0700 Subject: [PATCH 3245/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/dec99567-18c7-4929-b35f-9934755a7eb5 PiperOrigin-RevId: 252602909 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2b910b2afca..9d34a8b14fe 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1d9325c717504483c8fc736ce0b6014fa021958d13d33373137546d4e00b5e77", - git_commit = "c148a2d7b8ac5a2535232c4c51e6a1c1fa9b82ce", + sha256 = "04832d789cba09ebd7598032b7532364fef3c7ee3d607bf38ab4b82db10b31ec", + git_commit = "517ad0e87f8d1f23aa68236bdc474188037347dc", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7b5d7ad62e98784f58a0a792b8ebca6d15492df7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Jun 2019 12:02:33 -0700 Subject: [PATCH 3246/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/809da501-4698-4723-b442-333dab7b4e72 PiperOrigin-RevId: 252669034 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9d34a8b14fe..729d4e15784 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "04832d789cba09ebd7598032b7532364fef3c7ee3d607bf38ab4b82db10b31ec", - git_commit = "517ad0e87f8d1f23aa68236bdc474188037347dc", + sha256 = "9a3d80ae5a0e69a23dd3eeefc7d340f2fa110548f3d72388c8582d4a3bd31d29", + git_commit = "bab8a19821ed0d7d4432bf84e5af79dc6523a09d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2719fe5f0f26cfc2e305214705f29ea11d0a9c29 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Jun 2019 18:02:27 -0700 Subject: [PATCH 3247/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2072f9d8-d24e-497d-b99e-0099b63407c6 PiperOrigin-RevId: 252737668 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 729d4e15784..8152b5294cc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9a3d80ae5a0e69a23dd3eeefc7d340f2fa110548f3d72388c8582d4a3bd31d29", - git_commit = "bab8a19821ed0d7d4432bf84e5af79dc6523a09d", + sha256 = "af1d85b0a735be24a222ac1d20f326e1394040122eadaab600e978c544e6c3c8", + git_commit = "a8ef9d93f00da9b5b3a04bf3d692df265fe5d0a0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 03e3fce607cd7bed73fc5ed881d922123f76ac2c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Jun 2019 00:02:04 -0700 Subject: [PATCH 3248/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d1b41a34-5d22-4d7e-8188-3534e13814ae PiperOrigin-RevId: 252768563 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8152b5294cc..d0a68752518 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "af1d85b0a735be24a222ac1d20f326e1394040122eadaab600e978c544e6c3c8", - git_commit = "a8ef9d93f00da9b5b3a04bf3d692df265fe5d0a0", + sha256 = "93488d4b4b3ef06090c8a42c5d5aafe2e73f47597f4102f79c4c0241872091d6", + git_commit = "127aae00a5d2c94045af5da772fed3173db42e69", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9bbde4b051b789c313b50d32451193fbb9f69ad7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Jun 2019 06:01:59 -0700 Subject: [PATCH 3249/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c418ad6e-297f-4949-90a5-1cd59c73c217 PiperOrigin-RevId: 252808855 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d0a68752518..33cd194dd6d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "93488d4b4b3ef06090c8a42c5d5aafe2e73f47597f4102f79c4c0241872091d6", - git_commit = "127aae00a5d2c94045af5da772fed3173db42e69", + sha256 = "996d81ab58f5e500cae8a88e0bf58bdadb70fa93d95d9c60c9da9f210cec34da", + git_commit = "60cf825663d5cac19a2ad39828b26986db7dc0b6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2052dce6a4472ac4fabcceea726f5276d86121ea Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Jun 2019 12:02:04 -0700 Subject: [PATCH 3250/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c55c5bc7-8cf8-43f6-88d4-e847dba278d4 PiperOrigin-RevId: 252871591 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 33cd194dd6d..755fec34b20 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "996d81ab58f5e500cae8a88e0bf58bdadb70fa93d95d9c60c9da9f210cec34da", - git_commit = "60cf825663d5cac19a2ad39828b26986db7dc0b6", + sha256 = "51ba19c33f38d9ed9d21610d8ec1233fc7921a5bb02fd75002b0c9cb23147488", + git_commit = "fa9fdb512d6fd8a36d4c9cbf3aacddeb1def633e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 07afcd852b8288f9fcc12f27fe81232f98c83817 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 Jun 2019 18:02:14 -0700 Subject: [PATCH 3251/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/88cc098f-13cf-4234-961c-113d89ae66dd PiperOrigin-RevId: 252938478 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 755fec34b20..beee8c8851b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "51ba19c33f38d9ed9d21610d8ec1233fc7921a5bb02fd75002b0c9cb23147488", - git_commit = "fa9fdb512d6fd8a36d4c9cbf3aacddeb1def633e", + sha256 = "5a77abaa3481d591e80c58faa742c910ff728fe7ca5da22f997eebac76090a58", + git_commit = "e06b84487ce9f7726e812bbee9e089f94025280f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6332c008a1f5cdb1f089a7bf302a3840e19dcb6f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Jun 2019 00:02:54 -0700 Subject: [PATCH 3252/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/acad102e-2629-40a4-87ea-5a40ff82dec1 PiperOrigin-RevId: 252973301 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index beee8c8851b..39e768f412e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5a77abaa3481d591e80c58faa742c910ff728fe7ca5da22f997eebac76090a58", - git_commit = "e06b84487ce9f7726e812bbee9e089f94025280f", + sha256 = "7978b9c2de2120671d1be164ee4557d353558ac0c2cce1b7a7f4589d5605e984", + git_commit = "71f9f0cf0502656473dea3613133a137c22a45ab", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 91bf584c452494dd1e62eed0f6d1da8a47df030b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Jun 2019 06:02:02 -0700 Subject: [PATCH 3253/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/52753268-ad32-44fd-926b-427f1130a1fc PiperOrigin-RevId: 253012949 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 39e768f412e..1a8df4152dd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7978b9c2de2120671d1be164ee4557d353558ac0c2cce1b7a7f4589d5605e984", - git_commit = "71f9f0cf0502656473dea3613133a137c22a45ab", + sha256 = "9c746ba118769f426b10de54c914fc4a84a3363e4b0304072563785a39598730", + git_commit = "16b680525b3ac35fc26041395164dffa952f2fde", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 565f06e847fc6ef1df6f4f6e4d6b4e6c0707cbeb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Jun 2019 12:05:38 -0700 Subject: [PATCH 3254/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/90d28149-a044-4c40-85b8-7cf9070426c3 PiperOrigin-RevId: 253078630 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1a8df4152dd..e44540b1f49 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9c746ba118769f426b10de54c914fc4a84a3363e4b0304072563785a39598730", - git_commit = "16b680525b3ac35fc26041395164dffa952f2fde", + sha256 = "228422f34eac144daf2270135d5e2d4e0ff4c3f78bd5c84562fed27fa4dab5b7", + git_commit = "824fab41c003276a15c30b73d6deb71f65a6d842", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c334dc59f231bc7ca13f1683b71264fff118de6d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Jun 2019 18:02:17 -0700 Subject: [PATCH 3255/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5e7066a4-100a-4311-ade2-8fed2003a5ed PiperOrigin-RevId: 253143317 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e44540b1f49..24c8c5fab6d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "228422f34eac144daf2270135d5e2d4e0ff4c3f78bd5c84562fed27fa4dab5b7", - git_commit = "824fab41c003276a15c30b73d6deb71f65a6d842", + sha256 = "0f0ed2d8a13f17a0db436a45ee57c3263c8c771d6704472b49e161b1fcc6c3ef", + git_commit = "9a9aefeec982f99e7548e99f3a4fdfb1b44b7d19", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f43517d35e11153426b133ebdc8d07bbf31e3c2d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Jun 2019 00:02:33 -0700 Subject: [PATCH 3256/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/34dae4c9-4632-4520-8253-84eed6569c01 PiperOrigin-RevId: 253176449 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 24c8c5fab6d..2cb16055b57 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0f0ed2d8a13f17a0db436a45ee57c3263c8c771d6704472b49e161b1fcc6c3ef", - git_commit = "9a9aefeec982f99e7548e99f3a4fdfb1b44b7d19", + sha256 = "e239f3251e58a7aee1188d0e05e7b033a3574e910b7980be6500454e16fb2de0", + git_commit = "1bbc7ef9a88656e6289f4190264430891fa8ead3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 314c0c1043c3b652bd4a816d7f43cef131b25e62 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Jun 2019 06:02:21 -0700 Subject: [PATCH 3257/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/89eca951-73f9-4466-b796-e0e3e5fe6fc0 PiperOrigin-RevId: 253214709 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2cb16055b57..63371e3ab2b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e239f3251e58a7aee1188d0e05e7b033a3574e910b7980be6500454e16fb2de0", - git_commit = "1bbc7ef9a88656e6289f4190264430891fa8ead3", + sha256 = "98d10957b8310f74a916cd281a52d8da72516e76193817bb1a9a87fa1277939c", + git_commit = "76e256261ba4feee18aeb9a2e69d3d5c861ad976", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 90cb1608e797f92757793a029053646af0c29157 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Jun 2019 12:03:24 -0700 Subject: [PATCH 3258/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4dfd8a8c-0797-4868-b266-e1f82ea64dc8 PiperOrigin-RevId: 253271502 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 63371e3ab2b..1be225dc7a0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "98d10957b8310f74a916cd281a52d8da72516e76193817bb1a9a87fa1277939c", - git_commit = "76e256261ba4feee18aeb9a2e69d3d5c861ad976", + sha256 = "b6ad187faa1bcb4ef97990ed6e9b3b3093f74c75cd7973726f1b975b05d39fea", + git_commit = "012e7ec174d957b93859b24b6fedd56fe4060371", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b986124c15f27c806c5c9d067fe3281810f7f021 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Jun 2019 18:10:37 -0700 Subject: [PATCH 3259/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1a4eba5a-3f1c-48fb-aa9d-cbf7cd929625 PiperOrigin-RevId: 253331367 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1be225dc7a0..408401b1917 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b6ad187faa1bcb4ef97990ed6e9b3b3093f74c75cd7973726f1b975b05d39fea", - git_commit = "012e7ec174d957b93859b24b6fedd56fe4060371", + sha256 = "c7bb8d1d56edc28c6966ac0e73abc362b589c29fd8e6f125c9b25cbf2a492188", + git_commit = "58ed949448b57f75d4644826e920069f0c3cf7bd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5b086f08bd9700ec50110040963d85b411cb470d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 15 Jun 2019 00:02:42 -0700 Subject: [PATCH 3260/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4ea53663-04a9-4236-879c-5ae4df92c23e PiperOrigin-RevId: 253355663 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 408401b1917..6cbfe76fed8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c7bb8d1d56edc28c6966ac0e73abc362b589c29fd8e6f125c9b25cbf2a492188", - git_commit = "58ed949448b57f75d4644826e920069f0c3cf7bd", + sha256 = "5e7a072a281323f8b85911323fd73c9e388d3efdf6cabc46294a982d60e6d279", + git_commit = "3363047f97d0f905444ec6fff1e8e626a91e7db1", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6448ed941a5ffc89ddc4994d0af51d49313a63ec Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 15 Jun 2019 06:13:59 -0700 Subject: [PATCH 3261/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/62d09066-d85b-4bc6-8601-8e1b9fb2048d PiperOrigin-RevId: 253377733 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6cbfe76fed8..5712e543126 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5e7a072a281323f8b85911323fd73c9e388d3efdf6cabc46294a982d60e6d279", - git_commit = "3363047f97d0f905444ec6fff1e8e626a91e7db1", + sha256 = "ba9d09f7aed8240b7ab654e1e27c5b938fec3ba3756afab331125562b8651e66", + git_commit = "a44d3850495ea2d36e118c6256eaf9207294de38", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0c4ea4eda63c15fd2800f9aff1bb323ad5a080c3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 15 Jun 2019 12:02:10 -0700 Subject: [PATCH 3262/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d05bb5b6-6e9d-4df9-acbd-ef03942582ca PiperOrigin-RevId: 253395576 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5712e543126..4ad129c7ac4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ba9d09f7aed8240b7ab654e1e27c5b938fec3ba3756afab331125562b8651e66", - git_commit = "a44d3850495ea2d36e118c6256eaf9207294de38", + sha256 = "de00df1d88d049809fee968f2aa4c7abc06a5a25fd39b398aff1d9dc811789a0", + git_commit = "cee1b62d2d249bb476ee04046b1150ae8337af6f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4e8a6a23065c4d54366ec178bd3e6d26c3069040 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 15 Jun 2019 18:02:00 -0700 Subject: [PATCH 3263/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1827fa21-8d97-42a5-bd49-8e46d1eb6679 PiperOrigin-RevId: 253415364 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4ad129c7ac4..e1d75512d01 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "de00df1d88d049809fee968f2aa4c7abc06a5a25fd39b398aff1d9dc811789a0", - git_commit = "cee1b62d2d249bb476ee04046b1150ae8337af6f", + sha256 = "072d5f5db9f70095a4d088f895c40625296c30eebb83f4640d93e117409bcb85", + git_commit = "da7e562ea5eaea8b92148c3ae9e3f92eb31e2555", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 39f52d6052cade2ace0c5a273bb0d7edf6064445 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 16 Jun 2019 00:02:45 -0700 Subject: [PATCH 3264/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8f0eb040-40a1-4659-bb73-441d9867fc0c PiperOrigin-RevId: 253435019 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e1d75512d01..401296ca75c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "072d5f5db9f70095a4d088f895c40625296c30eebb83f4640d93e117409bcb85", - git_commit = "da7e562ea5eaea8b92148c3ae9e3f92eb31e2555", + sha256 = "fc25de7059c8f4a066044ed7d534e2e83a58d366816954aab5c3e6ef3c36141a", + git_commit = "6a96e865fa9d199e8d9ae10ae110ef797ddd058e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 046ffc6059b4edc97d75f4056634f4a7a350bb19 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 16 Jun 2019 06:02:24 -0700 Subject: [PATCH 3265/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bebd0142-9dea-4705-8557-835d3ab69888 PiperOrigin-RevId: 253457111 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 401296ca75c..4d6b518e9f1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fc25de7059c8f4a066044ed7d534e2e83a58d366816954aab5c3e6ef3c36141a", - git_commit = "6a96e865fa9d199e8d9ae10ae110ef797ddd058e", + sha256 = "01294b3afaf962f4900517af69c0d4473b33f172070dc2fb4be99220d38e9e42", + git_commit = "42817ba3493b476e89fd70ecb4b20c203c4321cd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From dd5647b48815be35d18bd189ab17a892dfc8b611 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Jun 2019 00:02:17 -0700 Subject: [PATCH 3266/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/82b40273-4570-4a04-bdce-4157e09ef259 PiperOrigin-RevId: 253522701 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4d6b518e9f1..9284d10c9f9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "01294b3afaf962f4900517af69c0d4473b33f172070dc2fb4be99220d38e9e42", - git_commit = "42817ba3493b476e89fd70ecb4b20c203c4321cd", + sha256 = "bc6f191c50d389f435c035412d39818446221b8d8f324324461ebb794b7308be", + git_commit = "a650bdc7e68285179da8abc310d5ffda268230a9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ce10b25ea2bb4a1e72e4738365becb39f0b8bee9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Jun 2019 06:02:37 -0700 Subject: [PATCH 3267/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d8110f29-1cea-4d19-b252-cbafaec9719e PiperOrigin-RevId: 253564682 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9284d10c9f9..e170744ac1e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bc6f191c50d389f435c035412d39818446221b8d8f324324461ebb794b7308be", - git_commit = "a650bdc7e68285179da8abc310d5ffda268230a9", + sha256 = "8d18e422e3666c67b292e6aa8ba262727f95cb93069c42be31006c38fe8e57d8", + git_commit = "ee17b07b70310466214894cf73a206e71b990660", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e6d91e72f7593be36dda933b3291c7ebbc646fa6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Jun 2019 10:28:06 -0700 Subject: [PATCH 3268/8103] Add the option to allow assigning labels to unavailable models in open source model server. Related requirement: https://github.com/tensorflow/serving/issues/1230 PiperOrigin-RevId: 253608109 --- tensorflow_serving/model_servers/main.cc | 5 ++ tensorflow_serving/model_servers/server.cc | 2 + tensorflow_serving/model_servers/server.h | 1 + .../model_servers/server_core.cc | 22 ++++- .../model_servers/server_core.h | 9 +- .../model_servers/server_core_test.cc | 84 +++++++++++++++++++ 6 files changed, 119 insertions(+), 4 deletions(-) diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index e37fd1cb05c..dcf3110d710 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -74,6 +74,11 @@ int main(int argc, char** argv) { "Timeout for HTTP/REST API calls."), tensorflow::Flag("enable_batching", &options.enable_batching, "enable batching"), + tensorflow::Flag( + "allow_version_labels_for_unavailable_models", + &options.allow_version_labels_for_unavailable_models, + "If true, allows assigning unused version labels to models that are " + "not available yet."), tensorflow::Flag("batching_parameters_file", &options.batching_parameters_file, "If non-empty, read an ascii BatchingParameters " diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index d0cd970615a..5b7077015d2 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -275,6 +275,8 @@ Status Server::BuildAndStart(const Options& server_options) { options.file_system_poll_wait_seconds = server_options.file_system_poll_wait_seconds; options.flush_filesystem_caches = server_options.flush_filesystem_caches; + options.allow_version_labels_for_unavailable_models = + server_options.allow_version_labels_for_unavailable_models; TF_RETURN_IF_ERROR(ServerCore::Create(std::move(options), &server_core_)); diff --git a/tensorflow_serving/model_servers/server.h b/tensorflow_serving/model_servers/server.h index 4fe15908924..cf082895ce5 100644 --- a/tensorflow_serving/model_servers/server.h +++ b/tensorflow_serving/model_servers/server.h @@ -52,6 +52,7 @@ class Server { // Model Server options. // bool enable_batching = false; + bool allow_version_labels_for_unavailable_models = false; float per_process_gpu_memory_fraction = 0; tensorflow::string batching_parameters_file; tensorflow::string model_name; diff --git a/tensorflow_serving/model_servers/server_core.cc b/tensorflow_serving/model_servers/server_core.cc index 6df17fdd474..cdc1e7e834e 100644 --- a/tensorflow_serving/model_servers/server_core.cc +++ b/tensorflow_serving/model_servers/server_core.cc @@ -500,11 +500,23 @@ Status ServerCore::UpdateModelVersionLabelMap() { const string& label = entry.first; const int64 version = entry.second; + bool contains_existing_label_with_different_version = false; + int64 existing_version; + if (GetModelVersionForLabel(model_config.name(), label, &existing_version) + .ok() && + existing_version != version) { + contains_existing_label_with_different_version = true; + } + bool allow_version_labels_for_unavailable_models = + options_.allow_version_labels_for_unavailable_models && + (!contains_existing_label_with_different_version); + // Verify that the label points to a version that is currently available. auto serving_states_it = serving_states.find(version); - if (serving_states_it == serving_states.end() || - serving_states_it->second.state.manager_state != - ServableState::ManagerState::kAvailable) { + if (!allow_version_labels_for_unavailable_models && + (serving_states_it == serving_states.end() || + serving_states_it->second.state.manager_state != + ServableState::ManagerState::kAvailable)) { return errors::FailedPrecondition(strings::StrCat( "Request to assign label to version ", version, " of model ", model_config.name(), @@ -773,6 +785,10 @@ Status ServerCore::GetModelVersionForLabel(const string& model_name, const string& label, int64* version) const { mutex_lock l(model_labels_to_versions_mu_); + if (model_labels_to_versions_ == nullptr) { + return errors::Unavailable( + strings::StrCat("Model labels does not init yet.", label)); + } auto version_map_it = model_labels_to_versions_->find(model_name); if (version_map_it != model_labels_to_versions_->end()) { const std::map& version_map = version_map_it->second; diff --git a/tensorflow_serving/model_servers/server_core.h b/tensorflow_serving/model_servers/server_core.h index db447455e8c..2bce25a7432 100644 --- a/tensorflow_serving/model_servers/server_core.h +++ b/tensorflow_serving/model_servers/server_core.h @@ -174,6 +174,10 @@ class ServerCore : public Manager { // Callback to be called just before a servable is to be loaded. This will // called on the same manager load thread which starts the load. PreLoadHook pre_load_hook; + + // Whether to allow assigning unused version labels to models that are not + // available yet. + bool allow_version_labels_for_unavailable_models = false; }; virtual ~ServerCore() = default; @@ -347,7 +351,10 @@ class ServerCore : public Manager { EXCLUSIVE_LOCKS_REQUIRED(config_mu_); // Updates 'model_labels_to_versions_' based on 'config_'. Throws an error if - // requesting to assign a label to a version not in state kAvailable. + // requesting to assign an existing label to a version not in state + // kAvailable. For a new version label, it can be assigned to a version that + // is not in state kAvailable yet if + // allow_version_labels_for_unavailable_models is true. Status UpdateModelVersionLabelMap() EXCLUSIVE_LOCKS_REQUIRED(config_mu_) LOCKS_EXCLUDED(model_labels_to_versions_mu_); diff --git a/tensorflow_serving/model_servers/server_core_test.cc b/tensorflow_serving/model_servers/server_core_test.cc index f64416329e2..de6e282e4f0 100644 --- a/tensorflow_serving/model_servers/server_core_test.cc +++ b/tensorflow_serving/model_servers/server_core_test.cc @@ -768,6 +768,90 @@ TEST_P(ServerCoreTest, AssignLabelToUnavailableVersion) { ::testing::HasSubstr("not currently available for inference")); } +TEST_P(ServerCoreTest, AssignLabelToUnavailableVersionAllowed) { + ModelServerConfig two_version_config = + GetTestModelServerConfigForFakePlatform(); + SwitchToHalfPlusTwoWith2Versions(&two_version_config); + ServerCore::Options server_core_options = GetDefaultOptions(); + server_core_options.allow_version_labels = true; + server_core_options.allow_version_labels_for_unavailable_models = true; + std::unique_ptr server_core; + TF_ASSERT_OK(CreateServerCore(two_version_config, + std::move(server_core_options), &server_core)); + + const std::set aspired_versions = {test_util::kTestModelVersion, + test_util::kTestModelLargerVersion}; + const int64 bogus_version = 777; + for (const int64 aspired_version : aspired_versions) { + ASSERT_NE(bogus_version, aspired_version); + } + + // Wait until both aspired versions of the servable have been loaded. + for (const int64 aspired_version : aspired_versions) { + const auto servable_id = + ServableId{test_util::kTestModelName, aspired_version}; + test_util::WaitUntilServableManagerStateIsOneOf( + *server_core->servable_state_monitor(), servable_id, + {ServableState::ManagerState::kAvailable}); + } + + // Attempt to assign a label to a version that isn't one of the loaded ones. + ASSERT_EQ(1, two_version_config.model_config_list().config().size()); + ModelConfig* model_config = + two_version_config.mutable_model_config_list()->mutable_config(0); + (*model_config->mutable_version_labels())["nice try"] = bogus_version; + Status status = server_core->ReloadConfig(two_version_config); + EXPECT_TRUE(status.ok()); +} + +TEST_P(ServerCoreTest, AssignExistingLabelToUnavailableVersion) { + ModelServerConfig two_version_config = + GetTestModelServerConfigForFakePlatform(); + SwitchToHalfPlusTwoWith2Versions(&two_version_config); + ServerCore::Options server_core_options = GetDefaultOptions(); + server_core_options.allow_version_labels = true; + server_core_options.allow_version_labels_for_unavailable_models = true; + std::unique_ptr server_core; + TF_ASSERT_OK(CreateServerCore(two_version_config, + std::move(server_core_options), &server_core)); + + const std::set aspired_versions = {test_util::kTestModelVersion, + test_util::kTestModelLargerVersion}; + const int64 bogus_version = 777; + for (const int64 aspired_version : aspired_versions) { + ASSERT_NE(bogus_version, aspired_version); + } + + // Wait until both aspired versions of the servable have been loaded. + for (const int64 aspired_version : aspired_versions) { + const auto servable_id = + ServableId{test_util::kTestModelName, aspired_version}; + test_util::WaitUntilServableManagerStateIsOneOf( + *server_core->servable_state_monitor(), servable_id, + {ServableState::ManagerState::kAvailable}); + } + + // Assign labels to the two versions of the model. + ASSERT_EQ(1, two_version_config.model_config_list().config().size()); + ModelConfig* model_config = + two_version_config.mutable_model_config_list()->mutable_config(0); + (*model_config->mutable_version_labels())["A"] = test_util::kTestModelVersion; + (*model_config->mutable_version_labels())["B"] = + test_util::kTestModelLargerVersion; + TF_ASSERT_OK(server_core->ReloadConfig(two_version_config)); + + // Attempt to assign an exsiting label to a different version that isn't + // one of the loaded ones. + ASSERT_EQ(1, two_version_config.model_config_list().config().size()); + model_config = + two_version_config.mutable_model_config_list()->mutable_config(0); + (*model_config->mutable_version_labels())["A"] = bogus_version; + Status status = server_core->ReloadConfig(two_version_config); + ASSERT_FALSE(status.ok()); + EXPECT_THAT(status.ToString(), + ::testing::HasSubstr("not currently available for inference")); +} + TEST_P(ServerCoreTest, VersionLabelsNotAllowed) { ServerCore::Options server_core_options = GetDefaultOptions(); server_core_options.allow_version_labels = false; From 9f1df3175412ee8ed4e19abf876c2a57e8d4d345 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Jun 2019 12:01:53 -0700 Subject: [PATCH 3269/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8e4875c9-ed44-4851-847f-51958d61e5d5 PiperOrigin-RevId: 253630213 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e170744ac1e..2914ea9ebc8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8d18e422e3666c67b292e6aa8ba262727f95cb93069c42be31006c38fe8e57d8", - git_commit = "ee17b07b70310466214894cf73a206e71b990660", + sha256 = "94e55b7e13ce8a8db6a6079589c0acf72bfde56fd230e5c3816a6a0bd5d62b2a", + git_commit = "531a5fb4be643f804f1762c91d18b98811c4576f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3b4804de6b03ebd3c1b1e00c8729bad358555768 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Jun 2019 18:02:08 -0700 Subject: [PATCH 3270/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c677fb28-5465-4864-a94d-57fac2cd6b96 PiperOrigin-RevId: 253699802 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2914ea9ebc8..9b9f744abf4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "94e55b7e13ce8a8db6a6079589c0acf72bfde56fd230e5c3816a6a0bd5d62b2a", - git_commit = "531a5fb4be643f804f1762c91d18b98811c4576f", + sha256 = "a11cb90acc30226f0007413225263688cf4567853eaeddcb125b786990392a83", + git_commit = "e0a8cff732b87516582e33592475e333414ad346", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a2b0d095f2a0671bdf7206335b817a0af86b79e5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Jun 2019 00:02:27 -0700 Subject: [PATCH 3271/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/05d8c95c-8f76-42f5-8208-23f210b822bf PiperOrigin-RevId: 253734513 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9b9f744abf4..956a059a6f5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a11cb90acc30226f0007413225263688cf4567853eaeddcb125b786990392a83", - git_commit = "e0a8cff732b87516582e33592475e333414ad346", + sha256 = "d604957c416c68794b59510f8f6a5137af3af7523475cc51cab7012ba7f5d0ac", + git_commit = "e906cdde1b8e52d359a1d07e2f11948dd5b9ae81", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b33c9e6601d7cba9f66e419bf2736a50f4d395fc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Jun 2019 06:02:21 -0700 Subject: [PATCH 3272/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b683b510-1919-4da4-a626-55b3bfc70a66 PiperOrigin-RevId: 253774543 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 956a059a6f5..9ebc6f59a51 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d604957c416c68794b59510f8f6a5137af3af7523475cc51cab7012ba7f5d0ac", - git_commit = "e906cdde1b8e52d359a1d07e2f11948dd5b9ae81", + sha256 = "472588b8b9a65743c610c21d522f874b10070f8aa27ea8576d40a33eca5bbc06", + git_commit = "eee66882d07eb7cec20478049335211dd38b0b00", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5c7994d336080115adc8c6cae742ea805de943f7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Jun 2019 12:02:41 -0700 Subject: [PATCH 3273/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/148fca4c-d0e5-48a1-b06f-043105cbdf8f PiperOrigin-RevId: 253838028 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9ebc6f59a51..a0c11ce7327 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "472588b8b9a65743c610c21d522f874b10070f8aa27ea8576d40a33eca5bbc06", - git_commit = "eee66882d07eb7cec20478049335211dd38b0b00", + sha256 = "f8c514f70ebf7e85063b8eb90dd7a032e53fb521434a53d83b990f0f83d5d1b3", + git_commit = "15ee31b6609d54850fa09a7a5e0727db889157af", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1a25f48d19404a617200eb14576e8295301d9f2d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Jun 2019 18:02:23 -0700 Subject: [PATCH 3274/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/09cdf21b-ff58-48a4-a10a-1a207439a3b0 PiperOrigin-RevId: 253907368 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a0c11ce7327..cdc614bb3cb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f8c514f70ebf7e85063b8eb90dd7a032e53fb521434a53d83b990f0f83d5d1b3", - git_commit = "15ee31b6609d54850fa09a7a5e0727db889157af", + sha256 = "f762755ade0a7984e245f453a4ee59a07a7946953ab03f1b17428ce47c2c4033", + git_commit = "71a976a55f31e5d4aebbfa2236412193119417ec", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 02b1d1bfca5bf3d18f94b063b49a8cac319e77fe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 19 Jun 2019 00:02:05 -0700 Subject: [PATCH 3275/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/77fff24a-36ad-4aa5-8153-f078fc73c959 PiperOrigin-RevId: 253941226 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cdc614bb3cb..ffb32c99345 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f762755ade0a7984e245f453a4ee59a07a7946953ab03f1b17428ce47c2c4033", - git_commit = "71a976a55f31e5d4aebbfa2236412193119417ec", + sha256 = "583dfb44076c7d2957c989800740033a6906510408188f862669d19c77edf12a", + git_commit = "2c171cdb265f73a7cd4b101147ce9dee19edc48d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9760e7d272350bb4972a05f09fcbde103cc72b73 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 19 Jun 2019 06:02:41 -0700 Subject: [PATCH 3276/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/dfd1238d-8f75-4910-9316-56d80e72264c PiperOrigin-RevId: 253981509 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ffb32c99345..7acdc860768 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "583dfb44076c7d2957c989800740033a6906510408188f862669d19c77edf12a", - git_commit = "2c171cdb265f73a7cd4b101147ce9dee19edc48d", + sha256 = "d60941531b7aef520298e89d779457a0fee20e7bcaf51c1ab9e9e4bffdd8b016", + git_commit = "1d589da7852a4a61ae6135876e6db53c7be33b89", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c3eeed4f245e43f6cf92329d251e2b9d6255d6e5 Mon Sep 17 00:00:00 2001 From: Pedram Pejman Date: Thu, 20 Jun 2019 05:01:07 -0700 Subject: [PATCH 3277/8103] Adds ability to poll filesystem for new config to model server Fixes https://github.com/tensorflow/serving/issues/1301 PiperOrigin-RevId: 254174891 --- tensorflow_serving/model_servers/BUILD | 1 + tensorflow_serving/model_servers/main.cc | 7 + tensorflow_serving/model_servers/server.cc | 94 +++++++++----- tensorflow_serving/model_servers/server.h | 10 ++ .../model_servers/server_core.h | 4 +- .../tensorflow_model_server_test.py | 122 +++++++++++++++++- 6 files changed, 198 insertions(+), 40 deletions(-) diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index c5bad66d919..a90fb8296aa 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -330,6 +330,7 @@ cc_library( "//tensorflow_serving/config:model_server_config_proto", "//tensorflow_serving/config:monitoring_config_proto", "//tensorflow_serving/config:ssl_config_proto", + "//tensorflow_serving/config:platform_config_proto", "//tensorflow_serving/core:availability_preserving_policy", "//tensorflow_serving/servables/tensorflow:session_bundle_config_proto", ] + TENSORFLOW_DEPS + SUPPORTED_TENSORFLOW_OPS, diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index dcf3110d710..7a737f685a4 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -91,6 +91,13 @@ int main(int argc, char** argv) { "specify multiple models to serve and other advanced " "parameters including non-default version policy. (If " "used, --model_name, --model_base_path are ignored.)"), + tensorflow::Flag("model_config_file_poll_wait_seconds", + &options.fs_model_config_poll_wait_seconds, + "Interval in seconds between each poll of the filesystem" + "for model_config_file. If unset or set to zero, " + "poll will be done exactly once and not periodically. " + "Setting this to negative is reserved for testing " + "purposes only."), tensorflow::Flag("model_name", &options.model_name, "name of model (ignored " "if --model_config_file flag is set)"), diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index 5b7077015d2..ff236bbf9b9 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -16,6 +16,7 @@ limitations under the License. #include "tensorflow_serving/model_servers/server.h" #include + #include #include #include @@ -30,6 +31,8 @@ limitations under the License. #include "absl/memory/memory.h" #include "tensorflow/c/c_api.h" #include "tensorflow/cc/saved_model/tag_constants.h" +#include "tensorflow/core/lib/core/errors.h" +#include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/lib/strings/numbers.h" #include "tensorflow/core/lib/strings/str_util.h" #include "tensorflow/core/platform/env.h" @@ -37,6 +40,7 @@ limitations under the License. #include "tensorflow/core/protobuf/config.pb.h" #include "tensorflow_serving/config/model_server_config.pb.h" #include "tensorflow_serving/config/monitoring_config.pb.h" +#include "tensorflow_serving/config/platform_config.pb.h" #include "tensorflow_serving/config/ssl_config.pb.h" #include "tensorflow_serving/core/availability_preserving_policy.h" #include "tensorflow_serving/model_servers/grpc_status_util.h" @@ -51,16 +55,15 @@ namespace main { namespace { -tensorflow::Status ParseProtoTextFile(const string& file, - google::protobuf::Message* message) { +template +tensorflow::Status ParseProtoTextFile(const string& file, ProtoType* proto) { std::unique_ptr file_data; TF_RETURN_IF_ERROR( tensorflow::Env::Default()->NewReadOnlyMemoryRegionFromFile(file, &file_data)); string file_data_str(static_cast(file_data->data()), file_data->length()); - if (tensorflow::protobuf::TextFormat::ParseFromString(file_data_str, - message)) { + if (tensorflow::protobuf::TextFormat::ParseFromString(file_data_str, proto)) { return tensorflow::Status::OK(); } else { return tensorflow::errors::InvalidArgument("Invalid protobuf file: '", file, @@ -91,12 +94,6 @@ ModelServerConfig BuildSingleModelConfig(const string& model_name, return config; } -template -ProtoType ReadProtoFromFile(const string& file) { - ProtoType proto; - TF_CHECK_OK(ParseProtoTextFile(file, &proto)); - return proto; -} // gRPC Channel Arguments to be passed from command line to gRPC ServerBuilder. struct GrpcChannelArgument { @@ -119,21 +116,6 @@ std::vector parseGrpcChannelArgs( return result; } -// Parses an ascii PlatformConfigMap protobuf from 'file'. -tensorflow::serving::PlatformConfigMap ParsePlatformConfigMap( - const string& file) { - tensorflow::serving::PlatformConfigMap platform_config_map; - TF_CHECK_OK(ParseProtoTextFile(file, &platform_config_map)); - return platform_config_map; -} - -// Parses an ascii SSLConfig protobuf from 'file'. -SSLConfig ParseSSLConfig(const string& file) { - SSLConfig ssl_config; - TF_CHECK_OK(ParseProtoTextFile(file, &ssl_config)); - return ssl_config; -} - // If 'ssl_config_file' is non-empty, build secure server credentials otherwise // insecure channel std::shared_ptr<::grpc::ServerCredentials> @@ -142,7 +124,8 @@ BuildServerCredentialsFromSSLConfigFile(const string& ssl_config_file) { return ::grpc::InsecureServerCredentials(); } - SSLConfig ssl_config = ParseSSLConfig(ssl_config_file); + SSLConfig ssl_config; + TF_CHECK_OK(ParseProtoTextFile(ssl_config_file, &ssl_config)); ::grpc::SslServerCredentialsOptions ssl_ops( ssl_config.client_verify() @@ -169,7 +152,30 @@ Server::Options::Options() : model_name("default"), saved_model_tags(tensorflow::kSavedModelTagServe) {} -Server::~Server() { WaitForTermination(); } +Server::~Server() { + // Note: Deletion of 'fs_polling_thread_' will block until our underlying + // thread closure stops. Hence, destruction of this object will not proceed + // until the thread has terminated. + fs_config_polling_thread_.reset(); + WaitForTermination(); +} + +void Server::PollFilesystemAndReloadConfig(const string& config_file_path) { + ModelServerConfig config; + const Status read_status = + ParseProtoTextFile(config_file_path, &config); + if (!read_status.ok()) { + LOG(ERROR) << "Failed to read ModelServerConfig file: " + << read_status.error_message(); + return; + } + + const Status reload_status = server_core_->ReloadConfig(config); + if (!reload_status.ok()) { + LOG(ERROR) << "PollFilesystemAndReloadConfig failed to ReloadConfig: " + << reload_status.error_message(); + } +} Status Server::BuildAndStart(const Options& server_options) { const bool use_saved_model = true; @@ -194,8 +200,8 @@ Status Server::BuildAndStart(const Options& server_options) { options.model_server_config = BuildSingleModelConfig( server_options.model_name, server_options.model_base_path); } else { - options.model_server_config = - ReadProtoFromFile(server_options.model_config_file); + TF_RETURN_IF_ERROR(ParseProtoTextFile( + server_options.model_config_file, &options.model_server_config)); } if (server_options.platform_config_file.empty()) { @@ -208,8 +214,8 @@ Status Server::BuildAndStart(const Options& server_options) { batching_parameters->mutable_thread_pool_name()->set_value( "model_server_batch_threads"); } else { - *batching_parameters = ReadProtoFromFile( - server_options.batching_parameters_file); + TF_RETURN_IF_ERROR(ParseProtoTextFile( + server_options.batching_parameters_file, batching_parameters)); } } else if (!server_options.batching_parameters_file.empty()) { return errors::InvalidArgument( @@ -262,8 +268,8 @@ Status Server::BuildAndStart(const Options& server_options) { options.platform_config_map = CreateTensorFlowPlatformConfigMap( session_bundle_config, use_saved_model); } else { - options.platform_config_map = - ParsePlatformConfigMap(server_options.platform_config_file); + TF_RETURN_IF_ERROR(ParseProtoTextFile( + server_options.platform_config_file, &options.platform_config_map)); } options.custom_model_config_loader = &LoadCustomModelConfig; @@ -280,6 +286,24 @@ Status Server::BuildAndStart(const Options& server_options) { TF_RETURN_IF_ERROR(ServerCore::Create(std::move(options), &server_core_)); + // Model config polling thread must be started after the call to + // ServerCore::Create() to prevent config reload being done concurrently from + // Create() and the poll thread. + if (server_options.fs_model_config_poll_wait_seconds > 0 && + !server_options.model_config_file.empty()) { + PeriodicFunction::Options pf_options; + pf_options.thread_name_prefix = "Server_fs_model_config_poll_thread"; + + const string model_config_file = server_options.model_config_file; + fs_config_polling_thread_.reset(new PeriodicFunction( + [this, model_config_file] { + this->PollFilesystemAndReloadConfig(model_config_file); + }, + server_options.fs_model_config_poll_wait_seconds * + tensorflow::EnvTime::kSecondsToMicros, + pf_options)); + } + // 0.0.0.0" is the way to listen on localhost in gRPC. const string server_address = "0.0.0.0:" + std::to_string(server_options.grpc_port); @@ -335,8 +359,8 @@ Status Server::BuildAndStart(const Options& server_options) { "localhost:" + std::to_string(server_options.http_port); MonitoringConfig monitoring_config; if (!server_options.monitoring_config_file.empty()) { - monitoring_config = ReadProtoFromFile( - server_options.monitoring_config_file); + TF_RETURN_IF_ERROR(ParseProtoTextFile( + server_options.monitoring_config_file, &monitoring_config)); } http_server_ = CreateAndStartHttpServer( server_options.http_port, server_options.http_num_threads, diff --git a/tensorflow_serving/model_servers/server.h b/tensorflow_serving/model_servers/server.h index cf082895ce5..35087991b21 100644 --- a/tensorflow_serving/model_servers/server.h +++ b/tensorflow_serving/model_servers/server.h @@ -19,6 +19,7 @@ limitations under the License. #include #include "grpcpp/server.h" +#include "tensorflow/core/kernels/batching_util/periodic_function.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/platform/cpu_info.h" #include "tensorflow/core/platform/types.h" @@ -72,6 +73,8 @@ class Server { tensorflow::string platform_config_file; tensorflow::string ssl_config_file; string model_config_file; + // Zero means server will not poll FS for model config file after start-up. + tensorflow::int32 fs_model_config_poll_wait_seconds = 0; bool enable_model_warmup = true; // This value is used only if > 0. tensorflow::int32 num_request_iterations_for_warmup = 0; @@ -95,11 +98,18 @@ class Server { void WaitForTermination(); private: + // Polls the filesystem, parses config at specified path, and calls + // ServerCore::ReloadConfig with the captured model config. + void PollFilesystemAndReloadConfig(const string& config_file_path); + std::unique_ptr server_core_; std::unique_ptr model_service_; std::unique_ptr prediction_service_; std::unique_ptr<::grpc::Server> grpc_server_; std::unique_ptr http_server_; + // A thread that calls PollFilesystemAndReloadConfig() periodically if + // fs_model_config_poll_wait_seconds > 0. + std::unique_ptr fs_config_polling_thread_; }; } // namespace main diff --git a/tensorflow_serving/model_servers/server_core.h b/tensorflow_serving/model_servers/server_core.h index 2bce25a7432..9e3fbe043f7 100644 --- a/tensorflow_serving/model_servers/server_core.h +++ b/tensorflow_serving/model_servers/server_core.h @@ -154,13 +154,13 @@ class ServerCore : public Manager { // If set to true, the server will fail to start up (or fail a config // reload) if, for any configured model, no versions of the model are found - // in the file system under the model's base path. + // in the filesystem under the model's base path. ABSL_DEPRECATED("Use servable_versions_always_present.") bool fail_if_no_model_versions_found = false; // If set to true, the server will fail to start up (or fail a config // reload) if, for any configured model, no versions of the model are found - // in the file system under the model's base path. In addition, if the + // in the filesystem under the model's base path. In addition, if the // filesystem polling finds no servables under the base path for a // configured model, it will do nothing, rather than unloading all versions. bool servable_versions_always_present = false; diff --git a/tensorflow_serving/model_servers/tensorflow_model_server_test.py b/tensorflow_serving/model_servers/tensorflow_model_server_test.py index 28d319630ba..be041f6bb93 100644 --- a/tensorflow_serving/model_servers/tensorflow_model_server_test.py +++ b/tensorflow_serving/model_servers/tensorflow_model_server_test.py @@ -126,7 +126,8 @@ def RunServer(model_name, batching_parameters_file=None, grpc_channel_arguments='', wait_for_server_ready=True, - pipe=None): + pipe=None, + model_config_file_poll_period=None): """Run tensorflow_model_server using test config. A unique instance of server is started for each set of arguments. @@ -142,6 +143,8 @@ def RunServer(model_name, grpc_channel_arguments: Custom gRPC args for server. wait_for_server_ready: Wait for gRPC port to be ready. pipe: subpipe.PIPE object to read stderr from server. + model_config_file_poll_period: Period for polling the + filesystem to discover new model configs. Returns: 3-tuple (, , ). @@ -176,6 +179,10 @@ def RunServer(model_name, if monitoring_config_file: command += ' --monitoring_config_file=' + monitoring_config_file + if model_config_file_poll_period is not None: + command += ' --model_config_file_poll_wait_seconds=' + str( + model_config_file_poll_period) + if batching_parameters_file: command += ' --enable_batching' command += ' --batching_parameters_file=' + batching_parameters_file @@ -537,12 +544,121 @@ def testBadModelConfig(self): pipe=subprocess.PIPE, wait_for_server_ready=False)[0] - error_message = ( - 'Invalid protobuf file: \'%s\'') % self._GetBadModelConfigFile() + error_message = ('Error parsing text-format ' + 'tensorflow.serving.ModelServerConfig') error_message = error_message.encode('utf-8') self.assertNotEqual(proc.stderr, None) self.assertGreater(proc.stderr.read().find(error_message), -1) + def testModelConfigReload(self): + """Test model server polls filesystem for model configuration.""" + + base_config_proto = """ + model_config_list: {{ + config: {{ + name: "{name}", + base_path: "{model_path}", + model_platform: "tensorflow" + }} + }} + """ + + config_path = os.path.join(FLAGS.test_tmpdir, 'model_config.txt') + + # Write a config file serving half_plus_two model + with open(config_path, 'w') as f: + f.write( + base_config_proto.format( + name='half_plus_two', model_path=self._GetSavedModelBundlePath())) + + poll_period = 1 + model_server_address = TensorflowModelServerTest.RunServer( + None, + None, + model_config_file=config_path, + model_config_file_poll_period=poll_period)[1] + + self.VerifyPredictRequest( + model_server_address, + model_name='half_plus_two', + expected_output=3.0, + specify_output=False, + expected_version=self._GetModelVersion(self._GetSavedModelBundlePath())) + + # Rewrite the config file with half_plus_three model + with open(config_path, 'w') as f: + f.write( + base_config_proto.format( + name='half_plus_three', + model_path=self._GetSavedModelHalfPlusThreePath())) + + # Give modelserver time to poll and load the new config + time.sleep(poll_period + 1) + + # Verify new model config was realized in model server + self.VerifyPredictRequest( + model_server_address, + model_name='half_plus_three', + expected_output=4.0, + specify_output=False, + expected_version=self._GetModelVersion( + self._GetSavedModelHalfPlusThreePath())) + + def testModelConfigReloadWithZeroPollPeriod(self): + """Test model server does not poll filesystem for model config.""" + + base_config_proto = """ + model_config_list: {{ + config: {{ + name: "{name}", + base_path: "{model_path}", + model_platform: "tensorflow" + }} + }} + """ + + config_path = os.path.join(FLAGS.test_tmpdir, 'model_config.txt') + + # Write a config file serving half_plus_two model + with open(config_path, 'w') as f: + f.write( + base_config_proto.format( + name='half_plus_two', model_path=self._GetSavedModelBundlePath())) + + poll_period = 0 + model_server_address = TensorflowModelServerTest.RunServer( + None, + None, + model_config_file=config_path, + model_config_file_poll_period=poll_period)[1] + + self.VerifyPredictRequest( + model_server_address, + model_name='half_plus_two', + expected_output=3.0, + specify_output=False, + expected_version=self._GetModelVersion(self._GetSavedModelBundlePath())) + + # Rewrite the config file with half_plus_three model + with open(config_path, 'w') as f: + f.write( + base_config_proto.format( + name='half_plus_three', + model_path=self._GetSavedModelHalfPlusThreePath())) + + # Give modelserver enough time to poll and load the new config should it + # have such a desire + time.sleep(poll_period + 1) + + # Verify model server is still serving the old model config + self.VerifyPredictRequest( + model_server_address, + model_name='half_plus_two', + expected_output=3.0, + specify_output=False, + expected_version=self._GetModelVersion( + self._GetSavedModelHalfPlusThreePath())) + def testGoodGrpcChannelArgs(self): """Test server starts with grpc_channel_arguments specified.""" model_server_address = TensorflowModelServerTest.RunServer( From ba6527c8d56a0752f6c87115071e4d1bf7941810 Mon Sep 17 00:00:00 2001 From: Haiming Bao Date: Fri, 21 Jun 2019 12:25:10 -0700 Subject: [PATCH 3278/8103] Adds util functions for getting min of two ResourceAllocations. PiperOrigin-RevId: 254446927 --- tensorflow_serving/resources/resource_util.cc | 27 ++++ tensorflow_serving/resources/resource_util.h | 19 +++ .../resources/resource_util_test.cc | 148 ++++++++++++++++++ 3 files changed, 194 insertions(+) diff --git a/tensorflow_serving/resources/resource_util.cc b/tensorflow_serving/resources/resource_util.cc index e17a4db2592..dbc9b7fc736 100644 --- a/tensorflow_serving/resources/resource_util.cc +++ b/tensorflow_serving/resources/resource_util.cc @@ -15,6 +15,7 @@ limitations under the License. #include "tensorflow_serving/resources/resource_util.h" +#include #include #include #include @@ -225,6 +226,11 @@ ResourceAllocation ResourceUtil::Max(const ResourceAllocation& lhs, return MaxNormalized(Normalize(lhs), Normalize(rhs)); } +ResourceAllocation ResourceUtil::Min(const ResourceAllocation& lhs, + const ResourceAllocation& rhs) const { + return MinNormalized(Normalize(lhs), Normalize(rhs)); +} + bool ResourceUtil::IsBoundNormalized( const ResourceAllocation& allocation) const { DCHECK(IsNormalized(allocation)); @@ -508,5 +514,26 @@ ResourceAllocation ResourceUtil::MaxNormalized( return max_resource_allocation; } +ResourceAllocation ResourceUtil::MinNormalized( + const ResourceAllocation& lhs, const ResourceAllocation& rhs) const { + DCHECK(IsNormalized(lhs)); + DCHECK(IsNormalized(rhs)); + + ResourceAllocation min_resource_allocation; + ResourceAllocation rhs_copy = rhs; + for (const ResourceAllocation::Entry& lhs_entry : lhs.resource_quantities()) { + ResourceAllocation::Entry* rhs_entry = + FindMutableEntry(lhs_entry.resource(), &rhs_copy); + if (rhs_entry != nullptr) { + ResourceAllocation::Entry* min_entry = + min_resource_allocation.add_resource_quantities(); + *min_entry->mutable_resource() = lhs_entry.resource(); + min_entry->set_quantity( + std::min(lhs_entry.quantity(), rhs_entry->quantity())); + } + } + return min_resource_allocation; +} + } // namespace serving } // namespace tensorflow diff --git a/tensorflow_serving/resources/resource_util.h b/tensorflow_serving/resources/resource_util.h index 2d6d8bccb48..515881209f2 100644 --- a/tensorflow_serving/resources/resource_util.h +++ b/tensorflow_serving/resources/resource_util.h @@ -150,6 +150,20 @@ class ResourceUtil { ResourceAllocation Max(const ResourceAllocation& lhs, const ResourceAllocation& rhs) const; + // Gets the min of the two ResourceAllocations by taking the min of every + // paired entry and remove all the unpaired entries in the result. Like the + // Max() method, this keeps the bound and unbound resources separate. + // + // E.g. + // Min( + // {(GPU/instance_0/RAM/8), (CPU/instance_0/processing_in_millicores/100)}, + // {(GPU/instance_0/RAM/16), (CPU//RAM/4)} + // ) + // returns + // {(GPU/instance_0/RAM/8)} + ResourceAllocation Min(const ResourceAllocation& lhs, + const ResourceAllocation& rhs) const; + private: enum class DCHECKFailOption { kDoDCHECKFail, kDoNotDCHECKFail }; @@ -207,6 +221,11 @@ class ResourceUtil { ResourceAllocation MaxNormalized(const ResourceAllocation& lhs, const ResourceAllocation& rhs) const; + // Like Min(), but assumes the input are normalized and produces a normalized + // result. + ResourceAllocation MinNormalized(const ResourceAllocation& lhs, + const ResourceAllocation& rhs) const; + const std::map devices_; TF_DISALLOW_COPY_AND_ASSIGN(ResourceUtil); diff --git a/tensorflow_serving/resources/resource_util_test.cc b/tensorflow_serving/resources/resource_util_test.cc index 9e3ab9e6f7f..e02fcdbc419 100644 --- a/tensorflow_serving/resources/resource_util_test.cc +++ b/tensorflow_serving/resources/resource_util_test.cc @@ -1670,6 +1670,154 @@ TEST_F(ResourceUtilTest, MaxUnbound) { " quantity: 8 " "} ")); } + +TEST_F(ResourceUtilTest, MinEmpty) { + const auto lhs = CreateProto(""); + const auto rhs = CreateProto(""); + EXPECT_THAT(util_.Min(lhs, rhs), EqualsProto("")); +} + +TEST_F(ResourceUtilTest, MinBound) { + const auto lhs = CreateProto( + "resource_quantities { " + " resource { " + " device: 'main' " + " device_instance { value: 0 } " + " kind: 'processing' " + " } " + " quantity: 100 " + "} " + "resource_quantities { " + " resource { " + " device: 'main' " + " device_instance { value: 0 } " + " kind: 'ram' " + " } " + " quantity: 8 " + "} "); + const auto rhs = CreateProto( + "resource_quantities { " + " resource { " + " device: 'main' " + " device_instance { value: 0 } " + " kind: 'processing' " + " } " + " quantity: 300 " + "} " + "resource_quantities { " + " resource { " + " device: 'gpu' " + " device_instance { value: 0 } " + " kind: 'ram' " + " } " + " quantity: 4 " + "} "); + EXPECT_THAT(util_.Min(lhs, rhs), + EqualsProto("resource_quantities { " + " resource { " + " device: 'main' " + " device_instance { value: 0 } " + " kind: 'processing' " + " } " + " quantity: 100 " + "} ")); +} + +TEST_F(ResourceUtilTest, MinBoundAndUnbound) { + const auto lhs = CreateProto( + "resource_quantities { " + " resource { " + " device: 'main' " + " device_instance { value: 0 } " + " kind: 'processing' " + " } " + " quantity: 100 " + "} " + "resource_quantities { " + " resource { " + " device: 'gpu' " + " kind: 'ram' " + " } " + " quantity: 8 " + "} "); + const auto rhs = CreateProto( + "resource_quantities { " + " resource { " + " device: 'main' " + " device_instance { value: 0 } " + " kind: 'processing' " + " } " + " quantity: 300 " + "} " + "resource_quantities { " + " resource { " + " device: 'gpu' " + " device_instance { value: 0 } " + " kind: 'ram' " + " } " + " quantity: 4 " + "} "); + EXPECT_THAT(util_.Min(lhs, rhs), + EqualsProto("resource_quantities { " + " resource { " + " device: 'main' " + " device_instance { value: 0 } " + " kind: 'processing' " + " } " + " quantity: 100 " + "} ")); +} + +TEST_F(ResourceUtilTest, MinUnbound) { + const auto lhs = CreateProto( + "resource_quantities { " + " resource { " + " device: 'main' " + " kind: 'processing' " + " } " + " quantity: 100 " + "} " + "resource_quantities { " + " resource { " + " device: 'main' " + " kind: 'ram' " + " } " + " quantity: 8 " + "} "); + const auto rhs = CreateProto( + "resource_quantities { " + " resource { " + " device: 'main' " + " kind: 'processing' " + " } " + " quantity: 300 " + "} " + "resource_quantities { " + " resource { " + " device: 'main' " + " kind: 'ram' " + " } " + " quantity: 4 " + "} "); + EXPECT_THAT(util_.Min(lhs, rhs), + EqualsProto("resource_quantities { " + " resource { " + " device: 'main' " + " device_instance { value: 0 } " + " kind: 'processing' " + " } " + " quantity: 100 " + "} " + "resource_quantities { " + " resource { " + " device: 'main' " + " device_instance { value: 0 } " + " kind: 'ram' " + " } " + " quantity: 4 " + "} ")); +} + } // namespace } // namespace serving } // namespace tensorflow From dca61db5137c416a454c6ef821ad0fac6d66dc91 Mon Sep 17 00:00:00 2001 From: Mingming Liu Date: Sat, 22 Jun 2019 11:16:40 -0700 Subject: [PATCH 3279/8103] Cleanup usage of the protobuf_archive. See #19032 PiperOrigin-RevId: 254568754 --- tensorflow_serving/apis/BUILD | 4 +-- tensorflow_serving/config/BUILD | 4 +-- tensorflow_serving/core/BUILD | 10 +++--- tensorflow_serving/core/test_util/BUILD | 6 ++-- tensorflow_serving/example/BUILD | 2 +- tensorflow_serving/model_servers/BUILD | 6 ++-- .../model_servers/test_util/BUILD | 4 +-- tensorflow_serving/resources/BUILD | 2 +- tensorflow_serving/servables/tensorflow/BUILD | 34 +++++++++---------- tensorflow_serving/serving.bzl | 16 ++++----- tensorflow_serving/test_util/BUILD | 2 +- tensorflow_serving/util/BUILD | 6 ++-- 12 files changed, 48 insertions(+), 48 deletions(-) diff --git a/tensorflow_serving/apis/BUILD b/tensorflow_serving/apis/BUILD index a5a5a6f4242..acff5308151 100644 --- a/tensorflow_serving/apis/BUILD +++ b/tensorflow_serving/apis/BUILD @@ -29,8 +29,8 @@ serving_proto_library( cc_api_version = 2, deps = [ ":model_proto", + "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/core:protos_all_cc", - "@protobuf_archive//:cc_wkt_protos", ], ) @@ -78,7 +78,7 @@ serving_proto_library( srcs = ["model.proto"], cc_api_version = 2, deps = [ - "@protobuf_archive//:cc_wkt_protos", + "@com_google_protobuf//:cc_wkt_protos", ], ) diff --git a/tensorflow_serving/config/BUILD b/tensorflow_serving/config/BUILD index 25e34d91d3b..516bf557c03 100644 --- a/tensorflow_serving/config/BUILD +++ b/tensorflow_serving/config/BUILD @@ -28,7 +28,7 @@ serving_proto_library( deps = [ ":logging_config_proto", "//tensorflow_serving/sources/storage_path:file_system_storage_path_source_proto", - "@protobuf_archive//:cc_wkt_protos", + "@com_google_protobuf//:cc_wkt_protos", ], ) @@ -47,7 +47,7 @@ serving_proto_library( srcs = ["platform_config.proto"], cc_api_version = 2, deps = [ - "@protobuf_archive//:cc_wkt_protos", + "@com_google_protobuf//:cc_wkt_protos", ], ) diff --git a/tensorflow_serving/core/BUILD b/tensorflow_serving/core/BUILD index 105c892f67f..b3080cfa380 100644 --- a/tensorflow_serving/core/BUILD +++ b/tensorflow_serving/core/BUILD @@ -771,8 +771,8 @@ cc_library( ":log_collector", ":logging_proto", "//tensorflow_serving/config:logging_config_proto", + "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/core:lib", - "@protobuf_archive//:protobuf", ], ) @@ -791,9 +791,9 @@ cc_test( "//tensorflow_serving/core/test_util:mock_request_logger", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", + "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/cc/saved_model:tag_constants", "@org_tensorflow//tensorflow/core:lib", - "@protobuf_archive//:protobuf", ], ) @@ -810,8 +810,8 @@ cc_library( "//tensorflow_serving/config:logging_config_proto", "//tensorflow_serving/core:logging_proto", "//tensorflow_serving/util:fast_read_dynamic_ptr", + "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/core:lib", - "@protobuf_archive//:protobuf", ], ) @@ -832,10 +832,10 @@ cc_test( "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", "@com_google_absl//absl/strings", + "@com_google_protobuf//:cc_wkt_protos", + "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/cc/saved_model:tag_constants", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:test", - "@protobuf_archive//:cc_wkt_protos", - "@protobuf_archive//:protobuf", ], ) diff --git a/tensorflow_serving/core/test_util/BUILD b/tensorflow_serving/core/test_util/BUILD index b74abc10ded..eccb0ef0ef4 100644 --- a/tensorflow_serving/core/test_util/BUILD +++ b/tensorflow_serving/core/test_util/BUILD @@ -153,8 +153,8 @@ cc_library( deps = [ "//tensorflow_serving/core:log_collector", "@com_google_googletest//:gtest", + "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/core:lib", - "@protobuf_archive//:protobuf", ], ) @@ -165,8 +165,8 @@ cc_library( deps = [ "//tensorflow_serving/core:log_collector", "@com_google_googletest//:gtest", + "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/core:lib", - "@protobuf_archive//:protobuf", ], ) @@ -178,8 +178,8 @@ cc_library( "//tensorflow_serving/core:logging_proto", "//tensorflow_serving/core:request_logger", "@com_google_googletest//:gtest", + "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/core:lib", - "@protobuf_archive//:protobuf", ], ) diff --git a/tensorflow_serving/example/BUILD b/tensorflow_serving/example/BUILD index 8b9d098a205..78145504642 100644 --- a/tensorflow_serving/example/BUILD +++ b/tensorflow_serving/example/BUILD @@ -27,9 +27,9 @@ cc_binary( ], deps = [ "//tensorflow_serving/apis:prediction_service_proto", + "@com_google_protobuf//:protobuf_lite", "@grpc//:grpc++", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", - "@protobuf_archive//:protobuf_lite", ], ) diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index a90fb8296aa..39451548594 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -89,8 +89,8 @@ cc_library( "//tensorflow_serving/util:event_bus", "//tensorflow_serving/util:optional", "//tensorflow_serving/util:unique_ptr_with_deps", + "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/core:lib", - "@protobuf_archive//:cc_wkt_protos", ], ) @@ -114,10 +114,10 @@ cc_test( "//tensorflow_serving/model_servers/test_util:storage_path_error_injecting_source_adapter", "//tensorflow_serving/model_servers/test_util:storage_path_error_injecting_source_adapter_proto", "//tensorflow_serving/test_util", + "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", - "@protobuf_archive//:cc_wkt_protos", ], ) @@ -320,7 +320,7 @@ cc_library( ":server_core", ":grpc_status_util", ":model_service_impl", - "@protobuf_archive//:cc_wkt_protos", + "@com_google_protobuf//:cc_wkt_protos", "@grpc//:grpc++", "@org_tensorflow//tensorflow/c:c_api", "@org_tensorflow//tensorflow/cc/saved_model:tag_constants", diff --git a/tensorflow_serving/model_servers/test_util/BUILD b/tensorflow_serving/model_servers/test_util/BUILD index 3bd55c5f3bb..60b7e6e0621 100644 --- a/tensorflow_serving/model_servers/test_util/BUILD +++ b/tensorflow_serving/model_servers/test_util/BUILD @@ -42,9 +42,9 @@ cc_library( "//tensorflow_serving/util:event_bus", "//tensorflow_serving/util:unique_ptr_with_deps", "@com_google_googletest//:gtest", + "@com_google_protobuf//:cc_wkt_protos", + "@com_google_protobuf//:protobuf_lite", "@org_tensorflow//tensorflow/core:lib", - "@protobuf_archive//:cc_wkt_protos", - "@protobuf_archive//:protobuf_lite", ], ) diff --git a/tensorflow_serving/resources/BUILD b/tensorflow_serving/resources/BUILD index 9b4fea20935..8db77715c6d 100644 --- a/tensorflow_serving/resources/BUILD +++ b/tensorflow_serving/resources/BUILD @@ -26,7 +26,7 @@ serving_proto_library( srcs = ["resources.proto"], cc_api_version = 2, visibility = ["//visibility:public"], - deps = ["@protobuf_archive//:cc_wkt_protos"], + deps = ["@com_google_protobuf//:cc_wkt_protos"], ) cc_library( diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index 0675e45a770..240f0c7fbe7 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -30,8 +30,8 @@ serving_proto_library( "//visibility:public", ], deps = [ + "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/core:protos_all_cc", - "@protobuf_archive//:cc_wkt_protos", ], ) @@ -49,12 +49,12 @@ cc_library( "//tensorflow_serving/resources:resource_values", "//tensorflow_serving/resources:resources_proto", "//tensorflow_serving/util:file_probing_env", + "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core/kernels/batching_util:batch_scheduler", "@org_tensorflow//tensorflow/core/kernels/batching_util:shared_batch_scheduler", - "@protobuf_archive//:cc_wkt_protos", ], ) @@ -72,6 +72,7 @@ cc_test( "//tensorflow_serving/resources:resources_proto", "//tensorflow_serving/test_util", "//tensorflow_serving/util/test_util:mock_file_probing_env", + "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/contrib/session_bundle", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:framework", @@ -79,7 +80,6 @@ cc_test( "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", "@org_tensorflow//tensorflow/core/kernels/batching_util:shared_batch_scheduler", - "@protobuf_archive//:cc_wkt_protos", ], ) @@ -110,11 +110,11 @@ cc_library( ":session_bundle_config_proto", "//tensorflow_serving/resources:resources_proto", "//tensorflow_serving/test_util", + "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/cc/saved_model:tag_constants", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:test", - "@protobuf_archive//:cc_wkt_protos", ], ) @@ -151,12 +151,12 @@ cc_test( ":session_bundle_factory", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", + "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/contrib/session_bundle", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:test", - "@protobuf_archive//:cc_wkt_protos", ], ) @@ -197,12 +197,12 @@ cc_test( ":saved_model_bundle_factory", ":session_bundle_config_proto", "//tensorflow_serving/core/test_util:test_main", + "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/cc/saved_model:tag_constants", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:test", - "@protobuf_archive//:cc_wkt_protos", ], ) @@ -297,10 +297,10 @@ cc_test( "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/resources:resources_proto", "//tensorflow_serving/test_util", + "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:test", - "@protobuf_archive//:cc_wkt_protos", ], ) @@ -532,6 +532,8 @@ cc_test( "//tensorflow_serving/model_servers:model_platform_types", "//tensorflow_serving/model_servers:platform_config_util", "//tensorflow_serving/test_util", + "@com_google_protobuf//:cc_wkt_protos", + "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", "@org_tensorflow//tensorflow/contrib/session_bundle", @@ -539,8 +541,6 @@ cc_test( "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", - "@protobuf_archive//:cc_wkt_protos", - "@protobuf_archive//:protobuf", ], ) @@ -613,6 +613,7 @@ cc_test( "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", "//tensorflow_serving/util:optional", + "@com_google_protobuf//:protobuf_lite", "@org_tensorflow//tensorflow/contrib/session_bundle", "@org_tensorflow//tensorflow/contrib/session_bundle:bundle_shim", "@org_tensorflow//tensorflow/contrib/session_bundle:manifest_proto_cc", @@ -620,7 +621,6 @@ cc_test( "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", - "@protobuf_archive//:protobuf_lite", ], ) @@ -745,13 +745,13 @@ cc_test( "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", "//tensorflow_serving/util:optional", + "@com_google_protobuf//:protobuf_lite", "@org_tensorflow//tensorflow/contrib/session_bundle", "@org_tensorflow//tensorflow/contrib/session_bundle:bundle_shim", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", - "@protobuf_archive//:protobuf_lite", ], ) @@ -769,11 +769,11 @@ cc_library( "//tensorflow_serving/servables/tensorflow:classifier", "//tensorflow_serving/servables/tensorflow:regressor", "//tensorflow_serving/servables/tensorflow:util", + "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", "@org_tensorflow//tensorflow/contrib/session_bundle", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", - "@protobuf_archive//:protobuf", ], ) @@ -816,11 +816,11 @@ cc_library( "//tensorflow_serving/apis:input_proto", "//tensorflow_serving/apis:model_proto", "//tensorflow_serving/model_servers:server_core", + "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", - "@protobuf_archive//:protobuf", ], ) @@ -862,12 +862,12 @@ cc_library( "//tensorflow_serving/apis:model_proto", "//tensorflow_serving/apis/internal:serialized_input_proto", "//tensorflow_serving/util:optional", + "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", - "@protobuf_archive//:cc_wkt_protos", ], ) @@ -879,13 +879,13 @@ cc_test( ":util", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", + "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", "@org_tensorflow//tensorflow/core:testlib", - "@protobuf_archive//:cc_wkt_protos", ], ) @@ -901,12 +901,12 @@ cc_library( ":session_bundle_config_proto", ":util", "//tensorflow_serving/apis:prediction_log_proto", + "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/cc/saved_model:constants", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", - "@protobuf_archive//:cc_wkt_protos", ], ) @@ -923,6 +923,7 @@ cc_test( "//tensorflow_serving/core/test_util:mock_session", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", + "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/cc/saved_model:constants", "@org_tensorflow//tensorflow/contrib/session_bundle:manifest_proto_cc", "@org_tensorflow//tensorflow/core:framework", @@ -930,6 +931,5 @@ cc_test( "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", "@org_tensorflow//tensorflow/core:testlib", - "@protobuf_archive//:cc_wkt_protos", ], ) diff --git a/tensorflow_serving/serving.bzl b/tensorflow_serving/serving.bzl index e474842b23e..ca34504683e 100644 --- a/tensorflow_serving/serving.bzl +++ b/tensorflow_serving/serving.bzl @@ -1,5 +1,5 @@ -load("@protobuf_archive//:protobuf.bzl", "cc_proto_library") -load("@protobuf_archive//:protobuf.bzl", "py_proto_library") +load("@com_google_protobuf//:protobuf.bzl", "cc_proto_library") +load("@com_google_protobuf//:protobuf.bzl", "py_proto_library") def serving_proto_library( name, @@ -23,9 +23,9 @@ def serving_proto_library( name = name, srcs = srcs, deps = deps, - cc_libs = ["@protobuf_archive//:protobuf"], - protoc = "@protobuf_archive//:protoc", - default_runtime = "@protobuf_archive//:protobuf", + cc_libs = ["@com_google_protobuf//:protobuf"], + protoc = "@com_google_protobuf//:protoc", + default_runtime = "@com_google_protobuf//:protobuf", use_grpc_plugin = use_grpc_plugin, testonly = testonly, visibility = visibility, @@ -40,9 +40,9 @@ def serving_proto_library_py(name, proto_library, srcs = [], deps = [], visibili name = name, srcs = srcs, srcs_version = "PY2AND3", - deps = ["@protobuf_archive//:protobuf_python"] + deps, - default_runtime = "@protobuf_archive//:protobuf_python", - protoc = "@protobuf_archive//:protoc", + deps = ["@com_google_protobuf//:protobuf_python"] + deps, + default_runtime = "@com_google_protobuf//:protobuf_python", + protoc = "@com_google_protobuf//:protoc", visibility = visibility, testonly = testonly, ) diff --git a/tensorflow_serving/test_util/BUILD b/tensorflow_serving/test_util/BUILD index 698f0d29328..2760da3a29f 100644 --- a/tensorflow_serving/test_util/BUILD +++ b/tensorflow_serving/test_util/BUILD @@ -24,9 +24,9 @@ cc_library( hdrs = ["test_util.h"], deps = [ "@com_google_googletest//:gtest", + "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/core", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:test", - "@protobuf_archive//:protobuf", ], ) diff --git a/tensorflow_serving/util/BUILD b/tensorflow_serving/util/BUILD index 0f3f6c6d1a7..393bbc0cc72 100644 --- a/tensorflow_serving/util/BUILD +++ b/tensorflow_serving/util/BUILD @@ -48,8 +48,8 @@ cc_library( visibility = ["//visibility:public"], deps = [ ":class_registration_util", + "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/core:lib", - "@protobuf_archive//:cc_wkt_protos", ], ) @@ -375,11 +375,11 @@ cc_test( "//tensorflow_serving/apis:regression_proto", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", + "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", - "@protobuf_archive//:protobuf", ], ) @@ -392,7 +392,7 @@ serving_proto_library( srcs = ["class_registration_test.proto"], cc_api_version = 2, deps = [ - "@protobuf_archive//:cc_wkt_protos", + "@com_google_protobuf//:cc_wkt_protos", ], ) From f420804f83eb6d367fcdc616632fb56cf4186dd7 Mon Sep 17 00:00:00 2001 From: Mingming Liu Date: Sat, 22 Jun 2019 13:45:28 -0700 Subject: [PATCH 3280/8103] Automated rollback of commit dca61db5137c416a454c6ef821ad0fac6d66dc91 PiperOrigin-RevId: 254576540 --- tensorflow_serving/apis/BUILD | 4 +-- tensorflow_serving/config/BUILD | 4 +-- tensorflow_serving/core/BUILD | 10 +++--- tensorflow_serving/core/test_util/BUILD | 6 ++-- tensorflow_serving/example/BUILD | 2 +- tensorflow_serving/model_servers/BUILD | 6 ++-- .../model_servers/test_util/BUILD | 4 +-- tensorflow_serving/resources/BUILD | 2 +- tensorflow_serving/servables/tensorflow/BUILD | 34 +++++++++---------- tensorflow_serving/serving.bzl | 16 ++++----- tensorflow_serving/test_util/BUILD | 2 +- tensorflow_serving/util/BUILD | 6 ++-- 12 files changed, 48 insertions(+), 48 deletions(-) diff --git a/tensorflow_serving/apis/BUILD b/tensorflow_serving/apis/BUILD index acff5308151..a5a5a6f4242 100644 --- a/tensorflow_serving/apis/BUILD +++ b/tensorflow_serving/apis/BUILD @@ -29,8 +29,8 @@ serving_proto_library( cc_api_version = 2, deps = [ ":model_proto", - "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/core:protos_all_cc", + "@protobuf_archive//:cc_wkt_protos", ], ) @@ -78,7 +78,7 @@ serving_proto_library( srcs = ["model.proto"], cc_api_version = 2, deps = [ - "@com_google_protobuf//:cc_wkt_protos", + "@protobuf_archive//:cc_wkt_protos", ], ) diff --git a/tensorflow_serving/config/BUILD b/tensorflow_serving/config/BUILD index 516bf557c03..25e34d91d3b 100644 --- a/tensorflow_serving/config/BUILD +++ b/tensorflow_serving/config/BUILD @@ -28,7 +28,7 @@ serving_proto_library( deps = [ ":logging_config_proto", "//tensorflow_serving/sources/storage_path:file_system_storage_path_source_proto", - "@com_google_protobuf//:cc_wkt_protos", + "@protobuf_archive//:cc_wkt_protos", ], ) @@ -47,7 +47,7 @@ serving_proto_library( srcs = ["platform_config.proto"], cc_api_version = 2, deps = [ - "@com_google_protobuf//:cc_wkt_protos", + "@protobuf_archive//:cc_wkt_protos", ], ) diff --git a/tensorflow_serving/core/BUILD b/tensorflow_serving/core/BUILD index b3080cfa380..105c892f67f 100644 --- a/tensorflow_serving/core/BUILD +++ b/tensorflow_serving/core/BUILD @@ -771,8 +771,8 @@ cc_library( ":log_collector", ":logging_proto", "//tensorflow_serving/config:logging_config_proto", - "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/core:lib", + "@protobuf_archive//:protobuf", ], ) @@ -791,9 +791,9 @@ cc_test( "//tensorflow_serving/core/test_util:mock_request_logger", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", - "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/cc/saved_model:tag_constants", "@org_tensorflow//tensorflow/core:lib", + "@protobuf_archive//:protobuf", ], ) @@ -810,8 +810,8 @@ cc_library( "//tensorflow_serving/config:logging_config_proto", "//tensorflow_serving/core:logging_proto", "//tensorflow_serving/util:fast_read_dynamic_ptr", - "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/core:lib", + "@protobuf_archive//:protobuf", ], ) @@ -832,10 +832,10 @@ cc_test( "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", "@com_google_absl//absl/strings", - "@com_google_protobuf//:cc_wkt_protos", - "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/cc/saved_model:tag_constants", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:test", + "@protobuf_archive//:cc_wkt_protos", + "@protobuf_archive//:protobuf", ], ) diff --git a/tensorflow_serving/core/test_util/BUILD b/tensorflow_serving/core/test_util/BUILD index eccb0ef0ef4..b74abc10ded 100644 --- a/tensorflow_serving/core/test_util/BUILD +++ b/tensorflow_serving/core/test_util/BUILD @@ -153,8 +153,8 @@ cc_library( deps = [ "//tensorflow_serving/core:log_collector", "@com_google_googletest//:gtest", - "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/core:lib", + "@protobuf_archive//:protobuf", ], ) @@ -165,8 +165,8 @@ cc_library( deps = [ "//tensorflow_serving/core:log_collector", "@com_google_googletest//:gtest", - "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/core:lib", + "@protobuf_archive//:protobuf", ], ) @@ -178,8 +178,8 @@ cc_library( "//tensorflow_serving/core:logging_proto", "//tensorflow_serving/core:request_logger", "@com_google_googletest//:gtest", - "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/core:lib", + "@protobuf_archive//:protobuf", ], ) diff --git a/tensorflow_serving/example/BUILD b/tensorflow_serving/example/BUILD index 78145504642..8b9d098a205 100644 --- a/tensorflow_serving/example/BUILD +++ b/tensorflow_serving/example/BUILD @@ -27,9 +27,9 @@ cc_binary( ], deps = [ "//tensorflow_serving/apis:prediction_service_proto", - "@com_google_protobuf//:protobuf_lite", "@grpc//:grpc++", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", + "@protobuf_archive//:protobuf_lite", ], ) diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 39451548594..a90fb8296aa 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -89,8 +89,8 @@ cc_library( "//tensorflow_serving/util:event_bus", "//tensorflow_serving/util:optional", "//tensorflow_serving/util:unique_ptr_with_deps", - "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/core:lib", + "@protobuf_archive//:cc_wkt_protos", ], ) @@ -114,10 +114,10 @@ cc_test( "//tensorflow_serving/model_servers/test_util:storage_path_error_injecting_source_adapter", "//tensorflow_serving/model_servers/test_util:storage_path_error_injecting_source_adapter_proto", "//tensorflow_serving/test_util", - "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", + "@protobuf_archive//:cc_wkt_protos", ], ) @@ -320,7 +320,7 @@ cc_library( ":server_core", ":grpc_status_util", ":model_service_impl", - "@com_google_protobuf//:cc_wkt_protos", + "@protobuf_archive//:cc_wkt_protos", "@grpc//:grpc++", "@org_tensorflow//tensorflow/c:c_api", "@org_tensorflow//tensorflow/cc/saved_model:tag_constants", diff --git a/tensorflow_serving/model_servers/test_util/BUILD b/tensorflow_serving/model_servers/test_util/BUILD index 60b7e6e0621..3bd55c5f3bb 100644 --- a/tensorflow_serving/model_servers/test_util/BUILD +++ b/tensorflow_serving/model_servers/test_util/BUILD @@ -42,9 +42,9 @@ cc_library( "//tensorflow_serving/util:event_bus", "//tensorflow_serving/util:unique_ptr_with_deps", "@com_google_googletest//:gtest", - "@com_google_protobuf//:cc_wkt_protos", - "@com_google_protobuf//:protobuf_lite", "@org_tensorflow//tensorflow/core:lib", + "@protobuf_archive//:cc_wkt_protos", + "@protobuf_archive//:protobuf_lite", ], ) diff --git a/tensorflow_serving/resources/BUILD b/tensorflow_serving/resources/BUILD index 8db77715c6d..9b4fea20935 100644 --- a/tensorflow_serving/resources/BUILD +++ b/tensorflow_serving/resources/BUILD @@ -26,7 +26,7 @@ serving_proto_library( srcs = ["resources.proto"], cc_api_version = 2, visibility = ["//visibility:public"], - deps = ["@com_google_protobuf//:cc_wkt_protos"], + deps = ["@protobuf_archive//:cc_wkt_protos"], ) cc_library( diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index 240f0c7fbe7..0675e45a770 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -30,8 +30,8 @@ serving_proto_library( "//visibility:public", ], deps = [ - "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/core:protos_all_cc", + "@protobuf_archive//:cc_wkt_protos", ], ) @@ -49,12 +49,12 @@ cc_library( "//tensorflow_serving/resources:resource_values", "//tensorflow_serving/resources:resources_proto", "//tensorflow_serving/util:file_probing_env", - "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core/kernels/batching_util:batch_scheduler", "@org_tensorflow//tensorflow/core/kernels/batching_util:shared_batch_scheduler", + "@protobuf_archive//:cc_wkt_protos", ], ) @@ -72,7 +72,6 @@ cc_test( "//tensorflow_serving/resources:resources_proto", "//tensorflow_serving/test_util", "//tensorflow_serving/util/test_util:mock_file_probing_env", - "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/contrib/session_bundle", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:framework", @@ -80,6 +79,7 @@ cc_test( "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", "@org_tensorflow//tensorflow/core/kernels/batching_util:shared_batch_scheduler", + "@protobuf_archive//:cc_wkt_protos", ], ) @@ -110,11 +110,11 @@ cc_library( ":session_bundle_config_proto", "//tensorflow_serving/resources:resources_proto", "//tensorflow_serving/test_util", - "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/cc/saved_model:tag_constants", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:test", + "@protobuf_archive//:cc_wkt_protos", ], ) @@ -151,12 +151,12 @@ cc_test( ":session_bundle_factory", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", - "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/contrib/session_bundle", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:test", + "@protobuf_archive//:cc_wkt_protos", ], ) @@ -197,12 +197,12 @@ cc_test( ":saved_model_bundle_factory", ":session_bundle_config_proto", "//tensorflow_serving/core/test_util:test_main", - "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/cc/saved_model:tag_constants", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:test", + "@protobuf_archive//:cc_wkt_protos", ], ) @@ -297,10 +297,10 @@ cc_test( "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/resources:resources_proto", "//tensorflow_serving/test_util", - "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:test", + "@protobuf_archive//:cc_wkt_protos", ], ) @@ -532,8 +532,6 @@ cc_test( "//tensorflow_serving/model_servers:model_platform_types", "//tensorflow_serving/model_servers:platform_config_util", "//tensorflow_serving/test_util", - "@com_google_protobuf//:cc_wkt_protos", - "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", "@org_tensorflow//tensorflow/contrib/session_bundle", @@ -541,6 +539,8 @@ cc_test( "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", + "@protobuf_archive//:cc_wkt_protos", + "@protobuf_archive//:protobuf", ], ) @@ -613,7 +613,6 @@ cc_test( "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", "//tensorflow_serving/util:optional", - "@com_google_protobuf//:protobuf_lite", "@org_tensorflow//tensorflow/contrib/session_bundle", "@org_tensorflow//tensorflow/contrib/session_bundle:bundle_shim", "@org_tensorflow//tensorflow/contrib/session_bundle:manifest_proto_cc", @@ -621,6 +620,7 @@ cc_test( "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", + "@protobuf_archive//:protobuf_lite", ], ) @@ -745,13 +745,13 @@ cc_test( "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", "//tensorflow_serving/util:optional", - "@com_google_protobuf//:protobuf_lite", "@org_tensorflow//tensorflow/contrib/session_bundle", "@org_tensorflow//tensorflow/contrib/session_bundle:bundle_shim", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", + "@protobuf_archive//:protobuf_lite", ], ) @@ -769,11 +769,11 @@ cc_library( "//tensorflow_serving/servables/tensorflow:classifier", "//tensorflow_serving/servables/tensorflow:regressor", "//tensorflow_serving/servables/tensorflow:util", - "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", "@org_tensorflow//tensorflow/contrib/session_bundle", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", + "@protobuf_archive//:protobuf", ], ) @@ -816,11 +816,11 @@ cc_library( "//tensorflow_serving/apis:input_proto", "//tensorflow_serving/apis:model_proto", "//tensorflow_serving/model_servers:server_core", - "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", + "@protobuf_archive//:protobuf", ], ) @@ -862,12 +862,12 @@ cc_library( "//tensorflow_serving/apis:model_proto", "//tensorflow_serving/apis/internal:serialized_input_proto", "//tensorflow_serving/util:optional", - "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", + "@protobuf_archive//:cc_wkt_protos", ], ) @@ -879,13 +879,13 @@ cc_test( ":util", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", - "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", "@org_tensorflow//tensorflow/core:testlib", + "@protobuf_archive//:cc_wkt_protos", ], ) @@ -901,12 +901,12 @@ cc_library( ":session_bundle_config_proto", ":util", "//tensorflow_serving/apis:prediction_log_proto", - "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/cc/saved_model:constants", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", + "@protobuf_archive//:cc_wkt_protos", ], ) @@ -923,7 +923,6 @@ cc_test( "//tensorflow_serving/core/test_util:mock_session", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", - "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/cc/saved_model:constants", "@org_tensorflow//tensorflow/contrib/session_bundle:manifest_proto_cc", "@org_tensorflow//tensorflow/core:framework", @@ -931,5 +930,6 @@ cc_test( "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", "@org_tensorflow//tensorflow/core:testlib", + "@protobuf_archive//:cc_wkt_protos", ], ) diff --git a/tensorflow_serving/serving.bzl b/tensorflow_serving/serving.bzl index ca34504683e..e474842b23e 100644 --- a/tensorflow_serving/serving.bzl +++ b/tensorflow_serving/serving.bzl @@ -1,5 +1,5 @@ -load("@com_google_protobuf//:protobuf.bzl", "cc_proto_library") -load("@com_google_protobuf//:protobuf.bzl", "py_proto_library") +load("@protobuf_archive//:protobuf.bzl", "cc_proto_library") +load("@protobuf_archive//:protobuf.bzl", "py_proto_library") def serving_proto_library( name, @@ -23,9 +23,9 @@ def serving_proto_library( name = name, srcs = srcs, deps = deps, - cc_libs = ["@com_google_protobuf//:protobuf"], - protoc = "@com_google_protobuf//:protoc", - default_runtime = "@com_google_protobuf//:protobuf", + cc_libs = ["@protobuf_archive//:protobuf"], + protoc = "@protobuf_archive//:protoc", + default_runtime = "@protobuf_archive//:protobuf", use_grpc_plugin = use_grpc_plugin, testonly = testonly, visibility = visibility, @@ -40,9 +40,9 @@ def serving_proto_library_py(name, proto_library, srcs = [], deps = [], visibili name = name, srcs = srcs, srcs_version = "PY2AND3", - deps = ["@com_google_protobuf//:protobuf_python"] + deps, - default_runtime = "@com_google_protobuf//:protobuf_python", - protoc = "@com_google_protobuf//:protoc", + deps = ["@protobuf_archive//:protobuf_python"] + deps, + default_runtime = "@protobuf_archive//:protobuf_python", + protoc = "@protobuf_archive//:protoc", visibility = visibility, testonly = testonly, ) diff --git a/tensorflow_serving/test_util/BUILD b/tensorflow_serving/test_util/BUILD index 2760da3a29f..698f0d29328 100644 --- a/tensorflow_serving/test_util/BUILD +++ b/tensorflow_serving/test_util/BUILD @@ -24,9 +24,9 @@ cc_library( hdrs = ["test_util.h"], deps = [ "@com_google_googletest//:gtest", - "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/core", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:test", + "@protobuf_archive//:protobuf", ], ) diff --git a/tensorflow_serving/util/BUILD b/tensorflow_serving/util/BUILD index 393bbc0cc72..0f3f6c6d1a7 100644 --- a/tensorflow_serving/util/BUILD +++ b/tensorflow_serving/util/BUILD @@ -48,8 +48,8 @@ cc_library( visibility = ["//visibility:public"], deps = [ ":class_registration_util", - "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/core:lib", + "@protobuf_archive//:cc_wkt_protos", ], ) @@ -375,11 +375,11 @@ cc_test( "//tensorflow_serving/apis:regression_proto", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", - "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", + "@protobuf_archive//:protobuf", ], ) @@ -392,7 +392,7 @@ serving_proto_library( srcs = ["class_registration_test.proto"], cc_api_version = 2, deps = [ - "@com_google_protobuf//:cc_wkt_protos", + "@protobuf_archive//:cc_wkt_protos", ], ) From 13e0929b7bff82a01a6d907d348d9a53ba0a66c6 Mon Sep 17 00:00:00 2001 From: Mingming Liu Date: Mon, 24 Jun 2019 08:31:14 -0700 Subject: [PATCH 3281/8103] Automated rollback of commit dca61db5137c416a454c6ef821ad0fac6d66dc91 PiperOrigin-RevId: 254762844 --- tensorflow_serving/apis/BUILD | 4 +-- tensorflow_serving/config/BUILD | 4 +-- tensorflow_serving/core/BUILD | 10 +++--- tensorflow_serving/core/test_util/BUILD | 6 ++-- tensorflow_serving/example/BUILD | 2 +- tensorflow_serving/model_servers/BUILD | 6 ++-- .../model_servers/test_util/BUILD | 4 +-- tensorflow_serving/resources/BUILD | 2 +- tensorflow_serving/servables/tensorflow/BUILD | 34 +++++++++---------- tensorflow_serving/serving.bzl | 16 ++++----- tensorflow_serving/test_util/BUILD | 2 +- tensorflow_serving/util/BUILD | 6 ++-- 12 files changed, 48 insertions(+), 48 deletions(-) diff --git a/tensorflow_serving/apis/BUILD b/tensorflow_serving/apis/BUILD index a5a5a6f4242..acff5308151 100644 --- a/tensorflow_serving/apis/BUILD +++ b/tensorflow_serving/apis/BUILD @@ -29,8 +29,8 @@ serving_proto_library( cc_api_version = 2, deps = [ ":model_proto", + "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/core:protos_all_cc", - "@protobuf_archive//:cc_wkt_protos", ], ) @@ -78,7 +78,7 @@ serving_proto_library( srcs = ["model.proto"], cc_api_version = 2, deps = [ - "@protobuf_archive//:cc_wkt_protos", + "@com_google_protobuf//:cc_wkt_protos", ], ) diff --git a/tensorflow_serving/config/BUILD b/tensorflow_serving/config/BUILD index 25e34d91d3b..516bf557c03 100644 --- a/tensorflow_serving/config/BUILD +++ b/tensorflow_serving/config/BUILD @@ -28,7 +28,7 @@ serving_proto_library( deps = [ ":logging_config_proto", "//tensorflow_serving/sources/storage_path:file_system_storage_path_source_proto", - "@protobuf_archive//:cc_wkt_protos", + "@com_google_protobuf//:cc_wkt_protos", ], ) @@ -47,7 +47,7 @@ serving_proto_library( srcs = ["platform_config.proto"], cc_api_version = 2, deps = [ - "@protobuf_archive//:cc_wkt_protos", + "@com_google_protobuf//:cc_wkt_protos", ], ) diff --git a/tensorflow_serving/core/BUILD b/tensorflow_serving/core/BUILD index 105c892f67f..b3080cfa380 100644 --- a/tensorflow_serving/core/BUILD +++ b/tensorflow_serving/core/BUILD @@ -771,8 +771,8 @@ cc_library( ":log_collector", ":logging_proto", "//tensorflow_serving/config:logging_config_proto", + "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/core:lib", - "@protobuf_archive//:protobuf", ], ) @@ -791,9 +791,9 @@ cc_test( "//tensorflow_serving/core/test_util:mock_request_logger", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", + "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/cc/saved_model:tag_constants", "@org_tensorflow//tensorflow/core:lib", - "@protobuf_archive//:protobuf", ], ) @@ -810,8 +810,8 @@ cc_library( "//tensorflow_serving/config:logging_config_proto", "//tensorflow_serving/core:logging_proto", "//tensorflow_serving/util:fast_read_dynamic_ptr", + "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/core:lib", - "@protobuf_archive//:protobuf", ], ) @@ -832,10 +832,10 @@ cc_test( "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", "@com_google_absl//absl/strings", + "@com_google_protobuf//:cc_wkt_protos", + "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/cc/saved_model:tag_constants", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:test", - "@protobuf_archive//:cc_wkt_protos", - "@protobuf_archive//:protobuf", ], ) diff --git a/tensorflow_serving/core/test_util/BUILD b/tensorflow_serving/core/test_util/BUILD index b74abc10ded..eccb0ef0ef4 100644 --- a/tensorflow_serving/core/test_util/BUILD +++ b/tensorflow_serving/core/test_util/BUILD @@ -153,8 +153,8 @@ cc_library( deps = [ "//tensorflow_serving/core:log_collector", "@com_google_googletest//:gtest", + "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/core:lib", - "@protobuf_archive//:protobuf", ], ) @@ -165,8 +165,8 @@ cc_library( deps = [ "//tensorflow_serving/core:log_collector", "@com_google_googletest//:gtest", + "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/core:lib", - "@protobuf_archive//:protobuf", ], ) @@ -178,8 +178,8 @@ cc_library( "//tensorflow_serving/core:logging_proto", "//tensorflow_serving/core:request_logger", "@com_google_googletest//:gtest", + "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/core:lib", - "@protobuf_archive//:protobuf", ], ) diff --git a/tensorflow_serving/example/BUILD b/tensorflow_serving/example/BUILD index 8b9d098a205..78145504642 100644 --- a/tensorflow_serving/example/BUILD +++ b/tensorflow_serving/example/BUILD @@ -27,9 +27,9 @@ cc_binary( ], deps = [ "//tensorflow_serving/apis:prediction_service_proto", + "@com_google_protobuf//:protobuf_lite", "@grpc//:grpc++", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", - "@protobuf_archive//:protobuf_lite", ], ) diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index a90fb8296aa..39451548594 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -89,8 +89,8 @@ cc_library( "//tensorflow_serving/util:event_bus", "//tensorflow_serving/util:optional", "//tensorflow_serving/util:unique_ptr_with_deps", + "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/core:lib", - "@protobuf_archive//:cc_wkt_protos", ], ) @@ -114,10 +114,10 @@ cc_test( "//tensorflow_serving/model_servers/test_util:storage_path_error_injecting_source_adapter", "//tensorflow_serving/model_servers/test_util:storage_path_error_injecting_source_adapter_proto", "//tensorflow_serving/test_util", + "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", - "@protobuf_archive//:cc_wkt_protos", ], ) @@ -320,7 +320,7 @@ cc_library( ":server_core", ":grpc_status_util", ":model_service_impl", - "@protobuf_archive//:cc_wkt_protos", + "@com_google_protobuf//:cc_wkt_protos", "@grpc//:grpc++", "@org_tensorflow//tensorflow/c:c_api", "@org_tensorflow//tensorflow/cc/saved_model:tag_constants", diff --git a/tensorflow_serving/model_servers/test_util/BUILD b/tensorflow_serving/model_servers/test_util/BUILD index 3bd55c5f3bb..60b7e6e0621 100644 --- a/tensorflow_serving/model_servers/test_util/BUILD +++ b/tensorflow_serving/model_servers/test_util/BUILD @@ -42,9 +42,9 @@ cc_library( "//tensorflow_serving/util:event_bus", "//tensorflow_serving/util:unique_ptr_with_deps", "@com_google_googletest//:gtest", + "@com_google_protobuf//:cc_wkt_protos", + "@com_google_protobuf//:protobuf_lite", "@org_tensorflow//tensorflow/core:lib", - "@protobuf_archive//:cc_wkt_protos", - "@protobuf_archive//:protobuf_lite", ], ) diff --git a/tensorflow_serving/resources/BUILD b/tensorflow_serving/resources/BUILD index 9b4fea20935..8db77715c6d 100644 --- a/tensorflow_serving/resources/BUILD +++ b/tensorflow_serving/resources/BUILD @@ -26,7 +26,7 @@ serving_proto_library( srcs = ["resources.proto"], cc_api_version = 2, visibility = ["//visibility:public"], - deps = ["@protobuf_archive//:cc_wkt_protos"], + deps = ["@com_google_protobuf//:cc_wkt_protos"], ) cc_library( diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index 0675e45a770..240f0c7fbe7 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -30,8 +30,8 @@ serving_proto_library( "//visibility:public", ], deps = [ + "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/core:protos_all_cc", - "@protobuf_archive//:cc_wkt_protos", ], ) @@ -49,12 +49,12 @@ cc_library( "//tensorflow_serving/resources:resource_values", "//tensorflow_serving/resources:resources_proto", "//tensorflow_serving/util:file_probing_env", + "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core/kernels/batching_util:batch_scheduler", "@org_tensorflow//tensorflow/core/kernels/batching_util:shared_batch_scheduler", - "@protobuf_archive//:cc_wkt_protos", ], ) @@ -72,6 +72,7 @@ cc_test( "//tensorflow_serving/resources:resources_proto", "//tensorflow_serving/test_util", "//tensorflow_serving/util/test_util:mock_file_probing_env", + "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/contrib/session_bundle", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:framework", @@ -79,7 +80,6 @@ cc_test( "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", "@org_tensorflow//tensorflow/core/kernels/batching_util:shared_batch_scheduler", - "@protobuf_archive//:cc_wkt_protos", ], ) @@ -110,11 +110,11 @@ cc_library( ":session_bundle_config_proto", "//tensorflow_serving/resources:resources_proto", "//tensorflow_serving/test_util", + "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/cc/saved_model:tag_constants", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:test", - "@protobuf_archive//:cc_wkt_protos", ], ) @@ -151,12 +151,12 @@ cc_test( ":session_bundle_factory", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", + "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/contrib/session_bundle", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:test", - "@protobuf_archive//:cc_wkt_protos", ], ) @@ -197,12 +197,12 @@ cc_test( ":saved_model_bundle_factory", ":session_bundle_config_proto", "//tensorflow_serving/core/test_util:test_main", + "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/cc/saved_model:tag_constants", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:test", - "@protobuf_archive//:cc_wkt_protos", ], ) @@ -297,10 +297,10 @@ cc_test( "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/resources:resources_proto", "//tensorflow_serving/test_util", + "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:test", - "@protobuf_archive//:cc_wkt_protos", ], ) @@ -532,6 +532,8 @@ cc_test( "//tensorflow_serving/model_servers:model_platform_types", "//tensorflow_serving/model_servers:platform_config_util", "//tensorflow_serving/test_util", + "@com_google_protobuf//:cc_wkt_protos", + "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", "@org_tensorflow//tensorflow/contrib/session_bundle", @@ -539,8 +541,6 @@ cc_test( "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", - "@protobuf_archive//:cc_wkt_protos", - "@protobuf_archive//:protobuf", ], ) @@ -613,6 +613,7 @@ cc_test( "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", "//tensorflow_serving/util:optional", + "@com_google_protobuf//:protobuf_lite", "@org_tensorflow//tensorflow/contrib/session_bundle", "@org_tensorflow//tensorflow/contrib/session_bundle:bundle_shim", "@org_tensorflow//tensorflow/contrib/session_bundle:manifest_proto_cc", @@ -620,7 +621,6 @@ cc_test( "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", - "@protobuf_archive//:protobuf_lite", ], ) @@ -745,13 +745,13 @@ cc_test( "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", "//tensorflow_serving/util:optional", + "@com_google_protobuf//:protobuf_lite", "@org_tensorflow//tensorflow/contrib/session_bundle", "@org_tensorflow//tensorflow/contrib/session_bundle:bundle_shim", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", - "@protobuf_archive//:protobuf_lite", ], ) @@ -769,11 +769,11 @@ cc_library( "//tensorflow_serving/servables/tensorflow:classifier", "//tensorflow_serving/servables/tensorflow:regressor", "//tensorflow_serving/servables/tensorflow:util", + "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", "@org_tensorflow//tensorflow/contrib/session_bundle", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", - "@protobuf_archive//:protobuf", ], ) @@ -816,11 +816,11 @@ cc_library( "//tensorflow_serving/apis:input_proto", "//tensorflow_serving/apis:model_proto", "//tensorflow_serving/model_servers:server_core", + "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", - "@protobuf_archive//:protobuf", ], ) @@ -862,12 +862,12 @@ cc_library( "//tensorflow_serving/apis:model_proto", "//tensorflow_serving/apis/internal:serialized_input_proto", "//tensorflow_serving/util:optional", + "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", - "@protobuf_archive//:cc_wkt_protos", ], ) @@ -879,13 +879,13 @@ cc_test( ":util", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", + "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", "@org_tensorflow//tensorflow/core:testlib", - "@protobuf_archive//:cc_wkt_protos", ], ) @@ -901,12 +901,12 @@ cc_library( ":session_bundle_config_proto", ":util", "//tensorflow_serving/apis:prediction_log_proto", + "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/cc/saved_model:constants", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", - "@protobuf_archive//:cc_wkt_protos", ], ) @@ -923,6 +923,7 @@ cc_test( "//tensorflow_serving/core/test_util:mock_session", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", + "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/cc/saved_model:constants", "@org_tensorflow//tensorflow/contrib/session_bundle:manifest_proto_cc", "@org_tensorflow//tensorflow/core:framework", @@ -930,6 +931,5 @@ cc_test( "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", "@org_tensorflow//tensorflow/core:testlib", - "@protobuf_archive//:cc_wkt_protos", ], ) diff --git a/tensorflow_serving/serving.bzl b/tensorflow_serving/serving.bzl index e474842b23e..ca34504683e 100644 --- a/tensorflow_serving/serving.bzl +++ b/tensorflow_serving/serving.bzl @@ -1,5 +1,5 @@ -load("@protobuf_archive//:protobuf.bzl", "cc_proto_library") -load("@protobuf_archive//:protobuf.bzl", "py_proto_library") +load("@com_google_protobuf//:protobuf.bzl", "cc_proto_library") +load("@com_google_protobuf//:protobuf.bzl", "py_proto_library") def serving_proto_library( name, @@ -23,9 +23,9 @@ def serving_proto_library( name = name, srcs = srcs, deps = deps, - cc_libs = ["@protobuf_archive//:protobuf"], - protoc = "@protobuf_archive//:protoc", - default_runtime = "@protobuf_archive//:protobuf", + cc_libs = ["@com_google_protobuf//:protobuf"], + protoc = "@com_google_protobuf//:protoc", + default_runtime = "@com_google_protobuf//:protobuf", use_grpc_plugin = use_grpc_plugin, testonly = testonly, visibility = visibility, @@ -40,9 +40,9 @@ def serving_proto_library_py(name, proto_library, srcs = [], deps = [], visibili name = name, srcs = srcs, srcs_version = "PY2AND3", - deps = ["@protobuf_archive//:protobuf_python"] + deps, - default_runtime = "@protobuf_archive//:protobuf_python", - protoc = "@protobuf_archive//:protoc", + deps = ["@com_google_protobuf//:protobuf_python"] + deps, + default_runtime = "@com_google_protobuf//:protobuf_python", + protoc = "@com_google_protobuf//:protoc", visibility = visibility, testonly = testonly, ) diff --git a/tensorflow_serving/test_util/BUILD b/tensorflow_serving/test_util/BUILD index 698f0d29328..2760da3a29f 100644 --- a/tensorflow_serving/test_util/BUILD +++ b/tensorflow_serving/test_util/BUILD @@ -24,9 +24,9 @@ cc_library( hdrs = ["test_util.h"], deps = [ "@com_google_googletest//:gtest", + "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/core", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:test", - "@protobuf_archive//:protobuf", ], ) diff --git a/tensorflow_serving/util/BUILD b/tensorflow_serving/util/BUILD index 0f3f6c6d1a7..393bbc0cc72 100644 --- a/tensorflow_serving/util/BUILD +++ b/tensorflow_serving/util/BUILD @@ -48,8 +48,8 @@ cc_library( visibility = ["//visibility:public"], deps = [ ":class_registration_util", + "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/core:lib", - "@protobuf_archive//:cc_wkt_protos", ], ) @@ -375,11 +375,11 @@ cc_test( "//tensorflow_serving/apis:regression_proto", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", + "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", - "@protobuf_archive//:protobuf", ], ) @@ -392,7 +392,7 @@ serving_proto_library( srcs = ["class_registration_test.proto"], cc_api_version = 2, deps = [ - "@protobuf_archive//:cc_wkt_protos", + "@com_google_protobuf//:cc_wkt_protos", ], ) From c4fc8f610e0a14ed5759089666138932bdf4fe1f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 24 Jun 2019 12:02:01 -0700 Subject: [PATCH 3282/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9f85200c-2439-4dbf-8375-64d1dd34a5ba PiperOrigin-RevId: 254806239 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7acdc860768..969193305eb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d60941531b7aef520298e89d779457a0fee20e7bcaf51c1ab9e9e4bffdd8b016", - git_commit = "1d589da7852a4a61ae6135876e6db53c7be33b89", + sha256 = "ca96db216db63ee066e4724863cb208b027099ecefeb6f61f9a00551cf2008b0", + git_commit = "fd3ec18ecfab1f4ef1adc06d56e78237e66631fa", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 66b510fe38c9325581826168db37982bd057864b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 24 Jun 2019 18:01:59 -0700 Subject: [PATCH 3283/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6ee20f71-8dc6-409b-b898-43d7bb8c9915 PiperOrigin-RevId: 254876285 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 969193305eb..d0beffa206d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ca96db216db63ee066e4724863cb208b027099ecefeb6f61f9a00551cf2008b0", - git_commit = "fd3ec18ecfab1f4ef1adc06d56e78237e66631fa", + sha256 = "5ffd36f35942436975de7602a79e19a32f1d3ec7be8390a741eda3ab86aa0c12", + git_commit = "1d29b5c344c63379a1a8587d52210267352c6911", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d6e86f1890c4452130a25d613d7ababeebc5cd75 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 25 Jun 2019 00:02:38 -0700 Subject: [PATCH 3284/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/35c8285e-844b-4e9c-b6a3-bfcb32c10ae7 PiperOrigin-RevId: 254911394 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d0beffa206d..85e60bb5756 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5ffd36f35942436975de7602a79e19a32f1d3ec7be8390a741eda3ab86aa0c12", - git_commit = "1d29b5c344c63379a1a8587d52210267352c6911", + sha256 = "fa424aa3e6ebb5cca1e9192709fb2aa68b59728588d97104551952f493e2a3fb", + git_commit = "71241a6afd27a9f99039a7b373cb46553e8f701f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c9e6e8d66bb4623cd5cb32fc05ab64fef78cb179 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 25 Jun 2019 06:02:03 -0700 Subject: [PATCH 3285/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5e37afab-b71f-42c3-bcba-df77fc5261a5 PiperOrigin-RevId: 254953612 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 85e60bb5756..ecf2efba466 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fa424aa3e6ebb5cca1e9192709fb2aa68b59728588d97104551952f493e2a3fb", - git_commit = "71241a6afd27a9f99039a7b373cb46553e8f701f", + sha256 = "aaa5b539cd65994618c601ecd39fdbbeff6b432c0a18ba4eedf60787935d2c73", + git_commit = "2f4121b1a7266aef4007457aa348c5f7f01eb539", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7e461a35042410f8e97eddc588e4d30497c89037 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 25 Jun 2019 12:02:36 -0700 Subject: [PATCH 3286/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c986162c-dcf2-4e65-a151-d77027fd090d PiperOrigin-RevId: 255018730 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ecf2efba466..7453a1b7dda 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "aaa5b539cd65994618c601ecd39fdbbeff6b432c0a18ba4eedf60787935d2c73", - git_commit = "2f4121b1a7266aef4007457aa348c5f7f01eb539", + sha256 = "85a97be7498661a161a401556340cef9e60e6f432a2749f0d51996631130201d", + git_commit = "762f3bf5bac3ffb685018be6110a473a23dd8825", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8484e043b49186f1f4ef345942965e3a699a47e0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 25 Jun 2019 18:02:13 -0700 Subject: [PATCH 3287/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7035bb6c-a294-4b3c-9e64-50c99144099f PiperOrigin-RevId: 255089438 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7453a1b7dda..dd18ec8661d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "85a97be7498661a161a401556340cef9e60e6f432a2749f0d51996631130201d", - git_commit = "762f3bf5bac3ffb685018be6110a473a23dd8825", + sha256 = "72ac9b1980fa73db898910792388a8141fa73dc7c914030464f9be5e88903d64", + git_commit = "1de620388de9b29bdc2b0934ac9c48944701420e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5655879469b96aabb8b7bd7cee96d59bc5394daa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 Jun 2019 00:02:03 -0700 Subject: [PATCH 3288/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9e9d4b23-fb04-4937-b762-b5023dee37d3 PiperOrigin-RevId: 255127082 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dd18ec8661d..1052a6f156c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "72ac9b1980fa73db898910792388a8141fa73dc7c914030464f9be5e88903d64", - git_commit = "1de620388de9b29bdc2b0934ac9c48944701420e", + sha256 = "ab63a195098febdee9a79a2e6f9bbbfee8a04e517f173be550ca223a3a8b5d5b", + git_commit = "296a4808cc69ec5b11a2e0f518e0bd0777af3a47", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 53786ffed33866010e1f62399ede2a7bccc4e1bf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 Jun 2019 06:04:11 -0700 Subject: [PATCH 3289/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e96b88aa-462f-4644-94cb-ee0ec60ae948 PiperOrigin-RevId: 255172481 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1052a6f156c..7bf3f5caf88 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ab63a195098febdee9a79a2e6f9bbbfee8a04e517f173be550ca223a3a8b5d5b", - git_commit = "296a4808cc69ec5b11a2e0f518e0bd0777af3a47", + sha256 = "bd7e6c9f0ef9bdef9953df009797bd71881b5a1694b62c37c07eb7a0d9a1a953", + git_commit = "4e40e863abc64d7d80c448c392a8871eb5de6630", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7b734cb6a6e17a973a4436557b8715e54ede8fac Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 Jun 2019 12:03:15 -0700 Subject: [PATCH 3290/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c6fecf27-8d31-4dfd-884e-0e6b32e1ae0f PiperOrigin-RevId: 255235994 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7bf3f5caf88..2a114b9b030 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bd7e6c9f0ef9bdef9953df009797bd71881b5a1694b62c37c07eb7a0d9a1a953", - git_commit = "4e40e863abc64d7d80c448c392a8871eb5de6630", + sha256 = "c89af9d6d712b4b1033a0c5d3c696c4e51ae28ab2a1756c9aaf13d1f32440558", + git_commit = "a3e863966eefc5f2397f7c2b02a9d062434c2463", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a3333d94d1ea7b8827545f8e4ec1df6ba5e998e4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 Jun 2019 18:02:12 -0700 Subject: [PATCH 3291/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9637b537-1aa0-46ee-890a-c37ed0d3711c PiperOrigin-RevId: 255303236 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2a114b9b030..e9c7f9e317a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c89af9d6d712b4b1033a0c5d3c696c4e51ae28ab2a1756c9aaf13d1f32440558", - git_commit = "a3e863966eefc5f2397f7c2b02a9d062434c2463", + sha256 = "ef6deb8e11a2fb1010aaa3f2e67807b731301565ee52d5364d27fefe08cee940", + git_commit = "743ab0df9de3ce6c9939a3bb48e47607dd46d735", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f73440831a0001237dc26608bd998f67617e60f8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Jun 2019 00:02:37 -0700 Subject: [PATCH 3292/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/60b194ec-375a-4f60-bcfd-dfb3af1410de PiperOrigin-RevId: 255341033 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e9c7f9e317a..211856311ff 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ef6deb8e11a2fb1010aaa3f2e67807b731301565ee52d5364d27fefe08cee940", - git_commit = "743ab0df9de3ce6c9939a3bb48e47607dd46d735", + sha256 = "b2da05835679154f0b092bbbf4caf8cdcfe06eec81b892c1c7a9beb3dfb0d08c", + git_commit = "2f8c3786217c6d7ee303804a9efcfbd55e8e57d5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2446bb35383a40c57a771e3030a90f98dffa9986 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Jun 2019 06:02:20 -0700 Subject: [PATCH 3293/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0b33cfab-85ad-44e5-b56a-8dd0707048f9 PiperOrigin-RevId: 255384585 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 211856311ff..f8b07f02fd9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b2da05835679154f0b092bbbf4caf8cdcfe06eec81b892c1c7a9beb3dfb0d08c", - git_commit = "2f8c3786217c6d7ee303804a9efcfbd55e8e57d5", + sha256 = "b2a38291ff2d35935e3296ff2bc2c8e16d5aea5133d4c3fc44aaa291458bb882", + git_commit = "0ffa97fd8470d14310d69324017f7fbbc76f1c38", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6a7d93257dbabf764cb08b7bfdae7bcf1840b591 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Jun 2019 12:03:04 -0700 Subject: [PATCH 3294/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d46d363c-d539-4167-b25c-72a290318adf PiperOrigin-RevId: 255449934 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f8b07f02fd9..3cc2c96c767 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b2a38291ff2d35935e3296ff2bc2c8e16d5aea5133d4c3fc44aaa291458bb882", - git_commit = "0ffa97fd8470d14310d69324017f7fbbc76f1c38", + sha256 = "f4bc8e756ea4972cac4185d73654577562fa3dc50e21e459a5b5a3d58669dc66", + git_commit = "3c9d8867a3e8a9d5d4b7f5d7dfbbc114c12ce17c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 026c38b4fd333d5be1165094758056a5437b87c5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Jun 2019 18:02:46 -0700 Subject: [PATCH 3295/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c98329a3-fecd-41f1-ab2b-a80bd75f4477 PiperOrigin-RevId: 255516690 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3cc2c96c767..a74e53fd795 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f4bc8e756ea4972cac4185d73654577562fa3dc50e21e459a5b5a3d58669dc66", - git_commit = "3c9d8867a3e8a9d5d4b7f5d7dfbbc114c12ce17c", + sha256 = "91c8eab7b8e3e2cceb4663e52438956aaf235ff0cb92640dcf707cd705ed2aba", + git_commit = "049db1fb3fadc7b23a264ee8b87240bf3d535bff", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4522459ebd53cd76171f71b5781d04e1b8200d3b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 28 Jun 2019 00:02:13 -0700 Subject: [PATCH 3296/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5471d2d3-1b2c-4a5f-bc5e-e48c373355d2 PiperOrigin-RevId: 255549741 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a74e53fd795..b528160a1e1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "91c8eab7b8e3e2cceb4663e52438956aaf235ff0cb92640dcf707cd705ed2aba", - git_commit = "049db1fb3fadc7b23a264ee8b87240bf3d535bff", + sha256 = "33cd5a87c509b8a4eaa03614584cb146a29ebb36ea265405f6ad81ad8fe71b73", + git_commit = "bafa0371c8f9f0227f74e2cc7ddc347ebcdabdc0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 44680358f39bcc5c50e1628a4ba56e84d0c19b74 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 28 Jun 2019 06:02:14 -0700 Subject: [PATCH 3297/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/83ca4454-cc32-4fa5-8df6-99658f535bdf PiperOrigin-RevId: 255587624 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b528160a1e1..b87f2c77d90 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "33cd5a87c509b8a4eaa03614584cb146a29ebb36ea265405f6ad81ad8fe71b73", - git_commit = "bafa0371c8f9f0227f74e2cc7ddc347ebcdabdc0", + sha256 = "fb62191ef32827feba1b4a380835e09250156a541281faff8d3a9799c799a647", + git_commit = "d97ccf68c903d488f28eb24c1b9edfbeefb9211b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2cef996da6e50c16d10b9ae51f9d6b0b5a60f693 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 28 Jun 2019 12:02:20 -0700 Subject: [PATCH 3298/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/45ad9c4b-59e6-4bcd-939a-a3079340e02a PiperOrigin-RevId: 255643430 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b87f2c77d90..ec9afbacee9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fb62191ef32827feba1b4a380835e09250156a541281faff8d3a9799c799a647", - git_commit = "d97ccf68c903d488f28eb24c1b9edfbeefb9211b", + sha256 = "571bd2d0a4e1bfe66955e70c5d8a5b6e86dbf0a16d6f8aca78b7b6615625bae6", + git_commit = "645b3cb313cb9069dcbe3309b2e44063c547b2d1", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7f89167f220e65ce814f66b657267f907258d045 Mon Sep 17 00:00:00 2001 From: Mingming Liu Date: Fri, 28 Jun 2019 17:54:57 -0700 Subject: [PATCH 3299/8103] Internal change. PiperOrigin-RevId: 255700846 --- tensorflow_serving/model_servers/BUILD | 1 + .../model_servers/server_core.cc | 1 + .../model_servers/server_core.h | 13 +++++ tensorflow_serving/servables/tensorflow/BUILD | 4 +- .../servables/tensorflow/predict_impl.cc | 44 ++++++++++++----- .../servables/tensorflow/predict_util.cc | 48 +++++++++++++++---- .../servables/tensorflow/predict_util.h | 26 ++++++++-- 7 files changed, 108 insertions(+), 29 deletions(-) diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 39451548594..670644a958e 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -81,6 +81,7 @@ cc_library( "//tensorflow_serving/core:source_adapter", "//tensorflow_serving/core:storage_path", "//tensorflow_serving/resources:resource_values", + "//tensorflow_serving/servables/tensorflow:predict_util", "//tensorflow_serving/servables/tensorflow:saved_model_bundle_source_adapter", "//tensorflow_serving/servables/tensorflow:session_bundle_source_adapter", "//tensorflow_serving/servables/tensorflow:session_bundle_source_adapter_proto", diff --git a/tensorflow_serving/model_servers/server_core.cc b/tensorflow_serving/model_servers/server_core.cc index cdc1e7e834e..c1c0a772dd8 100644 --- a/tensorflow_serving/model_servers/server_core.cc +++ b/tensorflow_serving/model_servers/server_core.cc @@ -32,6 +32,7 @@ limitations under the License. #include "tensorflow_serving/servables/tensorflow/session_bundle_source_adapter.pb.h" #include "tensorflow_serving/sources/storage_path/file_system_storage_path_source.h" #include "tensorflow_serving/sources/storage_path/file_system_storage_path_source.pb.h" +#include "util/task/status_builder.h" namespace tensorflow { namespace serving { diff --git a/tensorflow_serving/model_servers/server_core.h b/tensorflow_serving/model_servers/server_core.h index 9e3fbe043f7..ac22b9f25d3 100644 --- a/tensorflow_serving/model_servers/server_core.h +++ b/tensorflow_serving/model_servers/server_core.h @@ -40,6 +40,7 @@ limitations under the License. #include "tensorflow_serving/core/source.h" #include "tensorflow_serving/core/source_adapter.h" #include "tensorflow_serving/core/storage_path.h" +#include "tensorflow_serving/servables/tensorflow/predict_util.h" #include "tensorflow_serving/sources/storage_path/file_system_storage_path_source.h" #include "tensorflow_serving/util/event_bus.h" #include "tensorflow_serving/util/optional.h" @@ -178,6 +179,13 @@ class ServerCore : public Manager { // Whether to allow assigning unused version labels to models that are not // available yet. bool allow_version_labels_for_unavailable_models = false; + + // In a predict handler, this option specifies how to serialize tensors + // (e.g: as proto fields or as proto content). + // Serialize as proto fields by default, for backward compatibility. + internal::PredictResponseTensorSerializationOption + predict_response_tensor_serialization_option = + internal::PredictResponseTensorSerializationOption::kAsProtoField; }; virtual ~ServerCore() = default; @@ -248,6 +256,11 @@ class ServerCore : public Manager { return options_.server_request_logger->Log(request, response, log_metadata); } + internal::PredictResponseTensorSerializationOption + predict_response_tensor_serialization_option() const { + return options_.predict_response_tensor_serialization_option; + } + protected: ServerCore(Options options); diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index 240f0c7fbe7..8d3c99968fb 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -425,10 +425,10 @@ cc_library( ], deps = [ ":predict_util", + ":util", "//tensorflow_serving/apis:predict_proto", "//tensorflow_serving/core:servable_handle", "//tensorflow_serving/model_servers:server_core", - "//tensorflow_serving/servables/tensorflow:util", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", @@ -443,8 +443,8 @@ cc_library( "//visibility:public", ], deps = [ + ":util", "//tensorflow_serving/apis:predict_proto", - "//tensorflow_serving/servables/tensorflow:util", "//tensorflow_serving/util:optional", "@com_google_absl//absl/strings", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", diff --git a/tensorflow_serving/servables/tensorflow/predict_impl.cc b/tensorflow_serving/servables/tensorflow/predict_impl.cc index fd02d15d452..f9cfb149bdb 100644 --- a/tensorflow_serving/servables/tensorflow/predict_impl.cc +++ b/tensorflow_serving/servables/tensorflow/predict_impl.cc @@ -18,6 +18,7 @@ limitations under the License. #include #include +#include "absl/strings/substitute.h" #include "tensorflow/cc/saved_model/loader.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow_serving/core/servable_handle.h" @@ -29,11 +30,12 @@ namespace serving { namespace { -Status SessionBundlePredict(const RunOptions& run_options, - const MetaGraphDef& meta_graph_def, - const optional& servable_version, - const PredictRequest& request, - PredictResponse* response, Session* session) { +Status SessionBundlePredict( + const RunOptions& run_options, const MetaGraphDef& meta_graph_def, + const optional& servable_version, + const internal::PredictResponseTensorSerializationOption option, + const PredictRequest& request, PredictResponse* response, + Session* session) { // Validate signatures. Signature signature; TF_RETURN_IF_ERROR(GetNamedSignature("inputs", meta_graph_def, &signature)); @@ -117,9 +119,20 @@ Status SessionBundlePredict(const RunOptions& run_options, return tensorflow::Status(tensorflow::error::UNKNOWN, "Predict internal error"); } - for (int i = 0; i < outputs.size(); i++) { - outputs[i].AsProtoField( - &((*response->mutable_outputs())[output_aliases[i]])); + + switch (option) { + case internal::PredictResponseTensorSerializationOption::kAsProtoField: { + for (int i = 0; i < outputs.size(); i++) { + outputs[i].AsProtoField( + &((*response->mutable_outputs())[output_aliases[i]])); + } + } break; + case internal::PredictResponseTensorSerializationOption::kAsProtoContent: { + for (int i = 0; i < outputs.size(); i++) { + outputs[i].AsProtoTensorContent( + &((*response->mutable_outputs())[output_aliases[i]])); + } + } break; } return Status::OK(); @@ -147,14 +160,19 @@ Status TensorflowPredictor::PredictWithModelSpec(const RunOptions& run_options, if (use_saved_model_) { ServableHandle bundle; TF_RETURN_IF_ERROR(core->GetServableHandle(model_spec, &bundle)); - return RunPredict(run_options, bundle->meta_graph_def, bundle.id().version, - bundle->session.get(), request, response); + return internal::RunPredict( + run_options, bundle->meta_graph_def, bundle.id().version, + core->predict_response_tensor_serialization_option(), + bundle->session.get(), request, response); } ServableHandle bundle; TF_RETURN_IF_ERROR(core->GetServableHandle(model_spec, &bundle)); - return SessionBundlePredict(run_options, bundle->meta_graph_def, - bundle.id().version, request, response, - bundle->session.get()); + // SessionBundle is officially deprecated. SessionBundlePredict is for + // backward compatibility. + return SessionBundlePredict( + run_options, bundle->meta_graph_def, bundle.id().version, + core->predict_response_tensor_serialization_option(), request, response, + bundle->session.get()); } } // namespace serving diff --git a/tensorflow_serving/servables/tensorflow/predict_util.cc b/tensorflow_serving/servables/tensorflow/predict_util.cc index afa9710a4a8..15d4c640c25 100644 --- a/tensorflow_serving/servables/tensorflow/predict_util.cc +++ b/tensorflow_serving/servables/tensorflow/predict_util.cc @@ -22,6 +22,7 @@ limitations under the License. #include #include "absl/strings/str_join.h" +#include "absl/strings/substitute.h" #include "tensorflow/cc/saved_model/signature_constants.h" #include "tensorflow/contrib/session_bundle/signature.h" #include "tensorflow/core/framework/tensor.pb.h" @@ -146,28 +147,44 @@ Status PreProcessPrediction(const SignatureDef& signature, } // Validate results and populate a PredictResponse. +// Tensors are serialized as specified. Status PostProcessPredictionResult( - const SignatureDef& signature, const std::vector& output_tensor_aliases, - const std::vector& output_tensors, PredictResponse* response) { + const std::vector& output_tensors, + const internal::PredictResponseTensorSerializationOption option, + PredictResponse* response) { // Validate and return output. if (output_tensors.size() != output_tensor_aliases.size()) { return tensorflow::Status(tensorflow::error::UNKNOWN, "Predict internal error"); } - for (int i = 0; i < output_tensors.size(); i++) { - output_tensors[i].AsProtoField( - &((*response->mutable_outputs())[output_tensor_aliases[i]])); + switch (option) { + case internal::PredictResponseTensorSerializationOption::kAsProtoField: { + for (int i = 0; i < output_tensors.size(); i++) { + output_tensors[i].AsProtoField( + &((*response->mutable_outputs())[output_tensor_aliases[i]])); + } + } break; + case internal::PredictResponseTensorSerializationOption::kAsProtoContent: { + for (int i = 0; i < output_tensors.size(); i++) { + output_tensors[i].AsProtoTensorContent( + &((*response->mutable_outputs())[output_tensor_aliases[i]])); + } + } break; } + return Status::OK(); } } // namespace -Status RunPredict(const RunOptions& run_options, - const MetaGraphDef& meta_graph_def, - const optional& servable_version, Session* session, - const PredictRequest& request, PredictResponse* response) { +namespace internal { +Status RunPredict( + const RunOptions& run_options, const MetaGraphDef& meta_graph_def, + const optional& servable_version, + const internal::PredictResponseTensorSerializationOption option, + Session* session, const PredictRequest& request, + PredictResponse* response) { // Validate signatures. const string signature_name = request.model_spec().signature_name().empty() ? kDefaultServingSignatureDefKey @@ -194,9 +211,20 @@ Status RunPredict(const RunOptions& run_options, output_tensor_names, {}, &outputs, &run_metadata)); - return PostProcessPredictionResult(signature, output_tensor_aliases, outputs, + return PostProcessPredictionResult(output_tensor_aliases, outputs, option, response); } +} // namespace internal + +Status RunPredict(const RunOptions& run_options, + const MetaGraphDef& meta_graph_def, + const optional& servable_version, Session* session, + const PredictRequest& request, PredictResponse* response) { + return internal::RunPredict( + run_options, meta_graph_def, servable_version, + internal::PredictResponseTensorSerializationOption::kAsProtoField, + session, request, response); +} } // namespace serving } // namespace tensorflow diff --git a/tensorflow_serving/servables/tensorflow/predict_util.h b/tensorflow_serving/servables/tensorflow/predict_util.h index c23be27a3cb..ca741e68f40 100644 --- a/tensorflow_serving/servables/tensorflow/predict_util.h +++ b/tensorflow_serving/servables/tensorflow/predict_util.h @@ -24,13 +24,31 @@ limitations under the License. namespace tensorflow { namespace serving { +namespace internal { +// Whether to serialize proto as field or content. +enum class PredictResponseTensorSerializationOption { + kAsProtoField = 0, + kAsProtoContent = 1, +}; + +// Similar to RunPredict below, but allows specification of a serialization +// option for the TensorProtos in the response. +Status RunPredict( + const RunOptions& run_options, const MetaGraphDef& meta_graph_def, + const optional& servable_version, + const PredictResponseTensorSerializationOption tensor_serialization_option, + Session* session, const PredictRequest& request, PredictResponse* response); + +} // namespace internal + // Implementation of Predict using the SavedModel SignatureDef format. +// +// IMPLEMENTATION NOTES: Calls the internal::RunPredict function above by +// specifying serialization option as kAsProtoField for backward compatibility. Status RunPredict(const RunOptions& run_options, const MetaGraphDef& meta_graph_def, - const optional& servable_version, - Session* session, - const PredictRequest& request, - PredictResponse* response); + const optional& servable_version, Session* session, + const PredictRequest& request, PredictResponse* response); } // namespace serving } // namespace tensorflow From bdcf20b9d7aa0ff09ff376209097930a802d460c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 28 Jun 2019 18:02:25 -0700 Subject: [PATCH 3300/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/838ae51a-3ffa-4ecb-902b-585d1f514980 PiperOrigin-RevId: 255701597 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ec9afbacee9..3e82608b09b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "571bd2d0a4e1bfe66955e70c5d8a5b6e86dbf0a16d6f8aca78b7b6615625bae6", - git_commit = "645b3cb313cb9069dcbe3309b2e44063c547b2d1", + sha256 = "f0e77f5061e184b077dfe0213899381aefa2b0bcb55c0cb84dd3152c9be0a617", + git_commit = "3ef978357dca727a5f6d2fcdbbefa67d08a62e04", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 869475df85f49840c39da4a1a6a9cf189022c4f4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 29 Jun 2019 00:02:31 -0700 Subject: [PATCH 3301/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8d8b355e-ee41-42d1-add2-59420bde9c28 PiperOrigin-RevId: 255726810 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3e82608b09b..7c56c494ba5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f0e77f5061e184b077dfe0213899381aefa2b0bcb55c0cb84dd3152c9be0a617", - git_commit = "3ef978357dca727a5f6d2fcdbbefa67d08a62e04", + sha256 = "5a2239890ce97740ab0dd34845abe095e001519e59e9f14ab4a528f1d4379eba", + git_commit = "cf5e63accb51efda5138c3fcd10d7fa7de9c317b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b3ba4ce10d2094f21d2dd7d8d26ff84a5fba8858 Mon Sep 17 00:00:00 2001 From: Mingming Liu Date: Mon, 1 Jul 2019 09:55:24 -0700 Subject: [PATCH 3302/8103] Internal change PiperOrigin-RevId: 255975915 --- tensorflow_serving/model_servers/BUILD | 1 + tensorflow_serving/model_servers/server_core.cc | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 670644a958e..7e1206531af 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -90,6 +90,7 @@ cc_library( "//tensorflow_serving/util:event_bus", "//tensorflow_serving/util:optional", "//tensorflow_serving/util:unique_ptr_with_deps", + "@com_google_absl//absl/base:core_headers", "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/core:lib", ], diff --git a/tensorflow_serving/model_servers/server_core.cc b/tensorflow_serving/model_servers/server_core.cc index c1c0a772dd8..cdc1e7e834e 100644 --- a/tensorflow_serving/model_servers/server_core.cc +++ b/tensorflow_serving/model_servers/server_core.cc @@ -32,7 +32,6 @@ limitations under the License. #include "tensorflow_serving/servables/tensorflow/session_bundle_source_adapter.pb.h" #include "tensorflow_serving/sources/storage_path/file_system_storage_path_source.h" #include "tensorflow_serving/sources/storage_path/file_system_storage_path_source.pb.h" -#include "util/task/status_builder.h" namespace tensorflow { namespace serving { From aa9dddb93576c814b97947d6386d400cf6c87679 Mon Sep 17 00:00:00 2001 From: Martijn Vels Date: Mon, 1 Jul 2019 11:28:12 -0700 Subject: [PATCH 3303/8103] Replace NumSchedulableCPUs() with MaxParallelism(). PiperOrigin-RevId: 255996064 --- tensorflow_serving/batching/streaming_batch_scheduler.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/batching/streaming_batch_scheduler.h b/tensorflow_serving/batching/streaming_batch_scheduler.h index c9b7fbf44c5..2acb5f848c1 100644 --- a/tensorflow_serving/batching/streaming_batch_scheduler.h +++ b/tensorflow_serving/batching/streaming_batch_scheduler.h @@ -143,7 +143,7 @@ class StreamingBatchScheduler : public BatchScheduler { // The number of threads to use to process batches. // Must be >= 1, and should be tuned carefully. - int num_batch_threads = port::NumSchedulableCPUs(); + int num_batch_threads = port::MaxParallelism(); // The following options are typically only overridden by test code. From a323b8c00832bacb9377ae34419ba31de0ca2248 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Jul 2019 12:02:25 -0700 Subject: [PATCH 3304/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5bf51d6c-4233-4085-8802-178866ba7e97 PiperOrigin-RevId: 256002990 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7c56c494ba5..c8f3485e67a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5a2239890ce97740ab0dd34845abe095e001519e59e9f14ab4a528f1d4379eba", - git_commit = "cf5e63accb51efda5138c3fcd10d7fa7de9c317b", + sha256 = "95c0c07e0953a4f4a357ea57acb4a656cdf5a1ac619d2f236b4f61f1a573c84d", + git_commit = "5fbe995c00ca5d31243a8209f348800656b265f7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b5c24e3e3849978a551db3aae3854c8794d10124 Mon Sep 17 00:00:00 2001 From: Mihai Maruseac Date: Mon, 1 Jul 2019 15:55:34 -0700 Subject: [PATCH 3305/8103] Don't run model_servers:tensorflow_model_server_test under asan Test is flaky, hence we are required to disable it to fix CI jobs. PiperOrigin-RevId: 256050809 --- tensorflow_serving/model_servers/BUILD | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 7e1206531af..8afb78b8376 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -397,6 +397,9 @@ py_test( ], python_version = "PY2", srcs_version = "PY2AND3", + tags = [ + "noasan", # b/136281879 + ], deps = [ "//tensorflow_serving/apis:model_service_proto_py_pb2", "//tensorflow_serving/apis:prediction_service_proto_py_pb2", From 9a5851f6b1caf8d8c7916f8bc696c8b0f5bca16f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Jul 2019 18:02:30 -0700 Subject: [PATCH 3306/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/73f744f7-cc53-48a3-ae94-0d3df3ffe6cd PiperOrigin-RevId: 256072783 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c8f3485e67a..1779ae7d338 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "95c0c07e0953a4f4a357ea57acb4a656cdf5a1ac619d2f236b4f61f1a573c84d", - git_commit = "5fbe995c00ca5d31243a8209f348800656b265f7", + sha256 = "f1e04270b9c84b62cdea15c70adfed440718623d8c3c6ebfc962a1a5b2d008ac", + git_commit = "e4b162394af9e1b7b146c3848405f00ab30b2c50", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From bdb5e1c26bfe36432148f1e451fb3900a627aa62 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Jul 2019 00:02:14 -0700 Subject: [PATCH 3307/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/dd42f492-4276-437d-9b0c-c4369ed005b5 PiperOrigin-RevId: 256107655 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1779ae7d338..b59b9ba1761 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f1e04270b9c84b62cdea15c70adfed440718623d8c3c6ebfc962a1a5b2d008ac", - git_commit = "e4b162394af9e1b7b146c3848405f00ab30b2c50", + sha256 = "b6e6b50d6a126f3ff96f6907f101cb576d041a5a3c52587eb3c1bafe7e0f43d4", + git_commit = "780cef5dbba4f5ba6613d0b152f9c57aa88f2350", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d5737af083111c6573f2dd048ebc62b50e2fe948 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Jul 2019 06:02:18 -0700 Subject: [PATCH 3308/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f0ad448d-fd07-4b61-8d01-ec723492ada0 PiperOrigin-RevId: 256149837 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b59b9ba1761..7009d671165 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b6e6b50d6a126f3ff96f6907f101cb576d041a5a3c52587eb3c1bafe7e0f43d4", - git_commit = "780cef5dbba4f5ba6613d0b152f9c57aa88f2350", + sha256 = "3b8f0d6252ddd9f36e52cbcbb0e3925618f484ec8a08f534af74a2b92b550ed3", + git_commit = "bfad469d236f923f9e40f3c76dbb718d24984292", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a27bf5a834c3a9e1802fab65bc80c9be142f7cba Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Jul 2019 12:02:23 -0700 Subject: [PATCH 3309/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/760e0677-b077-441d-958d-eadda7a180bd PiperOrigin-RevId: 256211575 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7009d671165..9d530e1ac3c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3b8f0d6252ddd9f36e52cbcbb0e3925618f484ec8a08f534af74a2b92b550ed3", - git_commit = "bfad469d236f923f9e40f3c76dbb718d24984292", + sha256 = "3d51a46520170f726874265edbe1efd6a5ca30dab9a91a5b0e927ded70887519", + git_commit = "1979135fb76f8718d6e450e1e92cfed00af9f380", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8ff167d8fa1e27738ab175dd0f91e844f7d9e153 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Jul 2019 18:02:29 -0700 Subject: [PATCH 3310/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/32a5c6b3-438f-44db-aa9b-c28bf6798dcf PiperOrigin-RevId: 256277010 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9d530e1ac3c..af31b9a2987 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3d51a46520170f726874265edbe1efd6a5ca30dab9a91a5b0e927ded70887519", - git_commit = "1979135fb76f8718d6e450e1e92cfed00af9f380", + sha256 = "6301f16285246a1f0933e3bde096fb6a22e7ba52e57ca1472cb6fe5878767460", + git_commit = "64d3e2eb16a52f678249df943f25b0dde531c93e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From dc986268756ef45a3ffca4b8578dfdc69e015d29 Mon Sep 17 00:00:00 2001 From: Christina Sorokin Date: Tue, 2 Jul 2019 20:16:33 -0700 Subject: [PATCH 3311/8103] Release notes for 1.14 PiperOrigin-RevId: 256290192 --- RELEASE.md | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/RELEASE.md b/RELEASE.md index e46df0df534..2d52d758243 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,3 +1,54 @@ +# Release 1.14.0 + +## Major Features and Improvements + +None + +## Breaking Changes + +None + +## Bug Fixes and Other Changes + +* Add enforce_session_run_timeout inside Server::Options. (commit: de030640ec6ed2cd504ee0ad9335fb93aebe51b5) +* Update comments as new envs TF_NUM_INTEROP_THREADS and TF_NUM_INTRAOP_THREADS are added in tensorflow (commit: a32bc432ed3c6366cfbb540d4b86b1cc6b3acf22) +* Update TF Serving subsite config to import to /tfx/serving (commit: 6ac044af384bb0529d68ee1dd4fe287c2c55dc04) +* Allow multiple logging configs to be associated with a single model. (commit: d9b99a3efe4077a8936bd586b252486c8b24dd6f) +* Add -o option, to pass params to `docker` command. (commit: dd59021d3f807f23390afa8a2bc34a6f7029ed24) +* Change SerializedExampleListWithContext dependency. (commit: 7acaec7c594cddfe2f06b6536c579b1b58078807) +* Add servable_name to debugging log. (commit: e384bf406a5411a0539973c4c3aa13f0f889ebb3) +* Stop using reader locks (tf_shared_lock) on the read path of FastReadDynamicPtr. (commit: f04e583a6a700a4943a57b6758b3e131b0865e97) +* Clarify which model is being initialized. (commit: 5456ac57343a7962450eb80e9d4870dcb4b31ed4) +* Add saved model tags to logging metadata. These tags are used by (commit: 6320701645d5aeceac49a4f02cc629159559f143) +* Updates Apple platform config settings and allows TF serving (commit: c283ea580e4a51ececfacaa2b255fd0bb751c9ab) +* Update example section to use Docker (commit: a5fc8bbc20f712fd6c4c148ff4d94a9231b79ceb) +* Adds an option in SessionBundleConfig to repeat warmup replay n times per request. (commit: 15cd20263c8362f534afecbdf98b9d929eac70fd) +* Bazel 0.23.2 is the minimum version required to build. (commit: b8a377cbeea07d6173f1938e4fe507b7ff9d17cd) +* Disable MKLDNN contraction kernels by default (commit: a7f98b67e3f054e20bec86459a4f5dbf8eb45b08) +* improve tpu server warm up (commit: 63d31a33b4f6faeb0764bb159d403f2b49061aed) +* Re-enable MKLDNN contraction kernels by default. (commit: a075ebe5eff56f3311d6e2cc2d23e4e82567596b) +* Stop removing libnvinfer_plugin.so since future version of TF GPU builds depends on it. (commit: 23ceb08d771118a2abdd28835f126c8675ba2f60) +* Fix build failure with TF head sources. (commit: a02687e3fe96edc57c9ed4ad08cfbe5d9ba6e838) +* AspiredVersionsManager, CachingManager: forward Env to BasicManager. (commit: 28da549e382fa027897886afec83fca6e92da33c) +* Official PIP package releases are now tied to a specific version of TensorFlow (commit: 9514c37d22f0b728e2db9e8c6f28fb11ebde0fad) +* Improves top-level README documentation; (commit: f26deea38a506512690096ad81ffa5bb6c32a4b2) +* Bump the minimal Bazel version to 0.24.1 (commit: 96a716ca31f753b0c3efc1ef60779b77f5c60845) +* Add option to refuse to unload the last servable version. (commit: c8496b199cedf3e38a7ad0dc4c46db2b341b28e5) +* Add new device type for TPU. (commit: c74861d61131e2248a70d9c72317df8c49eb8f1a) +* Add ability to disable periodic filesystem polling (#1295). (commit: 72450555c83ea5e6d18d05362192ad85613b23b1) +* Fix incorrect formatting of decimal numbers in JSON output (#1332) (commit: d7c3b3deacbabf763ed44fb6932535016852e90a) +* Fixed the gzip uncompression support in the HTTP server for large request bodies. (commit: fb7835c7cd95c5b6b163cb2abd6a8b9a1a283689) +* Add stack memory resource kind. (commit: e56e72b3e4b9a597832734208a3da455f6db1a04) +* Adds ModelServer test for loading SavedModel exported from Keras Sequential API (commit: 9578f3d10c786c6714b9a8b481dd74f454402477) +* ignore SIGPIPE for libevent ,prevent the SIGPIPE signal from being raised, (commit: 8d88a5b3c4ac502113c798a470111ca65f47b0c2) + +## Thanks to our Contributors + +This release contains contributions from many people at Google, as well as: + +G. Hussain Chinoy, Karthik Vadla, Li Lao, mkim301, Tensorflow-Copybara, yjhjstz + + # Release 1.13.0 ## Major Features and Improvements From 3bd851d88cd2febcdec29a52bab1d7d225a3a54c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Jul 2019 20:28:26 -0700 Subject: [PATCH 3312/8103] Fixing Docker link PiperOrigin-RevId: 256291155 --- tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb b/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb index d9cd36ea291..5d4af3b3ca2 100644 --- a/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb +++ b/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb @@ -299,7 +299,7 @@ "\n", "We're preparing to install TensorFlow Serving using [Aptitude](https://wiki.debian.org/Aptitude) since this Colab runs in a Debian environment. We'll add the `tensorflow-model-server` package to the list of packages that Aptitude knows about. Note that we're running as root.\n", "\n", - "Note: This example is running TensorFlow Serving natively, but [you can also run it in a Docker container](../docker), which is one of the easiest ways to get started using TensorFlow Serving." + "Note: This example is running TensorFlow Serving natively, but [you can also run it in a Docker container](https://www.tensorflow.org/tfx/serving/docker), which is one of the easiest ways to get started using TensorFlow Serving." ] }, { From 952a65c04f2538d40f7c2069220dd28acf2e628a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 3 Jul 2019 00:02:18 -0700 Subject: [PATCH 3313/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/af73b7c4-e7bb-48fc-8ac3-f213af4170a1 PiperOrigin-RevId: 256310217 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index af31b9a2987..bae35c688ee 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6301f16285246a1f0933e3bde096fb6a22e7ba52e57ca1472cb6fe5878767460", - git_commit = "64d3e2eb16a52f678249df943f25b0dde531c93e", + sha256 = "ceae79671e8af0302cdfa571277fb0083bd7a6e4f9a482991bc2535d8d3a6009", + git_commit = "e0ab930a7ec64817833478e6d01fa84133011257", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From cba3f41be730d086924c20828075b0122aa806fd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 3 Jul 2019 06:02:23 -0700 Subject: [PATCH 3314/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ac50aac6-64fc-49b2-96c4-ddb6b9051912 PiperOrigin-RevId: 256352140 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bae35c688ee..430d63453a4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ceae79671e8af0302cdfa571277fb0083bd7a6e4f9a482991bc2535d8d3a6009", - git_commit = "e0ab930a7ec64817833478e6d01fa84133011257", + sha256 = "fe8d5702bb541c9df33152ae2ea05f8e0f69e7065a9d0af7e9161a744c5c6e97", + git_commit = "b2ee39a25cb561a8e5d594cd7d6c314aa674168b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ff2fd14a49258cb55fa0fddb31f097136a9cadc3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 3 Jul 2019 12:02:18 -0700 Subject: [PATCH 3315/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/17395a47-714a-43f6-8bb6-b910911064c9 PiperOrigin-RevId: 256412250 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 430d63453a4..ddc7f356499 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fe8d5702bb541c9df33152ae2ea05f8e0f69e7065a9d0af7e9161a744c5c6e97", - git_commit = "b2ee39a25cb561a8e5d594cd7d6c314aa674168b", + sha256 = "4297f8decbcdb2bd042f92c6e41b813d741ebdbc4e7c5007f29c79c481f22491", + git_commit = "26f9dbe5373c6aed74d4c18cddd81b94bf120bd0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 00b2980a4d6ca127b63409b3eae791f846d1031a Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Wed, 3 Jul 2019 12:42:07 -0700 Subject: [PATCH 3316/8103] Update release notes for 1.14.0 release. PiperOrigin-RevId: 256420229 --- RELEASE.md | 38 +++++++++++++------------------------- 1 file changed, 13 insertions(+), 25 deletions(-) diff --git a/RELEASE.md b/RELEASE.md index 2d52d758243..cb5c5ced29a 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -2,52 +2,40 @@ ## Major Features and Improvements -None +* Use MKL-DNN contraction kernels by default. (commit: a075ebe5eff56f3311d6e2cc2d23e4e82567596b) +* Add option to refuse to unload the last servable version. (commit: c8496b199cedf3e38a7ad0dc4c46db2b341b28e5) +* Add ability to disable periodic filesystem polling (#1295). (commit: 72450555c83ea5e6d18d05362192ad85613b23b1) ## Breaking Changes -None +* No breaking changes. ## Bug Fixes and Other Changes -* Add enforce_session_run_timeout inside Server::Options. (commit: de030640ec6ed2cd504ee0ad9335fb93aebe51b5) -* Update comments as new envs TF_NUM_INTEROP_THREADS and TF_NUM_INTRAOP_THREADS are added in tensorflow (commit: a32bc432ed3c6366cfbb540d4b86b1cc6b3acf22) -* Update TF Serving subsite config to import to /tfx/serving (commit: 6ac044af384bb0529d68ee1dd4fe287c2c55dc04) -* Allow multiple logging configs to be associated with a single model. (commit: d9b99a3efe4077a8936bd586b252486c8b24dd6f) +* Add `enforce_session_run_timeout` inside `Server::Options`. (commit: de030640ec6ed2cd504ee0ad9335fb93aebe51b5) * Add -o option, to pass params to `docker` command. (commit: dd59021d3f807f23390afa8a2bc34a6f7029ed24) -* Change SerializedExampleListWithContext dependency. (commit: 7acaec7c594cddfe2f06b6536c579b1b58078807) -* Add servable_name to debugging log. (commit: e384bf406a5411a0539973c4c3aa13f0f889ebb3) * Stop using reader locks (tf_shared_lock) on the read path of FastReadDynamicPtr. (commit: f04e583a6a700a4943a57b6758b3e131b0865e97) -* Clarify which model is being initialized. (commit: 5456ac57343a7962450eb80e9d4870dcb4b31ed4) * Add saved model tags to logging metadata. These tags are used by (commit: 6320701645d5aeceac49a4f02cc629159559f143) -* Updates Apple platform config settings and allows TF serving (commit: c283ea580e4a51ececfacaa2b255fd0bb751c9ab) -* Update example section to use Docker (commit: a5fc8bbc20f712fd6c4c148ff4d94a9231b79ceb) -* Adds an option in SessionBundleConfig to repeat warmup replay n times per request. (commit: 15cd20263c8362f534afecbdf98b9d929eac70fd) -* Bazel 0.23.2 is the minimum version required to build. (commit: b8a377cbeea07d6173f1938e4fe507b7ff9d17cd) -* Disable MKLDNN contraction kernels by default (commit: a7f98b67e3f054e20bec86459a4f5dbf8eb45b08) -* improve tpu server warm up (commit: 63d31a33b4f6faeb0764bb159d403f2b49061aed) -* Re-enable MKLDNN contraction kernels by default. (commit: a075ebe5eff56f3311d6e2cc2d23e4e82567596b) -* Stop removing libnvinfer_plugin.so since future version of TF GPU builds depends on it. (commit: 23ceb08d771118a2abdd28835f126c8675ba2f60) -* Fix build failure with TF head sources. (commit: a02687e3fe96edc57c9ed4ad08cfbe5d9ba6e838) -* AspiredVersionsManager, CachingManager: forward Env to BasicManager. (commit: 28da549e382fa027897886afec83fca6e92da33c) +* Adds an option in `SessionBundleConfig` to repeat warmup replay n times per request. (commit: 15cd20263c8362f534afecbdf98b9d929eac70fd) +* Improve tpu server warm up (commit: 63d31a33b4f6faeb0764bb159d403f2b49061aed) * Official PIP package releases are now tied to a specific version of TensorFlow (commit: 9514c37d22f0b728e2db9e8c6f28fb11ebde0fad) -* Improves top-level README documentation; (commit: f26deea38a506512690096ad81ffa5bb6c32a4b2) * Bump the minimal Bazel version to 0.24.1 (commit: 96a716ca31f753b0c3efc1ef60779b77f5c60845) -* Add option to refuse to unload the last servable version. (commit: c8496b199cedf3e38a7ad0dc4c46db2b341b28e5) * Add new device type for TPU. (commit: c74861d61131e2248a70d9c72317df8c49eb8f1a) -* Add ability to disable periodic filesystem polling (#1295). (commit: 72450555c83ea5e6d18d05362192ad85613b23b1) * Fix incorrect formatting of decimal numbers in JSON output (#1332) (commit: d7c3b3deacbabf763ed44fb6932535016852e90a) * Fixed the gzip uncompression support in the HTTP server for large request bodies. (commit: fb7835c7cd95c5b6b163cb2abd6a8b9a1a283689) * Add stack memory resource kind. (commit: e56e72b3e4b9a597832734208a3da455f6db1a04) * Adds ModelServer test for loading SavedModel exported from Keras Sequential API (commit: 9578f3d10c786c6714b9a8b481dd74f454402477) -* ignore SIGPIPE for libevent ,prevent the SIGPIPE signal from being raised, (commit: 8d88a5b3c4ac502113c798a470111ca65f47b0c2) +* Ignore SIGPIPE for libevent,prevent the SIGPIPE signal from being raised (#1257) (commit: 8d88a5b3c4ac502113c798a470111ca65f47b0c2) +* Fix #1367 (commit: 58af9011d72cbd062501c3f8066bf4d9eee04a7a) +* Update Serving_REST_simple.ipynb (commit: 3870ba59a764d859fc137a8363588c94906e0f5f) +* Updates README with link to architecture overview (commit: d233a82e0a569d5ccd23a0cbada8099644698dc6) +* Update example section to use Docker (commit: a5fc8bbc20f712fd6c4c148ff4d94a9231b79ceb) ## Thanks to our Contributors This release contains contributions from many people at Google, as well as: -G. Hussain Chinoy, Karthik Vadla, Li Lao, mkim301, Tensorflow-Copybara, yjhjstz - +G. Hussain Chinoy, Karthik Vadla, mkim301, yjhjstz # Release 1.13.0 From e3f7b8dbf084daa760dfea502426b214d50a0502 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 3 Jul 2019 18:02:26 -0700 Subject: [PATCH 3317/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/abdccba0-91f8-46f7-ac9d-4b15d94f377b PiperOrigin-RevId: 256470173 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ddc7f356499..c0a1bf4cc71 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4297f8decbcdb2bd042f92c6e41b813d741ebdbc4e7c5007f29c79c481f22491", - git_commit = "26f9dbe5373c6aed74d4c18cddd81b94bf120bd0", + sha256 = "20438ed279a20c828695dcc42eff18e6f08837f3ae3086aad55b7b7767667ffc", + git_commit = "964cae84fd5d5018125925dcb5a83927ec062c49", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From aea7c4907cfcf829160809a054a2bcd20cbc0c6a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Jul 2019 00:02:31 -0700 Subject: [PATCH 3318/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d4ab9ace-b0d6-416f-85ed-63547dd64bc7 PiperOrigin-RevId: 256500092 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c0a1bf4cc71..d81dc12c04e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "20438ed279a20c828695dcc42eff18e6f08837f3ae3086aad55b7b7767667ffc", - git_commit = "964cae84fd5d5018125925dcb5a83927ec062c49", + sha256 = "0181c70dd06710c2643cd264a6dd5ec017263595fdd86f815b80cc68c90719d0", + git_commit = "94d7e348d8788db341922462ed843b33c3e4fc3a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ef7b1dcfc8ed41e8742d85bd6c45df51478e344a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Jul 2019 06:02:14 -0700 Subject: [PATCH 3319/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/29c2c819-8a3f-40d2-9a60-b8df5e07a727 PiperOrigin-RevId: 256540278 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d81dc12c04e..fca27a4d823 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0181c70dd06710c2643cd264a6dd5ec017263595fdd86f815b80cc68c90719d0", - git_commit = "94d7e348d8788db341922462ed843b33c3e4fc3a", + sha256 = "620b410614358739fe25f32ded087539c11721924bfefee71514508d76d731e7", + git_commit = "ea8a39bc7a095c9d239534578f0e37f36d642093", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From da112d1e788323f02c9f9f14314c0f336cf7f0e4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Jul 2019 12:02:35 -0700 Subject: [PATCH 3320/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8806aa30-9c4e-4cb0-8b6b-6d5894626ce8 PiperOrigin-RevId: 256573393 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fca27a4d823..9657b0dc9eb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "620b410614358739fe25f32ded087539c11721924bfefee71514508d76d731e7", - git_commit = "ea8a39bc7a095c9d239534578f0e37f36d642093", + sha256 = "86e1a7437b0f158e215b12242edfb6eb856d5f2e14a09d5731751a075c9f0c1e", + git_commit = "52435ea5a89b9c129894c31d10a3f42e4ed31d85", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From eebb2e4e84767c43aaac9a841060f58fee43535c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Jul 2019 18:02:07 -0700 Subject: [PATCH 3321/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0c4b4a76-68f7-4a82-8e30-9dbc3e9f9a12 PiperOrigin-RevId: 256597621 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9657b0dc9eb..b3b2b68ed5c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "86e1a7437b0f158e215b12242edfb6eb856d5f2e14a09d5731751a075c9f0c1e", - git_commit = "52435ea5a89b9c129894c31d10a3f42e4ed31d85", + sha256 = "3e48643769e34f1dd1693d81c16afc94dee82d08604e6788e4f76f9a87d37bb0", + git_commit = "ba730a4f6de09ab8635091517933462dc70e4443", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From cb36eadd01658129660e183d0f3969b5e1cb0a59 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Jul 2019 00:02:26 -0700 Subject: [PATCH 3322/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0e6ec5e8-966b-48d5-a637-2253bbf3ec18 PiperOrigin-RevId: 256624137 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b3b2b68ed5c..ead58d89fe1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3e48643769e34f1dd1693d81c16afc94dee82d08604e6788e4f76f9a87d37bb0", - git_commit = "ba730a4f6de09ab8635091517933462dc70e4443", + sha256 = "667c6e0dfe5882feb5c5103f302a3c528d3d75755a20309a913a18919a1d6e12", + git_commit = "5bbeb0870fe934c0c58549f2b60f96378e07544d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e03ec3ca637111148611b9eac136f810800e57a3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Jul 2019 06:02:13 -0700 Subject: [PATCH 3323/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/978c8ddc-efd6-4145-86cb-7a4a05babbdc PiperOrigin-RevId: 256662832 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ead58d89fe1..2edc6afc265 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "667c6e0dfe5882feb5c5103f302a3c528d3d75755a20309a913a18919a1d6e12", - git_commit = "5bbeb0870fe934c0c58549f2b60f96378e07544d", + sha256 = "d3a7d962b38ec417f9bc319159ac367fed26c38f1d5b2d0ea1054f8afc5be2be", + git_commit = "450a690cfe0d7c57464110734cebfe7a5b239e0d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d96b632dc2cd1e0556f1ff45460d25baa1d33764 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Jul 2019 12:02:15 -0700 Subject: [PATCH 3324/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/aa8945dd-9528-4749-b06c-ebac07f0fe1b PiperOrigin-RevId: 256693221 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2edc6afc265..ea53909e43e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d3a7d962b38ec417f9bc319159ac367fed26c38f1d5b2d0ea1054f8afc5be2be", - git_commit = "450a690cfe0d7c57464110734cebfe7a5b239e0d", + sha256 = "c72bd525acc7223de4e637e91964e02c8ab383b827b93b2a99012ddac2ff02bb", + git_commit = "2a705b9d1524a856cd4c36a53629f25de97aba65", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2c4f677c8224453b3507470fd8a79f320ec7703c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Jul 2019 18:02:11 -0700 Subject: [PATCH 3325/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/457de200-bc67-4f13-a3eb-85cb0e91d8a3 PiperOrigin-RevId: 256716534 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ea53909e43e..236afd68fdd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c72bd525acc7223de4e637e91964e02c8ab383b827b93b2a99012ddac2ff02bb", - git_commit = "2a705b9d1524a856cd4c36a53629f25de97aba65", + sha256 = "254c10c6329a7bea03256b55468b1c33208606b60a8426251afecb506b002d03", + git_commit = "3e5418c3d6f04e910591ab0bdc16cbdf1b93d92d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7c8f7ea381b369c4e94ca67391c019eb09ebafbc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 6 Jul 2019 00:02:14 -0700 Subject: [PATCH 3326/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b508df99-f541-4536-a073-be9dfddec2fc PiperOrigin-RevId: 256738458 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 236afd68fdd..8106917b6f8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "254c10c6329a7bea03256b55468b1c33208606b60a8426251afecb506b002d03", - git_commit = "3e5418c3d6f04e910591ab0bdc16cbdf1b93d92d", + sha256 = "f7d4c97ac8a58d4ad8f1b5c7da9fad76da74c01be1a3abe6b5c669b5a494d411", + git_commit = "ad7df1e80978130daddac4babe93e98af3d7e4c2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b78608e5c5f4176bca91e2b873c743032e47a7bc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 6 Jul 2019 06:02:07 -0700 Subject: [PATCH 3327/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/13bbf233-b1f3-4792-8a3f-6130b3a39687 PiperOrigin-RevId: 256761718 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8106917b6f8..b1d0fe258fe 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f7d4c97ac8a58d4ad8f1b5c7da9fad76da74c01be1a3abe6b5c669b5a494d411", - git_commit = "ad7df1e80978130daddac4babe93e98af3d7e4c2", + sha256 = "9a379af1ede6fa932f9fe8da3f3ebe6ceb66a2d5b73b65c4ee2b5a69c08abe67", + git_commit = "718503b075d7bf79f430ea9de4fdcc95ad665e7d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e3f265f56c148ca4a63c054ded4c2b85c8944cb6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 7 Jul 2019 06:02:25 -0700 Subject: [PATCH 3328/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7b21ae7b-dd2a-4513-af81-2123c400005d PiperOrigin-RevId: 256846805 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b1d0fe258fe..51593892486 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9a379af1ede6fa932f9fe8da3f3ebe6ceb66a2d5b73b65c4ee2b5a69c08abe67", - git_commit = "718503b075d7bf79f430ea9de4fdcc95ad665e7d", + sha256 = "f80b46f994856af8b4d65b7db017eb7cced301c2e3e28e1a6a4d0ad469cce0f4", + git_commit = "28d028de608d9a55c8d5f063b70cec03a53f8eeb", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 90aab0c7940200be405b29aabbd33775127c6808 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 7 Jul 2019 18:02:10 -0700 Subject: [PATCH 3329/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fa5de902-fa51-4771-9af5-6676b7691d55 PiperOrigin-RevId: 256889231 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 51593892486..91a3c3f2dab 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f80b46f994856af8b4d65b7db017eb7cced301c2e3e28e1a6a4d0ad469cce0f4", - git_commit = "28d028de608d9a55c8d5f063b70cec03a53f8eeb", + sha256 = "f8e88e93d1d85627d2f052d0705d062109c68a4983bd3ac742cc45f23fd358b9", + git_commit = "ad6e2c74ce0161be60f1f2557762150b2cd368cd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2420431974601bb3463da8bae415e45af53cc239 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 8 Jul 2019 00:02:28 -0700 Subject: [PATCH 3330/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/25ead388-eb0e-43d6-b7c1-e2f3fef05dd1 PiperOrigin-RevId: 256916636 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 91a3c3f2dab..1f08e61d0fa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f8e88e93d1d85627d2f052d0705d062109c68a4983bd3ac742cc45f23fd358b9", - git_commit = "ad6e2c74ce0161be60f1f2557762150b2cd368cd", + sha256 = "7d2a53b297591dc74460ccd797e6f5d8cbd3b4885f1e864a12d6a9de979a6a22", + git_commit = "fa4de2ca7aecb6b474c336b975b4563f4c7b7486", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a25f62f84983211b791d74b7c3491f679a8d14a1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 8 Jul 2019 06:02:11 -0700 Subject: [PATCH 3331/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/31bac81b-950b-4339-bd05-8c00925d9fbf PiperOrigin-RevId: 256962117 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1f08e61d0fa..494f599c68f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7d2a53b297591dc74460ccd797e6f5d8cbd3b4885f1e864a12d6a9de979a6a22", - git_commit = "fa4de2ca7aecb6b474c336b975b4563f4c7b7486", + sha256 = "119af5a6fb53b6b43059494f7cf2ed95e3254f254bcf892a36fa1085e487d523", + git_commit = "09d232dcafb860f631c25db324c9bb805e285f8d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f79ecf05497477af60beb45efd842ebba20944f0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 8 Jul 2019 12:02:42 -0700 Subject: [PATCH 3332/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4f9ff7b9-b6db-4ebf-9288-8106f4846336 PiperOrigin-RevId: 257027981 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 494f599c68f..51fd672121e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "119af5a6fb53b6b43059494f7cf2ed95e3254f254bcf892a36fa1085e487d523", - git_commit = "09d232dcafb860f631c25db324c9bb805e285f8d", + sha256 = "cae7576ec0c4ebbf0d228780f0adf1ce73a0221ada7954d7cc476258ca781bc6", + git_commit = "e96bb866c5720cf45df1407fcbe0515f3f772b3b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7226859e9dd0f45bade559ab12892d4e388a7c11 Mon Sep 17 00:00:00 2001 From: Li Lao Date: Mon, 8 Jul 2019 13:43:07 -0700 Subject: [PATCH 3333/8103] Add release notes for TF serving 1.12.3. PiperOrigin-RevId: 257047344 --- RELEASE.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/RELEASE.md b/RELEASE.md index cb5c5ced29a..ba48c80ae7d 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,3 +1,17 @@ +# Release 1.12.3 + +## Major Features and Improvements + +* No major features or improvements. + +## Breaking Changes + +* No breaking changes + +## Bug Fixes and Other Changes + +* This release is based on TF version 1.12.3. + # Release 1.14.0 ## Major Features and Improvements From 042a33313b7ac92c11f40dbe9596dbf605d5683b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 8 Jul 2019 18:02:29 -0700 Subject: [PATCH 3334/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3f350bc3-1d98-4bd9-9a05-c5bd1ca1dd52 PiperOrigin-RevId: 257095962 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 51fd672121e..21979b346fe 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cae7576ec0c4ebbf0d228780f0adf1ce73a0221ada7954d7cc476258ca781bc6", - git_commit = "e96bb866c5720cf45df1407fcbe0515f3f772b3b", + sha256 = "3f27f9a4126757b91120d1b55080145e7ef9d0989c0cad28a13f673b33630bce", + git_commit = "e6dda7def8c2a88a7d1fee9fb4f439bf86841e41", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8991c3c43b8a11557e30ee446ce0379e4120009f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 9 Jul 2019 00:02:11 -0700 Subject: [PATCH 3335/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/532fda44-1a67-4606-a618-8f9832ab88f4 PiperOrigin-RevId: 257132871 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 21979b346fe..c0e73fb1f51 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3f27f9a4126757b91120d1b55080145e7ef9d0989c0cad28a13f673b33630bce", - git_commit = "e6dda7def8c2a88a7d1fee9fb4f439bf86841e41", + sha256 = "97bf4edc3e2cc10dcd34533cb4ed23476895bc0a62a7f4486a51953da176a759", + git_commit = "c88fd63cc599195cbf88885689e8630dd888bb6d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c42a0b8121b904c515e709ce4d2b968adfe84647 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 9 Jul 2019 06:02:11 -0700 Subject: [PATCH 3336/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4e130869-fa89-4c77-883f-8f6087b8fa29 PiperOrigin-RevId: 257175942 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c0e73fb1f51..862c4ccf75a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "97bf4edc3e2cc10dcd34533cb4ed23476895bc0a62a7f4486a51953da176a759", - git_commit = "c88fd63cc599195cbf88885689e8630dd888bb6d", + sha256 = "a23f631e5a25894050523351fa79e0d96cb6d7d04bc9a2790ccbc3bd0a96fbb6", + git_commit = "7ad65ad9024f5a6a46a108383080235963928520", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e23b2264ddb2aa15662a196d2392f63335cc9b47 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 9 Jul 2019 12:02:43 -0700 Subject: [PATCH 3337/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6ca935d7-6d38-4e6a-b8b2-3a8166371692 PiperOrigin-RevId: 257242849 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 862c4ccf75a..c3a7f02fc08 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a23f631e5a25894050523351fa79e0d96cb6d7d04bc9a2790ccbc3bd0a96fbb6", - git_commit = "7ad65ad9024f5a6a46a108383080235963928520", + sha256 = "252d4da84a15a506102e122f65e336fa79545c5490892c0442c4491d5b070b98", + git_commit = "7d944239facdfc198911f5781bea4b13917441da", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4951bf3587280bcce305a9bee4ffed203c9e88ac Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 9 Jul 2019 18:02:28 -0700 Subject: [PATCH 3338/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/45844af9-6f20-48f9-8f6d-ba78652f7944 PiperOrigin-RevId: 257310917 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c3a7f02fc08..4397aba7040 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "252d4da84a15a506102e122f65e336fa79545c5490892c0442c4491d5b070b98", - git_commit = "7d944239facdfc198911f5781bea4b13917441da", + sha256 = "35ee388ff27016ecfcaa95483ffea136149743477f8f9c832050e04d1aa415cf", + git_commit = "a7440c393a7b700fee1e3d16d9b7ce91a8471766", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From bf5bd6ab81ff89984e8574c3be5319b3d8f3bc75 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Jul 2019 00:02:32 -0700 Subject: [PATCH 3339/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7610e7b0-b1e2-4c98-b3b2-0a58b6eb1641 PiperOrigin-RevId: 257345941 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4397aba7040..55d7209ccf3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "35ee388ff27016ecfcaa95483ffea136149743477f8f9c832050e04d1aa415cf", - git_commit = "a7440c393a7b700fee1e3d16d9b7ce91a8471766", + sha256 = "d25ac3ab38f6aada4f30250f7b72f9a0f87af0f7201d94c2a165b1ea742f775f", + git_commit = "18b767b991cb02bf995b9ec4550cb29426e693f3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From de2777e265ee6b8f901e8c11a28eba3319b94d2e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Jul 2019 06:02:09 -0700 Subject: [PATCH 3340/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/feadf774-f6e0-4197-b338-bb13aaa23d8e PiperOrigin-RevId: 257388248 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 55d7209ccf3..1b1ecbeefb5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d25ac3ab38f6aada4f30250f7b72f9a0f87af0f7201d94c2a165b1ea742f775f", - git_commit = "18b767b991cb02bf995b9ec4550cb29426e693f3", + sha256 = "20c57388919b009bb0cf0162447f224b80b98ab6712f07b3e4dfe7a9c0583bba", + git_commit = "15a56964c839ab9723550111a8d4a90477345e51", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 55d897ef71b1ba142defec67bcce8eba7d8f5236 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Jul 2019 11:08:59 -0700 Subject: [PATCH 3341/8103] Remove unnecessary calls to `Tensor::flat` in the tensorflow regressor interface. PiperOrigin-RevId: 257441392 --- tensorflow_serving/servables/tensorflow/regressor.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tensorflow_serving/servables/tensorflow/regressor.cc b/tensorflow_serving/servables/tensorflow/regressor.cc index 47e535ea34b..4d871ceb380 100644 --- a/tensorflow_serving/servables/tensorflow/regressor.cc +++ b/tensorflow_serving/servables/tensorflow/regressor.cc @@ -16,6 +16,7 @@ limitations under the License. #include "tensorflow_serving/servables/tensorflow/regressor.h" #include + #include #include #include @@ -320,8 +321,10 @@ Status PostProcessRegressionResult( num_examples, ". Got: ", output_tensor->NumElements()); } + + const auto& output_tensor_flat = output_tensor->flat(); for (int i = 0; i < num_examples; ++i) { - result->add_regressions()->set_value(output_tensor->flat()(i)); + result->add_regressions()->set_value(output_tensor_flat(i)); } return Status::OK(); } From 283ccfb4464e5d118d22bced05afd2dab5b734a1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Jul 2019 12:03:18 -0700 Subject: [PATCH 3342/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3e2b69ba-0e34-423a-956e-0e33dc6074b4 PiperOrigin-RevId: 257453620 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1b1ecbeefb5..15eec894843 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "20c57388919b009bb0cf0162447f224b80b98ab6712f07b3e4dfe7a9c0583bba", - git_commit = "15a56964c839ab9723550111a8d4a90477345e51", + sha256 = "ff4e827fecbd1d6c286f9db699829c4bb495007b9de68b5697c79ca9fc077e75", + git_commit = "84c176726febd6f0b1eaae5b165af8b6a983b2f8", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a1d2c09c44211d40596fd80ee1ebaaffe949f603 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Jul 2019 12:35:58 -0700 Subject: [PATCH 3343/8103] Internal Refactor. PiperOrigin-RevId: 257459396 --- tensorflow_serving/g3doc/building_with_docker.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tensorflow_serving/g3doc/building_with_docker.md b/tensorflow_serving/g3doc/building_with_docker.md index 49f8098af35..04e6e6a1844 100644 --- a/tensorflow_serving/g3doc/building_with_docker.md +++ b/tensorflow_serving/g3doc/building_with_docker.md @@ -95,15 +95,15 @@ TIP: Before attempting to build an image, check the Docker Hub make sure an image that meets your needs doesn't already exist. Building from sources consumes a lot of RAM. If RAM is an issue on your system, -you may limit RAM usage by specifying `--local_resources=2048,.5,1.0` while +you may limit RAM usage by specifying `--local_ram_resources=2048` while invoking Bazel. See the -[Bazel docs](https://docs.bazel.build/versions/master/user-manual.html#flag--local_resources) +[Bazel docs](https://docs.bazel.build/versions/master/user-manual.html#flag--local_{ram,cpu}_resources) for more information. You can use this same mechanism to tweak the optmizations you're building TensorFlow Serving with. For example: ```shell docker build --pull --build-arg TF_SERVING_BUILD_OPTIONS="--copt=-mavx \ - --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0 --local_resources 2048,.5,1.0" -t \ + --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0 --local_ram_resources=2048" -t \ $USER/tensorflow-serving-devel -f Dockerfile.devel . ``` From 5ec333eb438de58216ff95a2fe50d92e9d6876a8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Jul 2019 18:02:30 -0700 Subject: [PATCH 3344/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ab9c6e21-0b5c-48a4-884b-62686e27e52f PiperOrigin-RevId: 257521279 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 15eec894843..1de4ec3c237 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ff4e827fecbd1d6c286f9db699829c4bb495007b9de68b5697c79ca9fc077e75", - git_commit = "84c176726febd6f0b1eaae5b165af8b6a983b2f8", + sha256 = "059d4356cbd4344b4da208c1c06092fe444e555d5ca0c30be2cb84a3ccb5a365", + git_commit = "00100e438dc8fdd861dd2da11f3df76b7789be1f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 616ab2ad94e9a6d99ba28e2bb6848c5713e0cc12 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Jul 2019 00:02:53 -0700 Subject: [PATCH 3345/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1877421f-0fda-4b2b-8a19-fcdb5075db8a PiperOrigin-RevId: 257554426 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1de4ec3c237..d918d1e7731 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "059d4356cbd4344b4da208c1c06092fe444e555d5ca0c30be2cb84a3ccb5a365", - git_commit = "00100e438dc8fdd861dd2da11f3df76b7789be1f", + sha256 = "245a1416e640c52f2f001ec8020986ebcb1f4628a7b7dcb526042d51f58cad81", + git_commit = "d883916ee45f3af81e81eefb7e8495d9fab6d231", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6ce7f5cb822e136c1b789b57d0b179dca5c11c87 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Jul 2019 06:02:24 -0700 Subject: [PATCH 3346/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5b55b38c-2846-448f-b02c-49ecf1e38b37 PiperOrigin-RevId: 257593296 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d918d1e7731..27caff896d0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "245a1416e640c52f2f001ec8020986ebcb1f4628a7b7dcb526042d51f58cad81", - git_commit = "d883916ee45f3af81e81eefb7e8495d9fab6d231", + sha256 = "4d74621bd5dcfa77ab9ab84fe0f2226e85e9505d1f6edb4e98186f21a42cf7b2", + git_commit = "c07e9e0e17bd059f35a70b14fa0f48e83e6435d2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From effe155fc7e7ba93714736fa59213d6cc1e4c331 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Jul 2019 12:02:32 -0700 Subject: [PATCH 3347/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/97089bd8-a84e-4b56-9ea5-8d7e60854757 PiperOrigin-RevId: 257654193 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 27caff896d0..def3bcaa02c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4d74621bd5dcfa77ab9ab84fe0f2226e85e9505d1f6edb4e98186f21a42cf7b2", - git_commit = "c07e9e0e17bd059f35a70b14fa0f48e83e6435d2", + sha256 = "fe988c91599b07e65aacaef0a0192b720b741649a76bff97b283efe601ca1c97", + git_commit = "47fda4a3ad846e434788dc42535d67429ebe3fb0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From db2805874ed0aa9a905eaa5d2e348f277bfd6cee Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Jul 2019 18:02:45 -0700 Subject: [PATCH 3348/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f0e76b48-40e0-4ff8-bdb0-b66862f2c0c9 PiperOrigin-RevId: 257719018 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index def3bcaa02c..3d7d29948f6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fe988c91599b07e65aacaef0a0192b720b741649a76bff97b283efe601ca1c97", - git_commit = "47fda4a3ad846e434788dc42535d67429ebe3fb0", + sha256 = "8a48a8bbcd9f93dcb52f1fd6057b5976fd5e7ff69559c88154170f0b8218e2e0", + git_commit = "de8298d1aeb311ccb9c9c7293731272c62f76049", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e2a1bc2513fbd271fac89c27b5e30c154239d794 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Jul 2019 00:02:12 -0700 Subject: [PATCH 3349/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8e88fae7-40ec-480c-9d40-c6b1f528c273 PiperOrigin-RevId: 257751412 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3d7d29948f6..747cc2fda91 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8a48a8bbcd9f93dcb52f1fd6057b5976fd5e7ff69559c88154170f0b8218e2e0", - git_commit = "de8298d1aeb311ccb9c9c7293731272c62f76049", + sha256 = "b4f7ddbd7a90ce04ada9b3d2f19f37f301ab91528cb9a0e1640b74443644a67a", + git_commit = "7e7db7228f211b368a9c37d40145d48eb65d0e1e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7368a1679592e3f87651214c0c175ca2e59c0e14 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Jul 2019 06:02:04 -0700 Subject: [PATCH 3350/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7424a524-ef1e-46ae-929d-8e447a43f214 PiperOrigin-RevId: 257789112 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 747cc2fda91..0788a6d7d5f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b4f7ddbd7a90ce04ada9b3d2f19f37f301ab91528cb9a0e1640b74443644a67a", - git_commit = "7e7db7228f211b368a9c37d40145d48eb65d0e1e", + sha256 = "a4f2fb9a4b813924307049703fa2c589c0273a5e1ce17b200cebf0bb66e3242f", + git_commit = "43dcd3dc3ee4b090832455acf43e8dd483a6117b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 109d3795c8f58022fed0e9e69854322844fedde5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Jul 2019 12:02:36 -0700 Subject: [PATCH 3351/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e7f1cebe-5eae-4a0a-861c-dcb042490507 PiperOrigin-RevId: 257843714 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0788a6d7d5f..6c0190d8e56 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a4f2fb9a4b813924307049703fa2c589c0273a5e1ce17b200cebf0bb66e3242f", - git_commit = "43dcd3dc3ee4b090832455acf43e8dd483a6117b", + sha256 = "178d90f28c0d6f7b9bfd6f728c684d55b3ae2c0312d5c30ff390722067c881b8", + git_commit = "823813768199861be752a06947fcfda340350e25", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 755c0c19fd234e7e14d3c1bf8d06056740550571 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Jul 2019 18:02:16 -0700 Subject: [PATCH 3352/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/77fab56f-cf4b-49ac-990c-1f636f651c0a PiperOrigin-RevId: 257902391 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6c0190d8e56..9734190864b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "178d90f28c0d6f7b9bfd6f728c684d55b3ae2c0312d5c30ff390722067c881b8", - git_commit = "823813768199861be752a06947fcfda340350e25", + sha256 = "1912fb4686ab155ff424b6abeb77ae0636dd56f78d36ea4fe5a273445799edf2", + git_commit = "7967c86f22af50b43ac5ac678aa2dd6cd9a7d90c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 962e3b966ced7d8b45d7c949e67b80a6175b5909 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 13 Jul 2019 00:02:22 -0700 Subject: [PATCH 3353/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3617f0aa-e728-4499-acfb-6de8b3a4cfad PiperOrigin-RevId: 257927177 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9734190864b..044c61b2489 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1912fb4686ab155ff424b6abeb77ae0636dd56f78d36ea4fe5a273445799edf2", - git_commit = "7967c86f22af50b43ac5ac678aa2dd6cd9a7d90c", + sha256 = "576564420dcf423beb588e9fee8f5a5b13bbc29fe4061d6d24611838caa89348", + git_commit = "5d4a6cee737a1dc6c20172a1dc15df10def2df72", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 382c6cbfa4e76852c7296981c861517527344de0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 13 Jul 2019 06:02:02 -0700 Subject: [PATCH 3354/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/524c36b9-fe93-458b-b4d0-2bcbf2c055f4 PiperOrigin-RevId: 257949257 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 044c61b2489..6901f1ca9ae 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "576564420dcf423beb588e9fee8f5a5b13bbc29fe4061d6d24611838caa89348", - git_commit = "5d4a6cee737a1dc6c20172a1dc15df10def2df72", + sha256 = "07dad8ad6cbcbab706d646316e69958578191a77eb6e7f0d4030d530e65913dc", + git_commit = "3cb03d093610e51cf2d36bfbf43c446a5de52941", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4288b0523afb799e42225105871b62662624c459 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 14 Jul 2019 06:02:11 -0700 Subject: [PATCH 3355/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7de7286e-3ec2-4e6d-b028-72540ac6dd69 PiperOrigin-RevId: 258033425 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6901f1ca9ae..bf97d7f1082 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "07dad8ad6cbcbab706d646316e69958578191a77eb6e7f0d4030d530e65913dc", - git_commit = "3cb03d093610e51cf2d36bfbf43c446a5de52941", + sha256 = "b8f1496f5e84cd028d8d6be08eaec0c4a79d91d43e62c94eab611b72e78fdaa2", + git_commit = "37eafe0e7463fa72a45624206b1b94b36021df53", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f7a3884e51aaf8ea094574f7054e54b55625cdc0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 15 Jul 2019 06:02:10 -0700 Subject: [PATCH 3356/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0b435c0b-1b32-4c67-b5c5-b475e16f5d68 PiperOrigin-RevId: 258146094 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bf97d7f1082..3eb59757104 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b8f1496f5e84cd028d8d6be08eaec0c4a79d91d43e62c94eab611b72e78fdaa2", - git_commit = "37eafe0e7463fa72a45624206b1b94b36021df53", + sha256 = "96a0652267fdbab5bfe52174924108237fb2d58eebc7df514a64fa7ebca038b1", + git_commit = "1ba28ea0022ce67bd5286cc8c30d7cb5fc7f7bad", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ecef0d2fea2af1d4653a41934649512aa6994fd0 Mon Sep 17 00:00:00 2001 From: gison93 <43569657+gison93@users.noreply.github.com> Date: Mon, 15 Jul 2019 17:42:28 +0200 Subject: [PATCH 3357/8103] Fix print syntax in sample code --- tensorflow_serving/g3doc/serving_basic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/g3doc/serving_basic.md b/tensorflow_serving/g3doc/serving_basic.md index 64e099ed3c9..6c08e7c5d09 100644 --- a/tensorflow_serving/g3doc/serving_basic.md +++ b/tensorflow_serving/g3doc/serving_basic.md @@ -50,7 +50,7 @@ export_path_base = sys.argv[-1] export_path = os.path.join( compat.as_bytes(export_path_base), compat.as_bytes(str(FLAGS.model_version))) -print 'Exporting trained model to', export_path +print('Exporting trained model to', export_path) builder = tf.saved_model.builder.SavedModelBuilder(export_path) builder.add_meta_graph_and_variables( sess, [tf.saved_model.tag_constants.SERVING], From 6a6769ec0d6a00754e86e4e0027ee4ab05bbd3a3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 15 Jul 2019 12:02:41 -0700 Subject: [PATCH 3358/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4602a3e0-231f-4e71-b29b-d9e47396e843 PiperOrigin-RevId: 258210299 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3eb59757104..75db8c04489 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "96a0652267fdbab5bfe52174924108237fb2d58eebc7df514a64fa7ebca038b1", - git_commit = "1ba28ea0022ce67bd5286cc8c30d7cb5fc7f7bad", + sha256 = "de06b5703792bc354676fd8d1181a9d02fe68af1394e70d128f076178d9c4521", + git_commit = "01f6e6b5d107e98942b07d9f2ff89e80cb3f5c7d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2db43983b58a88ef10235f33de41142f3237f209 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 15 Jul 2019 18:02:20 -0700 Subject: [PATCH 3359/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/65c59e1a-2f2a-44ef-bbad-95f17818113f PiperOrigin-RevId: 258275961 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 75db8c04489..b0ed795fd18 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "de06b5703792bc354676fd8d1181a9d02fe68af1394e70d128f076178d9c4521", - git_commit = "01f6e6b5d107e98942b07d9f2ff89e80cb3f5c7d", + sha256 = "2f4635a226cc1ebaba0f7c0a3d29e823da707516e29c60bf8f6158c5f2680bf8", + git_commit = "550e573e3018032f4a29e8786f7e40aecb088482", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4ba9e9683982ef8eac95876016d5af30eead1ce4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 16 Jul 2019 00:02:24 -0700 Subject: [PATCH 3360/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/36720fbf-01a2-43d2-b94b-9021c6915d62 PiperOrigin-RevId: 258310324 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b0ed795fd18..2a463f7cf62 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2f4635a226cc1ebaba0f7c0a3d29e823da707516e29c60bf8f6158c5f2680bf8", - git_commit = "550e573e3018032f4a29e8786f7e40aecb088482", + sha256 = "37a58d2129a4ad849c5e9fc0c9d68cbda37ac0e409035347471708e696a87707", + git_commit = "c1f7f64b039f5e7723ca26552b8051a711de1ead", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From fa5c1be491f37bebd4e879692abd6aeaeb01e393 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 16 Jul 2019 06:02:18 -0700 Subject: [PATCH 3361/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/41b01cc5-41d0-4cd5-94a3-72e8d79ca9b6 PiperOrigin-RevId: 258351719 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2a463f7cf62..57043885db7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "37a58d2129a4ad849c5e9fc0c9d68cbda37ac0e409035347471708e696a87707", - git_commit = "c1f7f64b039f5e7723ca26552b8051a711de1ead", + sha256 = "d8488a0c5b3b0f415da768c47cea0a8ca21e6a3f89f531978a8eea5440cc2c4b", + git_commit = "17343b2fce2c9455d06c9cc73cf5df6d618ab9a7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 79c70b48053e4ebfe4f5e5f10e083da4fe66c313 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 16 Jul 2019 12:02:11 -0700 Subject: [PATCH 3362/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e31e5282-02c9-427b-b7f4-40d69992eea7 PiperOrigin-RevId: 258413280 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 57043885db7..1eb118014e4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d8488a0c5b3b0f415da768c47cea0a8ca21e6a3f89f531978a8eea5440cc2c4b", - git_commit = "17343b2fce2c9455d06c9cc73cf5df6d618ab9a7", + sha256 = "d115e1b5093dbdc33b1381b2fad45812cdbdbcaabb104728ec35f8737cfe1355", + git_commit = "a4c01b23ed20d04d340f0182d40b9ad6f649af38", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From dae0b4dffb29efc647783d45c28c4db0282b4d51 Mon Sep 17 00:00:00 2001 From: Pedram Pejman Date: Tue, 16 Jul 2019 12:55:04 -0700 Subject: [PATCH 3363/8103] Adds guide for serving with custom ops PiperOrigin-RevId: 258422997 --- README.md | 1 + tensorflow_serving/g3doc/_toc.yaml | 2 + tensorflow_serving/g3doc/custom_op.md | 100 ++++++++++++++++++++++++++ 3 files changed, 103 insertions(+) create mode 100644 tensorflow_serving/g3doc/custom_op.md diff --git a/README.md b/README.md index 607d1f289a8..c787a451662 100644 --- a/README.md +++ b/README.md @@ -92,6 +92,7 @@ for detailed instructions on how to export SavedModels. * [Use SavedModel Warmup if initial inference requests are slow due to lazy initialization of graph](tensorflow_serving/g3doc/saved_model_warmup.md) * [Configure models, version and version policy via Serving Config](tensorflow_serving/g3doc/serving_config.md) * [If encountering issues regarding model signatures, please read the SignatureDef documentation](tensorflow_serving/g3doc/signature_defs.md) +* If using a model with custom ops, [learn how to serve models with custom ops](tensorflow_serving/g3doc/custom_op.md) ### Extend diff --git a/tensorflow_serving/g3doc/_toc.yaml b/tensorflow_serving/g3doc/_toc.yaml index 9c82857de1f..6a1bc8a165c 100644 --- a/tensorflow_serving/g3doc/_toc.yaml +++ b/tensorflow_serving/g3doc/_toc.yaml @@ -17,5 +17,7 @@ toc: path: /tfx/serving/custom_servable - title: Create a module that discovers new servable paths path: /tfx/serving/custom_source +- title: Serving TensorFlow models with custom ops + path: /tfx/serving/custom_op - title: SignatureDefs in SavedModel for TensorFlow Serving path: /tfx/serving/signature_defs diff --git a/tensorflow_serving/g3doc/custom_op.md b/tensorflow_serving/g3doc/custom_op.md new file mode 100644 index 00000000000..51004d4f8fd --- /dev/null +++ b/tensorflow_serving/g3doc/custom_op.md @@ -0,0 +1,100 @@ +# Serving TensorFlow models with custom ops + +TensorFlow comes pre-built with an extensive library of ops and op kernels +(implementations) fine-tuned for different hardware types (CPU, GPU, etc.). +These operations are automatically linked into the TensorFlow Serving +ModelServer binary with no additional work required by the user. However, there +are two use cases that require the user to link in ops into the ModelServer +explicitly: + +* You have written your own custom op (ex. using + [this guide](https://github.com/tensorflow/custom-op)) +* You are using an already implemented op that is not shipped with TensorFlow + +Note: Starting in version 2.0, TensorFlow no longer distributes the contrib +module; if you are serving a TensorFlow program using contrib ops, use this +guide to link these ops into ModelServer explicitly. + +Regardless of whether you implemented the op or not, in order to serve a model +with custom ops, you need access to the source of the op. This guide walks you +through the steps of using the source to make custom ops available for serving. +For guidance on implementation of custom ops, please refer to the +[tensorflow/custom-op](https://github.com/tensorflow/custom-op) repo. + +Prerequisite: With Docker installed, you have cloned the TensorFlow Serving +[repository](https://github.com/tensorflow/serving) and your current working +directory is the root of the repo. + +## Copy over op source into Serving project + +In order to build TensorFlow Serving with your custom ops, you will first need +to copy over the op source into your serving project. For this example, you will +use +[tensorflow_zero_out](https://github.com/tensorflow/custom-op/tree/master/tensorflow_zero_out) +from the custom-op repository mentioned above. + +Wihin the serving repo, create a `custom_ops` directory, which will house all +your custom ops. For this example, you will only have the +[tensorflow_zero_out](https://github.com/tensorflow/custom-op/tree/master/tensorflow_zero_out) +code. + +```bash +mkdir tensorflow_serving/custom_ops +cp -r /tensorflow_zero_out tensorflow_serving/custom_ops +``` + +## Build static library for the op + +In tensorflow_zero_out's +[BUILD file](https://github.com/tensorflow/custom-op/blob/master/tensorflow_zero_out/BUILD), +you see a target producing a shared object file (`.so`), which you would load +into python in order to create and train your model. TensorFlow Serving, +however, statically links ops at build time, and requires a `.a` file. So you +will add a build rule that produces this file to +`tensorflow_serving/custom_ops/tensorflow_zero_out/BUILD`: + +```python +cc_library( + name = 'zero_out_ops', + srcs = [ + "cc/kernels/zero_out_kernels.cc", + "cc/ops/zero_out_ops.cc", + ], + alwayslink = 1, + deps = [ + "@org_tensorflow//tensorflow/core:framework", + ] +) +``` + +## Build ModelServer with the op linked in + +To serve a model that uses a custom op, you have to build the ModelServer binary +with that op linked in. Specifically, you add the `zero_out_ops` build target +created above to the ModelServer's `BUILD` file. + +Edit `tensorflow_serving/model_servers/BUILD` to add your custom op build target +to `SUPPORTED_TENSORFLOW_OPS` which is inluded in the `server_lib` target: + +```python +SUPPORTED_TENSORFLOW_OPS = [ + ... + "//tensorflow_serving/custom_ops/tensorflow_zero_out:zero_out_ops" +] +``` + +Then use the Docker environment to build the ModelServer: + +```bash +tools/run_in_docker.sh bazel build tensorflow_serving/model_servers:tensorflow_model_server +``` + +## Serve a model containing your custom op + +You can now run the ModelServer binary and start serving your model: + +```bash +tools/run_in_docker.sh -o "-p 8501:8501" \ +bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server \ +--rest_api_port=8501 --model_name= --model_base_path= +``` From dee9737cf5d5674aea860aeea7290805bffa914b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 16 Jul 2019 18:02:16 -0700 Subject: [PATCH 3364/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fd2acc2b-0d72-41a5-91f2-509b45b7314a PiperOrigin-RevId: 258478094 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1eb118014e4..4261ff338fc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d115e1b5093dbdc33b1381b2fad45812cdbdbcaabb104728ec35f8737cfe1355", - git_commit = "a4c01b23ed20d04d340f0182d40b9ad6f649af38", + sha256 = "9854b28c13e708b38e92fe008754dfdc2b67d309eb5bed02de73498a90511393", + git_commit = "10387fcdd1ccb9f24146626c76e29fc26a446992", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3a98936a610f0ba2548cb12e39402c9caeab7365 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Jul 2019 00:02:28 -0700 Subject: [PATCH 3365/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/abb188be-a1a8-402f-bdba-073ec000f651 PiperOrigin-RevId: 258511834 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4261ff338fc..f16236a066a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9854b28c13e708b38e92fe008754dfdc2b67d309eb5bed02de73498a90511393", - git_commit = "10387fcdd1ccb9f24146626c76e29fc26a446992", + sha256 = "8fc00d65715386ac3076827eccc08c2c55a7429f91d178905c30642e45947033", + git_commit = "2a6c3059289071f109943fed4bce01beadc0fa2d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c2afca18fc8b51de8d4905cd1c882f624520ff77 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Jul 2019 06:02:12 -0700 Subject: [PATCH 3366/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/be3a1b89-7900-440d-94d2-ab3514f6a8ca PiperOrigin-RevId: 258552863 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f16236a066a..5e185ebda99 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8fc00d65715386ac3076827eccc08c2c55a7429f91d178905c30642e45947033", - git_commit = "2a6c3059289071f109943fed4bce01beadc0fa2d", + sha256 = "c45db7a6bed1135da9a28b5a0a70f3dc5320cba692a8eac2ae43c9981eb46b2c", + git_commit = "c6352706d6280d7ed34964969503b104471a9335", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4c959868f71350cbaad1bfba2faaec542e9bfb03 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Jul 2019 12:02:31 -0700 Subject: [PATCH 3367/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d2fa63ed-c899-43cd-acc7-5a0587202d9a PiperOrigin-RevId: 258614741 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5e185ebda99..ea3f69be8ae 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c45db7a6bed1135da9a28b5a0a70f3dc5320cba692a8eac2ae43c9981eb46b2c", - git_commit = "c6352706d6280d7ed34964969503b104471a9335", + sha256 = "159872e1b17b0a164327fdaf034e8ffa0b2d64d06532184a59ca4417067e18e1", + git_commit = "30c1d66f830bcf25244e42618266b413f509140b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b29fb4a9329a3f4c242c87aa890c6f2c28d7060a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Jul 2019 18:02:03 -0700 Subject: [PATCH 3368/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/66c8d5a2-d223-4bcf-abca-4bf5b2afb136 PiperOrigin-RevId: 258679745 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ea3f69be8ae..454891b872b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "159872e1b17b0a164327fdaf034e8ffa0b2d64d06532184a59ca4417067e18e1", - git_commit = "30c1d66f830bcf25244e42618266b413f509140b", + sha256 = "7327084fca14cb8292e8932014fa609e74aeb1df2cd3e69eecb6687a51ed65f9", + git_commit = "b7527a0b7c663b12d07f0de11158dca2d3fc9bba", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c7e0357467bd8801b2810cb34e2f2c0397700834 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Jul 2019 00:02:30 -0700 Subject: [PATCH 3369/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fea57197-af5a-4eae-b9d7-124bfed42629 PiperOrigin-RevId: 258714553 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 454891b872b..36dcc0301b8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7327084fca14cb8292e8932014fa609e74aeb1df2cd3e69eecb6687a51ed65f9", - git_commit = "b7527a0b7c663b12d07f0de11158dca2d3fc9bba", + sha256 = "2feaf427e40496e9ad90bf74f1f4b09f1615f7456ab24e130f2435e542dfb39e", + git_commit = "87ceafef297b2fc14731242297fe9620b65269ce", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7a957ffbe9a23bc939fac488f3bd9e7607399e75 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Jul 2019 06:02:10 -0700 Subject: [PATCH 3370/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9e8dcecb-fe3c-4c4e-a3da-4ea78eae98a2 PiperOrigin-RevId: 258755063 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 36dcc0301b8..752c1f4fa3c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2feaf427e40496e9ad90bf74f1f4b09f1615f7456ab24e130f2435e542dfb39e", - git_commit = "87ceafef297b2fc14731242297fe9620b65269ce", + sha256 = "8a5c736fea523e6e385d0b3a7db342a9cf2d11b861ac055c8dc33340d87ece9b", + git_commit = "0b3c5ea103e9b63d05830ae5c45c249ee7fa6787", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 45f9e33b1ed597312065849f04b48c52c1a4de83 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Jul 2019 12:02:19 -0700 Subject: [PATCH 3371/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b04c17bc-b448-4423-9154-bedc38f58334 PiperOrigin-RevId: 258817523 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 752c1f4fa3c..8c89bbe14c9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8a5c736fea523e6e385d0b3a7db342a9cf2d11b861ac055c8dc33340d87ece9b", - git_commit = "0b3c5ea103e9b63d05830ae5c45c249ee7fa6787", + sha256 = "0d54f4e83e3e51a21e94f6d1684e610fa2cf2d55e962ad390befdc47db986f70", + git_commit = "eec66ce4ca210901267de2b7f491902fa831a69a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1126fcd5d179d7829f48471eca6ddbbce79e219e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Jul 2019 15:58:09 -0700 Subject: [PATCH 3372/8103] Return more informative error message during warmup. PiperOrigin-RevId: 258862698 --- .../tensorflow/saved_model_warmup.cc | 8 ++++ .../tensorflow/saved_model_warmup_test.cc | 44 +++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/tensorflow_serving/servables/tensorflow/saved_model_warmup.cc b/tensorflow_serving/servables/tensorflow/saved_model_warmup.cc index a37bd4582ed..eb53b322962 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_warmup.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_warmup.cc @@ -16,7 +16,9 @@ limitations under the License. #include "tensorflow_serving/servables/tensorflow/saved_model_warmup.h" #include "google/protobuf/wrappers.pb.h" +#include "absl/strings/str_cat.h" #include "tensorflow/cc/saved_model/constants.h" +#include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/lib/io/path.h" #include "tensorflow/core/lib/io/record_reader.h" #include "tensorflow/core/lib/monitoring/sampler.h" @@ -150,6 +152,12 @@ Status RunSavedModelWarmup(const ModelWarmupOptions& model_warmup_options, model_warm_up_latency->GetCell(export_dir, status.ToString()) ->Add(warmup_latency); + if (errors::IsDataLoss(status)) { + return errors::DataLoss( + status.error_message(), + ". Please verify your warmup data is in TFRecord format."); + } + // OUT_OF_RANGE error means EOF was reached, do not return error in this case if (!errors::IsOutOfRange(status)) { return status; diff --git a/tensorflow_serving/servables/tensorflow/saved_model_warmup_test.cc b/tensorflow_serving/servables/tensorflow/saved_model_warmup_test.cc index 6031ba03907..c256f8b9662 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_warmup_test.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_warmup_test.cc @@ -134,6 +134,21 @@ Status WriteWarmupData(const string& fname, return Status::OK(); } +Status WriteWarmupDataAsSerializedProtos( + const string& fname, const std::vector& warmup_records, + int num_warmup_records) { + Env* env = Env::Default(); + std::unique_ptr file; + TF_RETURN_IF_ERROR(env->NewWritableFile(fname, &file)); + for (int i = 0; i < num_warmup_records; ++i) { + for (const string& warmup_record : warmup_records) { + TF_RETURN_IF_ERROR(file->Append(warmup_record)); + } + } + TF_RETURN_IF_ERROR(file->Close()); + return Status::OK(); +} + void AddMixedWarmupData(std::vector* warmup_records) { for (auto& log_type : {PredictionLog::kRegressLog, PredictionLog::kClassifyLog, @@ -295,6 +310,35 @@ TEST(SavedModelBundleWarmupTest, UnsupportedLogType) { ::testing::HasSubstr("Unsupported log_type for warmup")); } +TEST(SavedModelBundleWarmupTest, UnsupportedFileFormat) { + string base_path = io::JoinPath(testing::TmpDir(), "UnsupportedFileFormat"); + TF_ASSERT_OK(Env::Default()->RecursivelyCreateDir( + io::JoinPath(base_path, kSavedModelAssetsExtraDirectory))); + const string fname = io::JoinPath(base_path, kSavedModelAssetsExtraDirectory, + WarmupConsts::kRequestsFileName); + + std::vector warmup_records; + // Add unsupported log type + PredictionLog prediction_log; + PopulatePredictionLog(&prediction_log, PredictionLog::kSessionRunLog); + warmup_records.push_back(prediction_log.SerializeAsString()); + + TF_ASSERT_OK(WriteWarmupDataAsSerializedProtos(fname, warmup_records, 10)); + SavedModelBundle saved_model_bundle; + AddSignatures(&saved_model_bundle.meta_graph_def); + MockSession* mock = new MockSession; + saved_model_bundle.session.reset(mock); + EXPECT_CALL(*mock, Run(_, _, _, _, _, _)) + .WillRepeatedly(Return(Status::OK())); + const Status status = RunSavedModelWarmup(ModelWarmupOptions(), RunOptions(), + base_path, &saved_model_bundle); + ASSERT_FALSE(status.ok()); + EXPECT_EQ(::tensorflow::error::DATA_LOSS, status.code()) << status; + EXPECT_THAT(status.ToString(), + ::testing::HasSubstr( + "Please verify your warmup data is in TFRecord format")); +} + TEST(SavedModelBundleWarmupTest, TooManyWarmupRecords) { string base_path = io::JoinPath(testing::TmpDir(), "TooManyWarmupRecords"); TF_ASSERT_OK(Env::Default()->RecursivelyCreateDir( From 9cf3ff32daaaa2bb941ba7d7b8f049f807e4288e Mon Sep 17 00:00:00 2001 From: Vinu Rajashekhar Date: Thu, 18 Jul 2019 16:06:35 -0700 Subject: [PATCH 3373/8103] Enables passing in the SessionMetadata to the TensorFlow Session through the SavedModel ingestion API. PiperOrigin-RevId: 258864402 --- .../core/aspired_versions_manager_test.cc | 50 +++++---- tensorflow_serving/core/basic_manager_test.cc | 67 +++++++----- tensorflow_serving/core/loader.h | 29 ++++- tensorflow_serving/core/loader_harness.cc | 3 +- .../core/loader_harness_test.cc | 60 +++++++---- tensorflow_serving/core/simple_loader.h | 91 ++++++++++++++-- tensorflow_serving/core/simple_loader_test.cc | 102 +++++++++++++++--- tensorflow_serving/core/test_util/BUILD | 13 +++ .../core/test_util/mock_loader.h | 1 + .../core/test_util/session_test_util.cc | 83 ++++++++++++++ .../core/test_util/session_test_util.h | 48 +++++++++ tensorflow_serving/servables/tensorflow/BUILD | 3 + .../tensorflow/saved_model_bundle_factory.cc | 27 ++++- .../tensorflow/saved_model_bundle_factory.h | 17 +++ .../saved_model_bundle_factory_test.cc | 80 +++++++++++--- .../saved_model_bundle_source_adapter.cc | 34 ++++-- .../saved_model_bundle_source_adapter.h | 5 + .../saved_model_bundle_source_adapter_test.cc | 40 +++++-- .../tensorflow/session_bundle_config.proto | 11 +- 19 files changed, 626 insertions(+), 138 deletions(-) create mode 100644 tensorflow_serving/core/test_util/session_test_util.cc create mode 100644 tensorflow_serving/core/test_util/session_test_util.h diff --git a/tensorflow_serving/core/aspired_versions_manager_test.cc b/tensorflow_serving/core/aspired_versions_manager_test.cc index e216e5f3061..6127a5a22b4 100644 --- a/tensorflow_serving/core/aspired_versions_manager_test.cc +++ b/tensorflow_serving/core/aspired_versions_manager_test.cc @@ -736,11 +736,12 @@ TEST_P(AspiredVersionsManagerTest, EventBusServableLifecycle) { Notification load_called; Notification load_continue; - EXPECT_CALL(*loader, Load()).WillOnce(InvokeWithoutArgs([&]() { - load_called.Notify(); - load_continue.WaitForNotification(); - return Status::OK(); - })); + EXPECT_CALL(*loader, LoadWithMetadata(Loader::Metadata{id})) + .WillOnce(InvokeWithoutArgs([&]() { + load_called.Notify(); + load_continue.WaitForNotification(); + return Status::OK(); + })); std::unique_ptr load_unload_thread( Env::Default()->StartThread(ThreadOptions(), "LoadUnloadThread", [&]() { @@ -825,14 +826,13 @@ TEST_P(AspiredVersionsManagerTest, NoEventBus) { TEST_P(AspiredVersionsManagerTest, RetryOnLoadErrorFinallySucceeds) { CHECK_GE(max_num_load_retries_, 1); - + const ServableId id = {kServableName, 7}; test_util::MockLoader* loader = new NiceMock; // We succeed on the last load, before the manager gives up. - EXPECT_CALL(*loader, Load()) + EXPECT_CALL(*loader, LoadWithMetadata(Loader::Metadata{id})) .WillOnce(Return(errors::Internal("Error on load."))) .WillOnce(Return(Status::OK())); - const ServableId id = {kServableName, 7}; std::vector>> aspired_versions; aspired_versions.push_back({id, std::unique_ptr(loader)}); manager_->GetAspiredVersionsCallback()(kServableName, @@ -961,7 +961,8 @@ TEST_P(AspiredVersionsManagerTest, UnaspireThenImmediatelyReaspire) { std::vector>> first_aspired_versions; test_util::MockLoader* first_loader = new NiceMock(); first_aspired_versions.push_back({id, std::unique_ptr(first_loader)}); - EXPECT_CALL(*first_loader, Load()).WillOnce(Return(Status::OK())); + EXPECT_CALL(*first_loader, LoadWithMetadata(Loader::Metadata{id})) + .WillOnce(Return(Status::OK())); manager_->GetAspiredVersionsCallback()(kServableName, std::move(first_aspired_versions)); HandlePendingAspiredVersionsRequests(); @@ -1017,10 +1018,11 @@ TEST_P(AspiredVersionsManagerTest, UnaspireThenImmediatelyReaspire) { second_aspired_versions.push_back( {id, std::unique_ptr(second_loader)}); Notification second_load_called; - EXPECT_CALL(*second_loader, Load()).WillOnce(InvokeWithoutArgs([&]() { - second_load_called.Notify(); - return Status::OK(); - })); + EXPECT_CALL(*second_loader, LoadWithMetadata(Loader::Metadata{id})) + .WillOnce(InvokeWithoutArgs([&]() { + second_load_called.Notify(); + return Status::OK(); + })); manager_->GetAspiredVersionsCallback()(kServableName, std::move(second_aspired_versions)); @@ -1056,7 +1058,7 @@ TEST_P(AspiredVersionsManagerTest, std::vector>> first_aspired_versions; test_util::MockLoader* first_loader = new NiceMock(); first_aspired_versions.push_back({id, std::unique_ptr(first_loader)}); - EXPECT_CALL(*first_loader, Load()) + EXPECT_CALL(*first_loader, LoadWithMetadata(Loader::Metadata{id})) .WillRepeatedly(Return(Status(error::UNKNOWN, "first load failing"))); manager_->GetAspiredVersionsCallback()(kServableName, std::move(first_aspired_versions)); @@ -1084,10 +1086,11 @@ TEST_P(AspiredVersionsManagerTest, second_aspired_versions.push_back( {id, std::unique_ptr(second_loader)}); Notification second_load_called; - EXPECT_CALL(*second_loader, Load()).WillOnce(InvokeWithoutArgs([&]() { - second_load_called.Notify(); - return Status::OK(); - })); + EXPECT_CALL(*second_loader, LoadWithMetadata(Loader::Metadata{id})) + .WillOnce(InvokeWithoutArgs([&]() { + second_load_called.Notify(); + return Status::OK(); + })); manager_->GetAspiredVersionsCallback()(kServableName, std::move(second_aspired_versions)); @@ -1119,7 +1122,7 @@ TEST_P(AspiredVersionsManagerTest, UnaspireNewServableThenImmediatelyReaspire) { std::vector>> first_aspired_versions; test_util::MockLoader* first_loader = new NiceMock(); - EXPECT_CALL(*first_loader, Load()).Times(0); + EXPECT_CALL(*first_loader, LoadWithMetadata(Loader::Metadata{id})).Times(0); first_aspired_versions.push_back({id, std::unique_ptr(first_loader)}); manager_->GetAspiredVersionsCallback()(kServableName, std::move(first_aspired_versions)); @@ -1142,10 +1145,11 @@ TEST_P(AspiredVersionsManagerTest, UnaspireNewServableThenImmediatelyReaspire) { second_aspired_versions.push_back( {id, std::unique_ptr(second_loader)}); Notification second_load_called; - EXPECT_CALL(*second_loader, Load()).WillOnce(InvokeWithoutArgs([&]() { - second_load_called.Notify(); - return Status::OK(); - })); + EXPECT_CALL(*second_loader, LoadWithMetadata(Loader::Metadata{id})) + .WillOnce(InvokeWithoutArgs([&]() { + second_load_called.Notify(); + return Status::OK(); + })); manager_->GetAspiredVersionsCallback()(kServableName, std::move(second_aspired_versions)); // The first HandlePendingAspiredVersionsRequests() call will do nothing, diff --git a/tensorflow_serving/core/basic_manager_test.cc b/tensorflow_serving/core/basic_manager_test.cc index 0c3630a677d..61070716412 100644 --- a/tensorflow_serving/core/basic_manager_test.cc +++ b/tensorflow_serving/core/basic_manager_test.cc @@ -285,7 +285,8 @@ TEST_P(BasicManagerTest, UpdateServingMapServableHandleLatest) { .WillByDefault(Return(AnyPtr(&servable))); ON_CALL(*notify_to_unload, EstimateResources(_)) .WillByDefault(Return(Status::OK())); - ON_CALL(*notify_to_unload, Load()).WillByDefault(Return(Status::OK())); + ON_CALL(*notify_to_unload, LoadWithMetadata(Loader::Metadata{id0})) + .WillByDefault(Return(Status::OK())); const ServableId id1 = {kServableName3, 1}; TF_ASSERT_OK(basic_manager_->ManageServable( {id1, std::unique_ptr(notify_to_unload)})); @@ -694,11 +695,12 @@ TEST_P(BasicManagerTest, EventBusServableLifecycle) { Notification load_called; Notification load_continue; - EXPECT_CALL(*loader, Load()).WillOnce(InvokeWithoutArgs([&]() { - load_called.Notify(); - load_continue.WaitForNotification(); - return Status::OK(); - })); + EXPECT_CALL(*loader, LoadWithMetadata(Loader::Metadata{id})) + .WillOnce(InvokeWithoutArgs([&]() { + load_called.Notify(); + load_continue.WaitForNotification(); + return Status::OK(); + })); std::unique_ptr load_thread( Env::Default()->StartThread(ThreadOptions(), "LoadThread", [&]() { @@ -1113,7 +1115,7 @@ TEST_P(BasicManagerTest, RetryOnLoadErrorFinallySucceeds) { test_util::MockLoader* loader = new NiceMock(); TF_ASSERT_OK( basic_manager_->ManageServable({id, std::unique_ptr(loader)})); - EXPECT_CALL(*loader, Load()) + EXPECT_CALL(*loader, LoadWithMetadata(Loader::Metadata{id})) .WillOnce(Return(errors::Internal("Load error."))) .WillRepeatedly(Return(Status::OK())); basic_manager_->LoadServable( @@ -1125,7 +1127,7 @@ TEST_P(BasicManagerTest, RetryOnLoadErrorFinallyFails) { test_util::MockLoader* loader = new NiceMock(); TF_ASSERT_OK( basic_manager_->ManageServable({id, std::unique_ptr(loader)})); - EXPECT_CALL(*loader, Load()) + EXPECT_CALL(*loader, LoadWithMetadata(Loader::Metadata{id})) .WillRepeatedly(Return(errors::Internal("Load error."))); basic_manager_->LoadServable(id, [](const Status& status) { EXPECT_EQ(errors::Internal("Load error."), status); @@ -1141,7 +1143,7 @@ TEST_P(BasicManagerTest, RetryOnLoadErrorCancelledLoad) { Notification load_called; Notification load_should_return; - EXPECT_CALL(*loader, Load()) + EXPECT_CALL(*loader, LoadWithMetadata(Loader::Metadata{id})) .WillOnce(InvokeWithoutArgs([&load_called, &load_should_return]() { load_called.Notify(); load_should_return.WaitForNotification(); @@ -1169,7 +1171,7 @@ TEST_P(BasicManagerTest, LoadAfterCancelledLoad) { Notification load_called; Notification load_should_return; - EXPECT_CALL(*loader, Load()) + EXPECT_CALL(*loader, LoadWithMetadata(Loader::Metadata{id})) .WillOnce(InvokeWithoutArgs([&load_called, &load_should_return]() { load_called.Notify(); load_should_return.WaitForNotification(); @@ -1212,10 +1214,11 @@ TEST(NonParameterizedBasicManagerTest, PreLoadHook) { EXPECT_CALL(mock_pre_load_hook, Call(id)).WillOnce(InvokeWithoutArgs([&]() { pre_load_hook_called = true; })); - EXPECT_CALL(*loader, Load()).WillOnce(InvokeWithoutArgs([&]() { - EXPECT_TRUE(pre_load_hook_called); - return Status::OK(); - })); + EXPECT_CALL(*loader, LoadWithMetadata(Loader::Metadata{id})) + .WillOnce(InvokeWithoutArgs([&]() { + EXPECT_TRUE(pre_load_hook_called); + return Status::OK(); + })); manager->LoadServable(id, [](const Status& status) { TF_ASSERT_OK(status); }); manager->UnloadServable(id, [](const Status& status) { TF_ASSERT_OK(status); }); @@ -1320,7 +1323,8 @@ TEST_F(ResourceConstrainedBasicManagerTest, InsufficientResources) { *estimate = CreateResourceQuantity(10 /* = total system resources */); return Status::OK(); })); - EXPECT_CALL(*hogging_loader, Load()).WillOnce(Return(Status::OK())); + EXPECT_CALL(*hogging_loader, LoadWithMetadata(Loader::Metadata{hogging_id})) + .WillOnce(Return(Status::OK())); TF_ASSERT_OK(basic_manager_->ManageServable( CreateServableData(hogging_id, std::unique_ptr(hogging_loader)))); Notification hogging_loaded; @@ -1372,7 +1376,7 @@ TEST_F(ResourceConstrainedBasicManagerTest, ResourcesReleasedIfLoadFails) { *estimate = CreateResourceQuantity(10); return Status::OK(); })); - EXPECT_CALL(*failing_loader, Load()) + EXPECT_CALL(*failing_loader, LoadWithMetadata(Loader::Metadata{failing_id})) .WillOnce(Return(errors::Unknown("Load failure"))); TF_ASSERT_OK(basic_manager_->ManageServable( CreateServableData(failing_id, std::unique_ptr(failing_loader)))); @@ -1395,7 +1399,9 @@ TEST_F(ResourceConstrainedBasicManagerTest, ResourcesReleasedIfLoadFails) { *estimate = CreateResourceQuantity(10); return Status::OK(); })); - EXPECT_CALL(*succeeding_loader, Load()).WillOnce(Return(Status::OK())); + EXPECT_CALL(*succeeding_loader, + LoadWithMetadata(Loader::Metadata{succeeding_id})) + .WillOnce(Return(Status::OK())); TF_ASSERT_OK(basic_manager_->ManageServable(CreateServableData( succeeding_id, std::unique_ptr(succeeding_loader)))); basic_manager_->LoadServable( @@ -1416,7 +1422,9 @@ TEST_F(ResourceConstrainedBasicManagerTest, return Status::OK(); })) .RetiresOnSaturation(); - EXPECT_CALL(*overestimating_loader, Load()).WillOnce(Return(Status::OK())); + EXPECT_CALL(*overestimating_loader, + LoadWithMetadata(Loader::Metadata{overestimating_id})) + .WillOnce(Return(Status::OK())); EXPECT_CALL(*overestimating_loader, EstimateResources(_)) .WillOnce(Invoke([](ResourceAllocation* estimate) { *estimate = CreateResourceQuantity(5 /* lower estimate after load */); @@ -1445,7 +1453,9 @@ TEST_F(ResourceConstrainedBasicManagerTest, *estimate = CreateResourceQuantity(5); return Status::OK(); })); - EXPECT_CALL(*succeeding_loader, Load()).WillOnce(Return(Status::OK())); + EXPECT_CALL(*succeeding_loader, + LoadWithMetadata(Loader::Metadata{succeeding_id})) + .WillOnce(Return(Status::OK())); TF_ASSERT_OK(basic_manager_->ManageServable(CreateServableData( succeeding_id, std::unique_ptr(succeeding_loader)))); basic_manager_->LoadServable( @@ -1461,7 +1471,9 @@ TEST_F(ResourceConstrainedBasicManagerTest, ResourcesReleasedAfterUnload) { return Status::OK(); })); Notification load_done; - EXPECT_CALL(*unloading_loader, Load()).WillOnce(Return(Status::OK())); + EXPECT_CALL(*unloading_loader, + LoadWithMetadata(Loader::Metadata{unloading_id})) + .WillOnce(Return(Status::OK())); TF_ASSERT_OK(basic_manager_->ManageServable(CreateServableData( unloading_id, std::unique_ptr(unloading_loader)))); basic_manager_->LoadServable(unloading_id, @@ -1497,7 +1509,9 @@ TEST_F(ResourceConstrainedBasicManagerTest, ResourcesReleasedAfterUnload) { *estimate = CreateResourceQuantity(10); return Status::OK(); })); - EXPECT_CALL(*succeeding_loader, Load()).WillOnce(Return(Status::OK())); + EXPECT_CALL(*succeeding_loader, + LoadWithMetadata(Loader::Metadata{succeeding_id})) + .WillOnce(Return(Status::OK())); TF_ASSERT_OK(basic_manager_->ManageServable(CreateServableData( succeeding_id, std::unique_ptr(succeeding_loader)))); basic_manager_->LoadServable( @@ -1522,7 +1536,8 @@ TEST_F(ResourceConstrainedBasicManagerTest, FirstLoadDeniedSecondOneApproved) { return Status::OK(); })); // Load won't be called because resources are not enough to load it. - EXPECT_CALL(*denied_loader, Load()).Times(0); + EXPECT_CALL(*denied_loader, LoadWithMetadata(Loader::Metadata{denied_id})) + .Times(0); TF_ASSERT_OK(basic_manager_->ManageServable( CreateServableData(denied_id, std::unique_ptr(denied_loader)))); @@ -1549,8 +1564,9 @@ TEST_F(ResourceConstrainedBasicManagerTest, FirstLoadDeniedSecondOneApproved) { denied_estimate_started.WaitForNotification(); // The second servable's Load() call shouldn't occur until after the first // servable's load request exits its decision phase. - EXPECT_CALL(*succeeding_loader, Load()) - .WillOnce(Invoke([&finish_denied_estimate]() { + EXPECT_CALL(*succeeding_loader, + LoadWithMetadata(Loader::Metadata{succeeding_id})) + .WillOnce(InvokeWithoutArgs([&finish_denied_estimate]() { // Ensure that the first servable's load request has been given // permission to exit its decision phase. EXPECT_TRUE(finish_denied_estimate.HasBeenNotified()); @@ -1625,7 +1641,8 @@ TEST(EstimateResourcesRetriedTest, Succeeds) { EXPECT_CALL(*loader, EstimateResources(_)) .WillOnce(Return(errors::Internal("Error on estimate resources."))) .WillOnce(Return(Status::OK())); - EXPECT_CALL(*loader, Load()).WillRepeatedly(Return(Status::OK())); + EXPECT_CALL(*loader, LoadWithMetadata(Loader::Metadata{id})) + .WillRepeatedly(Return(Status::OK())); TF_ASSERT_OK(basic_manager->ManageServable( CreateServableData(id, std::unique_ptr(loader)))); basic_manager->LoadServable( diff --git a/tensorflow_serving/core/loader.h b/tensorflow_serving/core/loader.h index b76c16cee34..672774b6303 100644 --- a/tensorflow_serving/core/loader.h +++ b/tensorflow_serving/core/loader.h @@ -84,7 +84,22 @@ class Loader { /// Fetches any data that needs to be loaded before using the servable /// returned by servable(). May use no more resources than the estimate /// reported by EstimateResources(). - virtual Status Load() = 0; + /// + /// If implementing Load(), you don't have to override LoadWithMetadata(). + virtual Status Load() { + return errors::Unimplemented("Load isn't implemented."); + } + + /// The metadata consists of the ServableId. + struct Metadata { + ServableId servable_id; + }; + /// Similar to the above method, but takes Metadata as a param, which + /// may be used by the loader implementation appropriately. + /// + /// If you're overriding LoadWithMetadata(), because you can use the metadata + /// appropriately, you can skip overriding Load(). + virtual Status LoadWithMetadata(const Metadata& metadata) { return Load(); } /// Frees any resources allocated during Load() (except perhaps for resources /// shared across servables that are still needed for other active ones). @@ -98,8 +113,8 @@ class Loader { /// /// CustomLoader implementation: /// - /// class CustomLoader : public Loader { - /// public: + /// class CustomLoader : public Loader { + /// public: /// ... /// Status Load() override { /// servable_ = ...; @@ -123,6 +138,14 @@ class Loader { virtual AnyPtr servable() = 0; }; +inline bool operator==(const Loader::Metadata& a, const Loader::Metadata& b) { + return a.servable_id == b.servable_id; +} + +inline bool operator!=(const Loader::Metadata& a, const Loader::Metadata& b) { + return !(a == b); +} + /// A Loader that is oblivious to resources. Its EstimateResources() method /// returns 0, thus effectively disabling resource-based safety checks in the /// serving system. diff --git a/tensorflow_serving/core/loader_harness.cc b/tensorflow_serving/core/loader_harness.cc index 393412ab6eb..72141cf0370 100644 --- a/tensorflow_serving/core/loader_harness.cc +++ b/tensorflow_serving/core/loader_harness.cc @@ -77,7 +77,8 @@ Status LoaderHarness::Load() { const Status status = Retry( strings::StrCat("Loading servable: ", id_.DebugString()), options_.max_num_load_retries, options_.load_retry_interval_micros, - [&]() { return loader_->Load(); }, [&]() { return cancel_load_retry(); }); + [&]() { return loader_->LoadWithMetadata({id_}); }, + [&]() { return cancel_load_retry(); }); { mutex_lock l(mu_); diff --git a/tensorflow_serving/core/loader_harness_test.cc b/tensorflow_serving/core/loader_harness_test.cc index 7b9539c5bff..82001a4fcd5 100644 --- a/tensorflow_serving/core/loader_harness_test.cc +++ b/tensorflow_serving/core/loader_harness_test.cc @@ -75,8 +75,10 @@ TEST(LoaderHarnessTest, LoadRequested) { TEST(LoaderHarnessTest, Quiesce) { test_util::MockLoader* loader = new StrictMock; - LoaderHarness harness(ServableId{"test", 0}, std::unique_ptr(loader)); - EXPECT_CALL(*loader, Load()).WillOnce(Return(Status::OK())); + const ServableId servable_id = {"test", 0}; + LoaderHarness harness(servable_id, std::unique_ptr(loader)); + EXPECT_CALL(*loader, LoadWithMetadata(Loader::Metadata{servable_id})) + .WillOnce(Return(Status::OK())); EXPECT_CALL(*loader, Unload()).WillOnce(Return()); TF_ASSERT_OK(harness.LoadRequested()); @@ -96,11 +98,14 @@ TEST(LoaderHarnessTest, Quiesce) { TEST(LoaderHarnessTest, Load) { test_util::MockLoader* loader = new StrictMock; - LoaderHarness harness(ServableId{"test", 0}, std::unique_ptr(loader)); + const ServableId servable_id = {"test", 0}; + + LoaderHarness harness(servable_id, std::unique_ptr(loader)); Notification load_called; Notification load_should_return; - EXPECT_CALL(*loader, Load()).WillOnce(Return(Status::OK())); + EXPECT_CALL(*loader, LoadWithMetadata(Loader::Metadata{servable_id})) + .WillOnce(Return(Status::OK())); { std::unique_ptr test_thread( Env::Default()->StartThread(ThreadOptions(), "test", [&harness]() { @@ -118,8 +123,11 @@ TEST(LoaderHarnessTest, Load) { TEST(LoaderHarnessTest, Unload) { test_util::MockLoader* loader = new StrictMock; - LoaderHarness harness(ServableId{"test", 0}, std::unique_ptr(loader)); - EXPECT_CALL(*loader, Load()).WillOnce(Return(Status::OK())); + const ServableId servable_id = {"test", 0}; + + LoaderHarness harness(servable_id, std::unique_ptr(loader)); + EXPECT_CALL(*loader, LoadWithMetadata(Loader::Metadata{servable_id})) + .WillOnce(Return(Status::OK())); TF_ASSERT_OK(harness.LoadRequested()); TF_ASSERT_OK(harness.LoadApproved()); TF_ASSERT_OK(harness.Load()); @@ -138,8 +146,10 @@ TEST(LoaderHarnessTest, Unload) { TEST(LoaderHarnessTest, UnloadRequested) { test_util::MockLoader* loader = new NiceMock; - LoaderHarness harness(ServableId{"test", 0}, std::unique_ptr(loader)); - EXPECT_CALL(*loader, Load()).WillOnce(Return(Status::OK())); + const ServableId servable_id = {"test", 0}; + LoaderHarness harness(servable_id, std::unique_ptr(loader)); + EXPECT_CALL(*loader, LoadWithMetadata(Loader::Metadata{servable_id})) + .WillOnce(Return(Status::OK())); TF_ASSERT_OK(harness.LoadRequested()); TF_ASSERT_OK(harness.LoadApproved()); TF_ASSERT_OK(harness.Load()); @@ -164,11 +174,12 @@ TEST(LoaderHarnessTest, LoadApproved) { TEST(LoaderHarnessTest, LoadError) { test_util::MockLoader* loader = new StrictMock; - LoaderHarness harness(ServableId{"test", 0}, std::unique_ptr(loader)); + const ServableId servable_id = {"test", 0}; + LoaderHarness harness(servable_id, std::unique_ptr(loader)); Notification load_called; Notification load_should_return; - EXPECT_CALL(*loader, Load()) + EXPECT_CALL(*loader, LoadWithMetadata(Loader::Metadata{servable_id})) .WillOnce(Return(errors::Unknown("test load error"))); { std::unique_ptr test_thread( @@ -241,10 +252,12 @@ TEST(LoaderHarnessTest, MultipleLoadRequestsOnlyFirstOneSucceeds) { TEST(LoaderHarnessTest, MultipleUnloadRequestsOnlyFirstOneSucceeds) { test_util::MockLoader* loader = new NiceMock; - LoaderHarness harness(ServableId{"test", 0}, std::unique_ptr(loader)); + const ServableId servable_id = {"test", 0}; + LoaderHarness harness(servable_id, std::unique_ptr(loader)); TF_ASSERT_OK(harness.LoadRequested()); - EXPECT_CALL(*loader, Load()).WillOnce(Return(Status::OK())); + EXPECT_CALL(*loader, LoadWithMetadata(Loader::Metadata{servable_id})) + .WillOnce(Return(Status::OK())); TF_ASSERT_OK(harness.LoadApproved()); TF_ASSERT_OK(harness.Load()); @@ -264,10 +277,10 @@ TEST(LoaderHarnessTest, RetryOnLoadErrorFinallySucceeds) { LoaderHarness::Options options; options.max_num_load_retries = 1; options.load_retry_interval_micros = 1; - LoaderHarness harness(ServableId{"test", 0}, std::unique_ptr(loader), - options); + const ServableId servable_id = {"test", 0}; + LoaderHarness harness(servable_id, std::unique_ptr(loader), options); - EXPECT_CALL(*loader, Load()) + EXPECT_CALL(*loader, LoadWithMetadata(Loader::Metadata{servable_id})) .WillOnce(InvokeWithoutArgs( []() { return errors::Unknown("test load error"); })) .WillOnce(InvokeWithoutArgs([]() { return Status::OK(); })); @@ -283,12 +296,13 @@ TEST(LoaderHarnessTest, RetryOnLoadErrorFinallyFails) { LoaderHarness::Options options; options.max_num_load_retries = 1; options.load_retry_interval_micros = 0; - LoaderHarness harness(ServableId{"test", 0}, std::unique_ptr(loader), - options); + const ServableId servable_id = {"test", 0}; + LoaderHarness harness(servable_id, std::unique_ptr(loader), options); - EXPECT_CALL(*loader, Load()).Times(2).WillRepeatedly(InvokeWithoutArgs([]() { - return errors::Unknown("test load error"); - })); + EXPECT_CALL(*loader, LoadWithMetadata(Loader::Metadata{servable_id})) + .Times(2) + .WillRepeatedly(InvokeWithoutArgs( + []() { return errors::Unknown("test load error"); })); TF_ASSERT_OK(harness.LoadRequested()); TF_ASSERT_OK(harness.LoadApproved()); const Status status = harness.Load(); @@ -301,12 +315,12 @@ TEST(LoaderHarnessTest, RetryOnLoadErrorCancelledLoad) { LoaderHarness::Options options; options.max_num_load_retries = 10; options.load_retry_interval_micros = 0; - LoaderHarness harness(ServableId{"test", 0}, std::unique_ptr(loader), - options); + const ServableId servable_id = {"test", 0}; + LoaderHarness harness(servable_id, std::unique_ptr(loader), options); Notification load_called; Notification load_should_return; - EXPECT_CALL(*loader, Load()) + EXPECT_CALL(*loader, LoadWithMetadata(Loader::Metadata{servable_id})) .WillOnce(InvokeWithoutArgs([&load_called, &load_should_return]() { return errors::Unknown("test load error"); })) diff --git a/tensorflow_serving/core/simple_loader.h b/tensorflow_serving/core/simple_loader.h index 63c041681ff..49967465ce0 100644 --- a/tensorflow_serving/core/simple_loader.h +++ b/tensorflow_serving/core/simple_loader.h @@ -19,6 +19,7 @@ limitations under the License. #include #include +#include "absl/types/variant.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/platform/macros.h" @@ -71,6 +72,9 @@ class SimpleLoader : public Loader { public: // Creator is called in Load and used to create the servable. using Creator = std::function*)>; + using CreatorWithMetadata = + std::function*)>; + using CreatorVariant = absl::variant; // A callback for estimating a servable's resource usage. using ResourceEstimator = std::function; @@ -88,6 +92,11 @@ class SimpleLoader : public Loader { // the resources needed during load as well as post-load. SimpleLoader(Creator creator, ResourceEstimator resource_estimator); + // Similar to the above constructor, but accepts a CreatorWithMetadata + // function. + SimpleLoader(CreatorWithMetadata creator_with_metadata, + ResourceEstimator resource_estimator); + // Constructor that takes two resource estimators: one to use for estimating // the resources needed during load, as well as a second one that gives a // different estimate after loading has finished. See the documentation on @@ -97,18 +106,35 @@ class SimpleLoader : public Loader { SimpleLoader(Creator creator, ResourceEstimator resource_estimator, ResourceEstimator post_load_resource_estimator); + // Similar to the above constructor, but accepts a CreatorWithMetadata + // function. + SimpleLoader(CreatorWithMetadata creator_with_metadata, + ResourceEstimator resource_estimator, + ResourceEstimator post_load_resource_estimator); + + // Constructor which accepts all variations of the params. + SimpleLoader(CreatorVariant creator_variant, + ResourceEstimator resource_estimator, + optional post_load_resource_estimator); + ~SimpleLoader() override = default; Status EstimateResources(ResourceAllocation* estimate) const override; + // REQUIRES: That the ctor with Creator be used, otherwise returns an error + // status. Status Load() override; + Status LoadWithMetadata(const Metadata& metadata) override; + void Unload() override; AnyPtr servable() override { return AnyPtr{servable_.get()}; } private: - Creator creator_; + Status EstimateResourcesPostLoad(); + + CreatorVariant creator_variant_; // A function that estimates the resources needed to load the servable. ResourceEstimator resource_estimator_; @@ -205,7 +231,37 @@ SimpleLoader::EstimateNoResources() { template SimpleLoader::SimpleLoader(Creator creator, ResourceEstimator resource_estimator) - : creator_(creator), resource_estimator_(resource_estimator) { + : SimpleLoader(CreatorVariant(creator), resource_estimator, nullopt) {} + +template +SimpleLoader::SimpleLoader( + CreatorWithMetadata creator_with_metadata, + ResourceEstimator resource_estimator) + : SimpleLoader(CreatorVariant(creator_with_metadata), resource_estimator, + nullopt) {} + +template +SimpleLoader::SimpleLoader( + Creator creator, ResourceEstimator resource_estimator, + ResourceEstimator post_load_resource_estimator) + : SimpleLoader(CreatorVariant(creator), resource_estimator, + {post_load_resource_estimator}) {} + +template +SimpleLoader::SimpleLoader( + CreatorWithMetadata creator_with_metadata, + ResourceEstimator resource_estimator, + ResourceEstimator post_load_resource_estimator) + : SimpleLoader(CreatorVariant(creator_with_metadata), resource_estimator, + {post_load_resource_estimator}) {} + +template +SimpleLoader::SimpleLoader( + CreatorVariant creator_variant, ResourceEstimator resource_estimator, + optional post_load_resource_estimator) + : creator_variant_(creator_variant), + resource_estimator_(resource_estimator), + post_load_resource_estimator_(post_load_resource_estimator) { ResourceUtil::Options resource_util_options; resource_util_options.devices = {{device_types::kMain, 1}}; resource_util_ = @@ -215,14 +271,6 @@ SimpleLoader::SimpleLoader(Creator creator, device_types::kMain, resource_kinds::kRamBytes); } -template -SimpleLoader::SimpleLoader( - Creator creator, ResourceEstimator resource_estimator, - ResourceEstimator post_load_resource_estimator) - : SimpleLoader(creator, resource_estimator) { - post_load_resource_estimator_ = post_load_resource_estimator; -} - template Status SimpleLoader::EstimateResources( ResourceAllocation* estimate) const { @@ -239,8 +287,29 @@ Status SimpleLoader::EstimateResources( template Status SimpleLoader::Load() { - TF_RETURN_IF_ERROR(creator_(&servable_)); + if (absl::holds_alternative(creator_variant_)) { + return errors::FailedPrecondition( + "SimpleLoader::Load() called even though " + "SimpleLoader::CreatorWithMetadata was setup. Please use " + "SimpleLoader::LoadWithMetadata() instead."); + } + TF_RETURN_IF_ERROR(absl::get(creator_variant_)(&servable_)); + return EstimateResourcesPostLoad(); +} +template +Status SimpleLoader::LoadWithMetadata(const Metadata& metadata) { + if (absl::holds_alternative(creator_variant_)) { + TF_RETURN_IF_ERROR( + absl::get(creator_variant_)(metadata, &servable_)); + } else { + TF_RETURN_IF_ERROR(absl::get(creator_variant_)(&servable_)); + } + return EstimateResourcesPostLoad(); +} + +template +Status SimpleLoader::EstimateResourcesPostLoad() { if (post_load_resource_estimator_) { // Save the during-load estimate (may be able to use the memoized value). ResourceAllocation during_load_resource_estimate; diff --git a/tensorflow_serving/core/simple_loader_test.cc b/tensorflow_serving/core/simple_loader_test.cc index da3d5b5632e..c7374129b35 100644 --- a/tensorflow_serving/core/simple_loader_test.cc +++ b/tensorflow_serving/core/simple_loader_test.cc @@ -19,12 +19,14 @@ limitations under the License. #include #include +#include "absl/memory/memory.h" #include "tensorflow/core/lib/core/error_codes.pb.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/lib/core/status_test_util.h" #include "tensorflow/core/lib/core/stringpiece.h" #include "tensorflow/core/lib/strings/strcat.h" #include "tensorflow_serving/core/servable_data.h" +#include "tensorflow_serving/core/servable_id.h" #include "tensorflow_serving/test_util/test_util.h" namespace tensorflow { @@ -53,18 +55,57 @@ class Caller { State* state_; }; +Loader::Metadata CreateMetadata() { return {ServableId{"name", 42}}; } + +class LoaderCreatorWithoutMetadata { + public: + template + static std::unique_ptr CreateSimpleLoader( + typename SimpleLoader::Creator creator, Args... args) { + return absl::make_unique>(creator, args...); + } + + static Status Load(Loader* loader) { return loader->Load(); } +}; + +class LoaderCreatorWithMetadata { + public: + template + static std::unique_ptr CreateSimpleLoader( + typename SimpleLoader::Creator creator, Args... args) { + return absl::make_unique>( + [creator](const Loader::Metadata& metadata, + std::unique_ptr* servable) { + const auto& expected_metadata = CreateMetadata(); + EXPECT_EQ(expected_metadata.servable_id, metadata.servable_id); + return creator(servable); + }, + args...); + } + + static Status Load(Loader* loader) { + return loader->LoadWithMetadata(CreateMetadata()); + } +}; + +template +class SimpleLoaderTest : public ::testing::Test {}; +using LoaderCreatorTypes = + ::testing::Types; +TYPED_TEST_SUITE(SimpleLoaderTest, LoaderCreatorTypes); + // Move a Loader through its lifetime and ensure the servable is in the state // we expect. -TEST(SimpleLoaderTest, VerifyServableStates) { +TYPED_TEST(SimpleLoaderTest, VerifyServableStates) { State state = State::kNone; - std::unique_ptr loader(new SimpleLoader( + auto loader = TypeParam::template CreateSimpleLoader( [&state](std::unique_ptr* caller) { caller->reset(new Caller(&state)); return Status::OK(); }, - SimpleLoader::EstimateNoResources())); + SimpleLoader::EstimateNoResources()); EXPECT_EQ(State::kNone, state); - const Status status = loader->Load(); + const Status status = TypeParam::Load(loader.get()); TF_EXPECT_OK(status); EXPECT_EQ(State::kCtor, state); AnyPtr servable = loader->servable(); @@ -78,7 +119,7 @@ TEST(SimpleLoaderTest, VerifyServableStates) { EXPECT_EQ(State::kNone, state); } -TEST(SimpleLoaderTest, ResourceEstimation) { +TYPED_TEST(SimpleLoaderTest, ResourceEstimation) { const auto want = CreateProto( "resource_quantities { " " resource { " @@ -87,7 +128,7 @@ TEST(SimpleLoaderTest, ResourceEstimation) { " } " " quantity: 42 " "} "); - std::unique_ptr loader(new SimpleLoader( + auto loader = TypeParam::template CreateSimpleLoader( [](std::unique_ptr* servable) { servable->reset(new int); return Status::OK(); @@ -95,7 +136,7 @@ TEST(SimpleLoaderTest, ResourceEstimation) { [&want](ResourceAllocation* estimate) { *estimate = want; return Status::OK(); - })); + }); { ResourceAllocation got; @@ -104,7 +145,7 @@ TEST(SimpleLoaderTest, ResourceEstimation) { } // The estimate should remain the same after load. - TF_ASSERT_OK(loader->Load()); + TF_ASSERT_OK(TypeParam::Load(loader.get())); { ResourceAllocation got; TF_ASSERT_OK(loader->EstimateResources(&got)); @@ -112,7 +153,7 @@ TEST(SimpleLoaderTest, ResourceEstimation) { } } -TEST(SimpleLoaderTest, ResourceEstimationWithPostLoadRelease) { +TYPED_TEST(SimpleLoaderTest, ResourceEstimationWithPostLoadRelease) { const auto pre_load_resources = CreateProto( "resource_quantities { " " resource { " @@ -129,7 +170,7 @@ TEST(SimpleLoaderTest, ResourceEstimationWithPostLoadRelease) { " } " " quantity: 17 " "} "); - std::unique_ptr loader(new SimpleLoader( + auto loader = TypeParam::template CreateSimpleLoader( [](std::unique_ptr* servable) { servable->reset(new int); return Status::OK(); @@ -141,7 +182,7 @@ TEST(SimpleLoaderTest, ResourceEstimationWithPostLoadRelease) { [&post_load_resources](ResourceAllocation* estimate) { *estimate = post_load_resources; return Status::OK(); - })); + }); // Run it twice, to exercise memoization. for (int i = 0; i < 2; ++i) { @@ -151,7 +192,7 @@ TEST(SimpleLoaderTest, ResourceEstimationWithPostLoadRelease) { } // The estimate should switch to the post-load one after load. - TF_ASSERT_OK(loader->Load()); + TF_ASSERT_OK(TypeParam::Load(loader.get())); { ResourceAllocation got; TF_ASSERT_OK(loader->EstimateResources(&got)); @@ -161,17 +202,46 @@ TEST(SimpleLoaderTest, ResourceEstimationWithPostLoadRelease) { // Verify that the error returned by the Creator is propagates back through // Load. -TEST(SimpleLoaderTest, LoadError) { - std::unique_ptr loader(new SimpleLoader( +TYPED_TEST(SimpleLoaderTest, LoadError) { + auto loader = TypeParam::template CreateSimpleLoader( [](std::unique_ptr* caller) { return errors::InvalidArgument("No way!"); }, - SimpleLoader::EstimateNoResources())); - const Status status = loader->Load(); + SimpleLoader::EstimateNoResources()); + const Status status = TypeParam::Load(loader.get()); EXPECT_EQ(error::INVALID_ARGUMENT, status.code()); EXPECT_EQ("No way!", status.error_message()); } +TEST(SimpleLoaderCompatibilityTest, WithoutMetadata) { + auto loader_without_metadata = absl::make_unique>( + [](std::unique_ptr* servable) { + servable->reset(new int); + return Status::OK(); + }, + SimpleLoader::EstimateNoResources()); + // If the creator without metadata is used, both Load() and LoadWithMetadata() + // are fine, for compatibility. + TF_EXPECT_OK(loader_without_metadata->Load()); + TF_EXPECT_OK(loader_without_metadata->LoadWithMetadata(CreateMetadata())); +} + +TEST(SimpleLoaderCompatibilityTest, WithMetadata) { + auto loader_with_metadata = absl::make_unique>( + [](const Loader::Metadata& metadata, std::unique_ptr* servable) { + const auto& expected_metadata = CreateMetadata(); + EXPECT_EQ(expected_metadata.servable_id, metadata.servable_id); + servable->reset(new int); + return Status::OK(); + }, + SimpleLoader::EstimateNoResources()); + // If the creator with metadata is used, we allow only LoadWithMetadata() + // to be invoked. + const Status error_status = loader_with_metadata->Load(); + EXPECT_EQ(error::FAILED_PRECONDITION, error_status.code()); + TF_EXPECT_OK(loader_with_metadata->LoadWithMetadata(CreateMetadata())); +} + // A pass-through implementation of SimpleLoaderSourceAdapter, which can be // instantiated. template diff --git a/tensorflow_serving/core/test_util/BUILD b/tensorflow_serving/core/test_util/BUILD index eccb0ef0ef4..ea18f644ae7 100644 --- a/tensorflow_serving/core/test_util/BUILD +++ b/tensorflow_serving/core/test_util/BUILD @@ -204,3 +204,16 @@ cc_library( "@org_tensorflow//tensorflow/core:lib", ], ) + +cc_library( + name = "session_test_util", + testonly = 1, + srcs = ["session_test_util.cc"], + hdrs = ["session_test_util.h"], + deps = [ + "@org_tensorflow//tensorflow/core:core_cpu", + "@org_tensorflow//tensorflow/core:framework", + "@org_tensorflow//tensorflow/core:lib", + ], + alwayslink = 1, +) diff --git a/tensorflow_serving/core/test_util/mock_loader.h b/tensorflow_serving/core/test_util/mock_loader.h index 65befa9c510..152a76573ca 100644 --- a/tensorflow_serving/core/test_util/mock_loader.h +++ b/tensorflow_serving/core/test_util/mock_loader.h @@ -29,6 +29,7 @@ class MockLoader : public Loader { public: MOCK_CONST_METHOD1(EstimateResources, Status(ResourceAllocation* estimate)); MOCK_METHOD0(Load, Status()); + MOCK_METHOD1(LoadWithMetadata, Status(const Metadata&)); MOCK_METHOD0(Unload, void()); MOCK_METHOD0(servable, AnyPtr()); }; diff --git a/tensorflow_serving/core/test_util/session_test_util.cc b/tensorflow_serving/core/test_util/session_test_util.cc new file mode 100644 index 00000000000..7bab63f4d19 --- /dev/null +++ b/tensorflow_serving/core/test_util/session_test_util.cc @@ -0,0 +1,83 @@ +/* Copyright 2019 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow_serving/core/test_util/session_test_util.h" + +#include "absl/memory/memory.h" +#include "absl/strings/strip.h" +#include "tensorflow/core/common_runtime/session_factory.h" +#include "tensorflow/core/public/session.h" + +namespace tensorflow { +namespace serving { +namespace test_util { +namespace { + +using NewSessionHook = std::function; +NewSessionHook new_session_hook_; + +NewSessionHook GetNewSessionHook() { return new_session_hook_; } + +// A DelegatingSessionFactory is used to setup the new-session-hook. +// +// This SessionFactory accepts "new_session_hook/" as the +// session target. While returning the created session, it calls the +// new-session-hook and returns the session created when target is +// "". +class DelegatingSessionFactory : public SessionFactory { + public: + DelegatingSessionFactory() {} + + bool AcceptsOptions(const SessionOptions& options) override { + return absl::StartsWith(options.target, "new_session_hook/"); + } + + Status NewSession(const SessionOptions& options, + Session** out_session) override { + auto actual_session_options = options; + actual_session_options.target = std::string( + absl::StripPrefix(options.target, kNewSessionHookSessionTargetPrefix)); + auto new_session_hook = GetNewSessionHook(); + if (new_session_hook) { + TF_RETURN_IF_ERROR(new_session_hook(actual_session_options)); + } + Session* actual_session; + TF_RETURN_IF_ERROR( + tensorflow::NewSession(actual_session_options, &actual_session)); + *out_session = actual_session; + return Status::OK(); + } +}; + +class DelegatingSessionRegistrar { + public: + DelegatingSessionRegistrar() { + SessionFactory::Register("DELEGATING_SESSION", + new DelegatingSessionFactory()); + } +}; +static DelegatingSessionRegistrar registrar; + +} // namespace + +const char kNewSessionHookSessionTargetPrefix[] = "new_session_hook/"; + +void SetNewSessionHook(NewSessionHook hook) { + new_session_hook_ = std::move(hook); +} + +} // namespace test_util +} // namespace serving +} // namespace tensorflow diff --git a/tensorflow_serving/core/test_util/session_test_util.h b/tensorflow_serving/core/test_util/session_test_util.h new file mode 100644 index 00000000000..13d795c40fe --- /dev/null +++ b/tensorflow_serving/core/test_util/session_test_util.h @@ -0,0 +1,48 @@ +/* Copyright 2019 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_SERVING_CORE_TEST_UTIL_SESSION_TEST_UTIL_H_ +#define TENSORFLOW_SERVING_CORE_TEST_UTIL_SESSION_TEST_UTIL_H_ + +#include + +#include "absl/base/attributes.h" +#include "tensorflow/core/lib/core/status.h" +#include "tensorflow/core/public/session_options.h" + +namespace tensorflow { +namespace serving { +namespace test_util { + +// Sets a 'hook' function, which will be called when a new session is created +// via the tensorflow::NewSession() API. If the hook returns an error status, +// the session creation fails. +// +// For this hook to be enabled, create a session by setting +// SessionOptions::target as "new_session_hook/". This +// will call the hook as well as return the session created when target is +// "". +// +// Calling this method again replaces the previous hook. +// +// This method is NOT thread-safe. +ABSL_CONST_INIT extern const char kNewSessionHookSessionTargetPrefix[]; +void SetNewSessionHook(std::function hook); + +} // namespace test_util +} // namespace serving +} // namespace tensorflow + +#endif // TENSORFLOW_SERVING_CORE_TEST_UTIL_SESSION_TEST_UTIL_H_ diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index 8d3c99968fb..d302dedc7bd 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -172,6 +172,7 @@ cc_library( ":curried_session", ":session_bundle_config_proto", "//tensorflow_serving/batching:batching_session", + "//tensorflow_serving/core:loader", "//tensorflow_serving/resources:resources_proto", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/cc/saved_model:tag_constants", @@ -196,6 +197,7 @@ cc_test( ":bundle_factory_test_util", ":saved_model_bundle_factory", ":session_bundle_config_proto", + "//tensorflow_serving/core/test_util:session_test_util", "//tensorflow_serving/core/test_util:test_main", "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/cc/saved_model:loader", @@ -294,6 +296,7 @@ cc_test( ":session_bundle_source_adapter_proto", "//tensorflow_serving/core:loader", "//tensorflow_serving/core:servable_data", + "//tensorflow_serving/core/test_util:session_test_util", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/resources:resources_proto", "//tensorflow_serving/test_util", diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc index e04b6f25f6b..62ab3a70513 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc @@ -75,8 +75,20 @@ Status SavedModelBundleFactory::EstimateResourceRequirement( return EstimateResourceFromPath(path, estimate); } +Status SavedModelBundleFactory::CreateSavedModelBundleWithMetadata( + const Loader::Metadata& metadata, const string& path, + std::unique_ptr* bundle) { + return InternalCreateSavedModelBundle(metadata, path, bundle); +} + Status SavedModelBundleFactory::CreateSavedModelBundle( const string& path, std::unique_ptr* bundle) { + return InternalCreateSavedModelBundle({}, path, bundle); +} + +Status SavedModelBundleFactory::InternalCreateSavedModelBundle( + const absl::optional& metadata, const string& path, + std::unique_ptr* bundle) { bundle->reset(new SavedModelBundle); std::unordered_set saved_model_tags( config_.saved_model_tags().begin(), config_.saved_model_tags().end()); @@ -85,9 +97,20 @@ Status SavedModelBundleFactory::CreateSavedModelBundle( if (saved_model_tags.empty()) { saved_model_tags.insert(kSavedModelTagServe); } + const auto& session_options = [&]() { + auto result = GetSessionOptions(config_); + if (metadata.has_value()) { + auto* session_metadata = + result.config.mutable_experimental()->mutable_session_metadata(); + session_metadata->set_name(metadata->servable_id.name); + session_metadata->set_version(metadata->servable_id.version); + } + return result; + }(); + TF_RETURN_IF_ERROR(LoadSessionBundleOrSavedModelBundle( - GetSessionOptions(config_), GetRunOptions(config_), path, - saved_model_tags, bundle->get())); + session_options, GetRunOptions(config_), path, saved_model_tags, + bundle->get())); if (!config_.experimental_fixed_input_tensors().empty()) { LOG(INFO) << "Wrapping session to inject fixed input tensors"; std::vector> fixed_input_tensors; diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.h b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.h index b3b14e241d3..845c5bd6aad 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.h +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.h @@ -16,11 +16,13 @@ limitations under the License. #ifndef TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_SAVED_MODEL_BUNDLE_FACTORY_H_ #define TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_SAVED_MODEL_BUNDLE_FACTORY_H_ +#include "absl/types/optional.h" #include "tensorflow/cc/saved_model/loader.h" #include "tensorflow/core/kernels/batching_util/shared_batch_scheduler.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/platform/macros.h" #include "tensorflow_serving/batching/batching_session.h" +#include "tensorflow_serving/core/loader.h" #include "tensorflow_serving/resources/resources.pb.h" #include "tensorflow_serving/servables/tensorflow/session_bundle_config.pb.h" @@ -64,6 +66,17 @@ class SavedModelBundleFactory { Status CreateSavedModelBundle(const string& path, std::unique_ptr* bundle); + /// Instantiates a bundle from a given export or SavedModel path and the given + /// metadata. + /// + /// @param metadata Metadata to be associated with the bundle. + /// @param path Path to the model. + /// @param bundle Newly created SavedModelBundle if the returned Status is + /// OK. + Status CreateSavedModelBundleWithMetadata( + const Loader::Metadata& metadata, const string& path, + std::unique_ptr* bundle); + /// Estimates the resources a SavedModel bundle will use once loaded, from its /// export path. /// @@ -81,6 +94,10 @@ class SavedModelBundleFactory { SavedModelBundleFactory(const SessionBundleConfig& config, std::shared_ptr batch_scheduler); + Status InternalCreateSavedModelBundle( + const absl::optional& metadata, const string& path, + std::unique_ptr* bundle); + const SessionBundleConfig config_; // A shared batch scheduler. One queue is used for each session this factory diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory_test.cc b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory_test.cc index eb66e9d9430..95c68b7564a 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory_test.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory_test.cc @@ -31,6 +31,7 @@ limitations under the License. #include "tensorflow/core/protobuf/named_tensor.pb.h" #include "tensorflow/core/public/session.h" #include "tensorflow/core/public/version.h" +#include "tensorflow_serving/core/test_util/session_test_util.h" #include "tensorflow_serving/servables/tensorflow/bundle_factory_test.h" #include "tensorflow_serving/servables/tensorflow/bundle_factory_test_util.h" #include "tensorflow_serving/servables/tensorflow/session_bundle_config.pb.h" @@ -39,20 +40,55 @@ namespace tensorflow { namespace serving { namespace { +enum class CreationType { kWithoutMetadata, kWithMetadata }; + +Loader::Metadata CreateMetadata() { return {ServableId{"name", 42}}; } + // Creates a new session based on the config and export path. -Status CreateSessionFromPath(const SessionBundleConfig& config, +Status CreateSessionFromPath(const CreationType creation_type, + const SessionBundleConfig& config, const string& path, std::unique_ptr* session) { std::unique_ptr factory; TF_RETURN_IF_ERROR(SavedModelBundleFactory::Create(config, &factory)); std::unique_ptr bundle; - TF_RETURN_IF_ERROR(factory->CreateSavedModelBundle(path, &bundle)); + auto config_with_session_hook = config; + config_with_session_hook.set_session_target( + test_util::kNewSessionHookSessionTargetPrefix); + test_util::SetNewSessionHook([&](const SessionOptions& session_options) { + const bool enable_session_metadata = + creation_type == CreationType::kWithMetadata; + EXPECT_EQ(enable_session_metadata, + session_options.config.experimental().has_session_metadata()); + if (enable_session_metadata) { + const auto& actual_session_metadata = + session_options.config.experimental().session_metadata(); + const auto& expected_loader_metadata = CreateMetadata(); + EXPECT_EQ(expected_loader_metadata.servable_id.name, + actual_session_metadata.name()); + EXPECT_EQ(expected_loader_metadata.servable_id.version, + actual_session_metadata.version()); + } + return Status::OK(); + }); + + switch (creation_type) { + case CreationType::kWithoutMetadata: + TF_RETURN_IF_ERROR(factory->CreateSavedModelBundle(path, &bundle)); + break; + case CreationType::kWithMetadata: + TF_RETURN_IF_ERROR(factory->CreateSavedModelBundleWithMetadata( + CreateMetadata(), path, &bundle)); + break; + } *session = std::move(bundle->session); return Status::OK(); } // Tests SavedModelBundleFactory with native SavedModel. -class SavedModelBundleFactoryTest : public test_util::BundleFactoryTest { +class SavedModelBundleFactoryTest + : public test_util::BundleFactoryTest, + public ::testing::WithParamInterface { public: SavedModelBundleFactoryTest() : test_util::BundleFactoryTest(test_util::GetTestSavedModelPath()) {} @@ -62,13 +98,17 @@ class SavedModelBundleFactoryTest : public test_util::BundleFactoryTest { protected: Status CreateSession(const SessionBundleConfig& config, std::unique_ptr* session) const override { - return CreateSessionFromPath(config, export_dir_, session); + return CreateSessionFromPath(GetParam(), config, export_dir_, session); } }; -TEST_F(SavedModelBundleFactoryTest, Basic) { TestBasic(); } +INSTANTIATE_TEST_SUITE_P(CreationType, SavedModelBundleFactoryTest, + ::testing::Values(CreationType::kWithoutMetadata, + CreationType::kWithMetadata)); -TEST_F(SavedModelBundleFactoryTest, FixedInputTensors) { +TEST_P(SavedModelBundleFactoryTest, Basic) { TestBasic(); } + +TEST_P(SavedModelBundleFactoryTest, FixedInputTensors) { Tensor fixed_input = test::AsTensor({100.0f, 42.0f}, {2}); NamedTensorProto fixed_input_proto; fixed_input_proto.set_name("x:0"); @@ -95,22 +135,23 @@ TEST_F(SavedModelBundleFactoryTest, FixedInputTensors) { test::ExpectTensorEqual(expected_output, single_output); } -TEST_F(SavedModelBundleFactoryTest, Batching) { TestBatching(); } +TEST_P(SavedModelBundleFactoryTest, Batching) { TestBatching(); } -TEST_F(SavedModelBundleFactoryTest, EstimateResourceRequirementWithGoodExport) { +TEST_P(SavedModelBundleFactoryTest, EstimateResourceRequirementWithGoodExport) { const double kTotalFileSize = test_util::GetTotalFileSize(test_util::GetTestSavedModelFiles()); TestEstimateResourceRequirementWithGoodExport( kTotalFileSize); } -TEST_F(SavedModelBundleFactoryTest, RunOptions) { TestRunOptions(); } +TEST_P(SavedModelBundleFactoryTest, RunOptions) { TestRunOptions(); } -TEST_F(SavedModelBundleFactoryTest, RunOptionsError) { TestRunOptionsError(); } +TEST_P(SavedModelBundleFactoryTest, RunOptionsError) { TestRunOptionsError(); } // Tests SavedModelBundleFactory with SessionBundle export. class SavedModelBundleFactoryBackwardCompatibilityTest - : public test_util::BundleFactoryTest { + : public test_util::BundleFactoryTest, + public ::testing::WithParamInterface { public: SavedModelBundleFactoryBackwardCompatibilityTest() : test_util::BundleFactoryTest( @@ -121,17 +162,22 @@ class SavedModelBundleFactoryBackwardCompatibilityTest private: Status CreateSession(const SessionBundleConfig& config, std::unique_ptr* session) const override { - return CreateSessionFromPath(config, export_dir_, session); + return CreateSessionFromPath(GetParam(), config, export_dir_, session); } }; -TEST_F(SavedModelBundleFactoryBackwardCompatibilityTest, Basic) { TestBasic(); } +INSTANTIATE_TEST_SUITE_P(CreationType, + SavedModelBundleFactoryBackwardCompatibilityTest, + ::testing::Values(CreationType::kWithoutMetadata, + CreationType::kWithMetadata)); + +TEST_P(SavedModelBundleFactoryBackwardCompatibilityTest, Basic) { TestBasic(); } -TEST_F(SavedModelBundleFactoryBackwardCompatibilityTest, Batching) { +TEST_P(SavedModelBundleFactoryBackwardCompatibilityTest, Batching) { TestBatching(); } -TEST_F(SavedModelBundleFactoryBackwardCompatibilityTest, +TEST_P(SavedModelBundleFactoryBackwardCompatibilityTest, EstimateResourceRequirementWithGoodExport) { const double kTotalFileSize = test_util::GetTotalFileSize(test_util::GetTestSessionBundleExportFiles()); @@ -139,11 +185,11 @@ TEST_F(SavedModelBundleFactoryBackwardCompatibilityTest, kTotalFileSize); } -TEST_F(SavedModelBundleFactoryBackwardCompatibilityTest, RunOptions) { +TEST_P(SavedModelBundleFactoryBackwardCompatibilityTest, RunOptions) { TestRunOptions(); } -TEST_F(SavedModelBundleFactoryBackwardCompatibilityTest, RunOptionsError) { +TEST_P(SavedModelBundleFactoryBackwardCompatibilityTest, RunOptionsError) { TestRunOptionsError(); } diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter.cc b/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter.cc index ada32676f44..50fe51a8289 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter.cc @@ -20,11 +20,11 @@ limitations under the License. #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/platform/types.h" -#include "tensorflow_serving/core/simple_loader.h" #include "tensorflow_serving/resources/resource_util.h" #include "tensorflow_serving/resources/resource_values.h" #include "tensorflow_serving/resources/resources.pb.h" #include "tensorflow_serving/servables/tensorflow/bundle_factory_util.h" +#include "tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.h" #include "tensorflow_serving/servables/tensorflow/saved_model_warmup.h" #include "tensorflow_serving/util/optional.h" @@ -47,11 +47,24 @@ SavedModelBundleSourceAdapter::SavedModelBundleSourceAdapter( std::unique_ptr bundle_factory) : bundle_factory_(std::move(bundle_factory)) {} -Status SavedModelBundleSourceAdapter::Convert(const StoragePath& path, - std::unique_ptr* loader) { - std::shared_ptr bundle_factory = bundle_factory_; - auto servable_creator = [bundle_factory, - path](std::unique_ptr* bundle) { +SimpleLoader::CreatorVariant +SavedModelBundleSourceAdapter::GetServableCreator( + std::shared_ptr bundle_factory, + const StoragePath& path) const { + if (bundle_factory->config().enable_session_metadata()) { + return [bundle_factory, path](const Loader::Metadata& metadata, + std::unique_ptr* bundle) { + TF_RETURN_IF_ERROR(bundle_factory->CreateSavedModelBundleWithMetadata( + metadata, path, bundle)); + if (bundle_factory->config().enable_model_warmup()) { + return RunSavedModelWarmup( + bundle_factory->config().model_warmup_options(), + GetRunOptions(bundle_factory->config()), path, bundle->get()); + } + return Status::OK(); + }; + } + return [bundle_factory, path](std::unique_ptr* bundle) { TF_RETURN_IF_ERROR(bundle_factory->CreateSavedModelBundle(path, bundle)); if (bundle_factory->config().enable_model_warmup()) { return RunSavedModelWarmup( @@ -60,6 +73,12 @@ Status SavedModelBundleSourceAdapter::Convert(const StoragePath& path, } return Status::OK(); }; +} + +Status SavedModelBundleSourceAdapter::Convert(const StoragePath& path, + std::unique_ptr* loader) { + std::shared_ptr bundle_factory = bundle_factory_; + auto servable_creator = GetServableCreator(bundle_factory, path); auto resource_estimator = [bundle_factory, path](ResourceAllocation* estimate) { TF_RETURN_IF_ERROR( @@ -88,7 +107,7 @@ Status SavedModelBundleSourceAdapter::Convert(const StoragePath& path, return bundle_factory->EstimateResourceRequirement(path, estimate); }; loader->reset(new SimpleLoader( - servable_creator, resource_estimator, post_load_resource_estimator)); + servable_creator, resource_estimator, {post_load_resource_estimator})); return Status::OK(); } @@ -123,6 +142,5 @@ class SavedModelBundleSourceAdapterCreator { }; REGISTER_STORAGE_PATH_SOURCE_ADAPTER(SavedModelBundleSourceAdapterCreator, SavedModelBundleSourceAdapterConfig); - } // namespace serving } // namespace tensorflow diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter.h b/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter.h index bfe9ad0f49e..cafcd13acfa 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter.h +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter.h @@ -20,6 +20,7 @@ limitations under the License. #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/platform/macros.h" #include "tensorflow_serving/core/loader.h" +#include "tensorflow_serving/core/simple_loader.h" #include "tensorflow_serving/core/source_adapter.h" #include "tensorflow_serving/core/storage_path.h" #include "tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.h" @@ -54,6 +55,10 @@ class SavedModelBundleSourceAdapter final explicit SavedModelBundleSourceAdapter( std::unique_ptr bundle_factory); + SimpleLoader::CreatorVariant GetServableCreator( + std::shared_ptr bundle_factory, + const StoragePath& path) const; + Status Convert(const StoragePath& path, std::unique_ptr* loader) override; diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter_test.cc b/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter_test.cc index 4bc1932394c..48e9cf7738e 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter_test.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter_test.cc @@ -28,6 +28,7 @@ limitations under the License. #include "tensorflow/core/lib/core/status_test_util.h" #include "tensorflow_serving/core/loader.h" #include "tensorflow_serving/core/servable_data.h" +#include "tensorflow_serving/core/test_util/session_test_util.h" #include "tensorflow_serving/resources/resource_util.h" #include "tensorflow_serving/resources/resource_values.h" #include "tensorflow_serving/resources/resources.pb.h" @@ -42,8 +43,10 @@ namespace { using test_util::EqualsProto; +Loader::Metadata CreateMetadata() { return {ServableId{"name", 42}}; } + class SavedModelBundleSourceAdapterTest - : public ::testing::TestWithParam> { + : public ::testing::TestWithParam> { protected: SavedModelBundleSourceAdapterTest() { ResourceUtil::Options resource_util_options; @@ -60,6 +63,26 @@ class SavedModelBundleSourceAdapterTest ->mutable_num_request_iterations() ->set_value(2); } + + config_.mutable_config()->set_enable_session_metadata( + EnableSessionMetadata()); + + config_.mutable_config()->set_session_target( + test_util::kNewSessionHookSessionTargetPrefix); + test_util::SetNewSessionHook([&](const SessionOptions& session_options) { + EXPECT_EQ(EnableSessionMetadata(), + session_options.config.experimental().has_session_metadata()); + if (EnableSessionMetadata()) { + const auto& actual_session_metadata = + session_options.config.experimental().session_metadata(); + const auto& expected_loader_metadata = CreateMetadata(); + EXPECT_EQ(expected_loader_metadata.servable_id.name, + actual_session_metadata.name()); + EXPECT_EQ(expected_loader_metadata.servable_id.version, + actual_session_metadata.version()); + } + return Status::OK(); + }); } void TestSavedModelBundleSourceAdapter(const string& export_dir) const { @@ -86,7 +109,8 @@ class SavedModelBundleSourceAdapterTest TF_ASSERT_OK(loader->EstimateResources(&second_resource_estimate)); EXPECT_THAT(second_resource_estimate, EqualsProto(first_resource_estimate)); - TF_ASSERT_OK(loader->Load()); + const auto metadata = CreateMetadata(); + TF_ASSERT_OK(loader->LoadWithMetadata(CreateMetadata())); // We should get a new (lower) resource estimate post-load. ResourceAllocation expected_post_load_resource_estimate = @@ -108,8 +132,9 @@ class SavedModelBundleSourceAdapterTest loader->Unload(); } - bool EnableWarmup() { return std::get<0>(GetParam()); } - bool EnableNumRequestIterations() { return std::get<1>(GetParam()); } + bool EnableWarmup() const { return std::get<0>(GetParam()); } + bool EnableNumRequestIterations() const { return std::get<1>(GetParam()); } + bool EnableSessionMetadata() const { return std::get<2>(GetParam()); } std::unique_ptr resource_util_; Resource ram_resource_; @@ -129,9 +154,10 @@ TEST_P(SavedModelBundleSourceAdapterTest, BackwardCompatibility) { } // Test all SavedModelBundleSourceAdapterTest test cases with -// warmup and num_request_iterations enabled/disabled. -INSTANTIATE_TEST_CASE_P(ModelWarmup, SavedModelBundleSourceAdapterTest, - ::testing::Combine(::testing::Bool(), +// warmup, num_request_iterations enabled/disabled and session-metadata +// enabled/disabled. +INSTANTIATE_TEST_CASE_P(VariousOptions, SavedModelBundleSourceAdapterTest, + ::testing::Combine(::testing::Bool(), ::testing::Bool(), ::testing::Bool())); } // namespace diff --git a/tensorflow_serving/servables/tensorflow/session_bundle_config.proto b/tensorflow_serving/servables/tensorflow/session_bundle_config.proto index 16d63d2830e..26b1893b7a5 100644 --- a/tensorflow_serving/servables/tensorflow/session_bundle_config.proto +++ b/tensorflow_serving/servables/tensorflow/session_bundle_config.proto @@ -1,11 +1,11 @@ syntax = "proto3"; +package tensorflow.serving; + import "google/protobuf/wrappers.proto"; import "tensorflow/core/protobuf/config.proto"; import "tensorflow/core/protobuf/named_tensor.proto"; -package tensorflow.serving; - // Options related to model-warmup. message ModelWarmupOptions { // Number of times a request is iterated during warmup replay. By default 1. @@ -69,6 +69,13 @@ message SessionBundleConfig { // Enables model warmup. bool enable_model_warmup = 779; ModelWarmupOptions model_warmup_options = 780; + + // EXPERIMENTAL. THIS FIELD MAY CHANGE OR GO AWAY. USE WITH CAUTION. + // + // Enables passing in the SessionMetadata to the Session. The SessionMetadata + // consists of information like the model name, version, which can then be + // used by the TensorFlow runtime appropriately (for debugging, logging, etc). + bool enable_session_metadata = 781; } // Batching parameters. Each individual parameter is optional. If omitted, the From 70057040208d2fab7aa34d134a68a3eda77205ec Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Jul 2019 18:02:04 -0700 Subject: [PATCH 3374/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/86828043-94bc-4a5e-aa58-c2b8d892b8f0 PiperOrigin-RevId: 258882277 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8c89bbe14c9..4f561a86746 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0d54f4e83e3e51a21e94f6d1684e610fa2cf2d55e962ad390befdc47db986f70", - git_commit = "eec66ce4ca210901267de2b7f491902fa831a69a", + sha256 = "2d6a5793ddbe2863abb6b98f56339a477808c5d90e6af0697ed857693a62019a", + git_commit = "1ba1de6348c4ee09702672f41038dac8d09da987", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 116316131bf303ef7ddce2ed857a3f1f87f1c5f6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Jul 2019 00:02:16 -0700 Subject: [PATCH 3375/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c1afd18e-5123-44f4-ae53-6c5b2617a823 PiperOrigin-RevId: 258916045 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4f561a86746..9500eb71112 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2d6a5793ddbe2863abb6b98f56339a477808c5d90e6af0697ed857693a62019a", - git_commit = "1ba1de6348c4ee09702672f41038dac8d09da987", + sha256 = "3d19e74e7e043766070b8b9b49641e78d01d6239b88ffcef6253bbe37cdab885", + git_commit = "303384cce67809b68a857966cbd1978afd163fbc", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6430cf9704abb69ccf768c885e095c7d5016cb59 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Jul 2019 06:02:17 -0700 Subject: [PATCH 3376/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/48d10744-6713-4703-9826-5eca3045b3a6 PiperOrigin-RevId: 258953396 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9500eb71112..8b74bc5db7a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3d19e74e7e043766070b8b9b49641e78d01d6239b88ffcef6253bbe37cdab885", - git_commit = "303384cce67809b68a857966cbd1978afd163fbc", + sha256 = "5a2d512384e34ef320df814d113bc75e0c6eada9b253d4cbfcf1141e77252a4c", + git_commit = "a5120db4d6917f943176ef3c5bb938064604c761", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0595a581d30c1b7d22a0bb88d38430c41bb6a941 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Jul 2019 12:02:26 -0700 Subject: [PATCH 3377/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/38ba3047-1e3d-4c00-b58c-abb694ec791a PiperOrigin-RevId: 259012190 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8b74bc5db7a..4417e9195c1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5a2d512384e34ef320df814d113bc75e0c6eada9b253d4cbfcf1141e77252a4c", - git_commit = "a5120db4d6917f943176ef3c5bb938064604c761", + sha256 = "0ed939f406dada31e28f46b86daa57999e62648b0d65c708b66d957c76a9b215", + git_commit = "922346b49f76845ba43e964c555921941924e3e4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 022a65f039f4c9880001134d4b2a0e13fb7a23a1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Jul 2019 18:02:52 -0700 Subject: [PATCH 3378/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5b54162c-d4b4-47c7-a7a4-94ba5b242d42 PiperOrigin-RevId: 259071697 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4417e9195c1..990e025d31e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0ed939f406dada31e28f46b86daa57999e62648b0d65c708b66d957c76a9b215", - git_commit = "922346b49f76845ba43e964c555921941924e3e4", + sha256 = "648b9bf002463eaf59d6cdd08c84266d11d44b8534eb47e989ddfe5a34caa82c", + git_commit = "7d13706efc6663d99aabf1f2cc77aa5db86b3e81", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From cc4de0a9845ca6ca93d0b8b0f343d8f0e367646c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 20 Jul 2019 00:02:47 -0700 Subject: [PATCH 3379/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bc9c62f9-4782-4657-b807-ea45056e3350 PiperOrigin-RevId: 259095917 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 990e025d31e..addb82e2a45 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "648b9bf002463eaf59d6cdd08c84266d11d44b8534eb47e989ddfe5a34caa82c", - git_commit = "7d13706efc6663d99aabf1f2cc77aa5db86b3e81", + sha256 = "174723f26c1df26f590d579058a6cfadcf9c3c1c8e18264953046b7ad7e2fcce", + git_commit = "144bfee21ad830bcbdd1bc8f138684cca0e3234f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 353133b162f4286bfe49d798e7c7279cccb4257d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 20 Jul 2019 06:02:04 -0700 Subject: [PATCH 3380/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/efccd6fa-69ec-4c90-9be7-9a910b7a7f31 PiperOrigin-RevId: 259117632 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index addb82e2a45..61f468b8f63 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "174723f26c1df26f590d579058a6cfadcf9c3c1c8e18264953046b7ad7e2fcce", - git_commit = "144bfee21ad830bcbdd1bc8f138684cca0e3234f", + sha256 = "c9dd823418fd292e5724b36c81702a45fb15dfad95854c4a9c302336cc069ab8", + git_commit = "15dd890a1e9f95e0bb7219a9ae2f846fe47e520b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2cb2e13e9ce948c42046be45959ff2cd740bf87a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 20 Jul 2019 12:02:13 -0700 Subject: [PATCH 3381/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e385ab04-3b71-41a4-86e2-a645890213a1 PiperOrigin-RevId: 259136436 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 61f468b8f63..8d2409ec039 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c9dd823418fd292e5724b36c81702a45fb15dfad95854c4a9c302336cc069ab8", - git_commit = "15dd890a1e9f95e0bb7219a9ae2f846fe47e520b", + sha256 = "b7080f31be21c5694cfac94447164343f3cf21f6f7cec767156f3a4d7de4a8a8", + git_commit = "c5bc30ed9f41cfe18211bd72bbd80c3a8567764f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 83f8e0e4b4815d79c0519f8486d68d4298e1880e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 20 Jul 2019 18:02:09 -0700 Subject: [PATCH 3382/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8e938be5-098b-4543-8ee0-7c8468e62074 PiperOrigin-RevId: 259158169 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8d2409ec039..fb490850ed2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b7080f31be21c5694cfac94447164343f3cf21f6f7cec767156f3a4d7de4a8a8", - git_commit = "c5bc30ed9f41cfe18211bd72bbd80c3a8567764f", + sha256 = "739ebcd5fd0bc1a18b0ab4ee26b0dfe17bc6b0c9a4197af401ae00c4f9b52a33", + git_commit = "20562226f041a76433c10875bd0924a6267b2196", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3fdee9956dc52f964ed0d7baa7fc7872338bbeef Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 21 Jul 2019 00:02:34 -0700 Subject: [PATCH 3383/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/71a0435e-22b8-4c6d-b86c-8e3c443468e6 PiperOrigin-RevId: 259177918 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fb490850ed2..02e3438e193 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "739ebcd5fd0bc1a18b0ab4ee26b0dfe17bc6b0c9a4197af401ae00c4f9b52a33", - git_commit = "20562226f041a76433c10875bd0924a6267b2196", + sha256 = "71d7461dcbba79205fbd5dd8972784d8a8c42abc24294e7e95ea399a8546dd58", + git_commit = "97b7aa03b7b2abd2fd6431b6c482dbb61a8d39cd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f5e6fae9b83bbb5164eeefd4f03eff009d865367 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 21 Jul 2019 06:02:11 -0700 Subject: [PATCH 3384/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a7137c37-0808-4bd2-a969-677714d8dae5 PiperOrigin-RevId: 259200467 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 02e3438e193..4b6824d922a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "71d7461dcbba79205fbd5dd8972784d8a8c42abc24294e7e95ea399a8546dd58", - git_commit = "97b7aa03b7b2abd2fd6431b6c482dbb61a8d39cd", + sha256 = "20a3eb2fea7d80efb59e4eabcef6b912f4ee3a67f5e0fa328953374125d8ff7d", + git_commit = "e03b209ab00f194f3b5588298d40fec7acf7e4d3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 056eae00fbcabbee61317cced34be5987fdb0031 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 21 Jul 2019 12:02:14 -0700 Subject: [PATCH 3385/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2273c3c7-5c1e-4ba0-908c-515fbc94b921 PiperOrigin-RevId: 259219513 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4b6824d922a..0b98c714161 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "20a3eb2fea7d80efb59e4eabcef6b912f4ee3a67f5e0fa328953374125d8ff7d", - git_commit = "e03b209ab00f194f3b5588298d40fec7acf7e4d3", + sha256 = "a87f42708e1a2c01fa0eb5ccdcd3516af1b00cff7ccc9b332fe64947f1ffdbe0", + git_commit = "9ea80327001157b549f6d5925ece40ad423f028d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From bf96c4c1b11b8a37bbae605953b4f8f217808298 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 21 Jul 2019 18:02:15 -0700 Subject: [PATCH 3386/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/736140ce-18d6-4688-af60-d0da98ef340e PiperOrigin-RevId: 259239480 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0b98c714161..b6711595fc6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a87f42708e1a2c01fa0eb5ccdcd3516af1b00cff7ccc9b332fe64947f1ffdbe0", - git_commit = "9ea80327001157b549f6d5925ece40ad423f028d", + sha256 = "e8cd680ad1ab2ff9dfa792eb77798e6f97cc75a4df7fc7c46300aa991ad00b5b", + git_commit = "ca3addea1a508bdc6bc1ab2fc2f574fd69734877", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 25f873c37971d8e62f833457de9ae009feb98dce Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 22 Jul 2019 00:02:17 -0700 Subject: [PATCH 3387/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a41a707b-69c2-489b-a468-5f62f5a85851 PiperOrigin-RevId: 259267596 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b6711595fc6..5e919a7a539 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e8cd680ad1ab2ff9dfa792eb77798e6f97cc75a4df7fc7c46300aa991ad00b5b", - git_commit = "ca3addea1a508bdc6bc1ab2fc2f574fd69734877", + sha256 = "c1b992b607dc81c33b731396d1c2a1c01c3913f59417af07b425fdb93dc21297", + git_commit = "b4e562543795c5e48e8c751d795449a8621ac720", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7e173bd9d250c0513c7defb952f7598a46d0da0b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 22 Jul 2019 06:02:07 -0700 Subject: [PATCH 3388/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d612d038-5c33-404a-8ec0-144174735f35 PiperOrigin-RevId: 259311989 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5e919a7a539..2662ff8ced7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c1b992b607dc81c33b731396d1c2a1c01c3913f59417af07b425fdb93dc21297", - git_commit = "b4e562543795c5e48e8c751d795449a8621ac720", + sha256 = "652675a4f3ac74f6f0d8c1477de4c49006af26def127ad1c46ef773dff570c06", + git_commit = "1ee51a3b868a3ccd5f80724f6b9389fd0a9aed07", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b09af0dd6ae9625421b488f79a5fd9df778b4f3e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 22 Jul 2019 12:02:25 -0700 Subject: [PATCH 3389/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4267f1f0-b4c4-491c-9bb2-688d8b89bcb2 PiperOrigin-RevId: 259376499 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2662ff8ced7..bd4d355473d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "652675a4f3ac74f6f0d8c1477de4c49006af26def127ad1c46ef773dff570c06", - git_commit = "1ee51a3b868a3ccd5f80724f6b9389fd0a9aed07", + sha256 = "bd67cd4ce4dd6edc5f194807a08cb0dac6bc70d3ba27ad07b0f87f70e18433db", + git_commit = "3b8bc0a129e7a6e1a8aa08bb30901033ab9fda00", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From af5b0e0b7587f4fae022723eeb3800e3d44f5e40 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 22 Jul 2019 18:02:26 -0700 Subject: [PATCH 3390/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a5b7f15c-db61-4271-895c-5421edf2f866 PiperOrigin-RevId: 259445675 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bd4d355473d..25b281c1b3d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bd67cd4ce4dd6edc5f194807a08cb0dac6bc70d3ba27ad07b0f87f70e18433db", - git_commit = "3b8bc0a129e7a6e1a8aa08bb30901033ab9fda00", + sha256 = "95bd5ef3c767d35041699165280a8b7a57028f9e5111fbdd315e942feb960d8d", + git_commit = "d9bb0a0acb2811eabc15d8aaa4a61b85ebb1b3b8", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ed675d2db4dd3b09d4d3bffc3992ffa261c2a862 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 23 Jul 2019 00:02:34 -0700 Subject: [PATCH 3391/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c47d3d50-2834-4b1f-aa9f-90a7e9da4773 PiperOrigin-RevId: 259479884 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 25b281c1b3d..35459ddb8d6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "95bd5ef3c767d35041699165280a8b7a57028f9e5111fbdd315e942feb960d8d", - git_commit = "d9bb0a0acb2811eabc15d8aaa4a61b85ebb1b3b8", + sha256 = "b4d73e6bb51422f3ca87598c359191e25e27d6e77cffba1a76248ac21b94f62b", + git_commit = "1de23834beaa10e6f25e2c2f50a7e1c7ebe953b5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f68f0fb1cb91ee8fac31f749e8c8f5bffad1a285 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 23 Jul 2019 06:02:08 -0700 Subject: [PATCH 3392/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ee7cb0f4-580c-496d-9ad3-4951c3e74ca8 PiperOrigin-RevId: 259521234 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 35459ddb8d6..12cd54f18f9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b4d73e6bb51422f3ca87598c359191e25e27d6e77cffba1a76248ac21b94f62b", - git_commit = "1de23834beaa10e6f25e2c2f50a7e1c7ebe953b5", + sha256 = "9bbaca10d9a708d1e42101d0099b1edc62a050afc4e2b0031dbb1a74659d0711", + git_commit = "0469323a0db983cb929ebd8a98dd59b56a0ca4c0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d5313cbd5f14d5958c085772a597e1a4c5574bc7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 23 Jul 2019 12:02:34 -0700 Subject: [PATCH 3393/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/36594973-10bd-4c3d-9a24-028031c566e8 PiperOrigin-RevId: 259583244 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 12cd54f18f9..934db01a1f1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9bbaca10d9a708d1e42101d0099b1edc62a050afc4e2b0031dbb1a74659d0711", - git_commit = "0469323a0db983cb929ebd8a98dd59b56a0ca4c0", + sha256 = "a1b19029d738618a20dc79182d094d71465596e67f51f2710ac06d168f7091a9", + git_commit = "1871ce3ced4c985c1fcba027ccc2737d960661c6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ec677c1e7aefe2cbdb95c5be566b8398e4d3191d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 23 Jul 2019 18:03:07 -0700 Subject: [PATCH 3394/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d0807617-5133-4c69-8717-25d2e80e5b6b PiperOrigin-RevId: 259651235 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 934db01a1f1..c34211bca52 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a1b19029d738618a20dc79182d094d71465596e67f51f2710ac06d168f7091a9", - git_commit = "1871ce3ced4c985c1fcba027ccc2737d960661c6", + sha256 = "4a73d763232109226b45e90d7013a497d53cdaeb0ed2713c8a81fef87339dcf5", + git_commit = "22caf9b8cb5b5070216d6ec187a67929de9ff4f6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 10d3fe6852d3e1abce0f518287463553583a87e8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 24 Jul 2019 00:02:20 -0700 Subject: [PATCH 3395/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f4917803-7ea6-4206-bb8e-e0230c722481 PiperOrigin-RevId: 259685175 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c34211bca52..0522ba93460 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4a73d763232109226b45e90d7013a497d53cdaeb0ed2713c8a81fef87339dcf5", - git_commit = "22caf9b8cb5b5070216d6ec187a67929de9ff4f6", + sha256 = "5416f2afe3c0c9ccb93b299e52a2139932e39758dce049125b138531ac596abe", + git_commit = "150a6c06b281246cb5a075a704fceeb257bb63af", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a165fefd9f7694449bd6d3fcf7eaa5da09d43b5b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 24 Jul 2019 06:02:14 -0700 Subject: [PATCH 3396/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d45cfdfa-1aaa-4c33-bce1-f60abb0cb2ed PiperOrigin-RevId: 259725651 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0522ba93460..789c6c918f4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5416f2afe3c0c9ccb93b299e52a2139932e39758dce049125b138531ac596abe", - git_commit = "150a6c06b281246cb5a075a704fceeb257bb63af", + sha256 = "3f99c0783f110d1634715e3e41f132f2bc6d7ba25c931b35d79409dfdc0a6be1", + git_commit = "59ee7f9138482d85cd93c004aca961bea35820c7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a3677bdbf7b67c1651d809ca2f369eff18bc00e8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 24 Jul 2019 12:02:15 -0700 Subject: [PATCH 3397/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/18eee924-8342-4ec0-89fa-55007e44243e PiperOrigin-RevId: 259787831 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 789c6c918f4..ab26b937c03 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3f99c0783f110d1634715e3e41f132f2bc6d7ba25c931b35d79409dfdc0a6be1", - git_commit = "59ee7f9138482d85cd93c004aca961bea35820c7", + sha256 = "8fd74e8ca38fa499c8cba16f5a92f393eaeb156027a728fad46bed2195560e0f", + git_commit = "0e06e45399d0257587d97560c9045e35ca002784", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ec7bd2d42a21928e7cc777021acd3f4e78f8599b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 24 Jul 2019 18:04:19 -0700 Subject: [PATCH 3398/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a8b29105-fb49-4f4c-900c-2ce8eaeb9bf8 PiperOrigin-RevId: 259857499 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ab26b937c03..d49c7fac2a4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8fd74e8ca38fa499c8cba16f5a92f393eaeb156027a728fad46bed2195560e0f", - git_commit = "0e06e45399d0257587d97560c9045e35ca002784", + sha256 = "7c7abaa08d4793fd850a16790a39626e95da51ad2fd33ed825b38a80ffc335b4", + git_commit = "1f555ad942f916692e6d4c624ce087f50db6a2f7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4da2f3298662859396af20947b2a2b07710c02f7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 25 Jul 2019 00:02:22 -0700 Subject: [PATCH 3399/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/22e27d19-e3b5-4f00-b664-59c71f4ddb50 PiperOrigin-RevId: 259892419 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d49c7fac2a4..75ed2fee68f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7c7abaa08d4793fd850a16790a39626e95da51ad2fd33ed825b38a80ffc335b4", - git_commit = "1f555ad942f916692e6d4c624ce087f50db6a2f7", + sha256 = "562d114ffa4f8f06dd3c26a585dcf21c2e38f58fcd8d7cbeccee1912a19d9d62", + git_commit = "1d436a85fe50dba9ea8eec6675b7cbfa54941e84", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 492381f38c1c8274d3f2ac42b88efc13f768309d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 25 Jul 2019 06:04:50 -0700 Subject: [PATCH 3400/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5744fe04-0cab-4a7f-a157-97c135a3b7c3 PiperOrigin-RevId: 259932544 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 75ed2fee68f..158ce1174a7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "562d114ffa4f8f06dd3c26a585dcf21c2e38f58fcd8d7cbeccee1912a19d9d62", - git_commit = "1d436a85fe50dba9ea8eec6675b7cbfa54941e84", + sha256 = "57d07dfb98d491ef5a2f101f92e2645f11bf05a928bc0777d106fc9f8b930bdc", + git_commit = "1ffdcbe96ae75645cccbe41cfe711e7e81f1e060", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1288a37793db49af188858ef8f021cc6b766feb4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 25 Jul 2019 12:02:20 -0700 Subject: [PATCH 3401/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0ea7ae75-ea85-4b41-8c84-7e37b2a1b7d7 PiperOrigin-RevId: 259993511 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 158ce1174a7..661870d1c06 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "57d07dfb98d491ef5a2f101f92e2645f11bf05a928bc0777d106fc9f8b930bdc", - git_commit = "1ffdcbe96ae75645cccbe41cfe711e7e81f1e060", + sha256 = "feacd6f50469e99450a8b1321fab664a0f202e873333ec8c11398082eea6fc7c", + git_commit = "9b3f1d992a96c626cb39e5199ebcce3c64e89e1b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From bd8655e7720932ed853747f86f6b518b343760dc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 25 Jul 2019 18:02:24 -0700 Subject: [PATCH 3402/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/82975ddd-a011-4cc8-9b17-d4525ef382c9 PiperOrigin-RevId: 260059446 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 661870d1c06..06ba7044f08 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "feacd6f50469e99450a8b1321fab664a0f202e873333ec8c11398082eea6fc7c", - git_commit = "9b3f1d992a96c626cb39e5199ebcce3c64e89e1b", + sha256 = "c147d82bcb1e16d1def755e9a2d88278ef037381870428005a1da59d31624e82", + git_commit = "2cae1803c1c6449d670f79311bce80b5b022c82e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9838d6995865860ea2763ad177684bc66f4f15f3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 26 Jul 2019 00:02:09 -0700 Subject: [PATCH 3403/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3a9d3758-0e2d-4510-8716-aa67b3c6f687 PiperOrigin-RevId: 260092885 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 06ba7044f08..48472905e65 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c147d82bcb1e16d1def755e9a2d88278ef037381870428005a1da59d31624e82", - git_commit = "2cae1803c1c6449d670f79311bce80b5b022c82e", + sha256 = "77269ec63ea8d1a049a18d0faf3133abaad0882b00ee03b8d4cafd6ff2cb60fb", + git_commit = "545135634295853ad44ef9082a1782f2111db4dd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c79a025c0716584f24b1fb0fb2f07228e7b7ae5d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 26 Jul 2019 06:05:27 -0700 Subject: [PATCH 3404/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/17ff6db7-d990-4aba-a2ba-c8cdca8c9abb PiperOrigin-RevId: 260131509 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 48472905e65..2e85659e549 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "77269ec63ea8d1a049a18d0faf3133abaad0882b00ee03b8d4cafd6ff2cb60fb", - git_commit = "545135634295853ad44ef9082a1782f2111db4dd", + sha256 = "f63d3e084bfd82a0e420ce1a3ee7c67d25916a5d966bc876d1661ff618bd4f3f", + git_commit = "5a74b2aaf2e5799bcabb0c5d6b5d01fc570c04bb", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From fca27aa60e9747826e337ad68ae8c00dfba7a0ac Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 26 Jul 2019 12:02:27 -0700 Subject: [PATCH 3405/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/406da7d9-6154-42b4-8837-e559fd3d40cf PiperOrigin-RevId: 260187381 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2e85659e549..00bc50a6e69 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f63d3e084bfd82a0e420ce1a3ee7c67d25916a5d966bc876d1661ff618bd4f3f", - git_commit = "5a74b2aaf2e5799bcabb0c5d6b5d01fc570c04bb", + sha256 = "dcf63342a6d444c7e10fb4f1678001c6ab2d1c59b9e719049d92a8cf2dcb9e77", + git_commit = "3e41df27be09a3194a056503185a93a0a1e1be54", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3e7b2dbebcffc4c7f23b58f21f53a4a8ace2baf6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 26 Jul 2019 18:02:15 -0700 Subject: [PATCH 3406/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b98aaa79-84e7-4bc6-bc1e-e1e1e997af34 PiperOrigin-RevId: 260247489 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 00bc50a6e69..0219bfa3525 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dcf63342a6d444c7e10fb4f1678001c6ab2d1c59b9e719049d92a8cf2dcb9e77", - git_commit = "3e41df27be09a3194a056503185a93a0a1e1be54", + sha256 = "f63057d88b7bd0aeb484e921180b3eddd1c88281b4b1d40a8e4f7ef95264b38e", + git_commit = "6ad7d2ac033993245c2e666c561d62dcd96e5f8e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 00f97d068ef0038a836adf6a2b6dfa590a990336 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 27 Jul 2019 00:02:15 -0700 Subject: [PATCH 3407/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c6bcb3af-a5b7-4ca0-b908-79f854fef108 PiperOrigin-RevId: 260271568 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0219bfa3525..7732f733ee6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f63057d88b7bd0aeb484e921180b3eddd1c88281b4b1d40a8e4f7ef95264b38e", - git_commit = "6ad7d2ac033993245c2e666c561d62dcd96e5f8e", + sha256 = "865d4adfe539f5a076cee1a1e556527a6d7637a43c22b4a5fd45d16daa4579fb", + git_commit = "0d5f78e608eaf6df3ca3fe1bfed8928623a693e7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 611e1ab836c0d293c0bf7ce50628877cb9806285 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 27 Jul 2019 06:02:20 -0700 Subject: [PATCH 3408/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9553a4a3-659f-4ec0-9b99-723bba1f7fca PiperOrigin-RevId: 260293525 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7732f733ee6..d95c29d285b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "865d4adfe539f5a076cee1a1e556527a6d7637a43c22b4a5fd45d16daa4579fb", - git_commit = "0d5f78e608eaf6df3ca3fe1bfed8928623a693e7", + sha256 = "a0b5bc0998d7fc85feee2762542784751e422313baf92e4f49ac14d64021f845", + git_commit = "c95e5bcd98b35c2688577262038da645a2088de4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a427e1fe88590c699c4a6c67a5edb558d660ccfb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 27 Jul 2019 12:02:11 -0700 Subject: [PATCH 3409/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/04cf0be0-03d5-4347-8b85-732b8a7ac9ec PiperOrigin-RevId: 260312709 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d95c29d285b..6613d80ee49 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a0b5bc0998d7fc85feee2762542784751e422313baf92e4f49ac14d64021f845", - git_commit = "c95e5bcd98b35c2688577262038da645a2088de4", + sha256 = "9fc29cde0dd6981053c3bb9ccf697aaeda90e2263d18886d3e018bfcc402084a", + git_commit = "086bf1c5d151d3e8af916be23361c97838196448", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 94d212959dbd250ce4b2d56f4a13e257f99cb87c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 27 Jul 2019 18:02:02 -0700 Subject: [PATCH 3410/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/88dc3ec4-d5c3-48b0-bc0c-105518fe0c5c PiperOrigin-RevId: 260331681 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6613d80ee49..68d789e7a37 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9fc29cde0dd6981053c3bb9ccf697aaeda90e2263d18886d3e018bfcc402084a", - git_commit = "086bf1c5d151d3e8af916be23361c97838196448", + sha256 = "0112818d730d58792853a40e32fc06dc892ce8285550768016be368f30a08c13", + git_commit = "adb17d1b9ff053d5e4fc7be2cc4329ea0077bbb9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From cde2563ea15494d55fa3a6939618331ef6bd21bc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 28 Jul 2019 00:02:18 -0700 Subject: [PATCH 3411/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/33c188ef-00d8-426f-a045-7459589b5dcd PiperOrigin-RevId: 260351679 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 68d789e7a37..f43a828d761 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0112818d730d58792853a40e32fc06dc892ce8285550768016be368f30a08c13", - git_commit = "adb17d1b9ff053d5e4fc7be2cc4329ea0077bbb9", + sha256 = "0a15bd3c305a63645335bcc2129777c3c72fa0d5aebcde57ef044c7f35adf82e", + git_commit = "74b382ec72678042c43a2431445ad234989adb93", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a86ef53b9cfcea5b67f49af4c1c9e83720b693c4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 28 Jul 2019 06:02:15 -0700 Subject: [PATCH 3412/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d7159279-db49-4a4c-b481-5f46dca6a464 PiperOrigin-RevId: 260374169 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f43a828d761..e40c8cf8a30 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0a15bd3c305a63645335bcc2129777c3c72fa0d5aebcde57ef044c7f35adf82e", - git_commit = "74b382ec72678042c43a2431445ad234989adb93", + sha256 = "06f0ce2c3eeeae0585482135b5226a1bb5157998fbb3f5c4bcf422cb2f1cd2d6", + git_commit = "52e6d03adebf2eb5429d1df629182f1140249da2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c330e4e08655578355f19e689a6bbfe5e609cc65 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 28 Jul 2019 12:02:11 -0700 Subject: [PATCH 3413/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/275f5be1-dddb-4577-9acd-fd1ef21a32b1 PiperOrigin-RevId: 260393561 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e40c8cf8a30..3a82d4db9a8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "06f0ce2c3eeeae0585482135b5226a1bb5157998fbb3f5c4bcf422cb2f1cd2d6", - git_commit = "52e6d03adebf2eb5429d1df629182f1140249da2", + sha256 = "3c3885eafa65751d32d3e1df37b1c9a6b056084a5da2b643c48e7e490cda7547", + git_commit = "14b1fe9233ffc3c93c00cc4d205f8a92c99b64f6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 08ad52002739da1b80a4b93d3c893ce7223422e5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 28 Jul 2019 18:02:01 -0700 Subject: [PATCH 3414/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/62c8e4e2-4449-4870-860e-ac016a73399d PiperOrigin-RevId: 260413223 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3a82d4db9a8..c7ef81ad2e9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3c3885eafa65751d32d3e1df37b1c9a6b056084a5da2b643c48e7e490cda7547", - git_commit = "14b1fe9233ffc3c93c00cc4d205f8a92c99b64f6", + sha256 = "7dc6970fb78ce9a5ddc9319e3b90553f7e1c6239a434f7d542b7689544e36f9c", + git_commit = "df720580809196ac17e73d7e460b3803781b1e1b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ddf517cc9a95fa4bdac2cb6a81d7f460241610c3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 29 Jul 2019 00:02:18 -0700 Subject: [PATCH 3415/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/97516d00-27d8-425a-baf6-82c99792b9a8 PiperOrigin-RevId: 260440052 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c7ef81ad2e9..f6358f51969 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7dc6970fb78ce9a5ddc9319e3b90553f7e1c6239a434f7d542b7689544e36f9c", - git_commit = "df720580809196ac17e73d7e460b3803781b1e1b", + sha256 = "e643448e8de03d0ce1c5563f66464fd31a1657891b366bc93b79a94f827f3f6e", + git_commit = "ada0605591911094c142d39cbd87294ed2716e8b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4b566032ba263cdd7f52a88ba330e458101e73cc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 29 Jul 2019 06:02:15 -0700 Subject: [PATCH 3416/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8e524ab1-2af6-40ff-bb39-343542574b6c PiperOrigin-RevId: 260482079 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f6358f51969..e68344944bb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e643448e8de03d0ce1c5563f66464fd31a1657891b366bc93b79a94f827f3f6e", - git_commit = "ada0605591911094c142d39cbd87294ed2716e8b", + sha256 = "4a0c81bf8ac657f233aff353fcc0bce1d9ddeab086fb3c6ad62aa47e856c8ceb", + git_commit = "d0d45a55582e9ac8b0a57532534f4e8d54b54767", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 58331807e8a1dac7796451dfea25a1ca69680573 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 29 Jul 2019 12:02:34 -0700 Subject: [PATCH 3417/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5945c7c9-a29f-467e-a2fe-3670b03d3094 PiperOrigin-RevId: 260549738 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e68344944bb..3e6eb922028 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4a0c81bf8ac657f233aff353fcc0bce1d9ddeab086fb3c6ad62aa47e856c8ceb", - git_commit = "d0d45a55582e9ac8b0a57532534f4e8d54b54767", + sha256 = "df7e85c9d5911c6ca77dc6abdc8ef8e79a6035df404520ebb9318999a5237934", + git_commit = "8e6425f114b139a141aeba0ff76cf3f1619ecbbc", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ce96ac3792c1772b44109230cc5667e904e24446 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 29 Jul 2019 18:02:05 -0700 Subject: [PATCH 3418/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9466d4fe-9107-4114-82c6-aa6772c0b019 PiperOrigin-RevId: 260620377 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3e6eb922028..aa128f8e179 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "df7e85c9d5911c6ca77dc6abdc8ef8e79a6035df404520ebb9318999a5237934", - git_commit = "8e6425f114b139a141aeba0ff76cf3f1619ecbbc", + sha256 = "bc657c42be17c03fb7c5c26dfae80f741a5e2a5f1e30df534687c9d6d37189fa", + git_commit = "9e1264260af6e5373735090a915e618452027c54", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 431b1e595b5a251f185a14160d246e001b264d34 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 30 Jul 2019 00:02:28 -0700 Subject: [PATCH 3419/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/284cc192-4940-457d-a765-0a4406290969 PiperOrigin-RevId: 260657311 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index aa128f8e179..a0a20c8bee1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bc657c42be17c03fb7c5c26dfae80f741a5e2a5f1e30df534687c9d6d37189fa", - git_commit = "9e1264260af6e5373735090a915e618452027c54", + sha256 = "180b994708bbee6f6d158332c78f0b38da67320039dbe6423db9064854dbe9a5", + git_commit = "ea4cbeed4f8555339537fce84a27841b598c5986", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From be6a3a1dbf553a2bd2034244d93f76760877806b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 30 Jul 2019 06:02:14 -0700 Subject: [PATCH 3420/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/deddaca1-3adb-4e7d-b626-7c4ef74a2327 PiperOrigin-RevId: 260698698 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a0a20c8bee1..0f668698621 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "180b994708bbee6f6d158332c78f0b38da67320039dbe6423db9064854dbe9a5", - git_commit = "ea4cbeed4f8555339537fce84a27841b598c5986", + sha256 = "e93e5751c8dbff6ca34a8d8cebf50d3e04c8b708b83f819eda31d4b9926d9d39", + git_commit = "392d884b362c85c2269d1f92d523e97cdcafc766", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 20599fb7d43c7968289b54364c4a1af1ea7c5c7a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 30 Jul 2019 12:02:35 -0700 Subject: [PATCH 3421/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e4ccbe65-2391-41b3-b707-6110ae829494 PiperOrigin-RevId: 260766158 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0f668698621..0c43fc6db5f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e93e5751c8dbff6ca34a8d8cebf50d3e04c8b708b83f819eda31d4b9926d9d39", - git_commit = "392d884b362c85c2269d1f92d523e97cdcafc766", + sha256 = "9afaa5de8b9bea6e67ef84efb08fcc4114c4913c559160065ee3f99ad8a23f83", + git_commit = "85e6ca2e232bbe036793d9418341ff0ab67e2389", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From bf1032bc9fad9bac2c69364491c97802bc836436 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 30 Jul 2019 18:02:12 -0700 Subject: [PATCH 3422/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b25858c3-8310-4a8e-bd5d-0ce8bc7ebab5 PiperOrigin-RevId: 260835471 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0c43fc6db5f..1a412897b43 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9afaa5de8b9bea6e67ef84efb08fcc4114c4913c559160065ee3f99ad8a23f83", - git_commit = "85e6ca2e232bbe036793d9418341ff0ab67e2389", + sha256 = "5c2f352727261537dc26f24e304612d18876e80ef35cf923e2e38e59676d164a", + git_commit = "e3efabdcaf9359991527c4aec9544dbd1a61c67d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c1bda7275d5768589d87b3cff535f2326311fdd9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 31 Jul 2019 00:02:35 -0700 Subject: [PATCH 3423/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/54c2f99a-2914-4827-b10c-26c87bb7b1f6 PiperOrigin-RevId: 260871025 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1a412897b43..1638f686f08 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5c2f352727261537dc26f24e304612d18876e80ef35cf923e2e38e59676d164a", - git_commit = "e3efabdcaf9359991527c4aec9544dbd1a61c67d", + sha256 = "31bc20c4e696604a62f9e388bc6a35d035869fb966f0d37e29b05cb9c59528ce", + git_commit = "217fb66a0bd72e7a42324a4cc6af3ab5fb11b55a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 97b1ffa821d1a29268a1247a0439b1697a00cd89 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 31 Jul 2019 06:02:39 -0700 Subject: [PATCH 3424/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/95e69f43-1e28-48d0-b0ec-f44e0e39e616 PiperOrigin-RevId: 260911300 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1638f686f08..a9774e3d65f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "31bc20c4e696604a62f9e388bc6a35d035869fb966f0d37e29b05cb9c59528ce", - git_commit = "217fb66a0bd72e7a42324a4cc6af3ab5fb11b55a", + sha256 = "addec1ac4c489039f51412383fbba3cd78d416e179c136fb126a76674ec8eacb", + git_commit = "b32786df6163ccb09743b806df27da49c5bebb1b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ee4edd59ad5ea088f1a6616cc6de531f66f25c3d Mon Sep 17 00:00:00 2001 From: Pedram Pejman Date: Wed, 31 Jul 2019 10:33:25 -0700 Subject: [PATCH 3425/8103] Modifies server configuration documentation PiperOrigin-RevId: 260953279 --- README.md | 2 +- tensorflow_serving/g3doc/serving_config.md | 171 +++++++++++++++++---- 2 files changed, 138 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index c787a451662..719b2988a5c 100644 --- a/README.md +++ b/README.md @@ -88,9 +88,9 @@ for detailed instructions on how to export SavedModels. #### Configure and Use Tensorflow Serving * [Follow a tutorial on Serving Tensorflow models](tensorflow_serving/g3doc/serving_basic.md) +* [Configure Tensorflow Serving to make it fit your serving use case](tensorflow_serving/g3doc/serving_config.md) * Read the [REST API Guide](tensorflow_serving/g3doc/api_rest.md) or [gRPC API definition](https://github.com/tensorflow/serving/tree/master/tensorflow_serving/apis) * [Use SavedModel Warmup if initial inference requests are slow due to lazy initialization of graph](tensorflow_serving/g3doc/saved_model_warmup.md) -* [Configure models, version and version policy via Serving Config](tensorflow_serving/g3doc/serving_config.md) * [If encountering issues regarding model signatures, please read the SignatureDef documentation](tensorflow_serving/g3doc/signature_defs.md) * If using a model with custom ops, [learn how to serve models with custom ops](tensorflow_serving/g3doc/custom_op.md) diff --git a/tensorflow_serving/g3doc/serving_config.md b/tensorflow_serving/g3doc/serving_config.md index 3e5f13b841a..2fe19dcde42 100644 --- a/tensorflow_serving/g3doc/serving_config.md +++ b/tensorflow_serving/g3doc/serving_config.md @@ -1,19 +1,69 @@ -# How to Configure a Model Server +# Tensorflow Serving Configuration -Create a file containing an ASCII -[ModelServerConfig](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/config/model_server_config.proto#L76) -protocol buffer, and pass its path to the server using the --model_config_file -flag. (Some useful references: -[what an ASCII protocol buffer looks like](https://stackoverflow.com/questions/18873924/what-does-the-protobuf-text-format-look-like); -[how to pass flags in Docker](docker.md#passing-additional-arguments).) +In this guide, we will go over the numerous configuration points for Tensorflow +Serving. -You can also reload the model config on the fly, after the server is running, -via the -[HandleReloadConfigRequest](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/apis/model_service.proto#L22) -RPC endpoint. This will cause models in the new config that are not in the old -config to be loaded, and models in the old config that are not in the new config -to be unloaded; (models in both configs will remain in place, and will not be -transiently unloaded). +## Overview + +While most configurations relate to the Model Server, there are many ways to +specify the behavior of Tensorflow Serving: + +* [Model Server Configuration](#model-server-configuration): Specify model + names, paths, version policy & labels, logging configuration and more +* [Monitoring Configuration](#monitoring-configuration): Enable and configure + Prometheus monitoring +* [Batching Configuration](#batching-configuration): Enable batching and + configure its parameters +* [Misc. Flags](#miscellaneous-flags): A number of misc. flags that can be + provided to fine-tune the behavior of a Tensorflow Serving deployment + +## Model Server Configuration + +The easiest way to serve a model is to provide the `--model_name` and +`--model_base_path` flags (or setting the `MODEL_NAME` environment variable if +using Docker). However, if you would like to serve multiple models, or configure +options like polling frequency for new versions, you may do so by writing a +Model Server config file. + +You may provide this configuration file using the `--model_config_file` flag and +instruct Tensorflow Serving to periodically poll for updated versions of this +configuration file at the specifed path by setting the +`--model_config_file_poll_wait_seconds` flag. + +Example using Docker: + +``` +docker run -t --rm -p 8501:8501 \ + -v "$(pwd)/models/:/models/" tensorflow/serving \ + --model_config_file=/models/models.config \ + --model_config_file_poll_wait_seconds=60 +``` + +### Reloading Model Server Configuration + +There are two ways to reload the Model Server configuration: + +* By setting the `--model_config_file_poll_wait_seconds` flag to instruct the + server to periodically check for a new config file at `--model_config_file` + filepath. + +* By issuing + [HandleReloadConfigRequest](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/apis/model_service.proto#L22) + RPC calls to the server and supplying a new Model Server config + programmatically. + +Please note that each time the server loads the new config file, it will act to +realize the content of the new specified config and _only_ the new specified +config. This means if model A was present in the first config file, which is +replaced with a file that contains only model B, the server will load model B +and unload model A. + +### Model Server Config Details + +The Model Server configuration file provided must be an ASCII +[ModelServerConfig](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/config/model_server_config.proto#L76) +protocol buffer. Refer to the following to understand +[what an ASCII protocol buffer looks like](https://stackoverflow.com/questions/18873924/what-does-the-protobuf-text-format-look-like). For all but the most advanced use-cases, you'll want to use the ModelConfigList option, which is a list of @@ -34,7 +84,7 @@ model_config_list { } ``` -## Configuring One Model +### Configuring One Model Each ModelConfig specifies one model to be served, including its name and the path where the Model Server should look for versions of the model to serve, as @@ -134,35 +184,88 @@ that has version 42 as "stable". Otherwise, you can march forward by unloading version 42 and loading the new version 44 when it is ready, and then advancing the canary label to 44, and so on. -Please note that labels can only be assigned to model versions that are loaded -and available for serving. Once a model version is available, one may reload -the model config on the fly, to assign a label to it -(can be achieved using +Please note that labels can only be assigned to model versions that are +_already_ loaded and available for serving. Once a model version is available, +one may reload the model config on the fly to assign a label to it. This can be +achieved using a [HandleReloadConfigRequest](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/apis/model_service.proto#L22) -RPC endpoint). +RPC or if the server is set up to periodically poll the filesystem for the +config file, as described [above](#reloading-model-server-configuration). + +If you would like to assign a label to a version that is not yet loaded (for ex. +by supplying both the model version and the label at startup time) then you must +set the `--alow_version_labels_for_unavailable_models` flag to true, which +allows new labels to be assigned to model versions that are not loaded yet. -## How to Configure for Monitoring +Please note that this applies only to new version labels (i.e. ones not assigned +to a version currently). This is to ensure that during version swaps, the server +does not prematurely assign the label to the new version, thereby dropping all +requests destined for that label while the new version is loading. -Create a monitoring config file containing a +In order to comply with this safety check, if re-assigning an already in-use +version label, you must assign it only to already-loaded versions. For example, +if you would like to move a label from pointing to version N to version N+1, you +may first submit a config containing version N and N+1, and then submit a config +that contains version N+1, the label pointing to N+1 and no version N. + +## Monitoring Configuration + +You may provide a monitoring configuration to the server by using the +`--monitoring_config_file` flag to specify a file containing a [MonitoringConfig](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/config/monitoring_config.proto#L17) -and set --monitoring_config_file flag to the path of this file. It currently -provides a monitoring exporter for [Prometheus](https://prometheus.io/), and -whose config is described in -[PrometheusConfig](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/config/monitoring_config.proto#L7) protocol buffer. Here's an example: ```proto prometheus_config { - enable: true + enable: true, + path: "/monitoring/prometheus/metrics" } ``` -The default monitoring endpoint is `/monitoring/prometheus/metrics`. -You can set `path` field in prometheus_config to change the default path. +To read metrics from the above monitoring URL, you first need to enable the HTTP +server by setting the `--rest_api_port` flag. You can then configure your +Prometheus Server to pull metrics from Model Server by passing it the values of +`--rest_api_port` and `path`. + +Tensorflow Serving collects all metrics that are captured by Serving as well as +core Tensorflow. + +## Batching Configuration + +Model Server has the ability to batch requests in a variety of settings in order +to realize better throughput. The scheduling for this batching is done globally +for all models and model versions on the server to ensure the best possible +utilization of the underlying resources no matter how many models or model +versions are currently being served by the server +([more details](../batching/README.md#servers-with-multiple-models-model-versions-or-subtasks)). +You may enable this behavior by setting the `--enable_batching` flag and control +it by passing a config to the `--batching_parameters_file` flag. + +Example batching parameters file: + +``` +max_batch_size { value: 128 } +batch_timeout_micros { value: 0 } +max_enqueued_batches { value: 1000000 } +num_batch_threads { value: 8 } +``` + +Please refer to the [batching guide](../batching/README.md) for an in-depth +discussion and refer to the +[section on parameters](../batching/README.md#batch-scheduling-parameters-and-tuning) +to understand how to set the parameters. + +## Miscellaneous Flags -To read metrics from above monitoring URL, you need to set `--rest_api_port` -flag to enable HTTP requests. Configure your Prometheus Server to pulls metrics -from Model Server configured by `--rest_api_port` and `path`. +In addition to the flags covered so far in the guide, here we list a few other +notable ones. For a complete list, please refer to the +[source code](../model_servers/main.cc#L59). -Tensorflow Serving collects all metrics that are available on Tensorflow and the -serving itself. +* `--port`: Port to listen on for gRPC API +* `--rest_api_port`: Port to listen on for HTTP/REST API +* `--rest_api_timeout_in_ms`: Timeout for HTTP/REST API calls +* `--file_system_poll_wait_seconds`: The period with which the server polls + the filesystem for new model versions at each model's respective + model_base_path +* `--enable_model_warmup`: Enables [model warmup](saved_model_warmup.md) using + user-provided PredictionLogs in assets.extra/ directory From 6916b018464ed6f1473e0b7eebd5236ae6e9e434 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 31 Jul 2019 12:02:15 -0700 Subject: [PATCH 3426/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9e496082-0ded-489e-8d97-3f1100c98fd4 PiperOrigin-RevId: 260972392 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a9774e3d65f..5c7f01315c3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "addec1ac4c489039f51412383fbba3cd78d416e179c136fb126a76674ec8eacb", - git_commit = "b32786df6163ccb09743b806df27da49c5bebb1b", + sha256 = "fb22bed664b888b1aff82a2dc4a81bae7702025af1af0f0ce7fa79ba2ad81d2e", + git_commit = "7ee082be19059927e88e617b80a291810c0402ba", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From bc07ec9015cba820be7f1087153d216964bd1a0b Mon Sep 17 00:00:00 2001 From: Haiming Bao Date: Fri, 2 Aug 2019 09:45:05 -0700 Subject: [PATCH 3427/8103] Fixes bazel build errors. PiperOrigin-RevId: 261337315 --- tensorflow_serving/workspace.bzl | 5 ----- 1 file changed, 5 deletions(-) diff --git a/tensorflow_serving/workspace.bzl b/tensorflow_serving/workspace.bzl index 7c6ab3308b5..768a4343c70 100644 --- a/tensorflow_serving/workspace.bzl +++ b/tensorflow_serving/workspace.bzl @@ -15,11 +15,6 @@ def tf_serving_workspace(): actual = "@boringssl//:ssl", ) - native.bind( - name = "zlib", - actual = "@zlib_archive//:zlib", - ) - # gRPC wants the existence of a cares dependence but its contents are not # actually important since we have set GRPC_ARES=0 in tools/bazel.rc native.bind( From 95af20855400c4424c9faa54fc5e0d271c91be48 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 2 Aug 2019 18:02:27 -0700 Subject: [PATCH 3428/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/57767e0f-160c-443c-8c21-df26489aa79e PiperOrigin-RevId: 261426361 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5c7f01315c3..e8f299721a2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fb22bed664b888b1aff82a2dc4a81bae7702025af1af0f0ce7fa79ba2ad81d2e", - git_commit = "7ee082be19059927e88e617b80a291810c0402ba", + sha256 = "f612f14fac9c47d63f7aba5af891519e05e74110b0ed5682ed6a25ba5e593269", + git_commit = "be3d123c6572ba7304208db5ef6fca4e9b0ac65d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 21640d8e79bb305270651c3a16363a2249eabb91 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 3 Aug 2019 00:05:25 -0700 Subject: [PATCH 3429/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/94f503b4-0ee5-43f5-8591-909f2ef8cc5d PiperOrigin-RevId: 261453558 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e8f299721a2..43e2f74dfb4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f612f14fac9c47d63f7aba5af891519e05e74110b0ed5682ed6a25ba5e593269", - git_commit = "be3d123c6572ba7304208db5ef6fca4e9b0ac65d", + sha256 = "fd8454b5f10abc25b75d475e8e973a3190d3d343d8fa137251e94fd8714b78ca", + git_commit = "fb079269f9f16226eea166a7b1d8d97e39cbdd59", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6ec1e9c4e62d286c8b0a3c849fdaefff9e337084 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 3 Aug 2019 06:01:59 -0700 Subject: [PATCH 3430/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/125a5837-d269-44bb-a90a-8b70eb3e5e3e PiperOrigin-RevId: 261476496 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 43e2f74dfb4..a442a7114b1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fd8454b5f10abc25b75d475e8e973a3190d3d343d8fa137251e94fd8714b78ca", - git_commit = "fb079269f9f16226eea166a7b1d8d97e39cbdd59", + sha256 = "2f131746689a222b5c8fc348afa8a8df331517e331bdc27439112b9bb2b377e4", + git_commit = "fea83c7c9b81cc05418c48353ab1e8f031ea079a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5b87873cdc5f0e17d5b55de29525c4a19da7a79f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 3 Aug 2019 12:02:39 -0700 Subject: [PATCH 3431/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fe00355e-3b9f-41d3-981e-34dff921ae7a PiperOrigin-RevId: 261496985 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a442a7114b1..63a5b2ba408 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2f131746689a222b5c8fc348afa8a8df331517e331bdc27439112b9bb2b377e4", - git_commit = "fea83c7c9b81cc05418c48353ab1e8f031ea079a", + sha256 = "cd6934b40ab7884f33ff6fc596ddd0e0ee61ca105723d6a2cd036b8003860f51", + git_commit = "6b4b4d417db40595d3593802c560420591c3f2bc", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From eab0a9d9cc0376d21b40ec46fcdcd22d0ae0f627 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 3 Aug 2019 18:12:24 -0700 Subject: [PATCH 3432/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/82cd3915-1baa-4651-8eac-69affe4e7bfe PiperOrigin-RevId: 261517413 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 63a5b2ba408..bcbf3c6cc8f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cd6934b40ab7884f33ff6fc596ddd0e0ee61ca105723d6a2cd036b8003860f51", - git_commit = "6b4b4d417db40595d3593802c560420591c3f2bc", + sha256 = "c99527d2965262059df5f20eec4e8281f6607dce3c035e5ea600fc1150258f0f", + git_commit = "17d55101cc5818173499b94ccf5b5ed32ad15bbc", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e3c4dbb73690614f2518fa8614ec6299abb8b64a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 4 Aug 2019 00:02:17 -0700 Subject: [PATCH 3433/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9f2095e0-5855-4012-93df-b99fd6cc7935 PiperOrigin-RevId: 261537663 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bcbf3c6cc8f..1ad4507c7fc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c99527d2965262059df5f20eec4e8281f6607dce3c035e5ea600fc1150258f0f", - git_commit = "17d55101cc5818173499b94ccf5b5ed32ad15bbc", + sha256 = "e3aeaf3db36d36eb4690629e0abd1269e4dfcdb43ddb1b4eb339a2d2faa35276", + git_commit = "201b59fb5558e2aad1f6c077e384ca140764aabd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 644d78ed7568474e3accf2c624e567ce1a064b55 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 4 Aug 2019 06:02:04 -0700 Subject: [PATCH 3434/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f8df2801-eaf5-4473-b88b-f162c0708a4f PiperOrigin-RevId: 261560826 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1ad4507c7fc..5047c3f249a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e3aeaf3db36d36eb4690629e0abd1269e4dfcdb43ddb1b4eb339a2d2faa35276", - git_commit = "201b59fb5558e2aad1f6c077e384ca140764aabd", + sha256 = "56ad0e3688c99114c68ba832ebf8b7c3c2fb1cb8b9cb589c2f32b18fb7646139", + git_commit = "12a4845ed5ba98a5d0d61874cd048e07e58d103d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 93cbc24ab569e1f719e7996810d52e5fda23c1e5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 4 Aug 2019 12:02:11 -0700 Subject: [PATCH 3435/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0d2a7ce0-f457-4ed4-805b-8b41d41de98c PiperOrigin-RevId: 261580305 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5047c3f249a..8eb3ecb4437 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "56ad0e3688c99114c68ba832ebf8b7c3c2fb1cb8b9cb589c2f32b18fb7646139", - git_commit = "12a4845ed5ba98a5d0d61874cd048e07e58d103d", + sha256 = "e06cb31ccc4cde356974068692c045b23e857a48aefeefa8e8969abb1b946b97", + git_commit = "80fa48dac27895f60dcc85df748475a0493a93ee", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 559487886e62d5067e72bd69d55a495d2e621f49 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 4 Aug 2019 18:02:06 -0700 Subject: [PATCH 3436/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/990523f4-ecca-45f3-8e43-ef80054605ac PiperOrigin-RevId: 261600471 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8eb3ecb4437..38c70e06970 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e06cb31ccc4cde356974068692c045b23e857a48aefeefa8e8969abb1b946b97", - git_commit = "80fa48dac27895f60dcc85df748475a0493a93ee", + sha256 = "ab2ae2938be072eddf23abafbd603ab3c1358e79715c6b4881a8786bf61ef2b2", + git_commit = "1442bc21161265b49740a04cb218b8e90dc76d7b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 17bbec3e0ee33a40822688f5be553756b3625409 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 5 Aug 2019 00:02:09 -0700 Subject: [PATCH 3437/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/01e0f0c5-8848-4de2-ae40-f5e622d63db4 PiperOrigin-RevId: 261627797 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 38c70e06970..ce4d2465361 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ab2ae2938be072eddf23abafbd603ab3c1358e79715c6b4881a8786bf61ef2b2", - git_commit = "1442bc21161265b49740a04cb218b8e90dc76d7b", + sha256 = "5fc19b748a19da7127b3662985abc3f7cb11ab620c9d93aa1d981cef6639fee1", + git_commit = "864d2942feb2d38e85a55626c01408487cb46403", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 47b92c0f4ee1aa533ba27dab9be908a6c1ce120c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 5 Aug 2019 06:02:12 -0700 Subject: [PATCH 3438/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6e26ae37-7e10-4509-ac7d-bc57b2812a65 PiperOrigin-RevId: 261669464 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ce4d2465361..db8cb56c09f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5fc19b748a19da7127b3662985abc3f7cb11ab620c9d93aa1d981cef6639fee1", - git_commit = "864d2942feb2d38e85a55626c01408487cb46403", + sha256 = "7c932fe5bb920185e9d96cac595509503434cb50eb8951cbd234bc94f4d61ca6", + git_commit = "ec546ec44ce39a8551af6740b55508f0def22258", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 093734d002bd9de2a68d34160e23f35db196c080 Mon Sep 17 00:00:00 2001 From: Anjali Sridhar Date: Mon, 5 Aug 2019 11:37:38 -0700 Subject: [PATCH 3439/8103] Add tf.distribute + Keras model save/load test in TF serving. PiperOrigin-RevId: 261731501 --- .../tensorflow_model_server_test.py | 56 ++++++++++++++++++- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/model_servers/tensorflow_model_server_test.py b/tensorflow_serving/model_servers/tensorflow_model_server_test.py index be041f6bb93..1b32a3b84b7 100644 --- a/tensorflow_serving/model_servers/tensorflow_model_server_test.py +++ b/tensorflow_serving/model_servers/tensorflow_model_server_test.py @@ -36,6 +36,8 @@ import tensorflow as tf from tensorflow.core.framework import types_pb2 +from tensorflow.python.eager import context +from tensorflow.python.framework import config as device_config from tensorflow.python.platform import flags from tensorflow.python.saved_model import signature_constants from tensorflow_serving.apis import classification_pb2 @@ -46,7 +48,6 @@ from tensorflow_serving.apis import prediction_service_pb2_grpc from tensorflow_serving.apis import regression_pb2 - FLAGS = flags.FLAGS RPC_TIMEOUT = 5.0 @@ -56,6 +57,26 @@ GRPC_SOCKET_PATH = '/tmp/tf-serving.sock' +def SetVirtualCpus(num_virtual_cpus): + """Create virtual CPU devices if they haven't yet been created.""" + if num_virtual_cpus < 1: + raise ValueError('`num_virtual_cpus` must be at least 1 not %r' % + (num_virtual_cpus,)) + physical_devices = device_config.list_physical_devices('CPU') + if not physical_devices: + raise RuntimeError('No CPUs found') + configs = device_config.get_virtual_device_configuration(physical_devices[0]) + if configs is None: + virtual_devices = [context.VirtualDeviceConfiguration() + for _ in range(num_virtual_cpus)] + device_config.set_virtual_device_configuration( + physical_devices[0], virtual_devices) + else: + if len(configs) < num_virtual_cpus: + raise RuntimeError('Already configured with %d < %d virtual CPUs' % + (len(configs), num_virtual_cpus)) + + def PickUnusedPort(): s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) s.bind(('', 0)) @@ -888,7 +909,6 @@ def test_tf_saved_model_save_multiple_signatures(self): def test_sequential_keras_saved_model_save(self): """Test loading a simple SavedModel created with Keras Sequential API.""" - model = tf.keras.models.Sequential() model.add(tf.keras.layers.Input(dtype='float32', shape=(1,), name='x')) @@ -911,6 +931,38 @@ def test_sequential_keras_saved_model_save(self): expected_output=2.0, expected_version=expected_version) + def test_distrat_sequential_keras_saved_model_save(self): + """Test loading a Keras SavedModel with tf.distribute.""" + # You need to call SetVirtualCpus in test setUp with the maximum value + # needed in any test if you use this in multiple tests. For now this is the + # only test using this functionality. + SetVirtualCpus(2) + strategy = tf.distribute.MirroredStrategy(devices=('/cpu:0', '/cpu:1')) + with strategy.scope(): + model = tf.keras.models.Sequential() + + model.add(tf.keras.layers.Input(dtype='float32', shape=(1,), name='x')) + model.add(tf.keras.layers.Dense(1, kernel_initializer='ones', + bias_initializer='zeros')) + model.add(tf.keras.layers.Lambda(lambda x: x, name='y')) + + base_path = os.path.join(self.get_temp_dir(), + 'keras_sequential_saved_model_save') + export_path = os.path.join(base_path, '00000123') + + tf.saved_model.save(model, export_path) + + _, model_server_address, _ = TensorflowModelServerTest.RunServer( + 'default', base_path) + + expected_version = self._GetModelVersion(base_path) + self.VerifyPredictRequest( + model_server_address, + batch_input=True, + specify_output=False, + expected_output=2.0, + expected_version=expected_version) + if __name__ == '__main__': tf.enable_eager_execution() From 32cd353bafe77ea56a585082bd6bba07c36042dc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 5 Aug 2019 12:03:30 -0700 Subject: [PATCH 3440/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4c954c81-4ea4-4444-8644-d75c1aa18474 PiperOrigin-RevId: 261737830 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index db8cb56c09f..9cfa5fa0f0e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7c932fe5bb920185e9d96cac595509503434cb50eb8951cbd234bc94f4d61ca6", - git_commit = "ec546ec44ce39a8551af6740b55508f0def22258", + sha256 = "45679913a6fec547cda47729202e8f608d7fa295e546efa63db7df856c6b68f5", + git_commit = "5dfa73ed352f6dcac52355d56b45446cde4f9e17", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1f8f2902b6465f239bb58af2b3fb27ba73b5c7c5 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Mon, 5 Aug 2019 12:46:27 -0700 Subject: [PATCH 3441/8103] Remove unused fields from MetaGraphDef proto message, stored in `SavedModelBundle`. This will help save memory on the ModelServer. Notably due to dropping GraphDef submessage (that may be large, due to possibility of const tensors being inlined in the graph). Presently we remove all except SignatureDef map from MetaGraphDef. Removal is controlled via `--remove_unused_fields_from_metagraph` flag (defaults to being `true`, so removal will happen post this change). PiperOrigin-RevId: 261746824 --- tensorflow_serving/model_servers/main.cc | 7 ++- tensorflow_serving/model_servers/server.cc | 2 + tensorflow_serving/model_servers/server.h | 1 + .../tensorflow/saved_model_bundle_factory.cc | 13 ++++++ .../saved_model_bundle_factory_test.cc | 45 ++++++++++++++----- .../tensorflow/session_bundle_config.proto | 7 +++ 6 files changed, 64 insertions(+), 11 deletions(-) diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index 7a737f685a4..5341b34fb34 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -182,7 +182,12 @@ int main(int argc, char** argv) { tensorflow::Flag( "monitoring_config_file", &options.monitoring_config_file, "If non-empty, read an ascii MonitoringConfig protobuf from " - "the supplied file name")}; + "the supplied file name"), + tensorflow::Flag( + "remove_unused_fields_from_bundle_metagraph", + &options.remove_unused_fields_from_bundle_metagraph, + "Removes unused fields from MetaGraphDef proto message to save " + "memory.")}; const auto& usage = tensorflow::Flags::Usage(argv[0], flag_list); if (!tensorflow::Flags::Parse(&argc, argv, flag_list)) { diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index ff236bbf9b9..460fca1b572 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -265,6 +265,8 @@ Status Server::BuildAndStart(const Options& server_options) { ->mutable_num_request_iterations() ->set_value(server_options.num_request_iterations_for_warmup); } + session_bundle_config.set_remove_unused_fields_from_bundle_metagraph( + server_options.remove_unused_fields_from_bundle_metagraph); options.platform_config_map = CreateTensorFlowPlatformConfigMap( session_bundle_config, use_saved_model); } else { diff --git a/tensorflow_serving/model_servers/server.h b/tensorflow_serving/model_servers/server.h index 35087991b21..76840d71ce8 100644 --- a/tensorflow_serving/model_servers/server.h +++ b/tensorflow_serving/model_servers/server.h @@ -81,6 +81,7 @@ class Server { tensorflow::string monitoring_config_file; // Tensorflow session run options. bool enforce_session_run_timeout = true; + bool remove_unused_fields_from_bundle_metagraph = true; Options(); }; diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc index 62ab3a70513..4110bcdcb0d 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc @@ -20,6 +20,7 @@ limitations under the License. #include "tensorflow/core/framework/tensor.pb.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/protobuf/config.pb.h" +#include "tensorflow/core/protobuf/meta_graph.pb.h" #include "tensorflow/core/protobuf/named_tensor.pb.h" #include "tensorflow/core/public/session_options.h" #include "tensorflow_serving/servables/tensorflow/bundle_factory_util.h" @@ -119,6 +120,18 @@ Status SavedModelBundleFactory::InternalCreateSavedModelBundle( (*bundle)->session.reset( new CurriedSession(std::move((*bundle)->session), fixed_input_tensors)); } + if (config_.remove_unused_fields_from_bundle_metagraph()) { + // Save memory by removing fields in MetaGraphDef proto message stored + // in the bundle that we never use. Notably the unused graphdef submessage + // can get large (MBs) wasting memory on the server. + // + // Presently we retain following field(s) of MetaGraphDef proto: + // - signature_def + MetaGraphDef metagraph; + (*bundle)->meta_graph_def.Swap(&metagraph); + (*bundle)->meta_graph_def.mutable_signature_def()->swap( + *metagraph.mutable_signature_def()); + } if (config_.has_batching_parameters()) { LOG(INFO) << "Wrapping session to perform batch processing"; if (batch_scheduler_ == nullptr) { diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory_test.cc b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory_test.cc index 95c68b7564a..a8838950ccd 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory_test.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory_test.cc @@ -45,13 +45,12 @@ enum class CreationType { kWithoutMetadata, kWithMetadata }; Loader::Metadata CreateMetadata() { return {ServableId{"name", 42}}; } // Creates a new session based on the config and export path. -Status CreateSessionFromPath(const CreationType creation_type, - const SessionBundleConfig& config, - const string& path, - std::unique_ptr* session) { +Status CreateBundleFromPath(const CreationType creation_type, + const SessionBundleConfig& config, + const string& path, + std::unique_ptr* bundle) { std::unique_ptr factory; TF_RETURN_IF_ERROR(SavedModelBundleFactory::Create(config, &factory)); - std::unique_ptr bundle; auto config_with_session_hook = config; config_with_session_hook.set_session_target( test_util::kNewSessionHookSessionTargetPrefix); @@ -74,14 +73,13 @@ Status CreateSessionFromPath(const CreationType creation_type, switch (creation_type) { case CreationType::kWithoutMetadata: - TF_RETURN_IF_ERROR(factory->CreateSavedModelBundle(path, &bundle)); + TF_RETURN_IF_ERROR(factory->CreateSavedModelBundle(path, bundle)); break; case CreationType::kWithMetadata: TF_RETURN_IF_ERROR(factory->CreateSavedModelBundleWithMetadata( - CreateMetadata(), path, &bundle)); + CreateMetadata(), path, bundle)); break; } - *session = std::move(bundle->session); return Status::OK(); } @@ -98,7 +96,11 @@ class SavedModelBundleFactoryTest protected: Status CreateSession(const SessionBundleConfig& config, std::unique_ptr* session) const override { - return CreateSessionFromPath(GetParam(), config, export_dir_, session); + std::unique_ptr bundle; + TF_RETURN_IF_ERROR( + CreateBundleFromPath(GetParam(), config, export_dir_, &bundle)); + *session = std::move(bundle->session); + return Status::OK(); } }; @@ -135,6 +137,25 @@ TEST_P(SavedModelBundleFactoryTest, FixedInputTensors) { test::ExpectTensorEqual(expected_output, single_output); } +TEST_P(SavedModelBundleFactoryTest, RemoveUnusedFieldsFromMetaGraphDefault) { + SessionBundleConfig config; + *config.add_saved_model_tags() = kSavedModelTagServe; + std::unique_ptr bundle; + TF_ASSERT_OK(CreateBundleFromPath(GetParam(), config, export_dir_, &bundle)); + EXPECT_TRUE(bundle->meta_graph_def.has_graph_def()); + EXPECT_FALSE(bundle->meta_graph_def.signature_def().empty()); +} + +TEST_P(SavedModelBundleFactoryTest, RemoveUnusedFieldsFromMetaGraphEnabled) { + SessionBundleConfig config; + *config.add_saved_model_tags() = kSavedModelTagServe; + config.set_remove_unused_fields_from_bundle_metagraph(true); + std::unique_ptr bundle; + TF_ASSERT_OK(CreateBundleFromPath(GetParam(), config, export_dir_, &bundle)); + EXPECT_FALSE(bundle->meta_graph_def.has_graph_def()); + EXPECT_FALSE(bundle->meta_graph_def.signature_def().empty()); +} + TEST_P(SavedModelBundleFactoryTest, Batching) { TestBatching(); } TEST_P(SavedModelBundleFactoryTest, EstimateResourceRequirementWithGoodExport) { @@ -162,7 +183,11 @@ class SavedModelBundleFactoryBackwardCompatibilityTest private: Status CreateSession(const SessionBundleConfig& config, std::unique_ptr* session) const override { - return CreateSessionFromPath(GetParam(), config, export_dir_, session); + std::unique_ptr bundle; + TF_RETURN_IF_ERROR( + CreateBundleFromPath(GetParam(), config, export_dir_, &bundle)); + *session = std::move(bundle->session); + return Status::OK(); } }; diff --git a/tensorflow_serving/servables/tensorflow/session_bundle_config.proto b/tensorflow_serving/servables/tensorflow/session_bundle_config.proto index 26b1893b7a5..0ff52809256 100644 --- a/tensorflow_serving/servables/tensorflow/session_bundle_config.proto +++ b/tensorflow_serving/servables/tensorflow/session_bundle_config.proto @@ -76,6 +76,13 @@ message SessionBundleConfig { // consists of information like the model name, version, which can then be // used by the TensorFlow runtime appropriately (for debugging, logging, etc). bool enable_session_metadata = 781; + + // EXPERIMENTAL. THIS FIELD MAY CHANGE OR GO AWAY. USE WITH CAUTION. + // + // Remove unused fields from metagraph proto message in SavedModelBundle. + // This message is stored alongside the `Session` object. Removing unwanted + // fields helps reduce memory footprint. + bool remove_unused_fields_from_bundle_metagraph = 782; } // Batching parameters. Each individual parameter is optional. If omitted, the From 457be233aeb431fb94a2c5c64b4929a933f1e619 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 5 Aug 2019 18:02:02 -0700 Subject: [PATCH 3442/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/df66b59a-7644-427d-a1bf-8e861168d43d PiperOrigin-RevId: 261811606 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9cfa5fa0f0e..e61378a81bd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "45679913a6fec547cda47729202e8f608d7fa295e546efa63db7df856c6b68f5", - git_commit = "5dfa73ed352f6dcac52355d56b45446cde4f9e17", + sha256 = "d8f097346aa99eeaca9048bcdc74ce75e6c187b0938d9ac4626a784852883827", + git_commit = "2021e7f2ac236fcaba13c2494e05bddc85081d64", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3db1c753bbd484052d513454cbba894032ebae2c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 6 Aug 2019 00:03:07 -0700 Subject: [PATCH 3443/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/86d2c1de-ead7-4b93-99e9-ef661f6335fd PiperOrigin-RevId: 261851885 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e61378a81bd..457268c3cd8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d8f097346aa99eeaca9048bcdc74ce75e6c187b0938d9ac4626a784852883827", - git_commit = "2021e7f2ac236fcaba13c2494e05bddc85081d64", + sha256 = "017ec2817dfa87a09a039094a130126ca7c770aeefda30c234ad7ddb8a47e23f", + git_commit = "d18653005c8ff077492b541538538de0b2ec55ac", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 495eae249e20a4962f8c6552e1de9a5b0159468d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 6 Aug 2019 06:03:40 -0700 Subject: [PATCH 3444/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f6c8305a-b06c-4070-8a2f-8c68af1f5cd2 PiperOrigin-RevId: 261897582 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 457268c3cd8..90dec4fd4db 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "017ec2817dfa87a09a039094a130126ca7c770aeefda30c234ad7ddb8a47e23f", - git_commit = "d18653005c8ff077492b541538538de0b2ec55ac", + sha256 = "6d4e0af688ee10b7b6b7020803b92665926d17e39a4a5e4eb341d4d083e697b7", + git_commit = "ecc0b95092f3b8f76a1ace92830a354653ae8b33", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 561cabbabe9d44da6b20fcf0eb9170859d3ea9fe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 6 Aug 2019 11:37:23 -0700 Subject: [PATCH 3445/8103] Fix typo (missing colon) in comment. PiperOrigin-RevId: 261960205 --- .../util/net_http/server/public/server_request_interface.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/util/net_http/server/public/server_request_interface.h b/tensorflow_serving/util/net_http/server/public/server_request_interface.h index e866a6a3925..77207ab5691 100644 --- a/tensorflow_serving/util/net_http/server/public/server_request_interface.h +++ b/tensorflow_serving/util/net_http/server/public/server_request_interface.h @@ -73,7 +73,7 @@ class ServerRequestInterface { // Input/output byte-buffer types are subject to change! // I/O buffer choices: - // - absl:ByteStream would work but it is not yet open-sourced + // - absl::ByteStream would work but it is not yet open-sourced // - iovec doesn't add much value and may limit portability; but otherwise // the current API is compatible with iovec // - absl::Span is open-sourced, but string_view is simpler to use for writing From f9fff0d2792bd41bc82bdb73e61d600ff986cd54 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 6 Aug 2019 12:06:04 -0700 Subject: [PATCH 3446/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/32de552f-fff9-42e5-8fb8-92d5eca5dfcd PiperOrigin-RevId: 261966312 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 90dec4fd4db..4b019831ff5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6d4e0af688ee10b7b6b7020803b92665926d17e39a4a5e4eb341d4d083e697b7", - git_commit = "ecc0b95092f3b8f76a1ace92830a354653ae8b33", + sha256 = "c4d4621c28a29173e8a9a400a879fb35cd978d020c92c10ed7f20bb69b3a1999", + git_commit = "65c77144e27c3eef8388f1a76a18b2c5cc900939", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ac04e52decb76158db8d06325aa7b4cf88233d43 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 6 Aug 2019 18:07:18 -0700 Subject: [PATCH 3447/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/acdac31d-9dce-4a51-aafb-d46484961ad8 PiperOrigin-RevId: 262037029 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4b019831ff5..886da3c3817 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c4d4621c28a29173e8a9a400a879fb35cd978d020c92c10ed7f20bb69b3a1999", - git_commit = "65c77144e27c3eef8388f1a76a18b2c5cc900939", + sha256 = "0600baad5fd8e4959e8ee36a5c53ea13efa5034b1598f6e9fef66cd301889504", + git_commit = "afb7b973728dabb144d539b9c29d579cf48d2b77", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8069dd64a13447eff84171393175bb7f781fe157 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 7 Aug 2019 00:02:27 -0700 Subject: [PATCH 3448/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9e4b2f50-79df-486a-8821-08a8ecf991d5 PiperOrigin-RevId: 262075116 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 886da3c3817..40592a72a2a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0600baad5fd8e4959e8ee36a5c53ea13efa5034b1598f6e9fef66cd301889504", - git_commit = "afb7b973728dabb144d539b9c29d579cf48d2b77", + sha256 = "530b6c45ee20efe0e34d3f4bcf32b6d34020b5fb1a400c0871d9d79b14243c17", + git_commit = "a1e4ab848ac30b9488bd0fcbe619f33575e3a378", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 581c2948d108de5adca544e9236f763b4da21643 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 7 Aug 2019 06:02:34 -0700 Subject: [PATCH 3449/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/28f2b50e-f4bf-4fb6-9411-abd12ad85600 PiperOrigin-RevId: 262119002 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 40592a72a2a..387f527aaf9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "530b6c45ee20efe0e34d3f4bcf32b6d34020b5fb1a400c0871d9d79b14243c17", - git_commit = "a1e4ab848ac30b9488bd0fcbe619f33575e3a378", + sha256 = "8169fed5ee39eabd04e47d9c3eae6d6bfc5b3148214a01749908ff8abb56fc03", + git_commit = "b1608511d5a50d05825c4025b0c347e8689a241f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4b00a803faea0b96c9cbce6fbe23dfaec93bfbd4 Mon Sep 17 00:00:00 2001 From: Vinu Rajashekhar Date: Wed, 7 Aug 2019 10:13:19 -0700 Subject: [PATCH 3450/8103] Makes ServerCore::Log(...) mockable. PiperOrigin-RevId: 262160952 --- tensorflow_serving/model_servers/server_core.h | 5 +++-- .../model_servers/test_util/mock_server_core.h | 4 ++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/model_servers/server_core.h b/tensorflow_serving/model_servers/server_core.h index ac22b9f25d3..0a7630616ce 100644 --- a/tensorflow_serving/model_servers/server_core.h +++ b/tensorflow_serving/model_servers/server_core.h @@ -251,8 +251,9 @@ class ServerCore : public Manager { /// Writes the log for the particular request, response and metadata, if we /// decide to sample it and if request-logging was configured for the /// particular model. - Status Log(const google::protobuf::Message& request, const google::protobuf::Message& response, - const LogMetadata& log_metadata) { + virtual Status Log(const google::protobuf::Message& request, + const google::protobuf::Message& response, + const LogMetadata& log_metadata) { return options_.server_request_logger->Log(request, response, log_metadata); } diff --git a/tensorflow_serving/model_servers/test_util/mock_server_core.h b/tensorflow_serving/model_servers/test_util/mock_server_core.h index 26aa2ecba1d..4a220d2eca6 100644 --- a/tensorflow_serving/model_servers/test_util/mock_server_core.h +++ b/tensorflow_serving/model_servers/test_util/mock_server_core.h @@ -30,6 +30,7 @@ limitations under the License. #include "tensorflow_serving/config/model_server_config.pb.h" #include "tensorflow_serving/config/platform_config.pb.h" #include "tensorflow_serving/core/aspired_versions_manager.h" +#include "tensorflow_serving/core/logging.pb.h" #include "tensorflow_serving/core/servable_handle.h" #include "tensorflow_serving/core/servable_state.h" #include "tensorflow_serving/core/servable_state_monitor.h" @@ -80,6 +81,9 @@ class MockServerCore : public ServerCore { MOCK_CONST_METHOD0(servable_state_monitor, ServableStateMonitor*()); MOCK_METHOD1(ReloadConfig, Status(const ModelServerConfig&)); + MOCK_METHOD3(Log, Status(const google::protobuf::Message& request, + const google::protobuf::Message& response, + const LogMetadata& log_metadata)); template Status GetServableHandle(const ModelSpec& model_spec, From 0896ac52b8f11b1565a672d273ced20893d91e8f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 7 Aug 2019 12:02:52 -0700 Subject: [PATCH 3451/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/50a7d6c3-1a52-4eba-87cc-32f2d0fcc1da PiperOrigin-RevId: 262185889 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 387f527aaf9..fb5d1a37494 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8169fed5ee39eabd04e47d9c3eae6d6bfc5b3148214a01749908ff8abb56fc03", - git_commit = "b1608511d5a50d05825c4025b0c347e8689a241f", + sha256 = "ef44f76bab26f0ab4982fd1846af6ffd23f23638a18023ecbbe9039f9a729305", + git_commit = "a727bfa999910663db24e7c352e80993db7f325b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c79177f6963f3e3962edf89b1f6c6ac9bada674e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 7 Aug 2019 18:02:13 -0700 Subject: [PATCH 3452/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/adbdca60-36a7-4206-b618-ad5bfca9c2e1 PiperOrigin-RevId: 262255395 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fb5d1a37494..1e1b013e5d3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ef44f76bab26f0ab4982fd1846af6ffd23f23638a18023ecbbe9039f9a729305", - git_commit = "a727bfa999910663db24e7c352e80993db7f325b", + sha256 = "36bd6544a834285741c6de55d233588ac775226a88152959de43052d896f3807", + git_commit = "5a2f31e9a3f4e45ea5d81b879e745693c726cfea", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4507c507d7b9994234f71fbb15b83bc1a1c212b1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 8 Aug 2019 00:02:32 -0700 Subject: [PATCH 3453/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fced8946-5986-4b02-a503-153086f2d4e8 PiperOrigin-RevId: 262293471 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1e1b013e5d3..fa4ae9634f3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "36bd6544a834285741c6de55d233588ac775226a88152959de43052d896f3807", - git_commit = "5a2f31e9a3f4e45ea5d81b879e745693c726cfea", + sha256 = "0ff9b9bdacf73e08c91e70a0c305b38fba978936309b709ad2354dd39e95c6c7", + git_commit = "14c769393ed48882f055a945a86f8cd6f4b6564b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 08aab05208c1dc1e9a928e628237af89ead540d4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 8 Aug 2019 06:02:20 -0700 Subject: [PATCH 3454/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/62041c2d-0606-4e55-ba6f-16fb00d86c33 PiperOrigin-RevId: 262335971 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fa4ae9634f3..9d4fb104cbd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0ff9b9bdacf73e08c91e70a0c305b38fba978936309b709ad2354dd39e95c6c7", - git_commit = "14c769393ed48882f055a945a86f8cd6f4b6564b", + sha256 = "ef97a9002c47c9babeb6fd177da721cb9c840d82971a4a7b6aedd1c454b9e85b", + git_commit = "35b729c02a999d3e5a28bc72a6edd57c51e32b3b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 96dcdb6bb61450a396cfd49a2293dda0276b164a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 8 Aug 2019 12:02:36 -0700 Subject: [PATCH 3455/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8572a61b-85c1-48ed-979c-6ae891e6ddb5 PiperOrigin-RevId: 262404178 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9d4fb104cbd..d5fde80a18d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ef97a9002c47c9babeb6fd177da721cb9c840d82971a4a7b6aedd1c454b9e85b", - git_commit = "35b729c02a999d3e5a28bc72a6edd57c51e32b3b", + sha256 = "80c2ae5d42c48c3a120243c7a8901a621f4cde53b98344683156a861d9d5e8dd", + git_commit = "eb625fb51a302dc812c97879697642db9aa8cfc1", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b7b3c33422bb5cf0813fdd6604742e7fa3841f84 Mon Sep 17 00:00:00 2001 From: Haiming Bao Date: Thu, 8 Aug 2019 14:52:58 -0700 Subject: [PATCH 3456/8103] Uses VerifyFunctionInternal to replace VerifyResourceValidityInternal and VerifyValidityInternal. PiperOrigin-RevId: 262438721 --- tensorflow_serving/resources/resource_util.cc | 137 +++++++++--------- tensorflow_serving/resources/resource_util.h | 9 +- 2 files changed, 74 insertions(+), 72 deletions(-) diff --git a/tensorflow_serving/resources/resource_util.cc b/tensorflow_serving/resources/resource_util.cc index dbc9b7fc736..09dddbcc021 100644 --- a/tensorflow_serving/resources/resource_util.cc +++ b/tensorflow_serving/resources/resource_util.cc @@ -93,17 +93,59 @@ ResourceUtil::ResourceUtil(const Options& options) Status ResourceUtil::VerifyValidity( const ResourceAllocation& allocation) const { - return VerifyValidityInternal(allocation, DCHECKFailOption::kDoNotDCHECKFail); + const Status result = [this, &allocation]() -> Status { + // We use 'validated_entries' to look for duplicates. + ResourceAllocation validated_entries; + for (const auto& entry : allocation.resource_quantities()) { + TF_RETURN_IF_ERROR(VerifyFunctionInternal( + [&]() { return VerifyResourceValidity(entry.resource()); }, + DCHECKFailOption::kDoNotDCHECKFail)); + + if (FindMutableEntry(entry.resource(), &validated_entries) != nullptr) { + return errors::InvalidArgument( + "Invalid resource allocation: Repeated resource\n", + entry.resource().DebugString(), "in allocation\n", + allocation.DebugString()); + } + + *validated_entries.add_resource_quantities() = entry; + } + return Status::OK(); + }(); + if (!result.ok()) { + LOG(ERROR) << result; + } + + return result; } Status ResourceUtil::VerifyResourceValidity(const Resource& resource) const { - return VerifyResourceValidityInternal(resource, - DCHECKFailOption::kDoNotDCHECKFail); + const Status result = [this, &resource]() -> Status { + auto it = devices_.find(resource.device()); + if (it == devices_.end()) { + return errors::InvalidArgument( + "Invalid resource allocation: Invalid device ", resource.device()); + } + const uint32 num_instances = it->second; + if (resource.has_device_instance() && + resource.device_instance().value() >= num_instances) { + return errors::InvalidArgument( + "Invalid resource allocation: Invalid device instance ", + resource.device(), ":", resource.device_instance().value()); + } + return Status::OK(); + }(); + if (!result.ok()) { + LOG(ERROR) << result; + } + + return result; } ResourceAllocation ResourceUtil::Normalize( const ResourceAllocation& allocation) const { - if (!VerifyValidityInternal(allocation, DCHECKFailOption::kDoDCHECKFail) + if (!VerifyFunctionInternal([&]() { return VerifyValidity(allocation); }, + DCHECKFailOption::kDoDCHECKFail) .ok()) { return allocation; } @@ -124,7 +166,8 @@ ResourceAllocation ResourceUtil::Normalize( } bool ResourceUtil::IsNormalized(const ResourceAllocation& allocation) const { - if (!VerifyValidityInternal(allocation, DCHECKFailOption::kDoDCHECKFail) + if (!VerifyFunctionInternal([&]() { return VerifyValidity(allocation); }, + DCHECKFailOption::kDoDCHECKFail) .ok()) { return false; } @@ -242,62 +285,13 @@ bool ResourceUtil::IsBoundNormalized( return true; } -Status ResourceUtil::VerifyValidityInternal( - const ResourceAllocation& allocation, - DCHECKFailOption dcheck_fail_option) const { - const Status result = [this, &allocation]() -> Status { - // We use 'validated_entries' to look for duplicates. - ResourceAllocation validated_entries; - for (const auto& entry : allocation.resource_quantities()) { - TF_RETURN_IF_ERROR(VerifyResourceValidityInternal( - entry.resource(), DCHECKFailOption::kDoNotDCHECKFail)); - - if (FindMutableEntry(entry.resource(), &validated_entries) != nullptr) { - return errors::InvalidArgument( - "Invalid resource allocation: Repeated resource\n", - entry.resource().DebugString(), "in allocation\n", - allocation.DebugString()); - } - - *validated_entries.add_resource_quantities() = entry; - } - return Status::OK(); - }(); - - if (dcheck_fail_option == DCHECKFailOption::kDoDCHECKFail) { - TF_DCHECK_OK(result); - } - if (!result.ok()) { - LOG(ERROR) << result; - } - - return result; -} - -Status ResourceUtil::VerifyResourceValidityInternal( - const Resource& resource, DCHECKFailOption dcheck_fail_option) const { - const Status result = [this, &resource]() -> Status { - auto it = devices_.find(resource.device()); - if (it == devices_.end()) { - return errors::InvalidArgument( - "Invalid resource allocation: Invalid device ", resource.device()); - } - const uint32 num_instances = it->second; - if (resource.has_device_instance() && - resource.device_instance().value() >= num_instances) { - return errors::InvalidArgument( - "Invalid resource allocation: Invalid device instance ", - resource.device(), ":", resource.device_instance().value()); - } - return Status::OK(); - }(); +Status ResourceUtil::VerifyFunctionInternal( + std::function fn, DCHECKFailOption dcheck_fail_option) const { + const Status result = fn(); if (dcheck_fail_option == DCHECKFailOption::kDoDCHECKFail) { TF_DCHECK_OK(result); } - if (!result.ok()) { - LOG(ERROR) << result; - } return result; } @@ -314,7 +308,9 @@ Resource ResourceUtil::NormalizeResource(const Resource& resource) const { } bool ResourceUtil::IsResourceNormalized(const Resource& resource) const { - if (!VerifyResourceValidityInternal(resource, DCHECKFailOption::kDoDCHECKFail) + if (!VerifyFunctionInternal( + [&]() { return VerifyResourceValidity(resource); }, + DCHECKFailOption::kDoDCHECKFail) .ok()) { return false; } @@ -377,8 +373,12 @@ void ResourceUtil::MultiplyNormalized(uint64 multiplier, bool ResourceUtil::EqualNormalized(const ResourceAllocation& lhs, const ResourceAllocation& rhs) const { - if (!VerifyValidityInternal(lhs, DCHECKFailOption::kDoDCHECKFail).ok() || - !VerifyValidityInternal(rhs, DCHECKFailOption::kDoDCHECKFail).ok()) { + if (!VerifyFunctionInternal([&]() { return VerifyValidity(lhs); }, + DCHECKFailOption::kDoDCHECKFail) + .ok() || + !VerifyFunctionInternal([&]() { return VerifyValidity(rhs); }, + DCHECKFailOption::kDoDCHECKFail) + .ok()) { return false; } DCHECK(IsNormalized(lhs)); @@ -408,9 +408,11 @@ bool ResourceUtil::EqualNormalized(const ResourceAllocation& lhs, bool ResourceUtil::ResourcesEqualNormalized(const Resource& lhs, const Resource& rhs) const { - if (!VerifyResourceValidityInternal(lhs, DCHECKFailOption::kDoDCHECKFail) + if (!VerifyFunctionInternal([&]() { return VerifyResourceValidity(lhs); }, + DCHECKFailOption::kDoDCHECKFail) .ok() || - !VerifyResourceValidityInternal(rhs, DCHECKFailOption::kDoDCHECKFail) + !VerifyFunctionInternal([&]() { return VerifyResourceValidity(rhs); }, + DCHECKFailOption::kDoDCHECKFail) .ok()) { return false; } @@ -421,8 +423,12 @@ bool ResourceUtil::ResourcesEqualNormalized(const Resource& lhs, bool ResourceUtil::LessThanOrEqualNormalized( const ResourceAllocation& lhs, const ResourceAllocation& rhs) const { - if (!VerifyValidityInternal(lhs, DCHECKFailOption::kDoDCHECKFail).ok() || - !VerifyValidityInternal(rhs, DCHECKFailOption::kDoDCHECKFail).ok()) { + if (!VerifyFunctionInternal([&]() { return VerifyValidity(lhs); }, + DCHECKFailOption::kDoDCHECKFail) + .ok() || + !VerifyFunctionInternal([&]() { return VerifyValidity(rhs); }, + DCHECKFailOption::kDoDCHECKFail) + .ok()) { return false; } DCHECK(IsNormalized(lhs)); @@ -468,7 +474,8 @@ bool ResourceUtil::LessThanOrEqualNormalized( ResourceAllocation ResourceUtil::OverbindNormalized( const ResourceAllocation& allocation) const { - if (!VerifyValidityInternal(allocation, DCHECKFailOption::kDoDCHECKFail) + if (!VerifyFunctionInternal([&]() { return VerifyValidity(allocation); }, + DCHECKFailOption::kDoDCHECKFail) .ok()) { return allocation; } diff --git a/tensorflow_serving/resources/resource_util.h b/tensorflow_serving/resources/resource_util.h index 515881209f2..ef59ecec6ec 100644 --- a/tensorflow_serving/resources/resource_util.h +++ b/tensorflow_serving/resources/resource_util.h @@ -167,15 +167,10 @@ class ResourceUtil { private: enum class DCHECKFailOption { kDoDCHECKFail, kDoNotDCHECKFail }; - // Wraps VerifyValidity() with error logging and the option to DCHECK-fail. - Status VerifyValidityInternal(const ResourceAllocation& allocation, + // Wraps fn() with the option to DCHECK-fail. + Status VerifyFunctionInternal(std::function fn, DCHECKFailOption dcheck_fail_option) const; - // Wraps VerifyResourceValidity() with error logging and the option to - // DCHECK-fail. - Status VerifyResourceValidityInternal( - const Resource& resource, DCHECKFailOption dcheck_fail_option) const; - // Converts 'resource' to normal form, i.e. ensures that if the device has // exactly one instance, the resource is bound to that instance. Resource NormalizeResource(const Resource& resource) const; From 1a172f18fc593223924d5dc52d1150bd8864869c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 8 Aug 2019 18:02:11 -0700 Subject: [PATCH 3457/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8819f93a-e039-4bdf-8454-3dcfa9363fc8 PiperOrigin-RevId: 262471932 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d5fde80a18d..878c1baef3c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "80c2ae5d42c48c3a120243c7a8901a621f4cde53b98344683156a861d9d5e8dd", - git_commit = "eb625fb51a302dc812c97879697642db9aa8cfc1", + sha256 = "6ba24091b82194e7d4b5aae7e5218e4ef28ef922e52f8788a3801d42c9b62ae0", + git_commit = "4411b77626488f543dc10e0fd41d35af25fef6ae", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0d5573b70af3d3625f6a8827851cdb0947b00f67 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 9 Aug 2019 00:02:18 -0700 Subject: [PATCH 3458/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/503351f7-0b54-4146-a109-a6c85cc5ce6c PiperOrigin-RevId: 262507515 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 878c1baef3c..13c19d8e3f3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6ba24091b82194e7d4b5aae7e5218e4ef28ef922e52f8788a3801d42c9b62ae0", - git_commit = "4411b77626488f543dc10e0fd41d35af25fef6ae", + sha256 = "b4203ed72a321915e405cf55f4679c6997afe71036bd91dbde090c332fc3fd86", + git_commit = "439bf24ed7f6d04a267c307f3aaaab1ce523aab7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4e12a193ad27fa31cb1e42e9a7fe7b5c08f74c52 Mon Sep 17 00:00:00 2001 From: Wenbo Zhu Date: Fri, 9 Aug 2019 00:04:47 -0700 Subject: [PATCH 3459/8103] Removed the net_http dependency on absl/base/internal/raw_logging. PiperOrigin-RevId: 262508074 --- tensorflow_serving/util/net_http/client/BUILD | 1 + .../util/net_http/client/evhttp_connection.cc | 28 +-- .../util/net_http/compression/BUILD | 1 + .../util/net_http/compression/gzip_zlib.cc | 15 +- .../util/net_http/internal/BUILD | 11 ++ .../util/net_http/internal/net_logging.cc | 172 ++++++++++++++++++ .../util/net_http/internal/net_logging.h | 75 ++++++++ .../util/net_http/internal/testing/BUILD | 15 ++ .../internal/testing/net_logging_example.cc | 33 ++++ .../util/net_http/server/internal/BUILD | 1 + .../server/internal/evhttp_request.cc | 37 ++-- .../net_http/server/internal/evhttp_server.cc | 68 ++++--- .../util/net_http/server/public/httpserver.h | 2 - 13 files changed, 380 insertions(+), 79 deletions(-) create mode 100644 tensorflow_serving/util/net_http/internal/net_logging.cc create mode 100644 tensorflow_serving/util/net_http/internal/net_logging.h create mode 100644 tensorflow_serving/util/net_http/internal/testing/BUILD create mode 100644 tensorflow_serving/util/net_http/internal/testing/net_logging_example.cc diff --git a/tensorflow_serving/util/net_http/client/BUILD b/tensorflow_serving/util/net_http/client/BUILD index aef1f876ac4..d608554a736 100644 --- a/tensorflow_serving/util/net_http/client/BUILD +++ b/tensorflow_serving/util/net_http/client/BUILD @@ -17,6 +17,7 @@ cc_library( "evhttp_connection.h", ], deps = [ + "//tensorflow_serving/util/net_http/internal:net_logging", "//tensorflow_serving/util/net_http/server/public:http_server_api", "@com_github_libevent_libevent//:libevent", "@com_google_absl//absl/base", diff --git a/tensorflow_serving/util/net_http/client/evhttp_connection.cc b/tensorflow_serving/util/net_http/client/evhttp_connection.cc index 3428964967c..3b5b2a8f3eb 100644 --- a/tensorflow_serving/util/net_http/client/evhttp_connection.cc +++ b/tensorflow_serving/util/net_http/client/evhttp_connection.cc @@ -17,8 +17,8 @@ limitations under the License. #include "tensorflow_serving/util/net_http/client/evhttp_connection.h" -#include "absl/base/internal/raw_logging.h" #include "absl/strings/str_cat.h" +#include "tensorflow_serving/util/net_http/internal/net_logging.h" namespace tensorflow { namespace serving { @@ -48,14 +48,14 @@ std::unique_ptr EvHTTPConnection::Connect( std::string url_str(url.data(), url.size()); struct evhttp_uri* http_uri = evhttp_uri_parse(url_str.c_str()); if (http_uri == nullptr) { - ABSL_RAW_LOG(ERROR, "Failed to connect : event_base_new()"); + NET_LOG(ERROR, "Failed to connect : event_base_new()"); return nullptr; } const char* host = evhttp_uri_get_host(http_uri); if (host == nullptr) { - ABSL_RAW_LOG(ERROR, "url must have a host %.*s", - static_cast(url.size()), url.data()); + NET_LOG(ERROR, "url must have a host %.*s", static_cast(url.size()), + url.data()); return nullptr; } @@ -76,7 +76,7 @@ std::unique_ptr EvHTTPConnection::Connect( result->ev_base_ = event_base_new(); if (result->ev_base_ == nullptr) { - ABSL_RAW_LOG(ERROR, "Failed to connect : event_base_new()"); + NET_LOG(ERROR, "Failed to connect : event_base_new()"); return nullptr; } @@ -86,8 +86,8 @@ std::unique_ptr EvHTTPConnection::Connect( result->ev_base_, nullptr, nullptr, host_str.c_str(), static_cast(port)); if (result->evcon_ == nullptr) { - ABSL_RAW_LOG( - ERROR, "Failed to connect : evhttp_connection_base_bufferevent_new()"); + NET_LOG(ERROR, + "Failed to connect : evhttp_connection_base_bufferevent_new()"); return nullptr; } @@ -155,8 +155,8 @@ void ResponseDone(evhttp_request* req, void* ctx) { if (req == nullptr) { // TODO(wenboz): make this a util and check safety int errcode = EVUTIL_SOCKET_ERROR(); - ABSL_RAW_LOG(ERROR, "socket error = %s (%d)", - evutil_socket_error_to_string(errcode), errcode); + NET_LOG(ERROR, "socket error = %s (%d)", + evutil_socket_error_to_string(errcode), errcode); return; } @@ -172,7 +172,7 @@ bool GenerateEvRequest(evhttp_connection* evcon, const ClientRequest& request, ClientResponse* response) { evhttp_request* evreq = evhttp_request_new(ResponseDone, response); if (evreq == nullptr) { - ABSL_RAW_LOG(ERROR, "Failed to send request : evhttp_request_new()"); + NET_LOG(ERROR, "Failed to send request : evhttp_request_new()"); return false; } @@ -202,7 +202,7 @@ bool GenerateEvRequest(evhttp_connection* evcon, const ClientRequest& request, evcon, evreq, GetMethodEnum(request.method, !request.body.empty()), uri.c_str()); if (r != 0) { - ABSL_RAW_LOG(ERROR, "evhttp_make_request() failed"); + NET_LOG(ERROR, "evhttp_make_request() failed"); return false; } @@ -215,7 +215,7 @@ bool GenerateEvRequest(evhttp_connection* evcon, const ClientRequest& request, bool EvHTTPConnection::BlockingSendRequest(const ClientRequest& request, ClientResponse* response) { if (!GenerateEvRequest(evcon_, request, response)) { - ABSL_RAW_LOG(ERROR, "Failed to generate the ev_request"); + NET_LOG(ERROR, "Failed to generate the ev_request"); return false; } @@ -227,12 +227,12 @@ bool EvHTTPConnection::BlockingSendRequest(const ClientRequest& request, bool EvHTTPConnection::SendRequest(const ClientRequest& request, ClientResponse* response) { if (this->executor_ == nullptr) { - ABSL_RAW_LOG(ERROR, "EventExecutor is not configured."); + NET_LOG(ERROR, "EventExecutor is not configured."); return false; } if (!GenerateEvRequest(evcon_, request, response)) { - ABSL_RAW_LOG(ERROR, "Failed to generate the ev_request"); + NET_LOG(ERROR, "Failed to generate the ev_request"); return false; } diff --git a/tensorflow_serving/util/net_http/compression/BUILD b/tensorflow_serving/util/net_http/compression/BUILD index ef098d140e8..323bd414242 100644 --- a/tensorflow_serving/util/net_http/compression/BUILD +++ b/tensorflow_serving/util/net_http/compression/BUILD @@ -19,6 +19,7 @@ cc_library( "gzip_zlib.h", ], deps = [ + "//tensorflow_serving/util/net_http/internal:net_logging", "@com_google_absl//absl/base", "@com_google_absl//absl/base:core_headers", "@com_google_absl//absl/strings", diff --git a/tensorflow_serving/util/net_http/compression/gzip_zlib.cc b/tensorflow_serving/util/net_http/compression/gzip_zlib.cc index af22df34898..0ca314bf26e 100644 --- a/tensorflow_serving/util/net_http/compression/gzip_zlib.cc +++ b/tensorflow_serving/util/net_http/compression/gzip_zlib.cc @@ -18,15 +18,13 @@ limitations under the License. #include "tensorflow_serving/util/net_http/compression/gzip_zlib.h" #include - #include #include - #include #include "absl/base/casts.h" -#include "absl/base/internal/raw_logging.h" #include "absl/base/macros.h" +#include "tensorflow_serving/util/net_http/internal/net_logging.h" namespace tensorflow { namespace serving { @@ -581,8 +579,7 @@ int ZLib::UncompressAtMostOrAll(Bytef *dest, uLongf *destLen, crc_ = crc32(0, nullptr, 0); // initialize CRC break; default: - ABSL_RAW_LOG(FATAL, "Unexpected gzip header parsing result: %d", - status); + NET_LOG(FATAL, "Unexpected gzip header parsing result: %d", status); } } else if (gzip_footer_bytes_ >= 0) { // We're now just reading the gzip footer. We already read all the data. @@ -602,10 +599,10 @@ int ZLib::UncompressAtMostOrAll(Bytef *dest, uLongf *destLen, } if ((err = UncompressInit(dest, destLen, source, sourceLen)) != Z_OK) { - ABSL_RAW_LOG(WARNING, - "UncompressInit: Error: %d " - " SourceLen: %zu", - err, *sourceLen); + NET_LOG(WARNING, + "UncompressInit: Error: %d " + " SourceLen: %zu", + err, *sourceLen); return err; } diff --git a/tensorflow_serving/util/net_http/internal/BUILD b/tensorflow_serving/util/net_http/internal/BUILD index b3fc8fd9785..866eaa9aaf3 100644 --- a/tensorflow_serving/util/net_http/internal/BUILD +++ b/tensorflow_serving/util/net_http/internal/BUILD @@ -17,3 +17,14 @@ cc_library( "@com_google_absl//absl/synchronization", ], ) + +cc_library( + name = "net_logging", + srcs = ["net_logging.cc"], + hdrs = ["net_logging.h"], + deps = [ + "@com_google_absl//absl/base:config", + "@com_google_absl//absl/base:core_headers", + "@com_google_absl//absl/base:log_severity", + ], +) diff --git a/tensorflow_serving/util/net_http/internal/net_logging.cc b/tensorflow_serving/util/net_http/internal/net_logging.cc new file mode 100644 index 00000000000..a77a368896d --- /dev/null +++ b/tensorflow_serving/util/net_http/internal/net_logging.cc @@ -0,0 +1,172 @@ +/* Copyright 2018 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow_serving/util/net_http/internal/net_logging.h" + +#include + +#include +#include +#include +#include + +#include "absl/base/attributes.h" +#include "absl/base/config.h" +#include "absl/base/log_severity.h" + +#if defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || \ + defined(__Fuchsia__) || defined(__native_client__) || \ + defined(__EMSCRIPTEN__) +#include + +#define NET_HAVE_POSIX_WRITE 1 +#define NET_LOW_LEVEL_WRITE_SUPPORTED 1 +#else +#undef NET_HAVE_POSIX_WRITE +#endif + +#if (defined(__linux__) || defined(__FreeBSD__)) && !defined(__ANDROID__) +#include +#define NET_HAVE_SYSCALL_WRITE 1 +#define NET_LOW_LEVEL_WRITE_SUPPORTED 1 +#else +#undef NET_HAVE_SYSCALL_WRITE +#endif + +#ifdef _WIN32 +#include + +#define NET_HAVE_RAW_IO 1 +#define NET_LOW_LEVEL_WRITE_SUPPORTED 1 +#else +#undef NET_HAVE_RAW_IO +#endif + +#ifdef NET_LOW_LEVEL_WRITE_SUPPORTED +static const char kTruncated[] = " ... (message truncated)\n"; + +inline static bool VADoNetLog(char** buf, int* size, const char* format, + va_list ap) ABSL_PRINTF_ATTRIBUTE(3, 0); +inline static bool VADoNetLog(char** buf, int* size, const char* format, + va_list ap) { + int n = vsnprintf(*buf, *size, format, ap); + bool result = true; + if (n < 0 || n > *size) { + result = false; + if (static_cast(*size) > sizeof(kTruncated)) { + n = *size - sizeof(kTruncated); // room for truncation message + } else { + n = 0; // no room for truncation message + } + } + *size -= n; + *buf += n; + return result; +} +#endif // NET_LOW_LEVEL_WRITE_SUPPORTED + +static constexpr int kLogBufSize = 10000; // absl defaults to 3000 + +namespace { + +bool DoNetLog(char** buf, int* size, const char* format, ...) + ABSL_PRINTF_ATTRIBUTE(3, 4); +bool DoNetLog(char** buf, int* size, const char* format, ...) { + va_list ap; + va_start(ap, format); + int n = vsnprintf(*buf, *size, format, ap); + va_end(ap); + if (n < 0 || n > *size) return false; + *size -= n; + *buf += n; + return true; +} + +void NetLogVA(absl::LogSeverity severity, const char* file, int line, + const char* format, va_list ap) ABSL_PRINTF_ATTRIBUTE(4, 0); +void NetLogVA(absl::LogSeverity severity, const char* file, int line, + const char* format, va_list ap) { + char buffer[kLogBufSize]; + char* buf = buffer; + int size = sizeof(buffer); +#ifdef NET_LOW_LEVEL_WRITE_SUPPORTED + bool enabled = true; +#else + bool enabled = false; +#endif + +#ifdef ABSL_MIN_LOG_LEVEL + if (severity < static_cast(ABSL_MIN_LOG_LEVEL) && + severity < absl::LogSeverity::kFatal) { + enabled = false; + } +#endif + + if (enabled) { + DoNetLog(&buf, &size, "[%s : %d] NET_LOG: ", file, line); + } + +#ifdef NET_LOW_LEVEL_WRITE_SUPPORTED + if (enabled) { + bool no_chop = VADoNetLog(&buf, &size, format, ap); + if (no_chop) { + DoNetLog(&buf, &size, "\n"); + } else { + DoNetLog(&buf, &size, "%s", kTruncated); + } + tensorflow::serving::net_http::SafeWriteToStderr(buffer, strlen(buffer)); + } +#else + static_cast(format); + static_cast(ap); +#endif + + if (severity == absl::LogSeverity::kFatal) { + abort(); + } +} + +} // namespace + +namespace tensorflow { +namespace serving { +namespace net_http { + +void SafeWriteToStderr(const char* s, size_t len) { +#if defined(NET_HAVE_SYSCALL_WRITE) + syscall(SYS_write, STDERR_FILENO, s, len); +#elif defined(NET_HAVE_POSIX_WRITE) + write(STDERR_FILENO, s, len); +#elif defined(NET_HAVE_RAW_IO) + _write(/* stderr */ 2, s, len); +#else + (void)s; + (void)len; +#endif +} + +void NetLog(absl::LogSeverity severity, const char* file, int line, + const char* format, ...) ABSL_PRINTF_ATTRIBUTE(4, 5); +void NetLog(absl::LogSeverity severity, const char* file, int line, + const char* format, ...) { + va_list ap; + va_start(ap, format); + NetLogVA(severity, file, line, format, ap); + va_end(ap); +} + +} // namespace net_http +} // namespace serving +} // namespace tensorflow diff --git a/tensorflow_serving/util/net_http/internal/net_logging.h b/tensorflow_serving/util/net_http/internal/net_logging.h new file mode 100644 index 00000000000..0acdf3c2b6b --- /dev/null +++ b/tensorflow_serving/util/net_http/internal/net_logging.h @@ -0,0 +1,75 @@ +/* Copyright 2019 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_SERVING_UTIL_NET_HTTP_INTERNAL_NET_LOGGING_H_ +#define TENSORFLOW_SERVING_UTIL_NET_HTTP_INTERNAL_NET_LOGGING_H_ + +#include + +#include "absl/base/attributes.h" +#include "absl/base/log_severity.h" +#include "absl/base/macros.h" +#include "absl/base/port.h" + +// This initial version is a minimum fork from absl/base/internal/raw_logging.h +// Hooks are not supported. +// +// TODO(wenboz): finalize the log support for net_http +// * make logging pluggable (by TF serving or by adapting external libraries + +#define NET_LOG(severity, ...) \ + do { \ + constexpr const char* net_logging_internal_basename = \ + ::tensorflow::serving::net_http::Basename(__FILE__, \ + sizeof(__FILE__) - 1); \ + ::tensorflow::serving::net_http::NetLog(NET_LOGGING_INTERNAL_##severity, \ + net_logging_internal_basename, \ + __LINE__, __VA_ARGS__); \ + } while (0) + +#define NET_CHECK(condition, message) \ + do { \ + if (ABSL_PREDICT_FALSE(!(condition))) { \ + NET_LOG(FATAL, "Check %s failed: %s", #condition, message); \ + } \ + } while (0) + +#define NET_LOGGING_INTERNAL_INFO ::absl::LogSeverity::kInfo +#define NET_LOGGING_INTERNAL_WARNING ::absl::LogSeverity::kWarning +#define NET_LOGGING_INTERNAL_ERROR ::absl::LogSeverity::kError +#define NET_LOGGING_INTERNAL_FATAL ::absl::LogSeverity::kFatal +#define NET_LOGGING_INTERNAL_LEVEL(severity) \ + ::absl::NormalizeLogSeverity(severity) + +namespace tensorflow { +namespace serving { +namespace net_http { + +void NetLog(absl::LogSeverity severity, const char* file, int line, + const char* format, ...) ABSL_PRINTF_ATTRIBUTE(4, 5); + +void SafeWriteToStderr(const char* s, size_t len); + +constexpr const char* Basename(const char* fname, int offset) { + return offset == 0 || fname[offset - 1] == '/' || fname[offset - 1] == '\\' + ? fname + offset + : Basename(fname, offset - 1); +} + +} // namespace net_http +} // namespace serving +} // namespace tensorflow + +#endif // TENSORFLOW_SERVING_UTIL_NET_HTTP_INTERNAL_NET_LOGGING_H_ diff --git a/tensorflow_serving/util/net_http/internal/testing/BUILD b/tensorflow_serving/util/net_http/internal/testing/BUILD new file mode 100644 index 00000000000..d2a710bbaf2 --- /dev/null +++ b/tensorflow_serving/util/net_http/internal/testing/BUILD @@ -0,0 +1,15 @@ +# Description: net_http/internal/testing + +package( + default_visibility = ["//visibility:private"], +) + +licenses(["notice"]) # Apache 2.0 + +cc_binary( + name = "net_logging_example", + srcs = ["net_logging_example.cc"], + deps = [ + "//tensorflow_serving/util/net_http/internal:net_logging", + ], +) diff --git a/tensorflow_serving/util/net_http/internal/testing/net_logging_example.cc b/tensorflow_serving/util/net_http/internal/testing/net_logging_example.cc new file mode 100644 index 00000000000..d47560d3c55 --- /dev/null +++ b/tensorflow_serving/util/net_http/internal/testing/net_logging_example.cc @@ -0,0 +1,33 @@ +/* Copyright 2019 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include +#include + +#include "tensorflow_serving/util/net_http/internal/net_logging.h" + +int main(int argc, char** argv) { + NET_LOG(INFO, "started!"); + + size_t size = 100; + NET_LOG(ERROR, "read less than specified bytes : %zu", size); + + const char* url = "/url"; + NET_LOG(WARNING, "%s: read less than specified bytes : %zu", url, size); + + NET_LOG(FATAL, "aborted!"); + + return 0; // unexpected +} diff --git a/tensorflow_serving/util/net_http/server/internal/BUILD b/tensorflow_serving/util/net_http/server/internal/BUILD index 76914783b3c..05020aa0f58 100644 --- a/tensorflow_serving/util/net_http/server/internal/BUILD +++ b/tensorflow_serving/util/net_http/server/internal/BUILD @@ -21,6 +21,7 @@ cc_library( ], deps = [ "//tensorflow_serving/util/net_http/compression:gzip_zlib", + "//tensorflow_serving/util/net_http/internal:net_logging", "//tensorflow_serving/util/net_http/server/public:http_server_api", "@com_github_libevent_libevent//:libevent", "@com_google_absl//absl/base", diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_request.cc b/tensorflow_serving/util/net_http/server/internal/evhttp_request.cc index 88023194e65..e0dba5a44ad 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_request.cc +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_request.cc @@ -26,7 +26,6 @@ limitations under the License. #include #include -#include "absl/base/internal/raw_logging.h" #include "absl/strings/string_view.h" #include "absl/types/span.h" #include "libevent/include/event2/buffer.h" @@ -34,6 +33,7 @@ limitations under the License. #include "libevent/include/event2/http.h" #include "libevent/include/event2/keyvalq_struct.h" #include "tensorflow_serving/util/net_http/compression/gzip_zlib.h" +#include "tensorflow_serving/util/net_http/internal/net_logging.h" #include "tensorflow_serving/util/net_http/server/public/header_names.h" namespace tensorflow { @@ -145,14 +145,14 @@ bool EvHTTPRequest::Initialize() { void EvHTTPRequest::WriteResponseBytes(const char* data, int64_t size) { assert(size >= 0); if (output_buf == nullptr) { - ABSL_RAW_LOG(FATAL, "Request not initialized."); + NET_LOG(FATAL, "Request not initialized."); return; } int ret = evbuffer_add(output_buf, data, static_cast(size)); if (ret == -1) { - ABSL_RAW_LOG(ERROR, "Failed to write %zu bytes data to output buffer", - static_cast(size)); + NET_LOG(ERROR, "Failed to write %zu bytes data to output buffer", + static_cast(size)); } } @@ -189,8 +189,8 @@ std::unique_ptr EvHTTPRequest::ReadRequestBytes( int ret = evbuffer_remove(input_buf, block, *buf_size); if (ret != *buf_size) { - ABSL_RAW_LOG(ERROR, "Unexpected: read less than specified num_bytes : %zu", - *buf_size); + NET_LOG(ERROR, "Unexpected: read less than specified num_bytes : %zu", + *buf_size); std::allocator().deallocate(block, *buf_size); *buf_size = 0; return nullptr; // don't return corrupted buffer @@ -214,9 +214,8 @@ std::unique_ptr EvHTTPRequest::ReadRequestGzipBytes( char* block = std::allocator().allocate(buf_size); int ret = evbuffer_remove(input_buf, block, buf_size); if (ret != buf_size) { - ABSL_RAW_LOG(ERROR, - "Unexpected: read less than specified num_bytes : %zu", - buf_size); + NET_LOG(ERROR, "Unexpected: read less than specified num_bytes : %zu", + buf_size); std::allocator().deallocate(block, buf_size); for (auto buf : buf_list) { std::allocator().deallocate(buf.data(), buf.size()); @@ -249,7 +248,7 @@ std::unique_ptr EvHTTPRequest::ReadRequestGzipBytes( return std::unique_ptr(uncomp_body, BlockDeleter(*uncomp_size)); } else { - ABSL_RAW_LOG(ERROR, "Failed to uncompress the gzipped body"); + NET_LOG(ERROR, "Failed to uncompress the gzipped body"); *uncomp_size = 0; return nullptr; } @@ -283,7 +282,7 @@ void EvHTTPRequest::UncompressGzipBody(void* input, size_t input_size, reinterpret_cast(uncompressed_input_size), static_cast(input), static_cast(input_size)); if (err != Z_OK) { - ABSL_RAW_LOG(ERROR, "Got zlib error: %d", err); + NET_LOG(ERROR, "Got zlib error: %d", err); } } @@ -331,20 +330,20 @@ void EvHTTPRequest::AppendResponseHeader(absl::string_view header, std::string(value.data(), value.size()).c_str()); if (ret != 0) { - ABSL_RAW_LOG(ERROR, - "Unexpected: failed to set the request header" - " %.*s: %.*s", - static_cast(header.size()), header.data(), - static_cast(value.size()), value.data()); + NET_LOG(ERROR, + "Unexpected: failed to set the request header" + " %.*s: %.*s", + static_cast(header.size()), header.data(), + static_cast(value.size()), value.data()); } } void EvHTTPRequest::PartialReplyWithStatus(HTTPStatusCode status) { - ABSL_RAW_LOG(FATAL, "PartialReplyWithStatus not implemented."); + NET_LOG(FATAL, "PartialReplyWithStatus not implemented."); } void EvHTTPRequest::PartialReply() { - ABSL_RAW_LOG(FATAL, "PartialReplyWithStatus not implemented."); + NET_LOG(FATAL, "PartialReplyWithStatus not implemented."); } void EvHTTPRequest::ReplyWithStatus(HTTPStatusCode status) { @@ -352,7 +351,7 @@ void EvHTTPRequest::ReplyWithStatus(HTTPStatusCode status) { server_->EventLoopSchedule([this, status]() { EvSendReply(status); }); if (!result) { - ABSL_RAW_LOG(ERROR, "Failed to EventLoopSchedule ReplyWithStatus()"); + NET_LOG(ERROR, "Failed to EventLoopSchedule ReplyWithStatus()"); Abort(); // TODO(wenboz): should have a forced abort that doesn't write back anything // to the event-loop diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc b/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc index e7ee14bc505..e721bfc91e6 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc @@ -18,20 +18,20 @@ limitations under the License. #include "tensorflow_serving/util/net_http/server/internal/evhttp_server.h" #include -#include #include +#include + #include #include #include #include "absl/base/call_once.h" -#include "absl/base/internal/raw_logging.h" #include "absl/memory/memory.h" - #include "libevent/include/event2/event.h" #include "libevent/include/event2/http.h" #include "libevent/include/event2/thread.h" #include "libevent/include/event2/util.h" +#include "tensorflow_serving/util/net_http/internal/net_logging.h" namespace tensorflow { namespace serving { @@ -43,7 +43,7 @@ absl::once_flag libevent_init_once; void InitLibEvent() { if (evthread_use_pthreads() != 0) { - ABSL_RAW_LOG(FATAL, "Server requires pthread support."); + NET_LOG(FATAL, "Server requires pthread support."); } // Ignore SIGPIPE and allow errors to propagate through error codes. signal(SIGPIPE, SIG_IGN); @@ -60,8 +60,7 @@ EvHTTPServer::EvHTTPServer(std::unique_ptr options) // May crash the server if called before WaitForTermination() returns EvHTTPServer::~EvHTTPServer() { if (!is_terminating()) { - ABSL_RAW_LOG(ERROR, - "Serer has not been terminated. Force termination now."); + NET_LOG(ERROR, "Serer has not been terminated. Force termination now."); Terminate(); } @@ -79,12 +78,12 @@ EvHTTPServer::~EvHTTPServer() { // TODO(wenboz): support multiple ports bool EvHTTPServer::Initialize() { if (server_options_->executor() == nullptr) { - ABSL_RAW_LOG(FATAL, "Default EventExecutor is not configured."); + NET_LOG(FATAL, "Default EventExecutor is not configured."); return false; } if (server_options_->ports().empty()) { - ABSL_RAW_LOG(FATAL, "Server port is not specified."); + NET_LOG(FATAL, "Server port is not specified."); return false; } @@ -93,7 +92,7 @@ bool EvHTTPServer::Initialize() { // This ev_base_ created per-server v.s. global ev_base_ = event_base_new(); if (ev_base_ == nullptr) { - ABSL_RAW_LOG(FATAL, "Failed to create an event_base."); + NET_LOG(FATAL, "Failed to create an event_base."); return false; } @@ -102,7 +101,7 @@ bool EvHTTPServer::Initialize() { ev_http_ = evhttp_new(ev_base_); if (ev_http_ == nullptr) { - ABSL_RAW_LOG(FATAL, "Failed to create evhttp."); + NET_LOG(FATAL, "Failed to create evhttp."); return false; } @@ -191,7 +190,7 @@ void ResolveEphemeralPort(evhttp_bound_socket* listener, int* port) { evutil_socket_t fd = evhttp_bound_socket_get_fd(listener); if (getsockname(fd, reinterpret_cast(&ss), &socklen)) { - ABSL_RAW_LOG(ERROR, "getsockname() failed"); + NET_LOG(ERROR, "getsockname() failed"); return; } @@ -200,7 +199,7 @@ void ResolveEphemeralPort(evhttp_bound_socket* listener, int* port) { } else if (ss.ss_family == AF_INET6) { *port = ntohs((reinterpret_cast(&ss))->sin6_port); } else { - ABSL_RAW_LOG(ERROR, "Unknown address family %d", ss.ss_family); + NET_LOG(ERROR, "Unknown address family %d", ss.ss_family); } } @@ -208,7 +207,7 @@ void ResolveEphemeralPort(evhttp_bound_socket* listener, int* port) { bool EvHTTPServer::StartAcceptingRequests() { if (ev_http_ == nullptr) { - ABSL_RAW_LOG(FATAL, "Server has not been successfully initialized"); + NET_LOG(FATAL, "Server has not been successfully initialized"); return false; } @@ -221,7 +220,7 @@ bool EvHTTPServer::StartAcceptingRequests() { // in case ipv6 is not supported, fallback to inaddr_any ev_listener_ = evhttp_bind_socket_with_handle(ev_http_, nullptr, ev_port); if (ev_listener_ == nullptr) { - ABSL_RAW_LOG(FATAL, "Couldn't bind to port %d", port); + NET_LOG(FATAL, "Couldn't bind to port %d", port); return false; } } @@ -236,9 +235,9 @@ bool EvHTTPServer::StartAcceptingRequests() { IncOps(); server_options_->executor()->Schedule([this]() { - ABSL_RAW_LOG(INFO, "Entering the event loop ..."); + NET_LOG(INFO, "Entering the event loop ..."); int result = event_base_dispatch(ev_base_); - ABSL_RAW_LOG(INFO, "event_base_dispatch() exits with value %d", result); + NET_LOG(INFO, "event_base_dispatch() exits with value %d", result); DecOps(); }); @@ -256,12 +255,12 @@ bool EvHTTPServer::is_accepting_requests() const { void EvHTTPServer::Terminate() { if (!is_accepting_requests()) { - ABSL_RAW_LOG(ERROR, "Server is not running ..."); + NET_LOG(ERROR, "Server is not running ..."); return; } if (is_terminating()) { - ABSL_RAW_LOG(ERROR, "Server is already being terminated ..."); + NET_LOG(ERROR, "Server is already being terminated ..."); return; } @@ -300,17 +299,17 @@ void EvHTTPServer::DecOps() { void EvHTTPServer::WaitForTermination() { { absl::MutexLock l(&ops_mu_); - ops_mu_.Await(absl::Condition(+[](int64_t* count) { return *count <= 1; }, - &num_pending_ops_)); + ops_mu_.Await(absl::Condition( + +[](int64_t* count) { return *count <= 1; }, &num_pending_ops_)); } int result = event_base_loopexit(ev_base_, nullptr); - ABSL_RAW_LOG(INFO, "event_base_loopexit() exits with value %d", result); + NET_LOG(INFO, "event_base_loopexit() exits with value %d", result); { absl::MutexLock l(&ops_mu_); - ops_mu_.Await(absl::Condition(+[](int64_t* count) { return *count == 0; }, - &num_pending_ops_)); + ops_mu_.Await(absl::Condition( + +[](int64_t* count) { return *count == 0; }, &num_pending_ops_)); } } @@ -320,21 +319,21 @@ bool EvHTTPServer::WaitForTerminationWithTimeout(absl::Duration timeout) { { absl::MutexLock l(&ops_mu_); wait_result = ops_mu_.AwaitWithTimeout( - absl::Condition(+[](int64_t* count) { return *count <= 1; }, - &num_pending_ops_), + absl::Condition( + +[](int64_t* count) { return *count <= 1; }, &num_pending_ops_), timeout); } if (wait_result) { int result = event_base_loopexit(ev_base_, nullptr); - ABSL_RAW_LOG(INFO, "event_base_loopexit() exits with value %d", result); + NET_LOG(INFO, "event_base_loopexit() exits with value %d", result); // This should pass immediately { absl::MutexLock l(&ops_mu_); wait_result = ops_mu_.AwaitWithTimeout( - absl::Condition(+[](int64_t* count) { return *count == 0; }, - &num_pending_ops_), + absl::Condition( + +[](int64_t* count) { return *count == 0; }, &num_pending_ops_), timeout); } } @@ -362,19 +361,18 @@ void EvHTTPServer::RegisterRequestHandler( std::forward_as_tuple(uri, handler, options)); if (!result.second) { - ABSL_RAW_LOG(INFO, - "Overwrite the existing handler registered under " - "the URI path %.*s", - static_cast(uri.size()), uri.data()); + NET_LOG(INFO, + "Overwrite the existing handler registered under " + "the URI path %.*s", + static_cast(uri.size()), uri.data()); uri_handlers_.erase(result.first); if (!uri_handlers_ .emplace(std::piecewise_construct, std::forward_as_tuple(uri), std::forward_as_tuple(uri, handler, options)) .second) { - ABSL_RAW_LOG(ERROR, - "Failed to register an handler under the URI path %.*s", - static_cast(uri.size()), uri.data()); + NET_LOG(ERROR, "Failed to register an handler under the URI path %.*s", + static_cast(uri.size()), uri.data()); } } } diff --git a/tensorflow_serving/util/net_http/server/public/httpserver.h b/tensorflow_serving/util/net_http/server/public/httpserver.h index bd485971539..2e578e98b71 100644 --- a/tensorflow_serving/util/net_http/server/public/httpserver.h +++ b/tensorflow_serving/util/net_http/server/public/httpserver.h @@ -20,7 +20,6 @@ limitations under the License. #include -#include "absl/base/internal/raw_logging.h" #include "absl/memory/memory.h" #include "tensorflow_serving/util/net_http/server/internal/evhttp_server.h" @@ -40,7 +39,6 @@ inline std::unique_ptr CreateEvHTTPServer( auto server = absl::make_unique(std::move(options)); bool result = server->Initialize(); if (!result) { - ABSL_RAW_LOG(ERROR, "Failed to initialize EvHTTPServer"); return nullptr; } From 1c0291118f34ec7ba958a9cee594414f6531c0f3 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Tue, 13 Aug 2019 16:16:12 -0700 Subject: [PATCH 3460/8103] Override TF defined Abseil version to a more recent version, to allow recent logging changes to compile: https://github.com/tensorflow/serving/commit/4e12a193ad27fa31cb1e42e9a7fe7b5c08f74c52 PiperOrigin-RevId: 263238158 --- tensorflow_serving/workspace.bzl | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tensorflow_serving/workspace.bzl b/tensorflow_serving/workspace.bzl index 768a4343c70..c24c53d616c 100644 --- a/tensorflow_serving/workspace.bzl +++ b/tensorflow_serving/workspace.bzl @@ -1,6 +1,7 @@ # TensorFlow Serving external dependencies that can be loaded in WORKSPACE # files. +load("@org_tensorflow//third_party:repo.bzl", "tf_http_archive") load("@org_tensorflow//tensorflow:workspace.bzl", "tf_workspace") load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") @@ -43,3 +44,15 @@ def tf_serving_workspace(): strip_prefix = "libevent-release-2.1.8-stable", build_file = "@//third_party/libevent:BUILD", ) + + # ===== Override TF defined `com_google_absl` (we need a recent version). + tf_http_archive( + name = "com_google_absl", + build_file = str(Label("@org_tensorflow//third_party:com_google_absl.BUILD")), + sha256 = "b6aa25c8283cca9de282bb7f5880b04492af76213b2f48c135c4963c6333a21e", + strip_prefix = "abseil-cpp-36d37ab992038f52276ca66b9da80c1cf0f57dc2", + urls = [ + "http://mirror.tensorflow.org/github.com/abseil/abseil-cpp/archive/36d37ab992038f52276ca66b9da80c1cf0f57dc2.tar.gz", + "https://github.com/abseil/abseil-cpp/archive/36d37ab992038f52276ca66b9da80c1cf0f57dc2.tar.gz", + ], + ) From 071634e39f47cde52996c8bfd1ddda8abf4deef9 Mon Sep 17 00:00:00 2001 From: Haiming Bao Date: Tue, 13 Aug 2019 17:12:44 -0700 Subject: [PATCH 3461/8103] Makes VerifyValidity, Normalize and IsNormalized method virtual. PiperOrigin-RevId: 263248704 --- tensorflow_serving/resources/resource_util.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tensorflow_serving/resources/resource_util.h b/tensorflow_serving/resources/resource_util.h index ef59ecec6ec..482527dd321 100644 --- a/tensorflow_serving/resources/resource_util.h +++ b/tensorflow_serving/resources/resource_util.h @@ -38,7 +38,7 @@ class ResourceUtil { std::map devices; }; explicit ResourceUtil(const Options& options); - ~ResourceUtil() = default; + virtual ~ResourceUtil() = default; // Determines whether 'allocation' is valid, i.e.: // 1. It only refers to valid devices, i.e. those supplied via Options. @@ -47,7 +47,7 @@ class ResourceUtil { // // All other methods in this class assume their inputs are valid (i.e. they // have undefined behavior otherwise), and guarantee to produce valid outputs. - Status VerifyValidity(const ResourceAllocation& allocation) const; + virtual Status VerifyValidity(const ResourceAllocation& allocation) const; // Verifies whether 'resource' is valid, i.e. it only refers to valid devices, // i.e. those supplied via Options. @@ -57,10 +57,11 @@ class ResourceUtil { // 1. It has no entries with quantity 0. // 2. Resources of a device that has exactly one instance are bound to that // instance. - ResourceAllocation Normalize(const ResourceAllocation& allocation) const; + virtual ResourceAllocation Normalize( + const ResourceAllocation& allocation) const; // Determines whether 'allocation' is in normal form, as defined above. - bool IsNormalized(const ResourceAllocation& allocation) const; + virtual bool IsNormalized(const ResourceAllocation& allocation) const; // Determines whether 'allocation' is bound, defined as follows: // 1. An individual entry is bound iff a device_instance is supplied. From 918de7f600943c6e1476e3ea734dd29b766087e0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 26 Aug 2019 16:57:42 -0700 Subject: [PATCH 3462/8103] CL is a no-op PiperOrigin-RevId: 265571977 --- tensorflow_serving/util/net_http/server/public/BUILD | 1 - 1 file changed, 1 deletion(-) diff --git a/tensorflow_serving/util/net_http/server/public/BUILD b/tensorflow_serving/util/net_http/server/public/BUILD index 58298449888..e7f96d98f13 100644 --- a/tensorflow_serving/util/net_http/server/public/BUILD +++ b/tensorflow_serving/util/net_http/server/public/BUILD @@ -37,7 +37,6 @@ cc_library( deps = [ ":http_server_api", "//tensorflow_serving/util/net_http/server/internal:evhttp_server", - "@com_google_absl//absl/base", "@com_google_absl//absl/memory", ], ) From 1623705e4205bc779109f8c4d1eadf6d3f24a549 Mon Sep 17 00:00:00 2001 From: "William D. Irons" Date: Tue, 27 Aug 2019 22:15:15 +0000 Subject: [PATCH 3463/8103] Example of creating tf_serving_warmup_requests Using the resnet example with a model converted for TensorRT, I was finding that the first interface request was timing out, while subsequent requests all worked. I figured a warmup request file would solve this issue, but I didn't find an end to end example online on how to do this. I thought it would be beneficial if TensorFlow Serving included such example. The generated tf_serving_warmup_requests does solve the issue of the first interface request timing out. --- tensorflow_serving/example/resnet_warmup.py | 62 +++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 tensorflow_serving/example/resnet_warmup.py diff --git a/tensorflow_serving/example/resnet_warmup.py b/tensorflow_serving/example/resnet_warmup.py new file mode 100644 index 00000000000..0e64e25799b --- /dev/null +++ b/tensorflow_serving/example/resnet_warmup.py @@ -0,0 +1,62 @@ +# Copyright 2019 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Creates the tf_serving_warmup_requests file to warm up a server. + + 1. Invoke this script to generate the tf_serving_warmup_requests file. + 2. Create a directory 'assets.extra' in the folder of the saved model. + 3. copy the file tf_serving_warmup_requests into that folder. + 4. Restart tensorflow_model_server. + + If unsure where the file goes, look for the output: + 'No warmup data file found at' in the tensorflow_model_server + startup log + + When copied to the proper location look for the output: + 'Starting to read warmup data for model at' in the tensorflow_model_server + startup log + + Usage example: + python resnet_warmup.py +""" +import requests +import tensorflow as tf +from tensorflow_serving.apis import model_pb2 +from tensorflow_serving.apis import predict_pb2 +from tensorflow_serving.apis import prediction_log_pb2 + +# The image URL is the location of the image we should send to the server +IMAGE_URL = 'https://tensorflow.org/images/blogs/serving/cat.jpg' + +def main(): + dl_request = requests.get(IMAGE_URL, stream=True) + dl_request.raise_for_status() + data = dl_request.content + + with tf.io.TFRecordWriter("tf_serving_warmup_requests") as writer: + request = predict_pb2.PredictRequest() + request.model_spec.name = 'resnet' + request.model_spec.signature_name = 'serving_default' + request.inputs['image_bytes'].CopyFrom( + tf.contrib.util.make_tensor_proto(data, shape=[1])) + + log = prediction_log_pb2.PredictionLog( + predict_log=prediction_log_pb2.PredictLog(request=request)) + writer.write(log.SerializeToString()) + + print("Copy the generated tf_serving_warmup_requests to the " \ + "assets.extra directory of the model") + +if __name__ == '__main__': + main() From 8a02a5f63911bc23c662a14f3ffac58655190b46 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 28 Aug 2019 14:22:26 -0700 Subject: [PATCH 3464/8103] \nInternal refactor\n PiperOrigin-RevId: 265992554 --- .../util/net_http/internal/fixed_thread_pool.h | 4 ++-- .../util/net_http/server/internal/evhttp_server.h | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/tensorflow_serving/util/net_http/internal/fixed_thread_pool.h b/tensorflow_serving/util/net_http/internal/fixed_thread_pool.h index cc6844030fa..35115a5ec69 100644 --- a/tensorflow_serving/util/net_http/internal/fixed_thread_pool.h +++ b/tensorflow_serving/util/net_http/internal/fixed_thread_pool.h @@ -63,7 +63,7 @@ class FixedThreadPool { } private: - bool WorkAvailable() const EXCLUSIVE_LOCKS_REQUIRED(mu_) { + bool WorkAvailable() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) { return !queue_.empty(); } @@ -84,7 +84,7 @@ class FixedThreadPool { } absl::Mutex mu_; - std::queue> queue_ GUARDED_BY(mu_); + std::queue> queue_ ABSL_GUARDED_BY(mu_); std::vector threads_; }; diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_server.h b/tensorflow_serving/util/net_http/server/internal/evhttp_server.h index bc9d43d2f95..dec535e0602 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_server.h +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_server.h @@ -85,9 +85,9 @@ class EvHTTPServer final : public HTTPServerInterface, ServerSupport { void ScheduleHandlerReference(const RequestHandler& handler, EvHTTPRequest* ev_request) - EXCLUSIVE_LOCKS_REQUIRED(request_mu_); + ABSL_EXCLUSIVE_LOCKS_REQUIRED(request_mu_); void ScheduleHandler(RequestHandler&& handler, EvHTTPRequest* ev_request) - EXCLUSIVE_LOCKS_REQUIRED(request_mu_); + ABSL_EXCLUSIVE_LOCKS_REQUIRED(request_mu_); struct UriHandlerInfo { public: @@ -119,12 +119,12 @@ class EvHTTPServer final : public HTTPServerInterface, ServerSupport { // Tracks the # of pending operations mutable absl::Mutex ops_mu_; - int64_t num_pending_ops_ GUARDED_BY(ops_mu_) = 0; + int64_t num_pending_ops_ ABSL_GUARDED_BY(ops_mu_) = 0; mutable absl::Mutex request_mu_; std::unordered_map uri_handlers_ - GUARDED_BY(request_mu_); - std::vector dispatchers_ GUARDED_BY(request_mu_); + ABSL_GUARDED_BY(request_mu_); + std::vector dispatchers_ ABSL_GUARDED_BY(request_mu_); // ev instances event_base* ev_base_ = nullptr; From 28d32a1e487666c8b324c74afb633006ba5cbf17 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 4 Sep 2019 12:54:42 -0700 Subject: [PATCH 3465/8103] Don't copy SignatureDef. signature is passed on as a const, so there is no need to copy. PiperOrigin-RevId: 267211948 --- tensorflow_serving/servables/tensorflow/predict_util.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/servables/tensorflow/predict_util.cc b/tensorflow_serving/servables/tensorflow/predict_util.cc index 15d4c640c25..f2df29132a1 100644 --- a/tensorflow_serving/servables/tensorflow/predict_util.cc +++ b/tensorflow_serving/servables/tensorflow/predict_util.cc @@ -194,7 +194,7 @@ Status RunPredict( return errors::FailedPrecondition(strings::StrCat( "Serving signature key \"", signature_name, "\" not found.")); } - SignatureDef signature = iter->second; + const SignatureDef& signature = iter->second; MakeModelSpec(request.model_spec().name(), signature_name, servable_version, response->mutable_model_spec()); From 00b49bd3f4bcb3b17d1fb61bf302aacccf80c83e Mon Sep 17 00:00:00 2001 From: "William D. Irons" Date: Thu, 5 Sep 2019 17:21:24 -0500 Subject: [PATCH 3466/8103] Update resnet_warmup.py example Updates per code review comments: * Takes as input a model_dir on the command line, creates the directory assets.extra and tf_serving_warmup_requests file under the model_dir * Provided the framework for multiple warm up request. * Fix comment to refect this is a ResNet SavedModel. --- tensorflow_serving/example/resnet_warmup.py | 78 +++++++++++++-------- 1 file changed, 50 insertions(+), 28 deletions(-) diff --git a/tensorflow_serving/example/resnet_warmup.py b/tensorflow_serving/example/resnet_warmup.py index 0e64e25799b..afa70e2230c 100644 --- a/tensorflow_serving/example/resnet_warmup.py +++ b/tensorflow_serving/example/resnet_warmup.py @@ -12,51 +12,73 @@ # See the License for the specific language governing permissions and # limitations under the License. # ============================================================================== -"""Creates the tf_serving_warmup_requests file to warm up a server. +"""Creates the tf_serving_warmup_requests file to warm up a ResNet SavedModel. - 1. Invoke this script to generate the tf_serving_warmup_requests file. - 2. Create a directory 'assets.extra' in the folder of the saved model. - 3. copy the file tf_serving_warmup_requests into that folder. - 4. Restart tensorflow_model_server. + 1. Invoke this script passing in the model directory (including version + folder) as an argument. + 2. Restart tensorflow_model_server. - If unsure where the file goes, look for the output: + If unsure of the model directory, look for the output: 'No warmup data file found at' in the tensorflow_model_server startup log - When copied to the proper location look for the output: + After the script is run, and tensorflow_model_server is restarted, to verify + it is working look for the output: 'Starting to read warmup data for model at' in the tensorflow_model_server startup log Usage example: - python resnet_warmup.py + python resnet_warmup.py model_dir """ + +import os import requests +import sys import tensorflow as tf -from tensorflow_serving.apis import model_pb2 from tensorflow_serving.apis import predict_pb2 from tensorflow_serving.apis import prediction_log_pb2 -# The image URL is the location of the image we should send to the server -IMAGE_URL = 'https://tensorflow.org/images/blogs/serving/cat.jpg' +# IMAGE_URLS are the locations of the images we use to warmup the model +IMAGE_URLS = [ 'https://tensorflow.org/images/blogs/serving/cat.jpg', + ] def main(): - dl_request = requests.get(IMAGE_URL, stream=True) - dl_request.raise_for_status() - data = dl_request.content - - with tf.io.TFRecordWriter("tf_serving_warmup_requests") as writer: - request = predict_pb2.PredictRequest() - request.model_spec.name = 'resnet' - request.model_spec.signature_name = 'serving_default' - request.inputs['image_bytes'].CopyFrom( - tf.contrib.util.make_tensor_proto(data, shape=[1])) - - log = prediction_log_pb2.PredictionLog( - predict_log=prediction_log_pb2.PredictLog(request=request)) - writer.write(log.SerializeToString()) - - print("Copy the generated tf_serving_warmup_requests to the " \ - "assets.extra directory of the model") + if len(sys.argv) != 2 or sys.argv[-1].startswith('-'): + print('Usage: resnet_warmup.py model_dir') + sys.exit(-1) + + model_dir = sys.argv[-1] + if not os.path.isdir(model_dir): + print('The model directory: %s does not exist. ' + 'Specify the path of an existing model.' % model_dir) + sys.exit(-1) + + # Create the assets.extra directory + assets_dir = os.path.join(model_dir, "assets.extra") + if not os.path.exists(assets_dir): + os.mkdir(assets_dir) + + warmup_file = os.path.join(assets_dir, "tf_serving_warmup_requests") + with tf.io.TFRecordWriter(warmup_file) as writer: + for image in IMAGE_URLS: + # Download the image + dl_request = requests.get(image, stream=True) + dl_request.raise_for_status() + data = dl_request.content + + # Create the inference request + request = predict_pb2.PredictRequest() + request.model_spec.name = 'resnet' + request.model_spec.signature_name = 'serving_default' + request.inputs['image_bytes'].CopyFrom( + tf.contrib.util.make_tensor_proto(data, shape=[1])) + + log = prediction_log_pb2.PredictionLog( + predict_log=prediction_log_pb2.PredictLog(request=request)) + writer.write(log.SerializeToString()) + + print('Created the file \'%s\', restart tensorflow_model_server to warmup the ' + 'ResNet SavedModel.' % warmup_file) if __name__ == '__main__': main() From 263025f091dd60d415dd22e9667c0f37f11209ff Mon Sep 17 00:00:00 2001 From: "William D. Irons" Date: Fri, 6 Sep 2019 13:36:38 -0500 Subject: [PATCH 3467/8103] Update resnet_warmup.py example Update per code review comments: * Added 2nd image url * Changed model_dir to saved_model_dir in the user messages and comments. --- tensorflow_serving/example/resnet_warmup.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tensorflow_serving/example/resnet_warmup.py b/tensorflow_serving/example/resnet_warmup.py index afa70e2230c..c765ee4bada 100644 --- a/tensorflow_serving/example/resnet_warmup.py +++ b/tensorflow_serving/example/resnet_warmup.py @@ -14,8 +14,8 @@ # ============================================================================== """Creates the tf_serving_warmup_requests file to warm up a ResNet SavedModel. - 1. Invoke this script passing in the model directory (including version - folder) as an argument. + 1. Invoke this script passing in the saved_model directory (including version + folder, the folder containing saved_model.pb) as an argument. 2. Restart tensorflow_model_server. If unsure of the model directory, look for the output: @@ -28,7 +28,7 @@ startup log Usage example: - python resnet_warmup.py model_dir + python resnet_warmup.py saved_model_dir """ import os @@ -40,16 +40,17 @@ # IMAGE_URLS are the locations of the images we use to warmup the model IMAGE_URLS = [ 'https://tensorflow.org/images/blogs/serving/cat.jpg', + 'https://storage.googleapis.com/download.tensorflow.org/example_images/320px-Felis_catus-cat_on_snow.jpg', ] def main(): if len(sys.argv) != 2 or sys.argv[-1].startswith('-'): - print('Usage: resnet_warmup.py model_dir') + print('Usage: resnet_warmup.py saved_model_dir') sys.exit(-1) model_dir = sys.argv[-1] if not os.path.isdir(model_dir): - print('The model directory: %s does not exist. ' + print('The saved model directory: %s does not exist. ' 'Specify the path of an existing model.' % model_dir) sys.exit(-1) From 929ab172ec3553a9d563b13dccfb0926d8bf3724 Mon Sep 17 00:00:00 2001 From: Jose Baiocchi Date: Fri, 6 Sep 2019 14:34:49 -0700 Subject: [PATCH 3468/8103] Instrument BatchingSession::Run with TraceMe PiperOrigin-RevId: 267674542 --- tensorflow_serving/batching/BUILD | 1 + tensorflow_serving/batching/batching_session.cc | 2 ++ 2 files changed, 3 insertions(+) diff --git a/tensorflow_serving/batching/BUILD b/tensorflow_serving/batching/BUILD index 0c7bf8ac05e..51a5eb0ff59 100644 --- a/tensorflow_serving/batching/BUILD +++ b/tensorflow_serving/batching/BUILD @@ -65,6 +65,7 @@ cc_library( "@org_tensorflow//tensorflow/core:tensorflow", "@org_tensorflow//tensorflow/core/kernels/batching_util:basic_batch_scheduler", "@org_tensorflow//tensorflow/core/kernels/batching_util:batch_scheduler", + "@org_tensorflow//tensorflow/core/profiler/lib:traceme", ], ) diff --git a/tensorflow_serving/batching/batching_session.cc b/tensorflow_serving/batching/batching_session.cc index 275519ae304..689adc418a4 100644 --- a/tensorflow_serving/batching/batching_session.cc +++ b/tensorflow_serving/batching/batching_session.cc @@ -26,6 +26,7 @@ limitations under the License. #include "tensorflow/core/lib/strings/str_util.h" #include "tensorflow/core/platform/macros.h" #include "tensorflow/core/platform/types.h" +#include "tensorflow/core/profiler/lib/traceme.h" #include "tensorflow_serving/batching/batching_util.h" #include "tensorflow_serving/servables/tensorflow/serving_session.h" #include "tensorflow_serving/util/cleanup.h" @@ -268,6 +269,7 @@ Status BatchingSession::Run( "BatchingSession does not support target nodes"); } + profiler::TraceMe trace_me("BatchingSessionRun"); const TensorSignature signature = TensorSignatureFromRunArgs(inputs, output_tensor_names); auto batch_scheduler_it = batch_schedulers_.find(signature); From 0703079f441251a391a388c4245e0444e551aaa3 Mon Sep 17 00:00:00 2001 From: Hao Ziyu Date: Mon, 9 Sep 2019 11:57:32 +0800 Subject: [PATCH 3469/8103] Update the comments Signed-off-by: Hao Ziyu --- tools/run_in_docker.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/run_in_docker.sh b/tools/run_in_docker.sh index 65bc67d21bd..d79a09328c9 100755 --- a/tools/run_in_docker.sh +++ b/tools/run_in_docker.sh @@ -28,11 +28,11 @@ # Typical usage (to build from lastest upstream source): # $ git clone https://github.com/tensorflow/serving.git # $ cd serving -# $ ./run_in_docker.sh bazel build tensorflow_serving/model_servers:tensorflow_model_server +# $ ./tools/run_in_docker.sh bazel build tensorflow_serving/model_servers:tensorflow_model_server # # Running a python script: -# $ cd tensorflow_serving/example -# $ ./run_in_docker.sh mnist_saved_model.py /tmp/mnist +# $ cd serving +# $ ./tools/run_in_docker.sh python tensorflow_serving/example/mnist_saved_model.py /tmp/mnist set -e From de057bc1ec10cd0e15af1526e8eb4e0a78fcc317 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 11 Sep 2019 17:37:58 -0700 Subject: [PATCH 3470/8103] Internal change. PiperOrigin-RevId: 268580025 --- .../util/net_http/server/internal/evhttp_server.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc b/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc index e721bfc91e6..1238b364239 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc @@ -220,7 +220,7 @@ bool EvHTTPServer::StartAcceptingRequests() { // in case ipv6 is not supported, fallback to inaddr_any ev_listener_ = evhttp_bind_socket_with_handle(ev_http_, nullptr, ev_port); if (ev_listener_ == nullptr) { - NET_LOG(FATAL, "Couldn't bind to port %d", port); + NET_LOG(ERROR, "Couldn't bind to port %d", port); return false; } } From e7c987d4b10ac751081c62595fcd18be7481e67a Mon Sep 17 00:00:00 2001 From: Chao Xie Date: Wed, 18 Sep 2019 18:10:44 -0700 Subject: [PATCH 3471/8103] Remove contrib ops from model server from tensorflow 2.0. PiperOrigin-RevId: 269933341 --- tensorflow_serving/model_servers/BUILD | 6 ++++-- tensorflow_serving/tensorflow_version.bzl | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 tensorflow_serving/tensorflow_version.bzl diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 8afb78b8376..8adeb052cd3 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -291,10 +291,12 @@ cc_library( ], ) -SUPPORTED_TENSORFLOW_OPS = [ +load("//tensorflow_serving:tensorflow_version.bzl", "if_v2", "if_not_v2") + +SUPPORTED_TENSORFLOW_OPS = if_v2([]) + if_not_v2([ "@org_tensorflow//tensorflow/contrib:contrib_kernels", "@org_tensorflow//tensorflow/contrib:contrib_ops_op_lib", -] +]) TENSORFLOW_DEPS = [ "@org_tensorflow//tensorflow/core:tensorflow", diff --git a/tensorflow_serving/tensorflow_version.bzl b/tensorflow_serving/tensorflow_version.bzl new file mode 100644 index 00000000000..fdc1d2d1736 --- /dev/null +++ b/tensorflow_serving/tensorflow_version.bzl @@ -0,0 +1,17 @@ +""" +Module for build utilities to distiguish different tensorflow versions. +""" + +load("@org_tensorflow//tensorflow:tensorflow.bzl", "VERSION_MAJOR") + +def if_v2(a): + if VERSION_MAJOR == "2": + return a + else: + return [] + +def if_not_v2(a): + if VERSION_MAJOR == "2": + return [] + else: + return a From 41873601c73bcb91e403f9ddd70a168ae117ddb0 Mon Sep 17 00:00:00 2001 From: Li Lao Date: Thu, 19 Sep 2019 18:57:05 -0700 Subject: [PATCH 3472/8103] Use C++14 by default as LLVM, MLIR and TF require it. PiperOrigin-RevId: 270174332 --- .bazelrc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.bazelrc b/.bazelrc index 42093509a47..84c1eb849ef 100644 --- a/.bazelrc +++ b/.bazelrc @@ -36,6 +36,10 @@ build --apple_platform_type=macos build -c opt +# LLVM, MLIR and TF require C++14. +build --cxxopt=-std=c++14 +build --host_cxxopt=-std=c++14 + # Adding --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0" creates parity with TF # compilation options. It also addresses memory use due to # copy-on-write semantics of std::strings of the older ABI. From 3ba8a6d8ac31572548bbe7922e4152a6b92e626c Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Thu, 19 Sep 2019 20:05:21 -0700 Subject: [PATCH 3473/8103] o Switch to using the half_plus_two model from TF to tensorflow_serving one. o Update the current tensorflow_serving model to have assets/ o Update corresponding metadata JSON (and improve the test). PiperOrigin-RevId: 270181362 --- tensorflow_serving/model_servers/BUILD | 2 +- .../tensorflow_model_server_test.py | 23 ++++++++-- .../half_plus_two_model_metadata.json | 41 ------------------ .../00000123/assets/foo.txt | 1 + .../00000123/saved_model.pb | Bin 9337 -> 12107 bytes .../variables/variables.data-00000-of-00001 | Bin 12 -> 20 bytes .../00000123/variables/variables.index | Bin 151 -> 172 bytes 7 files changed, 22 insertions(+), 45 deletions(-) create mode 100644 tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu/00000123/assets/foo.txt diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 8adeb052cd3..c178bd209ae 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -395,7 +395,7 @@ py_test( "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_three/00000123/saved_model.pb", "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_three/00000123/variables/variables.data-00000-of-00001", "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_three/00000123/variables/variables.index", - "@org_tensorflow//tensorflow/cc/saved_model:saved_model_half_plus_two", + "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_cpu", ], python_version = "PY2", srcs_version = "PY2AND3", diff --git a/tensorflow_serving/model_servers/tensorflow_model_server_test.py b/tensorflow_serving/model_servers/tensorflow_model_server_test.py index 1b32a3b84b7..d440e97e218 100644 --- a/tensorflow_serving/model_servers/tensorflow_model_server_test.py +++ b/tensorflow_serving/model_servers/tensorflow_model_server_test.py @@ -124,6 +124,18 @@ def CallREST(url, req, max_attempts=60): time.sleep(1) +def SortedObject(obj): + """Returns sorted object (with nested list/dictionaries).""" + if isinstance(obj, dict): + return sorted((k, SortedObject(v)) for k, v in obj.items()) + if isinstance(obj, list): + return sorted(SortedObject(x) for x in obj) + if isinstance(obj, tuple): + return list(sorted(SortedObject(x) for x in obj)) + else: + return obj + + class TensorflowModelServerTest(tf.test.TestCase): """This class defines integration test cases for tensorflow_model_server.""" @@ -288,8 +300,7 @@ def VerifyPredictRequest( def _GetSavedModelBundlePath(self): """Returns a path to a model in SavedModel format.""" - return os.path.join(os.environ['TEST_SRCDIR'], 'tf_serving/external/org_tensorflow/tensorflow/', - 'cc/saved_model/testdata/half_plus_two') + return os.path.join(self.testdata_dir, 'saved_model_half_plus_two_cpu') def _GetModelVersion(self, model_path): """Returns version of SavedModel/SessionBundle in given path. @@ -824,7 +835,13 @@ def testGetModelMetadataREST(self): with open(model_metadata_file) as f: expected_metadata = json.load(f) # Verify response - self.assertEqual(json.loads(resp_data), expected_metadata) + # Note, we sort the JSON object before comparing. Formally JSON lists + # (aka arrays) are considered ordered and general comparison should NOT + # sort. In this case, the "metadata" does not have any ordering making + # the sort OK (and the test robust). + self.assertEqual( + SortedObject(json.loads(resp_data)), + SortedObject(expected_metadata)) except Exception as e: # pylint: disable=broad-except self.fail('Request failed with error: {}'.format(e)) diff --git a/tensorflow_serving/servables/tensorflow/testdata/half_plus_two_model_metadata.json b/tensorflow_serving/servables/tensorflow/testdata/half_plus_two_model_metadata.json index a3456c71624..89f1b64c32b 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/half_plus_two_model_metadata.json +++ b/tensorflow_serving/servables/tensorflow/testdata/half_plus_two_model_metadata.json @@ -121,47 +121,6 @@ }, "method_name": "tensorflow/serving/classify" }, - "classify_x2_to_y3": { - "inputs": { - "inputs": { - "dtype": "DT_FLOAT", - "tensor_shape": { - "dim": [ - { - "size": "-1", - "name": "" - }, - { - "size": "1", - "name": "" - } - ], - "unknown_rank": false - }, - "name": "x2:0" - } - }, - "outputs": { - "scores": { - "dtype": "DT_FLOAT", - "tensor_shape": { - "dim": [ - { - "size": "-1", - "name": "" - }, - { - "size": "1", - "name": "" - } - ], - "unknown_rank": false - }, - "name": "y3:0" - } - }, - "method_name": "tensorflow/serving/classify" - }, "regress_x_to_y2": { "inputs": { "inputs": { diff --git a/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu/00000123/assets/foo.txt b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu/00000123/assets/foo.txt new file mode 100644 index 00000000000..f9ff0366880 --- /dev/null +++ b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu/00000123/assets/foo.txt @@ -0,0 +1 @@ +asset-file-contents \ No newline at end of file diff --git a/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu/00000123/saved_model.pb b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu/00000123/saved_model.pb index c79ebe01c240863890d2048ebee5da046c93a90a..8aca300f0f7c330aa4695a1a4beacfb3876769ff 100644 GIT binary patch delta 3033 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 Ug<3;JPja&N#oTp*za4J=1NnW1;{X5v diff --git a/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu/00000123/variables/variables.data-00000-of-00001 b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu/00000123/variables/variables.data-00000-of-00001 index 15b75d6ef6bffc336d138d923badb3928b8c4c13..a378d172b66af3595a20b49a506ef16b03d8d017 100644 GIT binary patch literal 20 TcmZQzV6bO^UU2QUTz4K@M4 literal 12 RcmZQzV6bOkU~m8;2LJ>^0RR91 diff --git a/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu/00000123/variables/variables.index b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu/00000123/variables/variables.index index 7ec9fb4fe2dd21d0a6c324aecd7658fc37cf2326..5ae2cc0f2d45a17b3b86dbac99d1b2a64e2be29a 100644 GIT binary patch literal 172 zcmYevVPIh6V3cCwU}RwAPUK(|V$fhQWwTJ1XJq6xV&rF0VBr||jah6A4#ZeUL0P?u+5 Date: Fri, 20 Sep 2019 11:46:26 -0700 Subject: [PATCH 3474/8103] Add TfLiteSession class to run inference on TensorFlow Lite Model. PiperOrigin-RevId: 270317480 --- tensorflow_serving/servables/tensorflow/BUILD | 37 +++ .../servables/tensorflow/testdata/BUILD | 7 + .../testdata/saved_model_half_plus_two.py | 86 +++-- .../00000123/model.tflite | Bin 0 -> 768 bytes .../servables/tensorflow/tflite_session.cc | 296 ++++++++++++++++++ .../servables/tensorflow/tflite_session.h | 81 +++++ .../tensorflow/tflite_session_test.cc | 97 ++++++ 7 files changed, 574 insertions(+), 30 deletions(-) create mode 100644 tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_tflite/00000123/model.tflite create mode 100644 tensorflow_serving/servables/tensorflow/tflite_session.cc create mode 100644 tensorflow_serving/servables/tensorflow/tflite_session.h create mode 100644 tensorflow_serving/servables/tensorflow/tflite_session_test.cc diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index d302dedc7bd..3ec73133176 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -419,6 +419,43 @@ cc_test( ], ) +cc_library( + name = "tflite_session", + srcs = ["tflite_session.cc"], + hdrs = ["tflite_session.h"], + deps = [ + ":serving_session", + "@com_google_absl//absl/base:core_headers", + "@com_google_absl//absl/synchronization", + "@com_google_protobuf//:protobuf", + "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", + "@org_tensorflow//tensorflow/core:lib", + "@org_tensorflow//tensorflow/core:protos_all_cc", + "@org_tensorflow//tensorflow/lite:framework", + "@org_tensorflow//tensorflow/lite:string_util", + "@org_tensorflow//tensorflow/lite/core/api", + "@org_tensorflow//tensorflow/lite/kernels:builtin_ops", + ], +) + +cc_test( + name = "tflite_session_test", + size = "small", + srcs = ["tflite_session_test.cc"], + data = [ + "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_tflite", + ], + deps = [ + ":tflite_session", + "//tensorflow_serving/core/test_util:test_main", + "//tensorflow_serving/test_util", + "@org_tensorflow//tensorflow/core:lib", + "@org_tensorflow//tensorflow/core:protos_all_cc", + "@org_tensorflow//tensorflow/core:test", + "@org_tensorflow//tensorflow/core:testlib", + ], +) + cc_library( name = "predict_impl", srcs = ["predict_impl.cc"], diff --git a/tensorflow_serving/servables/tensorflow/testdata/BUILD b/tensorflow_serving/servables/tensorflow/testdata/BUILD index b727a3eccde..2183d226d52 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/BUILD +++ b/tensorflow_serving/servables/tensorflow/testdata/BUILD @@ -104,6 +104,13 @@ filegroup( ), ) +filegroup( + name = "saved_model_half_plus_two_tflite", + srcs = glob( + ["saved_model_half_plus_two_tflite/**"], + ), +) + filegroup( name = "saved_model_half_plus_two_gpu_trt", srcs = glob( diff --git a/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two.py b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two.py index b06ee1e007b..ac4f061f669 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two.py +++ b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two.py @@ -114,8 +114,29 @@ def _build_classification_signature(input_tensor, scores_tensor): tf.saved_model.signature_constants.CLASSIFY_METHOD_NAME) +def _create_asset_file(): + """Helper to create assets file. Returns a tensor for the filename.""" + # Create an assets file that can be saved and restored as part of the + # SavedModel. + original_assets_directory = "/tmp/original/export/assets" + original_assets_filename = "foo.txt" + original_assets_filepath = _write_assets(original_assets_directory, + original_assets_filename) + + # Set up the assets collection. + assets_filepath = tf.constant(original_assets_filepath) + tf.add_to_collection(tf.GraphKeys.ASSET_FILEPATHS, assets_filepath) + filename_tensor = tf.Variable( + original_assets_filename, + name="filename_tensor", + trainable=False, + collections=[]) + return filename_tensor.assign(original_assets_filename) + + def _generate_saved_model_for_half_plus_two(export_dir, as_text=False, + as_tflite=False, use_main_op=False, device_type="cpu"): """Generates SavedModel for half plus two. @@ -123,8 +144,9 @@ def _generate_saved_model_for_half_plus_two(export_dir, Args: export_dir: The directory to which the SavedModel should be written. as_text: Writes the SavedModel protocol buffer in text format to disk. + as_tflite: Writes the Model in Tensorflow Lite format to disk. use_main_op: Whether to supply a main op during SavedModel build time. - device_name: Device to force ops to run on. + device_type: Device to force ops to run on. """ builder = tf.saved_model.builder.SavedModelBuilder(export_dir) @@ -196,22 +218,7 @@ def _generate_saved_model_for_half_plus_two(export_dir, y3 = tf.identity(y3, name="y3") - # Create an assets file that can be saved and restored as part of the - # SavedModel. - original_assets_directory = "/tmp/original/export/assets" - original_assets_filename = "foo.txt" - original_assets_filepath = _write_assets(original_assets_directory, - original_assets_filename) - - # Set up the assets collection. - assets_filepath = tf.constant(original_assets_filepath) - tf.add_to_collection(tf.GraphKeys.ASSET_FILEPATHS, assets_filepath) - filename_tensor = tf.Variable( - original_assets_filename, - name="filename_tensor", - trainable=False, - collections=[]) - assign_filename_op = filename_tensor.assign(original_assets_filename) + assign_filename_op = _create_asset_file() # Set up the signature for Predict with input and output tensor # specification. @@ -240,20 +247,27 @@ def _generate_saved_model_for_half_plus_two(export_dir, # Initialize all variables and then save the SavedModel. sess.run(tf.global_variables_initializer()) - if use_main_op: - builder.add_meta_graph_and_variables( - sess, [tf.saved_model.tag_constants.SERVING], - signature_def_map=signature_def_map, - assets_collection=tf.get_collection(tf.GraphKeys.ASSET_FILEPATHS), - main_op=tf.group(tf.saved_model.main_op.main_op(), - assign_filename_op)) + if as_tflite: + converter = tf.lite.TFLiteConverter.from_session(sess, [x], [y]) + tflite_model = converter.convert() + open(export_dir + "/model.tflite", "wb").write(tflite_model) else: - builder.add_meta_graph_and_variables( - sess, [tf.saved_model.tag_constants.SERVING], - signature_def_map=signature_def_map, - assets_collection=tf.get_collection(tf.GraphKeys.ASSET_FILEPATHS), - main_op=tf.group(assign_filename_op)) - builder.save(as_text) + if use_main_op: + builder.add_meta_graph_and_variables( + sess, [tf.saved_model.tag_constants.SERVING], + signature_def_map=signature_def_map, + assets_collection=tf.get_collection(tf.GraphKeys.ASSET_FILEPATHS), + main_op=tf.group(tf.saved_model.main_op.main_op(), + assign_filename_op)) + else: + builder.add_meta_graph_and_variables( + sess, [tf.saved_model.tag_constants.SERVING], + signature_def_map=signature_def_map, + assets_collection=tf.get_collection(tf.GraphKeys.ASSET_FILEPATHS), + main_op=tf.group(assign_filename_op)) + + if not as_tflite: + builder.save(as_text) def main(_): @@ -278,6 +292,13 @@ def main(_): "dir": FLAGS.output_dir_main_op }) + _generate_saved_model_for_half_plus_two( + FLAGS.output_dir_tflite, as_tflite=True, device_type=FLAGS.device) + print("SavedModel in TFLite format generated for %(device)s at: %(dir)s " % { + "device": FLAGS.device, + "dir": FLAGS.output_dir_tflite, + }) + if __name__ == "__main__": parser = argparse.ArgumentParser() @@ -296,6 +317,11 @@ def main(_): type=str, default="/tmp/saved_model_half_plus_two_main_op", help="Directory where to output the SavedModel with a main op.") + parser.add_argument( + "--output_dir_tflite", + type=str, + default="/tmp/saved_model_half_plus_two_tflite", + help="Directory where to output model in TensorFlow Lite format.") parser.add_argument( "--device", type=str, diff --git a/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_tflite/00000123/model.tflite b/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_tflite/00000123/model.tflite new file mode 100644 index 0000000000000000000000000000000000000000..49b91f467e4106da83123c6cb91447987aadd05f GIT binary patch literal 768 zcmY*Xu}T9$5PfRQ9U5YYC!|Pmg{2&d3h4|4#6pQhDiNZR6ajOAm`JQ_#LCaGv=R$T zKf%HxMLxg}5Ia5J+uPN+$76P8XWqV<+cJR0?*1lFL>U?Q$f1CM(GnxT9PvCW4?G9f zhzv19+*tcSyF@hVwR%|V#h2~=pxuh#F?LAo5mll>s9s#+_)L;yix$XYfsrhCFLJr_ ztv{jn`jsSa#F&^6^Nejo+tE7h`*)J~rUF=|?RMg3e;5xs-FA~YE;_xK9R*}dJIgUA zB-EkmDr`i(xSrIn_&B^hQh)I7v&!D^8 z>5!&_;rT!A6Kc?1Et?;hDsgybCYrA1%eAOCqdA3yosH3}y*RXFpU4^Tg{4Y7TVHZK kE7I(^R=J<%qWh~)dNbxrWBT9HqSuwy=xurCtub8u0oMyyX8-^I literal 0 HcmV?d00001 diff --git a/tensorflow_serving/servables/tensorflow/tflite_session.cc b/tensorflow_serving/servables/tensorflow/tflite_session.cc new file mode 100644 index 00000000000..77694a0d3cc --- /dev/null +++ b/tensorflow_serving/servables/tensorflow/tflite_session.cc @@ -0,0 +1,296 @@ +/* Copyright 2019 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow_serving/servables/tensorflow/tflite_session.h" + +#include +#include + +#include "tensorflow/cc/saved_model/signature_constants.h" +#include "tensorflow/core/framework/tensor_shape.pb.h" +#include "tensorflow/core/lib/core/errors.h" +#include "tensorflow/lite/kernels/register.h" +#include "tensorflow/lite/string_util.h" + +namespace tensorflow { +namespace serving { + +// Map of TFLite tensor name to . +using TensorInfoMap = std::map>; + +namespace { + +Status TfLiteTypeToTfType(TfLiteType tflite_type, DataType* type) { + switch (tflite_type) { + case kTfLiteNoType: + *type = tensorflow::DT_INVALID; + break; + case kTfLiteFloat32: + *type = tensorflow::DT_FLOAT; + break; + case kTfLiteInt32: + *type = tensorflow::DT_INT32; + break; + case kTfLiteUInt8: + *type = tensorflow::DT_UINT8; + break; + case kTfLiteInt64: + *type = tensorflow::DT_INT64; + break; + case kTfLiteString: + *type = tensorflow::DT_STRING; + break; + case kTfLiteBool: + *type = tensorflow::DT_BOOL; + break; + case kTfLiteInt16: + *type = tensorflow::DT_INT16; + break; + case kTfLiteComplex64: + *type = tensorflow::DT_COMPLEX64; + break; + case kTfLiteInt8: + *type = tensorflow::DT_INT8; + break; + default: + return errors::Internal("Unknown TfLite type: ", tflite_type); + } + return Status::OK(); +} + +std::string TfLiteToTensorName(const string& name) { + // TF variable names have ':0' suffix, TF Lite variables dont. + std::pair name_index = + absl::StrSplit(name, absl::MaxSplits(':', 1)); + return std::string(name_index.first); +} + +Status TfLiteTensorToTensorInfo(const TfLiteTensor* tflite_tensor, + TensorInfo* info) { + DataType tf_type; + TF_RETURN_IF_ERROR(TfLiteTypeToTfType(tflite_tensor->type, &tf_type)); + info->set_dtype(tf_type); + info->set_name(tflite_tensor->name); + for (int i = 0; i < tflite_tensor->dims->size; i++) { + info->mutable_tensor_shape()->add_dim()->set_size( + tflite_tensor->dims->data[i]); + } + return Status::OK(); +} + +Status GetTensorInfoMap(const tflite::Interpreter& interpreter, bool input, + TensorInfoMap* infomap) { + const std::vector& indices = + input ? interpreter.inputs() : interpreter.outputs(); + const string& input_str = input ? "Input" : "Output"; + for (int index : indices) { + const TfLiteTensor* tensor = interpreter.tensor(index); + if (tensor->name == nullptr) { + return errors::Internal(input_str, + " name missing for tensor index: ", index); + } + TensorInfo info; + TF_RETURN_IF_ERROR(TfLiteTensorToTensorInfo(tensor, &info)); + if (!infomap->emplace(tensor->name, std::pair(info, index)) + .second) { + return errors::AlreadyExists(input_str, " tensor name: ", tensor->name, + " has multiple indices"); + } + } + return Status::OK(); +} + +std::vector TensorDims(const Tensor& tensor) { + std::vector dims; + dims.reserve(tensor.dims()); + for (int i = 0; i < tensor.dims(); ++i) { + dims.push_back(static_cast(tensor.dim_size(i))); + } + return dims; +} + +Status FillTfLiteTensorFromInput(const string& name, const Tensor& tensor, + tflite::Interpreter* interpreter, int index) { + auto tflite_tensor = interpreter->tensor(index); + if (tflite_tensor == nullptr) { + return errors::InvalidArgument("Failed to get TFLite tensor: ", name, + " at index: ", index); + } + if (tflite_tensor->type != kTfLiteString) { + auto tensor_bytes = tensor.tensor_data(); + if (tensor_bytes.size() != tflite_tensor->bytes) { + // Slow path: needs resize+realloc. + // TODO(b/140959776): Reduce the chance of taking this path by either + // having multiple instances of interpreter or sub-graphs for commonly + // used input sizes. + if (interpreter->ResizeInputTensor(index, TensorDims(tensor)) != + kTfLiteOk) { + return errors::Internal("Failed to resize input tensor: ", name, + " from ", tflite_tensor->bytes, " to ", + tensor_bytes.size(), " bytes."); + } + if (interpreter->AllocateTensors() != kTfLiteOk) { + return errors::Internal( + "Failed to AllocateTensors() due to change in input tensor ", name, + " size from ", tflite_tensor->bytes, " to ", tensor_bytes.size(), + " bytes."); + } + } + std::memcpy(tflite_tensor->data.raw, tensor_bytes.data(), + tensor_bytes.size()); + } else { + tflite::DynamicBuffer buf; + auto tensor_vec = tensor.vec(); + for (int i = 0; i < tensor_vec.size(); i++) { + buf.AddString(tensor_vec(i).data(), tensor_vec(i).size()); + } + buf.WriteToTensor(tflite_tensor, /*new_shape=*/nullptr); + } + return Status::OK(); +} + +} // namespace + +Status TfLiteSession::Create(string&& buffer, + std::unique_ptr* tflite_session, + ::google::protobuf::Map* signatures) { + auto model = tflite::FlatBufferModel::BuildFromModel( + flatbuffers::GetRoot(buffer.data())); + if (model == nullptr) { + return errors::InvalidArgument("Cannot build FlatBufferModel from buffer."); + } + + // TODO(b/140959776): Add support for non-builtin ops (flex or custom ops). + tflite::ops::builtin::BuiltinOpResolver resolver; + std::unique_ptr interpreter; + if (tflite::InterpreterBuilder(*model, resolver)(&interpreter) != kTfLiteOk) { + return errors::Internal("Cannot build Interpreter from buffer."); + } + if (interpreter->AllocateTensors() != kTfLiteOk) { + return errors::Internal("Cannot allocator tensors in Interpreter."); + } + + TensorInfoMap inputs; + TF_RETURN_IF_ERROR(GetTensorInfoMap(*interpreter, true, &inputs)); + TensorInfoMap outputs; + TF_RETURN_IF_ERROR(GetTensorInfoMap(*interpreter, false, &outputs)); + + std::map input_tensor_to_index; + std::map output_tensor_to_index; + + // Build a default SignatureDef map. + // TODO(b/140959776): Add support to read this map from tflite model. + signatures->clear(); + SignatureDef* sigdef = &(*signatures)[kDefaultServingSignatureDefKey]; + for (const auto& info : inputs) { + (*sigdef->mutable_inputs())[info.first] = info.second.first; + input_tensor_to_index[info.first] = info.second.second; + } + for (const auto& info : outputs) { + (*sigdef->mutable_outputs())[info.first] = info.second.first; + output_tensor_to_index[info.first] = info.second.second; + } + sigdef->set_method_name(kPredictMethodName); + + tflite_session->reset(new TfLiteSession( + std::move(input_tensor_to_index), std::move(output_tensor_to_index), + std::move(buffer), std::move(model), std::move(interpreter))); + return Status::OK(); +} + +TfLiteSession::TfLiteSession(std::map&& input_tensor_to_index, + std::map&& output_tensor_to_index, + string&& buffer, + std::unique_ptr model, + std::unique_ptr interpreter) + : input_tensor_to_index_(std::move(input_tensor_to_index)), + output_tensor_to_index_(std::move(output_tensor_to_index)), + model_serialized_bytes_(std::move(buffer)), + model_(std::move(model)), + interpreter_(std::move(interpreter)) {} + +Status TfLiteSession::Run(const std::vector>& inputs, + const std::vector& output_tensor_names, + const std::vector& target_node_names, + std::vector* outputs) { + RunMetadata run_metadata; + return Run(RunOptions(), inputs, output_tensor_names, target_node_names, + outputs, &run_metadata); +} + +Status TfLiteSession::Run(const RunOptions& run_options, + const std::vector>& inputs, + const std::vector& output_tensor_names, + const std::vector& target_node_names, + std::vector* outputs, + RunMetadata* run_metadata) { + // TODO(b/140959776): Remove serialized Run() calls, and support + // multi-threaded execution -- allowing multiple Run() calls to + // happen in-parallel. + absl::MutexLock lock(&mutex_); + for (const auto& input : inputs) { + const string& name = TfLiteToTensorName(input.first); + if (input_tensor_to_index_.find(name) == input_tensor_to_index_.end()) { + return errors::InvalidArgument("Missing input TFLite tensor: ", name); + } + const int index = input_tensor_to_index_.at(name); + TF_RETURN_IF_ERROR(FillTfLiteTensorFromInput(name, input.second, + interpreter_.get(), index)); + } + + if (interpreter_->Invoke() != kTfLiteOk) { + return errors::Internal("Failed to run interpreter."); + } + + outputs->clear(); + for (const auto& tfname : output_tensor_names) { + const string& name = TfLiteToTensorName(tfname); + if (output_tensor_to_index_.find(name) == output_tensor_to_index_.end()) { + return errors::InvalidArgument("Missing output TFLite tensor: ", name); + } + const int index = output_tensor_to_index_.at(name); + auto* tflite_tensor = interpreter_->tensor(index); + if (tflite_tensor == nullptr) { + return errors::InvalidArgument( + "Failed to get output TFLite tensor: ", name, " at index: ", index); + } + + DataType tf_type; + TF_RETURN_IF_ERROR(TfLiteTypeToTfType(tflite_tensor->type, &tf_type)); + + TensorShape shape; + for (int i = 0; i < tflite_tensor->dims->size; i++) { + shape.AddDim(tflite_tensor->dims->data[i]); + } + outputs->emplace_back(Tensor(tf_type, shape)); + auto tensor_bytes = outputs->back().tensor_data(); + if (tflite_tensor->bytes != tensor_bytes.size()) { + return errors::Internal( + "Failed to convert output tensor: ", name, + " to TFLite tensor. Size mismatch: ", tensor_bytes.size(), " vs ", + tflite_tensor->bytes); + } + std::memcpy(const_cast(tensor_bytes.data()), tflite_tensor->data.raw, + tflite_tensor->bytes); + } + return Status::OK(); +} + +Status TfLiteSession::ListDevices(std::vector* response) { + return errors::Unimplemented("ListDevices is not yet supported."); +} + +} // namespace serving +} // namespace tensorflow diff --git a/tensorflow_serving/servables/tensorflow/tflite_session.h b/tensorflow_serving/servables/tensorflow/tflite_session.h new file mode 100644 index 00000000000..0970ffe6c04 --- /dev/null +++ b/tensorflow_serving/servables/tensorflow/tflite_session.h @@ -0,0 +1,81 @@ +/* Copyright 2019 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_TFLITE_SESSION_H_ +#define TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_TFLITE_SESSION_H_ + +#include +#include +#include + +#include "absl/base/thread_annotations.h" +#include "absl/synchronization/mutex.h" +#include "tensorflow/core/lib/core/status.h" +#include "tensorflow/core/platform/file_system.h" +#include "tensorflow/core/protobuf/meta_graph.pb.h" +#include "tensorflow/lite/interpreter.h" +#include "tensorflow/lite/model.h" +#include "tensorflow_serving/servables/tensorflow/serving_session.h" + +namespace tensorflow { +namespace serving { + +// A session to run inference on a TensorFlow Lite model. +// +// EXPERIMENTAL: DO NOT use for production workloads. +class TfLiteSession : public ServingSession { + public: + // Creates a TfLiteSession object from `buffer` representing serialized + // TFLite flatbuffer model. Also returns the SignatureDef map based on + // input/outputs to the model. + static Status Create(string&& buffer, + std::unique_ptr* tflite_session, + ::google::protobuf::Map* signatures); + + ~TfLiteSession() override = default; + + Status Run(const std::vector>& inputs, + const std::vector& output_tensor_names, + const std::vector& target_node_names, + std::vector* outputs) override; + + Status Run(const RunOptions& run_options, + const std::vector>& inputs, + const std::vector& output_tensor_names, + const std::vector& target_node_names, + std::vector* outputs, RunMetadata* run_metadata) override; + + Status ListDevices(std::vector* response) override; + + private: + TfLiteSession(std::map&& input_tensor_to_index, + std::map&& output_tensor_to_index, string&& buffer, + std::unique_ptr model, + std::unique_ptr interpreter); + + const std::map input_tensor_to_index_; + const std::map output_tensor_to_index_; + const string model_serialized_bytes_; + const std::unique_ptr model_; + mutable absl::Mutex mutex_; + std::unique_ptr interpreter_ ABSL_GUARDED_BY(mutex_); + + TF_DISALLOW_COPY_AND_ASSIGN(TfLiteSession); +}; + +} // namespace serving +} // namespace tensorflow + +#endif // TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_TFLITE_SESSION_H_ diff --git a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc new file mode 100644 index 00000000000..bee6ed27a54 --- /dev/null +++ b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc @@ -0,0 +1,97 @@ +/* Copyright 2019 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow_serving/servables/tensorflow/tflite_session.h" + +#include +#include +#include + +#include +#include +#include "tensorflow/core/framework/tensor_testutil.h" +#include "tensorflow/core/framework/types.pb.h" +#include "tensorflow/core/lib/core/status_test_util.h" +#include "tensorflow/core/platform/env.h" +#include "tensorflow/core/platform/logging.h" +#include "tensorflow_serving/test_util/test_util.h" + +namespace tensorflow { +namespace serving { +namespace { + +constexpr char kTestModel[] = + "/servables/tensorflow/testdata/saved_model_half_plus_two_tflite/00000123/" + "model.tflite"; + +TEST(TfLiteSession, BasicTest) { + string model_bytes; + TF_ASSERT_OK(ReadFileToString(tensorflow::Env::Default(), + test_util::TestSrcDirPath(kTestModel), + &model_bytes)); + + ::google::protobuf::Map signatures; + std::unique_ptr session; + TF_EXPECT_OK( + TfLiteSession::Create(std::move(model_bytes), &session, &signatures)); + EXPECT_EQ(signatures.size(), 1); + EXPECT_EQ(signatures.begin()->first, "serving_default"); + EXPECT_THAT(signatures.begin()->second, test_util::EqualsProto(R"( + inputs { + key: "x" + value { + name: "x" + dtype: DT_FLOAT + tensor_shape { + dim { size: 1 } + dim { size: 1 } + } + } + } + outputs { + key: "y" + value { + name: "y" + dtype: DT_FLOAT + tensor_shape { + dim { size: 1 } + dim { size: 1 } + } + } + } + method_name: "tensorflow/serving/predict" + )")); + Tensor input = test::AsTensor({1.0, 2.0, 3.0}, TensorShape({3})); + { + // Use TF Lite tensor names. + std::vector outputs; + TF_EXPECT_OK(session->Run({{"x", input}}, {"y"}, {}, &outputs)); + ASSERT_EQ(outputs.size(), 1); + test::ExpectTensorEqual( + outputs[0], test::AsTensor({2.5, 3, 3.5}, TensorShape({3}))); + } + { + // Use TF tensor names (with `:0` suffix). + std::vector outputs; + TF_EXPECT_OK(session->Run({{"x:0", input}}, {"y:0"}, {}, &outputs)); + ASSERT_EQ(outputs.size(), 1); + test::ExpectTensorEqual( + outputs[0], test::AsTensor({2.5, 3, 3.5}, TensorShape({3}))); + } +} + +} // namespace +} // namespace serving +} // namespace tensorflow From d16ceafa044932e2d9ef84bbe1a6ae5c6356252f Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Mon, 23 Sep 2019 14:52:38 -0700 Subject: [PATCH 3475/8103] Add ability to load+run TF Lite model in ModelServer. TF Lite model is expected to be named as `model.tflite` the way existing SavedModel model is assumed to be named as `saved_model.pb` in the model directory. `--use_tflite_model` flag enables this feature. Default is false/disabled. This is very EXPERIMENTAL, NOT for use in production. PiperOrigin-RevId: 270766394 --- tensorflow_serving/model_servers/BUILD | 1 + tensorflow_serving/model_servers/main.cc | 7 +- tensorflow_serving/model_servers/server.cc | 1 + tensorflow_serving/model_servers/server.h | 1 + .../tensorflow_model_server_test.py | 19 +++++ tensorflow_serving/servables/tensorflow/BUILD | 3 + .../tensorflow/bundle_factory_test.h | 22 ++++-- .../tensorflow/bundle_factory_test_util.cc | 15 ++-- .../tensorflow/bundle_factory_test_util.h | 5 +- .../tensorflow/saved_model_bundle_factory.cc | 39 +++++++++- .../saved_model_bundle_factory_test.cc | 78 +++++++++++++++---- .../tensorflow/session_bundle_config.proto | 6 ++ 12 files changed, 162 insertions(+), 35 deletions(-) diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index c178bd209ae..15277400ee6 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -396,6 +396,7 @@ py_test( "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_three/00000123/variables/variables.data-00000-of-00001", "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_three/00000123/variables/variables.index", "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_cpu", + "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_tflite", ], python_version = "PY2", srcs_version = "PY2AND3", diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index 5341b34fb34..2b83500692d 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -187,7 +187,12 @@ int main(int argc, char** argv) { "remove_unused_fields_from_bundle_metagraph", &options.remove_unused_fields_from_bundle_metagraph, "Removes unused fields from MetaGraphDef proto message to save " - "memory.")}; + "memory."), + tensorflow::Flag("use_tflite_model", &options.use_tflite_model, + "EXPERIMENTAL; CAN BE REMOVED ANYTIME! Load and use " + "TensorFlow Lite model from `model.tflite` file in " + "SavedModel directory instead of the TensorFlow model " + "from `saved_model.pb` file.")}; const auto& usage = tensorflow::Flags::Usage(argv[0], flag_list); if (!tensorflow::Flags::Parse(&argc, argv, flag_list)) { diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index 460fca1b572..9808f9ad193 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -267,6 +267,7 @@ Status Server::BuildAndStart(const Options& server_options) { } session_bundle_config.set_remove_unused_fields_from_bundle_metagraph( server_options.remove_unused_fields_from_bundle_metagraph); + session_bundle_config.set_use_tflite_model(server_options.use_tflite_model); options.platform_config_map = CreateTensorFlowPlatformConfigMap( session_bundle_config, use_saved_model); } else { diff --git a/tensorflow_serving/model_servers/server.h b/tensorflow_serving/model_servers/server.h index 76840d71ce8..7738f290f82 100644 --- a/tensorflow_serving/model_servers/server.h +++ b/tensorflow_serving/model_servers/server.h @@ -82,6 +82,7 @@ class Server { // Tensorflow session run options. bool enforce_session_run_timeout = true; bool remove_unused_fields_from_bundle_metagraph = true; + bool use_tflite_model = false; Options(); }; diff --git a/tensorflow_serving/model_servers/tensorflow_model_server_test.py b/tensorflow_serving/model_servers/tensorflow_model_server_test.py index d440e97e218..35a1318ee91 100644 --- a/tensorflow_serving/model_servers/tensorflow_model_server_test.py +++ b/tensorflow_serving/model_servers/tensorflow_model_server_test.py @@ -154,6 +154,7 @@ def GetArgsKey(*args, **kwargs): @staticmethod def RunServer(model_name, model_path, + model_type='tf', model_config_file=None, monitoring_config_file=None, batching_parameters_file=None, @@ -170,6 +171,7 @@ def RunServer(model_name, Args: model_name: Name of model. model_path: Path to model. + model_type: Type of model TensorFlow ('tf') or TF Lite ('tflite'). model_config_file: Path to model config file. monitoring_config_file: Path to the monitoring config file. batching_parameters_file: Path to batching parameters. @@ -209,6 +211,9 @@ def RunServer(model_name, else: raise ValueError('Both model_config_file and model_path cannot be empty!') + if model_type == 'tflite': + command += ' --use_tflite_model=true' + if monitoring_config_file: command += ' --monitoring_config_file=' + monitoring_config_file @@ -320,6 +325,10 @@ def _GetSavedModelHalfPlusThreePath(self): """Returns a path to a half_plus_three model in SavedModel format.""" return os.path.join(self.testdata_dir, 'saved_model_half_plus_three') + def _GetTfLiteModelPath(self): + """Returns a path to a model in TF Lite format.""" + return os.path.join(self.testdata_dir, 'saved_model_half_plus_two_tflite') + def _GetSessionBundlePath(self): """Returns a path to a model in SessionBundle format.""" return os.path.join(self.testdata_dir, 'half_plus_two') @@ -879,6 +888,16 @@ def testPredictUDS(self): expected_version=self._GetModelVersion( self._GetSavedModelHalfPlusThreePath())) + def testPredictOnTfLite(self): + """Test saved model prediction on a TF Lite mode.""" + model_server_address = TensorflowModelServerTest.RunServer( + 'default', self._GetTfLiteModelPath(), model_type='tflite')[1] + self.VerifyPredictRequest( + model_server_address, + expected_output=3.0, + specify_output=False, + expected_version=self._GetModelVersion(self._GetTfLiteModelPath())) + def test_tf_saved_model_save(self): base_path = os.path.join(self.get_temp_dir(), 'tf_saved_model_save') export_path = os.path.join(base_path, '00000123') diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index 3ec73133176..05138ea7e73 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -171,9 +171,11 @@ cc_library( ":bundle_factory_util", ":curried_session", ":session_bundle_config_proto", + ":tflite_session", "//tensorflow_serving/batching:batching_session", "//tensorflow_serving/core:loader", "//tensorflow_serving/resources:resources_proto", + "@com_google_absl//absl/strings", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/cc/saved_model:tag_constants", "@org_tensorflow//tensorflow/contrib/session_bundle:bundle_shim", @@ -189,6 +191,7 @@ cc_test( size = "medium", srcs = ["saved_model_bundle_factory_test.cc"], data = [ + "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_tflite", "@org_tensorflow//tensorflow/cc/saved_model:saved_model_half_plus_two", "@org_tensorflow//tensorflow/contrib/session_bundle:session_bundle_half_plus_two", ], diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_test.h b/tensorflow_serving/servables/tensorflow/bundle_factory_test.h index c2c7fd5cb9b..d1024838b12 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_test.h +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_test.h @@ -50,14 +50,14 @@ class BundleFactoryTest : public ::testing::Test { protected: // Test functions to be used by subclasses. void TestBasic() const { - const SessionBundleConfig config; + const SessionBundleConfig config = GetSessionBundleConfig(); std::unique_ptr session; TF_ASSERT_OK(CreateSession(config, &session)); TestSingleRequest(session.get()); } void TestBatching() const { - SessionBundleConfig config; + SessionBundleConfig config = GetSessionBundleConfig(); BatchingParameters *batching_params = config.mutable_batching_parameters(); batching_params->mutable_max_batch_size()->set_value(2); batching_params->mutable_max_enqueued_batches()->set_value(INT_MAX); @@ -72,7 +72,7 @@ class BundleFactoryTest : public ::testing::Test { template void TestEstimateResourceRequirementWithGoodExport( double total_file_size) const { - const SessionBundleConfig config; + const SessionBundleConfig config = GetSessionBundleConfig(); std::unique_ptr factory; TF_ASSERT_OK(FactoryType::Create(config, &factory)); ResourceAllocation actual; @@ -83,7 +83,9 @@ class BundleFactoryTest : public ::testing::Test { } void TestRunOptions() const { - SessionBundleConfig config; + if (!IsRunOptionsSupported()) return; + + SessionBundleConfig config = GetSessionBundleConfig(); // Configure the session-config with two threadpools. The first is setup // with default settings. The second is explicitly setup with 1 thread. @@ -104,8 +106,10 @@ class BundleFactoryTest : public ::testing::Test { } void TestRunOptionsError() const { + if (!IsRunOptionsSupported()) return; + // Session bundle config with the default global threadpool. - SessionBundleConfig config; + SessionBundleConfig config = GetSessionBundleConfig(); // Invalid threadpool index to use for session-run calls. config.mutable_session_run_load_threadpool_index()->set_value(100); @@ -124,6 +128,14 @@ class BundleFactoryTest : public ::testing::Test { // Creates a Session with the given configuration and export path. virtual Status CreateSession(const SessionBundleConfig &config, std::unique_ptr *session) const = 0; + + // Returns a SessionBundleConfig. + virtual SessionBundleConfig GetSessionBundleConfig() const { + return SessionBundleConfig(); + } + + // Returns true if RunOptions is supported by underlying session. + virtual bool IsRunOptionsSupported() const { return true; } }; } // namespace test_util diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_test_util.cc b/tensorflow_serving/servables/tensorflow/bundle_factory_test_util.cc index fc8f327c8f6..7065539cce6 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_test_util.cc +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_test_util.cc @@ -35,6 +35,8 @@ const char kTestSavedModelPath[] = "cc/saved_model/testdata/half_plus_two/00000123"; const char kTestSessionBundleExportPath[] = "session_bundle/testdata/half_plus_two/00000123"; +const char kTestTfLiteModelPath[] = + "servables/tensorflow/testdata/saved_model_half_plus_two_tflite/00000123"; } // namespace @@ -46,14 +48,8 @@ string GetTestSessionBundleExportPath() { return test_util::ContribTestSrcDirPath(kTestSessionBundleExportPath); } -std::vector GetTestSavedModelFiles() { - const string dir = GetTestSavedModelPath(); - return {tensorflow::io::JoinPath(dir, kSavedModelAssetsDirectory, "foo.txt"), - tensorflow::io::JoinPath(dir, kSavedModelFilenamePb), - tensorflow::io::JoinPath(dir, kSavedModelVariablesFilename, - "variables.data-00000-of-00001"), - tensorflow::io::JoinPath(dir, kSavedModelVariablesFilename, - "variables.index")}; +string GetTestTfLiteModelPath() { + return test_util::TestSrcDirPath(kTestTfLiteModelPath); } std::vector GetTestSessionBundleExportFiles() { @@ -65,7 +61,8 @@ std::vector GetTestSessionBundleExportFiles() { uint64 GetTotalFileSize(const std::vector& files) { uint64 total_file_size = 0; for (const string& file : files) { - if (!(Env::Default()->IsDirectory(file).ok())) { + if (!(Env::Default()->IsDirectory(file).ok()) && + Env::Default()->FileExists(file).ok()) { uint64 file_size; TF_CHECK_OK(Env::Default()->GetFileSize(file, &file_size)); total_file_size += file_size; diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_test_util.h b/tensorflow_serving/servables/tensorflow/bundle_factory_test_util.h index 946b2103f28..a2d31186284 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_test_util.h +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_test_util.h @@ -32,9 +32,8 @@ string GetTestSavedModelPath(); // Returns the Session Bundle export path for the half plus two model. string GetTestSessionBundleExportPath(); -// Returns the paths of the files of the Saved Model (the pb version) for the -// half plus two model. -std::vector GetTestSavedModelFiles(); +// Returns the path of TensorFlow Lite model for the half plus two model. +string GetTestTfLiteModelPath(); // Returns the paths of the files of the Session Bundle export for the half plus // two model. diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc index 4110bcdcb0d..113fe16972b 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc @@ -15,16 +15,19 @@ limitations under the License. #include "tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.h" +#include "absl/strings/string_view.h" #include "tensorflow/cc/saved_model/tag_constants.h" #include "tensorflow/contrib/session_bundle/bundle_shim.h" #include "tensorflow/core/framework/tensor.pb.h" #include "tensorflow/core/lib/core/errors.h" +#include "tensorflow/core/lib/io/path.h" #include "tensorflow/core/protobuf/config.pb.h" #include "tensorflow/core/protobuf/meta_graph.pb.h" #include "tensorflow/core/protobuf/named_tensor.pb.h" #include "tensorflow/core/public/session_options.h" #include "tensorflow_serving/servables/tensorflow/bundle_factory_util.h" #include "tensorflow_serving/servables/tensorflow/curried_session.h" +#include "tensorflow_serving/servables/tensorflow/tflite_session.h" namespace tensorflow { namespace serving { @@ -57,6 +60,32 @@ Status ParseFixedInputTensors( return Status::OK(); } +// TODO(b/140959776): Move this upstream alongside `kSavedModelFilenamePb`. +const char kTfLiteModelFilename[] = "model.tflite"; + +Status LoadTfLiteModel(const string& model_dir, SavedModelBundle* bundle) { + std::unique_ptr session; + + const string& fname = io::JoinPath(model_dir, kTfLiteModelFilename); + uint64 size; + TF_RETURN_IF_ERROR(Env::Default()->GetFileSize(fname, &size)); + + std::unique_ptr file; + TF_RETURN_IF_ERROR(Env::Default()->NewRandomAccessFile(fname, &file)); + + string model_bytes; + model_bytes.resize(size); + absl::string_view sv; + TF_RETURN_IF_ERROR(file->Read(0, size, &sv, &model_bytes[0])); + + std::unique_ptr tflite_session; + TF_RETURN_IF_ERROR( + TfLiteSession::Create(std::move(model_bytes), &tflite_session, + bundle->meta_graph_def.mutable_signature_def())); + bundle->session = std::move(tflite_session); + return Status::OK(); +} + } // namespace Status SavedModelBundleFactory::Create( @@ -109,9 +138,13 @@ Status SavedModelBundleFactory::InternalCreateSavedModelBundle( return result; }(); - TF_RETURN_IF_ERROR(LoadSessionBundleOrSavedModelBundle( - session_options, GetRunOptions(config_), path, saved_model_tags, - bundle->get())); + if (config_.use_tflite_model()) { + TF_RETURN_IF_ERROR(LoadTfLiteModel(path, bundle->get())); + } else { + TF_RETURN_IF_ERROR(LoadSessionBundleOrSavedModelBundle( + session_options, GetRunOptions(config_), path, saved_model_tags, + bundle->get())); + } if (!config_.experimental_fixed_input_tensors().empty()) { LOG(INFO) << "Wrapping session to inject fixed input tensors"; std::vector> fixed_input_tensors; diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory_test.cc b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory_test.cc index a8838950ccd..2d3caedaa00 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory_test.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory_test.cc @@ -23,11 +23,13 @@ limitations under the License. #include "google/protobuf/wrappers.pb.h" #include #include +#include "tensorflow/cc/saved_model/constants.h" #include "tensorflow/cc/saved_model/loader.h" #include "tensorflow/cc/saved_model/tag_constants.h" #include "tensorflow/core/framework/tensor_testutil.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/lib/core/status_test_util.h" +#include "tensorflow/core/lib/io/path.h" #include "tensorflow/core/protobuf/named_tensor.pb.h" #include "tensorflow/core/public/session.h" #include "tensorflow/core/public/version.h" @@ -42,6 +44,8 @@ namespace { enum class CreationType { kWithoutMetadata, kWithMetadata }; +enum class ModelType { kTfModel, kTfLiteModel }; + Loader::Metadata CreateMetadata() { return {ServableId{"name", 42}}; } // Creates a new session based on the config and export path. @@ -86,10 +90,13 @@ Status CreateBundleFromPath(const CreationType creation_type, // Tests SavedModelBundleFactory with native SavedModel. class SavedModelBundleFactoryTest : public test_util::BundleFactoryTest, - public ::testing::WithParamInterface { + public ::testing::WithParamInterface> { public: SavedModelBundleFactoryTest() - : test_util::BundleFactoryTest(test_util::GetTestSavedModelPath()) {} + : test_util::BundleFactoryTest( + GetParam().second == ModelType::kTfModel + ? test_util::GetTestSavedModelPath() + : test_util::GetTestTfLiteModelPath()) {} virtual ~SavedModelBundleFactoryTest() = default; @@ -98,15 +105,52 @@ class SavedModelBundleFactoryTest std::unique_ptr* session) const override { std::unique_ptr bundle; TF_RETURN_IF_ERROR( - CreateBundleFromPath(GetParam(), config, export_dir_, &bundle)); + CreateBundleFromPath(GetParam().first, config, export_dir_, &bundle)); *session = std::move(bundle->session); return Status::OK(); } + + SessionBundleConfig GetSessionBundleConfig() const override { + SessionBundleConfig config; + if (GetParam().second == ModelType::kTfLiteModel) { + config.set_use_tflite_model(true); + } + return config; + } + + bool IsRunOptionsSupported() const override { + // Presently TensorFlow Lite sessions do NOT support RunOptions. + return GetParam().second != ModelType::kTfLiteModel; + } + + std::vector GetModelFiles() { + switch (GetParam().second) { + case ModelType::kTfModel: { + const string& dir = test_util::GetTestSavedModelPath(); + return { + io::JoinPath(dir, kSavedModelAssetsDirectory, "foo.txt"), + io::JoinPath(dir, kSavedModelFilenamePb), + io::JoinPath(dir, kSavedModelVariablesFilename, + "variables.data-00000-of-00001"), + io::JoinPath(dir, kSavedModelVariablesFilename, "variables.index")}; + } + case ModelType::kTfLiteModel: { + return { + io::JoinPath(test_util::GetTestTfLiteModelPath(), "model.tflite")}; + } + default: + return {}; + } + } }; -INSTANTIATE_TEST_SUITE_P(CreationType, SavedModelBundleFactoryTest, - ::testing::Values(CreationType::kWithoutMetadata, - CreationType::kWithMetadata)); +INSTANTIATE_TEST_SUITE_P( + CreationType, SavedModelBundleFactoryTest, + ::testing::Values( + std::make_pair(CreationType::kWithoutMetadata, ModelType::kTfModel), + std::make_pair(CreationType::kWithoutMetadata, ModelType::kTfLiteModel), + std::make_pair(CreationType::kWithMetadata, ModelType::kTfModel), + std::make_pair(CreationType::kWithMetadata, ModelType::kTfLiteModel))); TEST_P(SavedModelBundleFactoryTest, Basic) { TestBasic(); } @@ -116,7 +160,7 @@ TEST_P(SavedModelBundleFactoryTest, FixedInputTensors) { fixed_input_proto.set_name("x:0"); fixed_input.AsProtoField(fixed_input_proto.mutable_tensor()); - SessionBundleConfig config; + SessionBundleConfig config = GetSessionBundleConfig(); *config.add_saved_model_tags() = kSavedModelTagServe; *config.add_experimental_fixed_input_tensors() = fixed_input_proto; std::unique_ptr session; @@ -138,20 +182,27 @@ TEST_P(SavedModelBundleFactoryTest, FixedInputTensors) { } TEST_P(SavedModelBundleFactoryTest, RemoveUnusedFieldsFromMetaGraphDefault) { - SessionBundleConfig config; + SessionBundleConfig config = GetSessionBundleConfig(); *config.add_saved_model_tags() = kSavedModelTagServe; std::unique_ptr bundle; - TF_ASSERT_OK(CreateBundleFromPath(GetParam(), config, export_dir_, &bundle)); - EXPECT_TRUE(bundle->meta_graph_def.has_graph_def()); + TF_ASSERT_OK( + CreateBundleFromPath(GetParam().first, config, export_dir_, &bundle)); + if (GetParam().second == ModelType::kTfLiteModel) { + // TF Lite model never has a graph_def. + EXPECT_FALSE(bundle->meta_graph_def.has_graph_def()); + } else { + EXPECT_TRUE(bundle->meta_graph_def.has_graph_def()); + } EXPECT_FALSE(bundle->meta_graph_def.signature_def().empty()); } TEST_P(SavedModelBundleFactoryTest, RemoveUnusedFieldsFromMetaGraphEnabled) { - SessionBundleConfig config; + SessionBundleConfig config = GetSessionBundleConfig(); *config.add_saved_model_tags() = kSavedModelTagServe; config.set_remove_unused_fields_from_bundle_metagraph(true); std::unique_ptr bundle; - TF_ASSERT_OK(CreateBundleFromPath(GetParam(), config, export_dir_, &bundle)); + TF_ASSERT_OK( + CreateBundleFromPath(GetParam().first, config, export_dir_, &bundle)); EXPECT_FALSE(bundle->meta_graph_def.has_graph_def()); EXPECT_FALSE(bundle->meta_graph_def.signature_def().empty()); } @@ -159,8 +210,7 @@ TEST_P(SavedModelBundleFactoryTest, RemoveUnusedFieldsFromMetaGraphEnabled) { TEST_P(SavedModelBundleFactoryTest, Batching) { TestBatching(); } TEST_P(SavedModelBundleFactoryTest, EstimateResourceRequirementWithGoodExport) { - const double kTotalFileSize = - test_util::GetTotalFileSize(test_util::GetTestSavedModelFiles()); + const double kTotalFileSize = test_util::GetTotalFileSize(GetModelFiles()); TestEstimateResourceRequirementWithGoodExport( kTotalFileSize); } diff --git a/tensorflow_serving/servables/tensorflow/session_bundle_config.proto b/tensorflow_serving/servables/tensorflow/session_bundle_config.proto index 0ff52809256..1d6ca90c981 100644 --- a/tensorflow_serving/servables/tensorflow/session_bundle_config.proto +++ b/tensorflow_serving/servables/tensorflow/session_bundle_config.proto @@ -83,6 +83,12 @@ message SessionBundleConfig { // This message is stored alongside the `Session` object. Removing unwanted // fields helps reduce memory footprint. bool remove_unused_fields_from_bundle_metagraph = 782; + + // EXPERIMENTAL. THIS FIELD MAY CHANGE OR GO AWAY. USE WITH CAUTION. + // + // Use TensorFlow Lite model from `model.tflite` file in SavedModel directory, + // instead of the TensorFlow model from `saved_model.pb` file. + bool use_tflite_model = 783; } // Batching parameters. Each individual parameter is optional. If omitted, the From 1b65af1d7fee4fe79b4152f94d5ea422e8a79cca Mon Sep 17 00:00:00 2001 From: Chao Xie Date: Thu, 26 Sep 2019 09:50:54 -0700 Subject: [PATCH 3476/8103] Add a section in the documentation for testing custom op manually. PiperOrigin-RevId: 271370683 --- tensorflow_serving/g3doc/custom_op.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/tensorflow_serving/g3doc/custom_op.md b/tensorflow_serving/g3doc/custom_op.md index 51004d4f8fd..a119211db56 100644 --- a/tensorflow_serving/g3doc/custom_op.md +++ b/tensorflow_serving/g3doc/custom_op.md @@ -91,10 +91,24 @@ tools/run_in_docker.sh bazel build tensorflow_serving/model_servers:tensorflow_m ## Serve a model containing your custom op -You can now run the ModelServer binary and start serving your model: +You can now run the ModelServer binary and start serving a model that contains +this custom op: ```bash tools/run_in_docker.sh -o "-p 8501:8501" \ bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server \ --rest_api_port=8501 --model_name= --model_base_path= ``` + +## Send an inference request to test op manually + +You can now send an inference request to the model server to test your custom +op: + +```bash +curl http://localhost:8501/v1/models/:predict -X POST \ +-d '{"inputs": [[1,2], [3,4]]}' +``` + +[This page](https://www.tensorflow.org/tfx/serving/api_rest#top_of_page) +contains a more complete API for sending REST requests to the model server. From 14112359d16b3e1e275c2ba70b0e078ce4863783 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Thu, 26 Sep 2019 12:17:26 -0700 Subject: [PATCH 3477/8103] Add ops delegate library to enable running TF ops. For details see: https://www.tensorflow.org/lite/guide/ops_select#c PiperOrigin-RevId: 271404104 --- tensorflow_serving/servables/tensorflow/BUILD | 1 + 1 file changed, 1 insertion(+) diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index 05138ea7e73..8640d8e587f 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -437,6 +437,7 @@ cc_library( "@org_tensorflow//tensorflow/lite:framework", "@org_tensorflow//tensorflow/lite:string_util", "@org_tensorflow//tensorflow/lite/core/api", + "@org_tensorflow//tensorflow/lite/delegates/flex:delegate", "@org_tensorflow//tensorflow/lite/kernels:builtin_ops", ], ) From 0b0254d4a90550b1d7228334187e624bf4b31c37 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Fri, 27 Sep 2019 13:01:54 -0700 Subject: [PATCH 3478/8103] Add command line tool to load TF Lite model for manual testing/debugging. PiperOrigin-RevId: 271630504 --- tensorflow_serving/servables/tensorflow/BUILD | 15 ++++- .../tensorflow/tflite_session_main.cc | 57 +++++++++++++++++++ 2 files changed, 69 insertions(+), 3 deletions(-) create mode 100644 tensorflow_serving/servables/tensorflow/tflite_session_main.cc diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index 8640d8e587f..d8b9d62d1af 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -171,7 +171,7 @@ cc_library( ":bundle_factory_util", ":curried_session", ":session_bundle_config_proto", - ":tflite_session", + ":tflite_session_lib", "//tensorflow_serving/batching:batching_session", "//tensorflow_serving/core:loader", "//tensorflow_serving/resources:resources_proto", @@ -423,7 +423,7 @@ cc_test( ) cc_library( - name = "tflite_session", + name = "tflite_session_lib", srcs = ["tflite_session.cc"], hdrs = ["tflite_session.h"], deps = [ @@ -450,7 +450,7 @@ cc_test( "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_tflite", ], deps = [ - ":tflite_session", + ":tflite_session_lib", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", "@org_tensorflow//tensorflow/core:lib", @@ -460,6 +460,15 @@ cc_test( ], ) +cc_binary( + name = "tflite_session", + srcs = ["tflite_session_main.cc"], + deps = [ + ":tflite_session_lib", + "@org_tensorflow//tensorflow/core:framework", + ], +) + cc_library( name = "predict_impl", srcs = ["predict_impl.cc"], diff --git a/tensorflow_serving/servables/tensorflow/tflite_session_main.cc b/tensorflow_serving/servables/tensorflow/tflite_session_main.cc new file mode 100644 index 00000000000..47e5578fb5c --- /dev/null +++ b/tensorflow_serving/servables/tensorflow/tflite_session_main.cc @@ -0,0 +1,57 @@ +/* Copyright 2019 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// Command line tool to create TF Lite Session from a TF Lite model file. + +#include +#include +#include + +#include "tensorflow/core/platform/env.h" +#include "tensorflow/core/platform/init_main.h" +#include "tensorflow_serving/servables/tensorflow/tflite_session.h" + +int main(int argc, char** argv) { + if (argc != 2) { + std::cerr << "ERROR: Missing filename. Usage: " << argv[0] + << " " << std::endl; + return 1; + } + + tensorflow::port::InitMain(argv[0], &argc, &argv); + + const std::string filename(argv[1]); + std::string model_bytes; + auto status = + ReadFileToString(tensorflow::Env::Default(), filename, &model_bytes); + if (!status.ok()) { + std::cerr << "ERROR: Failed to read model file: " << filename + << " with error: " << status << std::endl; + return 1; + } + + ::google::protobuf::Map signatures; + std::unique_ptr session; + status = tensorflow::serving::TfLiteSession::Create(std::move(model_bytes), + &session, &signatures); + if (!status.ok()) { + std::cerr << "ERROR: Failed to create TF Lite session with error: " + << status << std::endl; + return 1; + } + std::cout << "Successfully created TF Lite Session for model file: " + << filename << std::endl; + return 0; +} From e9cdda61ec4ec6da3978e793b6f919a455bd2a70 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Tue, 1 Oct 2019 12:30:29 -0700 Subject: [PATCH 3479/8103] Update few build repos to match with TF versions. This seems to get rid of @zlib errors during local OSS builds. PiperOrigin-RevId: 272269069 --- WORKSPACE | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 13c19d8e3f3..5bff90d9b40 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -8,7 +8,6 @@ workspace(name = "tf_serving") # 3. Request the new archive to be mirrored on mirror.bazel.build for more # reliable downloads. load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") - tensorflow_http_archive( name = "org_tensorflow", sha256 = "b4203ed72a321915e405cf55f4679c6997afe71036bd91dbde090c332fc3fd86", @@ -16,33 +15,29 @@ tensorflow_http_archive( ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") - # START: Upstream TensorFlow dependencies # TensorFlow build depends on these dependencies. # Needs to be in-sync with TensorFlow sources. http_archive( name = "io_bazel_rules_closure", - sha256 = "ddce3b3a3909f99b28b25071c40b7fec7e2e1d1d1a4b2e933f3082aa99517105", - strip_prefix = "rules_closure-316e6133888bfc39fb860a4f1a31cfcbae485aef", + sha256 = "5b00383d08dd71f28503736db0500b6fb4dda47489ff5fc6bed42557c07c6ba9", + strip_prefix = "rules_closure-308b05b2419edb5c8ee0471b67a40403df940149", urls = [ - "https://mirror.bazel.build/github.com/bazelbuild/rules_closure/archive/316e6133888bfc39fb860a4f1a31cfcbae485aef.tar.gz", - "https://github.com/bazelbuild/rules_closure/archive/316e6133888bfc39fb860a4f1a31cfcbae485aef.tar.gz", # 2019-03-21 + "https://storage.googleapis.com/mirror.tensorflow.org/github.com/bazelbuild/rules_closure/archive/308b05b2419edb5c8ee0471b67a40403df940149.tar.gz", + "https://github.com/bazelbuild/rules_closure/archive/308b05b2419edb5c8ee0471b67a40403df940149.tar.gz", # 2019-06-13 ], ) http_archive( name = "bazel_skylib", - sha256 = "2c62d8cd4ab1e65c08647eb4afe38f51591f43f7f0885e7769832fa137633dcb", - strip_prefix = "bazel-skylib-0.7.0", - urls = ["https://github.com/bazelbuild/bazel-skylib/archive/0.7.0.tar.gz"], -) + sha256 = "2ef429f5d7ce7111263289644d233707dba35e39696377ebab8b0bc701f7818e", + urls = ["https://github.com/bazelbuild/bazel-skylib/releases/download/0.8.0/bazel-skylib.0.8.0.tar.gz"], +) # https://github.com/bazelbuild/bazel-skylib/releases # END: Upstream TensorFlow dependencies # Please add all new TensorFlow Serving dependencies in workspace.bzl. load("//tensorflow_serving:workspace.bzl", "tf_serving_workspace") - tf_serving_workspace() # Specify the minimum required bazel version. load("@org_tensorflow//tensorflow:version_check.bzl", "check_bazel_version_at_least") - check_bazel_version_at_least("0.24.1") From 12813143b22616091388e7659d7f69cfcf518269 Mon Sep 17 00:00:00 2001 From: Pedram Pejman Date: Thu, 3 Oct 2019 20:39:47 -0700 Subject: [PATCH 3480/8103] Fixes broken relative docs links PiperOrigin-RevId: 272799180 --- tensorflow_serving/g3doc/serving_config.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tensorflow_serving/g3doc/serving_config.md b/tensorflow_serving/g3doc/serving_config.md index 2fe19dcde42..d14e9300108 100644 --- a/tensorflow_serving/g3doc/serving_config.md +++ b/tensorflow_serving/g3doc/serving_config.md @@ -237,7 +237,7 @@ to realize better throughput. The scheduling for this batching is done globally for all models and model versions on the server to ensure the best possible utilization of the underlying resources no matter how many models or model versions are currently being served by the server -([more details](../batching/README.md#servers-with-multiple-models-model-versions-or-subtasks)). +([more details](http://github.com/tensorflow/serving/tree/master/tensorflow_serving/batching/README.md#servers-with-multiple-models-model-versions-or-subtasks)). You may enable this behavior by setting the `--enable_batching` flag and control it by passing a config to the `--batching_parameters_file` flag. @@ -250,16 +250,17 @@ max_enqueued_batches { value: 1000000 } num_batch_threads { value: 8 } ``` -Please refer to the [batching guide](../batching/README.md) for an in-depth -discussion and refer to the -[section on parameters](../batching/README.md#batch-scheduling-parameters-and-tuning) +Please refer to the +[batching guide](http://github.com/tensorflow/serving/tree/master/tensorflow_serving/batching/README.md) +for an in-depth discussion and refer to the +[section on parameters](http://github.com/tensorflow/serving/tree/master/tensorflow_serving/batching/README.md#batch-scheduling-parameters-and-tuning) to understand how to set the parameters. ## Miscellaneous Flags In addition to the flags covered so far in the guide, here we list a few other notable ones. For a complete list, please refer to the -[source code](../model_servers/main.cc#L59). +[source code](http://github.com/tensorflow/serving/tree/master/tensorflow_serving/model_servers/main.cc#L59). * `--port`: Port to listen on for gRPC API * `--rest_api_port`: Port to listen on for HTTP/REST API From 81ed5ef2307eea4c9396fd34f33673be072cdcf3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 4 Oct 2019 10:30:24 -0700 Subject: [PATCH 3481/8103] Cleaning up BUILD visibility for tf_pyclif_proto_library intermediate targets. PiperOrigin-RevId: 272904639 --- tensorflow_serving/apis/BUILD | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tensorflow_serving/apis/BUILD b/tensorflow_serving/apis/BUILD index acff5308151..d1f1134b699 100644 --- a/tensorflow_serving/apis/BUILD +++ b/tensorflow_serving/apis/BUILD @@ -64,6 +64,7 @@ serving_proto_library_py( tf_pyclif_proto_library( name = "input_pyclif", + deprecated_proto_lib_visibility = True, # TODO(b/136847937) proto_lib = ":input_proto", proto_srcfile = "input.proto", ) @@ -91,6 +92,7 @@ serving_proto_library_py( tf_pyclif_proto_library( name = "model_pyclif", + deprecated_proto_lib_visibility = True, # TODO(b/136847937) proto_lib = ":model_proto", proto_srcfile = "model.proto", ) @@ -186,6 +188,7 @@ py_library( tf_pyclif_proto_library( name = "predict_pyclif", + deprecated_proto_lib_visibility = True, # TODO(b/136847937) proto_lib = ":predict_proto", proto_srcfile = "predict.proto", ) @@ -290,6 +293,7 @@ serving_proto_library_py( tf_pyclif_proto_library( name = "classification_pyclif", + deprecated_proto_lib_visibility = True, # TODO(b/136847937) proto_lib = ":classification_proto", proto_srcfile = "classification.proto", ) @@ -325,6 +329,7 @@ serving_proto_library_py( tf_pyclif_proto_library( name = "inference_pyclif", + deprecated_proto_lib_visibility = True, # TODO(b/136847937) proto_lib = ":inference_proto", proto_srcfile = "inference.proto", ) @@ -378,6 +383,7 @@ serving_proto_library_py( tf_pyclif_proto_library( name = "regression_pyclif", + deprecated_proto_lib_visibility = True, # TODO(b/136847937) proto_lib = ":regression_proto", proto_srcfile = "regression.proto", ) From d0e01a3c56b280c6602d6c14e97ef60882d317aa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 7 Oct 2019 09:38:46 -0700 Subject: [PATCH 3482/8103] Remove unused load statements from BUILD files PiperOrigin-RevId: 273310865 --- tensorflow_serving/example/BUILD | 2 -- 1 file changed, 2 deletions(-) diff --git a/tensorflow_serving/example/BUILD b/tensorflow_serving/example/BUILD index 78145504642..5171d11cd25 100644 --- a/tensorflow_serving/example/BUILD +++ b/tensorflow_serving/example/BUILD @@ -7,8 +7,6 @@ package( licenses(["notice"]) # Apache 2.0 -load("//tensorflow_serving:serving.bzl", "serving_proto_library") - filegroup( name = "all_files", srcs = glob( From 142d0adb5e2975689d80d8fc608c9684e96de078 Mon Sep 17 00:00:00 2001 From: Robert Neale Date: Mon, 7 Oct 2019 20:12:26 -0700 Subject: [PATCH 3483/8103] Manual tests for model server and including tf.Text in serving build. PiperOrigin-RevId: 273435051 --- tensorflow_serving/model_servers/BUILD | 8 +++++++- tensorflow_serving/workspace.bzl | 14 ++++++++++++++ third_party/tf_text/BUILD | 1 + third_party/tf_text/tftext.patch | 11 +++++++++++ 4 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 third_party/tf_text/BUILD create mode 100644 third_party/tf_text/tftext.patch diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 15277400ee6..5d032965863 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -296,7 +296,13 @@ load("//tensorflow_serving:tensorflow_version.bzl", "if_v2", "if_not_v2") SUPPORTED_TENSORFLOW_OPS = if_v2([]) + if_not_v2([ "@org_tensorflow//tensorflow/contrib:contrib_kernels", "@org_tensorflow//tensorflow/contrib:contrib_ops_op_lib", -]) +]) + [ + "@org_tensorflow_text//tensorflow_text:constrained_sequence_op_cc", + "@org_tensorflow_text//tensorflow_text:sentence_breaking_ops_cc", + "@org_tensorflow_text//tensorflow_text:unicode_script_tokenizer_cc", + "@org_tensorflow_text//tensorflow_text:whitespace_tokenizer_cc", + "@org_tensorflow_text//tensorflow_text:wordpiece_tokenizer_cc", +] TENSORFLOW_DEPS = [ "@org_tensorflow//tensorflow/core:tensorflow", diff --git a/tensorflow_serving/workspace.bzl b/tensorflow_serving/workspace.bzl index c24c53d616c..ba8725bda58 100644 --- a/tensorflow_serving/workspace.bzl +++ b/tensorflow_serving/workspace.bzl @@ -56,3 +56,17 @@ def tf_serving_workspace(): "https://github.com/abseil/abseil-cpp/archive/36d37ab992038f52276ca66b9da80c1cf0f57dc2.tar.gz", ], ) + + # ===== TF.Text dependencies + # NOTE: Before updating this version, you must manually run the tests found in: + # https://github.com/tensorflow/text/blob/master/oss_scripts/model_server/tests.txt + http_archive( + name = "org_tensorflow_text", + sha256 = "2d6e1be79989d5b03da75a34d9e1331a70221d17dd754e80a7bca6e8daa8ae59", + strip_prefix = "text-a2f2ad05638c37161d2f06bdbf6eb5e0858b00e6", + urls = [ + "https://github.com/tensorflow/text/archive/a2f2ad05638c37161d2f06bdbf6eb5e0858b00e6.zip", + ], + patches = ["@//third_party/tf_text:tftext.patch"], + patch_args = ["-p1"], + ) diff --git a/third_party/tf_text/BUILD b/third_party/tf_text/BUILD new file mode 100644 index 00000000000..2d59128ba16 --- /dev/null +++ b/third_party/tf_text/BUILD @@ -0,0 +1 @@ +# Empty BUILD so this is treated like a package. diff --git a/third_party/tf_text/tftext.patch b/third_party/tf_text/tftext.patch new file mode 100644 index 00000000000..a140760b39f --- /dev/null +++ b/third_party/tf_text/tftext.patch @@ -0,0 +1,11 @@ +--- a/tensorflow_text/tftext.bzl 2019-09-18 15:24:07.320915272 -0700 ++++ b/tensorflow_text/tftext.bzl 2019-09-18 15:26:52.859611294 -0700 +@@ -40,8 +40,7 @@ + copts = [ "-pthread", "-std=c++11", ], + alwayslink = 1, + deps = cc_op_kernels + [ +- "@local_config_tf//:libtensorflow_framework", +- "@local_config_tf//:tf_header_lib", ++ "@org_tensorflow//tensorflow/core:tensorflow_opensource", + ], + ) From b9ed0f80852d7a33b0745833ff9c0243178b0c5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Geron?= Date: Sun, 13 Oct 2019 21:24:17 +0800 Subject: [PATCH 3484/8103] Fix typo in REQUIRED_PACKAGES for grpcio Replace `grpcio>=1.0<2` with `grpcio>=1.0,<2` This typo makes `conda env export` crash. --- tensorflow_serving/tools/pip_package/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/tools/pip_package/setup.py b/tensorflow_serving/tools/pip_package/setup.py index 2ddd3c0fc2e..eb759dbdd0d 100644 --- a/tensorflow_serving/tools/pip_package/setup.py +++ b/tensorflow_serving/tools/pip_package/setup.py @@ -53,7 +53,7 @@ REQUIRED_PACKAGES = [ - 'grpcio>=1.0<2', + 'grpcio>=1.0,<2', 'protobuf>=3.6.0', ] + _TF_REQ From 1b33368d918448240e13a512021190a270fc6170 Mon Sep 17 00:00:00 2001 From: Chao Xie Date: Wed, 16 Oct 2019 11:26:26 -0700 Subject: [PATCH 3485/8103] Update the version range for 2.0 release. PiperOrigin-RevId: 275075588 --- tensorflow_serving/tools/pip_package/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/tools/pip_package/setup.py b/tensorflow_serving/tools/pip_package/setup.py index 2ddd3c0fc2e..16a96d0a3b0 100644 --- a/tensorflow_serving/tools/pip_package/setup.py +++ b/tensorflow_serving/tools/pip_package/setup.py @@ -33,7 +33,7 @@ # Set when releasing a new version of TensorFlow Serving (e.g. 1.0.0). _VERSION = '0.0.0' # Have this by default be open; releasing a new version will lock to TF version -_TF_VERSION = '>=1.2.0,<2' +_TF_VERSION = '>=1.2.0,<3' _TF_VERSION_SANITIZED = _TF_VERSION.replace('-', '') project_name = 'tensorflow-serving-api' From 1bdd3499f1fe4d99b3c3024080560350d493e29b Mon Sep 17 00:00:00 2001 From: Chao Xie Date: Thu, 17 Oct 2019 10:03:31 -0700 Subject: [PATCH 3486/8103] Remove tensorflow/contrib/session_bundle as dependency for Tensorflow Serving. PiperOrigin-RevId: 275281512 --- tensorflow_serving/batching/BUILD | 1 - .../batching/batching_session_test.cc | 1 - tensorflow_serving/model_servers/BUILD | 7 +- .../get_model_status_impl_test.cc | 1 - .../model_servers/server_core_test.cc | 8 +- .../tensorflow_model_server_test.py | 360 +---------------- .../model_servers/test_util/BUILD | 19 + .../tensorflow_model_server_test_base.py | 370 +++++++++++++++++ tensorflow_serving/oss_or_google.bzl | 38 ++ tensorflow_serving/servables/tensorflow/BUILD | 154 +++----- .../tensorflow/bundle_factory_test_util.cc | 11 +- .../tensorflow/bundle_factory_test_util.h | 4 + .../tensorflow/bundle_factory_util_test.cc | 27 +- .../tensorflow/classification_service.cc | 2 - .../servables/tensorflow/classifier.cc | 11 +- .../servables/tensorflow/classifier.h | 2 +- .../servables/tensorflow/classifier_test.cc | 374 +++++++++++------- .../tensorflow/get_model_metadata_impl.cc | 2 - .../get_model_metadata_impl_test.cc | 14 +- .../servables/tensorflow/multi_inference.h | 3 +- .../tensorflow/multi_inference_helper.h | 1 - .../servables/tensorflow/oss/BUILD | 52 +++ .../{ => oss}/session_bundle_factory_test.cc | 23 +- .../session_bundle_source_adapter_test.cc | 12 +- .../servables/tensorflow/predict_impl.cc | 7 +- .../servables/tensorflow/predict_impl_test.cc | 32 +- .../servables/tensorflow/predict_util.cc | 1 - .../servables/tensorflow/predict_util.h | 4 +- .../servables/tensorflow/predict_util_test.cc | 15 +- .../tensorflow/regression_service.cc | 2 - .../servables/tensorflow/regressor.cc | 10 +- .../servables/tensorflow/regressor.h | 2 +- .../servables/tensorflow/regressor_test.cc | 237 ++++++----- .../tensorflow/saved_model_bundle_factory.cc | 4 +- .../saved_model_bundle_factory_test.cc | 49 --- .../saved_model_bundle_source_adapter_test.cc | 5 +- .../tensorflow/saved_model_warmup_test.cc | 1 - .../tensorflow/session_bundle_factory.cc | 6 +- .../tensorflow/session_bundle_factory.h | 2 +- .../session_bundle_source_adapter.h | 1 - .../servables/tensorflow/testdata/BUILD | 7 + tensorflow_serving/session_bundle/BUILD | 47 +++ .../session_bundle/manifest_proto.h | 27 ++ tensorflow_serving/session_bundle/oss/BUILD | 50 +++ .../session_bundle/oss/manifest.proto | 70 ++++ .../session_bundle/oss/session_bundle.h | 35 ++ .../session_bundle/oss/session_bundle_util.cc | 97 +++++ .../oss/session_bundle_util_test.cc | 176 +++++++++ .../session_bundle/session_bundle.h | 27 ++ .../session_bundle/session_bundle_util.h | 107 +++++ .../00000123/export-00000-of-00001 | Bin 0 -> 169 bytes .../half_plus_two/00000123/export.meta | Bin 0 -> 13244 bytes tensorflow_serving/test_util/test_util.cc | 5 - tensorflow_serving/util/BUILD | 11 +- tensorflow_serving/util/oss_or_google.h | 42 ++ 55 files changed, 1724 insertions(+), 852 deletions(-) create mode 100644 tensorflow_serving/model_servers/test_util/tensorflow_model_server_test_base.py create mode 100644 tensorflow_serving/oss_or_google.bzl create mode 100644 tensorflow_serving/servables/tensorflow/oss/BUILD rename tensorflow_serving/servables/tensorflow/{ => oss}/session_bundle_factory_test.cc (77%) rename tensorflow_serving/servables/tensorflow/{ => oss}/session_bundle_source_adapter_test.cc (92%) create mode 100644 tensorflow_serving/session_bundle/BUILD create mode 100644 tensorflow_serving/session_bundle/manifest_proto.h create mode 100644 tensorflow_serving/session_bundle/oss/BUILD create mode 100644 tensorflow_serving/session_bundle/oss/manifest.proto create mode 100644 tensorflow_serving/session_bundle/oss/session_bundle.h create mode 100644 tensorflow_serving/session_bundle/oss/session_bundle_util.cc create mode 100644 tensorflow_serving/session_bundle/oss/session_bundle_util_test.cc create mode 100644 tensorflow_serving/session_bundle/session_bundle.h create mode 100644 tensorflow_serving/session_bundle/session_bundle_util.h create mode 100755 tensorflow_serving/session_bundle/testdata/half_plus_two/00000123/export-00000-of-00001 create mode 100755 tensorflow_serving/session_bundle/testdata/half_plus_two/00000123/export.meta create mode 100644 tensorflow_serving/util/oss_or_google.h diff --git a/tensorflow_serving/batching/BUILD b/tensorflow_serving/batching/BUILD index 51a5eb0ff59..8cd157ae752 100644 --- a/tensorflow_serving/batching/BUILD +++ b/tensorflow_serving/batching/BUILD @@ -85,7 +85,6 @@ cc_test( "//tensorflow_serving/test_util", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/cc/saved_model:tag_constants", - "@org_tensorflow//tensorflow/contrib/session_bundle", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", diff --git a/tensorflow_serving/batching/batching_session_test.cc b/tensorflow_serving/batching/batching_session_test.cc index afa2dbd85b3..96982882ea0 100644 --- a/tensorflow_serving/batching/batching_session_test.cc +++ b/tensorflow_serving/batching/batching_session_test.cc @@ -18,7 +18,6 @@ limitations under the License. #include #include "tensorflow/cc/saved_model/loader.h" #include "tensorflow/cc/saved_model/tag_constants.h" -#include "tensorflow/contrib/session_bundle/session_bundle.h" #include "tensorflow/core/framework/tensor.h" #include "tensorflow/core/framework/tensor_shape.h" #include "tensorflow/core/framework/tensor_testutil.h" diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 5d032965863..9f4e110f67a 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -1,5 +1,7 @@ # Description: Model Server +load("//tensorflow_serving:tensorflow_version.bzl", "if_not_v2", "if_v2") + package( default_visibility = [ "//tensorflow_serving:internal", @@ -116,6 +118,7 @@ cc_test( "//tensorflow_serving/model_servers/test_util:storage_path_error_injecting_source_adapter", "//tensorflow_serving/model_servers/test_util:storage_path_error_injecting_source_adapter_proto", "//tensorflow_serving/test_util", + "//tensorflow_serving/util:oss_or_google", "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", @@ -162,7 +165,6 @@ cc_test( "//tensorflow_serving/test_util", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", - "@org_tensorflow//tensorflow/contrib/session_bundle", "@org_tensorflow//tensorflow/core:test", ], ) @@ -291,8 +293,6 @@ cc_library( ], ) -load("//tensorflow_serving:tensorflow_version.bzl", "if_v2", "if_not_v2") - SUPPORTED_TENSORFLOW_OPS = if_v2([]) + if_not_v2([ "@org_tensorflow//tensorflow/contrib:contrib_kernels", "@org_tensorflow//tensorflow/contrib:contrib_ops_op_lib", @@ -412,6 +412,7 @@ py_test( deps = [ "//tensorflow_serving/apis:model_service_proto_py_pb2", "//tensorflow_serving/apis:prediction_service_proto_py_pb2", + "//tensorflow_serving/model_servers/test_util:tensorflow_model_server_test_base", "@org_tensorflow//tensorflow:tensorflow_py", "@six_archive//:six", ], diff --git a/tensorflow_serving/model_servers/get_model_status_impl_test.cc b/tensorflow_serving/model_servers/get_model_status_impl_test.cc index 47aeb09fd0c..d8c1b64d5bd 100644 --- a/tensorflow_serving/model_servers/get_model_status_impl_test.cc +++ b/tensorflow_serving/model_servers/get_model_status_impl_test.cc @@ -19,7 +19,6 @@ limitations under the License. #include #include "tensorflow/cc/saved_model/loader.h" #include "tensorflow/cc/saved_model/signature_constants.h" -#include "tensorflow/contrib/session_bundle/session_bundle.h" #include "tensorflow/core/lib/core/status_test_util.h" #include "tensorflow_serving/apis/model.pb.h" #include "tensorflow_serving/core/availability_preserving_policy.h" diff --git a/tensorflow_serving/model_servers/server_core_test.cc b/tensorflow_serving/model_servers/server_core_test.cc index de6e282e4f0..73172f9b3c8 100644 --- a/tensorflow_serving/model_servers/server_core_test.cc +++ b/tensorflow_serving/model_servers/server_core_test.cc @@ -36,6 +36,7 @@ limitations under the License. #include "tensorflow_serving/model_servers/test_util/storage_path_error_injecting_source_adapter.h" #include "tensorflow_serving/model_servers/test_util/storage_path_error_injecting_source_adapter.pb.h" #include "tensorflow_serving/test_util/test_util.h" +#include "tensorflow_serving/util/oss_or_google.h" namespace tensorflow { namespace serving { @@ -879,7 +880,12 @@ TEST_P(ServerCoreTest, VersionLabelsNotAllowed) { INSTANTIATE_TEST_CASE_P( TestType, ServerCoreTest, ::testing::Combine( - ::testing::Range(0, static_cast(ServerCoreTest::NUM_TEST_TYPES)), + IsTensorflowServingOSS() + ? ::testing::Range( + static_cast(test_util::ServerCoreTest::SAVED_MODEL), + static_cast(test_util::ServerCoreTest::SAVED_MODEL)) + : ::testing::Range( + 0, static_cast(ServerCoreTest::NUM_TEST_TYPES)), ::testing::Bool())); INSTANTIATE_TEST_CASE_P( diff --git a/tensorflow_serving/model_servers/tensorflow_model_server_test.py b/tensorflow_serving/model_servers/tensorflow_model_server_test.py index 35a1318ee91..b05590465e5 100644 --- a/tensorflow_serving/model_servers/tensorflow_model_server_test.py +++ b/tensorflow_serving/model_servers/tensorflow_model_server_test.py @@ -19,124 +19,35 @@ from __future__ import division from __future__ import print_function -import atexit import json import os -import shlex -import socket import subprocess -import sys import time # This is a placeholder for a Google-internal import. import grpc from six.moves import range -from six.moves import urllib import tensorflow as tf -from tensorflow.core.framework import types_pb2 -from tensorflow.python.eager import context -from tensorflow.python.framework import config as device_config from tensorflow.python.platform import flags from tensorflow.python.saved_model import signature_constants from tensorflow_serving.apis import classification_pb2 from tensorflow_serving.apis import get_model_status_pb2 from tensorflow_serving.apis import inference_pb2 from tensorflow_serving.apis import model_service_pb2_grpc -from tensorflow_serving.apis import predict_pb2 from tensorflow_serving.apis import prediction_service_pb2_grpc from tensorflow_serving.apis import regression_pb2 +from tensorflow_serving.model_servers.test_util import tensorflow_model_server_test_base FLAGS = flags.FLAGS RPC_TIMEOUT = 5.0 -HTTP_REST_TIMEOUT_MS = 5000 -CHANNEL_WAIT_TIMEOUT = 5.0 -WAIT_FOR_SERVER_READY_INT_SECS = 60 GRPC_SOCKET_PATH = '/tmp/tf-serving.sock' -def SetVirtualCpus(num_virtual_cpus): - """Create virtual CPU devices if they haven't yet been created.""" - if num_virtual_cpus < 1: - raise ValueError('`num_virtual_cpus` must be at least 1 not %r' % - (num_virtual_cpus,)) - physical_devices = device_config.list_physical_devices('CPU') - if not physical_devices: - raise RuntimeError('No CPUs found') - configs = device_config.get_virtual_device_configuration(physical_devices[0]) - if configs is None: - virtual_devices = [context.VirtualDeviceConfiguration() - for _ in range(num_virtual_cpus)] - device_config.set_virtual_device_configuration( - physical_devices[0], virtual_devices) - else: - if len(configs) < num_virtual_cpus: - raise RuntimeError('Already configured with %d < %d virtual CPUs' % - (len(configs), num_virtual_cpus)) - - -def PickUnusedPort(): - s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) - s.bind(('', 0)) - port = s.getsockname()[1] - s.close() - return port - - -def WaitForServerReady(port): - """Waits for a server on the localhost to become ready.""" - for _ in range(0, WAIT_FOR_SERVER_READY_INT_SECS): - time.sleep(1) - request = predict_pb2.PredictRequest() - request.model_spec.name = 'intentionally_missing_model' - - try: - # Send empty request to missing model - channel = grpc.insecure_channel('localhost:{}'.format(port)) - stub = prediction_service_pb2_grpc.PredictionServiceStub(channel) - stub.Predict(request, RPC_TIMEOUT) - except grpc.RpcError as error: - # Missing model error will have details containing 'Servable' - if 'Servable' in error.details(): - print('Server is ready') - break - - -def CallREST(url, req, max_attempts=60): - """Returns HTTP response body from a REST API call.""" - for attempt in range(max_attempts): - try: - print('Attempt {}: Sending request to {} with data:\n{}'.format( - attempt, url, req)) - json_data = json.dumps(req).encode('utf-8') if req is not None else None - resp = urllib.request.urlopen(urllib.request.Request(url, data=json_data)) - resp_data = resp.read() - print('Received response:\n{}'.format(resp_data)) - resp.close() - return resp_data - except Exception as e: # pylint: disable=broad-except - print('Failed attempt {}. Error: {}'.format(attempt, e)) - if attempt == max_attempts - 1: - raise - print('Retrying...') - time.sleep(1) - - -def SortedObject(obj): - """Returns sorted object (with nested list/dictionaries).""" - if isinstance(obj, dict): - return sorted((k, SortedObject(v)) for k, v in obj.items()) - if isinstance(obj, list): - return sorted(SortedObject(x) for x in obj) - if isinstance(obj, tuple): - return list(sorted(SortedObject(x) for x in obj)) - else: - return obj - - -class TensorflowModelServerTest(tf.test.TestCase): +class TensorflowModelServerTest( + tensorflow_model_server_test_base.TensorflowModelServerTestBase): """This class defines integration test cases for tensorflow_model_server.""" @staticmethod @@ -144,102 +55,6 @@ def __TestSrcDirPath(relative_path=''): return os.path.join(os.environ['TEST_SRCDIR'], 'tf_serving/tensorflow_serving', relative_path) - @staticmethod - def GetArgsKey(*args, **kwargs): - return args + tuple(sorted(kwargs.items())) - - # Maps string key -> 2-tuple of 'host:port' string. - model_servers_dict = {} - - @staticmethod - def RunServer(model_name, - model_path, - model_type='tf', - model_config_file=None, - monitoring_config_file=None, - batching_parameters_file=None, - grpc_channel_arguments='', - wait_for_server_ready=True, - pipe=None, - model_config_file_poll_period=None): - """Run tensorflow_model_server using test config. - - A unique instance of server is started for each set of arguments. - If called with same arguments, handle to an existing server is - returned. - - Args: - model_name: Name of model. - model_path: Path to model. - model_type: Type of model TensorFlow ('tf') or TF Lite ('tflite'). - model_config_file: Path to model config file. - monitoring_config_file: Path to the monitoring config file. - batching_parameters_file: Path to batching parameters. - grpc_channel_arguments: Custom gRPC args for server. - wait_for_server_ready: Wait for gRPC port to be ready. - pipe: subpipe.PIPE object to read stderr from server. - model_config_file_poll_period: Period for polling the - filesystem to discover new model configs. - - Returns: - 3-tuple (, , ). - - Raises: - ValueError: when both model_path and config_file is empty. - """ - args_key = TensorflowModelServerTest.GetArgsKey(**locals()) - if args_key in TensorflowModelServerTest.model_servers_dict: - return TensorflowModelServerTest.model_servers_dict[args_key] - port = PickUnusedPort() - rest_api_port = PickUnusedPort() - print(('Starting test server on port: {} for model_name: ' - '{}/model_config_file: {}'.format(port, model_name, - model_config_file))) - command = os.path.join( - TensorflowModelServerTest.__TestSrcDirPath('model_servers'), - 'tensorflow_model_server') - command += ' --port=' + str(port) - command += ' --rest_api_port=' + str(rest_api_port) - command += ' --rest_api_timeout_in_ms=' + str(HTTP_REST_TIMEOUT_MS) - command += ' --grpc_socket_path=' + GRPC_SOCKET_PATH - - if model_config_file: - command += ' --model_config_file=' + model_config_file - elif model_path: - command += ' --model_name=' + model_name - command += ' --model_base_path=' + model_path - else: - raise ValueError('Both model_config_file and model_path cannot be empty!') - - if model_type == 'tflite': - command += ' --use_tflite_model=true' - - if monitoring_config_file: - command += ' --monitoring_config_file=' + monitoring_config_file - - if model_config_file_poll_period is not None: - command += ' --model_config_file_poll_wait_seconds=' + str( - model_config_file_poll_period) - - if batching_parameters_file: - command += ' --enable_batching' - command += ' --batching_parameters_file=' + batching_parameters_file - if grpc_channel_arguments: - command += ' --grpc_channel_arguments=' + grpc_channel_arguments - print(command) - proc = subprocess.Popen(shlex.split(command), stderr=pipe) - atexit.register(proc.kill) - print('Server started') - if wait_for_server_ready: - WaitForServerReady(port) - hostports = ( - proc, - 'localhost:' + str(port), - 'localhost:' + str(rest_api_port), - ) - TensorflowModelServerTest.model_servers_dict[args_key] = hostports - return hostports - def __BuildModelConfigFile(self): """Write a config file to disk for use in tests. @@ -267,116 +82,6 @@ def tearDown(self): """Deletes created configuration file.""" os.remove(self._GetGoodModelConfigFile()) - def VerifyPredictRequest( - self, - model_server_address, - expected_output, - expected_version, - model_name='default', - specify_output=True, - batch_input=False, - signature_name=signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY): - """Send PredictionService.Predict request and verify output.""" - print('Sending Predict request...') - # Prepare request - request = predict_pb2.PredictRequest() - request.model_spec.name = model_name - request.model_spec.signature_name = signature_name - request.inputs['x'].dtype = types_pb2.DT_FLOAT - request.inputs['x'].float_val.append(2.0) - dim = request.inputs['x'].tensor_shape.dim.add() - dim.size = 1 - if batch_input: - request.inputs['x'].tensor_shape.dim.add().size = 1 - - if specify_output: - request.output_filter.append('y') - # Send request - channel = grpc.insecure_channel(model_server_address) - stub = prediction_service_pb2_grpc.PredictionServiceStub(channel) - result = stub.Predict(request, RPC_TIMEOUT) # 5 secs timeout - # Verify response - self.assertTrue('y' in result.outputs) - self.assertIs(types_pb2.DT_FLOAT, result.outputs['y'].dtype) - self.assertEqual(1, len(result.outputs['y'].float_val)) - self.assertEqual(expected_output, result.outputs['y'].float_val[0]) - self._VerifyModelSpec(result.model_spec, request.model_spec.name, - signature_name, expected_version) - - def _GetSavedModelBundlePath(self): - """Returns a path to a model in SavedModel format.""" - return os.path.join(self.testdata_dir, 'saved_model_half_plus_two_cpu') - - def _GetModelVersion(self, model_path): - """Returns version of SavedModel/SessionBundle in given path. - - This method assumes there is exactly one directory with an 'int' valued - directory name under `model_path`. - - Args: - model_path: A string representing path to the SavedModel/SessionBundle. - - Returns: - version of SavedModel/SessionBundle in given path. - """ - return int(os.listdir(model_path)[0]) - - def _GetSavedModelHalfPlusThreePath(self): - """Returns a path to a half_plus_three model in SavedModel format.""" - return os.path.join(self.testdata_dir, 'saved_model_half_plus_three') - - def _GetTfLiteModelPath(self): - """Returns a path to a model in TF Lite format.""" - return os.path.join(self.testdata_dir, 'saved_model_half_plus_two_tflite') - - def _GetSessionBundlePath(self): - """Returns a path to a model in SessionBundle format.""" - return os.path.join(self.testdata_dir, 'half_plus_two') - - def _GetGoodModelConfigTemplate(self): - """Returns a path to a working configuration file template.""" - return os.path.join(self.testdata_dir, 'good_model_config.txt') - - def _GetGoodModelConfigFile(self): - """Returns a path to a working configuration file.""" - return os.path.join(self.temp_dir, 'good_model_config.conf') - - def _GetBadModelConfigFile(self): - """Returns a path to a improperly formatted configuration file.""" - return os.path.join(self.testdata_dir, 'bad_model_config.txt') - - def _GetBatchingParametersFile(self): - """Returns a path to a batching configuration file.""" - return os.path.join(self.testdata_dir, 'batching_config.txt') - - def _GetModelMetadataFile(self): - """Returns a path to a sample model metadata file.""" - return os.path.join(self.testdata_dir, 'half_plus_two_model_metadata.json') - - def _GetMonitoringConfigFile(self): - """Returns a path to a monitoring configuration file.""" - return os.path.join(self.testdata_dir, 'monitoring_config.txt') - - def _VerifyModelSpec(self, - actual_model_spec, - exp_model_name, - exp_signature_name, - exp_version): - """Verifies model_spec matches expected model name, signature, version. - - Args: - actual_model_spec: An instance of ModelSpec proto. - exp_model_name: A string that represents expected model name. - exp_signature_name: A string that represents expected signature. - exp_version: An integer that represents expected version. - - Returns: - None. - """ - self.assertEqual(actual_model_spec.name, exp_model_name) - self.assertEqual(actual_model_spec.signature_name, exp_signature_name) - self.assertEqual(actual_model_spec.version.value, exp_version) - def testGetModelStatus(self): """Test ModelService.GetModelStatus implementation.""" model_path = self._GetSavedModelBundlePath() @@ -490,48 +195,10 @@ def testMultiInference(self): request.tasks[i].model_spec.signature_name, self._GetModelVersion(model_path)) - def _TestPredict( - self, - model_path, - batching_parameters_file=None, - signature_name=signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY): - """Helper method to test prediction. - - Args: - model_path: Path to the model on disk. - batching_parameters_file: Batching parameters file to use (if None - batching is not enabled). - signature_name: Signature name to expect in the PredictResponse. - """ - model_server_address = TensorflowModelServerTest.RunServer( - 'default', - model_path, - batching_parameters_file=batching_parameters_file)[1] - expected_version = self._GetModelVersion(model_path) - self.VerifyPredictRequest(model_server_address, expected_output=3.0, - expected_version=expected_version, - signature_name=signature_name) - self.VerifyPredictRequest( - model_server_address, expected_output=3.0, specify_output=False, - expected_version=expected_version, signature_name=signature_name) - - def testPredictBatching(self): - """Test PredictionService.Predict implementation with SessionBundle.""" - self._TestPredict( - self._GetSessionBundlePath(), - batching_parameters_file=self._GetBatchingParametersFile()) - def testPredictSavedModel(self): """Test PredictionService.Predict implementation with SavedModel.""" self._TestPredict(self._GetSavedModelBundlePath()) - def testPredictUpconvertedSavedModel(self): - """Test PredictionService.Predict implementation. - - Using a SessionBundle converted to a SavedModel. - """ - self._TestPredict(self._GetSessionBundlePath()) - def _TestBadModel(self): """Helper method to test against a bad model export.""" # Both SessionBundle and SavedModel use the same bad model path, but in the @@ -727,7 +394,7 @@ def testClassifyREST(self): # Send request resp_data = None try: - resp_data = CallREST(url, json_req) + resp_data = tensorflow_model_server_test_base.CallREST(url, json_req) except Exception as e: # pylint: disable=broad-except self.fail('Request failed with error: {}'.format(e)) @@ -747,7 +414,7 @@ def testRegressREST(self): # Send request resp_data = None try: - resp_data = CallREST(url, json_req) + resp_data = tensorflow_model_server_test_base.CallREST(url, json_req) except Exception as e: # pylint: disable=broad-except self.fail('Request failed with error: {}'.format(e)) @@ -767,7 +434,7 @@ def testPredictREST(self): # Send request resp_data = None try: - resp_data = CallREST(url, json_req) + resp_data = tensorflow_model_server_test_base.CallREST(url, json_req) except Exception as e: # pylint: disable=broad-except self.fail('Request failed with error: {}'.format(e)) @@ -787,7 +454,7 @@ def testPredictColumnarREST(self): # Send request resp_data = None try: - resp_data = CallREST(url, json_req) + resp_data = tensorflow_model_server_test_base.CallREST(url, json_req) except Exception as e: # pylint: disable=broad-except self.fail('Request failed with error: {}'.format(e)) @@ -806,7 +473,7 @@ def testGetStatusREST(self): # Send request resp_data = None try: - resp_data = CallREST(url, None) + resp_data = tensorflow_model_server_test_base.CallREST(url, None) except Exception as e: # pylint: disable=broad-except self.fail('Request failed with error: {}'.format(e)) @@ -835,7 +502,7 @@ def testGetModelMetadataREST(self): # Send request resp_data = None try: - resp_data = CallREST(url, None) + resp_data = tensorflow_model_server_test_base.CallREST(url, None) except Exception as e: # pylint: disable=broad-except self.fail('Request failed with error: {}'.format(e)) @@ -849,8 +516,9 @@ def testGetModelMetadataREST(self): # sort. In this case, the "metadata" does not have any ordering making # the sort OK (and the test robust). self.assertEqual( - SortedObject(json.loads(resp_data)), - SortedObject(expected_metadata)) + tensorflow_model_server_test_base.SortedObject( + json.loads(resp_data)), + tensorflow_model_server_test_base.SortedObject(expected_metadata)) except Exception as e: # pylint: disable=broad-except self.fail('Request failed with error: {}'.format(e)) @@ -868,7 +536,7 @@ def testPrometheusEndpoint(self): # Send request resp_data = None try: - resp_data = CallREST(url, None) + resp_data = tensorflow_model_server_test_base.CallREST(url, None) except Exception as e: # pylint: disable=broad-except self.fail('Request failed with error: {}'.format(e)) @@ -972,7 +640,7 @@ def test_distrat_sequential_keras_saved_model_save(self): # You need to call SetVirtualCpus in test setUp with the maximum value # needed in any test if you use this in multiple tests. For now this is the # only test using this functionality. - SetVirtualCpus(2) + tensorflow_model_server_test_base.SetVirtualCpus(2) strategy = tf.distribute.MirroredStrategy(devices=('/cpu:0', '/cpu:1')) with strategy.scope(): model = tf.keras.models.Sequential() diff --git a/tensorflow_serving/model_servers/test_util/BUILD b/tensorflow_serving/model_servers/test_util/BUILD index 60b7e6e0621..2462e310d33 100644 --- a/tensorflow_serving/model_servers/test_util/BUILD +++ b/tensorflow_serving/model_servers/test_util/BUILD @@ -109,3 +109,22 @@ serving_proto_library( "//visibility:public", ], ) + +py_library( + name = "tensorflow_model_server_test_base", + srcs = ["tensorflow_model_server_test_base.py"], + srcs_version = "PY2AND3", + tags = [ + "noasan", # b/136281879 + "notsan", + ], + deps = [ + "//tensorflow_serving/apis:predict_proto_py_pb2", + "//tensorflow_serving/apis:prediction_service_proto_py_pb2", + "@org_tensorflow//tensorflow:tensorflow_py", + "@org_tensorflow//tensorflow/core:protos_all_py", + "@org_tensorflow//tensorflow/python:platform", + "@org_tensorflow//tensorflow/python/saved_model:signature_constants", + "@six_archive//:six", + ], +) diff --git a/tensorflow_serving/model_servers/test_util/tensorflow_model_server_test_base.py b/tensorflow_serving/model_servers/test_util/tensorflow_model_server_test_base.py new file mode 100644 index 00000000000..51bfea651bd --- /dev/null +++ b/tensorflow_serving/model_servers/test_util/tensorflow_model_server_test_base.py @@ -0,0 +1,370 @@ +# Copyright 2016 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Tests for tensorflow_model_server.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import atexit +import json +import os +import shlex +import socket +import subprocess +import time + +# This is a placeholder for a Google-internal import. + +import grpc +from six.moves import range +from six.moves import urllib +import tensorflow as tf + +from tensorflow.core.framework import types_pb2 +from tensorflow.python.eager import context +from tensorflow.python.framework import config as device_config +from tensorflow.python.platform import flags +from tensorflow.python.saved_model import signature_constants +from tensorflow_serving.apis import predict_pb2 +from tensorflow_serving.apis import prediction_service_pb2_grpc + +FLAGS = flags.FLAGS + +RPC_TIMEOUT = 5.0 +HTTP_REST_TIMEOUT_MS = 5000 +CHANNEL_WAIT_TIMEOUT = 5.0 +WAIT_FOR_SERVER_READY_INT_SECS = 60 +GRPC_SOCKET_PATH = '/tmp/tf-serving.sock' + + +def SetVirtualCpus(num_virtual_cpus): + """Create virtual CPU devices if they haven't yet been created.""" + if num_virtual_cpus < 1: + raise ValueError('`num_virtual_cpus` must be at least 1 not %r' % + (num_virtual_cpus,)) + physical_devices = device_config.list_physical_devices('CPU') + if not physical_devices: + raise RuntimeError('No CPUs found') + configs = device_config.get_virtual_device_configuration(physical_devices[0]) + if configs is None: + virtual_devices = [context.VirtualDeviceConfiguration() + for _ in range(num_virtual_cpus)] + device_config.set_virtual_device_configuration( + physical_devices[0], virtual_devices) + else: + if len(configs) < num_virtual_cpus: + raise RuntimeError('Already configured with %d < %d virtual CPUs' % + (len(configs), num_virtual_cpus)) + + +def PickUnusedPort(): + s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) + s.bind(('', 0)) + port = s.getsockname()[1] + s.close() + return port + + +def WaitForServerReady(port): + """Waits for a server on the localhost to become ready.""" + for _ in range(0, WAIT_FOR_SERVER_READY_INT_SECS): + time.sleep(1) + request = predict_pb2.PredictRequest() + request.model_spec.name = 'intentionally_missing_model' + + try: + # Send empty request to missing model + channel = grpc.insecure_channel('localhost:{}'.format(port)) + stub = prediction_service_pb2_grpc.PredictionServiceStub(channel) + stub.Predict(request, RPC_TIMEOUT) + except grpc.RpcError as error: + # Missing model error will have details containing 'Servable' + if 'Servable' in error.details(): + print('Server is ready') + break + + +def CallREST(url, req, max_attempts=60): + """Returns HTTP response body from a REST API call.""" + for attempt in range(max_attempts): + try: + print('Attempt {}: Sending request to {} with data:\n{}'.format( + attempt, url, req)) + json_data = json.dumps(req).encode('utf-8') if req is not None else None + resp = urllib.request.urlopen(urllib.request.Request(url, data=json_data)) + resp_data = resp.read() + print('Received response:\n{}'.format(resp_data)) + resp.close() + return resp_data + except Exception as e: # pylint: disable=broad-except + print('Failed attempt {}. Error: {}'.format(attempt, e)) + if attempt == max_attempts - 1: + raise + print('Retrying...') + time.sleep(1) + + +def SortedObject(obj): + """Returns sorted object (with nested list/dictionaries).""" + if isinstance(obj, dict): + return sorted((k, SortedObject(v)) for k, v in obj.items()) + if isinstance(obj, list): + return sorted(SortedObject(x) for x in obj) + if isinstance(obj, tuple): + return list(sorted(SortedObject(x) for x in obj)) + else: + return obj + + +class TensorflowModelServerTestBase(tf.test.TestCase): + """This class defines integration test cases for tensorflow_model_server.""" + + @staticmethod + def __TestSrcDirPath(relative_path=''): + return os.path.join(os.environ['TEST_SRCDIR'], + 'tf_serving/tensorflow_serving', relative_path) + + @staticmethod + def GetArgsKey(*args, **kwargs): + return args + tuple(sorted(kwargs.items())) + + # Maps string key -> 2-tuple of 'host:port' string. + model_servers_dict = {} + + @staticmethod + def RunServer(model_name, + model_path, + model_type='tf', + model_config_file=None, + monitoring_config_file=None, + batching_parameters_file=None, + grpc_channel_arguments='', + wait_for_server_ready=True, + pipe=None, + model_config_file_poll_period=None): + """Run tensorflow_model_server using test config. + + A unique instance of server is started for each set of arguments. + If called with same arguments, handle to an existing server is + returned. + + Args: + model_name: Name of model. + model_path: Path to model. + model_type: Type of model TensorFlow ('tf') or TF Lite ('tflite'). + model_config_file: Path to model config file. + monitoring_config_file: Path to the monitoring config file. + batching_parameters_file: Path to batching parameters. + grpc_channel_arguments: Custom gRPC args for server. + wait_for_server_ready: Wait for gRPC port to be ready. + pipe: subpipe.PIPE object to read stderr from server. + model_config_file_poll_period: Period for polling the + filesystem to discover new model configs. + + Returns: + 3-tuple (, , ). + + Raises: + ValueError: when both model_path and config_file is empty. + """ + args_key = TensorflowModelServerTestBase.GetArgsKey(**locals()) + if args_key in TensorflowModelServerTestBase.model_servers_dict: + return TensorflowModelServerTestBase.model_servers_dict[args_key] + port = PickUnusedPort() + rest_api_port = PickUnusedPort() + print(('Starting test server on port: {} for model_name: ' + '{}/model_config_file: {}'.format(port, model_name, + model_config_file))) + command = os.path.join( + TensorflowModelServerTestBase.__TestSrcDirPath('model_servers'), + 'tensorflow_model_server') + command += ' --port=' + str(port) + command += ' --rest_api_port=' + str(rest_api_port) + command += ' --rest_api_timeout_in_ms=' + str(HTTP_REST_TIMEOUT_MS) + command += ' --grpc_socket_path=' + GRPC_SOCKET_PATH + + if model_config_file: + command += ' --model_config_file=' + model_config_file + elif model_path: + command += ' --model_name=' + model_name + command += ' --model_base_path=' + model_path + else: + raise ValueError('Both model_config_file and model_path cannot be empty!') + + if model_type == 'tflite': + command += ' --use_tflite_model=true' + + if monitoring_config_file: + command += ' --monitoring_config_file=' + monitoring_config_file + + if model_config_file_poll_period is not None: + command += ' --model_config_file_poll_wait_seconds=' + str( + model_config_file_poll_period) + + if batching_parameters_file: + command += ' --enable_batching' + command += ' --batching_parameters_file=' + batching_parameters_file + if grpc_channel_arguments: + command += ' --grpc_channel_arguments=' + grpc_channel_arguments + print(command) + proc = subprocess.Popen(shlex.split(command), stderr=pipe) + atexit.register(proc.kill) + print('Server started') + if wait_for_server_ready: + WaitForServerReady(port) + hostports = ( + proc, + 'localhost:' + str(port), + 'localhost:' + str(rest_api_port), + ) + TensorflowModelServerTestBase.model_servers_dict[args_key] = hostports + return hostports + + def VerifyPredictRequest( + self, + model_server_address, + expected_output, + expected_version, + model_name='default', + specify_output=True, + batch_input=False, + signature_name=signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY): + """Send PredictionService.Predict request and verify output.""" + print('Sending Predict request...') + # Prepare request + request = predict_pb2.PredictRequest() + request.model_spec.name = model_name + request.model_spec.signature_name = signature_name + request.inputs['x'].dtype = types_pb2.DT_FLOAT + request.inputs['x'].float_val.append(2.0) + dim = request.inputs['x'].tensor_shape.dim.add() + dim.size = 1 + if batch_input: + request.inputs['x'].tensor_shape.dim.add().size = 1 + + if specify_output: + request.output_filter.append('y') + # Send request + channel = grpc.insecure_channel(model_server_address) + stub = prediction_service_pb2_grpc.PredictionServiceStub(channel) + result = stub.Predict(request, RPC_TIMEOUT) # 5 secs timeout + # Verify response + self.assertTrue('y' in result.outputs) + self.assertIs(types_pb2.DT_FLOAT, result.outputs['y'].dtype) + self.assertEqual(1, len(result.outputs['y'].float_val)) + self.assertEqual(expected_output, result.outputs['y'].float_val[0]) + self._VerifyModelSpec(result.model_spec, request.model_spec.name, + signature_name, expected_version) + + def _GetSavedModelBundlePath(self): + """Returns a path to a model in SavedModel format.""" + return os.path.join(self.testdata_dir, 'saved_model_half_plus_two_cpu') + + def _GetModelVersion(self, model_path): + """Returns version of SavedModel/SessionBundle in given path. + + This method assumes there is exactly one directory with an 'int' valued + directory name under `model_path`. + + Args: + model_path: A string representing path to the SavedModel/SessionBundle. + + Returns: + version of SavedModel/SessionBundle in given path. + """ + return int(os.listdir(model_path)[0]) + + def _GetSavedModelHalfPlusThreePath(self): + """Returns a path to a half_plus_three model in SavedModel format.""" + return os.path.join(self.testdata_dir, 'saved_model_half_plus_three') + + def _GetTfLiteModelPath(self): + """Returns a path to a model in TF Lite format.""" + return os.path.join(self.testdata_dir, 'saved_model_half_plus_two_tflite') + + def _GetSessionBundlePath(self): + """Returns a path to a model in SessionBundle format.""" + return os.path.join(self.testdata_dir, 'half_plus_two') + + def _GetGoodModelConfigTemplate(self): + """Returns a path to a working configuration file template.""" + return os.path.join(self.testdata_dir, 'good_model_config.txt') + + def _GetGoodModelConfigFile(self): + """Returns a path to a working configuration file.""" + return os.path.join(self.temp_dir, 'good_model_config.conf') + + def _GetBadModelConfigFile(self): + """Returns a path to a improperly formatted configuration file.""" + return os.path.join(self.testdata_dir, 'bad_model_config.txt') + + def _GetBatchingParametersFile(self): + """Returns a path to a batching configuration file.""" + return os.path.join(self.testdata_dir, 'batching_config.txt') + + def _GetModelMetadataFile(self): + """Returns a path to a sample model metadata file.""" + return os.path.join(self.testdata_dir, 'half_plus_two_model_metadata.json') + + def _GetMonitoringConfigFile(self): + """Returns a path to a monitoring configuration file.""" + return os.path.join(self.testdata_dir, 'monitoring_config.txt') + + def _VerifyModelSpec(self, + actual_model_spec, + exp_model_name, + exp_signature_name, + exp_version): + """Verifies model_spec matches expected model name, signature, version. + + Args: + actual_model_spec: An instance of ModelSpec proto. + exp_model_name: A string that represents expected model name. + exp_signature_name: A string that represents expected signature. + exp_version: An integer that represents expected version. + + Returns: + None. + """ + self.assertEqual(actual_model_spec.name, exp_model_name) + self.assertEqual(actual_model_spec.signature_name, exp_signature_name) + self.assertEqual(actual_model_spec.version.value, exp_version) + + def _TestPredict( + self, + model_path, + batching_parameters_file=None, + signature_name=signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY): + """Helper method to test prediction. + + Args: + model_path: Path to the model on disk. + batching_parameters_file: Batching parameters file to use (if None + batching is not enabled). + signature_name: Signature name to expect in the PredictResponse. + """ + model_server_address = TensorflowModelServerTestBase.RunServer( + 'default', + model_path, + batching_parameters_file=batching_parameters_file)[1] + expected_version = self._GetModelVersion(model_path) + self.VerifyPredictRequest(model_server_address, expected_output=3.0, + expected_version=expected_version, + signature_name=signature_name) + self.VerifyPredictRequest( + model_server_address, expected_output=3.0, specify_output=False, + expected_version=expected_version, signature_name=signature_name) diff --git a/tensorflow_serving/oss_or_google.bzl b/tensorflow_serving/oss_or_google.bzl new file mode 100644 index 00000000000..7e348f17266 --- /dev/null +++ b/tensorflow_serving/oss_or_google.bzl @@ -0,0 +1,38 @@ +""" +Module for build utilities to distiguish different build environment. +""" + +# Whether the compilation environment is open source environment. +is_oss = True + +# Helper build function. +# Returns the input if is_oss is true. +# Returns empty list otherwise. +def if_oss(a): + if is_oss: + return a + else: + return [] + +# Helper build function. +# Returns the input if is_oss is false. +# Returns empty list otherwise. +def if_google(a): + if is_oss: + return [] + else: + return a + +# cc_test that is only run in open source environment. +def oss_only_cc_test(name, srcs = [], deps = [], data = [], size = "medium", linkstatic = 0): + if is_oss: + return native.cc_test( + name = name, + deps = deps, + srcs = srcs, + data = data, + size = size, + linkstatic = linkstatic, + ) + else: + return None diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index d8b9d62d1af..2701e51ece7 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -62,7 +62,10 @@ cc_test( name = "bundle_factory_util_test", size = "medium", srcs = ["bundle_factory_util_test.cc"], - data = ["@org_tensorflow//tensorflow/contrib/session_bundle:session_bundle_half_plus_two"], + data = [ + "//tensorflow_serving/session_bundle:session_bundle_half_plus_two", + "@org_tensorflow//tensorflow/cc/saved_model:saved_model_half_plus_two", + ], deps = [ ":bundle_factory_test_util", ":bundle_factory_util", @@ -70,10 +73,10 @@ cc_test( "//tensorflow_serving/batching:batching_session", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/resources:resources_proto", + "//tensorflow_serving/session_bundle:session_bundle_util", "//tensorflow_serving/test_util", "//tensorflow_serving/util/test_util:mock_file_probing_env", "@com_google_protobuf//:cc_wkt_protos", - "@org_tensorflow//tensorflow/contrib/session_bundle", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", @@ -130,8 +133,7 @@ cc_library( ":session_bundle_config_proto", "//tensorflow_serving/batching:batching_session", "//tensorflow_serving/resources:resources_proto", - "@org_tensorflow//tensorflow/contrib/session_bundle", - "@org_tensorflow//tensorflow/contrib/session_bundle:bundle_shim", + "//tensorflow_serving/session_bundle:session_bundle_util", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", @@ -139,27 +141,6 @@ cc_library( ], ) -cc_test( - name = "session_bundle_factory_test", - size = "medium", - srcs = ["session_bundle_factory_test.cc"], - data = ["@org_tensorflow//tensorflow/contrib/session_bundle:session_bundle_half_plus_two"], - deps = [ - ":bundle_factory_test", - ":bundle_factory_test_util", - ":session_bundle_config_proto", - ":session_bundle_factory", - "//tensorflow_serving/core/test_util:test_main", - "//tensorflow_serving/test_util", - "@com_google_protobuf//:cc_wkt_protos", - "@org_tensorflow//tensorflow/contrib/session_bundle", - "@org_tensorflow//tensorflow/core:core_cpu", - "@org_tensorflow//tensorflow/core:framework", - "@org_tensorflow//tensorflow/core:lib", - "@org_tensorflow//tensorflow/core:test", - ], -) - cc_library( name = "saved_model_bundle_factory", srcs = ["saved_model_bundle_factory.cc"], @@ -175,10 +156,10 @@ cc_library( "//tensorflow_serving/batching:batching_session", "//tensorflow_serving/core:loader", "//tensorflow_serving/resources:resources_proto", + "//tensorflow_serving/session_bundle:session_bundle_util", "@com_google_absl//absl/strings", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/cc/saved_model:tag_constants", - "@org_tensorflow//tensorflow/contrib/session_bundle:bundle_shim", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", @@ -192,8 +173,8 @@ cc_test( srcs = ["saved_model_bundle_factory_test.cc"], data = [ "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_tflite", + "//tensorflow_serving/session_bundle:session_bundle_half_plus_two", "@org_tensorflow//tensorflow/cc/saved_model:saved_model_half_plus_two", - "@org_tensorflow//tensorflow/contrib/session_bundle:session_bundle_half_plus_two", ], deps = [ ":bundle_factory_test", @@ -226,36 +207,12 @@ cc_library( "//tensorflow_serving/core:source_adapter", "//tensorflow_serving/core:storage_path", "//tensorflow_serving/util:optional", - "@org_tensorflow//tensorflow/contrib/session_bundle", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:lib", ], alwayslink = 1, ) -cc_test( - name = "session_bundle_source_adapter_test", - size = "medium", - srcs = ["session_bundle_source_adapter_test.cc"], - data = ["@org_tensorflow//tensorflow/contrib/session_bundle:session_bundle_half_plus_two"], - # Link in all registered kernels. - linkstatic = 1, - deps = [ - ":bundle_factory_test_util", - ":session_bundle_config_proto", - ":session_bundle_source_adapter", - ":session_bundle_source_adapter_proto", - "//tensorflow_serving/core:loader", - "//tensorflow_serving/core:servable_data", - "//tensorflow_serving/core/test_util:test_main", - "//tensorflow_serving/resources:resources_proto", - "//tensorflow_serving/test_util", - "@org_tensorflow//tensorflow/contrib/session_bundle", - "@org_tensorflow//tensorflow/core:lib", - "@org_tensorflow//tensorflow/core:test", - ], -) - cc_library( name = "saved_model_bundle_source_adapter", srcs = ["saved_model_bundle_source_adapter.cc"], @@ -287,8 +244,8 @@ cc_test( size = "medium", srcs = ["saved_model_bundle_source_adapter_test.cc"], data = [ + "//tensorflow_serving/session_bundle:session_bundle_half_plus_two", "@org_tensorflow//tensorflow/cc/saved_model:saved_model_half_plus_two", - "@org_tensorflow//tensorflow/contrib/session_bundle:session_bundle_half_plus_two", ], # Link in all registered kernels. linkstatic = 1, @@ -303,6 +260,7 @@ cc_test( "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/resources:resources_proto", "//tensorflow_serving/test_util", + "//tensorflow_serving/util:oss_or_google", "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/core:lib", @@ -482,12 +440,44 @@ cc_library( "//tensorflow_serving/apis:predict_proto", "//tensorflow_serving/core:servable_handle", "//tensorflow_serving/model_servers:server_core", + "//tensorflow_serving/session_bundle:session_bundle_util", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", ], ) +cc_test( + name = "predict_impl_test", + size = "medium", + srcs = ["predict_impl_test.cc"], + data = [ + "//tensorflow_serving/servables/tensorflow/testdata:bad_half_plus_two/00000123/export", + "//tensorflow_serving/servables/tensorflow/testdata:bad_half_plus_two/00000123/export.meta", + "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two/00000123/export.data-00000-of-00001", + "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two/00000123/export.index", + "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two/00000123/export.meta", + "//tensorflow_serving/servables/tensorflow/testdata:saved_model_counter/00000123/saved_model.pb", + "//tensorflow_serving/servables/tensorflow/testdata:saved_model_counter/00000123/variables/variables.data-00000-of-00001", + "//tensorflow_serving/servables/tensorflow/testdata:saved_model_counter/00000123/variables/variables.index", + "@org_tensorflow//tensorflow/cc/saved_model:saved_model_half_plus_two", + ], + deps = [ + ":predict_impl", + ":saved_model_bundle_source_adapter_proto", + ":session_bundle_config_proto", + ":session_bundle_source_adapter_proto", + "//tensorflow_serving/core:availability_preserving_policy", + "//tensorflow_serving/core/test_util:test_main", + "//tensorflow_serving/model_servers:model_platform_types", + "//tensorflow_serving/model_servers:platform_config_util", + "//tensorflow_serving/model_servers:server_core", + "//tensorflow_serving/test_util", + "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", + "@org_tensorflow//tensorflow/core:test", + ], +) + cc_library( name = "predict_util", srcs = ["predict_util.cc"], @@ -501,8 +491,6 @@ cc_library( "//tensorflow_serving/util:optional", "@com_google_absl//absl/strings", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", - "@org_tensorflow//tensorflow/contrib/session_bundle", - "@org_tensorflow//tensorflow/contrib/session_bundle:signature", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", ], @@ -534,10 +522,10 @@ cc_test( "//tensorflow_serving/model_servers:platform_config_util", "//tensorflow_serving/model_servers:server_core", "//tensorflow_serving/test_util", + "//tensorflow_serving/util:oss_or_google", "@com_google_absl//absl/strings", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", - "@org_tensorflow//tensorflow/contrib/session_bundle", "@org_tensorflow//tensorflow/core:test", ], ) @@ -554,8 +542,6 @@ cc_library( "//tensorflow_serving/core:servable_handle", "//tensorflow_serving/model_servers:server_core", "@org_tensorflow//tensorflow/cc/saved_model:loader", - "@org_tensorflow//tensorflow/contrib/session_bundle", - "@org_tensorflow//tensorflow/contrib/session_bundle:bundle_shim", "@org_tensorflow//tensorflow/core:lib", ], ) @@ -585,50 +571,17 @@ cc_test( "//tensorflow_serving/model_servers:model_platform_types", "//tensorflow_serving/model_servers:platform_config_util", "//tensorflow_serving/test_util", + "//tensorflow_serving/util:oss_or_google", "@com_google_protobuf//:cc_wkt_protos", "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", - "@org_tensorflow//tensorflow/contrib/session_bundle", - "@org_tensorflow//tensorflow/contrib/session_bundle:bundle_shim", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", ], ) -cc_test( - name = "predict_impl_test", - size = "medium", - srcs = ["predict_impl_test.cc"], - data = [ - "//tensorflow_serving/servables/tensorflow/testdata:bad_half_plus_two/00000123/export", - "//tensorflow_serving/servables/tensorflow/testdata:bad_half_plus_two/00000123/export.meta", - "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two/00000123/export.data-00000-of-00001", - "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two/00000123/export.index", - "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two/00000123/export.meta", - "//tensorflow_serving/servables/tensorflow/testdata:saved_model_counter/00000123/saved_model.pb", - "//tensorflow_serving/servables/tensorflow/testdata:saved_model_counter/00000123/variables/variables.data-00000-of-00001", - "//tensorflow_serving/servables/tensorflow/testdata:saved_model_counter/00000123/variables/variables.index", - "@org_tensorflow//tensorflow/cc/saved_model:saved_model_half_plus_two", - ], - deps = [ - ":predict_impl", - ":saved_model_bundle_source_adapter_proto", - ":session_bundle_config_proto", - ":session_bundle_source_adapter_proto", - "//tensorflow_serving/core:availability_preserving_policy", - "//tensorflow_serving/core/test_util:test_main", - "//tensorflow_serving/model_servers:model_platform_types", - "//tensorflow_serving/model_servers:platform_config_util", - "//tensorflow_serving/model_servers:server_core", - "//tensorflow_serving/test_util", - "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", - "@org_tensorflow//tensorflow/contrib/session_bundle", - "@org_tensorflow//tensorflow/core:test", - ], -) - cc_library( name = "classifier", srcs = ["classifier.cc"], @@ -642,11 +595,10 @@ cc_library( "//tensorflow_serving/apis:classifier", "//tensorflow_serving/apis:input_proto", "//tensorflow_serving/apis:model_proto", + "//tensorflow_serving/session_bundle:session_bundle_util", "//tensorflow_serving/util:optional", "@org_tensorflow//tensorflow/cc/saved_model:loader_lite", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", - "@org_tensorflow//tensorflow/contrib/session_bundle:session_bundle_lite", - "@org_tensorflow//tensorflow/contrib/session_bundle:signature_lite", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", @@ -664,12 +616,10 @@ cc_test( "//tensorflow_serving/apis:model_proto", "//tensorflow_serving/core/test_util:mock_session", "//tensorflow_serving/core/test_util:test_main", + "//tensorflow_serving/session_bundle:session_bundle_util", "//tensorflow_serving/test_util", "//tensorflow_serving/util:optional", "@com_google_protobuf//:protobuf_lite", - "@org_tensorflow//tensorflow/contrib/session_bundle", - "@org_tensorflow//tensorflow/contrib/session_bundle:bundle_shim", - "@org_tensorflow//tensorflow/contrib/session_bundle:manifest_proto_cc", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", @@ -691,8 +641,6 @@ cc_library( "//tensorflow_serving/core:servable_handle", "//tensorflow_serving/model_servers:server_core", "//tensorflow_serving/servables/tensorflow:util", - "@org_tensorflow//tensorflow/contrib/session_bundle", - "@org_tensorflow//tensorflow/contrib/session_bundle:signature", "@org_tensorflow//tensorflow/core:lib", ], ) @@ -733,8 +681,6 @@ cc_library( "//tensorflow_serving/core:servable_handle", "//tensorflow_serving/model_servers:server_core", "//tensorflow_serving/servables/tensorflow:util", - "@org_tensorflow//tensorflow/contrib/session_bundle", - "@org_tensorflow//tensorflow/contrib/session_bundle:signature", "@org_tensorflow//tensorflow/core:lib", ], ) @@ -774,11 +720,10 @@ cc_library( "//tensorflow_serving/apis:model_proto", "//tensorflow_serving/apis:regression_proto", "//tensorflow_serving/apis:regressor", + "//tensorflow_serving/session_bundle:session_bundle_util", "//tensorflow_serving/util:optional", "@org_tensorflow//tensorflow/cc/saved_model:loader_lite", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", - "@org_tensorflow//tensorflow/contrib/session_bundle:session_bundle_lite", - "@org_tensorflow//tensorflow/contrib/session_bundle:signature_lite", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", @@ -796,11 +741,10 @@ cc_test( "//tensorflow_serving/apis:regression_proto", "//tensorflow_serving/core/test_util:mock_session", "//tensorflow_serving/core/test_util:test_main", + "//tensorflow_serving/session_bundle:session_bundle_util", "//tensorflow_serving/test_util", "//tensorflow_serving/util:optional", "@com_google_protobuf//:protobuf_lite", - "@org_tensorflow//tensorflow/contrib/session_bundle", - "@org_tensorflow//tensorflow/contrib/session_bundle:bundle_shim", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", @@ -824,7 +768,6 @@ cc_library( "//tensorflow_serving/servables/tensorflow:util", "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", - "@org_tensorflow//tensorflow/contrib/session_bundle", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", ], @@ -978,7 +921,6 @@ cc_test( "//tensorflow_serving/test_util", "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/cc/saved_model:constants", - "@org_tensorflow//tensorflow/contrib/session_bundle:manifest_proto_cc", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_test_util.cc b/tensorflow_serving/servables/tensorflow/bundle_factory_test_util.cc index 7065539cce6..c60f0c0b56f 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_test_util.cc +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_test_util.cc @@ -45,7 +45,7 @@ string GetTestSavedModelPath() { } string GetTestSessionBundleExportPath() { - return test_util::ContribTestSrcDirPath(kTestSessionBundleExportPath); + return test_util::TestSrcDirPath(kTestSessionBundleExportPath); } string GetTestTfLiteModelPath() { @@ -58,6 +58,15 @@ std::vector GetTestSessionBundleExportFiles() { tensorflow::io::JoinPath(dir, "export-00000-of-00001")}; } +std::vector GetTestSavedModelBundleExportFiles() { + const string dir = GetTestSavedModelPath(); + return { + tensorflow::io::JoinPath(dir, "saved_model.pb"), + tensorflow::io::JoinPath(dir, "assets/foo.txt"), + tensorflow::io::JoinPath(dir, "variables/variables.index"), + tensorflow::io::JoinPath(dir, "variables/variables.data-00000-of-00001")}; +} + uint64 GetTotalFileSize(const std::vector& files) { uint64 total_file_size = 0; for (const string& file : files) { diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_test_util.h b/tensorflow_serving/servables/tensorflow/bundle_factory_test_util.h index a2d31186284..2b151aefe71 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_test_util.h +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_test_util.h @@ -39,6 +39,10 @@ string GetTestTfLiteModelPath(); // two model. std::vector GetTestSessionBundleExportFiles(); +// Returns the paths of the files of the SavedModel Bundle export for the half +// plus two model. +std::vector GetTestSavedModelBundleExportFiles(); + // Returns the total size of the given files. Requires the files to exist. uint64 GetTotalFileSize(const std::vector& files); diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc b/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc index 31fd46afd5d..1c4f52503b8 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc @@ -23,7 +23,6 @@ limitations under the License. #include "google/protobuf/wrappers.pb.h" #include #include -#include "tensorflow/contrib/session_bundle/session_bundle.h" #include "tensorflow/core/kernels/batching_util/shared_batch_scheduler.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/lib/core/status_test_util.h" @@ -36,6 +35,7 @@ limitations under the License. #include "tensorflow_serving/resources/resources.pb.h" #include "tensorflow_serving/servables/tensorflow/bundle_factory_test_util.h" #include "tensorflow_serving/servables/tensorflow/session_bundle_config.pb.h" +#include "tensorflow_serving/session_bundle/session_bundle_util.h" #include "tensorflow_serving/test_util/test_util.h" #include "tensorflow_serving/util/test_util/mock_file_probing_env.h" @@ -52,8 +52,7 @@ using Batcher = SharedBatchScheduler; class BundleFactoryUtilTest : public ::testing::Test { protected: - BundleFactoryUtilTest() - : export_dir_(test_util::GetTestSessionBundleExportPath()) {} + BundleFactoryUtilTest() : export_dir_(test_util::GetTestSavedModelPath()) {} virtual ~BundleFactoryUtilTest() = default; @@ -86,23 +85,17 @@ TEST_F(BundleFactoryUtilTest, GetRunOptions) { } TEST_F(BundleFactoryUtilTest, WrapSession) { - // Create a SessionBundle and wrap the session. - // TODO(b/32248363): use SavedModelBundle instead of SessionBundle when we - // switch the Model Server to use Saved Model. - SessionBundle bundle; - TF_ASSERT_OK(LoadSessionBundleFromPathUsingRunOptions( - SessionOptions(), RunOptions(), export_dir_, &bundle)); + SavedModelBundle bundle; + TF_ASSERT_OK(LoadSavedModel(SessionOptions(), RunOptions(), export_dir_, + {"serve"}, &bundle)); TF_ASSERT_OK(WrapSession(&bundle.session)); test_util::TestSingleRequest(bundle.session.get()); } TEST_F(BundleFactoryUtilTest, WrapSessionForBatching) { - // Create a SessionBundle. - // TODO(b/32248363): use SavedModelBundle instead of SessionBundle when we - // switch the Model Server to use Saved Model. - SessionBundle bundle; - TF_ASSERT_OK(LoadSessionBundleFromPathUsingRunOptions( - SessionOptions(), RunOptions(), export_dir_, &bundle)); + SavedModelBundle bundle; + TF_ASSERT_OK(LoadSavedModel(SessionOptions(), RunOptions(), export_dir_, + {"serve"}, &bundle)); // Create BatchingParameters and batch scheduler. BatchingParameters batching_params; @@ -140,8 +133,8 @@ TEST_F(BundleFactoryUtilTest, EstimateResourceFromPathWithBadExport) { } TEST_F(BundleFactoryUtilTest, EstimateResourceFromPathWithGoodExport) { - const double kTotalFileSize = - test_util::GetTotalFileSize(test_util::GetTestSessionBundleExportFiles()); + const double kTotalFileSize = test_util::GetTotalFileSize( + test_util::GetTestSavedModelBundleExportFiles()); ResourceAllocation expected = test_util::GetExpectedResourceEstimate(kTotalFileSize); diff --git a/tensorflow_serving/servables/tensorflow/classification_service.cc b/tensorflow_serving/servables/tensorflow/classification_service.cc index 767280560f1..09028d79324 100644 --- a/tensorflow_serving/servables/tensorflow/classification_service.cc +++ b/tensorflow_serving/servables/tensorflow/classification_service.cc @@ -17,8 +17,6 @@ limitations under the License. #include -#include "tensorflow/contrib/session_bundle/session_bundle.h" -#include "tensorflow/contrib/session_bundle/signature.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/platform/tracing.h" #include "tensorflow_serving/apis/classifier.h" diff --git a/tensorflow_serving/servables/tensorflow/classifier.cc b/tensorflow_serving/servables/tensorflow/classifier.cc index 616840e07eb..ae65699441c 100644 --- a/tensorflow_serving/servables/tensorflow/classifier.cc +++ b/tensorflow_serving/servables/tensorflow/classifier.cc @@ -16,6 +16,7 @@ limitations under the License. #include "tensorflow_serving/servables/tensorflow/classifier.h" #include + #include #include #include @@ -23,7 +24,6 @@ limitations under the License. #include #include "tensorflow/cc/saved_model/signature_constants.h" -#include "tensorflow/contrib/session_bundle/signature.h" #include "tensorflow/core/example/example.pb.h" #include "tensorflow/core/framework/tensor.h" #include "tensorflow/core/lib/core/errors.h" @@ -36,6 +36,7 @@ limitations under the License. #include "tensorflow_serving/apis/input.pb.h" #include "tensorflow_serving/apis/model.pb.h" #include "tensorflow_serving/servables/tensorflow/util.h" +#include "tensorflow_serving/session_bundle/session_bundle_util.h" namespace tensorflow { namespace serving { @@ -76,8 +77,8 @@ class TensorFlowClassifier : public ClassifierInterface { scores.reset(new Tensor); } - TF_RETURN_IF_ERROR(RunClassification(*signature_, input_tensor, session_, - classes.get(), scores.get())); + TF_RETURN_IF_ERROR(session_bundle::RunClassification( + *signature_, input_tensor, session_, classes.get(), scores.get())); // Validate classes output Tensor. if (classes) { @@ -206,8 +207,8 @@ class SessionBundleClassifier : public ClassifierInterface { // TODO(b/26220896): Move TensorFlowClassifier creation to construction // time. ClassificationSignature signature; - TF_RETURN_IF_ERROR( - GetClassificationSignature(bundle_->meta_graph_def, &signature)); + TF_RETURN_IF_ERROR(session_bundle::GetClassificationSignature( + bundle_->meta_graph_def, &signature)); TensorFlowClassifier classifier(bundle_->session.get(), &signature); return classifier.Classify(request, result); diff --git a/tensorflow_serving/servables/tensorflow/classifier.h b/tensorflow_serving/servables/tensorflow/classifier.h index 14b203b7500..04f24fe4ea6 100644 --- a/tensorflow_serving/servables/tensorflow/classifier.h +++ b/tensorflow_serving/servables/tensorflow/classifier.h @@ -21,9 +21,9 @@ limitations under the License. #include #include "tensorflow/cc/saved_model/loader.h" -#include "tensorflow/contrib/session_bundle/session_bundle.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow_serving/apis/classifier.h" +#include "tensorflow_serving/session_bundle/session_bundle_util.h" #include "tensorflow_serving/util/optional.h" namespace tensorflow { diff --git a/tensorflow_serving/servables/tensorflow/classifier_test.cc b/tensorflow_serving/servables/tensorflow/classifier_test.cc index 4dc7df9a3cf..1e29c02c9c7 100644 --- a/tensorflow_serving/servables/tensorflow/classifier_test.cc +++ b/tensorflow_serving/servables/tensorflow/classifier_test.cc @@ -22,9 +22,6 @@ limitations under the License. #include #include "google/protobuf/map.h" -#include "tensorflow/contrib/session_bundle/bundle_shim.h" -#include "tensorflow/contrib/session_bundle/manifest.pb.h" -#include "tensorflow/contrib/session_bundle/session_bundle.h" #include "tensorflow/core/example/example.pb.h" #include "tensorflow/core/example/feature.pb.h" #include "tensorflow/core/lib/core/errors.h" @@ -37,8 +34,10 @@ limitations under the License. #include "tensorflow_serving/apis/input.pb.h" #include "tensorflow_serving/apis/model.pb.h" #include "tensorflow_serving/core/test_util/mock_session.h" +#include "tensorflow_serving/session_bundle/session_bundle_util.h" #include "tensorflow_serving/test_util/test_util.h" #include "tensorflow_serving/util/optional.h" +#include "tensorflow_serving/util/oss_or_google.h" namespace tensorflow { namespace serving { @@ -245,41 +244,101 @@ void AddNamedSignature(const string& input_tensor_name, signature_name, named_signature)); } +// Add a named signature to the mutable meta_graph_def* parameter. +// If is_classification is false, will add a regression signature, which is +// invalid in classification requests. +void AddNamedSignatureToSavedModelBundle( + const string& input_tensor_name, const string& output_scores_tensor_name, + const string& signature_name, const bool is_classification, + tensorflow::MetaGraphDef* meta_graph_def) { + auto* signature_defs = meta_graph_def->mutable_signature_def(); + SignatureDef sig_def; + TensorInfo input_tensor_info; + input_tensor_info.set_name(input_tensor_name); + (*sig_def.mutable_inputs())["inputs"] = input_tensor_info; + TensorInfo scores_tensor_info; + scores_tensor_info.set_name(output_scores_tensor_name); + (*sig_def.mutable_outputs())["scores"] = scores_tensor_info; + string methond_name = "tensorflow/serving/regress"; + if (is_classification) { + TensorInfo class_tensor_info; + class_tensor_info.set_name(kClassTensor); + (*sig_def.mutable_outputs())["classes"] = class_tensor_info; + + methond_name = "tensorflow/serving/classify"; + } + sig_def.set_method_name(methond_name); + (*signature_defs)[signature_name] = sig_def; +} + // Parameter is 'bool use_saved_model'. class ClassifierTest : public ::testing::TestWithParam { public: void SetUp() override { - bundle_.reset(new SessionBundle); - meta_graph_def_ = &bundle_->meta_graph_def; - optional expected_timeout = GetRunOptions().timeout_in_ms(); if (!UseSavedModel()) { + bundle_.reset(new SessionBundle); + meta_graph_def_ = &bundle_->meta_graph_def; + optional expected_timeout = GetRunOptions().timeout_in_ms(); // For SessionBundle we don't propagate the timeout. expected_timeout = nullopt; + fake_session_ = new FakeSession(expected_timeout); + bundle_->session.reset(fake_session_); + + // Setup some defaults for our signature. + tensorflow::serving::Signatures signatures; + auto signature = signatures.mutable_default_signature() + ->mutable_classification_signature(); + signature->mutable_input()->set_tensor_name(kInputTensor); + signature->mutable_classes()->set_tensor_name(kClassTensor); + signature->mutable_scores()->set_tensor_name(kScoreTensor); + + AddNamedSignature(kInputTensor, kOutputPlusOneClassTensor, + kOutputPlusOneSignature, true /* is_classification */, + &signatures); + AddNamedSignature(kInputTensor, kOutputPlusOneClassTensor, + kInvalidNamedSignature, false /* is_classification */, + &signatures); + + // Add a named signature where the output is not valid. + AddNamedSignature(kInputTensor, kImproperlySizedScoresTensor, + kImproperlySizedScoresSignature, + true /* is_classification */, &signatures); + TF_ASSERT_OK(tensorflow::serving::session_bundle::SetSignatures( + signatures, meta_graph_def_)); + } else { + saved_model_bundle_.reset(new SavedModelBundle); + meta_graph_def_ = &saved_model_bundle_->meta_graph_def; + optional expected_timeout = GetRunOptions().timeout_in_ms(); + fake_session_ = new FakeSession(expected_timeout); + saved_model_bundle_->session.reset(fake_session_); + + auto* signature_defs = meta_graph_def_->mutable_signature_def(); + SignatureDef sig_def; + TensorInfo input_tensor_info; + input_tensor_info.set_name(kInputTensor); + (*sig_def.mutable_inputs())["inputs"] = input_tensor_info; + TensorInfo class_tensor_info; + class_tensor_info.set_name(kClassTensor); + (*sig_def.mutable_outputs())["classes"] = class_tensor_info; + TensorInfo scores_tensor_info; + scores_tensor_info.set_name(kScoreTensor); + (*sig_def.mutable_outputs())["scores"] = scores_tensor_info; + sig_def.set_method_name("tensorflow/serving/classify"); + (*signature_defs)["serving_default"] = sig_def; + + AddNamedSignatureToSavedModelBundle( + kInputTensor, kOutputPlusOneClassTensor, kOutputPlusOneSignature, + true /* is_classification */, meta_graph_def_); + AddNamedSignatureToSavedModelBundle( + kInputTensor, kOutputPlusOneClassTensor, kInvalidNamedSignature, + false /* is_classification */, meta_graph_def_); + + // Add a named signature where the output is not valid. + AddNamedSignatureToSavedModelBundle( + kInputTensor, kImproperlySizedScoresTensor, + kImproperlySizedScoresSignature, true /* is_classification */, + meta_graph_def_); } - fake_session_ = new FakeSession(expected_timeout); - bundle_->session.reset(fake_session_); - - // Setup some defaults for our signature. - tensorflow::serving::Signatures signatures; - auto signature = signatures.mutable_default_signature() - ->mutable_classification_signature(); - signature->mutable_input()->set_tensor_name(kInputTensor); - signature->mutable_classes()->set_tensor_name(kClassTensor); - signature->mutable_scores()->set_tensor_name(kScoreTensor); - - AddNamedSignature(kInputTensor, kOutputPlusOneClassTensor, - kOutputPlusOneSignature, true /* is_classification */, - &signatures); - AddNamedSignature(kInputTensor, kOutputPlusOneClassTensor, - kInvalidNamedSignature, false /* is_classification */, - &signatures); - - // Add a named signature where the output is not valid. - AddNamedSignature(kInputTensor, kImproperlySizedScoresTensor, - kImproperlySizedScoresSignature, - true /* is_classification */, &signatures); - TF_ASSERT_OK( - tensorflow::serving::SetSignatures(signatures, meta_graph_def_)); } protected: @@ -305,8 +364,8 @@ class ClassifierTest : public ::testing::TestWithParam { Status Create() { if (UseSavedModel()) { std::unique_ptr saved_model(new SavedModelBundle); - TF_RETURN_IF_ERROR(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); + saved_model->meta_graph_def = saved_model_bundle_->meta_graph_def; + saved_model->session = std::move(saved_model_bundle_->session); return CreateClassifierFromSavedModelBundle( GetRunOptions(), std::move(saved_model), &classifier_); } else { @@ -324,6 +383,7 @@ class ClassifierTest : public ::testing::TestWithParam { tensorflow::MetaGraphDef* meta_graph_def_; FakeSession* fake_session_; std::unique_ptr bundle_; + std::unique_ptr saved_model_bundle_; // Classifier valid after calling create. std::unique_ptr classifier_; @@ -362,11 +422,9 @@ TEST_P(ClassifierTest, ExampleList) { " } ")); // Test RunClassify if (UseSavedModel()) { - std::unique_ptr saved_model(new SavedModelBundle); - TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); ClassificationResponse response; - TF_ASSERT_OK(RunClassify(GetRunOptions(), saved_model->meta_graph_def, {}, + TF_ASSERT_OK(RunClassify(GetRunOptions(), + saved_model_bundle_->meta_graph_def, {}, fake_session_, request_, &response)); EXPECT_THAT(response.result(), EqualsProto(" classifications { " " classes { " @@ -424,11 +482,9 @@ TEST_P(ClassifierTest, ExampleListWithContext) { // Test RunClassify if (UseSavedModel()) { - std::unique_ptr saved_model(new SavedModelBundle); - TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); ClassificationResponse response; - TF_ASSERT_OK(RunClassify(GetRunOptions(), saved_model->meta_graph_def, {}, + TF_ASSERT_OK(RunClassify(GetRunOptions(), + saved_model_bundle_->meta_graph_def, {}, fake_session_, request_, &response)); EXPECT_THAT(response.result(), EqualsProto(" classifications { " " classes { " @@ -488,11 +544,9 @@ TEST_P(ClassifierTest, ExampleListWithContext_DuplicateFeatures) { // Test RunClassify if (UseSavedModel()) { - std::unique_ptr saved_model(new SavedModelBundle); - TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); ClassificationResponse response; - TF_ASSERT_OK(RunClassify(GetRunOptions(), saved_model->meta_graph_def, {}, + TF_ASSERT_OK(RunClassify(GetRunOptions(), + saved_model_bundle_->meta_graph_def, {}, fake_session_, request_, &response)); EXPECT_THAT(response.result(), EqualsProto(" classifications { " " classes { " @@ -518,13 +572,27 @@ TEST_P(ClassifierTest, ExampleListWithContext_DuplicateFeatures) { } TEST_P(ClassifierTest, ClassesOnly) { - tensorflow::serving::Signatures signatures; - auto signature = signatures.mutable_default_signature() - ->mutable_classification_signature(); - signature->mutable_input()->set_tensor_name(kInputTensor); - signature->mutable_classes()->set_tensor_name(kClassTensor); - // No scores Tensor. - TF_ASSERT_OK(tensorflow::serving::SetSignatures(signatures, meta_graph_def_)); + if (UseSavedModel()) { + auto* signature_defs = meta_graph_def_->mutable_signature_def(); + SignatureDef sig_def; + TensorInfo input_tensor_info; + input_tensor_info.set_name(kInputTensor); + (*sig_def.mutable_inputs())["inputs"] = input_tensor_info; + TensorInfo class_tensor_info; + class_tensor_info.set_name(kClassTensor); + (*sig_def.mutable_outputs())["classes"] = class_tensor_info; + sig_def.set_method_name("tensorflow/serving/classify"); + (*signature_defs)["serving_default"] = sig_def; + } else { + tensorflow::serving::Signatures signatures; + auto signature = signatures.mutable_default_signature() + ->mutable_classification_signature(); + signature->mutable_input()->set_tensor_name(kInputTensor); + signature->mutable_classes()->set_tensor_name(kClassTensor); + // No scores Tensor. + TF_ASSERT_OK(tensorflow::serving::session_bundle::SetSignatures( + signatures, meta_graph_def_)); + } TF_ASSERT_OK(Create()); auto* examples = request_.mutable_input()->mutable_example_list()->mutable_examples(); @@ -549,11 +617,9 @@ TEST_P(ClassifierTest, ClassesOnly) { " } ")); // Test RunClassify if (UseSavedModel()) { - std::unique_ptr saved_model(new SavedModelBundle); - TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); ClassificationResponse response; - TF_ASSERT_OK(RunClassify(GetRunOptions(), saved_model->meta_graph_def, {}, + TF_ASSERT_OK(RunClassify(GetRunOptions(), + saved_model_bundle_->meta_graph_def, {}, fake_session_, request_, &response)); EXPECT_THAT(response.result(), EqualsProto(" classifications { " " classes { " @@ -575,13 +641,28 @@ TEST_P(ClassifierTest, ClassesOnly) { } TEST_P(ClassifierTest, ScoresOnly) { - tensorflow::serving::Signatures signatures; - auto signature = signatures.mutable_default_signature() - ->mutable_classification_signature(); - signature->mutable_input()->set_tensor_name(kInputTensor); - // No classes Tensor. - signature->mutable_scores()->set_tensor_name(kScoreTensor); - TF_ASSERT_OK(tensorflow::serving::SetSignatures(signatures, meta_graph_def_)); + if (UseSavedModel()) { + auto* signature_defs = meta_graph_def_->mutable_signature_def(); + SignatureDef sig_def; + TensorInfo input_tensor_info; + input_tensor_info.set_name(kInputTensor); + (*sig_def.mutable_inputs())["inputs"] = input_tensor_info; + TensorInfo scores_tensor_info; + scores_tensor_info.set_name(kScoreTensor); + (*sig_def.mutable_outputs())["scores"] = scores_tensor_info; + sig_def.set_method_name("tensorflow/serving/classify"); + (*signature_defs)["serving_default"] = sig_def; + + } else { + tensorflow::serving::Signatures signatures; + auto signature = signatures.mutable_default_signature() + ->mutable_classification_signature(); + signature->mutable_input()->set_tensor_name(kInputTensor); + // No classes Tensor. + signature->mutable_scores()->set_tensor_name(kScoreTensor); + TF_ASSERT_OK(tensorflow::serving::session_bundle::SetSignatures( + signatures, meta_graph_def_)); + } TF_ASSERT_OK(Create()); auto* examples = request_.mutable_input()->mutable_example_list()->mutable_examples(); @@ -606,11 +687,9 @@ TEST_P(ClassifierTest, ScoresOnly) { " } ")); // Test RunClassify if (UseSavedModel()) { - std::unique_ptr saved_model(new SavedModelBundle); - TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); ClassificationResponse response; - TF_ASSERT_OK(RunClassify(GetRunOptions(), saved_model->meta_graph_def, {}, + TF_ASSERT_OK(RunClassify(GetRunOptions(), + saved_model_bundle_->meta_graph_def, {}, fake_session_, request_, &response)); EXPECT_THAT(response.result(), EqualsProto(" classifications { " " classes { " @@ -632,13 +711,27 @@ TEST_P(ClassifierTest, ScoresOnly) { } TEST_P(ClassifierTest, ZeroScoresArePresent) { - tensorflow::serving::Signatures signatures; - auto signature = signatures.mutable_default_signature() - ->mutable_classification_signature(); - signature->mutable_input()->set_tensor_name(kInputTensor); - // No classes Tensor. - signature->mutable_scores()->set_tensor_name(kScoreTensor); - TF_ASSERT_OK(tensorflow::serving::SetSignatures(signatures, meta_graph_def_)); + if (UseSavedModel()) { + auto* signature_defs = meta_graph_def_->mutable_signature_def(); + SignatureDef sig_def; + TensorInfo input_tensor_info; + input_tensor_info.set_name(kInputTensor); + (*sig_def.mutable_inputs())["inputs"] = input_tensor_info; + TensorInfo scores_tensor_info; + scores_tensor_info.set_name(kScoreTensor); + (*sig_def.mutable_outputs())["scores"] = scores_tensor_info; + sig_def.set_method_name("tensorflow/serving/classify"); + (*signature_defs)["serving_default"] = sig_def; + } else { + tensorflow::serving::Signatures signatures; + auto signature = signatures.mutable_default_signature() + ->mutable_classification_signature(); + signature->mutable_input()->set_tensor_name(kInputTensor); + // No classes Tensor. + signature->mutable_scores()->set_tensor_name(kScoreTensor); + TF_ASSERT_OK(tensorflow::serving::session_bundle::SetSignatures( + signatures, meta_graph_def_)); + } TF_ASSERT_OK(Create()); auto* examples = request_.mutable_input()->mutable_example_list()->mutable_examples(); @@ -657,11 +750,9 @@ TEST_P(ClassifierTest, ZeroScoresArePresent) { // Test RunClassify if (UseSavedModel()) { - std::unique_ptr saved_model(new SavedModelBundle); - TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); ClassificationResponse response; - TF_ASSERT_OK(RunClassify(GetRunOptions(), saved_model->meta_graph_def, {}, + TF_ASSERT_OK(RunClassify(GetRunOptions(), + saved_model_bundle_->meta_graph_def, {}, fake_session_, request_, &response)); // Parse the protos and compare the results with expected scores. ASSERT_EQ(response.result().classifications_size(), 1); @@ -731,11 +822,9 @@ TEST_P(ClassifierTest, ValidNamedSignature) { } // Test RunClassify if (UseSavedModel()) { - std::unique_ptr saved_model(new SavedModelBundle); - TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); ClassificationResponse response; - TF_ASSERT_OK(RunClassify(GetRunOptions(), saved_model->meta_graph_def, {}, + TF_ASSERT_OK(RunClassify(GetRunOptions(), + saved_model_bundle_->meta_graph_def, {}, fake_session_, request_, &response)); EXPECT_THAT(response.result(), EqualsProto(" classifications { " " classes { " @@ -800,12 +889,9 @@ TEST_P(ClassifierTest, InvalidNamedSignature) { } // Test RunClassify if (UseSavedModel()) { - std::unique_ptr saved_model(new SavedModelBundle); - TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); ClassificationResponse response; const Status status = - RunClassify(GetRunOptions(), saved_model->meta_graph_def, {}, + RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, fake_session_, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_EQ(::tensorflow::error::INVALID_ARGUMENT, status.code()) << status; @@ -832,12 +918,9 @@ TEST_P(ClassifierTest, MalformedScores) { EXPECT_EQ(::tensorflow::error::INVALID_ARGUMENT, status.code()) << status; // Test RunClassify if (UseSavedModel()) { - std::unique_ptr saved_model(new SavedModelBundle); - TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); ClassificationResponse response; const Status status = - RunClassify(GetRunOptions(), saved_model->meta_graph_def, {}, + RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, fake_session_, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_EQ(::tensorflow::error::INVALID_ARGUMENT, status.code()) << status; @@ -845,9 +928,16 @@ TEST_P(ClassifierTest, MalformedScores) { } TEST_P(ClassifierTest, MissingClassificationSignature) { - tensorflow::serving::Signatures signatures; - signatures.mutable_default_signature(); - TF_ASSERT_OK(tensorflow::serving::SetSignatures(signatures, meta_graph_def_)); + if (UseSavedModel()) { + auto* signature_defs = meta_graph_def_->mutable_signature_def(); + SignatureDef sig_def; + (*signature_defs)["serving_default"] = sig_def; + } else { + tensorflow::serving::Signatures signatures; + signatures.mutable_default_signature(); + TF_ASSERT_OK(tensorflow::serving::session_bundle::SetSignatures( + signatures, meta_graph_def_)); + } TF_ASSERT_OK(Create()); auto* examples = request_.mutable_input()->mutable_example_list()->mutable_examples(); @@ -866,12 +956,9 @@ TEST_P(ClassifierTest, MissingClassificationSignature) { } // Test RunClassify if (UseSavedModel()) { - std::unique_ptr saved_model(new SavedModelBundle); - TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); ClassificationResponse response; const Status status = - RunClassify(GetRunOptions(), saved_model->meta_graph_def, {}, + RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, fake_session_, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_EQ(::tensorflow::error::INVALID_ARGUMENT, status.code()) << status; @@ -888,12 +975,9 @@ TEST_P(ClassifierTest, EmptyInput) { ::testing::HasSubstr("Invalid argument: Input is empty")); // Test RunClassify if (UseSavedModel()) { - std::unique_ptr saved_model(new SavedModelBundle); - TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); ClassificationResponse response; const Status status = - RunClassify(GetRunOptions(), saved_model->meta_graph_def, {}, + RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, fake_session_, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), @@ -911,12 +995,9 @@ TEST_P(ClassifierTest, EmptyExampleList) { ::testing::HasSubstr("Invalid argument: Input is empty")); // Test RunClassify if (UseSavedModel()) { - std::unique_ptr saved_model(new SavedModelBundle); - TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); ClassificationResponse response; const Status status = - RunClassify(GetRunOptions(), saved_model->meta_graph_def, {}, + RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, fake_session_, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), @@ -936,12 +1017,9 @@ TEST_P(ClassifierTest, EmptyExampleListWithContext) { ::testing::HasSubstr("Invalid argument: Input is empty")); // Test RunClassify if (UseSavedModel()) { - std::unique_ptr saved_model(new SavedModelBundle); - TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); ClassificationResponse response; const Status status = - RunClassify(GetRunOptions(), saved_model->meta_graph_def, {}, + RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, fake_session_, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), @@ -951,12 +1029,13 @@ TEST_P(ClassifierTest, EmptyExampleListWithContext) { TEST_P(ClassifierTest, RunsFails) { MockSession* mock = new MockSession; - bundle_->session.reset(mock); if (UseSavedModel()) { + saved_model_bundle_->session.reset(mock); EXPECT_CALL(*mock, Run(_, _, _, _, _, _)) .WillRepeatedly( ::testing::Return(errors::Internal("Run totally failed"))); } else { + bundle_->session.reset(mock); EXPECT_CALL(*mock, Run(_, _, _, _)) .WillRepeatedly( ::testing::Return(errors::Internal("Run totally failed"))); @@ -970,13 +1049,10 @@ TEST_P(ClassifierTest, RunsFails) { EXPECT_THAT(status.ToString(), ::testing::HasSubstr("Run totally failed")); // Test RunClassify if (UseSavedModel()) { - std::unique_ptr saved_model(new SavedModelBundle); - TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); ClassificationResponse response; const Status status = - RunClassify(GetRunOptions(), saved_model->meta_graph_def, {}, mock, - request_, &response); + RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, + mock, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("Run totally failed")); } @@ -984,7 +1060,11 @@ TEST_P(ClassifierTest, RunsFails) { TEST_P(ClassifierTest, ClassesIncorrectTensorBatchSize) { MockSession* mock = new MockSession; - bundle_->session.reset(mock); + if (UseSavedModel()) { + saved_model_bundle_->session.reset(mock); + } else { + bundle_->session.reset(mock); + } // This Tensor only has one batch item but we will have two inputs. Tensor classes(DT_STRING, TensorShape({1, 2})); Tensor scores(DT_FLOAT, TensorShape({2, 2})); @@ -1009,13 +1089,10 @@ TEST_P(ClassifierTest, ClassesIncorrectTensorBatchSize) { EXPECT_THAT(status.ToString(), ::testing::HasSubstr("batch size")); // Test RunClassify if (UseSavedModel()) { - std::unique_ptr saved_model(new SavedModelBundle); - TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); ClassificationResponse response; const Status status = - RunClassify(GetRunOptions(), saved_model->meta_graph_def, {}, mock, - request_, &response); + RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, + mock, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("batch size")); } @@ -1023,7 +1100,11 @@ TEST_P(ClassifierTest, ClassesIncorrectTensorBatchSize) { TEST_P(ClassifierTest, ClassesIncorrectTensorType) { MockSession* mock = new MockSession; - bundle_->session.reset(mock); + if (UseSavedModel()) { + saved_model_bundle_->session.reset(mock); + } else { + bundle_->session.reset(mock); + } // This Tensor is the wrong type for class. Tensor classes(DT_FLOAT, TensorShape({2, 2})); Tensor scores(DT_FLOAT, TensorShape({2, 2})); @@ -1049,13 +1130,10 @@ TEST_P(ClassifierTest, ClassesIncorrectTensorType) { ::testing::HasSubstr("Expected classes Tensor of DT_STRING")); // Test RunClassify if (UseSavedModel()) { - std::unique_ptr saved_model(new SavedModelBundle); - TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); ClassificationResponse response; const Status status = - RunClassify(GetRunOptions(), saved_model->meta_graph_def, {}, mock, - request_, &response); + RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, + mock, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("Expected classes Tensor of DT_STRING")); @@ -1064,7 +1142,11 @@ TEST_P(ClassifierTest, ClassesIncorrectTensorType) { TEST_P(ClassifierTest, ScoresIncorrectTensorBatchSize) { MockSession* mock = new MockSession; - bundle_->session.reset(mock); + if (UseSavedModel()) { + saved_model_bundle_->session.reset(mock); + } else { + bundle_->session.reset(mock); + } Tensor classes(DT_STRING, TensorShape({2, 2})); // This Tensor only has one batch item but we will have two inputs. Tensor scores(DT_FLOAT, TensorShape({1, 2})); @@ -1089,13 +1171,10 @@ TEST_P(ClassifierTest, ScoresIncorrectTensorBatchSize) { EXPECT_THAT(status.ToString(), ::testing::HasSubstr("batch size")); // Test RunClassify if (UseSavedModel()) { - std::unique_ptr saved_model(new SavedModelBundle); - TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); ClassificationResponse response; const Status status = - RunClassify(GetRunOptions(), saved_model->meta_graph_def, {}, mock, - request_, &response); + RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, + mock, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("batch size")); } @@ -1103,7 +1182,11 @@ TEST_P(ClassifierTest, ScoresIncorrectTensorBatchSize) { TEST_P(ClassifierTest, ScoresIncorrectTensorType) { MockSession* mock = new MockSession; - bundle_->session.reset(mock); + if (UseSavedModel()) { + saved_model_bundle_->session.reset(mock); + } else { + bundle_->session.reset(mock); + } Tensor classes(DT_STRING, TensorShape({2, 2})); // This Tensor is the wrong type for class. Tensor scores(DT_STRING, TensorShape({2, 2})); @@ -1129,13 +1212,10 @@ TEST_P(ClassifierTest, ScoresIncorrectTensorType) { ::testing::HasSubstr("Expected scores Tensor of DT_FLOAT")); // Test RunClassify if (UseSavedModel()) { - std::unique_ptr saved_model(new SavedModelBundle); - TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); ClassificationResponse response; const Status status = - RunClassify(GetRunOptions(), saved_model->meta_graph_def, {}, mock, - request_, &response); + RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, + mock, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("Expected scores Tensor of DT_FLOAT")); @@ -1144,7 +1224,11 @@ TEST_P(ClassifierTest, ScoresIncorrectTensorType) { TEST_P(ClassifierTest, MismatchedNumberOfTensorClasses) { MockSession* mock = new MockSession; - bundle_->session.reset(mock); + if (UseSavedModel()) { + saved_model_bundle_->session.reset(mock); + } else { + bundle_->session.reset(mock); + } Tensor classes(DT_STRING, TensorShape({2, 2})); // Scores Tensor has three scores but classes only has two labels. Tensor scores(DT_FLOAT, TensorShape({2, 3})); @@ -1172,13 +1256,10 @@ TEST_P(ClassifierTest, MismatchedNumberOfTensorClasses) { "Tensors class and score should match in dim_size(1). Got 2 vs. 3")); // Test RunClassify if (UseSavedModel()) { - std::unique_ptr saved_model(new SavedModelBundle); - TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); ClassificationResponse response; const Status status = - RunClassify(GetRunOptions(), saved_model->meta_graph_def, {}, mock, - request_, &response); + RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, + mock, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("Tensors class and score should match in " @@ -1187,8 +1268,9 @@ TEST_P(ClassifierTest, MismatchedNumberOfTensorClasses) { } // Test all ClassifierTest test cases with both SessionBundle and SavedModel. -INSTANTIATE_TEST_CASE_P(UseSavedModel, ClassifierTest, ::testing::Bool()); - +INSTANTIATE_TEST_CASE_P(UseSavedModel, ClassifierTest, + IsTensorflowServingOSS() ? ::testing::Values(true) + : ::testing::Bool()); } // namespace } // namespace serving } // namespace tensorflow diff --git a/tensorflow_serving/servables/tensorflow/get_model_metadata_impl.cc b/tensorflow_serving/servables/tensorflow/get_model_metadata_impl.cc index 5b3ddf8e2d4..365ec20ddbe 100644 --- a/tensorflow_serving/servables/tensorflow/get_model_metadata_impl.cc +++ b/tensorflow_serving/servables/tensorflow/get_model_metadata_impl.cc @@ -22,8 +22,6 @@ limitations under the License. #include #include "tensorflow/cc/saved_model/loader.h" -#include "tensorflow/contrib/session_bundle/bundle_shim.h" -#include "tensorflow/contrib/session_bundle/session_bundle.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow_serving/core/servable_handle.h" diff --git a/tensorflow_serving/servables/tensorflow/get_model_metadata_impl_test.cc b/tensorflow_serving/servables/tensorflow/get_model_metadata_impl_test.cc index d0501fe2aee..907a32fe99d 100644 --- a/tensorflow_serving/servables/tensorflow/get_model_metadata_impl_test.cc +++ b/tensorflow_serving/servables/tensorflow/get_model_metadata_impl_test.cc @@ -25,8 +25,6 @@ limitations under the License. #include #include "tensorflow/cc/saved_model/loader.h" #include "tensorflow/cc/saved_model/signature_constants.h" -#include "tensorflow/contrib/session_bundle/bundle_shim.h" -#include "tensorflow/contrib/session_bundle/session_bundle.h" #include "tensorflow/core/lib/core/error_codes.pb.h" #include "tensorflow/core/lib/core/status_test_util.h" #include "tensorflow/core/platform/types.h" @@ -43,6 +41,7 @@ limitations under the License. #include "tensorflow_serving/servables/tensorflow/session_bundle_config.pb.h" #include "tensorflow_serving/servables/tensorflow/session_bundle_source_adapter.pb.h" #include "tensorflow_serving/test_util/test_util.h" +#include "tensorflow_serving/util/oss_or_google.h" namespace tensorflow { namespace serving { @@ -54,9 +53,11 @@ constexpr int kTestModelVersion = 123; class GetModelMetadataImplTest : public ::testing::TestWithParam { public: static void SetUpTestSuite() { - const string session_bundle_path = test_util::TestSrcDirPath( - "/servables/tensorflow/testdata/half_plus_two"); - TF_ASSERT_OK(CreateServerCore(session_bundle_path, false, &server_core_)); + if (!IsTensorflowServingOSS()) { + const string session_bundle_path = test_util::TestSrcDirPath( + "/servables/tensorflow/testdata/half_plus_two"); + TF_ASSERT_OK(CreateServerCore(session_bundle_path, false, &server_core_)); + } const string saved_model_path = test_util::TensorflowTestSrcDirPath( "cc/saved_model/testdata/half_plus_two"); @@ -232,7 +233,8 @@ TEST_P(GetModelMetadataImplTest, ModelSpecOverride) { // Test all ClassifierTest test cases with both SessionBundle and SavedModel. INSTANTIATE_TEST_CASE_P(UseSavedModel, GetModelMetadataImplTest, - ::testing::Bool()); + IsTensorflowServingOSS() ? ::testing::Values(true) + : ::testing::Bool()); } // namespace } // namespace serving diff --git a/tensorflow_serving/servables/tensorflow/multi_inference.h b/tensorflow_serving/servables/tensorflow/multi_inference.h index 28e11914483..f84efdba10f 100644 --- a/tensorflow_serving/servables/tensorflow/multi_inference.h +++ b/tensorflow_serving/servables/tensorflow/multi_inference.h @@ -16,8 +16,9 @@ limitations under the License. #ifndef TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_MULTI_INFERENCE_H_ #define TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_MULTI_INFERENCE_H_ -#include "tensorflow/contrib/session_bundle/session_bundle.h" #include "tensorflow/core/lib/core/status.h" +#include "tensorflow/core/protobuf/meta_graph.pb.h" +#include "tensorflow/core/public/session.h" #include "tensorflow_serving/apis/inference.pb.h" #include "tensorflow_serving/util/optional.h" diff --git a/tensorflow_serving/servables/tensorflow/multi_inference_helper.h b/tensorflow_serving/servables/tensorflow/multi_inference_helper.h index 9f31026a5f5..844a2d9c922 100644 --- a/tensorflow_serving/servables/tensorflow/multi_inference_helper.h +++ b/tensorflow_serving/servables/tensorflow/multi_inference_helper.h @@ -16,7 +16,6 @@ limitations under the License. #ifndef TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_MULTI_INFERENCE_HELPER_H_ #define TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_MULTI_INFERENCE_HELPER_H_ -#include "tensorflow/contrib/session_bundle/session_bundle.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow_serving/apis/inference.pb.h" #include "tensorflow_serving/model_servers/server_core.h" diff --git a/tensorflow_serving/servables/tensorflow/oss/BUILD b/tensorflow_serving/servables/tensorflow/oss/BUILD new file mode 100644 index 00000000000..fd00df33307 --- /dev/null +++ b/tensorflow_serving/servables/tensorflow/oss/BUILD @@ -0,0 +1,52 @@ +package( + default_visibility = [ + "//tensorflow_serving:internal", + ], + features = ["-layering_check"], +) + +licenses(["notice"]) # Apache 2.0 + +load("//tensorflow_serving:oss_or_google.bzl", "oss_only_cc_test") + +oss_only_cc_test( + name = "session_bundle_factory_test", + size = "medium", + srcs = ["session_bundle_factory_test.cc"], + data = ["//tensorflow_serving/session_bundle:session_bundle_half_plus_two"], + deps = [ + "//tensorflow_serving/core/test_util:test_main", + "//tensorflow_serving/servables/tensorflow:bundle_factory_test", + "//tensorflow_serving/servables/tensorflow:bundle_factory_test_util", + "//tensorflow_serving/servables/tensorflow:session_bundle_config_proto", + "//tensorflow_serving/servables/tensorflow:session_bundle_factory", + "//tensorflow_serving/test_util", + "@com_google_protobuf//:cc_wkt_protos", + "@org_tensorflow//tensorflow/core:core_cpu", + "@org_tensorflow//tensorflow/core:framework", + "@org_tensorflow//tensorflow/core:lib", + "@org_tensorflow//tensorflow/core:test", + ], +) + +oss_only_cc_test( + name = "session_bundle_source_adapter_test", + size = "medium", + srcs = ["session_bundle_source_adapter_test.cc"], + data = ["//tensorflow_serving/session_bundle:session_bundle_half_plus_two"], + # Link in all registered kernels. + linkstatic = 1, + deps = [ + "//tensorflow_serving/core:loader", + "//tensorflow_serving/core:servable_data", + "//tensorflow_serving/core/test_util:test_main", + "//tensorflow_serving/resources:resources_proto", + "//tensorflow_serving/servables/tensorflow:bundle_factory_test_util", + "//tensorflow_serving/servables/tensorflow:session_bundle_config_proto", + "//tensorflow_serving/servables/tensorflow:session_bundle_source_adapter", + "//tensorflow_serving/servables/tensorflow:session_bundle_source_adapter_proto", + "//tensorflow_serving/test_util", + "@org_tensorflow//tensorflow/core:lib", + "@org_tensorflow//tensorflow/core:test", + ], +) diff --git a/tensorflow_serving/servables/tensorflow/session_bundle_factory_test.cc b/tensorflow_serving/servables/tensorflow/oss/session_bundle_factory_test.cc similarity index 77% rename from tensorflow_serving/servables/tensorflow/session_bundle_factory_test.cc rename to tensorflow_serving/servables/tensorflow/oss/session_bundle_factory_test.cc index 06145856655..6b840f9529e 100644 --- a/tensorflow_serving/servables/tensorflow/session_bundle_factory_test.cc +++ b/tensorflow_serving/servables/tensorflow/oss/session_bundle_factory_test.cc @@ -23,7 +23,6 @@ limitations under the License. #include "google/protobuf/wrappers.pb.h" #include #include -#include "tensorflow/contrib/session_bundle/session_bundle.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/lib/core/status_test_util.h" #include "tensorflow/core/public/session.h" @@ -45,7 +44,6 @@ class SessionBundleFactoryTest : public test_util::BundleFactoryTest { virtual ~SessionBundleFactoryTest() = default; - private: Status CreateSession(const SessionBundleConfig& config, std::unique_ptr* session) const override { std::unique_ptr factory; @@ -57,21 +55,16 @@ class SessionBundleFactoryTest : public test_util::BundleFactoryTest { } }; -TEST_F(SessionBundleFactoryTest, Basic) { TestBasic(); } - -TEST_F(SessionBundleFactoryTest, Batching) { TestBatching(); } - -TEST_F(SessionBundleFactoryTest, EstimateResourceRequirementWithGoodExport) { - const double kTotalFileSize = - test_util::GetTotalFileSize(test_util::GetTestSessionBundleExportFiles()); - TestEstimateResourceRequirementWithGoodExport( - kTotalFileSize); +TEST_F(SessionBundleFactoryTest, Basic) { + const SessionBundleConfig config; + std::unique_ptr session; + Status status = CreateSession(config, &session); + EXPECT_EQ(::tensorflow::error::UNIMPLEMENTED, status.code()); + EXPECT_THAT( + status.ToString(), + ::testing::HasSubstr("Session Bundle is deprecated and removed.")); } -TEST_F(SessionBundleFactoryTest, RunOptions) { TestRunOptions(); } - -TEST_F(SessionBundleFactoryTest, RunOptionsError) { TestRunOptionsError(); } - } // namespace } // namespace serving } // namespace tensorflow diff --git a/tensorflow_serving/servables/tensorflow/session_bundle_source_adapter_test.cc b/tensorflow_serving/servables/tensorflow/oss/session_bundle_source_adapter_test.cc similarity index 92% rename from tensorflow_serving/servables/tensorflow/session_bundle_source_adapter_test.cc rename to tensorflow_serving/servables/tensorflow/oss/session_bundle_source_adapter_test.cc index e83a7b87322..5d40737a443 100644 --- a/tensorflow_serving/servables/tensorflow/session_bundle_source_adapter_test.cc +++ b/tensorflow_serving/servables/tensorflow/oss/session_bundle_source_adapter_test.cc @@ -22,7 +22,6 @@ limitations under the License. #include #include -#include "tensorflow/contrib/session_bundle/session_bundle.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/lib/core/status_test_util.h" #include "tensorflow_serving/core/loader.h" @@ -72,12 +71,11 @@ class SessionBundleSourceAdapterTest : public ::testing::Test { TF_ASSERT_OK(loader->EstimateResources(&second_resource_estimate)); EXPECT_THAT(second_resource_estimate, EqualsProto(first_resource_estimate)); - TF_ASSERT_OK(loader->Load()); - - const SessionBundle* bundle = loader->servable().get(); - test_util::TestSingleRequest(bundle->session.get()); - - loader->Unload(); + Status status = loader->Load(); + EXPECT_EQ(::tensorflow::error::UNIMPLEMENTED, status.code()); + EXPECT_THAT( + status.ToString(), + ::testing::HasSubstr("Session Bundle is deprecated and removed.")); } }; diff --git a/tensorflow_serving/servables/tensorflow/predict_impl.cc b/tensorflow_serving/servables/tensorflow/predict_impl.cc index f9cfb149bdb..430a17361f3 100644 --- a/tensorflow_serving/servables/tensorflow/predict_impl.cc +++ b/tensorflow_serving/servables/tensorflow/predict_impl.cc @@ -24,6 +24,7 @@ limitations under the License. #include "tensorflow_serving/core/servable_handle.h" #include "tensorflow_serving/servables/tensorflow/predict_util.h" #include "tensorflow_serving/servables/tensorflow/util.h" +#include "tensorflow_serving/session_bundle/session_bundle_util.h" namespace tensorflow { namespace serving { @@ -38,14 +39,16 @@ Status SessionBundlePredict( Session* session) { // Validate signatures. Signature signature; - TF_RETURN_IF_ERROR(GetNamedSignature("inputs", meta_graph_def, &signature)); + TF_RETURN_IF_ERROR( + session_bundle::GetNamedSignature("inputs", meta_graph_def, &signature)); if (!signature.has_generic_signature()) { return tensorflow::Status( tensorflow::error::INVALID_ARGUMENT, "'inputs' named signature is not a generic signature"); } GenericSignature input_signature = signature.generic_signature(); - TF_RETURN_IF_ERROR(GetNamedSignature("outputs", meta_graph_def, &signature)); + TF_RETURN_IF_ERROR( + session_bundle::GetNamedSignature("outputs", meta_graph_def, &signature)); if (!signature.has_generic_signature()) { return tensorflow::Status( tensorflow::error::INVALID_ARGUMENT, diff --git a/tensorflow_serving/servables/tensorflow/predict_impl_test.cc b/tensorflow_serving/servables/tensorflow/predict_impl_test.cc index cb66f82e8d6..f1c360ff215 100644 --- a/tensorflow_serving/servables/tensorflow/predict_impl_test.cc +++ b/tensorflow_serving/servables/tensorflow/predict_impl_test.cc @@ -18,7 +18,6 @@ limitations under the License. #include #include #include "tensorflow/cc/saved_model/signature_constants.h" -#include "tensorflow/contrib/session_bundle/session_bundle.h" #include "tensorflow/core/lib/core/status_test_util.h" #include "tensorflow_serving/core/availability_preserving_policy.h" #include "tensorflow_serving/model_servers/model_platform_types.h" @@ -28,6 +27,7 @@ limitations under the License. #include "tensorflow_serving/servables/tensorflow/session_bundle_config.pb.h" #include "tensorflow_serving/servables/tensorflow/session_bundle_source_adapter.pb.h" #include "tensorflow_serving/test_util/test_util.h" +#include "tensorflow_serving/util/oss_or_google.h" namespace tensorflow { namespace serving { @@ -43,20 +43,22 @@ const char kOutputTensorKey[] = "y"; class PredictImplTest : public ::testing::TestWithParam { public: static void SetUpTestSuite() { - TF_ASSERT_OK( - CreateServerCore(test_util::TestSrcDirPath( - "/servables/tensorflow/testdata/half_plus_two"), - false, &server_core_)); - const string bad_half_plus_two_path = test_util::TestSrcDirPath( - "/servables/tensorflow/testdata/bad_half_plus_two"); - TF_ASSERT_OK(CreateServerCore(bad_half_plus_two_path, false, - &server_core_bad_model_)); + if (!IsTensorflowServingOSS()) { + TF_ASSERT_OK( + CreateServerCore(test_util::TestSrcDirPath( + "/servables/tensorflow/testdata/half_plus_two"), + false, &server_core_)); + const string bad_half_plus_two_path = test_util::TestSrcDirPath( + "/servables/tensorflow/testdata/bad_half_plus_two"); + TF_ASSERT_OK(CreateServerCore(bad_half_plus_two_path, false, + &server_core_bad_model_)); + TF_ASSERT_OK(CreateServerCore(bad_half_plus_two_path, true, + &saved_model_server_core_bad_model_)); + } TF_ASSERT_OK(CreateServerCore(test_util::TensorflowTestSrcDirPath( "cc/saved_model/testdata/half_plus_two"), true, &saved_model_server_core_)); - TF_ASSERT_OK(CreateServerCore(bad_half_plus_two_path, true, - &saved_model_server_core_bad_model_)); TF_ASSERT_OK(CreateServerCore( test_util::TestSrcDirPath( "/servables/tensorflow/testdata/saved_model_counter"), @@ -253,6 +255,10 @@ TEST_P(PredictImplTest, InputTensorsHaveWrongType) { } TEST_P(PredictImplTest, ModelMissingSignatures) { + if (GetParam()) { + // The test is only related to SessionBundle. + return; + } PredictRequest request; PredictResponse response; @@ -507,7 +513,9 @@ TEST_P(PredictImplTest, ModelSpecOverride) { } // Test all PredictImplTest test cases with both SessionBundle and SavedModel. -INSTANTIATE_TEST_CASE_P(UseSavedModel, PredictImplTest, ::testing::Bool()); +INSTANTIATE_TEST_CASE_P(UseSavedModel, PredictImplTest, + IsTensorflowServingOSS() ? ::testing::Values(true) + : ::testing::Bool()); } // namespace } // namespace serving diff --git a/tensorflow_serving/servables/tensorflow/predict_util.cc b/tensorflow_serving/servables/tensorflow/predict_util.cc index f2df29132a1..977ea301afc 100644 --- a/tensorflow_serving/servables/tensorflow/predict_util.cc +++ b/tensorflow_serving/servables/tensorflow/predict_util.cc @@ -24,7 +24,6 @@ limitations under the License. #include "absl/strings/str_join.h" #include "absl/strings/substitute.h" #include "tensorflow/cc/saved_model/signature_constants.h" -#include "tensorflow/contrib/session_bundle/signature.h" #include "tensorflow/core/framework/tensor.pb.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/protobuf/named_tensor.pb.h" diff --git a/tensorflow_serving/servables/tensorflow/predict_util.h b/tensorflow_serving/servables/tensorflow/predict_util.h index ca741e68f40..a406fba8839 100644 --- a/tensorflow_serving/servables/tensorflow/predict_util.h +++ b/tensorflow_serving/servables/tensorflow/predict_util.h @@ -16,8 +16,10 @@ limitations under the License. #ifndef TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_PREDICT_UTIL_H_ #define TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_PREDICT_UTIL_H_ -#include "tensorflow/contrib/session_bundle/session_bundle.h" #include "tensorflow/core/lib/core/status.h" +#include "tensorflow/core/protobuf/config.pb.h" +#include "tensorflow/core/protobuf/meta_graph.pb.h" +#include "tensorflow/core/public/session.h" #include "tensorflow_serving/apis/predict.pb.h" #include "tensorflow_serving/util/optional.h" diff --git a/tensorflow_serving/servables/tensorflow/predict_util_test.cc b/tensorflow_serving/servables/tensorflow/predict_util_test.cc index 0e017d782c8..b79a290fee8 100644 --- a/tensorflow_serving/servables/tensorflow/predict_util_test.cc +++ b/tensorflow_serving/servables/tensorflow/predict_util_test.cc @@ -20,7 +20,6 @@ limitations under the License. #include "absl/strings/str_cat.h" #include "tensorflow/cc/saved_model/loader.h" #include "tensorflow/cc/saved_model/signature_constants.h" -#include "tensorflow/contrib/session_bundle/session_bundle.h" #include "tensorflow/core/lib/core/status_test_util.h" #include "tensorflow_serving/core/availability_preserving_policy.h" #include "tensorflow_serving/model_servers/model_platform_types.h" @@ -30,6 +29,7 @@ limitations under the License. #include "tensorflow_serving/servables/tensorflow/session_bundle_config.pb.h" #include "tensorflow_serving/servables/tensorflow/session_bundle_source_adapter.pb.h" #include "tensorflow_serving/test_util/test_util.h" +#include "tensorflow_serving/util/oss_or_google.h" namespace tensorflow { namespace serving { @@ -45,14 +45,16 @@ const char kOutputTensorKey[] = "y"; class PredictImplTest : public ::testing::Test { public: static void SetUpTestSuite() { - const string bad_half_plus_two_path = test_util::TestSrcDirPath( - "/servables/tensorflow/testdata/bad_half_plus_two"); + if (!IsTensorflowServingOSS()) { + const string bad_half_plus_two_path = test_util::TestSrcDirPath( + "/servables/tensorflow/testdata/bad_half_plus_two"); + TF_ASSERT_OK(CreateServerCore(bad_half_plus_two_path, true, + &saved_model_server_core_bad_model_)); + } TF_ASSERT_OK(CreateServerCore(test_util::TensorflowTestSrcDirPath( "cc/saved_model/testdata/half_plus_two"), true, &saved_model_server_core_)); - TF_ASSERT_OK(CreateServerCore(bad_half_plus_two_path, true, - &saved_model_server_core_bad_model_)); TF_ASSERT_OK(CreateServerCore( test_util::TestSrcDirPath( "/servables/tensorflow/testdata/saved_model_counter"), @@ -251,6 +253,9 @@ TEST_F(PredictImplTest, InputTensorsHaveWrongType) { } TEST_F(PredictImplTest, ModelMissingSignatures) { + if (IsTensorflowServingOSS()) { + return; + } PredictRequest request; PredictResponse response; diff --git a/tensorflow_serving/servables/tensorflow/regression_service.cc b/tensorflow_serving/servables/tensorflow/regression_service.cc index 9306015e42a..c730611a2f6 100644 --- a/tensorflow_serving/servables/tensorflow/regression_service.cc +++ b/tensorflow_serving/servables/tensorflow/regression_service.cc @@ -15,8 +15,6 @@ limitations under the License. #include "tensorflow_serving/servables/tensorflow/regression_service.h" -#include "tensorflow/contrib/session_bundle/session_bundle.h" -#include "tensorflow/contrib/session_bundle/signature.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/platform/tracing.h" #include "tensorflow_serving/apis/regressor.h" diff --git a/tensorflow_serving/servables/tensorflow/regressor.cc b/tensorflow_serving/servables/tensorflow/regressor.cc index 4d871ceb380..a0818cc95ba 100644 --- a/tensorflow_serving/servables/tensorflow/regressor.cc +++ b/tensorflow_serving/servables/tensorflow/regressor.cc @@ -24,7 +24,6 @@ limitations under the License. #include #include "tensorflow/cc/saved_model/signature_constants.h" -#include "tensorflow/contrib/session_bundle/signature.h" #include "tensorflow/core/example/example.pb.h" #include "tensorflow/core/framework/tensor.h" #include "tensorflow/core/lib/core/errors.h" @@ -37,6 +36,7 @@ limitations under the License. #include "tensorflow_serving/apis/regression.pb.h" #include "tensorflow_serving/apis/regressor.h" #include "tensorflow_serving/servables/tensorflow/util.h" +#include "tensorflow_serving/session_bundle/session_bundle_util.h" namespace tensorflow { namespace serving { @@ -70,8 +70,8 @@ class TensorFlowRegressor : public RegressorInterface { TRACELITERAL("RunRegression"); Tensor output; - TF_RETURN_IF_ERROR( - RunRegression(*signature_, input_tensor, session_, &output)); + TF_RETURN_IF_ERROR(session_bundle::RunRegression(*signature_, input_tensor, + session_, &output)); if (output.dtype() != DT_FLOAT) { return errors::Internal("Expected output Tensor of DT_FLOAT. Got: ", @@ -146,8 +146,8 @@ class SessionBundleRegressor : public RegressorInterface { Status Regress(const RegressionRequest& request, RegressionResult* result) override { RegressionSignature signature; - TF_RETURN_IF_ERROR( - GetRegressionSignature(bundle_->meta_graph_def, &signature)); + TF_RETURN_IF_ERROR(session_bundle::GetRegressionSignature( + bundle_->meta_graph_def, &signature)); TensorFlowRegressor regressor(bundle_->session.get(), &signature); return regressor.Regress(request, result); diff --git a/tensorflow_serving/servables/tensorflow/regressor.h b/tensorflow_serving/servables/tensorflow/regressor.h index fbcab3dd528..765ae6bd83b 100644 --- a/tensorflow_serving/servables/tensorflow/regressor.h +++ b/tensorflow_serving/servables/tensorflow/regressor.h @@ -21,9 +21,9 @@ limitations under the License. #include #include "tensorflow/cc/saved_model/loader.h" -#include "tensorflow/contrib/session_bundle/session_bundle.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow_serving/apis/regressor.h" +#include "tensorflow_serving/session_bundle/session_bundle_util.h" #include "tensorflow_serving/util/optional.h" namespace tensorflow { diff --git a/tensorflow_serving/servables/tensorflow/regressor_test.cc b/tensorflow_serving/servables/tensorflow/regressor_test.cc index 0d6ace4463e..c1fc991a7cd 100644 --- a/tensorflow_serving/servables/tensorflow/regressor_test.cc +++ b/tensorflow_serving/servables/tensorflow/regressor_test.cc @@ -21,8 +21,6 @@ limitations under the License. #include #include "google/protobuf/map.h" -#include "tensorflow/contrib/session_bundle/bundle_shim.h" -#include "tensorflow/contrib/session_bundle/session_bundle.h" #include "tensorflow/core/example/example.pb.h" #include "tensorflow/core/example/feature.pb.h" #include "tensorflow/core/lib/core/errors.h" @@ -35,8 +33,10 @@ limitations under the License. #include "tensorflow_serving/apis/model.pb.h" #include "tensorflow_serving/apis/regression.pb.h" #include "tensorflow_serving/core/test_util/mock_session.h" +#include "tensorflow_serving/session_bundle/session_bundle_util.h" #include "tensorflow_serving/test_util/test_util.h" #include "tensorflow_serving/util/optional.h" +#include "tensorflow_serving/util/oss_or_google.h" namespace tensorflow { namespace serving { @@ -202,41 +202,104 @@ void AddNamedSignature(const string& input_tensor_name, signature_name, named_signature)); } +// Add a named signature to the mutable meta_graph_def* parameter. +// If is_classification is false, will add a regression signature, which is +// invalid in classification requests. +void AddNamedSignatureToSavedModelBundle( + const string& input_tensor_name, const string& output_scores_tensor_name, + const string& signature_name, const bool is_regression, + tensorflow::MetaGraphDef* meta_graph_def) { + auto* signature_defs = meta_graph_def->mutable_signature_def(); + SignatureDef sig_def; + string methond_name; + if (is_regression) { + TensorInfo input_tensor_info; + input_tensor_info.set_name(input_tensor_name); + (*sig_def.mutable_inputs())["inputs"] = input_tensor_info; + TensorInfo scores_tensor_info; + scores_tensor_info.set_name(output_scores_tensor_name); + (*sig_def.mutable_outputs())["outputs"] = scores_tensor_info; + methond_name = "tensorflow/serving/regress"; + } else { + TensorInfo input_tensor_info; + input_tensor_info.set_name(input_tensor_name); + (*sig_def.mutable_inputs())["inputs"] = input_tensor_info; + TensorInfo class_tensor_info; + class_tensor_info.set_name(kOutputPlusOneTensor); + (*sig_def.mutable_outputs())["classes"] = class_tensor_info; + methond_name = "tensorflow/serving/classify"; + } + sig_def.set_method_name(methond_name); + (*signature_defs)[signature_name] = sig_def; +} + // Parameter is 'bool use_saved_model'. class RegressorTest : public ::testing::TestWithParam { public: void SetUp() override { - bundle_.reset(new SessionBundle); - meta_graph_def_ = &bundle_->meta_graph_def; - optional expected_timeout = GetRunOptions().timeout_in_ms(); - if (!GetParam()) { - // For SessionBundle we don't propagate the timeout. - expected_timeout = nullopt; + if (UseSavedModel()) { + saved_model_bundle_.reset(new SavedModelBundle); + meta_graph_def_ = &saved_model_bundle_->meta_graph_def; + optional expected_timeout = GetRunOptions().timeout_in_ms(); + fake_session_ = new FakeSession(expected_timeout); + saved_model_bundle_->session.reset(fake_session_); + + auto* signature_defs = meta_graph_def_->mutable_signature_def(); + SignatureDef sig_def; + TensorInfo input_tensor_info; + input_tensor_info.set_name(kInputTensor); + (*sig_def.mutable_inputs())["inputs"] = input_tensor_info; + TensorInfo scores_tensor_info; + scores_tensor_info.set_name(kOutputTensor); + (*sig_def.mutable_outputs())["outputs"] = scores_tensor_info; + sig_def.set_method_name("tensorflow/serving/regress"); + (*signature_defs)["serving_default"] = sig_def; + + AddNamedSignatureToSavedModelBundle( + kInputTensor, kOutputPlusOneTensor, kOutputPlusOneSignature, + true /* is_regression */, meta_graph_def_); + AddNamedSignatureToSavedModelBundle( + kInputTensor, kOutputPlusOneTensor, kInvalidNamedSignature, + false /* is_regression */, meta_graph_def_); + + // Add a named signature where the output is not valid. + AddNamedSignatureToSavedModelBundle( + kInputTensor, kImproperlySizedOutputTensor, + kImproperlySizedOutputSignature, true /* is_regression */, + meta_graph_def_); + } else { + bundle_.reset(new SessionBundle); + meta_graph_def_ = &bundle_->meta_graph_def; + optional expected_timeout = GetRunOptions().timeout_in_ms(); + if (!GetParam()) { + // For SessionBundle we don't propagate the timeout. + expected_timeout = nullopt; + } + fake_session_ = new FakeSession(expected_timeout); + bundle_->session.reset(fake_session_); + + // Setup some defaults for our signature. + tensorflow::serving::Signatures signatures; + auto default_signature = signatures.mutable_default_signature() + ->mutable_regression_signature(); + default_signature->mutable_input()->set_tensor_name(kInputTensor); + default_signature->mutable_output()->set_tensor_name(kOutputTensor); + + AddNamedSignature(kInputTensor, kOutputPlusOneTensor, + kOutputPlusOneSignature, true /* is_regression */, + &signatures); + AddNamedSignature(kInputTensor, kOutputPlusOneTensor, + kInvalidNamedSignature, false /* is_regression */, + &signatures); + + // Add a named signature where the output is not valid. + AddNamedSignature(kInputTensor, kImproperlySizedOutputTensor, + kImproperlySizedOutputSignature, + true /* is_regression */, &signatures); + + TF_ASSERT_OK(tensorflow::serving::session_bundle::SetSignatures( + signatures, meta_graph_def_)); } - fake_session_ = new FakeSession(expected_timeout); - bundle_->session.reset(fake_session_); - - // Setup some defaults for our signature. - tensorflow::serving::Signatures signatures; - auto default_signature = - signatures.mutable_default_signature()->mutable_regression_signature(); - default_signature->mutable_input()->set_tensor_name(kInputTensor); - default_signature->mutable_output()->set_tensor_name(kOutputTensor); - - AddNamedSignature(kInputTensor, kOutputPlusOneTensor, - kOutputPlusOneSignature, true /* is_regression */, - &signatures); - AddNamedSignature(kInputTensor, kOutputPlusOneTensor, - kInvalidNamedSignature, false /* is_regression */, - &signatures); - - // Add a named signature where the output is not valid. - AddNamedSignature(kInputTensor, kImproperlySizedOutputTensor, - kImproperlySizedOutputSignature, true /* is_regression */, - &signatures); - - TF_ASSERT_OK( - tensorflow::serving::SetSignatures(signatures, meta_graph_def_)); } // Whether or not to use SavedModel for this test. Simply wraps GetParam() @@ -256,8 +319,8 @@ class RegressorTest : public ::testing::TestWithParam { Status Create() { if (UseSavedModel()) { std::unique_ptr saved_model(new SavedModelBundle); - TF_RETURN_IF_ERROR(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); + saved_model->meta_graph_def = saved_model_bundle_->meta_graph_def; + saved_model->session = std::move(saved_model_bundle_->session); return CreateRegressorFromSavedModelBundle( GetRunOptions(), std::move(saved_model), ®ressor_); } else { @@ -275,6 +338,7 @@ class RegressorTest : public ::testing::TestWithParam { tensorflow::MetaGraphDef* meta_graph_def_; FakeSession* fake_session_; std::unique_ptr bundle_; + std::unique_ptr saved_model_bundle_; // Regression model valid after calling create. std::unique_ptr regressor_; @@ -297,14 +361,11 @@ TEST_P(RegressorTest, BasicExampleList) { " regressions { " " value: 3.0 " " } ")); - // Test RunRegress if (UseSavedModel()) { - std::unique_ptr saved_model(new SavedModelBundle); - TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); RegressionResponse response; - TF_ASSERT_OK(RunRegress(GetRunOptions(), saved_model->meta_graph_def, {}, + TF_ASSERT_OK(RunRegress(GetRunOptions(), + saved_model_bundle_->meta_graph_def, {}, fake_session_, request_, &response)); EXPECT_THAT(response.result(), EqualsProto(" regressions { " " value: 2.0 " @@ -333,11 +394,9 @@ TEST_P(RegressorTest, BasicExampleListWithContext) { " } ")); // Test RunRegress if (UseSavedModel()) { - std::unique_ptr saved_model(new SavedModelBundle); - TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); RegressionResponse response; - TF_ASSERT_OK(RunRegress(GetRunOptions(), saved_model->meta_graph_def, {}, + TF_ASSERT_OK(RunRegress(GetRunOptions(), + saved_model_bundle_->meta_graph_def, {}, fake_session_, request_, &response)); EXPECT_THAT(response.result(), EqualsProto(" regressions { " " value: 3.0 " @@ -377,11 +436,9 @@ TEST_P(RegressorTest, ValidNamedSignature) { } // Test RunRegress if (UseSavedModel()) { - std::unique_ptr saved_model(new SavedModelBundle); - TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); RegressionResponse response; - TF_ASSERT_OK(RunRegress(GetRunOptions(), saved_model->meta_graph_def, {}, + TF_ASSERT_OK(RunRegress(GetRunOptions(), + saved_model_bundle_->meta_graph_def, {}, fake_session_, request_, &response)); EXPECT_THAT(response.result(), EqualsProto(" regressions { " " value: 3.0 " @@ -419,12 +476,9 @@ TEST_P(RegressorTest, InvalidNamedSignature) { } // Test RunRegress if (UseSavedModel()) { - std::unique_ptr saved_model(new SavedModelBundle); - TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); RegressionResponse response; const Status status = - RunRegress(GetRunOptions(), saved_model->meta_graph_def, {}, + RunRegress(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, fake_session_, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_EQ(::tensorflow::error::INVALID_ARGUMENT, status.code()) << status; @@ -450,11 +504,8 @@ TEST_P(RegressorTest, MalformedOutputs) { ASSERT_FALSE(status.ok()); EXPECT_EQ(::tensorflow::error::INVALID_ARGUMENT, status.code()) << status; // Test RunRegress - std::unique_ptr saved_model(new SavedModelBundle); - TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); RegressionResponse response; - status = RunRegress(GetRunOptions(), saved_model->meta_graph_def, {}, + status = RunRegress(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, fake_session_, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_EQ(::tensorflow::error::INVALID_ARGUMENT, status.code()) << status; @@ -470,12 +521,9 @@ TEST_P(RegressorTest, EmptyInput) { ::testing::HasSubstr("Invalid argument: Input is empty")); // Test RunRegress if (UseSavedModel()) { - std::unique_ptr saved_model(new SavedModelBundle); - TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); RegressionResponse response; const Status status = - RunRegress(GetRunOptions(), saved_model->meta_graph_def, {}, + RunRegress(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, fake_session_, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), @@ -492,12 +540,9 @@ TEST_P(RegressorTest, EmptyExampleList) { ::testing::HasSubstr("Invalid argument: Input is empty")); // Test RunRegress if (UseSavedModel()) { - std::unique_ptr saved_model(new SavedModelBundle); - TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); RegressionResponse response; const Status status = - RunRegress(GetRunOptions(), saved_model->meta_graph_def, {}, + RunRegress(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, fake_session_, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), @@ -517,12 +562,9 @@ TEST_P(RegressorTest, EmptyExampleListWithContext) { ::testing::HasSubstr("Invalid argument: Input is empty")); // Test RunRegress if (UseSavedModel()) { - std::unique_ptr saved_model(new SavedModelBundle); - TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); RegressionResponse response; const Status status = - RunRegress(GetRunOptions(), saved_model->meta_graph_def, {}, + RunRegress(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, fake_session_, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), @@ -532,7 +574,11 @@ TEST_P(RegressorTest, EmptyExampleListWithContext) { TEST_P(RegressorTest, RunsFails) { MockSession* mock = new MockSession; - bundle_->session.reset(mock); + if (UseSavedModel()) { + saved_model_bundle_->session.reset(mock); + } else { + bundle_->session.reset(mock); + } if (GetParam()) { EXPECT_CALL(*mock, Run(_, _, _, _, _, _)) .WillRepeatedly( @@ -550,13 +596,10 @@ TEST_P(RegressorTest, RunsFails) { EXPECT_THAT(status.ToString(), ::testing::HasSubstr("Run totally failed")); // Test RunRegress if (UseSavedModel()) { - std::unique_ptr saved_model(new SavedModelBundle); - TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); RegressionResponse response; const Status status = - RunRegress(GetRunOptions(), saved_model->meta_graph_def, {}, mock, - request_, &response); + RunRegress(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, + mock, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("Run totally failed")); } @@ -564,7 +607,11 @@ TEST_P(RegressorTest, RunsFails) { TEST_P(RegressorTest, UnexpectedOutputTensorSize) { MockSession* mock = new MockSession; - bundle_->session.reset(mock); + if (UseSavedModel()) { + saved_model_bundle_->session.reset(mock); + } else { + bundle_->session.reset(mock); + } std::vector outputs = {Tensor(DT_FLOAT, TensorShape({2}))}; if (GetParam()) { EXPECT_CALL(*mock, Run(_, _, _, _, _, _)) @@ -586,13 +633,10 @@ TEST_P(RegressorTest, UnexpectedOutputTensorSize) { EXPECT_CALL(*mock, Run(_, _, _, _, _, _)) .WillOnce(::testing::DoAll(::testing::SetArgPointee<4>(outputs), ::testing::Return(Status::OK()))); - std::unique_ptr saved_model(new SavedModelBundle); - TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); RegressionResponse response; const Status status = - RunRegress(GetRunOptions(), saved_model->meta_graph_def, {}, mock, - request_, &response); + RunRegress(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, + mock, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("output batch size")); } @@ -600,7 +644,11 @@ TEST_P(RegressorTest, UnexpectedOutputTensorSize) { TEST_P(RegressorTest, UnexpectedOutputTensorType) { MockSession* mock = new MockSession; - bundle_->session.reset(mock); + if (UseSavedModel()) { + saved_model_bundle_->session.reset(mock); + } else { + bundle_->session.reset(mock); + } // We expect a FLOAT output type; test returning a STRING. std::vector outputs = {Tensor(DT_STRING, TensorShape({1}))}; if (GetParam()) { @@ -624,13 +672,10 @@ TEST_P(RegressorTest, UnexpectedOutputTensorType) { EXPECT_CALL(*mock, Run(_, _, _, _, _, _)) .WillOnce(::testing::DoAll(::testing::SetArgPointee<4>(outputs), ::testing::Return(Status::OK()))); - std::unique_ptr saved_model(new SavedModelBundle); - TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); RegressionResponse response; const Status status = - RunRegress(GetRunOptions(), saved_model->meta_graph_def, {}, mock, - request_, &response); + RunRegress(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, + mock, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("Expected output Tensor of DT_FLOAT")); @@ -638,9 +683,16 @@ TEST_P(RegressorTest, UnexpectedOutputTensorType) { } TEST_P(RegressorTest, MissingRegressionSignature) { - tensorflow::serving::Signatures signatures; - signatures.mutable_default_signature(); - TF_ASSERT_OK(tensorflow::serving::SetSignatures(signatures, meta_graph_def_)); + if (UseSavedModel()) { + auto* signature_defs = meta_graph_def_->mutable_signature_def(); + SignatureDef sig_def; + (*signature_defs)["serving_default"] = sig_def; + } else { + tensorflow::serving::Signatures signatures; + signatures.mutable_default_signature(); + TF_ASSERT_OK(tensorflow::serving::session_bundle::SetSignatures( + signatures, meta_graph_def_)); + } TF_ASSERT_OK(Create()); Feature feature; feature.mutable_bytes_list()->add_value("uno"); @@ -662,12 +714,9 @@ TEST_P(RegressorTest, MissingRegressionSignature) { } // Test RunRegress if (UseSavedModel()) { - std::unique_ptr saved_model(new SavedModelBundle); - TF_ASSERT_OK(internal::ConvertSessionBundleToSavedModelBundle( - *bundle_, saved_model.get())); RegressionResponse response; const Status status = - RunRegress(GetRunOptions(), saved_model->meta_graph_def, {}, + RunRegress(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, fake_session_, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_EQ(::tensorflow::error::INVALID_ARGUMENT, status.code()) << status; @@ -675,7 +724,9 @@ TEST_P(RegressorTest, MissingRegressionSignature) { } // Test all RegressorTest test cases with both SessionBundle and SavedModel. -INSTANTIATE_TEST_CASE_P(UseSavedModel, RegressorTest, ::testing::Bool()); +INSTANTIATE_TEST_CASE_P(UseSavedModel, RegressorTest, + IsTensorflowServingOSS() ? ::testing::Values(true) + : ::testing::Bool()); } // namespace } // namespace serving diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc index 113fe16972b..b68e5d18b33 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc @@ -17,7 +17,6 @@ limitations under the License. #include "absl/strings/string_view.h" #include "tensorflow/cc/saved_model/tag_constants.h" -#include "tensorflow/contrib/session_bundle/bundle_shim.h" #include "tensorflow/core/framework/tensor.pb.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/lib/io/path.h" @@ -28,6 +27,7 @@ limitations under the License. #include "tensorflow_serving/servables/tensorflow/bundle_factory_util.h" #include "tensorflow_serving/servables/tensorflow/curried_session.h" #include "tensorflow_serving/servables/tensorflow/tflite_session.h" +#include "tensorflow_serving/session_bundle/session_bundle_util.h" namespace tensorflow { namespace serving { @@ -141,7 +141,7 @@ Status SavedModelBundleFactory::InternalCreateSavedModelBundle( if (config_.use_tflite_model()) { TF_RETURN_IF_ERROR(LoadTfLiteModel(path, bundle->get())); } else { - TF_RETURN_IF_ERROR(LoadSessionBundleOrSavedModelBundle( + TF_RETURN_IF_ERROR(session_bundle::LoadSessionBundleOrSavedModelBundle( session_options, GetRunOptions(config_), path, saved_model_tags, bundle->get())); } diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory_test.cc b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory_test.cc index 2d3caedaa00..87c845e4623 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory_test.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory_test.cc @@ -219,55 +219,6 @@ TEST_P(SavedModelBundleFactoryTest, RunOptions) { TestRunOptions(); } TEST_P(SavedModelBundleFactoryTest, RunOptionsError) { TestRunOptionsError(); } -// Tests SavedModelBundleFactory with SessionBundle export. -class SavedModelBundleFactoryBackwardCompatibilityTest - : public test_util::BundleFactoryTest, - public ::testing::WithParamInterface { - public: - SavedModelBundleFactoryBackwardCompatibilityTest() - : test_util::BundleFactoryTest( - test_util::GetTestSessionBundleExportPath()) {} - - virtual ~SavedModelBundleFactoryBackwardCompatibilityTest() = default; - - private: - Status CreateSession(const SessionBundleConfig& config, - std::unique_ptr* session) const override { - std::unique_ptr bundle; - TF_RETURN_IF_ERROR( - CreateBundleFromPath(GetParam(), config, export_dir_, &bundle)); - *session = std::move(bundle->session); - return Status::OK(); - } -}; - -INSTANTIATE_TEST_SUITE_P(CreationType, - SavedModelBundleFactoryBackwardCompatibilityTest, - ::testing::Values(CreationType::kWithoutMetadata, - CreationType::kWithMetadata)); - -TEST_P(SavedModelBundleFactoryBackwardCompatibilityTest, Basic) { TestBasic(); } - -TEST_P(SavedModelBundleFactoryBackwardCompatibilityTest, Batching) { - TestBatching(); -} - -TEST_P(SavedModelBundleFactoryBackwardCompatibilityTest, - EstimateResourceRequirementWithGoodExport) { - const double kTotalFileSize = - test_util::GetTotalFileSize(test_util::GetTestSessionBundleExportFiles()); - TestEstimateResourceRequirementWithGoodExport( - kTotalFileSize); -} - -TEST_P(SavedModelBundleFactoryBackwardCompatibilityTest, RunOptions) { - TestRunOptions(); -} - -TEST_P(SavedModelBundleFactoryBackwardCompatibilityTest, RunOptionsError) { - TestRunOptionsError(); -} - } // namespace } // namespace serving } // namespace tensorflow diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter_test.cc b/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter_test.cc index 48e9cf7738e..45adffc7f58 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter_test.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter_test.cc @@ -36,6 +36,7 @@ limitations under the License. #include "tensorflow_serving/servables/tensorflow/session_bundle_config.pb.h" #include "tensorflow_serving/servables/tensorflow/session_bundle_source_adapter.pb.h" #include "tensorflow_serving/test_util/test_util.h" +#include "tensorflow_serving/util/oss_or_google.h" namespace tensorflow { namespace serving { @@ -149,10 +150,12 @@ TEST_P(SavedModelBundleSourceAdapterTest, Basic) { } TEST_P(SavedModelBundleSourceAdapterTest, BackwardCompatibility) { + if (IsTensorflowServingOSS()) { + return; + } TestSavedModelBundleSourceAdapter( test_util::GetTestSessionBundleExportPath()); } - // Test all SavedModelBundleSourceAdapterTest test cases with // warmup, num_request_iterations enabled/disabled and session-metadata // enabled/disabled. diff --git a/tensorflow_serving/servables/tensorflow/saved_model_warmup_test.cc b/tensorflow_serving/servables/tensorflow/saved_model_warmup_test.cc index c256f8b9662..b92f5cbb4ee 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_warmup_test.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_warmup_test.cc @@ -20,7 +20,6 @@ limitations under the License. #include #include "tensorflow/cc/saved_model/constants.h" #include "tensorflow/cc/saved_model/signature_constants.h" -#include "tensorflow/contrib/session_bundle/signature.h" #include "tensorflow/core/example/example.pb.h" #include "tensorflow/core/example/feature.pb.h" #include "tensorflow/core/framework/tensor.pb.h" diff --git a/tensorflow_serving/servables/tensorflow/session_bundle_factory.cc b/tensorflow_serving/servables/tensorflow/session_bundle_factory.cc index b899f41a68b..d61be0882c2 100644 --- a/tensorflow_serving/servables/tensorflow/session_bundle_factory.cc +++ b/tensorflow_serving/servables/tensorflow/session_bundle_factory.cc @@ -15,11 +15,11 @@ limitations under the License. #include "tensorflow_serving/servables/tensorflow/session_bundle_factory.h" -#include "tensorflow/contrib/session_bundle/bundle_shim.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/protobuf/config.pb.h" #include "tensorflow/core/public/session_options.h" #include "tensorflow_serving/servables/tensorflow/bundle_factory_util.h" +#include "tensorflow_serving/session_bundle/session_bundle_util.h" namespace tensorflow { namespace serving { @@ -31,7 +31,7 @@ Status GetSignatureDefs(const SessionBundle& bundle, std::vector* signature_defs) { MetaGraphDef meta_graph_def = bundle.meta_graph_def; const Status conversion_status = - internal::ConvertSignaturesToSignatureDefs(&meta_graph_def); + session_bundle::ConvertSignaturesToSignatureDefs(&meta_graph_def); if (!conversion_status.ok()) { if (meta_graph_def.signature_def().empty()) { return conversion_status; @@ -76,7 +76,7 @@ Status SessionBundleFactory::EstimateResourceRequirement( Status SessionBundleFactory::CreateSessionBundle( const string& path, std::unique_ptr* bundle) { bundle->reset(new SessionBundle); - TF_RETURN_IF_ERROR(LoadSessionBundleFromPathUsingRunOptions( + TF_RETURN_IF_ERROR(session_bundle::LoadSessionBundleFromPathUsingRunOptions( GetSessionOptions(config_), GetRunOptions(config_), path, bundle->get())); if (config_.has_batching_parameters()) { diff --git a/tensorflow_serving/servables/tensorflow/session_bundle_factory.h b/tensorflow_serving/servables/tensorflow/session_bundle_factory.h index fa93c9f43e5..7dbf6bb6ed7 100644 --- a/tensorflow_serving/servables/tensorflow/session_bundle_factory.h +++ b/tensorflow_serving/servables/tensorflow/session_bundle_factory.h @@ -16,12 +16,12 @@ limitations under the License. #ifndef TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_SESSION_BUNDLE_FACTORY_H_ #define TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_SESSION_BUNDLE_FACTORY_H_ -#include "tensorflow/contrib/session_bundle/session_bundle.h" #include "tensorflow/core/kernels/batching_util/shared_batch_scheduler.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow_serving/batching/batching_session.h" #include "tensorflow_serving/resources/resources.pb.h" #include "tensorflow_serving/servables/tensorflow/session_bundle_config.pb.h" +#include "tensorflow_serving/session_bundle/session_bundle_util.h" namespace tensorflow { namespace serving { diff --git a/tensorflow_serving/servables/tensorflow/session_bundle_source_adapter.h b/tensorflow_serving/servables/tensorflow/session_bundle_source_adapter.h index 938a515d60b..9a23db933e8 100644 --- a/tensorflow_serving/servables/tensorflow/session_bundle_source_adapter.h +++ b/tensorflow_serving/servables/tensorflow/session_bundle_source_adapter.h @@ -16,7 +16,6 @@ limitations under the License. #ifndef TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_SESSION_BUNDLE_SOURCE_ADAPTER_H_ #define TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_SESSION_BUNDLE_SOURCE_ADAPTER_H_ -#include "tensorflow/contrib/session_bundle/session_bundle.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow_serving/core/loader.h" #include "tensorflow_serving/core/source_adapter.h" diff --git a/tensorflow_serving/servables/tensorflow/testdata/BUILD b/tensorflow_serving/servables/tensorflow/testdata/BUILD index 2183d226d52..3b6d7f93aa4 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/BUILD +++ b/tensorflow_serving/servables/tensorflow/testdata/BUILD @@ -83,6 +83,13 @@ py_binary( ], ) +filegroup( + name = "half_plus_two", + srcs = glob( + ["half_plus_two/**"], + ), +) + filegroup( name = "saved_model_half_plus_two_cpu", srcs = glob( diff --git a/tensorflow_serving/session_bundle/BUILD b/tensorflow_serving/session_bundle/BUILD new file mode 100644 index 00000000000..84cad535bf6 --- /dev/null +++ b/tensorflow_serving/session_bundle/BUILD @@ -0,0 +1,47 @@ +load("//tensorflow_serving:oss_or_google.bzl", "if_google", "if_oss") + +licenses(["notice"]) # Apache 2.0 + +package( + default_visibility = [ + "//tensorflow_serving:internal", + ], +) + +filegroup( + name = "session_bundle_half_plus_two", + srcs = glob([ + "testdata/half_plus_two/**", + ]), +) + +cc_library( + name = "manifest_proto_header", + hdrs = ["manifest_proto.h"], + deps = ["//tensorflow_serving/util:oss_or_google"] + if_oss([ + "//tensorflow_serving/session_bundle/oss:manifest_proto_cc", + ]) + if_google(["//tensorflow_serving/session_bundle/google:manifest_proto_cc"]), +) + +cc_library( + name = "session_bundle", + hdrs = ["session_bundle.h"], + deps = ["//tensorflow_serving/util:oss_or_google"] + if_oss([ + "//tensorflow_serving/session_bundle/oss:session_bundle", + ]) + if_google(["@org_tensorflow//tensorflow/contrib/session_bundle"]), +) + +cc_library( + name = "session_bundle_util_header", + hdrs = ["session_bundle_util.h"], + deps = [ + ":manifest_proto_header", + ":session_bundle", + "@org_tensorflow//tensorflow/cc/saved_model:loader", + ], +) + +cc_library( + name = "session_bundle_util", + deps = if_oss(["//tensorflow_serving/session_bundle/oss:session_bundle_util"]) + if_google(["//tensorflow_serving/session_bundle/google:session_bundle_util"]), +) diff --git a/tensorflow_serving/session_bundle/manifest_proto.h b/tensorflow_serving/session_bundle/manifest_proto.h new file mode 100644 index 00000000000..744496c131f --- /dev/null +++ b/tensorflow_serving/session_bundle/manifest_proto.h @@ -0,0 +1,27 @@ +/* Copyright 2019 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_SERVING_SESSION_BUNDLE_MANIFEST_PROTO_H_ +#define TENSORFLOW_SERVING_SESSION_BUNDLE_MANIFEST_PROTO_H_ + +#include "tensorflow_serving/util/oss_or_google.h" + +#ifdef TENSORFLOW_SERVING_GOOGLE +#include "tensorflow_serving/session_bundle/google/manifest.pb.h" +#else +#include "tensorflow_serving/session_bundle/oss/manifest.pb.h" +#endif + +#endif // TENSORFLOW_SERVING_SESSION_BUNDLE_MANIFEST_PROTO_H_ diff --git a/tensorflow_serving/session_bundle/oss/BUILD b/tensorflow_serving/session_bundle/oss/BUILD new file mode 100644 index 00000000000..5ce47e54b38 --- /dev/null +++ b/tensorflow_serving/session_bundle/oss/BUILD @@ -0,0 +1,50 @@ +load("@org_tensorflow//tensorflow/core:platform/default/build_config.bzl", "tf_proto_library") +load("//tensorflow_serving:oss_or_google.bzl", "oss_only_cc_test") + +licenses(["notice"]) # Apache 2.0 + +package( + default_visibility = [ + "//tensorflow_serving:internal", + ], + features = ["-layering_check"], +) + +tf_proto_library( + name = "manifest_proto", + srcs = ["manifest.proto"], + cc_api_version = 2, +) + +cc_library( + name = "session_bundle", + hdrs = ["session_bundle.h"], + deps = [ + "@org_tensorflow//tensorflow/core:core_cpu", + ], +) + +cc_library( + name = "session_bundle_util", + srcs = ["session_bundle_util.cc"], + deps = [ + ":manifest_proto_cc", + ":session_bundle", + "//tensorflow_serving/session_bundle:session_bundle_util_header", + "@org_tensorflow//tensorflow/cc/saved_model:loader", + ], +) + +oss_only_cc_test( + name = "session_bundle_util_test", + srcs = ["session_bundle_util_test.cc"], + data = [ + "//tensorflow_serving/session_bundle:session_bundle_half_plus_two", + "@org_tensorflow//tensorflow/cc/saved_model:saved_model_half_plus_two", + ], + deps = [ + ":session_bundle_util", + "//tensorflow_serving/core/test_util:test_main", + "//tensorflow_serving/test_util", + ], +) diff --git a/tensorflow_serving/session_bundle/oss/manifest.proto b/tensorflow_serving/session_bundle/oss/manifest.proto new file mode 100644 index 00000000000..79bbd98ba0f --- /dev/null +++ b/tensorflow_serving/session_bundle/oss/manifest.proto @@ -0,0 +1,70 @@ +syntax = "proto3"; + +package tensorflow.serving; + +// Signatures of model export. +message Signatures { + // Default signature of the graph. + // WARNING(break-tutorial-inline-code): The following code snippet is + // in-lined in tutorials, please update tutorial documents accordingly + // whenever code changes. + Signature default_signature = 1; + + // Named signatures of the graph. + map named_signatures = 2; +} + +// A binding to a tensor including the name and, possibly in the future, type +// or other metadata. For example, this may specify whether a tensor supports +// batch vs single inference. +message TensorBinding { + // The name of the tensor to bind to. + string tensor_name = 1; +} + +// An asset file or set of sharded files with the same name that will be bound +// to a tensor at init / session_bundle load time. +message AssetFile { + // The tensor to bind the asset filename to. + TensorBinding tensor_binding = 1; + // The filename within the assets directory. Note: does not include the base + // path or asset directory prefix. Base paths can and will change when models + // are deployed for serving. + string filename = 2; +} + +// A Signature specifies the inputs and outputs of commonly used graphs. +message Signature { + oneof type { + RegressionSignature regression_signature = 1; + ClassificationSignature classification_signature = 2; + GenericSignature generic_signature = 3; + } +} + +// RegressionSignature specifies a graph that takes an input and returns an +// output. +message RegressionSignature { + TensorBinding input = 1; + TensorBinding output = 2; +} + +// ClassificationSignature specifies a graph that takes an input and returns +// classes and their scores. +// WARNING(break-tutorial-inline-code): The following code snippet is +// in-lined in tutorials, please update tutorial documents accordingly +// whenever code changes. +message ClassificationSignature { + TensorBinding input = 1; + TensorBinding classes = 2; + TensorBinding scores = 3; +} + +// GenericSignature specifies a map from logical name to Tensor name. +// Typical application of GenericSignature is to use a single GenericSignature +// that includes all of the Tensor nodes and target names that may be useful at +// serving, analysis or debugging time. The recommended name for this signature +// in the ModelManifest is "generic_bindings". +message GenericSignature { + map map = 1; +} diff --git a/tensorflow_serving/session_bundle/oss/session_bundle.h b/tensorflow_serving/session_bundle/oss/session_bundle.h new file mode 100644 index 00000000000..ee3f4996240 --- /dev/null +++ b/tensorflow_serving/session_bundle/oss/session_bundle.h @@ -0,0 +1,35 @@ +/* Copyright 2019 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_SERVING_SESSION_BUNDLE_OSS_SESSION_BUNDLE_H_ +#define TENSORFLOW_SERVING_SESSION_BUNDLE_OSS_SESSION_BUNDLE_H_ + +#include "tensorflow/core/protobuf/meta_graph.pb.h" +#include "tensorflow/core/public/session.h" + +namespace tensorflow { +namespace serving { + +// Dummy SessionBundle class. +// SessionBundle is deprecated and not supported in Tensorflow Serving. +struct SessionBundle { + std::unique_ptr session; + MetaGraphDef meta_graph_def; +}; + +} // namespace serving +} // namespace tensorflow + +#endif // TENSORFLOW_SERVING_SESSION_BUNDLE_OSS_SESSION_BUNDLE_H_ diff --git a/tensorflow_serving/session_bundle/oss/session_bundle_util.cc b/tensorflow_serving/session_bundle/oss/session_bundle_util.cc new file mode 100644 index 00000000000..cd5e9f8235e --- /dev/null +++ b/tensorflow_serving/session_bundle/oss/session_bundle_util.cc @@ -0,0 +1,97 @@ +/* Copyright 2019 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow_serving/session_bundle/session_bundle_util.h" + +#include "tensorflow/cc/saved_model/loader.h" +#include "tensorflow/core/lib/core/errors.h" +#include "tensorflow_serving/session_bundle/manifest_proto.h" + +namespace tensorflow { +namespace serving { + +namespace session_bundle { + +Status ConvertSignaturesToSignatureDefs(MetaGraphDef* meta_graph_def) { + return errors::Unimplemented("Session Bundle is deprecated and removed."); +} + +Status ConvertSessionBundleToSavedModelBundle( + SessionBundle& session_bundle, SavedModelBundle* saved_model_bundle) { + return errors::Unimplemented("Session Bundle is deprecated and removed."); +} + +Status LoadSessionBundleOrSavedModelBundle( + const SessionOptions& session_options, const RunOptions& run_options, + const string& export_dir, const std::unordered_set& tags, + SavedModelBundle* bundle, bool* is_session_bundle) { + if (is_session_bundle != nullptr) { + *is_session_bundle = false; + } + if (MaybeSavedModelDirectory(export_dir)) { + return LoadSavedModel(session_options, run_options, export_dir, tags, + bundle); + } + return Status( + error::Code::NOT_FOUND, + strings::StrCat("Specified file path does not appear to contain a " + "SavedModel bundle (should have a file called " + "`saved_model.pb`)\n" + "Specified file path: ", + export_dir)); +} + +Status LoadSessionBundleFromPathUsingRunOptions( + const SessionOptions& session_options, const RunOptions& run_options, + const StringPiece export_dir, SessionBundle* bundle) { + return errors::Unimplemented("Session Bundle is deprecated and removed."); +} + +Status SetSignatures(const Signatures& signatures, + tensorflow::MetaGraphDef* meta_graph_def) { + return errors::Unimplemented("Session Bundle is deprecated and removed."); +} + +Status GetClassificationSignature( + const tensorflow::MetaGraphDef& meta_graph_def, + ClassificationSignature* signature) { + return errors::Unimplemented("Session Bundle is deprecated and removed."); +} + +Status GetRegressionSignature(const tensorflow::MetaGraphDef& meta_graph_def, + RegressionSignature* signature) { + return errors::Unimplemented("Session Bundle is deprecated and removed."); +} + +Status RunClassification(const ClassificationSignature& signature, + const Tensor& input, Session* session, Tensor* classes, + Tensor* scores) { + return errors::Unimplemented("Session Bundle is deprecated and removed."); +} + +Status RunRegression(const RegressionSignature& signature, const Tensor& input, + Session* session, Tensor* output) { + return errors::Unimplemented("Session Bundle is deprecated and removed."); +} + +Status GetNamedSignature(const string& name, + const tensorflow::MetaGraphDef& meta_graph_def, + Signature* default_signature) { + return errors::Unimplemented("Session Bundle is deprecated and removed."); +} + +} // namespace session_bundle +} // namespace serving +} // namespace tensorflow diff --git a/tensorflow_serving/session_bundle/oss/session_bundle_util_test.cc b/tensorflow_serving/session_bundle/oss/session_bundle_util_test.cc new file mode 100644 index 00000000000..439d45be7c6 --- /dev/null +++ b/tensorflow_serving/session_bundle/oss/session_bundle_util_test.cc @@ -0,0 +1,176 @@ +/* Copyright 2019 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow_serving/session_bundle/session_bundle_util.h" + +#include +#include +#include "tensorflow/core/protobuf/meta_graph.pb.h" +#include "tensorflow_serving/test_util/test_util.h" + +namespace tensorflow { +namespace serving { +namespace session_bundle { +namespace { + +using ::testing::HasSubstr; + +const char kTestSavedModelPath[] = + "cc/saved_model/testdata/half_plus_two/00000123"; + +const char kTestSessionBundleExportPath[] = + "session_bundle/testdata/half_plus_two/00000123"; + +TEST(SessionBundleTest, ConvertSignaturesToSignatureDefsTest) { + MetaGraphDef meta_graph_def; + Status status = ConvertSignaturesToSignatureDefs(&meta_graph_def); + EXPECT_EQ(::tensorflow::error::UNIMPLEMENTED, status.code()); + EXPECT_THAT( + status.ToString(), + ::testing::HasSubstr("Session Bundle is deprecated and removed.")); +} + +TEST(SessionBundleTest, ConvertSessionBundleToSavedModelBundleTest) { + SessionBundle session_bundle; + SavedModelBundle saved_model_bundle; + Status status = session_bundle::ConvertSessionBundleToSavedModelBundle( + session_bundle, &saved_model_bundle); + EXPECT_EQ(::tensorflow::error::UNIMPLEMENTED, status.code()); + EXPECT_THAT( + status.ToString(), + ::testing::HasSubstr("Session Bundle is deprecated and removed.")); +} + +TEST(SessionBundleTest, LoadSessionBundleOrSavedModelBundleTest) { + SessionOptions session_options; + RunOptions run_options; + SavedModelBundle bundle; + bool is_session_bundle; + const std::unordered_set tags = {"serve"}; + const string export_dir = + test_util::TensorflowTestSrcDirPath(kTestSavedModelPath); + + Status status = session_bundle::LoadSessionBundleOrSavedModelBundle( + session_options, run_options, export_dir, tags, &bundle, + &is_session_bundle); + EXPECT_TRUE(status.ok()); +} + +TEST(SessionBundleTest, LoadSessionBundleOrSavedModelBundleFailureTest) { + SessionOptions session_options; + RunOptions run_options; + SavedModelBundle bundle; + bool is_session_bundle; + const std::unordered_set tags = {"serve"}; + const string export_dir = + test_util::TestSrcDirPath(kTestSessionBundleExportPath); + + Status status = session_bundle::LoadSessionBundleOrSavedModelBundle( + session_options, run_options, export_dir, tags, &bundle, + &is_session_bundle); + EXPECT_EQ(::tensorflow::error::Code::NOT_FOUND, status.code()); + EXPECT_THAT( + status.ToString(), + ::testing::HasSubstr( + "Specified file path does not appear to contain a SavedModel")); +} + +TEST(SessionBundleTest, LoadSessionBundleFromPathUsingRunOptionsTest) { + SessionOptions session_options; + RunOptions run_options; + string export_dir = "/exort_dir"; + SessionBundle bundle; + Status status = session_bundle::LoadSessionBundleFromPathUsingRunOptions( + session_options, run_options, export_dir, &bundle); + EXPECT_EQ(::tensorflow::error::UNIMPLEMENTED, status.code()); + EXPECT_THAT( + status.ToString(), + ::testing::HasSubstr("Session Bundle is deprecated and removed.")); +} + +TEST(SessionBundleTest, SetSignaturesTest) { + Signatures signatures; + tensorflow::MetaGraphDef meta_graph_def; + Status status = session_bundle::SetSignatures(signatures, &meta_graph_def); + EXPECT_EQ(::tensorflow::error::UNIMPLEMENTED, status.code()); + EXPECT_THAT( + status.ToString(), + ::testing::HasSubstr("Session Bundle is deprecated and removed.")); +} + +TEST(SessionBundleTest, GetClassificationSignatureTest) { + ClassificationSignature signature; + tensorflow::MetaGraphDef meta_graph_def; + Status status = + session_bundle::GetClassificationSignature(meta_graph_def, &signature); + EXPECT_EQ(::tensorflow::error::UNIMPLEMENTED, status.code()); + EXPECT_THAT( + status.ToString(), + ::testing::HasSubstr("Session Bundle is deprecated and removed.")); +} + +TEST(SessionBundleTest, GetRegressionSignatureTest) { + RegressionSignature signature; + tensorflow::MetaGraphDef meta_graph_def; + Status status = + session_bundle::GetRegressionSignature(meta_graph_def, &signature); + EXPECT_EQ(::tensorflow::error::UNIMPLEMENTED, status.code()); + EXPECT_THAT( + status.ToString(), + ::testing::HasSubstr("Session Bundle is deprecated and removed.")); +} + +TEST(SessionBundleTest, RunClassificationTest) { + ClassificationSignature signature; + Tensor input; + Session* session = nullptr; + Tensor classes; + Tensor scores; + Status status = session_bundle::RunClassification(signature, input, session, + &classes, &scores); + EXPECT_EQ(::tensorflow::error::UNIMPLEMENTED, status.code()); + EXPECT_THAT( + status.ToString(), + ::testing::HasSubstr("Session Bundle is deprecated and removed.")); +} + +TEST(SessionBundleTest, RunRegressionTest) { + RegressionSignature signature; + Tensor input, output; + Session* session = nullptr; + Status status = + session_bundle::RunRegression(signature, input, session, &output); + EXPECT_EQ(::tensorflow::error::UNIMPLEMENTED, status.code()); + EXPECT_THAT( + status.ToString(), + ::testing::HasSubstr("Session Bundle is deprecated and removed.")); +} + +TEST(SessionBundleTest, GetNamedSignature) { + const string name = "name"; + const tensorflow::MetaGraphDef meta_graph_def; + Signature default_signature; + Status status = session_bundle::GetNamedSignature(name, meta_graph_def, + &default_signature); + EXPECT_EQ(::tensorflow::error::UNIMPLEMENTED, status.code()); + EXPECT_THAT( + status.ToString(), + ::testing::HasSubstr("Session Bundle is deprecated and removed.")); +} + +} // namespace +} // namespace session_bundle +} // namespace serving +} // namespace tensorflow diff --git a/tensorflow_serving/session_bundle/session_bundle.h b/tensorflow_serving/session_bundle/session_bundle.h new file mode 100644 index 00000000000..c65883572e4 --- /dev/null +++ b/tensorflow_serving/session_bundle/session_bundle.h @@ -0,0 +1,27 @@ +/* Copyright 2019 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_SERVING_SESSION_BUNDLE_SESSION_BUNDLE_H_ +#define TENSORFLOW_SERVING_SESSION_BUNDLE_SESSION_BUNDLE_H_ + +#include "tensorflow_serving/util/oss_or_google.h" + +#ifdef TENSORFLOW_SERVING_GOOGLE +#include "tensorflow/contrib/session_bundle/session_bundle.h" +#else +#include "tensorflow_serving/session_bundle/oss/session_bundle.h" +#endif + +#endif // TENSORFLOW_SERVING_SESSION_BUNDLE_SESSION_BUNDLE_H_ diff --git a/tensorflow_serving/session_bundle/session_bundle_util.h b/tensorflow_serving/session_bundle/session_bundle_util.h new file mode 100644 index 00000000000..34fbcceb35c --- /dev/null +++ b/tensorflow_serving/session_bundle/session_bundle_util.h @@ -0,0 +1,107 @@ +/* Copyright 2019 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_SERVING_SESSION_BUNDLE_SESSION_BUNDLE_UTIL_H_ +#define TENSORFLOW_SERVING_SESSION_BUNDLE_SESSION_BUNDLE_UTIL_H_ + +#include "tensorflow/cc/saved_model/loader.h" +#include "tensorflow_serving/session_bundle/manifest_proto.h" +#include "tensorflow_serving/session_bundle/session_bundle.h" + +namespace tensorflow { +namespace serving { + +namespace session_bundle { + +// Interface from bundle_shim.h + +// Converts signatures in the MetaGraphDef into a SignatureDefs in the +// MetaGraphDef. +Status ConvertSignaturesToSignatureDefs(MetaGraphDef* meta_graph_def); + +// Converts a SessionBundle to a SavedModelBundle. +Status ConvertSessionBundleToSavedModelBundle( + SessionBundle& session_bundle, SavedModelBundle* saved_model_bundle); + +// Loads a SavedModel from either a session-bundle path or a SavedModel bundle +// path. If `is_session_bundle` is not a nullptr, sets it to `true` iff +// SavedModel was up-converted and loaded from a SessionBundle. +// `is_session_bundle` value should not be used if error is returned. +Status LoadSessionBundleOrSavedModelBundle( + const SessionOptions& session_options, const RunOptions& run_options, + const string& export_dir, const std::unordered_set& tags, + SavedModelBundle* bundle, bool* is_session_bundle = nullptr); + +// Interface from session_bundle.h + +// Similar to the LoadSessionBundleFromPath(), but also allows the session run +// invocations for the restore and init ops to be configured with +// tensorflow::RunOptions. +// +// This method is EXPERIMENTAL and may change or be removed. +Status LoadSessionBundleFromPathUsingRunOptions( + const SessionOptions& session_options, const RunOptions& run_options, + const StringPiece export_dir, SessionBundle* bundle); + +// Interface from signature.h + +// (Re)set Signatures in a MetaGraphDef. +Status SetSignatures(const Signatures& signatures, + tensorflow::MetaGraphDef* meta_graph_def); + +// Gets a ClassificationSignature from a MetaGraphDef's default signature. +// Returns an error if the default signature is not a ClassificationSignature, +// or does not exist. +Status GetClassificationSignature( + const tensorflow::MetaGraphDef& meta_graph_def, + ClassificationSignature* signature); + +// Gets a RegressionSignature from a MetaGraphDef's default signature. +// Returns an error if the default signature is not a RegressionSignature, +// or does not exist. +Status GetRegressionSignature(const tensorflow::MetaGraphDef& meta_graph_def, + RegressionSignature* signature); + +// Runs a classification using the provided signature and initialized Session. +// input: input batch of items to classify +// classes: output batch of classes; may be null if not needed +// scores: output batch of scores; may be null if not needed +// Validates sizes of the inputs and outputs are consistent (e.g., input +// batch size equals output batch sizes). +// Does not do any type validation. +Status RunClassification(const ClassificationSignature& signature, + const Tensor& input, Session* session, Tensor* classes, + Tensor* scores); + +// Runs regression using the provided signature and initialized Session. +// input: input batch of items to run the regression model against +// output: output targets +// Validates sizes of the inputs and outputs are consistent (e.g., input +// batch size equals output batch sizes). +// Does not do any type validation. +Status RunRegression(const RegressionSignature& signature, const Tensor& input, + Session* session, Tensor* output); + +// Gets a named Signature from a MetaGraphDef. +// Returns an error if a Signature with the given name does not exist. +Status GetNamedSignature(const string& name, + const tensorflow::MetaGraphDef& meta_graph_def, + Signature* default_signature); + +} // namespace session_bundle +} // namespace serving +} // namespace tensorflow + +#endif // TENSORFLOW_SERVING_SESSION_BUNDLE_SESSION_BUNDLE_UTIL_H_ diff --git a/tensorflow_serving/session_bundle/testdata/half_plus_two/00000123/export-00000-of-00001 b/tensorflow_serving/session_bundle/testdata/half_plus_two/00000123/export-00000-of-00001 new file mode 100755 index 0000000000000000000000000000000000000000..e1ac9e900e8d286b7f4cb050967bc9837d5a752e GIT binary patch literal 169 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 literal 0 HcmV?d00001 diff --git a/tensorflow_serving/test_util/test_util.cc b/tensorflow_serving/test_util/test_util.cc index ebf2ac80c66..752e040dae2 100644 --- a/tensorflow_serving/test_util/test_util.cc +++ b/tensorflow_serving/test_util/test_util.cc @@ -30,11 +30,6 @@ string TensorflowTestSrcDirPath(const string& relative_path) { return tensorflow::io::JoinPath(base_path, relative_path); } -string ContribTestSrcDirPath(const string& relative_path) { - const string base_path = TensorflowTestSrcDirPath("contrib/"); - return tensorflow::io::JoinPath(base_path, relative_path); -} - string TestSrcDirPath(const string& relative_path) { const string base_path = tensorflow::io::JoinPath( getenv("TEST_SRCDIR"), "tf_serving/tensorflow_serving"); diff --git a/tensorflow_serving/util/BUILD b/tensorflow_serving/util/BUILD index 393bbc0cc72..be45e6252b2 100644 --- a/tensorflow_serving/util/BUILD +++ b/tensorflow_serving/util/BUILD @@ -1,5 +1,7 @@ # Description: Tensorflow Serving utils. +load("//tensorflow_serving:serving.bzl", "serving_proto_library", "serving_proto_library_py") + package( default_visibility = [ "//tensorflow_serving:internal", @@ -77,7 +79,6 @@ cc_library( ############################################################################### # Internal targets ############################################################################### - cc_library( name = "hash", srcs = ["hash.cc"], @@ -383,9 +384,6 @@ cc_test( ], ) -load("//tensorflow_serving:serving.bzl", "serving_proto_library") -load("//tensorflow_serving:serving.bzl", "serving_proto_library_py") - serving_proto_library( name = "class_registration_test_proto", testonly = 1, @@ -414,3 +412,8 @@ serving_proto_library_py( "@org_tensorflow//tensorflow/core:protos_all_py", ], ) + +cc_library( + name = "oss_or_google", + hdrs = ["oss_or_google.h"], +) diff --git a/tensorflow_serving/util/oss_or_google.h b/tensorflow_serving/util/oss_or_google.h new file mode 100644 index 00000000000..7cbbc9d6fd7 --- /dev/null +++ b/tensorflow_serving/util/oss_or_google.h @@ -0,0 +1,42 @@ +/* Copyright 2019 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_SERVING_UTIL_OSS_OR_GOOGLE_H_ +#define TENSORFLOW_SERVING_UTIL_OSS_OR_GOOGLE_H_ + +#define TENSORFLOW_SERVING_OSS + +namespace tensorflow { +namespace serving { + +// Used to distinguish the context of the code; whether it's part of our OSS +// distribution or within Google. +// +// This is useful in cases where we want to enable/disable running some piece of +// code based on whether we are in/out of OSS. +// +// NB that the method is marked 'constexpr' so that the value can be used as +// a compile-time constant. +inline constexpr bool IsTensorflowServingOSS() { +#ifdef TENSORFLOW_SERVING_GOOGLE + return false; +#else + return true; +#endif +} + +} // namespace serving +} // namespace tensorflow + +#endif // TENSORFLOW_SERVING_UTIL_OSS_OR_GOOGLE_H_ From 2a9da0eb8f4ff33e19132218e3f1b586f3f412d9 Mon Sep 17 00:00:00 2001 From: Chao Xie Date: Thu, 17 Oct 2019 18:22:31 -0700 Subject: [PATCH 3487/8103] Remove export_half_plus_two.py. PiperOrigin-RevId: 275380221 --- tensorflow_serving/model_servers/BUILD | 10 +-- .../model_servers/server_core_test.cc | 7 ++- .../model_servers/test_util/BUILD | 24 ++++--- .../test_util/server_core_test_util.cc | 11 +++- .../tensorflow_model_server_test_base.py | 2 +- tensorflow_serving/servables/tensorflow/BUILD | 33 +++++----- .../get_model_metadata_impl_test.cc | 2 +- .../servables/tensorflow/predict_impl_test.cc | 8 +-- .../servables/tensorflow/testdata/BUILD | 25 -------- .../testdata/export_half_plus_two.py | 59 ------------------ .../00000123/export.data-00000-of-00001 | Bin 8 -> 0 bytes .../half_plus_two/00000123/export.index | Bin 142 -> 0 bytes .../half_plus_two/00000123/export.meta | Bin 4266 -> 0 bytes .../00000123/export.data-00000-of-00001 | Bin 8 -> 0 bytes .../00000123/export.index | Bin 142 -> 0 bytes .../00000123/export.meta | Bin 4266 -> 0 bytes .../00000124/export.data-00000-of-00001 | Bin 8 -> 0 bytes .../00000124/export.index | Bin 142 -> 0 bytes .../00000124/export.meta | Bin 4266 -> 0 bytes 19 files changed, 59 insertions(+), 122 deletions(-) delete mode 100644 tensorflow_serving/servables/tensorflow/testdata/export_half_plus_two.py delete mode 100644 tensorflow_serving/servables/tensorflow/testdata/half_plus_two/00000123/export.data-00000-of-00001 delete mode 100644 tensorflow_serving/servables/tensorflow/testdata/half_plus_two/00000123/export.index delete mode 100644 tensorflow_serving/servables/tensorflow/testdata/half_plus_two/00000123/export.meta delete mode 100644 tensorflow_serving/servables/tensorflow/testdata/half_plus_two_2_versions/00000123/export.data-00000-of-00001 delete mode 100644 tensorflow_serving/servables/tensorflow/testdata/half_plus_two_2_versions/00000123/export.index delete mode 100644 tensorflow_serving/servables/tensorflow/testdata/half_plus_two_2_versions/00000123/export.meta delete mode 100644 tensorflow_serving/servables/tensorflow/testdata/half_plus_two_2_versions/00000124/export.data-00000-of-00001 delete mode 100644 tensorflow_serving/servables/tensorflow/testdata/half_plus_two_2_versions/00000124/export.index delete mode 100644 tensorflow_serving/servables/tensorflow/testdata/half_plus_two_2_versions/00000124/export.meta diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 9f4e110f67a..d4940bf7157 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -1,5 +1,6 @@ # Description: Model Server +load("//tensorflow_serving:oss_or_google.bzl", "if_google") load("//tensorflow_serving:tensorflow_version.bzl", "if_not_v2", "if_v2") package( @@ -392,9 +393,6 @@ py_test( "//tensorflow_serving/servables/tensorflow/testdata:bad_model_config.txt", "//tensorflow_serving/servables/tensorflow/testdata:batching_config.txt", "//tensorflow_serving/servables/tensorflow/testdata:good_model_config.txt", - "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two/00000123/export.data-00000-of-00001", - "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two/00000123/export.index", - "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two/00000123/export.meta", "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two_model_metadata.json", "//tensorflow_serving/servables/tensorflow/testdata:monitoring_config.txt", "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_three/00000123/assets/foo.txt", @@ -403,7 +401,11 @@ py_test( "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_three/00000123/variables/variables.index", "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_cpu", "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_tflite", - ], + ] + if_google([ + "//tensorflow_serving/servables/tensorflow/google/testdata:half_plus_two/00000123/export.data-00000-of-00001", + "//tensorflow_serving/servables/tensorflow/google/testdata:half_plus_two/00000123/export.index", + "//tensorflow_serving/servables/tensorflow/google/testdata:half_plus_two/00000123/export.meta", + ]), python_version = "PY2", srcs_version = "PY2AND3", tags = [ diff --git a/tensorflow_serving/model_servers/server_core_test.cc b/tensorflow_serving/model_servers/server_core_test.cc index 73172f9b3c8..4307a7a51f5 100644 --- a/tensorflow_serving/model_servers/server_core_test.cc +++ b/tensorflow_serving/model_servers/server_core_test.cc @@ -891,7 +891,12 @@ INSTANTIATE_TEST_CASE_P( INSTANTIATE_TEST_CASE_P( TestType, RelativePathsServerCoreTest, ::testing::Combine( - ::testing::Range(0, static_cast(ServerCoreTest::NUM_TEST_TYPES)), + IsTensorflowServingOSS() + ? ::testing::Range( + static_cast(test_util::ServerCoreTest::SAVED_MODEL), + static_cast(test_util::ServerCoreTest::SAVED_MODEL)) + : ::testing::Range( + 0, static_cast(ServerCoreTest::NUM_TEST_TYPES)), ::testing::Bool())); } // namespace diff --git a/tensorflow_serving/model_servers/test_util/BUILD b/tensorflow_serving/model_servers/test_util/BUILD index 2462e310d33..4a36817b0bc 100644 --- a/tensorflow_serving/model_servers/test_util/BUILD +++ b/tensorflow_serving/model_servers/test_util/BUILD @@ -1,5 +1,7 @@ # Description: Model Server test utility +load("//tensorflow_serving:oss_or_google.bzl", "if_google") + package( default_visibility = [ "//tensorflow_serving:internal", @@ -54,17 +56,19 @@ cc_library( srcs = ["server_core_test_util.cc"], hdrs = ["server_core_test_util.h"], data = [ - "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two/00000123/export.data-00000-of-00001", - "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two/00000123/export.index", - "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two/00000123/export.meta", - "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two_2_versions/00000123/export.data-00000-of-00001", - "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two_2_versions/00000123/export.index", - "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two_2_versions/00000123/export.meta", - "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two_2_versions/00000124/export.data-00000-of-00001", - "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two_2_versions/00000124/export.index", - "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two_2_versions/00000124/export.meta", "@org_tensorflow//tensorflow/cc/saved_model:saved_model_half_plus_two", - ], + "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_2_versions", + ] + if_google([ + "//tensorflow_serving/servables/tensorflow/google/testdata:half_plus_two/00000123/export.data-00000-of-00001", + "//tensorflow_serving/servables/tensorflow/google/testdata:half_plus_two/00000123/export.index", + "//tensorflow_serving/servables/tensorflow/google/testdata:half_plus_two/00000123/export.meta", + "//tensorflow_serving/servables/tensorflow/google/testdata:half_plus_two_2_versions/00000123/export.data-00000-of-00001", + "//tensorflow_serving/servables/tensorflow/google/testdata:half_plus_two_2_versions/00000123/export.index", + "//tensorflow_serving/servables/tensorflow/google/testdata:half_plus_two_2_versions/00000123/export.meta", + "//tensorflow_serving/servables/tensorflow/google/testdata:half_plus_two_2_versions/00000124/export.data-00000-of-00001", + "//tensorflow_serving/servables/tensorflow/google/testdata:half_plus_two_2_versions/00000124/export.index", + "//tensorflow_serving/servables/tensorflow/google/testdata:half_plus_two_2_versions/00000124/export.meta", + ]), visibility = [ "//visibility:public", ], diff --git a/tensorflow_serving/model_servers/test_util/server_core_test_util.cc b/tensorflow_serving/model_servers/test_util/server_core_test_util.cc index c2aead0de5b..136fef792ab 100644 --- a/tensorflow_serving/model_servers/test_util/server_core_test_util.cc +++ b/tensorflow_serving/model_servers/test_util/server_core_test_util.cc @@ -101,7 +101,7 @@ ServerCoreTest::GetTestModelServerConfigForTensorflowPlatform() { "/cc/saved_model/testdata/half_plus_two")); } else { model->set_base_path(test_util::TestSrcDirPath( - "/servables/tensorflow/testdata/half_plus_two")); + "/servables/tensorflow/google/testdata/half_plus_two")); } if (PrefixPathsWithURIScheme()) { model->set_base_path(io::CreateURI("file", "", model->base_path())); @@ -114,8 +114,13 @@ void ServerCoreTest::SwitchToHalfPlusTwoWith2Versions( ModelServerConfig* config) { CHECK_EQ(1, config->model_config_list().config().size()); auto model = config->mutable_model_config_list()->mutable_config(0); - model->set_base_path(test_util::TestSrcDirPath( - "/servables/tensorflow/testdata/half_plus_two_2_versions")); + if (GetTestType() == SAVED_MODEL) { + model->set_base_path(test_util::TestSrcDirPath( + "/servables/tensorflow/testdata/saved_model_half_plus_two_2_versions")); + } else { + model->set_base_path(test_util::TestSrcDirPath( + "/servables/tensorflow/google/testdata/half_plus_two_2_versions")); + } // Request loading both versions simultaneously. model->clear_model_version_policy(); model->mutable_model_version_policy()->mutable_all(); diff --git a/tensorflow_serving/model_servers/test_util/tensorflow_model_server_test_base.py b/tensorflow_serving/model_servers/test_util/tensorflow_model_server_test_base.py index 51bfea651bd..49b3f1ef3e2 100644 --- a/tensorflow_serving/model_servers/test_util/tensorflow_model_server_test_base.py +++ b/tensorflow_serving/model_servers/test_util/tensorflow_model_server_test_base.py @@ -298,7 +298,7 @@ def _GetTfLiteModelPath(self): def _GetSessionBundlePath(self): """Returns a path to a model in SessionBundle format.""" - return os.path.join(self.testdata_dir, 'half_plus_two') + return os.path.join(self.session_bundle_testdata_dir, 'half_plus_two') def _GetGoodModelConfigTemplate(self): """Returns a path to a working configuration file template.""" diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index 2701e51ece7..3bb5e09d4a2 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -1,5 +1,7 @@ # Description: TensorFlow servables. +load("//tensorflow_serving:oss_or_google.bzl", "if_google") + package( default_visibility = [ "//tensorflow_serving:internal", @@ -452,16 +454,17 @@ cc_test( size = "medium", srcs = ["predict_impl_test.cc"], data = [ + "@org_tensorflow//tensorflow/cc/saved_model:saved_model_half_plus_two", "//tensorflow_serving/servables/tensorflow/testdata:bad_half_plus_two/00000123/export", "//tensorflow_serving/servables/tensorflow/testdata:bad_half_plus_two/00000123/export.meta", - "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two/00000123/export.data-00000-of-00001", - "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two/00000123/export.index", - "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two/00000123/export.meta", "//tensorflow_serving/servables/tensorflow/testdata:saved_model_counter/00000123/saved_model.pb", "//tensorflow_serving/servables/tensorflow/testdata:saved_model_counter/00000123/variables/variables.data-00000-of-00001", "//tensorflow_serving/servables/tensorflow/testdata:saved_model_counter/00000123/variables/variables.index", - "@org_tensorflow//tensorflow/cc/saved_model:saved_model_half_plus_two", - ], + ] + if_google([ + "//tensorflow_serving/servables/tensorflow/google/testdata:half_plus_two/00000123/export.data-00000-of-00001", + "//tensorflow_serving/servables/tensorflow/google/testdata:half_plus_two/00000123/export.index", + "//tensorflow_serving/servables/tensorflow/google/testdata:half_plus_two/00000123/export.meta", + ]), deps = [ ":predict_impl", ":saved_model_bundle_source_adapter_proto", @@ -501,16 +504,17 @@ cc_test( size = "medium", srcs = ["predict_util_test.cc"], data = [ + "@org_tensorflow//tensorflow/cc/saved_model:saved_model_half_plus_two", "//tensorflow_serving/servables/tensorflow/testdata:bad_half_plus_two/00000123/export", "//tensorflow_serving/servables/tensorflow/testdata:bad_half_plus_two/00000123/export.meta", - "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two/00000123/export.data-00000-of-00001", - "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two/00000123/export.index", - "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two/00000123/export.meta", "//tensorflow_serving/servables/tensorflow/testdata:saved_model_counter/00000123/saved_model.pb", "//tensorflow_serving/servables/tensorflow/testdata:saved_model_counter/00000123/variables/variables.data-00000-of-00001", "//tensorflow_serving/servables/tensorflow/testdata:saved_model_counter/00000123/variables/variables.index", - "@org_tensorflow//tensorflow/cc/saved_model:saved_model_half_plus_two", - ], + ] + if_google([ + "//tensorflow_serving/servables/tensorflow/google/testdata:half_plus_two/00000123/export.data-00000-of-00001", + "//tensorflow_serving/servables/tensorflow/google/testdata:half_plus_two/00000123/export.index", + "//tensorflow_serving/servables/tensorflow/google/testdata:half_plus_two/00000123/export.meta", + ]), deps = [ ":predict_util", ":saved_model_bundle_source_adapter_proto", @@ -551,11 +555,12 @@ cc_test( size = "medium", srcs = ["get_model_metadata_impl_test.cc"], data = [ - "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two/00000123/export.data-00000-of-00001", - "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two/00000123/export.index", - "//tensorflow_serving/servables/tensorflow/testdata:half_plus_two/00000123/export.meta", "@org_tensorflow//tensorflow/cc/saved_model:saved_model_half_plus_two", - ], + ] + if_google([ + "//tensorflow_serving/servables/tensorflow/google/testdata:half_plus_two/00000123/export.data-00000-of-00001", + "//tensorflow_serving/servables/tensorflow/google/testdata:half_plus_two/00000123/export.index", + "//tensorflow_serving/servables/tensorflow/google/testdata:half_plus_two/00000123/export.meta", + ]), deps = [ ":get_model_metadata_impl", ":saved_model_bundle_source_adapter_proto", diff --git a/tensorflow_serving/servables/tensorflow/get_model_metadata_impl_test.cc b/tensorflow_serving/servables/tensorflow/get_model_metadata_impl_test.cc index 907a32fe99d..784e4a7052a 100644 --- a/tensorflow_serving/servables/tensorflow/get_model_metadata_impl_test.cc +++ b/tensorflow_serving/servables/tensorflow/get_model_metadata_impl_test.cc @@ -55,7 +55,7 @@ class GetModelMetadataImplTest : public ::testing::TestWithParam { static void SetUpTestSuite() { if (!IsTensorflowServingOSS()) { const string session_bundle_path = test_util::TestSrcDirPath( - "/servables/tensorflow/testdata/half_plus_two"); + "/servables/tensorflow/google/testdata/half_plus_two"); TF_ASSERT_OK(CreateServerCore(session_bundle_path, false, &server_core_)); } diff --git a/tensorflow_serving/servables/tensorflow/predict_impl_test.cc b/tensorflow_serving/servables/tensorflow/predict_impl_test.cc index f1c360ff215..894a33eba91 100644 --- a/tensorflow_serving/servables/tensorflow/predict_impl_test.cc +++ b/tensorflow_serving/servables/tensorflow/predict_impl_test.cc @@ -44,10 +44,10 @@ class PredictImplTest : public ::testing::TestWithParam { public: static void SetUpTestSuite() { if (!IsTensorflowServingOSS()) { - TF_ASSERT_OK( - CreateServerCore(test_util::TestSrcDirPath( - "/servables/tensorflow/testdata/half_plus_two"), - false, &server_core_)); + TF_ASSERT_OK(CreateServerCore( + test_util::TestSrcDirPath( + "/servables/tensorflow/google/testdata/half_plus_two"), + false, &server_core_)); const string bad_half_plus_two_path = test_util::TestSrcDirPath( "/servables/tensorflow/testdata/bad_half_plus_two"); TF_ASSERT_OK(CreateServerCore(bad_half_plus_two_path, false, diff --git a/tensorflow_serving/servables/tensorflow/testdata/BUILD b/tensorflow_serving/servables/tensorflow/testdata/BUILD index 3b6d7f93aa4..4d0ef390404 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/BUILD +++ b/tensorflow_serving/servables/tensorflow/testdata/BUILD @@ -34,19 +34,6 @@ filegroup( ), ) -py_binary( - name = "export_half_plus_two", - srcs = [ - "export_half_plus_two.py", - ], - python_version = "PY2", - srcs_version = "PY2AND3", - deps = [ - "@org_tensorflow//tensorflow:tensorflow_py", - "@org_tensorflow//tensorflow/contrib/session_bundle:exporter", - ], -) - py_binary( name = "export_bad_half_plus_two", srcs = [ @@ -83,13 +70,6 @@ py_binary( ], ) -filegroup( - name = "half_plus_two", - srcs = glob( - ["half_plus_two/**"], - ), -) - filegroup( name = "saved_model_half_plus_two_cpu", srcs = glob( @@ -125,12 +105,7 @@ filegroup( ), ) -# Note: re-generate these files with :export_half_plus_two whenever model -# changes. exports_files([ - "half_plus_two/00000123/export.data-00000-of-00001", - "half_plus_two/00000123/export.index", - "half_plus_two/00000123/export.meta", "saved_model_half_plus_three/00000123/saved_model.pb", "saved_model_half_plus_three/00000123/assets/foo.txt", "saved_model_half_plus_three/00000123/variables/variables.data-00000-of-00001", diff --git a/tensorflow_serving/servables/tensorflow/testdata/export_half_plus_two.py b/tensorflow_serving/servables/tensorflow/testdata/export_half_plus_two.py deleted file mode 100644 index a199f40bd8a..00000000000 --- a/tensorflow_serving/servables/tensorflow/testdata/export_half_plus_two.py +++ /dev/null @@ -1,59 +0,0 @@ -# Copyright 2016 Google Inc. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============================================================================== -"""Exports a toy TensorFlow model. - -Exports a TensorFlow model to /tmp/half_plus_two/. - -This graph calculates, - y = a*x + b -where a and b are variables with a=0.5 and b=2. -""" - -# This is a placeholder for a Google-internal import. - -import tensorflow as tf -from tensorflow.contrib.session_bundle import exporter - - -def Export(): - export_path = "/tmp/half_plus_two" - with tf.Session() as sess: - # Make model parameters a&b variables instead of constants to - # exercise the variable reloading mechanisms. - a = tf.Variable(0.5) - b = tf.Variable(2.0) - - # Calculate, y = a*x + b - # here we use a placeholder 'x' which is fed at inference time. - x = tf.placeholder(tf.float32) - y = tf.add(tf.multiply(a, x), b) - - # Run an export. - tf.global_variables_initializer().run() - export = exporter.Exporter(tf.train.Saver()) - export.init(named_graph_signatures={ - "inputs": exporter.generic_signature({"x": x}), - "outputs": exporter.generic_signature({"y": y}), - "regress": exporter.regression_signature(x, y) - }) - export.export(export_path, tf.constant(123), sess) - - -def main(_): - Export() - - -if __name__ == "__main__": - tf.app.run() diff --git a/tensorflow_serving/servables/tensorflow/testdata/half_plus_two/00000123/export.data-00000-of-00001 b/tensorflow_serving/servables/tensorflow/testdata/half_plus_two/00000123/export.data-00000-of-00001 deleted file mode 100644 index 20bc7d454dd8450489984bd17d92c45c3a1a96a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmZQzV6bOkU~m8c0fPX5 diff --git a/tensorflow_serving/servables/tensorflow/testdata/half_plus_two/00000123/export.index b/tensorflow_serving/servables/tensorflow/testdata/half_plus_two/00000123/export.index deleted file mode 100644 index 35e2ef7527905b228ebfd7f755bb3d06f6cc00e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142 zcmZQzVB=tvV&Y(A;NT8REXqtw%1Py56k^a|F=ew*m*-&OjW-1G6&JCcXIiQeD<{{v=Y01&-#O==z%LU0rve{A>2N%z z5|DF+d>K41@X7G`Ej|?nxLEctrpB-h%|U&Y6w6YjRI5@M&Oti#Jab~xI+R@F2!H=0 zArzo;rdu;3FoR#5nLnNRTJm10B_`2&3x8^kb>GmuV|{AS@-xS=SaF9a8&IElhGsdV z=cYYLU;IW0+=a?L$M$^I28r8OD&qj8(vF-{$v14zag`?UH~bLLhwA;YVf&_k5dbx9 z#1;UpCx-CQDMI)dN}tcH>(R3k^79gLN>F~_d@+SXs6Vvyk#X!;W5ZoUodu~-sBkv; zgB6Dbu%PzH@O;NLo(vGVG(|$q^R7%g(BMbaZ2i>maAgfT;dV{8$C_uEqhOV-fXsjA z4Wy7OPw7JRiGpQ%{!YN)ogK1Azy#^Be)b<-(QCQ-2C7eV*VLa`1`-qMh(`>yq_nb3 z%taG5QX4t8ubZ~vQpxjOR0=E7f^rM$NP%mNLsG<7KNHfc?e+Hu{bNHP59FEs+;(2r z^wkD@1?w@AUDGywQ@6BG$&{Gn`vXFBXvT}XE{1|8iJ4-|^?EfIUqd%`q3vHI zqzAcvGc;QOsrfe^)V~O4rc6xl^Lif?eU{ZHyQ1wx;P-fE4caRU?Ik%G zQL+SJVq^g2pcK)tkFd_uSOHP|8BJEuDAxo$1n{tU?}jZhu3hVK?P{v^s!R)N<YN2;!M?Vp)r~zgCfHZ1;OyH5_GQgICOp6&4Ip`#<7d1I3 z;$7i;*a#s64b62dZEQ>p8?P#(3!yTKfErH)$hmR6ERn)}p*rG>mGOSD87?Q6j7y`u z9aFug(uiu3MtKS0Va|ou4lMpM9K-E7Z+XGZ^jxkhvNW`Fo?a4YWnIzqB9#g7vh%ao z!CjKect_>;En0!n03-ctthTuto@5J~LwxhPeYJi$h3za=SW_;`_1m!u*44E{1){q1 z6K^g$C-Clq$2X+}q`fomEKdu|d0?*xeH}f#BG3$haXo1JG`_3}oU#S%H&?}FwIOaW zVmJRVBF^Olh^AXs)R3YY#DTLGuSoGR;In86~KR6q)caF2G`I;`Q}5Om(szvJ$vMgRZ+ diff --git a/tensorflow_serving/servables/tensorflow/testdata/half_plus_two_2_versions/00000123/export.data-00000-of-00001 b/tensorflow_serving/servables/tensorflow/testdata/half_plus_two_2_versions/00000123/export.data-00000-of-00001 deleted file mode 100644 index 20bc7d454dd8450489984bd17d92c45c3a1a96a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmZQzV6bOkU~m8c0fPX5 diff --git a/tensorflow_serving/servables/tensorflow/testdata/half_plus_two_2_versions/00000123/export.index b/tensorflow_serving/servables/tensorflow/testdata/half_plus_two_2_versions/00000123/export.index deleted file mode 100644 index 35e2ef7527905b228ebfd7f755bb3d06f6cc00e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142 zcmZQzVB=tvV&Y(A;NT8REXqtw%1Py56k^a|F=ew*m*-&OjW-1G6&JCcXIiQeD<{{v=Y01&-#O==z%LU0rve{A>2N%z z5|DF+d>K41@X7G`Ej|?nxLEctrpB-h%|U&Y6w6YjRI5@M&Oti#Jab~xI+R@F2!H=0 zArzo;rdu;3FoR#5nLnNRTJm10B_`2&3x8^kb>GmuV|{AS@-xS=SaF9a8&IElhGsdV z=cYYLU;IW0+=a?L$M$^I28r8OD&qj8(vF-{$v14zag`?UH~bLLhwA;YVf&_k5dbx9 z#1;UpCx-CQDMI)dN}tcH>(R3k^79gLN>F~_d@+SXs6Vvyk#X!;W5ZoUodu~-sBkv; zgB6Dbu%PzH@O;NLo(vGVG(|$q^R7%g(BMbaZ2i>maAgfT;dV{8$C_uEqhOV-fXsjA z4Wy7OPw7JRiGpQ%{!YN)ogK1Azy#^Be)b<-(QCQ-2C7eV*VLa`1`-qMh(`>yq_nb3 z%taG5QX4t8ubZ~vQpxjOR0=E7f^rM$NP%mNLsG<7KNHfc?e+Hu{bNHP59FEs+;(2r z^wkD@1?w@AUDGywQ@6BG$&{Gn`vXFBXvT}XE{1|8iJ4-|^?EfIUqd%`q3vHI zqzAcvGc;QOsrfe^)V~O4rc6xl^Lif?eU{ZHyQ1wx;P-fE4caRU?Ik%G zQL+SJVq^g2pcK)tkFd_uSOHP|8BJEuDAxo$1n{tU?}jZhu3hVK?P{v^s!R)N<YN2;!M?Vp)r~zgCfHZ1;OyH5_GQgICOp6&4Ip`#<7d1I3 z;$7i;*a#s64b62dZEQ>p8?P#(3!yTKfErH)$hmR6ERn)}p*rG>mGOSD87?Q6j7y`u z9aFug(uiu3MtKS0Va|ou4lMpM9K-E7Z+XGZ^jxkhvNW`Fo?a4YWnIzqB9#g7vh%ao z!CjKect_>;En0!n03-ctthTuto@5J~LwxhPeYJi$h3za=SW_;`_1m!u*44E{1){q1 z6K^g$C-Clq$2X+}q`fomEKdu|d0?*xeH}f#BG3$haXo1JG`_3}oU#S%H&?}FwIOaW zVmJRVBF^Olh^AXs)R3YY#DTLGuSoGR;In86~KR6q)caF2G`I;`Q}5Om(szvJ$vMgRZ+ diff --git a/tensorflow_serving/servables/tensorflow/testdata/half_plus_two_2_versions/00000124/export.data-00000-of-00001 b/tensorflow_serving/servables/tensorflow/testdata/half_plus_two_2_versions/00000124/export.data-00000-of-00001 deleted file mode 100644 index 20bc7d454dd8450489984bd17d92c45c3a1a96a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmZQzV6bOkU~m8c0fPX5 diff --git a/tensorflow_serving/servables/tensorflow/testdata/half_plus_two_2_versions/00000124/export.index b/tensorflow_serving/servables/tensorflow/testdata/half_plus_two_2_versions/00000124/export.index deleted file mode 100644 index 35e2ef7527905b228ebfd7f755bb3d06f6cc00e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142 zcmZQzVB=tvV&Y(A;NT8REXqtw%1Py56k^a|F=ew*m*-&OjW-1G6&JCcXIiQeD<{{v=Y01&-#O==z%LU0rve{A>2N%z z5|DF+d>K41@X7G`Ej|?nxLEctrpB-h%|U&Y6w6YjRI5@M&Oti#Jab~xI+R@F2!H=0 zArzo;rdu;3FoR#5nLnNRTJm10B_`2&3x8^kb>GmuV|{AS@-xS=SaF9a8&IElhGsdV z=cYYLU;IW0+=a?L$M$^I28r8OD&qj8(vF-{$v14zag`?UH~bLLhwA;YVf&_k5dbx9 z#1;UpCx-CQDMI)dN}tcH>(R3k^79gLN>F~_d@+SXs6Vvyk#X!;W5ZoUodu~-sBkv; zgB6Dbu%PzH@O;NLo(vGVG(|$q^R7%g(BMbaZ2i>maAgfT;dV{8$C_uEqhOV-fXsjA z4Wy7OPw7JRiGpQ%{!YN)ogK1Azy#^Be)b<-(QCQ-2C7eV*VLa`1`-qMh(`>yq_nb3 z%taG5QX4t8ubZ~vQpxjOR0=E7f^rM$NP%mNLsG<7KNHfc?e+Hu{bNHP59FEs+;(2r z^wkD@1?w@AUDGywQ@6BG$&{Gn`vXFBXvT}XE{1|8iJ4-|^?EfIUqd%`q3vHI zqzAcvGc;QOsrfe^)V~O4rc6xl^Lif?eU{ZHyQ1wx;P-fE4caRU?Ik%G zQL+SJVq^g2pcK)tkFd_uSOHP|8BJEuDAxo$1n{tU?}jZhu3hVK?P{v^s!R)N<YN2;!M?Vp)r~zgCfHZ1;OyH5_GQgICOp6&4Ip`#<7d1I3 z;$7i;*a#s64b62dZEQ>p8?P#(3!yTKfErH)$hmR6ERn)}p*rG>mGOSD87?Q6j7y`u z9aFug(uiu3MtKS0Va|ou4lMpM9K-E7Z+XGZ^jxkhvNW`Fo?a4YWnIzqB9#g7vh%ao z!CjKect_>;En0!n03-ctthTuto@5J~LwxhPeYJi$h3za=SW_;`_1m!u*44E{1){q1 z6K^g$C-Clq$2X+}q`fomEKdu|d0?*xeH}f#BG3$haXo1JG`_3}oU#S%H&?}FwIOaW zVmJRVBF^Olh^AXs)R3YY#DTLGuSoGR;In86~KR6q)caF2G`I;`Q}5Om(szvJ$vMgRZ+ From 969f1ba7d8b33f20f0cd1e0caa1402d6814b8cec Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 18 Oct 2019 00:02:48 -0700 Subject: [PATCH 3488/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7ddb3905-8c1e-4db8-a9e9-24ca15c26606 PiperOrigin-RevId: 275416343 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5bff90d9b40..e5da5ca914b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b4203ed72a321915e405cf55f4679c6997afe71036bd91dbde090c332fc3fd86", - git_commit = "439bf24ed7f6d04a267c307f3aaaab1ce523aab7", + sha256 = "0a2ac39d2a757b984ffed11ff07f8f865e021b5203f94b28fdfb06d788bfc75e", + git_commit = "f2f88a47b17033b31f6dc733a19b556f10f51f5b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From da391c39db7f01c9cc7b9e1c5fe69f30a0645680 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 18 Oct 2019 06:04:19 -0700 Subject: [PATCH 3489/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6b475b61-4666-4fa7-8d2f-555795e1722c PiperOrigin-RevId: 275456589 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e5da5ca914b..b79af6dce56 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0a2ac39d2a757b984ffed11ff07f8f865e021b5203f94b28fdfb06d788bfc75e", - git_commit = "f2f88a47b17033b31f6dc733a19b556f10f51f5b", + sha256 = "943ddffe921fa4a1df5a00a8f979d01428a583cfeefbb0d30099340b89ee3360", + git_commit = "f2077c42f7548548840db174ebb4b4de7197c7aa", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2c179430be2bc3f7c5934b414e0d0bede6ed3157 Mon Sep 17 00:00:00 2001 From: Chao Xie Date: Fri, 18 Oct 2019 11:26:52 -0700 Subject: [PATCH 3490/8103] Add release notes for TF serving 1.15.0. PiperOrigin-RevId: 275512388 --- RELEASE.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/RELEASE.md b/RELEASE.md index ba48c80ae7d..db81dd5ec32 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,3 +1,23 @@ +# Release 1.15.0 + +## Major Features and Improvements +* Some Tensorflow Text ops have been added to ModelServer (specifically +* constrained_sequence_op, sentence_breaking_ops, unicode_script_tokenizer, +* whitespace_tokenizer, wordpiece_tokenizer) + +## Breaking Changes +* As previously announced, Contrib ops will not be packaged with Tensorflow, and therefore will not be available in Tensorflow Serving. If serving with Tensorflow Serving >1.15, please ensure your models do not contain any tf.contrib ops. If you are critically dependent on custom ops, please review this guide for instructions to statically build ops into the model server. +* After being deprecated for multiple years, as a part of tf.contrib deprecation, SessionBundle API will be removed starting from Tensorflow Serving 2.0 - if currently using SessionBundle, please migrate to SavedModel APIs. + +## Bug Fixes and Other Changes +* This release is based on TF version 1.15.0 + +## Thanks to our Contributors + +This release contains contributions from many people at Google, as well as: + +Abolfazl Shahbazi, chaox, gison93, Minglotus-6, William D. Irons, ynqa + # Release 1.12.3 ## Major Features and Improvements From 9e89de4699928e40e496254e24b107c7397c27b1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 18 Oct 2019 12:03:44 -0700 Subject: [PATCH 3491/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/712e5b72-6d8f-4f26-be0d-fee643b35bfa PiperOrigin-RevId: 275519693 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b79af6dce56..d1d0b8e9ba9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "943ddffe921fa4a1df5a00a8f979d01428a583cfeefbb0d30099340b89ee3360", - git_commit = "f2077c42f7548548840db174ebb4b4de7197c7aa", + sha256 = "2719e6e8b2839a0517c460e922901460b2711a7bfb88bd09abe7dc17cc25f38a", + git_commit = "07b5ca443887fd6d739ef6055e6cd3f2c02ba226", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 21b257fadf9e7864e01538ffa932b76dcfaa98e4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 18 Oct 2019 18:02:40 -0700 Subject: [PATCH 3492/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6b500c12-2bb1-44c5-b393-d4df2f78386f PiperOrigin-RevId: 275581069 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d1d0b8e9ba9..6ccb0f3b508 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2719e6e8b2839a0517c460e922901460b2711a7bfb88bd09abe7dc17cc25f38a", - git_commit = "07b5ca443887fd6d739ef6055e6cd3f2c02ba226", + sha256 = "51882fc1225c764a013f0f3130617c48fb4dfe4740092e6d6f9ad645450ac6a1", + git_commit = "e6828b78311fdbf12fab6f488c879d408a834eb1", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 46cf87af2e8cd587d1179c72f1b50fd2888e139b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 19 Oct 2019 00:02:58 -0700 Subject: [PATCH 3493/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3880715e-e6c4-4d19-b392-3d392e9ef6ea PiperOrigin-RevId: 275609047 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6ccb0f3b508..17eef8e59db 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "51882fc1225c764a013f0f3130617c48fb4dfe4740092e6d6f9ad645450ac6a1", - git_commit = "e6828b78311fdbf12fab6f488c879d408a834eb1", + sha256 = "c9ca9311d55e815fe1f7ebc2cd30493c5bdaa8a1f5b2f1c4cea9c77afc941be6", + git_commit = "a5c734d9a3811c71a5d32a01c75638a55602247b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 39d2f5a5fadf6ebb2d1ede90e55755a5baae8df2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 19 Oct 2019 06:09:02 -0700 Subject: [PATCH 3494/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/88029d78-4d34-47c3-9514-9dbf34068ee0 PiperOrigin-RevId: 275631433 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 17eef8e59db..c41c200333f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c9ca9311d55e815fe1f7ebc2cd30493c5bdaa8a1f5b2f1c4cea9c77afc941be6", - git_commit = "a5c734d9a3811c71a5d32a01c75638a55602247b", + sha256 = "5c391dcc5cdd5ce1570c754987f38087c5b2d50af7e0a9328ea518863a81879b", + git_commit = "c5200addd4ca7eebd1be73d0c2bdecb2c53ebd8d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ad2b0db9f7b49c4e51a9eff77ceddd0ada7cdc39 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 19 Oct 2019 12:02:48 -0700 Subject: [PATCH 3495/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/211896c5-8277-4be6-a61b-41ad0d6ff087 PiperOrigin-RevId: 275651093 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c41c200333f..7c6cb7021d3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5c391dcc5cdd5ce1570c754987f38087c5b2d50af7e0a9328ea518863a81879b", - git_commit = "c5200addd4ca7eebd1be73d0c2bdecb2c53ebd8d", + sha256 = "0b7ebf2d3c73d72e42921b3513311e80732ff0ec02db3d1048955de2f37ca35e", + git_commit = "0f752f7368f88b61916a3d1700685d01aff835cc", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5db1b10453a10559be774bc226b94a0b0804de53 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 19 Oct 2019 18:09:03 -0700 Subject: [PATCH 3496/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/88155df9-e485-418e-a8ff-ca6c7ebd15d2 PiperOrigin-RevId: 275671314 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7c6cb7021d3..8614e06ec36 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0b7ebf2d3c73d72e42921b3513311e80732ff0ec02db3d1048955de2f37ca35e", - git_commit = "0f752f7368f88b61916a3d1700685d01aff835cc", + sha256 = "960df5fb710f351e7d144517f49f125dc9b38f8f16ddb42fa52029e9bb2cc137", + git_commit = "61e30006704f0559a85094d2d8728852e28f0705", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 127a112a91bda3d7d3c3a56802632376bbe3e36e Mon Sep 17 00:00:00 2001 From: Rajagopal Ananthanarayanan Date: Mon, 21 Oct 2019 13:00:20 -0700 Subject: [PATCH 3497/8103] Fix link for TFRecord in Saved Model Warmup documentation. PiperOrigin-RevId: 275904761 --- tensorflow_serving/g3doc/saved_model_warmup.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/g3doc/saved_model_warmup.md b/tensorflow_serving/g3doc/saved_model_warmup.md index 1d60b7b587d..ff006aff23a 100644 --- a/tensorflow_serving/g3doc/saved_model_warmup.md +++ b/tensorflow_serving/g3doc/saved_model_warmup.md @@ -23,8 +23,8 @@ Requirements for model warmup to work correctly: * Warmup file name: 'tf_serving_warmup_requests' * File location: assets.extra/ * File format: - [TFRecord](https://www.tensorflow.org/api_guides/python/python_io) with each - record as a + [TFRecord](https://www.tensorflow.org/tutorials/load_data/tfrecord#tfrecords_format_details) + with each record as a [PredictionLog](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/apis/prediction_log.proto#L40). * Number of warmup records <= 1000. * The warmup data must be representative of the inference requests used at From aa402ab34324811fdcef75260d93691d082ec5ae Mon Sep 17 00:00:00 2001 From: Chao Xie Date: Mon, 21 Oct 2019 14:23:18 -0700 Subject: [PATCH 3498/8103] Add release note for TFS 2.0.0 release. PiperOrigin-RevId: 275922578 --- RELEASE.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/RELEASE.md b/RELEASE.md index db81dd5ec32..70ebb987d47 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,3 +1,28 @@ +# Release 2.0.0 + +## Major Features and Improvements +* Some Tensorflow Text ops have been added to ModelServer (specifically constrained_sequence_op, sentence_breaking_ops, unicode_script_tokenizer, whitespace_tokenizer, wordpiece_tokenizer) + +## Breaking Changes +* As previously announced[1](https://groups.google.com/a/tensorflow.org/forum/#!msg/announce/qXfsxr2sF-0/jHQ77dr3DAAJ)[2](https://github.com/tensorflow/community/blob/master/rfcs/20180907-contrib-sunset.md)[3](https://github.com/tensorflow/serving/releases/tag/1.15.0), Contrib ops will not be packaged with Tensorflow, and therefore will not be available in Tensorflow Serving. If serving with Tensorflow Serving >1.15, please ensure your models do not contain any tf.contrib ops. If you are critically dependent on custom ops, please review [this guide](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/g3doc/custom_op.md) for instructions to statically build ops into the model server. +* After being [deprecated](https://developers.googleblog.com/2017/07/tensorflow-serving-10.html) for multiple years, as a part of tf.contrib deprecation, SessionBundle API will be removed starting from Tensorflow Serving 2.0 - if currently using SessionBundle, please migrate to SavedModel APIs. + +## Bug Fixes and Other Changes +* Add a section in the documentation for testing custom op manually. (commit: 1b65af1d7fee4fe79b4152f94d5ea422e8a79cca) +* Add ops delegate library to enable running TF ops. (commit: 14112359d16b3e1e275c2ba70b0e078ce4863783) +* Add command line tool to load TF Lite model for manual testing/debugging. (commit: 0b0254d4a90550b1d7228334187e624bf4b31c37) +* Fixes broken relative docs links (commit: 12813143b22616091388e7659d7f69cfcf518269) +* Cleaning up BUILD visibility for tf_pyclif_proto_library intermediate targets. (commit: 81ed5ef2307eea4c9396fd34f33673be072cdcf3) +* Remove unused load statements from BUILD files (commit: d0e01a3c56b280c6602d6c14e97ef60882d317aa) +* Manual tests for model server and including tf.Text in serving build. (commit: 142d0adb5e2975689d80d8fc608c9684e96de078) +* Remove tensorflow/contrib/session_bundle as dependency for Tensorflow Serving. (commit: 1bdd3499f1fe4d99b3c3024080560350d493e29b) + +## Thanks to our Contributors + +This release contains contributions from many people at Google, as well as: + +chaox + # Release 1.15.0 ## Major Features and Improvements From 509f6da062dc9b091ad6961a94740cf64e265c36 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 21 Oct 2019 14:48:47 -0700 Subject: [PATCH 3499/8103] Fix typo in http server log message. PiperOrigin-RevId: 275928461 --- .../util/net_http/server/internal/evhttp_server.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc b/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc index 1238b364239..a3b77b5a5d8 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc @@ -60,7 +60,7 @@ EvHTTPServer::EvHTTPServer(std::unique_ptr options) // May crash the server if called before WaitForTermination() returns EvHTTPServer::~EvHTTPServer() { if (!is_terminating()) { - NET_LOG(ERROR, "Serer has not been terminated. Force termination now."); + NET_LOG(ERROR, "Server has not been terminated. Force termination now."); Terminate(); } From 46e49bbef61ae5ec722ac15333d0d8dfa6c07ecc Mon Sep 17 00:00:00 2001 From: Mihai Maruseac Date: Mon, 21 Oct 2019 15:01:30 -0700 Subject: [PATCH 3500/8103] Fix keras_* version numbers, pull in latest. PiperOrigin-RevId: 275931309 --- tensorflow_serving/tools/docker/Dockerfile.devel | 4 ++-- tensorflow_serving/tools/docker/Dockerfile.devel-gpu | 4 ++-- tensorflow_serving/tools/docker/Dockerfile.devel-mkl | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index 8e5816d436b..36af5e9f67b 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -54,8 +54,8 @@ RUN pip --no-cache-dir install \ future>=0.17.1 \ grpcio \ h5py \ - keras_applications \ - keras_preprocessing \ + keras_applications>=1.0.8 \ + keras_preprocessing>=1.1.0 \ mock \ numpy \ requests diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 720efdc7fbb..e545391deef 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -85,8 +85,8 @@ RUN pip --no-cache-dir install \ future>=0.17.1 \ grpcio \ h5py \ - keras_applications \ - keras_preprocessing \ + keras_applications>=1.0.8 \ + keras_preprocessing>=1.1.0 \ mock \ numpy \ requests diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl index cc56fc2708e..1de31e5bdfc 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl @@ -54,8 +54,8 @@ RUN pip --no-cache-dir install \ future>=0.17.1 \ grpcio \ h5py \ - keras_applications \ - keras_preprocessing \ + keras_applications>=1.0.8 \ + keras_preprocessing>=1.1.0 \ mock \ numpy \ requests From 2cd974cf4d32accc8216af4ceb0c3ab4438ce78b Mon Sep 17 00:00:00 2001 From: Chao Xie Date: Mon, 21 Oct 2019 15:53:34 -0700 Subject: [PATCH 3501/8103] Add concrete changes for "Bug Fixes and Other Changes" field in release note. PiperOrigin-RevId: 275942591 --- RELEASE.md | 46 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/RELEASE.md b/RELEASE.md index 70ebb987d47..b3b197bf7bf 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -35,7 +35,51 @@ chaox * After being deprecated for multiple years, as a part of tf.contrib deprecation, SessionBundle API will be removed starting from Tensorflow Serving 2.0 - if currently using SessionBundle, please migrate to SavedModel APIs. ## Bug Fixes and Other Changes -* This release is based on TF version 1.15.0 +* Add monitoring config (commit: 18db9a46168eadd4d3e28e9b0cdb27bd6a11add9) +* Fix docs (commit: 7fc2253157db1dff340d7b418a6cf5204db2ce09) +* Use master as references (commit: 08cb506672d4c2ef289f79eee545df26d6577b45) +* Fix docs (commit: 9cc986beb742c485a62637fd20e841288774585d) +* Remove hyphen from version numbers to conform with PIP. (commit: 4aa0cfc24098000163fdfe270c4eb205e98790b1) +* Fix ImportError: No module named builtins (commit: e35ffff3999be3f971fa1503c158f33d721228c8) +* Cleanup visibility specs. (commit: 8e3956cac1eec2213538d8d6c367398e2f883e70) +* Remove 'future' from setup.py (commit: 64a80dd955a384de776b6256f3abcaa28cf88e79) +* Install future>=0.17.1 during Dockerfile.devel-gpu build (commit: dc36c21df5117364a3390a8bfe1fd3bf7dc92cb7) +* Replace calls to deprecated googletest APIs SetUpTestCase/TearDownTestCase with SetUpTestSuite/TearDownTestSuite. (commit: 39bbeb70dec8054d8ad81a7aa0423ec7e1a07c2a) +* Add the option to allow assigning labels to unavailable models in open source model server. (commit: e6d91e72f7593be36dda933b3291c7ebbc646fa6) +* Adds polling for config file to model server (#1301) (commit: c3eeed4f245e43f6cf92329d251e2b9d6255d6e5) +* Adds util functions for getting min of two ResourceAllocations. (commit: ba6527c8d56a0752f6c87115071e4d1bf7941810) +* Cleanup usage of the protobuf_archive. See #19032 (commit: dca61db5137c416a454c6ef821ad0fac6d66dc91) +* Replace NumSchedulableCPUs() with MaxParallelism(). (commit: aa9dddb93576c814b97947d6386d400cf6c87679) +* Don't run model_servers:tensorflow_model_server_test under asan (commit: b5c24e3e3849978a551db3aae3854c8794d10124) +* Release notes for 1.14 (commit: dc986268756ef45a3ffca4b8578dfdc69e015d29) +* Fixing Docker link (commit: 3bd851d88cd2febcdec29a52bab1d7d225a3a54c) +* Update release notes for 1.14.0 release. (commit: 00b2980a4d6ca127b63409b3eae791f846d1031a) +* Add release notes for TF serving 1.12.3. (commit: 7226859e9dd0f45bade559ab12892d4e388a7c11) +* Remove unnecessary calls to `Tensor::flat` in the tensorflow regressor interface. (commit: 55d897ef71b1ba142defec67bcce8eba7d8f5236) +* Fix print syntax in sample code (commit: ecef0d2fea2af1d4653a41934649512aa6994fd0) +* Adds guide for serving with custom ops (commit: dae0b4dffb29efc647783d45c28c4db0282b4d51) +* Return more informative error message during warmup. (commit: 1126fcd5d179d7829f48471eca6ddbbce79e219e) +* Enables passing in the SessionMetadata to the TensorFlow Session through the SavedModel ingestion API. (commit: 9cf3ff32daaaa2bb941ba7d7b8f049f807e4288e) +* Modifies server configuration documentation (commit: ee4edd59ad5ea088f1a6616cc6de531f66f25c3d) +* Fixes bazel build errors. (commit: bc07ec9015cba820be7f1087153d216964bd1a0b) +* Add tf.distribute + Keras model save/load test in TF serving. (commit: 093734d002bd9de2a68d34160e23f35db196c080) +* Remove unused fields from MetaGraphDef proto message, stored in (commit: 1f8f2902b6465f239bb58af2b3fb27ba73b5c7c5) +* Fix typo (missing colon) in comment. (commit: 561cabbabe9d44da6b20fcf0eb9170859d3ea9fe) +* Makes ServerCore::Log(...) mockable. (commit: 4b00a803faea0b96c9cbce6fbe23dfaec93bfbd4) +* Uses VerifyFunctionInternal to replace VerifyResourceValidityInternal and VerifyValidityInternal. (commit: b7b3c33422bb5cf0813fdd6604742e7fa3841f84) +* Removed the net_http dependency on absl/base/internal/raw_logging. (commit: 4e12a193ad27fa31cb1e42e9a7fe7b5c08f74c52) +* Override TF defined Abseil version to a more recent version, (commit: 1c0291118f34ec7ba958a9cee594414f6531c0f3) +* Makes VerifyValidity, Normalize and IsNormalized method virtual. (commit: 071634e39f47cde52996c8bfd1ddda8abf4deef9) +* Example of creating tf_serving_warmup_requests (commit: 1623705e4205bc779109f8c4d1eadf6d3f24a549) +* Don't copy SignatureDef. (commit: 28d32a1e487666c8b324c74afb633006ba5cbf17) +* Update resnet_warmup.py example (commit: 00b49bd3f4bcb3b17d1fb61bf302aacccf80c83e) +* Update resnet_warmup.py example (commit: 263025f091dd60d415dd22e9667c0f37f11209ff) +* Instrument BatchingSession::Run with TraceMe (commit: 929ab172ec3553a9d563b13dccfb0926d8bf3724) +* Remove contrib ops from model server from tensorflow 2.0. (commit: e7c987d4b10ac751081c62595fcd18be7481e67a) +* Use C++14 by default. (commit: 41873601c73bcb91e403f9ddd70a168ae117ddb0) +* o Switch to using the half_plus_two model from TF to tensorflow_serving one. (commit: 3ba8a6d8ac31572548bbe7922e4152a6b92e626c) +* Add TfLiteSession class to run inference on TensorFlow Lite Model. (commit: f2407e2011b5fc6d255c0ea54181f9cdd1d691e5) +* Add ability to load+run TF Lite model in ModelServer. (commit: d16ceafa044932e2d9ef84bbe1a6ae5c6356252f) ## Thanks to our Contributors From b017ce8df527ae6029618e601edc3ea05dbc648e Mon Sep 17 00:00:00 2001 From: Chao Xie Date: Mon, 21 Oct 2019 17:13:37 -0700 Subject: [PATCH 3502/8103] Delete the tf text op annoucement as it is not in 1.15.0-RC1. PiperOrigin-RevId: 275958089 --- RELEASE.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/RELEASE.md b/RELEASE.md index b3b197bf7bf..dbebd26b8fe 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -26,13 +26,13 @@ chaox # Release 1.15.0 ## Major Features and Improvements -* Some Tensorflow Text ops have been added to ModelServer (specifically -* constrained_sequence_op, sentence_breaking_ops, unicode_script_tokenizer, -* whitespace_tokenizer, wordpiece_tokenizer) ## Breaking Changes -* As previously announced, Contrib ops will not be packaged with Tensorflow, and therefore will not be available in Tensorflow Serving. If serving with Tensorflow Serving >1.15, please ensure your models do not contain any tf.contrib ops. If you are critically dependent on custom ops, please review this guide for instructions to statically build ops into the model server. -* After being deprecated for multiple years, as a part of tf.contrib deprecation, SessionBundle API will be removed starting from Tensorflow Serving 2.0 - if currently using SessionBundle, please migrate to SavedModel APIs. +* As previously announced[1](https://groups.google.com/a/tensorflow.org/forum/#!msg/announce/qXfsxr2sF-0/jHQ77dr3DAAJ)[2](https://github.com/tensorflow/community/blob/master/rfcs/20180907-contrib-sunset.md), Contrib ops will not be packaged with Tensorflow, and therefore will not be available in Tensorflow Serving. If serving with Tensorflow Serving >1.15, please ensure your models do not contain any tf.contrib ops. If you are critically dependent on custom ops, please review [this guide](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/g3doc/custom_op.md) for instructions to statically build ops into the model server. +* After being [deprecated](https://developers.googleblog.com/2017/07/tensorflow-serving-10.html) for multiple years, as a part of tf.contrib deprecation, SessionBundle API will be removed starting from Tensorflow Serving 2.0 - if currently using SessionBundle, please migrate to SavedModel APIs. + +## Upcoming Features +* Some Tensorflow Text ops will be added to Model Server starting from TF Serving 2.0.0 (specifically constrained_sequence_op, sentence_breaking_ops, unicode_script_tokenizer, whitespace_tokenizer, wordpiece_tokenizer). ## Bug Fixes and Other Changes * Add monitoring config (commit: 18db9a46168eadd4d3e28e9b0cdb27bd6a11add9) From 24c0319860c149b6a428ab6bea734b6a5b25bb08 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 21 Oct 2019 18:02:48 -0700 Subject: [PATCH 3503/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fa04d94e-15f3-4fae-9a9d-9227eb756039 PiperOrigin-RevId: 275965860 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8614e06ec36..5ea8ef92dec 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "960df5fb710f351e7d144517f49f125dc9b38f8f16ddb42fa52029e9bb2cc137", - git_commit = "61e30006704f0559a85094d2d8728852e28f0705", + sha256 = "7b1ca5d93a4d5ed13ef22aa27d275207d74c3d46f41fb796f90d41e8859d6088", + git_commit = "3e3503fd7157da1b7076056e6055971408d5c21e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 571781fc921e26ad98c9b8d2dd8f3796a6d8c579 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 22 Oct 2019 00:03:26 -0700 Subject: [PATCH 3504/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fe63f42a-48c0-4fba-bfe8-ada7870ffee1 PiperOrigin-RevId: 276006657 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5ea8ef92dec..73099ccc6ff 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7b1ca5d93a4d5ed13ef22aa27d275207d74c3d46f41fb796f90d41e8859d6088", - git_commit = "3e3503fd7157da1b7076056e6055971408d5c21e", + sha256 = "1f4506bda26cdf66c1129d6f5431b85460e183d46173bebb8b82bd3b651916ca", + git_commit = "a9c1ef68bf70c11464fc3f2220b500248d52a133", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9530694d5ece33de48051ff8500f324ab77452c5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 22 Oct 2019 06:03:21 -0700 Subject: [PATCH 3505/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/96dd1b8a-0715-49c3-a272-bc97ab0f389f PiperOrigin-RevId: 276049497 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 73099ccc6ff..81fdafc6bcb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1f4506bda26cdf66c1129d6f5431b85460e183d46173bebb8b82bd3b651916ca", - git_commit = "a9c1ef68bf70c11464fc3f2220b500248d52a133", + sha256 = "bba0bd7c6fd1a5404d4277de2121932f085811338c02156570cdcbbeeb615025", + git_commit = "48993d1e2dde56ad9bd4ff539c41cf19c097493c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c991d36de126f258c2ceb187d6067925d23d6b34 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 22 Oct 2019 12:02:24 -0700 Subject: [PATCH 3506/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/dc3ef6a4-51f5-4b88-8180-1edbbd084bc0 PiperOrigin-RevId: 276114435 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 81fdafc6bcb..965f6092e6a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bba0bd7c6fd1a5404d4277de2121932f085811338c02156570cdcbbeeb615025", - git_commit = "48993d1e2dde56ad9bd4ff539c41cf19c097493c", + sha256 = "b0237c4ccafa3b1b55fcea0c8afc0bb9bf48ff979f6d24335bfe0db032e7c5a6", + git_commit = "552a41a34f5a26668c31eb3e4b7cc70acf9ef1a3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 09f06e2d8ad4a7daa714fa7c8c5a9948b2937ed0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 22 Oct 2019 18:02:42 -0700 Subject: [PATCH 3507/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b4465d5d-7d88-41a9-9c6d-f630f712c284 PiperOrigin-RevId: 276183707 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 965f6092e6a..160d808ae0a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b0237c4ccafa3b1b55fcea0c8afc0bb9bf48ff979f6d24335bfe0db032e7c5a6", - git_commit = "552a41a34f5a26668c31eb3e4b7cc70acf9ef1a3", + sha256 = "887b151fc241f4541b79964f23c98540f473a9362c129ea068e15d9bb0f79cf8", + git_commit = "8a043cae48403d60456740406e2b2fc7299cb03c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 064ad337d23a34c3cfe8e7424325e9d75138f862 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 23 Oct 2019 00:02:49 -0700 Subject: [PATCH 3508/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/974e47bc-e57c-43b0-b4c5-507c7e0414ee PiperOrigin-RevId: 276219678 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 160d808ae0a..1347d220efa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "887b151fc241f4541b79964f23c98540f473a9362c129ea068e15d9bb0f79cf8", - git_commit = "8a043cae48403d60456740406e2b2fc7299cb03c", + sha256 = "1f5dca1682958eab05c5a842e8a44280d5a6dad0e725eaf1606251ee800670a0", + git_commit = "9d861d9f6e2d2bca04f35f7367e3ba6a2409e03d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a8958a4342390085ef13818d1c1682b5fd65edd6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 23 Oct 2019 06:03:10 -0700 Subject: [PATCH 3509/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/527b919b-13ae-42aa-ae93-05c97609e556 PiperOrigin-RevId: 276260036 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1347d220efa..39710910443 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1f5dca1682958eab05c5a842e8a44280d5a6dad0e725eaf1606251ee800670a0", - git_commit = "9d861d9f6e2d2bca04f35f7367e3ba6a2409e03d", + sha256 = "c3ab5c0191b3a99e176a327cd733699893a9aac28fde47b3e77355068a2089fd", + git_commit = "cc5404eb642094885a75993806e6a8fd86ceee74", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c926383cbf5a581f7b560e14d20e323a1877cf42 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 23 Oct 2019 12:02:30 -0700 Subject: [PATCH 3510/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/15b740af-f422-4ad0-af5f-c8c59b609a7a PiperOrigin-RevId: 276322883 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 39710910443..0970567e327 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c3ab5c0191b3a99e176a327cd733699893a9aac28fde47b3e77355068a2089fd", - git_commit = "cc5404eb642094885a75993806e6a8fd86ceee74", + sha256 = "3ed0ac69b5678811f3f1b80c76a23351b5c6ce4edfc1fe49df330199a52f0abf", + git_commit = "f11328078f3446b9c0433670e996e95db6a2ed69", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1099201a1160d56d3b491e6e7b9b2ac53e8e1506 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 23 Oct 2019 18:03:10 -0700 Subject: [PATCH 3511/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bdf6c052-ab49-43be-8f66-e3953a307b8c PiperOrigin-RevId: 276391486 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0970567e327..7b84faba65d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3ed0ac69b5678811f3f1b80c76a23351b5c6ce4edfc1fe49df330199a52f0abf", - git_commit = "f11328078f3446b9c0433670e996e95db6a2ed69", + sha256 = "568e2cada7e231d71b44701718489993df3527e741590ecad218eaeb064db08a", + git_commit = "ef6205b1fbc39cb7a1eace3d47168df9d46a7637", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f92135086fbbce92fab08d97f368a35fde58f930 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 24 Oct 2019 00:03:16 -0700 Subject: [PATCH 3512/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5feeb937-fc9a-46a7-9047-554c04cd200d PiperOrigin-RevId: 276429378 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7b84faba65d..cda3828cce2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "568e2cada7e231d71b44701718489993df3527e741590ecad218eaeb064db08a", - git_commit = "ef6205b1fbc39cb7a1eace3d47168df9d46a7637", + sha256 = "6d7eb7a65ba6e337c218993634861580b3e249181d54923b1ed2f8da47e52198", + git_commit = "00983e6b0700f9a34e0df980669172b6ea85dad0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4c998fb0402bc37e2ec64b2bfb50f211836c7dd2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 25 Oct 2019 12:02:57 -0700 Subject: [PATCH 3513/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b9a16740-2685-4427-99da-d758da359e6b PiperOrigin-RevId: 276734143 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cda3828cce2..c800926c781 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6d7eb7a65ba6e337c218993634861580b3e249181d54923b1ed2f8da47e52198", - git_commit = "00983e6b0700f9a34e0df980669172b6ea85dad0", + sha256 = "5df618f351a884bc3063cbfd66a5dd1f38aa07d1b5b9e9706e6f49eae3cc5b72", + git_commit = "2b9889164a88aa4cf51bc341a6fb405da92b662d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0be2b3e2a11787cec25b7e648cb462cff45bae1a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 25 Oct 2019 18:02:48 -0700 Subject: [PATCH 3514/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2913dafe-0ea8-45b0-8952-f8693a6566c0 PiperOrigin-RevId: 276795325 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c800926c781..76c46d94f19 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5df618f351a884bc3063cbfd66a5dd1f38aa07d1b5b9e9706e6f49eae3cc5b72", - git_commit = "2b9889164a88aa4cf51bc341a6fb405da92b662d", + sha256 = "19de4295f6a444694bc5d7e3a16a952fe0506b98fa40a11565152f9baed31394", + git_commit = "a582a54b5b7342d69ae03739031d4970c3531dd9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8154539094850cc0867331174207c1e219ef8646 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 26 Oct 2019 00:03:20 -0700 Subject: [PATCH 3515/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1dcb3a25-f078-451a-82b3-deac04f55313 PiperOrigin-RevId: 276828304 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 76c46d94f19..26434d5b9fa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "19de4295f6a444694bc5d7e3a16a952fe0506b98fa40a11565152f9baed31394", - git_commit = "a582a54b5b7342d69ae03739031d4970c3531dd9", + sha256 = "82c547128ee75e6b4da00cd02e01bd0a10f3d0f08d19a54c01910d7456df1b6f", + git_commit = "931f1dc5e03f0f04c0addb8208ab34ab9cc5ae1c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a176bcc2f3224df2b20da6096de3978a8149fb33 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 26 Oct 2019 06:02:47 -0700 Subject: [PATCH 3516/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/381fbaee-d8bd-4a5e-9201-abdcb3bf8329 PiperOrigin-RevId: 276852154 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 26434d5b9fa..2591b19753c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "82c547128ee75e6b4da00cd02e01bd0a10f3d0f08d19a54c01910d7456df1b6f", - git_commit = "931f1dc5e03f0f04c0addb8208ab34ab9cc5ae1c", + sha256 = "cf5c6ada6b8a3d0c0bf6a498007ed1eb1850a0466562a07b2aca1c53436a13c4", + git_commit = "3a33d697dd26f4088cf5da7a6da0fd6e819c2835", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 537c2e8a40b21f7358c817265b286916c2d34d3c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 26 Oct 2019 12:03:01 -0700 Subject: [PATCH 3517/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e0270732-5e10-4c28-a344-a6faefe15cf8 PiperOrigin-RevId: 276871991 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2591b19753c..8d868f80e6a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cf5c6ada6b8a3d0c0bf6a498007ed1eb1850a0466562a07b2aca1c53436a13c4", - git_commit = "3a33d697dd26f4088cf5da7a6da0fd6e819c2835", + sha256 = "d8b1f1c3349f1279184a19a39ff4c23eafae8905bcb46fb0f44d0c7c4eafb79f", + git_commit = "f88cf68393e60525506a567e0081b8e2e6db409b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c103fc67f1a2a9a20fd5a488c6f85d74509b8057 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 26 Oct 2019 18:03:24 -0700 Subject: [PATCH 3518/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ec5b873a-6a71-4a5e-bfd5-d8b0a3e70990 PiperOrigin-RevId: 276892910 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8d868f80e6a..c6f6a6e11af 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d8b1f1c3349f1279184a19a39ff4c23eafae8905bcb46fb0f44d0c7c4eafb79f", - git_commit = "f88cf68393e60525506a567e0081b8e2e6db409b", + sha256 = "c0624055acdce35076cdd6c636f4b3bd1a81a666a415e93ac3ea5330fc571176", + git_commit = "312e7ed667dd338c21d671d631e65ac67d590cd4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 47b46413bafab11509c1dcc93daa380d74a536ca Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 27 Oct 2019 06:03:04 -0700 Subject: [PATCH 3519/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3d7ce18e-7ebe-460d-bfdf-0f5ea13c4898 PiperOrigin-RevId: 276937616 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c6f6a6e11af..953a4f981e5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c0624055acdce35076cdd6c636f4b3bd1a81a666a415e93ac3ea5330fc571176", - git_commit = "312e7ed667dd338c21d671d631e65ac67d590cd4", + sha256 = "7a3edab15ba944e7da7fa6a08c0802c4c664e540034ff226aacdf6a95c9ab8a8", + git_commit = "bfb44db7b686b472e938af2824fde4f0ee7ba84f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2fcb7765ebbd0d46ece913be3883c2fb3eff3570 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 27 Oct 2019 12:02:46 -0700 Subject: [PATCH 3520/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5a03f2ec-db23-4428-ba84-63a4c8e134ec PiperOrigin-RevId: 276959383 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 953a4f981e5..db7d657bd28 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7a3edab15ba944e7da7fa6a08c0802c4c664e540034ff226aacdf6a95c9ab8a8", - git_commit = "bfb44db7b686b472e938af2824fde4f0ee7ba84f", + sha256 = "29b7992ae420bb3507eb5029d9ebe157dc92a1a112d4caac960e2ad23856ce31", + git_commit = "4be2ef3b7e82c3c0250fa1a2ea12c7069b28b056", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From fcd5f81295fa4cd15fd34dfce8edf1c9baa29df1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 27 Oct 2019 18:02:59 -0700 Subject: [PATCH 3521/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/62fbbbfb-409d-4bbe-83de-19bb7d30e96d PiperOrigin-RevId: 276979670 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index db7d657bd28..88465901868 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "29b7992ae420bb3507eb5029d9ebe157dc92a1a112d4caac960e2ad23856ce31", - git_commit = "4be2ef3b7e82c3c0250fa1a2ea12c7069b28b056", + sha256 = "4725efae63bfc58d4c3dfebc671d7f5bcb682616a82f3d90125ee341839f93ed", + git_commit = "0fec909abb8057fcb6141769df17bcad729ca870", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8e8e185dc73dde2a089d7479bd69c5e913fbbe86 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Oct 2019 00:03:11 -0700 Subject: [PATCH 3522/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/80934e55-18e1-4d6f-bd2b-465a6b604fa0 PiperOrigin-RevId: 277006778 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 88465901868..7c2d4db462b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4725efae63bfc58d4c3dfebc671d7f5bcb682616a82f3d90125ee341839f93ed", - git_commit = "0fec909abb8057fcb6141769df17bcad729ca870", + sha256 = "fb8d079cbd6fe4fa435566df2c01d7279d3b023d1a64681da348304ebd7b6f93", + git_commit = "1f404fcaad58bf61a107d4fa7c4f6004168a50fa", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6826a4b931f96900696e6e011a10d525d9f65aaa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Oct 2019 06:03:27 -0700 Subject: [PATCH 3523/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/463c019d-5ed9-4dae-ac53-5903ecb5622d PiperOrigin-RevId: 277047272 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7c2d4db462b..b3572445cf9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fb8d079cbd6fe4fa435566df2c01d7279d3b023d1a64681da348304ebd7b6f93", - git_commit = "1f404fcaad58bf61a107d4fa7c4f6004168a50fa", + sha256 = "bea609d8d771b80c4321e07efc2f40ee4360ad81b475bc9ccb182a8a62225568", + git_commit = "55cac496dc4fb5e7ec0c67aa7be92c14b9e585bb", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From eb5d5fc7f8c38b9c2e2fdac2d81149264da11ade Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Oct 2019 12:02:27 -0700 Subject: [PATCH 3524/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9cf5b770-de1a-457f-abcc-825790d8d9f8 PiperOrigin-RevId: 277114259 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b3572445cf9..3be7e8e1be9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bea609d8d771b80c4321e07efc2f40ee4360ad81b475bc9ccb182a8a62225568", - git_commit = "55cac496dc4fb5e7ec0c67aa7be92c14b9e585bb", + sha256 = "b997ed18dad9799f5588fa770623c37f54ec3835774f99d5470381432dd97992", + git_commit = "c7e364775269b35fcb43bcb4972faa2338b4b6e5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 84c2f74c4ae9a87ef997b23b2bee441785c4541f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Oct 2019 18:02:47 -0700 Subject: [PATCH 3525/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ff63ec31-ac00-496a-8ac0-461fa52c978d PiperOrigin-RevId: 277183038 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3be7e8e1be9..9c0bf40a72d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b997ed18dad9799f5588fa770623c37f54ec3835774f99d5470381432dd97992", - git_commit = "c7e364775269b35fcb43bcb4972faa2338b4b6e5", + sha256 = "8ddf985c0f63a0deca90a0bf4d12e201db5826bd682d1007ccd357983c3e50ba", + git_commit = "269e4abc1127aa8eecfc6031bd96f7ececfa771e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 077801e3378be016dcc66f6d4699f73c8743ec88 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Oct 2019 00:03:22 -0700 Subject: [PATCH 3526/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/dceb0a94-9668-4cd3-9cf4-12371f991dd7 PiperOrigin-RevId: 277223058 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9c0bf40a72d..bf0ed4179c5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8ddf985c0f63a0deca90a0bf4d12e201db5826bd682d1007ccd357983c3e50ba", - git_commit = "269e4abc1127aa8eecfc6031bd96f7ececfa771e", + sha256 = "7d68a3f8055835e7e0cba51f10597256dfbbac0c3db1e16953ad46dd98102dda", + git_commit = "833e16a8c9d873977ad7a64aa400ef0289f1660b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 49f632b4eb45ac2411581582f4a1c69aa8b6888a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Oct 2019 06:03:07 -0700 Subject: [PATCH 3527/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/16e145a7-1ede-4bdb-a0cb-ea1d1c94a2bb PiperOrigin-RevId: 277264218 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bf0ed4179c5..13c17d40f5a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7d68a3f8055835e7e0cba51f10597256dfbbac0c3db1e16953ad46dd98102dda", - git_commit = "833e16a8c9d873977ad7a64aa400ef0289f1660b", + sha256 = "0e38536fec9208050c799b6b51797eb3a170f4afb525d200159ffb034f2c9a27", + git_commit = "f91c1776370e0c81a2326eb33e86aadbb1063e72", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From de39e2ad19cdf3dd448739b61b96f4a7abd7ab77 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Oct 2019 12:02:26 -0700 Subject: [PATCH 3528/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/69b6b3af-4c59-4ac2-bbbf-72c12dc4baf9 PiperOrigin-RevId: 277334462 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 13c17d40f5a..8f56ff28f6d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0e38536fec9208050c799b6b51797eb3a170f4afb525d200159ffb034f2c9a27", - git_commit = "f91c1776370e0c81a2326eb33e86aadbb1063e72", + sha256 = "f13395805cf11a4f990150c73f5d8e35567a28f0866558e5a799f53b97966599", + git_commit = "6efce9a74d4ba2ba2182d92ac1e4f144b5d755d2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7676f8086c083da9ba38ec8e2a0da54cd41d5f68 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Oct 2019 00:03:09 -0700 Subject: [PATCH 3529/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8e628af9-8c01-4ec6-8851-a6f1f9f73207 PiperOrigin-RevId: 277447341 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8f56ff28f6d..1c5c5a7f1ec 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f13395805cf11a4f990150c73f5d8e35567a28f0866558e5a799f53b97966599", - git_commit = "6efce9a74d4ba2ba2182d92ac1e4f144b5d755d2", + sha256 = "b1ccb2df2486467936b78928a1a68559d9a681fbbceffc7c8fe44ea9d6b3ba65", + git_commit = "121957132338ebc6f6045a29b16b34a5953439aa", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1a4f0a0c399be65d5950729bf02bd03ec14460ca Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Oct 2019 06:03:15 -0700 Subject: [PATCH 3530/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/86bafa78-4936-44d0-8c02-54bc55456be7 PiperOrigin-RevId: 277489164 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1c5c5a7f1ec..53d7cd2ebc5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b1ccb2df2486467936b78928a1a68559d9a681fbbceffc7c8fe44ea9d6b3ba65", - git_commit = "121957132338ebc6f6045a29b16b34a5953439aa", + sha256 = "5ce4252300ade502466bce13ac11506424ef918fe6fb2655e931b967115c518a", + git_commit = "552d6a22f66f6f2c7eb749ac3e79d83a9476b0e2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 10e4987502ee91fe74c6c179ed4ba52f17cc75b4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Oct 2019 13:26:58 -0700 Subject: [PATCH 3531/8103] Be able to discard aspired-versions request from SourceRouter This change list: - Enables subclass of `tensorflow::serving::SourceRouter` to discard certian aspired-versions request by returning `kNoRoute` as routing id from the `Route(...)` method. Motivation of this change list: - Output ports of `SourceRouter` are instances of `SourceAdapter` which will block the `SetAspiredVersions(...)` call indefinitely until `SetAspiredVersionsCallback(...)` is called. - Thus under current implimentation of `SourceRouter` users are not able to discard fall-through aspired-versions request without connecting the fallback output port to a dummy target or setting a dummy `AspiredVersionsCallback` on the fall-through output port; - In addition, this change list eliminates the cost of mutex locking/unlocking while flowing aspired-versions request through the fallback output when the fallback output is not used. PiperOrigin-RevId: 277572219 --- tensorflow_serving/core/BUILD | 1 + tensorflow_serving/core/source_router.h | 15 +++++-- tensorflow_serving/core/source_router_test.cc | 39 ++++++++++++++++++- 3 files changed, 49 insertions(+), 6 deletions(-) diff --git a/tensorflow_serving/core/BUILD b/tensorflow_serving/core/BUILD index b3080cfa380..4223ee8d602 100644 --- a/tensorflow_serving/core/BUILD +++ b/tensorflow_serving/core/BUILD @@ -189,6 +189,7 @@ cc_test( ":servable_data", ":source_router", ":storage_path", + ":target", "//tensorflow_serving/core/test_util:mock_storage_path_target", "//tensorflow_serving/core/test_util:test_main", "@org_tensorflow//tensorflow/core:lib", diff --git a/tensorflow_serving/core/source_router.h b/tensorflow_serving/core/source_router.h index 94e6fc3d478..93c39e2d9fc 100644 --- a/tensorflow_serving/core/source_router.h +++ b/tensorflow_serving/core/source_router.h @@ -51,6 +51,8 @@ namespace serving { template class SourceRouter : public TargetBase { public: + static constexpr int kNoRoute = -1; + ~SourceRouter() override = 0; // Returns a vector of N source pointers, corresponding to the N output ports @@ -72,8 +74,10 @@ class SourceRouter : public TargetBase { // of the router. To be written by the implementing subclass. virtual int num_output_ports() const = 0; - // Returns the output port # to which to route a given aspired-versions - // request, in [0, num_output_ports() - 1]. To be written by the implementing + // Returns `kNoRoute` or a valid output port # in [0, num_output_ports() - 1]. + // Aspired-versions requests will be routed to the output port corresponding + // to the returned port number. If `kNoRoute` is returned, the aspired-version + // request will be discarded silently. To be written by the implementing // subclass. virtual int Route(const StringPiece servable_name, const std::vector>& versions) = 0; @@ -148,10 +152,13 @@ void SourceRouter::SetAspiredVersions( const StringPiece servable_name, std::vector> versions) { output_ports_created_.WaitForNotification(); int output_port = Route(servable_name, versions); + if (output_port == kNoRoute) { + return; + } if (output_port < 0 || output_port > output_ports_.size() - 1) { LOG(ERROR) - << "SourceRouter abstraction used improperly; Route() must return a " - "value in [0, num_output_ports()-1]; suppressing the " + << "SourceRouter abstraction used improperly; Route() must return " + "kNoRoute or a value in [0, num_output_ports()-1]; suppressing the " "aspired-versions request"; DCHECK(false); return; diff --git a/tensorflow_serving/core/source_router_test.cc b/tensorflow_serving/core/source_router_test.cc index 69f63a6de03..6b68c990aea 100644 --- a/tensorflow_serving/core/source_router_test.cc +++ b/tensorflow_serving/core/source_router_test.cc @@ -25,6 +25,7 @@ limitations under the License. #include "tensorflow/core/platform/macros.h" #include "tensorflow_serving/core/servable_data.h" #include "tensorflow_serving/core/storage_path.h" +#include "tensorflow_serving/core/target.h" #include "tensorflow_serving/core/test_util/mock_storage_path_target.h" using ::testing::_; @@ -39,11 +40,12 @@ namespace { class TestSourceRouter final : public SourceRouter { public: - TestSourceRouter() = default; + TestSourceRouter(int num_ports = 2) : num_output_ports_(num_ports) {} ~TestSourceRouter() override { Detach(); } protected: - int num_output_ports() const override { return 2; } + const int num_output_ports_; + int num_output_ports() const override { return num_output_ports_; } int Route(const StringPiece servable_name, const std::vector>& versions) override { @@ -51,6 +53,8 @@ class TestSourceRouter final : public SourceRouter { return 0; } else if (servable_name == "one") { return 1; + } else if (servable_name == "no_route") { + return kNoRoute; } else { LOG(FATAL) << "Unexpected test data"; } @@ -86,6 +90,21 @@ TEST(SourceRouterTest, Basic) { {ServableData({"one", 1}, "floo")}); } +TEST(SourceRouterTest, NumPorts) { + TestSourceRouter router(1); + std::vector*> output_ports = router.GetOutputPorts(); + ASSERT_EQ(1, output_ports.size()); + std::unique_ptr target( + new StrictMock); + ConnectSourceToTarget(output_ports[0], target.get()); + + EXPECT_CALL(*target, SetAspiredVersions(Eq("zero"), + ElementsAre(ServableData( + {"zero", 0}, "mrop")))); + router.SetAspiredVersions("zero", + {ServableData({"zero", 0}, "mrop")}); +} + TEST(SourceRouterTest, SetAspiredVersionsBlocksUntilAllTargetsConnected_1) { // Scenario 1: When SetAspiredVersions() is invoked, GetOutputPorts() has not // yet been called. The SetAspiredVersions() call should block until the ports @@ -156,6 +175,22 @@ TEST(SourceRouterTest, SetAspiredVersionsBlocksUntilAllTargetsConnected_2) { router.SetAspiredVersions("one", {}); } +TEST(SourceRouterTest, DiscardRequest) { + // Testing return kNoRoute to discard a request + + TestSourceRouter router; + std::vector*> output_ports = router.GetOutputPorts(); + std::vector> targets; + for (int i = 0; i < output_ports.size(); ++i) { + targets.emplace_back(new StrictMock); + ConnectSourceToTarget(output_ports[i], targets.back().get()); + } + + router.SetAspiredVersions("no_route", {}); + + // Expect no `SetAspiredVersions` call on `output_ports[0]`. +} + } // namespace } // namespace serving } // namespace tensorflow From 987e541ef0bba2265ecb7b0cb68a3c14d418734a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Oct 2019 18:02:55 -0700 Subject: [PATCH 3532/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/467e8646-1ace-4b37-980a-fd6d1f17dc0a PiperOrigin-RevId: 277624518 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 53d7cd2ebc5..b41ada5d4d4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5ce4252300ade502466bce13ac11506424ef918fe6fb2655e931b967115c518a", - git_commit = "552d6a22f66f6f2c7eb749ac3e79d83a9476b0e2", + sha256 = "86abf6163a7eebb62248c3973943bb81df5c7094ab7f0982d2282b5ecbeb3443", + git_commit = "198c1756b8eb8293eb177f10fccbba01174a657d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7ffb6e64b79ea3a49a1a07b1fdcbaf3572dbcb0c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 31 Oct 2019 00:03:18 -0700 Subject: [PATCH 3533/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a73def37-fce1-431d-8f41-c88b0afe7874 PiperOrigin-RevId: 277663013 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b41ada5d4d4..5bc80bc1f0d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "86abf6163a7eebb62248c3973943bb81df5c7094ab7f0982d2282b5ecbeb3443", - git_commit = "198c1756b8eb8293eb177f10fccbba01174a657d", + sha256 = "ea53db536d69c8dcd7385a412cacc0a17edfa4d56ec7a4e27be8e1ad27492604", + git_commit = "0f08466d733a81db6c3e9504563bcde56ee944f6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 474d41c74a6f291b813f1c8a8724f92ac3519e2f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 31 Oct 2019 06:03:03 -0700 Subject: [PATCH 3534/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/654c3af9-51bb-420a-af40-755bbf159fd2 PiperOrigin-RevId: 277705835 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5bc80bc1f0d..b25b4efbdae 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ea53db536d69c8dcd7385a412cacc0a17edfa4d56ec7a4e27be8e1ad27492604", - git_commit = "0f08466d733a81db6c3e9504563bcde56ee944f6", + sha256 = "8d792c3931aa140580bf74b36e0a3fc14232778a84f25d4664ecbe0a248db3d8", + git_commit = "d93b08d9bccb69ef636504a7a12724b6cf738af7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 12f37703e49fb7d8698cb3759f21b5e12708fd34 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 31 Oct 2019 12:02:26 -0700 Subject: [PATCH 3535/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c820849e-36da-4d2b-b83f-d3b29bd7c694 PiperOrigin-RevId: 277772300 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b25b4efbdae..64f19f45dbb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8d792c3931aa140580bf74b36e0a3fc14232778a84f25d4664ecbe0a248db3d8", - git_commit = "d93b08d9bccb69ef636504a7a12724b6cf738af7", + sha256 = "6aba0d530d996a8c3af91cd9910f3734289b235042f812260074339c602ccd09", + git_commit = "4bf3814197009d7d4860dee913de93f6e4c7cd94", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a0871ea5de9cd08e96bb6c51c7b84d487ab463de Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 31 Oct 2019 18:02:59 -0700 Subject: [PATCH 3536/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0df65804-94bd-4b34-89aa-546347043129 PiperOrigin-RevId: 277840692 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 64f19f45dbb..4e6e783cca5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6aba0d530d996a8c3af91cd9910f3734289b235042f812260074339c602ccd09", - git_commit = "4bf3814197009d7d4860dee913de93f6e4c7cd94", + sha256 = "d09233e692033081bb04fc73933101ac03e83563e2303cae1b7d6f6ad6b20c1f", + git_commit = "89810f5a051ee1532c88bd9ddc9de15d76fbf685", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d595d3f6d1b2828f55e6972a83cc3bd3d1a282f2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Nov 2019 00:03:23 -0700 Subject: [PATCH 3537/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/aea0050f-c874-4c7b-8ebe-261b0b7c3a76 PiperOrigin-RevId: 277877069 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4e6e783cca5..a6c3aacd37a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d09233e692033081bb04fc73933101ac03e83563e2303cae1b7d6f6ad6b20c1f", - git_commit = "89810f5a051ee1532c88bd9ddc9de15d76fbf685", + sha256 = "e5abb8d7afebbe62ca7ddb89a109f21584fcd0fbd1281a51762133698d75d249", + git_commit = "70907a9cb92c7993ba068b78e41dff0427d4350f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2e87e9413dcd5a2743d9af95875ffa330d366b89 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Nov 2019 06:03:18 -0700 Subject: [PATCH 3538/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b4c12a2c-230f-4aed-ad8d-0b6b38caee29 PiperOrigin-RevId: 277913639 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a6c3aacd37a..012920cf3a6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e5abb8d7afebbe62ca7ddb89a109f21584fcd0fbd1281a51762133698d75d249", - git_commit = "70907a9cb92c7993ba068b78e41dff0427d4350f", + sha256 = "2df666eef4579d0a8dbebb9b539ca83fb4aaecd33fe1a1cd9823709f453e53bf", + git_commit = "3cd6ad250df570cb5e9dcbb8be646f0bb6d0c61c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c27ecfa54f4a775b2aeba616be3b14ba9b1f6470 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Nov 2019 12:02:17 -0700 Subject: [PATCH 3539/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d218b835-0cbf-425a-9363-4745964d0b0e PiperOrigin-RevId: 277973890 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 012920cf3a6..e6299f81535 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2df666eef4579d0a8dbebb9b539ca83fb4aaecd33fe1a1cd9823709f453e53bf", - git_commit = "3cd6ad250df570cb5e9dcbb8be646f0bb6d0c61c", + sha256 = "d8a765c93700efba26e47720d028eea8530e787ce017959b4c532319426f5176", + git_commit = "60f77c51863973d6e17a99c72226a80e44443930", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c76beeaeef750b37ff3861347dc0e7de60690507 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Nov 2019 18:02:21 -0700 Subject: [PATCH 3540/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a9b96b12-7e56-482f-b775-e6acaffc0858 PiperOrigin-RevId: 278035450 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e6299f81535..f961af99b9a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d8a765c93700efba26e47720d028eea8530e787ce017959b4c532319426f5176", - git_commit = "60f77c51863973d6e17a99c72226a80e44443930", + sha256 = "d45ddf7a0197f0259352661f019aeba70f22e4f2a4928fc37edeb2b7b91123b7", + git_commit = "30ac8e4da66f6adfb0f49806a81bedf52221d74b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4f60ef6968490d47df9bccbc00c2606ece10f6b8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 2 Nov 2019 00:03:21 -0700 Subject: [PATCH 3541/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ae0cb545-3b81-40bd-a555-db423a0a2a69 PiperOrigin-RevId: 278071465 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f961af99b9a..02ce23a4e13 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d45ddf7a0197f0259352661f019aeba70f22e4f2a4928fc37edeb2b7b91123b7", - git_commit = "30ac8e4da66f6adfb0f49806a81bedf52221d74b", + sha256 = "251aee4d1142a4efce10861be19e6cf5821db166ca5ac7082cb34d9225462558", + git_commit = "1392eacc619d4a150d55a078102ec5458c588957", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5a3f0084d01ecc92d9ed8fd3245ecff4c03f08bd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 2 Nov 2019 06:03:02 -0700 Subject: [PATCH 3542/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3aaaab1f-1648-4645-9710-80e46fe35ae7 PiperOrigin-RevId: 278094624 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 02ce23a4e13..fef48808a9c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "251aee4d1142a4efce10861be19e6cf5821db166ca5ac7082cb34d9225462558", - git_commit = "1392eacc619d4a150d55a078102ec5458c588957", + sha256 = "5f778aa02daaddaa82d6b942c00820d8b3ee49ba34cb8cbd82555a40f0706e59", + git_commit = "b99ee9b34d413764e79b68eec2e1062cf71fbc7e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 57948594a8d6365a35e28793f092ebdd2a5e110e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 2 Nov 2019 18:03:01 -0700 Subject: [PATCH 3543/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/18bd6b1f-0d87-47d2-8314-4c9a060aa933 PiperOrigin-RevId: 278151583 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fef48808a9c..7f90badefad 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5f778aa02daaddaa82d6b942c00820d8b3ee49ba34cb8cbd82555a40f0706e59", - git_commit = "b99ee9b34d413764e79b68eec2e1062cf71fbc7e", + sha256 = "30b0544f9227deb3a3b47f6797e2096445e694d8861c89d3bf6387e07ad6ab9a", + git_commit = "919dfc3d066e72ee02baa11fbf7b035d9944daa9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 679e0a2bfb9705bc0e11adc7b10579ff86aa9a30 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 3 Nov 2019 05:02:51 -0800 Subject: [PATCH 3544/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/52540ed2-4152-4e59-826c-7169a5b108ee PiperOrigin-RevId: 278209744 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7f90badefad..f6bbe41924f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "30b0544f9227deb3a3b47f6797e2096445e694d8861c89d3bf6387e07ad6ab9a", - git_commit = "919dfc3d066e72ee02baa11fbf7b035d9944daa9", + sha256 = "18658fd7608544fc86bade1446f7f02a104cabd2160d09dce68e1771cd010780", + git_commit = "eda53c63dab8b364872ede8e423e4fed5d1686f7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3b018b6808f429a1a801099fae904909f34ae7a3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 3 Nov 2019 17:02:20 -0800 Subject: [PATCH 3545/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5b42442d-c4b5-4b93-8991-1b86a06305ce PiperOrigin-RevId: 278269976 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f6bbe41924f..1a00d28365a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "18658fd7608544fc86bade1446f7f02a104cabd2160d09dce68e1771cd010780", - git_commit = "eda53c63dab8b364872ede8e423e4fed5d1686f7", + sha256 = "bb68c5bfa958b8e940d9391337772d48e5554c25e8066b7c3bcddffcdb29b3aa", + git_commit = "720f7db2eb32bc39e3e9ed322c8baad059b7f494", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 48f3d4d3e050b8135ea0bd42cbdd89c083357608 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 3 Nov 2019 23:02:57 -0800 Subject: [PATCH 3546/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b6686c4f-893f-40d1-8a8a-3e7ca51e4b16 PiperOrigin-RevId: 278308354 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1a00d28365a..5274778f9ec 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bb68c5bfa958b8e940d9391337772d48e5554c25e8066b7c3bcddffcdb29b3aa", - git_commit = "720f7db2eb32bc39e3e9ed322c8baad059b7f494", + sha256 = "9f8acacc27e4b81a6c5d0d58ca2637ce7e770e2ef80a819f56ffb27a99415c96", + git_commit = "82fde44990342551410c40a63806c4c825289c39", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 41fea1820b9cb88b6f75db5b3f8236a399fc34ba Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 4 Nov 2019 06:03:22 -0800 Subject: [PATCH 3547/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3d673e15-0130-4d87-ba08-959ccfa9d523 PiperOrigin-RevId: 278361786 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5274778f9ec..02862020e55 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9f8acacc27e4b81a6c5d0d58ca2637ce7e770e2ef80a819f56ffb27a99415c96", - git_commit = "82fde44990342551410c40a63806c4c825289c39", + sha256 = "0670d0064ba80f76f8fc47729cdb7e75feb047604097cbfce1012bb503181f02", + git_commit = "f211533f4df0ba1b818264f9144121db41593508", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d832faa136442a32e3eb45420543916a43cfd104 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 4 Nov 2019 12:02:30 -0800 Subject: [PATCH 3548/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fd9c747f-25ed-48c6-94f3-de61b5c8cf42 PiperOrigin-RevId: 278433384 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 02862020e55..c02f24baa96 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0670d0064ba80f76f8fc47729cdb7e75feb047604097cbfce1012bb503181f02", - git_commit = "f211533f4df0ba1b818264f9144121db41593508", + sha256 = "da035b09f1b9f2f4d3d0705983af577b7ff1055a1f794dbf708ba72e505e65ac", + git_commit = "9cee786abd939d1f5f495d439d1d0b6c5ea7af33", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6fd3552b8f2ce232e864251cadec940c4f8a73fd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 4 Nov 2019 18:03:19 -0800 Subject: [PATCH 3549/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b6d590e3-3333-4499-8709-1bae9921058c PiperOrigin-RevId: 278506464 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c02f24baa96..43a8cb54963 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "da035b09f1b9f2f4d3d0705983af577b7ff1055a1f794dbf708ba72e505e65ac", - git_commit = "9cee786abd939d1f5f495d439d1d0b6c5ea7af33", + sha256 = "556a320bc77527c7bfe8ed1313bc45fd905875644f1d43ba39d5172a68602d90", + git_commit = "6c0c00ac37d0af354197273a4f0954881588a06e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 60afd5d5e6ad98e50fcf62c757597f7ec0f6543e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 5 Nov 2019 00:04:13 -0800 Subject: [PATCH 3550/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3f4b4512-e56e-4870-91fc-92caa6d5b5ec PiperOrigin-RevId: 278557997 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 43a8cb54963..40a5a556c1c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "556a320bc77527c7bfe8ed1313bc45fd905875644f1d43ba39d5172a68602d90", - git_commit = "6c0c00ac37d0af354197273a4f0954881588a06e", + sha256 = "f22b9974f03e7e351ce0d189d62db301f7168ace4db787a0ad644c6a313ce9f6", + git_commit = "ce69fe54695361d88c3b73d18e0d647baeb50c49", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4db752d0c339a57e89826362a083516a9a73ba48 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 5 Nov 2019 06:03:22 -0800 Subject: [PATCH 3551/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/80006042-51c5-4914-ab3d-830eb228002f PiperOrigin-RevId: 278607470 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 40a5a556c1c..279f4440bca 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f22b9974f03e7e351ce0d189d62db301f7168ace4db787a0ad644c6a313ce9f6", - git_commit = "ce69fe54695361d88c3b73d18e0d647baeb50c49", + sha256 = "44a9bd1fc775ab804877f816df7e6f3d8238020b266e7c41010362a133af3965", + git_commit = "f63cc98935c2c1cf8a42eaa5951c66a3e16c8d5a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 87a4b2b28729bd269ab367742998b6f8426ea1b7 Mon Sep 17 00:00:00 2001 From: Gaurav Jain Date: Tue, 5 Nov 2019 16:25:02 -0800 Subject: [PATCH 3552/8103] Us public tf.config APIs PiperOrigin-RevId: 278732953 --- .../test_util/tensorflow_model_server_test_base.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/tensorflow_serving/model_servers/test_util/tensorflow_model_server_test_base.py b/tensorflow_serving/model_servers/test_util/tensorflow_model_server_test_base.py index 49b3f1ef3e2..d8c544601f2 100644 --- a/tensorflow_serving/model_servers/test_util/tensorflow_model_server_test_base.py +++ b/tensorflow_serving/model_servers/test_util/tensorflow_model_server_test_base.py @@ -35,8 +35,6 @@ import tensorflow as tf from tensorflow.core.framework import types_pb2 -from tensorflow.python.eager import context -from tensorflow.python.framework import config as device_config from tensorflow.python.platform import flags from tensorflow.python.saved_model import signature_constants from tensorflow_serving.apis import predict_pb2 @@ -56,14 +54,15 @@ def SetVirtualCpus(num_virtual_cpus): if num_virtual_cpus < 1: raise ValueError('`num_virtual_cpus` must be at least 1 not %r' % (num_virtual_cpus,)) - physical_devices = device_config.list_physical_devices('CPU') + physical_devices = tf.config.experimental.list_physical_devices('CPU') if not physical_devices: raise RuntimeError('No CPUs found') - configs = device_config.get_virtual_device_configuration(physical_devices[0]) + configs = tf.config.experimental.get_virtual_device_configuration( + physical_devices[0]) if configs is None: - virtual_devices = [context.VirtualDeviceConfiguration() + virtual_devices = [tf.config.experimental.VirtualDeviceConfiguration() for _ in range(num_virtual_cpus)] - device_config.set_virtual_device_configuration( + tf.config.experimental.set_virtual_device_configuration( physical_devices[0], virtual_devices) else: if len(configs) < num_virtual_cpus: From 19e60872bf311c0bd132c61c495987bdbc0a29ca Mon Sep 17 00:00:00 2001 From: Adrian Kuegel Date: Thu, 7 Nov 2019 01:22:30 -0800 Subject: [PATCH 3553/8103] Update tensorflow revision for open source. Also do the required changes which are necessary to update to this new revision (proto dependency names have changed). PiperOrigin-RevId: 279033380 --- WORKSPACE | 4 ++-- tensorflow_serving/apis/BUILD | 8 ++++---- tensorflow_serving/servables/tensorflow/BUILD | 2 +- tensorflow_serving/util/BUILD | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 279f4440bca..6e6a42506be 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "44a9bd1fc775ab804877f816df7e6f3d8238020b266e7c41010362a133af3965", - git_commit = "f63cc98935c2c1cf8a42eaa5951c66a3e16c8d5a", + sha256 = "4f76a8e7a680344c6e8329a52b979a94052f1a60e4725e886d81bfe94bf8fefe", + git_commit = "35f8f8ababb43fcd93f1907c9befb4ab5daa7a77", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") diff --git a/tensorflow_serving/apis/BUILD b/tensorflow_serving/apis/BUILD index d1f1134b699..80b8d5d0045 100644 --- a/tensorflow_serving/apis/BUILD +++ b/tensorflow_serving/apis/BUILD @@ -30,7 +30,7 @@ serving_proto_library( deps = [ ":model_proto", "@com_google_protobuf//:cc_wkt_protos", - "@org_tensorflow//tensorflow/core:protos_all_cc", + "@org_tensorflow//tensorflow/core:protos_all", ], ) @@ -49,7 +49,7 @@ serving_proto_library( srcs = ["input.proto"], cc_api_version = 2, deps = [ - "@org_tensorflow//tensorflow/core:protos_all_cc", + "@org_tensorflow//tensorflow/core:protos_all", ], ) @@ -108,7 +108,7 @@ serving_proto_library( cc_api_version = 2, deps = [ ":model_proto", - "@org_tensorflow//tensorflow/core:protos_all_cc", + "@org_tensorflow//tensorflow/core:protos_all", ], ) @@ -367,7 +367,7 @@ serving_proto_library( cc_api_version = 2, deps = [ ":model_proto", - "@org_tensorflow//tensorflow/core:protos_all_cc", + "@org_tensorflow//tensorflow/core:protos_all", ], ) diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index 3bb5e09d4a2..e7576abc92d 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -33,7 +33,7 @@ serving_proto_library( ], deps = [ "@com_google_protobuf//:cc_wkt_protos", - "@org_tensorflow//tensorflow/core:protos_all_cc", + "@org_tensorflow//tensorflow/core:protos_all", ], ) diff --git a/tensorflow_serving/util/BUILD b/tensorflow_serving/util/BUILD index be45e6252b2..986ce5f58c4 100644 --- a/tensorflow_serving/util/BUILD +++ b/tensorflow_serving/util/BUILD @@ -400,7 +400,7 @@ serving_proto_library( cc_api_version = 2, visibility = ["//visibility:public"], deps = [ - "@org_tensorflow//tensorflow/core:protos_all_cc", + "@org_tensorflow//tensorflow/core:protos_all", ], ) From b069cb0a79e343a7281302bb9471f27d8ba59b21 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Nov 2019 06:02:28 -0800 Subject: [PATCH 3554/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/aa69fe90-691d-4afe-8b51-317203febc76 PiperOrigin-RevId: 279069458 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6e6a42506be..1b3ad2dbbd1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4f76a8e7a680344c6e8329a52b979a94052f1a60e4725e886d81bfe94bf8fefe", - git_commit = "35f8f8ababb43fcd93f1907c9befb4ab5daa7a77", + sha256 = "258c071d9299de4de71a058bce29eae02701f8848bb7d4660230c2d5c1569c84", + git_commit = "f45272036ccbccc7c8b5a647bc30da8a156ba576", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e853b051214827076e87078c8b84c6a39838f2c6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Nov 2019 12:02:17 -0800 Subject: [PATCH 3555/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/68c670e3-f811-4d4d-8bdb-7c652d70e405 PiperOrigin-RevId: 279137455 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1b3ad2dbbd1..b5604148d9c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "258c071d9299de4de71a058bce29eae02701f8848bb7d4660230c2d5c1569c84", - git_commit = "f45272036ccbccc7c8b5a647bc30da8a156ba576", + sha256 = "1fcaeab0e62af42d1d5c312b2a7da5ee97c84f073763b8793d885d611bb87173", + git_commit = "a44da74d9408a103e01a009a9f552b905fcf4ea9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3ca6104d256561253790af3a13f6d1e9f5b0c363 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Nov 2019 18:02:28 -0800 Subject: [PATCH 3556/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/946401e6-cfe6-4844-8f3c-e524aa37b256 PiperOrigin-RevId: 279208833 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b5604148d9c..6cc90da8457 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1fcaeab0e62af42d1d5c312b2a7da5ee97c84f073763b8793d885d611bb87173", - git_commit = "a44da74d9408a103e01a009a9f552b905fcf4ea9", + sha256 = "70b0f346aaef511c2cdb63f3a6934473e980a76d1d6310d853728cd7b2e4e8e0", + git_commit = "95778693633acfb368bb684e9f036932a82a6a85", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b6f3bd51ffb766f34353b6541414ea2e5693c7b7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Nov 2019 00:02:34 -0800 Subject: [PATCH 3557/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/14cf9042-8275-4b1c-a44d-de0efd48f5ef PiperOrigin-RevId: 279254133 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6cc90da8457..938992cfbb4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "70b0f346aaef511c2cdb63f3a6934473e980a76d1d6310d853728cd7b2e4e8e0", - git_commit = "95778693633acfb368bb684e9f036932a82a6a85", + sha256 = "afab7370766e940ac72203fc70037148eb02f5a64e3c28f1abbd0b282b7c1fe7", + git_commit = "4f42698fdc71b4578366f403fbc05dd09bd575ee", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6ff28eacebeab7fe45032c3da54ecdb5f3cb8cf0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Nov 2019 06:02:31 -0800 Subject: [PATCH 3558/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c356b226-3501-4bd0-ab1b-2049b2447980 PiperOrigin-RevId: 279298107 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 938992cfbb4..ef437f3ed5f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "afab7370766e940ac72203fc70037148eb02f5a64e3c28f1abbd0b282b7c1fe7", - git_commit = "4f42698fdc71b4578366f403fbc05dd09bd575ee", + sha256 = "f0caecf41478f6485463d88c7e3970e6262d32d967df3ee6aa73de2a182a8361", + git_commit = "c40dedb5364830417875b254a58614a18aa99d02", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 21793147a03384d50cc8e2d035125badbe04b69a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Nov 2019 12:02:41 -0800 Subject: [PATCH 3559/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/109b8e6e-9318-4bbb-ad4f-bde8bfd4d3a1 PiperOrigin-RevId: 279362530 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ef437f3ed5f..d4e0ee37dfa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f0caecf41478f6485463d88c7e3970e6262d32d967df3ee6aa73de2a182a8361", - git_commit = "c40dedb5364830417875b254a58614a18aa99d02", + sha256 = "ac96e0e1ee1bc772a1c7022c8ddb5887d4b8e9738b590e440131834297df6c5f", + git_commit = "457420860abe4a9b18cf3bb3eedc86aa58711f6d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9544077bdb6eef9b20a0688a042155ee6dea011a Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Fri, 8 Nov 2019 13:13:59 -0800 Subject: [PATCH 3560/8103] Fix copying of string tensor outputs by explicitly copying each string and not doing a memcpy (that is only done for numerics). String tensors in TF Lite have a different in-memory format than TF string tensors and cannot be memcpy-ed. Tested: o Added unit test (that fails without the associated .cc file change). PiperOrigin-RevId: 279376125 --- .../servables/tensorflow/tflite_session.cc | 70 ++++++++++----- .../tensorflow/tflite_session_test.cc | 85 +++++++++++++++++++ 2 files changed, 135 insertions(+), 20 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/tflite_session.cc b/tensorflow_serving/servables/tensorflow/tflite_session.cc index 77694a0d3cc..a799ad8ba60 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session.cc @@ -152,11 +152,58 @@ Status FillTfLiteTensorFromInput(const string& name, const Tensor& tensor, tensor_bytes.size()); } else { tflite::DynamicBuffer buf; - auto tensor_vec = tensor.vec(); + auto tensor_vec = tensor.flat(); for (int i = 0; i < tensor_vec.size(); i++) { buf.AddString(tensor_vec(i).data(), tensor_vec(i).size()); } - buf.WriteToTensor(tflite_tensor, /*new_shape=*/nullptr); + TfLiteIntArray* dims_array = TfLiteIntArrayCreate(tensor.dims()); + for (int i = 0; i < tensor.dims(); i++) { + dims_array->data[i] = static_cast(tensor.dim_size(i)); + } + // WriteToTensor() takes ownership of dims_array. + buf.WriteToTensor(tflite_tensor, dims_array); + } + return Status::OK(); +} + +Status AppendTfLiteToTfTensorList(const TfLiteTensor* tflite_tensor, + std::vector* outputs) { + DataType tf_type; + TF_RETURN_IF_ERROR(TfLiteTypeToTfType(tflite_tensor->type, &tf_type)); + + TensorShape shape; + for (int i = 0; i < tflite_tensor->dims->size; ++i) { + shape.AddDim(tflite_tensor->dims->data[i]); + } + + outputs->emplace_back(Tensor(tf_type, shape)); + Tensor* tensor = &outputs->back(); + if (DataTypeCanUseMemcpy(tf_type)) { + auto tensor_bytes = tensor->tensor_data(); + if (tflite_tensor->bytes != tensor_bytes.size()) { + return errors::Internal( + "Failed to convert TFLite tensor: ", tflite_tensor->name, + " to TF tensor. Size mismatch: ", tensor_bytes.size(), " vs ", + tflite_tensor->bytes); + } + std::memcpy(const_cast(tensor_bytes.data()), tflite_tensor->data.raw, + tflite_tensor->bytes); + } else if (tflite_tensor->type == kTfLiteString) { + const int num_strings = tflite::GetStringCount(tflite_tensor); + if (num_strings != tensor->NumElements()) { + return errors::Internal( + "Failed to convert TFLite tensor: ", tflite_tensor->name, + " to TF tensor. Num elements mismatch: ", tensor->NumElements(), + " vs ", num_strings); + } + auto str_tensors = outputs->back().flat(); + for (int i = 0; i < num_strings; i++) { + auto ref = tflite::GetString(tflite_tensor, i); + str_tensors(i).assign(ref.str, ref.len); + } + } else { + return errors::Internal("TFLite to TF Tensor copy not supported for type: ", + tflite_tensor->type); } return Status::OK(); } @@ -266,24 +313,7 @@ Status TfLiteSession::Run(const RunOptions& run_options, return errors::InvalidArgument( "Failed to get output TFLite tensor: ", name, " at index: ", index); } - - DataType tf_type; - TF_RETURN_IF_ERROR(TfLiteTypeToTfType(tflite_tensor->type, &tf_type)); - - TensorShape shape; - for (int i = 0; i < tflite_tensor->dims->size; i++) { - shape.AddDim(tflite_tensor->dims->data[i]); - } - outputs->emplace_back(Tensor(tf_type, shape)); - auto tensor_bytes = outputs->back().tensor_data(); - if (tflite_tensor->bytes != tensor_bytes.size()) { - return errors::Internal( - "Failed to convert output tensor: ", name, - " to TFLite tensor. Size mismatch: ", tensor_bytes.size(), " vs ", - tflite_tensor->bytes); - } - std::memcpy(const_cast(tensor_bytes.data()), tflite_tensor->data.raw, - tflite_tensor->bytes); + TF_RETURN_IF_ERROR(AppendTfLiteToTfTensorList(tflite_tensor, outputs)); } return Status::OK(); } diff --git a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc index bee6ed27a54..8a4f0aa5f79 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc @@ -26,6 +26,7 @@ limitations under the License. #include "tensorflow/core/lib/core/status_test_util.h" #include "tensorflow/core/platform/env.h" #include "tensorflow/core/platform/logging.h" +#include "tensorflow/lite/version.h" #include "tensorflow_serving/test_util/test_util.h" namespace tensorflow { @@ -92,6 +93,90 @@ TEST(TfLiteSession, BasicTest) { } } +constexpr char kTestModelInputList[] = "list"; +constexpr char kTestModelInputShape[] = "shape"; +constexpr char kTestModelOutput[] = "output"; + +// Returns a serialized FlatBuffer tflite model. +// +// The model has two inputs (kTestModelInputList|Shape) and one output +// kTestModelOutput. The output is list that is reshaped to shape via +// tf.reshape operator. +// +// Elements of list are expected to be of `tensor_type` type. +string BuildTestModel(tflite::TensorType tensor_type) { + std::vector inputs; + std::vector outputs; + std::vector> tensors; + std::vector> opcodes; + std::vector> operators; + std::vector> buffers; + flatbuffers::FlatBufferBuilder builder; + + // Input list: 1D tensor for list of `tensor_type` elements. + inputs.push_back(tensors.size()); + tensors.push_back(CreateTensor(builder, builder.CreateVector({1}), + tensor_type, /*buffer=*/0, + builder.CreateString(kTestModelInputList), + /*quantization=*/0, /*is_variable=*/false)); + + // Input shape: 1D tensor for shape. + inputs.push_back(tensors.size()); + tensors.push_back(CreateTensor(builder, builder.CreateVector({1}), + tflite::TensorType_INT32, /*buffer=*/0, + builder.CreateString(kTestModelInputShape), + /*quantization=*/0, /*is_variable=*/false)); + + // Output: Reshaped list to shape. + outputs.push_back(tensors.size()); + tensors.push_back(CreateTensor(builder, builder.CreateVector({1}), + tensor_type, /*buffer=*/0, + builder.CreateString(kTestModelOutput), + /*quantization=*/0, /*is_variable=*/false)); + + // Add reshape operator. + opcodes.push_back( + CreateOperatorCode(builder, tflite::BuiltinOperator_RESHAPE, 0)); + operators.push_back(CreateOperator( + builder, /*opcode_index=*/0, builder.CreateVector(inputs), + builder.CreateVector(outputs), + tflite::BuiltinOptions_ReshapeOptions, + tflite::CreateReshapeOptions(builder, builder.CreateVector({})) + .Union(), + /*custom_options=*/0, tflite::CustomOptionsFormat_FLEXBUFFERS)); + + auto subgraph = CreateSubGraph(builder, builder.CreateVector(tensors), + builder.CreateVector(inputs), + builder.CreateVector(outputs), + builder.CreateVector(operators)); + builder.Finish(CreateModel( + builder, TFLITE_SCHEMA_VERSION, builder.CreateVector(opcodes), + builder.CreateVector(&subgraph, 1), builder.CreateString("testmodel"), + builder.CreateVector(buffers))); + + return string(reinterpret_cast(builder.GetBufferPointer()), + builder.GetSize()); +} + +TEST(TfLiteSession, ProcessStrings) { + string model_bytes = BuildTestModel(tflite::TensorType_STRING); + ::google::protobuf::Map signatures; + std::unique_ptr session; + TF_EXPECT_OK( + TfLiteSession::Create(std::move(model_bytes), &session, &signatures)); + Tensor input_list = + test::AsTensor({"a", "b", "c", "d"}, TensorShape({4})); + Tensor input_shape = test::AsTensor({2, 2}, TensorShape({2})); + std::vector outputs; + TF_EXPECT_OK(session->Run( + {{kTestModelInputList, input_list}, {kTestModelInputShape, input_shape}}, + {kTestModelOutput}, {}, &outputs)); + ASSERT_EQ(outputs.size(), 1); + test::ExpectTensorEqual( + outputs[0], + test::AsTensor({"a", "b", "c", "d"}, TensorShape({2, 2}))); +} + } // namespace } // namespace serving } // namespace tensorflow From ca3c486f1cb665a381379af77caeefa90e2dcfc1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Nov 2019 18:02:23 -0800 Subject: [PATCH 3561/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3b930972-b2af-4027-83d6-4e226bd88000 PiperOrigin-RevId: 279428452 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d4e0ee37dfa..937f134f485 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ac96e0e1ee1bc772a1c7022c8ddb5887d4b8e9738b590e440131834297df6c5f", - git_commit = "457420860abe4a9b18cf3bb3eedc86aa58711f6d", + sha256 = "a93d41dcd0555996409131b3d63efbe2bd54e1e7be72d96c113b2068d611c034", + git_commit = "7a07f274d65bed12b91b6c6dbe4987a6e1649429", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3ad3f25feabc8e93c9b03dcc7797f7660d004f47 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 9 Nov 2019 00:02:37 -0800 Subject: [PATCH 3562/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ad12d7a8-e05e-4387-a1c7-d918188fa336 PiperOrigin-RevId: 279462369 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 937f134f485..307829d16e3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a93d41dcd0555996409131b3d63efbe2bd54e1e7be72d96c113b2068d611c034", - git_commit = "7a07f274d65bed12b91b6c6dbe4987a6e1649429", + sha256 = "e3d8e9e3f2c5d9d25148962cbd30d1b4bb87a3a0ea35976c0344a5124113f979", + git_commit = "ce1fe70d2a2b33b11e157385a0bb439256dd68cf", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 76ccb52b8107c63e778e71341c3881da418b39d3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 9 Nov 2019 06:02:39 -0800 Subject: [PATCH 3563/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/18568159-bec4-48ac-bc68-0b8bebb0f121 PiperOrigin-RevId: 279491573 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 307829d16e3..0d15a2e0f0d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e3d8e9e3f2c5d9d25148962cbd30d1b4bb87a3a0ea35976c0344a5124113f979", - git_commit = "ce1fe70d2a2b33b11e157385a0bb439256dd68cf", + sha256 = "bb1d33237b7d6e490b40ff9d54f89bcd38136a79abfe97c38f10ec6d09309328", + git_commit = "ce0b9aa347979cfbe4291440a3aeeb7af3dda41d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 28f5e607589f162fab59388c474273407be561d2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 9 Nov 2019 18:02:32 -0800 Subject: [PATCH 3564/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0cd3e7ee-7bc0-415f-b1ce-16f19c03dd3f PiperOrigin-RevId: 279543093 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0d15a2e0f0d..0188c3e88dc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bb1d33237b7d6e490b40ff9d54f89bcd38136a79abfe97c38f10ec6d09309328", - git_commit = "ce0b9aa347979cfbe4291440a3aeeb7af3dda41d", + sha256 = "68676ddd2fb2c0af1ad69ae964a5c23f5d91f3858753b2273833447397d2e95e", + git_commit = "fa3a6a43d452dc391b63c97ecd498f95a95c20d9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 11aebcc7fae0b076dab72ea286014afd19fc76fa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 10 Nov 2019 00:02:35 -0800 Subject: [PATCH 3565/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/373b4446-6f71-45b1-90bb-be4bcb2d0bb0 PiperOrigin-RevId: 279569832 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0188c3e88dc..d1bc446bba0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "68676ddd2fb2c0af1ad69ae964a5c23f5d91f3858753b2273833447397d2e95e", - git_commit = "fa3a6a43d452dc391b63c97ecd498f95a95c20d9", + sha256 = "9284510e5ef64150e985709cf0866433a0eef730f840d8703944ad1b6ad99f08", + git_commit = "ff05c644e4d43b5738651dfaad9888d4636d763d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2fe3d7698dbbe46d44fa7e1e636ce46f721b12da Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 10 Nov 2019 06:02:29 -0800 Subject: [PATCH 3566/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/015394ef-bc2e-4547-9830-2113f653aeda PiperOrigin-RevId: 279599388 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d1bc446bba0..0a92122ab4b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9284510e5ef64150e985709cf0866433a0eef730f840d8703944ad1b6ad99f08", - git_commit = "ff05c644e4d43b5738651dfaad9888d4636d763d", + sha256 = "44deaa35b6389a4acc4acb9c2f967076020905cae8b94f5d621f338e34eb3f15", + git_commit = "979c105c2cea75e0e481359d2d0c74fdbc9f867e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From be2a5954660312e0a49f99ac1638aebeee4d750c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 10 Nov 2019 18:02:14 -0800 Subject: [PATCH 3567/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c3962716-1232-4c8e-b142-e61aaf70a8f5 PiperOrigin-RevId: 279649616 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0a92122ab4b..c0b89d49579 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "44deaa35b6389a4acc4acb9c2f967076020905cae8b94f5d621f338e34eb3f15", - git_commit = "979c105c2cea75e0e481359d2d0c74fdbc9f867e", + sha256 = "c9c0e37efcd24bde290e2385c3bba21e588cb48299c60094988aa1ae80017d33", + git_commit = "1d3db869f9154b537a5bfedc2c01eadbb167919b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 140d7df6e0294eb67c5162ecccd1f9ba112f2336 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Nov 2019 00:02:30 -0800 Subject: [PATCH 3568/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/356b052c-30ad-42c7-b90b-36445f32c747 PiperOrigin-RevId: 279678947 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c0b89d49579..b71dd2f6c10 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c9c0e37efcd24bde290e2385c3bba21e588cb48299c60094988aa1ae80017d33", - git_commit = "1d3db869f9154b537a5bfedc2c01eadbb167919b", + sha256 = "1f2abc539d721488217391eda2e87567de5f477f71a093e5b7ce00e2dda81644", + git_commit = "730602680f3adbe98cec0b7cfa1c78230bb4eccf", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6ff7c3757e83c36554c4150a1342165776f84e1c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Nov 2019 06:02:28 -0800 Subject: [PATCH 3569/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b018b9d6-e8df-455d-983e-0472dec59ceb PiperOrigin-RevId: 279720175 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b71dd2f6c10..4e987e2ae20 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1f2abc539d721488217391eda2e87567de5f477f71a093e5b7ce00e2dda81644", - git_commit = "730602680f3adbe98cec0b7cfa1c78230bb4eccf", + sha256 = "831ac807baea545f9f082a1a4db26573d98a9cf0bbf39474b8c453e6a8e17cf6", + git_commit = "783ea2cb9eea518c7802490890907803470458da", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3db7d6b07e0420441257b707002966cd53218f30 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Nov 2019 12:02:34 -0800 Subject: [PATCH 3570/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a8653f59-3cf5-4ae4-8b23-c4cffcffad4a PiperOrigin-RevId: 279786669 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4e987e2ae20..e875bb5a313 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "831ac807baea545f9f082a1a4db26573d98a9cf0bbf39474b8c453e6a8e17cf6", - git_commit = "783ea2cb9eea518c7802490890907803470458da", + sha256 = "1f340a93cc873dccd15667ca66474f2e66aa4e25f9127fc03d6b2ce450a0f054", + git_commit = "4308ccf139ac38ed7e47490616783d90aa061cc6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 217a94ba404fedd16387b496846c3465ea6728bd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Nov 2019 18:02:34 -0800 Subject: [PATCH 3571/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/28ff3674-eccb-4e89-a8f7-0e5a241edddd PiperOrigin-RevId: 279858177 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e875bb5a313..8ac539b0398 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1f340a93cc873dccd15667ca66474f2e66aa4e25f9127fc03d6b2ce450a0f054", - git_commit = "4308ccf139ac38ed7e47490616783d90aa061cc6", + sha256 = "65a6625414458502715b0040ad6f6d1f5954ba24bcc53c1124478cbe54fa4c59", + git_commit = "4a0ba5e5b189813b679f7e943587ea5e0234a6d8", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 283d92479af58930cdf560610646963e9e3c3098 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Nov 2019 00:02:59 -0800 Subject: [PATCH 3572/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/52ccd619-d310-47a2-8591-6ccf45933183 PiperOrigin-RevId: 279899324 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8ac539b0398..80476d96117 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "65a6625414458502715b0040ad6f6d1f5954ba24bcc53c1124478cbe54fa4c59", - git_commit = "4a0ba5e5b189813b679f7e943587ea5e0234a6d8", + sha256 = "61ed29457c3e88b531ebf25027e27d59f8ba57f3516a0346c80f9f7a80617ba4", + git_commit = "7d8e271251d13f8008545220da438c2b7f42ece9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From dcd3cdc42b39f1fcc822d030468bc19d8a9a4402 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Nov 2019 06:04:14 -0800 Subject: [PATCH 3573/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/dc53e51d-4b8c-4b53-8b1e-9426094cf35c PiperOrigin-RevId: 279948340 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 80476d96117..dd916da3a62 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "61ed29457c3e88b531ebf25027e27d59f8ba57f3516a0346c80f9f7a80617ba4", - git_commit = "7d8e271251d13f8008545220da438c2b7f42ece9", + sha256 = "12a8efcac53d8336156f64df5275df79da59811a004d6c1b901d55752bda7db3", + git_commit = "cf42039ee54a2278065c6bff4c6c14feedd1a2af", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ef7a1fb956dfb9cacb4b72e5424200f5094f1976 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Nov 2019 12:02:40 -0800 Subject: [PATCH 3574/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3875962a-ca77-4c74-9e56-6701a2d11c7b PiperOrigin-RevId: 280022587 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dd916da3a62..db70955a5ab 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "12a8efcac53d8336156f64df5275df79da59811a004d6c1b901d55752bda7db3", - git_commit = "cf42039ee54a2278065c6bff4c6c14feedd1a2af", + sha256 = "2b9cde17964c9b26cb7cedcef78c9f42c011f3101b7f5086cce4a5e325b1a205", + git_commit = "403d2cbd2e0abede34a9f869db026817cc84b0aa", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From bb3bffbf4805e8db3aabbe7a09fa955c33f23326 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Nov 2019 18:02:37 -0800 Subject: [PATCH 3575/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f6b753fb-39f2-4b75-bfff-7bc584fec902 PiperOrigin-RevId: 280097988 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index db70955a5ab..bab388d2c4e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2b9cde17964c9b26cb7cedcef78c9f42c011f3101b7f5086cce4a5e325b1a205", - git_commit = "403d2cbd2e0abede34a9f869db026817cc84b0aa", + sha256 = "f740a84ea3b8e0fe884c4d024d11cc8502e781394d192560a50df3e511d1c106", + git_commit = "269f4fb6007fe57320a2a1c1fb9bc35deca2c6a5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6fe5285b8922991bf2bb9621d50d55cefe98c699 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Nov 2019 00:02:39 -0800 Subject: [PATCH 3576/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5d712716-26c6-4084-9ffc-6cef1591c5bc PiperOrigin-RevId: 280138840 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bab388d2c4e..5764dc04d3f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f740a84ea3b8e0fe884c4d024d11cc8502e781394d192560a50df3e511d1c106", - git_commit = "269f4fb6007fe57320a2a1c1fb9bc35deca2c6a5", + sha256 = "755328806f64067468c1bd3987220837e4bc19c389654017e18fffcca30a80be", + git_commit = "0cc92db3b135638f0b7d8dc9bc5458933098f4bd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8e514a36efbaccafa7d5551c6dc6c3b3b98a367a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Nov 2019 06:02:38 -0800 Subject: [PATCH 3577/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/63f4c17e-8ef6-43a4-997d-96edd62f1169 PiperOrigin-RevId: 280182272 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5764dc04d3f..f07c0710767 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "755328806f64067468c1bd3987220837e4bc19c389654017e18fffcca30a80be", - git_commit = "0cc92db3b135638f0b7d8dc9bc5458933098f4bd", + sha256 = "5c714f10184b37a60216ef7027e7f324a071581162a3aa81a18c7d34061dbe65", + git_commit = "4c54f0a0a83d3cf8e2a3326734880fced6e37541", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 62f4094bbf97979371bfd9c3a3120a1585be407d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Nov 2019 18:03:06 -0800 Subject: [PATCH 3578/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/226457ef-4b05-4dd3-85ab-508cc4b6a110 PiperOrigin-RevId: 280323170 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f07c0710767..7f410dc17e9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5c714f10184b37a60216ef7027e7f324a071581162a3aa81a18c7d34061dbe65", - git_commit = "4c54f0a0a83d3cf8e2a3326734880fced6e37541", + sha256 = "4a95c1a5c3728a77308be4b4767009e51400578af06eb6925cf44ad4d2cea177", + git_commit = "36eed9c1128b8dc9f7dae4273e1be13420f8682c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 11829c42d0332c5d87828e55bf4c8fde6cdc34e4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Nov 2019 00:02:54 -0800 Subject: [PATCH 3579/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/881ffbfd-50f0-484b-be02-b670ab5ae4dd PiperOrigin-RevId: 280365530 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7f410dc17e9..f29c364f2f2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4a95c1a5c3728a77308be4b4767009e51400578af06eb6925cf44ad4d2cea177", - git_commit = "36eed9c1128b8dc9f7dae4273e1be13420f8682c", + sha256 = "0335c8eba6f7a851e7820325775adc0d6fac9a3fc51d557f4a28e238b1717b22", + git_commit = "befd063e093b306084642872c1c7e95317e0fee4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 17a6c4dd8b74c01f0d0d1faa9079f375af5f8298 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Nov 2019 06:02:38 -0800 Subject: [PATCH 3580/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c371f9a3-b75e-4273-983e-640a7f048425 PiperOrigin-RevId: 280410394 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f29c364f2f2..34564ad506a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0335c8eba6f7a851e7820325775adc0d6fac9a3fc51d557f4a28e238b1717b22", - git_commit = "befd063e093b306084642872c1c7e95317e0fee4", + sha256 = "c44f45acac6008eff3df42f28be86caa726c0531d1eb9149922f7e7895196d42", + git_commit = "63baa531022740e8fb759b4e4b4446b69cca5b17", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 91adea9716b57dd58427714427b944fbe9b3f89e Mon Sep 17 00:00:00 2001 From: Pedram Pejman Date: Fri, 15 Nov 2019 11:30:04 -0800 Subject: [PATCH 3581/8103] Adds integration with TensorBoard profiler service PiperOrigin-RevId: 280700349 --- tensorflow_serving/model_servers/BUILD | 4 +- tensorflow_serving/model_servers/server.cc | 5 +++ tensorflow_serving/model_servers/server.h | 2 + .../tensorflow_model_server_test.py | 45 +++++++++++++++++++ 4 files changed, 54 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index d4940bf7157..374e32b234d 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -2,6 +2,7 @@ load("//tensorflow_serving:oss_or_google.bzl", "if_google") load("//tensorflow_serving:tensorflow_version.bzl", "if_not_v2", "if_v2") +load("@bazel_tools//tools/build_defs/pkg:pkg.bzl", "pkg_deb", "pkg_tar") package( default_visibility = [ @@ -337,6 +338,7 @@ cc_library( "@org_tensorflow//tensorflow/cc/saved_model:tag_constants", "@org_tensorflow//tensorflow/core:lib", "@com_google_absl//absl/memory", + "@org_tensorflow//tensorflow/core/profiler/rpc:profiler_service_impl", "@org_tensorflow//tensorflow/core:protos_all_cc", "//tensorflow_serving/config:model_server_config_proto", "//tensorflow_serving/config:monitoring_config_proto", @@ -454,8 +456,6 @@ py_binary( ], ) -load("@bazel_tools//tools/build_defs/pkg:pkg.bzl", "pkg_deb", "pkg_tar") - pkg_tar( name = "tensorflow_model_server_tar", srcs = [ diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index 9808f9ad193..e4e56e7c520 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -37,6 +37,7 @@ limitations under the License. #include "tensorflow/core/lib/strings/str_util.h" #include "tensorflow/core/platform/env.h" #include "tensorflow/core/platform/protobuf.h" +#include "tensorflow/core/profiler/rpc/profiler_service_impl.h" #include "tensorflow/core/protobuf/config.pb.h" #include "tensorflow_serving/config/model_server_config.pb.h" #include "tensorflow_serving/config/monitoring_config.pb.h" @@ -319,6 +320,9 @@ Status Server::BuildAndStart(const Options& server_options) { server_options.enforce_session_run_timeout; prediction_service_ = absl::make_unique(predict_server_options); + + profiler_service_ = tensorflow::CreateProfilerService(); + ::grpc::ServerBuilder builder; builder.AddListeningPort( server_address, @@ -332,6 +336,7 @@ Status Server::BuildAndStart(const Options& server_options) { } builder.RegisterService(model_service_.get()); builder.RegisterService(prediction_service_.get()); + builder.RegisterService(profiler_service_.get()); builder.SetMaxMessageSize(tensorflow::kint32max); const std::vector channel_arguments = parseGrpcChannelArgs(server_options.grpc_channel_arguments); diff --git a/tensorflow_serving/model_servers/server.h b/tensorflow_serving/model_servers/server.h index 7738f290f82..6a71265f0c5 100644 --- a/tensorflow_serving/model_servers/server.h +++ b/tensorflow_serving/model_servers/server.h @@ -23,6 +23,7 @@ limitations under the License. #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/platform/cpu_info.h" #include "tensorflow/core/platform/types.h" +#include "tensorflow/core/profiler/rpc/profiler_service_impl.h" #include "tensorflow_serving/model_servers/http_server.h" #include "tensorflow_serving/model_servers/model_service_impl.h" #include "tensorflow_serving/model_servers/prediction_service_impl.h" @@ -107,6 +108,7 @@ class Server { std::unique_ptr server_core_; std::unique_ptr model_service_; std::unique_ptr prediction_service_; + std::unique_ptr profiler_service_; std::unique_ptr<::grpc::Server> grpc_server_; std::unique_ptr http_server_; // A thread that calls PollFilesystemAndReloadConfig() periodically if diff --git a/tensorflow_serving/model_servers/tensorflow_model_server_test.py b/tensorflow_serving/model_servers/tensorflow_model_server_test.py index b05590465e5..82225ce94dd 100644 --- a/tensorflow_serving/model_servers/tensorflow_model_server_test.py +++ b/tensorflow_serving/model_servers/tensorflow_model_server_test.py @@ -30,6 +30,7 @@ from six.moves import range import tensorflow as tf +from tensorflow.python import pywrap_tensorflow from tensorflow.python.platform import flags from tensorflow.python.saved_model import signature_constants from tensorflow_serving.apis import classification_pb2 @@ -667,6 +668,50 @@ def test_distrat_sequential_keras_saved_model_save(self): expected_output=2.0, expected_version=expected_version) + def test_profiler_service_with_valid_trace_request(self): + """Test integration with profiler service by sending tracing requests.""" + + # Start model server + model_path = self._GetSavedModelBundlePath() + _, grpc_addr, rest_addr = TensorflowModelServerTest.RunServer( + 'default', model_path) + + # Prepare predict request + url = 'http://{}/v1/models/default:predict'.format(rest_addr) + json_req = '{"instances": [2.0, 3.0, 4.0]}' + + # In a subprocess, send a REST predict request every second for 3 seconds + exec_command = ("wget {} --content-on-error=on -O- --post-data '{}' " + "--header='Content-Type:application/json'").format( + url, json_req) + repeat_command = 'for n in {{1..3}}; do {} & sleep 1; done;'.format( + exec_command) + proc = subprocess.Popen( + repeat_command, + shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + + # Prepare args to ProfilerClient + logdir = os.path.join(self.temp_dir, 'logs') + worker_list = '' + include_dataset_ops = True + duration_ms = 1000 + num_tracing_attempts = 3 + os.makedirs(logdir) + + # Send a tracing request + trace_status = pywrap_tensorflow.TFE_ProfilerClientStartTracing( + grpc_addr, logdir, worker_list, include_dataset_ops, duration_ms, + num_tracing_attempts) + + # Log stdout & stderr of subprocess issuing predict requests for debugging + out, err = proc.communicate() + print("stdout: '{}' | stderr: '{}'".format(out, err)) + + # Validate the tracing request succeeded (OK status) + self.assertTrue(trace_status) + if __name__ == '__main__': tf.enable_eager_execution() From 3c7879016b8f8c86c6712b2ce5c66e13e2c0a7cf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Nov 2019 18:02:37 -0800 Subject: [PATCH 3582/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/61807c4a-79a3-4448-8fbe-86b786ef2eff PiperOrigin-RevId: 281874084 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 34564ad506a..68cf67d9f89 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c44f45acac6008eff3df42f28be86caa726c0531d1eb9149922f7e7895196d42", - git_commit = "63baa531022740e8fb759b4e4b4446b69cca5b17", + sha256 = "f991263c84e21321e5329c47b0976a548542af5dd8382dcf84e1b7e5a522be33", + git_commit = "aee43406353af272d75940c17a0bf49aba066159", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b18094a437cdaa3abcdb4a932f7a69db93b2f7a3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Nov 2019 00:02:36 -0800 Subject: [PATCH 3583/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f5a0b578-60a1-4968-b999-722a69a6e6c3 PiperOrigin-RevId: 281913522 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 68cf67d9f89..b8872a0b2b3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f991263c84e21321e5329c47b0976a548542af5dd8382dcf84e1b7e5a522be33", - git_commit = "aee43406353af272d75940c17a0bf49aba066159", + sha256 = "bdbe31d6de69964e364612de466b4624b292788988f95c5d27dabdc339fe50f1", + git_commit = "597a30bc61134ee1deec0b439b3649f346f1f119", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e24571ac9ce390733f3b02188c7d740f08fff62d Mon Sep 17 00:00:00 2001 From: Dero Gharibian Date: Fri, 22 Nov 2019 09:37:21 -0800 Subject: [PATCH 3584/8103] Migrate from std::string to tensorflow::tstring. Note that during the transition period tstring is typedef'ed to std::string. See: https://github.com/tensorflow/community/pull/91 PiperOrigin-RevId: 281985097 --- tensorflow_serving/servables/tensorflow/classifier.cc | 6 ++++-- .../servables/tensorflow/classifier_test.cc | 6 +++--- tensorflow_serving/servables/tensorflow/regressor_test.cc | 4 ++-- .../servables/tensorflow/saved_model_warmup.cc | 4 ++-- tensorflow_serving/servables/tensorflow/util.cc | 4 ++-- tensorflow_serving/servables/tensorflow/util_test.cc | 8 ++++---- 6 files changed, 17 insertions(+), 15 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/classifier.cc b/tensorflow_serving/servables/tensorflow/classifier.cc index ae65699441c..99b0afdf379 100644 --- a/tensorflow_serving/servables/tensorflow/classifier.cc +++ b/tensorflow_serving/servables/tensorflow/classifier.cc @@ -136,7 +136,8 @@ class TensorFlowClassifier : public ClassifierInterface { for (int c = 0; c < num_classes; ++c) { serving::Class* cl = classifications->add_classes(); if (classes) { - cl->set_label((classes->matrix())(i, c)); + const tstring& class_tstr = (classes->matrix())(i, c); + cl->set_label(class_tstr.data(), class_tstr.size()); } if (scores) { cl->set_score((scores->matrix())(i, c)); @@ -435,7 +436,8 @@ Status PostProcessClassificationResult( for (int c = 0; c < num_classes; ++c) { serving::Class* cl = classifications->add_classes(); if (classes) { - cl->set_label((classes->matrix())(i, c)); + const tstring& class_tstr = (classes->matrix())(i, c); + cl->set_label(class_tstr.data(), class_tstr.size()); } if (scores) { cl->set_score((scores->matrix())(i, c)); diff --git a/tensorflow_serving/servables/tensorflow/classifier_test.cc b/tensorflow_serving/servables/tensorflow/classifier_test.cc index 1e29c02c9c7..5e16273f5e6 100644 --- a/tensorflow_serving/servables/tensorflow/classifier_test.cc +++ b/tensorflow_serving/servables/tensorflow/classifier_test.cc @@ -136,10 +136,10 @@ class FakeSession : public tensorflow::Session { std::vector* examples) { examples->clear(); const int batch_size = input.dim_size(0); - const auto& flat_input = input.flat(); + const auto& flat_input = input.flat(); for (int i = 0; i < batch_size; ++i) { Example example; - if (!example.ParseFromString(flat_input(i))) { + if (!example.ParseFromArray(flat_input(i).data(), flat_input(i).size())) { return errors::Internal("failed to parse example"); } examples->push_back(example); @@ -187,7 +187,7 @@ class FakeSession : public tensorflow::Session { const int num_classes = FeatureSize(GetFeature(examples[0], kClassFeature)); *classes = Tensor(DT_STRING, TensorShape({batch_size, num_classes})); *scores = Tensor(DT_FLOAT, TensorShape({batch_size, num_classes})); - auto classes_matrix = classes->matrix(); + auto classes_matrix = classes->matrix(); auto scores_matrix = scores->matrix(); for (int i = 0; i < batch_size; ++i) { diff --git a/tensorflow_serving/servables/tensorflow/regressor_test.cc b/tensorflow_serving/servables/tensorflow/regressor_test.cc index c1fc991a7cd..bb42521f01c 100644 --- a/tensorflow_serving/servables/tensorflow/regressor_test.cc +++ b/tensorflow_serving/servables/tensorflow/regressor_test.cc @@ -116,10 +116,10 @@ class FakeSession : public tensorflow::Session { std::vector* examples) { examples->clear(); const int batch_size = input.dim_size(0); - const auto& flat_input = input.flat(); + const auto& flat_input = input.flat(); for (int i = 0; i < batch_size; ++i) { Example example; - if (!example.ParseFromString(flat_input(i))) { + if (!example.ParseFromArray(flat_input(i).data(), flat_input(i).size())) { return errors::Internal("failed to parse example"); } examples->push_back(example); diff --git a/tensorflow_serving/servables/tensorflow/saved_model_warmup.cc b/tensorflow_serving/servables/tensorflow/saved_model_warmup.cc index eb53b322962..e2d7eb6a3e1 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_warmup.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_warmup.cc @@ -125,11 +125,11 @@ Status RunSavedModelWarmup(const ModelWarmupOptions& model_warmup_options, tf_record_file_reader.reset( new tensorflow::io::SequentialRecordReader(tf_record_file.get())); int num_warmup_records = 0; - string record; + tstring record; Status status = tf_record_file_reader->ReadRecord(&record); tensorflow::serving::PredictionLog prediction_log; while (status.ok()) { - if (!prediction_log.ParseFromString(record)) { + if (!prediction_log.ParseFromArray(record.data(), record.size())) { return errors::InvalidArgument(strings::StrCat( "Failed to parse warmup record: ", record, " from ", warmup_path)); } diff --git a/tensorflow_serving/servables/tensorflow/util.cc b/tensorflow_serving/servables/tensorflow/util.cc index 239a06ead60..d728c8d7a19 100644 --- a/tensorflow_serving/servables/tensorflow/util.cc +++ b/tensorflow_serving/servables/tensorflow/util.cc @@ -88,7 +88,7 @@ Status InputToSerializedExampleTensor(const Input& input, Tensor* examples) { break; case Input::KindCase::kExampleList: { - auto input_vec = examples->vec(); + auto input_vec = examples->vec(); int input_vec_index = 0; for (const auto& entry : serialized_input.example_list().examples()) { input_vec(input_vec_index++) = entry; @@ -99,7 +99,7 @@ Status InputToSerializedExampleTensor(const Input& input, Tensor* examples) { case Input::KindCase::kExampleListWithContext: { const string& context = serialized_input.example_list_with_context().context(); - auto input_vec = examples->vec(); + auto input_vec = examples->vec(); int input_vec_index = 0; for (const auto& entry : serialized_input.example_list_with_context().examples()) { diff --git a/tensorflow_serving/servables/tensorflow/util_test.cc b/tensorflow_serving/servables/tensorflow/util_test.cc index 076cb7754e5..9b683b4b6a0 100644 --- a/tensorflow_serving/servables/tensorflow/util_test.cc +++ b/tensorflow_serving/servables/tensorflow/util_test.cc @@ -94,7 +94,7 @@ TEST_F(InputUtilTest, ExampleList) { TF_ASSERT_OK(InputToSerializedExampleTensor(input_, &tensor_)); EXPECT_EQ(2, tensor_.NumElements()); - const auto vec = tensor_.flat(); + const auto vec = tensor_.flat(); ASSERT_EQ(vec.size(), 2); Example serialized_example; ASSERT_TRUE(serialized_example.ParseFromString(vec(0))); @@ -112,7 +112,7 @@ TEST_F(InputUtilTest, ExampleListWithContext) { TF_ASSERT_OK(InputToSerializedExampleTensor(input_, &tensor_)); EXPECT_EQ(2, tensor_.NumElements()); - const auto vec = tensor_.flat(); + const auto vec = tensor_.flat(); ASSERT_EQ(vec.size(), 2); { Example serialized_example; @@ -142,7 +142,7 @@ TEST_F(InputUtilTest, ExampleListWithOverridingContext) { TF_ASSERT_OK(InputToSerializedExampleTensor(input_, &tensor_)); EXPECT_EQ(2, tensor_.NumElements()); - const auto vec = tensor_.flat(); + const auto vec = tensor_.flat(); ASSERT_EQ(vec.size(), 2); { Example serialized_example; @@ -168,7 +168,7 @@ TEST_F(InputUtilTest, ExampleListWithContext_NoContext) { TF_ASSERT_OK(InputToSerializedExampleTensor(input_, &tensor_)); EXPECT_EQ(2, tensor_.NumElements()); - const auto vec = tensor_.flat(); + const auto vec = tensor_.flat(); ASSERT_EQ(vec.size(), 2); { Example serialized_example; From 37445c0b2ebc3be405a9eb05421164ee7a98e34a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Nov 2019 18:02:21 -0800 Subject: [PATCH 3585/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/92782c5c-120a-441c-a1e1-26aaeff946ff PiperOrigin-RevId: 282077761 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b8872a0b2b3..1fb7abee264 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bdbe31d6de69964e364612de466b4624b292788988f95c5d27dabdc339fe50f1", - git_commit = "597a30bc61134ee1deec0b439b3649f346f1f119", + sha256 = "eef3066547190c6901e4b91206286daf01d9c93db88b390ab3ea9415b827ce79", + git_commit = "b84b607c4b2ba68d61e17bc4f404bd6d8aa6ec9a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 282b29ee549c228850176a006f48fc907256868c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 23 Nov 2019 00:02:28 -0800 Subject: [PATCH 3586/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/854c663a-dc7a-4862-b7f3-5b24a804b3c0 PiperOrigin-RevId: 282107635 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1fb7abee264..ad44955fee9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eef3066547190c6901e4b91206286daf01d9c93db88b390ab3ea9415b827ce79", - git_commit = "b84b607c4b2ba68d61e17bc4f404bd6d8aa6ec9a", + sha256 = "1cf27bbca07195bcec18fc4cabe2ac9ae72fdda5f56fe61f14996b044d2d8889", + git_commit = "29e6eafad33725f3c1b8f0dae54c702df804e03d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 09cec537ce8f0a950f7f0b7d2d3efa2c5b083be4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 23 Nov 2019 06:02:23 -0800 Subject: [PATCH 3587/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ca628cd1-eb1c-40dd-9dde-d79aed39f9c3 PiperOrigin-RevId: 282132121 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ad44955fee9..281aeff0991 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1cf27bbca07195bcec18fc4cabe2ac9ae72fdda5f56fe61f14996b044d2d8889", - git_commit = "29e6eafad33725f3c1b8f0dae54c702df804e03d", + sha256 = "a1f1c8e8e3347ee877a8b5ffa42c2e4937adc914a4ae696e6e93fff6e9a9f128", + git_commit = "69c5e0f5387a477f8f6083ae8e70ce8923bd880a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c34dca6cfe1e036c4e7900c9e9cc341ea5ef5c07 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 23 Nov 2019 12:02:26 -0800 Subject: [PATCH 3588/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7befe256-24f3-4c40-a888-dff9dd18a596 PiperOrigin-RevId: 282153421 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 281aeff0991..05ef4b96804 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a1f1c8e8e3347ee877a8b5ffa42c2e4937adc914a4ae696e6e93fff6e9a9f128", - git_commit = "69c5e0f5387a477f8f6083ae8e70ce8923bd880a", + sha256 = "412ef0824d5dcfe6e139e1fa25f72569e699b3ec06d374c0e19ba0bf60c32952", + git_commit = "883b5becaced22f7dd9e3c23d9d259f55e087cb5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 958812bbb558fecc0b3e61e4ac469a600c2854d4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 23 Nov 2019 18:02:10 -0800 Subject: [PATCH 3589/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/98125a3b-dd73-48c9-9121-bd4788114ff8 PiperOrigin-RevId: 282175326 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 05ef4b96804..77119d06e5c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "412ef0824d5dcfe6e139e1fa25f72569e699b3ec06d374c0e19ba0bf60c32952", - git_commit = "883b5becaced22f7dd9e3c23d9d259f55e087cb5", + sha256 = "203ac9d6114057245baafeba64837e50c5475a88016b4031edf47bd922be1e1a", + git_commit = "e8f7d9539b23193297737d1a1c6351270a40795f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f58d442148afcdc6c092e70ed805ccd96d2f6e97 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 24 Nov 2019 00:02:43 -0800 Subject: [PATCH 3590/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1be41e80-5f04-4c68-b64c-6947d9a9ca9e PiperOrigin-RevId: 282197363 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 77119d06e5c..06500a01f79 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "203ac9d6114057245baafeba64837e50c5475a88016b4031edf47bd922be1e1a", - git_commit = "e8f7d9539b23193297737d1a1c6351270a40795f", + sha256 = "c78ce580ddf2f8345e4b24abe6f04befb9550ba811eec7986469c124a9101fb3", + git_commit = "d0d7ddb5464d347dc83184cd986ed8b77aa6becc", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 843b81cbbff41d085c13f32fd5672b2af64fd5e6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 24 Nov 2019 06:02:38 -0800 Subject: [PATCH 3591/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6b18897d-79b2-4833-b182-f64583bce05d PiperOrigin-RevId: 282221290 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 06500a01f79..c41ad1cce04 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c78ce580ddf2f8345e4b24abe6f04befb9550ba811eec7986469c124a9101fb3", - git_commit = "d0d7ddb5464d347dc83184cd986ed8b77aa6becc", + sha256 = "f2b695769360b0d964d649957d586bab993b5edf8b77b7ad6254bceadcc36d4d", + git_commit = "559873e877559aa896cff5a8893a315559e80f10", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 88a26d7a6b582436a267c377a86dafef78da6710 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 24 Nov 2019 12:02:33 -0800 Subject: [PATCH 3592/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6a9c782d-1cee-42c4-9c30-5ca90dd41c90 PiperOrigin-RevId: 282242872 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c41ad1cce04..5ccebbefce8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f2b695769360b0d964d649957d586bab993b5edf8b77b7ad6254bceadcc36d4d", - git_commit = "559873e877559aa896cff5a8893a315559e80f10", + sha256 = "3347e58cce5fde88b903b0170af1377c46e1fb1b35ac01775e89dd1ae053216b", + git_commit = "93ef77d971716636f88c39bff6a82cfad6a24000", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 864338896e0fbf6e67598e217051a3d3aa489c66 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 24 Nov 2019 18:02:17 -0800 Subject: [PATCH 3593/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/898f086b-9b6d-400a-accd-a7052becd0f1 PiperOrigin-RevId: 282266902 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5ccebbefce8..6e9d3a96132 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3347e58cce5fde88b903b0170af1377c46e1fb1b35ac01775e89dd1ae053216b", - git_commit = "93ef77d971716636f88c39bff6a82cfad6a24000", + sha256 = "0d45e4051f7ecf4b12bfdccdb30b16f0c5502358a1748091ec71bb8d4a5f5edc", + git_commit = "9d193a0b495f35d1c7af6d8d76d45d75e0d5e15c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7befb87381d947ff897586ffff3734f956c35af2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Nov 2019 00:02:34 -0800 Subject: [PATCH 3594/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8112ba31-4737-475d-ad46-531e8e2a1134 PiperOrigin-RevId: 282297124 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6e9d3a96132..a19f2ab6c09 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0d45e4051f7ecf4b12bfdccdb30b16f0c5502358a1748091ec71bb8d4a5f5edc", - git_commit = "9d193a0b495f35d1c7af6d8d76d45d75e0d5e15c", + sha256 = "47e0bb16df8b6bb13c12bf31a723fc37bf271c00b0709b9348c1286abfbd6768", + git_commit = "300229949703174abe8eb10d2e15527cbb290160", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 723d0c6060152c49d5baf5d2bcafd8e6c3023545 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Nov 2019 06:02:17 -0800 Subject: [PATCH 3595/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b3e77331-6822-4811-98b3-db58fc5019bc PiperOrigin-RevId: 282341450 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a19f2ab6c09..665763348f0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "47e0bb16df8b6bb13c12bf31a723fc37bf271c00b0709b9348c1286abfbd6768", - git_commit = "300229949703174abe8eb10d2e15527cbb290160", + sha256 = "3f64380598be4605761512e795cda9fe6bfd9221fbcd5b005504a1b678f14341", + git_commit = "0630ff6c8a923e58efbffd462b1b97415a9d5e31", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From aca47457b857b420a1c5e240b19e0b3b04bdd2ea Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Nov 2019 12:02:39 -0800 Subject: [PATCH 3596/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/18404772-c35c-41f7-84f8-2b1ac773ad12 PiperOrigin-RevId: 282405513 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 665763348f0..5c3b208cba0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3f64380598be4605761512e795cda9fe6bfd9221fbcd5b005504a1b678f14341", - git_commit = "0630ff6c8a923e58efbffd462b1b97415a9d5e31", + sha256 = "574be208f735271a729f0a5af82ae05852d5e76b47f71bf72ec17b3b8fd49441", + git_commit = "3df3748f049a9f6c433a207e30a615671a0d59d6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c2ba4793cd88ae6f1811dc96b8526e8e73cb2d57 Mon Sep 17 00:00:00 2001 From: Adam Wood Date: Mon, 25 Nov 2019 16:12:02 -0800 Subject: [PATCH 3597/8103] Delete old source and old output files for tutorials which have been previously moved. These old files were still present in the built website, causing duplicated pages. PiperOrigin-RevId: 282454522 --- tensorflow_serving/g3doc/tutorials/README.md | 3 - .../g3doc/tutorials/Serving_REST_simple.ipynb | 559 ------------------ 2 files changed, 562 deletions(-) delete mode 100644 tensorflow_serving/g3doc/tutorials/README.md delete mode 100644 tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb diff --git a/tensorflow_serving/g3doc/tutorials/README.md b/tensorflow_serving/g3doc/tutorials/README.md deleted file mode 100644 index 4ce6c94beed..00000000000 --- a/tensorflow_serving/g3doc/tutorials/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# TensorFlow Serving tutorials - -Tutorials moved to: https://github.com/tensorflow/tfx/tree/master/docs/tutorials diff --git a/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb b/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb deleted file mode 100644 index 5d4af3b3ca2..00000000000 --- a/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb +++ /dev/null @@ -1,559 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "MhoQ0WE77laV" - }, - "source": [ - "##### Copyright 2018 The TensorFlow Authors." - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "cellView": "form", - "colab": {}, - "colab_type": "code", - "id": "_ckMIh7O7s6D" - }, - "outputs": [], - "source": [ - "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", - "# you may not use this file except in compliance with the License.\n", - "# You may obtain a copy of the License at\n", - "#\n", - "# https://www.apache.org/licenses/LICENSE-2.0\n", - "#\n", - "# Unless required by applicable law or agreed to in writing, software\n", - "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", - "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", - "# See the License for the specific language governing permissions and\n", - "# limitations under the License." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "jYysdyb-CaWM" - }, - "source": [ - "# Train and serve a TensorFlow model with TensorFlow Serving" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "E6FwTNtl3S4v" - }, - "source": [ - "Warning: **This notebook is designed to be run in a Google Colab only**. It installs packages on the system and requires root access. If you want to run it in a local Jupyter notebook, please proceed with caution.\n", - "\n", - "Note: You can run this example right now in a Jupyter-style notebook, no setup required! Just click \"Run in Google Colab\"\n", - "\n", - "\u003cdiv class=\"devsite-table-wrapper\"\u003e\u003ctable class=\"tfo-notebook-buttons\" align=\"left\"\u003e\n", - "\u003ctr\u003e\u003ctd\u003e\u003ca target=\"_blank\" href=\"https://www.tensorflow.org/serving/tutorials/Serving_REST_simple\"\u003e\n", - "\u003cimg src=\"https://www.tensorflow.org/images/tf_logo_32px.png\" /\u003eView on TensorFlow.org\u003c/a\u003e\u003c/td\u003e\n", - "\u003ctd\u003e\u003ca target=\"_blank\" href=\"https://colab.research.google.com/github/tensorflow/serving/blob/master/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb\"\u003e\n", - "\u003cimg src=\"https://www.tensorflow.org/images/colab_logo_32px.png\"\u003eRun in Google Colab\u003c/a\u003e\u003c/td\u003e\n", - "\u003ctd\u003e\u003ca target=\"_blank\" href=\"https://github.com/tensorflow/serving/tree/master/tensorflow_serving/g3doc/tutorials/Serving_REST_simple.ipynb\"\u003e\n", - "\u003cimg width=32px src=\"https://www.tensorflow.org/images/GitHub-Mark-32px.png\"\u003eView source on GitHub\u003c/a\u003e\u003c/td\u003e\n", - "\u003c/tr\u003e\u003c/table\u003e\u003c/div\u003e" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "FbVhjPpzn6BM" - }, - "source": [ - "This guide trains a neural network model to classify [images of clothing, like sneakers and shirts](https://github.com/zalandoresearch/fashion-mnist), saves the trained model, and then serves it with [TensorFlow Serving](https://www.tensorflow.org/serving/). The focus is on TensorFlow Serving, rather than the modeling and training in TensorFlow, so for a complete example which focuses on the modeling and training see the [Basic Classification example](https://www.tensorflow.org/tutorials/keras/basic_classification).\n", - "\n", - "This guide uses [tf.keras](https://www.tensorflow.org/guide/keras), a high-level API to build and train models in TensorFlow." - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "dzLKpmZICaWN" - }, - "outputs": [], - "source": [ - "# TensorFlow and tf.keras\n", - "import tensorflow as tf\n", - "from tensorflow import keras\n", - "\n", - "# Helper libraries\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "import os\n", - "import subprocess\n", - "\n", - "print(tf.__version__)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "5jAk1ZXqTJqN" - }, - "source": [ - "## Create your model" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "yR0EdgrLCaWR" - }, - "source": [ - "### Import the Fashion MNIST dataset\n", - "\n", - "This guide uses the [Fashion MNIST](https://github.com/zalandoresearch/fashion-mnist) dataset which contains 70,000 grayscale images in 10 categories. The images show individual articles of clothing at low resolution (28 by 28 pixels), as seen here:\n", - "\n", - "\u003ctable\u003e\n", - " \u003ctr\u003e\u003ctd\u003e\n", - " \u003cimg src=\"https://tensorflow.org/images/fashion-mnist-sprite.png\"\n", - " alt=\"Fashion MNIST sprite\" width=\"600\"\u003e\n", - " \u003c/td\u003e\u003c/tr\u003e\n", - " \u003ctr\u003e\u003ctd align=\"center\"\u003e\n", - " \u003cb\u003eFigure 1.\u003c/b\u003e \u003ca href=\"https://github.com/zalandoresearch/fashion-mnist\"\u003eFashion-MNIST samples\u003c/a\u003e (by Zalando, MIT License).\u003cbr/\u003e\u0026nbsp;\n", - " \u003c/td\u003e\u003c/tr\u003e\n", - "\u003c/table\u003e\n", - "\n", - "Fashion MNIST is intended as a drop-in replacement for the classic [MNIST](http://yann.lecun.com/exdb/mnist/) dataset—often used as the \"Hello, World\" of machine learning programs for computer vision. You can access the Fashion MNIST directly from TensorFlow, just import and load the data.\n", - "\n", - "Note: Although these are really images, they are loaded as NumPy arrays and not binary image objects." - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "7MqDQO0KCaWS" - }, - "outputs": [], - "source": [ - "fashion_mnist = keras.datasets.fashion_mnist\n", - "(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()\n", - "\n", - "# scale the values to 0.0 to 1.0\n", - "train_images = train_images / 255.0\n", - "test_images = test_images / 255.0\n", - "\n", - "# reshape for feeding into the model\n", - "train_images = train_images.reshape(train_images.shape[0], 28, 28, 1)\n", - "test_images = test_images.reshape(test_images.shape[0], 28, 28, 1)\n", - "\n", - "class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',\n", - " 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']\n", - "\n", - "print('\\ntrain_images.shape: {}, of {}'.format(train_images.shape, train_images.dtype))\n", - "print('test_images.shape: {}, of {}'.format(test_images.shape, test_images.dtype))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "PDu7OX8Nf5PY" - }, - "source": [ - "### Train and evaluate your model\n", - "\n", - "Let's use the simplest possible CNN, since we're not focused on the modeling part." - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "LTNN0ANGgA36" - }, - "outputs": [], - "source": [ - "model = keras.Sequential([\n", - " keras.layers.Conv2D(input_shape=(28,28,1), filters=8, kernel_size=3, \n", - " strides=2, activation='relu', name='Conv1'),\n", - " keras.layers.Flatten(),\n", - " keras.layers.Dense(10, activation=tf.nn.softmax, name='Softmax')\n", - "])\n", - "model.summary()\n", - "\n", - "testing = False\n", - "epochs = 5\n", - "\n", - "model.compile(optimizer=tf.train.AdamOptimizer(), \n", - " loss='sparse_categorical_crossentropy',\n", - " metrics=['accuracy'])\n", - "model.fit(train_images, train_labels, epochs=epochs)\n", - "\n", - "test_loss, test_acc = model.evaluate(test_images, test_labels)\n", - "print('\\nTest accuracy: {}'.format(test_acc))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "AwGPItyphqXT" - }, - "source": [ - "## Save your model\n", - "\n", - "To load our trained model into TensorFlow Serving we first need to save it in [SavedModel](https://www.tensorflow.org/api_docs/python/tf/saved_model) format. This will create a protobuf file in a well-defined directory hierarchy, and will include a version number. TensorFlow Serving allows us to select [which version of a model, or \"servable\"](../overview) we want to use when we make inference requests. Each version will be exported to a different sub-directory under the given path." - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "0w5Rq8SsgWE6" - }, - "outputs": [], - "source": [ - "# Fetch the Keras session and save the model\n", - "# The signature definition is defined by the input and output tensors,\n", - "# and stored with the default serving key\n", - "import tempfile\n", - "\n", - "MODEL_DIR = tempfile.gettempdir()\n", - "version = 1\n", - "export_path = os.path.join(MODEL_DIR, str(version))\n", - "print('export_path = {}\\n'.format(export_path))\n", - "if os.path.isdir(export_path):\n", - " print('\\nAlready saved a model, cleaning up\\n')\n", - " !rm -r {export_path}\n", - "\n", - "tf.saved_model.simple_save(\n", - " keras.backend.get_session(),\n", - " export_path,\n", - " inputs={'input_image': model.input},\n", - " outputs={t.name:t for t in model.outputs})\n", - "\n", - "print('\\nSaved model:')\n", - "!ls -l {export_path}" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "FM7B_RuDYoIj" - }, - "source": [ - "## Examine your saved model\n", - "\n", - "We'll use the command line utility `saved_model_cli` to look at the [MetaGraphDefs](https://www.tensorflow.org/api_docs/python/tf/MetaGraphDef) (the models) and [SignatureDefs](../signature_defs) (the methods you can call) in our SavedModel. See [this discussion of the SavedModel CLI](https://www.tensorflow.org/guide/saved_model#cli_to_inspect_and_execute_savedmodel) in the TensorFlow Guide." - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "LU4GDF_aYtfQ" - }, - "outputs": [], - "source": [ - "!saved_model_cli show --dir {export_path} --all" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "lSPWuegUb7Eo" - }, - "source": [ - "That tells us a lot about our model! In this case we just trained our model, so we already know the inputs and outputs, but if we didn't this would be important information. It doesn't tell us everything, like the fact that this is grayscale image data for example, but it's a great start." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "DBgsyhytS6KD" - }, - "source": [ - "## Serve your model with TensorFlow Serving\n", - "\n", - "### Add TensorFlow Serving distribution URI as a package source:\n", - "\n", - "We're preparing to install TensorFlow Serving using [Aptitude](https://wiki.debian.org/Aptitude) since this Colab runs in a Debian environment. We'll add the `tensorflow-model-server` package to the list of packages that Aptitude knows about. Note that we're running as root.\n", - "\n", - "Note: This example is running TensorFlow Serving natively, but [you can also run it in a Docker container](https://www.tensorflow.org/tfx/serving/docker), which is one of the easiest ways to get started using TensorFlow Serving." - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "EWg9X2QHlbGS" - }, - "outputs": [], - "source": [ - "# This is the same as you would do from your command line, but without the [arch=amd64], and no sudo\n", - "# You would instead do:\n", - "# echo \"deb [arch=amd64] http://storage.googleapis.com/tensorflow-serving-apt stable tensorflow-model-server tensorflow-model-server-universal\" | sudo tee /etc/apt/sources.list.d/tensorflow-serving.list \u0026\u0026 \\\n", - "# curl https://storage.googleapis.com/tensorflow-serving-apt/tensorflow-serving.release.pub.gpg | sudo apt-key add -\n", - "\n", - "!echo \"deb http://storage.googleapis.com/tensorflow-serving-apt stable tensorflow-model-server tensorflow-model-server-universal\" | tee /etc/apt/sources.list.d/tensorflow-serving.list \u0026\u0026 \\\n", - "curl https://storage.googleapis.com/tensorflow-serving-apt/tensorflow-serving.release.pub.gpg | apt-key add -\n", - "!apt update" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "W1ZVp_VOU7Wu" - }, - "source": [ - "### Install TensorFlow Serving\n", - "\n", - "This is all you need - one command line!" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "ygwa9AgRloYy" - }, - "outputs": [], - "source": [ - "!apt-get install tensorflow-model-server" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "k5NrYdQeVm52" - }, - "source": [ - "### Start running TensorFlow Serving\n", - "\n", - "This is where we start running TensorFlow Serving and load our model. After it loads we can start making inference requests using REST. There are some important parameters:\n", - "\n", - "* `rest_api_port`: The port that you'll use for REST requests.\n", - "* `model_name`: You'll use this in the URL of REST requests. It can be anything.\n", - "* `model_base_path`: This is the path to the directory where you've saved your model.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "aUgp3vUdU5GS" - }, - "outputs": [], - "source": [ - "os.environ[\"MODEL_DIR\"] = MODEL_DIR" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "kJDhHNJVnaLN" - }, - "outputs": [], - "source": [ - "%%bash --bg \n", - "nohup tensorflow_model_server \\\n", - " --rest_api_port=8501 \\\n", - " --model_name=fashion_model \\\n", - " --model_base_path=\"${MODEL_DIR}\" \u003eserver.log 2\u003e\u00261\n" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "IxbeiOCUUs2z" - }, - "outputs": [], - "source": [ - "!tail server.log" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "vwg1JKaGXWAg" - }, - "source": [ - "## Make a request to your model in TensorFlow Serving\n", - "\n", - "First, let's take a look at a random example from our test data." - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "Luqm_Jyff9iR" - }, - "outputs": [], - "source": [ - "def show(idx, title):\n", - " plt.figure()\n", - " plt.imshow(test_images[idx].reshape(28,28))\n", - " plt.axis('off')\n", - " plt.title('\\n\\n{}'.format(title), fontdict={'size': 16})\n", - "\n", - "import random\n", - "rando = random.randint(0,len(test_images)-1)\n", - "show(rando, 'An Example Image: {}'.format(class_names[test_labels[rando]]))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "TKnEHeTrbh3L" - }, - "source": [ - "Ok, that looks interesting. How hard is that for you to recognize? Now let's create the JSON object for a batch of three inference requests, and see how well our model recognizes things:" - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "2dsD7KQG1m-R" - }, - "outputs": [], - "source": [ - "import json\n", - "data = json.dumps({\"signature_name\": \"serving_default\", \"instances\": test_images[0:3].tolist()})\n", - "print('Data: {} ... {}'.format(data[:50], data[len(data)-52:]))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "ReQd4QESIwXN" - }, - "source": [ - "### Make REST requests" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "iT3J-lHrhOYQ" - }, - "source": [ - "#### Newest version of the servable\n", - "\n", - "We'll send a predict request as a POST to our server's REST endpoint, and pass it three examples. We'll ask our server to give us the latest version of our servable by not specifying a particular version." - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "vGvFyuIzW6n6" - }, - "outputs": [], - "source": [ - "!pip install -q requests\n", - "\n", - "import requests\n", - "headers = {\"content-type\": \"application/json\"}\n", - "json_response = requests.post('http://localhost:8501/v1/models/fashion_model:predict', data=data, headers=headers)\n", - "predictions = json.loads(json_response.text)['predictions']\n", - "\n", - "show(0, 'The model thought this was a {} (class {}), and it was actually a {} (class {})'.format(\n", - " class_names[np.argmax(predictions[0])], test_labels[0], class_names[np.argmax(predictions[0])], test_labels[0]))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "YJH8LtM4XELp" - }, - "source": [ - "#### A particular version of the servable\n", - "\n", - "Now let's specify a particular version of our servable. Since we only have one, let's select version 1. We'll also look at all three results." - ] - }, - { - "cell_type": "code", - "execution_count": 0, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "zRftRxeR1tZx" - }, - "outputs": [], - "source": [ - "headers = {\"content-type\": \"application/json\"}\n", - "json_response = requests.post('http://localhost:8501/v1/models/fashion_model/versions/1:predict', data=data, headers=headers)\n", - "predictions = json.loads(json_response.text)['predictions']\n", - "\n", - "for i in range(0,3):\n", - " show(i, 'The model thought this was a {} (class {}), and it was actually a {} (class {})'.format(\n", - " class_names[np.argmax(predictions[i])], np.argmax(predictions[i]), class_names[test_labels[i]], test_labels[i]))" - ] - } - ], - "metadata": { - "accelerator": "GPU", - "colab": { - "collapsed_sections": [], - "name": "Serving_REST_simple.ipynb", - "private_outputs": true, - "provenance": [], - "toc_visible": true, - "version": "0.3.2" - }, - "kernelspec": { - "display_name": "Python 2", - "name": "python2" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} From d772279b1f8a906fb46966c6d21e3418a9783418 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Nov 2019 18:02:26 -0800 Subject: [PATCH 3598/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f9d869d8-6771-473d-8d7d-429c3fe60ba4 PiperOrigin-RevId: 282472070 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5c3b208cba0..9b9e243d46b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "574be208f735271a729f0a5af82ae05852d5e76b47f71bf72ec17b3b8fd49441", - git_commit = "3df3748f049a9f6c433a207e30a615671a0d59d6", + sha256 = "7ec24b657199f67d61f943bc99ceb8316b11396b539f153cd89d0bc6e78f9271", + git_commit = "8ed9561470652e27ec75cce819c633e2b4cbb546", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1574c41e3ac00163ef33588414b54da8e84a128f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Nov 2019 00:02:42 -0800 Subject: [PATCH 3599/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/64b634a5-2083-4488-b946-a54541c5d557 PiperOrigin-RevId: 282506902 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9b9e243d46b..2548630d272 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7ec24b657199f67d61f943bc99ceb8316b11396b539f153cd89d0bc6e78f9271", - git_commit = "8ed9561470652e27ec75cce819c633e2b4cbb546", + sha256 = "73dd22727f89d626427965bf583ada8cbdc2bd6bcfb42b9726203d61fa64b9f1", + git_commit = "843c022f27b8d9d12e3f0b6f6b5ade8836226216", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 68a49b67b6d4e25003a03dee5c4dd228b89548bc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Nov 2019 06:02:42 -0800 Subject: [PATCH 3600/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8157ad5f-1f4d-49f4-be87-4d696a694524 PiperOrigin-RevId: 282549122 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2548630d272..951c25828a8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "73dd22727f89d626427965bf583ada8cbdc2bd6bcfb42b9726203d61fa64b9f1", - git_commit = "843c022f27b8d9d12e3f0b6f6b5ade8836226216", + sha256 = "3aef75aeabc217882a23d59a412d1944cacdd975d490afb134cc94105db449c8", + git_commit = "204ed332c0886a0e0ab10b22ba8d67b97e1c83c4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From caac24aae0c0adedfa6fd42c292d4dd0d5db84dd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Nov 2019 12:02:39 -0800 Subject: [PATCH 3601/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7d738068-33c4-4f67-8186-3ea06584e2e2 PiperOrigin-RevId: 282612421 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 951c25828a8..b25ab0f9de5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3aef75aeabc217882a23d59a412d1944cacdd975d490afb134cc94105db449c8", - git_commit = "204ed332c0886a0e0ab10b22ba8d67b97e1c83c4", + sha256 = "451c3fbdafc0ce727b6cc0625cb053d37c01e9b01524cbd94d7c407b8bce0b9f", + git_commit = "4818d0d7214770b3f677d5ba00621f3aaf57de9f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 331287b67ca97cf350428d3a5342db16341ac162 Mon Sep 17 00:00:00 2001 From: Brian Atkinson Date: Tue, 26 Nov 2019 15:02:40 -0800 Subject: [PATCH 3602/8103] build_config.bzl is now directly available under platform. PiperOrigin-RevId: 282646834 --- tensorflow_serving/apis/BUILD | 2 +- tensorflow_serving/session_bundle/oss/BUILD | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/apis/BUILD b/tensorflow_serving/apis/BUILD index 80b8d5d0045..6961d07f363 100644 --- a/tensorflow_serving/apis/BUILD +++ b/tensorflow_serving/apis/BUILD @@ -21,7 +21,7 @@ filegroup( load("//tensorflow_serving:serving.bzl", "serving_proto_library") load("//tensorflow_serving:serving.bzl", "serving_proto_library_py") load("//tensorflow_serving:serving.bzl", "serving_go_grpc_library") -load("@org_tensorflow//tensorflow/core:platform/default/build_config.bzl", "tf_jspb_proto_library", "tf_pyclif_proto_library") +load("@org_tensorflow//tensorflow/core/platform:build_config.bzl", "tf_jspb_proto_library", "tf_pyclif_proto_library") serving_proto_library( name = "get_model_metadata_proto", diff --git a/tensorflow_serving/session_bundle/oss/BUILD b/tensorflow_serving/session_bundle/oss/BUILD index 5ce47e54b38..501c290e12d 100644 --- a/tensorflow_serving/session_bundle/oss/BUILD +++ b/tensorflow_serving/session_bundle/oss/BUILD @@ -1,4 +1,4 @@ -load("@org_tensorflow//tensorflow/core:platform/default/build_config.bzl", "tf_proto_library") +load("@org_tensorflow//tensorflow/core/platform:build_config.bzl", "tf_proto_library") load("//tensorflow_serving:oss_or_google.bzl", "oss_only_cc_test") licenses(["notice"]) # Apache 2.0 From d71f7ae0c7c3cd9d3a79f849ed7797480578c7d1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Nov 2019 18:03:02 -0800 Subject: [PATCH 3603/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f36f03e0-1496-487e-8e4d-9ccf2df406fd PiperOrigin-RevId: 282675350 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b25ab0f9de5..2694d68dcf4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "451c3fbdafc0ce727b6cc0625cb053d37c01e9b01524cbd94d7c407b8bce0b9f", - git_commit = "4818d0d7214770b3f677d5ba00621f3aaf57de9f", + sha256 = "02bf9497cfbaafff79fe095b8fe63d53a9116b1f392adb6ecff2766555eb5cc5", + git_commit = "0522d23e6593a15b3b25506e2f0c3dfe35ef0e29", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8f8eb740103a80033f2a4cad9a00b65a3e5e0188 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Nov 2019 00:02:36 -0800 Subject: [PATCH 3604/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/983caea2-1752-4083-bf40-33e9ed73ca2c PiperOrigin-RevId: 282711929 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2694d68dcf4..82101404e89 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "02bf9497cfbaafff79fe095b8fe63d53a9116b1f392adb6ecff2766555eb5cc5", - git_commit = "0522d23e6593a15b3b25506e2f0c3dfe35ef0e29", + sha256 = "1e5665db326236b7ac2c98c5380aa68b8ad6dbbc151971476248c44b4fe10d39", + git_commit = "89ec654827a63db0da64a723f09dd5bf0eefb936", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9f46f9b790c5e62b08c8c71678eb6cb300c32a80 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Nov 2019 06:02:44 -0800 Subject: [PATCH 3605/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/221494d4-1e1d-4f9c-8615-fe8fe7410e06 PiperOrigin-RevId: 282754159 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 82101404e89..cdd6e8538bd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1e5665db326236b7ac2c98c5380aa68b8ad6dbbc151971476248c44b4fe10d39", - git_commit = "89ec654827a63db0da64a723f09dd5bf0eefb936", + sha256 = "fa5f48b5da01f06e8e78d1a55299973c694e82419a5a55bab52d06f68cec3b9c", + git_commit = "6fa83d70b7bc4426b17b0d8911aa7a977855348f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3d258d84cc4be3307e8d996933aa5119a7db554d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Nov 2019 12:02:32 -0800 Subject: [PATCH 3606/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/68f5e401-4d9d-42b1-bcfb-9ddc85050ffb PiperOrigin-RevId: 282811379 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cdd6e8538bd..e53bc6aa118 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fa5f48b5da01f06e8e78d1a55299973c694e82419a5a55bab52d06f68cec3b9c", - git_commit = "6fa83d70b7bc4426b17b0d8911aa7a977855348f", + sha256 = "5f6e59d861cd3bfd09b157fd6673c36d7fb0cda5c47701c4aae94136c9070a2b", + git_commit = "2667b391244e8db86ca5173fec3ac10c818592f4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a4d416cd0e7da30a200ced7df0d0f8c99b79910e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Nov 2019 18:02:33 -0800 Subject: [PATCH 3607/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b0950088-9a72-46c1-b2fd-4d1abdbb9004 PiperOrigin-RevId: 282862162 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e53bc6aa118..abfc60ade77 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5f6e59d861cd3bfd09b157fd6673c36d7fb0cda5c47701c4aae94136c9070a2b", - git_commit = "2667b391244e8db86ca5173fec3ac10c818592f4", + sha256 = "5dd2b0b8edb841977e215e6ace49c3bba925e960a322c8780e844584c97e2afb", + git_commit = "a10dc733566818da48aec3cd94f2c1ee7c64bfb4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 258d27a1e2ca82404e68441261c0acf4d01fac05 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Nov 2019 00:02:34 -0800 Subject: [PATCH 3608/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/446b8cee-44d5-493e-9e46-95e797118eb1 PiperOrigin-RevId: 282892508 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index abfc60ade77..4d193819a51 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5dd2b0b8edb841977e215e6ace49c3bba925e960a322c8780e844584c97e2afb", - git_commit = "a10dc733566818da48aec3cd94f2c1ee7c64bfb4", + sha256 = "7a3d01d12e4b71e39e423afcbd093ba9b75bae76b10c99e1f9dbda1dfe05533f", + git_commit = "33877af57f9998369baee28ca5cde2d69b6f943d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ed15532ed1938a21b08ebfb68e78b50f9459e453 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Nov 2019 06:02:28 -0800 Subject: [PATCH 3609/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d2ea26fc-5520-45b3-9c9c-e33d7ab794ea PiperOrigin-RevId: 282931908 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4d193819a51..1aac5c3b9f7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7a3d01d12e4b71e39e423afcbd093ba9b75bae76b10c99e1f9dbda1dfe05533f", - git_commit = "33877af57f9998369baee28ca5cde2d69b6f943d", + sha256 = "ce9c359e27b0b684cccb0c6df409739a43eb172487664bcde7bfb16929befc93", + git_commit = "cdf4022a0ef1e8399f4103aa136690d33a8513f3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8b7bb3a9c037353f6f5318f8f8cd008b2b2b67c1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Nov 2019 12:02:47 -0800 Subject: [PATCH 3610/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/18f7303e-7b32-40f3-a723-e02b98e09a60 PiperOrigin-RevId: 282965487 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1aac5c3b9f7..e843703e608 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ce9c359e27b0b684cccb0c6df409739a43eb172487664bcde7bfb16929befc93", - git_commit = "cdf4022a0ef1e8399f4103aa136690d33a8513f3", + sha256 = "87d94adafbd0aed4204c431b5ff65c2b4a0a907885444646e9a5781725636491", + git_commit = "8c34a9bd0676453dd0bffb016969a0515b2358e6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9bd90c01dfd8081349cfd605535b141bd62d391b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Nov 2019 18:02:25 -0800 Subject: [PATCH 3611/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a8fb5002-e6b4-4294-b22f-eb2b41082400 PiperOrigin-RevId: 282989405 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e843703e608..6fe94aeee96 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "87d94adafbd0aed4204c431b5ff65c2b4a0a907885444646e9a5781725636491", - git_commit = "8c34a9bd0676453dd0bffb016969a0515b2358e6", + sha256 = "fef8a9be49401adade377a68a2a75637bad795a715c38c4f7d266ac8fb1c7542", + git_commit = "b543321f27623ebac2cc34b24a0c1d17ca1ee560", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 39ccfac310c9fd0268828be6e366358e1d8dff62 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 29 Nov 2019 06:02:30 -0800 Subject: [PATCH 3612/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ef495a2e-d241-4a70-b234-a5d894883f28 PiperOrigin-RevId: 283048909 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6fe94aeee96..7131fedd949 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fef8a9be49401adade377a68a2a75637bad795a715c38c4f7d266ac8fb1c7542", - git_commit = "b543321f27623ebac2cc34b24a0c1d17ca1ee560", + sha256 = "fe15727039b271f3fa3808ba02a74b43f84cc1a4d1e2c924afe101ff479e1144", + git_commit = "99cb9fd68d1b8c6f0857c0775c366234537bacf5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0811bfb057670d6951ec9005db01d3e1175b7539 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 29 Nov 2019 12:02:27 -0800 Subject: [PATCH 3613/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9aad329d-711b-4ee7-9814-763735faccf2 PiperOrigin-RevId: 283078774 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7131fedd949..d3893611471 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fe15727039b271f3fa3808ba02a74b43f84cc1a4d1e2c924afe101ff479e1144", - git_commit = "99cb9fd68d1b8c6f0857c0775c366234537bacf5", + sha256 = "27baccaa59f631a32879bb425832601878a644402667edad488a6a0612e6f918", + git_commit = "764a3ab93ac7425b49b9c13dc151bc9c2f2badf6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 79ff8738e60bafffc02a6bdf546e545a58e68a90 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 29 Nov 2019 18:02:32 -0800 Subject: [PATCH 3614/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1b67dbbd-f925-4024-83e5-bc680fe5ef40 PiperOrigin-RevId: 283100342 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d3893611471..85437d71309 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "27baccaa59f631a32879bb425832601878a644402667edad488a6a0612e6f918", - git_commit = "764a3ab93ac7425b49b9c13dc151bc9c2f2badf6", + sha256 = "eeb1f0c283d3a11cd362d4ed680904c90614a0d5b64d9d66659f62927382f3bb", + git_commit = "427c708efae84e491a92d27c3edcaa1b15109d83", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b9b3f6e7d391bc33fd51657ddb18ba21b3288499 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 30 Nov 2019 00:02:24 -0800 Subject: [PATCH 3615/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/eda1ce45-4d57-4408-af04-8546684fbee1 PiperOrigin-RevId: 283120253 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 85437d71309..adfa5905a5a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eeb1f0c283d3a11cd362d4ed680904c90614a0d5b64d9d66659f62927382f3bb", - git_commit = "427c708efae84e491a92d27c3edcaa1b15109d83", + sha256 = "28fe9eba63791cbad1b59573b761de9dc9a22a035c83eada59a645bce2bbfda3", + git_commit = "14a0c12dc2eb6398414df4b92d47455ac37ff4fd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ba8bc29f8c150eb412c8b4e272974f0837dabbaf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 30 Nov 2019 06:02:27 -0800 Subject: [PATCH 3616/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ef593824-04ff-432d-a83b-d13374dc2907 PiperOrigin-RevId: 283140593 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index adfa5905a5a..5486c38be9c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "28fe9eba63791cbad1b59573b761de9dc9a22a035c83eada59a645bce2bbfda3", - git_commit = "14a0c12dc2eb6398414df4b92d47455ac37ff4fd", + sha256 = "a5048289be9b1c66b0fbbf09adcb4fcce8c39604609df7d91f04eacf63563300", + git_commit = "7879c387f8a4a236cb031aa3d54252e9f14771be", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f8bee18be07d20e43fce9c41d6477dfe1da958e7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 30 Nov 2019 18:02:36 -0800 Subject: [PATCH 3617/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d7ed6e10-ea0f-4a05-bfa4-afeb00a46531 PiperOrigin-RevId: 283176139 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5486c38be9c..cdf68d2ee35 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a5048289be9b1c66b0fbbf09adcb4fcce8c39604609df7d91f04eacf63563300", - git_commit = "7879c387f8a4a236cb031aa3d54252e9f14771be", + sha256 = "7c7feb3804a4a4c8a70a7d68dc84e52895f9bd702ef8b404347aff1f37a5b60e", + git_commit = "9a691fd4967045f19bd5faeb5b694b50058b0a14", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7ff14e938081cff0a4238fad3cbfb46b2028329a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 1 Dec 2019 00:02:30 -0800 Subject: [PATCH 3618/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/59a00bdb-2e0f-43ac-a6b5-3871487fa55e PiperOrigin-RevId: 283195418 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cdf68d2ee35..e78dc56d9f3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7c7feb3804a4a4c8a70a7d68dc84e52895f9bd702ef8b404347aff1f37a5b60e", - git_commit = "9a691fd4967045f19bd5faeb5b694b50058b0a14", + sha256 = "484e336269c92310bacb29790837df1a2967e9f7e64c0bca0b9cf0df66f2b446", + git_commit = "bd754067dac90182d883f621b775d76ec7c6b87d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d3bfec27a425f7c061e17e3c7a6a0bb22ba6553b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 2 Dec 2019 00:02:45 -0800 Subject: [PATCH 3619/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c5ec4814-6f41-4a68-a317-f25335e64148 PiperOrigin-RevId: 283284319 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e78dc56d9f3..b197b3ba42f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "484e336269c92310bacb29790837df1a2967e9f7e64c0bca0b9cf0df66f2b446", - git_commit = "bd754067dac90182d883f621b775d76ec7c6b87d", + sha256 = "441cb847503ee3c369ba49f0e572b0033288ea47009bab75973a9e4032777d8f", + git_commit = "b82ab06d4b596a4aa964b2c78de3478e0cef6dd9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 386c361a89ba6b11a0007f6dfd1250f5e1542575 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 2 Dec 2019 06:02:44 -0800 Subject: [PATCH 3620/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/62de7eba-6b46-4b98-9e03-e07fa451651c PiperOrigin-RevId: 283325503 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b197b3ba42f..d0b0953cf5b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "441cb847503ee3c369ba49f0e572b0033288ea47009bab75973a9e4032777d8f", - git_commit = "b82ab06d4b596a4aa964b2c78de3478e0cef6dd9", + sha256 = "e6bfe264444cf4e1f2b6605cc6c9dce001626404c4bf1825dd2608f5db7cd49d", + git_commit = "456e027373d553ad10c15ceaeee1eb78041b79dc", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 47841ba9bc72e2b9535e33a2817f91ea8e5d56e5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 2 Dec 2019 12:02:28 -0800 Subject: [PATCH 3621/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/124e8123-02a6-4c71-9dbe-6d94a2ec51f8 PiperOrigin-RevId: 283387460 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d0b0953cf5b..1af8acb78d0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e6bfe264444cf4e1f2b6605cc6c9dce001626404c4bf1825dd2608f5db7cd49d", - git_commit = "456e027373d553ad10c15ceaeee1eb78041b79dc", + sha256 = "e69395240d3050a1f4e3e9c8c179bd4ad5f8745ceb2e1b63a828300f1216daf7", + git_commit = "305fec9fddc3bdb5bb574a134b955bf4b07fd795", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 26324b684db58d327b10339d458398505a241197 Mon Sep 17 00:00:00 2001 From: Mingming Liu Date: Mon, 2 Dec 2019 14:00:21 -0800 Subject: [PATCH 3622/8103] Internal change. PiperOrigin-RevId: 283412180 --- tensorflow_serving/servables/tensorflow/util.cc | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tensorflow_serving/servables/tensorflow/util.cc b/tensorflow_serving/servables/tensorflow/util.cc index d728c8d7a19..968e11877a5 100644 --- a/tensorflow_serving/servables/tensorflow/util.cc +++ b/tensorflow_serving/servables/tensorflow/util.cc @@ -73,6 +73,17 @@ void RecordRequestExampleCount(const string& model_name, size_t count) { } Status InputToSerializedExampleTensor(const Input& input, Tensor* examples) { + // There's a reason we serialize and then parse 'input' in this way: + // 'example_list' and 'example_list_with_context' are lazily parsed + // fields, which means they are lazily deserialized the very first + // time they are accessed. So if we access them here for counting the + // num_examples, then we'll pay a heavy cost of deserialization. + // + // SerializedInput proto has been created to prevent this, but at the same + // time get the count of num_examples as well. + // + // Benchmark ('BM_InputToSerializedExample') can help measure the effect of + // changes in the future. const string serialized_input_str = input.SerializeAsString(); internal::SerializedInput serialized_input; if (!serialized_input.ParseFromString(serialized_input_str)) { From db334a81cb014a91b647a9576d6c84e224d1670c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 2 Dec 2019 18:02:40 -0800 Subject: [PATCH 3623/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0d9ee4bf-9bd9-4559-ae9b-73007c35a21e PiperOrigin-RevId: 283456916 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1af8acb78d0..e8c09a09dc4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -10,8 +10,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e69395240d3050a1f4e3e9c8c179bd4ad5f8745ceb2e1b63a828300f1216daf7", - git_commit = "305fec9fddc3bdb5bb574a134b955bf4b07fd795", + sha256 = "abceedf2f627e83a5d4324d158e2f2b731f0b747f041407a28ff6ba1634dc583", + git_commit = "2a2c812ab2330c9aac33335f10679a346436acfb", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d044f1e632a80bafa0de2797ee813c68361ec9b7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 3 Dec 2019 21:56:40 -0800 Subject: [PATCH 3624/8103] Internal changes. PiperOrigin-RevId: 283686528 --- tensorflow_serving/example/mnist_client.py | 3 ++- tensorflow_serving/example/mnist_saved_model.py | 3 ++- tensorflow_serving/example/resnet_client_grpc.py | 3 ++- tensorflow_serving/example/resnet_warmup.py | 3 ++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/tensorflow_serving/example/mnist_client.py b/tensorflow_serving/example/mnist_client.py index 592969d6552..1972dca2344 100644 --- a/tensorflow_serving/example/mnist_client.py +++ b/tensorflow_serving/example/mnist_client.py @@ -35,6 +35,7 @@ import grpc import numpy import tensorflow as tf +from tensorflow.contrib import util as contrib_util from tensorflow_serving.apis import predict_pb2 from tensorflow_serving.apis import prediction_service_pb2_grpc @@ -146,7 +147,7 @@ def do_inference(hostport, work_dir, concurrency, num_tests): request.model_spec.signature_name = 'predict_images' image, label = test_data_set.next_batch(1) request.inputs['images'].CopyFrom( - tf.contrib.util.make_tensor_proto(image[0], shape=[1, image[0].size])) + contrib_util.make_tensor_proto(image[0], shape=[1, image[0].size])) result_counter.throttle() result_future = stub.Predict.future(request, 5.0) # 5 seconds result_future.add_done_callback( diff --git a/tensorflow_serving/example/mnist_saved_model.py b/tensorflow_serving/example/mnist_saved_model.py index c554f55a0e3..7d2028f3c4d 100644 --- a/tensorflow_serving/example/mnist_saved_model.py +++ b/tensorflow_serving/example/mnist_saved_model.py @@ -33,6 +33,7 @@ # This is a placeholder for a Google-internal import. import tensorflow as tf +from tensorflow.contrib import lookup as contrib_lookup import mnist_input_data @@ -71,7 +72,7 @@ def main(_): cross_entropy = -tf.reduce_sum(y_ * tf.log(y)) train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy) values, indices = tf.nn.top_k(y, 10) - table = tf.contrib.lookup.index_to_string_table_from_tensor( + table = contrib_lookup.index_to_string_table_from_tensor( tf.constant([str(i) for i in range(10)])) prediction_classes = table.lookup(tf.to_int64(indices)) for _ in range(FLAGS.training_iteration): diff --git a/tensorflow_serving/example/resnet_client_grpc.py b/tensorflow_serving/example/resnet_client_grpc.py index df580fa460c..81545f7d078 100644 --- a/tensorflow_serving/example/resnet_client_grpc.py +++ b/tensorflow_serving/example/resnet_client_grpc.py @@ -23,6 +23,7 @@ import grpc import requests import tensorflow as tf +from tensorflow.contrib import util as contrib_util from tensorflow_serving.apis import predict_pb2 from tensorflow_serving.apis import prediction_service_pb2_grpc @@ -54,7 +55,7 @@ def main(_): request.model_spec.name = 'resnet' request.model_spec.signature_name = 'serving_default' request.inputs['image_bytes'].CopyFrom( - tf.contrib.util.make_tensor_proto(data, shape=[1])) + contrib_util.make_tensor_proto(data, shape=[1])) result = stub.Predict(request, 10.0) # 10 secs timeout print(result) diff --git a/tensorflow_serving/example/resnet_warmup.py b/tensorflow_serving/example/resnet_warmup.py index 9aed34da47f..8a8159a0460 100644 --- a/tensorflow_serving/example/resnet_warmup.py +++ b/tensorflow_serving/example/resnet_warmup.py @@ -37,6 +37,7 @@ import sys import requests import tensorflow as tf +from tensorflow.contrib import util as contrib_util from tensorflow_serving.apis import predict_pb2 from tensorflow_serving.apis import prediction_log_pb2 @@ -78,7 +79,7 @@ def main(): request.model_spec.name = 'resnet' request.model_spec.signature_name = 'serving_default' request.inputs['image_bytes'].CopyFrom( - tf.contrib.util.make_tensor_proto(data, shape=[1])) + contrib_util.make_tensor_proto(data, shape=[1])) log = prediction_log_pb2.PredictionLog( predict_log=prediction_log_pb2.PredictLog(request=request)) From 90cb1c0215c7b8d851b92b644f12ded3db494941 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 4 Dec 2019 16:39:06 -0800 Subject: [PATCH 3625/8103] Explicitly export files needed by other packages PiperOrigin-RevId: 283864468 --- tensorflow_serving/servables/tensorflow/testdata/BUILD | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tensorflow_serving/servables/tensorflow/testdata/BUILD b/tensorflow_serving/servables/tensorflow/testdata/BUILD index 4d0ef390404..21c02026156 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/BUILD +++ b/tensorflow_serving/servables/tensorflow/testdata/BUILD @@ -12,6 +12,14 @@ package( licenses(["notice"]) # Apache 2.0 +exports_files( + [ + "half_plus_two_model_metadata.json", + "saved_model_half_plus_two_2_versions_metadata.json", + ], + visibility = ["//tensorflow_serving:internal"], +) + filegroup( name = "all_files", srcs = glob( From 12c0f496229033a1e3467ca08fe3e59e867c729c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 4 Dec 2019 23:12:35 -0800 Subject: [PATCH 3626/8103] internal BUILD file cleanup. PiperOrigin-RevId: 283911755 --- tensorflow_serving/apis/BUILD | 14 +- tensorflow_serving/core/BUILD | 38 ++--- tensorflow_serving/core/test_util/BUILD | 8 +- tensorflow_serving/example/BUILD | 2 +- tensorflow_serving/model_servers/BUILD | 78 ++++----- .../model_servers/test_util/BUILD | 19 +-- tensorflow_serving/resources/BUILD | 8 +- tensorflow_serving/servables/hashmap/BUILD | 8 +- tensorflow_serving/servables/tensorflow/BUILD | 157 +++++++++--------- tensorflow_serving/serving.bzl | 9 + tensorflow_serving/sources/storage_path/BUILD | 12 +- tensorflow_serving/util/BUILD | 22 +-- 12 files changed, 191 insertions(+), 184 deletions(-) diff --git a/tensorflow_serving/apis/BUILD b/tensorflow_serving/apis/BUILD index 6961d07f363..f3eeeaaead7 100644 --- a/tensorflow_serving/apis/BUILD +++ b/tensorflow_serving/apis/BUILD @@ -1,5 +1,10 @@ # Description: Tensorflow Serving APIs. +load("//tensorflow_serving:serving.bzl", "serving_proto_library") +load("//tensorflow_serving:serving.bzl", "serving_proto_library_py") +load("//tensorflow_serving:serving.bzl", "serving_go_grpc_library") +load("@org_tensorflow//tensorflow/core/platform:build_config.bzl", "tf_jspb_proto_library", "tf_pyclif_proto_library") + package( default_visibility = ["//visibility:public"], features = ["-layering_check"], @@ -18,11 +23,6 @@ filegroup( ), ) -load("//tensorflow_serving:serving.bzl", "serving_proto_library") -load("//tensorflow_serving:serving.bzl", "serving_proto_library_py") -load("//tensorflow_serving:serving.bzl", "serving_go_grpc_library") -load("@org_tensorflow//tensorflow/core/platform:build_config.bzl", "tf_jspb_proto_library", "tf_pyclif_proto_library") - serving_proto_library( name = "get_model_metadata_proto", srcs = ["get_model_metadata.proto"], @@ -392,7 +392,7 @@ cc_library( name = "classifier", hdrs = ["classifier.h"], deps = [ - ":classification_proto", + ":classification_cc_proto", "@org_tensorflow//tensorflow/core:lib", ], ) @@ -401,7 +401,7 @@ cc_library( name = "regressor", hdrs = ["regressor.h"], deps = [ - ":regression_proto", + ":regression_cc_proto", "@org_tensorflow//tensorflow/core:lib", ], ) diff --git a/tensorflow_serving/core/BUILD b/tensorflow_serving/core/BUILD index 4223ee8d602..c155c3d4378 100644 --- a/tensorflow_serving/core/BUILD +++ b/tensorflow_serving/core/BUILD @@ -1,5 +1,8 @@ # Description: Tensorflow Serving core. +load("//tensorflow_serving:serving.bzl", "serving_proto_library") +load("//tensorflow_serving:serving.bzl", "serving_proto_library_py") + package( default_visibility = [ "//tensorflow_serving:internal", @@ -72,7 +75,7 @@ cc_library( ], deps = [ ":source", - "//tensorflow_serving/resources:resources_proto", + "//tensorflow_serving/resources:resources_cc_proto", "//tensorflow_serving/util:any_ptr", "@org_tensorflow//tensorflow/core:lib", ], @@ -718,7 +721,7 @@ cc_library( "//visibility:public", ], deps = [ - "//tensorflow_serving/config:log_collector_config_proto", + "//tensorflow_serving/config:log_collector_config_cc_proto", "@org_tensorflow//tensorflow/core:lib", ], ) @@ -732,9 +735,6 @@ cc_test( ], ) -load("//tensorflow_serving:serving.bzl", "serving_proto_library") -load("//tensorflow_serving:serving.bzl", "serving_proto_library_py") - serving_proto_library( name = "logging_proto", srcs = ["logging.proto"], @@ -770,8 +770,8 @@ cc_library( ], deps = [ ":log_collector", - ":logging_proto", - "//tensorflow_serving/config:logging_config_proto", + ":logging_cc_proto", + "//tensorflow_serving/config:logging_config_cc_proto", "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/core:lib", ], @@ -783,11 +783,11 @@ cc_test( srcs = ["request_logger_test.cc"], deps = [ ":log_collector", - ":logging_proto", + ":logging_cc_proto", ":request_logger", - "//tensorflow_serving/apis:model_proto", - "//tensorflow_serving/apis:predict_proto", - "//tensorflow_serving/config:logging_config_proto", + "//tensorflow_serving/apis:model_cc_proto", + "//tensorflow_serving/apis:predict_cc_proto", + "//tensorflow_serving/config:logging_config_cc_proto", "//tensorflow_serving/core/test_util:mock_log_collector", "//tensorflow_serving/core/test_util:mock_request_logger", "//tensorflow_serving/core/test_util:test_main", @@ -807,9 +807,9 @@ cc_library( ], deps = [ ":request_logger", - "//tensorflow_serving/apis:model_proto", - "//tensorflow_serving/config:logging_config_proto", - "//tensorflow_serving/core:logging_proto", + "//tensorflow_serving/apis:model_cc_proto", + "//tensorflow_serving/config:logging_config_cc_proto", + "//tensorflow_serving/core:logging_cc_proto", "//tensorflow_serving/util:fast_read_dynamic_ptr", "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/core:lib", @@ -822,12 +822,12 @@ cc_test( srcs = ["server_request_logger_test.cc"], deps = [ ":log_collector", - ":logging_proto", + ":logging_cc_proto", ":server_request_logger", - "//tensorflow_serving/apis:model_proto", - "//tensorflow_serving/apis:predict_proto", - "//tensorflow_serving/config:log_collector_config_proto", - "//tensorflow_serving/config:logging_config_proto", + "//tensorflow_serving/apis:model_cc_proto", + "//tensorflow_serving/apis:predict_cc_proto", + "//tensorflow_serving/config:log_collector_config_cc_proto", + "//tensorflow_serving/config:logging_config_cc_proto", "//tensorflow_serving/core/test_util:fake_log_collector", "//tensorflow_serving/core/test_util:mock_request_logger", "//tensorflow_serving/core/test_util:test_main", diff --git a/tensorflow_serving/core/test_util/BUILD b/tensorflow_serving/core/test_util/BUILD index ea18f644ae7..9ed632e1415 100644 --- a/tensorflow_serving/core/test_util/BUILD +++ b/tensorflow_serving/core/test_util/BUILD @@ -1,5 +1,7 @@ # Description: Tensorflow Serving core test utils. +load("//tensorflow_serving:serving.bzl", "serving_proto_library") + package( default_visibility = [ "//tensorflow_serving:internal", @@ -64,7 +66,7 @@ cc_library( hdrs = ["fake_loader_source_adapter.h"], visibility = ["//visibility:public"], deps = [ - ":fake_loader_source_adapter_proto", + ":fake_loader_source_adapter_cc_proto", "//tensorflow_serving/core:loader", "//tensorflow_serving/core:simple_loader", "//tensorflow_serving/core:source_adapter", @@ -74,8 +76,6 @@ cc_library( alwayslink = 1, ) -load("//tensorflow_serving:serving.bzl", "serving_proto_library") - serving_proto_library( name = "fake_loader_source_adapter_proto", testonly = 1, @@ -175,7 +175,7 @@ cc_library( testonly = 1, hdrs = ["mock_request_logger.h"], deps = [ - "//tensorflow_serving/core:logging_proto", + "//tensorflow_serving/core:logging_cc_proto", "//tensorflow_serving/core:request_logger", "@com_google_googletest//:gtest", "@com_google_protobuf//:protobuf", diff --git a/tensorflow_serving/example/BUILD b/tensorflow_serving/example/BUILD index 5171d11cd25..abd0ef2f971 100644 --- a/tensorflow_serving/example/BUILD +++ b/tensorflow_serving/example/BUILD @@ -24,7 +24,7 @@ cc_binary( "resnet_client.cc", ], deps = [ - "//tensorflow_serving/apis:prediction_service_proto", + "//tensorflow_serving/apis:prediction_service_cc_proto", "@com_google_protobuf//:protobuf_lite", "@grpc//:grpc++", "@org_tensorflow//tensorflow/core:framework", diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 374e32b234d..12b2ab9bdd0 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -55,11 +55,11 @@ cc_library( "//visibility:public", ], deps = [ - "//tensorflow_serving/config:platform_config_proto", + "//tensorflow_serving/config:platform_config_cc_proto", "//tensorflow_serving/model_servers:model_platform_types", - "//tensorflow_serving/servables/tensorflow:saved_model_bundle_source_adapter_proto", - "//tensorflow_serving/servables/tensorflow:session_bundle_config_proto", - "//tensorflow_serving/servables/tensorflow:session_bundle_source_adapter_proto", + "//tensorflow_serving/servables/tensorflow:saved_model_bundle_source_adapter_cc_proto", + "//tensorflow_serving/servables/tensorflow:session_bundle_config_cc_proto", + "//tensorflow_serving/servables/tensorflow:session_bundle_source_adapter_cc_proto", ], ) @@ -72,10 +72,10 @@ cc_library( ], deps = [ ":model_platform_types", - "//tensorflow_serving/apis:model_proto", - "//tensorflow_serving/config:logging_config_proto", - "//tensorflow_serving/config:model_server_config_proto", - "//tensorflow_serving/config:platform_config_proto", + "//tensorflow_serving/apis:model_cc_proto", + "//tensorflow_serving/config:logging_config_cc_proto", + "//tensorflow_serving/config:model_server_config_cc_proto", + "//tensorflow_serving/config:platform_config_cc_proto", "//tensorflow_serving/core:aspired_versions_manager", "//tensorflow_serving/core:dynamic_source_router", "//tensorflow_serving/core:load_servables_fast", @@ -88,9 +88,9 @@ cc_library( "//tensorflow_serving/servables/tensorflow:predict_util", "//tensorflow_serving/servables/tensorflow:saved_model_bundle_source_adapter", "//tensorflow_serving/servables/tensorflow:session_bundle_source_adapter", - "//tensorflow_serving/servables/tensorflow:session_bundle_source_adapter_proto", + "//tensorflow_serving/servables/tensorflow:session_bundle_source_adapter_cc_proto", "//tensorflow_serving/sources/storage_path:file_system_storage_path_source", - "//tensorflow_serving/sources/storage_path:file_system_storage_path_source_proto", + "//tensorflow_serving/sources/storage_path:file_system_storage_path_source_cc_proto", "//tensorflow_serving/util:event_bus", "//tensorflow_serving/util:optional", "//tensorflow_serving/util:unique_ptr_with_deps", @@ -107,18 +107,18 @@ cc_test( deps = [ ":model_platform_types", ":server_core", - "//tensorflow_serving/apis:model_proto", - "//tensorflow_serving/apis:predict_proto", + "//tensorflow_serving/apis:model_cc_proto", + "//tensorflow_serving/apis:predict_cc_proto", "//tensorflow_serving/core:servable_handle", "//tensorflow_serving/core:servable_state", "//tensorflow_serving/core/test_util:availability_test_util", - "//tensorflow_serving/core/test_util:fake_loader_source_adapter_proto", + "//tensorflow_serving/core/test_util:fake_loader_source_adapter_cc_proto", "//tensorflow_serving/core/test_util:fake_log_collector", "//tensorflow_serving/core/test_util:mock_request_logger", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/model_servers/test_util:server_core_test_util", "//tensorflow_serving/model_servers/test_util:storage_path_error_injecting_source_adapter", - "//tensorflow_serving/model_servers/test_util:storage_path_error_injecting_source_adapter_proto", + "//tensorflow_serving/model_servers/test_util:storage_path_error_injecting_source_adapter_cc_proto", "//tensorflow_serving/test_util", "//tensorflow_serving/util:oss_or_google", "@com_google_protobuf//:cc_wkt_protos", @@ -137,10 +137,10 @@ cc_library( ], deps = [ ":server_core", - "//tensorflow_serving/apis:get_model_status_proto", + "//tensorflow_serving/apis:get_model_status_cc_proto", "//tensorflow_serving/core:servable_state", "//tensorflow_serving/core:servable_state_monitor", - "//tensorflow_serving/util:status_proto", + "//tensorflow_serving/util:status_cc_proto", "//tensorflow_serving/util:status_util", "@org_tensorflow//tensorflow/core:lib", ], @@ -158,12 +158,12 @@ cc_test( ":model_platform_types", ":platform_config_util", ":server_core", - "//tensorflow_serving/apis:model_proto", + "//tensorflow_serving/apis:model_cc_proto", "//tensorflow_serving/core:availability_preserving_policy", "//tensorflow_serving/core/test_util:test_main", - "//tensorflow_serving/servables/tensorflow:saved_model_bundle_source_adapter_proto", - "//tensorflow_serving/servables/tensorflow:session_bundle_config_proto", - "//tensorflow_serving/servables/tensorflow:session_bundle_source_adapter_proto", + "//tensorflow_serving/servables/tensorflow:saved_model_bundle_source_adapter_cc_proto", + "//tensorflow_serving/servables/tensorflow:session_bundle_config_cc_proto", + "//tensorflow_serving/servables/tensorflow:session_bundle_source_adapter_cc_proto", "//tensorflow_serving/test_util", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", @@ -186,9 +186,9 @@ cc_test( ":server_core", "//tensorflow_serving/core:availability_preserving_policy", "//tensorflow_serving/core/test_util:test_main", - "//tensorflow_serving/servables/tensorflow:saved_model_bundle_source_adapter_proto", - "//tensorflow_serving/servables/tensorflow:session_bundle_config_proto", - "//tensorflow_serving/servables/tensorflow:session_bundle_source_adapter_proto", + "//tensorflow_serving/servables/tensorflow:saved_model_bundle_source_adapter_cc_proto", + "//tensorflow_serving/servables/tensorflow:session_bundle_config_cc_proto", + "//tensorflow_serving/servables/tensorflow:session_bundle_source_adapter_cc_proto", "//tensorflow_serving/test_util", "@com_github_tencent_rapidjson//:rapidjson", "@com_google_absl//absl/strings", @@ -209,8 +209,8 @@ cc_library( ":get_model_status_impl", ":grpc_status_util", ":server_core", - "//tensorflow_serving/apis:model_management_proto", - "//tensorflow_serving/apis:model_service_proto", + "//tensorflow_serving/apis:model_management_cc_proto", + "//tensorflow_serving/apis:model_service_cc_proto", "//tensorflow_serving/util:status_util", "@grpc//:grpc++", ], @@ -223,12 +223,12 @@ cc_library( deps = [ ":grpc_status_util", ":server_core", - "//tensorflow_serving/apis:classification_proto", - "//tensorflow_serving/apis:get_model_metadata_proto", - "//tensorflow_serving/apis:inference_proto", - "//tensorflow_serving/apis:predict_proto", - "//tensorflow_serving/apis:prediction_service_proto", - "//tensorflow_serving/apis:regression_proto", + "//tensorflow_serving/apis:classification_cc_proto", + "//tensorflow_serving/apis:get_model_metadata_cc_proto", + "//tensorflow_serving/apis:inference_cc_proto", + "//tensorflow_serving/apis:predict_cc_proto", + "//tensorflow_serving/apis:prediction_service_cc_proto", + "//tensorflow_serving/apis:regression_cc_proto", "//tensorflow_serving/servables/tensorflow:classification_service", "//tensorflow_serving/servables/tensorflow:get_model_metadata_impl", "//tensorflow_serving/servables/tensorflow:multi_inference_helper", @@ -257,7 +257,7 @@ cc_library( deps = [ ":http_rest_api_handler", ":server_core", - "//tensorflow_serving/config:monitoring_config_proto", + "//tensorflow_serving/config:monitoring_config_cc_proto", "//tensorflow_serving/util:prometheus_exporter", "//tensorflow_serving/util:threadpool_executor", "//tensorflow_serving/util/net_http/server/public:http_server", @@ -276,8 +276,8 @@ cc_library( deps = [ ":get_model_status_impl", ":server_core", - "//tensorflow_serving/apis:model_proto", - "//tensorflow_serving/apis:predict_proto", + "//tensorflow_serving/apis:model_cc_proto", + "//tensorflow_serving/apis:predict_cc_proto", "//tensorflow_serving/core:servable_handle", "//tensorflow_serving/servables/tensorflow:classification_service", "//tensorflow_serving/servables/tensorflow:get_model_metadata_impl", @@ -340,12 +340,12 @@ cc_library( "@com_google_absl//absl/memory", "@org_tensorflow//tensorflow/core/profiler/rpc:profiler_service_impl", "@org_tensorflow//tensorflow/core:protos_all_cc", - "//tensorflow_serving/config:model_server_config_proto", - "//tensorflow_serving/config:monitoring_config_proto", - "//tensorflow_serving/config:ssl_config_proto", - "//tensorflow_serving/config:platform_config_proto", + "//tensorflow_serving/config:model_server_config_cc_proto", + "//tensorflow_serving/config:monitoring_config_cc_proto", + "//tensorflow_serving/config:ssl_config_cc_proto", + "//tensorflow_serving/config:platform_config_cc_proto", "//tensorflow_serving/core:availability_preserving_policy", - "//tensorflow_serving/servables/tensorflow:session_bundle_config_proto", + "//tensorflow_serving/servables/tensorflow:session_bundle_config_cc_proto", ] + TENSORFLOW_DEPS + SUPPORTED_TENSORFLOW_OPS, ) diff --git a/tensorflow_serving/model_servers/test_util/BUILD b/tensorflow_serving/model_servers/test_util/BUILD index 4a36817b0bc..7c0dd3e404f 100644 --- a/tensorflow_serving/model_servers/test_util/BUILD +++ b/tensorflow_serving/model_servers/test_util/BUILD @@ -1,6 +1,7 @@ # Description: Model Server test utility load("//tensorflow_serving:oss_or_google.bzl", "if_google") +load("//tensorflow_serving:serving.bzl", "serving_proto_library") package( default_visibility = [ @@ -30,16 +31,16 @@ cc_library( "//visibility:public", ], deps = [ - "//tensorflow_serving/apis:model_proto", - "//tensorflow_serving/config:model_server_config_proto", - "//tensorflow_serving/config:platform_config_proto", + "//tensorflow_serving/apis:model_cc_proto", + "//tensorflow_serving/config:model_server_config_cc_proto", + "//tensorflow_serving/config:platform_config_cc_proto", "//tensorflow_serving/core:aspired_versions_manager", "//tensorflow_serving/core:servable_handle", "//tensorflow_serving/core:servable_state", "//tensorflow_serving/core:servable_state_monitor", "//tensorflow_serving/core:server_request_logger", "//tensorflow_serving/core/test_util:fake_loader_source_adapter", - "//tensorflow_serving/core/test_util:fake_loader_source_adapter_proto", + "//tensorflow_serving/core/test_util:fake_loader_source_adapter_cc_proto", "//tensorflow_serving/model_servers:server_core", "//tensorflow_serving/util:event_bus", "//tensorflow_serving/util:unique_ptr_with_deps", @@ -79,9 +80,9 @@ cc_library( "//tensorflow_serving/model_servers:model_platform_types", "//tensorflow_serving/model_servers:platform_config_util", "//tensorflow_serving/model_servers:server_core", - "//tensorflow_serving/servables/tensorflow:saved_model_bundle_source_adapter_proto", - "//tensorflow_serving/servables/tensorflow:session_bundle_config_proto", - "//tensorflow_serving/servables/tensorflow:session_bundle_source_adapter_proto", + "//tensorflow_serving/servables/tensorflow:saved_model_bundle_source_adapter_cc_proto", + "//tensorflow_serving/servables/tensorflow:session_bundle_config_cc_proto", + "//tensorflow_serving/servables/tensorflow:session_bundle_source_adapter_cc_proto", "//tensorflow_serving/test_util", "@com_google_googletest//:gtest", "@org_tensorflow//tensorflow/core:test", @@ -97,13 +98,11 @@ cc_library( "//visibility:public", ], deps = [ - ":storage_path_error_injecting_source_adapter_proto", + ":storage_path_error_injecting_source_adapter_cc_proto", "//tensorflow_serving/core:source_adapter", ], ) -load("//tensorflow_serving:serving.bzl", "serving_proto_library") - serving_proto_library( name = "storage_path_error_injecting_source_adapter_proto", testonly = 1, diff --git a/tensorflow_serving/resources/BUILD b/tensorflow_serving/resources/BUILD index 8db77715c6d..9f7f1af4694 100644 --- a/tensorflow_serving/resources/BUILD +++ b/tensorflow_serving/resources/BUILD @@ -1,3 +1,5 @@ +load("//tensorflow_serving:serving.bzl", "serving_proto_library") + package( default_visibility = [ "//tensorflow_serving:internal", @@ -19,8 +21,6 @@ filegroup( ), ) -load("//tensorflow_serving:serving.bzl", "serving_proto_library") - serving_proto_library( name = "resources_proto", srcs = ["resources.proto"], @@ -44,7 +44,7 @@ cc_library( hdrs = ["resource_util.h"], visibility = ["//visibility:public"], deps = [ - ":resources_proto", + ":resources_cc_proto", "@org_tensorflow//tensorflow/core:lib", ], ) @@ -68,7 +68,7 @@ cc_library( hdrs = ["resource_tracker.h"], deps = [ ":resource_util", - ":resources_proto", + ":resources_cc_proto", "//tensorflow_serving/core:loader", "@org_tensorflow//tensorflow/core:lib", ], diff --git a/tensorflow_serving/servables/hashmap/BUILD b/tensorflow_serving/servables/hashmap/BUILD index a3a614bc92f..bd0b4880893 100644 --- a/tensorflow_serving/servables/hashmap/BUILD +++ b/tensorflow_serving/servables/hashmap/BUILD @@ -1,5 +1,7 @@ # Description: Tensorflow Serving hashmap servable. +load("//tensorflow_serving:serving.bzl", "serving_proto_library") + package( default_visibility = ["//tensorflow_serving:internal"], features = ["-layering_check"], @@ -27,7 +29,7 @@ cc_library( "//visibility:public", ], deps = [ - ":hashmap_source_adapter_proto", + ":hashmap_source_adapter_cc_proto", "//tensorflow_serving/core:simple_loader", "//tensorflow_serving/core:source_adapter", "//tensorflow_serving/core:storage_path", @@ -42,7 +44,7 @@ cc_test( srcs = ["hashmap_source_adapter_test.cc"], deps = [ ":hashmap_source_adapter", - ":hashmap_source_adapter_proto", + ":hashmap_source_adapter_cc_proto", "//tensorflow_serving/core:loader", "//tensorflow_serving/core:servable_data", "//tensorflow_serving/core/test_util:test_main", @@ -52,8 +54,6 @@ cc_test( ], ) -load("//tensorflow_serving:serving.bzl", "serving_proto_library") - serving_proto_library( name = "hashmap_source_adapter_proto", srcs = ["hashmap_source_adapter.proto"], diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index e7576abc92d..4095cfd4923 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -1,6 +1,7 @@ # Description: TensorFlow servables. load("//tensorflow_serving:oss_or_google.bzl", "if_google") +load("//tensorflow_serving:serving.bzl", "serving_proto_library") package( default_visibility = [ @@ -22,8 +23,6 @@ filegroup( ), ) -load("//tensorflow_serving:serving.bzl", "serving_proto_library") - serving_proto_library( name = "session_bundle_config_proto", srcs = ["session_bundle_config.proto"], @@ -46,10 +45,10 @@ cc_library( ], deps = [ ":serving_session", - ":session_bundle_config_proto", + ":session_bundle_config_cc_proto", "//tensorflow_serving/batching:batching_session", "//tensorflow_serving/resources:resource_values", - "//tensorflow_serving/resources:resources_proto", + "//tensorflow_serving/resources:resources_cc_proto", "//tensorflow_serving/util:file_probing_env", "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/core:core_cpu", @@ -71,10 +70,10 @@ cc_test( deps = [ ":bundle_factory_test_util", ":bundle_factory_util", - ":session_bundle_config_proto", + ":session_bundle_config_cc_proto", "//tensorflow_serving/batching:batching_session", "//tensorflow_serving/core/test_util:test_main", - "//tensorflow_serving/resources:resources_proto", + "//tensorflow_serving/resources:resources_cc_proto", "//tensorflow_serving/session_bundle:session_bundle_util", "//tensorflow_serving/test_util", "//tensorflow_serving/util/test_util:mock_file_probing_env", @@ -95,7 +94,7 @@ cc_library( hdrs = ["bundle_factory_test_util.h"], deps = [ "//tensorflow_serving/resources:resource_values", - "//tensorflow_serving/resources:resources_proto", + "//tensorflow_serving/resources:resources_cc_proto", "//tensorflow_serving/test_util", "@org_tensorflow//tensorflow/cc/saved_model:constants", "@org_tensorflow//tensorflow/core:core_cpu", @@ -112,8 +111,8 @@ cc_library( srcs = ["bundle_factory_test.h"], deps = [ ":bundle_factory_test_util", - ":session_bundle_config_proto", - "//tensorflow_serving/resources:resources_proto", + ":session_bundle_config_cc_proto", + "//tensorflow_serving/resources:resources_cc_proto", "//tensorflow_serving/test_util", "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/cc/saved_model:tag_constants", @@ -132,9 +131,9 @@ cc_library( ], deps = [ ":bundle_factory_util", - ":session_bundle_config_proto", + ":session_bundle_config_cc_proto", "//tensorflow_serving/batching:batching_session", - "//tensorflow_serving/resources:resources_proto", + "//tensorflow_serving/resources:resources_cc_proto", "//tensorflow_serving/session_bundle:session_bundle_util", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:lib", @@ -153,11 +152,11 @@ cc_library( deps = [ ":bundle_factory_util", ":curried_session", - ":session_bundle_config_proto", + ":session_bundle_config_cc_proto", ":tflite_session_lib", "//tensorflow_serving/batching:batching_session", "//tensorflow_serving/core:loader", - "//tensorflow_serving/resources:resources_proto", + "//tensorflow_serving/resources:resources_cc_proto", "//tensorflow_serving/session_bundle:session_bundle_util", "@com_google_absl//absl/strings", "@org_tensorflow//tensorflow/cc/saved_model:loader", @@ -182,7 +181,7 @@ cc_test( ":bundle_factory_test", ":bundle_factory_test_util", ":saved_model_bundle_factory", - ":session_bundle_config_proto", + ":session_bundle_config_cc_proto", "//tensorflow_serving/core/test_util:session_test_util", "//tensorflow_serving/core/test_util:test_main", "@com_google_protobuf//:cc_wkt_protos", @@ -203,7 +202,7 @@ cc_library( ], deps = [ ":session_bundle_factory", - ":session_bundle_source_adapter_proto", + ":session_bundle_source_adapter_cc_proto", "//tensorflow_serving/core:loader", "//tensorflow_serving/core:simple_loader", "//tensorflow_serving/core:source_adapter", @@ -224,16 +223,16 @@ cc_library( ], deps = [ ":saved_model_bundle_factory", - ":saved_model_bundle_source_adapter_proto", + ":saved_model_bundle_source_adapter_cc_proto", ":saved_model_warmup", - ":session_bundle_source_adapter_proto", + ":session_bundle_source_adapter_cc_proto", "//tensorflow_serving/core:loader", "//tensorflow_serving/core:simple_loader", "//tensorflow_serving/core:source_adapter", "//tensorflow_serving/core:storage_path", "//tensorflow_serving/resources:resource_util", "//tensorflow_serving/resources:resource_values", - "//tensorflow_serving/resources:resources_proto", + "//tensorflow_serving/resources:resources_cc_proto", "//tensorflow_serving/util:optional", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/core:lib", @@ -254,13 +253,13 @@ cc_test( deps = [ ":bundle_factory_test_util", ":saved_model_bundle_source_adapter", - ":session_bundle_config_proto", - ":session_bundle_source_adapter_proto", + ":session_bundle_config_cc_proto", + ":session_bundle_source_adapter_cc_proto", "//tensorflow_serving/core:loader", "//tensorflow_serving/core:servable_data", "//tensorflow_serving/core/test_util:session_test_util", "//tensorflow_serving/core/test_util:test_main", - "//tensorflow_serving/resources:resources_proto", + "//tensorflow_serving/resources:resources_cc_proto", "//tensorflow_serving/test_util", "//tensorflow_serving/util:oss_or_google", "@com_google_protobuf//:cc_wkt_protos", @@ -303,7 +302,7 @@ cc_library( ], deps = [ ":saved_model_bundle_source_adapter", - ":session_bundle_source_adapter_proto", + ":session_bundle_source_adapter_cc_proto", "//tensorflow_serving/core:aspired_versions_manager_builder", "//tensorflow_serving/core:availability_preserving_policy", "//tensorflow_serving/core:loader", @@ -313,7 +312,7 @@ cc_library( "//tensorflow_serving/core:storage_path", "//tensorflow_serving/core:target", "//tensorflow_serving/sources/storage_path:file_system_storage_path_source", - "//tensorflow_serving/sources/storage_path:file_system_storage_path_source_proto", + "//tensorflow_serving/sources/storage_path:file_system_storage_path_source_cc_proto", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/core:lib", ], @@ -439,7 +438,7 @@ cc_library( deps = [ ":predict_util", ":util", - "//tensorflow_serving/apis:predict_proto", + "//tensorflow_serving/apis:predict_cc_proto", "//tensorflow_serving/core:servable_handle", "//tensorflow_serving/model_servers:server_core", "//tensorflow_serving/session_bundle:session_bundle_util", @@ -467,9 +466,9 @@ cc_test( ]), deps = [ ":predict_impl", - ":saved_model_bundle_source_adapter_proto", - ":session_bundle_config_proto", - ":session_bundle_source_adapter_proto", + ":saved_model_bundle_source_adapter_cc_proto", + ":session_bundle_config_cc_proto", + ":session_bundle_source_adapter_cc_proto", "//tensorflow_serving/core:availability_preserving_policy", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/model_servers:model_platform_types", @@ -490,7 +489,7 @@ cc_library( ], deps = [ ":util", - "//tensorflow_serving/apis:predict_proto", + "//tensorflow_serving/apis:predict_cc_proto", "//tensorflow_serving/util:optional", "@com_google_absl//absl/strings", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", @@ -517,9 +516,9 @@ cc_test( ]), deps = [ ":predict_util", - ":saved_model_bundle_source_adapter_proto", - ":session_bundle_config_proto", - ":session_bundle_source_adapter_proto", + ":saved_model_bundle_source_adapter_cc_proto", + ":session_bundle_config_cc_proto", + ":session_bundle_source_adapter_cc_proto", "//tensorflow_serving/core:availability_preserving_policy", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/model_servers:model_platform_types", @@ -542,7 +541,7 @@ cc_library( "//visibility:public", ], deps = [ - "//tensorflow_serving/apis:get_model_metadata_proto", + "//tensorflow_serving/apis:get_model_metadata_cc_proto", "//tensorflow_serving/core:servable_handle", "//tensorflow_serving/model_servers:server_core", "@org_tensorflow//tensorflow/cc/saved_model:loader", @@ -563,12 +562,12 @@ cc_test( ]), deps = [ ":get_model_metadata_impl", - ":saved_model_bundle_source_adapter_proto", - ":session_bundle_config_proto", - ":session_bundle_source_adapter_proto", - "//tensorflow_serving/apis:model_proto", - "//tensorflow_serving/config:model_server_config_proto", - "//tensorflow_serving/config:platform_config_proto", + ":saved_model_bundle_source_adapter_cc_proto", + ":session_bundle_config_cc_proto", + ":session_bundle_source_adapter_cc_proto", + "//tensorflow_serving/apis:model_cc_proto", + "//tensorflow_serving/config:model_server_config_cc_proto", + "//tensorflow_serving/config:platform_config_cc_proto", "//tensorflow_serving/core:aspired_version_policy", "//tensorflow_serving/core:availability_preserving_policy", "//tensorflow_serving/core:servable_handle", @@ -596,10 +595,10 @@ cc_library( ], deps = [ ":util", - "//tensorflow_serving/apis:classification_proto", + "//tensorflow_serving/apis:classification_cc_proto", "//tensorflow_serving/apis:classifier", - "//tensorflow_serving/apis:input_proto", - "//tensorflow_serving/apis:model_proto", + "//tensorflow_serving/apis:input_cc_proto", + "//tensorflow_serving/apis:model_cc_proto", "//tensorflow_serving/session_bundle:session_bundle_util", "//tensorflow_serving/util:optional", "@org_tensorflow//tensorflow/cc/saved_model:loader_lite", @@ -616,9 +615,9 @@ cc_test( srcs = ["classifier_test.cc"], deps = [ ":classifier", - "//tensorflow_serving/apis:classification_proto", - "//tensorflow_serving/apis:input_proto", - "//tensorflow_serving/apis:model_proto", + "//tensorflow_serving/apis:classification_cc_proto", + "//tensorflow_serving/apis:input_cc_proto", + "//tensorflow_serving/apis:model_cc_proto", "//tensorflow_serving/core/test_util:mock_session", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/session_bundle:session_bundle_util", @@ -641,7 +640,7 @@ cc_library( ], deps = [ ":classifier", - "//tensorflow_serving/apis:classification_proto", + "//tensorflow_serving/apis:classification_cc_proto", "//tensorflow_serving/apis:classifier", "//tensorflow_serving/core:servable_handle", "//tensorflow_serving/model_servers:server_core", @@ -658,8 +657,8 @@ cc_test( ], deps = [ ":classification_service", - ":session_bundle_config_proto", - "//tensorflow_serving/config:model_server_config_proto", + ":session_bundle_config_cc_proto", + "//tensorflow_serving/config:model_server_config_cc_proto", "//tensorflow_serving/core:availability_preserving_policy", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/model_servers:model_platform_types", @@ -681,7 +680,7 @@ cc_library( ], deps = [ ":regressor", - "//tensorflow_serving/apis:regression_proto", + "//tensorflow_serving/apis:regression_cc_proto", "//tensorflow_serving/apis:regressor", "//tensorflow_serving/core:servable_handle", "//tensorflow_serving/model_servers:server_core", @@ -698,8 +697,8 @@ cc_test( ], deps = [ ":regression_service", - ":session_bundle_config_proto", - "//tensorflow_serving/config:model_server_config_proto", + ":session_bundle_config_cc_proto", + "//tensorflow_serving/config:model_server_config_cc_proto", "//tensorflow_serving/core:availability_preserving_policy", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/model_servers:model_platform_types", @@ -721,9 +720,9 @@ cc_library( ], deps = [ ":util", - "//tensorflow_serving/apis:input_proto", - "//tensorflow_serving/apis:model_proto", - "//tensorflow_serving/apis:regression_proto", + "//tensorflow_serving/apis:input_cc_proto", + "//tensorflow_serving/apis:model_cc_proto", + "//tensorflow_serving/apis:regression_cc_proto", "//tensorflow_serving/apis:regressor", "//tensorflow_serving/session_bundle:session_bundle_util", "//tensorflow_serving/util:optional", @@ -741,9 +740,9 @@ cc_test( srcs = ["regressor_test.cc"], deps = [ ":regressor", - "//tensorflow_serving/apis:input_proto", - "//tensorflow_serving/apis:model_proto", - "//tensorflow_serving/apis:regression_proto", + "//tensorflow_serving/apis:input_cc_proto", + "//tensorflow_serving/apis:model_cc_proto", + "//tensorflow_serving/apis:regression_cc_proto", "//tensorflow_serving/core/test_util:mock_session", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/session_bundle:session_bundle_util", @@ -765,9 +764,9 @@ cc_library( "//visibility:public", ], deps = [ - "//tensorflow_serving/apis:inference_proto", - "//tensorflow_serving/apis:input_proto", - "//tensorflow_serving/apis:model_proto", + "//tensorflow_serving/apis:inference_cc_proto", + "//tensorflow_serving/apis:input_cc_proto", + "//tensorflow_serving/apis:model_cc_proto", "//tensorflow_serving/servables/tensorflow:classifier", "//tensorflow_serving/servables/tensorflow:regressor", "//tensorflow_serving/servables/tensorflow:util", @@ -787,15 +786,15 @@ cc_test( ], deps = [ ":multi_inference", - "//tensorflow_serving/apis:classification_proto", - "//tensorflow_serving/apis:input_proto", - "//tensorflow_serving/apis:regression_proto", + "//tensorflow_serving/apis:classification_cc_proto", + "//tensorflow_serving/apis:input_cc_proto", + "//tensorflow_serving/apis:regression_cc_proto", "//tensorflow_serving/core:availability_preserving_policy", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/model_servers:model_platform_types", "//tensorflow_serving/model_servers:platform_config_util", "//tensorflow_serving/model_servers:server_core", - "//tensorflow_serving/servables/tensorflow:session_bundle_config_proto", + "//tensorflow_serving/servables/tensorflow:session_bundle_config_cc_proto", "//tensorflow_serving/test_util", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", @@ -813,9 +812,9 @@ cc_library( ], deps = [ ":multi_inference", - "//tensorflow_serving/apis:inference_proto", - "//tensorflow_serving/apis:input_proto", - "//tensorflow_serving/apis:model_proto", + "//tensorflow_serving/apis:inference_cc_proto", + "//tensorflow_serving/apis:input_cc_proto", + "//tensorflow_serving/apis:model_cc_proto", "//tensorflow_serving/model_servers:server_core", "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/cc/saved_model:loader", @@ -834,15 +833,15 @@ cc_test( ], deps = [ ":multi_inference_helper", - "//tensorflow_serving/apis:classification_proto", - "//tensorflow_serving/apis:input_proto", - "//tensorflow_serving/apis:regression_proto", + "//tensorflow_serving/apis:classification_cc_proto", + "//tensorflow_serving/apis:input_cc_proto", + "//tensorflow_serving/apis:regression_cc_proto", "//tensorflow_serving/core:availability_preserving_policy", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/model_servers:model_platform_types", "//tensorflow_serving/model_servers:platform_config_util", "//tensorflow_serving/model_servers:server_core", - "//tensorflow_serving/servables/tensorflow:session_bundle_config_proto", + "//tensorflow_serving/servables/tensorflow:session_bundle_config_cc_proto", "//tensorflow_serving/test_util", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", @@ -859,9 +858,9 @@ cc_library( "//visibility:public", ], deps = [ - "//tensorflow_serving/apis:input_proto", - "//tensorflow_serving/apis:model_proto", - "//tensorflow_serving/apis/internal:serialized_input_proto", + "//tensorflow_serving/apis:input_cc_proto", + "//tensorflow_serving/apis:model_cc_proto", + "//tensorflow_serving/apis/internal:serialized_input_cc_proto", "//tensorflow_serving/util:optional", "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", @@ -899,9 +898,9 @@ cc_library( ":multi_inference", ":predict_util", ":regressor", - ":session_bundle_config_proto", + ":session_bundle_config_cc_proto", ":util", - "//tensorflow_serving/apis:prediction_log_proto", + "//tensorflow_serving/apis:prediction_log_cc_proto", "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/cc/saved_model:constants", "@org_tensorflow//tensorflow/cc/saved_model:loader", @@ -917,10 +916,10 @@ cc_test( srcs = ["saved_model_warmup_test.cc"], deps = [ ":saved_model_warmup", - ":session_bundle_config_proto", - "//tensorflow_serving/apis:input_proto", - "//tensorflow_serving/apis:model_proto", - "//tensorflow_serving/apis:prediction_log_proto", + ":session_bundle_config_cc_proto", + "//tensorflow_serving/apis:input_cc_proto", + "//tensorflow_serving/apis:model_cc_proto", + "//tensorflow_serving/apis:prediction_log_cc_proto", "//tensorflow_serving/core/test_util:mock_session", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", diff --git a/tensorflow_serving/serving.bzl b/tensorflow_serving/serving.bzl index ca34504683e..1e3d0460bea 100644 --- a/tensorflow_serving/serving.bzl +++ b/tensorflow_serving/serving.bzl @@ -19,6 +19,15 @@ def serving_proto_library( use_grpc_plugin = None if cc_grpc_version: use_grpc_plugin = True + + # For compatibility with Google-internal naming conventions + native.alias( + name = name[:-len("_proto")] + "_cc_proto", + actual = name, + testonly = testonly, + visibility = visibility, + ) + cc_proto_library( name = name, srcs = srcs, diff --git a/tensorflow_serving/sources/storage_path/BUILD b/tensorflow_serving/sources/storage_path/BUILD index 940c0bda995..6b73bb91262 100644 --- a/tensorflow_serving/sources/storage_path/BUILD +++ b/tensorflow_serving/sources/storage_path/BUILD @@ -1,5 +1,8 @@ # Description: Tensorflow Serving storage path sources. +load("//tensorflow_serving:serving.bzl", "serving_proto_library") +load("//tensorflow_serving:serving.bzl", "serving_proto_library_py") + package( default_visibility = [ "//tensorflow_serving:internal", @@ -28,7 +31,7 @@ cc_library( "//visibility:public", ], deps = [ - ":static_storage_path_source_proto", + ":static_storage_path_source_cc_proto", "//tensorflow_serving/core:servable_data", "//tensorflow_serving/core:servable_id", "//tensorflow_serving/core:source", @@ -37,9 +40,6 @@ cc_library( ], ) -load("//tensorflow_serving:serving.bzl", "serving_proto_library") -load("//tensorflow_serving:serving.bzl", "serving_proto_library_py") - serving_proto_library( name = "static_storage_path_source_proto", srcs = ["static_storage_path_source.proto"], @@ -70,7 +70,7 @@ cc_library( visibility = ["//visibility:public"], deps = [ - ":file_system_storage_path_source_proto", + ":file_system_storage_path_source_cc_proto", "//tensorflow_serving/core:servable_data", "//tensorflow_serving/core:servable_id", "//tensorflow_serving/core:source", @@ -103,7 +103,7 @@ cc_test( ], deps = [ ":file_system_storage_path_source", - ":file_system_storage_path_source_proto", + ":file_system_storage_path_source_cc_proto", "//tensorflow_serving/core:servable_data", "//tensorflow_serving/core:target", "//tensorflow_serving/core/test_util:mock_storage_path_target", diff --git a/tensorflow_serving/util/BUILD b/tensorflow_serving/util/BUILD index 986ce5f58c4..7e6c38daa0e 100644 --- a/tensorflow_serving/util/BUILD +++ b/tensorflow_serving/util/BUILD @@ -303,7 +303,7 @@ cc_test( ], deps = [ ":class_registration", - ":class_registration_test_proto", + ":class_registration_test_cc_proto", "//tensorflow_serving/core/test_util:test_main", ], ) @@ -332,7 +332,7 @@ cc_library( srcs = ["status_util.cc"], hdrs = ["status_util.h"], deps = [ - ":status_proto", + ":status_cc_proto", "@org_tensorflow//tensorflow/core:lib", ], ) @@ -342,11 +342,11 @@ cc_library( srcs = ["json_tensor.cc"], hdrs = ["json_tensor.h"], deps = [ - "//tensorflow_serving/apis:classification_proto", - "//tensorflow_serving/apis:input_proto", - "//tensorflow_serving/apis:model_proto", - "//tensorflow_serving/apis:predict_proto", - "//tensorflow_serving/apis:regression_proto", + "//tensorflow_serving/apis:classification_cc_proto", + "//tensorflow_serving/apis:input_cc_proto", + "//tensorflow_serving/apis:model_cc_proto", + "//tensorflow_serving/apis:predict_cc_proto", + "//tensorflow_serving/apis:regression_cc_proto", "@com_github_tencent_rapidjson//:rapidjson", "@com_google_absl//absl/strings", "@com_google_absl//absl/strings:str_format", @@ -370,10 +370,10 @@ cc_test( srcs = ["json_tensor_test.cc"], deps = [ ":json_tensor", - "//tensorflow_serving/apis:classification_proto", - "//tensorflow_serving/apis:model_proto", - "//tensorflow_serving/apis:predict_proto", - "//tensorflow_serving/apis:regression_proto", + "//tensorflow_serving/apis:classification_cc_proto", + "//tensorflow_serving/apis:model_cc_proto", + "//tensorflow_serving/apis:predict_cc_proto", + "//tensorflow_serving/apis:regression_cc_proto", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", "@com_google_protobuf//:protobuf", From f337623da81521eefd8cdc2da1c4a450ecf1d028 Mon Sep 17 00:00:00 2001 From: Li Lao Date: Fri, 6 Dec 2019 14:24:17 -0800 Subject: [PATCH 3627/8103] Add a SourceAdapter that adds a prefix to StoragePath. PiperOrigin-RevId: 284262089 --- tensorflow_serving/core/BUILD | 28 ++++++++- .../prefix_storage_path_source_adapter.cc | 36 ++++++++++++ .../core/prefix_storage_path_source_adapter.h | 49 ++++++++++++++++ ...prefix_storage_path_source_adapter_test.cc | 58 +++++++++++++++++++ tensorflow_serving/model_servers/BUILD | 1 + .../model_servers/server_core.cc | 20 +++++-- .../model_servers/server_core.h | 11 +++- .../model_servers/server_core_test.cc | 40 +++++++++++++ 8 files changed, 234 insertions(+), 9 deletions(-) create mode 100644 tensorflow_serving/core/prefix_storage_path_source_adapter.cc create mode 100644 tensorflow_serving/core/prefix_storage_path_source_adapter.h create mode 100644 tensorflow_serving/core/prefix_storage_path_source_adapter_test.cc diff --git a/tensorflow_serving/core/BUILD b/tensorflow_serving/core/BUILD index c155c3d4378..3a28b83dc06 100644 --- a/tensorflow_serving/core/BUILD +++ b/tensorflow_serving/core/BUILD @@ -1,7 +1,6 @@ # Description: Tensorflow Serving core. -load("//tensorflow_serving:serving.bzl", "serving_proto_library") -load("//tensorflow_serving:serving.bzl", "serving_proto_library_py") +load("//tensorflow_serving:serving.bzl", "serving_proto_library", "serving_proto_library_py") package( default_visibility = [ @@ -257,6 +256,31 @@ cc_test( ], ) +cc_library( + name = "prefix_storage_path_source_adapter", + srcs = ["prefix_storage_path_source_adapter.cc"], + hdrs = ["prefix_storage_path_source_adapter.h"], + visibility = [ + "//visibility:public", + ], + deps = [ + ":source_adapter", + ":storage_path", + "@org_tensorflow//tensorflow/core:lib", + ], +) + +cc_test( + name = "prefix_storage_path_source_adapter_test", + srcs = ["prefix_storage_path_source_adapter_test.cc"], + deps = [ + ":prefix_storage_path_source_adapter", + ":servable_data", + ":storage_path", + "//tensorflow_serving/core/test_util:test_main", + ], +) + cc_library( name = "storage_path", hdrs = ["storage_path.h"], diff --git a/tensorflow_serving/core/prefix_storage_path_source_adapter.cc b/tensorflow_serving/core/prefix_storage_path_source_adapter.cc new file mode 100644 index 00000000000..710eceba0a1 --- /dev/null +++ b/tensorflow_serving/core/prefix_storage_path_source_adapter.cc @@ -0,0 +1,36 @@ +/* Copyright 2019 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow_serving/core/prefix_storage_path_source_adapter.h" + +#include "tensorflow/core/platform/path.h" + +namespace tensorflow { +namespace serving { + +PrefixStoragePathSourceAdapter::PrefixStoragePathSourceAdapter( + const std::string& prefix) + : prefix_(prefix) {} + +PrefixStoragePathSourceAdapter::~PrefixStoragePathSourceAdapter() { Detach(); } + +Status PrefixStoragePathSourceAdapter::Convert(const StoragePath& source, + StoragePath* destination) { + *destination = tensorflow::io::JoinPath(prefix_, source); + return Status::OK(); +} + +} // namespace serving +} // namespace tensorflow diff --git a/tensorflow_serving/core/prefix_storage_path_source_adapter.h b/tensorflow_serving/core/prefix_storage_path_source_adapter.h new file mode 100644 index 00000000000..1c01ebb73af --- /dev/null +++ b/tensorflow_serving/core/prefix_storage_path_source_adapter.h @@ -0,0 +1,49 @@ +/* Copyright 2019 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_SERVING_CORE_PREFIX_STORAGE_PATH_SOURCE_ADAPTER_H_ +#define TENSORFLOW_SERVING_CORE_PREFIX_STORAGE_PATH_SOURCE_ADAPTER_H_ + +#include "tensorflow/core/lib/core/status.h" +#include "tensorflow/core/platform/macros.h" +#include "tensorflow_serving/core/source_adapter.h" +#include "tensorflow_serving/core/storage_path.h" + +namespace tensorflow { +namespace serving { + +// A SourceAdapter that adds a prefix to StoragePath. +// +// This can be useful for filesystems which wrap other filesystems via namespace +// prefixes, adding additional functionality like buffering for example. +class PrefixStoragePathSourceAdapter final + : public UnarySourceAdapter { + public: + explicit PrefixStoragePathSourceAdapter(const std::string& prefix); + ~PrefixStoragePathSourceAdapter() override; + + protected: + Status Convert(const StoragePath& source, StoragePath* destination) final; + + private: + const std::string prefix_; + + TF_DISALLOW_COPY_AND_ASSIGN(PrefixStoragePathSourceAdapter); +}; + +} // namespace serving +} // namespace tensorflow + +#endif // TENSORFLOW_SERVING_CORE_PREFIX_STORAGE_PATH_SOURCE_ADAPTER_H_ diff --git a/tensorflow_serving/core/prefix_storage_path_source_adapter_test.cc b/tensorflow_serving/core/prefix_storage_path_source_adapter_test.cc new file mode 100644 index 00000000000..9839dd88682 --- /dev/null +++ b/tensorflow_serving/core/prefix_storage_path_source_adapter_test.cc @@ -0,0 +1,58 @@ +/* Copyright 2019 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow_serving/core/prefix_storage_path_source_adapter.h" + +#include +#include +#include "tensorflow_serving/core/servable_data.h" +#include "tensorflow_serving/core/storage_path.h" + +namespace tensorflow { +namespace serving { +namespace { + +TEST(PrefixStoragePathSourceAdapterTest, Basic) { + { + PrefixStoragePathSourceAdapter adapter(""); + ServableData output = + adapter.AdaptOneVersion(ServableData({"foo", 42}, "bar")); + EXPECT_EQ("foo", output.id().name); + EXPECT_EQ(42, output.id().version); + EXPECT_EQ("bar", output.DataOrDie()); + } + + { + PrefixStoragePathSourceAdapter adapter("/baz"); + ServableData output = + adapter.AdaptOneVersion(ServableData({"foo", 42}, "bar")); + EXPECT_EQ("foo", output.id().name); + EXPECT_EQ(42, output.id().version); + EXPECT_EQ("/baz/bar", output.DataOrDie()); + } + + { + PrefixStoragePathSourceAdapter adapter("/baz/"); + ServableData output = + adapter.AdaptOneVersion(ServableData({"foo", 42}, "bar")); + EXPECT_EQ("foo", output.id().name); + EXPECT_EQ(42, output.id().version); + EXPECT_EQ("/baz/bar", output.DataOrDie()); + } +} + +} // namespace +} // namespace serving +} // namespace tensorflow diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 12b2ab9bdd0..e37003626e4 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -79,6 +79,7 @@ cc_library( "//tensorflow_serving/core:aspired_versions_manager", "//tensorflow_serving/core:dynamic_source_router", "//tensorflow_serving/core:load_servables_fast", + "//tensorflow_serving/core:prefix_storage_path_source_adapter", "//tensorflow_serving/core:servable_state_monitor", "//tensorflow_serving/core:server_request_logger", "//tensorflow_serving/core:source", diff --git a/tensorflow_serving/model_servers/server_core.cc b/tensorflow_serving/model_servers/server_core.cc index cdc1e7e834e..2e7e0acbc8c 100644 --- a/tensorflow_serving/model_servers/server_core.cc +++ b/tensorflow_serving/model_servers/server_core.cc @@ -340,8 +340,9 @@ Status ServerCore::AddModelsViaModelConfigList() { std::unique_ptr> router; TF_RETURN_IF_ERROR(CreateRouter(routes, &adapters, &router)); std::unique_ptr source; - TF_RETURN_IF_ERROR( - CreateStoragePathSource(source_config, router.get(), &source)); + std::unique_ptr prefix_source_adapter; + TF_RETURN_IF_ERROR(CreateStoragePathSource( + source_config, router.get(), &source, &prefix_source_adapter)); // Connect the adapters to the manager, and wait for the models to load. TF_RETURN_IF_ERROR(ConnectAdaptersToManagerAndAwaitModelLoads(&adapters)); @@ -349,6 +350,9 @@ Status ServerCore::AddModelsViaModelConfigList() { // Stow the source components. storage_path_source_and_router_ = {source.get(), router.get()}; manager_.AddDependency(std::move(source)); + if (prefix_source_adapter != nullptr) { + manager_.AddDependency(std::move(prefix_source_adapter)); + } manager_.AddDependency(std::move(router)); for (auto& entry : adapters.platform_adapters) { auto& adapter = entry.second; @@ -601,14 +605,22 @@ Status ServerCore::CreateStoragePathRoutes( Status ServerCore::CreateStoragePathSource( const FileSystemStoragePathSourceConfig& config, Target* target, - std::unique_ptr* source) const { + std::unique_ptr* source, + std::unique_ptr* prefix_source_adapter) { const Status status = FileSystemStoragePathSource::Create(config, source); if (!status.ok()) { VLOG(1) << "Unable to create FileSystemStoragePathSource due to: " << status; return status; } - ConnectSourceToTarget(source->get(), target); + if (options_.storage_path_prefix.empty()) { + ConnectSourceToTarget(source->get(), target); + } else { + *prefix_source_adapter = absl::make_unique( + options_.storage_path_prefix); + ConnectSourceToTarget(source->get(), prefix_source_adapter->get()); + ConnectSourceToTarget(prefix_source_adapter->get(), target); + } return Status::OK(); } diff --git a/tensorflow_serving/model_servers/server_core.h b/tensorflow_serving/model_servers/server_core.h index 0a7630616ce..430dcc9a7a4 100644 --- a/tensorflow_serving/model_servers/server_core.h +++ b/tensorflow_serving/model_servers/server_core.h @@ -35,6 +35,7 @@ limitations under the License. #include "tensorflow_serving/config/platform_config.pb.h" #include "tensorflow_serving/core/aspired_versions_manager.h" #include "tensorflow_serving/core/dynamic_source_router.h" +#include "tensorflow_serving/core/prefix_storage_path_source_adapter.h" #include "tensorflow_serving/core/servable_state_monitor.h" #include "tensorflow_serving/core/server_request_logger.h" #include "tensorflow_serving/core/source.h" @@ -186,6 +187,9 @@ class ServerCore : public Manager { internal::PredictResponseTensorSerializationOption predict_response_tensor_serialization_option = internal::PredictResponseTensorSerializationOption::kAsProtoField; + + // The prefix to append to the file system storage paths. + std::string storage_path_prefix; }; virtual ~ServerCore() = default; @@ -307,12 +311,13 @@ class ServerCore : public Manager { Status WaitUntilModelsAvailable(const std::set& models, ServableStateMonitor* monitor); - // Creates a FileSystemStoragePathSource and connects it to the supplied - // target. + // Creates a FileSystemStoragePathSource and an optional + // PrefixStoragePathSourceAdapter, and connects them to the supplied target. Status CreateStoragePathSource( const FileSystemStoragePathSourceConfig& config, Target* target, - std::unique_ptr* source) const + std::unique_ptr* source, + std::unique_ptr* prefix_source_adapter) EXCLUSIVE_LOCKS_REQUIRED(config_mu_); // The source adapters to deploy, to handle the configured platforms as well diff --git a/tensorflow_serving/model_servers/server_core_test.cc b/tensorflow_serving/model_servers/server_core_test.cc index 4307a7a51f5..882e67ae018 100644 --- a/tensorflow_serving/model_servers/server_core_test.cc +++ b/tensorflow_serving/model_servers/server_core_test.cc @@ -16,6 +16,7 @@ limitations under the License. #include "tensorflow_serving/model_servers/server_core.h" #include "google/protobuf/any.pb.h" +#include "absl/strings/strip.h" #include "tensorflow/cc/saved_model/tag_constants.h" #include "tensorflow/core/lib/core/error_codes.pb.h" #include "tensorflow/core/lib/core/status.h" @@ -23,6 +24,7 @@ limitations under the License. #include "tensorflow/core/lib/io/path.h" #include "tensorflow/core/lib/random/random.h" #include "tensorflow/core/lib/strings/stringprintf.h" +#include "tensorflow/core/platform/path.h" #include "tensorflow_serving/apis/model.pb.h" #include "tensorflow_serving/apis/predict.pb.h" #include "tensorflow_serving/core/servable_handle.h" @@ -877,6 +879,44 @@ TEST_P(ServerCoreTest, VersionLabelsNotAllowed) { ::testing::HasSubstr("Model version labels are not currently allowed")); } +TEST_P(ServerCoreTest, StoragePathPrefixOption) { + if (PrefixPathsWithURIScheme()) { + return; + } + if (GetTestType() != SAVED_MODEL) { + return; + } + + // Remove the path prefix from model base path in the ModelServerConfig, and + // add the prefix to ServerCore::Option::storage_path_prefix. + ModelServerConfig config = GetTestModelServerConfigForFakePlatform(); + string base_path = config.model_config_list().config(0).base_path(); + const string path_prefix = tensorflow::io::JoinPath( + getenv("TEST_SRCDIR"), "tf_serving/external/org_tensorflow/tensorflow/"); + config.mutable_model_config_list()->mutable_config(0)->set_base_path( + string(absl::StripPrefix(base_path, path_prefix))); + ServerCore::Options options = GetDefaultOptions(); + options.storage_path_prefix = path_prefix; + std::unique_ptr server_core; + TF_ASSERT_OK(CreateServerCore(GetTestModelServerConfigForFakePlatform(), + std::move(options), &server_core)); + + const std::vector available_servables = + server_core->ListAvailableServableIds(); + ASSERT_EQ(available_servables.size(), 1); + const ServableId expected_id = {test_util::kTestModelName, + test_util::kTestModelVersion}; + EXPECT_EQ(available_servables.at(0), expected_id); + + ModelSpec model_spec; + model_spec.set_name(test_util::kTestModelName); + model_spec.mutable_version()->set_value(test_util::kTestModelVersion); + ServableHandle servable_handle; + TF_ASSERT_OK( + server_core->GetServableHandle(model_spec, &servable_handle)); + EXPECT_EQ(servable_handle.id(), expected_id); +} + INSTANTIATE_TEST_CASE_P( TestType, ServerCoreTest, ::testing::Combine( From b052238fe06a03b82cefd82b4245fc7d425bbdc8 Mon Sep 17 00:00:00 2001 From: Mingming Liu Date: Mon, 9 Dec 2019 13:11:10 -0800 Subject: [PATCH 3628/8103] Internal change. PiperOrigin-RevId: 284618934 --- tensorflow_serving/example/mnist_client.py | 3 +-- tensorflow_serving/example/resnet_client_grpc.py | 3 +-- tensorflow_serving/example/resnet_warmup.py | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/tensorflow_serving/example/mnist_client.py b/tensorflow_serving/example/mnist_client.py index 1972dca2344..81cfbbb8366 100644 --- a/tensorflow_serving/example/mnist_client.py +++ b/tensorflow_serving/example/mnist_client.py @@ -35,7 +35,6 @@ import grpc import numpy import tensorflow as tf -from tensorflow.contrib import util as contrib_util from tensorflow_serving.apis import predict_pb2 from tensorflow_serving.apis import prediction_service_pb2_grpc @@ -147,7 +146,7 @@ def do_inference(hostport, work_dir, concurrency, num_tests): request.model_spec.signature_name = 'predict_images' image, label = test_data_set.next_batch(1) request.inputs['images'].CopyFrom( - contrib_util.make_tensor_proto(image[0], shape=[1, image[0].size])) + tf.make_tensor_proto(image[0], shape=[1, image[0].size])) result_counter.throttle() result_future = stub.Predict.future(request, 5.0) # 5 seconds result_future.add_done_callback( diff --git a/tensorflow_serving/example/resnet_client_grpc.py b/tensorflow_serving/example/resnet_client_grpc.py index 81545f7d078..4c905a30cf6 100644 --- a/tensorflow_serving/example/resnet_client_grpc.py +++ b/tensorflow_serving/example/resnet_client_grpc.py @@ -23,7 +23,6 @@ import grpc import requests import tensorflow as tf -from tensorflow.contrib import util as contrib_util from tensorflow_serving.apis import predict_pb2 from tensorflow_serving.apis import prediction_service_pb2_grpc @@ -55,7 +54,7 @@ def main(_): request.model_spec.name = 'resnet' request.model_spec.signature_name = 'serving_default' request.inputs['image_bytes'].CopyFrom( - contrib_util.make_tensor_proto(data, shape=[1])) + tf.make_tensor_proto(data, shape=[1])) result = stub.Predict(request, 10.0) # 10 secs timeout print(result) diff --git a/tensorflow_serving/example/resnet_warmup.py b/tensorflow_serving/example/resnet_warmup.py index 8a8159a0460..bdc78fa2b01 100644 --- a/tensorflow_serving/example/resnet_warmup.py +++ b/tensorflow_serving/example/resnet_warmup.py @@ -37,7 +37,6 @@ import sys import requests import tensorflow as tf -from tensorflow.contrib import util as contrib_util from tensorflow_serving.apis import predict_pb2 from tensorflow_serving.apis import prediction_log_pb2 @@ -79,7 +78,7 @@ def main(): request.model_spec.name = 'resnet' request.model_spec.signature_name = 'serving_default' request.inputs['image_bytes'].CopyFrom( - contrib_util.make_tensor_proto(data, shape=[1])) + tf.make_tensor_proto(data, shape=[1])) log = prediction_log_pb2.PredictionLog( predict_log=prediction_log_pb2.PredictLog(request=request)) From 8a0895eb8127941b2e9dada20718dd28f3dbaee1 Mon Sep 17 00:00:00 2001 From: Derek Murray Date: Mon, 16 Dec 2019 14:17:03 -0800 Subject: [PATCH 3629/8103] Switch users of `tensorflow::Env::Now*()` to `EnvTime::Now*()`. PiperOrigin-RevId: 285848396 --- tensorflow_serving/batching/batching_session.cc | 6 +++--- .../servables/tensorflow/saved_model_warmup.cc | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tensorflow_serving/batching/batching_session.cc b/tensorflow_serving/batching/batching_session.cc index 689adc418a4..3866f329a33 100644 --- a/tensorflow_serving/batching/batching_session.cc +++ b/tensorflow_serving/batching/batching_session.cc @@ -277,7 +277,7 @@ Status BatchingSession::Run( // We have a Run() call that doesn't match one of our batching signatures. // Run it in-line. static uint64 last_log_message_secs = 0; - uint64 now_secs = Env::Default()->NowSeconds(); + uint64 now_secs = EnvTime::NowSeconds(); // The time check is not strictly thread safe, but it doesn't matter. if (now_secs - last_log_message_secs >= 120) { LOG(WARNING) << "Request doesn't match any declared signature. Bypassing " @@ -296,7 +296,7 @@ Status BatchingSession::Run( Notification done; Status status; auto task = std::unique_ptr(new BatchingSessionTask); - task->enqueue_time_micros = Env::Default()->NowMicros(); + task->enqueue_time_micros = EnvTime::NowMicros(); task->run_options = run_options; TF_RETURN_IF_ERROR(ComputeInputSize(inputs, &task->zeroth_dim_size)); task->inputs = &inputs; @@ -551,7 +551,7 @@ void BatchingSession::ProcessBatch( return; } - const uint64 dequeue_time_micros = Env::Default()->NowMicros(); + const uint64 dequeue_time_micros = EnvTime::NowMicros(); // Regardless of the outcome, we need to propagate the status to the // individual tasks and signal that they are done. We use MakeCleanup() to diff --git a/tensorflow_serving/servables/tensorflow/saved_model_warmup.cc b/tensorflow_serving/servables/tensorflow/saved_model_warmup.cc index e2d7eb6a3e1..28a8d871cf3 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_warmup.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_warmup.cc @@ -46,7 +46,7 @@ auto* model_warm_up_latency = monitoring::Sampler<2>::New( monitoring::Buckets::Exponential(10, 1.8, 33)); uint64 GetLatencyMicroseconds(const uint64 start_microseconds) { - const uint64 end_microseconds = Env::Default()->NowMicros(); + const uint64 end_microseconds = EnvTime::NowMicros(); // Avoid clock skew. if (end_microseconds < start_microseconds) return 0; return end_microseconds - start_microseconds; @@ -97,7 +97,7 @@ constexpr int WarmupConsts::kMaxNumRecords; Status RunSavedModelWarmup(const ModelWarmupOptions& model_warmup_options, const RunOptions& run_options, const string& export_dir, SavedModelBundle* bundle) { - const uint64 start_microseconds = Env::Default()->NowMicros(); + const uint64 start_microseconds = EnvTime::NowMicros(); const string warmup_path = io::JoinPath(export_dir, kSavedModelAssetsExtraDirectory, WarmupConsts::kRequestsFileName); From 495e15bbd0f431fa2e93c79cc216f6dbcfc9b6a6 Mon Sep 17 00:00:00 2001 From: Amit Patankar Date: Tue, 17 Dec 2019 19:15:15 -0800 Subject: [PATCH 3630/8103] Update the serving model test to use `profiler_client.start_tracing` instead of `pywrap_tensorflow.TFE_ProfilerClientStartTracing`. PiperOrigin-RevId: 286108496 --- .../model_servers/tensorflow_model_server_test.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/tensorflow_serving/model_servers/tensorflow_model_server_test.py b/tensorflow_serving/model_servers/tensorflow_model_server_test.py index 82225ce94dd..1ec5ed5a091 100644 --- a/tensorflow_serving/model_servers/tensorflow_model_server_test.py +++ b/tensorflow_serving/model_servers/tensorflow_model_server_test.py @@ -30,7 +30,7 @@ from six.moves import range import tensorflow as tf -from tensorflow.python import pywrap_tensorflow +from tensorflow.python.eager import profiler_client from tensorflow.python.platform import flags from tensorflow.python.saved_model import signature_constants from tensorflow_serving.apis import classification_pb2 @@ -701,17 +701,13 @@ def test_profiler_service_with_valid_trace_request(self): os.makedirs(logdir) # Send a tracing request - trace_status = pywrap_tensorflow.TFE_ProfilerClientStartTracing( - grpc_addr, logdir, worker_list, include_dataset_ops, duration_ms, - num_tracing_attempts) + profiler_client.start_tracing(grpc_addr, logdir, duration_ms, worker_list, + include_dataset_ops, num_tracing_attempts) # Log stdout & stderr of subprocess issuing predict requests for debugging out, err = proc.communicate() print("stdout: '{}' | stderr: '{}'".format(out, err)) - # Validate the tracing request succeeded (OK status) - self.assertTrue(trace_status) - if __name__ == '__main__': tf.enable_eager_execution() From fb3c70dc8a44720df870d733f885f6a29e5b6a88 Mon Sep 17 00:00:00 2001 From: Pedram Pejman Date: Mon, 23 Dec 2019 15:06:54 -0800 Subject: [PATCH 3631/8103] moves tf.app to use compat.v1 PiperOrigin-RevId: 286948408 --- tensorflow_serving/example/mnist_client.py | 2 +- .../example/mnist_saved_model.py | 81 +++++++++++-------- .../example/resnet_client_grpc.py | 2 +- 3 files changed, 49 insertions(+), 36 deletions(-) diff --git a/tensorflow_serving/example/mnist_client.py b/tensorflow_serving/example/mnist_client.py index 81cfbbb8366..3768ff39d75 100644 --- a/tensorflow_serving/example/mnist_client.py +++ b/tensorflow_serving/example/mnist_client.py @@ -167,4 +167,4 @@ def main(_): if __name__ == '__main__': - tf.app.run() + tf.compat.v1.app.run() diff --git a/tensorflow_serving/example/mnist_saved_model.py b/tensorflow_serving/example/mnist_saved_model.py index 7d2028f3c4d..3f3672b27e2 100644 --- a/tensorflow_serving/example/mnist_saved_model.py +++ b/tensorflow_serving/example/mnist_saved_model.py @@ -33,15 +33,19 @@ # This is a placeholder for a Google-internal import. import tensorflow as tf -from tensorflow.contrib import lookup as contrib_lookup + +from tensorflow.python.ops import lookup_ops import mnist_input_data -tf.app.flags.DEFINE_integer('training_iteration', 1000, - 'number of training iterations.') -tf.app.flags.DEFINE_integer('model_version', 1, 'version number of the model.') -tf.app.flags.DEFINE_string('work_dir', '/tmp', 'Working directory.') -FLAGS = tf.app.flags.FLAGS +tf.compat.v1.app.flags.DEFINE_integer('training_iteration', 1000, + 'number of training iterations.') +tf.compat.v1.app.flags.DEFINE_integer('model_version', 1, + 'version number of the model.') +tf.compat.v1.app.flags.DEFINE_string('work_dir', '/tmp', 'Working directory.') +FLAGS = tf.compat.v1.app.flags.FLAGS + +tf.compat.v1.disable_eager_execution() def main(_): @@ -59,27 +63,30 @@ def main(_): # Train model print('Training model...') mnist = mnist_input_data.read_data_sets(FLAGS.work_dir, one_hot=True) - sess = tf.InteractiveSession() - serialized_tf_example = tf.placeholder(tf.string, name='tf_example') - feature_configs = {'x': tf.FixedLenFeature(shape=[784], dtype=tf.float32),} - tf_example = tf.parse_example(serialized_tf_example, feature_configs) + sess = tf.compat.v1.InteractiveSession() + serialized_tf_example = tf.compat.v1.placeholder(tf.string, name='tf_example') + feature_configs = { + 'x': tf.io.FixedLenFeature(shape=[784], dtype=tf.float32), + } + tf_example = tf.io.parse_example(serialized_tf_example, feature_configs) x = tf.identity(tf_example['x'], name='x') # use tf.identity() to assign name - y_ = tf.placeholder('float', shape=[None, 10]) + y_ = tf.compat.v1.placeholder('float', shape=[None, 10]) w = tf.Variable(tf.zeros([784, 10])) b = tf.Variable(tf.zeros([10])) - sess.run(tf.global_variables_initializer()) + sess.run(tf.compat.v1.global_variables_initializer()) y = tf.nn.softmax(tf.matmul(x, w) + b, name='y') - cross_entropy = -tf.reduce_sum(y_ * tf.log(y)) - train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy) + cross_entropy = -tf.math.reduce_sum(y_ * tf.math.log(y)) + train_step = tf.compat.v1.train.GradientDescentOptimizer(0.01).minimize( + cross_entropy) values, indices = tf.nn.top_k(y, 10) - table = contrib_lookup.index_to_string_table_from_tensor( + table = lookup_ops.index_to_string_table_from_tensor( tf.constant([str(i) for i in range(10)])) - prediction_classes = table.lookup(tf.to_int64(indices)) + prediction_classes = table.lookup(tf.dtypes.cast(indices, tf.int64)) for _ in range(FLAGS.training_iteration): batch = mnist.train.next_batch(50) train_step.run(feed_dict={x: batch[0], y_: batch[1]}) correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)) - accuracy = tf.reduce_mean(tf.cast(correct_prediction, 'float')) + accuracy = tf.math.reduce_mean(tf.cast(correct_prediction, 'float')) print('training accuracy %g' % sess.run( accuracy, feed_dict={ x: mnist.test.images, @@ -96,47 +103,53 @@ def main(_): tf.compat.as_bytes(export_path_base), tf.compat.as_bytes(str(FLAGS.model_version))) print('Exporting trained model to', export_path) - builder = tf.saved_model.builder.SavedModelBuilder(export_path) + builder = tf.compat.v1.saved_model.builder.SavedModelBuilder(export_path) # Build the signature_def_map. - classification_inputs = tf.saved_model.utils.build_tensor_info( + classification_inputs = tf.compat.v1.saved_model.utils.build_tensor_info( serialized_tf_example) - classification_outputs_classes = tf.saved_model.utils.build_tensor_info( + classification_outputs_classes = tf.compat.v1.saved_model.utils.build_tensor_info( prediction_classes) - classification_outputs_scores = tf.saved_model.utils.build_tensor_info(values) + classification_outputs_scores = tf.compat.v1.saved_model.utils.build_tensor_info( + values) classification_signature = ( - tf.saved_model.signature_def_utils.build_signature_def( + tf.compat.v1.saved_model.signature_def_utils.build_signature_def( inputs={ - tf.saved_model.signature_constants.CLASSIFY_INPUTS: + tf.compat.v1.saved_model.signature_constants.CLASSIFY_INPUTS: classification_inputs }, outputs={ - tf.saved_model.signature_constants.CLASSIFY_OUTPUT_CLASSES: + tf.compat.v1.saved_model.signature_constants + .CLASSIFY_OUTPUT_CLASSES: classification_outputs_classes, - tf.saved_model.signature_constants.CLASSIFY_OUTPUT_SCORES: + tf.compat.v1.saved_model.signature_constants + .CLASSIFY_OUTPUT_SCORES: classification_outputs_scores }, - method_name=tf.saved_model.signature_constants.CLASSIFY_METHOD_NAME)) + method_name=tf.compat.v1.saved_model.signature_constants + .CLASSIFY_METHOD_NAME)) - tensor_info_x = tf.saved_model.utils.build_tensor_info(x) - tensor_info_y = tf.saved_model.utils.build_tensor_info(y) + tensor_info_x = tf.compat.v1.saved_model.utils.build_tensor_info(x) + tensor_info_y = tf.compat.v1.saved_model.utils.build_tensor_info(y) prediction_signature = ( - tf.saved_model.signature_def_utils.build_signature_def( + tf.compat.v1.saved_model.signature_def_utils.build_signature_def( inputs={'images': tensor_info_x}, outputs={'scores': tensor_info_y}, - method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME)) + method_name=tf.compat.v1.saved_model.signature_constants + .PREDICT_METHOD_NAME)) builder.add_meta_graph_and_variables( - sess, [tf.saved_model.tag_constants.SERVING], + sess, [tf.compat.v1.saved_model.tag_constants.SERVING], signature_def_map={ 'predict_images': prediction_signature, - tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: + tf.compat.v1.saved_model.signature_constants + .DEFAULT_SERVING_SIGNATURE_DEF_KEY: classification_signature, }, - main_op=tf.tables_initializer(), + main_op=tf.compat.v1.tables_initializer(), strip_default_attrs=True) builder.save() @@ -145,4 +158,4 @@ def main(_): if __name__ == '__main__': - tf.app.run() + tf.compat.v1.app.run() diff --git a/tensorflow_serving/example/resnet_client_grpc.py b/tensorflow_serving/example/resnet_client_grpc.py index 4c905a30cf6..1388e9a6a9d 100644 --- a/tensorflow_serving/example/resnet_client_grpc.py +++ b/tensorflow_serving/example/resnet_client_grpc.py @@ -60,4 +60,4 @@ def main(_): if __name__ == '__main__': - tf.app.run() + tf.compat.v1.app.run() From e8d5ec5ae939b37144420f1dcabc00eedc316bcc Mon Sep 17 00:00:00 2001 From: Haiming Bao Date: Thu, 2 Jan 2020 15:34:13 -0800 Subject: [PATCH 3632/8103] Migrates tf.app to use compat.v1 PiperOrigin-RevId: 287905933 --- tensorflow_serving/example/mnist_client.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tensorflow_serving/example/mnist_client.py b/tensorflow_serving/example/mnist_client.py index 3768ff39d75..d691bf4e38b 100644 --- a/tensorflow_serving/example/mnist_client.py +++ b/tensorflow_serving/example/mnist_client.py @@ -41,11 +41,12 @@ import mnist_input_data -tf.app.flags.DEFINE_integer('concurrency', 1, - 'maximum number of concurrent inference requests') -tf.app.flags.DEFINE_integer('num_tests', 100, 'Number of test images') -tf.app.flags.DEFINE_string('server', '', 'PredictionService host:port') -tf.app.flags.DEFINE_string('work_dir', '/tmp', 'Working directory. ') +tf.compat.v1.app.flags.DEFINE_integer( + 'concurrency', 1, 'maximum number of concurrent inference requests') +tf.compat.v1.app.flags.DEFINE_integer('num_tests', 100, 'Number of test images') +tf.compat.v1.app.flags.DEFINE_string('server', '', + 'PredictionService host:port') +tf.compat.v1.app.flags.DEFINE_string('work_dir', '/tmp', 'Working directory. ') FLAGS = tf.app.flags.FLAGS From 46fbcb2ca93f46ff18dee4be9dcde74f9a43df6f Mon Sep 17 00:00:00 2001 From: Haiming Bao Date: Mon, 6 Jan 2020 12:58:51 -0800 Subject: [PATCH 3633/8103] Automated rollback of commit e8d5ec5ae939b37144420f1dcabc00eedc316bcc PiperOrigin-RevId: 288357844 --- tensorflow_serving/example/mnist_client.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/tensorflow_serving/example/mnist_client.py b/tensorflow_serving/example/mnist_client.py index d691bf4e38b..3768ff39d75 100644 --- a/tensorflow_serving/example/mnist_client.py +++ b/tensorflow_serving/example/mnist_client.py @@ -41,12 +41,11 @@ import mnist_input_data -tf.compat.v1.app.flags.DEFINE_integer( - 'concurrency', 1, 'maximum number of concurrent inference requests') -tf.compat.v1.app.flags.DEFINE_integer('num_tests', 100, 'Number of test images') -tf.compat.v1.app.flags.DEFINE_string('server', '', - 'PredictionService host:port') -tf.compat.v1.app.flags.DEFINE_string('work_dir', '/tmp', 'Working directory. ') +tf.app.flags.DEFINE_integer('concurrency', 1, + 'maximum number of concurrent inference requests') +tf.app.flags.DEFINE_integer('num_tests', 100, 'Number of test images') +tf.app.flags.DEFINE_string('server', '', 'PredictionService host:port') +tf.app.flags.DEFINE_string('work_dir', '/tmp', 'Working directory. ') FLAGS = tf.app.flags.FLAGS From 83ca96f1fa9344e381ce2aa95742e4d877031127 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Tue, 14 Jan 2020 10:30:12 -0800 Subject: [PATCH 3634/8103] Add test for flex op. PiperOrigin-RevId: 289680362 --- tensorflow_serving/servables/tensorflow/BUILD | 2 + .../tensorflow/bundle_factory_util_test.cc | 28 ++++ .../tensorflow/tflite_session_test.cc | 144 ++++++++++++++++-- 3 files changed, 164 insertions(+), 10 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index 4095cfd4923..0dbdd20c955 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -412,10 +412,12 @@ cc_test( ":tflite_session_lib", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", + "@flatbuffers", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", "@org_tensorflow//tensorflow/core:testlib", + "@org_tensorflow//tensorflow/lite:util", ], ) diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc b/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc index 1c4f52503b8..ffc417545e8 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc @@ -23,10 +23,12 @@ limitations under the License. #include "google/protobuf/wrappers.pb.h" #include #include +#include "tensorflow/core/framework/tensor_testutil.h" #include "tensorflow/core/kernels/batching_util/shared_batch_scheduler.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/lib/core/status_test_util.h" #include "tensorflow/core/lib/io/path.h" +#include "tensorflow/core/platform/test_benchmark.h" #include "tensorflow/core/protobuf/config.pb.h" #include "tensorflow/core/public/session.h" #include "tensorflow/core/public/session_options.h" @@ -169,6 +171,32 @@ TEST_F(BundleFactoryUtilTest, EstimateResourceFromPathWithFileProbingEnv) { EXPECT_THAT(actual, EqualsProto(expected)); } +#ifdef PLATFORM_GOOGLE +// This benchmark relies on https://github.com/google/benchmark features, +// not available in open-sourced TF codebase. + +void BM_HalfPlusTwo(benchmark::State& state) { + static Session* session; + if (state.thread_index() == 0) { + SavedModelBundle bundle; + TF_ASSERT_OK(LoadSavedModel(SessionOptions(), RunOptions(), + test_util::GetTestSavedModelPath(), {"serve"}, + &bundle)); + TF_ASSERT_OK(WrapSession(&bundle.session)); + session = bundle.session.release(); + } + Tensor input = test::AsTensor({1.0, 2.0, 3.0}, TensorShape({3})); + std::vector outputs; + testing::UseRealTime(); + for (auto _ : state) { + outputs.clear(); + TF_ASSERT_OK(session->Run({{"x:0", input}}, {"y:0"}, {}, &outputs)); + } +} +BENCHMARK(BM_HalfPlusTwo)->ThreadRange(1, 64); + +#endif // PLATFORM_GOOGLE + } // namespace } // namespace serving } // namespace tensorflow diff --git a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc index 8a4f0aa5f79..8f7b483401f 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc @@ -21,11 +21,16 @@ limitations under the License. #include #include +#include "flatbuffers/flexbuffers.h" +#include "tensorflow/core/framework/attr_value.pb.h" +#include "tensorflow/core/framework/node_def.pb.h" #include "tensorflow/core/framework/tensor_testutil.h" #include "tensorflow/core/framework/types.pb.h" #include "tensorflow/core/lib/core/status_test_util.h" #include "tensorflow/core/platform/env.h" #include "tensorflow/core/platform/logging.h" +#include "tensorflow/core/platform/test_benchmark.h" +#include "tensorflow/lite/util.h" #include "tensorflow/lite/version.h" #include "tensorflow_serving/test_util/test_util.h" @@ -97,14 +102,27 @@ constexpr char kTestModelInputList[] = "list"; constexpr char kTestModelInputShape[] = "shape"; constexpr char kTestModelOutput[] = "output"; +tensorflow::DataType ToTfTensorType(tflite::TensorType tflite_type) { + switch (tflite_type) { + case tflite::TensorType_INT32: + return tensorflow::DT_INT32; + case tflite::TensorType_STRING: + return tensorflow::DT_STRING; + default: + LOG(FATAL) << "Unsupported tflite type: " << tflite_type; + } +} + // Returns a serialized FlatBuffer tflite model. // // The model has two inputs (kTestModelInputList|Shape) and one output // kTestModelOutput. The output is list that is reshaped to shape via // tf.reshape operator. // -// Elements of list are expected to be of `tensor_type` type. -string BuildTestModel(tflite::TensorType tensor_type) { +// Elements of list are expected to be of `tensor_type` type. `use_flex_op` +// sets up the model to use the `Reshape` *flex* op as opposed to using the +// builtin `Reshape` op from TF Lite. +string BuildTestModel(tflite::TensorType tensor_type, bool use_flex_op) { std::vector inputs; std::vector outputs; std::vector> tensors; @@ -135,15 +153,40 @@ string BuildTestModel(tflite::TensorType tensor_type) { /*quantization=*/0, /*is_variable=*/false)); // Add reshape operator. - opcodes.push_back( - CreateOperatorCode(builder, tflite::BuiltinOperator_RESHAPE, 0)); + tflite::BuiltinOptions builtin_opts_type = + tflite::BuiltinOptions_ReshapeOptions; + flatbuffers::Offset reshape_opts = + tflite::CreateReshapeOptions(builder, builder.CreateVector({})) + .Union(); + flatbuffers::Offset> custom_opts = 0; + if (use_flex_op) { + string flexop = std::string(tflite::kFlexCustomCodePrefix) + "Reshape"; + opcodes.push_back(CreateOperatorCodeDirect( + builder, tflite::BuiltinOperator_CUSTOM, flexop.data())); + builtin_opts_type = tflite::BuiltinOptions_NONE; + reshape_opts = 0; + NodeDef node_def; + node_def.set_name("Reshape"); + node_def.set_op("Reshape"); + (*node_def.mutable_attr())["T"].set_type(ToTfTensorType(tensor_type)); + string node_def_str; + CHECK(node_def.SerializeToString(&node_def_str)); + auto flex_builder = absl::make_unique(); + flex_builder->Vector([&]() { + flex_builder->String(node_def.op()); + flex_builder->String(node_def_str); + }); + flex_builder->Finish(); + custom_opts = builder.CreateVector(flex_builder->GetBuffer()); + } else { + opcodes.push_back( + CreateOperatorCode(builder, tflite::BuiltinOperator_RESHAPE, 0)); + } + operators.push_back(CreateOperator( builder, /*opcode_index=*/0, builder.CreateVector(inputs), - builder.CreateVector(outputs), - tflite::BuiltinOptions_ReshapeOptions, - tflite::CreateReshapeOptions(builder, builder.CreateVector({})) - .Union(), - /*custom_options=*/0, tflite::CustomOptionsFormat_FLEXBUFFERS)); + builder.CreateVector(outputs), builtin_opts_type, reshape_opts, + custom_opts, tflite::CustomOptionsFormat_FLEXBUFFERS)); auto subgraph = CreateSubGraph(builder, builder.CreateVector(tensors), builder.CreateVector(inputs), @@ -159,7 +202,8 @@ string BuildTestModel(tflite::TensorType tensor_type) { } TEST(TfLiteSession, ProcessStrings) { - string model_bytes = BuildTestModel(tflite::TensorType_STRING); + string model_bytes = + BuildTestModel(tflite::TensorType_STRING, /*use_flex_op=*/false); ::google::protobuf::Map signatures; std::unique_ptr session; TF_EXPECT_OK( @@ -177,6 +221,86 @@ TEST(TfLiteSession, ProcessStrings) { test::AsTensor({"a", "b", "c", "d"}, TensorShape({2, 2}))); } +TEST(TfLiteSession, ProcessStringsFlex) { + string model_bytes = + BuildTestModel(tflite::TensorType_STRING, /*use_flex_op=*/true); + ::google::protobuf::Map signatures; + std::unique_ptr session; + TF_EXPECT_OK( + TfLiteSession::Create(std::move(model_bytes), &session, &signatures)); + Tensor input_list = + test::AsTensor({"a", "b", "c", "d"}, TensorShape({4})); + Tensor input_shape = test::AsTensor({2, 2}, TensorShape({2})); + std::vector outputs; + TF_EXPECT_OK(session->Run( + {{kTestModelInputList, input_list}, {kTestModelInputShape, input_shape}}, + {kTestModelOutput}, {}, &outputs)); + ASSERT_EQ(outputs.size(), 1); + test::ExpectTensorEqual( + outputs[0], + test::AsTensor({"a", "b", "c", "d"}, TensorShape({2, 2}))); +} + +#ifdef PLATFORM_GOOGLE +// These benchmarks rely on https://github.com/google/benchmark features, +// not available in open-sourced TF codebase. + +static void BM_Reshape(benchmark::State& state, bool use_flex_op) { + static TfLiteSession* session; + if (state.thread_index() == 0) { + string model_bytes = BuildTestModel(tflite::TensorType_INT32, use_flex_op); + ::google::protobuf::Map signatures; + std::unique_ptr sess; + TF_ASSERT_OK( + TfLiteSession::Create(std::move(model_bytes), &sess, &signatures)); + session = sess.release(); + } + Tensor input = test::AsTensor({1, 2, 3, 4, 5, 6}, TensorShape({6})); + Tensor input_shape = test::AsTensor({3, 2}, TensorShape({2})); + std::vector outputs; + testing::UseRealTime(); + for (auto _ : state) { + outputs.clear(); + TF_ASSERT_OK(session->Run( + {{kTestModelInputList, input}, {kTestModelInputShape, input_shape}}, + {kTestModelOutput}, {}, &outputs)); + } +} + +static void BM_Reshape_Builtin(benchmark::State& state) { + BM_Reshape(state, /*use_flex_op=*/false); +} +BENCHMARK(BM_Reshape_Builtin)->ThreadRange(1, 64); + +static void BM_Reshape_Flex(benchmark::State& state) { + BM_Reshape(state, /*use_flex_op=*/true); +} +BENCHMARK(BM_Reshape_Flex)->ThreadRange(1, 64); + +void BM_HalfPlusTwo(benchmark::State& state) { + static TfLiteSession* session; + if (state.thread_index() == 0) { + string model_bytes; + TF_ASSERT_OK(ReadFileToString( + Env::Default(), test_util::TestSrcDirPath(kTestModel), &model_bytes)); + ::google::protobuf::Map signatures; + std::unique_ptr sess; + TF_ASSERT_OK( + TfLiteSession::Create(std::move(model_bytes), &sess, &signatures)); + session = sess.release(); + } + Tensor input = test::AsTensor({1.0, 2.0, 3.0}, TensorShape({3})); + std::vector outputs; + testing::UseRealTime(); + for (auto _ : state) { + outputs.clear(); + TF_ASSERT_OK(session->Run({{"x", input}}, {"y"}, {}, &outputs)); + } +} +BENCHMARK(BM_HalfPlusTwo)->ThreadRange(1, 64); + +#endif // PLATFORM_GOOGLE + } // namespace } // namespace serving } // namespace tensorflow From b853dfef53d0b766a44d600824d5c7fa73845fff Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Tue, 14 Jan 2020 14:43:39 -0800 Subject: [PATCH 3635/8103] Automated rollback of commit 83ca96f1fa9344e381ce2aa95742e4d877031127 PiperOrigin-RevId: 289734496 --- tensorflow_serving/servables/tensorflow/BUILD | 2 - .../tensorflow/bundle_factory_util_test.cc | 28 ---- .../tensorflow/tflite_session_test.cc | 144 ++---------------- 3 files changed, 10 insertions(+), 164 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index 0dbdd20c955..4095cfd4923 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -412,12 +412,10 @@ cc_test( ":tflite_session_lib", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", - "@flatbuffers", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", "@org_tensorflow//tensorflow/core:testlib", - "@org_tensorflow//tensorflow/lite:util", ], ) diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc b/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc index ffc417545e8..1c4f52503b8 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc @@ -23,12 +23,10 @@ limitations under the License. #include "google/protobuf/wrappers.pb.h" #include #include -#include "tensorflow/core/framework/tensor_testutil.h" #include "tensorflow/core/kernels/batching_util/shared_batch_scheduler.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/lib/core/status_test_util.h" #include "tensorflow/core/lib/io/path.h" -#include "tensorflow/core/platform/test_benchmark.h" #include "tensorflow/core/protobuf/config.pb.h" #include "tensorflow/core/public/session.h" #include "tensorflow/core/public/session_options.h" @@ -171,32 +169,6 @@ TEST_F(BundleFactoryUtilTest, EstimateResourceFromPathWithFileProbingEnv) { EXPECT_THAT(actual, EqualsProto(expected)); } -#ifdef PLATFORM_GOOGLE -// This benchmark relies on https://github.com/google/benchmark features, -// not available in open-sourced TF codebase. - -void BM_HalfPlusTwo(benchmark::State& state) { - static Session* session; - if (state.thread_index() == 0) { - SavedModelBundle bundle; - TF_ASSERT_OK(LoadSavedModel(SessionOptions(), RunOptions(), - test_util::GetTestSavedModelPath(), {"serve"}, - &bundle)); - TF_ASSERT_OK(WrapSession(&bundle.session)); - session = bundle.session.release(); - } - Tensor input = test::AsTensor({1.0, 2.0, 3.0}, TensorShape({3})); - std::vector outputs; - testing::UseRealTime(); - for (auto _ : state) { - outputs.clear(); - TF_ASSERT_OK(session->Run({{"x:0", input}}, {"y:0"}, {}, &outputs)); - } -} -BENCHMARK(BM_HalfPlusTwo)->ThreadRange(1, 64); - -#endif // PLATFORM_GOOGLE - } // namespace } // namespace serving } // namespace tensorflow diff --git a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc index 8f7b483401f..8a4f0aa5f79 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc @@ -21,16 +21,11 @@ limitations under the License. #include #include -#include "flatbuffers/flexbuffers.h" -#include "tensorflow/core/framework/attr_value.pb.h" -#include "tensorflow/core/framework/node_def.pb.h" #include "tensorflow/core/framework/tensor_testutil.h" #include "tensorflow/core/framework/types.pb.h" #include "tensorflow/core/lib/core/status_test_util.h" #include "tensorflow/core/platform/env.h" #include "tensorflow/core/platform/logging.h" -#include "tensorflow/core/platform/test_benchmark.h" -#include "tensorflow/lite/util.h" #include "tensorflow/lite/version.h" #include "tensorflow_serving/test_util/test_util.h" @@ -102,27 +97,14 @@ constexpr char kTestModelInputList[] = "list"; constexpr char kTestModelInputShape[] = "shape"; constexpr char kTestModelOutput[] = "output"; -tensorflow::DataType ToTfTensorType(tflite::TensorType tflite_type) { - switch (tflite_type) { - case tflite::TensorType_INT32: - return tensorflow::DT_INT32; - case tflite::TensorType_STRING: - return tensorflow::DT_STRING; - default: - LOG(FATAL) << "Unsupported tflite type: " << tflite_type; - } -} - // Returns a serialized FlatBuffer tflite model. // // The model has two inputs (kTestModelInputList|Shape) and one output // kTestModelOutput. The output is list that is reshaped to shape via // tf.reshape operator. // -// Elements of list are expected to be of `tensor_type` type. `use_flex_op` -// sets up the model to use the `Reshape` *flex* op as opposed to using the -// builtin `Reshape` op from TF Lite. -string BuildTestModel(tflite::TensorType tensor_type, bool use_flex_op) { +// Elements of list are expected to be of `tensor_type` type. +string BuildTestModel(tflite::TensorType tensor_type) { std::vector inputs; std::vector outputs; std::vector> tensors; @@ -153,40 +135,15 @@ string BuildTestModel(tflite::TensorType tensor_type, bool use_flex_op) { /*quantization=*/0, /*is_variable=*/false)); // Add reshape operator. - tflite::BuiltinOptions builtin_opts_type = - tflite::BuiltinOptions_ReshapeOptions; - flatbuffers::Offset reshape_opts = - tflite::CreateReshapeOptions(builder, builder.CreateVector({})) - .Union(); - flatbuffers::Offset> custom_opts = 0; - if (use_flex_op) { - string flexop = std::string(tflite::kFlexCustomCodePrefix) + "Reshape"; - opcodes.push_back(CreateOperatorCodeDirect( - builder, tflite::BuiltinOperator_CUSTOM, flexop.data())); - builtin_opts_type = tflite::BuiltinOptions_NONE; - reshape_opts = 0; - NodeDef node_def; - node_def.set_name("Reshape"); - node_def.set_op("Reshape"); - (*node_def.mutable_attr())["T"].set_type(ToTfTensorType(tensor_type)); - string node_def_str; - CHECK(node_def.SerializeToString(&node_def_str)); - auto flex_builder = absl::make_unique(); - flex_builder->Vector([&]() { - flex_builder->String(node_def.op()); - flex_builder->String(node_def_str); - }); - flex_builder->Finish(); - custom_opts = builder.CreateVector(flex_builder->GetBuffer()); - } else { - opcodes.push_back( - CreateOperatorCode(builder, tflite::BuiltinOperator_RESHAPE, 0)); - } - + opcodes.push_back( + CreateOperatorCode(builder, tflite::BuiltinOperator_RESHAPE, 0)); operators.push_back(CreateOperator( builder, /*opcode_index=*/0, builder.CreateVector(inputs), - builder.CreateVector(outputs), builtin_opts_type, reshape_opts, - custom_opts, tflite::CustomOptionsFormat_FLEXBUFFERS)); + builder.CreateVector(outputs), + tflite::BuiltinOptions_ReshapeOptions, + tflite::CreateReshapeOptions(builder, builder.CreateVector({})) + .Union(), + /*custom_options=*/0, tflite::CustomOptionsFormat_FLEXBUFFERS)); auto subgraph = CreateSubGraph(builder, builder.CreateVector(tensors), builder.CreateVector(inputs), @@ -202,8 +159,7 @@ string BuildTestModel(tflite::TensorType tensor_type, bool use_flex_op) { } TEST(TfLiteSession, ProcessStrings) { - string model_bytes = - BuildTestModel(tflite::TensorType_STRING, /*use_flex_op=*/false); + string model_bytes = BuildTestModel(tflite::TensorType_STRING); ::google::protobuf::Map signatures; std::unique_ptr session; TF_EXPECT_OK( @@ -221,86 +177,6 @@ TEST(TfLiteSession, ProcessStrings) { test::AsTensor({"a", "b", "c", "d"}, TensorShape({2, 2}))); } -TEST(TfLiteSession, ProcessStringsFlex) { - string model_bytes = - BuildTestModel(tflite::TensorType_STRING, /*use_flex_op=*/true); - ::google::protobuf::Map signatures; - std::unique_ptr session; - TF_EXPECT_OK( - TfLiteSession::Create(std::move(model_bytes), &session, &signatures)); - Tensor input_list = - test::AsTensor({"a", "b", "c", "d"}, TensorShape({4})); - Tensor input_shape = test::AsTensor({2, 2}, TensorShape({2})); - std::vector outputs; - TF_EXPECT_OK(session->Run( - {{kTestModelInputList, input_list}, {kTestModelInputShape, input_shape}}, - {kTestModelOutput}, {}, &outputs)); - ASSERT_EQ(outputs.size(), 1); - test::ExpectTensorEqual( - outputs[0], - test::AsTensor({"a", "b", "c", "d"}, TensorShape({2, 2}))); -} - -#ifdef PLATFORM_GOOGLE -// These benchmarks rely on https://github.com/google/benchmark features, -// not available in open-sourced TF codebase. - -static void BM_Reshape(benchmark::State& state, bool use_flex_op) { - static TfLiteSession* session; - if (state.thread_index() == 0) { - string model_bytes = BuildTestModel(tflite::TensorType_INT32, use_flex_op); - ::google::protobuf::Map signatures; - std::unique_ptr sess; - TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &sess, &signatures)); - session = sess.release(); - } - Tensor input = test::AsTensor({1, 2, 3, 4, 5, 6}, TensorShape({6})); - Tensor input_shape = test::AsTensor({3, 2}, TensorShape({2})); - std::vector outputs; - testing::UseRealTime(); - for (auto _ : state) { - outputs.clear(); - TF_ASSERT_OK(session->Run( - {{kTestModelInputList, input}, {kTestModelInputShape, input_shape}}, - {kTestModelOutput}, {}, &outputs)); - } -} - -static void BM_Reshape_Builtin(benchmark::State& state) { - BM_Reshape(state, /*use_flex_op=*/false); -} -BENCHMARK(BM_Reshape_Builtin)->ThreadRange(1, 64); - -static void BM_Reshape_Flex(benchmark::State& state) { - BM_Reshape(state, /*use_flex_op=*/true); -} -BENCHMARK(BM_Reshape_Flex)->ThreadRange(1, 64); - -void BM_HalfPlusTwo(benchmark::State& state) { - static TfLiteSession* session; - if (state.thread_index() == 0) { - string model_bytes; - TF_ASSERT_OK(ReadFileToString( - Env::Default(), test_util::TestSrcDirPath(kTestModel), &model_bytes)); - ::google::protobuf::Map signatures; - std::unique_ptr sess; - TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &sess, &signatures)); - session = sess.release(); - } - Tensor input = test::AsTensor({1.0, 2.0, 3.0}, TensorShape({3})); - std::vector outputs; - testing::UseRealTime(); - for (auto _ : state) { - outputs.clear(); - TF_ASSERT_OK(session->Run({{"x", input}}, {"y"}, {}, &outputs)); - } -} -BENCHMARK(BM_HalfPlusTwo)->ThreadRange(1, 64); - -#endif // PLATFORM_GOOGLE - } // namespace } // namespace serving } // namespace tensorflow From 74107ae603011852f916ac0e24e1da3bc804c92f Mon Sep 17 00:00:00 2001 From: Chao Xie Date: Wed, 15 Jan 2020 14:03:15 -0800 Subject: [PATCH 3636/8103] Add release note for TFS 2.1 PiperOrigin-RevId: 289932342 --- RELEASE.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/RELEASE.md b/RELEASE.md index dbebd26b8fe..831c5230932 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,3 +1,19 @@ +# Release 2.1.0 + +## Major Features and Improvements +* Add integration with [TensorBoard profiler service](https://www.tensorflow.org/tensorboard). + +## Breaking Changes + +## Bug Fixes and Other Changes + +* Fix link for TFRecord in Saved Model Warmup documentation. (commit: 127a112a91bda3d7d3c3a56802632376bbe3e36e) +* Fix typo in http server log message. (commit: 509f6da062dc9b091ad6961a94740cf64e265c36) +* Be able to discard aspired-versions request from SourceRouter (commit: 10e4987502ee91fe74c6c179ed4ba52f17cc75b4) +* Use public tf.config APIs (commit: 87a4b2b28729bd269ab367742998b6f8426ea1b7) +* Fix copying of string tensor outputs by explicitly copying each (commit: 9544077bdb6eef9b20a0688a042155ee6dea011a) +* Migrate from std::string to tensorflow::tstring. (commit: e24571ac9ce390733f3b02188c7d740f08fff62d) + # Release 2.0.0 ## Major Features and Improvements From b1b6ffd7dfa654a4f4629519d902d958c07ee7c8 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Wed, 15 Jan 2020 14:10:10 -0800 Subject: [PATCH 3637/8103] Remove SessionBundle usage from regressor/classifier. SessionBundle is no longer supported. PiperOrigin-RevId: 289933993 --- tensorflow_serving/servables/tensorflow/BUILD | 4 - .../servables/tensorflow/classifier.cc | 156 ----- .../servables/tensorflow/classifier.h | 17 - .../servables/tensorflow/classifier_test.cc | 585 +++++------------- .../servables/tensorflow/regressor.cc | 93 --- .../servables/tensorflow/regressor.h | 16 - .../servables/tensorflow/regressor_test.cc | 516 +++++---------- 7 files changed, 303 insertions(+), 1084 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index 4095cfd4923..59d95b6246e 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -599,7 +599,6 @@ cc_library( "//tensorflow_serving/apis:classifier", "//tensorflow_serving/apis:input_cc_proto", "//tensorflow_serving/apis:model_cc_proto", - "//tensorflow_serving/session_bundle:session_bundle_util", "//tensorflow_serving/util:optional", "@org_tensorflow//tensorflow/cc/saved_model:loader_lite", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", @@ -620,7 +619,6 @@ cc_test( "//tensorflow_serving/apis:model_cc_proto", "//tensorflow_serving/core/test_util:mock_session", "//tensorflow_serving/core/test_util:test_main", - "//tensorflow_serving/session_bundle:session_bundle_util", "//tensorflow_serving/test_util", "//tensorflow_serving/util:optional", "@com_google_protobuf//:protobuf_lite", @@ -724,7 +722,6 @@ cc_library( "//tensorflow_serving/apis:model_cc_proto", "//tensorflow_serving/apis:regression_cc_proto", "//tensorflow_serving/apis:regressor", - "//tensorflow_serving/session_bundle:session_bundle_util", "//tensorflow_serving/util:optional", "@org_tensorflow//tensorflow/cc/saved_model:loader_lite", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", @@ -745,7 +742,6 @@ cc_test( "//tensorflow_serving/apis:regression_cc_proto", "//tensorflow_serving/core/test_util:mock_session", "//tensorflow_serving/core/test_util:test_main", - "//tensorflow_serving/session_bundle:session_bundle_util", "//tensorflow_serving/test_util", "//tensorflow_serving/util:optional", "@com_google_protobuf//:protobuf_lite", diff --git a/tensorflow_serving/servables/tensorflow/classifier.cc b/tensorflow_serving/servables/tensorflow/classifier.cc index 99b0afdf379..25999d30e30 100644 --- a/tensorflow_serving/servables/tensorflow/classifier.cc +++ b/tensorflow_serving/servables/tensorflow/classifier.cc @@ -36,125 +36,11 @@ limitations under the License. #include "tensorflow_serving/apis/input.pb.h" #include "tensorflow_serving/apis/model.pb.h" #include "tensorflow_serving/servables/tensorflow/util.h" -#include "tensorflow_serving/session_bundle/session_bundle_util.h" namespace tensorflow { namespace serving { namespace { -// Implementation of the ClassificationService using the legacy SessionBundle -// ClassificationSignature signature format. -class TensorFlowClassifier : public ClassifierInterface { - public: - explicit TensorFlowClassifier(Session* session, - const ClassificationSignature* signature) - : session_(session), signature_(signature) {} - - Status Classify(const ClassificationRequest& request, - ClassificationResult* result) override { - TRACELITERAL("TensorFlowClassifier::Classify"); - TRACELITERAL("ConvertInputTFEXamplesToTensor"); - // Setup the input Tensor to be a vector of string containing the serialized - // tensorflow.Example. - Tensor input_tensor; - TF_RETURN_IF_ERROR( - InputToSerializedExampleTensor(request.input(), &input_tensor)); - - const int num_examples = input_tensor.dim_size(0); - if (num_examples == 0) { - return errors::InvalidArgument("ClassificationRequest::input is empty."); - } - RecordRequestExampleCount(request.model_spec().name(), num_examples); - - TRACELITERAL("RunClassification"); - // Support serving models that return classes, scores or both. - std::unique_ptr classes; - if (!signature_->classes().tensor_name().empty()) { - classes.reset(new Tensor); - } - std::unique_ptr scores; - if (!signature_->scores().tensor_name().empty()) { - scores.reset(new Tensor); - } - - TF_RETURN_IF_ERROR(session_bundle::RunClassification( - *signature_, input_tensor, session_, classes.get(), scores.get())); - - // Validate classes output Tensor. - if (classes) { - if (classes->dims() != 2) { - return errors::InvalidArgument( - "Expected Tensor shape: [batch_size num_classes] but got ", - classes->shape().DebugString()); - } - if (classes->dtype() != DT_STRING) { - return errors::Internal("Expected classes Tensor of DT_STRING. Got: ", - DataType_Name(classes->dtype())); - } - if (classes->dim_size(0) != num_examples) { - return errors::Internal("Expected output batch size of ", num_examples, - ". Got: ", classes->dim_size(0)); - } - } - // Validate scores output Tensor. - if (scores) { - if (scores->dims() != 2) { - return errors::InvalidArgument( - "Expected Tensor shape: [batch_size num_classes] but got ", - scores->shape().DebugString()); - } - if (scores->dtype() != DT_FLOAT) { - return errors::Internal("Expected scores Tensor of DT_FLOAT. Got: ", - DataType_Name(scores->dtype())); - } - if (scores->dim_size(0) != num_examples) { - return errors::Internal("Expected output batch size of ", num_examples, - ". Got: ", scores->dim_size(0)); - } - } - // Extract the number of classes from either the class or score output - // Tensor. - int num_classes = 0; - if (classes && scores) { - // If we have both Tensors they should agree in the second dimmension. - if (classes->dim_size(1) != scores->dim_size(1)) { - return errors::Internal( - "Tensors class and score should match in dim_size(1). Got ", - classes->dim_size(1), " vs. ", scores->dim_size(1)); - } - num_classes = classes->dim_size(1); - } else if (classes) { - num_classes = classes->dim_size(1); - } else if (scores) { - num_classes = scores->dim_size(1); - } - - TRACELITERAL("ConvertToClassificationResult"); - // Convert the output to ClassificationResult format. - for (int i = 0; i < num_examples; ++i) { - serving::Classifications* classifications = result->add_classifications(); - for (int c = 0; c < num_classes; ++c) { - serving::Class* cl = classifications->add_classes(); - if (classes) { - const tstring& class_tstr = (classes->matrix())(i, c); - cl->set_label(class_tstr.data(), class_tstr.size()); - } - if (scores) { - cl->set_score((scores->matrix())(i, c)); - } - } - } - - return Status::OK(); - } - - private: - Session* const session_; - const ClassificationSignature* const signature_; - - TF_DISALLOW_COPY_AND_ASSIGN(TensorFlowClassifier); -}; - // Implementation of the ClassifierInterface using SavedModel. class SavedModelTensorFlowClassifier : public ClassifierInterface { public: @@ -193,34 +79,6 @@ class SavedModelTensorFlowClassifier : public ClassifierInterface { TF_DISALLOW_COPY_AND_ASSIGN(SavedModelTensorFlowClassifier); }; -// Implementation of the ClassificationService. -class SessionBundleClassifier : public ClassifierInterface { - public: - explicit SessionBundleClassifier(std::unique_ptr bundle) - : bundle_(std::move(bundle)) {} - - ~SessionBundleClassifier() override = default; - - Status Classify(const ClassificationRequest& request, - ClassificationResult* result) override { - // Get the default signature of the graph. Expected to be a - // classification signature. - // TODO(b/26220896): Move TensorFlowClassifier creation to construction - // time. - ClassificationSignature signature; - TF_RETURN_IF_ERROR(session_bundle::GetClassificationSignature( - bundle_->meta_graph_def, &signature)); - - TensorFlowClassifier classifier(bundle_->session.get(), &signature); - return classifier.Classify(request, result); - } - - private: - std::unique_ptr bundle_; - - TF_DISALLOW_COPY_AND_ASSIGN(SessionBundleClassifier); -}; - class SavedModelClassifier : public ClassifierInterface { public: SavedModelClassifier(const RunOptions& run_options, @@ -252,13 +110,6 @@ class SavedModelClassifier : public ClassifierInterface { } // namespace -Status CreateClassifierFromBundle( - std::unique_ptr bundle, - std::unique_ptr* service) { - service->reset(new SessionBundleClassifier(std::move(bundle))); - return Status::OK(); -} - Status CreateClassifierFromSavedModelBundle( const RunOptions& run_options, std::unique_ptr bundle, std::unique_ptr* service) { @@ -266,13 +117,6 @@ Status CreateClassifierFromSavedModelBundle( return Status::OK(); } -Status CreateFlyweightTensorFlowClassifier( - Session* session, const ClassificationSignature* const signature, - std::unique_ptr* service) { - service->reset(new TensorFlowClassifier(session, signature)); - return Status::OK(); -} - Status CreateFlyweightTensorFlowClassifier( const RunOptions& run_options, Session* session, const SignatureDef* signature, diff --git a/tensorflow_serving/servables/tensorflow/classifier.h b/tensorflow_serving/servables/tensorflow/classifier.h index 04f24fe4ea6..af23aef7a18 100644 --- a/tensorflow_serving/servables/tensorflow/classifier.h +++ b/tensorflow_serving/servables/tensorflow/classifier.h @@ -23,34 +23,17 @@ limitations under the License. #include "tensorflow/cc/saved_model/loader.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow_serving/apis/classifier.h" -#include "tensorflow_serving/session_bundle/session_bundle_util.h" #include "tensorflow_serving/util/optional.h" namespace tensorflow { namespace serving { -// Create a new ClassifierInterface backed by a TensorFlow Session. -// Requires the SessionBundle manifest to have a ClassificationSignature -// as the default signature. -Status CreateClassifierFromBundle( - std::unique_ptr bundle, - std::unique_ptr* service); - // Create a new ClassifierInterface backed by a TensorFlow SavedModel. // Requires that the default SignatureDef be compatible with classification. Status CreateClassifierFromSavedModelBundle( const RunOptions& run_options, std::unique_ptr bundle, std::unique_ptr* service); -// Create a new ClassifierInterface backed by a TensorFlow Session using the -// specified ClassificationSignature. Does not take ownership of the Session. -// Useful in contexts where we need to avoid copying, e.g. if created per -// request. The caller must ensure that the session and signature live at least -// as long as the service. -Status CreateFlyweightTensorFlowClassifier( - Session* session, const ClassificationSignature* signature, - std::unique_ptr* service); - // Create a new ClassifierInterface backed by a TensorFlow Session using the // specified SignatureDef. Does not take ownership of the Session. // Useful in contexts where we need to avoid copying, e.g. if created per diff --git a/tensorflow_serving/servables/tensorflow/classifier_test.cc b/tensorflow_serving/servables/tensorflow/classifier_test.cc index 5e16273f5e6..a8d59133350 100644 --- a/tensorflow_serving/servables/tensorflow/classifier_test.cc +++ b/tensorflow_serving/servables/tensorflow/classifier_test.cc @@ -34,10 +34,8 @@ limitations under the License. #include "tensorflow_serving/apis/input.pb.h" #include "tensorflow_serving/apis/model.pb.h" #include "tensorflow_serving/core/test_util/mock_session.h" -#include "tensorflow_serving/session_bundle/session_bundle_util.h" #include "tensorflow_serving/test_util/test_util.h" #include "tensorflow_serving/util/optional.h" -#include "tensorflow_serving/util/oss_or_google.h" namespace tensorflow { namespace serving { @@ -213,37 +211,6 @@ class FakeSession : public tensorflow::Session { const optional expected_timeout_; }; -// Add a named signature to the mutable signatures* parameter. -// If is_classification is false, will add a regression signature, which is -// invalid in classification requests. -void AddNamedSignature(const string& input_tensor_name, - const string& output_scores_tensor_name, - const string& signature_name, - const bool is_classification, Signatures* signatures) { - tensorflow::serving::Signature named_signature; - if (is_classification) { - named_signature.mutable_classification_signature() - ->mutable_input() - ->set_tensor_name(input_tensor_name); - named_signature.mutable_classification_signature() - ->mutable_classes() - ->set_tensor_name(kClassTensor); - named_signature.mutable_classification_signature() - ->mutable_scores() - ->set_tensor_name(output_scores_tensor_name); - } else { - named_signature.mutable_regression_signature() - ->mutable_input() - ->set_tensor_name(input_tensor_name); - named_signature.mutable_regression_signature() - ->mutable_output() - ->set_tensor_name(output_scores_tensor_name); - } - signatures->mutable_named_signatures()->insert( - protobuf::MapPair( - signature_name, named_signature)); -} - // Add a named signature to the mutable meta_graph_def* parameter. // If is_classification is false, will add a regression signature, which is // invalid in classification requests. @@ -272,73 +239,41 @@ void AddNamedSignatureToSavedModelBundle( } // Parameter is 'bool use_saved_model'. -class ClassifierTest : public ::testing::TestWithParam { +class ClassifierTest : public ::testing::Test { public: void SetUp() override { - if (!UseSavedModel()) { - bundle_.reset(new SessionBundle); - meta_graph_def_ = &bundle_->meta_graph_def; - optional expected_timeout = GetRunOptions().timeout_in_ms(); - // For SessionBundle we don't propagate the timeout. - expected_timeout = nullopt; - fake_session_ = new FakeSession(expected_timeout); - bundle_->session.reset(fake_session_); - - // Setup some defaults for our signature. - tensorflow::serving::Signatures signatures; - auto signature = signatures.mutable_default_signature() - ->mutable_classification_signature(); - signature->mutable_input()->set_tensor_name(kInputTensor); - signature->mutable_classes()->set_tensor_name(kClassTensor); - signature->mutable_scores()->set_tensor_name(kScoreTensor); - - AddNamedSignature(kInputTensor, kOutputPlusOneClassTensor, - kOutputPlusOneSignature, true /* is_classification */, - &signatures); - AddNamedSignature(kInputTensor, kOutputPlusOneClassTensor, - kInvalidNamedSignature, false /* is_classification */, - &signatures); - - // Add a named signature where the output is not valid. - AddNamedSignature(kInputTensor, kImproperlySizedScoresTensor, - kImproperlySizedScoresSignature, - true /* is_classification */, &signatures); - TF_ASSERT_OK(tensorflow::serving::session_bundle::SetSignatures( - signatures, meta_graph_def_)); - } else { - saved_model_bundle_.reset(new SavedModelBundle); - meta_graph_def_ = &saved_model_bundle_->meta_graph_def; - optional expected_timeout = GetRunOptions().timeout_in_ms(); - fake_session_ = new FakeSession(expected_timeout); - saved_model_bundle_->session.reset(fake_session_); - - auto* signature_defs = meta_graph_def_->mutable_signature_def(); - SignatureDef sig_def; - TensorInfo input_tensor_info; - input_tensor_info.set_name(kInputTensor); - (*sig_def.mutable_inputs())["inputs"] = input_tensor_info; - TensorInfo class_tensor_info; - class_tensor_info.set_name(kClassTensor); - (*sig_def.mutable_outputs())["classes"] = class_tensor_info; - TensorInfo scores_tensor_info; - scores_tensor_info.set_name(kScoreTensor); - (*sig_def.mutable_outputs())["scores"] = scores_tensor_info; - sig_def.set_method_name("tensorflow/serving/classify"); - (*signature_defs)["serving_default"] = sig_def; - - AddNamedSignatureToSavedModelBundle( - kInputTensor, kOutputPlusOneClassTensor, kOutputPlusOneSignature, - true /* is_classification */, meta_graph_def_); - AddNamedSignatureToSavedModelBundle( - kInputTensor, kOutputPlusOneClassTensor, kInvalidNamedSignature, - false /* is_classification */, meta_graph_def_); - - // Add a named signature where the output is not valid. - AddNamedSignatureToSavedModelBundle( - kInputTensor, kImproperlySizedScoresTensor, - kImproperlySizedScoresSignature, true /* is_classification */, - meta_graph_def_); - } + saved_model_bundle_.reset(new SavedModelBundle); + meta_graph_def_ = &saved_model_bundle_->meta_graph_def; + optional expected_timeout = GetRunOptions().timeout_in_ms(); + fake_session_ = new FakeSession(expected_timeout); + saved_model_bundle_->session.reset(fake_session_); + + auto* signature_defs = meta_graph_def_->mutable_signature_def(); + SignatureDef sig_def; + TensorInfo input_tensor_info; + input_tensor_info.set_name(kInputTensor); + (*sig_def.mutable_inputs())["inputs"] = input_tensor_info; + TensorInfo class_tensor_info; + class_tensor_info.set_name(kClassTensor); + (*sig_def.mutable_outputs())["classes"] = class_tensor_info; + TensorInfo scores_tensor_info; + scores_tensor_info.set_name(kScoreTensor); + (*sig_def.mutable_outputs())["scores"] = scores_tensor_info; + sig_def.set_method_name("tensorflow/serving/classify"); + (*signature_defs)["serving_default"] = sig_def; + + AddNamedSignatureToSavedModelBundle( + kInputTensor, kOutputPlusOneClassTensor, kOutputPlusOneSignature, + true /* is_classification */, meta_graph_def_); + AddNamedSignatureToSavedModelBundle( + kInputTensor, kOutputPlusOneClassTensor, kInvalidNamedSignature, + false /* is_classification */, meta_graph_def_); + + // Add a named signature where the output is not valid. + AddNamedSignatureToSavedModelBundle( + kInputTensor, kImproperlySizedScoresTensor, + kImproperlySizedScoresSignature, true /* is_classification */, + meta_graph_def_); } protected: @@ -357,20 +292,12 @@ class ClassifierTest : public ::testing::TestWithParam { return example; } - // Whether or not to use SavedModel for this test. Simply wraps GetParam() - // with a more meaningful name. - bool UseSavedModel() { return GetParam(); } - Status Create() { - if (UseSavedModel()) { std::unique_ptr saved_model(new SavedModelBundle); saved_model->meta_graph_def = saved_model_bundle_->meta_graph_def; saved_model->session = std::move(saved_model_bundle_->session); return CreateClassifierFromSavedModelBundle( GetRunOptions(), std::move(saved_model), &classifier_); - } else { - return CreateClassifierFromBundle(std::move(bundle_), &classifier_); - } } RunOptions GetRunOptions() const { @@ -382,7 +309,6 @@ class ClassifierTest : public ::testing::TestWithParam { // Variables used to create the classifier. tensorflow::MetaGraphDef* meta_graph_def_; FakeSession* fake_session_; - std::unique_ptr bundle_; std::unique_ptr saved_model_bundle_; // Classifier valid after calling create. @@ -393,7 +319,7 @@ class ClassifierTest : public ::testing::TestWithParam { ClassificationResult result_; }; -TEST_P(ClassifierTest, ExampleList) { +TEST_F(ClassifierTest, ExampleList) { TF_ASSERT_OK(Create()); auto* examples = request_.mutable_input()->mutable_example_list()->mutable_examples(); @@ -421,7 +347,6 @@ TEST_P(ClassifierTest, ExampleList) { " } " " } ")); // Test RunClassify - if (UseSavedModel()) { ClassificationResponse response; TF_ASSERT_OK(RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, @@ -446,10 +371,9 @@ TEST_P(ClassifierTest, ExampleList) { " score: 3 " " } " " } ")); - } } -TEST_P(ClassifierTest, ExampleListWithContext) { +TEST_F(ClassifierTest, ExampleListWithContext) { TF_ASSERT_OK(Create()); auto* list_and_context = request_.mutable_input()->mutable_example_list_with_context(); @@ -480,8 +404,6 @@ TEST_P(ClassifierTest, ExampleListWithContext) { " } " " } ")); - // Test RunClassify - if (UseSavedModel()) { ClassificationResponse response; TF_ASSERT_OK(RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, @@ -506,10 +428,9 @@ TEST_P(ClassifierTest, ExampleListWithContext) { " score: 1 " " } " " } ")); - } } -TEST_P(ClassifierTest, ExampleListWithContext_DuplicateFeatures) { +TEST_F(ClassifierTest, ExampleListWithContext_DuplicateFeatures) { TF_ASSERT_OK(Create()); auto* list_and_context = request_.mutable_input()->mutable_example_list_with_context(); @@ -542,8 +463,6 @@ TEST_P(ClassifierTest, ExampleListWithContext_DuplicateFeatures) { " } " " } ")); - // Test RunClassify - if (UseSavedModel()) { ClassificationResponse response; TF_ASSERT_OK(RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, @@ -568,31 +487,19 @@ TEST_P(ClassifierTest, ExampleListWithContext_DuplicateFeatures) { " score: 4 " " } " " } ")); - } } -TEST_P(ClassifierTest, ClassesOnly) { - if (UseSavedModel()) { - auto* signature_defs = meta_graph_def_->mutable_signature_def(); - SignatureDef sig_def; - TensorInfo input_tensor_info; - input_tensor_info.set_name(kInputTensor); - (*sig_def.mutable_inputs())["inputs"] = input_tensor_info; - TensorInfo class_tensor_info; - class_tensor_info.set_name(kClassTensor); - (*sig_def.mutable_outputs())["classes"] = class_tensor_info; - sig_def.set_method_name("tensorflow/serving/classify"); - (*signature_defs)["serving_default"] = sig_def; - } else { - tensorflow::serving::Signatures signatures; - auto signature = signatures.mutable_default_signature() - ->mutable_classification_signature(); - signature->mutable_input()->set_tensor_name(kInputTensor); - signature->mutable_classes()->set_tensor_name(kClassTensor); - // No scores Tensor. - TF_ASSERT_OK(tensorflow::serving::session_bundle::SetSignatures( - signatures, meta_graph_def_)); - } +TEST_F(ClassifierTest, ClassesOnly) { + auto* signature_defs = meta_graph_def_->mutable_signature_def(); + SignatureDef sig_def; + TensorInfo input_tensor_info; + input_tensor_info.set_name(kInputTensor); + (*sig_def.mutable_inputs())["inputs"] = input_tensor_info; + TensorInfo class_tensor_info; + class_tensor_info.set_name(kClassTensor); + (*sig_def.mutable_outputs())["classes"] = class_tensor_info; + sig_def.set_method_name("tensorflow/serving/classify"); + (*signature_defs)["serving_default"] = sig_def; TF_ASSERT_OK(Create()); auto* examples = request_.mutable_input()->mutable_example_list()->mutable_examples(); @@ -615,8 +522,7 @@ TEST_P(ClassifierTest, ClassesOnly) { " label: 'tres' " " } " " } ")); - // Test RunClassify - if (UseSavedModel()) { + ClassificationResponse response; TF_ASSERT_OK(RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, @@ -637,32 +543,19 @@ TEST_P(ClassifierTest, ClassesOnly) { " label: 'tres' " " } " " } ")); - } } -TEST_P(ClassifierTest, ScoresOnly) { - if (UseSavedModel()) { - auto* signature_defs = meta_graph_def_->mutable_signature_def(); - SignatureDef sig_def; - TensorInfo input_tensor_info; - input_tensor_info.set_name(kInputTensor); - (*sig_def.mutable_inputs())["inputs"] = input_tensor_info; - TensorInfo scores_tensor_info; - scores_tensor_info.set_name(kScoreTensor); - (*sig_def.mutable_outputs())["scores"] = scores_tensor_info; - sig_def.set_method_name("tensorflow/serving/classify"); - (*signature_defs)["serving_default"] = sig_def; - - } else { - tensorflow::serving::Signatures signatures; - auto signature = signatures.mutable_default_signature() - ->mutable_classification_signature(); - signature->mutable_input()->set_tensor_name(kInputTensor); - // No classes Tensor. - signature->mutable_scores()->set_tensor_name(kScoreTensor); - TF_ASSERT_OK(tensorflow::serving::session_bundle::SetSignatures( - signatures, meta_graph_def_)); - } +TEST_F(ClassifierTest, ScoresOnly) { + auto* signature_defs = meta_graph_def_->mutable_signature_def(); + SignatureDef sig_def; + TensorInfo input_tensor_info; + input_tensor_info.set_name(kInputTensor); + (*sig_def.mutable_inputs())["inputs"] = input_tensor_info; + TensorInfo scores_tensor_info; + scores_tensor_info.set_name(kScoreTensor); + (*sig_def.mutable_outputs())["scores"] = scores_tensor_info; + sig_def.set_method_name("tensorflow/serving/classify"); + (*signature_defs)["serving_default"] = sig_def; TF_ASSERT_OK(Create()); auto* examples = request_.mutable_input()->mutable_example_list()->mutable_examples(); @@ -685,8 +578,7 @@ TEST_P(ClassifierTest, ScoresOnly) { " score: 3 " " } " " } ")); - // Test RunClassify - if (UseSavedModel()) { + ClassificationResponse response; TF_ASSERT_OK(RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, @@ -707,31 +599,19 @@ TEST_P(ClassifierTest, ScoresOnly) { " score: 3 " " } " " } ")); - } } -TEST_P(ClassifierTest, ZeroScoresArePresent) { - if (UseSavedModel()) { - auto* signature_defs = meta_graph_def_->mutable_signature_def(); - SignatureDef sig_def; - TensorInfo input_tensor_info; - input_tensor_info.set_name(kInputTensor); - (*sig_def.mutable_inputs())["inputs"] = input_tensor_info; - TensorInfo scores_tensor_info; - scores_tensor_info.set_name(kScoreTensor); - (*sig_def.mutable_outputs())["scores"] = scores_tensor_info; - sig_def.set_method_name("tensorflow/serving/classify"); - (*signature_defs)["serving_default"] = sig_def; - } else { - tensorflow::serving::Signatures signatures; - auto signature = signatures.mutable_default_signature() - ->mutable_classification_signature(); - signature->mutable_input()->set_tensor_name(kInputTensor); - // No classes Tensor. - signature->mutable_scores()->set_tensor_name(kScoreTensor); - TF_ASSERT_OK(tensorflow::serving::session_bundle::SetSignatures( - signatures, meta_graph_def_)); - } +TEST_F(ClassifierTest, ZeroScoresArePresent) { + auto* signature_defs = meta_graph_def_->mutable_signature_def(); + SignatureDef sig_def; + TensorInfo input_tensor_info; + input_tensor_info.set_name(kInputTensor); + (*sig_def.mutable_inputs())["inputs"] = input_tensor_info; + TensorInfo scores_tensor_info; + scores_tensor_info.set_name(kScoreTensor); + (*sig_def.mutable_outputs())["scores"] = scores_tensor_info; + sig_def.set_method_name("tensorflow/serving/classify"); + (*signature_defs)["serving_default"] = sig_def; TF_ASSERT_OK(Create()); auto* examples = request_.mutable_input()->mutable_example_list()->mutable_examples(); @@ -748,24 +628,22 @@ TEST_P(ClassifierTest, ZeroScoresArePresent) { EXPECT_NEAR(classification.classes(i).score(), expected_outputs[i], 1e-7); } - // Test RunClassify - if (UseSavedModel()) { ClassificationResponse response; TF_ASSERT_OK(RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, fake_session_, request_, &response)); // Parse the protos and compare the results with expected scores. ASSERT_EQ(response.result().classifications_size(), 1); - auto& classification = result_.classifications(0); - ASSERT_EQ(classification.classes_size(), 3); + auto& classification_resp = result_.classifications(0); + ASSERT_EQ(classification_resp.classes_size(), 3); for (int i = 0; i < 3; ++i) { - EXPECT_NEAR(classification.classes(i).score(), expected_outputs[i], 1e-7); + EXPECT_NEAR(classification_resp.classes(i).score(), expected_outputs[i], + 1e-7); } - } } -TEST_P(ClassifierTest, ValidNamedSignature) { +TEST_F(ClassifierTest, ValidNamedSignature) { TF_ASSERT_OK(Create()); request_.mutable_model_spec()->set_signature_name(kOutputPlusOneSignature); auto* examples = @@ -774,10 +652,6 @@ TEST_P(ClassifierTest, ValidNamedSignature) { *examples->Add() = example({{"cuatro", 4}, {"tres", 3}}); TF_ASSERT_OK(classifier_->Classify(request_, &result_)); - // If using saved_model, this test should use the kOutputPlusOneSignature - // named signature. Otherwise, when using session_bundle, the signature_name - // in the model_spec will be ignored and the default signature will be used. - if (UseSavedModel()) { EXPECT_THAT(result_, EqualsProto(" classifications { " " classes { " " label: 'dos' " @@ -798,30 +672,7 @@ TEST_P(ClassifierTest, ValidNamedSignature) { " score: 4 " " } " " } ")); - } else { - EXPECT_THAT(result_, EqualsProto(" classifications { " - " classes { " - " label: 'dos' " - " score: 2 " - " } " - " classes { " - " label: 'uno' " - " score: 1 " - " } " - " } " - " classifications { " - " classes { " - " label: 'cuatro' " - " score: 4 " - " } " - " classes { " - " label: 'tres' " - " score: 3 " - " } " - " } ")); - } - // Test RunClassify - if (UseSavedModel()) { + ClassificationResponse response; TF_ASSERT_OK(RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, @@ -846,65 +697,28 @@ TEST_P(ClassifierTest, ValidNamedSignature) { " score: 4 " " } " " } ")); - } } -TEST_P(ClassifierTest, InvalidNamedSignature) { +TEST_F(ClassifierTest, InvalidNamedSignature) { TF_ASSERT_OK(Create()); request_.mutable_model_spec()->set_signature_name(kInvalidNamedSignature); auto* examples = request_.mutable_input()->mutable_example_list()->mutable_examples(); *examples->Add() = example({{"dos", 2}, {"uno", 1}}); *examples->Add() = example({{"cuatro", 4}, {"tres", 3}}); - const Status status = classifier_->Classify(request_, &result_); + Status status = classifier_->Classify(request_, &result_); - // If using saved_model, this test should fail because the named_signature - // requested is actually a regression signature. When using session_bundle, - // the signature_name will be ignored and the default signature will be used. - if (UseSavedModel()) { - ASSERT_FALSE(status.ok()); - EXPECT_EQ(::tensorflow::error::INVALID_ARGUMENT, status.code()) << status; - } else { - TF_ASSERT_OK(status); - EXPECT_THAT(result_, EqualsProto(" classifications { " - " classes { " - " label: 'dos' " - " score: 2 " - " } " - " classes { " - " label: 'uno' " - " score: 1 " - " } " - " } " - " classifications { " - " classes { " - " label: 'cuatro' " - " score: 4 " - " } " - " classes { " - " label: 'tres' " - " score: 3 " - " } " - " } ")); - } - // Test RunClassify - if (UseSavedModel()) { - ClassificationResponse response; - const Status status = - RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, - fake_session_, request_, &response); - ASSERT_FALSE(status.ok()); - EXPECT_EQ(::tensorflow::error::INVALID_ARGUMENT, status.code()) << status; - } -} + ASSERT_FALSE(status.ok()); + EXPECT_EQ(::tensorflow::error::INVALID_ARGUMENT, status.code()) << status; -TEST_P(ClassifierTest, MalformedScores) { - // If not using SavedModel, we don't use named signatures so the test is not - // actually testing the right thing. Skip it. - if (!UseSavedModel()) { - return; - } + ClassificationResponse response; + status = RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, + fake_session_, request_, &response); + ASSERT_FALSE(status.ok()); + EXPECT_EQ(::tensorflow::error::INVALID_ARGUMENT, status.code()) << status; +} +TEST_F(ClassifierTest, MalformedScores) { TF_ASSERT_OK(Create()); request_.mutable_model_spec()->set_signature_name( kImproperlySizedScoresSignature); @@ -912,365 +726,256 @@ TEST_P(ClassifierTest, MalformedScores) { request_.mutable_input()->mutable_example_list()->mutable_examples(); *examples->Add() = example({{"dos", 2}, {"uno", 1}}); *examples->Add() = example({{"cuatro", 4}, {"tres", 3}}); - const Status status = classifier_->Classify(request_, &result_); + Status status = classifier_->Classify(request_, &result_); ASSERT_FALSE(status.ok()); EXPECT_EQ(::tensorflow::error::INVALID_ARGUMENT, status.code()) << status; - // Test RunClassify - if (UseSavedModel()) { + ClassificationResponse response; - const Status status = - RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, - fake_session_, request_, &response); + status = RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, + {}, fake_session_, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_EQ(::tensorflow::error::INVALID_ARGUMENT, status.code()) << status; - } } -TEST_P(ClassifierTest, MissingClassificationSignature) { - if (UseSavedModel()) { - auto* signature_defs = meta_graph_def_->mutable_signature_def(); - SignatureDef sig_def; - (*signature_defs)["serving_default"] = sig_def; - } else { - tensorflow::serving::Signatures signatures; - signatures.mutable_default_signature(); - TF_ASSERT_OK(tensorflow::serving::session_bundle::SetSignatures( - signatures, meta_graph_def_)); - } +TEST_F(ClassifierTest, MissingClassificationSignature) { + auto* signature_defs = meta_graph_def_->mutable_signature_def(); + SignatureDef sig_def; + (*signature_defs)["serving_default"] = sig_def; TF_ASSERT_OK(Create()); auto* examples = request_.mutable_input()->mutable_example_list()->mutable_examples(); *examples->Add() = example({{"dos", 2}}); // TODO(b/26220896): This error should move to construction time. - const Status status = classifier_->Classify(request_, &result_); + Status status = classifier_->Classify(request_, &result_); ASSERT_FALSE(status.ok()); - // Old SessionBundle code treats a missing signature as a FAILED_PRECONDITION - // but new SavedModel code treats it as an INVALID_ARGUMENT (signature - // specified in the request was invalid). - if (UseSavedModel()) { EXPECT_EQ(::tensorflow::error::INVALID_ARGUMENT, status.code()) << status; - } else { - EXPECT_EQ(::tensorflow::error::FAILED_PRECONDITION, status.code()) - << status; - } - // Test RunClassify - if (UseSavedModel()) { + ClassificationResponse response; - const Status status = - RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, - fake_session_, request_, &response); + status = RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, + {}, fake_session_, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_EQ(::tensorflow::error::INVALID_ARGUMENT, status.code()) << status; - } } -TEST_P(ClassifierTest, EmptyInput) { +TEST_F(ClassifierTest, EmptyInput) { TF_ASSERT_OK(Create()); // Touch input. request_.mutable_input(); - const Status status = classifier_->Classify(request_, &result_); + Status status = classifier_->Classify(request_, &result_); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("Invalid argument: Input is empty")); - // Test RunClassify - if (UseSavedModel()) { + ClassificationResponse response; - const Status status = - RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, - fake_session_, request_, &response); + status = RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, + {}, fake_session_, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("Invalid argument: Input is empty")); - } } -TEST_P(ClassifierTest, EmptyExampleList) { +TEST_F(ClassifierTest, EmptyExampleList) { TF_ASSERT_OK(Create()); // Touch ExampleList. request_.mutable_input()->mutable_example_list(); - const Status status = classifier_->Classify(request_, &result_); + Status status = classifier_->Classify(request_, &result_); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("Invalid argument: Input is empty")); - // Test RunClassify - if (UseSavedModel()) { + ClassificationResponse response; - const Status status = - RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, - fake_session_, request_, &response); + status = RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, + {}, fake_session_, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("Invalid argument: Input is empty")); - } } -TEST_P(ClassifierTest, EmptyExampleListWithContext) { +TEST_F(ClassifierTest, EmptyExampleListWithContext) { TF_ASSERT_OK(Create()); // Touch ExampleListWithContext, context populated but no Examples. *request_.mutable_input() ->mutable_example_list_with_context() ->mutable_context() = example({{"dos", 2}}); - const Status status = classifier_->Classify(request_, &result_); + Status status = classifier_->Classify(request_, &result_); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("Invalid argument: Input is empty")); - // Test RunClassify - if (UseSavedModel()) { + ClassificationResponse response; - const Status status = - RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, - fake_session_, request_, &response); + status = RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, + {}, fake_session_, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("Invalid argument: Input is empty")); - } } -TEST_P(ClassifierTest, RunsFails) { +TEST_F(ClassifierTest, RunsFails) { MockSession* mock = new MockSession; - if (UseSavedModel()) { saved_model_bundle_->session.reset(mock); EXPECT_CALL(*mock, Run(_, _, _, _, _, _)) .WillRepeatedly( ::testing::Return(errors::Internal("Run totally failed"))); - } else { - bundle_->session.reset(mock); - EXPECT_CALL(*mock, Run(_, _, _, _)) - .WillRepeatedly( - ::testing::Return(errors::Internal("Run totally failed"))); - } TF_ASSERT_OK(Create()); auto* examples = request_.mutable_input()->mutable_example_list()->mutable_examples(); *examples->Add() = example({{"dos", 2}}); - const Status status = classifier_->Classify(request_, &result_); + Status status = classifier_->Classify(request_, &result_); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("Run totally failed")); - // Test RunClassify - if (UseSavedModel()) { + ClassificationResponse response; - const Status status = - RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, - mock, request_, &response); + status = RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, + {}, mock, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("Run totally failed")); - } } -TEST_P(ClassifierTest, ClassesIncorrectTensorBatchSize) { +TEST_F(ClassifierTest, ClassesIncorrectTensorBatchSize) { MockSession* mock = new MockSession; - if (UseSavedModel()) { saved_model_bundle_->session.reset(mock); - } else { - bundle_->session.reset(mock); - } // This Tensor only has one batch item but we will have two inputs. Tensor classes(DT_STRING, TensorShape({1, 2})); Tensor scores(DT_FLOAT, TensorShape({2, 2})); std::vector outputs = {classes, scores}; - if (UseSavedModel()) { EXPECT_CALL(*mock, Run(_, _, _, _, _, _)) .WillRepeatedly(::testing::DoAll(::testing::SetArgPointee<4>(outputs), ::testing::Return(Status::OK()))); - } else { - EXPECT_CALL(*mock, Run(_, _, _, _)) - .WillRepeatedly(::testing::DoAll(::testing::SetArgPointee<3>(outputs), - ::testing::Return(Status::OK()))); - } TF_ASSERT_OK(Create()); auto* examples = request_.mutable_input()->mutable_example_list()->mutable_examples(); *examples->Add() = example({{"dos", 2}, {"uno", 1}}); *examples->Add() = example({{"cuatro", 4}, {"tres", 3}}); - const Status status = classifier_->Classify(request_, &result_); + Status status = classifier_->Classify(request_, &result_); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("batch size")); - // Test RunClassify - if (UseSavedModel()) { + ClassificationResponse response; - const Status status = - RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, - mock, request_, &response); + status = RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, + {}, mock, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("batch size")); - } } -TEST_P(ClassifierTest, ClassesIncorrectTensorType) { +TEST_F(ClassifierTest, ClassesIncorrectTensorType) { MockSession* mock = new MockSession; - if (UseSavedModel()) { saved_model_bundle_->session.reset(mock); - } else { - bundle_->session.reset(mock); - } + // This Tensor is the wrong type for class. Tensor classes(DT_FLOAT, TensorShape({2, 2})); Tensor scores(DT_FLOAT, TensorShape({2, 2})); std::vector outputs = {classes, scores}; - if (UseSavedModel()) { EXPECT_CALL(*mock, Run(_, _, _, _, _, _)) .WillRepeatedly(::testing::DoAll(::testing::SetArgPointee<4>(outputs), ::testing::Return(Status::OK()))); - } else { - EXPECT_CALL(*mock, Run(_, _, _, _)) - .WillRepeatedly(::testing::DoAll(::testing::SetArgPointee<3>(outputs), - ::testing::Return(Status::OK()))); - } TF_ASSERT_OK(Create()); auto* examples = request_.mutable_input()->mutable_example_list()->mutable_examples(); *examples->Add() = example({{"dos", 2}, {"uno", 1}}); *examples->Add() = example({{"cuatro", 4}, {"tres", 3}}); - const Status status = classifier_->Classify(request_, &result_); + Status status = classifier_->Classify(request_, &result_); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("Expected classes Tensor of DT_STRING")); - // Test RunClassify - if (UseSavedModel()) { ClassificationResponse response; - const Status status = - RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, - mock, request_, &response); + status = RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, + {}, mock, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("Expected classes Tensor of DT_STRING")); - } } -TEST_P(ClassifierTest, ScoresIncorrectTensorBatchSize) { +TEST_F(ClassifierTest, ScoresIncorrectTensorBatchSize) { MockSession* mock = new MockSession; - if (UseSavedModel()) { saved_model_bundle_->session.reset(mock); - } else { - bundle_->session.reset(mock); - } Tensor classes(DT_STRING, TensorShape({2, 2})); // This Tensor only has one batch item but we will have two inputs. Tensor scores(DT_FLOAT, TensorShape({1, 2})); std::vector outputs = {classes, scores}; - if (UseSavedModel()) { EXPECT_CALL(*mock, Run(_, _, _, _, _, _)) .WillRepeatedly(::testing::DoAll(::testing::SetArgPointee<4>(outputs), ::testing::Return(Status::OK()))); - } else { - EXPECT_CALL(*mock, Run(_, _, _, _)) - .WillRepeatedly(::testing::DoAll(::testing::SetArgPointee<3>(outputs), - ::testing::Return(Status::OK()))); - } TF_ASSERT_OK(Create()); auto* examples = request_.mutable_input()->mutable_example_list()->mutable_examples(); *examples->Add() = example({{"dos", 2}, {"uno", 1}}); *examples->Add() = example({{"cuatro", 4}, {"tres", 3}}); - const Status status = classifier_->Classify(request_, &result_); + Status status = classifier_->Classify(request_, &result_); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("batch size")); - // Test RunClassify - if (UseSavedModel()) { + ClassificationResponse response; - const Status status = - RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, - mock, request_, &response); + status = RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, + {}, mock, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("batch size")); - } } -TEST_P(ClassifierTest, ScoresIncorrectTensorType) { +TEST_F(ClassifierTest, ScoresIncorrectTensorType) { MockSession* mock = new MockSession; - if (UseSavedModel()) { saved_model_bundle_->session.reset(mock); - } else { - bundle_->session.reset(mock); - } Tensor classes(DT_STRING, TensorShape({2, 2})); // This Tensor is the wrong type for class. Tensor scores(DT_STRING, TensorShape({2, 2})); std::vector outputs = {classes, scores}; - if (UseSavedModel()) { EXPECT_CALL(*mock, Run(_, _, _, _, _, _)) .WillRepeatedly(::testing::DoAll(::testing::SetArgPointee<4>(outputs), ::testing::Return(Status::OK()))); - } else { - EXPECT_CALL(*mock, Run(_, _, _, _)) - .WillRepeatedly(::testing::DoAll(::testing::SetArgPointee<3>(outputs), - ::testing::Return(Status::OK()))); - } TF_ASSERT_OK(Create()); auto* examples = request_.mutable_input()->mutable_example_list()->mutable_examples(); *examples->Add() = example({{"dos", 2}, {"uno", 1}}); *examples->Add() = example({{"cuatro", 4}, {"tres", 3}}); - const Status status = classifier_->Classify(request_, &result_); + Status status = classifier_->Classify(request_, &result_); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("Expected scores Tensor of DT_FLOAT")); - // Test RunClassify - if (UseSavedModel()) { + ClassificationResponse response; - const Status status = - RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, - mock, request_, &response); + status = RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, + {}, mock, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("Expected scores Tensor of DT_FLOAT")); - } } -TEST_P(ClassifierTest, MismatchedNumberOfTensorClasses) { +TEST_F(ClassifierTest, MismatchedNumberOfTensorClasses) { MockSession* mock = new MockSession; - if (UseSavedModel()) { saved_model_bundle_->session.reset(mock); - } else { - bundle_->session.reset(mock); - } Tensor classes(DT_STRING, TensorShape({2, 2})); // Scores Tensor has three scores but classes only has two labels. Tensor scores(DT_FLOAT, TensorShape({2, 3})); std::vector outputs = {classes, scores}; - if (UseSavedModel()) { EXPECT_CALL(*mock, Run(_, _, _, _, _, _)) .WillRepeatedly(::testing::DoAll(::testing::SetArgPointee<4>(outputs), ::testing::Return(Status::OK()))); - } else { - EXPECT_CALL(*mock, Run(_, _, _, _)) - .WillRepeatedly(::testing::DoAll(::testing::SetArgPointee<3>(outputs), - ::testing::Return(Status::OK()))); - } TF_ASSERT_OK(Create()); auto* examples = request_.mutable_input()->mutable_example_list()->mutable_examples(); *examples->Add() = example({{"dos", 2}, {"uno", 1}}); *examples->Add() = example({{"cuatro", 4}, {"tres", 3}}); - const Status status = classifier_->Classify(request_, &result_); + Status status = classifier_->Classify(request_, &result_); ASSERT_FALSE(status.ok()); EXPECT_THAT( status.ToString(), ::testing::HasSubstr( "Tensors class and score should match in dim_size(1). Got 2 vs. 3")); - // Test RunClassify - if (UseSavedModel()) { + ClassificationResponse response; - const Status status = - RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, - mock, request_, &response); + status = RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, + {}, mock, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("Tensors class and score should match in " "dim_size(1). Got 2 vs. 3")); - } } -// Test all ClassifierTest test cases with both SessionBundle and SavedModel. -INSTANTIATE_TEST_CASE_P(UseSavedModel, ClassifierTest, - IsTensorflowServingOSS() ? ::testing::Values(true) - : ::testing::Bool()); } // namespace } // namespace serving } // namespace tensorflow diff --git a/tensorflow_serving/servables/tensorflow/regressor.cc b/tensorflow_serving/servables/tensorflow/regressor.cc index a0818cc95ba..7b48b655b94 100644 --- a/tensorflow_serving/servables/tensorflow/regressor.cc +++ b/tensorflow_serving/servables/tensorflow/regressor.cc @@ -36,67 +36,11 @@ limitations under the License. #include "tensorflow_serving/apis/regression.pb.h" #include "tensorflow_serving/apis/regressor.h" #include "tensorflow_serving/servables/tensorflow/util.h" -#include "tensorflow_serving/session_bundle/session_bundle_util.h" namespace tensorflow { namespace serving { namespace { -// Implementation of the RegressorInterface using the legacy SessionBundle -// RegressionSignature signature format. -class TensorFlowRegressor : public RegressorInterface { - public: - explicit TensorFlowRegressor(Session* session, - const RegressionSignature* const signature) - : session_(session), signature_(signature) {} - - ~TensorFlowRegressor() override = default; - - Status Regress(const RegressionRequest& request, - RegressionResult* result) override { - TRACELITERAL("TensorFlowRegressor::Regress"); - TRACELITERAL("ConvertInputTFEXamplesToTensor"); - // Setup the input Tensor to be a vector of string containing the serialized - // tensorflow.Example. - Tensor input_tensor; - TF_RETURN_IF_ERROR( - InputToSerializedExampleTensor(request.input(), &input_tensor)); - - const int num_examples = input_tensor.dim_size(0); - if (num_examples == 0) { - return errors::InvalidArgument("RegressionRequest::input is empty."); - } - RecordRequestExampleCount(request.model_spec().name(), num_examples); - - TRACELITERAL("RunRegression"); - Tensor output; - TF_RETURN_IF_ERROR(session_bundle::RunRegression(*signature_, input_tensor, - session_, &output)); - - if (output.dtype() != DT_FLOAT) { - return errors::Internal("Expected output Tensor of DT_FLOAT. Got: ", - DataType_Name(output.dtype())); - } - - if (output.NumElements() != num_examples) { - return errors::Internal("Expected output batch size to be ", num_examples, - ". Got: ", output.NumElements()); - } - - TRACELITERAL("ConvertToRegressionResult"); - for (int i = 0; i < num_examples; ++i) { - result->add_regressions()->set_value(output.flat()(i)); - } - return Status::OK(); - } - - private: - Session* const session_; - const RegressionSignature* const signature_; - - TF_DISALLOW_COPY_AND_ASSIGN(TensorFlowRegressor); -}; - // Implementation of the RegressorInterface using SavedModel. class SavedModelTensorFlowRegressor : public RegressorInterface { public: @@ -135,30 +79,6 @@ class SavedModelTensorFlowRegressor : public RegressorInterface { TF_DISALLOW_COPY_AND_ASSIGN(SavedModelTensorFlowRegressor); }; -// Implementation of the RegressorInterface -class SessionBundleRegressor : public RegressorInterface { - public: - explicit SessionBundleRegressor(std::unique_ptr bundle) - : bundle_(std::move(bundle)) {} - - ~SessionBundleRegressor() override = default; - - Status Regress(const RegressionRequest& request, - RegressionResult* result) override { - RegressionSignature signature; - TF_RETURN_IF_ERROR(session_bundle::GetRegressionSignature( - bundle_->meta_graph_def, &signature)); - - TensorFlowRegressor regressor(bundle_->session.get(), &signature); - return regressor.Regress(request, result); - } - - private: - std::unique_ptr bundle_; - - TF_DISALLOW_COPY_AND_ASSIGN(SessionBundleRegressor); -}; - class SavedModelRegressor : public RegressorInterface { public: SavedModelRegressor(const RunOptions& run_options, @@ -186,12 +106,6 @@ class SavedModelRegressor : public RegressorInterface { } // namespace -Status CreateRegressorFromBundle(std::unique_ptr bundle, - std::unique_ptr* service) { - service->reset(new SessionBundleRegressor(std::move(bundle))); - return Status::OK(); -} - Status CreateRegressorFromSavedModelBundle( const RunOptions& run_options, std::unique_ptr bundle, std::unique_ptr* service) { @@ -199,13 +113,6 @@ Status CreateRegressorFromSavedModelBundle( return Status::OK(); } -Status CreateFlyweightTensorFlowRegressor( - Session* session, const RegressionSignature* const signature, - std::unique_ptr* service) { - service->reset(new TensorFlowRegressor(session, signature)); - return Status::OK(); -} - Status CreateFlyweightTensorFlowRegressor( const RunOptions& run_options, Session* session, const SignatureDef* signature, diff --git a/tensorflow_serving/servables/tensorflow/regressor.h b/tensorflow_serving/servables/tensorflow/regressor.h index 765ae6bd83b..9581ded3e72 100644 --- a/tensorflow_serving/servables/tensorflow/regressor.h +++ b/tensorflow_serving/servables/tensorflow/regressor.h @@ -23,33 +23,17 @@ limitations under the License. #include "tensorflow/cc/saved_model/loader.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow_serving/apis/regressor.h" -#include "tensorflow_serving/session_bundle/session_bundle_util.h" #include "tensorflow_serving/util/optional.h" namespace tensorflow { namespace serving { -// Create a new RegressorInterface backed by a TensorFlow Session. -// Requires the SessionBundle manifest have a RegressionSignature -// as the default signature. -Status CreateRegressorFromBundle(std::unique_ptr bundle, - std::unique_ptr* service); - // Create a new RegressorInterface backed by a TensorFlow SavedModel. // Requires that the default SignatureDef be compatible with Regression. Status CreateRegressorFromSavedModelBundle( const RunOptions& run_options, std::unique_ptr bundle, std::unique_ptr* service); -// Create a new RegressorInterface backed by a TensorFlow Session using the -// specified RegressionSignature. Does not take ownership of the Session. -// Useful in contexts where we need to avoid copying, e.g. if created per -// request. The caller must ensure that the session and signature live at least -// as long as the service. -Status CreateFlyweightTensorFlowRegressor( - Session* session, const RegressionSignature* signature, - std::unique_ptr* service); - // Create a new RegressorInterface backed by a TensorFlow Session using the // specified SignatureDef. Does not take ownership of the Session. // Useful in contexts where we need to avoid copying, e.g. if created per diff --git a/tensorflow_serving/servables/tensorflow/regressor_test.cc b/tensorflow_serving/servables/tensorflow/regressor_test.cc index bb42521f01c..db661d89533 100644 --- a/tensorflow_serving/servables/tensorflow/regressor_test.cc +++ b/tensorflow_serving/servables/tensorflow/regressor_test.cc @@ -33,10 +33,8 @@ limitations under the License. #include "tensorflow_serving/apis/model.pb.h" #include "tensorflow_serving/apis/regression.pb.h" #include "tensorflow_serving/core/test_util/mock_session.h" -#include "tensorflow_serving/session_bundle/session_bundle_util.h" #include "tensorflow_serving/test_util/test_util.h" #include "tensorflow_serving/util/optional.h" -#include "tensorflow_serving/util/oss_or_google.h" namespace tensorflow { namespace serving { @@ -174,34 +172,6 @@ class FakeSession : public tensorflow::Session { const optional expected_timeout_; }; -// Add a named signature to the mutable signatures* parameter. -// If is_regression is false, will add a classification signature, which is -// invalid in regression requests. -void AddNamedSignature(const string& input_tensor_name, - const string& output_tensor_name, - const string& signature_name, const bool is_regression, - Signatures* signatures) { - tensorflow::serving::Signature named_signature; - if (is_regression) { - named_signature.mutable_regression_signature() - ->mutable_input() - ->set_tensor_name(input_tensor_name); - named_signature.mutable_regression_signature() - ->mutable_output() - ->set_tensor_name(output_tensor_name); - } else { - named_signature.mutable_classification_signature() - ->mutable_input() - ->set_tensor_name(input_tensor_name); - named_signature.mutable_classification_signature() - ->mutable_classes() - ->set_tensor_name(output_tensor_name); - } - signatures->mutable_named_signatures()->insert( - protobuf::MapPair( - signature_name, named_signature)); -} - // Add a named signature to the mutable meta_graph_def* parameter. // If is_classification is false, will add a regression signature, which is // invalid in classification requests. @@ -233,78 +203,39 @@ void AddNamedSignatureToSavedModelBundle( (*signature_defs)[signature_name] = sig_def; } -// Parameter is 'bool use_saved_model'. -class RegressorTest : public ::testing::TestWithParam { +class RegressorTest : public ::testing::Test { public: void SetUp() override { - if (UseSavedModel()) { - saved_model_bundle_.reset(new SavedModelBundle); - meta_graph_def_ = &saved_model_bundle_->meta_graph_def; - optional expected_timeout = GetRunOptions().timeout_in_ms(); - fake_session_ = new FakeSession(expected_timeout); - saved_model_bundle_->session.reset(fake_session_); - - auto* signature_defs = meta_graph_def_->mutable_signature_def(); - SignatureDef sig_def; - TensorInfo input_tensor_info; - input_tensor_info.set_name(kInputTensor); - (*sig_def.mutable_inputs())["inputs"] = input_tensor_info; - TensorInfo scores_tensor_info; - scores_tensor_info.set_name(kOutputTensor); - (*sig_def.mutable_outputs())["outputs"] = scores_tensor_info; - sig_def.set_method_name("tensorflow/serving/regress"); - (*signature_defs)["serving_default"] = sig_def; - - AddNamedSignatureToSavedModelBundle( - kInputTensor, kOutputPlusOneTensor, kOutputPlusOneSignature, - true /* is_regression */, meta_graph_def_); - AddNamedSignatureToSavedModelBundle( - kInputTensor, kOutputPlusOneTensor, kInvalidNamedSignature, - false /* is_regression */, meta_graph_def_); - - // Add a named signature where the output is not valid. - AddNamedSignatureToSavedModelBundle( - kInputTensor, kImproperlySizedOutputTensor, - kImproperlySizedOutputSignature, true /* is_regression */, - meta_graph_def_); - } else { - bundle_.reset(new SessionBundle); - meta_graph_def_ = &bundle_->meta_graph_def; - optional expected_timeout = GetRunOptions().timeout_in_ms(); - if (!GetParam()) { - // For SessionBundle we don't propagate the timeout. - expected_timeout = nullopt; - } - fake_session_ = new FakeSession(expected_timeout); - bundle_->session.reset(fake_session_); - - // Setup some defaults for our signature. - tensorflow::serving::Signatures signatures; - auto default_signature = signatures.mutable_default_signature() - ->mutable_regression_signature(); - default_signature->mutable_input()->set_tensor_name(kInputTensor); - default_signature->mutable_output()->set_tensor_name(kOutputTensor); - - AddNamedSignature(kInputTensor, kOutputPlusOneTensor, - kOutputPlusOneSignature, true /* is_regression */, - &signatures); - AddNamedSignature(kInputTensor, kOutputPlusOneTensor, - kInvalidNamedSignature, false /* is_regression */, - &signatures); - - // Add a named signature where the output is not valid. - AddNamedSignature(kInputTensor, kImproperlySizedOutputTensor, - kImproperlySizedOutputSignature, - true /* is_regression */, &signatures); - - TF_ASSERT_OK(tensorflow::serving::session_bundle::SetSignatures( - signatures, meta_graph_def_)); - } - } + saved_model_bundle_.reset(new SavedModelBundle); + meta_graph_def_ = &saved_model_bundle_->meta_graph_def; + optional expected_timeout = GetRunOptions().timeout_in_ms(); + fake_session_ = new FakeSession(expected_timeout); + saved_model_bundle_->session.reset(fake_session_); - // Whether or not to use SavedModel for this test. Simply wraps GetParam() - // with a more meaningful name. - bool UseSavedModel() { return GetParam(); } + auto* signature_defs = meta_graph_def_->mutable_signature_def(); + SignatureDef sig_def; + TensorInfo input_tensor_info; + input_tensor_info.set_name(kInputTensor); + (*sig_def.mutable_inputs())["inputs"] = input_tensor_info; + TensorInfo scores_tensor_info; + scores_tensor_info.set_name(kOutputTensor); + (*sig_def.mutable_outputs())["outputs"] = scores_tensor_info; + sig_def.set_method_name("tensorflow/serving/regress"); + (*signature_defs)["serving_default"] = sig_def; + + AddNamedSignatureToSavedModelBundle( + kInputTensor, kOutputPlusOneTensor, kOutputPlusOneSignature, + true /* is_regression */, meta_graph_def_); + AddNamedSignatureToSavedModelBundle( + kInputTensor, kOutputPlusOneTensor, kInvalidNamedSignature, + false /* is_regression */, meta_graph_def_); + + // Add a named signature where the output is not valid. + AddNamedSignatureToSavedModelBundle( + kInputTensor, kImproperlySizedOutputTensor, + kImproperlySizedOutputSignature, true /* is_regression */, + meta_graph_def_); + } protected: // Return an example with the feature "output" = [output]. @@ -317,15 +248,11 @@ class RegressorTest : public ::testing::TestWithParam { } Status Create() { - if (UseSavedModel()) { - std::unique_ptr saved_model(new SavedModelBundle); - saved_model->meta_graph_def = saved_model_bundle_->meta_graph_def; - saved_model->session = std::move(saved_model_bundle_->session); - return CreateRegressorFromSavedModelBundle( - GetRunOptions(), std::move(saved_model), ®ressor_); - } else { - return CreateRegressorFromBundle(std::move(bundle_), ®ressor_); - } + std::unique_ptr saved_model(new SavedModelBundle); + saved_model->meta_graph_def = saved_model_bundle_->meta_graph_def; + saved_model->session = std::move(saved_model_bundle_->session); + return CreateRegressorFromSavedModelBundle( + GetRunOptions(), std::move(saved_model), ®ressor_); } RunOptions GetRunOptions() const { @@ -337,7 +264,6 @@ class RegressorTest : public ::testing::TestWithParam { // Variables used to create the regression model tensorflow::MetaGraphDef* meta_graph_def_; FakeSession* fake_session_; - std::unique_ptr bundle_; std::unique_ptr saved_model_bundle_; // Regression model valid after calling create. @@ -348,7 +274,7 @@ class RegressorTest : public ::testing::TestWithParam { RegressionResult result_; }; -TEST_P(RegressorTest, BasicExampleList) { +TEST_F(RegressorTest, BasicExampleList) { TF_ASSERT_OK(Create()); auto* examples = request_.mutable_input()->mutable_example_list()->mutable_examples(); @@ -361,22 +287,18 @@ TEST_P(RegressorTest, BasicExampleList) { " regressions { " " value: 3.0 " " } ")); - // Test RunRegress - if (UseSavedModel()) { - RegressionResponse response; - TF_ASSERT_OK(RunRegress(GetRunOptions(), - saved_model_bundle_->meta_graph_def, {}, - fake_session_, request_, &response)); - EXPECT_THAT(response.result(), EqualsProto(" regressions { " - " value: 2.0 " - " } " - " regressions { " - " value: 3.0 " - " } ")); - } + RegressionResponse response; + TF_ASSERT_OK(RunRegress(GetRunOptions(), saved_model_bundle_->meta_graph_def, + {}, fake_session_, request_, &response)); + EXPECT_THAT(response.result(), EqualsProto(" regressions { " + " value: 2.0 " + " } " + " regressions { " + " value: 3.0 " + " } ")); } -TEST_P(RegressorTest, BasicExampleListWithContext) { +TEST_F(RegressorTest, BasicExampleListWithContext) { TF_ASSERT_OK(Create()); auto* list_with_context = request_.mutable_input()->mutable_example_list_with_context(); @@ -392,22 +314,18 @@ TEST_P(RegressorTest, BasicExampleListWithContext) { " regressions { " " value: 3.0 " " } ")); - // Test RunRegress - if (UseSavedModel()) { - RegressionResponse response; - TF_ASSERT_OK(RunRegress(GetRunOptions(), - saved_model_bundle_->meta_graph_def, {}, - fake_session_, request_, &response)); - EXPECT_THAT(response.result(), EqualsProto(" regressions { " - " value: 3.0 " - " } " - " regressions { " - " value: 3.0 " - " } ")); - } + RegressionResponse response; + TF_ASSERT_OK(RunRegress(GetRunOptions(), saved_model_bundle_->meta_graph_def, + {}, fake_session_, request_, &response)); + EXPECT_THAT(response.result(), EqualsProto(" regressions { " + " value: 3.0 " + " } " + " regressions { " + " value: 3.0 " + " } ")); } -TEST_P(RegressorTest, ValidNamedSignature) { +TEST_F(RegressorTest, ValidNamedSignature) { TF_ASSERT_OK(Create()); request_.mutable_model_spec()->set_signature_name(kOutputPlusOneSignature); auto* examples = @@ -415,83 +333,43 @@ TEST_P(RegressorTest, ValidNamedSignature) { *examples->Add() = example_with_output(2.0); *examples->Add() = example_with_output(3.0); TF_ASSERT_OK(regressor_->Regress(request_, &result_)); - // GetParam() is 'is_saved_model' in this test. If using saved_model, this - // test should use the kOutputPlusOneSignature named signature. Otherwise, - // when using session_bundle, the signature_name in the model_spec will be - // ignored and the default signature will be used. - if (GetParam()) { - EXPECT_THAT(result_, EqualsProto(" regressions { " - " value: 3.0 " - " } " - " regressions { " - " value: 4.0 " - " } ")); - } else { - EXPECT_THAT(result_, EqualsProto(" regressions { " - " value: 2.0 " - " } " - " regressions { " - " value: 3.0 " - " } ")); - } - // Test RunRegress - if (UseSavedModel()) { - RegressionResponse response; - TF_ASSERT_OK(RunRegress(GetRunOptions(), - saved_model_bundle_->meta_graph_def, {}, - fake_session_, request_, &response)); - EXPECT_THAT(response.result(), EqualsProto(" regressions { " - " value: 3.0 " - " } " - " regressions { " - " value: 4.0 " - " } ")); - } + EXPECT_THAT(result_, EqualsProto(" regressions { " + " value: 3.0 " + " } " + " regressions { " + " value: 4.0 " + " } ")); + + RegressionResponse response; + TF_ASSERT_OK(RunRegress(GetRunOptions(), saved_model_bundle_->meta_graph_def, + {}, fake_session_, request_, &response)); + EXPECT_THAT(response.result(), EqualsProto(" regressions { " + " value: 3.0 " + " } " + " regressions { " + " value: 4.0 " + " } ")); } -TEST_P(RegressorTest, InvalidNamedSignature) { +TEST_F(RegressorTest, InvalidNamedSignature) { TF_ASSERT_OK(Create()); request_.mutable_model_spec()->set_signature_name(kInvalidNamedSignature); auto* examples = request_.mutable_input()->mutable_example_list()->mutable_examples(); *examples->Add() = example_with_output(2.0); *examples->Add() = example_with_output(3.0); - const Status status = regressor_->Regress(request_, &result_); - - // GetParam() is 'is_saved_model' in this test. If using saved_model, this - // test should fail because the named_signature requested is actually a - // classification signature. When using session_bundle, the signature_name - // will be ignored and the default signature will be used. - if (GetParam()) { - ASSERT_FALSE(status.ok()); - EXPECT_EQ(::tensorflow::error::INVALID_ARGUMENT, status.code()) << status; - } else { - TF_ASSERT_OK(status); - EXPECT_THAT(result_, EqualsProto(" regressions { " - " value: 2.0 " - " } " - " regressions { " - " value: 3.0 " - " } ")); - } - // Test RunRegress - if (UseSavedModel()) { - RegressionResponse response; - const Status status = - RunRegress(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, - fake_session_, request_, &response); - ASSERT_FALSE(status.ok()); - EXPECT_EQ(::tensorflow::error::INVALID_ARGUMENT, status.code()) << status; - } -} + Status status = regressor_->Regress(request_, &result_); + ASSERT_FALSE(status.ok()); + EXPECT_EQ(::tensorflow::error::INVALID_ARGUMENT, status.code()) << status; -TEST_P(RegressorTest, MalformedOutputs) { - // If not using SavedModel, we don't use named signatures so the test is not - // actually testing the right thing. Skip it. - if (!GetParam()) { - return; - } + RegressionResponse response; + status = RunRegress(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, + fake_session_, request_, &response); + ASSERT_FALSE(status.ok()); + EXPECT_EQ(::tensorflow::error::INVALID_ARGUMENT, status.code()) << status; +} +TEST_F(RegressorTest, MalformedOutputs) { TF_ASSERT_OK(Create()); request_.mutable_model_spec()->set_signature_name( kImproperlySizedOutputSignature); @@ -511,188 +389,127 @@ TEST_P(RegressorTest, MalformedOutputs) { EXPECT_EQ(::tensorflow::error::INVALID_ARGUMENT, status.code()) << status; } -TEST_P(RegressorTest, EmptyInput) { +TEST_F(RegressorTest, EmptyInput) { TF_ASSERT_OK(Create()); // Touch input. request_.mutable_input(); - const Status status = regressor_->Regress(request_, &result_); + Status status = regressor_->Regress(request_, &result_); + ASSERT_FALSE(status.ok()); + EXPECT_THAT(status.ToString(), + ::testing::HasSubstr("Invalid argument: Input is empty")); + RegressionResponse response; + status = RunRegress(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, + fake_session_, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("Invalid argument: Input is empty")); - // Test RunRegress - if (UseSavedModel()) { - RegressionResponse response; - const Status status = - RunRegress(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, - fake_session_, request_, &response); - ASSERT_FALSE(status.ok()); - EXPECT_THAT(status.ToString(), - ::testing::HasSubstr("Invalid argument: Input is empty")); - } } -TEST_P(RegressorTest, EmptyExampleList) { +TEST_F(RegressorTest, EmptyExampleList) { TF_ASSERT_OK(Create()); request_.mutable_input()->mutable_example_list(); - const Status status = regressor_->Regress(request_, &result_); + Status status = regressor_->Regress(request_, &result_); + ASSERT_FALSE(status.ok()); + EXPECT_THAT(status.ToString(), + ::testing::HasSubstr("Invalid argument: Input is empty")); + RegressionResponse response; + status = RunRegress(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, + fake_session_, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("Invalid argument: Input is empty")); - // Test RunRegress - if (UseSavedModel()) { - RegressionResponse response; - const Status status = - RunRegress(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, - fake_session_, request_, &response); - ASSERT_FALSE(status.ok()); - EXPECT_THAT(status.ToString(), - ::testing::HasSubstr("Invalid argument: Input is empty")); - } } -TEST_P(RegressorTest, EmptyExampleListWithContext) { +TEST_F(RegressorTest, EmptyExampleListWithContext) { TF_ASSERT_OK(Create()); // Add a ExampleListWithContext which has context but no examples. *request_.mutable_input() ->mutable_example_list_with_context() ->mutable_context() = example_with_output(3); - const Status status = regressor_->Regress(request_, &result_); + Status status = regressor_->Regress(request_, &result_); + ASSERT_FALSE(status.ok()); + EXPECT_THAT(status.ToString(), + ::testing::HasSubstr("Invalid argument: Input is empty")); + RegressionResponse response; + status = RunRegress(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, + fake_session_, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("Invalid argument: Input is empty")); - // Test RunRegress - if (UseSavedModel()) { - RegressionResponse response; - const Status status = - RunRegress(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, - fake_session_, request_, &response); - ASSERT_FALSE(status.ok()); - EXPECT_THAT(status.ToString(), - ::testing::HasSubstr("Invalid argument: Input is empty")); - } } -TEST_P(RegressorTest, RunsFails) { +TEST_F(RegressorTest, RunsFails) { MockSession* mock = new MockSession; - if (UseSavedModel()) { - saved_model_bundle_->session.reset(mock); - } else { - bundle_->session.reset(mock); - } - if (GetParam()) { - EXPECT_CALL(*mock, Run(_, _, _, _, _, _)) - .WillRepeatedly( - ::testing::Return(errors::Internal("Run totally failed"))); - } else { - EXPECT_CALL(*mock, Run(_, _, _, _)) - .WillRepeatedly( - ::testing::Return(errors::Internal("Run totally failed"))); - } + saved_model_bundle_->session.reset(mock); + EXPECT_CALL(*mock, Run(_, _, _, _, _, _)) + .WillRepeatedly( + ::testing::Return(errors::Internal("Run totally failed"))); TF_ASSERT_OK(Create()); *request_.mutable_input()->mutable_example_list()->mutable_examples()->Add() = example_with_output(2.0); - const Status status = regressor_->Regress(request_, &result_); + Status status = regressor_->Regress(request_, &result_); + ASSERT_FALSE(status.ok()); + EXPECT_THAT(status.ToString(), ::testing::HasSubstr("Run totally failed")); + RegressionResponse response; + status = RunRegress(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, + mock, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("Run totally failed")); - // Test RunRegress - if (UseSavedModel()) { - RegressionResponse response; - const Status status = - RunRegress(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, - mock, request_, &response); - ASSERT_FALSE(status.ok()); - EXPECT_THAT(status.ToString(), ::testing::HasSubstr("Run totally failed")); - } } -TEST_P(RegressorTest, UnexpectedOutputTensorSize) { +TEST_F(RegressorTest, UnexpectedOutputTensorSize) { MockSession* mock = new MockSession; - if (UseSavedModel()) { - saved_model_bundle_->session.reset(mock); - } else { - bundle_->session.reset(mock); - } + saved_model_bundle_->session.reset(mock); std::vector outputs = {Tensor(DT_FLOAT, TensorShape({2}))}; - if (GetParam()) { - EXPECT_CALL(*mock, Run(_, _, _, _, _, _)) - .WillOnce(::testing::DoAll(::testing::SetArgPointee<4>(outputs), - ::testing::Return(Status::OK()))); - } else { - EXPECT_CALL(*mock, Run(_, _, _, _)) - .WillOnce(::testing::DoAll(::testing::SetArgPointee<3>(outputs), - ::testing::Return(Status::OK()))); - } + EXPECT_CALL(*mock, Run(_, _, _, _, _, _)) + .WillOnce(::testing::DoAll(::testing::SetArgPointee<4>(outputs), + ::testing::Return(Status::OK()))); TF_ASSERT_OK(Create()); *request_.mutable_input()->mutable_example_list()->mutable_examples()->Add() = example_with_output(2.0); - const Status status = regressor_->Regress(request_, &result_); + Status status = regressor_->Regress(request_, &result_); + ASSERT_FALSE(status.ok()); + EXPECT_THAT(status.ToString(), ::testing::HasSubstr("output batch size")); + EXPECT_CALL(*mock, Run(_, _, _, _, _, _)) + .WillOnce(::testing::DoAll(::testing::SetArgPointee<4>(outputs), + ::testing::Return(Status::OK()))); + RegressionResponse response; + status = RunRegress(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, + mock, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("output batch size")); - // Test RunRegress - if (UseSavedModel()) { - EXPECT_CALL(*mock, Run(_, _, _, _, _, _)) - .WillOnce(::testing::DoAll(::testing::SetArgPointee<4>(outputs), - ::testing::Return(Status::OK()))); - RegressionResponse response; - const Status status = - RunRegress(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, - mock, request_, &response); - ASSERT_FALSE(status.ok()); - EXPECT_THAT(status.ToString(), ::testing::HasSubstr("output batch size")); - } } -TEST_P(RegressorTest, UnexpectedOutputTensorType) { +TEST_F(RegressorTest, UnexpectedOutputTensorType) { MockSession* mock = new MockSession; - if (UseSavedModel()) { - saved_model_bundle_->session.reset(mock); - } else { - bundle_->session.reset(mock); - } + saved_model_bundle_->session.reset(mock); // We expect a FLOAT output type; test returning a STRING. std::vector outputs = {Tensor(DT_STRING, TensorShape({1}))}; - if (GetParam()) { - EXPECT_CALL(*mock, Run(_, _, _, _, _, _)) - .WillOnce(::testing::DoAll(::testing::SetArgPointee<4>(outputs), - ::testing::Return(Status::OK()))); - } else { - EXPECT_CALL(*mock, Run(_, _, _, _)) - .WillOnce(::testing::DoAll(::testing::SetArgPointee<3>(outputs), - ::testing::Return(Status::OK()))); - } + EXPECT_CALL(*mock, Run(_, _, _, _, _, _)) + .WillOnce(::testing::DoAll(::testing::SetArgPointee<4>(outputs), + ::testing::Return(Status::OK()))); TF_ASSERT_OK(Create()); *request_.mutable_input()->mutable_example_list()->mutable_examples()->Add() = example_with_output(2.0); - const Status status = regressor_->Regress(request_, &result_); + Status status = regressor_->Regress(request_, &result_); + ASSERT_FALSE(status.ok()); + EXPECT_THAT(status.ToString(), + ::testing::HasSubstr("Expected output Tensor of DT_FLOAT")); + EXPECT_CALL(*mock, Run(_, _, _, _, _, _)) + .WillOnce(::testing::DoAll(::testing::SetArgPointee<4>(outputs), + ::testing::Return(Status::OK()))); + RegressionResponse response; + status = RunRegress(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, + mock, request_, &response); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("Expected output Tensor of DT_FLOAT")); - // Test RunRegress - if (UseSavedModel()) { - EXPECT_CALL(*mock, Run(_, _, _, _, _, _)) - .WillOnce(::testing::DoAll(::testing::SetArgPointee<4>(outputs), - ::testing::Return(Status::OK()))); - RegressionResponse response; - const Status status = - RunRegress(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, - mock, request_, &response); - ASSERT_FALSE(status.ok()); - EXPECT_THAT(status.ToString(), - ::testing::HasSubstr("Expected output Tensor of DT_FLOAT")); - } } -TEST_P(RegressorTest, MissingRegressionSignature) { - if (UseSavedModel()) { - auto* signature_defs = meta_graph_def_->mutable_signature_def(); - SignatureDef sig_def; - (*signature_defs)["serving_default"] = sig_def; - } else { - tensorflow::serving::Signatures signatures; - signatures.mutable_default_signature(); - TF_ASSERT_OK(tensorflow::serving::session_bundle::SetSignatures( - signatures, meta_graph_def_)); - } +TEST_F(RegressorTest, MissingRegressionSignature) { + auto* signature_defs = meta_graph_def_->mutable_signature_def(); + SignatureDef sig_def; + (*signature_defs)["serving_default"] = sig_def; TF_ASSERT_OK(Create()); Feature feature; feature.mutable_bytes_list()->add_value("uno"); @@ -701,33 +518,16 @@ TEST_P(RegressorTest, MissingRegressionSignature) { *request_.mutable_input()->mutable_example_list()->mutable_examples()->Add() = example; // TODO(b/26220896): This error should move to construction time. - const Status status = regressor_->Regress(request_, &result_); + Status status = regressor_->Regress(request_, &result_); ASSERT_FALSE(status.ok()); - // Old SessionBundle code treats a missing signature as a FAILED_PRECONDITION - // but new SavedModel code treats it as an INVALID_ARGUMENT (signature - // specified in the request was invalid). - if (GetParam()) { - EXPECT_EQ(::tensorflow::error::INVALID_ARGUMENT, status.code()) << status; - } else { - EXPECT_EQ(::tensorflow::error::FAILED_PRECONDITION, status.code()) - << status; - } - // Test RunRegress - if (UseSavedModel()) { - RegressionResponse response; - const Status status = - RunRegress(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, - fake_session_, request_, &response); - ASSERT_FALSE(status.ok()); - EXPECT_EQ(::tensorflow::error::INVALID_ARGUMENT, status.code()) << status; - } + EXPECT_EQ(::tensorflow::error::INVALID_ARGUMENT, status.code()) << status; + RegressionResponse response; + status = RunRegress(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, + fake_session_, request_, &response); + ASSERT_FALSE(status.ok()); + EXPECT_EQ(::tensorflow::error::INVALID_ARGUMENT, status.code()) << status; } -// Test all RegressorTest test cases with both SessionBundle and SavedModel. -INSTANTIATE_TEST_CASE_P(UseSavedModel, RegressorTest, - IsTensorflowServingOSS() ? ::testing::Values(true) - : ::testing::Bool()); - } // namespace } // namespace serving } // namespace tensorflow From 2090d67f4e5e8ee5aa7faf8437bea096a438450a Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Thu, 16 Jan 2020 11:29:41 -0800 Subject: [PATCH 3638/8103] Remove SessionBundle support from Predictor. PiperOrigin-RevId: 290108220 --- .../model_servers/http_rest_api_handler.cc | 2 +- .../model_servers/prediction_service_impl.h | 2 +- tensorflow_serving/model_servers/server.cc | 1 - tensorflow_serving/servables/tensorflow/BUILD | 11 +- .../servables/tensorflow/predict_impl.cc | 125 -------------- .../servables/tensorflow/predict_impl.h | 7 +- .../servables/tensorflow/predict_impl_test.cc | 154 ++++-------------- 7 files changed, 37 insertions(+), 265 deletions(-) diff --git a/tensorflow_serving/model_servers/http_rest_api_handler.cc b/tensorflow_serving/model_servers/http_rest_api_handler.cc index 58e99b37b04..678079cf3f3 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler.cc +++ b/tensorflow_serving/model_servers/http_rest_api_handler.cc @@ -52,7 +52,7 @@ HttpRestApiHandler::HttpRestApiHandler(const RunOptions& run_options, ServerCore* core) : run_options_(run_options), core_(core), - predictor_(new TensorflowPredictor(true /* use_saved_model */)), + predictor_(new TensorflowPredictor()), prediction_api_regex_( R"((?i)/v1/models/([^/:]+)(?:/versions/(\d+))?:(classify|regress|predict))"), modelstatus_api_regex_( diff --git a/tensorflow_serving/model_servers/prediction_service_impl.h b/tensorflow_serving/model_servers/prediction_service_impl.h index a90e64975b3..213dd6f4a41 100644 --- a/tensorflow_serving/model_servers/prediction_service_impl.h +++ b/tensorflow_serving/model_servers/prediction_service_impl.h @@ -34,7 +34,7 @@ class PredictionServiceImpl final : public PredictionService::Service { explicit PredictionServiceImpl(const Options& options) : core_(options.server_core), - predictor_(new TensorflowPredictor(options.use_saved_model)), + predictor_(new TensorflowPredictor()), use_saved_model_(options.use_saved_model), enforce_session_run_timeout_(options.enforce_session_run_timeout) {} diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index e4e56e7c520..5742616935a 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -315,7 +315,6 @@ Status Server::BuildAndStart(const Options& server_options) { PredictionServiceImpl::Options predict_server_options; predict_server_options.server_core = server_core_.get(); - predict_server_options.use_saved_model = use_saved_model; predict_server_options.enforce_session_run_timeout = server_options.enforce_session_run_timeout; prediction_service_ = diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index 59d95b6246e..6554d53f7f7 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -441,7 +441,6 @@ cc_library( "//tensorflow_serving/apis:predict_cc_proto", "//tensorflow_serving/core:servable_handle", "//tensorflow_serving/model_servers:server_core", - "//tensorflow_serving/session_bundle:session_bundle_util", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", @@ -453,17 +452,11 @@ cc_test( size = "medium", srcs = ["predict_impl_test.cc"], data = [ - "@org_tensorflow//tensorflow/cc/saved_model:saved_model_half_plus_two", - "//tensorflow_serving/servables/tensorflow/testdata:bad_half_plus_two/00000123/export", - "//tensorflow_serving/servables/tensorflow/testdata:bad_half_plus_two/00000123/export.meta", "//tensorflow_serving/servables/tensorflow/testdata:saved_model_counter/00000123/saved_model.pb", "//tensorflow_serving/servables/tensorflow/testdata:saved_model_counter/00000123/variables/variables.data-00000-of-00001", "//tensorflow_serving/servables/tensorflow/testdata:saved_model_counter/00000123/variables/variables.index", - ] + if_google([ - "//tensorflow_serving/servables/tensorflow/google/testdata:half_plus_two/00000123/export.data-00000-of-00001", - "//tensorflow_serving/servables/tensorflow/google/testdata:half_plus_two/00000123/export.index", - "//tensorflow_serving/servables/tensorflow/google/testdata:half_plus_two/00000123/export.meta", - ]), + "@org_tensorflow//tensorflow/cc/saved_model:saved_model_half_plus_two", + ], deps = [ ":predict_impl", ":saved_model_bundle_source_adapter_cc_proto", diff --git a/tensorflow_serving/servables/tensorflow/predict_impl.cc b/tensorflow_serving/servables/tensorflow/predict_impl.cc index 430a17361f3..8bbd478cb73 100644 --- a/tensorflow_serving/servables/tensorflow/predict_impl.cc +++ b/tensorflow_serving/servables/tensorflow/predict_impl.cc @@ -24,125 +24,10 @@ limitations under the License. #include "tensorflow_serving/core/servable_handle.h" #include "tensorflow_serving/servables/tensorflow/predict_util.h" #include "tensorflow_serving/servables/tensorflow/util.h" -#include "tensorflow_serving/session_bundle/session_bundle_util.h" namespace tensorflow { namespace serving { -namespace { - -Status SessionBundlePredict( - const RunOptions& run_options, const MetaGraphDef& meta_graph_def, - const optional& servable_version, - const internal::PredictResponseTensorSerializationOption option, - const PredictRequest& request, PredictResponse* response, - Session* session) { - // Validate signatures. - Signature signature; - TF_RETURN_IF_ERROR( - session_bundle::GetNamedSignature("inputs", meta_graph_def, &signature)); - if (!signature.has_generic_signature()) { - return tensorflow::Status( - tensorflow::error::INVALID_ARGUMENT, - "'inputs' named signature is not a generic signature"); - } - GenericSignature input_signature = signature.generic_signature(); - TF_RETURN_IF_ERROR( - session_bundle::GetNamedSignature("outputs", meta_graph_def, &signature)); - if (!signature.has_generic_signature()) { - return tensorflow::Status( - tensorflow::error::INVALID_ARGUMENT, - "'outputs' named signature is not a generic signature"); - } - GenericSignature output_signature = signature.generic_signature(); - - // Verify and prepare input. - if (request.inputs().size() != input_signature.map().size()) { - return tensorflow::Status(tensorflow::error::INVALID_ARGUMENT, - "input size does not match signature"); - } - std::vector> inputs; - for (auto& input : request.inputs()) { - const string& alias = input.first; - auto iter = input_signature.map().find(alias); - if (iter == input_signature.map().end()) { - return tensorflow::Status( - tensorflow::error::INVALID_ARGUMENT, - "input tensor alias not found in signature: " + alias); - } - Tensor tensor; - if (!tensor.FromProto(input.second)) { - return tensorflow::Status(tensorflow::error::INVALID_ARGUMENT, - "tensor parsing error: " + alias); - } - inputs.emplace_back(std::make_pair(iter->second.tensor_name(), tensor)); - } - - // Prepare run target. - std::set seen_outputs; - std::vector output_filter(request.output_filter().begin(), - request.output_filter().end()); - std::vector output_tensor_names; - std::vector output_aliases; - for (auto& alias : output_filter) { - auto iter = output_signature.map().find(alias); - if (iter == output_signature.map().end()) { - return tensorflow::Status( - tensorflow::error::INVALID_ARGUMENT, - "output tensor alias not found in signature: " + alias); - } - if (seen_outputs.find(alias) != seen_outputs.end()) { - return tensorflow::Status(tensorflow::error::INVALID_ARGUMENT, - "duplicate output tensor alias: " + alias); - } - seen_outputs.insert(alias); - output_tensor_names.emplace_back(iter->second.tensor_name()); - output_aliases.emplace_back(alias); - } - // When no output is specified, fetch all output tensors specified in - // the signature. - if (output_tensor_names.empty()) { - for (auto& iter : output_signature.map()) { - output_tensor_names.emplace_back(iter.second.tensor_name()); - output_aliases.emplace_back(iter.first); - } - } - - MakeModelSpec(request.model_spec().name(), /*signature_name=*/{}, - servable_version, response->mutable_model_spec()); - - // Run session. - std::vector outputs; - RunMetadata run_metadata; - TF_RETURN_IF_ERROR(session->Run(run_options, inputs, output_tensor_names, {}, - &outputs, &run_metadata)); - - // Validate and return output. - if (outputs.size() != output_tensor_names.size()) { - return tensorflow::Status(tensorflow::error::UNKNOWN, - "Predict internal error"); - } - - switch (option) { - case internal::PredictResponseTensorSerializationOption::kAsProtoField: { - for (int i = 0; i < outputs.size(); i++) { - outputs[i].AsProtoField( - &((*response->mutable_outputs())[output_aliases[i]])); - } - } break; - case internal::PredictResponseTensorSerializationOption::kAsProtoContent: { - for (int i = 0; i < outputs.size(); i++) { - outputs[i].AsProtoTensorContent( - &((*response->mutable_outputs())[output_aliases[i]])); - } - } break; - } - - return Status::OK(); -} - -} // namespace - Status TensorflowPredictor::Predict(const RunOptions& run_options, ServerCore* core, const PredictRequest& request, @@ -160,22 +45,12 @@ Status TensorflowPredictor::PredictWithModelSpec(const RunOptions& run_options, const ModelSpec& model_spec, const PredictRequest& request, PredictResponse* response) { - if (use_saved_model_) { ServableHandle bundle; TF_RETURN_IF_ERROR(core->GetServableHandle(model_spec, &bundle)); return internal::RunPredict( run_options, bundle->meta_graph_def, bundle.id().version, core->predict_response_tensor_serialization_option(), bundle->session.get(), request, response); - } - ServableHandle bundle; - TF_RETURN_IF_ERROR(core->GetServableHandle(model_spec, &bundle)); - // SessionBundle is officially deprecated. SessionBundlePredict is for - // backward compatibility. - return SessionBundlePredict( - run_options, bundle->meta_graph_def, bundle.id().version, - core->predict_response_tensor_serialization_option(), request, response, - bundle->session.get()); } } // namespace serving diff --git a/tensorflow_serving/servables/tensorflow/predict_impl.h b/tensorflow_serving/servables/tensorflow/predict_impl.h index 9c9bc3e8bb2..0bcca7dd41a 100644 --- a/tensorflow_serving/servables/tensorflow/predict_impl.h +++ b/tensorflow_serving/servables/tensorflow/predict_impl.h @@ -28,8 +28,7 @@ namespace serving { // Utility methods for implementation of PredictionService::Predict. class TensorflowPredictor { public: - explicit TensorflowPredictor(bool use_saved_model) - : use_saved_model_(use_saved_model) {} + explicit TensorflowPredictor() {} Status Predict(const RunOptions& run_options, ServerCore* core, const PredictRequest& request, PredictResponse* response); @@ -42,10 +41,6 @@ class TensorflowPredictor { PredictResponse* response); private: - // If use_saved_model_ is true, a SavedModelBundle handle will be retrieved - // from the ServerCore and the new SavedModel SignatureDef format will be - // used. - bool use_saved_model_; }; } // namespace serving diff --git a/tensorflow_serving/servables/tensorflow/predict_impl_test.cc b/tensorflow_serving/servables/tensorflow/predict_impl_test.cc index 894a33eba91..9c4429d3614 100644 --- a/tensorflow_serving/servables/tensorflow/predict_impl_test.cc +++ b/tensorflow_serving/servables/tensorflow/predict_impl_test.cc @@ -25,7 +25,6 @@ limitations under the License. #include "tensorflow_serving/model_servers/server_core.h" #include "tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter.pb.h" #include "tensorflow_serving/servables/tensorflow/session_bundle_config.pb.h" -#include "tensorflow_serving/servables/tensorflow/session_bundle_source_adapter.pb.h" #include "tensorflow_serving/test_util/test_util.h" #include "tensorflow_serving/util/oss_or_google.h" @@ -39,42 +38,27 @@ constexpr int kTestModelVersion = 123; const char kInputTensorKey[] = "x"; const char kOutputTensorKey[] = "y"; -// Parameter is 'bool use_saved_model'. -class PredictImplTest : public ::testing::TestWithParam { +class PredictImplTest : public ::testing::Test { public: static void SetUpTestSuite() { - if (!IsTensorflowServingOSS()) { - TF_ASSERT_OK(CreateServerCore( - test_util::TestSrcDirPath( - "/servables/tensorflow/google/testdata/half_plus_two"), - false, &server_core_)); - const string bad_half_plus_two_path = test_util::TestSrcDirPath( - "/servables/tensorflow/testdata/bad_half_plus_two"); - TF_ASSERT_OK(CreateServerCore(bad_half_plus_two_path, false, - &server_core_bad_model_)); - TF_ASSERT_OK(CreateServerCore(bad_half_plus_two_path, true, - &saved_model_server_core_bad_model_)); - } - TF_ASSERT_OK(CreateServerCore(test_util::TensorflowTestSrcDirPath( "cc/saved_model/testdata/half_plus_two"), - true, &saved_model_server_core_)); + &saved_model_server_core_)); TF_ASSERT_OK(CreateServerCore( test_util::TestSrcDirPath( "/servables/tensorflow/testdata/saved_model_counter"), - true, &saved_model_server_core_counter_model_)); + &saved_model_server_core_counter_model_)); } static void TearDownTestSuite() { server_core_.reset(); server_core_bad_model_.reset(); saved_model_server_core_.reset(); - saved_model_server_core_bad_model_.reset(); saved_model_server_core_counter_model_.reset(); } protected: - static Status CreateServerCore(const string& model_path, bool use_saved_model, + static Status CreateServerCore(const string& model_path, std::unique_ptr* server_core) { ModelServerConfig config; auto model_config = config.mutable_model_config_list()->add_config(); @@ -87,7 +71,7 @@ class PredictImplTest : public ::testing::TestWithParam { ServerCore::Options options; options.model_server_config = config; options.platform_config_map = CreateTensorFlowPlatformConfigMap( - SessionBundleConfig(), use_saved_model); + SessionBundleConfig(), /*use_saved_model=*/true); options.aspired_version_policy = std::unique_ptr(new AvailabilityPreservingPolicy); // Reduce the number of initial load threads to be num_load_threads to avoid @@ -96,19 +80,7 @@ class PredictImplTest : public ::testing::TestWithParam { return ServerCore::Create(std::move(options), server_core); } - ServerCore* GetServerCore() { - if (GetParam()) { - return saved_model_server_core_.get(); - } - return server_core_.get(); - } - - ServerCore* GetServerCoreWithBadModel() { - if (GetParam()) { - return saved_model_server_core_bad_model_.get(); - } - return server_core_bad_model_.get(); - } + ServerCore* GetServerCore() { return saved_model_server_core_.get(); } ServerCore* GetServerCoreWithCounterModel() { return saved_model_server_core_counter_model_.get(); @@ -120,23 +92,21 @@ class PredictImplTest : public ::testing::TestWithParam { static std::unique_ptr server_core_; static std::unique_ptr server_core_bad_model_; static std::unique_ptr saved_model_server_core_; - static std::unique_ptr saved_model_server_core_bad_model_; static std::unique_ptr saved_model_server_core_counter_model_; }; std::unique_ptr PredictImplTest::server_core_; std::unique_ptr PredictImplTest::server_core_bad_model_; std::unique_ptr PredictImplTest::saved_model_server_core_; -std::unique_ptr PredictImplTest::saved_model_server_core_bad_model_; std::unique_ptr PredictImplTest::saved_model_server_core_counter_model_; -TEST_P(PredictImplTest, MissingOrEmptyModelSpec) { +TEST_F(PredictImplTest, MissingOrEmptyModelSpec) { PredictRequest request; PredictResponse response; // Empty request is invalid. - TensorflowPredictor predictor(GetParam()); + TensorflowPredictor predictor; EXPECT_EQ( tensorflow::error::INVALID_ARGUMENT, predictor.Predict(GetRunOptions(), GetServerCore(), request, &response) @@ -159,7 +129,7 @@ TEST_P(PredictImplTest, MissingOrEmptyModelSpec) { .code()); } -TEST_P(PredictImplTest, EmptyInputList) { +TEST_F(PredictImplTest, EmptyInputList) { PredictRequest request; PredictResponse response; @@ -167,7 +137,7 @@ TEST_P(PredictImplTest, EmptyInputList) { model_spec->set_name(kTestModelName); model_spec->mutable_version()->set_value(kTestModelVersion); - TensorflowPredictor predictor(GetParam()); + TensorflowPredictor predictor; // The input is empty. EXPECT_EQ( tensorflow::error::INVALID_ARGUMENT, @@ -175,7 +145,7 @@ TEST_P(PredictImplTest, EmptyInputList) { .code()); } -TEST_P(PredictImplTest, InputTensorsDontMatchModelSpecInputs) { +TEST_F(PredictImplTest, InputTensorsDontMatchModelSpecInputs) { PredictRequest request; PredictResponse response; @@ -188,7 +158,7 @@ TEST_P(PredictImplTest, InputTensorsDontMatchModelSpecInputs) { tensor_proto.set_dtype(tensorflow::DT_STRING); tensor_proto.mutable_tensor_shape()->add_dim()->set_size(1); - TensorflowPredictor predictor(GetParam()); + TensorflowPredictor predictor; auto inputs = request.mutable_inputs(); (*inputs)["key"] = tensor_proto; EXPECT_EQ( @@ -197,7 +167,7 @@ TEST_P(PredictImplTest, InputTensorsDontMatchModelSpecInputs) { .code()); } -TEST_P(PredictImplTest, OutputFiltersDontMatchModelSpecOutputs) { +TEST_F(PredictImplTest, OutputFiltersDontMatchModelSpecOutputs) { PredictRequest request; PredictResponse response; @@ -211,7 +181,7 @@ TEST_P(PredictImplTest, OutputFiltersDontMatchModelSpecOutputs) { (*request.mutable_inputs())[kInputTensorKey] = tensor_proto; request.add_output_filter("output_filter"); - TensorflowPredictor predictor(GetParam()); + TensorflowPredictor predictor; // Output filter like this doesn't exist. EXPECT_EQ( tensorflow::error::INVALID_ARGUMENT, @@ -231,7 +201,7 @@ TEST_P(PredictImplTest, OutputFiltersDontMatchModelSpecOutputs) { .code()); } -TEST_P(PredictImplTest, InputTensorsHaveWrongType) { +TEST_F(PredictImplTest, InputTensorsHaveWrongType) { PredictRequest request; PredictResponse response; @@ -246,7 +216,7 @@ TEST_P(PredictImplTest, InputTensorsHaveWrongType) { (*request.mutable_inputs())[kInputTensorKey] = tensor_proto; request.add_output_filter(kOutputTensorKey); - TensorflowPredictor predictor(GetParam()); + TensorflowPredictor predictor; // Input tensors are all wrong. EXPECT_EQ( tensorflow::error::INVALID_ARGUMENT, @@ -254,28 +224,7 @@ TEST_P(PredictImplTest, InputTensorsHaveWrongType) { .code()); } -TEST_P(PredictImplTest, ModelMissingSignatures) { - if (GetParam()) { - // The test is only related to SessionBundle. - return; - } - PredictRequest request; - PredictResponse response; - - ModelSpec* model_spec = request.mutable_model_spec(); - model_spec->set_name(kTestModelName); - model_spec->mutable_version()->set_value(kTestModelVersion); - - // Model is missing signatures. - TensorflowPredictor predictor(GetParam()); - EXPECT_EQ(tensorflow::error::FAILED_PRECONDITION, - predictor - .Predict(GetRunOptions(), GetServerCoreWithBadModel(), request, - &response) - .code()); -} - -TEST_P(PredictImplTest, PredictionSuccess) { +TEST_F(PredictImplTest, PredictionSuccess) { PredictRequest request; PredictResponse response; @@ -288,7 +237,7 @@ TEST_P(PredictImplTest, PredictionSuccess) { tensor_proto.set_dtype(tensorflow::DT_FLOAT); (*request.mutable_inputs())[kInputTensorKey] = tensor_proto; - TensorflowPredictor predictor(GetParam()); + TensorflowPredictor predictor; TF_EXPECT_OK( predictor.Predict(GetRunOptions(), GetServerCore(), request, &response)); TensorProto output_tensor_proto; @@ -297,19 +246,15 @@ TEST_P(PredictImplTest, PredictionSuccess) { output_tensor_proto.mutable_tensor_shape(); PredictResponse expected_response; *expected_response.mutable_model_spec() = *model_spec; - // signature_name in ModelSpec is populated only for SavedModels. - if (GetParam()) { - expected_response.mutable_model_spec()->set_signature_name( - kDefaultServingSignatureDefKey); - } + expected_response.mutable_model_spec()->set_signature_name( + kDefaultServingSignatureDefKey); (*expected_response.mutable_outputs())[kOutputTensorKey] = output_tensor_proto; EXPECT_THAT(response, test_util::EqualsProto(expected_response)); } -// Test querying a model with a named regression signature (not default). This -// will work with SavedModel but not supported in the legacy SessionBundle. -TEST_P(PredictImplTest, PredictionWithNamedRegressionSignature) { +// Test querying a model with a named regression signature (not default). +TEST_F(PredictImplTest, PredictionWithNamedRegressionSignature) { PredictRequest request; PredictResponse response; @@ -322,18 +267,9 @@ TEST_P(PredictImplTest, PredictionWithNamedRegressionSignature) { tensor_proto.add_float_val(2.0); tensor_proto.set_dtype(tensorflow::DT_FLOAT); (*request.mutable_inputs())[kRegressInputs] = tensor_proto; - TensorflowPredictor predictor(GetParam()); - // This request is expected to work with SavedModel, but not SessionBundle. - if (GetParam()) { - TF_ASSERT_OK(predictor.Predict(GetRunOptions(), GetServerCore(), request, - &response)); - } else { - ASSERT_EQ( - tensorflow::error::INVALID_ARGUMENT, - predictor.Predict(GetRunOptions(), GetServerCore(), request, &response) - .code()); - return; - } + TensorflowPredictor predictor; + TF_ASSERT_OK( + predictor.Predict(GetRunOptions(), GetServerCore(), request, &response)); TensorProto output_tensor_proto; output_tensor_proto.add_float_val(4); output_tensor_proto.set_dtype(tensorflow::DT_FLOAT); @@ -345,9 +281,8 @@ TEST_P(PredictImplTest, PredictionWithNamedRegressionSignature) { } // Test querying a model with a classification signature. Predict calls work -// with predict, classify, and regress signatures when using SavedModel, but -// will only work with a generic signature when using legacy SessionBundle. -TEST_P(PredictImplTest, PredictionWithNamedClassificationSignature) { +// with predict, classify, and regress signatures when using SavedModel. +TEST_F(PredictImplTest, PredictionWithNamedClassificationSignature) { PredictRequest request; PredictResponse response; @@ -361,16 +296,7 @@ TEST_P(PredictImplTest, PredictionWithNamedClassificationSignature) { tensor_proto.set_dtype(tensorflow::DT_FLOAT); (*request.mutable_inputs())[kClassifyInputs] = tensor_proto; - TensorflowPredictor predictor(GetParam()); - // This request is expected to work with SavedModel, but not SessionBundle. - const bool using_session_bundle = !GetParam(); - if (using_session_bundle) { - ASSERT_EQ( - tensorflow::error::INVALID_ARGUMENT, - predictor.Predict(GetRunOptions(), GetServerCore(), request, &response) - .code()); - return; - } + TensorflowPredictor predictor; TF_ASSERT_OK( predictor.Predict(GetRunOptions(), GetServerCore(), request, &response)); TensorProto output_tensor_proto; @@ -391,10 +317,10 @@ TEST_P(PredictImplTest, PredictionWithNamedClassificationSignature) { // *Notes*: These signatures are stateful and over-simplied only to demonstrate // Predict calls with only inputs or outputs. State is not supported in // TensorFlow Serving on most scalable or production hosting environments. -TEST_P(PredictImplTest, PredictionWithCustomizedSignatures) { +TEST_F(PredictImplTest, PredictionWithCustomizedSignatures) { PredictRequest request; PredictResponse response; - TensorflowPredictor predictor(GetParam()); + TensorflowPredictor predictor; // Call get_counter. Expected result 0. ModelSpec* model_spec = request.mutable_model_spec(); @@ -402,17 +328,6 @@ TEST_P(PredictImplTest, PredictionWithCustomizedSignatures) { model_spec->mutable_version()->set_value(kTestModelVersion); model_spec->set_signature_name("get_counter"); - // This request is expected to work with SavedModel, but not SessionBundle. - const bool using_session_bundle = !GetParam(); - if (using_session_bundle) { - ASSERT_EQ(tensorflow::error::INVALID_ARGUMENT, - predictor - .Predict(GetRunOptions(), GetServerCoreWithCounterModel(), - request, &response) - .code()); - return; - } - TF_ASSERT_OK(predictor.Predict( GetRunOptions(), GetServerCoreWithCounterModel(), request, &response)); @@ -492,7 +407,7 @@ TEST_P(PredictImplTest, PredictionWithCustomizedSignatures) { // Verifies that PredictWithModelSpec() uses the model spec override rather than // the one in the request. -TEST_P(PredictImplTest, ModelSpecOverride) { +TEST_F(PredictImplTest, ModelSpecOverride) { auto request = test_util::CreateProto( "model_spec {" " name: \"test_model\"" @@ -500,7 +415,7 @@ TEST_P(PredictImplTest, ModelSpecOverride) { auto model_spec_override = test_util::CreateProto("name: \"nonexistent_model\""); - TensorflowPredictor predictor(GetParam()); + TensorflowPredictor predictor; PredictResponse response; EXPECT_NE(tensorflow::error::NOT_FOUND, predictor.Predict(RunOptions(), GetServerCore(), request, &response) @@ -512,11 +427,6 @@ TEST_P(PredictImplTest, ModelSpecOverride) { .code()); } -// Test all PredictImplTest test cases with both SessionBundle and SavedModel. -INSTANTIATE_TEST_CASE_P(UseSavedModel, PredictImplTest, - IsTensorflowServingOSS() ? ::testing::Values(true) - : ::testing::Bool()); - } // namespace } // namespace serving } // namespace tensorflow From ab475bf6c5e5e4b3b42ffa2aecf18b39fd481ad3 Mon Sep 17 00:00:00 2001 From: Gunhan Gulsoy Date: Fri, 17 Jan 2020 08:11:05 -0800 Subject: [PATCH 3639/8103] Replace the error_codes.proto references in tf serving. This file has been moved in TF PiperOrigin-RevId: 290272697 --- tensorflow_serving/batching/batch_scheduler_retrier_test.cc | 2 +- .../batching/streaming_batch_scheduler_test.cc | 2 +- tensorflow_serving/core/aspired_versions_manager_test.cc | 2 +- tensorflow_serving/core/basic_manager_test.cc | 2 +- tensorflow_serving/core/loader_harness_test.cc | 2 +- tensorflow_serving/core/log_collector_test.cc | 2 +- tensorflow_serving/core/request_logger.cc | 2 +- tensorflow_serving/core/simple_loader_test.cc | 2 +- tensorflow_serving/model_servers/server_core_test.cc | 2 +- .../servables/tensorflow/get_model_metadata_impl_test.cc | 2 +- tensorflow_serving/util/status.proto | 6 +++--- 11 files changed, 13 insertions(+), 13 deletions(-) diff --git a/tensorflow_serving/batching/batch_scheduler_retrier_test.cc b/tensorflow_serving/batching/batch_scheduler_retrier_test.cc index 9583f2e47a4..31825866c5b 100644 --- a/tensorflow_serving/batching/batch_scheduler_retrier_test.cc +++ b/tensorflow_serving/batching/batch_scheduler_retrier_test.cc @@ -19,12 +19,12 @@ limitations under the License. #include #include "tensorflow/core/kernels/batching_util/fake_clock_env.h" -#include "tensorflow/core/lib/core/error_codes.pb.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/lib/core/notification.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/lib/core/status_test_util.h" #include "tensorflow/core/platform/macros.h" +#include "tensorflow/core/protobuf/error_codes.pb.h" namespace tensorflow { namespace serving { diff --git a/tensorflow_serving/batching/streaming_batch_scheduler_test.cc b/tensorflow_serving/batching/streaming_batch_scheduler_test.cc index 2e49319e6af..63c7ae579a6 100644 --- a/tensorflow_serving/batching/streaming_batch_scheduler_test.cc +++ b/tensorflow_serving/batching/streaming_batch_scheduler_test.cc @@ -20,9 +20,9 @@ limitations under the License. #include #include #include "tensorflow/core/kernels/batching_util/fake_clock_env.h" -#include "tensorflow/core/lib/core/error_codes.pb.h" #include "tensorflow/core/lib/core/status_test_util.h" #include "tensorflow/core/platform/macros.h" +#include "tensorflow/core/protobuf/error_codes.pb.h" using ::testing::ElementsAre; using ::testing::IsEmpty; diff --git a/tensorflow_serving/core/aspired_versions_manager_test.cc b/tensorflow_serving/core/aspired_versions_manager_test.cc index 6127a5a22b4..a51948e18cd 100644 --- a/tensorflow_serving/core/aspired_versions_manager_test.cc +++ b/tensorflow_serving/core/aspired_versions_manager_test.cc @@ -20,11 +20,11 @@ limitations under the License. #include #include -#include "tensorflow/core/lib/core/error_codes.pb.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/lib/core/notification.h" #include "tensorflow/core/lib/core/status_test_util.h" #include "tensorflow/core/lib/strings/strcat.h" +#include "tensorflow/core/protobuf/error_codes.pb.h" #include "tensorflow_serving/core/availability_preserving_policy.h" #include "tensorflow_serving/core/servable_state_monitor.h" #include "tensorflow_serving/core/test_util/availability_test_util.h" diff --git a/tensorflow_serving/core/basic_manager_test.cc b/tensorflow_serving/core/basic_manager_test.cc index 61070716412..513e222a01b 100644 --- a/tensorflow_serving/core/basic_manager_test.cc +++ b/tensorflow_serving/core/basic_manager_test.cc @@ -21,11 +21,11 @@ limitations under the License. #include #include #include "tensorflow/core/lib/core/blocking_counter.h" -#include "tensorflow/core/lib/core/error_codes.pb.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/lib/core/status_test_util.h" #include "tensorflow/core/lib/strings/strcat.h" #include "tensorflow/core/platform/null_file_system.h" +#include "tensorflow/core/protobuf/error_codes.pb.h" #include "tensorflow_serving/core/servable_state_monitor.h" #include "tensorflow_serving/core/test_util/availability_test_util.h" #include "tensorflow_serving/core/test_util/fake_loader.h" diff --git a/tensorflow_serving/core/loader_harness_test.cc b/tensorflow_serving/core/loader_harness_test.cc index 82001a4fcd5..b2ad23c2f6b 100644 --- a/tensorflow_serving/core/loader_harness_test.cc +++ b/tensorflow_serving/core/loader_harness_test.cc @@ -19,11 +19,11 @@ limitations under the License. #include #include -#include "tensorflow/core/lib/core/error_codes.pb.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/lib/core/notification.h" #include "tensorflow/core/lib/core/status_test_util.h" #include "tensorflow/core/platform/env.h" +#include "tensorflow/core/protobuf/error_codes.pb.h" #include "tensorflow_serving/core/test_util/mock_loader.h" #include "tensorflow_serving/test_util/test_util.h" #include "tensorflow_serving/util/any_ptr.h" diff --git a/tensorflow_serving/core/log_collector_test.cc b/tensorflow_serving/core/log_collector_test.cc index ff68babd756..5f61565b0db 100644 --- a/tensorflow_serving/core/log_collector_test.cc +++ b/tensorflow_serving/core/log_collector_test.cc @@ -16,8 +16,8 @@ limitations under the License. #include "tensorflow_serving/core/log_collector.h" #include -#include "tensorflow/core/lib/core/error_codes.pb.h" #include "tensorflow/core/lib/core/status_test_util.h" +#include "tensorflow/core/protobuf/error_codes.pb.h" #include "tensorflow_serving/config/log_collector_config.pb.h" namespace tensorflow { diff --git a/tensorflow_serving/core/request_logger.cc b/tensorflow_serving/core/request_logger.cc index 6db237aa955..3de5a84136f 100644 --- a/tensorflow_serving/core/request_logger.cc +++ b/tensorflow_serving/core/request_logger.cc @@ -18,10 +18,10 @@ limitations under the License. #include #include -#include "tensorflow/core/lib/core/error_codes.pb.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/lib/monitoring/counter.h" #include "tensorflow/core/lib/random/random.h" +#include "tensorflow/core/protobuf/error_codes.pb.h" #include "tensorflow_serving/apis/model.pb.h" namespace tensorflow { diff --git a/tensorflow_serving/core/simple_loader_test.cc b/tensorflow_serving/core/simple_loader_test.cc index c7374129b35..864ea61b76c 100644 --- a/tensorflow_serving/core/simple_loader_test.cc +++ b/tensorflow_serving/core/simple_loader_test.cc @@ -20,11 +20,11 @@ limitations under the License. #include #include "absl/memory/memory.h" -#include "tensorflow/core/lib/core/error_codes.pb.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/lib/core/status_test_util.h" #include "tensorflow/core/lib/core/stringpiece.h" #include "tensorflow/core/lib/strings/strcat.h" +#include "tensorflow/core/protobuf/error_codes.pb.h" #include "tensorflow_serving/core/servable_data.h" #include "tensorflow_serving/core/servable_id.h" #include "tensorflow_serving/test_util/test_util.h" diff --git a/tensorflow_serving/model_servers/server_core_test.cc b/tensorflow_serving/model_servers/server_core_test.cc index 882e67ae018..41c5e516ce4 100644 --- a/tensorflow_serving/model_servers/server_core_test.cc +++ b/tensorflow_serving/model_servers/server_core_test.cc @@ -18,13 +18,13 @@ limitations under the License. #include "google/protobuf/any.pb.h" #include "absl/strings/strip.h" #include "tensorflow/cc/saved_model/tag_constants.h" -#include "tensorflow/core/lib/core/error_codes.pb.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/lib/core/status_test_util.h" #include "tensorflow/core/lib/io/path.h" #include "tensorflow/core/lib/random/random.h" #include "tensorflow/core/lib/strings/stringprintf.h" #include "tensorflow/core/platform/path.h" +#include "tensorflow/core/protobuf/error_codes.pb.h" #include "tensorflow_serving/apis/model.pb.h" #include "tensorflow_serving/apis/predict.pb.h" #include "tensorflow_serving/core/servable_handle.h" diff --git a/tensorflow_serving/servables/tensorflow/get_model_metadata_impl_test.cc b/tensorflow_serving/servables/tensorflow/get_model_metadata_impl_test.cc index 784e4a7052a..e86a8308f90 100644 --- a/tensorflow_serving/servables/tensorflow/get_model_metadata_impl_test.cc +++ b/tensorflow_serving/servables/tensorflow/get_model_metadata_impl_test.cc @@ -25,9 +25,9 @@ limitations under the License. #include #include "tensorflow/cc/saved_model/loader.h" #include "tensorflow/cc/saved_model/signature_constants.h" -#include "tensorflow/core/lib/core/error_codes.pb.h" #include "tensorflow/core/lib/core/status_test_util.h" #include "tensorflow/core/platform/types.h" +#include "tensorflow/core/protobuf/error_codes.pb.h" #include "tensorflow/core/protobuf/meta_graph.pb.h" #include "tensorflow_serving/apis/model.pb.h" #include "tensorflow_serving/config/model_server_config.pb.h" diff --git a/tensorflow_serving/util/status.proto b/tensorflow_serving/util/status.proto index 8588c780226..332d1b782af 100644 --- a/tensorflow_serving/util/status.proto +++ b/tensorflow_serving/util/status.proto @@ -1,10 +1,10 @@ syntax = "proto3"; -option cc_enable_arenas = true; +package tensorflow.serving; -import "tensorflow/core/lib/core/error_codes.proto"; +import "tensorflow/core/protobuf/error_codes.proto"; -package tensorflow.serving; +option cc_enable_arenas = true; // Status that corresponds to Status in // third_party/tensorflow/core/lib/core/status.h. From 4dcfa25b2b65f5a288c774489ad114a2744b56f9 Mon Sep 17 00:00:00 2001 From: Mingming Liu Date: Wed, 22 Jan 2020 10:04:17 -0800 Subject: [PATCH 3640/8103] In ServableStateMonitor, introduce a helper method 'GetAvailableServables' in ServableStateMonitor. PiperOrigin-RevId: 290975526 --- .../core/servable_state_monitor.cc | 19 ++++++++ .../core/servable_state_monitor.h | 7 +++ .../core/servable_state_monitor_test.cc | 46 +++++++++++++++++++ 3 files changed, 72 insertions(+) diff --git a/tensorflow_serving/core/servable_state_monitor.cc b/tensorflow_serving/core/servable_state_monitor.cc index 9c425c7c711..6eb978668d6 100644 --- a/tensorflow_serving/core/servable_state_monitor.cc +++ b/tensorflow_serving/core/servable_state_monitor.cc @@ -17,6 +17,7 @@ limitations under the License. #include "tensorflow/core/lib/core/notification.h" #include "tensorflow/core/lib/gtl/cleanup.h" +#include "tensorflow_serving/core/servable_state.h" namespace tensorflow { namespace serving { @@ -173,6 +174,24 @@ ServableStateMonitor::ServableMap ServableStateMonitor::GetLiveServableStates() return live_states_; } +ServableStateMonitor::ServableSet +ServableStateMonitor::GetAvailableServableStates() const { + ServableSet available_servable_set; + mutex_lock l(mu_); + for (const auto& live_state : live_states_) { + const string& servable_name = live_state.first; + const auto& version_map = live_state.second; + for (const auto& version : version_map) { + const ServableStateAndTime state_and_time = version.second; + if (state_and_time.state.manager_state == + ServableState::ManagerState::kAvailable) { + available_servable_set.insert(servable_name); + } + } + } + return available_servable_set; +} + ServableStateMonitor::BoundedLog ServableStateMonitor::GetBoundedLog() const { mutex_lock l(mu_); return log_; diff --git a/tensorflow_serving/core/servable_state_monitor.h b/tensorflow_serving/core/servable_state_monitor.h index b5687305f2b..d900284a26c 100644 --- a/tensorflow_serving/core/servable_state_monitor.h +++ b/tensorflow_serving/core/servable_state_monitor.h @@ -66,6 +66,7 @@ class ServableStateMonitor { using VersionMap = std::map>; using ServableMap = std::map; + using ServableSet = std::set; struct Options { Options() {} @@ -104,6 +105,12 @@ class ServableStateMonitor { /// transitioned to state ServableState::ManagerState::kEnd. ServableMap GetLiveServableStates() const LOCKS_EXCLUDED(mu_); + // Returns all servables that are in state + // ServableState::ManagerState::kAvailable. + // Note that as opposed to GetAllServableStates() and GetLiveServableStates(), + // this method loops over all the tracked servables. + ServableSet GetAvailableServableStates() const LOCKS_EXCLUDED(mu_); + /// Returns the current bounded log of handled servable state events. BoundedLog GetBoundedLog() const LOCKS_EXCLUDED(mu_); diff --git a/tensorflow_serving/core/servable_state_monitor_test.cc b/tensorflow_serving/core/servable_state_monitor_test.cc index f38d6c7804e..d61f15a72fd 100644 --- a/tensorflow_serving/core/servable_state_monitor_test.cc +++ b/tensorflow_serving/core/servable_state_monitor_test.cc @@ -251,6 +251,52 @@ TEST(ServableStateMonitorTest, GetLiveServableStates) { Pair("bar", ElementsAre(Pair(7, state_1_and_time))))); } +TEST(ServableStateMonitorTest, GetAvailableServableStates) { + test_util::FakeClockEnv env(Env::Default()); + EventBus::Options bus_options; + bus_options.env = &env; + auto bus = EventBus::CreateEventBus(bus_options); + ServableStateMonitor monitor(bus.get()); + + const ServableState state_0 = { + ServableId{"foo", 42}, ServableState::ManagerState::kStart, Status::OK()}; + env.AdvanceByMicroseconds(1); + const ServableStateAndTime state_0_and_time = {state_0, 1}; + bus->Publish(state_0); + EXPECT_THAT(monitor.GetAvailableServableStates(), testing::IsEmpty()); + + env.AdvanceByMicroseconds(1); + std::vector servable_state_and_time; + for (const auto& servable_id : {ServableId{"bar", 6}, ServableId{"bar", 7}}) { + const ServableState state = { + servable_id, ServableState::ManagerState::kAvailable, Status::OK()}; + const ServableStateAndTime state_and_time = {state, 2}; + servable_state_and_time.push_back({state, 2}); + bus->Publish(state); + } + + EXPECT_THAT(monitor.GetAvailableServableStates(), + UnorderedElementsAre("bar")); + + // Servable {bar, 6} moves to state kUnloading and is removed from available + // servable states. + const ServableState state_0_update = {ServableId{"bar", 6}, + ServableState::ManagerState::kUnloading, + Status::OK()}; + env.AdvanceByMicroseconds(1); + bus->Publish(state_0_update); + EXPECT_THAT(monitor.GetAvailableServableStates(), + UnorderedElementsAre("bar")); + // Servable {bar, 7} moves to state kEnd and is removed from available + // servable states. + const ServableState state_1_update = { + ServableId{"bar", 7}, ServableState::ManagerState::kEnd, Status::OK()}; + env.AdvanceByMicroseconds(1); + bus->Publish(state_1_update); + // No available state now. + EXPECT_THAT(monitor.GetAvailableServableStates(), ::testing::IsEmpty()); +} + TEST(ServableStateMonitorTest, VersionMapDescendingOrder) { test_util::FakeClockEnv env(Env::Default()); EventBus::Options bus_options; From 1750599bb57625747d810c7c06207fb25784a960 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Thu, 23 Jan 2020 17:00:22 -0800 Subject: [PATCH 3641/8103] Automated rollback of commit b853dfef53d0b766a44d600824d5c7fa73845fff PiperOrigin-RevId: 291275690 --- tensorflow_serving/servables/tensorflow/BUILD | 2 + .../tensorflow/bundle_factory_util_test.cc | 28 ++++ .../tensorflow/tflite_session_test.cc | 144 ++++++++++++++++-- 3 files changed, 164 insertions(+), 10 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index 6554d53f7f7..0bbdf41b19a 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -412,10 +412,12 @@ cc_test( ":tflite_session_lib", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", + "@flatbuffers", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", "@org_tensorflow//tensorflow/core:testlib", + "@org_tensorflow//tensorflow/lite:util", ], ) diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc b/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc index 1c4f52503b8..ffc417545e8 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc @@ -23,10 +23,12 @@ limitations under the License. #include "google/protobuf/wrappers.pb.h" #include #include +#include "tensorflow/core/framework/tensor_testutil.h" #include "tensorflow/core/kernels/batching_util/shared_batch_scheduler.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/lib/core/status_test_util.h" #include "tensorflow/core/lib/io/path.h" +#include "tensorflow/core/platform/test_benchmark.h" #include "tensorflow/core/protobuf/config.pb.h" #include "tensorflow/core/public/session.h" #include "tensorflow/core/public/session_options.h" @@ -169,6 +171,32 @@ TEST_F(BundleFactoryUtilTest, EstimateResourceFromPathWithFileProbingEnv) { EXPECT_THAT(actual, EqualsProto(expected)); } +#ifdef PLATFORM_GOOGLE +// This benchmark relies on https://github.com/google/benchmark features, +// not available in open-sourced TF codebase. + +void BM_HalfPlusTwo(benchmark::State& state) { + static Session* session; + if (state.thread_index() == 0) { + SavedModelBundle bundle; + TF_ASSERT_OK(LoadSavedModel(SessionOptions(), RunOptions(), + test_util::GetTestSavedModelPath(), {"serve"}, + &bundle)); + TF_ASSERT_OK(WrapSession(&bundle.session)); + session = bundle.session.release(); + } + Tensor input = test::AsTensor({1.0, 2.0, 3.0}, TensorShape({3})); + std::vector outputs; + testing::UseRealTime(); + for (auto _ : state) { + outputs.clear(); + TF_ASSERT_OK(session->Run({{"x:0", input}}, {"y:0"}, {}, &outputs)); + } +} +BENCHMARK(BM_HalfPlusTwo)->ThreadRange(1, 64); + +#endif // PLATFORM_GOOGLE + } // namespace } // namespace serving } // namespace tensorflow diff --git a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc index 8a4f0aa5f79..8f7b483401f 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc @@ -21,11 +21,16 @@ limitations under the License. #include #include +#include "flatbuffers/flexbuffers.h" +#include "tensorflow/core/framework/attr_value.pb.h" +#include "tensorflow/core/framework/node_def.pb.h" #include "tensorflow/core/framework/tensor_testutil.h" #include "tensorflow/core/framework/types.pb.h" #include "tensorflow/core/lib/core/status_test_util.h" #include "tensorflow/core/platform/env.h" #include "tensorflow/core/platform/logging.h" +#include "tensorflow/core/platform/test_benchmark.h" +#include "tensorflow/lite/util.h" #include "tensorflow/lite/version.h" #include "tensorflow_serving/test_util/test_util.h" @@ -97,14 +102,27 @@ constexpr char kTestModelInputList[] = "list"; constexpr char kTestModelInputShape[] = "shape"; constexpr char kTestModelOutput[] = "output"; +tensorflow::DataType ToTfTensorType(tflite::TensorType tflite_type) { + switch (tflite_type) { + case tflite::TensorType_INT32: + return tensorflow::DT_INT32; + case tflite::TensorType_STRING: + return tensorflow::DT_STRING; + default: + LOG(FATAL) << "Unsupported tflite type: " << tflite_type; + } +} + // Returns a serialized FlatBuffer tflite model. // // The model has two inputs (kTestModelInputList|Shape) and one output // kTestModelOutput. The output is list that is reshaped to shape via // tf.reshape operator. // -// Elements of list are expected to be of `tensor_type` type. -string BuildTestModel(tflite::TensorType tensor_type) { +// Elements of list are expected to be of `tensor_type` type. `use_flex_op` +// sets up the model to use the `Reshape` *flex* op as opposed to using the +// builtin `Reshape` op from TF Lite. +string BuildTestModel(tflite::TensorType tensor_type, bool use_flex_op) { std::vector inputs; std::vector outputs; std::vector> tensors; @@ -135,15 +153,40 @@ string BuildTestModel(tflite::TensorType tensor_type) { /*quantization=*/0, /*is_variable=*/false)); // Add reshape operator. - opcodes.push_back( - CreateOperatorCode(builder, tflite::BuiltinOperator_RESHAPE, 0)); + tflite::BuiltinOptions builtin_opts_type = + tflite::BuiltinOptions_ReshapeOptions; + flatbuffers::Offset reshape_opts = + tflite::CreateReshapeOptions(builder, builder.CreateVector({})) + .Union(); + flatbuffers::Offset> custom_opts = 0; + if (use_flex_op) { + string flexop = std::string(tflite::kFlexCustomCodePrefix) + "Reshape"; + opcodes.push_back(CreateOperatorCodeDirect( + builder, tflite::BuiltinOperator_CUSTOM, flexop.data())); + builtin_opts_type = tflite::BuiltinOptions_NONE; + reshape_opts = 0; + NodeDef node_def; + node_def.set_name("Reshape"); + node_def.set_op("Reshape"); + (*node_def.mutable_attr())["T"].set_type(ToTfTensorType(tensor_type)); + string node_def_str; + CHECK(node_def.SerializeToString(&node_def_str)); + auto flex_builder = absl::make_unique(); + flex_builder->Vector([&]() { + flex_builder->String(node_def.op()); + flex_builder->String(node_def_str); + }); + flex_builder->Finish(); + custom_opts = builder.CreateVector(flex_builder->GetBuffer()); + } else { + opcodes.push_back( + CreateOperatorCode(builder, tflite::BuiltinOperator_RESHAPE, 0)); + } + operators.push_back(CreateOperator( builder, /*opcode_index=*/0, builder.CreateVector(inputs), - builder.CreateVector(outputs), - tflite::BuiltinOptions_ReshapeOptions, - tflite::CreateReshapeOptions(builder, builder.CreateVector({})) - .Union(), - /*custom_options=*/0, tflite::CustomOptionsFormat_FLEXBUFFERS)); + builder.CreateVector(outputs), builtin_opts_type, reshape_opts, + custom_opts, tflite::CustomOptionsFormat_FLEXBUFFERS)); auto subgraph = CreateSubGraph(builder, builder.CreateVector(tensors), builder.CreateVector(inputs), @@ -159,7 +202,8 @@ string BuildTestModel(tflite::TensorType tensor_type) { } TEST(TfLiteSession, ProcessStrings) { - string model_bytes = BuildTestModel(tflite::TensorType_STRING); + string model_bytes = + BuildTestModel(tflite::TensorType_STRING, /*use_flex_op=*/false); ::google::protobuf::Map signatures; std::unique_ptr session; TF_EXPECT_OK( @@ -177,6 +221,86 @@ TEST(TfLiteSession, ProcessStrings) { test::AsTensor({"a", "b", "c", "d"}, TensorShape({2, 2}))); } +TEST(TfLiteSession, ProcessStringsFlex) { + string model_bytes = + BuildTestModel(tflite::TensorType_STRING, /*use_flex_op=*/true); + ::google::protobuf::Map signatures; + std::unique_ptr session; + TF_EXPECT_OK( + TfLiteSession::Create(std::move(model_bytes), &session, &signatures)); + Tensor input_list = + test::AsTensor({"a", "b", "c", "d"}, TensorShape({4})); + Tensor input_shape = test::AsTensor({2, 2}, TensorShape({2})); + std::vector outputs; + TF_EXPECT_OK(session->Run( + {{kTestModelInputList, input_list}, {kTestModelInputShape, input_shape}}, + {kTestModelOutput}, {}, &outputs)); + ASSERT_EQ(outputs.size(), 1); + test::ExpectTensorEqual( + outputs[0], + test::AsTensor({"a", "b", "c", "d"}, TensorShape({2, 2}))); +} + +#ifdef PLATFORM_GOOGLE +// These benchmarks rely on https://github.com/google/benchmark features, +// not available in open-sourced TF codebase. + +static void BM_Reshape(benchmark::State& state, bool use_flex_op) { + static TfLiteSession* session; + if (state.thread_index() == 0) { + string model_bytes = BuildTestModel(tflite::TensorType_INT32, use_flex_op); + ::google::protobuf::Map signatures; + std::unique_ptr sess; + TF_ASSERT_OK( + TfLiteSession::Create(std::move(model_bytes), &sess, &signatures)); + session = sess.release(); + } + Tensor input = test::AsTensor({1, 2, 3, 4, 5, 6}, TensorShape({6})); + Tensor input_shape = test::AsTensor({3, 2}, TensorShape({2})); + std::vector outputs; + testing::UseRealTime(); + for (auto _ : state) { + outputs.clear(); + TF_ASSERT_OK(session->Run( + {{kTestModelInputList, input}, {kTestModelInputShape, input_shape}}, + {kTestModelOutput}, {}, &outputs)); + } +} + +static void BM_Reshape_Builtin(benchmark::State& state) { + BM_Reshape(state, /*use_flex_op=*/false); +} +BENCHMARK(BM_Reshape_Builtin)->ThreadRange(1, 64); + +static void BM_Reshape_Flex(benchmark::State& state) { + BM_Reshape(state, /*use_flex_op=*/true); +} +BENCHMARK(BM_Reshape_Flex)->ThreadRange(1, 64); + +void BM_HalfPlusTwo(benchmark::State& state) { + static TfLiteSession* session; + if (state.thread_index() == 0) { + string model_bytes; + TF_ASSERT_OK(ReadFileToString( + Env::Default(), test_util::TestSrcDirPath(kTestModel), &model_bytes)); + ::google::protobuf::Map signatures; + std::unique_ptr sess; + TF_ASSERT_OK( + TfLiteSession::Create(std::move(model_bytes), &sess, &signatures)); + session = sess.release(); + } + Tensor input = test::AsTensor({1.0, 2.0, 3.0}, TensorShape({3})); + std::vector outputs; + testing::UseRealTime(); + for (auto _ : state) { + outputs.clear(); + TF_ASSERT_OK(session->Run({{"x", input}}, {"y"}, {}, &outputs)); + } +} +BENCHMARK(BM_HalfPlusTwo)->ThreadRange(1, 64); + +#endif // PLATFORM_GOOGLE + } // namespace } // namespace serving } // namespace tensorflow From 114c0352f3b5dac08353f932f1b950f060d988e8 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Thu, 23 Jan 2020 17:07:27 -0800 Subject: [PATCH 3642/8103] Remove unused GetCreator() method. PiperOrigin-RevId: 291277007 --- .../saved_model_bundle_source_adapter.cc | 14 -------------- .../tensorflow/saved_model_bundle_source_adapter.h | 5 ----- .../tensorflow/session_bundle_source_adapter.cc | 14 -------------- .../tensorflow/session_bundle_source_adapter.h | 5 ----- 4 files changed, 38 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter.cc b/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter.cc index 50fe51a8289..f272698ebbf 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter.cc @@ -111,20 +111,6 @@ Status SavedModelBundleSourceAdapter::Convert(const StoragePath& path, return Status::OK(); } -std::function>>*)> -SavedModelBundleSourceAdapter::GetCreator( - const SessionBundleSourceAdapterConfig& config) { - return [config](std::unique_ptr>>* source) { - std::unique_ptr typed_source; - TF_RETURN_IF_ERROR( - SavedModelBundleSourceAdapter::Create(config, &typed_source)); - *source = std::move(typed_source); - return Status::OK(); - }; -} - // Register the source adapter. class SavedModelBundleSourceAdapterCreator { public: diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter.h b/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter.h index cafcd13acfa..37606bdfafb 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter.h +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter.h @@ -44,11 +44,6 @@ class SavedModelBundleSourceAdapter final ~SavedModelBundleSourceAdapter() override; - // Returns a function to create a SavedModel bundle source adapter. - static std::function>>*)> - GetCreator(const SessionBundleSourceAdapterConfig& config); - private: friend class SavedModelBundleSourceAdapterCreator; diff --git a/tensorflow_serving/servables/tensorflow/session_bundle_source_adapter.cc b/tensorflow_serving/servables/tensorflow/session_bundle_source_adapter.cc index f24d90f69ef..8fc51cb0009 100644 --- a/tensorflow_serving/servables/tensorflow/session_bundle_source_adapter.cc +++ b/tensorflow_serving/servables/tensorflow/session_bundle_source_adapter.cc @@ -57,20 +57,6 @@ Status SessionBundleSourceAdapter::Convert(const StoragePath& path, return Status::OK(); } -std::function>>*)> -SessionBundleSourceAdapter::GetCreator( - const SessionBundleSourceAdapterConfig& config) { - return [config](std::unique_ptr>>* source) { - std::unique_ptr typed_source; - TF_RETURN_IF_ERROR( - SessionBundleSourceAdapter::Create(config, &typed_source)); - *source = std::move(typed_source); - return Status::OK(); - }; -} - // Register the source adapter. class SessionBundleSourceAdapterCreator { public: diff --git a/tensorflow_serving/servables/tensorflow/session_bundle_source_adapter.h b/tensorflow_serving/servables/tensorflow/session_bundle_source_adapter.h index 9a23db933e8..a1daaecc177 100644 --- a/tensorflow_serving/servables/tensorflow/session_bundle_source_adapter.h +++ b/tensorflow_serving/servables/tensorflow/session_bundle_source_adapter.h @@ -37,11 +37,6 @@ class SessionBundleSourceAdapter final ~SessionBundleSourceAdapter() override; - // Returns a function to create a session bundle source adapter. - static std::function>>*)> - GetCreator(const SessionBundleSourceAdapterConfig& config); - private: friend class SessionBundleSourceAdapterCreator; From f1e4eb2259da90bb9c5fe028ba824ac18a436f67 Mon Sep 17 00:00:00 2001 From: Pedram Pejman Date: Fri, 24 Jan 2020 17:31:59 -0800 Subject: [PATCH 3643/8103] Adds performance guide and documentation for TensorBoard integration PiperOrigin-RevId: 291474661 --- README.md | 5 +- .../g3doc/images/predict_sequence_diagram.png | Bin 0 -> 63575 bytes .../g3doc/images/tb_profile_overview.png | Bin 0 -> 22208 bytes .../g3doc/images/tb_profile_setup_dialog.png | Bin 0 -> 61529 bytes .../g3doc/images/tb_profile_zoom.png | Bin 0 -> 23368 bytes tensorflow_serving/g3doc/performance.md | 230 ++++++++++++++++++ tensorflow_serving/g3doc/tensorboard.md | 144 +++++++++++ 7 files changed, 378 insertions(+), 1 deletion(-) create mode 100644 tensorflow_serving/g3doc/images/predict_sequence_diagram.png create mode 100644 tensorflow_serving/g3doc/images/tb_profile_overview.png create mode 100644 tensorflow_serving/g3doc/images/tb_profile_setup_dialog.png create mode 100644 tensorflow_serving/g3doc/images/tb_profile_zoom.png create mode 100644 tensorflow_serving/g3doc/performance.md create mode 100644 tensorflow_serving/g3doc/tensorboard.md diff --git a/README.md b/README.md index 719b2988a5c..ee15e2464a1 100644 --- a/README.md +++ b/README.md @@ -89,7 +89,10 @@ for detailed instructions on how to export SavedModels. * [Follow a tutorial on Serving Tensorflow models](tensorflow_serving/g3doc/serving_basic.md) * [Configure Tensorflow Serving to make it fit your serving use case](tensorflow_serving/g3doc/serving_config.md) -* Read the [REST API Guide](tensorflow_serving/g3doc/api_rest.md) or [gRPC API definition](https://github.com/tensorflow/serving/tree/master/tensorflow_serving/apis) +* Read the [Performance Guide](tensorflow_serving/g3doc/performance.md) +and learn how to [use TensorBoard to profile and optimize inference requests](tensorflow_serving/g3doc/tensorboard.md) +* Read the [REST API Guide](tensorflow_serving/g3doc/api_rest.md) +or [gRPC API definition](https://github.com/tensorflow/serving/tree/master/tensorflow_serving/apis) * [Use SavedModel Warmup if initial inference requests are slow due to lazy initialization of graph](tensorflow_serving/g3doc/saved_model_warmup.md) * [If encountering issues regarding model signatures, please read the SignatureDef documentation](tensorflow_serving/g3doc/signature_defs.md) * If using a model with custom ops, [learn how to serve models with custom ops](tensorflow_serving/g3doc/custom_op.md) diff --git a/tensorflow_serving/g3doc/images/predict_sequence_diagram.png b/tensorflow_serving/g3doc/images/predict_sequence_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..790dc536f56a534991158902a6b66eec6ef2289b GIT binary patch literal 63575 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 literal 0 HcmV?d00001 diff --git a/tensorflow_serving/g3doc/images/tb_profile_overview.png b/tensorflow_serving/g3doc/images/tb_profile_overview.png new file mode 100644 index 0000000000000000000000000000000000000000..5c0aa29d39afb8697d576e30eab87cf0b8853c6d GIT binary patch literal 22208 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 =Ss-s&6sr8?WHd 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 z + + + +![Predict Sequence Diagram](images/predict_sequence_diagram.png) + +Note that Client is a component owned by the user, Prediction Service, Servables +and Server Core are owned by TensorFlow Serving and TensorFlow Runtime is owned +by [Core TensorFlow](https://github.com/tensorflow/tensorflow). + +### Sequence Details + +1. [`PredictionServiceImpl::Predict`](https://github.com/tensorflow/serving/blob/b5a11f1e5388c9985a6fc56a58c3421e5f78149f/tensorflow_serving/model_servers/prediction_service_impl.cc#L38) + receives the `PredictRequest` +2. We invoke the + [`TensorflowPredictor::Predict`](https://github.com/tensorflow/serving/blob/b5a11f1e5388c9985a6fc56a58c3421e5f78149f/tensorflow_serving/servables/tensorflow/predict_impl.cc#L146), + propagating the request deadline from the gRPC request (if one was set). +3. Inside `TensorflowPredictor::Predict`, we + [lookup the Servable (model)](https://github.com/tensorflow/serving/blob/b5a11f1e5388c9985a6fc56a58c3421e5f78149f/tensorflow_serving/servables/tensorflow/predict_impl.cc#L165) + the request is looking to perform inference on, from which we retrieve + information about the SavedModel and more importantly, a handle to the + `Session` object in which the model graph is (possibly partially) loaded. + This Servable object was created and committed in memory when the model was + loaded by TensorFlow Serving. We then invoke + [internal::RunPredict](https://github.com/tensorflow/serving/blob/b5a11f1e5388c9985a6fc56a58c3421e5f78149f/tensorflow_serving/servables/tensorflow/predict_util.cc#L181) + to carry out the prediction. +4. In `internal::RunPredict`, after validating and preprocessing the request, + we use the `Session` object to perform the inference using a blocking call + to + [Session::Run](https://github.com/tensorflow/serving/blob/b5a11f1e5388c9985a6fc56a58c3421e5f78149f/tensorflow_serving/servables/tensorflow/predict_util.cc#L209), + at which point, we enter core TensorFlow's codebase. After the + `Session::Run` returns and our `outputs` tensors have been populated, we + [convert](https://github.com/tensorflow/serving/blob/b5a11f1e5388c9985a6fc56a58c3421e5f78149f/tensorflow_serving/servables/tensorflow/predict_util.cc#L150) + the outputs to a `PredictionResponse` and return the result up the call + stack. diff --git a/tensorflow_serving/g3doc/tensorboard.md b/tensorflow_serving/g3doc/tensorboard.md new file mode 100644 index 00000000000..48bc3fa1aea --- /dev/null +++ b/tensorflow_serving/g3doc/tensorboard.md @@ -0,0 +1,144 @@ +# Profile Inference Requests with TensorBoard + +After deploying TensorFlow Serving and issuing requests from your client, you +may notice that requests take longer than you expected, or you are not achieving +the throughput that you would have liked. + +In this guide, we will use TensorBoard's Profiler, which you may already use to +[profile model training](https://www.tensorflow.org/tensorboard/tensorboard_profiling_keras), +to trace inference requests to help us debug and improve inference performance. + +You should use this guide in conjunction with the best practices denoted in the +[Performance Guide](performance.md) to optimize your model, requests and +TensorFlow Serving instance. + +## Overview + +At a high level, we will point TensorBoard's Profiling tool at TensorFlow +Serving's gRPC server. When we send an inference request to Tensorflow Serving, +we will also simultaneously use the TensorBoard UI to ask it to capture the +traces of this request. Behind the scenes, TensorBoard will talk to TensorFlow +Serving over gRPC and ask it to provide a detailed trace of the lifetime of the +inference request. TensorBoard will then visualize the activity of every thread +on every compute device (running code integrated with +[`profiler::TraceMe`](https://github.com/tensorflow/tensorflow/blob/f65b09f9aedcd33d0703cbf3d9845ea2869c0aa8/tensorflow/core/profiler/lib/traceme.h#L73)) +over the course of the lifetime of the request on the TensorBoard UI for us to +consume. + +## Prerequisites + +* `Tensorflow>=2.0.0` +* TensorBoard (should be installed if TF was installed via `pip`) +* Docker (which we'll use to download and run TF serving>=2.1.0 image) + +## Deploy model with TensorFlow Serving + +For this example, we will use Docker, the recommended way to deploy Tensorflow +Serving, to host a toy model that computes `f(x) = x / 2 + 2` found in the +[Tensorflow Serving Github repository](https://github.com/tensorflow/serving/tree/master/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu/00000123). + +Download the TensorFlow Serving source. + +``` +git clone https://github.com/tensorflow/serving /tmp/serving +cd /tmp/serving +``` + +Launch TensorFlow Serving via Docker and deploy the half_plus_two model. + +``` +docker pull tensorflow/serving +MODELS_DIR="$(pwd)/tensorflow_serving/servables/tensorflow/testdata" +docker run -it --rm -p 8500:8500 -p 8501:8501 \ +-v $MODELS_DIR/saved_model_half_plus_two_cpu:/models/half_plus_two \ +-e MODEL_NAME=half_plus_two \ +tensorflow/serving +``` + +In another terminal, query the model to ensure model is deployed correctly + +``` +curl -d '{"instances": [1.0, 2.0, 5.0]}' \ +-X POST http://localhost:8501/v1/models/half_plus_two:predict + +# Returns => { "predictions": [2.5, 3.0, 4.5] } +``` + +## Set up TensorBoard's Profiler + +In another terminal, launch the TensorBoard tool on your machine, providing a +directory to save the inference trace events to: + +``` +mkdir -p ~/logs/inference_demo +tensorboard --logdir ~/logs/inference_demo/ --port 6006 +``` + +Navigate to http://localhost:6006/ to view the TensorBoard UI. Use the drop-down +menu at the top to navigate to the Profile tab. Click Capture Profile and +provide the address of Tensorflow Serving's gRPC server. + +![Profiling Tool](images/tb_profile_setup_dialog.png) + +As soon as you press "Capture," TensorBoard will start sending profile requests +to the model server. In the dialog above, you can set both the deadline for each +request and the total number of times Tensorboard will retry if no trace events +are collected. If you are profiling an expensive model, you may want to increase +the deadline to ensure the profile request does not time out before the +inference request completes. + +## Send and Profile an Inference Request + +Press Capture on the TensorBoard UI and send an inference request to TF Serving +quickly thereafter. + +``` +curl -d '{"instances": [1.0, 2.0, 5.0]}' -X POST \ +http://localhost:8501/v1/models/half_plus_two:predict +``` + +You should see a "Capture profile successfully. Please refresh." toast appear at +the bottom of the screen. This means TensorBoard was able to retrieve trace +events from TensorFlow Serving and saved them to your `logdir`. Refresh the page +to visualize the inference request with The Profiler's Trace Viewer, as seen in +the next section. + +Note: If you see `tensorflow.python.framework.errors_impl.UnimplementedError` in +your TensorBoard logs, it likely means you are running a Tensorflow Serving +version older than 2.1. + +## Analyze the Inference Request Trace + +![Inference Request Trace](images/tb_profile_overview.png) + +You can now easily see what computation is taking place as a result of your +inference request. You can zoom and click on any of the rectangles (trace +events) to get more information such as exact start time and wall duration. + +At a high-level, we see two threads belonging to the TensorFlow runtime and a +third one that belongs to the REST server, handling the receiving of the HTTP +request and creating a TensorFlow Session. + +We can zoom in to see what happens inside the SessionRun. + +![Inference Request Trace Zoomed-in](images/tb_profile_zoom.png) + +In the second thread, we see an initial ExecutorState::Process call in which no +TensorFlow ops run but initialization steps are executed. + +In the first thread, we see the call to read the first variable, and once the +second variable is also available, executes the multiplication and add kernels +in sequence. Finally, the Executor signals that its computation is done by +calling the DoneCallback and the Session can be closed. + +## Next Steps + +While this is a simple example, you can use the same process to profile much +more complex models, allowing you to identify slow ops or bottlenecks in your +model architecture to improve its performance. + +Please refer to +[TensorBoard Profiler Guide](https://www.tensorflow.org/tensorboard/tensorboard_profiling_keras#trace_viewer) +for a more complete tutorial on features of TensorBoard's Profiler and +[TensorFlow Serving Performance Guide](performance.md) to learn more about +optimizing inference performance. From a59e0dcb56c635e344599b2a7cf948373019b03b Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Fri, 24 Jan 2020 20:57:24 -0800 Subject: [PATCH 3644/8103] Use SavedModelBundleFactory for session source adapter instead of SessionBundleFactory. The former handles both session bundles and savedmodel formats. Remove SessionBundleFactory as its now unused due to above change. PiperOrigin-RevId: 291490496 --- tensorflow_serving/servables/tensorflow/BUILD | 22 +--- .../servables/tensorflow/oss/BUILD | 24 +---- .../oss/session_bundle_factory_test.cc | 70 ------------ .../tensorflow/session_bundle_factory.cc | 101 ------------------ .../tensorflow/session_bundle_factory.h | 80 -------------- .../session_bundle_source_adapter.cc | 18 ++-- .../session_bundle_source_adapter.h | 6 +- tensorflow_serving/session_bundle/oss/BUILD | 1 + .../session_bundle/oss/session_bundle_util.cc | 7 ++ .../oss/session_bundle_util_test.cc | 5 +- 10 files changed, 25 insertions(+), 309 deletions(-) delete mode 100644 tensorflow_serving/servables/tensorflow/oss/session_bundle_factory_test.cc delete mode 100644 tensorflow_serving/servables/tensorflow/session_bundle_factory.cc delete mode 100644 tensorflow_serving/servables/tensorflow/session_bundle_factory.h diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index 0bbdf41b19a..12d18814bd1 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -122,26 +122,6 @@ cc_library( ], ) -cc_library( - name = "session_bundle_factory", - srcs = ["session_bundle_factory.cc"], - hdrs = ["session_bundle_factory.h"], - visibility = [ - "//visibility:public", - ], - deps = [ - ":bundle_factory_util", - ":session_bundle_config_cc_proto", - "//tensorflow_serving/batching:batching_session", - "//tensorflow_serving/resources:resources_cc_proto", - "//tensorflow_serving/session_bundle:session_bundle_util", - "@org_tensorflow//tensorflow/core:core_cpu", - "@org_tensorflow//tensorflow/core:lib", - "@org_tensorflow//tensorflow/core:protos_all_cc", - "@org_tensorflow//tensorflow/core/kernels/batching_util:shared_batch_scheduler", - ], -) - cc_library( name = "saved_model_bundle_factory", srcs = ["saved_model_bundle_factory.cc"], @@ -201,7 +181,7 @@ cc_library( "//visibility:public", ], deps = [ - ":session_bundle_factory", + ":saved_model_bundle_factory", ":session_bundle_source_adapter_cc_proto", "//tensorflow_serving/core:loader", "//tensorflow_serving/core:simple_loader", diff --git a/tensorflow_serving/servables/tensorflow/oss/BUILD b/tensorflow_serving/servables/tensorflow/oss/BUILD index fd00df33307..9b110469511 100644 --- a/tensorflow_serving/servables/tensorflow/oss/BUILD +++ b/tensorflow_serving/servables/tensorflow/oss/BUILD @@ -1,3 +1,5 @@ +load("//tensorflow_serving:oss_or_google.bzl", "oss_only_cc_test") + package( default_visibility = [ "//tensorflow_serving:internal", @@ -7,28 +9,6 @@ package( licenses(["notice"]) # Apache 2.0 -load("//tensorflow_serving:oss_or_google.bzl", "oss_only_cc_test") - -oss_only_cc_test( - name = "session_bundle_factory_test", - size = "medium", - srcs = ["session_bundle_factory_test.cc"], - data = ["//tensorflow_serving/session_bundle:session_bundle_half_plus_two"], - deps = [ - "//tensorflow_serving/core/test_util:test_main", - "//tensorflow_serving/servables/tensorflow:bundle_factory_test", - "//tensorflow_serving/servables/tensorflow:bundle_factory_test_util", - "//tensorflow_serving/servables/tensorflow:session_bundle_config_proto", - "//tensorflow_serving/servables/tensorflow:session_bundle_factory", - "//tensorflow_serving/test_util", - "@com_google_protobuf//:cc_wkt_protos", - "@org_tensorflow//tensorflow/core:core_cpu", - "@org_tensorflow//tensorflow/core:framework", - "@org_tensorflow//tensorflow/core:lib", - "@org_tensorflow//tensorflow/core:test", - ], -) - oss_only_cc_test( name = "session_bundle_source_adapter_test", size = "medium", diff --git a/tensorflow_serving/servables/tensorflow/oss/session_bundle_factory_test.cc b/tensorflow_serving/servables/tensorflow/oss/session_bundle_factory_test.cc deleted file mode 100644 index 6b840f9529e..00000000000 --- a/tensorflow_serving/servables/tensorflow/oss/session_bundle_factory_test.cc +++ /dev/null @@ -1,70 +0,0 @@ -/* Copyright 2016 Google Inc. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#include "tensorflow_serving/servables/tensorflow/session_bundle_factory.h" - -#include -#include -#include -#include - -#include "google/protobuf/wrappers.pb.h" -#include -#include -#include "tensorflow/core/lib/core/status.h" -#include "tensorflow/core/lib/core/status_test_util.h" -#include "tensorflow/core/public/session.h" -#include "tensorflow/core/public/version.h" -#include "tensorflow_serving/servables/tensorflow/bundle_factory_test.h" -#include "tensorflow_serving/servables/tensorflow/bundle_factory_test_util.h" -#include "tensorflow_serving/servables/tensorflow/session_bundle_config.pb.h" -#include "tensorflow_serving/test_util/test_util.h" - -namespace tensorflow { -namespace serving { -namespace { - -class SessionBundleFactoryTest : public test_util::BundleFactoryTest { - public: - SessionBundleFactoryTest() - : test_util::BundleFactoryTest( - test_util::GetTestSessionBundleExportPath()) {} - - virtual ~SessionBundleFactoryTest() = default; - - Status CreateSession(const SessionBundleConfig& config, - std::unique_ptr* session) const override { - std::unique_ptr factory; - TF_RETURN_IF_ERROR(SessionBundleFactory::Create(config, &factory)); - std::unique_ptr bundle; - TF_RETURN_IF_ERROR(factory->CreateSessionBundle(export_dir_, &bundle)); - *session = std::move(bundle->session); - return Status::OK(); - } -}; - -TEST_F(SessionBundleFactoryTest, Basic) { - const SessionBundleConfig config; - std::unique_ptr session; - Status status = CreateSession(config, &session); - EXPECT_EQ(::tensorflow::error::UNIMPLEMENTED, status.code()); - EXPECT_THAT( - status.ToString(), - ::testing::HasSubstr("Session Bundle is deprecated and removed.")); -} - -} // namespace -} // namespace serving -} // namespace tensorflow diff --git a/tensorflow_serving/servables/tensorflow/session_bundle_factory.cc b/tensorflow_serving/servables/tensorflow/session_bundle_factory.cc deleted file mode 100644 index d61be0882c2..00000000000 --- a/tensorflow_serving/servables/tensorflow/session_bundle_factory.cc +++ /dev/null @@ -1,101 +0,0 @@ -/* Copyright 2016 Google Inc. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#include "tensorflow_serving/servables/tensorflow/session_bundle_factory.h" - -#include "tensorflow/core/lib/core/errors.h" -#include "tensorflow/core/protobuf/config.pb.h" -#include "tensorflow/core/public/session_options.h" -#include "tensorflow_serving/servables/tensorflow/bundle_factory_util.h" -#include "tensorflow_serving/session_bundle/session_bundle_util.h" - -namespace tensorflow { -namespace serving { - -namespace { - -// Extracts the signatures from 'bundle'. -Status GetSignatureDefs(const SessionBundle& bundle, - std::vector* signature_defs) { - MetaGraphDef meta_graph_def = bundle.meta_graph_def; - const Status conversion_status = - session_bundle::ConvertSignaturesToSignatureDefs(&meta_graph_def); - if (!conversion_status.ok()) { - if (meta_graph_def.signature_def().empty()) { - return conversion_status; - } else { - // ConvertSignaturesToSignatureDefs() is best-effort, and sometimes isn't - // able to up-convert all the signatures. Proceeding with the subset of - // signatures that *can* be converted seems to work for existing - // SessionBundle use-cases, so we'll do that. Future use-cases will be - // strongly compelled to use SavedModelBundle which won't have this issue. - LOG(WARNING) << "Couldn't fully convert the signatures [" - << conversion_status - << "]. Proceeding with a subset of signatures for use as " - "the batching queues"; - } - } - for (const auto& entry : meta_graph_def.signature_def()) { - const SignatureDef& signature_def = entry.second; - signature_defs->push_back(signature_def); - } - return Status::OK(); -} - -} // namespace - -Status SessionBundleFactory::Create( - const SessionBundleConfig& config, - std::unique_ptr* factory) { - std::shared_ptr batcher; - if (config.has_batching_parameters()) { - TF_RETURN_IF_ERROR( - CreateBatchScheduler(config.batching_parameters(), &batcher)); - } - factory->reset(new SessionBundleFactory(config, batcher)); - return Status::OK(); -} - -Status SessionBundleFactory::EstimateResourceRequirement( - const string& path, ResourceAllocation* estimate) const { - return EstimateResourceFromPath(path, estimate); -} - -Status SessionBundleFactory::CreateSessionBundle( - const string& path, std::unique_ptr* bundle) { - bundle->reset(new SessionBundle); - TF_RETURN_IF_ERROR(session_bundle::LoadSessionBundleFromPathUsingRunOptions( - GetSessionOptions(config_), GetRunOptions(config_), path, bundle->get())); - - if (config_.has_batching_parameters()) { - LOG(INFO) << "Wrapping session to perform batch processing"; - if (batch_scheduler_ == nullptr) { - return errors::Internal("batch_scheduler_ not set"); - } - std::vector signatures; - TF_RETURN_IF_ERROR(GetSignatureDefs(**bundle, &signatures)); - return WrapSessionForBatching(config_.batching_parameters(), - batch_scheduler_, signatures, - &(*bundle)->session); - } - return WrapSession(&(*bundle)->session); -} - -SessionBundleFactory::SessionBundleFactory( - const SessionBundleConfig& config, std::shared_ptr batch_scheduler) - : config_(config), batch_scheduler_(batch_scheduler) {} - -} // namespace serving -} // namespace tensorflow diff --git a/tensorflow_serving/servables/tensorflow/session_bundle_factory.h b/tensorflow_serving/servables/tensorflow/session_bundle_factory.h deleted file mode 100644 index 7dbf6bb6ed7..00000000000 --- a/tensorflow_serving/servables/tensorflow/session_bundle_factory.h +++ /dev/null @@ -1,80 +0,0 @@ -/* Copyright 2016 Google Inc. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#ifndef TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_SESSION_BUNDLE_FACTORY_H_ -#define TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_SESSION_BUNDLE_FACTORY_H_ - -#include "tensorflow/core/kernels/batching_util/shared_batch_scheduler.h" -#include "tensorflow/core/lib/core/status.h" -#include "tensorflow_serving/batching/batching_session.h" -#include "tensorflow_serving/resources/resources.pb.h" -#include "tensorflow_serving/servables/tensorflow/session_bundle_config.pb.h" -#include "tensorflow_serving/session_bundle/session_bundle_util.h" - -namespace tensorflow { -namespace serving { - -// A factory that creates SessionBundles from export paths. -// -// The emitted sessions only support Run(), and although not enforced it is -// expected that the client will only make non-mutating Run() calls. (If this -// restriction, which we've added as a safety measure, is problematic for your -// use-case please contact the TensorFlow Serving team to discuss disabling it.) -// -// If the config calls for batching, the emitted sessions automatically batch -// Run() calls behind the scenes, using a SharedBatchScheduler owned by the -// factory. The 'config.num_batch_threads' threads are shared across all session -// instances created by this factory. However, each session has its own -// dedicated queue of size 'config.max_enqueued_batches'. -// -// The factory can also estimate the resource (e.g. RAM) requirements of a -// SessionBundle based on the export (i.e. prior to loading the session). -// -// This class is thread-safe. -class SessionBundleFactory { - public: - static Status Create(const SessionBundleConfig& config, - std::unique_ptr* factory); - - // Instantiates a bundle from a given export path. - Status CreateSessionBundle(const string& path, - std::unique_ptr* bundle); - - // Estimates the resources a session bundle will use once loaded, from its - // export path. - // TODO(b/33078719): remove this method after we switch all the callers to - // the following one. - Status EstimateResourceRequirement(const string& path, - ResourceAllocation* estimate) const; - - private: - using Batcher = SharedBatchScheduler; - - SessionBundleFactory(const SessionBundleConfig& config, - std::shared_ptr batch_scheduler); - - const SessionBundleConfig config_; - - // A shared batch scheduler. One queue is used for each session this factory - // emits. If batching is not configured, this remains null. - std::shared_ptr batch_scheduler_; - - TF_DISALLOW_COPY_AND_ASSIGN(SessionBundleFactory); -}; - -} // namespace serving -} // namespace tensorflow - -#endif // TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_SESSION_BUNDLE_FACTORY_H_ diff --git a/tensorflow_serving/servables/tensorflow/session_bundle_source_adapter.cc b/tensorflow_serving/servables/tensorflow/session_bundle_source_adapter.cc index 8fc51cb0009..224b459701b 100644 --- a/tensorflow_serving/servables/tensorflow/session_bundle_source_adapter.cc +++ b/tensorflow_serving/servables/tensorflow/session_bundle_source_adapter.cc @@ -28,9 +28,9 @@ namespace serving { Status SessionBundleSourceAdapter::Create( const SessionBundleSourceAdapterConfig& config, std::unique_ptr* adapter) { - std::unique_ptr bundle_factory; + std::unique_ptr bundle_factory; TF_RETURN_IF_ERROR( - SessionBundleFactory::Create(config.config(), &bundle_factory)); + SavedModelBundleFactory::Create(config.config(), &bundle_factory)); adapter->reset(new SessionBundleSourceAdapter(std::move(bundle_factory))); return Status::OK(); } @@ -38,22 +38,22 @@ Status SessionBundleSourceAdapter::Create( SessionBundleSourceAdapter::~SessionBundleSourceAdapter() { Detach(); } SessionBundleSourceAdapter::SessionBundleSourceAdapter( - std::unique_ptr bundle_factory) + std::unique_ptr bundle_factory) : bundle_factory_(std::move(bundle_factory)) {} Status SessionBundleSourceAdapter::Convert(const StoragePath& path, std::unique_ptr* loader) { - std::shared_ptr bundle_factory = bundle_factory_; + std::shared_ptr bundle_factory = bundle_factory_; auto servable_creator = [bundle_factory, - path](std::unique_ptr* bundle) { - return bundle_factory->CreateSessionBundle(path, bundle); + path](std::unique_ptr* bundle) { + return bundle_factory->CreateSavedModelBundle(path, bundle); }; auto resource_estimator = [bundle_factory, path](ResourceAllocation* estimate) { return bundle_factory->EstimateResourceRequirement(path, estimate); }; loader->reset( - new SimpleLoader(servable_creator, resource_estimator)); + new SimpleLoader(servable_creator, resource_estimator)); return Status::OK(); } @@ -64,9 +64,9 @@ class SessionBundleSourceAdapterCreator { const SessionBundleSourceAdapterConfig& config, std::unique_ptr>>* adapter) { - std::unique_ptr bundle_factory; + std::unique_ptr bundle_factory; TF_RETURN_IF_ERROR( - SessionBundleFactory::Create(config.config(), &bundle_factory)); + SavedModelBundleFactory::Create(config.config(), &bundle_factory)); adapter->reset(new SessionBundleSourceAdapter(std::move(bundle_factory))); return Status::OK(); } diff --git a/tensorflow_serving/servables/tensorflow/session_bundle_source_adapter.h b/tensorflow_serving/servables/tensorflow/session_bundle_source_adapter.h index a1daaecc177..f90fd33f938 100644 --- a/tensorflow_serving/servables/tensorflow/session_bundle_source_adapter.h +++ b/tensorflow_serving/servables/tensorflow/session_bundle_source_adapter.h @@ -20,7 +20,7 @@ limitations under the License. #include "tensorflow_serving/core/loader.h" #include "tensorflow_serving/core/source_adapter.h" #include "tensorflow_serving/core/storage_path.h" -#include "tensorflow_serving/servables/tensorflow/session_bundle_factory.h" +#include "tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.h" #include "tensorflow_serving/servables/tensorflow/session_bundle_source_adapter.pb.h" namespace tensorflow { @@ -41,14 +41,14 @@ class SessionBundleSourceAdapter final friend class SessionBundleSourceAdapterCreator; explicit SessionBundleSourceAdapter( - std::unique_ptr bundle_factory); + std::unique_ptr bundle_factory); Status Convert(const StoragePath& path, std::unique_ptr* loader) override; // We use a shared ptr to share ownership with Loaders we emit, in case they // outlive this object. - std::shared_ptr bundle_factory_; + std::shared_ptr bundle_factory_; TF_DISALLOW_COPY_AND_ASSIGN(SessionBundleSourceAdapter); }; diff --git a/tensorflow_serving/session_bundle/oss/BUILD b/tensorflow_serving/session_bundle/oss/BUILD index 501c290e12d..6dfd841af88 100644 --- a/tensorflow_serving/session_bundle/oss/BUILD +++ b/tensorflow_serving/session_bundle/oss/BUILD @@ -32,6 +32,7 @@ cc_library( ":session_bundle", "//tensorflow_serving/session_bundle:session_bundle_util_header", "@org_tensorflow//tensorflow/cc/saved_model:loader", + "@org_tensorflow//tensorflow/core:lib", ], ) diff --git a/tensorflow_serving/session_bundle/oss/session_bundle_util.cc b/tensorflow_serving/session_bundle/oss/session_bundle_util.cc index cd5e9f8235e..beea4a7e49b 100644 --- a/tensorflow_serving/session_bundle/oss/session_bundle_util.cc +++ b/tensorflow_serving/session_bundle/oss/session_bundle_util.cc @@ -17,6 +17,8 @@ limitations under the License. #include "tensorflow/cc/saved_model/loader.h" #include "tensorflow/core/lib/core/errors.h" +#include "tensorflow/core/platform/env.h" +#include "tensorflow/core/platform/path.h" #include "tensorflow_serving/session_bundle/manifest_proto.h" namespace tensorflow { @@ -40,6 +42,11 @@ Status LoadSessionBundleOrSavedModelBundle( if (is_session_bundle != nullptr) { *is_session_bundle = false; } + if (Env::Default() + ->FileExists(io::JoinPath(export_dir, "export.meta")) + .ok()) { + return errors::Unimplemented("Session Bundle is deprecated and removed."); + } if (MaybeSavedModelDirectory(export_dir)) { return LoadSavedModel(session_options, run_options, export_dir, tags, bundle); diff --git a/tensorflow_serving/session_bundle/oss/session_bundle_util_test.cc b/tensorflow_serving/session_bundle/oss/session_bundle_util_test.cc index 439d45be7c6..9aa79bcdeab 100644 --- a/tensorflow_serving/session_bundle/oss/session_bundle_util_test.cc +++ b/tensorflow_serving/session_bundle/oss/session_bundle_util_test.cc @@ -80,11 +80,10 @@ TEST(SessionBundleTest, LoadSessionBundleOrSavedModelBundleFailureTest) { Status status = session_bundle::LoadSessionBundleOrSavedModelBundle( session_options, run_options, export_dir, tags, &bundle, &is_session_bundle); - EXPECT_EQ(::tensorflow::error::Code::NOT_FOUND, status.code()); + EXPECT_EQ(::tensorflow::error::UNIMPLEMENTED, status.code()); EXPECT_THAT( status.ToString(), - ::testing::HasSubstr( - "Specified file path does not appear to contain a SavedModel")); + ::testing::HasSubstr("Session Bundle is deprecated and removed.")); } TEST(SessionBundleTest, LoadSessionBundleFromPathUsingRunOptionsTest) { From e7b7b337eb82bec1556b6ab47353138c5e1a7f8b Mon Sep 17 00:00:00 2001 From: Runzhen Wang Date: Sun, 26 Jan 2020 16:12:51 -0800 Subject: [PATCH 3645/8103] update resnet_k8s.yaml file --- tensorflow_serving/example/resnet_k8s.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tensorflow_serving/example/resnet_k8s.yaml b/tensorflow_serving/example/resnet_k8s.yaml index ed1de3fa78c..d3359a498f0 100644 --- a/tensorflow_serving/example/resnet_k8s.yaml +++ b/tensorflow_serving/example/resnet_k8s.yaml @@ -13,11 +13,14 @@ # limitations under the License. # ============================================================================== -apiVersion: extensions/v1beta1 +apiVersion: apps/v1 kind: Deployment metadata: name: resnet-deployment spec: + selector: + matchLabels: + app: resnet-server replicas: 3 template: metadata: From bd206e419be2b0c5b1c6306ccab80cf38496875b Mon Sep 17 00:00:00 2001 From: Robert Neale Date: Mon, 27 Jan 2020 14:22:42 -0800 Subject: [PATCH 3646/8103] Update TF Text to latest version and add new tests. PiperOrigin-RevId: 291799528 --- tensorflow_serving/model_servers/BUILD | 7 +- .../tensorflow_model_server_test.py | 15 +++ .../tensorflow_model_server_test_base.py | 5 +- .../servables/tensorflow/testdata/BUILD | 7 ++ .../testdata/tf_text_regression.README | 19 ++++ .../tf_text_regression/01/saved_model.pb | Bin 0 -> 1111050 bytes .../variables/variables.data-00000-of-00001 | Bin 0 -> 67 bytes .../01/variables/variables.index | Bin 0 -> 144 bytes tensorflow_serving/workspace.bzl | 42 +++++++- third_party/icu/BUILD | 98 ++++++++++++++++++ third_party/tf_text/tftext.patch | 54 +++++++++- 11 files changed, 231 insertions(+), 16 deletions(-) create mode 100644 tensorflow_serving/servables/tensorflow/testdata/tf_text_regression.README create mode 100644 tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/saved_model.pb create mode 100644 tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/variables/variables.data-00000-of-00001 create mode 100644 tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/variables/variables.index create mode 100644 third_party/icu/BUILD diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index e37003626e4..0702dafbea0 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -300,11 +300,7 @@ SUPPORTED_TENSORFLOW_OPS = if_v2([]) + if_not_v2([ "@org_tensorflow//tensorflow/contrib:contrib_kernels", "@org_tensorflow//tensorflow/contrib:contrib_ops_op_lib", ]) + [ - "@org_tensorflow_text//tensorflow_text:constrained_sequence_op_cc", - "@org_tensorflow_text//tensorflow_text:sentence_breaking_ops_cc", - "@org_tensorflow_text//tensorflow_text:unicode_script_tokenizer_cc", - "@org_tensorflow_text//tensorflow_text:whitespace_tokenizer_cc", - "@org_tensorflow_text//tensorflow_text:wordpiece_tokenizer_cc", + "@org_tensorflow_text//tensorflow_text:ops_lib", ] TENSORFLOW_DEPS = [ @@ -404,6 +400,7 @@ py_test( "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_three/00000123/variables/variables.index", "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_cpu", "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_tflite", + "//tensorflow_serving/servables/tensorflow/testdata:tf_text_regression", ] + if_google([ "//tensorflow_serving/servables/tensorflow/google/testdata:half_plus_two/00000123/export.data-00000-of-00001", "//tensorflow_serving/servables/tensorflow/google/testdata:half_plus_two/00000123/export.index", diff --git a/tensorflow_serving/model_servers/tensorflow_model_server_test.py b/tensorflow_serving/model_servers/tensorflow_model_server_test.py index 1ec5ed5a091..8fecc51a4d8 100644 --- a/tensorflow_serving/model_servers/tensorflow_model_server_test.py +++ b/tensorflow_serving/model_servers/tensorflow_model_server_test.py @@ -708,6 +708,21 @@ def test_profiler_service_with_valid_trace_request(self): out, err = proc.communicate() print("stdout: '{}' | stderr: '{}'".format(out, err)) + def test_tf_text(self): + """Test TF Text.""" + model_path = os.path.join(flags.os.environ['TEST_SRCDIR'], + 'tf_serving/tensorflow_serving', + 'servables/tensorflow/testdata', + 'tf_text_regression') + model_server_address = TensorflowModelServerTest.RunServer( + 'default', + model_path)[1] + self.VerifyPredictRequest( + model_server_address, + expected_output=3.0, + expected_version=self._GetModelVersion(model_path), + rpc_timeout=600) + if __name__ == '__main__': tf.enable_eager_execution() diff --git a/tensorflow_serving/model_servers/test_util/tensorflow_model_server_test_base.py b/tensorflow_serving/model_servers/test_util/tensorflow_model_server_test_base.py index d8c544601f2..683d9d1e69e 100644 --- a/tensorflow_serving/model_servers/test_util/tensorflow_model_server_test_base.py +++ b/tensorflow_serving/model_servers/test_util/tensorflow_model_server_test_base.py @@ -241,7 +241,8 @@ def VerifyPredictRequest( model_name='default', specify_output=True, batch_input=False, - signature_name=signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY): + signature_name=signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY, + rpc_timeout=RPC_TIMEOUT): """Send PredictionService.Predict request and verify output.""" print('Sending Predict request...') # Prepare request @@ -260,7 +261,7 @@ def VerifyPredictRequest( # Send request channel = grpc.insecure_channel(model_server_address) stub = prediction_service_pb2_grpc.PredictionServiceStub(channel) - result = stub.Predict(request, RPC_TIMEOUT) # 5 secs timeout + result = stub.Predict(request, rpc_timeout) # 5 secs timeout # Verify response self.assertTrue('y' in result.outputs) self.assertIs(types_pb2.DT_FLOAT, result.outputs['y'].dtype) diff --git a/tensorflow_serving/servables/tensorflow/testdata/BUILD b/tensorflow_serving/servables/tensorflow/testdata/BUILD index 21c02026156..9df1f352853 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/BUILD +++ b/tensorflow_serving/servables/tensorflow/testdata/BUILD @@ -113,6 +113,13 @@ filegroup( ), ) +filegroup( + name = "tf_text_regression", + srcs = glob( + ["tf_text_regression/**"], + ), +) + exports_files([ "saved_model_half_plus_three/00000123/saved_model.pb", "saved_model_half_plus_three/00000123/assets/foo.txt", diff --git a/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression.README b/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression.README new file mode 100644 index 00000000000..faf81a58f1a --- /dev/null +++ b/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression.README @@ -0,0 +1,19 @@ +# Copyright 2016 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +This model is used to test the integration with TF Text, and is updated using +this script: +https://github.com/tensorflow/text/blob/master/oss_scripts/model_server/save_models.py + diff --git a/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/saved_model.pb b/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/saved_model.pb new file mode 100644 index 0000000000000000000000000000000000000000..88d20a5f12692a4517a082d4b1279cf858a76fbb GIT binary patch literal 1111050 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
-For additional serving endpoints, see the Client REST API. +For additional serving endpoints, see the Client REST API. ## Install Docker From 3bb4985d454f17b1820bf53328f222f4b567d614 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 25 Sep 2020 18:02:23 -0700 Subject: [PATCH 4202/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f081be73-b558-4675-bca4-5f5bb78bbd9d PiperOrigin-RevId: 333844078 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 287e9b8e1dd..d6552ed5cf0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e4601defcd678d82019c6b5d1bb9e9dd02e1af9258f5bda0de1419bc2ff6ee2c", - git_commit = "7d66cb75522916187746c1b62170ec5774117383", + sha256 = "7d62432f0b8a772c7fde566a594ff018ef4a2597692e9e48bc1a0f0883ca0f40", + git_commit = "751ad6f5d3bc7789c24a5ccc772774af0ad98d3d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f95d152451ee2aa233105154ff161954a5a942ce Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 26 Sep 2020 00:01:34 -0700 Subject: [PATCH 4203/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/43f0141c-be70-46bc-89a2-4903f15cc405 PiperOrigin-RevId: 333877738 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d6552ed5cf0..a8b1802f1cb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7d62432f0b8a772c7fde566a594ff018ef4a2597692e9e48bc1a0f0883ca0f40", - git_commit = "751ad6f5d3bc7789c24a5ccc772774af0ad98d3d", + sha256 = "b29f28ae85297289ab6e43009b5ba57eb1af14cf86c52a874cb409344d605e9a", + git_commit = "00ea01af949de4334ad036bfeebfd155c594e18b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 86063db8450e1448924bf6d1ca8d482ebdb94516 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 26 Sep 2020 06:01:34 -0700 Subject: [PATCH 4204/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/15fe0ead-0fb8-4417-bb72-b19ac9db613f PiperOrigin-RevId: 333904665 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a8b1802f1cb..c75ec4f3552 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b29f28ae85297289ab6e43009b5ba57eb1af14cf86c52a874cb409344d605e9a", - git_commit = "00ea01af949de4334ad036bfeebfd155c594e18b", + sha256 = "a394a87acdbe527ba8eda120ffe5d824ee0a9c7a8cd5b1b517bd0ff8f4606cc2", + git_commit = "e41868cd1fb26babb6dffc49e32cd2b21c210c1b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2340535229842daf307bd9bbb3f48e122d4e3cd2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 26 Sep 2020 12:01:24 -0700 Subject: [PATCH 4205/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5372ce99-0593-4656-875e-4d28f34e25dd PiperOrigin-RevId: 333929584 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c75ec4f3552..578e68187a4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a394a87acdbe527ba8eda120ffe5d824ee0a9c7a8cd5b1b517bd0ff8f4606cc2", - git_commit = "e41868cd1fb26babb6dffc49e32cd2b21c210c1b", + sha256 = "5d2db08d0956c033e4537e2f3d6f47856a39028a30073790d0a49b952658a73c", + git_commit = "a0b68d1ecc46f9bbc8fad4f18c68f25c6bd5ae48", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1b7b501f6b196867fa58f719963975f1f5c9d65f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 26 Sep 2020 18:01:51 -0700 Subject: [PATCH 4206/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6d767b26-63dc-451b-a393-8eebb82122f0 PiperOrigin-RevId: 333955979 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 578e68187a4..4f56f8c54eb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5d2db08d0956c033e4537e2f3d6f47856a39028a30073790d0a49b952658a73c", - git_commit = "a0b68d1ecc46f9bbc8fad4f18c68f25c6bd5ae48", + sha256 = "dc04cad263109f2a56175c36ae13830ee155586b80b378f4df6024c4c692478e", + git_commit = "16a59707b60ea4ba5f4f2910ef532e30300e6315", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ad2f83ce9ba897910f03b76e2ec9bc14eb987a2b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 27 Sep 2020 06:01:55 -0700 Subject: [PATCH 4207/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/da0963d4-d548-4967-9045-6292fc4c6268 PiperOrigin-RevId: 334008733 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4f56f8c54eb..86c1ff545b8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dc04cad263109f2a56175c36ae13830ee155586b80b378f4df6024c4c692478e", - git_commit = "16a59707b60ea4ba5f4f2910ef532e30300e6315", + sha256 = "ed49604ba3970d8e90e8c9c539552cf4c781e6cb7fb0cb5ec7fbbc2aa2b90f2e", + git_commit = "3b382e84270e3499e452c2048d84fbaf3e40d449", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 39aa2a02f25cd377252713169469affe136d0a1b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 27 Sep 2020 12:01:36 -0700 Subject: [PATCH 4208/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0bbefc98-140b-4689-8ae5-f695aaadfe8b PiperOrigin-RevId: 334033769 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 86c1ff545b8..297dadb936f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ed49604ba3970d8e90e8c9c539552cf4c781e6cb7fb0cb5ec7fbbc2aa2b90f2e", - git_commit = "3b382e84270e3499e452c2048d84fbaf3e40d449", + sha256 = "5577cb062d4c627a28b62274667cc830bebb5145fb535a17d02dcffcd400aaac", + git_commit = "7679280cbd712c4fa0c12d0c2c1f0b4bed3a4d6f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3cc82573e1b68c6e0336f227f54bccec176a9db9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 27 Sep 2020 18:01:44 -0700 Subject: [PATCH 4209/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f5ca2bdf-8af0-4279-9cd1-be6b86cc8a7b PiperOrigin-RevId: 334060595 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 297dadb936f..0bef2246b51 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5577cb062d4c627a28b62274667cc830bebb5145fb535a17d02dcffcd400aaac", - git_commit = "7679280cbd712c4fa0c12d0c2c1f0b4bed3a4d6f", + sha256 = "1874e2b689611c55b639271dcdad79f2fdd52e9aed01f2eeea4115a1315b5e55", + git_commit = "652291e217c199d2f92b19bbc0f499d57537d7f9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 26a4d21c9c01ed1922b78ca93858fd4f2bccc1db Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Sep 2020 00:02:27 -0700 Subject: [PATCH 4210/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bed8cf41-0dbd-44c6-9285-2c6bcb8aa9bf PiperOrigin-RevId: 334095457 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0bef2246b51..5e633c5d9e7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1874e2b689611c55b639271dcdad79f2fdd52e9aed01f2eeea4115a1315b5e55", - git_commit = "652291e217c199d2f92b19bbc0f499d57537d7f9", + sha256 = "687ab616c7558c5a0cddf92248a6fd9d470802b75a8e27775b90eaf3c1772c72", + git_commit = "c603937ed5cb3cc753bf988656937d7233ecd76f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e191307546faed2e4cdcb7d1c1027ee46bc8ad64 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Sep 2020 06:01:36 -0700 Subject: [PATCH 4211/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2b47343e-59cc-41ff-9109-7495e170d22c PiperOrigin-RevId: 334140863 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5e633c5d9e7..a7938798959 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "687ab616c7558c5a0cddf92248a6fd9d470802b75a8e27775b90eaf3c1772c72", - git_commit = "c603937ed5cb3cc753bf988656937d7233ecd76f", + sha256 = "a58cc2b896cd07b329a750ea035af525a3a6cf56114c21b02804c0d65bcafe45", + git_commit = "0eae98209020e52dd3a00e3368d748f86ee94ef3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c6ff8b5ae88c9e2708bb81268d2054ce4f8d6773 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Sep 2020 12:14:08 -0700 Subject: [PATCH 4212/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/43d97c28-1c06-42dd-aa08-7c8c6723f47c PiperOrigin-RevId: 334210943 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a7938798959..3ed86e5e6ac 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a58cc2b896cd07b329a750ea035af525a3a6cf56114c21b02804c0d65bcafe45", - git_commit = "0eae98209020e52dd3a00e3368d748f86ee94ef3", + sha256 = "b901b60b3dfc2026b350cb6140e07f0d5b2122124b969d334be56ed6e2db7326", + git_commit = "3c34be1769b07c4686f7eb60c7f6043861e84b21", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0c1b26df394e3c8b2b27d1567d544831c728609c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Sep 2020 18:03:25 -0700 Subject: [PATCH 4213/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/65cf55c4-f963-411e-beb4-0a7e34ad0408 PiperOrigin-RevId: 334276212 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3ed86e5e6ac..cbe049f70ea 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b901b60b3dfc2026b350cb6140e07f0d5b2122124b969d334be56ed6e2db7326", - git_commit = "3c34be1769b07c4686f7eb60c7f6043861e84b21", + sha256 = "8191ce419aff4abe8ef3183a5b1d27b586f2cd4bc754e646bc86bbc98da1c63f", + git_commit = "e1b710dd046acefd717f2a54817cfa446aea522f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c4f8d16b65bc06ac0e4dbb8943f71b91c03b16b0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Sep 2020 00:12:15 -0700 Subject: [PATCH 4214/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/77870d1d-9808-478c-bdda-da0a2ad22468 PiperOrigin-RevId: 334318691 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cbe049f70ea..cfe8d9fbfa6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8191ce419aff4abe8ef3183a5b1d27b586f2cd4bc754e646bc86bbc98da1c63f", - git_commit = "e1b710dd046acefd717f2a54817cfa446aea522f", + sha256 = "8f1171e010ce016e303af1c5d6b94049ca9d90d573b1da17e1a00729cc0a2a4f", + git_commit = "b40e326ca34d2bd9383cb339258dd8c5b00d12a8", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 21971f2168bcaa527c35efce74a0acb2707af357 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Sep 2020 06:38:58 -0700 Subject: [PATCH 4215/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/84cc7583-d7af-42c8-a408-9bbb809f683b PiperOrigin-RevId: 334367084 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cfe8d9fbfa6..ed0d8a02cc8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8f1171e010ce016e303af1c5d6b94049ca9d90d573b1da17e1a00729cc0a2a4f", - git_commit = "b40e326ca34d2bd9383cb339258dd8c5b00d12a8", + sha256 = "be16450f19a564fd6f5b5092fbd00a85039ff5be0a023ba6087b19931eb22ae1", + git_commit = "9427f6f2cfc21aac7fcd25710cc354bcd8c195ad", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 24b14942531205da5f005e943871a8c89ebe7db3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Sep 2020 12:03:55 -0700 Subject: [PATCH 4216/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bf3980a5-84fe-4db7-8116-f5bd40e33613 PiperOrigin-RevId: 334431652 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ed0d8a02cc8..6ccc7d35f9b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "be16450f19a564fd6f5b5092fbd00a85039ff5be0a023ba6087b19931eb22ae1", - git_commit = "9427f6f2cfc21aac7fcd25710cc354bcd8c195ad", + sha256 = "d36b7f21951179f74940972618b9a02ee9dc7aca11bcdcd0f1f1a3e351fbd9ca", + git_commit = "3cda087cdc3a311c02fd57c16c231103e0054926", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From db18c54f94ec478d74809bd7a6ec0fd64c6b6dd0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Sep 2020 18:44:58 -0700 Subject: [PATCH 4217/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9c3fb918-ae20-4893-b031-3fb4e7e7b773 PiperOrigin-RevId: 334507067 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6ccc7d35f9b..13515ec51ab 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d36b7f21951179f74940972618b9a02ee9dc7aca11bcdcd0f1f1a3e351fbd9ca", - git_commit = "3cda087cdc3a311c02fd57c16c231103e0054926", + sha256 = "a092c1d330a6fb3dc3f4a0a2b568f08bc0b3109e014fb96890e0f30b334a0f31", + git_commit = "1c482cdd838caa42f9aa68ebe48a0283771e300d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4898209b0a8e6cbd92ae2daa24103534e387b6d4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Sep 2020 00:02:23 -0700 Subject: [PATCH 4218/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a067ccbf-65ea-47e5-be26-4cf3927147b4 PiperOrigin-RevId: 334539687 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 13515ec51ab..75d5ff6d8b2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a092c1d330a6fb3dc3f4a0a2b568f08bc0b3109e014fb96890e0f30b334a0f31", - git_commit = "1c482cdd838caa42f9aa68ebe48a0283771e300d", + sha256 = "62e0aab6cc73e18ac33a0ead193dc642a842d800e1cde5b5cb8706ca1cab65dd", + git_commit = "e79e90cb04fb453b7ed023295007bdb02fde61da", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4de4e3bf4b6f60760f4078dbba154b586b984537 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Sep 2020 06:02:43 -0700 Subject: [PATCH 4219/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ed21c4a1-2b63-42e3-b9f3-1027845d96c1 PiperOrigin-RevId: 334582243 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 75d5ff6d8b2..bde6b346dba 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "62e0aab6cc73e18ac33a0ead193dc642a842d800e1cde5b5cb8706ca1cab65dd", - git_commit = "e79e90cb04fb453b7ed023295007bdb02fde61da", + sha256 = "9cf7ed95f1c584aab615b2b4e40a95a7fd637be62ee8b6c1517dfcbb16af3ba1", + git_commit = "48e66b2056d0f9bfabc0e499f39826c94980634f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5c36faab1c93f5d404fbef546793e5ad514247ff Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Sep 2020 12:01:32 -0700 Subject: [PATCH 4220/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b17adc5b-b375-457d-9c19-2869c241a1f1 PiperOrigin-RevId: 334648897 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bde6b346dba..e370b2a45aa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9cf7ed95f1c584aab615b2b4e40a95a7fd637be62ee8b6c1517dfcbb16af3ba1", - git_commit = "48e66b2056d0f9bfabc0e499f39826c94980634f", + sha256 = "44f5f68e802ce82b3dba1ad65413be5cc4af92f5ccac640637b9acff1213ef2d", + git_commit = "e075feb3452d39a1e957c924eb8d3e6f8f7dd9b1", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0eadb8f80ed9c222ca64cc74df95af797bfd180d Mon Sep 17 00:00:00 2001 From: Christina Sorokin Date: Wed, 30 Sep 2020 17:28:46 -0700 Subject: [PATCH 4221/8103] Fixit: fix order dependency in batching_session_test. PiperOrigin-RevId: 334713802 --- .../batching/batching_session_test.cc | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tensorflow_serving/batching/batching_session_test.cc b/tensorflow_serving/batching/batching_session_test.cc index a43a9d2e2a8..a93b3af9bc7 100644 --- a/tensorflow_serving/batching/batching_session_test.cc +++ b/tensorflow_serving/batching/batching_session_test.cc @@ -718,16 +718,6 @@ TEST_P(BatchingSessionTest, AllowedBatchSizesRequirePadding) { "/tensorflow/serving/batching_session/processed_batch_size"); int32 start_pad_value = GetPercentileTotal("/tensorflow/serving/batching_session/padding_size"); - EXPECT_TRUE( - CheckDescriptor("/tensorflow/serving/batching_session/padding_size", - "Tracks the padding size distribution on batches.", - {"execution_batch_size"})); - EXPECT_TRUE( - CheckDescriptor("/tensorflow/serving/batching_session/input_batch_size", - "Tracks the batch size distribution on the inputs.", {})); - EXPECT_TRUE(CheckDescriptor( - "/tensorflow/serving/batching_session/processed_batch_size", - "Tracks the batch size distribution on processing.", {})); // Arrange to capture the batch size. std::unique_ptr batch_size_capturing_session( @@ -760,6 +750,16 @@ TEST_P(BatchingSessionTest, AllowedBatchSizesRequirePadding) { EXPECT_EQ( start_pad_value + 1, GetPercentileTotal("/tensorflow/serving/batching_session/padding_size")); + EXPECT_TRUE( + CheckDescriptor("/tensorflow/serving/batching_session/padding_size", + "Tracks the padding size distribution on batches.", + {"execution_batch_size"})); + EXPECT_TRUE( + CheckDescriptor("/tensorflow/serving/batching_session/input_batch_size", + "Tracks the batch size distribution on the inputs.", {})); + EXPECT_TRUE(CheckDescriptor( + "/tensorflow/serving/batching_session/processed_batch_size", + "Tracks the batch size distribution on processing.", {})); } TEST_P(BatchingSessionTest, UnsortedAllowedBatchSizesRejected) { From 79819454b65bbdcfa7c1aeeb01c77bec01b7e1ef Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Sep 2020 18:13:31 -0700 Subject: [PATCH 4222/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/04e2eded-530e-4d21-baad-4c1ab4044da7 PiperOrigin-RevId: 334720173 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e370b2a45aa..4e3e1cda874 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "44f5f68e802ce82b3dba1ad65413be5cc4af92f5ccac640637b9acff1213ef2d", - git_commit = "e075feb3452d39a1e957c924eb8d3e6f8f7dd9b1", + sha256 = "7f9a24befc6ff7f5c25e0c1d4dbfa6457e5ebc4dd727134d059674d90493179a", + git_commit = "3abfb8c74bf66df7f10bb52793e51906f2375f7f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From af3fbed25e85a958cbd2be43f75da31126248822 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 1 Oct 2020 00:01:41 -0700 Subject: [PATCH 4223/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bf579d24-79e2-405d-8cfe-66813cd784d3 PiperOrigin-RevId: 334755491 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4e3e1cda874..4b0dd9fc5dc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7f9a24befc6ff7f5c25e0c1d4dbfa6457e5ebc4dd727134d059674d90493179a", - git_commit = "3abfb8c74bf66df7f10bb52793e51906f2375f7f", + sha256 = "b5b9c0c92fa743be616fdbd8cf14d0410961f35f1e3eb2573ec114ad77abbbda", + git_commit = "933507aeda94bfa6127e02503c46342f7927f47a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a4e5fc258bb909370321cef860e3f7fd8ce1f29f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 1 Oct 2020 06:01:29 -0700 Subject: [PATCH 4224/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8265af11-b34e-45e3-ab86-3b28c99a3591 PiperOrigin-RevId: 334797359 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4b0dd9fc5dc..3c288dc253a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b5b9c0c92fa743be616fdbd8cf14d0410961f35f1e3eb2573ec114ad77abbbda", - git_commit = "933507aeda94bfa6127e02503c46342f7927f47a", + sha256 = "aa4f5abd0e5c99513ae08fbdf77ab2b421673ee032741812382b2015dd2f12fd", + git_commit = "69d173c2690fc0f7aed35eed5e28e2b3d03b72da", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d721ab66bf861292978416d99adf19bba20d0400 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 1 Oct 2020 12:29:06 -0700 Subject: [PATCH 4225/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/852d4b4c-5f06-40af-99bf-2c4d8ef6945c PiperOrigin-RevId: 334872788 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3c288dc253a..b85cc23390f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "aa4f5abd0e5c99513ae08fbdf77ab2b421673ee032741812382b2015dd2f12fd", - git_commit = "69d173c2690fc0f7aed35eed5e28e2b3d03b72da", + sha256 = "4bd722e0414888d2751f0190f36dfe0a5d4382d2a41c299c00c38f754212fe8d", + git_commit = "e4f2583fb2c9d72eb87d27cc19ef763e14e94394", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b288645c260e92d47bb4126b79bf81fe43c8ae07 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 1 Oct 2020 18:01:50 -0700 Subject: [PATCH 4226/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/78ed33d9-6ba4-471a-b433-20137f59a8bb PiperOrigin-RevId: 334936629 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b85cc23390f..90559a7dff2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4bd722e0414888d2751f0190f36dfe0a5d4382d2a41c299c00c38f754212fe8d", - git_commit = "e4f2583fb2c9d72eb87d27cc19ef763e14e94394", + sha256 = "f1af01b8eae17300af416896aacf44953341c9f6c58d72a4b66cbf1fdc37a4f0", + git_commit = "12cb2288b983bd51f323d1cc0a3f8bf2ce4652cb", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From dc5cfd4a6f8f15b5f1774351aadaa5e6039a5126 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 2 Oct 2020 00:01:46 -0700 Subject: [PATCH 4227/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/478dc507-af10-404f-92a0-ace33262adda PiperOrigin-RevId: 334972474 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 90559a7dff2..ed82a62f59d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f1af01b8eae17300af416896aacf44953341c9f6c58d72a4b66cbf1fdc37a4f0", - git_commit = "12cb2288b983bd51f323d1cc0a3f8bf2ce4652cb", + sha256 = "051b79375c5b9ecfa371d4101d410eea77b2af6262a42bf86c829063fd42e16f", + git_commit = "cafa2ffdac22756dde19337c6460a3d0a5e2b116", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6e740dd7c002dd3f1db62e7c3807d455928082ee Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 2 Oct 2020 06:02:20 -0700 Subject: [PATCH 4228/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/71efbe77-b399-4bf5-998e-0e9dfd44d16a PiperOrigin-RevId: 335012440 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ed82a62f59d..0c097077a8c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "051b79375c5b9ecfa371d4101d410eea77b2af6262a42bf86c829063fd42e16f", - git_commit = "cafa2ffdac22756dde19337c6460a3d0a5e2b116", + sha256 = "fbf51ab4a0a8a24397dc82fb00e6d6270a05e149b0b16cbcf35a6405e2843612", + git_commit = "7dd629d9a15d444e57a9c4a721f2e94328080e38", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From cd78635242335c90c6060cef1b82d6b22350e157 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 2 Oct 2020 12:02:14 -0700 Subject: [PATCH 4229/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/24f9e94e-cfa9-4247-9018-56e51b977d35 PiperOrigin-RevId: 335072798 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0c097077a8c..47b150aabc6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fbf51ab4a0a8a24397dc82fb00e6d6270a05e149b0b16cbcf35a6405e2843612", - git_commit = "7dd629d9a15d444e57a9c4a721f2e94328080e38", + sha256 = "1f7f030cc3b773d2a465b681801a709fc4287a850dfce2372254899b760dcad7", + git_commit = "8d9132b8bfacf51a28ac4e21a8c99ec0d5679929", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d2ab062bce1830641c4e072c1dffc1e2b6def0a4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 3 Oct 2020 00:01:58 -0700 Subject: [PATCH 4230/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/510d176b-2c34-4a68-bc50-fd893202849e PiperOrigin-RevId: 335165594 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 47b150aabc6..b5650b8df28 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1f7f030cc3b773d2a465b681801a709fc4287a850dfce2372254899b760dcad7", - git_commit = "8d9132b8bfacf51a28ac4e21a8c99ec0d5679929", + sha256 = "9672149fdd85f73931a6793f58f6fbc34279006799df0623c2fc14d1b7f31cc0", + git_commit = "5b5aab7f63ad9667edee3bb837adc4033ccbeac3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From db8129bde9804cd0ebf7f2a0b6f2e9d42f344fed Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 3 Oct 2020 06:01:34 -0700 Subject: [PATCH 4231/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7ac75e34-90c3-45af-ac87-2ffb399d9268 PiperOrigin-RevId: 335189499 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b5650b8df28..3f60437266c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9672149fdd85f73931a6793f58f6fbc34279006799df0623c2fc14d1b7f31cc0", - git_commit = "5b5aab7f63ad9667edee3bb837adc4033ccbeac3", + sha256 = "2a723883e40ac2506aa2a904cc854e6b0edb5e512fde87d53827ce1470dabfd4", + git_commit = "2256067e7038786530f0f50265893668b5a7330e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a505a03722377fea5a21ca69329a51083423b7db Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 3 Oct 2020 18:02:35 -0700 Subject: [PATCH 4232/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/17ec3bec-ce1f-41ad-baa3-6fe85d64ee2a PiperOrigin-RevId: 335235890 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3f60437266c..e1aaf461592 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2a723883e40ac2506aa2a904cc854e6b0edb5e512fde87d53827ce1470dabfd4", - git_commit = "2256067e7038786530f0f50265893668b5a7330e", + sha256 = "0f9079b2ecff7aa8d519f1661b6a3e1f62c443c76e43e86120332c08c94d44ec", + git_commit = "c8b15f70992ce4d3ffb5ff3d4fce3fcfcef50edd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 16ffcd572575ea69ec816f8fc6f0f876c8062d50 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 4 Oct 2020 06:01:59 -0700 Subject: [PATCH 4233/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9d8bc8a9-f785-4e2d-95e7-4ad317dad211 PiperOrigin-RevId: 335282847 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e1aaf461592..8824ecd418a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0f9079b2ecff7aa8d519f1661b6a3e1f62c443c76e43e86120332c08c94d44ec", - git_commit = "c8b15f70992ce4d3ffb5ff3d4fce3fcfcef50edd", + sha256 = "e75f83479e69a2a5fc26ec20333e40dcf51b092f80dfdc8c2c328526225c8732", + git_commit = "9439a1412008989add06dd01d445714268398344", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a368af960b6b9c699db4f88678a082753a9862a3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 4 Oct 2020 18:01:51 -0700 Subject: [PATCH 4234/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/dec96b3f-9999-4e41-8037-87b52587d23c PiperOrigin-RevId: 335330124 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8824ecd418a..3e4a4faac0f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e75f83479e69a2a5fc26ec20333e40dcf51b092f80dfdc8c2c328526225c8732", - git_commit = "9439a1412008989add06dd01d445714268398344", + sha256 = "52783127230f5e1f07efaaaaee960fca7a690617020f377084dfed9c19aa2fb8", + git_commit = "edeb46930e7e6cef0154ef7fa8014bb42d4052c2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 025e13b6bffbe8def1b9224980e5c2eb98abcf10 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 5 Oct 2020 00:02:07 -0700 Subject: [PATCH 4235/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8045aae2-a1fb-40a8-beec-66a0c8156c77 PiperOrigin-RevId: 335357580 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3e4a4faac0f..2b1654f5407 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "52783127230f5e1f07efaaaaee960fca7a690617020f377084dfed9c19aa2fb8", - git_commit = "edeb46930e7e6cef0154ef7fa8014bb42d4052c2", + sha256 = "d531127be55323d100f253676240a2d4cb48b74b1f6db52b3dd835b8490c72bb", + git_commit = "1c1b3accab37d181c1dae86ae0e2c769a6fd8730", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 27cd2f136f7aa733c0eef6c45b70e67dfb7d86de Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 5 Oct 2020 06:02:15 -0700 Subject: [PATCH 4236/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0ee5068f-f94e-4057-9feb-1031fabba8ab PiperOrigin-RevId: 335400704 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2b1654f5407..c4b775d227b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d531127be55323d100f253676240a2d4cb48b74b1f6db52b3dd835b8490c72bb", - git_commit = "1c1b3accab37d181c1dae86ae0e2c769a6fd8730", + sha256 = "58572b5161e904217b1a46d94d680c4667542011def3a6f92e6cc0c3eee165c4", + git_commit = "e8d84bd57a45dce49cebd5afe09875425813695f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3285bdfc71653181c0596069b953bd66ad5d8949 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 5 Oct 2020 12:02:45 -0700 Subject: [PATCH 4237/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/214c3d3e-f6f1-4f60-bdfe-b17a4bec2d42 PiperOrigin-RevId: 335468272 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c4b775d227b..d902b176f2e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "58572b5161e904217b1a46d94d680c4667542011def3a6f92e6cc0c3eee165c4", - git_commit = "e8d84bd57a45dce49cebd5afe09875425813695f", + sha256 = "038df8a4efe1e70d24b9a9f1ceb1809d450aff8588059646ceccaa0713ed69d1", + git_commit = "a4af555c80dcc961ae8924da3c75074738f8eab3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b770f8edd5b297b7a74dd0b2e337baed817507da Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 5 Oct 2020 18:01:36 -0700 Subject: [PATCH 4238/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/873ef732-6237-4e75-8a57-64fdbf4bc285 PiperOrigin-RevId: 335540526 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d902b176f2e..e9dc323c4dc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "038df8a4efe1e70d24b9a9f1ceb1809d450aff8588059646ceccaa0713ed69d1", - git_commit = "a4af555c80dcc961ae8924da3c75074738f8eab3", + sha256 = "c923014835d105bdde91b4be1b7987152f398198e73b1b8acdc563dfc33d1332", + git_commit = "1831af3c012643a5d61012bf71b653e075dcfd22", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 84e0189d1b9828813125efef9ff2d541f101705a Mon Sep 17 00:00:00 2001 From: Chao Xie Date: Mon, 5 Oct 2020 18:37:24 -0700 Subject: [PATCH 4239/8103] Update CUDNN_VERSION to 8.0.4.30. PiperOrigin-RevId: 335545413 --- tensorflow_serving/tools/docker/Dockerfile.devel-gpu | 2 +- tensorflow_serving/tools/docker/Dockerfile.gpu | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 56ff378e9a3..41d8445fd62 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -20,7 +20,7 @@ LABEL maintainer=gvasudevan@google.com LABEL tensorflow_serving_github_branchtag=${TF_SERVING_VERSION_GIT_BRANCH} LABEL tensorflow_serving_github_commit=${TF_SERVING_VERSION_GIT_COMMIT} -ENV CUDNN_VERSION=8.0.2.39 +ENV CUDNN_VERSION=8.0.4.30 ENV TF_TENSORRT_VERSION=7.1.3 ENV CUDA=11.0 diff --git a/tensorflow_serving/tools/docker/Dockerfile.gpu b/tensorflow_serving/tools/docker/Dockerfile.gpu index 7e12ceacf94..676d0975417 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.gpu @@ -25,7 +25,7 @@ LABEL maintainer="gvasudevan@google.com" LABEL tensorflow_serving_github_branchtag=${TF_SERVING_VERSION_GIT_BRANCH} LABEL tensorflow_serving_github_commit=${TF_SERVING_VERSION_GIT_COMMIT} -ENV CUDNN_VERSION=8.0.2.39 +ENV CUDNN_VERSION=8.0.4.30 ENV TF_TENSORRT_VERSION=7.1.3 ENV CUDA=11.0 ENV LD_LIBRARY_PATH /usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH From 966aef9ec37abe3c1e7c728d767fe86d7eef9fcb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 6 Oct 2020 00:01:44 -0700 Subject: [PATCH 4240/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b49e9dc3-ca18-4afd-a998-56a2765cf201 PiperOrigin-RevId: 335581789 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e9dc323c4dc..4c52278da43 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c923014835d105bdde91b4be1b7987152f398198e73b1b8acdc563dfc33d1332", - git_commit = "1831af3c012643a5d61012bf71b653e075dcfd22", + sha256 = "30571c7327b6bdce183dbb4fb8ddea36236b31b32464cd2c5666210fdd045807", + git_commit = "bebcbfe67c5a0e617e3c691c44d499325ffa2ce8", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 651939fc513e8557f8dc3a53d593e830d9e52f3e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 6 Oct 2020 06:01:39 -0700 Subject: [PATCH 4241/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a455ec2d-a6ee-44a1-97e7-745f12d58425 PiperOrigin-RevId: 335623112 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4c52278da43..468f3bed858 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "30571c7327b6bdce183dbb4fb8ddea36236b31b32464cd2c5666210fdd045807", - git_commit = "bebcbfe67c5a0e617e3c691c44d499325ffa2ce8", + sha256 = "c5037bb98d1dadc27e12c36921fdf2de608e21c1d355b2f1eaf9e0a3f5f5e552", + git_commit = "9648531c0bf5163de26e8688c017d58b3eb80405", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 86606446dbc76d9b86fc2b928ffc820d13a80a82 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 6 Oct 2020 12:01:36 -0700 Subject: [PATCH 4242/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1bc8f98c-01fa-4ce5-9123-18cff74fab8e PiperOrigin-RevId: 335689580 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 468f3bed858..627607306d6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c5037bb98d1dadc27e12c36921fdf2de608e21c1d355b2f1eaf9e0a3f5f5e552", - git_commit = "9648531c0bf5163de26e8688c017d58b3eb80405", + sha256 = "b9bc43355391fff27a5479b6bcb5352c17edec7f74f1c9a40ae9818b5ce73ffa", + git_commit = "43aa22645e0e19b9a4be10e83f40e069d0554a08", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8c295bb158642f3a14eecc5fa104a07133a8bcc0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 6 Oct 2020 18:01:59 -0700 Subject: [PATCH 4243/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9f585b72-5b57-4aaf-9bbe-acf99f30b0a8 PiperOrigin-RevId: 335762112 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 627607306d6..421e14c3da4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b9bc43355391fff27a5479b6bcb5352c17edec7f74f1c9a40ae9818b5ce73ffa", - git_commit = "43aa22645e0e19b9a4be10e83f40e069d0554a08", + sha256 = "6fbf82b15306a209ac6cb66875eb590ccebb8d131cf1b1d3b1aba5f75b0a46cb", + git_commit = "27134a78b3cb2dbe8bebba276082ac569a55af12", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From be13713aec30fff5fcfb784f988a4761b6c0bfb7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 7 Oct 2020 00:01:58 -0700 Subject: [PATCH 4244/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5953cce1-722a-4247-941b-f26e66d45b70 PiperOrigin-RevId: 335804629 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 421e14c3da4..d5a744126ab 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6fbf82b15306a209ac6cb66875eb590ccebb8d131cf1b1d3b1aba5f75b0a46cb", - git_commit = "27134a78b3cb2dbe8bebba276082ac569a55af12", + sha256 = "48108fdc23f3a804c9b07c24dba3c8f4c5131d4530e2f2dd78750838e5c45403", + git_commit = "884008e6eb5999897e2f0e9ab96ab5fa1a97fb2c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5fe2bff5ba30715fbb0e1d6c68d62591078e16e6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 7 Oct 2020 06:01:35 -0700 Subject: [PATCH 4245/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b959b89a-7283-48de-a365-8da1475a5bd4 PiperOrigin-RevId: 335850055 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d5a744126ab..85bf0063fac 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "48108fdc23f3a804c9b07c24dba3c8f4c5131d4530e2f2dd78750838e5c45403", - git_commit = "884008e6eb5999897e2f0e9ab96ab5fa1a97fb2c", + sha256 = "23209448ce1570407081961619a91513ce8276a3746110208e3d5bb12409c3b3", + git_commit = "b196e2189f3ca513e4e3a783a2fa00c2df67b57d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2e14cd9dc2647127d7cb8c44ceab5dfcf6ac28c4 Mon Sep 17 00:00:00 2001 From: Frederic Rechtenstein Date: Wed, 7 Oct 2020 09:19:14 -0700 Subject: [PATCH 4246/8103] Support multiple SignatureDefs by key in TFLite models PiperOrigin-RevId: 335883685 --- tensorflow_serving/servables/tensorflow/BUILD | 2 +- .../servables/tensorflow/tflite_session.cc | 123 ++++++------- .../tensorflow/tflite_session_main.cc | 6 + .../tensorflow/tflite_session_test.cc | 168 +++++++++++------- 4 files changed, 164 insertions(+), 135 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index 31f7060ec81..e9a4cdbc700 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -390,7 +390,7 @@ cc_binary( srcs = ["tflite_session_main.cc"], deps = [ ":tflite_session_lib", - "@org_tensorflow//tensorflow/core:framework", + "@org_tensorflow//tensorflow/core:lib", ], ) diff --git a/tensorflow_serving/servables/tensorflow/tflite_session.cc b/tensorflow_serving/servables/tensorflow/tflite_session.cc index 1256df73998..b8548a31e8e 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session.cc @@ -73,8 +73,9 @@ Status TfLiteTypeToTfType(TfLiteType tflite_type, DataType* type) { return Status::OK(); } -std::string TfToTfLiteTensorName(const string& tf_name) { - // TF variable names have ':0' suffix, TF Lite variables dont. +std::string CanonicalTfLiteTensorName(const string& tf_name) { + // TF variable names have ':0' suffix, early versions of the TF Lite converter + // used to strip this suffix. Enforce this behavior for compatibility. std::pair name_index = absl::StrSplit(tf_name, absl::MaxSplits(':', 1)); return std::string(name_index.first); @@ -222,37 +223,6 @@ Status TfLiteSession::Create(string&& buffer, return errors::InvalidArgument("Cannot build FlatBufferModel from buffer."); } - SignatureDef lite_signature_def; - std::map signature_defs; - const auto status = - tflite::GetSignatureDefMap(model->GetModel(), &signature_defs); - if (status != Status::OK()) { - return errors::InvalidArgument( - "Invalid SignatureDefs found in TfLite model: ", - status.error_message()); - } - const bool has_lite_signature_def = !signature_defs.empty(); - if (has_lite_signature_def) { - // TODO(b/157098128): Support multiple SignatureDefs by key. - if (signature_defs.size() > 1) { - return errors::InvalidArgument( - "Multiple SignatureDefs found in TfLite model: ", - status.error_message()); - } - lite_signature_def = signature_defs.begin()->second; - } - std::string method = kPredictMethodName; - std::map tensor_to_sigdef_name; - if (has_lite_signature_def) { - method = std::string(lite_signature_def.method_name()); - for (const auto& t : lite_signature_def.inputs()) { - tensor_to_sigdef_name[TfToTfLiteTensorName(t.second.name())] = t.first; - } - for (const auto& t : lite_signature_def.outputs()) { - tensor_to_sigdef_name[TfToTfLiteTensorName(t.second.name())] = t.first; - } - } - // TODO(b/140959776): Add support for non-builtin ops (flex or custom ops). tflite::ops::builtin::BuiltinOpResolver resolver; // TODO(b/165643512): Remove adding Hashtable to resolver by default. @@ -270,46 +240,59 @@ Status TfLiteSession::Create(string&& buffer, TensorInfoMap outputs; TF_RETURN_IF_ERROR(GetTensorInfoMap(*interpreter, false, &outputs)); + // Map of TFLite tensor name -> tensor index std::map input_tensor_to_index; std::map output_tensor_to_index; - - signatures->clear(); - SignatureDef* sigdef = &(*signatures)[kDefaultServingSignatureDefKey]; for (const auto& info : inputs) { - auto name = info.first; - if (has_lite_signature_def) { - const auto& lite_name = TfToTfLiteTensorName(name); - auto it = tensor_to_sigdef_name.find(lite_name); - if (it == tensor_to_sigdef_name.end()) { - return errors::Internal( - "Cannot find signature def input name from tflite input tensor", - name); - } - name = it->second; - input_tensor_to_index[lite_name] = info.second.second; - } else { - input_tensor_to_index[info.first] = info.second.second; - } - (*sigdef->mutable_inputs())[name] = info.second.first; + const string& tflite_tensor_name = CanonicalTfLiteTensorName(info.first); + input_tensor_to_index[tflite_tensor_name] = info.second.second; } for (const auto& info : outputs) { - auto name = info.first; - if (has_lite_signature_def) { - const auto& lite_name = TfToTfLiteTensorName(name); - auto it = tensor_to_sigdef_name.find(lite_name); - if (it == tensor_to_sigdef_name.end()) { - return errors::Internal( - "Cannot find signature def output name from tflite output tensor", - name); + const string& tflite_tensor_name = CanonicalTfLiteTensorName(info.first); + output_tensor_to_index[tflite_tensor_name] = info.second.second; + } + + // Attempt to read signature defs from the model file + std::map signature_defs; + const auto status = + tflite::GetSignatureDefMap(model->GetModel(), &signature_defs); + if (status != Status::OK()) { + return errors::InvalidArgument( + "Invalid SignatureDefs found in TfLite model: ", + status.error_message()); + } + const bool has_lite_signature_def = !signature_defs.empty(); + + signatures->clear(); + if (has_lite_signature_def) { + // Ensure that canonical TFLite tensor names are used in signature defs + for (const auto& signature_item : signature_defs) { + SignatureDef* tflite_signature = &(*signatures)[signature_item.first]; + tflite_signature->CopyFrom(signature_item.second); + for (auto& input : *tflite_signature->mutable_inputs()) { + TensorInfo* tensor_info = &input.second; + tensor_info->set_name(CanonicalTfLiteTensorName(tensor_info->name())); } - name = it->second; - output_tensor_to_index[lite_name] = info.second.second; - } else { - output_tensor_to_index[info.first] = info.second.second; + for (auto& output : *tflite_signature->mutable_outputs()) { + TensorInfo* tensor_info = &output.second; + tensor_info->set_name(CanonicalTfLiteTensorName(tensor_info->name())); + } + } + } else { + // Build a mock signature from the input/output tensors of the model. + // TODO(b/169239308) + LOG(WARNING) << "No signature def found in TFLite model. Generating one."; + SignatureDef* sigdef = &(*signatures)[kDefaultServingSignatureDefKey]; + for (const auto& info : inputs) { + string tflite_tensor_name = CanonicalTfLiteTensorName(info.first); + (*sigdef->mutable_inputs())[tflite_tensor_name] = info.second.first; } - (*sigdef->mutable_outputs())[name] = info.second.first; + for (const auto& info : outputs) { + string tflite_tensor_name = CanonicalTfLiteTensorName(info.first); + (*sigdef->mutable_outputs())[tflite_tensor_name] = info.second.first; + } + sigdef->set_method_name(kPredictMethodName); } - sigdef->set_method_name(method); tflite_session->reset(new TfLiteSession( std::move(input_tensor_to_index), std::move(output_tensor_to_index), @@ -359,10 +342,7 @@ Status TfLiteSession::Run( // happen in-parallel. absl::MutexLock lock(&mutex_); for (const auto& input : inputs) { - string name = input.first; - if (input_tensor_to_index_.find(name) == input_tensor_to_index_.end()) { - name = TfToTfLiteTensorName(input.first); - } + const string& name = CanonicalTfLiteTensorName(input.first); if (input_tensor_to_index_.find(name) == input_tensor_to_index_.end()) { return errors::InvalidArgument("Missing input TFLite tensor: ", name); } @@ -377,10 +357,7 @@ Status TfLiteSession::Run( outputs->clear(); for (const auto& tfname : output_tensor_names) { - string name = tfname; - if (output_tensor_to_index_.find(name) == output_tensor_to_index_.end()) { - name = TfToTfLiteTensorName(tfname); - } + const string& name = CanonicalTfLiteTensorName(tfname); if (output_tensor_to_index_.find(name) == output_tensor_to_index_.end()) { return errors::InvalidArgument("Missing output TFLite tensor: ", name); } diff --git a/tensorflow_serving/servables/tensorflow/tflite_session_main.cc b/tensorflow_serving/servables/tensorflow/tflite_session_main.cc index 47e5578fb5c..e9114c6c77e 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session_main.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session_main.cc @@ -53,5 +53,11 @@ int main(int argc, char** argv) { } std::cout << "Successfully created TF Lite Session for model file: " << filename << std::endl; + + std::cout << "Signatures: " << std::endl; + for (const auto& signature_info : signatures) { + std::cout << " " << signature_info.first << ": " + << signature_info.second.DebugString() << std::endl; + } return 0; } diff --git a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc index 5cfd8266482..57390110b18 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc @@ -42,6 +42,10 @@ namespace tensorflow { namespace serving { namespace { +using ::testing::_; +using ::testing::Pair; +using ::testing::UnorderedElementsAre; + constexpr char kTestModel[] = "/servables/tensorflow/testdata/saved_model_half_plus_two_tflite/00000123/" "model.tflite"; @@ -58,7 +62,7 @@ TEST(TfLiteSession, BasicTest) { ::google::protobuf::Map signatures; std::unique_ptr session; - TF_EXPECT_OK( + TF_ASSERT_OK( TfLiteSession::Create(std::move(model_bytes), &session, &signatures)); EXPECT_EQ(signatures.size(), 1); EXPECT_EQ(signatures.begin()->first, "serving_default"); @@ -106,9 +110,30 @@ TEST(TfLiteSession, BasicTest) { } } -constexpr char kTestModelInputList[] = "list:0"; -constexpr char kTestModelInputShape[] = "shape:0"; -constexpr char kTestModelOutput[] = "output:0"; +constexpr char kTestModelInputList[] = "list"; +constexpr char kTestModelInputShape[] = "shape"; +constexpr char kTestModelOutput[] = "output"; + +constexpr char kSignatureInputList[] = "input_list"; +constexpr char kSignatureInputShape[] = "input_shape"; +constexpr char kSignatureOutput[] = "sigdef_output"; + +std::map GetTestSignatureDefMap() { + auto signature_def = SignatureDef(); + TensorInfo input_list_tensor; + TensorInfo input_shape_tensor; + TensorInfo output_tensor; + *input_list_tensor.mutable_name() = absl::StrCat(kTestModelInputList, ":0"); + *input_shape_tensor.mutable_name() = absl::StrCat(kTestModelInputShape, ":0"); + *output_tensor.mutable_name() = absl::StrCat(kTestModelOutput, ":0"); + *signature_def.mutable_method_name() = kClassifyMethodName; + (*signature_def.mutable_inputs())[kSignatureInputList] = input_list_tensor; + (*signature_def.mutable_inputs())[kSignatureInputShape] = input_shape_tensor; + (*signature_def.mutable_outputs())[kSignatureOutput] = output_tensor; + std::map signature_def_map = { + {kDefaultServingSignatureDefKey, signature_def}}; + return signature_def_map; +} tensorflow::DataType ToTfTensorType(tflite::TensorType tflite_type) { switch (tflite_type) { @@ -131,7 +156,7 @@ tensorflow::DataType ToTfTensorType(tflite::TensorType tflite_type) { // sets up the model to use the `Reshape` *flex* op as opposed to using the // builtin `Reshape` op from TF Lite. string BuildTestModel(tflite::TensorType tensor_type, bool use_flex_op, - SignatureDef* signature_def = nullptr) { + std::map* signature_def_map) { std::vector inputs; std::vector outputs; std::vector> tensors; @@ -206,15 +231,14 @@ string BuildTestModel(tflite::TensorType tensor_type, bool use_flex_op, builder.CreateVector(&subgraph, 1), builder.CreateString("testmodel"), builder.CreateVector(buffers))); - if (signature_def) { + if (signature_def_map) { std::string model_buffer = string( reinterpret_cast(builder.GetBufferPointer()), builder.GetSize()); std::string model_buffer_with_signature_def; auto model = tflite::FlatBufferModel::BuildFromModel( flatbuffers::GetRoot(model_buffer.data())); - std::map signature_def_map = { - {kDefaultServingSignatureDefKey, *signature_def}}; - TF_CHECK_OK(tflite::SetSignatureDefMap(model->GetModel(), signature_def_map, + TF_CHECK_OK(tflite::SetSignatureDefMap(model->GetModel(), + *signature_def_map, &model_buffer_with_signature_def)); return model_buffer_with_signature_def; } @@ -224,11 +248,13 @@ string BuildTestModel(tflite::TensorType tensor_type, bool use_flex_op, } TEST(TfLiteSession, ProcessStrings) { + auto model_signature_def_map = GetTestSignatureDefMap(); string model_bytes = - BuildTestModel(tflite::TensorType_STRING, /*use_flex_op=*/false); + BuildTestModel(tflite::TensorType_STRING, /*use_flex_op=*/false, + &model_signature_def_map); ::google::protobuf::Map signatures; std::unique_ptr session; - TF_EXPECT_OK( + TF_ASSERT_OK( TfLiteSession::Create(std::move(model_bytes), &session, &signatures)); Tensor input_list = test::AsTensor({"a", "b", "c", "d"}, TensorShape({4})); @@ -244,11 +270,13 @@ TEST(TfLiteSession, ProcessStrings) { } TEST(TfLiteSession, ProcessStringsFlex) { + auto model_signature_def_map = GetTestSignatureDefMap(); string model_bytes = - BuildTestModel(tflite::TensorType_STRING, /*use_flex_op=*/true); + BuildTestModel(tflite::TensorType_STRING, /*use_flex_op=*/true, + &model_signature_def_map); ::google::protobuf::Map signatures; std::unique_ptr session; - TF_EXPECT_OK( + TF_ASSERT_OK( TfLiteSession::Create(std::move(model_bytes), &session, &signatures)); Tensor input_list = test::AsTensor({"a", "b", "c", "d"}, TensorShape({4})); @@ -264,11 +292,13 @@ TEST(TfLiteSession, ProcessStringsFlex) { } TEST(TfLiteSession, ThreadPoolOptions) { + auto model_signature_def_map = GetTestSignatureDefMap(); string model_bytes = - BuildTestModel(tflite::TensorType_STRING, /*use_flex_op=*/false); + BuildTestModel(tflite::TensorType_STRING, /*use_flex_op=*/false, + &model_signature_def_map); ::google::protobuf::Map signatures; std::unique_ptr session; - TF_EXPECT_OK( + TF_ASSERT_OK( TfLiteSession::Create(std::move(model_bytes), &session, &signatures)); Tensor input_list = test::AsTensor({"a", "b", "c", "d"}, TensorShape({4})); @@ -296,66 +326,80 @@ TEST(TfLiteSession, ThreadPoolOptions) { } TEST(TfLiteSession, SimpleSignatureDef) { - auto test_signature_def = SignatureDef(); + auto model_signature_def_map = GetTestSignatureDefMap(); + string model_bytes = + BuildTestModel(tflite::TensorType_STRING, /*use_flex_op=*/false, + &model_signature_def_map); + + ::google::protobuf::Map signatures; + // Fill an entry in the output signatures map, to check that it gets cleared + string kResidualSignatureKey = "residual_signature"; + signatures[kResidualSignatureKey] = SignatureDef(); + + std::unique_ptr session; + TF_ASSERT_OK( + TfLiteSession::Create(std::move(model_bytes), &session, &signatures)); + + ASSERT_THAT(signatures, + UnorderedElementsAre(Pair(kDefaultServingSignatureDefKey, _))); + + auto sigdef = signatures[kDefaultServingSignatureDefKey]; + EXPECT_EQ(sigdef.inputs().at(kSignatureInputList).name(), + kTestModelInputList); + EXPECT_EQ(sigdef.inputs().at(kSignatureInputShape).name(), + kTestModelInputShape); + EXPECT_EQ(sigdef.outputs().at(kSignatureOutput).name(), kTestModelOutput); + EXPECT_EQ(sigdef.method_name(), kClassifyMethodName); +} + +TEST(TfLiteSession, MultipleSignatureDef) { TensorInfo input_list_tensor; TensorInfo input_shape_tensor; TensorInfo output_tensor; - constexpr char kSignatureInputList[] = "input_list"; - constexpr char kSignatureInputShape[] = "input_shape"; - constexpr char kSignatureOutput[] = "sigdef_output"; *input_list_tensor.mutable_name() = kTestModelInputList; *input_shape_tensor.mutable_name() = kTestModelInputShape; *output_tensor.mutable_name() = kTestModelOutput; - *test_signature_def.mutable_method_name() = kClassifyMethodName; - (*test_signature_def.mutable_inputs())[kSignatureInputList] = - input_list_tensor; - (*test_signature_def.mutable_inputs())[kSignatureInputShape] = - input_shape_tensor; - (*test_signature_def.mutable_outputs())[kSignatureOutput] = output_tensor; + SignatureDef signature1 = SignatureDef(); + *signature1.mutable_method_name() = kClassifyMethodName; + (*signature1.mutable_inputs())[kSignatureInputList] = input_list_tensor; + (*signature1.mutable_outputs())[kSignatureOutput] = output_tensor; + SignatureDef signature2 = SignatureDef(); + *signature2.mutable_method_name() = kClassifyMethodName; + (*signature2.mutable_inputs())[kSignatureInputShape] = input_shape_tensor; + (*signature2.mutable_outputs())[kSignatureOutput] = output_tensor; + constexpr char kSignatureKey1[] = "signature1"; + constexpr char kSignatureKey2[] = "signature2"; + std::map signature_def_map = { + {kSignatureKey1, signature1}, {kSignatureKey2, signature2}}; + string model_bytes = BuildTestModel( - tflite::TensorType_STRING, /*use_flex_op=*/false, &test_signature_def); + tflite::TensorType_STRING, /*use_flex_op=*/false, &signature_def_map); ::google::protobuf::Map signatures; std::unique_ptr session; TF_EXPECT_OK( TfLiteSession::Create(std::move(model_bytes), &session, &signatures)); - auto sigdef = signatures[kDefaultServingSignatureDefKey]; - ASSERT_EQ(sigdef.inputs().at(kSignatureInputList).name(), - kTestModelInputList); - ASSERT_EQ(sigdef.inputs().at(kSignatureInputShape).name(), + ASSERT_THAT(signatures, UnorderedElementsAre(Pair(kSignatureKey1, _), + Pair(kSignatureKey2, _))); + auto result_signature1 = signatures[kSignatureKey1]; + EXPECT_THAT(result_signature1.inputs().at(kSignatureInputList).name(), + kTestModelInputList); + EXPECT_EQ(result_signature1.outputs().at(kSignatureOutput).name(), + kTestModelOutput); + EXPECT_EQ(result_signature1.method_name(), kClassifyMethodName); + auto result_signature2 = signatures[kSignatureKey2]; + EXPECT_EQ(result_signature2.inputs().at(kSignatureInputShape).name(), kTestModelInputShape); - ASSERT_EQ(sigdef.outputs().at(kSignatureOutput).name(), kTestModelOutput); - ASSERT_EQ(sigdef.method_name(), kClassifyMethodName); + EXPECT_EQ(result_signature2.outputs().at(kSignatureOutput).name(), + kTestModelOutput); + EXPECT_EQ(result_signature2.method_name(), kClassifyMethodName); } TEST(TfLiteSession, SimpleSignatureDefAndRun) { - auto test_signature_def = SignatureDef(); - TensorInfo input_list_tensor; - TensorInfo input_shape_tensor; - TensorInfo output_tensor; - constexpr char kSignatureInputList[] = "input_list"; - constexpr char kSignatureInputShape[] = "input_shape"; - constexpr char kSignatureOutput[] = "sigdef_output"; - std::string liteTestModelInputList = kTestModelInputList; - std::string liteTestModelInputShape = kTestModelInputShape; - std::string liteTestModelOutput = kTestModelOutput; - liteTestModelInputList = - liteTestModelInputList.substr(0, liteTestModelInputList.size() - 2); - liteTestModelInputShape = - liteTestModelInputShape.substr(0, liteTestModelInputShape.size() - 2); - liteTestModelOutput = - liteTestModelOutput.substr(0, liteTestModelOutput.size() - 2); - *input_list_tensor.mutable_name() = liteTestModelInputList; - *input_shape_tensor.mutable_name() = liteTestModelInputShape; - *output_tensor.mutable_name() = liteTestModelOutput; - *test_signature_def.mutable_method_name() = kClassifyMethodName; - (*test_signature_def.mutable_inputs())[kSignatureInputList] = - input_list_tensor; - (*test_signature_def.mutable_inputs())[kSignatureInputShape] = - input_shape_tensor; - (*test_signature_def.mutable_outputs())[kSignatureOutput] = output_tensor; - string model_bytes = BuildTestModel( - tflite::TensorType_STRING, /*use_flex_op=*/false, &test_signature_def); + auto model_signature_def_map = GetTestSignatureDefMap(); + string model_bytes = + BuildTestModel(tflite::TensorType_STRING, /*use_flex_op=*/false, + &model_signature_def_map); ::google::protobuf::Map signatures; std::unique_ptr session; TF_EXPECT_OK( @@ -389,7 +433,9 @@ TEST(TfLiteSession, SimpleSignatureDefAndRun) { static void BM_Reshape(benchmark::State& state, bool use_flex_op) { static TfLiteSession* session; if (state.thread_index() == 0) { - string model_bytes = BuildTestModel(tflite::TensorType_INT32, use_flex_op); + auto model_signature_def_map = GetTestSignatureDefMap(); + string model_bytes = BuildTestModel(tflite::TensorType_INT32, use_flex_op, + &model_signature_def_map); ::google::protobuf::Map signatures; std::unique_ptr sess; TF_ASSERT_OK( @@ -460,7 +506,7 @@ void BM_MobileNet(benchmark::State& state) { for (auto _ : state) { outputs.clear(); TF_ASSERT_OK(session->Run( - {{"input", x}}, {"MobilenetV1/Predictions/Reshape_1"}, {}, &outputs)); + {{"x:0", x}}, {"MobilenetV1/Predictions/Reshape_1"}, {}, &outputs)); } } BENCHMARK(BM_MobileNet)->ThreadRange(1, 64); From c6cbfc644f525b69e92f23420e82792114cc97fa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 7 Oct 2020 12:01:41 -0700 Subject: [PATCH 4247/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/407fc8ae-f1b4-44b1-a037-2de12daed860 PiperOrigin-RevId: 335920838 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 85bf0063fac..6c49f842946 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "23209448ce1570407081961619a91513ce8276a3746110208e3d5bb12409c3b3", - git_commit = "b196e2189f3ca513e4e3a783a2fa00c2df67b57d", + sha256 = "ff99dbcfc37acf90ffe4161cc917a5c3f2ae2b17741a73bd3d03d66045180c50", + git_commit = "811248e122cb18a2811b0fd546b624385c82de5d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 43e7cfaa39357b69d54a3a91b8696d7aed7fa7e4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 7 Oct 2020 14:42:21 -0700 Subject: [PATCH 4248/8103] Move some utilities from batching_session to batching_util for upcoming TFRT SavedModel batching supports. PiperOrigin-RevId: 335956459 --- tensorflow_serving/batching/BUILD | 10 ++- .../batching/batching_options.h | 83 +++++++++++++++++++ .../batching/batching_session.cc | 76 +++-------------- .../batching/batching_session.h | 56 +------------ .../batching/batching_session_test.cc | 9 +- tensorflow_serving/batching/batching_util.cc | 36 +++++++- tensorflow_serving/batching/batching_util.h | 49 ++++++++++- 7 files changed, 191 insertions(+), 128 deletions(-) create mode 100644 tensorflow_serving/batching/batching_options.h diff --git a/tensorflow_serving/batching/BUILD b/tensorflow_serving/batching/BUILD index e7a4d234ffc..a162167a1a9 100644 --- a/tensorflow_serving/batching/BUILD +++ b/tensorflow_serving/batching/BUILD @@ -56,6 +56,12 @@ cc_library( ], ) +cc_library( + name = "batching_options", + hdrs = ["batching_options.h"], + deps = [], +) + cc_library( name = "batching_session", srcs = ["batching_session.cc"], @@ -64,9 +70,10 @@ cc_library( "//visibility:public", ], deps = [ + ":batching_options", ":batching_util", + ":incremental_barrier", ":threadsafe_status", - "//tensorflow_serving/batching:incremental_barrier", "//tensorflow_serving/servables/tensorflow:serving_session", "//tensorflow_serving/util:hash", "@com_google_absl//absl/types:optional", @@ -148,6 +155,7 @@ cc_library( srcs = ["batching_util.cc"], hdrs = ["batching_util.h"], deps = [ + "@com_google_absl//absl/types:span", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", ], diff --git a/tensorflow_serving/batching/batching_options.h b/tensorflow_serving/batching/batching_options.h new file mode 100644 index 00000000000..6b0a28389d2 --- /dev/null +++ b/tensorflow_serving/batching/batching_options.h @@ -0,0 +1,83 @@ +/* Copyright 2020 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_SERVING_BATCHING_BATCHING_OPTIONS_H_ +#define TENSORFLOW_SERVING_BATCHING_BATCHING_OPTIONS_H_ + +#include + +namespace tensorflow { +namespace serving { + +// Batching options. +struct BatchingOptions { + // If set, restricts the allowed tensor batch sizes. + // + // When the batch scheduler forms a batch of size N, the batch size is rounded + // up to the smallest value M in 'allowed_batch_sizes' s.t. M >= N. The + // tensors submitted to the "Run()" call are padded with M-N repeats of one of + // the first N entries (i.e. a guaranteed valid entry). The last M-N entries + // of the output tensors are ignored. + // + // This option is useful when the underlying platform has some per-batch-size + // overhead, to limit the number of distinct batch sizes that can occur. It + // may be sensible to use an exponential sequence e.g. [8, 16, 32, ..., + // max_batch_size], a linear one e.g. [100, 200, 300, ..., max_batch_size], or + // perhaps a hybrid e.g. [8, 16, 32, 64, 100, 200, 300, ..., max_batch_size]. + // + // IMPORTANT: The entries must be in increasing order. + // + // IMPORTANT: The final entry in 'allowed_batch_sizes' must equal the maximum + // batch size parameter supplied to the batch scheduler. + // + // If left empty, no rounding/padding is performed. + std::vector allowed_batch_sizes; + + // If set to true, padding is performed for tensors of the same name + // but with unequal dimensions (modulo zeroth dimension), so that + // all tensors of the same name have equal dim sizes. + // For each tensor its first element is used as padding value. + // + // For example: + // given input tensors of shapes [1, 500, 101], [2, 300, 101], [1, 400, 101] + // they will be padded to shapes [1, 500, 101], [2, 500, 101], [1, 500, 101]. + // Padding is not performed in zeroth dimension. + // + // Supported tensor datatypes: + // DT_FLOAT, DT_DOUBLE, DT_INT8, DT_UINT8, DT_INT16, + // DT_UINT16, DT_INT32, DT_INT64, DT_COMPLEX64, DT_COMPLEX128, + // DT_STRING, DT_BOOL, DT_QINT8, DT_QUINT8, DT_QINT16, + // DT_QUINT16, DT_QINT32, DT_HALF, DT_RESOURCE. + // + // Supported ranks: from 1 to 6. + // + // This option is useful when using recurrent models(like LSTMs) with serving. + // These models typically accept variable-length inputs and when + // training them typical strategy is to save sequence lengths for decoding + // and pad those variable-length dims to maximum in batch. + // So, this option is used to achieve similar behavior + // when serving with batching, it is assumed that sequence lengths + // have already been saved. + // + // If tensors with the same name have different shapes + // (modulo zeroth dimension) and this option is set to false, + // then error Status will be returned. + bool pad_variable_length_inputs = false; +}; + +} // namespace serving +} // namespace tensorflow + +#endif // TENSORFLOW_SERVING_BATCHING_BATCHING_OPTIONS_H_ diff --git a/tensorflow_serving/batching/batching_session.cc b/tensorflow_serving/batching/batching_session.cc index f0e9029d388..25e7ef83551 100644 --- a/tensorflow_serving/batching/batching_session.cc +++ b/tensorflow_serving/batching/batching_session.cc @@ -154,21 +154,6 @@ std::vector>> GetTaskInputsVector( } return all_task_inputs; } -// Returns true iff all dims of shape1 are equal to dims of shape2 starting with -// the first (not zeroth) dimension. -// For example, for shapes [1, 2, 3] and [4, 2, 3] the result is true. -bool AreShapesEqualExceptZeroDim(const TensorShape& shape1, - const TensorShape& shape2) { - if (shape1.dims() != shape2.dims()) { - return false; - } - for (int i = 1; i < shape1.dims(); ++i) { - if (shape1.dim_size(i) != shape2.dim_size(i)) { - return false; - } - } - return true; -} } // namespace @@ -272,11 +257,6 @@ class BatchingSession : public ServingSession { Status ComputeInputSize(const std::vector>& inputs, size_t* size) const; - // Returns the smallest entry in 'options_.allowed_batch_sizes' that is - // greater than or equal to 'batch_size'. If 'options_.allowed_batch_sizes' is - // empty, simply returns 'batch_size'. - int RoundToLowestAllowedBatchSize(int batch_size) const; - // Merges the input tensors in a batch, via concatenation of correspondingly- // named tensors. Puts the merged inputs in the order they are in in the // signature. Assumes 'batch' is non-empty. Returns an error if there are any @@ -458,33 +438,14 @@ BatchingSession::BatchingSession(const BatchingSessionOptions& options, Status BatchingSession::ComputeInputSize( const std::vector>& inputs, size_t* size) const { - if (inputs.empty()) { - return errors::InvalidArgument( - "Batching session Run() must have at least one input tensor"); - } - - bool first = true; - for (const auto& entry : inputs) { - const Tensor& tensor = entry.second; - - if (tensor.shape().dims() == 0) { - return errors::InvalidArgument( - "Batching session Run() input tensors must have at least one " - "dimension"); - } - const size_t this_size = tensor.shape().dim_size(0); - - if (first) { - *size = this_size; - first = false; - } else { - if (this_size != *size) { - return errors::InvalidArgument( - "Batching session Run() input tensors must have equal " - "0th-dimension size"); - } - } - } + TF_RETURN_IF_ERROR(::tensorflow::serving::ComputeTensorBatchSize( + inputs, size, + [](const std::pair& tensor) { + return tensor.second.shape().dims(); + }, + [](const std::pair& tensor, size_t dim) { + return tensor.second.shape().dim_size(dim); + })); for (const auto& entry : inputs) { const Tensor& tensor = entry.second; RecordInputBatchSize(tensor.shape().dim_size(0)); @@ -492,20 +453,6 @@ Status BatchingSession::ComputeInputSize( return Status::OK(); } -int BatchingSession::RoundToLowestAllowedBatchSize(int batch_size) const { - if (options_.allowed_batch_sizes.empty()) { - return batch_size; - } - for (int allowed_size : options_.allowed_batch_sizes) { - if (allowed_size >= batch_size) { - return allowed_size; - } - } - LOG(ERROR) << "Maximum batch size greater than largest allowed size; " - "ignoring allowed sizes constraint"; - return batch_size; -} - Status BatchingSession::MergeInputTensors( const TensorSignature& signature, const Batch& batch, std::vector>* merged_inputs) { @@ -516,7 +463,7 @@ Status BatchingSession::MergeInputTensors( } const int lowest_allowed_batch_size = - RoundToLowestAllowedBatchSize(batch.size()); + RoundToLowestAllowedBatchSize(options_.allowed_batch_sizes, batch.size()); const int padding_size = lowest_allowed_batch_size - batch.size(); RecordPaddingSize(padding_size, lowest_allowed_batch_size); RecordProcessedBatchSize(lowest_allowed_batch_size); @@ -620,8 +567,9 @@ Status BatchingSession::SplitOutputTensors( for (int i = 0; i < batch->num_tasks(); ++i) { task_sizes_plus_optional_padding.push_back(batch->task(i).zeroth_dim_size); } - const int padding_size = - RoundToLowestAllowedBatchSize(batch->size()) - batch->size(); + const int padding_size = RoundToLowestAllowedBatchSize( + options_.allowed_batch_sizes, batch->size()) - + batch->size(); if (padding_size > 0) { task_sizes_plus_optional_padding.push_back(padding_size); } diff --git a/tensorflow_serving/batching/batching_session.h b/tensorflow_serving/batching/batching_session.h index a900cca65f9..fcef7e04ece 100644 --- a/tensorflow_serving/batching/batching_session.h +++ b/tensorflow_serving/batching/batching_session.h @@ -33,6 +33,7 @@ limitations under the License. #include "tensorflow/core/protobuf/config.pb.h" #include "tensorflow/core/protobuf/meta_graph.pb.h" #include "tensorflow/core/public/session.h" +#include "tensorflow_serving/batching/batching_options.h" #include "tensorflow_serving/batching/threadsafe_status.h" namespace tensorflow { @@ -81,60 +82,7 @@ struct SignatureWithBatchingSessionSchedulerCreator { }; // Options for batching tensorflow Sessions; see the Create*() functions below. -struct BatchingSessionOptions { - // If set, restricts the allowed tensor batch sizes. - // - // When the batch scheduler forms a batch of size N, the batch size is rounded - // up to the smallest value M in 'allowed_batch_sizes' s.t. M >= N. The - // tensors submitted to the underlying Session are padded with M-N repeats of - // one of the first N entries (i.e. a guaranteed valid entry). The last M-N - // entries of the output tensors are ignored. - // - // This option is useful when the underlying platform has some per-batch-size - // overhead, to limit the number of distinct batch sizes that can occur. It - // may be sensible to use an exponential sequence e.g. [8, 16, 32, ..., - // max_batch_size], a linear one e.g. [100, 200, 300, ..., max_batch_size], or - // perhaps a hybrid e.g. [8, 16, 32, 64, 100, 200, 300, ..., max_batch_size]. - // - // IMPORTANT: The entries must be in increasing order. - // - // IMPORTANT: The final entry in 'allowed_batch_sizes' must equal the maximum - // batch size parameter supplied to the batch scheduler. - // - // If left empty, no rounding/padding is performed. - std::vector allowed_batch_sizes; - - // If set to true, padding is performed for tensors of the same name - // but with unequal dimensions (modulo zeroth dimension), so that - // all tensors of the same name have equal dim sizes. - // For each tensor its first element is used as padding value. - // - // For example: - // given input tensors of shapes [1, 500, 101], [2, 300, 101], [1, 400, 101] - // they will be padded to shapes [1, 500, 101], [2, 500, 101], [1, 500, 101]. - // Padding is not performed in zeroth dimension. - // - // Supported tensor datatypes: - // DT_FLOAT, DT_DOUBLE, DT_INT8, DT_UINT8, DT_INT16, - // DT_UINT16, DT_INT32, DT_INT64, DT_COMPLEX64, DT_COMPLEX128, - // DT_STRING, DT_BOOL, DT_QINT8, DT_QUINT8, DT_QINT16, - // DT_QUINT16, DT_QINT32, DT_HALF, DT_RESOURCE. - // - // Supported ranks: from 1 to 6. - // - // This option is useful when using recurrent models(like LSTMs) with serving. - // These models typically accept variable-length inputs and when - // training them typical strategy is to save sequence lengths for decoding - // and pad those variable-length dims to maximum in batch. - // So, this option is used to achieve similar behavior - // when serving with batching, it is assumed that sequence lengths - // have already been saved. - // - // If tensors with the same name have different shapes - // (modulo zeroth dimension) and this option is set to false, - // then error Status will be returned. - bool pad_variable_length_inputs = false; -}; +using BatchingSessionOptions = BatchingOptions; // Wraps a session in a new session that automatically batches Run() calls. // Uses one batcher for each distinct Run() signature supported. In addition to diff --git a/tensorflow_serving/batching/batching_session_test.cc b/tensorflow_serving/batching/batching_session_test.cc index a93b3af9bc7..c14cf05cdf2 100644 --- a/tensorflow_serving/batching/batching_session_test.cc +++ b/tensorflow_serving/batching/batching_session_test.cc @@ -653,11 +653,10 @@ TEST_P(BatchingSessionTest, RequestWithIncompatibleInputTensorSizes) { {{"input_0", "input_1"}, {"output"}}, CreateHalfPlusTwoSession(), &batching_session)); - ExpectError( - "Batching session Run() input tensors must have equal 0th-dimension size", - {{"input_0", test::AsTensor({3}, {1})}, - {"input_1", test::AsTensor({5, 7}, {2})}}, - {"output"}, batching_session.get()); + ExpectError("Batching Run() input tensors must have equal 0th-dimension size", + {{"input_0", test::AsTensor({3}, {1})}, + {"input_1", test::AsTensor({5, 7}, {2})}}, + {"output"}, batching_session.get()); // We expect no change. EXPECT_EQ(start_input_value, diff --git a/tensorflow_serving/batching/batching_util.cc b/tensorflow_serving/batching/batching_util.cc index 4daf1193b45..375a70fa3f2 100644 --- a/tensorflow_serving/batching/batching_util.cc +++ b/tensorflow_serving/batching/batching_util.cc @@ -21,6 +21,7 @@ limitations under the License. #include "tensorflow/core/framework/tensor.h" #include "tensorflow/core/framework/types.h" #include "tensorflow/core/lib/core/errors.h" +#include "tensorflow/core/platform/env_time.h" namespace tensorflow { namespace serving { @@ -48,7 +49,7 @@ struct OneDimPadding { // is ignored, because we don't perform padding in that dimension. template Eigen::array CreatePadding( - Tensor tensor, const std::vector& max_dim_sizes) { + Tensor tensor, absl::Span max_dim_sizes) { Eigen::array padding; for (unsigned int i = 0; i < max_dim_sizes.size(); ++i) { if (i > 0 && max_dim_sizes[i] - tensor.dim_size(i) > 0) { @@ -101,7 +102,7 @@ struct PadTensor { // Only ranks from 1 to 6 are supported (like in PadOp). template Status PadTensorOfSpecificType(const Tensor& tensor, - const std::vector& max_dim_sizes, + absl::Span max_dim_sizes, Tensor* output_tensor) { int num_dims = tensor.dims(); switch (num_dims) { @@ -180,7 +181,7 @@ std::map> CalculateMaxDimSizes( return max_dim_sizes; } -Status AddPadding(const Tensor& tensor, const std::vector& max_dim_sizes, +Status AddPadding(const Tensor& tensor, absl::Span max_dim_sizes, Tensor* padded_tensor) { const DataType input_dtype = tensor.dtype(); Status padding_status; @@ -202,5 +203,34 @@ Status AddPadding(const Tensor& tensor, const std::vector& max_dim_sizes, #undef CASE return padding_status; } + +int RoundToLowestAllowedBatchSize(absl::Span allowed_batch_sizes, + int batch_size) { + if (allowed_batch_sizes.empty()) { + return batch_size; + } + for (int allowed_size : allowed_batch_sizes) { + if (allowed_size >= batch_size) { + return allowed_size; + } + } + LOG(WARNING) << "Maximum batch size greater than largest allowed size; " + "ignoring allowed sizes constraint"; + return batch_size; +} + +bool AreShapesEqualExceptZeroDim(const TensorShape& shape1, + const TensorShape& shape2) { + if (shape1.dims() != shape2.dims()) { + return false; + } + for (int i = 1; i < shape1.dims(); ++i) { + if (shape1.dim_size(i) != shape2.dim_size(i)) { + return false; + } + } + return true; +} + } // namespace serving } // namespace tensorflow diff --git a/tensorflow_serving/batching/batching_util.h b/tensorflow_serving/batching/batching_util.h index c5ee217685d..0d963ce04a1 100644 --- a/tensorflow_serving/batching/batching_util.h +++ b/tensorflow_serving/batching/batching_util.h @@ -20,6 +20,7 @@ limitations under the License. #include #include +#include "absl/types/span.h" #include "tensorflow/core/framework/tensor.h" #include "tensorflow/core/lib/core/status.h" @@ -59,8 +60,54 @@ std::map> CalculateMaxDimSizes( // // Supported tensor ranks: from 1 to 6. -Status AddPadding(const Tensor& tensor, const std::vector& max_dim_sizes, +Status AddPadding(const Tensor& tensor, absl::Span max_dim_sizes, Tensor* padded_tensor); + +// Returns the smallest entry in `allowed_batch_sizes` that is greater than or +// equal to `batch_size`. If `allowed_batch_sizes` is empty, simply returns +// `batch_size`. +int RoundToLowestAllowedBatchSize(absl::Span allowed_batch_sizes, + int batch_size); + +// Returns true iff all dims of shape1 are equal to dims of shape2 starting with +// the first (not zeroth) dimension. +// For example, for shapes [1, 2, 3] and [4, 2, 3] the result is true. +bool AreShapesEqualExceptZeroDim(const TensorShape& shape1, + const TensorShape& shape2); + +// Returns the first dimension size (batching dimension) of each tensor in +// `inputs`. If their first dimension sizes don't match, returns an error. +template +Status ComputeTensorBatchSize(TensorList inputs, size_t* size, DimFunc dim_func, + DimSizeFunc dim_size_func) { + if (inputs.empty()) { + return errors::InvalidArgument( + "Batching Run() must have at least one input tensor"); + } + + bool first = true; + for (const auto& tensor : inputs) { + if (dim_func(tensor) == 0) { + return errors::InvalidArgument( + "Batching Run() input tensors must have at least one " + "dimension"); + } + const size_t this_size = dim_size_func(tensor, 0); + + if (first) { + *size = this_size; + first = false; + } else { + if (this_size != *size) { + return errors::InvalidArgument( + "Batching Run() input tensors must have equal " + "0th-dimension size"); + } + } + } + return Status::OK(); +} + } // namespace serving } // namespace tensorflow #endif // TENSORFLOW_SERVING_BATCHING_BATCHING_UTIL_H_ From 4248c4e41bcc026ec0c7621b1100bcf1e4ed2993 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 7 Oct 2020 18:01:33 -0700 Subject: [PATCH 4249/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c5d9a8a7-0b91-4d53-85f7-e8236844db8f PiperOrigin-RevId: 335991553 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6c49f842946..f3e7910f5bf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ff99dbcfc37acf90ffe4161cc917a5c3f2ae2b17741a73bd3d03d66045180c50", - git_commit = "811248e122cb18a2811b0fd546b624385c82de5d", + sha256 = "0495b39f1e8a26e6b4c6597a603c122c06fbc10b60b7c09222d8013d2f3a6e86", + git_commit = "68a6fe0d984377b625b421d34f8c607d6ed73597", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1eb2dc028c0082bcfa0d4dad9402ca446cca7992 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 8 Oct 2020 18:01:43 -0700 Subject: [PATCH 4250/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/55eb32cd-344a-42c4-bcd4-7f36e30f8565 PiperOrigin-RevId: 336202656 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f3e7910f5bf..5b3b919cb2e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0495b39f1e8a26e6b4c6597a603c122c06fbc10b60b7c09222d8013d2f3a6e86", - git_commit = "68a6fe0d984377b625b421d34f8c607d6ed73597", + sha256 = "00d3aa175c0b098e3567c6c33e411bdde39406432feddedb9f01b29c6c4b4ad3", + git_commit = "e01adec56da68c9335bb9a7736c82b0f66ddcc43", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1b533a49b15b5bdfae42329a8069981aceee82d1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 9 Oct 2020 00:01:30 -0700 Subject: [PATCH 4251/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e5750eb7-c6ba-492c-8e39-9164e4edad45 PiperOrigin-RevId: 336240961 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5b3b919cb2e..b9dbb72555e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "00d3aa175c0b098e3567c6c33e411bdde39406432feddedb9f01b29c6c4b4ad3", - git_commit = "e01adec56da68c9335bb9a7736c82b0f66ddcc43", + sha256 = "c0d7abec5cb69474f56f8c7ca90a09837b0b8b8675379feb897afe4f20d55183", + git_commit = "1a678bf42ca08651dc9932d51402bbe119f284ae", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 718152dc386f9fa7b21ed36d9d85518e987d7bf5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 9 Oct 2020 04:22:41 -0700 Subject: [PATCH 4252/8103] Add dedicated aliases field to ModelServerConfig. PiperOrigin-RevId: 336268746 --- tensorflow_serving/config/model_server_config.proto | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tensorflow_serving/config/model_server_config.proto b/tensorflow_serving/config/model_server_config.proto index 8d3d5543e9f..187f535a90b 100644 --- a/tensorflow_serving/config/model_server_config.proto +++ b/tensorflow_serving/config/model_server_config.proto @@ -20,6 +20,10 @@ message ModelConfig { // Name of the model. string name = 1; + // List of aliases which can be used for addressing this model instead of + // using the model name. This is an experimental field. + repeated string alias = 9; + // Base path to the model, excluding the version directory. // E.g> for a model at /foo/bar/my_model/123, where 123 is the version, the // base path is /foo/bar/my_model. From 1e356b348c11d2a1ce3b1c6eff1d9ad63b84e16a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 9 Oct 2020 06:01:40 -0700 Subject: [PATCH 4253/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/66c9f295-3818-4637-8555-2d2c4d594755 PiperOrigin-RevId: 336278841 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b9dbb72555e..1861048b803 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c0d7abec5cb69474f56f8c7ca90a09837b0b8b8675379feb897afe4f20d55183", - git_commit = "1a678bf42ca08651dc9932d51402bbe119f284ae", + sha256 = "ca17774f2a4e933a215b73e2a562b5bf19596a43f5cbff07514f04fea5ce1b92", + git_commit = "8dc7f8a7b764c680491dc6e907cb01d952700ab6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4b624628977a12b1757b9ddcd3312b3768de8231 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 9 Oct 2020 11:30:49 -0700 Subject: [PATCH 4254/8103] Remove deprecated flag fail_if_no_model_versions_found from tensorflow serving binary PiperOrigin-RevId: 336332148 --- tensorflow_serving/model_servers/server_core.cc | 2 -- tensorflow_serving/model_servers/server_core.h | 6 ------ 2 files changed, 8 deletions(-) diff --git a/tensorflow_serving/model_servers/server_core.cc b/tensorflow_serving/model_servers/server_core.cc index 69ba76cb196..393198d7902 100644 --- a/tensorflow_serving/model_servers/server_core.cc +++ b/tensorflow_serving/model_servers/server_core.cc @@ -567,8 +567,6 @@ FileSystemStoragePathSourceConfig ServerCore::CreateStoragePathSourceConfig( FileSystemStoragePathSourceConfig source_config; source_config.set_file_system_poll_wait_seconds( options_.file_system_poll_wait_seconds); - source_config.set_fail_if_zero_versions_at_startup( - options_.fail_if_no_model_versions_found); source_config.set_servable_versions_always_present( options_.servable_versions_always_present); for (const auto& model : config.model_config_list().config()) { diff --git a/tensorflow_serving/model_servers/server_core.h b/tensorflow_serving/model_servers/server_core.h index 6ddf50b1074..1e3ca765e29 100644 --- a/tensorflow_serving/model_servers/server_core.h +++ b/tensorflow_serving/model_servers/server_core.h @@ -154,12 +154,6 @@ class ServerCore : public Manager { // field. bool allow_version_labels = true; - // If set to true, the server will fail to start up (or fail a config - // reload) if, for any configured model, no versions of the model are found - // in the filesystem under the model's base path. - ABSL_DEPRECATED("Use servable_versions_always_present.") - bool fail_if_no_model_versions_found = false; - // If set to true, the server will fail to start up (or fail a config // reload) if, for any configured model, no versions of the model are found // in the filesystem under the model's base path. In addition, if the From 07de033218fab6817e0bd6c3d9ec7cb63f472654 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 9 Oct 2020 12:02:15 -0700 Subject: [PATCH 4255/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7cb8c20d-9bc2-4139-9820-abbcd3f7d7b0 PiperOrigin-RevId: 336338171 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1861048b803..cbfb47419ec 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ca17774f2a4e933a215b73e2a562b5bf19596a43f5cbff07514f04fea5ce1b92", - git_commit = "8dc7f8a7b764c680491dc6e907cb01d952700ab6", + sha256 = "57d869d02527059dbd14430d25b47abbda84fd5daec1b8bdfd537d5dd84c01ed", + git_commit = "edcd8eb2cdd3bbfaeead1d5c0537727a3cd701dc", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d9f44920caef697502f9c7dc345b62f451906d52 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 9 Oct 2020 18:01:27 -0700 Subject: [PATCH 4256/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f2bb989f-c6b4-46f4-a3d2-a95cd7ba4abf PiperOrigin-RevId: 336399044 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cbfb47419ec..a268e23b0e4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "57d869d02527059dbd14430d25b47abbda84fd5daec1b8bdfd537d5dd84c01ed", - git_commit = "edcd8eb2cdd3bbfaeead1d5c0537727a3cd701dc", + sha256 = "c5849ad4f3a43e3926cf2d08f80ac0ad5741ea91cec049254da9d174274a4b01", + git_commit = "603b945f8af5bcd7a09d125c6d83f52354361e55", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 63b4280847eeeaa20d68750214a1d11022000071 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 10 Oct 2020 00:01:57 -0700 Subject: [PATCH 4257/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7d932692-ec47-407c-80fa-3c2cf7491712 PiperOrigin-RevId: 336426522 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a268e23b0e4..41ccd058ca2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c5849ad4f3a43e3926cf2d08f80ac0ad5741ea91cec049254da9d174274a4b01", - git_commit = "603b945f8af5bcd7a09d125c6d83f52354361e55", + sha256 = "e4be1aeb574f0ed033f87e6b8f2fdc80a5b3642ce4c52c9958ccd89f838c43b5", + git_commit = "aebb9e60178100ddd62fa7c19dfcd14240ebe681", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d2ad0e39a5c8135d9bb1fcb38376dd5238417f03 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 10 Oct 2020 06:01:33 -0700 Subject: [PATCH 4258/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/87da60cc-b1fd-47b5-a965-3443f048eeb8 PiperOrigin-RevId: 336450102 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 41ccd058ca2..9839f12290d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e4be1aeb574f0ed033f87e6b8f2fdc80a5b3642ce4c52c9958ccd89f838c43b5", - git_commit = "aebb9e60178100ddd62fa7c19dfcd14240ebe681", + sha256 = "2d0bf37e2555d5bd9f74e51bcc346aa8cbe7b216be73b7c9ef9b8a1af3ff5209", + git_commit = "66731f587f293a6189c296a7b447bdccf2819731", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3090060c7ff17ee2706053691a692b9ffd14068f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 10 Oct 2020 18:01:32 -0700 Subject: [PATCH 4259/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2172d854-a22e-42fa-8a9a-5dfada2a52d1 PiperOrigin-RevId: 336492782 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9839f12290d..09e3ddd58d4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2d0bf37e2555d5bd9f74e51bcc346aa8cbe7b216be73b7c9ef9b8a1af3ff5209", - git_commit = "66731f587f293a6189c296a7b447bdccf2819731", + sha256 = "b7f4a0ebb379662b8491ded7edc275b0746cbea5325dfd167821c34e70054441", + git_commit = "01764967201319cce0d03dcd0acd7b8dea8bd447", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c51c1a4af3df947cfeacdf64d04a32547fffbff2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 11 Oct 2020 06:01:29 -0700 Subject: [PATCH 4260/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b2de3273-4fce-47ca-a33d-35db5134e348 PiperOrigin-RevId: 336534874 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 09e3ddd58d4..5401bab2ed8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b7f4a0ebb379662b8491ded7edc275b0746cbea5325dfd167821c34e70054441", - git_commit = "01764967201319cce0d03dcd0acd7b8dea8bd447", + sha256 = "cf9f965179b9c938a4f383aa3026a24d1a50632188ca4b4746b8acfe9d347873", + git_commit = "a1e5d73663152b0d7f0d9661e5d602b442acddba", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f50a464ebb516ec0d81b026898ccac85bc2dfbf5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 11 Oct 2020 12:01:40 -0700 Subject: [PATCH 4261/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0f3582db-1ecf-46e6-87d3-95412bb3a8be PiperOrigin-RevId: 336555473 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5401bab2ed8..d6c2c020ee0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cf9f965179b9c938a4f383aa3026a24d1a50632188ca4b4746b8acfe9d347873", - git_commit = "a1e5d73663152b0d7f0d9661e5d602b442acddba", + sha256 = "90b1b3a6660a3c9c5ad812d28414fd5a1e8af4d0cd8d35df53cd97a5f203f3d4", + git_commit = "4e3c130155daf7a3f0c1ae3a362a07705101151c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d5ef779f4ad328cd720e27a3475e9e79f0428467 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 11 Oct 2020 18:01:42 -0700 Subject: [PATCH 4262/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/be052a57-17a6-4ce5-bacf-e07782636991 PiperOrigin-RevId: 336577611 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d6c2c020ee0..48cc8641c94 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "90b1b3a6660a3c9c5ad812d28414fd5a1e8af4d0cd8d35df53cd97a5f203f3d4", - git_commit = "4e3c130155daf7a3f0c1ae3a362a07705101151c", + sha256 = "0088c8c3c72f510e968aee64af15c027ebeacb29adac7a42b42bd23980b743d9", + git_commit = "98400c0a6adb9713a7912847697cd77afdca0f0c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 46b08673a93f314639564d50f2af600b8eccf532 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 12 Oct 2020 00:02:08 -0700 Subject: [PATCH 4263/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f9abe2a5-009a-4434-86fe-361aae4cd222 PiperOrigin-RevId: 336605449 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 48cc8641c94..b28acf988c9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0088c8c3c72f510e968aee64af15c027ebeacb29adac7a42b42bd23980b743d9", - git_commit = "98400c0a6adb9713a7912847697cd77afdca0f0c", + sha256 = "5e3ea269ff158b29859b5569997d75c5010a3cc3453a19e4fd980b7440f58cfc", + git_commit = "0af213f96cd8bf661873ab631862e0a8b6b0f0fb", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8ea4895081b638f83569d821cd5a5e86c54613e0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 12 Oct 2020 06:01:32 -0700 Subject: [PATCH 4264/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/16a7effc-c9e3-4990-a1cd-ded1d5ad3ad7 PiperOrigin-RevId: 336648260 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b28acf988c9..a93f8fc44a0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5e3ea269ff158b29859b5569997d75c5010a3cc3453a19e4fd980b7440f58cfc", - git_commit = "0af213f96cd8bf661873ab631862e0a8b6b0f0fb", + sha256 = "e78cb137ecfa6f2e609418ffd949601117e97e38729423743e08ed4f7e61fb63", + git_commit = "9dfedbd7f0fc7f37dd8fac30bcc76c290ba4ebc7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0cb94cd79aacb965b3923d4a51b4091cf84d5e22 Mon Sep 17 00:00:00 2001 From: Jiho Choi Date: Mon, 12 Oct 2020 10:00:04 -0700 Subject: [PATCH 4265/8103] Fix TraceMe instrumentation for the padding size. PiperOrigin-RevId: 336685281 --- tensorflow_serving/batching/batching_session.cc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tensorflow_serving/batching/batching_session.cc b/tensorflow_serving/batching/batching_session.cc index 25e7ef83551..8d68c130e16 100644 --- a/tensorflow_serving/batching/batching_session.cc +++ b/tensorflow_serving/batching/batching_session.cc @@ -465,6 +465,12 @@ Status BatchingSession::MergeInputTensors( const int lowest_allowed_batch_size = RoundToLowestAllowedBatchSize(options_.allowed_batch_sizes, batch.size()); const int padding_size = lowest_allowed_batch_size - batch.size(); + profiler::TraceMe trace_me([lowest_allowed_batch_size, padding_size]() { + return profiler::TraceMeEncode( + "MergeInputTensors", + {{"batch_size_after_padding", lowest_allowed_batch_size}, + {"padding_amount", padding_size}}); + }); RecordPaddingSize(padding_size, lowest_allowed_batch_size); RecordProcessedBatchSize(lowest_allowed_batch_size); From f4e9df7423fba9f164830c0c2e7175a18eb4ddcc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 12 Oct 2020 12:01:38 -0700 Subject: [PATCH 4266/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4b1d8fe6-b699-4614-b197-9028bc29c6d2 PiperOrigin-RevId: 336713126 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a93f8fc44a0..e51177aeab7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e78cb137ecfa6f2e609418ffd949601117e97e38729423743e08ed4f7e61fb63", - git_commit = "9dfedbd7f0fc7f37dd8fac30bcc76c290ba4ebc7", + sha256 = "413f57da025be1a9b2a304c475f5d80fe4e3211c5a355b9a997c1ae57d231e31", + git_commit = "38718b4ed5feabbd4019fa24c828bdc1733289c9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f212387eeaf346402168cfb709009ae1b892fb82 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 12 Oct 2020 18:01:36 -0700 Subject: [PATCH 4267/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a80935b6-108a-4232-a6f5-3727ae192ac6 PiperOrigin-RevId: 336784004 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e51177aeab7..ac810f30389 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "413f57da025be1a9b2a304c475f5d80fe4e3211c5a355b9a997c1ae57d231e31", - git_commit = "38718b4ed5feabbd4019fa24c828bdc1733289c9", + sha256 = "5cb378daa798ce37e967758a35f37494532ed7b486fa45c23fd20a6e7e5c3a9a", + git_commit = "eaf34140950dbcec60e5884bd9fc335923846e3f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c76acd8ee5cda6267c5a7bf0821a0b9ecd1ebb14 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 13 Oct 2020 00:02:35 -0700 Subject: [PATCH 4268/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b6e79c21-8d37-4188-b34d-b0816f8bb072 PiperOrigin-RevId: 336820894 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ac810f30389..c0c8cdae356 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5cb378daa798ce37e967758a35f37494532ed7b486fa45c23fd20a6e7e5c3a9a", - git_commit = "eaf34140950dbcec60e5884bd9fc335923846e3f", + sha256 = "718cb6c0a16dadcd553cd8baa7b2dc9a243480bb02cebe4cfec8f306fce25cdc", + git_commit = "78ba66c122978cfb33f64634dfbecd7f9fa70e46", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From aa6c5f5b6175fb17064c0afbd999da9eccae6ea3 Mon Sep 17 00:00:00 2001 From: Mingming Liu Date: Thu, 15 Oct 2020 13:12:29 -0700 Subject: [PATCH 4269/8103] Temporarily disable failing test, until we root cause and fix it. PiperOrigin-RevId: 337367935 --- .../model_servers/tensorflow_model_server_test.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tensorflow_serving/model_servers/tensorflow_model_server_test.py b/tensorflow_serving/model_servers/tensorflow_model_server_test.py index a2fcbaeb5a2..96c1415ed2b 100644 --- a/tensorflow_serving/model_servers/tensorflow_model_server_test.py +++ b/tensorflow_serving/model_servers/tensorflow_model_server_test.py @@ -23,6 +23,7 @@ import os import subprocess import time +import unittest # This is a placeholder for a Google-internal import. @@ -32,6 +33,7 @@ from tensorflow.python.platform import flags from tensorflow.python.profiler import profiler_client + from tensorflow.python.saved_model import signature_constants from tensorflow_serving.apis import classification_pb2 from tensorflow_serving.apis import get_model_metadata_pb2 @@ -723,6 +725,7 @@ def test_distrat_sequential_keras_saved_model_save(self): expected_output=2.0, expected_version=expected_version) + @unittest.skip('b/170966383') def test_profiler_service_with_valid_trace_request(self): """Test integration with profiler service by sending tracing requests.""" From 25a50a7d17e782b3d45196b98799b5bec3fdd205 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 15 Oct 2020 18:01:33 -0700 Subject: [PATCH 4270/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e2a8ce13-974c-463d-a913-51f1551d1d6c PiperOrigin-RevId: 337420869 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c0c8cdae356..a6732484acf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "718cb6c0a16dadcd553cd8baa7b2dc9a243480bb02cebe4cfec8f306fce25cdc", - git_commit = "78ba66c122978cfb33f64634dfbecd7f9fa70e46", + sha256 = "bc35040a2d40cc2b6e849bdd08cfabb7cbbed19c127cfa52b8f4967a6ae86513", + git_commit = "30060737d73f17aa39277a217298972d910ee3e8", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a551fc3b7daf201fcf7156a8f48e650f0099e66f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 16 Oct 2020 00:02:16 -0700 Subject: [PATCH 4271/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e7d2eba8-a50b-477b-86fb-0bf5c521e3ff PiperOrigin-RevId: 337455937 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a6732484acf..f7eeda6d3da 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bc35040a2d40cc2b6e849bdd08cfabb7cbbed19c127cfa52b8f4967a6ae86513", - git_commit = "30060737d73f17aa39277a217298972d910ee3e8", + sha256 = "e7fed5021fab5854c70219dc92f4be9c43a8da09969f7582da6cef45fac70a98", + git_commit = "3ba72a8d69a27228e6243026e2e0768027f05561", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 86e922dfe8ba35d9d3d3ee2fb1a00266e97ea5a0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 16 Oct 2020 06:01:24 -0700 Subject: [PATCH 4272/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8baedb90-56b4-469b-b168-3cf39d82185c PiperOrigin-RevId: 337491533 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f7eeda6d3da..ee2bbcb87a6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e7fed5021fab5854c70219dc92f4be9c43a8da09969f7582da6cef45fac70a98", - git_commit = "3ba72a8d69a27228e6243026e2e0768027f05561", + sha256 = "451341b891a3d0f631a8dcec5a1db666d2d278e7da1d8bb4e7f60ce8985569a9", + git_commit = "dc843fad65fb4eb1b173a7577d0d932b2af94951", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 32d527e363e0bfcef7fabb99b6f34c022d85c068 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 16 Oct 2020 12:01:31 -0700 Subject: [PATCH 4273/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1cf6e643-7517-42d5-af13-a114275cebea PiperOrigin-RevId: 337551175 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ee2bbcb87a6..2f9a4cf22e8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "451341b891a3d0f631a8dcec5a1db666d2d278e7da1d8bb4e7f60ce8985569a9", - git_commit = "dc843fad65fb4eb1b173a7577d0d932b2af94951", + sha256 = "d634cd25d59874317c4f93616939403431b93a1f860df03eaabff7692e8c5085", + git_commit = "cae7bb034427fcc69454f56af07b684ae79c8bc6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c59501b21a2fc47f696cc02175c9259885cab47f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 16 Oct 2020 18:01:45 -0700 Subject: [PATCH 4274/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/13e9de18-6c98-436a-bc35-fab8ba61e5e3 PiperOrigin-RevId: 337610198 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2f9a4cf22e8..d7740903b31 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d634cd25d59874317c4f93616939403431b93a1f860df03eaabff7692e8c5085", - git_commit = "cae7bb034427fcc69454f56af07b684ae79c8bc6", + sha256 = "1a12545296c3de9f1bdab81552df6ac608e51c569a00df2d3d9a7eb15ffacbb1", + git_commit = "79cbda6352d62030e54851c8eb87e66b76c56d4e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3c2207765a8df4cd3b59371a3d1dd4dcd1245241 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 17 Oct 2020 00:01:22 -0700 Subject: [PATCH 4275/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/170539ce-ee95-4155-861c-370ea63af104 PiperOrigin-RevId: 337636467 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d7740903b31..7169d8aabff 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1a12545296c3de9f1bdab81552df6ac608e51c569a00df2d3d9a7eb15ffacbb1", - git_commit = "79cbda6352d62030e54851c8eb87e66b76c56d4e", + sha256 = "9bb4afc20d472fb5e2aeebaadb6552d71549559603f752980ef486d0ee4cb216", + git_commit = "bfd573cc1712c231cb334e092ceab8e096c9ce0f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 77655ea2640429568b7021356bcc6c34ff60fb60 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 17 Oct 2020 06:02:11 -0700 Subject: [PATCH 4276/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/29d7a985-8c24-4677-a9c2-eb1fae507a7b PiperOrigin-RevId: 337657411 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7169d8aabff..1f17ace4908 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9bb4afc20d472fb5e2aeebaadb6552d71549559603f752980ef486d0ee4cb216", - git_commit = "bfd573cc1712c231cb334e092ceab8e096c9ce0f", + sha256 = "1df254a557be21da4def57adc7820be74a64ca02ec157907b4c208adbc0db220", + git_commit = "01e1696cfca77dfe2438f55a43bf342c0c913510", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a0b03833fd426d150953d496b8918769b4970d04 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 17 Oct 2020 18:01:27 -0700 Subject: [PATCH 4277/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/283f7786-25f7-4cad-b6f4-f9fd784ee811 PiperOrigin-RevId: 337694748 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1f17ace4908..8306b579e54 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1df254a557be21da4def57adc7820be74a64ca02ec157907b4c208adbc0db220", - git_commit = "01e1696cfca77dfe2438f55a43bf342c0c913510", + sha256 = "98cd0d80d5e487f539268d42b1cfb04a42f360bd8d634873e5471c49cbb30b75", + git_commit = "0f9acc15ba56ecf01a79889d29295310559c681a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 08740d08fb81baa86e53181102e4e518b3d9356e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 18 Oct 2020 00:01:33 -0700 Subject: [PATCH 4278/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4c6f0cda-53aa-4010-a653-2e9a5c05145e PiperOrigin-RevId: 337713680 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8306b579e54..4c90d9a562c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "98cd0d80d5e487f539268d42b1cfb04a42f360bd8d634873e5471c49cbb30b75", - git_commit = "0f9acc15ba56ecf01a79889d29295310559c681a", + sha256 = "06b56363b9754e425037176d2643e0a3266678907ec62cb206b6321dc79d55c9", + git_commit = "a038cf2695852a649474af55a3ed49f6a72e3965", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9e910a8d53acffe1c88e505b0c102a1518771bab Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 18 Oct 2020 06:02:20 -0700 Subject: [PATCH 4279/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/08578947-f1dc-40e0-8db8-53b238ef6da2 PiperOrigin-RevId: 337734130 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4c90d9a562c..706eb76ab30 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "06b56363b9754e425037176d2643e0a3266678907ec62cb206b6321dc79d55c9", - git_commit = "a038cf2695852a649474af55a3ed49f6a72e3965", + sha256 = "d47c3bd83035c26051e75df22079f76ff74d81a32f6780212169cf0d010128e5", + git_commit = "813ef350aa2858a8764d318ef521d97dd62c5859", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ac10e74078123189dc1c8a3cd29d530b7c972782 Mon Sep 17 00:00:00 2001 From: Mingming Liu Date: Sun, 18 Oct 2020 16:29:14 -0700 Subject: [PATCH 4280/8103] Add vlog to dump updated model label map (for debugging) each time the map is updated. PiperOrigin-RevId: 337769119 --- tensorflow_serving/model_servers/server_core.cc | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tensorflow_serving/model_servers/server_core.cc b/tensorflow_serving/model_servers/server_core.cc index 393198d7902..dc69200bac6 100644 --- a/tensorflow_serving/model_servers/server_core.cc +++ b/tensorflow_serving/model_servers/server_core.cc @@ -537,6 +537,18 @@ Status ServerCore::UpdateModelVersionLabelMap() { return Status::OK(); } + if (VLOG_IS_ON(4)) { + VLOG(4) << "Updated model label map is: "; + for (const auto& model_name_and_version_labels : *new_label_map) { + for (const auto& label_and_version : + model_name_and_version_labels.second) { + VLOG(4) << "\t Model name: " << model_name_and_version_labels.first + << "\t label: " << label_and_version.first + << " at version: " << label_and_version.second; + } + } + } + mutex_lock l(model_labels_to_versions_mu_); model_labels_to_versions_.swap(new_label_map); From 941a611b9c7f283966336f6b86e7924b9b9e31ef Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 18 Oct 2020 18:01:51 -0700 Subject: [PATCH 4281/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/40bb30b4-342f-46d5-8309-a9189ee0c711 PiperOrigin-RevId: 337774356 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 706eb76ab30..828c4cfd72d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d47c3bd83035c26051e75df22079f76ff74d81a32f6780212169cf0d010128e5", - git_commit = "813ef350aa2858a8764d318ef521d97dd62c5859", + sha256 = "b39a767815ac19505b0d2375c688b3b4c57e76b8a48179abe22e3bb1e6f7271e", + git_commit = "b78986adbb7a1806d3cc35e8aa060398fab18c76", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e130ae3ef862ef0bc3c2d49f33601127b440193a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 19 Oct 2020 00:02:01 -0700 Subject: [PATCH 4282/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/10053ba6-091e-46df-b83e-e9359045e0e6 PiperOrigin-RevId: 337800054 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 828c4cfd72d..edacf9f48d3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b39a767815ac19505b0d2375c688b3b4c57e76b8a48179abe22e3bb1e6f7271e", - git_commit = "b78986adbb7a1806d3cc35e8aa060398fab18c76", + sha256 = "0df24385cf0d165fc154f3fd26e939f6ff370e93a976582303d252ce753ca51d", + git_commit = "a0adbf94b0d86f019aa8b9a0ddd18ffe442c6d18", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ad2fbb92d277e8d8e30fc6055152f73b4c086185 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 19 Oct 2020 06:01:41 -0700 Subject: [PATCH 4283/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fbcd7eae-b498-4ef4-b2d9-d9f6b4e36a46 PiperOrigin-RevId: 337839455 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index edacf9f48d3..67779dca40a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0df24385cf0d165fc154f3fd26e939f6ff370e93a976582303d252ce753ca51d", - git_commit = "a0adbf94b0d86f019aa8b9a0ddd18ffe442c6d18", + sha256 = "bf85feaf31981067f6bb7fb01e8a31d05bfe576728d9fb586d388b113dfe35d3", + git_commit = "2ff96dca2843f7dc1518e2a33a3958904cae4170", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 005f0f6ad762ef11ede9d04d9a256f7967a4c31f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 19 Oct 2020 09:26:58 -0700 Subject: [PATCH 4284/8103] Remove deprecated flag fail_if_no_model_versions_found from tensorflow serving binary PiperOrigin-RevId: 337871259 --- tensorflow_serving/model_servers/server_core.cc | 2 ++ tensorflow_serving/model_servers/server_core.h | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/tensorflow_serving/model_servers/server_core.cc b/tensorflow_serving/model_servers/server_core.cc index dc69200bac6..bf87fcb8a4b 100644 --- a/tensorflow_serving/model_servers/server_core.cc +++ b/tensorflow_serving/model_servers/server_core.cc @@ -579,6 +579,8 @@ FileSystemStoragePathSourceConfig ServerCore::CreateStoragePathSourceConfig( FileSystemStoragePathSourceConfig source_config; source_config.set_file_system_poll_wait_seconds( options_.file_system_poll_wait_seconds); + source_config.set_fail_if_zero_versions_at_startup( + options_.fail_if_no_model_versions_found); source_config.set_servable_versions_always_present( options_.servable_versions_always_present); for (const auto& model : config.model_config_list().config()) { diff --git a/tensorflow_serving/model_servers/server_core.h b/tensorflow_serving/model_servers/server_core.h index 1e3ca765e29..6ddf50b1074 100644 --- a/tensorflow_serving/model_servers/server_core.h +++ b/tensorflow_serving/model_servers/server_core.h @@ -154,6 +154,12 @@ class ServerCore : public Manager { // field. bool allow_version_labels = true; + // If set to true, the server will fail to start up (or fail a config + // reload) if, for any configured model, no versions of the model are found + // in the filesystem under the model's base path. + ABSL_DEPRECATED("Use servable_versions_always_present.") + bool fail_if_no_model_versions_found = false; + // If set to true, the server will fail to start up (or fail a config // reload) if, for any configured model, no versions of the model are found // in the filesystem under the model's base path. In addition, if the From e6a300513839b5b4bbd76993a2ca81a8cbb1c1ff Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 19 Oct 2020 12:01:24 -0700 Subject: [PATCH 4285/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3f6a8ff4-2b7b-4dc3-aaf0-24f817f3b0f1 PiperOrigin-RevId: 337904166 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 67779dca40a..e00c3252dc1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bf85feaf31981067f6bb7fb01e8a31d05bfe576728d9fb586d388b113dfe35d3", - git_commit = "2ff96dca2843f7dc1518e2a33a3958904cae4170", + sha256 = "02824b4ca556744fdf90c975aa09018b91ba5e5e253e0f510bf4ba4325dc83ab", + git_commit = "1dd24b74c291218f097f0e2a086a0fbd847bbea2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6809ca2ca98fa32a3828a431719aa4a4e40efac5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 19 Oct 2020 18:02:23 -0700 Subject: [PATCH 4286/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e67ddabd-d419-4d15-9cf5-2846fcf62ebc PiperOrigin-RevId: 337972876 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e00c3252dc1..61165d403c9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "02824b4ca556744fdf90c975aa09018b91ba5e5e253e0f510bf4ba4325dc83ab", - git_commit = "1dd24b74c291218f097f0e2a086a0fbd847bbea2", + sha256 = "a8d22d7ed586231c48e789bd75aedb972c3add8f5f809cddc7ddd0575398e826", + git_commit = "d119ff9af89a69c991d26f7afbe1c7ee511aeb8e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ae1a8cdfabbd5426c5156e1d3b112df5e6ce9175 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 20 Oct 2020 00:01:47 -0700 Subject: [PATCH 4287/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2364210f-322b-4e5f-a595-53fa75114d1e PiperOrigin-RevId: 338008014 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 61165d403c9..8262fa54769 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a8d22d7ed586231c48e789bd75aedb972c3add8f5f809cddc7ddd0575398e826", - git_commit = "d119ff9af89a69c991d26f7afbe1c7ee511aeb8e", + sha256 = "57d2a544750de76af46a54f1d75fec7f0195b73e89e50cdacf05374398681019", + git_commit = "8b5f4ac405ad9db82610a79471d139366c850388", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2472e17d9ea0b99f828c0bc766b3a1a837c7b26a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 20 Oct 2020 06:01:37 -0700 Subject: [PATCH 4288/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4dd5075f-581d-4869-8925-44a14aacac2b PiperOrigin-RevId: 338045857 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8262fa54769..eaa51a05758 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "57d2a544750de76af46a54f1d75fec7f0195b73e89e50cdacf05374398681019", - git_commit = "8b5f4ac405ad9db82610a79471d139366c850388", + sha256 = "9cc1a372476f539908ce6cbced9655976154c64586cc88a740a31a88e97548a1", + git_commit = "9e9d2f51dafdddbd9028b17196a0956f334d4779", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d0daa1064ecdd56ecb5c0a8aca37c3e198cb313d Mon Sep 17 00:00:00 2001 From: Guanxin Qiao Date: Tue, 20 Oct 2020 08:03:53 -0700 Subject: [PATCH 4289/8103] Add python wrapper for remote predict op and clean the build and include files. PiperOrigin-RevId: 338060487 --- .../tensorflow/ops/remote_predict/BUILD | 11 +++ .../kernels/remote_predict_op_kernel.h | 16 +++- .../remote_predict/ops/remote_predict_op.cc | 1 + .../python/ops/remote_predict_ops.py | 88 ++++++++++++++++++- 4 files changed, 110 insertions(+), 6 deletions(-) diff --git a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/BUILD b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/BUILD index cee2e9aac27..f821eaad8db 100644 --- a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/BUILD +++ b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/BUILD @@ -16,12 +16,15 @@ cc_library( "kernels/remote_predict_op_kernel.h", ], deps = [ + "//tensorflow_serving/apis:model_cc_proto", + "//tensorflow_serving/apis:predict_cc_proto", "//tensorflow_serving/apis:prediction_service_cc_proto", "@com_github_grpc_grpc//:grpc++", "@com_google_absl//absl/status", "@com_google_absl//absl/time", "@com_google_protobuf//:protobuf_lite", "@org_tensorflow//tensorflow/core:framework_headers_lib", + "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core/kernels:ops_util_hdrs", ], alwayslink = 1, @@ -80,13 +83,17 @@ tf_kernel_library( ], deps = [ ":remote_predict_op_op_lib", + "//tensorflow_serving/apis:model_cc_proto", + "//tensorflow_serving/apis:predict_cc_proto", "//tensorflow_serving/apis:prediction_service_cc_proto", "@com_github_grpc_grpc//:grpc++", "@com_google_absl//absl/status", "@com_google_absl//absl/time", + "@com_google_protobuf//:cc_wkt_protos", "@com_google_protobuf//:protobuf_lite", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", + "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core/kernels:ops_util", "@org_tensorflow//tensorflow/core/kernels:split_lib", ], @@ -126,10 +133,13 @@ cc_test( ], deps = [ ":remote_predict_ops_cc", + "//tensorflow_serving/apis:model_cc_proto", + "//tensorflow_serving/apis:predict_cc_proto", "//tensorflow_serving/apis:prediction_service_cc_proto", "//tensorflow_serving/core/test_util:test_main", "@com_google_absl//absl/status", "@com_google_absl//absl/time", + "@com_google_protobuf//:cc_wkt_protos", "@com_google_protobuf//:protobuf_lite", "@org_tensorflow//tensorflow/cc:client_session", "@org_tensorflow//tensorflow/cc:const_op", @@ -137,6 +147,7 @@ cc_test( "@org_tensorflow//tensorflow/core:direct_session", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", + "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", "@org_tensorflow//tensorflow/core:testlib", "@org_tensorflow//tensorflow/core/kernels:ops_util", diff --git a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/remote_predict_op_kernel.h b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/remote_predict_op_kernel.h index c3a9602e207..eadddaa548a 100644 --- a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/remote_predict_op_kernel.h +++ b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/remote_predict_op_kernel.h @@ -15,6 +15,7 @@ limitations under the License. #ifndef TENSORFLOW_SERVING_EXPERIMENTAL_TENSORFLOW_OPS_REMOTE_PREDICT_KERNELS_REMOTE_PREDICT_OP_KERNEL_H_ #define TENSORFLOW_SERVING_EXPERIMENTAL_TENSORFLOW_OPS_REMOTE_PREDICT_KERNELS_REMOTE_PREDICT_OP_KERNEL_H_ +#include "google/protobuf/wrappers.pb.h" #include "google/protobuf/map.h" #include "absl/status/status.h" #include "absl/time/time.h" @@ -23,10 +24,14 @@ limitations under the License. #include "tensorflow/core/framework/register_types.h" #include "tensorflow/core/framework/resource_mgr.h" #include "tensorflow/core/framework/shape_inference.h" +#include "tensorflow/core/framework/tensor.h" +#include "tensorflow/core/framework/tensor.pb.h" #include "tensorflow/core/kernels/ops_util.h" #include "tensorflow/core/lib/core/threadpool.h" #include "tensorflow/core/lib/gtl/cleanup.h" -#include "tensorflow_serving/apis/prediction_service.grpc.pb.h" +#include "tensorflow/core/protobuf/named_tensor.pb.h" +#include "tensorflow_serving/apis/model.pb.h" +#include "tensorflow_serving/apis/predict.pb.h" namespace tensorflow { namespace serving { @@ -134,9 +139,12 @@ class RemotePredictOp : public AsyncOpKernel { // Process the response. if (!rpc_status.ok()) { if (fail_op_on_rpc_error) { - OP_REQUIRES_ASYNC(context, rpc_status.ok(), - tensorflow::errors::Aborted(rpc_status.message()), - rpc_cleaner.release()); + OP_REQUIRES_OK_ASYNC( + context, + tensorflow::Status( + static_cast(rpc_status.code()), + rpc_status.message()), + rpc_cleaner.release()); } else { // Allocate some empty output for the output_tensors. for (int i = 0; i < output_tensors_list.size(); ++i) { diff --git a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/ops/remote_predict_op.cc b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/ops/remote_predict_op.cc index 2b6d30b563c..a02c33685f8 100644 --- a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/ops/remote_predict_op.cc +++ b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/ops/remote_predict_op.cc @@ -74,6 +74,7 @@ REGISTER_OP("TfServingRemotePredict") return Status::OK(); }) + .SetIsStateful() .Doc(R"doc( Invokes Predict on a remote graph. fail_op_on_rpc_error: If set true, the Op fails if the rpc fails, and returns diff --git a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/python/ops/remote_predict_ops.py b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/python/ops/remote_predict_ops.py index 2b009adfbf0..c5fd560ced8 100644 --- a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/python/ops/remote_predict_ops.py +++ b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/python/ops/remote_predict_ops.py @@ -31,5 +31,89 @@ os.path.join(tf.compat.v1.resource_loader.get_data_files_path(), '_remote_predict_op.so')) -# Alias -run = gen_remote_predict_op.tf_serving_remote_predict + +# Aliases +def run(input_tensor_alias, + input_tensors, + output_tensor_alias, + target_address, + model_name, + model_version=-1, + max_rpc_deadline_millis=3000, + output_types=None, + name=None): + """Runs a predict in remote process through rpc. + + Args: + input_tensor_alias: input tensor alias for Predict + input_tensors: input tensors for Predict + output_tensor_alias: output tensor alias for Predict + target_address: target_address where the rpc is sent to + model_name: model_name that the Predict is running on + model_version: the model version for the Predict call. If unset, the highest + version available for serving will be targeted. + max_rpc_deadline_millis: rpc deadline in millis + output_types: output types for Predict + name: name for the op in the graph + + Returns: + output_tensors as a result of the Predict. + + Raises ValueError if model_name value is missing. + """ + if model_name is None: + raise ValueError('model_name must be specified.') + return (gen_remote_predict_op.tf_serving_remote_predict( + input_tensor_alias, + input_tensors, + output_tensor_alias, + target_address=target_address, + model_name=model_name, + model_version=model_version, + fail_op_on_rpc_error=True, + max_rpc_deadline_millis=max_rpc_deadline_millis, + output_types=output_types, + name=name))[2] + + +def run_returning_status(input_tensor_alias, + input_tensors, + output_tensor_alias, + target_address, + model_name, + model_version=-1, + max_rpc_deadline_millis=3000, + output_types=None, + name=None): + """Runs a predict in remote process through rpc. + + Args: + input_tensor_alias: input tensor alias for Predict + input_tensors: input tensors for Predict + output_tensor_alias: output tensor alias for Predict + target_address: target_address where the rpc is sent to + model_name: model_name that the Predict is running on + model_version: the model version for the Predict call. If unset, the highest + version available for serving will be targeted. + max_rpc_deadline_millis: rpc deadline in millis + output_types: output types for Predict + name: name for the op in the graph. + + Returns: + status_code, status_error_message and output_tensors. + + Raises ValueError if model_name value is missing. + """ + if model_name is None: + raise ValueError('model_name must be specified.') + return (gen_remote_predict_op.tf_serving_remote_predict( + input_tensor_alias, + input_tensors, + output_tensor_alias, + target_address=target_address, + model_name=model_name, + model_version=model_version, + fail_op_on_rpc_error=False, + max_rpc_deadline_millis=max_rpc_deadline_millis, + output_types=output_types, + name=name)) From f61fb12f062a3747c5362e2079db1331d432daa1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 20 Oct 2020 12:01:39 -0700 Subject: [PATCH 4290/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/154a3036-4bbb-4aec-bdbd-fa59f4f2605e PiperOrigin-RevId: 338105973 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index eaa51a05758..2018466ece1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9cc1a372476f539908ce6cbced9655976154c64586cc88a740a31a88e97548a1", - git_commit = "9e9d2f51dafdddbd9028b17196a0956f334d4779", + sha256 = "2ff26df2b4e79a1e67ae5b8137af8192c03f3b8d4934bf9e0bb7945f213601c0", + git_commit = "24ee71b4032adf4fda507f69016426b66c3425d7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 304a05a10635afe96c2a4fe379f110afa41d81fb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 20 Oct 2020 18:01:59 -0700 Subject: [PATCH 4291/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3ffe8339-d882-4cd8-bd7c-ef83669e5d5d PiperOrigin-RevId: 338174272 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2018466ece1..f5e07c7bbda 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2ff26df2b4e79a1e67ae5b8137af8192c03f3b8d4934bf9e0bb7945f213601c0", - git_commit = "24ee71b4032adf4fda507f69016426b66c3425d7", + sha256 = "2ae841838a73a954a5d4d93f68b2c7eaed95255fb43db1f380897f58d2661f32", + git_commit = "db14325178ef9aebcb5632b0f9ba1d860ccd7a5f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a134d752f525b9cd7bfa0bb3c2647908a148fbc8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 21 Oct 2020 00:01:29 -0700 Subject: [PATCH 4292/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/190996a2-4f11-4b56-bff4-08f138bc946f PiperOrigin-RevId: 338210525 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f5e07c7bbda..7150cf5443a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2ae841838a73a954a5d4d93f68b2c7eaed95255fb43db1f380897f58d2661f32", - git_commit = "db14325178ef9aebcb5632b0f9ba1d860ccd7a5f", + sha256 = "f5008aa50bb464687c983b2d05f7989b173f24461a316d14b34a39d0f05290b3", + git_commit = "aaa6c70293202fa23cd03660e1d18a00a82a0b0f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c9262562e7b4142bb43ec0818b482c31ab49da02 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 21 Oct 2020 06:01:29 -0700 Subject: [PATCH 4293/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/62ecb7eb-abd3-4e87-8a6a-e794bde0fe64 PiperOrigin-RevId: 338248192 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7150cf5443a..b49f16287c1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f5008aa50bb464687c983b2d05f7989b173f24461a316d14b34a39d0f05290b3", - git_commit = "aaa6c70293202fa23cd03660e1d18a00a82a0b0f", + sha256 = "aa7fb899e8accd09a8a7c213a89f917d69eac9bc51971354ad5cc7a445e6010f", + git_commit = "87c1cf490f5ffa5504061b539ed61e7106f70293", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5eb828e600580ce568120fbd43a1b1f70cdf1a68 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 21 Oct 2020 12:01:26 -0700 Subject: [PATCH 4294/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1a9043fd-6249-491d-8267-d1b49e2e8c3b PiperOrigin-RevId: 338311106 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b49f16287c1..a01a6914464 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "aa7fb899e8accd09a8a7c213a89f917d69eac9bc51971354ad5cc7a445e6010f", - git_commit = "87c1cf490f5ffa5504061b539ed61e7106f70293", + sha256 = "7445687e19509f181c9db0863b5ecba50bf631fceb381626869c72207ea119d7", + git_commit = "d10c8b7495fcff75db9070faa763ab36b001ea48", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b017254164b753bd272f9c7c50a8267050c195d5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 21 Oct 2020 18:01:51 -0700 Subject: [PATCH 4295/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/860de1bd-d71a-4313-94fc-d4b1716b3b08 PiperOrigin-RevId: 338377991 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a01a6914464..f2d7175c7d4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7445687e19509f181c9db0863b5ecba50bf631fceb381626869c72207ea119d7", - git_commit = "d10c8b7495fcff75db9070faa763ab36b001ea48", + sha256 = "ec61947ccd52985635854866f2ce2b0dd29708112357dbf9d821f3a861f13dff", + git_commit = "12d00c3e349d0736b7f42b4e9a5b1b908f9aec15", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2d72227139654f0b060044a3472e98a8d61de8ff Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 22 Oct 2020 00:01:40 -0700 Subject: [PATCH 4296/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/21d2105d-eea0-4bf9-b9f2-5bc74dc757c2 PiperOrigin-RevId: 338416060 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f2d7175c7d4..aa8e3236121 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ec61947ccd52985635854866f2ce2b0dd29708112357dbf9d821f3a861f13dff", - git_commit = "12d00c3e349d0736b7f42b4e9a5b1b908f9aec15", + sha256 = "9a8dbc66b65ae7b0716157b4bc85cddf04d04869aa9bfa5ebf022209a4218a87", + git_commit = "e18ddad5fa889813a95a3304125cd9dc7ba8d0b7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 82100c1d56ea6e8bbf2cbcf1b007e796293a7748 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 22 Oct 2020 06:01:41 -0700 Subject: [PATCH 4297/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/891b5aeb-1555-4958-8faf-7eeadacbd939 PiperOrigin-RevId: 338456724 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index aa8e3236121..22faa1b0290 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9a8dbc66b65ae7b0716157b4bc85cddf04d04869aa9bfa5ebf022209a4218a87", - git_commit = "e18ddad5fa889813a95a3304125cd9dc7ba8d0b7", + sha256 = "8b2db5b1f2c2a431a6e907efd1beadfdea06368df4b5d10cf447ef54ce957930", + git_commit = "9a224653075bc0ba3be915e7996b62aaf84373cd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5c3a2f57371f04ed1fb8a953579433312d9c48d2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 22 Oct 2020 12:01:34 -0700 Subject: [PATCH 4298/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a559ae3d-8e6f-4d09-9394-57fa7929e5bc PiperOrigin-RevId: 338520449 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 22faa1b0290..8571053acfe 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8b2db5b1f2c2a431a6e907efd1beadfdea06368df4b5d10cf447ef54ce957930", - git_commit = "9a224653075bc0ba3be915e7996b62aaf84373cd", + sha256 = "efdfafff0bc0c82d6fe3e9e0aeefc8a6f43f0c773ca5326f5563fb19c987930c", + git_commit = "2da9da61dbae49f0ba3c35a214993a33a361d0a4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8d8d7f793113ca9bbc83eb5295d951e42965aa0b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 22 Oct 2020 18:01:35 -0700 Subject: [PATCH 4299/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/34e19309-4129-4645-a916-295a5450b4e2 PiperOrigin-RevId: 338586331 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8571053acfe..67f32c871ad 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "efdfafff0bc0c82d6fe3e9e0aeefc8a6f43f0c773ca5326f5563fb19c987930c", - git_commit = "2da9da61dbae49f0ba3c35a214993a33a361d0a4", + sha256 = "ce37c7d3d2044040040bd5fc30542e58d264f1e0b46d3a662efa55a9cc16bfb0", + git_commit = "c17952e2c500497fc945f0ce95130241a06e4471", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 373c6ceb1d85579c5fbe015600f6a7d74eacbeff Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 23 Oct 2020 00:01:51 -0700 Subject: [PATCH 4300/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1f509afd-8196-4876-a592-3f86114a1803 PiperOrigin-RevId: 338622718 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 67f32c871ad..918176a65e9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ce37c7d3d2044040040bd5fc30542e58d264f1e0b46d3a662efa55a9cc16bfb0", - git_commit = "c17952e2c500497fc945f0ce95130241a06e4471", + sha256 = "5653fe91a9d1466d16f851a48254f60a67f6d53c97c0b035fb702638b1d7ad9f", + git_commit = "7de03982fb401a3ab67a038c3a0a46b24bc67fbf", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4fa3434862546825a16b52f0f08c60fa686320c3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 23 Oct 2020 06:01:40 -0700 Subject: [PATCH 4301/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5626240d-896d-432b-835f-7b960b1ae29d PiperOrigin-RevId: 338658716 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 918176a65e9..cd6cef2a0f0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5653fe91a9d1466d16f851a48254f60a67f6d53c97c0b035fb702638b1d7ad9f", - git_commit = "7de03982fb401a3ab67a038c3a0a46b24bc67fbf", + sha256 = "eac795484c76db5ef68baef5c00e3203674a04266c4a72f954c6b7546932c9ec", + git_commit = "5bbb8a2bd1def6865b1510175a3da5fd12387e10", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b3961bc022309c9c8f9263926acf21b59710508e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 23 Oct 2020 12:01:26 -0700 Subject: [PATCH 4302/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9b8b7dc7-e312-4743-991e-7d2327b34413 PiperOrigin-RevId: 338718209 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cd6cef2a0f0..08770c661a7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eac795484c76db5ef68baef5c00e3203674a04266c4a72f954c6b7546932c9ec", - git_commit = "5bbb8a2bd1def6865b1510175a3da5fd12387e10", + sha256 = "799cc20fff1ed071a04e3991eee91a26585787650f3530500c28d5b0bbd58f01", + git_commit = "5479744e3f2439d47b1125bb7b6835867f744229", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c997a26bc8a61d4ab2db88694973f1c89f4fd344 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 23 Oct 2020 18:01:39 -0700 Subject: [PATCH 4303/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fabd2878-0302-49c6-afc2-76be46419105 PiperOrigin-RevId: 338777644 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 08770c661a7..4787fcb289c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "799cc20fff1ed071a04e3991eee91a26585787650f3530500c28d5b0bbd58f01", - git_commit = "5479744e3f2439d47b1125bb7b6835867f744229", + sha256 = "c1c56957e5d285e6a246cbd2ff8089bb134d1506b4c261eb0b9b9f458e47355f", + git_commit = "893afc20679bd3f80cc101f6e6dc2f2d70092261", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e34bd54af699de02b0b8043371993b53b5ca3976 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 24 Oct 2020 00:01:43 -0700 Subject: [PATCH 4304/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/735317eb-efd1-435e-8d5b-22c00170b654 PiperOrigin-RevId: 338804043 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4787fcb289c..7e130c16c0a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c1c56957e5d285e6a246cbd2ff8089bb134d1506b4c261eb0b9b9f458e47355f", - git_commit = "893afc20679bd3f80cc101f6e6dc2f2d70092261", + sha256 = "0828ab2caaeea5dd4a50273ba2c9b982d561f2ebe41e879bd144573da677c622", + git_commit = "c2081e9c26a713d86e5f6b68f9fa101d44e43d91", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 69641a8f40cad6815afb5244fa8e16ce4d95115e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 24 Oct 2020 06:01:27 -0700 Subject: [PATCH 4305/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/67c12889-1740-4050-bdd1-ccc38e40a545 PiperOrigin-RevId: 338825877 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7e130c16c0a..5d3554a9be3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0828ab2caaeea5dd4a50273ba2c9b982d561f2ebe41e879bd144573da677c622", - git_commit = "c2081e9c26a713d86e5f6b68f9fa101d44e43d91", + sha256 = "ac7cb505278b973c80f82576a704e192ee9daa6773c1e46e3401bf4f73bcc085", + git_commit = "9bf094291f08cadf92a4603f5b2ffa7ad495fac9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3773ac296dc8ab174cdbbeae52072ea2c86e4ed3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 24 Oct 2020 12:01:18 -0700 Subject: [PATCH 4306/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/369e434b-76b9-4192-916a-2b9d1c76d24e PiperOrigin-RevId: 338847350 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5d3554a9be3..c77a28c00ed 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ac7cb505278b973c80f82576a704e192ee9daa6773c1e46e3401bf4f73bcc085", - git_commit = "9bf094291f08cadf92a4603f5b2ffa7ad495fac9", + sha256 = "5d6588768b93218091a45c3c4e05f0ede57537a05fe4a2246d2620f36e570a7c", + git_commit = "7e71a2732f09c56d33ed3e03a7f0f66cc19c050d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 20040a86ff6a189da1bd31a4a50b811fc6cf8d67 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 24 Oct 2020 18:01:26 -0700 Subject: [PATCH 4307/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/af43417d-683f-42c4-b66e-35a315912eda PiperOrigin-RevId: 338869228 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c77a28c00ed..316b528a5f6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5d6588768b93218091a45c3c4e05f0ede57537a05fe4a2246d2620f36e570a7c", - git_commit = "7e71a2732f09c56d33ed3e03a7f0f66cc19c050d", + sha256 = "be4f18c576057e442a847b622cae5dd98ee84775950fcf1f783846302024843a", + git_commit = "6b3e587edb6cd3a7bf400f99e68fb2ba835acb4e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 263306d388e7c85a1d89882db52ff4f57f502f66 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 25 Oct 2020 06:01:29 -0700 Subject: [PATCH 4308/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ece09a7d-db34-44cb-ba1a-c1c3e68b2dcd PiperOrigin-RevId: 338912984 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 316b528a5f6..44d641daf12 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "be4f18c576057e442a847b622cae5dd98ee84775950fcf1f783846302024843a", - git_commit = "6b3e587edb6cd3a7bf400f99e68fb2ba835acb4e", + sha256 = "2bc6996c88d125e99d36febbec757eb9951562582b288f97c1ec94a38e87fa1c", + git_commit = "7929dbda3d6b09faff14c89a1913a426460c0d62", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e13e6ab3052f28fb4a2c3684e603508be458cea3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 25 Oct 2020 18:01:51 -0700 Subject: [PATCH 4309/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/84473b9a-1dd2-474a-bb08-17eed784f549 PiperOrigin-RevId: 338957391 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 44d641daf12..dfc5fde7f68 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2bc6996c88d125e99d36febbec757eb9951562582b288f97c1ec94a38e87fa1c", - git_commit = "7929dbda3d6b09faff14c89a1913a426460c0d62", + sha256 = "09871bdc33e9800cd8ea885f61484561716eeec6f7ab9edbee935bd705d7a24f", + git_commit = "4625f1d87f17537a8d50dc68a213d2da875c12ce", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1136c2953d08ffbb26dc27e3a1b19f4fc30bd79c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 26 Oct 2020 06:02:15 -0700 Subject: [PATCH 4310/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7c2777e3-fc60-4cde-afec-10478442df01 PiperOrigin-RevId: 339022448 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dfc5fde7f68..f64406ea6e7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "09871bdc33e9800cd8ea885f61484561716eeec6f7ab9edbee935bd705d7a24f", - git_commit = "4625f1d87f17537a8d50dc68a213d2da875c12ce", + sha256 = "e02070e1ddc5dbc05d6d0a6be7799d619851a0fb3f85f17204a1fb7a2167f207", + git_commit = "e453eec2ca4c84630a0c01b281416dda4d88e0ed", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f318d24d143827d4db189b4fd043d5d95f43532d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 26 Oct 2020 12:02:02 -0700 Subject: [PATCH 4311/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/521436e4-62db-4b8b-a591-2a30391afd11 PiperOrigin-RevId: 339087720 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f64406ea6e7..ab77481912a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e02070e1ddc5dbc05d6d0a6be7799d619851a0fb3f85f17204a1fb7a2167f207", - git_commit = "e453eec2ca4c84630a0c01b281416dda4d88e0ed", + sha256 = "988ce9a21c293054c0d4234c1cd4d337b3d3abc3107e05d73683b09506fe6b15", + git_commit = "059fafcef224438e3790043d2dbf839b9948e63d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f6b894f995ac80ccd478123ac74652ba4b569551 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 26 Oct 2020 18:01:30 -0700 Subject: [PATCH 4312/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4db7a5c0-2c87-47f7-950f-3f5cb569dd2d PiperOrigin-RevId: 339157454 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ab77481912a..b38b285cea3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "988ce9a21c293054c0d4234c1cd4d337b3d3abc3107e05d73683b09506fe6b15", - git_commit = "059fafcef224438e3790043d2dbf839b9948e63d", + sha256 = "034e99c88b02381660caceebb0f4be7337caa2edc6ddd69bab772f7c51e7495c", + git_commit = "774a9fe02c4eca2247d08e4f8e974e9e0a7aecb1", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 82f8cc039d091916b8186dfa1ff4b6c006e7277c Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Mon, 26 Oct 2020 23:24:51 -0700 Subject: [PATCH 4313/8103] Add `portpicker` module required to run modelserver e2e tests. PiperOrigin-RevId: 339190821 --- tensorflow_serving/tools/docker/Dockerfile.devel | 1 + tensorflow_serving/tools/docker/Dockerfile.devel-gpu | 1 + tensorflow_serving/tools/docker/Dockerfile.devel-mkl | 1 + 3 files changed, 3 insertions(+) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index 648a4984315..f711f2e6019 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -70,6 +70,7 @@ RUN pip3 --no-cache-dir install \ keras_preprocessing>=1.1.0 \ mock \ numpy \ + portpicker \ requests \ --ignore-installed setuptools \ --ignore-installed six>=1.12.0 diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 41d8445fd62..7ed1f577a64 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -101,6 +101,7 @@ RUN pip3 --no-cache-dir install \ keras_preprocessing>=1.1.0 \ mock \ numpy \ + portpicker \ requests \ --ignore-installed six>=1.12.0 diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl index e47b1866658..b019eaadf95 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl @@ -70,6 +70,7 @@ RUN pip3 --no-cache-dir install \ keras_preprocessing>=1.1.0 \ mock \ numpy \ + portpicker \ requests \ --ignore-installed six>=1.12.0 From 3f857360a1ed99961011c27c4707912d7b0a9614 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 27 Oct 2020 00:01:31 -0700 Subject: [PATCH 4314/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c2687b63-98f8-4dfa-8d9f-8f960f06089c PiperOrigin-RevId: 339193855 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b38b285cea3..ccb31c2d056 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "034e99c88b02381660caceebb0f4be7337caa2edc6ddd69bab772f7c51e7495c", - git_commit = "774a9fe02c4eca2247d08e4f8e974e9e0a7aecb1", + sha256 = "205e7dc8b751a191b46121d9884be8c055faa125fd1d90fe01352dc03511ad1f", + git_commit = "68b74a30fae55a04570fbd3810d28a0fcf44ab17", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From eae8f47a1481ec31b76e4c0b2389ebd85a8a9f68 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 27 Oct 2020 06:01:48 -0700 Subject: [PATCH 4315/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/75b079d2-724e-4321-a95c-1967f7732127 PiperOrigin-RevId: 339232957 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ccb31c2d056..4ddac1fbdce 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "205e7dc8b751a191b46121d9884be8c055faa125fd1d90fe01352dc03511ad1f", - git_commit = "68b74a30fae55a04570fbd3810d28a0fcf44ab17", + sha256 = "bd0c9a6a9663b85429f047de33f891a94fc5f3b6673ac71e8500cee1e914442b", + git_commit = "4d6ea6bd4df86f5c08e08e39539b010d2c0d9e83", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c96474cfcca46b1216e52634efb68986cf8aa9b8 Mon Sep 17 00:00:00 2001 From: Lescurel Date: Tue, 27 Oct 2020 17:32:42 +0100 Subject: [PATCH 4316/8103] changing "infintiy" to "really high value" Putting "infinity" in the doc might confuse users that could believe that "infinity" is a possible value that can be set in the confirguration files. See this question on StackOverflow: https://stackoverflow.com/q/64552963/7370153 And the relevant quote from the question: > Still, the suggestion in the documentation that some "infinity" > value exists is giving me restless sleep. How can I indicate > infinity here? --- tensorflow_serving/batching/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tensorflow_serving/batching/README.md b/tensorflow_serving/batching/README.md index f152fa72e7b..6ea45b46ec1 100644 --- a/tensorflow_serving/batching/README.md +++ b/tensorflow_serving/batching/README.md @@ -127,7 +127,7 @@ helpful in selecting values to experiment with. #### Overall Guidelines First of all, while experimenting you should temporarily set -`max_enqueued_batches` to infinity. Later, for your production setup, set it as +`max_enqueued_batches` to a really high value. Later, for your production setup, set it as follows: If you are performing online serving, depending on the policy used to (re-)route requests to server instances, consider setting `max_enqueued_batches` equal to `num_batch_threads` to minimize queueing delay at a given server while @@ -144,7 +144,7 @@ code to pad the batches with dummy elements. If your system is CPU-only (no GPU), then consider starting with the following values: `num_batch_threads` equal to the number of CPU cores; `max_batch_size` -to infinity; `batch_timeout_micros` to 0. Then experiment with +to a really high value; `batch_timeout_micros` to 0. Then experiment with `batch_timeout_micros` values in the 1-10 millisecond (1000-10000 microsecond) range, while keeping in mind that 0 may be the optimal value. @@ -155,7 +155,7 @@ consider the following approach: 1. Set `num_batch_threads` to the number of CPU cores. -2. Temporarily set `batch_timeout_micros` to infinity while you tune +2. Temporarily set `batch_timeout_micros` to a really high value while you tune `max_batch_size` to achieve the desired balance between throughput and average latency. Consider values in the hundreds or thousands. From a0bed15f2df1ffe4551d4e2f27b6544a96c9289b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 27 Oct 2020 12:01:30 -0700 Subject: [PATCH 4317/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f3e9e5d8-1279-4e46-9be5-c583307e4ef0 PiperOrigin-RevId: 339298788 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4ddac1fbdce..57d7235a17a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bd0c9a6a9663b85429f047de33f891a94fc5f3b6673ac71e8500cee1e914442b", - git_commit = "4d6ea6bd4df86f5c08e08e39539b010d2c0d9e83", + sha256 = "a468c8c3023f4f516192cb422f8b8f32fb68cdad9e44277c678647fad554cdf1", + git_commit = "365442b8d0dbd4c6c10bee812b09766b6f95187b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From edb60312255be8dcea8f7695941bc53cde4b5288 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 27 Oct 2020 18:01:56 -0700 Subject: [PATCH 4318/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b6660767-b688-458c-a962-be2f14355be8 PiperOrigin-RevId: 339369085 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 57d7235a17a..4d973914f58 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a468c8c3023f4f516192cb422f8b8f32fb68cdad9e44277c678647fad554cdf1", - git_commit = "365442b8d0dbd4c6c10bee812b09766b6f95187b", + sha256 = "e65636054e8b0965cb4616fe988dc503bcb83d607695d60bf1674475461ef434", + git_commit = "33c556c11dc54f78dbd02c7297854b91cb5543e4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9e606456601012bd0a9015fd5c9fe5e935999f87 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 28 Oct 2020 00:01:30 -0700 Subject: [PATCH 4319/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7a0b7c48-1648-4854-93a2-bba80e96a057 PiperOrigin-RevId: 339406154 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4d973914f58..6e6bfdb8c1a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e65636054e8b0965cb4616fe988dc503bcb83d607695d60bf1674475461ef434", - git_commit = "33c556c11dc54f78dbd02c7297854b91cb5543e4", + sha256 = "b19a68065474633287919546792359c97e9d1b48ac5ea24c57b7d09d964ddde4", + git_commit = "10f777a05ba92e4d1775911181536a09ec2ff4d9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From afa73c992551a19efa21c9500cba7d79b18a5373 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 28 Oct 2020 06:01:40 -0700 Subject: [PATCH 4320/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/55f7749c-1803-41f0-980a-aff462cc0a7c PiperOrigin-RevId: 339444225 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6e6bfdb8c1a..c96c2c949c7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b19a68065474633287919546792359c97e9d1b48ac5ea24c57b7d09d964ddde4", - git_commit = "10f777a05ba92e4d1775911181536a09ec2ff4d9", + sha256 = "fb8050bb914f2fe61862854afc4c84511605ef45570512b5fb79ecfe53961515", + git_commit = "d26b3348df5504fd48cf0b60cba7452f7236d3f3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From de124a605317d9d6238ce7b1eeeb9e43b134d755 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 28 Oct 2020 12:01:32 -0700 Subject: [PATCH 4321/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/98450a9c-fbbe-46c6-83f1-ded51fbba7d0 PiperOrigin-RevId: 339508702 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c96c2c949c7..9735c4c5aea 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fb8050bb914f2fe61862854afc4c84511605ef45570512b5fb79ecfe53961515", - git_commit = "d26b3348df5504fd48cf0b60cba7452f7236d3f3", + sha256 = "dd749904f6791df8c6b206677f07a129e86a2233d3c02b67e4bf23f17a34eb5e", + git_commit = "69d9fb6c3c4bbbe7f35221ed20dd18aca0958c08", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c0a5619a01e3af69459aa6396d614945370bbd02 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Wed, 28 Oct 2020 16:18:14 -0700 Subject: [PATCH 4322/8103] Minimal commandline client to trigger profiler on the modelserver. PiperOrigin-RevId: 339559641 --- tensorflow_serving/model_servers/BUILD | 10 ++++++ .../model_servers/profiler_client.py | 34 +++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 tensorflow_serving/model_servers/profiler_client.py diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 3d0fba173b4..9f04eafec83 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -448,6 +448,16 @@ py_binary( ], ) +py_binary( + name = "profiler_client", + srcs = ["profiler_client.py"], + python_version = "PY3", + srcs_version = "PY2AND3", + deps = [ + "@org_tensorflow//tensorflow:tensorflow_py", + ], +) + pkg_tar( name = "tensorflow_model_server_tar", srcs = [ diff --git a/tensorflow_serving/model_servers/profiler_client.py b/tensorflow_serving/model_servers/profiler_client.py new file mode 100644 index 00000000000..c4573842980 --- /dev/null +++ b/tensorflow_serving/model_servers/profiler_client.py @@ -0,0 +1,34 @@ +# Copyright 2020 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Simple client to send profiling request to ModelServer.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf + +from tensorflow.python.profiler import profiler_client + + +def main(argv): + server = argv[1] if len(argv) > 1 else 'localhost:8500' + logdir = argv[2] if len(argv) > 2 else '/tmp' + duration_ms = argv[3] if len(argv) > 3 else 2000 + profiler_client.trace(server, logdir, duration_ms) + + +if __name__ == '__main__': + tf.compat.v1.app.run() From 08d78e7c95912dfafc1d46467ec26196e6859a05 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 28 Oct 2020 18:01:53 -0700 Subject: [PATCH 4323/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/efd4a782-5deb-4dc4-9260-79fe174fea40 PiperOrigin-RevId: 339575397 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9735c4c5aea..7f9b6dc5d3f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dd749904f6791df8c6b206677f07a129e86a2233d3c02b67e4bf23f17a34eb5e", - git_commit = "69d9fb6c3c4bbbe7f35221ed20dd18aca0958c08", + sha256 = "fbc6a8630015233d07f3c0db38092651d85b103f2b1633faef8a278f60cc1899", + git_commit = "ad891c3a24f4633a7b40b037976d39700d7f1be0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7c357e4dcd948ee122da314976d40c2f57829e70 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 29 Oct 2020 00:01:36 -0700 Subject: [PATCH 4324/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e1e5dc65-be86-4577-acd4-5be690a73640 PiperOrigin-RevId: 339611876 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7f9b6dc5d3f..f1b0819162c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fbc6a8630015233d07f3c0db38092651d85b103f2b1633faef8a278f60cc1899", - git_commit = "ad891c3a24f4633a7b40b037976d39700d7f1be0", + sha256 = "081712ebc3a4ceaf40c308a717740baf9da0669f22680d58c0c77afed07d3eb9", + git_commit = "f162769b41b6ad817339ecb3a08ca5961377ab1f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3057f9c3e1f778af4ca39b0b418036c120d14c4d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 29 Oct 2020 06:01:29 -0700 Subject: [PATCH 4325/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/687b1c37-4dab-4a44-a62f-c3223d120b77 PiperOrigin-RevId: 339652484 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f1b0819162c..ed65609895f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "081712ebc3a4ceaf40c308a717740baf9da0669f22680d58c0c77afed07d3eb9", - git_commit = "f162769b41b6ad817339ecb3a08ca5961377ab1f", + sha256 = "600f0fbbdc51e47b84af07533ea19467000e8756be7ad41bba940d9226ca9217", + git_commit = "6889abad2da6e4a075dd4485a5e5484878bd6d22", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3789022061f2919ea4b44167504a973286924349 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 29 Oct 2020 12:01:28 -0700 Subject: [PATCH 4326/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f3367fd8-a8ce-411e-b3f7-dc2894954c18 PiperOrigin-RevId: 339717063 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ed65609895f..d9e7cbee2d5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "600f0fbbdc51e47b84af07533ea19467000e8756be7ad41bba940d9226ca9217", - git_commit = "6889abad2da6e4a075dd4485a5e5484878bd6d22", + sha256 = "913cd2b300e6acb99bf6131a66e64ccfb4675324d06756c894fad053fde6813f", + git_commit = "f362f072fb8f1e8eaec5ff9690a4542dba9933a5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8b3c6fc1bc2127d44ab531f55009914c2d0e4d4e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 29 Oct 2020 18:01:41 -0700 Subject: [PATCH 4327/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a975a2b3-65d9-49c3-8ef9-258a950afd97 PiperOrigin-RevId: 339784599 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d9e7cbee2d5..a1a509d1f2f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "913cd2b300e6acb99bf6131a66e64ccfb4675324d06756c894fad053fde6813f", - git_commit = "f362f072fb8f1e8eaec5ff9690a4542dba9933a5", + sha256 = "56e0d4cf3356e33a28988b59750abc182b45baa193722ed0933ee5340cad66f8", + git_commit = "2d03c32d6299935ea74083c943c8d727ff50d4c8", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 84dfc8b66ff6c1a693766613034ddc3ff044a330 Mon Sep 17 00:00:00 2001 From: Guanxin Qiao Date: Thu, 29 Oct 2020 22:38:56 -0700 Subject: [PATCH 4328/8103] Add signature name to RPOp. PiperOrigin-RevId: 339813374 --- .../kernels/remote_predict_op_kernel.h | 6 ++++++ .../kernels/remote_predict_op_kernel_test.cc | 5 +++-- .../ops/remote_predict/ops/remote_predict_op.cc | 3 +++ .../remote_predict/python/ops/remote_predict_ops.py | 12 +++++++++--- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/remote_predict_op_kernel.h b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/remote_predict_op_kernel.h index eadddaa548a..f42f255d790 100644 --- a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/remote_predict_op_kernel.h +++ b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/remote_predict_op_kernel.h @@ -54,6 +54,8 @@ class RemotePredictOp : public AsyncOpKernel { &max_rpc_deadline_millis_)); OP_REQUIRES_OK(context, context->GetAttr("fail_op_on_rpc_error", &fail_op_on_rpc_error_)); + OP_REQUIRES_OK(context, + context->GetAttr("signature_name", &signature_name_)); absl::Status prediction_service_status = PredictionServiceStubType::Create(target_address, &prediction_service_); OP_REQUIRES(context, prediction_service_status.ok(), @@ -80,6 +82,9 @@ class RemotePredictOp : public AsyncOpKernel { PredictRequest* request = new PredictRequest(); request->mutable_model_spec()->set_name(model_name_); + + request->mutable_model_spec()->set_signature_name(signature_name_); + if (model_version_ >= 0) { request->mutable_model_spec()->mutable_version()->set_value( model_version_); @@ -179,6 +184,7 @@ class RemotePredictOp : public AsyncOpKernel { int64 model_version_; bool fail_op_on_rpc_error_; int64 max_rpc_deadline_millis_; + string signature_name_; std::unique_ptr prediction_service_; }; diff --git a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/remote_predict_op_kernel_test.cc b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/remote_predict_op_kernel_test.cc index 3d51f20de12..9698a22c333 100644 --- a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/remote_predict_op_kernel_test.cc +++ b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/remote_predict_op_kernel_test.cc @@ -90,7 +90,7 @@ ::tensorflow::Status RunRemotePredict( const absl::optional<::absl::Duration> deadline = absl::nullopt, bool fail_on_rpc_error = true, const string& target_address = "target_address", - int64 target_model_version = -1) { + int64 target_model_version = -1, const string& signature_name = "") { const Scope scope = Scope::DisabledShapeInferenceScope(); // Model_name will decide the result of the RPC. auto input_tensor_aliases = ops::Const( @@ -102,7 +102,8 @@ ::tensorflow::Status RunRemotePredict( std::vector fetch_outputs; RemotePredict::Attrs attrs = RemotePredict::Attrs() .TargetAddress(target_address) - .ModelName(model_name); + .ModelName(model_name) + .SignatureName(signature_name); if (target_model_version >= 0) { attrs = attrs.ModelVersion(target_model_version); diff --git a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/ops/remote_predict_op.cc b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/ops/remote_predict_op.cc index a02c33685f8..df8bb5c3dc2 100644 --- a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/ops/remote_predict_op.cc +++ b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/ops/remote_predict_op.cc @@ -25,6 +25,7 @@ REGISTER_OP("TfServingRemotePredict") .Attr("model_version: int = -1") .Attr("fail_op_on_rpc_error: bool = true") .Attr("max_rpc_deadline_millis: int = 30000") + .Attr("signature_name: string = 'serving_default'") .Input("input_tensor_aliases: string") .Input("input_tensors: T") .Input("output_tensor_aliases: string") @@ -83,6 +84,8 @@ fail_op_on_rpc_error: If set true, the Op fails if the rpc fails, and returns Set true by default. max_rpc_deadline_millis: The rpc deadline for remote predict. The actual deadline is min(incoming_rpc_deadline, max_rpc_deadline_millis). +signature_name: the signature def for remote graph inference, defaulting to +"serving_default". target_address: Address of the server hosting the remote graph. model_name: Model name of the remote TF graph. model_version: the target version for the Predict call. When unset, the diff --git a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/python/ops/remote_predict_ops.py b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/python/ops/remote_predict_ops.py index c5fd560ced8..59e3541c79c 100644 --- a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/python/ops/remote_predict_ops.py +++ b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/python/ops/remote_predict_ops.py @@ -41,7 +41,8 @@ def run(input_tensor_alias, model_version=-1, max_rpc_deadline_millis=3000, output_types=None, - name=None): + name=None, + signature_name='serving_default'): """Runs a predict in remote process through rpc. Args: @@ -55,6 +56,7 @@ def run(input_tensor_alias, max_rpc_deadline_millis: rpc deadline in millis output_types: output types for Predict name: name for the op in the graph + signature_name: the signature def for remote graph inference Returns: output_tensors as a result of the Predict. @@ -72,6 +74,7 @@ def run(input_tensor_alias, model_version=model_version, fail_op_on_rpc_error=True, max_rpc_deadline_millis=max_rpc_deadline_millis, + signature_name=signature_name, output_types=output_types, name=name))[2] @@ -84,7 +87,8 @@ def run_returning_status(input_tensor_alias, model_version=-1, max_rpc_deadline_millis=3000, output_types=None, - name=None): + name=None, + signature_name='serving_default'): """Runs a predict in remote process through rpc. Args: @@ -97,7 +101,8 @@ def run_returning_status(input_tensor_alias, version available for serving will be targeted. max_rpc_deadline_millis: rpc deadline in millis output_types: output types for Predict - name: name for the op in the graph. + name: name for the op in the graph + signature_name: the signature def for remote graph inference Returns: status_code, status_error_message and output_tensors. @@ -115,5 +120,6 @@ def run_returning_status(input_tensor_alias, model_version=model_version, fail_op_on_rpc_error=False, max_rpc_deadline_millis=max_rpc_deadline_millis, + signature_name=signature_name, output_types=output_types, name=name)) From 6a1e7a935f7efad5f988bb3d0da24e04280bcbfb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 30 Oct 2020 00:01:45 -0700 Subject: [PATCH 4329/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fbd202cb-d2a5-47de-91f2-1beb6e96f480 PiperOrigin-RevId: 339821880 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a1a509d1f2f..f88171306ac 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "56e0d4cf3356e33a28988b59750abc182b45baa193722ed0933ee5340cad66f8", - git_commit = "2d03c32d6299935ea74083c943c8d727ff50d4c8", + sha256 = "5260199fddc3c531c66f38e615948dc149df1b700521c3eebd8546dc1ffa380c", + git_commit = "5a832a95244e4462a2ae42b7ab26b5a256393242", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a0a9d14322bf30299d0056182952c00d1961bf35 Mon Sep 17 00:00:00 2001 From: gbaned <48215717+gbaned@users.noreply.github.com> Date: Fri, 30 Oct 2020 17:16:14 +0530 Subject: [PATCH 4330/8103] Update json_tensor.cc Changed "Excepting" to "Expecting" --- tensorflow_serving/util/json_tensor.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/util/json_tensor.cc b/tensorflow_serving/util/json_tensor.cc index bf394a6aa1a..c067206e2e1 100644 --- a/tensorflow_serving/util/json_tensor.cc +++ b/tensorflow_serving/util/json_tensor.cc @@ -670,7 +670,7 @@ Status FillPredictRequestFromJson( kPredictRequestInstancesKey, "' keys to exist "); } if (!itr_instances->value.IsArray()) { - return FormatError(doc, "Excepting '", + return FormatError(doc, "Expecting '", kPredictRequestInstancesKey, "' to be an list/array"); } if (!itr_instances->value.Capacity()) { From 85acd2d2aaa9e2daf1f11ed5c02a24164103f6d6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 30 Oct 2020 06:04:31 -0700 Subject: [PATCH 4331/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ee35f2a6-1397-4bfb-a246-7ebcd51cc00c PiperOrigin-RevId: 339857578 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f88171306ac..6bdb8f92c4b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5260199fddc3c531c66f38e615948dc149df1b700521c3eebd8546dc1ffa380c", - git_commit = "5a832a95244e4462a2ae42b7ab26b5a256393242", + sha256 = "490482dab3b076d04e8d197587477bd899720607f2a96e82d2e6759a8aad4845", + git_commit = "be084bd7a4dd241eb781fc704f57bcacc5c9b6dd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9c0345833fea51f4f2a141b4f4249488a05f79c0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 30 Oct 2020 12:01:30 -0700 Subject: [PATCH 4332/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0abfcf28-d20d-45f1-9022-e378db206b98 PiperOrigin-RevId: 339913839 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6bdb8f92c4b..8899eea1d64 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "490482dab3b076d04e8d197587477bd899720607f2a96e82d2e6759a8aad4845", - git_commit = "be084bd7a4dd241eb781fc704f57bcacc5c9b6dd", + sha256 = "f474e57e3394bd738701de6fdad7de5c8d2e782a4ff65824538ee441957874ec", + git_commit = "b2d17e7e8657c8b7cb8dfd6556877d589b91535d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9113de22353350443bdd42c5d594ec653e57c0da Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 30 Oct 2020 12:41:26 -0700 Subject: [PATCH 4333/8103] When RPC error occurs, the output tensors should still get allocated. This is required otherwise all the dependent ops would not get executed. PiperOrigin-RevId: 339921089 --- .../ops/remote_predict/kernels/remote_predict_op_kernel.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/remote_predict_op_kernel.h b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/remote_predict_op_kernel.h index f42f255d790..fb5c31ae3ee 100644 --- a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/remote_predict_op_kernel.h +++ b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/remote_predict_op_kernel.h @@ -153,8 +153,11 @@ class RemotePredictOp : public AsyncOpKernel { } else { // Allocate some empty output for the output_tensors. for (int i = 0; i < output_tensors_list.size(); ++i) { - Tensor output_tensor; - output_tensors_list.set(i, output_tensor); + Tensor* unused; + OP_REQUIRES_OK_ASYNC( + context, + output_tensors_list.allocate(i, TensorShape({}), &unused), + rpc_cleaner.release()); } return; } From 383b1a0bdacbab446b18b684969772b95fabfc51 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 30 Oct 2020 18:01:27 -0700 Subject: [PATCH 4334/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7adba31d-a89b-4c1a-8dec-26d7982f1a52 PiperOrigin-RevId: 339971264 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8899eea1d64..358af1fd906 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f474e57e3394bd738701de6fdad7de5c8d2e782a4ff65824538ee441957874ec", - git_commit = "b2d17e7e8657c8b7cb8dfd6556877d589b91535d", + sha256 = "b7aba4640f800942e57406b21e3a37710a43760471e6744df4372f18dfe550ee", + git_commit = "3ad80ca351936181ff16a30e932ea1268c001447", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 31547ea3b0d6f0863f2bb61d7c35ed64531fdf57 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 31 Oct 2020 00:01:29 -0700 Subject: [PATCH 4335/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/cb6e50aa-c29a-42b9-946a-09db02c0366e PiperOrigin-RevId: 339997426 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 358af1fd906..578452d7701 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b7aba4640f800942e57406b21e3a37710a43760471e6744df4372f18dfe550ee", - git_commit = "3ad80ca351936181ff16a30e932ea1268c001447", + sha256 = "d1eca1c7344c383750f60056391d2299a684ebccb58b1d4e8febb8e131559ca1", + git_commit = "5b76abd4497cd4a121c8f64b8db107f8a1de6388", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 58b10bc7450a41d395788cf425b2d2bca925a1a2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 31 Oct 2020 06:01:52 -0700 Subject: [PATCH 4336/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7c99afab-f953-42be-9013-bfb0acaebcd3 PiperOrigin-RevId: 340019559 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 578452d7701..b7b1fad5672 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d1eca1c7344c383750f60056391d2299a684ebccb58b1d4e8febb8e131559ca1", - git_commit = "5b76abd4497cd4a121c8f64b8db107f8a1de6388", + sha256 = "a84982d220740b97ed74520c4d002ad6430d840a489dbc1b0b062128801ca468", + git_commit = "377434ff41473a33f7bedd1c08199d5af1fd33e9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ccaea06baa4f237cbb289bd606e8a62968af650b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 31 Oct 2020 12:01:28 -0700 Subject: [PATCH 4337/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/07c2289e-c7ca-4db0-a10c-f5685f6537de PiperOrigin-RevId: 340040365 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b7b1fad5672..9564feb8505 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a84982d220740b97ed74520c4d002ad6430d840a489dbc1b0b062128801ca468", - git_commit = "377434ff41473a33f7bedd1c08199d5af1fd33e9", + sha256 = "371f94db4c59819964a82d26ee8e62cabb2c7f1b871a931c93750e399785e2c7", + git_commit = "89b078797d237405c0a4396b4fa9c9ecec28db2b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0e54de252adf578a5eae83b99d68b21c6345f86a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 31 Oct 2020 18:01:31 -0700 Subject: [PATCH 4338/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ff941e53-8513-45d4-831e-a02f372a5c4f PiperOrigin-RevId: 340061508 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9564feb8505..1d4935e61b8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "371f94db4c59819964a82d26ee8e62cabb2c7f1b871a931c93750e399785e2c7", - git_commit = "89b078797d237405c0a4396b4fa9c9ecec28db2b", + sha256 = "c422efca6489d9f8ea436a10850765bc1dcbd6b61b39885ec37cbac0cdb32f6e", + git_commit = "d3bcfc947d692256c27a3b0486504c8c306ca739", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 499c239883d0b8fcad5564e346575a2bf673e217 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 1 Nov 2020 00:01:24 -0700 Subject: [PATCH 4339/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9712100e-2a0a-4ee4-a548-9cd9b773a772 PiperOrigin-RevId: 340081851 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1d4935e61b8..20fb7b8cf69 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c422efca6489d9f8ea436a10850765bc1dcbd6b61b39885ec37cbac0cdb32f6e", - git_commit = "d3bcfc947d692256c27a3b0486504c8c306ca739", + sha256 = "c6565a9fea2fcc208b25792ada8e4946b92cea78c03b2279864b4544c8173b21", + git_commit = "6679bc9474d8ba01dbe19a28a553aef308371c57", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6e8fed8ef76900a2d12bba738cd90096593e2a5e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 1 Nov 2020 05:01:21 -0800 Subject: [PATCH 4340/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f860e4d5-19cb-4bca-886a-5a7c56f4b38a PiperOrigin-RevId: 340101575 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 20fb7b8cf69..edb6f74bd9a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c6565a9fea2fcc208b25792ada8e4946b92cea78c03b2279864b4544c8173b21", - git_commit = "6679bc9474d8ba01dbe19a28a553aef308371c57", + sha256 = "1d620a04c89b1f88a2c4e3c2af54b98843424ab931bd23e32961c207db8fca35", + git_commit = "898ae24a05ae738a816bca5f20226f8323dc1b21", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2cdc3b8a711a0e46f305f4d0c0f21acc33afe8e2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 1 Nov 2020 17:01:29 -0800 Subject: [PATCH 4341/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/25c4b93c-01a3-4128-86cf-3f98fa43e2b9 PiperOrigin-RevId: 340145228 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index edb6f74bd9a..c3e15cf3c92 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1d620a04c89b1f88a2c4e3c2af54b98843424ab931bd23e32961c207db8fca35", - git_commit = "898ae24a05ae738a816bca5f20226f8323dc1b21", + sha256 = "4acef44fcefc89185a0c54aa432d31003cce6e86f43cea9766b70e1af1925c2d", + git_commit = "b2c3e950580cec60df1fae4382b20624f8977e4f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e941ff982247e8bd725c7440beefc9ee02b0d456 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 1 Nov 2020 23:01:24 -0800 Subject: [PATCH 4342/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a3025f20-6b76-4ea9-bf9d-6d122465e42d PiperOrigin-RevId: 340174087 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c3e15cf3c92..c8e64cb7308 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4acef44fcefc89185a0c54aa432d31003cce6e86f43cea9766b70e1af1925c2d", - git_commit = "b2c3e950580cec60df1fae4382b20624f8977e4f", + sha256 = "4ac3de93386f678e3b958404ac71f717828ac9156950151610cf44b5b02c06cd", + git_commit = "c40d0d3b4ec76c01d456539f3ea4903246a2a82b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5be29eb5c9088d84310526b73a82b61b972c3ae2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 2 Nov 2020 00:02:02 -0800 Subject: [PATCH 4343/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/991c801e-c899-4787-b775-25184030c6fb PiperOrigin-RevId: 340179114 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c8e64cb7308..6fe6ce581fe 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4ac3de93386f678e3b958404ac71f717828ac9156950151610cf44b5b02c06cd", - git_commit = "c40d0d3b4ec76c01d456539f3ea4903246a2a82b", + sha256 = "7f3906df897712bbede88b35a7508f4304724cb67245971b18c97514e49d330a", + git_commit = "c33f9482309289ba457d7f2a1b8f7ea76b8b587b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e1012015e07e9ef75e2c2b68ab87c705d652cdba Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 2 Nov 2020 06:01:34 -0800 Subject: [PATCH 4344/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1a365cc6-7372-44f3-923a-8f18ea161f4f PiperOrigin-RevId: 340218264 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6fe6ce581fe..ade0766a13f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7f3906df897712bbede88b35a7508f4304724cb67245971b18c97514e49d330a", - git_commit = "c33f9482309289ba457d7f2a1b8f7ea76b8b587b", + sha256 = "e6853cac3bafccfd7a5214f67f7f0c0745c1e25f58e6353493065ae104a553dc", + git_commit = "67f54bb8925f6a74a029edc09a3429282d418190", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 030fa5a2e3d6f820aa5044df2bf642285e612a85 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 2 Nov 2020 12:01:23 -0800 Subject: [PATCH 4345/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/91953eb6-7321-4ca5-aadd-6fbff96d1565 PiperOrigin-RevId: 340286235 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ade0766a13f..f50d799ba78 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e6853cac3bafccfd7a5214f67f7f0c0745c1e25f58e6353493065ae104a553dc", - git_commit = "67f54bb8925f6a74a029edc09a3429282d418190", + sha256 = "90ca95c2717e7af8c2d033e5b8f1819a69cc1b563df6be2e80d514d6776f162d", + git_commit = "cb2f5c429168c4e62a3fe2eb5402bd399fb3e9b4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From cfabf2d8ca9540308fbcb995878d31015237e426 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 2 Nov 2020 18:01:28 -0800 Subject: [PATCH 4346/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9f692dc6-9093-4b99-8262-ca3f14e0ff1d PiperOrigin-RevId: 340354383 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f50d799ba78..cc4ed21aea7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "90ca95c2717e7af8c2d033e5b8f1819a69cc1b563df6be2e80d514d6776f162d", - git_commit = "cb2f5c429168c4e62a3fe2eb5402bd399fb3e9b4", + sha256 = "f62778aa3b4b5fdfbc0a223027cdb074b4dd08155215572e2494ffde374972c9", + git_commit = "5ed3b0fa560b6c5888f2ec1ff76930fe54a13518", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c783ff2fff372075368c89fb91b3077a09ef0490 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 3 Nov 2020 00:02:48 -0800 Subject: [PATCH 4347/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/592a628d-f46c-4020-acc8-74fdb80272c6 PiperOrigin-RevId: 340390602 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cc4ed21aea7..63d25b4fb25 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f62778aa3b4b5fdfbc0a223027cdb074b4dd08155215572e2494ffde374972c9", - git_commit = "5ed3b0fa560b6c5888f2ec1ff76930fe54a13518", + sha256 = "8cfa4a09f60c814130d77a505f324641d596b2035162e05bf0f406be19707527", + git_commit = "cfd834264dbd82a28cb43957fcde5a8d53657aaa", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 39b61784126c42378e5b9c455abb4fec64fd4f80 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 3 Nov 2020 06:01:29 -0800 Subject: [PATCH 4348/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0004218a-006a-4d43-bdf5-78af0640a264 PiperOrigin-RevId: 340428684 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 63d25b4fb25..d9d8c0f82d5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8cfa4a09f60c814130d77a505f324641d596b2035162e05bf0f406be19707527", - git_commit = "cfd834264dbd82a28cb43957fcde5a8d53657aaa", + sha256 = "593e88496364798a6201c9f366f8f7d242af1588ded97ddc6d694700d439cab6", + git_commit = "218caef97666384211ea9171dc6029ec3ec7bdd6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 29729afe1f9363196c808bd41551d21e8fa90a1a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 3 Nov 2020 12:01:32 -0800 Subject: [PATCH 4349/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bd17c14f-e087-4153-9583-733c751ba45d PiperOrigin-RevId: 340494886 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d9d8c0f82d5..ce1a5118587 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "593e88496364798a6201c9f366f8f7d242af1588ded97ddc6d694700d439cab6", - git_commit = "218caef97666384211ea9171dc6029ec3ec7bdd6", + sha256 = "8b606f34d70c4cd0daef86d3ca71a733c1c0f8920ded88a4879e8c8e8d4fcffc", + git_commit = "a1ce93056333b296d02601870fa3bc89e16d6de9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4d0fea053e9fd3a56c775827cd41281275b158de Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 3 Nov 2020 18:01:32 -0800 Subject: [PATCH 4350/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f1ed7dc8-870b-4c6c-a913-9198be89e20a PiperOrigin-RevId: 340560950 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ce1a5118587..cee316cf6b2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8b606f34d70c4cd0daef86d3ca71a733c1c0f8920ded88a4879e8c8e8d4fcffc", - git_commit = "a1ce93056333b296d02601870fa3bc89e16d6de9", + sha256 = "44ec299800307b8f3b940599456f7741bcdab103163d59a4cff2ed3413fea69f", + git_commit = "508ef034d8b5bf640130b9b2d026a3cf675e97f6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 220d6644e083c44bc84d46db9b1095839ecb037d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 4 Nov 2020 00:01:32 -0800 Subject: [PATCH 4351/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/50d58bce-ea2b-4a01-bd0e-544edfd981fa PiperOrigin-RevId: 340595675 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cee316cf6b2..242558b880a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "44ec299800307b8f3b940599456f7741bcdab103163d59a4cff2ed3413fea69f", - git_commit = "508ef034d8b5bf640130b9b2d026a3cf675e97f6", + sha256 = "c2c6af4bf3dc25aec52a07e571954f86241440225029073c8b8d632f128e130e", + git_commit = "f65f285b443acbcb926106054c9a85aa374ec7ad", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8cabc5a60ebb24cbba6c6b509c707a325a12ebcf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 4 Nov 2020 06:01:29 -0800 Subject: [PATCH 4352/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/18966815-836e-4a20-828f-4a1bc88de6cd PiperOrigin-RevId: 340633586 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 242558b880a..f7f7089872f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c2c6af4bf3dc25aec52a07e571954f86241440225029073c8b8d632f128e130e", - git_commit = "f65f285b443acbcb926106054c9a85aa374ec7ad", + sha256 = "5e551bb1a2dd7067977c002445584cbde5d9e58584f553f5d5824d695abba02d", + git_commit = "e9586bdec2d510f48315fd9d98fd2593e7c1b341", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 96d36a2c4e034c88c21b6725ca9c91c1aac691e9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 4 Nov 2020 12:01:49 -0800 Subject: [PATCH 4353/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/31934ccb-c38c-411c-b9f6-689f4e38e72c PiperOrigin-RevId: 340700335 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f7f7089872f..0f6d7397d29 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5e551bb1a2dd7067977c002445584cbde5d9e58584f553f5d5824d695abba02d", - git_commit = "e9586bdec2d510f48315fd9d98fd2593e7c1b341", + sha256 = "8f646373351da2f2ff80aaec5d10ec19da40b4f51da3edd0c7f5048b5d0b5c4f", + git_commit = "1dcdf0d7ff0d03285fce4abeb9250432746793d8", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5fc987e0d29c43a3ae5e4e34c96599b92365da36 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 4 Nov 2020 18:01:27 -0800 Subject: [PATCH 4354/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5b5e979b-c849-4ac1-9964-6337d572a457 PiperOrigin-RevId: 340761542 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0f6d7397d29..e4cfa601a4e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8f646373351da2f2ff80aaec5d10ec19da40b4f51da3edd0c7f5048b5d0b5c4f", - git_commit = "1dcdf0d7ff0d03285fce4abeb9250432746793d8", + sha256 = "e6265bf4211b1832abe264a45eb46628e9b05505ef9c92d4fe4fc2a06f126ada", + git_commit = "14e9addaaae5b4ff94e3b09f3e1ac475eb8f3be3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6a734a29f08319b70e8a041029e1e8244a4d35d1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 5 Nov 2020 00:01:52 -0800 Subject: [PATCH 4355/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/aac0849a-1fb5-4556-9579-da9919703933 PiperOrigin-RevId: 340796498 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e4cfa601a4e..ab5a3895132 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e6265bf4211b1832abe264a45eb46628e9b05505ef9c92d4fe4fc2a06f126ada", - git_commit = "14e9addaaae5b4ff94e3b09f3e1ac475eb8f3be3", + sha256 = "bef6dde9fed639b8aba3f36c6cb978036bab376c9ccfc280a392167e826b4a71", + git_commit = "cb370e7eb82eb547691b8c5e06f5648ca53e11f9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1ff60c5d1d16c3d965d67d805e608c3781369267 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 5 Nov 2020 06:02:45 -0800 Subject: [PATCH 4356/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1e18b327-6723-408f-8116-c5201c6a4fd3 PiperOrigin-RevId: 340836600 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ab5a3895132..0c39c0667c4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bef6dde9fed639b8aba3f36c6cb978036bab376c9ccfc280a392167e826b4a71", - git_commit = "cb370e7eb82eb547691b8c5e06f5648ca53e11f9", + sha256 = "c760fc166aff09adeb2fb993466043fbf50365671f1f25316963327d02a9c75f", + git_commit = "6d9e0887f6bce8fbeeb430364e520d05350d96d5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From be1f09f092d5ef014b927b841cfb4316c66d4a68 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 5 Nov 2020 12:01:32 -0800 Subject: [PATCH 4357/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/16721164-a3cc-45c1-842d-70cdbf61f538 PiperOrigin-RevId: 340900368 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0c39c0667c4..967e86f80c6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c760fc166aff09adeb2fb993466043fbf50365671f1f25316963327d02a9c75f", - git_commit = "6d9e0887f6bce8fbeeb430364e520d05350d96d5", + sha256 = "07e8774e77341ba3d4643fa75cc3ce15478b5480c755fc1eae22d399a9fe012d", + git_commit = "a1947ce92eb9d2c301dc1863cd89850e6fb8d122", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9d6cb97d13b80eaf33a2a62a1efe2e8cabbf796e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 5 Nov 2020 18:01:30 -0800 Subject: [PATCH 4358/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/60f6b2a6-27b2-4be7-968c-f4f51593a2a1 PiperOrigin-RevId: 340963115 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 967e86f80c6..ac68604dae2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "07e8774e77341ba3d4643fa75cc3ce15478b5480c755fc1eae22d399a9fe012d", - git_commit = "a1947ce92eb9d2c301dc1863cd89850e6fb8d122", + sha256 = "6841107cf4d77e27b074ec3c4ad64a0f2a8c196e53c1e9c34b2fa21e2411e9e8", + git_commit = "7540f9ff5ac877ca9bd750d21a8607d4f3008952", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 33a5ba03883cc5f2c9e8d67fc4bb08ff7d04fc20 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 6 Nov 2020 00:01:37 -0800 Subject: [PATCH 4359/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/439a1175-a25f-45e0-8b18-fab84d168506 PiperOrigin-RevId: 340999561 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ac68604dae2..818216e87c5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6841107cf4d77e27b074ec3c4ad64a0f2a8c196e53c1e9c34b2fa21e2411e9e8", - git_commit = "7540f9ff5ac877ca9bd750d21a8607d4f3008952", + sha256 = "ae0e7ffb548db6f354f387f7f7ace92035d7799c79690a23f75774d7372dc99b", + git_commit = "b54a2ddf6839d31f9ba65be7e50f0513e397d89d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a6fdb1ccf65f6795a37960da15ba28e5d75fa839 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 6 Nov 2020 06:01:16 -0800 Subject: [PATCH 4360/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e458af30-abfb-4aff-ad24-d0533f94b16c PiperOrigin-RevId: 341035175 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 818216e87c5..7b122ab2e77 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ae0e7ffb548db6f354f387f7f7ace92035d7799c79690a23f75774d7372dc99b", - git_commit = "b54a2ddf6839d31f9ba65be7e50f0513e397d89d", + sha256 = "7267d248d0646542da748020ebddcb08d87bab0c1eb1722d6bd46d5e0c9bf72d", + git_commit = "1dc3d68cf2f99d7818acc454dfddcfd86d9d994e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 249c40721a4e0d905ba7346ee96333e698eb1f81 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 6 Nov 2020 12:01:33 -0800 Subject: [PATCH 4361/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/98f47c15-f62b-4c98-9309-2b69fe9666f3 PiperOrigin-RevId: 341092868 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7b122ab2e77..b58066d0c17 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7267d248d0646542da748020ebddcb08d87bab0c1eb1722d6bd46d5e0c9bf72d", - git_commit = "1dc3d68cf2f99d7818acc454dfddcfd86d9d994e", + sha256 = "01d31fe23054803c6d315c831522915b612046557c68d750ced235a3eb826087", + git_commit = "5ab2ad101ebc9cac15a9e80c367eef2d8d0381d4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d3caccffdddfe7a3f7e3f117d3808708f993b71a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 6 Nov 2020 18:01:32 -0800 Subject: [PATCH 4362/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4833038e-0234-4be4-9834-9b313ae8ffd4 PiperOrigin-RevId: 341150844 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b58066d0c17..4068720995e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "01d31fe23054803c6d315c831522915b612046557c68d750ced235a3eb826087", - git_commit = "5ab2ad101ebc9cac15a9e80c367eef2d8d0381d4", + sha256 = "60820df37054d8fa74095e726ebc63a2631dcf64a4a08463b6a86d2ed6a648c4", + git_commit = "fcb5476957be0eb77a9e1fa6548f156672bb0050", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 54776b2effeec7411f5da185f79af2f7f3015489 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 7 Nov 2020 00:01:42 -0800 Subject: [PATCH 4363/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ba971750-174d-4dcd-a2f0-d88ba767826f PiperOrigin-RevId: 341177068 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4068720995e..c03e728e5d1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "60820df37054d8fa74095e726ebc63a2631dcf64a4a08463b6a86d2ed6a648c4", - git_commit = "fcb5476957be0eb77a9e1fa6548f156672bb0050", + sha256 = "98f31546982aba8c1065fcd2624beee12eee5e682f4173bb537fe7ff27176fe0", + git_commit = "73272ab087d9e8fcd0224e25a603fdaedc923431", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 73a68f54c77da31a158061a62fb96d5620becab3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 7 Nov 2020 06:01:45 -0800 Subject: [PATCH 4364/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1ba5e95b-38f3-4b7d-bdfd-d12bd6074798 PiperOrigin-RevId: 341198095 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c03e728e5d1..ab8ffb7470b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "98f31546982aba8c1065fcd2624beee12eee5e682f4173bb537fe7ff27176fe0", - git_commit = "73272ab087d9e8fcd0224e25a603fdaedc923431", + sha256 = "abec3458a2f0087a6db8b3ffd44c93dd0b35b804e3855374c081a0e1df8c4984", + git_commit = "92525fe6fc6c0c2e9271e6644171facedcdde02e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 07589060b58635f51c7d85ab9d4a9aaa6d81e40d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 7 Nov 2020 12:01:24 -0800 Subject: [PATCH 4365/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ff08c17f-abe2-4776-bfa8-c7458ecedc3e PiperOrigin-RevId: 341217698 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ab8ffb7470b..27664d51384 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "abec3458a2f0087a6db8b3ffd44c93dd0b35b804e3855374c081a0e1df8c4984", - git_commit = "92525fe6fc6c0c2e9271e6644171facedcdde02e", + sha256 = "1fef940f3154116bacb9a01926e2eeb34ca78f9c625a2d069b73bd547efddd0d", + git_commit = "5e33e7418e75904be2feffce8f0f1bee19f8f9ad", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 07cf2457d88b3fbe8d3716907a10ceec867cc270 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 7 Nov 2020 18:01:17 -0800 Subject: [PATCH 4366/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d6db4c06-4bc2-4289-890f-eaf9869f2371 PiperOrigin-RevId: 341238126 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 27664d51384..14d7d74aad0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1fef940f3154116bacb9a01926e2eeb34ca78f9c625a2d069b73bd547efddd0d", - git_commit = "5e33e7418e75904be2feffce8f0f1bee19f8f9ad", + sha256 = "da5ca23e529b815a9d947c5372beaa2b59738bf953f62511aae85bf2c77f5acc", + git_commit = "8e2be96fdc388049efe4bdbfa7a92e139ed0f4cb", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2338e5a63f8f9ac7930f8910bb3f62045ab3772a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 8 Nov 2020 00:01:27 -0800 Subject: [PATCH 4367/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f8c3bba7-e419-4c20-8976-edc75c3cb993 PiperOrigin-RevId: 341257395 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 14d7d74aad0..b37e918b20e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "da5ca23e529b815a9d947c5372beaa2b59738bf953f62511aae85bf2c77f5acc", - git_commit = "8e2be96fdc388049efe4bdbfa7a92e139ed0f4cb", + sha256 = "6a9908b4962eec9540f568bdadb1e53bbd737f2aba29acaa09fd222c940f8b4f", + git_commit = "ec957ef376e0defff194b877102c5177c1168263", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 01d6f9f782e58f1c7836b2dea01a48913d087332 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 8 Nov 2020 06:01:33 -0800 Subject: [PATCH 4368/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/cbf92876-6883-4294-ab06-526ef6ca8768 PiperOrigin-RevId: 341278924 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b37e918b20e..e457f9b0cf5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6a9908b4962eec9540f568bdadb1e53bbd737f2aba29acaa09fd222c940f8b4f", - git_commit = "ec957ef376e0defff194b877102c5177c1168263", + sha256 = "a04d1d388723d5b1b6e54509800279310b97610ab564c3408e2d8ae179733ba7", + git_commit = "13736b5adf8daa0c76747e861d3f295c184dcabb", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From bf11635a83b4137d55f525f174ab7d13fb8dc8bf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 8 Nov 2020 12:01:38 -0800 Subject: [PATCH 4369/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4df9333b-b11d-442c-bd8b-895b1d98b1b5 PiperOrigin-RevId: 341300490 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e457f9b0cf5..a46e8b12600 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a04d1d388723d5b1b6e54509800279310b97610ab564c3408e2d8ae179733ba7", - git_commit = "13736b5adf8daa0c76747e861d3f295c184dcabb", + sha256 = "0827a5c69b28a71332a64afaf8cb7f1589cf4214fb0fb07cdcf5b6a3b599b496", + git_commit = "97a396ac4b52e681395bc3f8ea5e3519e6290e5d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 418e244466fd8370a0463bea42f0c468533a361d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 8 Nov 2020 18:01:33 -0800 Subject: [PATCH 4370/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6b6ff8b9-6865-40cd-b7f0-19aff43805da PiperOrigin-RevId: 341321602 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a46e8b12600..c62115b9e22 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0827a5c69b28a71332a64afaf8cb7f1589cf4214fb0fb07cdcf5b6a3b599b496", - git_commit = "97a396ac4b52e681395bc3f8ea5e3519e6290e5d", + sha256 = "bd62c29264939438a4fdc923760db69400b776daa0ca6fb107bf7a50505b647a", + git_commit = "0126b15fb9d0372f743636f0645c13ce110a14da", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4b86d214da22a2329f2b85119fda88c7257fbdfa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 9 Nov 2020 00:01:55 -0800 Subject: [PATCH 4371/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/18e32e5b-4372-4b36-b5c1-b3a5ed0da9b7 PiperOrigin-RevId: 341350384 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c62115b9e22..d42d2b89d85 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bd62c29264939438a4fdc923760db69400b776daa0ca6fb107bf7a50505b647a", - git_commit = "0126b15fb9d0372f743636f0645c13ce110a14da", + sha256 = "af0e5cf65a96f9a26dfeeb0784ec72a2d777063f335f6f16b8e125546c5a8073", + git_commit = "c914621376d1b2105daf7f77a330fd85c02540bc", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 004c8e4e53897d98e3ef518133b0b76bdbff408f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 9 Nov 2020 06:01:29 -0800 Subject: [PATCH 4372/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1c29027a-3f9a-4b93-b904-b5e72e2c9f78 PiperOrigin-RevId: 341390134 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d42d2b89d85..4c15a2af3a7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "af0e5cf65a96f9a26dfeeb0784ec72a2d777063f335f6f16b8e125546c5a8073", - git_commit = "c914621376d1b2105daf7f77a330fd85c02540bc", + sha256 = "a6dc7abc871b04eed6300aed86820b5fffe829955f237b707b42259ee7d9c7be", + git_commit = "cd24d4b3458896432e57e3d82888260f69d29ac6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From fb18c33323ca999e5ff917850fb0da072c36dd58 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 9 Nov 2020 12:01:32 -0800 Subject: [PATCH 4373/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b8e352bc-bae9-492d-9682-3b7077311271 PiperOrigin-RevId: 341455978 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4c15a2af3a7..637da35a9f8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a6dc7abc871b04eed6300aed86820b5fffe829955f237b707b42259ee7d9c7be", - git_commit = "cd24d4b3458896432e57e3d82888260f69d29ac6", + sha256 = "df332b5f174d9e759dbbad95d6fbdebe4d64d95cf547abdd0b7e1fea4398760c", + git_commit = "55a311cb735689a431c6aa9a6c765c5c5c034ede", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a53f4a8e390f0b7da1fce2760af9167cd88c41c2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 9 Nov 2020 18:01:55 -0800 Subject: [PATCH 4374/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/265bb860-fb74-4b8b-8bf6-eafeddfcc5ed PiperOrigin-RevId: 341523681 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 637da35a9f8..a8e0951133c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "df332b5f174d9e759dbbad95d6fbdebe4d64d95cf547abdd0b7e1fea4398760c", - git_commit = "55a311cb735689a431c6aa9a6c765c5c5c034ede", + sha256 = "aab5b7797d7fe3334746b73caffc9e185863ebf56f9651cedfa5065448547302", + git_commit = "30b69242f8b64ebe7d30057dd6adcd519ea0ed9f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 64372d0ed3bd4eae3a4c97312cae3d777921a22a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 10 Nov 2020 00:01:33 -0800 Subject: [PATCH 4375/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a3389582-03a2-4a35-ad0a-174580e408da PiperOrigin-RevId: 341563775 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a8e0951133c..46074c9de11 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "aab5b7797d7fe3334746b73caffc9e185863ebf56f9651cedfa5065448547302", - git_commit = "30b69242f8b64ebe7d30057dd6adcd519ea0ed9f", + sha256 = "2aac6c2802dbf9a878c45b252ea9dba1906d7f1c78530c2a953be388da686409", + git_commit = "f2c163919f51657ec0684bf415b3821af1afdc4f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From af665627b8152d4c62d207a97c6e712cb2e9a120 Mon Sep 17 00:00:00 2001 From: Terry Heo Date: Tue, 10 Nov 2020 01:54:31 -0800 Subject: [PATCH 4376/8103] Fix BM_MobileNet benchmark Update input type and name for MobileNet benchmark. PiperOrigin-RevId: 341576645 --- .../servables/tensorflow/tflite_session_test.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc index 57390110b18..ca41f4658d3 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc @@ -499,14 +499,14 @@ void BM_MobileNet(benchmark::State& state) { TfLiteSession::Create(std::move(model_bytes), &sess, &signatures)); session = sess.release(); } - std::vector x_data(1 * 224 * 224 * 3, 1); - Tensor x = test::AsTensor(x_data, TensorShape({1, 224, 224, 3})); + std::vector x_data(1 * 224 * 224 * 3, 1); + Tensor x = test::AsTensor(x_data, TensorShape({1, 224, 224, 3})); std::vector outputs; testing::UseRealTime(); for (auto _ : state) { outputs.clear(); TF_ASSERT_OK(session->Run( - {{"x:0", x}}, {"MobilenetV1/Predictions/Reshape_1"}, {}, &outputs)); + {{"input", x}}, {"MobilenetV1/Predictions/Reshape_1"}, {}, &outputs)); } } BENCHMARK(BM_MobileNet)->ThreadRange(1, 64); From 779e5240b9c4f404211023704594d25f9801de35 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 10 Nov 2020 06:01:44 -0800 Subject: [PATCH 4377/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/159dc82d-b80e-4db2-9e05-b3b04ada870e PiperOrigin-RevId: 341603487 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 46074c9de11..ac981e14e4a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2aac6c2802dbf9a878c45b252ea9dba1906d7f1c78530c2a953be388da686409", - git_commit = "f2c163919f51657ec0684bf415b3821af1afdc4f", + sha256 = "8a107a1ac536832fe007bb1cae37a081528406a137f4bd2bf46ef157df91bb24", + git_commit = "2c05a4a796a853f92df819b61792720df0859a38", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5f4bdbfc399c039678a7f3dc9c395ac846a533df Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 10 Nov 2020 12:01:32 -0800 Subject: [PATCH 4378/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/819bb2f5-1a22-465b-9875-befb97a32e46 PiperOrigin-RevId: 341668314 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ac981e14e4a..a5ac354dd1a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8a107a1ac536832fe007bb1cae37a081528406a137f4bd2bf46ef157df91bb24", - git_commit = "2c05a4a796a853f92df819b61792720df0859a38", + sha256 = "6259891b1eea49203df71f0b2f165f0d03e0da8ce27162a46df573a1e088b90c", + git_commit = "ad95899595cba5d6bc3e4936340b62ed7b7cea58", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 77d42bd450e093236f069c25213728c9fda258c2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 10 Nov 2020 18:01:28 -0800 Subject: [PATCH 4379/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8e9c8ef0-1687-4fbf-bbc4-30059de26008 PiperOrigin-RevId: 341736240 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a5ac354dd1a..16d8c42a70b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6259891b1eea49203df71f0b2f165f0d03e0da8ce27162a46df573a1e088b90c", - git_commit = "ad95899595cba5d6bc3e4936340b62ed7b7cea58", + sha256 = "bff4e1304c847d782090350a4146665154e56d946a714dc7e99fb1547a052c5a", + git_commit = "658b303f1756bc97e3faf4eb4a7b6d94ad121078", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6f25d83fbcdc10c62d4b255bdb7cefb8d2139d3e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 11 Nov 2020 00:01:48 -0800 Subject: [PATCH 4380/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6c7f85c2-6866-441f-a145-cebbd654a726 PiperOrigin-RevId: 341774563 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 16d8c42a70b..57bdbdfcc31 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bff4e1304c847d782090350a4146665154e56d946a714dc7e99fb1547a052c5a", - git_commit = "658b303f1756bc97e3faf4eb4a7b6d94ad121078", + sha256 = "b8733a0bccf5aaf4df555219e4a14c0ca58132d9d64701608c0d3ed7758324dc", + git_commit = "ee9115e96ee708344cbaeb80c46a3fd6481b532b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d50054efb36a520622a45e5a5c577230513253ab Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 11 Nov 2020 06:01:42 -0800 Subject: [PATCH 4381/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4fa16ad1-2ccf-4356-8b21-19054a83a685 PiperOrigin-RevId: 341814876 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 57bdbdfcc31..116ba9fea26 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b8733a0bccf5aaf4df555219e4a14c0ca58132d9d64701608c0d3ed7758324dc", - git_commit = "ee9115e96ee708344cbaeb80c46a3fd6481b532b", + sha256 = "209bbf68d89ae1a4d47b37e8918bf86f65bef007641203466ffee71feef27b40", + git_commit = "e7a139356239c05dcbade7d118e7d22b1a81873e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4660936b5a6153394a6d683fb1619b0732510869 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 11 Nov 2020 12:01:29 -0800 Subject: [PATCH 4382/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1171fbc0-3885-494c-a6b5-d5be521bdaa4 PiperOrigin-RevId: 341880161 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 116ba9fea26..6e3498206b9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "209bbf68d89ae1a4d47b37e8918bf86f65bef007641203466ffee71feef27b40", - git_commit = "e7a139356239c05dcbade7d118e7d22b1a81873e", + sha256 = "b9bcb8f035a43820fc7e75fd91b4c508d93daf51066a0aa23a0ba7e4c9e96c4e", + git_commit = "2de245e6eeb292083d8c43f85fac74957d8c24b4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c027e379e1a091e992ea9c63b142138f97a74ff3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 11 Nov 2020 18:01:25 -0800 Subject: [PATCH 4383/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1897b994-c993-4ef6-bb22-6acf2a902108 PiperOrigin-RevId: 341949684 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6e3498206b9..60847ef89af 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b9bcb8f035a43820fc7e75fd91b4c508d93daf51066a0aa23a0ba7e4c9e96c4e", - git_commit = "2de245e6eeb292083d8c43f85fac74957d8c24b4", + sha256 = "f1a87bfcbb4b2557a03557f698527a44144fdf8a496e73a9c1f4c2712903bb94", + git_commit = "7ac4c1f85e3013e1e18197c251a879c9f90f9e15", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c4d430906aad17d0db9cef945c79596be3ef0029 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 12 Nov 2020 00:01:43 -0800 Subject: [PATCH 4384/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f5cd942d-b26f-46db-9075-d35f504f003f PiperOrigin-RevId: 341990556 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 60847ef89af..6ebe5a63ad1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f1a87bfcbb4b2557a03557f698527a44144fdf8a496e73a9c1f4c2712903bb94", - git_commit = "7ac4c1f85e3013e1e18197c251a879c9f90f9e15", + sha256 = "85e0fc9c94bd14eaf0950048e39f9370573656e0b8a1631add681811a47647af", + git_commit = "4fee5e9fa5a6efe1180f9c3e108083ecf9fae93a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f3c5f21b130e385cd3376c9540a01aaca2936e78 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 12 Nov 2020 06:01:37 -0800 Subject: [PATCH 4385/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ea8b1bf0-aeb2-44ce-9087-2ff5e851d4b0 PiperOrigin-RevId: 342031857 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6ebe5a63ad1..583f5d30f62 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "85e0fc9c94bd14eaf0950048e39f9370573656e0b8a1631add681811a47647af", - git_commit = "4fee5e9fa5a6efe1180f9c3e108083ecf9fae93a", + sha256 = "77803cac7408ef0246585f1b04a736a7f37584c2e568977bcdb1c59b24a80ea2", + git_commit = "bd41392156fb955bafc859e1ca6333c037559afd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f1009eb0e6bdae2e35dbfb9f4ad7270e74705e2e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 12 Nov 2020 08:55:26 -0800 Subject: [PATCH 4386/8103] Add JSPB BUILD targets for inference and example proto files. PiperOrigin-RevId: 342058009 --- tensorflow_serving/apis/BUILD | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tensorflow_serving/apis/BUILD b/tensorflow_serving/apis/BUILD index e2fd7a675b2..f7b32aac83e 100644 --- a/tensorflow_serving/apis/BUILD +++ b/tensorflow_serving/apis/BUILD @@ -1,9 +1,6 @@ # Description: Tensorflow Serving APIs. -load("//tensorflow_serving:serving.bzl", "serving_proto_library") -load("//tensorflow_serving:serving.bzl", "serving_proto_library_py") -load("//tensorflow_serving:serving.bzl", "serving_go_grpc_library") -load("//tensorflow_serving:serving.bzl", "serving_tensorflow_proto_dep") +load("//tensorflow_serving:serving.bzl", "serving_go_grpc_library", "serving_proto_library", "serving_proto_library_py", "serving_tensorflow_proto_dep") load("@org_tensorflow//tensorflow/core/platform:build_config.bzl", "tf_jspb_proto_library", "tf_pyclif_proto_library") package( @@ -336,6 +333,11 @@ tf_pyclif_proto_library( proto_srcfile = "inference.proto", ) +tf_jspb_proto_library( + name = "inference_jspb_proto", + deps = [":inference_proto"], +) + serving_proto_library( name = "regression_proto", srcs = ["regression.proto"], From 9a1423a8e7f6962ba524e680dabf32115e9844d6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 12 Nov 2020 12:01:26 -0800 Subject: [PATCH 4387/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/52c17270-2c4c-44a4-b9de-026d7fbb1e8a PiperOrigin-RevId: 342099908 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 583f5d30f62..0eb9d0af91b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "77803cac7408ef0246585f1b04a736a7f37584c2e568977bcdb1c59b24a80ea2", - git_commit = "bd41392156fb955bafc859e1ca6333c037559afd", + sha256 = "ed530753ce17316eb67cf63eb6363fc7d0704920996954203764361f938c66d7", + git_commit = "68f4b8463799601f33f9cc3bb77e2551eaa7c878", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a05d5245e6a9132444c7b2cf989f58ceb08527f6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 12 Nov 2020 12:09:09 -0800 Subject: [PATCH 4388/8103] Internal Change. PiperOrigin-RevId: 342102165 --- tensorflow_serving/model_servers/BUILD | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 9f04eafec83..f7de17e0251 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -17,7 +17,10 @@ licenses(["notice"]) # Apache 2.0 # vanilla TensorFlow ModelServer without any other modifications. Exclusively # for adding custom TensorFlow ops. Does not grant access to private headers # or other implementation details. -package_group(name = "tensorflow_model_server_custom_op_clients") +package_group( + name = "tensorflow_model_server_custom_op_clients", + packages = ["//cloud/ai/documentai/..."], +) package_group( name = "testing", From 2de23c8084e5fc15e47c2a6c7ac3fb45f21a569e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 12 Nov 2020 18:01:44 -0800 Subject: [PATCH 4389/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a10ff63b-8705-4de8-8c73-cb75a071f33c PiperOrigin-RevId: 342171743 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0eb9d0af91b..08b06bb512b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ed530753ce17316eb67cf63eb6363fc7d0704920996954203764361f938c66d7", - git_commit = "68f4b8463799601f33f9cc3bb77e2551eaa7c878", + sha256 = "98bf7250805eb3a254051269a6355ee79d177c353288142507926b67765b72c0", + git_commit = "ded40f9b8f2b99f683d3919a55f93ee4ae5de808", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a2c020ae64e982f1c3170985c6aeaea9208a75af Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 13 Nov 2020 00:02:17 -0800 Subject: [PATCH 4390/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4100684c-d19f-4c30-9336-495c399266b0 PiperOrigin-RevId: 342210283 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 08b06bb512b..ed5f8521db8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "98bf7250805eb3a254051269a6355ee79d177c353288142507926b67765b72c0", - git_commit = "ded40f9b8f2b99f683d3919a55f93ee4ae5de808", + sha256 = "f3d2dd71fbcf280bad89a6bb57a2674b3f9b5a7565c28ce64e99b0dfb8cedcbf", + git_commit = "4dcf6a4ccd6e4f83ef9cf3c6b14ec1b9d48ee9b0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5b0c111988568a0ba655531453f941f471727264 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 13 Nov 2020 06:01:25 -0800 Subject: [PATCH 4391/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/cfe68b56-3186-485a-ae69-8b986a4f873b PiperOrigin-RevId: 342247881 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ed5f8521db8..f84a15a1d40 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f3d2dd71fbcf280bad89a6bb57a2674b3f9b5a7565c28ce64e99b0dfb8cedcbf", - git_commit = "4dcf6a4ccd6e4f83ef9cf3c6b14ec1b9d48ee9b0", + sha256 = "e58c7416c0062aedd04be89a093312a49d5162307ffd2e705c4a8b0e7620100d", + git_commit = "8a1bb87da5b8dcec1d7f0bf8baa43565c095830e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e11635160a9fa448cddb814bd16fbf84ceb5b93d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 13 Nov 2020 12:01:33 -0800 Subject: [PATCH 4392/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f398e163-f992-4032-92df-6eca2ef1b586 PiperOrigin-RevId: 342310149 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f84a15a1d40..19b63afdd8d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e58c7416c0062aedd04be89a093312a49d5162307ffd2e705c4a8b0e7620100d", - git_commit = "8a1bb87da5b8dcec1d7f0bf8baa43565c095830e", + sha256 = "74b0b26d6ad1cc13633c768e8ac80d2616ca632b0f3b93b77ca3f3d2718e9d75", + git_commit = "691a4e830f15a30c961a7106e4d3f1645315f04f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 54caae58eebbcc272e36e4d166e0684f95e42140 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 14 Nov 2020 00:01:45 -0800 Subject: [PATCH 4393/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d59e8350-448c-4a03-831c-4bb6c592becc PiperOrigin-RevId: 342398684 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 19b63afdd8d..51a8062882e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "74b0b26d6ad1cc13633c768e8ac80d2616ca632b0f3b93b77ca3f3d2718e9d75", - git_commit = "691a4e830f15a30c961a7106e4d3f1645315f04f", + sha256 = "e198f5795a8d80dfdcc9d73ea685aea5bd2429981636e2af48bf11da527d2ee1", + git_commit = "befea92a3d74a010791eb845267f03c54315d660", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From bf546df976e7b120f51c9d982386293823331b58 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 14 Nov 2020 06:01:38 -0800 Subject: [PATCH 4394/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0d649d11-d1d4-4a6a-b24c-7e78d7278c8c PiperOrigin-RevId: 342419500 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 51a8062882e..9d2d34ba219 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e198f5795a8d80dfdcc9d73ea685aea5bd2429981636e2af48bf11da527d2ee1", - git_commit = "befea92a3d74a010791eb845267f03c54315d660", + sha256 = "1fd831317ff5d0dbc169d0339a9138233b7d58a65cc0a262be96c028c80d688f", + git_commit = "ce7fa94553f651d6fdc0a652de26a157cf9a0ad7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2faafb0bb8adf8eebb5a20aa61621b1075f6ed09 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 14 Nov 2020 12:01:25 -0800 Subject: [PATCH 4395/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3b943061-b6d0-4140-b7c2-93ef757fdca6 PiperOrigin-RevId: 342440425 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9d2d34ba219..26e6c1f5930 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1fd831317ff5d0dbc169d0339a9138233b7d58a65cc0a262be96c028c80d688f", - git_commit = "ce7fa94553f651d6fdc0a652de26a157cf9a0ad7", + sha256 = "4c30283897358776184b0ab1f21c35c61b3e67a75f9d1508da9349d2cba7868b", + git_commit = "2894fd21c01a020c45dd928b12a74f8c6f17f653", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From fb03f7d537fbad62733cf1c0fa6a7fe9c4ce4b49 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 14 Nov 2020 18:01:25 -0800 Subject: [PATCH 4396/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a44dc591-cf23-40f6-b8fd-9131123d07c7 PiperOrigin-RevId: 342462497 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 26e6c1f5930..64b6b20fc78 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4c30283897358776184b0ab1f21c35c61b3e67a75f9d1508da9349d2cba7868b", - git_commit = "2894fd21c01a020c45dd928b12a74f8c6f17f653", + sha256 = "3ea960210d0e48fa6646071a70d73aedfe08b03fb858a019cef053821578ac10", + git_commit = "cdd740738d09d96574885a8838d0e1015759337a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1705bddc453c8a7212906db4c8dc37e21253860b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 15 Nov 2020 06:01:31 -0800 Subject: [PATCH 4397/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1444b0c0-65c4-44a2-99a8-4895f920a893 PiperOrigin-RevId: 342505133 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 64b6b20fc78..7a74fc9ea77 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3ea960210d0e48fa6646071a70d73aedfe08b03fb858a019cef053821578ac10", - git_commit = "cdd740738d09d96574885a8838d0e1015759337a", + sha256 = "978287622c6f53eb87ab908523615ddf63bf7dadd2818c00b9e96fd5faa4fa70", + git_commit = "ce0d0a458c87c8c3c541d56bfbea85455e4c7003", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4a5bfd8b557e3fc0154b7ae9af1580dcdf5f4e14 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 15 Nov 2020 18:01:18 -0800 Subject: [PATCH 4398/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bfabca23-c087-451f-bde6-cefc5376d3ba PiperOrigin-RevId: 342549581 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7a74fc9ea77..a0300b46d90 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "978287622c6f53eb87ab908523615ddf63bf7dadd2818c00b9e96fd5faa4fa70", - git_commit = "ce0d0a458c87c8c3c541d56bfbea85455e4c7003", + sha256 = "758197f1b464f600f024f6358c26181c7b4139c3ce13b521be3870fc8b28886b", + git_commit = "fa25e04b1f5eaad6b7cb771cc6035d535466c516", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 27899a257902bd78266bc7e23d4831e8a7d9c33a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 16 Nov 2020 06:01:34 -0800 Subject: [PATCH 4399/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bb98bb59-1ead-4a78-af39-0da122cda878 PiperOrigin-RevId: 342619404 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a0300b46d90..bd1dc39d30f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "758197f1b464f600f024f6358c26181c7b4139c3ce13b521be3870fc8b28886b", - git_commit = "fa25e04b1f5eaad6b7cb771cc6035d535466c516", + sha256 = "f291b229fe4ae31eacf011d39bcb034223305cadcaf6b5af2c1da319748e86c0", + git_commit = "6468a1d17ae43c161e836bd3d1af081e8e44ef0d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 772cd9d4e82deb0b6a97e5919bee980a1fb4ae7a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 16 Nov 2020 12:01:26 -0800 Subject: [PATCH 4400/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5152e9ef-405c-4f55-88f4-744edd5d3322 PiperOrigin-RevId: 342688369 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bd1dc39d30f..45d36811a0c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f291b229fe4ae31eacf011d39bcb034223305cadcaf6b5af2c1da319748e86c0", - git_commit = "6468a1d17ae43c161e836bd3d1af081e8e44ef0d", + sha256 = "ba30bd799a638bfcd0cbb9b70f9f7456e66ad1f456f8dd402d2a0a4bfbe14987", + git_commit = "ce25634e3ec6c79c89645e4c52b004eabb869cb8", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 06714a533b617c57131c093e4397c392a31087e5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 16 Nov 2020 18:01:45 -0800 Subject: [PATCH 4401/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d4dee36e-aa86-45cd-8ef9-af5dfe5edd5b PiperOrigin-RevId: 342761887 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 45d36811a0c..4f877cc5117 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ba30bd799a638bfcd0cbb9b70f9f7456e66ad1f456f8dd402d2a0a4bfbe14987", - git_commit = "ce25634e3ec6c79c89645e4c52b004eabb869cb8", + sha256 = "06f06de2a52b5a25251dc8a54d40cfeb4f1cf633a861550fbc0114702425db31", + git_commit = "d652afc0d8c354c06059630af17492168e3858ef", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From bff26c71a38aef5956344e4641ff3cd33e8f3872 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 17 Nov 2020 00:01:22 -0800 Subject: [PATCH 4402/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fd657314-2676-4500-97d6-5bd64ebb9423 PiperOrigin-RevId: 342804798 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4f877cc5117..4460b87aaf7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "06f06de2a52b5a25251dc8a54d40cfeb4f1cf633a861550fbc0114702425db31", - git_commit = "d652afc0d8c354c06059630af17492168e3858ef", + sha256 = "cf1f5fe1d6942d37c551c79713c322eae00223fddfd94d4bee31d23c70e4b412", + git_commit = "10bad819448edb1c8378d765a55bcd13b2213015", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c06d3fadb5dda928b5c5fe819176a57738833a57 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 17 Nov 2020 06:01:30 -0800 Subject: [PATCH 4403/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/94280170-4d98-49b7-976e-6b78ad61e1d0 PiperOrigin-RevId: 342846656 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4460b87aaf7..b6440dc7e38 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cf1f5fe1d6942d37c551c79713c322eae00223fddfd94d4bee31d23c70e4b412", - git_commit = "10bad819448edb1c8378d765a55bcd13b2213015", + sha256 = "4ba32785380c1fc8d7a042615ea03b951b36b11cd8e8b979a700c8fc932c943d", + git_commit = "df86a9308a1112a8fd6cd8369a24ec84fa6cd125", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3884187cb9253bb9baa240b2009cfc6d4847b9f9 Mon Sep 17 00:00:00 2001 From: Frederic Rechtenstein Date: Tue, 17 Nov 2020 08:37:56 -0800 Subject: [PATCH 4404/8103] Fall back to legacy TFLite tensor naming when parsing signature defs in TFLiteSession. The previous behaviour always used the legacy tensor naming (striped : suffix), which may cause issues with models converted with the new converter. This change makes TFLiteSession try to fall back to legacy naming only when a signature def references an unknown tensor. PiperOrigin-RevId: 342869797 --- tensorflow_serving/servables/tensorflow/BUILD | 2 + .../servables/tensorflow/tflite_session.cc | 61 +++++--- .../tensorflow/tflite_session_test.cc | 146 ++++++++++++++++-- 3 files changed, 179 insertions(+), 30 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index e9a4cdbc700..ef4c54ccd4d 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -368,11 +368,13 @@ cc_test( data = [ "//tensorflow_serving/servables/tensorflow/testdata:mobilenet_v1_quant_tflite", "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_tflite", + "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_tflite_with_sigdef", ], deps = [ ":tflite_session_lib", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", + "@com_google_protobuf//:protobuf", "@flatbuffers", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", "@org_tensorflow//tensorflow/core:lib", diff --git a/tensorflow_serving/servables/tensorflow/tflite_session.cc b/tensorflow_serving/servables/tensorflow/tflite_session.cc index b8548a31e8e..a1467cdb195 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session.cc @@ -73,14 +73,32 @@ Status TfLiteTypeToTfType(TfLiteType tflite_type, DataType* type) { return Status::OK(); } -std::string CanonicalTfLiteTensorName(const string& tf_name) { +std::string TfToTfLiteLegacyTensorName(const string& tf_name) { // TF variable names have ':0' suffix, early versions of the TF Lite converter - // used to strip this suffix. Enforce this behavior for compatibility. + // used to strip this suffix. std::pair name_index = absl::StrSplit(tf_name, absl::MaxSplits(':', 1)); return std::string(name_index.first); } +// Checks that an input/output tensor actually exists. If not, attempts to +// update the tensor name with legacy TFLite tensor naming. +Status FixTfLiteTensorName(const std::map& tensor_name_map, + string& tensor_name) { + if (tensor_name_map.find(tensor_name) != tensor_name_map.end()) { + return Status::OK(); + } + + // Try to update with the legacy tflite tensor name. + const string& legacy_tflite_name = TfToTfLiteLegacyTensorName(tensor_name); + if (tensor_name_map.find(legacy_tflite_name) != tensor_name_map.end()) { + tensor_name = legacy_tflite_name; + return Status::OK(); + } + + return errors::Internal("Unknown tensor '", tensor_name, "'."); +} + Status TfLiteTensorToTensorInfo(const TfLiteTensor* tflite_tensor, TensorInfo* info) { DataType tf_type; @@ -244,11 +262,11 @@ Status TfLiteSession::Create(string&& buffer, std::map input_tensor_to_index; std::map output_tensor_to_index; for (const auto& info : inputs) { - const string& tflite_tensor_name = CanonicalTfLiteTensorName(info.first); + const string& tflite_tensor_name = info.first; input_tensor_to_index[tflite_tensor_name] = info.second.second; } for (const auto& info : outputs) { - const string& tflite_tensor_name = CanonicalTfLiteTensorName(info.first); + const string& tflite_tensor_name = info.first; output_tensor_to_index[tflite_tensor_name] = info.second.second; } @@ -265,17 +283,25 @@ Status TfLiteSession::Create(string&& buffer, signatures->clear(); if (has_lite_signature_def) { - // Ensure that canonical TFLite tensor names are used in signature defs + // Check that input/output tensors in the signature defs refer to existing + // tensors. + // If not found, try to match with legacy TFLite name (without suffix). for (const auto& signature_item : signature_defs) { SignatureDef* tflite_signature = &(*signatures)[signature_item.first]; tflite_signature->CopyFrom(signature_item.second); for (auto& input : *tflite_signature->mutable_inputs()) { TensorInfo* tensor_info = &input.second; - tensor_info->set_name(CanonicalTfLiteTensorName(tensor_info->name())); + TF_RETURN_WITH_CONTEXT_IF_ERROR( + FixTfLiteTensorName(input_tensor_to_index, + *tensor_info->mutable_name()), + "Signature input ", input.first, " references an unknown tensor"); } for (auto& output : *tflite_signature->mutable_outputs()) { TensorInfo* tensor_info = &output.second; - tensor_info->set_name(CanonicalTfLiteTensorName(tensor_info->name())); + TF_RETURN_WITH_CONTEXT_IF_ERROR( + FixTfLiteTensorName(output_tensor_to_index, + *tensor_info->mutable_name()), + "Signature output ", output.first, " references an unknown tensor"); } } } else { @@ -284,11 +310,11 @@ Status TfLiteSession::Create(string&& buffer, LOG(WARNING) << "No signature def found in TFLite model. Generating one."; SignatureDef* sigdef = &(*signatures)[kDefaultServingSignatureDefKey]; for (const auto& info : inputs) { - string tflite_tensor_name = CanonicalTfLiteTensorName(info.first); + string tflite_tensor_name = TfToTfLiteLegacyTensorName(info.first); (*sigdef->mutable_inputs())[tflite_tensor_name] = info.second.first; } for (const auto& info : outputs) { - string tflite_tensor_name = CanonicalTfLiteTensorName(info.first); + string tflite_tensor_name = TfToTfLiteLegacyTensorName(info.first); (*sigdef->mutable_outputs())[tflite_tensor_name] = info.second.first; } sigdef->set_method_name(kPredictMethodName); @@ -342,10 +368,10 @@ Status TfLiteSession::Run( // happen in-parallel. absl::MutexLock lock(&mutex_); for (const auto& input : inputs) { - const string& name = CanonicalTfLiteTensorName(input.first); - if (input_tensor_to_index_.find(name) == input_tensor_to_index_.end()) { - return errors::InvalidArgument("Missing input TFLite tensor: ", name); - } + string name = input.first; + TF_RETURN_WITH_CONTEXT_IF_ERROR( + FixTfLiteTensorName(input_tensor_to_index_, name), + "Missing input TFLite tensor: ", name); const int index = input_tensor_to_index_.at(name); TF_RETURN_IF_ERROR(FillTfLiteTensorFromInput(name, input.second, interpreter_.get(), index)); @@ -356,11 +382,10 @@ Status TfLiteSession::Run( } outputs->clear(); - for (const auto& tfname : output_tensor_names) { - const string& name = CanonicalTfLiteTensorName(tfname); - if (output_tensor_to_index_.find(name) == output_tensor_to_index_.end()) { - return errors::InvalidArgument("Missing output TFLite tensor: ", name); - } + for (string name : output_tensor_names) { + TF_RETURN_WITH_CONTEXT_IF_ERROR( + FixTfLiteTensorName(output_tensor_to_index_, name), + "Missing output TFLite tensor: ", name); const int index = output_tensor_to_index_.at(name); auto* tflite_tensor = interpreter_->tensor(index); if (tflite_tensor == nullptr) { diff --git a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc index ca41f4658d3..387721421eb 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc @@ -30,6 +30,7 @@ limitations under the License. #include "tensorflow/core/lib/core/status_test_util.h" #include "tensorflow/core/platform/env.h" #include "tensorflow/core/platform/logging.h" +#include "tensorflow/core/platform/protobuf.h" #include "tensorflow/core/platform/test_benchmark.h" #include "tensorflow/core/platform/threadpool_options.h" #include "tensorflow/core/protobuf/config.pb.h" @@ -44,12 +45,17 @@ namespace { using ::testing::_; using ::testing::Pair; +using ::testing::SizeIs; using ::testing::UnorderedElementsAre; constexpr char kTestModel[] = "/servables/tensorflow/testdata/saved_model_half_plus_two_tflite/00000123/" "model.tflite"; +constexpr char kTestModelWithSigdef[] = + "/servables/tensorflow/testdata/" + "saved_model_half_plus_two_tflite_with_sigdef/00000123/model.tflite"; + constexpr char kMobileNetModel[] = "/servables/tensorflow/testdata/mobilenet_v1_quant_tflite/00000123/" "model.tflite"; @@ -110,6 +116,69 @@ TEST(TfLiteSession, BasicTest) { } } +TEST(TfLiteSession, ModelFromLegacyConverterWithSigdef) { + // A model converted with TF v1 converter, having a signature def. + // The signature def references an input tensor named "tflite_input:0", but + // the converter striped the tensor name to "tflite_input". + string model_bytes; + TF_ASSERT_OK(ReadFileToString(tensorflow::Env::Default(), + test_util::TestSrcDirPath(kTestModelWithSigdef), + &model_bytes)); + + ::google::protobuf::Map signatures; + std::unique_ptr session; + TF_ASSERT_OK( + TfLiteSession::Create(std::move(model_bytes), &session, &signatures)); + EXPECT_EQ(signatures.size(), 1); + EXPECT_EQ(signatures.begin()->first, "serving_default"); + // While, in the model, the tensor name of input "x" is "tflite_input:0". in + // the output signature the name must have falled back to "tflite_input". + EXPECT_THAT(signatures.begin()->second, test_util::EqualsProto(R"( + inputs { + key: "x" + value { + name: "tflite_input" + dtype: DT_FLOAT + tensor_shape { + dim { size: 1 } + dim { size: 1 } + } + } + } + outputs { + key: "y" + value { + name: "y" + dtype: DT_FLOAT + tensor_shape { + dim { size: 1 } + dim { size: 1 } + } + } + } + method_name: "tensorflow/serving/predict" + )")); + + Tensor input = test::AsTensor({1.0, 2.0, 3.0}, TensorShape({3})); + { + // Use TF Lite tensor names. + std::vector outputs; + TF_EXPECT_OK(session->Run({{"tflite_input", input}}, {"y"}, {}, &outputs)); + ASSERT_EQ(outputs.size(), 1); + test::ExpectTensorEqual( + outputs[0], test::AsTensor({2.5, 3, 3.5}, TensorShape({3}))); + } + { + // Use TF tensor names (with `:0` suffix). + std::vector outputs; + TF_EXPECT_OK( + session->Run({{"tflite_input:0", input}}, {"y:0"}, {}, &outputs)); + ASSERT_EQ(outputs.size(), 1); + test::ExpectTensorEqual( + outputs[0], test::AsTensor({2.5, 3, 3.5}, TensorShape({3}))); + } +} + constexpr char kTestModelInputList[] = "list"; constexpr char kTestModelInputShape[] = "shape"; constexpr char kTestModelOutput[] = "output"; @@ -146,16 +215,9 @@ tensorflow::DataType ToTfTensorType(tflite::TensorType tflite_type) { } } -// Returns a serialized FlatBuffer tflite model. -// -// The model has two inputs (kTestModelInputList|Shape) and one output -// kTestModelOutput. The output is list that is reshaped to shape via -// tf.reshape operator. -// -// Elements of list are expected to be of `tensor_type` type. `use_flex_op` -// sets up the model to use the `Reshape` *flex* op as opposed to using the -// builtin `Reshape` op from TF Lite. -string BuildTestModel(tflite::TensorType tensor_type, bool use_flex_op, +string BuildTestModel(tflite::TensorType tensor_type, + const string& input1_tensor_name, + const string& input2_tensor_name, bool use_flex_op, std::map* signature_def_map) { std::vector inputs; std::vector outputs; @@ -169,14 +231,14 @@ string BuildTestModel(tflite::TensorType tensor_type, bool use_flex_op, inputs.push_back(tensors.size()); tensors.push_back(CreateTensor(builder, builder.CreateVector({1}), tensor_type, /*buffer=*/0, - builder.CreateString(kTestModelInputList), + builder.CreateString(input1_tensor_name), /*quantization=*/0, /*is_variable=*/false)); // Input shape: 1D tensor for shape. inputs.push_back(tensors.size()); tensors.push_back(CreateTensor(builder, builder.CreateVector({1}), tflite::TensorType_INT32, /*buffer=*/0, - builder.CreateString(kTestModelInputShape), + builder.CreateString(input2_tensor_name), /*quantization=*/0, /*is_variable=*/false)); // Output: Reshaped list to shape. @@ -247,6 +309,21 @@ string BuildTestModel(tflite::TensorType tensor_type, bool use_flex_op, builder.GetSize()); } +// Returns a serialized FlatBuffer tflite model. +// +// The model has two inputs (kTestModelInputList|Shape) and one output +// kTestModelOutput. The output is list that is reshaped to shape via +// tf.reshape operator. +// +// Elements of list are expected to be of `tensor_type` type. `use_flex_op` +// sets up the model to use the `Reshape` *flex* op as opposed to using the +// builtin `Reshape` op from TF Lite. +string BuildTestModel(tflite::TensorType tensor_type, bool use_flex_op, + std::map* signature_def_map) { + return BuildTestModel(tensor_type, kTestModelInputList, kTestModelInputShape, + use_flex_op, signature_def_map); +} + TEST(TfLiteSession, ProcessStrings) { auto model_signature_def_map = GetTestSignatureDefMap(); string model_bytes = @@ -395,6 +472,51 @@ TEST(TfLiteSession, MultipleSignatureDef) { EXPECT_EQ(result_signature2.method_name(), kClassifyMethodName); } +TEST(TfLiteSession, SignatureDefWithCommonTensorPrefix) { + // Attempts to normalize behaviors of different TFLite converter versions + // (which at one point striped the : suffix from tensor names), + // must not create name collisions when signatures have tensors with the same + // prefix. + SignatureDef signature; + protobuf::TextFormat::ParseFromString(R"( + inputs { + key: "x0" + value { + name: "myTensor:0" + dtype: DT_FLOAT + tensor_shape { dim { size: 1 } } + } + } + inputs { + key: "x1" + value { + name: "myTensor:1" + dtype: DT_FLOAT + tensor_shape { dim { size: 1 } } + } + } + method_name: "tensorflow/serving/predict" + )", + &signature); + std::map signature_def_map = { + {kDefaultServingSignatureDefKey, signature}}; + string model_bytes = + BuildTestModel(tflite::TensorType_STRING, "myTensor:0", "myTensor:1", + /*use_flex_op=*/false, &signature_def_map); + ::google::protobuf::Map signatures; + std::unique_ptr session; + TF_ASSERT_OK( + TfLiteSession::Create(std::move(model_bytes), &session, &signatures)); + + // Inputs must still be processed as two different tensors. + auto outputSigdef = signatures[kDefaultServingSignatureDefKey]; + std::set tensorNamesSet; + for (const auto& input : outputSigdef.inputs()) { + tensorNamesSet.insert(input.second.name()); + } + EXPECT_THAT(tensorNamesSet, SizeIs(2)); +} + TEST(TfLiteSession, SimpleSignatureDefAndRun) { auto model_signature_def_map = GetTestSignatureDefMap(); string model_bytes = From d1c7e6d938590eac60720e2b0df5187fc57f28ad Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 17 Nov 2020 12:01:25 -0800 Subject: [PATCH 4405/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/63771c7c-33a9-4ed7-a222-48dc383c9611 PiperOrigin-RevId: 342914722 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b6440dc7e38..e3c2688b926 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4ba32785380c1fc8d7a042615ea03b951b36b11cd8e8b979a700c8fc932c943d", - git_commit = "df86a9308a1112a8fd6cd8369a24ec84fa6cd125", + sha256 = "6cd1fccb302449526cd21900038310c044ec3c1284ee3eae7e3f27e1b21f3656", + git_commit = "05d8bfb1bbc62b7d34f84a7a8a29b5c525651d15", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7623909e92e0d3db6a1f440324394b02252f4210 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 17 Nov 2020 18:01:30 -0800 Subject: [PATCH 4406/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/58e785f6-0031-46b5-acd1-3009f9871339 PiperOrigin-RevId: 342986038 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e3c2688b926..43d2c025493 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6cd1fccb302449526cd21900038310c044ec3c1284ee3eae7e3f27e1b21f3656", - git_commit = "05d8bfb1bbc62b7d34f84a7a8a29b5c525651d15", + sha256 = "56362e0177533a4dfc1c1ad5cdaaf838a0c972593d40e1374295ee28ca3a38ef", + git_commit = "2fbed3b58ed13a9040667a2b174fda1b014db743", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From fb55098ff766b00e96bcdeb1bae35b1a3704a606 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 18 Nov 2020 00:01:31 -0800 Subject: [PATCH 4407/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/91a5dd5d-85e6-458e-88fa-e299824f9254 PiperOrigin-RevId: 343024525 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 43d2c025493..145261adbc4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "56362e0177533a4dfc1c1ad5cdaaf838a0c972593d40e1374295ee28ca3a38ef", - git_commit = "2fbed3b58ed13a9040667a2b174fda1b014db743", + sha256 = "7f69e9be0b41deb90862c274270e930afa6f8aa30179510719755b6a7e73f3b1", + git_commit = "0510b26aa56012a6a51aefd21a27b8874d07d39e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c734de2f05da73ea8b6ae92527ab81e5220e301c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 18 Nov 2020 06:01:31 -0800 Subject: [PATCH 4408/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/db972e13-45f6-41aa-a888-a3e089b620d9 PiperOrigin-RevId: 343064069 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 145261adbc4..f5bd14dc2b4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7f69e9be0b41deb90862c274270e930afa6f8aa30179510719755b6a7e73f3b1", - git_commit = "0510b26aa56012a6a51aefd21a27b8874d07d39e", + sha256 = "47a4154cfa6f30987f2b32e6366a5627f1375f536112406c5299668d32a48f40", + git_commit = "6c14b7605a3e4544f964e92fffe220fd9cdaa6b6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 64741397709a936ddc6bfb507a4cac3b374693da Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 18 Nov 2020 12:01:15 -0800 Subject: [PATCH 4409/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/93bae16f-873a-4393-af10-4897ea167364 PiperOrigin-RevId: 343126969 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f5bd14dc2b4..492c3d62dfc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "47a4154cfa6f30987f2b32e6366a5627f1375f536112406c5299668d32a48f40", - git_commit = "6c14b7605a3e4544f964e92fffe220fd9cdaa6b6", + sha256 = "2e216e1906712fb43738d55388cdcd710e9325dc8df4e703df6d40b358608518", + git_commit = "856698be1fe9c624310fbcc131c002b15b3d0b12", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 81477b780ea5ac4c66fdd97b236d595cdbf80138 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 18 Nov 2020 18:01:35 -0800 Subject: [PATCH 4410/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c23e1462-21b5-4908-b10b-e7d6b327acc4 PiperOrigin-RevId: 343195910 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 492c3d62dfc..b79db8cc070 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2e216e1906712fb43738d55388cdcd710e9325dc8df4e703df6d40b358608518", - git_commit = "856698be1fe9c624310fbcc131c002b15b3d0b12", + sha256 = "ec807fa17bcfdc558663887be9b86276f7989b2e9f5b80fa10547f948ab179c8", + git_commit = "acdb07d156b6c653151c452d486dee7736189f28", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d9efa43a77e609260614d9633a3ee7c4cc3e2843 Mon Sep 17 00:00:00 2001 From: Terry Heo Date: Wed, 18 Nov 2020 20:39:58 -0800 Subject: [PATCH 4411/8103] Add TfLiteInterpreterPool to make concurrent use of TfliteSession better For TfliteSession, the number of interpreters in a pool can be configured by "num_tflite_interpreters" parameter. By default, it will have NumSchedulableCPUs(). PiperOrigin-RevId: 343213489 --- tensorflow_serving/model_servers/main.cc | 6 ++ tensorflow_serving/model_servers/server.cc | 2 + tensorflow_serving/model_servers/server.h | 1 + tensorflow_serving/servables/tensorflow/BUILD | 11 ++- .../tensorflow/saved_model_bundle_factory.cc | 12 +-- .../tensorflow/session_bundle_config.proto | 5 ++ .../tensorflow/tflite_interpreter_pool.cc | 89 +++++++++++++++++++ .../tensorflow/tflite_interpreter_pool.h | 78 ++++++++++++++++ .../servables/tensorflow/tflite_session.cc | 61 ++++++------- .../servables/tensorflow/tflite_session.h | 16 ++-- .../tensorflow/tflite_session_main.cc | 2 +- .../tensorflow/tflite_session_test.cc | 41 ++++++--- 12 files changed, 264 insertions(+), 60 deletions(-) create mode 100644 tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.cc create mode 100644 tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index 72071a7f1d8..721f16f88dc 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -195,6 +195,12 @@ int main(int argc, char** argv) { "model from `saved_model.pb` file. " "If no TensorFlow Lite model found, fallback to " "TensorFlow model."), + tensorflow::Flag( + "num_tflite_interpreters", &options.num_tflite_interpreters, + "EXPERIMENTAL; CAN BE REMOVED ANYTIME! Number of TFLite interpreters " + "in an interpreter pool of TfLiteSession. Typically there is one " + "TfLiteSession for each TF Lite model that is loaded. If not " + "set, will be auto set based on number of CPUs."), tensorflow::Flag( "enable_signature_method_name_check", &options.enable_signature_method_name_check, diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index b16aca7ca24..0a922adf840 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -273,6 +273,8 @@ Status Server::BuildAndStart(const Options& server_options) { server_options.remove_unused_fields_from_bundle_metagraph); session_bundle_config.set_prefer_tflite_model( server_options.prefer_tflite_model); + session_bundle_config.set_num_tflite_interpreters( + server_options.num_tflite_interpreters); options.platform_config_map = CreateTensorFlowPlatformConfigMap(session_bundle_config); } else { diff --git a/tensorflow_serving/model_servers/server.h b/tensorflow_serving/model_servers/server.h index 762cfebe6a6..bf2da51dbec 100644 --- a/tensorflow_serving/model_servers/server.h +++ b/tensorflow_serving/model_servers/server.h @@ -85,6 +85,7 @@ class Server { bool enforce_session_run_timeout = true; bool remove_unused_fields_from_bundle_metagraph = true; bool prefer_tflite_model = false; + tensorflow::int32 num_tflite_interpreters = port::NumSchedulableCPUs(); tensorflow::string thread_pool_factory_config_file; bool enable_signature_method_name_check = false; diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index ef4c54ccd4d..6c608fbc3a7 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -342,8 +342,14 @@ cc_test( cc_library( name = "tflite_session_lib", - srcs = ["tflite_session.cc"], - hdrs = ["tflite_session.h"], + srcs = [ + "tflite_interpreter_pool.cc", + "tflite_session.cc", + ], + hdrs = [ + "tflite_interpreter_pool.h", + "tflite_session.h", + ], deps = [ ":serving_session", "@com_google_absl//absl/base:core_headers", @@ -374,6 +380,7 @@ cc_test( ":tflite_session_lib", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", + "@com_google_absl//absl/flags:flag", "@com_google_protobuf//:protobuf", "@flatbuffers", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc index 4d4ad342029..9ed3153c836 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc @@ -63,7 +63,8 @@ Status ParseFixedInputTensors( // TODO(b/140959776): Move this upstream alongside `kSavedModelFilenamePb`. const char kTfLiteModelFilename[] = "model.tflite"; -Status LoadTfLiteModel(const string& model_dir, SavedModelBundle* bundle) { +Status LoadTfLiteModel(const string& model_dir, SavedModelBundle* bundle, + int num_interpreters) { std::unique_ptr session; const string& fname = io::JoinPath(model_dir, kTfLiteModelFilename); @@ -79,9 +80,9 @@ Status LoadTfLiteModel(const string& model_dir, SavedModelBundle* bundle) { TF_RETURN_IF_ERROR(file->Read(0, size, &sv, &model_bytes[0])); std::unique_ptr tflite_session; - TF_RETURN_IF_ERROR( - TfLiteSession::Create(std::move(model_bytes), &tflite_session, - bundle->meta_graph_def.mutable_signature_def())); + TF_RETURN_IF_ERROR(TfLiteSession::Create( + std::move(model_bytes), &tflite_session, + bundle->meta_graph_def.mutable_signature_def(), num_interpreters)); bundle->session = std::move(tflite_session); return Status::OK(); } @@ -145,7 +146,8 @@ Status SavedModelBundleFactory::InternalCreateSavedModelBundle( }(); if (config_.prefer_tflite_model() && TfLiteModelFound(path)) { - TF_RETURN_IF_ERROR(LoadTfLiteModel(path, bundle->get())); + TF_RETURN_IF_ERROR(LoadTfLiteModel(path, bundle->get(), + config_.num_tflite_interpreters())); } else { TF_RETURN_IF_ERROR(session_bundle::LoadSessionBundleOrSavedModelBundle( session_options, GetRunOptions(config_), path, saved_model_tags, diff --git a/tensorflow_serving/servables/tensorflow/session_bundle_config.proto b/tensorflow_serving/servables/tensorflow/session_bundle_config.proto index 2ebf4830ad8..e6fdae3df10 100644 --- a/tensorflow_serving/servables/tensorflow/session_bundle_config.proto +++ b/tensorflow_serving/servables/tensorflow/session_bundle_config.proto @@ -93,6 +93,11 @@ message SessionBundleConfig { // Tries to use infra validation result to estimate resource usage. bool resource_estimation_uses_validation_result = 784; + + // EXPERIMENTAL. THIS FIELD MAY CHANGE OR GO AWAY. USE WITH CAUTION. + // + // Number of TFLite interpreters in an interpreter pool of TfLiteSession. + int32 num_tflite_interpreters = 785; } // Batching parameters. Each individual parameter is optional. If omitted, the diff --git a/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.cc b/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.cc new file mode 100644 index 00000000000..29ad4fb5a03 --- /dev/null +++ b/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.cc @@ -0,0 +1,89 @@ +/* Copyright 2020 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h" + +#include +#include + +#include "tensorflow/lite/kernels/hashtable/hashtable_ops.h" +#include "tensorflow/lite/kernels/register.h" + +namespace tensorflow { +namespace serving { +namespace internal { + +Status TfLiteInterpreterPool::CreateTfLiteInterpreterPool( + const tflite::FlatBufferModel& model, int num_interpreters, + std::unique_ptr& pool) { + // TODO(b/140959776): Add support for non-builtin ops (flex or custom ops). + tflite::ops::builtin::BuiltinOpResolver resolver; + // TODO(b/165643512): Remove adding Hashtable to resolver by default. + tflite::ops::custom::AddHashtableOps(&resolver); + num_interpreters = std::max(num_interpreters, 1); + + std::vector> interpreters; + interpreters.reserve(num_interpreters); + for (int i = 0; i < num_interpreters; i++) { + std::unique_ptr interpreter; + if (tflite::InterpreterBuilder(model, resolver)(&interpreter) != + kTfLiteOk) { + return errors::Internal( + "Failed to create a TFLite interpreter with the given model"); + } + if (interpreter->AllocateTensors() != kTfLiteOk) { + return errors::Internal("Failed to allocate tensors"); + } + interpreters.push_back(std::move(interpreter)); + } + + pool.reset(new TfLiteInterpreterPool(std::move(interpreters))); + return Status::OK(); +} + +TfLiteInterpreterPool::TfLiteInterpreterPool( + std::vector> interpreters) + : interpreters_(std::move(interpreters)) { + auto num_interpreters = interpreters_.size(); + available_.reserve(num_interpreters); + for (int i = 0; i < num_interpreters; i++) { + available_.push_back(interpreters_[i].get()); + } +} + +std::unique_ptr +TfLiteInterpreterPool::GetInterpreter() { + auto interpreter_available = [this]() ABSL_SHARED_LOCKS_REQUIRED(mutex_) { + return !this->available_.empty(); + }; + mutex_.LockWhen(absl::Condition(&interpreter_available)); + + tflite::Interpreter* interpreter = available_.back(); + available_.pop_back(); + mutex_.Unlock(); + auto interpreter_wrapper = + std::make_unique(interpreter, this); + return interpreter_wrapper; +} + +void TfLiteInterpreterPool::ReturnInterpreter( + tflite::Interpreter* interpreter) { + absl::MutexLock l(&mutex_); + available_.push_back(interpreter); +} + +} // namespace internal +} // namespace serving +} // namespace tensorflow diff --git a/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h b/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h new file mode 100644 index 00000000000..c18a138ec55 --- /dev/null +++ b/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h @@ -0,0 +1,78 @@ +/* Copyright 2020 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_TFLITE_INTERPRETER_POOL_H_ +#define TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_TFLITE_INTERPRETER_POOL_H_ + +#include +#include + +#include "absl/base/thread_annotations.h" +#include "absl/synchronization/mutex.h" +#include "tensorflow/core/lib/core/errors.h" +#include "tensorflow/lite/model.h" + +namespace tensorflow { +namespace serving { +namespace internal { + +class TfLiteInterpreterWrapper; + +// A TFLite interpreter pool to maintain pre-created tflite::Interpreter +// objects. This class is thread-safe. +class TfLiteInterpreterPool { + public: + // Create an interpreter pool with the given TFLite model and number of + // interpreters. The model must outlive the returned pool instance. + static Status CreateTfLiteInterpreterPool( + const tflite::FlatBufferModel& model, int num_interpreters, + std::unique_ptr& pool); + // Returns a TFLite interpreter wrapper object. Caller may *block* waiting for + // a free interpreter to be available. + std::unique_ptr GetInterpreter(); + + private: + TfLiteInterpreterPool( + std::vector> interpreters); + void ReturnInterpreter(tflite::Interpreter* interpreter); + mutable absl::Mutex mutex_; + // A vector to maintain pointers of available interpreters + std::vector available_ ABSL_GUARDED_BY(mutex_); + const std::vector> interpreters_; + + friend TfLiteInterpreterWrapper; +}; + +// A TFLite interpreter wrapper class which automatically returns used +// interpreter object to TfLiteInterpreterPool. +class TfLiteInterpreterWrapper { + public: + TfLiteInterpreterWrapper(tflite::Interpreter* interpreter, + TfLiteInterpreterPool* pool) + : interpreter_(interpreter), pool_(pool) {} + + ~TfLiteInterpreterWrapper() { pool_->ReturnInterpreter(interpreter_); } + tflite::Interpreter* Get() { return interpreter_; } + + private: + tflite::Interpreter* const interpreter_; + TfLiteInterpreterPool* const pool_; +}; + +} // namespace internal +} // namespace serving +} // namespace tensorflow + +#endif // TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_TFLITE_INTERPRETER_POOL_H_ diff --git a/tensorflow_serving/servables/tensorflow/tflite_session.cc b/tensorflow_serving/servables/tensorflow/tflite_session.cc index a1467cdb195..26590ea98c9 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session.cc @@ -15,17 +15,18 @@ limitations under the License. #include "tensorflow_serving/servables/tensorflow/tflite_session.h" +#include #include #include #include "tensorflow/cc/saved_model/signature_constants.h" #include "tensorflow/core/framework/tensor_shape.pb.h" #include "tensorflow/core/lib/core/errors.h" -#include "tensorflow/lite/kernels/hashtable/hashtable_ops.h" #include "tensorflow/lite/kernels/register.h" #include "tensorflow/lite/string_util.h" #include "tensorflow/lite/tools/signature/signature_def_util.h" #include "tensorflow/lite/util.h" +#include "tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h" namespace tensorflow { namespace serving { @@ -112,13 +113,13 @@ Status TfLiteTensorToTensorInfo(const TfLiteTensor* tflite_tensor, return Status::OK(); } -Status GetTensorInfoMap(const tflite::Interpreter& interpreter, bool input, +Status GetTensorInfoMap(const tflite::Interpreter* interpreter, bool input, TensorInfoMap* infomap) { const std::vector& indices = - input ? interpreter.inputs() : interpreter.outputs(); + input ? interpreter->inputs() : interpreter->outputs(); const string& input_str = input ? "Input" : "Output"; for (int index : indices) { - const TfLiteTensor* tensor = interpreter.tensor(index); + const TfLiteTensor* tensor = interpreter->tensor(index); if (tensor->name == nullptr) { return errors::Internal(input_str, " name missing for tensor index: ", index); @@ -234,29 +235,25 @@ Status AppendTfLiteToTfTensorList(const TfLiteTensor* tflite_tensor, Status TfLiteSession::Create(string&& buffer, std::unique_ptr* tflite_session, - ::google::protobuf::Map* signatures) { + ::google::protobuf::Map* signatures, + int num_interpreters) { auto model = tflite::FlatBufferModel::BuildFromModel( flatbuffers::GetRoot(buffer.data())); if (model == nullptr) { return errors::InvalidArgument("Cannot build FlatBufferModel from buffer."); } - // TODO(b/140959776): Add support for non-builtin ops (flex or custom ops). - tflite::ops::builtin::BuiltinOpResolver resolver; - // TODO(b/165643512): Remove adding Hashtable to resolver by default. - tflite::ops::custom::AddHashtableOps(&resolver); - std::unique_ptr interpreter; - if (tflite::InterpreterBuilder(*model, resolver)(&interpreter) != kTfLiteOk) { - return errors::Internal("Cannot build Interpreter from buffer."); - } - if (interpreter->AllocateTensors() != kTfLiteOk) { - return errors::Internal("Cannot allocator tensors in Interpreter."); - } + std::unique_ptr interpreter_pool; + TF_RETURN_IF_ERROR( + internal::TfLiteInterpreterPool::CreateTfLiteInterpreterPool( + *model, num_interpreters, interpreter_pool)); + auto interpreter_wrapper = interpreter_pool->GetInterpreter(); + const tflite::Interpreter* interpreter = interpreter_wrapper->Get(); TensorInfoMap inputs; - TF_RETURN_IF_ERROR(GetTensorInfoMap(*interpreter, true, &inputs)); + TF_RETURN_IF_ERROR(GetTensorInfoMap(interpreter, true, &inputs)); TensorInfoMap outputs; - TF_RETURN_IF_ERROR(GetTensorInfoMap(*interpreter, false, &outputs)); + TF_RETURN_IF_ERROR(GetTensorInfoMap(interpreter, false, &outputs)); // Map of TFLite tensor name -> tensor index std::map input_tensor_to_index; @@ -322,20 +319,20 @@ Status TfLiteSession::Create(string&& buffer, tflite_session->reset(new TfLiteSession( std::move(input_tensor_to_index), std::move(output_tensor_to_index), - std::move(buffer), std::move(model), std::move(interpreter))); + std::move(buffer), std::move(model), std::move(interpreter_pool))); return Status::OK(); } -TfLiteSession::TfLiteSession(std::map&& input_tensor_to_index, - std::map&& output_tensor_to_index, - string&& buffer, - std::unique_ptr model, - std::unique_ptr interpreter) +TfLiteSession::TfLiteSession( + std::map&& input_tensor_to_index, + std::map&& output_tensor_to_index, string&& buffer, + std::unique_ptr model, + std::unique_ptr interpreter_pool) : input_tensor_to_index_(std::move(input_tensor_to_index)), output_tensor_to_index_(std::move(output_tensor_to_index)), model_serialized_bytes_(std::move(buffer)), model_(std::move(model)), - interpreter_(std::move(interpreter)) {} + interpreter_pool_(std::move(interpreter_pool)) {} Status TfLiteSession::Run(const std::vector>& inputs, const std::vector& output_tensor_names, @@ -363,21 +360,19 @@ Status TfLiteSession::Run( const std::vector& target_node_names, std::vector* outputs, RunMetadata* run_metadata, const thread::ThreadPoolOptions& thread_pool_options) { - // TODO(b/140959776): Remove serialized Run() calls, and support - // multi-threaded execution -- allowing multiple Run() calls to - // happen in-parallel. - absl::MutexLock lock(&mutex_); + auto interpreter_wrapper = interpreter_pool_->GetInterpreter(); + tflite::Interpreter* interpreter = interpreter_wrapper->Get(); for (const auto& input : inputs) { string name = input.first; TF_RETURN_WITH_CONTEXT_IF_ERROR( FixTfLiteTensorName(input_tensor_to_index_, name), "Missing input TFLite tensor: ", name); const int index = input_tensor_to_index_.at(name); - TF_RETURN_IF_ERROR(FillTfLiteTensorFromInput(name, input.second, - interpreter_.get(), index)); + TF_RETURN_IF_ERROR( + FillTfLiteTensorFromInput(name, input.second, interpreter, index)); } - if (interpreter_->Invoke() != kTfLiteOk) { + if (interpreter->Invoke() != kTfLiteOk) { return errors::Internal("Failed to run interpreter."); } @@ -387,7 +382,7 @@ Status TfLiteSession::Run( FixTfLiteTensorName(output_tensor_to_index_, name), "Missing output TFLite tensor: ", name); const int index = output_tensor_to_index_.at(name); - auto* tflite_tensor = interpreter_->tensor(index); + auto* tflite_tensor = interpreter->tensor(index); if (tflite_tensor == nullptr) { return errors::InvalidArgument( "Failed to get output TFLite tensor: ", name, " at index: ", index); diff --git a/tensorflow_serving/servables/tensorflow/tflite_session.h b/tensorflow_serving/servables/tensorflow/tflite_session.h index 7801c841c24..368fc3a228e 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session.h +++ b/tensorflow_serving/servables/tensorflow/tflite_session.h @@ -29,6 +29,7 @@ limitations under the License. #include "tensorflow/lite/interpreter.h" #include "tensorflow/lite/model.h" #include "tensorflow_serving/servables/tensorflow/serving_session.h" +#include "tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h" namespace tensorflow { namespace serving { @@ -43,7 +44,8 @@ class TfLiteSession : public ServingSession { // input/outputs to the model. static Status Create(string&& buffer, std::unique_ptr* tflite_session, - ::google::protobuf::Map* signatures); + ::google::protobuf::Map* signatures, + int num_interpreters); ~TfLiteSession() override = default; @@ -68,17 +70,17 @@ class TfLiteSession : public ServingSession { Status ListDevices(std::vector* response) override; private: - TfLiteSession(std::map&& input_tensor_to_index, - std::map&& output_tensor_to_index, string&& buffer, - std::unique_ptr model, - std::unique_ptr interpreter); + TfLiteSession( + std::map&& input_tensor_to_index, + std::map&& output_tensor_to_index, string&& buffer, + std::unique_ptr model, + std::unique_ptr interpreter_pool); const std::map input_tensor_to_index_; const std::map output_tensor_to_index_; const string model_serialized_bytes_; const std::unique_ptr model_; - mutable absl::Mutex mutex_; - std::unique_ptr interpreter_ ABSL_GUARDED_BY(mutex_); + std::unique_ptr interpreter_pool_; TF_DISALLOW_COPY_AND_ASSIGN(TfLiteSession); }; diff --git a/tensorflow_serving/servables/tensorflow/tflite_session_main.cc b/tensorflow_serving/servables/tensorflow/tflite_session_main.cc index e9114c6c77e..09dcb943529 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session_main.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session_main.cc @@ -45,7 +45,7 @@ int main(int argc, char** argv) { ::google::protobuf::Map signatures; std::unique_ptr session; status = tensorflow::serving::TfLiteSession::Create(std::move(model_bytes), - &session, &signatures); + &session, &signatures, 1); if (!status.ok()) { std::cerr << "ERROR: Failed to create TF Lite session with error: " << status << std::endl; diff --git a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc index 387721421eb..89f552092fc 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc @@ -21,6 +21,7 @@ limitations under the License. #include #include +#include "absl/flags/flag.h" #include "flatbuffers/flexbuffers.h" #include "tensorflow/cc/saved_model/signature_constants.h" #include "tensorflow/core/framework/attr_value.pb.h" @@ -39,6 +40,10 @@ limitations under the License. #include "tensorflow/lite/version.h" #include "tensorflow_serving/test_util/test_util.h" +ABSL_FLAG(int, num_tflite_interpreters, 1, + "Number of TFLite interpreters " + "in an interpreter pool of a TfLiteSession."); + namespace tensorflow { namespace serving { namespace { @@ -69,7 +74,8 @@ TEST(TfLiteSession, BasicTest) { ::google::protobuf::Map signatures; std::unique_ptr session; TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &session, &signatures)); + TfLiteSession::Create(std::move(model_bytes), &session, &signatures, + absl::GetFlag(FLAGS_num_tflite_interpreters))); EXPECT_EQ(signatures.size(), 1); EXPECT_EQ(signatures.begin()->first, "serving_default"); EXPECT_THAT(signatures.begin()->second, test_util::EqualsProto(R"( @@ -128,7 +134,8 @@ TEST(TfLiteSession, ModelFromLegacyConverterWithSigdef) { ::google::protobuf::Map signatures; std::unique_ptr session; TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &session, &signatures)); + TfLiteSession::Create(std::move(model_bytes), &session, &signatures, + absl::GetFlag(FLAGS_num_tflite_interpreters))); EXPECT_EQ(signatures.size(), 1); EXPECT_EQ(signatures.begin()->first, "serving_default"); // While, in the model, the tensor name of input "x" is "tflite_input:0". in @@ -332,7 +339,8 @@ TEST(TfLiteSession, ProcessStrings) { ::google::protobuf::Map signatures; std::unique_ptr session; TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &session, &signatures)); + TfLiteSession::Create(std::move(model_bytes), &session, &signatures, + absl::GetFlag(FLAGS_num_tflite_interpreters))); Tensor input_list = test::AsTensor({"a", "b", "c", "d"}, TensorShape({4})); Tensor input_shape = test::AsTensor({2, 2}, TensorShape({2})); @@ -354,7 +362,8 @@ TEST(TfLiteSession, ProcessStringsFlex) { ::google::protobuf::Map signatures; std::unique_ptr session; TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &session, &signatures)); + TfLiteSession::Create(std::move(model_bytes), &session, &signatures, + absl::GetFlag(FLAGS_num_tflite_interpreters))); Tensor input_list = test::AsTensor({"a", "b", "c", "d"}, TensorShape({4})); Tensor input_shape = test::AsTensor({2, 2}, TensorShape({2})); @@ -376,7 +385,8 @@ TEST(TfLiteSession, ThreadPoolOptions) { ::google::protobuf::Map signatures; std::unique_ptr session; TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &session, &signatures)); + TfLiteSession::Create(std::move(model_bytes), &session, &signatures, + absl::GetFlag(FLAGS_num_tflite_interpreters))); Tensor input_list = test::AsTensor({"a", "b", "c", "d"}, TensorShape({4})); Tensor input_shape = test::AsTensor({2, 2}, TensorShape({2})); @@ -415,7 +425,8 @@ TEST(TfLiteSession, SimpleSignatureDef) { std::unique_ptr session; TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &session, &signatures)); + TfLiteSession::Create(std::move(model_bytes), &session, &signatures, + absl::GetFlag(FLAGS_num_tflite_interpreters))); ASSERT_THAT(signatures, UnorderedElementsAre(Pair(kDefaultServingSignatureDefKey, _))); @@ -454,7 +465,8 @@ TEST(TfLiteSession, MultipleSignatureDef) { ::google::protobuf::Map signatures; std::unique_ptr session; TF_EXPECT_OK( - TfLiteSession::Create(std::move(model_bytes), &session, &signatures)); + TfLiteSession::Create(std::move(model_bytes), &session, &signatures, + absl::GetFlag(FLAGS_num_tflite_interpreters))); ASSERT_THAT(signatures, UnorderedElementsAre(Pair(kSignatureKey1, _), Pair(kSignatureKey2, _))); @@ -506,7 +518,8 @@ TEST(TfLiteSession, SignatureDefWithCommonTensorPrefix) { ::google::protobuf::Map signatures; std::unique_ptr session; TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &session, &signatures)); + TfLiteSession::Create(std::move(model_bytes), &session, &signatures, + absl::GetFlag(FLAGS_num_tflite_interpreters))); // Inputs must still be processed as two different tensors. auto outputSigdef = signatures[kDefaultServingSignatureDefKey]; @@ -525,7 +538,8 @@ TEST(TfLiteSession, SimpleSignatureDefAndRun) { ::google::protobuf::Map signatures; std::unique_ptr session; TF_EXPECT_OK( - TfLiteSession::Create(std::move(model_bytes), &session, &signatures)); + TfLiteSession::Create(std::move(model_bytes), &session, &signatures, + absl::GetFlag(FLAGS_num_tflite_interpreters))); auto sigdef = signatures[kDefaultServingSignatureDefKey]; ASSERT_EQ(sigdef.inputs().at(kSignatureInputList).name(), @@ -561,7 +575,8 @@ static void BM_Reshape(benchmark::State& state, bool use_flex_op) { ::google::protobuf::Map signatures; std::unique_ptr sess; TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &sess, &signatures)); + TfLiteSession::Create(std::move(model_bytes), &sess, &signatures, + absl::GetFlag(FLAGS_num_tflite_interpreters))); session = sess.release(); } Tensor input = test::AsTensor({1, 2, 3, 4, 5, 6}, TensorShape({6})); @@ -595,7 +610,8 @@ void BM_HalfPlusTwo(benchmark::State& state) { ::google::protobuf::Map signatures; std::unique_ptr sess; TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &sess, &signatures)); + TfLiteSession::Create(std::move(model_bytes), &sess, &signatures, + absl::GetFlag(FLAGS_num_tflite_interpreters))); session = sess.release(); } Tensor input = test::AsTensor({1.0, 2.0, 3.0}, TensorShape({3})); @@ -618,7 +634,8 @@ void BM_MobileNet(benchmark::State& state) { ::google::protobuf::Map signatures; std::unique_ptr sess; TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &sess, &signatures)); + TfLiteSession::Create(std::move(model_bytes), &sess, &signatures, + absl::GetFlag(FLAGS_num_tflite_interpreters))); session = sess.release(); } std::vector x_data(1 * 224 * 224 * 3, 1); From 854e7bee81062975009336b9c7b8a2d13edef4ce Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 19 Nov 2020 00:01:31 -0800 Subject: [PATCH 4412/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2bdcea34-bcb5-4d16-b4bf-fe687e0c8b2c PiperOrigin-RevId: 343234891 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b79db8cc070..d9d0f87b1b0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ec807fa17bcfdc558663887be9b86276f7989b2e9f5b80fa10547f948ab179c8", - git_commit = "acdb07d156b6c653151c452d486dee7736189f28", + sha256 = "ba03fb5ae9c1faf7a8800864ea00062358969f96531564410a3f922c9d2ce5b0", + git_commit = "b46fa00aa4256914240cb154b910bebfaf1693d6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0abcac560293a40bc4249c24b3de22d6e5c6d3c2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 19 Nov 2020 18:01:18 -0800 Subject: [PATCH 4413/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/dd92aba9-f3a1-4bb8-af04-6456b2cc2875 PiperOrigin-RevId: 343407282 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d9d0f87b1b0..9c8bfd2ec84 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ba03fb5ae9c1faf7a8800864ea00062358969f96531564410a3f922c9d2ce5b0", - git_commit = "b46fa00aa4256914240cb154b910bebfaf1693d6", + sha256 = "d4b0b270c9084704b981e2e244dd452bcdbd6e0f09f2980d0a5d7f3b3a6c64ba", + git_commit = "819eb34070c856a7f2881f5d14183dfa5c5c2375", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1a4d30ea696e9168e32597cc6e0ad5f380865782 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 20 Nov 2020 00:02:58 -0800 Subject: [PATCH 4414/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/accaa882-772b-416c-84c2-6a8648c6eb38 PiperOrigin-RevId: 343444810 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9c8bfd2ec84..34976b0c6d8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d4b0b270c9084704b981e2e244dd452bcdbd6e0f09f2980d0a5d7f3b3a6c64ba", - git_commit = "819eb34070c856a7f2881f5d14183dfa5c5c2375", + sha256 = "17e492dc24a3ac4e4e3db31a5fed865b1ea4d71b5ca9e3d84c9723c81148f124", + git_commit = "a0ef7441a42accf1125c16fe82bb792e0d150188", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d2f8f4d8067ae355e71cda98482f63fa2d6767c1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 20 Nov 2020 06:01:28 -0800 Subject: [PATCH 4415/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/58005705-d857-4428-95be-e493943520a4 PiperOrigin-RevId: 343478910 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 34976b0c6d8..51ea3639720 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "17e492dc24a3ac4e4e3db31a5fed865b1ea4d71b5ca9e3d84c9723c81148f124", - git_commit = "a0ef7441a42accf1125c16fe82bb792e0d150188", + sha256 = "df618f17a378743f5d6089528e874d67ebe06180b69110c6b8f96970c97fc81c", + git_commit = "361dbf884e95115a0b7c20462eca00ae1a3a06e7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b6810971dad0401b5457f4aa7b6eb6c22e7e5f13 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 20 Nov 2020 12:01:34 -0800 Subject: [PATCH 4416/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b4f4f2a8-34f2-4d37-ad94-ebc1ecb9fbd1 PiperOrigin-RevId: 343537397 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 51ea3639720..e5d721a7235 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "df618f17a378743f5d6089528e874d67ebe06180b69110c6b8f96970c97fc81c", - git_commit = "361dbf884e95115a0b7c20462eca00ae1a3a06e7", + sha256 = "a7b2b6cf5eb19ed02e1a450bc164dfd516d3d818c47de4461409d68d65bf3f21", + git_commit = "cbadb3c5ce486b9733bc408ed8b587593882ea10", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2b276fc328e47c51e5c1d14d0e64ba2009773eca Mon Sep 17 00:00:00 2001 From: Chao Xie Date: Fri, 20 Nov 2020 14:11:14 -0800 Subject: [PATCH 4417/8103] Adds LICENSE file to tensorflow-serving-api python package. It is recommended to include LICENSE file in the package.[1] But tensorflow-serving-api doesn't have one in it. We need LICENSE file and recent versions of `wheel` will automatically pickup LICENSE file in local directory. [1] https://packaging.python.org/tutorials/packaging-projects/#creating-a-license PiperOrigin-RevId: 343562364 --- tensorflow_serving/tools/pip_package/build_pip_package.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/tensorflow_serving/tools/pip_package/build_pip_package.sh b/tensorflow_serving/tools/pip_package/build_pip_package.sh index f4b94939ed5..efd9b2b4e64 100755 --- a/tensorflow_serving/tools/pip_package/build_pip_package.sh +++ b/tensorflow_serving/tools/pip_package/build_pip_package.sh @@ -72,10 +72,8 @@ function main() { echo "Adding package setup files" cp ${PIP_SRC_DIR}/setup.py "${TMPDIR}" - cp LICENSE "${TMPDIR}" pushd "${TMPDIR}" - python3 -m pip install --upgrade wheel -q echo $(date) : "=== Building wheel (CPU)" python3 setup.py bdist_wheel --universal \ --project_name tensorflow-serving-api # >/dev/null From f4a2dce77eb6b9a55c1e10bea2cbf9b3c4d7b331 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 20 Nov 2020 18:01:19 -0800 Subject: [PATCH 4418/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3f89572c-09b8-4991-abe7-7224ccc35a54 PiperOrigin-RevId: 343599226 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e5d721a7235..974a01f7242 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a7b2b6cf5eb19ed02e1a450bc164dfd516d3d818c47de4461409d68d65bf3f21", - git_commit = "cbadb3c5ce486b9733bc408ed8b587593882ea10", + sha256 = "82a352b3a95bbf6a3fc5f0e387fe5a285acf390a7cc9a5a9a5087f1a400d0476", + git_commit = "b9322e1891b902e676aaa7d2057cdc5aee4197de", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a97ad4b71d8304a234c4dd37033d517330862a22 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 21 Nov 2020 00:01:25 -0800 Subject: [PATCH 4419/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a14a8888-3ba7-4f1b-a6ed-fd38439b8304 PiperOrigin-RevId: 343624717 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 974a01f7242..7c4ce6d05b4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "82a352b3a95bbf6a3fc5f0e387fe5a285acf390a7cc9a5a9a5087f1a400d0476", - git_commit = "b9322e1891b902e676aaa7d2057cdc5aee4197de", + sha256 = "1d78176af2f267f7674b4471905f6eaf16c7eda451c8b5142bda4371fab30fd0", + git_commit = "fc01ffb782e8bf703e2be918509071ff1a77521a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8de01758662e1e23b49a1ac422d41e27ef88d70a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 21 Nov 2020 06:01:29 -0800 Subject: [PATCH 4420/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f379c55a-1405-448b-8687-f27c3d642f58 PiperOrigin-RevId: 343646300 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7c4ce6d05b4..26b56c5ff70 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1d78176af2f267f7674b4471905f6eaf16c7eda451c8b5142bda4371fab30fd0", - git_commit = "fc01ffb782e8bf703e2be918509071ff1a77521a", + sha256 = "f5e23d763f19e0d0770555be8d7039bf3992b6ee6be72ea9d733ef7d279cff45", + git_commit = "2d263ad1caf91fcc2eb83efa3c63939608e24901", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 98b673488648b3746b033fbc49a38c32b2f0ce98 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 21 Nov 2020 12:01:22 -0800 Subject: [PATCH 4421/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ee384643-9914-4d0a-9e68-17464cb7d1fc PiperOrigin-RevId: 343666556 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 26b56c5ff70..e53af9db9a5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f5e23d763f19e0d0770555be8d7039bf3992b6ee6be72ea9d733ef7d279cff45", - git_commit = "2d263ad1caf91fcc2eb83efa3c63939608e24901", + sha256 = "cb7eefabcaa1934b7767604a2368d001ec0d8ee65f88005f97f086ec39c60023", + git_commit = "063940bae365534a74d27421c7ef37736042cb3a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2be2f78760cac49c9dbf73475ec6bc627687fbd7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 22 Nov 2020 06:01:26 -0800 Subject: [PATCH 4422/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fdbcc7a3-bc77-4288-a333-33aaa1752fca PiperOrigin-RevId: 343727581 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e53af9db9a5..da45d613798 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cb7eefabcaa1934b7767604a2368d001ec0d8ee65f88005f97f086ec39c60023", - git_commit = "063940bae365534a74d27421c7ef37736042cb3a", + sha256 = "450a3b2f2d0921627fa2e19ff5a0c85cbdd6e43861988347210660d6ae1cba6a", + git_commit = "2cad9d750cadd825910b61351a731eb0e8031608", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 416e5d4b1294bacb0a055596bcc234e14789a1ed Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 22 Nov 2020 18:01:24 -0800 Subject: [PATCH 4423/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3ce10cdc-8b3e-41d0-9b86-6943da477485 PiperOrigin-RevId: 343769429 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index da45d613798..f64f27ae36f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "450a3b2f2d0921627fa2e19ff5a0c85cbdd6e43861988347210660d6ae1cba6a", - git_commit = "2cad9d750cadd825910b61351a731eb0e8031608", + sha256 = "a372fe229cdddfa7e40e4597eae95962466bfb4466f9faf1152fb9f333447875", + git_commit = "9bb01ec208ee1e7b30fa420884443571a89f6f9e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 527079cd7a52309c973ce5385f0bc851ee9d3d07 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 23 Nov 2020 00:01:36 -0800 Subject: [PATCH 4424/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b4a57055-ff79-46a7-9000-c1c74fbecee6 PiperOrigin-RevId: 343794827 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f64f27ae36f..e35c03e1fa7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a372fe229cdddfa7e40e4597eae95962466bfb4466f9faf1152fb9f333447875", - git_commit = "9bb01ec208ee1e7b30fa420884443571a89f6f9e", + sha256 = "1b80be7c0fef4cf52b329e4af9b21b478d05d0b8d4943e138aa50ea132c14e68", + git_commit = "b32ec281aa66f6bf3e32394c2f2eed6e523c966b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 456fdceef55149b860e60acc88ffd26d38613a24 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 23 Nov 2020 06:01:30 -0800 Subject: [PATCH 4425/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/736d640b-f860-4afd-aa46-f39d5917f3c6 PiperOrigin-RevId: 343835622 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e35c03e1fa7..510c6c22c31 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1b80be7c0fef4cf52b329e4af9b21b478d05d0b8d4943e138aa50ea132c14e68", - git_commit = "b32ec281aa66f6bf3e32394c2f2eed6e523c966b", + sha256 = "a3907057f4139300983255d1bca599ec32cff28b6fa4d25e51467e42e89128cf", + git_commit = "2076ba6bbf717a7b5ed1f8a8b88e2fa17787e4ac", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1a44462b2bba7222e52f528e84c26e9fd682311f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 23 Nov 2020 12:01:37 -0800 Subject: [PATCH 4426/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7a70eab1-f464-4cfb-a7d8-4241d857d56e PiperOrigin-RevId: 343899399 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 510c6c22c31..b1c1f11c29a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a3907057f4139300983255d1bca599ec32cff28b6fa4d25e51467e42e89128cf", - git_commit = "2076ba6bbf717a7b5ed1f8a8b88e2fa17787e4ac", + sha256 = "a835f83cb7d37865f676896eb2be22d54821886d06d95f836c5526ff23e560fa", + git_commit = "d25655379fb41d69f6edd6946a72c49f6323f060", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From be9b4a034898d3bbc13a42f57af9e17c8945d65b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 23 Nov 2020 18:01:16 -0800 Subject: [PATCH 4427/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/cca2f612-3d2f-4aff-8cfc-7b9fa0aca8d9 PiperOrigin-RevId: 343964537 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b1c1f11c29a..c68a14a4648 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a835f83cb7d37865f676896eb2be22d54821886d06d95f836c5526ff23e560fa", - git_commit = "d25655379fb41d69f6edd6946a72c49f6323f060", + sha256 = "1cc5b09ddd51754432c4c9032e84db2535f95d285f623cc3dea5663d43cef159", + git_commit = "c9c6560158bd22d7e0d6c32d0d3dc14f33cb8621", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 57cfa63741c405fdf03a62e88c26c2448ba1ff38 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 24 Nov 2020 00:01:38 -0800 Subject: [PATCH 4428/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a1c9d24f-e640-4b7b-a703-acf38648ac70 PiperOrigin-RevId: 344000367 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c68a14a4648..a0e19bf1745 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1cc5b09ddd51754432c4c9032e84db2535f95d285f623cc3dea5663d43cef159", - git_commit = "c9c6560158bd22d7e0d6c32d0d3dc14f33cb8621", + sha256 = "b52c1aaa64f3af50b0906bbc1903cff350c2401541f1ff071b7952cf0a49117c", + git_commit = "93d37e183b74789074f72aef005e1acd56ce13d6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6bd1bfb9e0bb3b6f240b84a547575bc051399622 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 24 Nov 2020 06:01:39 -0800 Subject: [PATCH 4429/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6636245e-2b12-4759-bdf7-2bc1c8edd570 PiperOrigin-RevId: 344042997 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a0e19bf1745..37d7f98e466 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b52c1aaa64f3af50b0906bbc1903cff350c2401541f1ff071b7952cf0a49117c", - git_commit = "93d37e183b74789074f72aef005e1acd56ce13d6", + sha256 = "2a57dd3dd6a1ac317bd8546fa3a5bafa551c4fd3d1ff713096e31e72d0e12906", + git_commit = "6f2db1eea2c95189125dc7d4656495d69b007230", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9b045a3588d6bbffa00acfa236e8133a0e15f4c4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 24 Nov 2020 12:01:38 -0800 Subject: [PATCH 4430/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d9676c6b-9f00-4783-821e-f0535a9e1579 PiperOrigin-RevId: 344105363 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 37d7f98e466..8730bcf8ac0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2a57dd3dd6a1ac317bd8546fa3a5bafa551c4fd3d1ff713096e31e72d0e12906", - git_commit = "6f2db1eea2c95189125dc7d4656495d69b007230", + sha256 = "97207fb7f60955d6b42c9c6e0f1b4b75d49e14957f849d22ee74569ed24a4307", + git_commit = "603d88d72c1f739cc46fb250edfc9924d9517b17", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b1f2288deed5a9f122156400e71ceb9cce8300e8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 24 Nov 2020 18:01:18 -0800 Subject: [PATCH 4431/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9e466aca-de55-4f53-8f64-c82239b95c94 PiperOrigin-RevId: 344164681 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8730bcf8ac0..3228bb0157a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "97207fb7f60955d6b42c9c6e0f1b4b75d49e14957f849d22ee74569ed24a4307", - git_commit = "603d88d72c1f739cc46fb250edfc9924d9517b17", + sha256 = "37af1e32cbb2329406343ebe5c53fb125fefe2871eab2106504b87d6db98f0e3", + git_commit = "0c1845ced0b7de56396a87e7119d85f56f427ed2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 986af913d8762205402306ad03a2a074f22023e2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 25 Nov 2020 00:01:33 -0800 Subject: [PATCH 4432/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/954b7899-9769-443a-953f-93e5ede5e244 PiperOrigin-RevId: 344199588 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3228bb0157a..5d717044b55 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "37af1e32cbb2329406343ebe5c53fb125fefe2871eab2106504b87d6db98f0e3", - git_commit = "0c1845ced0b7de56396a87e7119d85f56f427ed2", + sha256 = "e364ae54d1aecae50a212c2556c4481a0ba64cf821912e6d678004e76b6ec79f", + git_commit = "6af836f407f546cf2f9ab3b5fcb7a8285bda5c96", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8ed35efe5f998e86c7b407ecd420a03a19e9d508 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 25 Nov 2020 06:01:29 -0800 Subject: [PATCH 4433/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e783d6fc-6275-48ec-bc27-dc3ec71894a2 PiperOrigin-RevId: 344239050 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5d717044b55..c55b66d39f1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e364ae54d1aecae50a212c2556c4481a0ba64cf821912e6d678004e76b6ec79f", - git_commit = "6af836f407f546cf2f9ab3b5fcb7a8285bda5c96", + sha256 = "2c216e26241f4f7d9767516955b3047aebc517c455b1d62ae65b219aaaeab4a0", + git_commit = "684cec69dbbd0ede4eaa59397750be265fac17b3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From acca054bfdf92fbe0e1423746a86e35acf239c26 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 25 Nov 2020 12:01:37 -0800 Subject: [PATCH 4434/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/cef2f8fa-d594-4b11-92e3-c8b7747ee2b8 PiperOrigin-RevId: 344293758 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c55b66d39f1..f7a03f47482 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2c216e26241f4f7d9767516955b3047aebc517c455b1d62ae65b219aaaeab4a0", - git_commit = "684cec69dbbd0ede4eaa59397750be265fac17b3", + sha256 = "7aeeb10a2c9930af1ea89af5109d9ca3edd11edf78641294c21d09e52a3784df", + git_commit = "aac6f140203fd443fd2d1d7dd8f54227e02c055f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From de1ab9e0b5abf8ee7540cc711fda2be9fcbd1b8c Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Wed, 25 Nov 2020 16:17:33 -0800 Subject: [PATCH 4435/8103] Enable download of TF Serving sources at arbitrary commit for CPU docker image. PiperOrigin-RevId: 344333003 --- tensorflow_serving/tools/docker/Dockerfile.devel | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index f711f2e6019..1e574c35bef 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -14,7 +14,7 @@ FROM ubuntu:18.04 as base_build ARG TF_SERVING_VERSION_GIT_BRANCH=master -ARG TF_SERVING_VERSION_GIT_COMMIT=head +ARG TF_SERVING_VERSION_GIT_COMMIT=HEAD LABEL maintainer=gvasudevan@google.com LABEL tensorflow_serving_github_branchtag=${TF_SERVING_VERSION_GIT_BRANCH} @@ -89,10 +89,7 @@ RUN mkdir /bazel && \ # Download TF Serving sources (optionally at specific commit). WORKDIR /tensorflow-serving -RUN git clone --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tensorflow/serving . && \ - git remote add upstream https://github.com/tensorflow/serving.git && \ - if [ "${TF_SERVING_VERSION_GIT_COMMIT}" != "head" ]; then git checkout ${TF_SERVING_VERSION_GIT_COMMIT} ; fi - +RUN curl -sSL --retry 5 https://github.com/tensorflow/serving/tarball/${TF_SERVING_VERSION_GIT_COMMIT} | tar --strip-components=1 -xzf - FROM base_build as binary_build # Build, and install TensorFlow Serving From ab7ad2325a710c26607863f5cab449208d14cf98 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 25 Nov 2020 18:01:15 -0800 Subject: [PATCH 4436/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c488a541-cd6a-4a41-931f-b2e51260b6e3 PiperOrigin-RevId: 344344345 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f7a03f47482..3b87377b5ef 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7aeeb10a2c9930af1ea89af5109d9ca3edd11edf78641294c21d09e52a3784df", - git_commit = "aac6f140203fd443fd2d1d7dd8f54227e02c055f", + sha256 = "e04982f728cd76a05c9f413e3a7074258c6fa59b029faf62d7fab8aa1e54982e", + git_commit = "5355b649db9c6301ea66d6f689f0d17804a444d2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 79ec527a0622d8a0c5429f45c9ad2575c1c0139c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 26 Nov 2020 00:01:29 -0800 Subject: [PATCH 4437/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ef4dd3f8-afda-45d3-ae8b-7db4be784719 PiperOrigin-RevId: 344374912 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3b87377b5ef..1cd68dd5254 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e04982f728cd76a05c9f413e3a7074258c6fa59b029faf62d7fab8aa1e54982e", - git_commit = "5355b649db9c6301ea66d6f689f0d17804a444d2", + sha256 = "a5c79194ed57e26e2259177e803a4458d1fe7774a8a00312548578e6b7cd02a5", + git_commit = "dd35a3e9259f94b9f46a8c151359a92f39f115eb", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 55e077a3d2810deba6a7444228440c1935af5084 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 26 Nov 2020 06:01:24 -0800 Subject: [PATCH 4438/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a786bc6c-3d40-4c36-a18f-d45e9696961f PiperOrigin-RevId: 344412217 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1cd68dd5254..581bfa60ae6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a5c79194ed57e26e2259177e803a4458d1fe7774a8a00312548578e6b7cd02a5", - git_commit = "dd35a3e9259f94b9f46a8c151359a92f39f115eb", + sha256 = "8990fdbc47ddb6cd80ad0c01abe934e1d0ee7146af234ea0738539ad8308b3a2", + git_commit = "3ec134727f7cb07b62c99407298c782ce6effed3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e14bf3d0880663bc01008173c8c2198d7e76270b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 26 Nov 2020 12:01:21 -0800 Subject: [PATCH 4439/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f45d7ebf-3877-4103-aa89-d3f8448bde79 PiperOrigin-RevId: 344445632 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 581bfa60ae6..d82b52cdf8b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8990fdbc47ddb6cd80ad0c01abe934e1d0ee7146af234ea0738539ad8308b3a2", - git_commit = "3ec134727f7cb07b62c99407298c782ce6effed3", + sha256 = "e5e6a6c4f2c66f256ed98f2ddc0d337892e11917c2ff033d5256953bf924c9d2", + git_commit = "d5b2156e4e5367cc336d26fbbac3a6e76781de05", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 18fd769ec27e42e92f89dfe3e98655a47765fbff Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 26 Nov 2020 18:01:28 -0800 Subject: [PATCH 4440/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ef4dc4c0-4f0b-489f-bfd9-f103736ba0a6 PiperOrigin-RevId: 344468889 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d82b52cdf8b..dea2daabde2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e5e6a6c4f2c66f256ed98f2ddc0d337892e11917c2ff033d5256953bf924c9d2", - git_commit = "d5b2156e4e5367cc336d26fbbac3a6e76781de05", + sha256 = "5cb710c575baf326539202e610cd6218ec2f0655ae3dced72967ae9fe90fb3ab", + git_commit = "dc37ecf08b2909c8d2b4d7f8c95ef3a3091d4578", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9bab8c7b6a24cd9bdcb3807682e21dc6162af69b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 27 Nov 2020 06:01:30 -0800 Subject: [PATCH 4441/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/90ebb659-81b3-4359-a1f5-a0394063237a PiperOrigin-RevId: 344523598 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dea2daabde2..ba1de8842f3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5cb710c575baf326539202e610cd6218ec2f0655ae3dced72967ae9fe90fb3ab", - git_commit = "dc37ecf08b2909c8d2b4d7f8c95ef3a3091d4578", + sha256 = "be6a60c6dcf9b15e95147bd63e0928ddce8796eade3bd5e1c5d63cfcb3fea94c", + git_commit = "ed3d900e374335a60329ed95699efc8d5492447f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From fe3471a15005061b5fb93429a24360d452ce2624 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 27 Nov 2020 12:01:29 -0800 Subject: [PATCH 4442/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bde009fe-ca14-428d-a460-731a15217096 PiperOrigin-RevId: 344550338 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ba1de8842f3..3a394c54818 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "be6a60c6dcf9b15e95147bd63e0928ddce8796eade3bd5e1c5d63cfcb3fea94c", - git_commit = "ed3d900e374335a60329ed95699efc8d5492447f", + sha256 = "bc85adbc57678164ccc1d6f1695a7f41e26e5d2d8a24c4a61ea614fa27c28fec", + git_commit = "f9508f37558162ad3660230fd228a4caece13a6e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d54d2ab187bf5bd424929f2519437d1ce65eee4e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 27 Nov 2020 18:01:36 -0800 Subject: [PATCH 4443/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b270d77b-8f8a-4116-b3a0-a17e6c502faa PiperOrigin-RevId: 344571290 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3a394c54818..6859ce06212 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bc85adbc57678164ccc1d6f1695a7f41e26e5d2d8a24c4a61ea614fa27c28fec", - git_commit = "f9508f37558162ad3660230fd228a4caece13a6e", + sha256 = "7abaa3cea95f4c5f633fa769e058dabb96400e4f3bd88d1ced4e13a197482e89", + git_commit = "4c4433abcbce9594fca40643b0e376620cf32d30", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c59ae52a1bdbe65867f4e67cef6d5449598cc74b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 28 Nov 2020 00:01:36 -0800 Subject: [PATCH 4444/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f4ccbfbe-62ef-48ac-8729-ef09dd63e4a3 PiperOrigin-RevId: 344590491 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6859ce06212..128e23652d1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7abaa3cea95f4c5f633fa769e058dabb96400e4f3bd88d1ced4e13a197482e89", - git_commit = "4c4433abcbce9594fca40643b0e376620cf32d30", + sha256 = "a97688527de7e2a8a02a125986400bb082be7fa97e7387cb1fbf8889856fb55a", + git_commit = "fb4160e626ca1acee81937faebfa25783ac0d632", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8513fa43330290f76b410890e2d3912304b0f544 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 28 Nov 2020 06:01:23 -0800 Subject: [PATCH 4445/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9f2b31f9-7398-483c-943b-70a1aed2629f PiperOrigin-RevId: 344610874 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 128e23652d1..ebb3489c232 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a97688527de7e2a8a02a125986400bb082be7fa97e7387cb1fbf8889856fb55a", - git_commit = "fb4160e626ca1acee81937faebfa25783ac0d632", + sha256 = "a3551d7cc31e9cb27221ae216d555b182d5b56b134ac4de528413485c72e4f9b", + git_commit = "fab3f8548264590133d2f49c75ed9c0c0ab83f28", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d1a1054840a1c02f64351a46f87e6d9f264d7866 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 28 Nov 2020 12:01:29 -0800 Subject: [PATCH 4446/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6000c952-a6da-4d4c-aa29-596299dac4de PiperOrigin-RevId: 344629797 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ebb3489c232..050d5e39877 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a3551d7cc31e9cb27221ae216d555b182d5b56b134ac4de528413485c72e4f9b", - git_commit = "fab3f8548264590133d2f49c75ed9c0c0ab83f28", + sha256 = "4fe0d5073b1e10e0dbde2ee9b9ad59b7f05803e166e68f132d7dc0906551d629", + git_commit = "c36ad7be23583e9572e39cc4879b790746499cbe", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4cfc4e66d9a77ebb9f7ab6b7966226ef1fc7510a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 29 Nov 2020 00:01:42 -0800 Subject: [PATCH 4447/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6e996555-faa2-484d-8704-9ba7bb9625de PiperOrigin-RevId: 344667919 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 050d5e39877..4c4c850df81 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4fe0d5073b1e10e0dbde2ee9b9ad59b7f05803e166e68f132d7dc0906551d629", - git_commit = "c36ad7be23583e9572e39cc4879b790746499cbe", + sha256 = "e65967d61ae9b061163ef1557a82da1df0d1a1a7e2ca49dc28effe89372fa8b1", + git_commit = "fb5160d9a9e1d2b050501192fcf8585a51765eef", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9a1991eb70a608b32e31f3340fd4e6bda060ff6e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 29 Nov 2020 06:01:28 -0800 Subject: [PATCH 4448/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3e627f31-87ea-4d97-a516-cf24a3fc99aa PiperOrigin-RevId: 344689562 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4c4c850df81..a20a385a8d0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e65967d61ae9b061163ef1557a82da1df0d1a1a7e2ca49dc28effe89372fa8b1", - git_commit = "fb5160d9a9e1d2b050501192fcf8585a51765eef", + sha256 = "3b0b6eecf044bdbfbd2de7c4b86c4fbcac97e20e6b3f0e044e76ea1b19cd1268", + git_commit = "68d2777a170c0448ba9d853ef0f7327bdba1df2f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7b4997734d4ff6d072a08f81f6e4685ac87e3297 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 30 Nov 2020 00:01:43 -0800 Subject: [PATCH 4449/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/de632236-b05b-4324-8087-afa47100aa0e PiperOrigin-RevId: 344759516 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a20a385a8d0..c0fb16309fb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3b0b6eecf044bdbfbd2de7c4b86c4fbcac97e20e6b3f0e044e76ea1b19cd1268", - git_commit = "68d2777a170c0448ba9d853ef0f7327bdba1df2f", + sha256 = "5065c8818ed11a167a193c6f205b6d99e3ade8354ed3aa7008bbd5525b0aafc1", + git_commit = "bc295ed3bc729e94a0aa16214ae3c5a8b642858c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5d5f6c18beaca9475ff8b7954bd1a3ed3d8830e1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 30 Nov 2020 06:01:32 -0800 Subject: [PATCH 4450/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e8805fdd-dcc3-4401-8743-e439bd3c0546 PiperOrigin-RevId: 344797387 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c0fb16309fb..5c0f7a40c00 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5065c8818ed11a167a193c6f205b6d99e3ade8354ed3aa7008bbd5525b0aafc1", - git_commit = "bc295ed3bc729e94a0aa16214ae3c5a8b642858c", + sha256 = "5e80631f8df8fdb1cdc7dee9ca9b02fdef9e527e2957d0b6b0c99bca64fa7f41", + git_commit = "9c6a53d7465f6fc8145e80b724d232598f355753", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From be217111b0515a973f96d1af1401797ba1bbbb04 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 30 Nov 2020 12:01:49 -0800 Subject: [PATCH 4451/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ec4ea07a-e42e-40b9-82f4-1400b0070dbf PiperOrigin-RevId: 344860119 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5c0f7a40c00..722579eeac1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5e80631f8df8fdb1cdc7dee9ca9b02fdef9e527e2957d0b6b0c99bca64fa7f41", - git_commit = "9c6a53d7465f6fc8145e80b724d232598f355753", + sha256 = "5c00b435c27cff2985e5d0856957869c637cc3c43d78fc9500dfd6d1a92f1027", + git_commit = "1cbed68abbb33e8c420b61d0602ed653714918f2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4dfa9589f372a3a43ce25415f8f753795867df94 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 30 Nov 2020 18:01:28 -0800 Subject: [PATCH 4452/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ecd9abb6-221b-4dd1-a69e-2fe8c01f82d5 PiperOrigin-RevId: 344925815 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 722579eeac1..cba25eac67f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5c00b435c27cff2985e5d0856957869c637cc3c43d78fc9500dfd6d1a92f1027", - git_commit = "1cbed68abbb33e8c420b61d0602ed653714918f2", + sha256 = "cec84dd9d9c98e20b02590241a02cc063979a0068f8e02d847b6cc54e286f781", + git_commit = "4948648cbf5099f398fd37b3b0f8385c5f37d61d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b42130635bc24cfc4b85c71ef9356ca28c220615 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 1 Dec 2020 00:01:35 -0800 Subject: [PATCH 4453/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5c6b0b23-f883-46bc-9b6f-fde066b93373 PiperOrigin-RevId: 344963246 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cba25eac67f..b403f58a5d2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cec84dd9d9c98e20b02590241a02cc063979a0068f8e02d847b6cc54e286f781", - git_commit = "4948648cbf5099f398fd37b3b0f8385c5f37d61d", + sha256 = "bedc31952a7776efd802f45f7f4aec97943b6b2af8c5a7b8b9357cc2b7c0a6ec", + git_commit = "69595ba83f871db9e375452b8fd71560182cc7d3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c59cee30bcbaa2a53cadbc1c38dc4990d7d99821 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 1 Dec 2020 06:01:27 -0800 Subject: [PATCH 4454/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/314dec61-a72b-4d4a-8f1b-551af9288edd PiperOrigin-RevId: 345004229 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b403f58a5d2..bae167b4aaa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bedc31952a7776efd802f45f7f4aec97943b6b2af8c5a7b8b9357cc2b7c0a6ec", - git_commit = "69595ba83f871db9e375452b8fd71560182cc7d3", + sha256 = "fc344a5a8948ff703d1fea59b256367e22d341d608f99bdf8cbfb8059ac64fdd", + git_commit = "31aefdd394ee19461902ac0770ee0e1c07b66d29", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c304f2ca35894fe7cbb6905d987a9f013987abda Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 1 Dec 2020 12:01:32 -0800 Subject: [PATCH 4455/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6da0535d-a208-497a-8fce-02d88aa9a487 PiperOrigin-RevId: 345070299 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bae167b4aaa..f5dbec5e4dc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fc344a5a8948ff703d1fea59b256367e22d341d608f99bdf8cbfb8059ac64fdd", - git_commit = "31aefdd394ee19461902ac0770ee0e1c07b66d29", + sha256 = "b7cb2b0efec08024bda365f5af9d8867dc64fe89458c7dc16a43f420f285bf91", + git_commit = "b58db35632d7a4197f6148ba154aae42585baa9f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ebbbc87b925008da25bfb53f8fb0d8398c6767a7 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Tue, 1 Dec 2020 17:21:23 -0800 Subject: [PATCH 4456/8103] Enable download of TF Serving sources at arbitrary commit for GPU/MKL docker images. PiperOrigin-RevId: 345132448 --- tensorflow_serving/tools/docker/Dockerfile.devel-gpu | 6 ++---- tensorflow_serving/tools/docker/Dockerfile.devel-mkl | 7 ++----- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 7ed1f577a64..4e60d66d5e7 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -14,7 +14,7 @@ FROM nvidia/cuda:11.0-cudnn8-devel-ubuntu18.04 as base_build ARG TF_SERVING_VERSION_GIT_BRANCH=master -ARG TF_SERVING_VERSION_GIT_COMMIT=head +ARG TF_SERVING_VERSION_GIT_COMMIT=HEAD LABEL maintainer=gvasudevan@google.com LABEL tensorflow_serving_github_branchtag=${TF_SERVING_VERSION_GIT_BRANCH} @@ -143,9 +143,7 @@ ENV TMP="/tmp" # Download TF Serving sources (optionally at specific commit). WORKDIR /tensorflow-serving -RUN git clone --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tensorflow/serving . && \ - git remote add upstream https://github.com/tensorflow/serving.git && \ - if [ "${TF_SERVING_VERSION_GIT_COMMIT}" != "head" ]; then git checkout ${TF_SERVING_VERSION_GIT_COMMIT} ; fi +RUN curl -sSL --retry 5 https://github.com/tensorflow/serving/tarball/${TF_SERVING_VERSION_GIT_COMMIT} | tar --strip-components=1 -xzf - FROM base_build as binary_build # Build, and install TensorFlow Serving diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl index b019eaadf95..70c4c146f9e 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl @@ -14,7 +14,7 @@ FROM ubuntu:18.04 as base_build ARG TF_SERVING_VERSION_GIT_BRANCH=master -ARG TF_SERVING_VERSION_GIT_COMMIT=head +ARG TF_SERVING_VERSION_GIT_COMMIT=HEAD LABEL maintainer="Clayne Robison " LABEL tensorflow_serving_github_branchtag=${TF_SERVING_VERSION_GIT_BRANCH} @@ -88,10 +88,7 @@ RUN mkdir /bazel && \ # Download TF Serving sources (optionally at specific commit). WORKDIR /tensorflow-serving -RUN git clone --branch=${TF_SERVING_VERSION_GIT_BRANCH} https://github.com/tensorflow/serving . && \ - git remote add upstream https://github.com/tensorflow/serving.git && \ - if [ "${TF_SERVING_VERSION_GIT_COMMIT}" != "head" ]; then git checkout ${TF_SERVING_VERSION_GIT_COMMIT} ; fi - +RUN curl -sSL --retry 5 https://github.com/tensorflow/serving/tarball/${TF_SERVING_VERSION_GIT_COMMIT} | tar --strip-components=1 -xzf - FROM base_build as binary_build # Build, and install TensorFlow Serving From a59578c0db840506f9ea27a3081bd038533caae6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 1 Dec 2020 18:01:56 -0800 Subject: [PATCH 4457/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/472e8456-f6e2-4a9a-9269-56fe26348579 PiperOrigin-RevId: 345138477 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f5dbec5e4dc..6d841f984bf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b7cb2b0efec08024bda365f5af9d8867dc64fe89458c7dc16a43f420f285bf91", - git_commit = "b58db35632d7a4197f6148ba154aae42585baa9f", + sha256 = "2d355abcd20bd342c5d47e551794e58597dec382045a552e686cd9a9495102e9", + git_commit = "6b9e35f1c0410607bf956c0f27e5d3e1456b4899", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 42666a18c050c47753449726f65cccc0937b75e0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 2 Dec 2020 00:01:44 -0800 Subject: [PATCH 4458/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d82af5f2-a127-4da3-afd7-6869f8154e97 PiperOrigin-RevId: 345177610 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6d841f984bf..c86c2b576a8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2d355abcd20bd342c5d47e551794e58597dec382045a552e686cd9a9495102e9", - git_commit = "6b9e35f1c0410607bf956c0f27e5d3e1456b4899", + sha256 = "d618bd8c34cded311f2a5e2551c25bb7f458065624b7708c2e437b2cb3cd9061", + git_commit = "0eca9895b55c96631075a30c91c9800e842c4b6f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ea2f114f2973a839b848c572624fea3563397b05 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 2 Dec 2020 06:01:34 -0800 Subject: [PATCH 4459/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2df67dc5-9f81-457c-8642-aed5e4063f49 PiperOrigin-RevId: 345217600 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c86c2b576a8..01557cf1d0b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d618bd8c34cded311f2a5e2551c25bb7f458065624b7708c2e437b2cb3cd9061", - git_commit = "0eca9895b55c96631075a30c91c9800e842c4b6f", + sha256 = "c5e6d0622cdb87e267cf16b7e7492d041a42568505a37d124e61771febf1b939", + git_commit = "1daa0ea0a0a8d5f34783ceb7d6520d28732662d9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 603451e32db81b54ec9a49b30877bfba8fd92408 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 2 Dec 2020 12:01:26 -0800 Subject: [PATCH 4460/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/07b2e4a4-0247-4e80-8e56-3c78e9b87f8d PiperOrigin-RevId: 345282437 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 01557cf1d0b..64707836e3d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c5e6d0622cdb87e267cf16b7e7492d041a42568505a37d124e61771febf1b939", - git_commit = "1daa0ea0a0a8d5f34783ceb7d6520d28732662d9", + sha256 = "fa6f039d939d9bcf30fc5f988692582fd4e829b206476e329383fe22bdd5b643", + git_commit = "3c302f4b81af2502e5fa34d3b069a4776b039eac", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e0faf9d1780cc5374c834b5e3132f5054070e6ff Mon Sep 17 00:00:00 2001 From: Mingming Liu Date: Wed, 2 Dec 2020 13:40:43 -0800 Subject: [PATCH 4461/8103] Temporarily disable failing test, until we root cause and fix it. PiperOrigin-RevId: 345303151 --- .../model_servers/tensorflow_model_server_test.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/tensorflow_serving/model_servers/tensorflow_model_server_test.py b/tensorflow_serving/model_servers/tensorflow_model_server_test.py index 96c1415ed2b..a2fcbaeb5a2 100644 --- a/tensorflow_serving/model_servers/tensorflow_model_server_test.py +++ b/tensorflow_serving/model_servers/tensorflow_model_server_test.py @@ -23,7 +23,6 @@ import os import subprocess import time -import unittest # This is a placeholder for a Google-internal import. @@ -33,7 +32,6 @@ from tensorflow.python.platform import flags from tensorflow.python.profiler import profiler_client - from tensorflow.python.saved_model import signature_constants from tensorflow_serving.apis import classification_pb2 from tensorflow_serving.apis import get_model_metadata_pb2 @@ -725,7 +723,6 @@ def test_distrat_sequential_keras_saved_model_save(self): expected_output=2.0, expected_version=expected_version) - @unittest.skip('b/170966383') def test_profiler_service_with_valid_trace_request(self): """Test integration with profiler service by sending tracing requests.""" From 5c2d28afe06be2c5e399b2221a22d5a90b81fd67 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 2 Dec 2020 18:01:24 -0800 Subject: [PATCH 4462/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0b467c36-3c99-4ecd-afc0-414785e6756b PiperOrigin-RevId: 345352118 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6dd12554391..3ee1f0bce71 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fa6f039d939d9bcf30fc5f988692582fd4e829b206476e329383fe22bdd5b643", - git_commit = "3c302f4b81af2502e5fa34d3b069a4776b039eac", + sha256 = "8d27b7cb487a0d14cbbcb2d6cab6903ca7e45d9c99b4219579027ff9899afce4", + git_commit = "37b8b846664750d950d79023695f0cca1e802edd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b93a5058a6e1da37c9ca093777349d005018b279 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 3 Dec 2020 00:01:36 -0800 Subject: [PATCH 4463/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/59c70842-740c-4d4b-8096-eb475a2f532c PiperOrigin-RevId: 345392477 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3ee1f0bce71..7837ca10040 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8d27b7cb487a0d14cbbcb2d6cab6903ca7e45d9c99b4219579027ff9899afce4", - git_commit = "37b8b846664750d950d79023695f0cca1e802edd", + sha256 = "af3750c916216c4928504d69c8a0a927b11400d111023d575cdc6dc386349dd9", + git_commit = "4679dcf1eed1d13bdc3f6288afcd46395b8e84c0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 04e49418249e0f1851c13a97062186a5b9441d71 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 3 Dec 2020 06:01:55 -0800 Subject: [PATCH 4464/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/63e6557a-9be8-40fc-95f6-f87a3c60d10b PiperOrigin-RevId: 345434489 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7837ca10040..db55406f43f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "af3750c916216c4928504d69c8a0a927b11400d111023d575cdc6dc386349dd9", - git_commit = "4679dcf1eed1d13bdc3f6288afcd46395b8e84c0", + sha256 = "18b7b496614200a8f5929dd14cad235b31ab3c0c9f76bfbd695da4221e97de6b", + git_commit = "6c0245b27c3b5dd319d3021b05c89a0cd17beb20", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3033b0ba70b04586551e713b6e0faf1fcdc13955 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 3 Dec 2020 12:01:23 -0800 Subject: [PATCH 4465/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/48a09d66-c1ee-4434-b02e-626b5d6dfe03 PiperOrigin-RevId: 345503949 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index db55406f43f..08f82a06310 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "18b7b496614200a8f5929dd14cad235b31ab3c0c9f76bfbd695da4221e97de6b", - git_commit = "6c0245b27c3b5dd319d3021b05c89a0cd17beb20", + sha256 = "91c22f94f40ca1be5789a17e2a7d81d0673a08b27f855219329c4ecb6adaea6a", + git_commit = "3df99c1ed47ff2028f7b5a4e1985aff923e7c568", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 15041f9087388c6f6da09d4d6454e1f1de6d88fa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 3 Dec 2020 18:01:53 -0800 Subject: [PATCH 4466/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e342ee6c-bc8b-4ebd-824a-4f486816a998 PiperOrigin-RevId: 345575574 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 08f82a06310..4b16f0d6788 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "91c22f94f40ca1be5789a17e2a7d81d0673a08b27f855219329c4ecb6adaea6a", - git_commit = "3df99c1ed47ff2028f7b5a4e1985aff923e7c568", + sha256 = "53a92d250cc4d5573621b5dde84c84ce865a066171b3fe145c1da4b118bcad2c", + git_commit = "4c8435a3618933102eb4f4c25b79fa24bc4727a7", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b4cc916dd9d1ee51bc0a1d803435931be45412d4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 4 Dec 2020 00:01:23 -0800 Subject: [PATCH 4467/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/20606c54-3b49-4f14-8baf-8037ac575357 PiperOrigin-RevId: 345618670 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4b16f0d6788..ef4b0e023de 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "53a92d250cc4d5573621b5dde84c84ce865a066171b3fe145c1da4b118bcad2c", - git_commit = "4c8435a3618933102eb4f4c25b79fa24bc4727a7", + sha256 = "f7a5e6da322313aea7b4bd5f94638ee3f85fd88aa5e7e63f2c75642b89a339b7", + git_commit = "76e16b206da53f73931661edb6cdaf6c7108576f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 89077c83a06d34bca54e5e276f8ed5ea0651c76e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 4 Dec 2020 06:01:27 -0800 Subject: [PATCH 4468/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b99ecbde-642d-4174-b067-a5279703cf90 PiperOrigin-RevId: 345662000 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ef4b0e023de..c374daccde0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f7a5e6da322313aea7b4bd5f94638ee3f85fd88aa5e7e63f2c75642b89a339b7", - git_commit = "76e16b206da53f73931661edb6cdaf6c7108576f", + sha256 = "998575e8d3718b6d793a98db65624cfa2b24fddb55dca999fdbe0636ad220207", + git_commit = "0fd465c057d9405fed776b41b3796a05db219f8f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2fd9648664b24c9e54d48ebe891e717136444d0b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 4 Dec 2020 12:01:29 -0800 Subject: [PATCH 4469/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6253a8b8-57f9-4a14-a7f4-08947b89491a PiperOrigin-RevId: 345727555 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c374daccde0..44c3c24d3f3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "998575e8d3718b6d793a98db65624cfa2b24fddb55dca999fdbe0636ad220207", - git_commit = "0fd465c057d9405fed776b41b3796a05db219f8f", + sha256 = "92ad7397d71bd999ca03391e774eafa54286f4954e8dd70082a3ec10ce2b2bc5", + git_commit = "5543ed6f0767ea441949d99d46a648cf0a8a9cbb", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From dac7294930ef27cdf72d807ce7dd7ab582087bcd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 4 Dec 2020 18:01:26 -0800 Subject: [PATCH 4470/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9de22b66-cfa7-45c7-97e4-37c8f6e0f8e8 PiperOrigin-RevId: 345793707 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 44c3c24d3f3..17c4d5536d9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "92ad7397d71bd999ca03391e774eafa54286f4954e8dd70082a3ec10ce2b2bc5", - git_commit = "5543ed6f0767ea441949d99d46a648cf0a8a9cbb", + sha256 = "3bc16067e64b8f5d6c2901cf56de24871369a4c3e6c473f2505f86a7222cbea1", + git_commit = "993a74f438b6674d8496f37829e107319583a1c3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c7be212ea2b53093bb0a239953492aa505a659e3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 5 Dec 2020 00:01:31 -0800 Subject: [PATCH 4471/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/881ea26f-f496-4c43-9e22-a19626cbcf7a PiperOrigin-RevId: 345824372 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 17c4d5536d9..31cda46b6ba 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3bc16067e64b8f5d6c2901cf56de24871369a4c3e6c473f2505f86a7222cbea1", - git_commit = "993a74f438b6674d8496f37829e107319583a1c3", + sha256 = "f70a49073c7177a8fea72cadcddf9d6a296a0e0cafba4d66e41e6f7fd4993e30", + git_commit = "71a0295323a456ea87a9d257e6bd137465a6c0e9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 29e90b5eb436ea998e93c6cf25229cb5e65b951f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 5 Dec 2020 06:01:43 -0800 Subject: [PATCH 4472/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/77af21e7-71ec-4c75-af53-a8338afbd632 PiperOrigin-RevId: 345849961 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 31cda46b6ba..739d315df10 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f70a49073c7177a8fea72cadcddf9d6a296a0e0cafba4d66e41e6f7fd4993e30", - git_commit = "71a0295323a456ea87a9d257e6bd137465a6c0e9", + sha256 = "4a60a298127a2956b84589774993d4632d8b654827724e9ba364526753bd5648", + git_commit = "d39353424dd3e96ac9af021b09db4462f578dd29", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5d77446855e429b7adcde584d8076fe5eeda3dd1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 5 Dec 2020 12:01:32 -0800 Subject: [PATCH 4473/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b0ec5ce8-e7a2-46a8-aae5-7164c3ac6c44 PiperOrigin-RevId: 345874028 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 739d315df10..d1c116d213d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4a60a298127a2956b84589774993d4632d8b654827724e9ba364526753bd5648", - git_commit = "d39353424dd3e96ac9af021b09db4462f578dd29", + sha256 = "f07d2cc1f3cc957e36ce80576ea47ffb46d887d3e1c28311ae0f8ed32128f7b4", + git_commit = "1350613d6f8758d3fce2cec43228bd6ab8162641", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c91ffaf9d26670c9d48fb48f1149eab13f7aae27 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 6 Dec 2020 00:01:39 -0800 Subject: [PATCH 4474/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/36b5138c-85d7-4a16-aeac-6c8bb4cd6423 PiperOrigin-RevId: 345922161 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d1c116d213d..a1cc8cb920a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f07d2cc1f3cc957e36ce80576ea47ffb46d887d3e1c28311ae0f8ed32128f7b4", - git_commit = "1350613d6f8758d3fce2cec43228bd6ab8162641", + sha256 = "58a5a4a2ed838b7b9e31e9d1be3fa5f76fe82cf89d65e207e5d39f06d999ec98", + git_commit = "c99adee9ecdbd17cbf87f34cdeb8d2e72e8d1088", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 08f14e0619e2fb1d9cc8492b02bd36a9ccc55d1b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 6 Dec 2020 06:01:37 -0800 Subject: [PATCH 4475/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d7b07a42-1d8e-4173-ba72-d1d71b392d94 PiperOrigin-RevId: 345948371 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a1cc8cb920a..42ccd4c69e6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "58a5a4a2ed838b7b9e31e9d1be3fa5f76fe82cf89d65e207e5d39f06d999ec98", - git_commit = "c99adee9ecdbd17cbf87f34cdeb8d2e72e8d1088", + sha256 = "627034fecfda3e956426a97b814ad466271aac6b8401957650238ebbfb51bdc6", + git_commit = "cd1a74af28848d37f83c9dc23dc0bde69b0ae74b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c5f91cf2d12b280fbde9fece83932963b5d455be Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 6 Dec 2020 12:01:21 -0800 Subject: [PATCH 4476/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b0072d93-d1dc-4e02-a301-69775a7558f9 PiperOrigin-RevId: 345972156 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 42ccd4c69e6..7a14f4a75d5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "627034fecfda3e956426a97b814ad466271aac6b8401957650238ebbfb51bdc6", - git_commit = "cd1a74af28848d37f83c9dc23dc0bde69b0ae74b", + sha256 = "a7e09ee38d22d76dc4c44bf06b85c0e8eccd8acae3370f0135fc888646d9993e", + git_commit = "fefcd5704ba4efe873485b981644ce0fb18c2440", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 78840bfde67702ec80df43277892b458e97acb5c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 7 Dec 2020 06:01:34 -0800 Subject: [PATCH 4477/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/29cea99a-e1b4-4b50-aa26-da9ff3071754 PiperOrigin-RevId: 346075527 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7a14f4a75d5..f4231054e5e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a7e09ee38d22d76dc4c44bf06b85c0e8eccd8acae3370f0135fc888646d9993e", - git_commit = "fefcd5704ba4efe873485b981644ce0fb18c2440", + sha256 = "57331bb5e4369aed7a82f9451961462194954207c4608a456847ce8bd871d847", + git_commit = "0a81442e0380c7ef104c68358457a806fba32895", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c7387074cfab9d8225d3a573a91d3b73cf82622e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 7 Dec 2020 12:01:46 -0800 Subject: [PATCH 4478/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d0eb7497-b9c6-4db7-ac52-a131ad5bebe1 PiperOrigin-RevId: 346147454 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f4231054e5e..f3d4796daab 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "57331bb5e4369aed7a82f9451961462194954207c4608a456847ce8bd871d847", - git_commit = "0a81442e0380c7ef104c68358457a806fba32895", + sha256 = "b8c831de980f02653997991ca449ad988b5b43428d0827cd59278540b7ab4eb3", + git_commit = "e15bdc0dfa0e2fd8e2576aaca5febc9cddf7ebf4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d77fad0539624b47c05821dcc4cfe67b08a36ca5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 7 Dec 2020 18:01:38 -0800 Subject: [PATCH 4479/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ba99e3d0-b3c5-4663-b3b9-b42b520d52ea PiperOrigin-RevId: 346220758 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f3d4796daab..cae0c9bba75 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b8c831de980f02653997991ca449ad988b5b43428d0827cd59278540b7ab4eb3", - git_commit = "e15bdc0dfa0e2fd8e2576aaca5febc9cddf7ebf4", + sha256 = "571a3e887b5713f25bf2f78b8d610c184bca04550c1d012f409fb7c0c530b68e", + git_commit = "d3ed1da7b9e4b1d32c70c3ec87704b35d2542c46", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f1dc5fdca31af4916d7c35d7188fcd96671ff39f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 8 Dec 2020 00:01:38 -0800 Subject: [PATCH 4480/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/93a127bb-f59c-4f8d-9481-1ce02a9f023c PiperOrigin-RevId: 346263244 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cae0c9bba75..e822788c60f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "571a3e887b5713f25bf2f78b8d610c184bca04550c1d012f409fb7c0c530b68e", - git_commit = "d3ed1da7b9e4b1d32c70c3ec87704b35d2542c46", + sha256 = "e1e47dff11a449e5837415aaea700da8f0e381b3647a559c02c69b2ab03447c7", + git_commit = "0939f0b7a8aed30559b54ae0dd5b9e6b312de1c5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a41059a849bcfdf37f4bc539bd54653f2a5e3476 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 8 Dec 2020 06:01:25 -0800 Subject: [PATCH 4481/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/507860b2-6a1b-4617-bab0-1b6fbe6953c3 PiperOrigin-RevId: 346306413 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e822788c60f..e96d8582a2c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e1e47dff11a449e5837415aaea700da8f0e381b3647a559c02c69b2ab03447c7", - git_commit = "0939f0b7a8aed30559b54ae0dd5b9e6b312de1c5", + sha256 = "3c1f35d9cf0ab83f838ac5d5cb8efa990743d89fee51fe1cedf9ea9c0df82e67", + git_commit = "b0e5853cf0680f22c09b55eee68fc970391b70a6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e206489e91a6c20b5841bf954e428870bc7b5079 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 8 Dec 2020 12:01:27 -0800 Subject: [PATCH 4482/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c79677cb-32c5-4dc9-8e67-e37018968bee PiperOrigin-RevId: 346378763 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e96d8582a2c..41fd9b12cf4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3c1f35d9cf0ab83f838ac5d5cb8efa990743d89fee51fe1cedf9ea9c0df82e67", - git_commit = "b0e5853cf0680f22c09b55eee68fc970391b70a6", + sha256 = "36f6fadbfd740841bb0bd86f0326a6710168de967a1f3c3ee335a07e816c1047", + git_commit = "3c37f87c45bac0bcbc7862299decbeac3df0f0a0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e468701de0f03ef6fe07bb3bc5b9b503c025a00a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 8 Dec 2020 18:01:43 -0800 Subject: [PATCH 4483/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0bc5a793-9fdc-4cba-9911-4501df505649 PiperOrigin-RevId: 346450915 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 41fd9b12cf4..b0ad2f389d2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "36f6fadbfd740841bb0bd86f0326a6710168de967a1f3c3ee335a07e816c1047", - git_commit = "3c37f87c45bac0bcbc7862299decbeac3df0f0a0", + sha256 = "0c0e3720e48301e88fc985b79676f3ceb39cb194d5316b31747e80691804fb17", + git_commit = "38b3c3c83d811768c81a32e24ed1d75752c99e46", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d5ee53793dc6de7114d595062a2350944ded547c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 9 Dec 2020 00:01:35 -0800 Subject: [PATCH 4484/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/709317e7-30b5-4aee-bf83-ad890f963fbc PiperOrigin-RevId: 346490974 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b0ad2f389d2..ede2908fced 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0c0e3720e48301e88fc985b79676f3ceb39cb194d5316b31747e80691804fb17", - git_commit = "38b3c3c83d811768c81a32e24ed1d75752c99e46", + sha256 = "d0f10fb63161ab4c483fe7024d76917e328ea620fdb2ceef7f43a1a14846bdb2", + git_commit = "0923a15fa7ee3351f69faad5664bbf47829b30a1", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e444bf782256bb2e168a3e77d3654ae4ae7921f0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 9 Dec 2020 06:01:48 -0800 Subject: [PATCH 4485/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5bba7984-5569-4b33-888e-8efb1c1912ce PiperOrigin-RevId: 346534237 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ede2908fced..31ed4d033eb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d0f10fb63161ab4c483fe7024d76917e328ea620fdb2ceef7f43a1a14846bdb2", - git_commit = "0923a15fa7ee3351f69faad5664bbf47829b30a1", + sha256 = "687d0d60e7237f3b024162f6681dc76338a7f43cade1ae1f42ad7ed80982b314", + git_commit = "6e28513ec1e1d7d895bea8478f08f84265a113e9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6d2cc2208c6d4b4291ea5dd6ac8ddd41321ab2a9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 9 Dec 2020 12:01:23 -0800 Subject: [PATCH 4486/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ed9db385-61b5-48be-9db7-4498f22b6ea9 PiperOrigin-RevId: 346604798 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 31ed4d033eb..4b930a86b14 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "687d0d60e7237f3b024162f6681dc76338a7f43cade1ae1f42ad7ed80982b314", - git_commit = "6e28513ec1e1d7d895bea8478f08f84265a113e9", + sha256 = "090cad07b7e9fe04cea3dedefb057f4f51b8c82c17b012c575a00f0d64a14c66", + git_commit = "e874244346b3945de77d304d5f12e192aaa6f539", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 30dd2fe67ad00b38324d01351ca52c571701f97f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 9 Dec 2020 14:42:06 -0800 Subject: [PATCH 4487/8103] Updated tests to newer API PiperOrigin-RevId: 346641073 --- .../aspired_versions_manager_benchmark.cc | 130 ++++++++++-------- tensorflow_serving/util/BUILD | 1 + .../util/fast_read_dynamic_ptr_benchmark.cc | 121 +++++++++------- 3 files changed, 147 insertions(+), 105 deletions(-) diff --git a/tensorflow_serving/core/aspired_versions_manager_benchmark.cc b/tensorflow_serving/core/aspired_versions_manager_benchmark.cc index fc5dbf8a0a0..d26e6afe4f8 100644 --- a/tensorflow_serving/core/aspired_versions_manager_benchmark.cc +++ b/tensorflow_serving/core/aspired_versions_manager_benchmark.cc @@ -79,7 +79,7 @@ class BenchmarkState { } // Actually perform iters reads on the fast read ptr. - void RunBenchmark(int iters, int num_threads); + void RunBenchmark(::testing::benchmark::State& state, int num_threads); private: void SetUp(); @@ -165,10 +165,7 @@ int64 BenchmarkState::GetLatestVersion(const bool do_work) { void BenchmarkState::RunUpdate() { StartServing(GetLatestVersion(false) + 1); } void BenchmarkState::SetUp() { - testing::StopTiming(); - StartServing(0); - if (interval_micros_ > 0) { PeriodicFunction::Options pf_options; pf_options.thread_name_prefix = @@ -176,87 +173,106 @@ void BenchmarkState::SetUp() { update_thread_.reset(new PeriodicFunction([this] { RunUpdate(); }, interval_micros_, pf_options)); } - - testing::StartTiming(); } void BenchmarkState::TearDown() { - testing::StopTiming(); - // Destruct the update thread which blocks until it exits. update_thread_.reset(); - - testing::StartTiming(); } void BenchmarkState::RunReads(int iters) { - for (int i = 0; i < iters; i++) { + for (int i = 0; i < iters; ++i) { // Prevents the compiler from optimizing this away. CHECK_GE(GetLatestVersion(do_work_), 0); } } -void BenchmarkState::RunBenchmark(int iters, int num_threads) { +void BenchmarkState::RunBenchmark(::testing::benchmark::State& state, + int num_threads) { SetUp(); - testing::StopTiming(); - - // The benchmarking system by default uses cpu time to calculate items per - // second, which would include time spent by all the threads on the cpu. - // Instead of that we use real-time here so that we can see items/s increasing - // with increasing threads, which is easier to understand. - testing::UseRealTime(); - testing::ItemsProcessed(num_threads * iters); - - std::unique_ptr pool(new thread::ThreadPool( - Env::Default(), "RunBenchmarkReadThread", num_threads)); - for (int thread_index = 0; thread_index < num_threads; ++thread_index) { - std::function run_reads_fn = [&]() { - // Wait until all_read_threads_scheduled_ has been notified. - all_read_threads_scheduled_.WaitForNotification(); - RunReads(iters); - }; - pool->Schedule(run_reads_fn); + // To be compatible with the Google benchmark framework, the tensorflow new + // benchmark API requires that each benchmark routine has exactly one. + // `for (auto s : state)` benchmark loop (in all threads). + // Therefore we cannot have multiple threads executing the same for-each loop. + // We need to introduce a new parameter for the fixed number of iteration in + // each thread. + + // Pick a reasonably large value. + const int kSubIters = 500; + + // The benchmark timing loop. Timer automatically starts/stops. + // In each iteration, we spin up a thread-pool and execute kSubIters in each + // thread. + for (auto s : state) { + // Exclude the scheduling setup time. + state.PauseTiming(); + std::unique_ptr pool(new thread::ThreadPool( + Env::Default(), "RunBenchmarkReadThread", num_threads)); + for (int thread_index = 0; thread_index < num_threads; ++thread_index) { + std::function run_reads_fn = [&]() { + // Wait until all_read_threads_scheduled_ has been notified. + all_read_threads_scheduled_.WaitForNotification(); + RunReads(kSubIters); + }; + pool->Schedule(run_reads_fn); + } + state.ResumeTiming(); + all_read_threads_scheduled_.Notify(); + + // Note that destructing the threadpool blocks on completion of all + // scheduled execution. This is intentional as we want all threads to + // complete iters iterations. It also means that the timing may be off + // (work done == iters * num_threads) and includes time scheduling work on + // the threads. + pool.reset(); } - testing::StartTiming(); - all_read_threads_scheduled_.Notify(); - - // Note that destructing the threadpool blocks on completion of all scheduled - // execution. This is intentional as we want all threads to complete iters - // iterations. It also means that the timing may be off (work done == iters * - // num_threads) and includes time scheduling work on the threads. - pool.reset(); + state.SetItemsProcessed(num_threads * kSubIters * state.iterations()); TearDown(); } -static void BenchmarkReadsAndUpdates(int iters, int num_threads, - int interval_micros, bool do_work) { - BenchmarkState state(interval_micros, do_work); - state.RunBenchmark(iters, num_threads); +void BenchmarkReadsAndUpdates(::testing::benchmark::State& state, + int num_threads, int interval_micros, + bool do_work) { + BenchmarkState bm_state(interval_micros, do_work); + bm_state.RunBenchmark(state, num_threads); } -static void BM_Work_NoUpdates_Reads(int iters, int num_threads) { +void BM_Work_NoUpdates_Reads(::testing::benchmark::State& state) { + const int num_threads = state.range(0); + // No updates. 0 interval_micros signals not to update at all. - BenchmarkReadsAndUpdates(iters, num_threads, 0, true); + BenchmarkReadsAndUpdates(state, num_threads, 0, true); } -static void BM_Work_FrequentUpdates_Reads(int iters, int num_threads) { +void BM_Work_FrequentUpdates_Reads(::testing::benchmark::State& state) { + const int num_threads = state.range(0); + // Frequent updates: 1000 micros == 1 millisecond or 1000qps of updates - BenchmarkReadsAndUpdates(iters, num_threads, 1000, true); + BenchmarkReadsAndUpdates(state, num_threads, 1000, true); } -static void BM_NoWork_NoUpdates_Reads(int iters, int num_threads) { +void BM_NoWork_NoUpdates_Reads(::testing::benchmark::State& state) { + const int num_threads = state.range(0); + // No updates. 0 interval_micros signals not to update at all. - BenchmarkReadsAndUpdates(iters, num_threads, 0, false); + BenchmarkReadsAndUpdates(state, num_threads, 0, false); } -static void BM_NoWork_FrequentUpdates_Reads(int iters, int num_threads) { +void BM_NoWork_FrequentUpdates_Reads(::testing::benchmark::State& state) { + const int num_threads = state.range(0); + // Frequent updates: 1000 micros == 1 millisecond or 1000qps of updates - BenchmarkReadsAndUpdates(iters, num_threads, 1000, false); + BenchmarkReadsAndUpdates(state, num_threads, 1000, false); } +// The benchmarking system by default uses cpu time to calculate items per +// second, which would include time spent by all the threads on the cpu. +// Instead of that we use real-time here so that we can see items/s increasing +// with increasing threads, which is easier to understand. BENCHMARK(BM_Work_NoUpdates_Reads) + ->UseRealTime() ->Arg(1) ->Arg(2) ->Arg(4) @@ -266,6 +282,7 @@ BENCHMARK(BM_Work_NoUpdates_Reads) ->Arg(64); BENCHMARK(BM_Work_FrequentUpdates_Reads) + ->UseRealTime() ->Arg(1) ->Arg(2) ->Arg(4) @@ -275,6 +292,7 @@ BENCHMARK(BM_Work_FrequentUpdates_Reads) ->Arg(64); BENCHMARK(BM_NoWork_NoUpdates_Reads) + ->UseRealTime() ->Arg(1) ->Arg(2) ->Arg(4) @@ -284,6 +302,7 @@ BENCHMARK(BM_NoWork_NoUpdates_Reads) ->Arg(64); BENCHMARK(BM_NoWork_FrequentUpdates_Reads) + ->UseRealTime() ->Arg(1) ->Arg(2) ->Arg(4) @@ -292,9 +311,7 @@ BENCHMARK(BM_NoWork_FrequentUpdates_Reads) ->Arg(32) ->Arg(64); -static void BM_GetServableHandle(const int iters) { - testing::StopTiming(); - +void BM_GetServableHandle(::testing::benchmark::State& state) { // Number of different servable streams. constexpr int kNumServableStreams = 10; // Number of versions of a particular servable stream. @@ -358,13 +375,14 @@ static void BM_GetServableHandle(const int iters) { }(); ServableHandle handle; - testing::ItemsProcessed(iters); - testing::StartTiming(); - for (int i = 0; i < iters; ++i) { + int i = 0; + for (auto s : state) { const Status status = manager->GetServableHandle(requests[i % kNumRequests], &handle); TF_CHECK_OK(status) << status; + ++i; } + state.SetItemsProcessed(state.iterations()); } BENCHMARK(BM_GetServableHandle); diff --git a/tensorflow_serving/util/BUILD b/tensorflow_serving/util/BUILD index 390c8d95889..24a63b0e754 100644 --- a/tensorflow_serving/util/BUILD +++ b/tensorflow_serving/util/BUILD @@ -146,6 +146,7 @@ cc_test( cc_test( name = "fast_read_dynamic_ptr_benchmark", + timeout = "long", srcs = ["fast_read_dynamic_ptr_benchmark.cc"], deps = [ ":fast_read_dynamic_ptr", diff --git a/tensorflow_serving/util/fast_read_dynamic_ptr_benchmark.cc b/tensorflow_serving/util/fast_read_dynamic_ptr_benchmark.cc index 61af6f0943c..c6f7514d276 100644 --- a/tensorflow_serving/util/fast_read_dynamic_ptr_benchmark.cc +++ b/tensorflow_serving/util/fast_read_dynamic_ptr_benchmark.cc @@ -73,7 +73,8 @@ class BenchmarkState { : update_micros_(update_micros), do_work_(do_work) {} // Actually perform iters reads on the fast read ptr. - void RunBenchmarkReadIterations(int num_threads, int iters); + void RunBenchmarkReadIterations(int num_threads, + ::testing::benchmark::State& state); // Sets up the state for a benchmark run. // update_micros: Number of micros to sleep between updates. If set to 0, does @@ -120,8 +121,6 @@ void BenchmarkState::RunUpdateThread() { } void BenchmarkState::Setup() { - testing::StopTiming(); - // setup fast read int ptr: std::unique_ptr i(new int(0)); fast_ptr_.Update(std::move(i)); @@ -133,24 +132,18 @@ void BenchmarkState::Setup() { update_thread_.reset(new PeriodicFunction([this] { RunUpdateThread(); }, update_micros_, pf_options)); } - - testing::StartTiming(); } void BenchmarkState::Teardown() { - testing::StopTiming(); - // Destruct the update thread which blocks until it exits. update_thread_.reset(); - - testing::StartTiming(); } void BenchmarkState::RunBenchmarkReads(int iters) { // Wait until all_read_threads_scheduled_ has been notified. all_read_threads_scheduled_.WaitForNotification(); - for (int i = 0; i < iters; i++) { + for (int i = 0; i < iters; ++i) { std::shared_ptr current = fast_ptr_.get(); int bigger = *current + 1; testing::DoNotOptimize(bigger); @@ -160,63 +153,90 @@ void BenchmarkState::RunBenchmarkReads(int iters) { } } -void BenchmarkState::RunBenchmarkReadIterations(int num_threads, int iters) { - testing::StopTiming(); - - // The benchmarking system by default uses cpu time to calculate items per - // second, which would include time spent by all the threads on the cpu. - // Instead of that we use real-time here so that we can see items/s increasing - // with increasing threads, which is easier to understand. - testing::UseRealTime(); - testing::ItemsProcessed(num_threads * iters); - - thread::ThreadPool pool(Env::Default(), "RunBenchmarkReadThread", - num_threads); - for (int thread_index = 0; thread_index < num_threads; ++thread_index) { - std::function run_reads_fn = [iters, this]() { - RunBenchmarkReads(iters); - }; - pool.Schedule(run_reads_fn); +void BenchmarkState::RunBenchmarkReadIterations( + int num_threads, ::testing::benchmark::State& state) { + CHECK_GE(num_threads, 1) << " ****unexpected thread number"; + // To be compatible with the Google benchmark framework, the tensorflow new + // benchmark API requires that each benchmark routine has exactly one. + // `for (auto s : state)` benchmark loop (in all threads). + // Therefore we cannot have multiple threads executing the same for-each loop. + // We need to introduce a new parameter for the fixed number of iteration in + // each thread. + + // Pick a reasonably large value. + const int kSubIters = 100; + + // The benchmark timing loop. Timer automatically starts/stops. + // In each iteration, we spin up a thread-pool and execute kSubIters in each + // thread. + for (auto s : state) { + // Exlucde scheduling setup time. + state.PauseTiming(); + + thread::ThreadPool pool(Env::Default(), "RunBenchmarkReadThread", + num_threads); + for (int thread_index = 0; thread_index < num_threads; ++thread_index) { + std::function run_reads_fn = [&]() { + RunBenchmarkReads(kSubIters); + }; + pool.Schedule(run_reads_fn); + } + state.ResumeTiming(); + all_read_threads_scheduled_.Notify(); + + // Note that destructing the threadpool blocks on completion of all + // scheduled execution. This is intentional as we want all threads to + // complete iters iterations. It also means that the timing may be off (work + // done == iters * num_threads) and includes time scheduling work on the + // threads. } - testing::StartTiming(); - all_read_threads_scheduled_.Notify(); - - // Note that destructing the threadpool blocks on completion of all scheduled - // execution. - // This is intentional as we want all threads to complete iters iterations. - // It also means that the timing may be off (work done == iters * - // num_threads) and includes time scheduling work on the threads. + testing::ItemsProcessed(num_threads * kSubIters * state.iterations()); } -static void BenchmarkReadsAndUpdates(int update_micros, bool do_work, int iters, - int num_threads) { - BenchmarkState state(update_micros, do_work); - state.Setup(); - state.RunBenchmarkReadIterations(num_threads, iters); - state.Teardown(); +void BenchmarkReadsAndUpdates(int update_micros, bool do_work, + ::testing::benchmark::State& state, + int num_threads) { + BenchmarkState bm_state(update_micros, do_work); + bm_state.Setup(); + bm_state.RunBenchmarkReadIterations(num_threads, state); + bm_state.Teardown(); } -static void BM_Work_NoUpdates_Reads(int iters, int num_threads) { +void BM_Work_NoUpdates_Reads(::testing::benchmark::State& state) { + const int num_threads = state.range(0); + CHECK_GT(num_threads, 0); // No updates. 0 update_micros signals not to update at all. - BenchmarkReadsAndUpdates(0, true, iters, num_threads); + BenchmarkReadsAndUpdates(0, true, state, num_threads); } -static void BM_Work_FrequentUpdates_Reads(int iters, int num_threads) { +void BM_Work_FrequentUpdates_Reads(::testing::benchmark::State& state) { + const int num_threads = state.range(0); + CHECK_GT(num_threads, 0); // Frequent updates: 1000 micros == 1 millisecond or 1000qps of updates - BenchmarkReadsAndUpdates(1000, true, iters, num_threads); + BenchmarkReadsAndUpdates(1000, true, state, num_threads); } -static void BM_NoWork_NoUpdates_Reads(int iters, int num_threads) { +void BM_NoWork_NoUpdates_Reads(::testing::benchmark::State& state) { + const int num_threads = state.range(0); + CHECK_GT(num_threads, 0); // No updates. 0 update_micros signals not to update at all. - BenchmarkReadsAndUpdates(0, false, iters, num_threads); + BenchmarkReadsAndUpdates(0, false, state, num_threads); } -static void BM_NoWork_FrequentUpdates_Reads(int iters, int num_threads) { +void BM_NoWork_FrequentUpdates_Reads(::testing::benchmark::State& state) { + const int num_threads = state.range(0); + CHECK_GT(num_threads, 0); // Frequent updates: 1000 micros == 1 millisecond or 1000qps of updates - BenchmarkReadsAndUpdates(1000, false, iters, num_threads); + BenchmarkReadsAndUpdates(1000, false, state, num_threads); } +// The benchmarking system by default uses cpu time to calculate items per +// second, which would include time spent by all the threads on the cpu. +// Instead of that we use real-time here so that we can see items/s increasing +// with increasing threads, which is easier to understand. + BENCHMARK(BM_Work_NoUpdates_Reads) + ->UseRealTime() ->Arg(1) ->Arg(2) ->Arg(4) @@ -226,6 +246,7 @@ BENCHMARK(BM_Work_NoUpdates_Reads) ->Arg(64); BENCHMARK(BM_Work_FrequentUpdates_Reads) + ->UseRealTime() ->Arg(1) ->Arg(2) ->Arg(4) @@ -235,6 +256,7 @@ BENCHMARK(BM_Work_FrequentUpdates_Reads) ->Arg(64); BENCHMARK(BM_NoWork_NoUpdates_Reads) + ->UseRealTime() ->Arg(1) ->Arg(2) ->Arg(4) @@ -244,6 +266,7 @@ BENCHMARK(BM_NoWork_NoUpdates_Reads) ->Arg(64); BENCHMARK(BM_NoWork_FrequentUpdates_Reads) + ->UseRealTime() ->Arg(1) ->Arg(2) ->Arg(4) From a694a63111cf48f079b635672f363e3181e0095b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 9 Dec 2020 18:01:22 -0800 Subject: [PATCH 4488/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/65298204-c4f0-429d-982f-9bb92c777cde PiperOrigin-RevId: 346679134 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4b930a86b14..9f9d5ec0417 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "090cad07b7e9fe04cea3dedefb057f4f51b8c82c17b012c575a00f0d64a14c66", - git_commit = "e874244346b3945de77d304d5f12e192aaa6f539", + sha256 = "4ae06daa5b09c62f31b7bc1f781fd59053f286dd64355830d8c2ac601b795ef0", + git_commit = "0eadbb13cef1226b1bae17c941f7870734d97f8a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ac539c5279d3fbe8352226fb30b7264d7b2c1943 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 10 Dec 2020 00:01:24 -0800 Subject: [PATCH 4489/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/930994f5-54be-410b-8103-967f85d6ccb0 PiperOrigin-RevId: 346722651 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9f9d5ec0417..c0f10bf9f6c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4ae06daa5b09c62f31b7bc1f781fd59053f286dd64355830d8c2ac601b795ef0", - git_commit = "0eadbb13cef1226b1bae17c941f7870734d97f8a", + sha256 = "cd51fd32f4eea37549b1c9be8446c990ac7fbce7b3fcff3fbc7240d2f3a1e1da", + git_commit = "d43b133ca75c2a3a4fe1dc092cad7b09bce7defb", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From eaa484cdedcbcd90e7a3e7cd900718a71fc5d2e0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 10 Dec 2020 06:01:26 -0800 Subject: [PATCH 4490/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/76081227-82e2-4ab4-8f45-bc5add884cb2 PiperOrigin-RevId: 346767874 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c0f10bf9f6c..997f041994e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cd51fd32f4eea37549b1c9be8446c990ac7fbce7b3fcff3fbc7240d2f3a1e1da", - git_commit = "d43b133ca75c2a3a4fe1dc092cad7b09bce7defb", + sha256 = "93fb7ddcbb00c8eb5881f08b085323a0361e49ebb0c8ff399121be2d1eaa1751", + git_commit = "9ca469ee6d2d716eb4c03fdee4d5d21d40b9a775", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 951b73b06369874f96a03abc28c27e9972308520 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 10 Dec 2020 12:01:25 -0800 Subject: [PATCH 4491/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/09d62e17-b701-44e2-96a9-8acd39b2bf41 PiperOrigin-RevId: 346834894 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 997f041994e..a6e1467c164 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "93fb7ddcbb00c8eb5881f08b085323a0361e49ebb0c8ff399121be2d1eaa1751", - git_commit = "9ca469ee6d2d716eb4c03fdee4d5d21d40b9a775", + sha256 = "d17afee0da510cc1bd17aa95363136c280b4e9f990812ff188f52beefe78626f", + git_commit = "4a227e9fc5f3b5fc4bbcf96aa322d050375e21d0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4e9aa76834c6410c5ead8d38e9da57a5dc8988cf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 10 Dec 2020 18:01:22 -0800 Subject: [PATCH 4492/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4522d2b1-8db7-44ff-9223-e8ed2604549c PiperOrigin-RevId: 346905137 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a6e1467c164..e33ffaf3dd6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d17afee0da510cc1bd17aa95363136c280b4e9f990812ff188f52beefe78626f", - git_commit = "4a227e9fc5f3b5fc4bbcf96aa322d050375e21d0", + sha256 = "e0e387b9034c2de9ced3025c4cf009bb2411a7b96511b0c2021a555e128573a2", + git_commit = "ece423eb03cc5fb1df17710c0f541e393039732d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6228fe86ca433d405f16b59280e9dcb1d94ec7d5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 11 Dec 2020 00:01:25 -0800 Subject: [PATCH 4493/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0e9b9449-619d-410d-b75e-f1ead081d2b6 PiperOrigin-RevId: 346944636 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e33ffaf3dd6..7ab108ed619 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e0e387b9034c2de9ced3025c4cf009bb2411a7b96511b0c2021a555e128573a2", - git_commit = "ece423eb03cc5fb1df17710c0f541e393039732d", + sha256 = "fde558726e49935f592561a9f2a3326a06315ecd4e521faa79691de1650c3324", + git_commit = "5a85d44038b1b7a2c0d2e59614bea85b52cacdfe", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 09b85506c5091845ae54cfc4d9e8672dfec45ae0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 11 Dec 2020 06:01:18 -0800 Subject: [PATCH 4494/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e7dc1c30-b506-4850-b063-8466db6f2d3c PiperOrigin-RevId: 346983826 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7ab108ed619..20e56c1de05 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fde558726e49935f592561a9f2a3326a06315ecd4e521faa79691de1650c3324", - git_commit = "5a85d44038b1b7a2c0d2e59614bea85b52cacdfe", + sha256 = "3fa373265e1a13fe8c985a62ac89e00a2d017a8e3dfa720a589a8707157816de", + git_commit = "4e082d53bfe2c8a2de91895a1dbf3f9ff765cea1", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ac89f7c395e412013d7266e2f9a6bbc0bd23972f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 11 Dec 2020 12:01:45 -0800 Subject: [PATCH 4495/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a4010d48-2651-4db3-b927-b6ade20df965 PiperOrigin-RevId: 347046807 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 20e56c1de05..8c9142b9e65 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3fa373265e1a13fe8c985a62ac89e00a2d017a8e3dfa720a589a8707157816de", - git_commit = "4e082d53bfe2c8a2de91895a1dbf3f9ff765cea1", + sha256 = "c21de9acc19e8d6cde69ff3c100f2874c0da1afb02046d59b7b8b399a59f0e61", + git_commit = "9f331e513dd6f5b6a541b1650472e8429e2cd5d0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2adf80a91f22357ba6490b55130ac4039b5e565b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 11 Dec 2020 18:01:19 -0800 Subject: [PATCH 4496/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/db7fe38e-6ca8-48fb-9e77-4a89d33c97e1 PiperOrigin-RevId: 347110547 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8c9142b9e65..899032a41a4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c21de9acc19e8d6cde69ff3c100f2874c0da1afb02046d59b7b8b399a59f0e61", - git_commit = "9f331e513dd6f5b6a541b1650472e8429e2cd5d0", + sha256 = "8d2e120431dde1a3baf7367d4b0f144f9672c05ce8e6eff66fdcb7254c177f9e", + git_commit = "5a51f9bbedd3b45a7e02873138a9dcea03912a07", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 941f87ddd8049fc3dcce7a01edb92ffceafd6289 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 12 Dec 2020 00:01:25 -0800 Subject: [PATCH 4497/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f235aef2-4cae-4c76-92ab-29affe787434 PiperOrigin-RevId: 347138933 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 899032a41a4..929e660243e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8d2e120431dde1a3baf7367d4b0f144f9672c05ce8e6eff66fdcb7254c177f9e", - git_commit = "5a51f9bbedd3b45a7e02873138a9dcea03912a07", + sha256 = "e1555da4755aa17fea979f12e35911dd0f1acbd6a66df7450f098e8e5ff5df3c", + git_commit = "564f72aef83e959cc5cb5e306f7cd888de9223fc", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From af76b29e7e43be2353c3f7e594d46b071fe223ec Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 12 Dec 2020 06:01:27 -0800 Subject: [PATCH 4498/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4b870df5-6544-4d6d-9961-003c775ba929 PiperOrigin-RevId: 347163035 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 929e660243e..b1571dcbe70 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e1555da4755aa17fea979f12e35911dd0f1acbd6a66df7450f098e8e5ff5df3c", - git_commit = "564f72aef83e959cc5cb5e306f7cd888de9223fc", + sha256 = "cfa72360507d263031aee85e2a24dbbaaba4b7678d4c60f413375e8546ce0688", + git_commit = "67a9764695429fc5963aeeb905526bfe5af45739", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 513d5a7ab3810f1d88a244f402148ed904e8ef80 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 13 Dec 2020 06:01:20 -0800 Subject: [PATCH 4499/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/cc2e1865-553a-4009-bed9-6ede3f73a614 PiperOrigin-RevId: 347252188 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b1571dcbe70..2a73a058291 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cfa72360507d263031aee85e2a24dbbaaba4b7678d4c60f413375e8546ce0688", - git_commit = "67a9764695429fc5963aeeb905526bfe5af45739", + sha256 = "8c1b8326345efe67db8d79afa4a6f3e0074beafa86438c6e065eed3e4b630ce2", + git_commit = "1987dba1a166d0336ccea8176dd2a16a65ddf19a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8e8c05df9e93dc69e3fb135fc5b6f4ccb2d43439 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 13 Dec 2020 12:01:29 -0800 Subject: [PATCH 4500/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ed3f4f03-8b8c-4879-b5eb-511b627ec4f9 PiperOrigin-RevId: 347274011 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2a73a058291..a0f3eaeff74 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8c1b8326345efe67db8d79afa4a6f3e0074beafa86438c6e065eed3e4b630ce2", - git_commit = "1987dba1a166d0336ccea8176dd2a16a65ddf19a", + sha256 = "160dd58542bc1c8de2fe149dc50a5adc2b09ab50e2af8347cbfd68cc8a3e888e", + git_commit = "92f07a46bbe49a44bbda5e6cf9b6c60630395986", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From de35e1e0639138665f012cc351ee3d01cbfc0a08 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 13 Dec 2020 18:01:17 -0800 Subject: [PATCH 4501/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0ac6c7fe-1753-408a-8941-cc37e9e0d225 PiperOrigin-RevId: 347297783 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a0f3eaeff74..0aa0154d602 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "160dd58542bc1c8de2fe149dc50a5adc2b09ab50e2af8347cbfd68cc8a3e888e", - git_commit = "92f07a46bbe49a44bbda5e6cf9b6c60630395986", + sha256 = "9c011afbff3dd27b7523c8d4497446445b8486cb9c9d16e00ef2d90775f99d05", + git_commit = "3727302f03a495b665efda24a845c4b30a7cffe9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ccb356259476994f19770b88060faf1959c8f88a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 14 Dec 2020 00:01:27 -0800 Subject: [PATCH 4502/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/57c4c409-c3a7-4fc5-aa5f-aa35a52ef509 PiperOrigin-RevId: 347327707 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0aa0154d602..b24b4db309c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9c011afbff3dd27b7523c8d4497446445b8486cb9c9d16e00ef2d90775f99d05", - git_commit = "3727302f03a495b665efda24a845c4b30a7cffe9", + sha256 = "bd714b531afea2951c14d625f4a95d85adf9789c77cc2923b2b1e1bb4a840f78", + git_commit = "1e8c13a7f079a33f17e5f14ac12e13781e52df3c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e7656d601dbbdedbf67303bdde05aa599940e852 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 14 Dec 2020 06:01:18 -0800 Subject: [PATCH 4503/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c3e3f36a-13d8-4771-bfaf-7e9f33e1c321 PiperOrigin-RevId: 347369764 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b24b4db309c..52313f3a16a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bd714b531afea2951c14d625f4a95d85adf9789c77cc2923b2b1e1bb4a840f78", - git_commit = "1e8c13a7f079a33f17e5f14ac12e13781e52df3c", + sha256 = "fd1560ba422d59de8c6e6984161e73f2a9dfb056418b73ec457543c7a60f7b84", + git_commit = "dd3499e26c7dceaad5333ea0762903de242150b5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6f1290848d6631bdfcee7464b138fc9553c381dc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 14 Dec 2020 12:01:32 -0800 Subject: [PATCH 4504/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/301f2963-0634-40c1-a47b-072a2b20e96c PiperOrigin-RevId: 347437974 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 52313f3a16a..0fa1f9396f4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fd1560ba422d59de8c6e6984161e73f2a9dfb056418b73ec457543c7a60f7b84", - git_commit = "dd3499e26c7dceaad5333ea0762903de242150b5", + sha256 = "d21f00444eebd0ef50a98215cd74bb74c13ebf32d454cf9bd00ecc563ba7b612", + git_commit = "6433b89b4969af4d2dd6eb0531e0f0507dfaffb4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7108346d0976034a871b0d000ae189fbc4e30f51 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 14 Dec 2020 18:01:18 -0800 Subject: [PATCH 4505/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8558959c-edf9-4b48-b388-5d0c72ccccbe PiperOrigin-RevId: 347509270 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0fa1f9396f4..dc53a730ab3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d21f00444eebd0ef50a98215cd74bb74c13ebf32d454cf9bd00ecc563ba7b612", - git_commit = "6433b89b4969af4d2dd6eb0531e0f0507dfaffb4", + sha256 = "c70c61632ba9a0d5cc6658e556da5cc9dad89bc73f5c87a6b1bb6784113f77a9", + git_commit = "751a245c7a212dd030f12665124bdfe8b3f1d09d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 08028d11e912fdb6fad25a9f4bce2b4070da5ab7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 14 Dec 2020 18:38:50 -0800 Subject: [PATCH 4506/8103] Move some utilities from batching_session to batching_util for upcoming TFRT SavedModel batching supports. PiperOrigin-RevId: 347514462 --- tensorflow_serving/batching/BUILD | 1 + .../batching/batching_session.cc | 43 ++-------------- .../batching/batching_session.h | 3 ++ tensorflow_serving/batching/batching_util.h | 50 +++++++++++++++++++ 4 files changed, 58 insertions(+), 39 deletions(-) diff --git a/tensorflow_serving/batching/BUILD b/tensorflow_serving/batching/BUILD index a162167a1a9..53f6701f7d6 100644 --- a/tensorflow_serving/batching/BUILD +++ b/tensorflow_serving/batching/BUILD @@ -155,6 +155,7 @@ cc_library( srcs = ["batching_util.cc"], hdrs = ["batching_util.h"], deps = [ + "@com_google_absl//absl/strings", "@com_google_absl//absl/types:span", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", diff --git a/tensorflow_serving/batching/batching_session.cc b/tensorflow_serving/batching/batching_session.cc index 8d68c130e16..791d85e44a7 100644 --- a/tensorflow_serving/batching/batching_session.cc +++ b/tensorflow_serving/batching/batching_session.cc @@ -54,42 +54,6 @@ auto* queuing_latency = monitoring::Sampler<1>::New( // Scale of 100, power of 1.2 with bucket count 52 (~1 second). monitoring::Buckets::Exponential(100, 1.2, 52)); -// For all metrics: consider adding breakdowns based on model name or status if -// needed. Note that model name is not available as a session property or on any -// of the inputs currently. -void RecordPaddingSize(int32 padding_size, int32 execution_batch_size) { - static auto* cell = tensorflow::monitoring::PercentileSampler<1>::New( - {"/tensorflow/serving/batching_session/padding_size", - "Tracks the padding size distribution on batches.", - "execution_batch_size"}, - /*percentiles=*/{25.0, 50.0, 75.0, 90.0, 95.0, 99.0}, - /*max_samples=*/1024, tensorflow::monitoring::UnitOfMeasure::kNumber); - cell->GetCell(absl::StrCat(execution_batch_size)) - ->Add(static_cast(padding_size)); -} - -void RecordInputBatchSize(int32 batch_size) { - static tensorflow::monitoring::PercentileSamplerCell* cell = - tensorflow::monitoring::PercentileSampler<0>::New( - {"/tensorflow/serving/batching_session/input_batch_size", - "Tracks the batch size distribution on the inputs."}, - /*percentiles=*/{25.0, 50.0, 75.0, 90.0, 95.0, 99.0}, - /*max_samples=*/1024, tensorflow::monitoring::UnitOfMeasure::kNumber) - ->GetCell(); - cell->Add(static_cast(batch_size)); -} - -void RecordProcessedBatchSize(int32 batch_size) { - static tensorflow::monitoring::PercentileSamplerCell* cell = - tensorflow::monitoring::PercentileSampler<0>::New( - {"/tensorflow/serving/batching_session/processed_batch_size", - "Tracks the batch size distribution on processing."}, - /*percentiles=*/{25.0, 50.0, 75.0, 90.0, 95.0, 99.0}, - /*max_samples=*/1024, tensorflow::monitoring::UnitOfMeasure::kNumber) - ->GetCell(); - cell->Add(static_cast(batch_size)); -} - string TensorSignatureDebugString(const TensorSignature& signature) { return strings::StrCat("{input_tensors: <", str_util::Join(signature.input_tensors, ", "), @@ -448,7 +412,7 @@ Status BatchingSession::ComputeInputSize( })); for (const auto& entry : inputs) { const Tensor& tensor = entry.second; - RecordInputBatchSize(tensor.shape().dim_size(0)); + RecordInputBatchSize(tensor.shape().dim_size(0)); } return Status::OK(); } @@ -471,8 +435,9 @@ Status BatchingSession::MergeInputTensors( {{"batch_size_after_padding", lowest_allowed_batch_size}, {"padding_amount", padding_size}}); }); - RecordPaddingSize(padding_size, lowest_allowed_batch_size); - RecordProcessedBatchSize(lowest_allowed_batch_size); + RecordPaddingSize(padding_size, + lowest_allowed_batch_size); + RecordProcessedBatchSize(lowest_allowed_batch_size); // For each input tensor name, a vector of tensors from the individual tasks. std::map> tensors_to_merge; diff --git a/tensorflow_serving/batching/batching_session.h b/tensorflow_serving/batching/batching_session.h index fcef7e04ece..92553d1e333 100644 --- a/tensorflow_serving/batching/batching_session.h +++ b/tensorflow_serving/batching/batching_session.h @@ -158,6 +158,9 @@ struct BatchingSessionTask : public BatchTask { ~BatchingSessionTask() override = default; size_t size() const override { return zeroth_dim_size; } + // For monitoring purpose. + static std::string Name() { return "batching_session"; } + // Fields populated when a task is received. uint64 enqueue_time_micros; RunOptions run_options; diff --git a/tensorflow_serving/batching/batching_util.h b/tensorflow_serving/batching/batching_util.h index 0d963ce04a1..f4abe7bc329 100644 --- a/tensorflow_serving/batching/batching_util.h +++ b/tensorflow_serving/batching/batching_util.h @@ -20,9 +20,12 @@ limitations under the License. #include #include +#include "absl/strings/str_cat.h" #include "absl/types/span.h" #include "tensorflow/core/framework/tensor.h" #include "tensorflow/core/lib/core/status.h" +#include "tensorflow/core/lib/monitoring/percentile_sampler.h" +#include "tensorflow/core/lib/monitoring/sampler.h" namespace tensorflow { namespace serving { @@ -108,6 +111,53 @@ Status ComputeTensorBatchSize(TensorList inputs, size_t* size, DimFunc dim_func, return Status::OK(); } +/***************** Below utilities are for monitoring purpose *****************/ + +// For all metrics: consider adding breakdowns based on model name or status if +// needed. Note that model name is not available as a session property or on any +// of the inputs currently. +template +void RecordPaddingSize(int32 padding_size, int32 execution_batch_size) { + static const std::string batching_task_name = BatchingTask::Name(); + static auto* cell = tensorflow::monitoring::PercentileSampler<1>::New( + {absl::StrCat("/tensorflow/serving/", batching_task_name, + "/padding_size"), + "Tracks the padding size distribution on batches.", + "execution_batch_size"}, + /*percentiles=*/{25.0, 50.0, 75.0, 90.0, 95.0, 99.0}, + /*max_samples=*/1024, tensorflow::monitoring::UnitOfMeasure::kNumber); + cell->GetCell(absl::StrCat(execution_batch_size)) + ->Add(static_cast(padding_size)); +} + +template +void RecordInputBatchSize(int32 batch_size) { + static const std::string batching_task_name = BatchingTask::Name(); + static tensorflow::monitoring::PercentileSamplerCell* cell = + tensorflow::monitoring::PercentileSampler<0>::New( + {absl::StrCat("/tensorflow/serving/", batching_task_name, + "/input_batch_size"), + "Tracks the batch size distribution on the inputs."}, + /*percentiles=*/{25.0, 50.0, 75.0, 90.0, 95.0, 99.0}, + /*max_samples=*/1024, tensorflow::monitoring::UnitOfMeasure::kNumber) + ->GetCell(); + cell->Add(static_cast(batch_size)); +} + +template +void RecordProcessedBatchSize(int32 batch_size) { + static const std::string batching_task_name = BatchingTask::Name(); + static tensorflow::monitoring::PercentileSamplerCell* cell = + tensorflow::monitoring::PercentileSampler<0>::New( + {absl::StrCat("/tensorflow/serving/", batching_task_name, + "/processed_batch_size"), + "Tracks the batch size distribution on processing."}, + /*percentiles=*/{25.0, 50.0, 75.0, 90.0, 95.0, 99.0}, + /*max_samples=*/1024, tensorflow::monitoring::UnitOfMeasure::kNumber) + ->GetCell(); + cell->Add(static_cast(batch_size)); +} + } // namespace serving } // namespace tensorflow #endif // TENSORFLOW_SERVING_BATCHING_BATCHING_UTIL_H_ From 2b48a31a793c82e969505e7bd01aaea79954906a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 15 Dec 2020 00:01:29 -0800 Subject: [PATCH 4507/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/967f71d1-b31b-4ba0-9063-c619ea21ba7c PiperOrigin-RevId: 347552865 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dc53a730ab3..85c103cd833 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c70c61632ba9a0d5cc6658e556da5cc9dad89bc73f5c87a6b1bb6784113f77a9", - git_commit = "751a245c7a212dd030f12665124bdfe8b3f1d09d", + sha256 = "ca436d15a0600f979295341493bd97532b14da384f26392d080cb9a51ad6f6c4", + git_commit = "35fc7c9443f088d5c7551608c38750dc6deff8a4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d6b9a672f84ebd19704da7a22e4b3e29544251ae Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 15 Dec 2020 06:01:17 -0800 Subject: [PATCH 4508/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c3a1f5a6-71aa-4f43-902b-c56b93b957ec PiperOrigin-RevId: 347596273 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 85c103cd833..d85b38ca264 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ca436d15a0600f979295341493bd97532b14da384f26392d080cb9a51ad6f6c4", - git_commit = "35fc7c9443f088d5c7551608c38750dc6deff8a4", + sha256 = "b11bd0a92205d63c89568e8098d949ae2e9cde0f65f33221ada48454e3b63cd7", + git_commit = "8315b4ad00a4f4e294c5b0f68396509118c5ef36", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 70d4bf2e17bb81d049901eedf42140570ae89908 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 15 Dec 2020 12:01:26 -0800 Subject: [PATCH 4509/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/84da18a8-4ad8-48d4-bc6b-7941ec21424a PiperOrigin-RevId: 347663327 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d85b38ca264..a4bb1585a89 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b11bd0a92205d63c89568e8098d949ae2e9cde0f65f33221ada48454e3b63cd7", - git_commit = "8315b4ad00a4f4e294c5b0f68396509118c5ef36", + sha256 = "76f954fcd3c684627d9948c7407d1e647ecde62a940698f98de74a37f2344bde", + git_commit = "ad82a249b4c4b6adb942193c2d35e9f53d2c3b48", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2a7c0780ef2bc1007ca1e7344b98fc5a38262489 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 15 Dec 2020 18:01:20 -0800 Subject: [PATCH 4510/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/dc03d486-d85c-40c2-9184-486986da23bf PiperOrigin-RevId: 347730406 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a4bb1585a89..9940165c186 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "76f954fcd3c684627d9948c7407d1e647ecde62a940698f98de74a37f2344bde", - git_commit = "ad82a249b4c4b6adb942193c2d35e9f53d2c3b48", + sha256 = "50e4e1a1f22e4d153e29276341c9f388db41fb01b6fb5cc12d3e59be0ab766db", + git_commit = "3c374ed73b48ce4e293c5a4168c6e16844b652ca", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 934dfb6387bbcd6651c51efbe56d81d37b29b37b Mon Sep 17 00:00:00 2001 From: Guanxin Qiao Date: Tue, 15 Dec 2020 21:20:46 -0800 Subject: [PATCH 4511/8103] Added release notes for TensorFlow Serving 2.4.0 PiperOrigin-RevId: 347750852 --- RELEASE.md | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/RELEASE.md b/RELEASE.md index 179c793133e..17f90fff4b0 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,3 +1,63 @@ +# Release 2.4.0 + +## Major Features and Improvements + +* Update TF Text to v2.3.0. +* Upgrade to CUDA Version 11.0. +* Update CUDNN_VERSION to 8.0.4.30. +* Adds user guide for Remote Predict Op. +* Add support for serving regress/classify (native keras) TF2 models. + +## Breaking Changes + +## Bug Fixes and Other Changes + +* Adding /usr/local/cuda/extras/CUPTI/lib64 to LD_LIBRARY_PATH in order to unblock profiling (commit: 1270b8ce192225edcaafb00a50822216dd0b1de0) +* Improve error message when version directory is not found (commit: d687d3e8827c82f4f1b68337c67b2cbe6e4126e7) +* Migrate the remaining references of tf.app to compat.v1. (commit: 06fbf878a98c8bd4202e33bc1c097a6ce184d06e) +* Cleanup TraceMe idioms (commit: f22f802c73bfdd548f85dacffc24022b0d79dfc7) +* Adds LICENSE file to tensorflow-serving-api python package. (commit: 41188d482beb693d4e79e6934d25f1edd44321ac) +* Enable a way to 'forget' unloaded models in the ServableStateMonitor. (commit: 53c5a65e8158dc1a2a85a2394482cc6acc1736bc) +* Added abstract layer for remote predict op over different RPC protocols with template. (commit: c54ca7ec95928b6eec39f350140835ebbe3caeb0) +* Add an example which call the Remote Predict Op directly. (commit: d5b980f487996aa1f890a559eae968735dfebf5d) +* For batching session in TF serving model server, introduce options to enable large batch splitting. (commit: f84187e8d3e19a298656a661a888c0563c21910e) +* Add multi-inference support for TF2 models that use (commit: abb8d3b516a310ec4269cd6bf892644d5150485a) +* Use absl::optional instead of tensorflow::serving::optional. (commit: c809305a50412a2b47f2287c76ea0be1070aabd6) +* Use absl::optional instead of tensorflow::serving::optional. (commit: cf1cf93eac1896c3c482d17b440489edea110670) +* Remove tensorflow::serving::MakeCleanup and use tensorflow::gtl::MakeCleanup. (commit: 6ccb003eb45f4961128e5cc2edf5d8b61ef51111) +* Use absl::optional and remove tensorflow::serving::optional. (commit: e8e5222abbb39e84d1d4e5e9813626b2cc51daac) +* Deprecate tensorflow::CreateProfilerService() and update serving client. (commit: 98a55030e10a61ee0c3f6b8fc57e2cf63fc59719) +* Change the SASS & PTX we ship with TF (commit: 086929269b5f2c0f5d71c30accb79d74694c9ece) +* Adding custom op support. (commit: 892ea42864676b67cbccdfa0794a15d30e65a1b6) +* Upgrade to PY3 for tests. (commit: 02624a83f70060095df7c132fa46a7a09f9bff6a) +* Makes clear how to make a default config file for serving multiple models. (commit: 084eaeb15fdc87d83b8c19f558dc1f56bd3a024e) +* Use TraceMeEncode in BatchingSession's TraceMe. (commit: 78ff058501274aa37b6bbc18aec225604d4cda47) +* Export metrics for runtime latency for predict/classify/regress. (commit: c317582981cfc1550b27d9d73f71c6ca38e5c8c5) +* Refactor net_http/client to expose request/response functionality as a public API (not yet finalized) for usage testing ServerRequestInterface and HttpServerInterface instances. (commit: 0b951c807375f1f305280a96124d8b6d6e045bd2) +* In model warm-up path, re-write error code out-of-range (intended when reading EOF in a file) to ok. (commit: d9bde73569385b4ef3ef8e36d2c832a8ae9a92ad) +* fix Client Rest API endpoint (commit: b847bac5f2e1dc6a98f431b1fdf42ceebceceeb6) +* Support multiple SignatureDefs by key in TFLite models (commit: 2e14cd9dc2647127d7cb8c44ceab5dfcf6ac28c4) +* Add dedicated aliases field to ModelServerConfig. (commit: 718152dc386f9fa7b21ed36d9d85518e987d7bf5) +* Remove deprecated flag fail_if_no_model_versions_found from tensorflow serving binary (commit: 4b624628977a12b1757b9ddcd3312b3768de8231) +* Fix TraceMe instrumentation for the padding size. (commit: 0cb94cd79aacb965b3923d4a51b4091cf84d5e22) +* Add vlog to dump updated model label map (for debugging) each time the map is updated. (commit: ac10e74078123189dc1c8a3cd29d530b7c972782) +* Add python wrapper for remote predict op and clean the build and include files. (commit: d0daa1064ecdd56ecb5c0a8aca37c3e198cb313d) +* Add `portpicker` module required to run modelserver e2e tests. (commit: 82f8cc039d091916b8186dfa1ff4b6c006e7277c) +* changing "infintiy" to "really high value" (commit: c96474cfcca46b1216e52634efb68986cf8aa9b8) +* Minimal commandline client to trigger profiler on the modelserver. (commit: c0a5619a01e3af69459aa6396d614945370bbd02) +* Add signature name to RPOp. (commit: 84dfc8b66ff6c1a693766613034ddc3ff044a330) +* When RPC error occurs, the output tensors should still get allocated. (commit: 9113de22353350443bdd42c5d594ec653e57c0da) +* Fix BM_MobileNet benchmark (commit: af665627b8152d4c62d207a97c6e712cb2e9a120) +* Add JSPB BUILD targets for inference and example proto files. (commit: f1009eb0e6bdae2e35dbfb9f4ad7270e74705e2e) +* Fall back to legacy TFLite tensor naming when parsing signature defs in TFLiteSession. (commit: 3884187cb9253bb9baa240b2009cfc6d4847b9f9) + +## Thanks to our Contributors + +This release contains contributions from many people at Google, as well as: + +Adarshreddy Adelli, Lescurel + + # Release 2.3.0 ## Bug Fixes and Other Changes From ac0eb73e71e0658196f02aa6518e119351e14a95 Mon Sep 17 00:00:00 2001 From: Junqin Zhang Date: Tue, 15 Dec 2020 09:30:41 +0800 Subject: [PATCH 4512/8103] When GRPC messages come to TF Serving GRPC server, server will create a new threads to handle each message. Once message handle completed, the thread was destroyed. So if many messages come to TF serving together and messages were not handled in time, then GRPC server will continue create new threads. Moreover, the max threads number in GRPC server is set to a very big number. Then in most worst case, it would lead to memory usage increasing a lot and container OOM. So, here add grpc max threads limit to solve such case. --- tensorflow_serving/model_servers/main.cc | 3 +++ tensorflow_serving/model_servers/server.cc | 5 +++++ tensorflow_serving/model_servers/server.h | 1 + 3 files changed, 9 insertions(+) diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index 721f16f88dc..1f9e982a579 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -174,6 +174,9 @@ int main(int argc, char** argv) { "A comma separated list of arguments to be passed to " "the grpc server. (e.g. " "grpc.max_connection_age_ms=2000)"), + tensorflow::Flag("grpc_max_threads", + &options.grpc_max_threads, + "Max grpc server threads to handle grpc messages."), tensorflow::Flag("enable_model_warmup", &options.enable_model_warmup, "Enables model warmup, which triggers lazy " "initializations (such as TF optimizations) at load " diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index 0a922adf840..729739fa09b 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -28,6 +28,7 @@ limitations under the License. #include "grpcpp/server_builder.h" #include "grpcpp/server_context.h" #include "grpcpp/support/status.h" +#include "grpcpp/resource_quota.h" #include "absl/memory/memory.h" #include "tensorflow/c/c_api.h" #include "tensorflow/cc/saved_model/tag_constants.h" @@ -366,6 +367,10 @@ Status Server::BuildAndStart(const Options& server_options) { builder.AddChannelArgument(channel_argument.key, channel_argument.value); } } + ::grpc::ResourceQuota res_quota; + res_quota.SetMaxThreads(server_options.grpc_max_threads); + builder.SetResourceQuota(res_quota); + grpc_server_ = builder.BuildAndStart(); if (grpc_server_ == nullptr) { return errors::InvalidArgument("Failed to BuildAndStart gRPC server"); diff --git a/tensorflow_serving/model_servers/server.h b/tensorflow_serving/model_servers/server.h index bf2da51dbec..2601ba89e44 100644 --- a/tensorflow_serving/model_servers/server.h +++ b/tensorflow_serving/model_servers/server.h @@ -43,6 +43,7 @@ class Server { tensorflow::int32 grpc_port = 8500; tensorflow::string grpc_channel_arguments; tensorflow::string grpc_socket_path; + tensorflow::int32 grpc_max_threads = 4.0 * port::NumSchedulableCPUs(); // // HTTP Server options. From c3b163bda2d2912fc18af39152204a457a37c687 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 16 Dec 2020 00:01:35 -0800 Subject: [PATCH 4513/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/021132a7-63d4-4e9e-9944-fca114887a58 PiperOrigin-RevId: 347768573 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9940165c186..91ab2df97f8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "50e4e1a1f22e4d153e29276341c9f388db41fb01b6fb5cc12d3e59be0ab766db", - git_commit = "3c374ed73b48ce4e293c5a4168c6e16844b652ca", + sha256 = "38524f3a0f670ed62f089eb6e1643f03deeb50520ee1657f6cdaaaf2fe13ea39", + git_commit = "6136078913c450c23cebfd9443b16abc33202b75", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7cd2262d1acc27c2f880f7837109a591cd860208 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 16 Dec 2020 06:01:28 -0800 Subject: [PATCH 4514/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8db3b13c-8d13-40d0-8d46-47659488faf9 PiperOrigin-RevId: 347807671 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 91ab2df97f8..18ac64503d5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "38524f3a0f670ed62f089eb6e1643f03deeb50520ee1657f6cdaaaf2fe13ea39", - git_commit = "6136078913c450c23cebfd9443b16abc33202b75", + sha256 = "d9fc3f9e7ac61222a0d25691624a3ab2aba6c45e760b1e3808bcecf215ac852e", + git_commit = "94ff52945dae3a61fc3a079390b726bf6bc0a705", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d33c9079339dcc5751ba85581a20d691a28aa032 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 16 Dec 2020 12:01:25 -0800 Subject: [PATCH 4515/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/43c18419-9907-4eec-98f7-93af3fa03e25 PiperOrigin-RevId: 347868634 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 18ac64503d5..d847048a930 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d9fc3f9e7ac61222a0d25691624a3ab2aba6c45e760b1e3808bcecf215ac852e", - git_commit = "94ff52945dae3a61fc3a079390b726bf6bc0a705", + sha256 = "95f295ca5bdb5159fdca17180aeaa8ee5ed210fd616077adb246d2c25d1997e5", + git_commit = "40bd5a4d991cff4d6a577146278ee9f0e82e9a7c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 358f7d1fe94dc2c904b1c4de68c7bbfe42088b2d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 21 Dec 2020 03:59:13 -0800 Subject: [PATCH 4516/8103] Add dedicated aliases field to ModelServerConfig. PiperOrigin-RevId: 348444664 --- tensorflow_serving/config/model_server_config.proto | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/tensorflow_serving/config/model_server_config.proto b/tensorflow_serving/config/model_server_config.proto index 187f535a90b..6b2983be5d9 100644 --- a/tensorflow_serving/config/model_server_config.proto +++ b/tensorflow_serving/config/model_server_config.proto @@ -20,10 +20,6 @@ message ModelConfig { // Name of the model. string name = 1; - // List of aliases which can be used for addressing this model instead of - // using the model name. This is an experimental field. - repeated string alias = 9; - // Base path to the model, excluding the version directory. // E.g> for a model at /foo/bar/my_model/123, where 123 is the version, the // base path is /foo/bar/my_model. @@ -42,7 +38,7 @@ message ModelConfig { // (This cannot be changed once a model is in serving.) string model_platform = 4; - reserved 5; + reserved 5, 9; // Version policy for the model indicating which version(s) of the model to // load and make available for serving simultaneously. From 8c150e790706b17945193d005b2a415f5c498f34 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 21 Dec 2020 18:01:14 -0800 Subject: [PATCH 4517/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/79c2d18c-f9b8-4931-a839-32e792214ae6 PiperOrigin-RevId: 348558168 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d847048a930..f95e4de3a97 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "95f295ca5bdb5159fdca17180aeaa8ee5ed210fd616077adb246d2c25d1997e5", - git_commit = "40bd5a4d991cff4d6a577146278ee9f0e82e9a7c", + sha256 = "7a3b37b355586e10fe0cf1d9956214cc282b2a7775d5f3470db7782e171f03c8", + git_commit = "8ddb063d4d6949d3d7c612131820f46c720578fc", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 558b04875d82bbbb83ab5f1e98aae1d4e8c40bea Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 22 Dec 2020 00:01:25 -0800 Subject: [PATCH 4518/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fc553561-452b-4d30-a8f8-2a49f3232070 PiperOrigin-RevId: 348588682 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f95e4de3a97..78209194cd2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7a3b37b355586e10fe0cf1d9956214cc282b2a7775d5f3470db7782e171f03c8", - git_commit = "8ddb063d4d6949d3d7c612131820f46c720578fc", + sha256 = "4fe0202f4608ba108d6f9b0f787f69944cc802a9664b093053e6c0e4d8e1f511", + git_commit = "4967bdb59ef3a5dedae37d06cecc855bfd3aaaa2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From a107514fbbe454eaae6c79b53f4ed452514cd6a0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 22 Dec 2020 06:01:33 -0800 Subject: [PATCH 4519/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0073046c-12b1-46c8-b5a3-0e100fdd7d04 PiperOrigin-RevId: 348622024 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 78209194cd2..750bb555e39 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4fe0202f4608ba108d6f9b0f787f69944cc802a9664b093053e6c0e4d8e1f511", - git_commit = "4967bdb59ef3a5dedae37d06cecc855bfd3aaaa2", + sha256 = "b08629e29a82f31e6be96daa48bffbf799d91352e17f36f1a447c20db5b67047", + git_commit = "75e4d1a904f94755ea124da0ca52a61906c7e3ea", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7d471e2363e6e5571ccb10547d221d159a1d8ad4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 22 Dec 2020 12:01:42 -0800 Subject: [PATCH 4520/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0735c184-61bd-48d4-927c-1697516787c0 PiperOrigin-RevId: 348671412 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 750bb555e39..4b9b70749a0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b08629e29a82f31e6be96daa48bffbf799d91352e17f36f1a447c20db5b67047", - git_commit = "75e4d1a904f94755ea124da0ca52a61906c7e3ea", + sha256 = "6573f0c205065edbf4f93a5567ae5cb74e29dcd8724312be48615a46523c1f3a", + git_commit = "7d8e31edb073f95eeae3f726edba1e8144183bd5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8607417c211b77b60b9b871ef62c2746660c1c58 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 22 Dec 2020 18:01:34 -0800 Subject: [PATCH 4521/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/287400f6-14ad-4fd8-b437-007e3fc921d5 PiperOrigin-RevId: 348722069 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4b9b70749a0..ce8526555de 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6573f0c205065edbf4f93a5567ae5cb74e29dcd8724312be48615a46523c1f3a", - git_commit = "7d8e31edb073f95eeae3f726edba1e8144183bd5", + sha256 = "4b573c7547b0f6a4faf9e0d345b185ae79666da98e9783596cbcc3161abea50c", + git_commit = "636ca6b60e27b423a30f37439dd01587461e5ffb", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b41a28bb2c815bd76010d3a39a3ea52b5da85f35 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 22 Dec 2020 19:06:37 -0800 Subject: [PATCH 4522/8103] Added the command, docker run -it -p 8500:8500 tensorflow/serving:latest-devel-gpu Fixes #1768 PiperOrigin-RevId: 348728172 --- tensorflow_serving/g3doc/building_with_docker.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/g3doc/building_with_docker.md b/tensorflow_serving/g3doc/building_with_docker.md index 04e6e6a1844..c467a0dfddb 100644 --- a/tensorflow_serving/g3doc/building_with_docker.md +++ b/tensorflow_serving/g3doc/building_with_docker.md @@ -26,7 +26,7 @@ After pulling one of the development Docker images, you can run it while opening the gRPC port (8500): ```shell -docker run -it -p 8500:8500 tensorflow/serving:latest-devel +docker run -it -p 8500:8500 --gpus all tensorflow/serving:latest-devel ``` #### Testing the development environment From d37a496d325f2ec97245390a0840a3dd166f9c7d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 23 Dec 2020 00:01:34 -0800 Subject: [PATCH 4523/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/09a75818-9e0f-4b44-bb93-a946deab5421 PiperOrigin-RevId: 348752161 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ce8526555de..ef19ac3235d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4b573c7547b0f6a4faf9e0d345b185ae79666da98e9783596cbcc3161abea50c", - git_commit = "636ca6b60e27b423a30f37439dd01587461e5ffb", + sha256 = "add1a0926a06dbdfd8a33044d6771e73afbcf19f099eec4c475154480e631d6d", + git_commit = "917ebe0008ebe6e2c57db91c847999fe45c3c753", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6c35ab43b532088e758b67e4937eab77f7b4ab92 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 23 Dec 2020 06:01:24 -0800 Subject: [PATCH 4524/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e7669c00-7465-4b51-8af0-b995661ea264 PiperOrigin-RevId: 348783525 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ef19ac3235d..5f76131eaec 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "add1a0926a06dbdfd8a33044d6771e73afbcf19f099eec4c475154480e631d6d", - git_commit = "917ebe0008ebe6e2c57db91c847999fe45c3c753", + sha256 = "57ab7d204fe3eaecfed483e118c9d8e40addc8d73e8832099fd1d4a49db2afdc", + git_commit = "939fe236cb4009918dbf6ef76945e08a22a0dcdd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d66e02a4cca298f7a1c96c0d114f68829734ca63 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 23 Dec 2020 12:01:25 -0800 Subject: [PATCH 4525/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a5cf2ebc-28ae-49a5-be7b-5326d458b2eb PiperOrigin-RevId: 348828127 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5f76131eaec..6298ec909c5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "57ab7d204fe3eaecfed483e118c9d8e40addc8d73e8832099fd1d4a49db2afdc", - git_commit = "939fe236cb4009918dbf6ef76945e08a22a0dcdd", + sha256 = "be5da8beb3c2cae1a7bb8dafe3d690fc1b045905674d37bed938a8f9679ea506", + git_commit = "aaf94e8166c46828e4d392854e79b2724ab9b8a6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 2935fee1bd2cfe7d7dff880c36e4421113763d75 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 23 Dec 2020 18:01:41 -0800 Subject: [PATCH 4526/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4d44c097-29ed-4424-bcbd-1e71a5b13d44 PiperOrigin-RevId: 348871176 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6298ec909c5..1a30909ec9c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "be5da8beb3c2cae1a7bb8dafe3d690fc1b045905674d37bed938a8f9679ea506", - git_commit = "aaf94e8166c46828e4d392854e79b2724ab9b8a6", + sha256 = "72764305b8cd2909ee31da165ea8f6d70c4e514c3ad9ceb297f6745c09436009", + git_commit = "56d7ad1ed931d0a63d7cc9baa8e4110aa68c8b60", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 5f2284952d508820ffd85413f89c1b0844a2af81 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 24 Dec 2020 00:01:26 -0800 Subject: [PATCH 4527/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6e74931c-7b1f-45f8-af05-6606365c2011 PiperOrigin-RevId: 348897356 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1a30909ec9c..81639614f52 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "72764305b8cd2909ee31da165ea8f6d70c4e514c3ad9ceb297f6745c09436009", - git_commit = "56d7ad1ed931d0a63d7cc9baa8e4110aa68c8b60", + sha256 = "a61398717fb2d23da4f9eb97befca2b4288c47f9a2ebee96e18f39becc258c8c", + git_commit = "749418025685bfdfeee74f1f49fcffd3030a7a3b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 50641fbbf76507ab7dce6148c3574fc34ef399f8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 24 Dec 2020 06:01:20 -0800 Subject: [PATCH 4528/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5259e976-c9d0-4bf1-a95d-2e82c15291ab PiperOrigin-RevId: 348925173 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 81639614f52..81697936aff 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a61398717fb2d23da4f9eb97befca2b4288c47f9a2ebee96e18f39becc258c8c", - git_commit = "749418025685bfdfeee74f1f49fcffd3030a7a3b", + sha256 = "ab298fc82b3ecb1b9a67975a22e1545c93721f22dab919c94cca58235d1d3c8e", + git_commit = "41802b3785a3e89f421254de6b6326de516cdb8d", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6f2f6ae9bace1996971a47d655c1b5b9c04b4a19 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 25 Dec 2020 00:01:37 -0800 Subject: [PATCH 4529/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4fb125fa-9678-4f54-85f6-fe8aed7f70f0 PiperOrigin-RevId: 348992178 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 81697936aff..0cac98978f4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ab298fc82b3ecb1b9a67975a22e1545c93721f22dab919c94cca58235d1d3c8e", - git_commit = "41802b3785a3e89f421254de6b6326de516cdb8d", + sha256 = "166b60a1aba147f36ca05309eac6b959f5d556c325b7efe4995b44e021489cff", + git_commit = "e3b2ccfc2fa035a41bd48521e08b28201d789b1b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 8bbdc7da600ad846ba2281837f9834aef0197251 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 25 Dec 2020 06:01:13 -0800 Subject: [PATCH 4530/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c9b2c238-e5f3-4219-918f-3ec896a1b750 PiperOrigin-RevId: 349017496 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0cac98978f4..d500f181c68 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "166b60a1aba147f36ca05309eac6b959f5d556c325b7efe4995b44e021489cff", - git_commit = "e3b2ccfc2fa035a41bd48521e08b28201d789b1b", + sha256 = "7b7e1a1aaba33a88e86c3e5e1b4390b5b99deb77f2faebc2a3d38311464d2183", + git_commit = "5a8dc94c30a2989f4d21b02f1860c54d1754a441", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3198370b40e053e29c2bab3122989b603603c116 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 26 Dec 2020 06:01:12 -0800 Subject: [PATCH 4531/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e721daa9-eab1-41af-8966-759137266db1 PiperOrigin-RevId: 349100802 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d500f181c68..310b68194b8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7b7e1a1aaba33a88e86c3e5e1b4390b5b99deb77f2faebc2a3d38311464d2183", - git_commit = "5a8dc94c30a2989f4d21b02f1860c54d1754a441", + sha256 = "5af806b657b95cda06f2bc6daa9427c79a295090f0a7e5d2d405b0283ce53df7", + git_commit = "855f3d8c108758ebd60f14ce91136936221041c2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 46622423f488a77e965f73432b589a96d72e724d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 27 Dec 2020 06:01:17 -0800 Subject: [PATCH 4532/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1675c592-09e0-466e-b09f-9d9159bcb4e7 PiperOrigin-RevId: 349181377 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 310b68194b8..dad4c1f5777 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5af806b657b95cda06f2bc6daa9427c79a295090f0a7e5d2d405b0283ce53df7", - git_commit = "855f3d8c108758ebd60f14ce91136936221041c2", + sha256 = "0973c2bc9bd52bf38269592e0802b209d351b5059930ac975c8ba6b1eb9bf7d8", + git_commit = "2be88a7f1a42ca8ff623e6953d7439ec284f67b8", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9d2a935ed70dbe2dbc1cac5170e0074059d551cf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 27 Dec 2020 12:01:33 -0800 Subject: [PATCH 4533/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/136c1a23-4bf8-4a61-81ad-8fe4456831d5 PiperOrigin-RevId: 349201844 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dad4c1f5777..4c36f2cf052 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0973c2bc9bd52bf38269592e0802b209d351b5059930ac975c8ba6b1eb9bf7d8", - git_commit = "2be88a7f1a42ca8ff623e6953d7439ec284f67b8", + sha256 = "37c46b7e828a85c6f5a766405be1b0512a83042d6a8814a262c4f8d2fecaf502", + git_commit = "f9fd71a45e04b3f0cef48b3283c54f69ad1a0991", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c687ac6440b1862fd7d88cb5201799b98491b467 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Dec 2020 00:01:22 -0800 Subject: [PATCH 4534/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3fb49372-3e4e-4373-9df1-deeb46eaa05b PiperOrigin-RevId: 349245718 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4c36f2cf052..39757c0e952 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "37c46b7e828a85c6f5a766405be1b0512a83042d6a8814a262c4f8d2fecaf502", - git_commit = "f9fd71a45e04b3f0cef48b3283c54f69ad1a0991", + sha256 = "54bd0b11c086bdbca748062fd8fbd873f47e2adf6dcd40dad85704e011b6c647", + git_commit = "bdff7e95a82c0f2b93ea9edda2996334af358294", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 715ba52c7e34981eb4dd9e4cf8ff1b09b4994be5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Dec 2020 06:01:19 -0800 Subject: [PATCH 4535/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ccedba4c-e6a8-45ea-9c09-e103eae5a414 PiperOrigin-RevId: 349274386 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 39757c0e952..5db5a4fcf7e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "54bd0b11c086bdbca748062fd8fbd873f47e2adf6dcd40dad85704e011b6c647", - git_commit = "bdff7e95a82c0f2b93ea9edda2996334af358294", + sha256 = "3105faef4c77f34d49044915e34e04eadff3f722f8e4430d18021700d7199139", + git_commit = "3741a7bda7131f7ba26c840d9906a5824bbbc3c3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f08729066771c55a44941a7661ac4d0bc48b85dd Mon Sep 17 00:00:00 2001 From: Abhinav Pundir Date: Mon, 28 Dec 2020 10:20:01 -0800 Subject: [PATCH 4536/8103] option to disable grpc over http --- tensorflow_serving/model_servers/server.cc | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index 729739fa09b..1c2826d123c 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -182,8 +182,8 @@ void Server::PollFilesystemAndReloadConfig(const string& config_file_path) { } Status Server::BuildAndStart(const Options& server_options) { - if (server_options.grpc_port == 0) { - return errors::InvalidArgument("server_options.grpc_port is not set."); + if (server_options.grpc_port <= 0 && server_options.grpc_socket_path.empty()) { + return errors::InvalidArgument("one of server_options.grpc_port/server_options.grpc_socket_path should be set."); } if (server_options.model_base_path.empty() && @@ -340,9 +340,12 @@ Status Server::BuildAndStart(const Options& server_options) { profiler_service_ = tensorflow::profiler::CreateProfilerService(); ::grpc::ServerBuilder builder; - builder.AddListeningPort( - server_address, - BuildServerCredentialsFromSSLConfigFile(server_options.ssl_config_file)); + // If defined, listen to a http port for gRPC. + if (server_options.grpc_port > 0) { + builder.AddListeningPort( + server_address, + BuildServerCredentialsFromSSLConfigFile(server_options.ssl_config_file)); + } // If defined, listen to a UNIX socket for gRPC. if (!server_options.grpc_socket_path.empty()) { const string grpc_socket_uri = "unix:" + server_options.grpc_socket_path; @@ -375,7 +378,9 @@ Status Server::BuildAndStart(const Options& server_options) { if (grpc_server_ == nullptr) { return errors::InvalidArgument("Failed to BuildAndStart gRPC server"); } - LOG(INFO) << "Running gRPC ModelServer at " << server_address << " ..."; + if(server_options.grpc_port > 0) { + LOG(INFO) << "Running gRPC ModelServer at " << server_address << " ..."; + } if (!server_options.grpc_socket_path.empty()) { LOG(INFO) << "Running gRPC ModelServer at UNIX socket " << server_options.grpc_socket_path << " ..."; From ffba71d992acd5430f8dc418e819645234e4c99f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Dec 2020 12:01:35 -0800 Subject: [PATCH 4537/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5540db66-b3be-4e1b-bc22-cc39157f1c9b PiperOrigin-RevId: 349313786 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5db5a4fcf7e..9bfadc4bc9a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3105faef4c77f34d49044915e34e04eadff3f722f8e4430d18021700d7199139", - git_commit = "3741a7bda7131f7ba26c840d9906a5824bbbc3c3", + sha256 = "76cb2dbf58f6fc15919f7a95aaee2b1eb4f893ae4ba5960d1b175fb30ac9e74b", + git_commit = "bd2a6f4862284e5d92d8aa331cf7c76c356845d0", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 73e1059c8851e71f3df655da719f833b24254602 Mon Sep 17 00:00:00 2001 From: Abhinav Pundir Date: Mon, 28 Dec 2020 12:23:11 -0800 Subject: [PATCH 4538/8103] revert to port 0 to treat grpc over http as not being specified --- tensorflow_serving/model_servers/server.cc | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index 1c2826d123c..38e2ea9a3d3 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -182,8 +182,9 @@ void Server::PollFilesystemAndReloadConfig(const string& config_file_path) { } Status Server::BuildAndStart(const Options& server_options) { - if (server_options.grpc_port <= 0 && server_options.grpc_socket_path.empty()) { - return errors::InvalidArgument("one of server_options.grpc_port/server_options.grpc_socket_path should be set."); + if (server_options.grpc_port == 0 && server_options.grpc_socket_path.empty()) { + return errors::InvalidArgument( + "At least one of server_options.grpc_port or server_options.grpc_socket_path must be set."); } if (server_options.model_base_path.empty() && @@ -342,9 +343,9 @@ Status Server::BuildAndStart(const Options& server_options) { ::grpc::ServerBuilder builder; // If defined, listen to a http port for gRPC. if (server_options.grpc_port > 0) { - builder.AddListeningPort( - server_address, - BuildServerCredentialsFromSSLConfigFile(server_options.ssl_config_file)); + builder.AddListeningPort( + server_address, + BuildServerCredentialsFromSSLConfigFile(server_options.ssl_config_file)); } // If defined, listen to a UNIX socket for gRPC. if (!server_options.grpc_socket_path.empty()) { @@ -378,7 +379,7 @@ Status Server::BuildAndStart(const Options& server_options) { if (grpc_server_ == nullptr) { return errors::InvalidArgument("Failed to BuildAndStart gRPC server"); } - if(server_options.grpc_port > 0) { + if (server_options.grpc_port > 0) { LOG(INFO) << "Running gRPC ModelServer at " << server_address << " ..."; } if (!server_options.grpc_socket_path.empty()) { From a1a0069079738bcc0ae1ff9b168b087ae84145bd Mon Sep 17 00:00:00 2001 From: Abhinav Pundir Date: Mon, 28 Dec 2020 12:45:50 -0800 Subject: [PATCH 4539/8103] reverting to port 0 check to disable grpc over http --- tensorflow_serving/model_servers/server.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index 38e2ea9a3d3..7cfe1e40e45 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -342,7 +342,7 @@ Status Server::BuildAndStart(const Options& server_options) { ::grpc::ServerBuilder builder; // If defined, listen to a http port for gRPC. - if (server_options.grpc_port > 0) { + if (server_options.grpc_port != 0) { builder.AddListeningPort( server_address, BuildServerCredentialsFromSSLConfigFile(server_options.ssl_config_file)); @@ -379,7 +379,7 @@ Status Server::BuildAndStart(const Options& server_options) { if (grpc_server_ == nullptr) { return errors::InvalidArgument("Failed to BuildAndStart gRPC server"); } - if (server_options.grpc_port > 0) { + if (server_options.grpc_port != 0) { LOG(INFO) << "Running gRPC ModelServer at " << server_address << " ..."; } if (!server_options.grpc_socket_path.empty()) { From d804787a614d935a8c776827a02f78d808e77725 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Dec 2020 18:01:14 -0800 Subject: [PATCH 4540/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/77fd705e-9547-4159-8471-cbc4ecfb692e PiperOrigin-RevId: 349355337 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9bfadc4bc9a..25a4eaeb8cf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "76cb2dbf58f6fc15919f7a95aaee2b1eb4f893ae4ba5960d1b175fb30ac9e74b", - git_commit = "bd2a6f4862284e5d92d8aa331cf7c76c356845d0", + sha256 = "b58b8743ff3941a1438d43a960da0dcb71708f02903df8d51154e8dc3261f4f3", + git_commit = "44401c9535a262f4d2553909f8f33084742a961b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 636953ffc66b4214dd53a354c3fc0de6a328f548 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Dec 2020 00:01:37 -0800 Subject: [PATCH 4541/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b47f1d2a-0885-4af9-beba-150cacb49c18 PiperOrigin-RevId: 349383578 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 25a4eaeb8cf..749b0b084dc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b58b8743ff3941a1438d43a960da0dcb71708f02903df8d51154e8dc3261f4f3", - git_commit = "44401c9535a262f4d2553909f8f33084742a961b", + sha256 = "b3bbbe13bca65a3d8eecb537b17047356dbe53282087a8d53a142ef5ff6986af", + git_commit = "d0caa7d14e05f4dc75d26ac0a51177e83b485800", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 03c1c4d19a8a167670d1f05e42e6458f511b5d5b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Dec 2020 06:02:07 -0800 Subject: [PATCH 4542/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6232ceeb-d9c0-4b23-ae15-b9453c410703 PiperOrigin-RevId: 349413345 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 749b0b084dc..c666296b37e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b3bbbe13bca65a3d8eecb537b17047356dbe53282087a8d53a142ef5ff6986af", - git_commit = "d0caa7d14e05f4dc75d26ac0a51177e83b485800", + sha256 = "1f6be5751692f8bc578164630f8f4a56ceccab253093afe43a279bd2aa21e1de", + git_commit = "296d9533cbd510ce17bcca101e0bfd0f1cb4085b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From bd101d2da23a0f14499344fc56bb715a885793a0 Mon Sep 17 00:00:00 2001 From: Abhinav Pundir Date: Tue, 29 Dec 2020 06:27:57 -0800 Subject: [PATCH 4543/8103] updated flag documentation to disable grpc/http --- tensorflow_serving/model_servers/main.cc | 3 ++- tensorflow_serving/model_servers/server.cc | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index 1f9e982a579..f3238f7352f 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -58,7 +58,8 @@ int main(int argc, char** argv) { bool display_version = false; std::vector flag_list = { tensorflow::Flag("port", &options.grpc_port, - "Port to listen on for gRPC API"), + "TCP port to listen on for gRPC/HTTP API. Disabled if " + "port set to zero."), tensorflow::Flag("grpc_socket_path", &options.grpc_socket_path, "If non-empty, listen to a UNIX socket for gRPC API " "on the given path. Can be either relative or absolute " diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index 7cfe1e40e45..f5006fdfca5 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -184,7 +184,8 @@ void Server::PollFilesystemAndReloadConfig(const string& config_file_path) { Status Server::BuildAndStart(const Options& server_options) { if (server_options.grpc_port == 0 && server_options.grpc_socket_path.empty()) { return errors::InvalidArgument( - "At least one of server_options.grpc_port or server_options.grpc_socket_path must be set."); + "At least one of server_options.grpc_port or " + "server_options.grpc_socket_path must be set."); } if (server_options.model_base_path.empty() && From 67e1bd5ffa0d0a1c3b33a0e48695ef613f3c6e07 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Dec 2020 12:01:28 -0800 Subject: [PATCH 4544/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3547a098-9fd8-4a45-8950-c9d4b66e7149 PiperOrigin-RevId: 349452330 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c666296b37e..c25ac2fffbf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1f6be5751692f8bc578164630f8f4a56ceccab253093afe43a279bd2aa21e1de", - git_commit = "296d9533cbd510ce17bcca101e0bfd0f1cb4085b", + sha256 = "e9fb6eff3ad7dfe28370325eda9b108612ae021efd1cff420e38c36e9acc0ece", + git_commit = "7f3c3f527e15f7fff9e5727c8fdaebdfec1af74a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 1ba12b81c70bc9b28756ede9168bfa1f20b453e8 Mon Sep 17 00:00:00 2001 From: Abhinav Pundir Date: Tue, 29 Dec 2020 12:13:03 -0800 Subject: [PATCH 4545/8103] reformat code to 80 column width --- tensorflow_serving/model_servers/server.cc | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index f5006fdfca5..61fd64c0c51 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -182,10 +182,11 @@ void Server::PollFilesystemAndReloadConfig(const string& config_file_path) { } Status Server::BuildAndStart(const Options& server_options) { - if (server_options.grpc_port == 0 && server_options.grpc_socket_path.empty()) { - return errors::InvalidArgument( - "At least one of server_options.grpc_port or " - "server_options.grpc_socket_path must be set."); + if (server_options.grpc_port == 0 && + server_options.grpc_socket_path.empty()) { + return errors::InvalidArgument( + "At least one of server_options.grpc_port or " + "server_options.grpc_socket_path must be set."); } if (server_options.model_base_path.empty() && @@ -342,11 +343,11 @@ Status Server::BuildAndStart(const Options& server_options) { profiler_service_ = tensorflow::profiler::CreateProfilerService(); ::grpc::ServerBuilder builder; - // If defined, listen to a http port for gRPC. + // If defined, listen to a tcp port for gRPC/HTTP. if (server_options.grpc_port != 0) { - builder.AddListeningPort( - server_address, - BuildServerCredentialsFromSSLConfigFile(server_options.ssl_config_file)); + builder.AddListeningPort(server_address, + BuildServerCredentialsFromSSLConfigFile( + server_options.ssl_config_file)); } // If defined, listen to a UNIX socket for gRPC. if (!server_options.grpc_socket_path.empty()) { From 0c26143541b44525f4246744f1ccb826059bdcc0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Dec 2020 18:01:30 -0800 Subject: [PATCH 4546/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/36bf910e-da07-4b5a-b6d0-3f6b7dae2f51 PiperOrigin-RevId: 349493192 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c25ac2fffbf..f0c84fb9ec7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e9fb6eff3ad7dfe28370325eda9b108612ae021efd1cff420e38c36e9acc0ece", - git_commit = "7f3c3f527e15f7fff9e5727c8fdaebdfec1af74a", + sha256 = "055a646d3a4ceacf27846131207f557564a95f79039c416f0dee4cdd3456e49e", + git_commit = "054c7c1e8e0570e7f86a48a082ea38bc39f182b1", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3602981254adcfaf9be4090fa7570d6bf9767cbc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Dec 2020 00:01:26 -0800 Subject: [PATCH 4547/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/da3f784f-c5cf-48bd-a0bb-9300c1147f75 PiperOrigin-RevId: 349519883 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f0c84fb9ec7..4b3c5f326d7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "055a646d3a4ceacf27846131207f557564a95f79039c416f0dee4cdd3456e49e", - git_commit = "054c7c1e8e0570e7f86a48a082ea38bc39f182b1", + sha256 = "aa1140a30488dce5c54fd5c9b28f93750724f95c51b43aac7f5b52432d3d7ec1", + git_commit = "c1efa5341c713b21acefb2536e59ccae232ab066", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 90ef304c9255a4ecd1071d331267c8aa744f1698 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Dec 2020 06:01:27 -0800 Subject: [PATCH 4548/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d56d3573-cea1-45d7-8c77-fc899754fbba PiperOrigin-RevId: 349549173 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4b3c5f326d7..8963b3c4653 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "aa1140a30488dce5c54fd5c9b28f93750724f95c51b43aac7f5b52432d3d7ec1", - git_commit = "c1efa5341c713b21acefb2536e59ccae232ab066", + sha256 = "e3faf9a15392684e482188ec31df2533e524e0ff3a53bd04decd82d8fed1a0ad", + git_commit = "f85e9fa60ffa3c8f698ceaa22f95acc061601eac", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ef1d791880f6a1c9f6ea49efed67a458b62425ca Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Dec 2020 12:01:48 -0800 Subject: [PATCH 4549/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/efdf6851-b6d5-43a4-9182-b0f67560f1cf PiperOrigin-RevId: 349585344 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8963b3c4653..05275cb63d9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e3faf9a15392684e482188ec31df2533e524e0ff3a53bd04decd82d8fed1a0ad", - git_commit = "f85e9fa60ffa3c8f698ceaa22f95acc061601eac", + sha256 = "559aa639a2e612da2f204b471621c9aa2e9db17320ebee94596b5eea0d347382", + git_commit = "47aa5efd24545211696c214130209bec085ef2e4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 225ca47924581c2eb1eeff743581f02f872b66ff Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Dec 2020 18:01:16 -0800 Subject: [PATCH 4550/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/199139f2-1ab2-4a44-b0a4-6f56b9b31227 PiperOrigin-RevId: 349622580 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 05275cb63d9..2106c8dacd5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "559aa639a2e612da2f204b471621c9aa2e9db17320ebee94596b5eea0d347382", - git_commit = "47aa5efd24545211696c214130209bec085ef2e4", + sha256 = "a53995992ecf60df72c3987482a9ee17a2019ebd8db83e99d90d2501856ca476", + git_commit = "82fb8a6f3a871513c791c28285d0da78fce43501", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b8126aae27d7f97778bb34dfd06d947ad46d2a73 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 31 Dec 2020 00:03:22 -0800 Subject: [PATCH 4551/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/927e84c5-1283-4faf-9d7d-520b771d4e13 PiperOrigin-RevId: 349647199 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2106c8dacd5..983551190fc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a53995992ecf60df72c3987482a9ee17a2019ebd8db83e99d90d2501856ca476", - git_commit = "82fb8a6f3a871513c791c28285d0da78fce43501", + sha256 = "f8d01dd42b97b7f718e58fee25bacb80e84421664f826ff1963762bfed13a0c8", + git_commit = "cb8e9521994b392bb71231fe46e43057747d6997", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 94175040a911bcdac6bb66c9b57cc1ec91e25974 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 31 Dec 2020 06:01:36 -0800 Subject: [PATCH 4552/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/53ba73a9-4492-42e1-98b7-5cfd3a41fa9c PiperOrigin-RevId: 349673038 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 983551190fc..62f4ae1f68a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f8d01dd42b97b7f718e58fee25bacb80e84421664f826ff1963762bfed13a0c8", - git_commit = "cb8e9521994b392bb71231fe46e43057747d6997", + sha256 = "1cd86d9638ef2b516866374525dcfdb550313edb98370727d6063153fd7a7c38", + git_commit = "eddde5d4620c52f63312b52a2b60a437f1fceef3", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From dd4339d521e0ec973fdf66acbf985d7a9572c315 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 31 Dec 2020 12:01:37 -0800 Subject: [PATCH 4553/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3b540862-617e-42a8-bd1d-0f1544718529 PiperOrigin-RevId: 349695645 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 62f4ae1f68a..65827e25d02 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1cd86d9638ef2b516866374525dcfdb550313edb98370727d6063153fd7a7c38", - git_commit = "eddde5d4620c52f63312b52a2b60a437f1fceef3", + sha256 = "098c85c97dd6be733dbe13a404b11d22ace10044ef708203559b2752814e526a", + git_commit = "9cfc4f740fadf04ce194e7e9b65decc0736503e4", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 04ce1975b4fd945298e190ab45fde3fd0cd233b0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 31 Dec 2020 18:01:43 -0800 Subject: [PATCH 4554/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/07430ae3-26ea-4917-ad79-8459ec8680c2 PiperOrigin-RevId: 349716715 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 65827e25d02..2104bd4fc8d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "098c85c97dd6be733dbe13a404b11d22ace10044ef708203559b2752814e526a", - git_commit = "9cfc4f740fadf04ce194e7e9b65decc0736503e4", + sha256 = "7ed47344691f2a55f182e83e67af18d68e0eb7c9da1073d171586e04b72a0074", + git_commit = "180ee1fc0af694cd7bbbe1ac8df66c3a076ae5a5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4a150921eed58f04c7bdfc69d6f05902b37e70bf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Jan 2021 06:01:25 -0800 Subject: [PATCH 4555/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5b47fcf6-eba8-4947-9fd1-7f26d7aeac76 PiperOrigin-RevId: 349760252 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2104bd4fc8d..75d3547fd2f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7ed47344691f2a55f182e83e67af18d68e0eb7c9da1073d171586e04b72a0074", - git_commit = "180ee1fc0af694cd7bbbe1ac8df66c3a076ae5a5", + sha256 = "3bbf6e81c0d7cc24c097b7db072e86b989bcb94d9324182c1452463ae88427b3", + git_commit = "8867b44e4cdc193d865093ce675754872d36e8d2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7dbae96edb8ad038c9bed9f6a5a6046a59532a70 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 2 Jan 2021 06:01:14 -0800 Subject: [PATCH 4556/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/850bf19f-b6a1-430c-af26-be93173abad6 PiperOrigin-RevId: 349843500 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 75d3547fd2f..55f1d2615a6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3bbf6e81c0d7cc24c097b7db072e86b989bcb94d9324182c1452463ae88427b3", - git_commit = "8867b44e4cdc193d865093ce675754872d36e8d2", + sha256 = "a943d8258d876bbafd91629b30734cfac8816bbeff720b274706e3f6ecaa3681", + git_commit = "6a7fda5d1b8ffbe40985d3e300d30b2cfe562247", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From ec9b91b4088bcaa063a96e859ebcf45c90f94368 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 3 Jan 2021 00:01:38 -0800 Subject: [PATCH 4557/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c94ca2f1-8a6a-4be0-b8a0-647d08e2b92e PiperOrigin-RevId: 349901157 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 55f1d2615a6..e8748905578 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a943d8258d876bbafd91629b30734cfac8816bbeff720b274706e3f6ecaa3681", - git_commit = "6a7fda5d1b8ffbe40985d3e300d30b2cfe562247", + sha256 = "ab32892fd9c82d72ebb2828d417e3942554418e23bfdbbded8c77566f9fa0b81", + git_commit = "48aeb820a4446917a03211c60e2593df611b1c45", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From caceb92e526e216f4e2d456a7a274f082b1df7b3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 3 Jan 2021 06:01:28 -0800 Subject: [PATCH 4558/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fec58e13-6f3a-4129-853f-654444498ece PiperOrigin-RevId: 349922726 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e8748905578..2f31f2749b2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ab32892fd9c82d72ebb2828d417e3942554418e23bfdbbded8c77566f9fa0b81", - git_commit = "48aeb820a4446917a03211c60e2593df611b1c45", + sha256 = "8dc27602bd8ab1efd7a02f8a60b7dbdff6713db64edbb8f0285428055ff3626e", + git_commit = "3edb086d60068699e5c6fe14ddd96f4c3583ba52", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 37c1f45f78c744d69341ae3cd5ade391c7275ecc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 3 Jan 2021 18:01:37 -0800 Subject: [PATCH 4559/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fb47bd27-11ae-4516-bcc0-f7e1bb194998 PiperOrigin-RevId: 349963147 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2f31f2749b2..8ea5466b1b9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8dc27602bd8ab1efd7a02f8a60b7dbdff6713db64edbb8f0285428055ff3626e", - git_commit = "3edb086d60068699e5c6fe14ddd96f4c3583ba52", + sha256 = "fd283aa9ecb55d42b462bc481823c094da6b76666de960ac054802b1b5f10d80", + git_commit = "35c15e0c18406df7a52bf5881e61a0f54d01babd", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c54d8d89fa3afea5376db1d3d43110a898e54e49 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 4 Jan 2021 06:01:24 -0800 Subject: [PATCH 4560/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1829edea-8e21-4fd2-b3dd-4b85d230f8c5 PiperOrigin-RevId: 350010194 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8ea5466b1b9..e550e6b048f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fd283aa9ecb55d42b462bc481823c094da6b76666de960ac054802b1b5f10d80", - git_commit = "35c15e0c18406df7a52bf5881e61a0f54d01babd", + sha256 = "f373cb128c0688340ad1cdd4bb14e78e177e97150cde44d8b81772736b86df74", + git_commit = "d18947de1338bd9ed2bf9a0265abb0e8bf126e03", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From c99eaa256cbbf72f4b64684b7ad73aeb035b8048 Mon Sep 17 00:00:00 2001 From: skawasak Date: Mon, 28 Dec 2020 15:42:12 +0900 Subject: [PATCH 4561/8103] delete all metrics, and use metrics by per-model and status --- .../model_servers/http_rest_api_handler.cc | 17 +++--- .../model_servers/http_rest_api_handler.h | 2 +- .../model_servers/http_server.cc | 9 +-- .../model_servers/prediction_service_impl.cc | 10 ++-- .../servables/tensorflow/predict_util.cc | 14 +---- .../servables/tensorflow/util.cc | 60 ++++--------------- .../servables/tensorflow/util.h | 7 +-- 7 files changed, 33 insertions(+), 86 deletions(-) diff --git a/tensorflow_serving/model_servers/http_rest_api_handler.cc b/tensorflow_serving/model_servers/http_rest_api_handler.cc index 8a7b2387658..0fbcdeb54d7 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler.cc +++ b/tensorflow_serving/model_servers/http_rest_api_handler.cc @@ -81,18 +81,17 @@ void FillJsonErrorMsg(const string& errmsg, string* output) { Status HttpRestApiHandler::ProcessRequest( const absl::string_view http_method, const absl::string_view request_path, const absl::string_view request_body, - std::vector>* headers, string* output) { + std::vector>* headers, string* output, string* model_name) { headers->clear(); output->clear(); AddHeaders(headers); - string model_name; string model_version_str; string method; string model_subresource; Status status = errors::InvalidArgument("Malformed request: ", http_method, " ", request_path); if (http_method == "POST" && - RE2::FullMatch(string(request_path), prediction_api_regex_, &model_name, + RE2::FullMatch(string(request_path), prediction_api_regex_, model_name, &model_version_str, &method)) { absl::optional model_version; if (!model_version_str.empty()) { @@ -104,24 +103,24 @@ Status HttpRestApiHandler::ProcessRequest( model_version = version; } if (method == "classify") { - status = ProcessClassifyRequest(model_name, model_version, request_body, + status = ProcessClassifyRequest(*model_name, model_version, request_body, output); } else if (method == "regress") { - status = ProcessRegressRequest(model_name, model_version, request_body, + status = ProcessRegressRequest(*model_name, model_version, request_body, output); } else if (method == "predict") { - status = ProcessPredictRequest(model_name, model_version, request_body, + status = ProcessPredictRequest(*model_name, model_version, request_body, output); } } else if (http_method == "GET" && RE2::FullMatch(string(request_path), modelstatus_api_regex_, - &model_name, &model_version_str, + model_name, &model_version_str, &model_subresource)) { if (!model_subresource.empty() && model_subresource == "metadata") { status = - ProcessModelMetadataRequest(model_name, model_version_str, output); + ProcessModelMetadataRequest(*model_name, model_version_str, output); } else { - status = ProcessModelStatusRequest(model_name, model_version_str, output); + status = ProcessModelStatusRequest(*model_name, model_version_str, output); } } diff --git a/tensorflow_serving/model_servers/http_rest_api_handler.h b/tensorflow_serving/model_servers/http_rest_api_handler.h index 442d3bd9a34..489cf34af0d 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler.h +++ b/tensorflow_serving/model_servers/http_rest_api_handler.h @@ -82,7 +82,7 @@ class HttpRestApiHandler { const absl::string_view request_path, const absl::string_view request_body, std::vector>* headers, - string* output); + string* output, string* model_name); private: Status ProcessClassifyRequest(const absl::string_view model_name, diff --git a/tensorflow_serving/model_servers/http_server.cc b/tensorflow_serving/model_servers/http_server.cc index 3d28fb493d4..27aa02ed58b 100644 --- a/tensorflow_serving/model_servers/http_server.cc +++ b/tensorflow_serving/model_servers/http_server.cc @@ -154,11 +154,12 @@ class RestApiRequestDispatcher { } std::vector> headers; + string model_name; string output; VLOG(1) << "Processing HTTP request: " << req->http_method() << " " << req->uri_path() << " body: " << body.size() << " bytes."; const auto status = handler_->ProcessRequest( - req->http_method(), req->uri_path(), body, &headers, &output); + req->http_method(), req->uri_path(), body, &headers, &output, &model_name); const auto http_status = ToHTTPStatusCode(status); // Note: we add headers+output for non successful status too, in case the // output contains details about the error (e.g. error messages). @@ -166,14 +167,14 @@ class RestApiRequestDispatcher { req->OverwriteResponseHeader(kv.first, kv.second); } req->WriteResponseString(output); - UpdateAllLatencyTime(Env::Default()->NowMicros() - start); if (http_status != net_http::HTTPStatusCode::OK) { VLOG(1) << "Error Processing HTTP/REST request: " << req->http_method() << " " << req->uri_path() << " Error: " << status.ToString(); - RecordAllRequestFailCount(); } req->ReplyWithStatus(http_status); - RecordAllRequestCount(); + + UpdateModelLatencyTime(model_name, Env::Default()->NowMicros() - start); + RecordModelRequestCount(model_name, status); } const RE2 regex_; diff --git a/tensorflow_serving/model_servers/prediction_service_impl.cc b/tensorflow_serving/model_servers/prediction_service_impl.cc index be8f867a9d1..f20b4a5908e 100644 --- a/tensorflow_serving/model_servers/prediction_service_impl.cc +++ b/tensorflow_serving/model_servers/prediction_service_impl.cc @@ -59,15 +59,15 @@ ::grpc::Status PredictionServiceImpl::Predict(::grpc::ServerContext *context, DeadlineToTimeoutMillis(context->raw_deadline())); } - const ::grpc::Status status = - ToGRPCStatus(predictor_->Predict(run_options, core_, *request, response)); - UpdateAllLatencyTime(Env::Default()->NowMicros() - start); + const ::tensorflow::Status tf_status = predictor_->Predict(run_options, core_, *request, response); + const ::grpc::Status status = ToGRPCStatus(tf_status); if (!status.ok()) { VLOG(1) << "Predict failed: " << status.error_message(); - RecordAllRequestFailCount(); } - RecordAllRequestCount(); + UpdateModelLatencyTime(request->model_spec().name(), Env::Default()->NowMicros() - start); + RecordModelRequestCount(request->model_spec().name(), tf_status); + return status; } diff --git a/tensorflow_serving/servables/tensorflow/predict_util.cc b/tensorflow_serving/servables/tensorflow/predict_util.cc index 0b6660326d4..ca3d62611c6 100644 --- a/tensorflow_serving/servables/tensorflow/predict_util.cc +++ b/tensorflow_serving/servables/tensorflow/predict_util.cc @@ -206,17 +206,9 @@ Status RunPredict( &output_tensor_aliases)); std::vector outputs; RunMetadata run_metadata; - - const uint64 start = Env::Default()->NowMicros(); - Status status = session->Run(run_options, input_tensors, - output_tensor_names, {}, &outputs, - &run_metadata); - UpdateModelLatencyTime(request.model_spec().name(), Env::Default()->NowMicros() - start); - if (status != Status::OK()) { - RecordModelRequestFailCount(request.model_spec().name()); - } - RecordModelRequestCount(request.model_spec().name()); - TF_RETURN_IF_ERROR(status); + TF_RETURN_IF_ERROR(session->Run(run_options, input_tensors, + output_tensor_names, {}, &outputs, + &run_metadata, thread_pool_options)); return PostProcessPredictionResult(output_tensor_aliases, outputs, option, response); diff --git a/tensorflow_serving/servables/tensorflow/util.cc b/tensorflow_serving/servables/tensorflow/util.cc index b3b8ce01e89..d861a01b6de 100644 --- a/tensorflow_serving/servables/tensorflow/util.cc +++ b/tensorflow_serving/servables/tensorflow/util.cc @@ -48,42 +48,17 @@ auto* example_count_total = monitoring::Counter<1>::New( "The total number of tensorflow.Examples.", "model"); // Metrics by model -auto* model_request_count_total = monitoring::Counter<1>::New( +auto* model_request_status_count_total = monitoring::Counter<2>::New( "/tensorflow/serving/model_request_count", - "The total number of requests.", "model"); - -auto* model_request_fail_count_total = monitoring::Counter<1>::New( - "/tensorflow/serving/model_request_fail_count", - "The total number of faled requests.", "model"); + "The total number of requests.", "model_name", "status"); auto* model_latency_total = monitoring::Counter<1>::New( "/tensorflow/serving/model_request_latency_usec", - "The total time spent on executing graphs in microseconds.", "model"); + "The total time spent on executing graphs in microseconds.", "model_name"); auto* model_latency_histogram = monitoring::Sampler<1>::New( {"/tensorflow/serving/model_request_latency_histogram_usec", - "The total time spent on executing graphs in microseconds.", "model"}, - // It would be nice to be able to set the parameters flexibly. - monitoring::Buckets::Explicit({ - 1000, 2000, 3000, 4000, 5000, 7000, 9000, 11000, 13000, 15000, - 17000, 19000, 21000, 24000, 27000, 30000, 33000, 35000, 38000})); - -// All processing metrics -auto* all_request_count_total = monitoring::Counter<0>::New( - "/tensorflow/serving/all_request_count", - "The total number of requests."); - -auto* all_request_fail_count_total = monitoring::Counter<0>::New( - "/tensorflow/serving/all_request_fail_count", - "The total number of faled requests."); - -auto* all_latency_total = monitoring::Counter<0>::New( - "/tensorflow/serving/all_request_latency_usec", - "The total time spent on serving in microseconds."); - -auto* all_latency_histogram = monitoring::Sampler<0>::New( - {"/tensorflow/serving/all_request_latency_histogram_usec", - "The total time spent on serving in microseconds."}, + "The total time spent on executing graphs in microseconds.", "model_name"}, // It would be nice to be able to set the parameters flexibly. monitoring::Buckets::Explicit({ 1000, 2000, 3000, 4000, 5000, 7000, 9000, 11000, 13000, 15000, @@ -113,12 +88,12 @@ monitoring::Counter<1>* GetExampleCountTotal() { return example_count_total; } } // namespace internal // Metrics by model -void RecordModelRequestCount(const string& model_name) { - model_request_count_total->GetCell(model_name)->IncrementBy(1); -} - -void RecordModelRequestFailCount(const string& model_name) { - model_request_fail_count_total->GetCell(model_name)->IncrementBy(1); +void RecordModelRequestCount(const string& model_name, const Status& status) { + string status_label = "success"; + if (status != Status::OK()) { + status_label = "failed"; + } + model_request_status_count_total->GetCell(model_name, status_label)->IncrementBy(1); } void UpdateModelLatencyTime(const string& model_name, const uint64 running_time_usecs) { @@ -128,21 +103,6 @@ void UpdateModelLatencyTime(const string& model_name, const uint64 running_time_ } } -// All processing metrics -void RecordAllRequestCount() { - all_request_count_total->GetCell()->IncrementBy(1); -} - -void RecordAllRequestFailCount() { - all_request_fail_count_total->GetCell()->IncrementBy(1); -} - -void UpdateAllLatencyTime(const uint64 running_time_usecs) { - if (running_time_usecs > 0) { - all_latency_total->GetCell()->IncrementBy(running_time_usecs); - all_latency_histogram->GetCell()->Add(running_time_usecs); - } -} void RecordRequestExampleCount(const string& model_name, size_t count) { example_counts->GetCell(model_name)->Add(count); diff --git a/tensorflow_serving/servables/tensorflow/util.h b/tensorflow_serving/servables/tensorflow/util.h index 2a2e226694c..355727a7859 100644 --- a/tensorflow_serving/servables/tensorflow/util.h +++ b/tensorflow_serving/servables/tensorflow/util.h @@ -39,15 +39,10 @@ monitoring::Counter<1>* GetExampleCountTotal(); } // namespace internal // Metrics by model -void RecordModelRequestCount(const string& model_name); +void RecordModelRequestCount(const string& model_name, const Status& status); void RecordModelRequestFailCount(const string& model_name); void UpdateModelLatencyTime(const string& model_name, const uint64 running_time_usecs); -// All processing metrics -void RecordAllRequestCount(); -void RecordAllRequestFailCount(); -void UpdateAllLatencyTime(const uint64 running_time_usecs); - // Records the example count of this request with the metric tracking the // histogram of number of examples per request. void RecordRequestExampleCount(const string& model_name, size_t count); From 0baf956f0247dd7fc7eaecf46fd13ce524269324 Mon Sep 17 00:00:00 2001 From: skawasak Date: Tue, 5 Jan 2021 04:11:03 +0900 Subject: [PATCH 4562/8103] delete bucket model_latency_total --- tensorflow_serving/servables/tensorflow/util.cc | 5 ----- 1 file changed, 5 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/util.cc b/tensorflow_serving/servables/tensorflow/util.cc index d861a01b6de..a97e03bff02 100644 --- a/tensorflow_serving/servables/tensorflow/util.cc +++ b/tensorflow_serving/servables/tensorflow/util.cc @@ -52,10 +52,6 @@ auto* model_request_status_count_total = monitoring::Counter<2>::New( "/tensorflow/serving/model_request_count", "The total number of requests.", "model_name", "status"); -auto* model_latency_total = monitoring::Counter<1>::New( - "/tensorflow/serving/model_request_latency_usec", - "The total time spent on executing graphs in microseconds.", "model_name"); - auto* model_latency_histogram = monitoring::Sampler<1>::New( {"/tensorflow/serving/model_request_latency_histogram_usec", "The total time spent on executing graphs in microseconds.", "model_name"}, @@ -98,7 +94,6 @@ void RecordModelRequestCount(const string& model_name, const Status& status) { void UpdateModelLatencyTime(const string& model_name, const uint64 running_time_usecs) { if (running_time_usecs > 0) { - model_latency_total->GetCell(model_name)->IncrementBy(running_time_usecs); model_latency_histogram->GetCell(model_name)->Add(running_time_usecs); } } From 85723e184aed7fcc0249ffac2c384a16f4863a85 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 4 Jan 2021 12:01:39 -0800 Subject: [PATCH 4563/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/302cffc3-5ace-4f93-a5eb-1dfcf901e25e PiperOrigin-RevId: 350035780 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e550e6b048f..e76ceda17b2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f373cb128c0688340ad1cdd4bb14e78e177e97150cde44d8b81772736b86df74", - git_commit = "d18947de1338bd9ed2bf9a0265abb0e8bf126e03", + sha256 = "102bf0965b3ecae5e0adb383efc7c1c36390e39f997e14a7ca4eace721460c1c", + git_commit = "556fa126dbe1d443d2c771bf7a26f0ce230797f6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d353931269d1a9b10381102a9f8fd80b27bcf28e Mon Sep 17 00:00:00 2001 From: skawasak Date: Tue, 5 Jan 2021 07:04:19 +0900 Subject: [PATCH 4564/8103] use RecordRuntimeLatency --- .../model_servers/http_rest_api_handler.cc | 11 ++++--- .../model_servers/http_rest_api_handler.h | 2 +- .../model_servers/http_server.cc | 6 ++-- .../model_servers/prediction_service_impl.cc | 29 ++++++++++++++----- .../servables/tensorflow/util.cc | 14 --------- .../servables/tensorflow/util.h | 2 -- 6 files changed, 32 insertions(+), 32 deletions(-) diff --git a/tensorflow_serving/model_servers/http_rest_api_handler.cc b/tensorflow_serving/model_servers/http_rest_api_handler.cc index c85c490ba23..034584dc6b8 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler.cc +++ b/tensorflow_serving/model_servers/http_rest_api_handler.cc @@ -64,12 +64,11 @@ HttpRestApiHandler::~HttpRestApiHandler() {} Status HttpRestApiHandler::ProcessRequest( const absl::string_view http_method, const absl::string_view request_path, const absl::string_view request_body, - std::vector>* headers, string* output, string* model_name) { + std::vector>* headers, string* output, string* model_name, string* method) { headers->clear(); output->clear(); AddHeaders(headers); string model_version_str; - string method; string model_subresource; Status status = errors::InvalidArgument("Malformed request: ", http_method, " ", request_path); @@ -79,17 +78,17 @@ Status HttpRestApiHandler::ProcessRequest( TF_RETURN_IF_ERROR(ParseModelInfo( http_method, request_path, model_name, &model_version, - &model_version_label, &method, &model_subresource, &parse_successful)); + &model_version_label, method, &model_subresource, &parse_successful)); // Dispatch request to appropriate processor if (http_method == "POST" && parse_successful) { - if (method == "classify") { + if (*method == "classify") { status = ProcessClassifyRequest( *model_name, model_version, model_version_label, request_body, output); - } else if (method == "regress") { + } else if (*method == "regress") { status = ProcessRegressRequest(*model_name, model_version, model_version_label, request_body, output); - } else if (method == "predict") { + } else if (*method == "predict") { status = ProcessPredictRequest(*model_name, model_version, model_version_label, request_body, output); } diff --git a/tensorflow_serving/model_servers/http_rest_api_handler.h b/tensorflow_serving/model_servers/http_rest_api_handler.h index 9cce0fa5d62..8ce88d17f2c 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler.h +++ b/tensorflow_serving/model_servers/http_rest_api_handler.h @@ -82,7 +82,7 @@ class HttpRestApiHandler { const absl::string_view request_path, const absl::string_view request_body, std::vector>* headers, - string* output, string* model_name); + string* output, string* model_name, string* method); private: Status ProcessClassifyRequest( diff --git a/tensorflow_serving/model_servers/http_server.cc b/tensorflow_serving/model_servers/http_server.cc index 27aa02ed58b..242ef8d117f 100644 --- a/tensorflow_serving/model_servers/http_server.cc +++ b/tensorflow_serving/model_servers/http_server.cc @@ -155,11 +155,12 @@ class RestApiRequestDispatcher { std::vector> headers; string model_name; + string method; string output; VLOG(1) << "Processing HTTP request: " << req->http_method() << " " << req->uri_path() << " body: " << body.size() << " bytes."; const auto status = handler_->ProcessRequest( - req->http_method(), req->uri_path(), body, &headers, &output, &model_name); + req->http_method(), req->uri_path(), body, &headers, &output, &model_name, &method); const auto http_status = ToHTTPStatusCode(status); // Note: we add headers+output for non successful status too, in case the // output contains details about the error (e.g. error messages). @@ -173,7 +174,8 @@ class RestApiRequestDispatcher { } req->ReplyWithStatus(http_status); - UpdateModelLatencyTime(model_name, Env::Default()->NowMicros() - start); + RecordRuntimeLatency(model_name, /*api=*/method, /*runtime=*/"HTTP", + Env::Default()->NowMicros() - start); RecordModelRequestCount(model_name, status); } diff --git a/tensorflow_serving/model_servers/prediction_service_impl.cc b/tensorflow_serving/model_servers/prediction_service_impl.cc index 18104bcf876..82be3464038 100644 --- a/tensorflow_serving/model_servers/prediction_service_impl.cc +++ b/tensorflow_serving/model_servers/prediction_service_impl.cc @@ -65,7 +65,8 @@ ::grpc::Status PredictionServiceImpl::Predict(::grpc::ServerContext *context, if (!status.ok()) { VLOG(1) << "Predict failed: " << status.error_message(); } - UpdateModelLatencyTime(request->model_spec().name(), Env::Default()->NowMicros() - start); + RecordRuntimeLatency(request->model_spec().name(), /*api=*/"Predict", /*runtime=*/"GRPC", + Env::Default()->NowMicros() - start); RecordModelRequestCount(request->model_spec().name(), tf_status); return status; @@ -85,38 +86,52 @@ ::grpc::Status PredictionServiceImpl::GetModelMetadata( ::grpc::Status PredictionServiceImpl::Classify( ::grpc::ServerContext *context, const ClassificationRequest *request, ClassificationResponse *response) { + const uint64 start = Env::Default()->NowMicros(); tensorflow::RunOptions run_options = tensorflow::RunOptions(); // By default, this is infinite which is the same default as RunOptions. if (enforce_session_run_timeout_) { run_options.set_timeout_in_ms( DeadlineToTimeoutMillis(context->raw_deadline())); } - const ::grpc::Status status = - ToGRPCStatus(TensorflowClassificationServiceImpl::Classify( + + const ::tensorflow::Status tf_status = TensorflowClassificationServiceImpl::Classify( run_options, core_, GetThreadPoolOptions(thread_pool_factory_), - *request, response)); + *request, response); + const ::grpc::Status status = ToGRPCStatus(tf_status); + if (!status.ok()) { VLOG(1) << "Classify request failed: " << status.error_message(); } + RecordRuntimeLatency(request->model_spec().name(), /*api=*/"Classify", /*runtime=*/"GRPC", + Env::Default()->NowMicros() - start); + RecordModelRequestCount(request->model_spec().name(), tf_status); + return status; } ::grpc::Status PredictionServiceImpl::Regress(::grpc::ServerContext *context, const RegressionRequest *request, RegressionResponse *response) { + const uint64 start = Env::Default()->NowMicros(); tensorflow::RunOptions run_options = tensorflow::RunOptions(); // By default, this is infinite which is the same default as RunOptions. if (enforce_session_run_timeout_) { run_options.set_timeout_in_ms( DeadlineToTimeoutMillis(context->raw_deadline())); } - const ::grpc::Status status = - ToGRPCStatus(TensorflowRegressionServiceImpl::Regress( + + const ::tensorflow::Status tf_status = TensorflowRegressionServiceImpl::Regress( run_options, core_, GetThreadPoolOptions(thread_pool_factory_), - *request, response)); + *request, response); + const ::grpc::Status status = ToGRPCStatus(tf_status); + if (!status.ok()) { VLOG(1) << "Regress request failed: " << status.error_message(); } + RecordRuntimeLatency(request->model_spec().name(), /*api=*/"Regress", /*runtime=*/"GRPC", + Env::Default()->NowMicros() - start); + RecordModelRequestCount(request->model_spec().name(), tf_status); + return status; } diff --git a/tensorflow_serving/servables/tensorflow/util.cc b/tensorflow_serving/servables/tensorflow/util.cc index 727f79be560..96a4023db07 100644 --- a/tensorflow_serving/servables/tensorflow/util.cc +++ b/tensorflow_serving/servables/tensorflow/util.cc @@ -59,14 +59,6 @@ auto* model_request_status_count_total = monitoring::Counter<2>::New( "/tensorflow/serving/model_request_count", "The total number of requests.", "model_name", "status"); -auto* model_latency_histogram = monitoring::Sampler<1>::New( - {"/tensorflow/serving/model_request_latency_histogram_usec", - "The total time spent on executing graphs in microseconds.", "model_name"}, - // It would be nice to be able to set the parameters flexibly. - monitoring::Buckets::Explicit({ - 1000, 2000, 3000, 4000, 5000, 7000, 9000, 11000, 13000, 15000, - 17000, 19000, 21000, 24000, 27000, 30000, 33000, 35000, 38000})); - auto* runtime_latency = monitoring::Sampler<3>::New( { "/tensorflow/serving/runtime_latency", @@ -140,12 +132,6 @@ void RecordModelRequestCount(const string& model_name, const Status& status) { model_request_status_count_total->GetCell(model_name, status_label)->IncrementBy(1); } -void UpdateModelLatencyTime(const string& model_name, const uint64 running_time_usecs) { - if (running_time_usecs > 0) { - model_latency_histogram->GetCell(model_name)->Add(running_time_usecs); - } -} - void SetSignatureMethodNameCheckFeature(bool v) { signature_method_check = v; } bool GetSignatureMethodNameCheckFeature() { return signature_method_check; } diff --git a/tensorflow_serving/servables/tensorflow/util.h b/tensorflow_serving/servables/tensorflow/util.h index 5898c639750..78155248255 100644 --- a/tensorflow_serving/servables/tensorflow/util.h +++ b/tensorflow_serving/servables/tensorflow/util.h @@ -42,8 +42,6 @@ monitoring::Counter<1>* GetExampleCountTotal(); // Metrics by model void RecordModelRequestCount(const string& model_name, const Status& status); -void RecordModelRequestFailCount(const string& model_name); -void UpdateModelLatencyTime(const string& model_name, const uint64 running_time_usecs); // Enable/disable `method_name` checks on `SignatureDef` for predict, classify, // regress APIs. Native TF2 models use fixed `method_name` for all APIs, and From 4738283c00cf48e1b20f54317689a0f4c8297c84 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 4 Jan 2021 18:01:16 -0800 Subject: [PATCH 4565/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ba9ee960-ae14-4fa2-9bae-b6c6f651365c PiperOrigin-RevId: 350060237 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e76ceda17b2..cf8ac29bfed 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "102bf0965b3ecae5e0adb383efc7c1c36390e39f997e14a7ca4eace721460c1c", - git_commit = "556fa126dbe1d443d2c771bf7a26f0ce230797f6", + sha256 = "2a84fc80f2c468be8f1e070da66b497efee2fcad85f56201e13413ac9e5eea98", + git_commit = "b6fbda0c28d7f5357db6daeed2f51f8794e531a9", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 72bc1fe52e702fa446605a78050ed6e0f77a4c97 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 5 Jan 2021 00:01:23 -0800 Subject: [PATCH 4566/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ad42816b-8723-4e02-949f-3be6d17ef40c PiperOrigin-RevId: 350086899 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cf8ac29bfed..a927fe78b5c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2a84fc80f2c468be8f1e070da66b497efee2fcad85f56201e13413ac9e5eea98", - git_commit = "b6fbda0c28d7f5357db6daeed2f51f8794e531a9", + sha256 = "ca6e218eff4c972e8b6993d0db87bfa079406d89526c4d07004891a113b9ce18", + git_commit = "3dd788af5bf8ae3da50a1420f89d6125f4598e30", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 950b6cc5655e7a66509eabf0bc2da56f594cb68a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 5 Jan 2021 06:01:44 -0800 Subject: [PATCH 4567/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c85d8465-ad0a-4e19-a57d-59addbb90e7f PiperOrigin-RevId: 350125263 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a927fe78b5c..1bd34c90149 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ca6e218eff4c972e8b6993d0db87bfa079406d89526c4d07004891a113b9ce18", - git_commit = "3dd788af5bf8ae3da50a1420f89d6125f4598e30", + sha256 = "59dc122a44b3590558e085cbeaeb9ab59a1e722459d4e3a3284ecbbcc176cfb2", + git_commit = "32449628f66f7731d5dbdfa3ed016040b3a81596", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 75f58fe51c04f80d085ab23a65685be46e1012c1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 5 Jan 2021 12:01:39 -0800 Subject: [PATCH 4568/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f8340be4-67d1-461c-b6f7-4d3434c83e7b PiperOrigin-RevId: 350190374 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1bd34c90149..297fa121adc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "59dc122a44b3590558e085cbeaeb9ab59a1e722459d4e3a3284ecbbcc176cfb2", - git_commit = "32449628f66f7731d5dbdfa3ed016040b3a81596", + sha256 = "b04d0abf8b851fb8d8d9fb848506ade7d25c72c69ee48df7b180cfe25e71b9a5", + git_commit = "48e22089f4a5cf7cf8614807e0dc1b630087cbd6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7bead59028430749bb8c01974475bac4772414da Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 5 Jan 2021 18:01:16 -0800 Subject: [PATCH 4569/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/29b8f148-f6ac-431c-a623-22d4940f299c PiperOrigin-RevId: 350257758 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 297fa121adc..9bdad3fc428 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b04d0abf8b851fb8d8d9fb848506ade7d25c72c69ee48df7b180cfe25e71b9a5", - git_commit = "48e22089f4a5cf7cf8614807e0dc1b630087cbd6", + sha256 = "48e21a2991171143e09506c40ef9a75ebcdfbf83da48bccbaeb2e367758052b3", + git_commit = "d9841dfd9689f9c4e0bc4e1229dbc354f01ebc1b", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From dd1c6941c2c9f37ca70b13ab422fd176567a8ed7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 6 Jan 2021 00:01:38 -0800 Subject: [PATCH 4570/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/43388e6d-5e35-4291-a7e2-c5f6a5e30244 PiperOrigin-RevId: 350295367 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9bdad3fc428..cb2f10ce5d0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "48e21a2991171143e09506c40ef9a75ebcdfbf83da48bccbaeb2e367758052b3", - git_commit = "d9841dfd9689f9c4e0bc4e1229dbc354f01ebc1b", + sha256 = "a4a6f0988d2dabac5118be4d9687878c6b4722e388eb96f7e057c277711edc57", + git_commit = "ca7c72bbbd6cd95ce3f4585e9eca1239acce31ff", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 4b2ec65f3c4cec4025bcccd441c481914aa90873 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 6 Jan 2021 06:01:32 -0800 Subject: [PATCH 4571/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f0c9c74d-8710-4087-afa4-4303cbbce0a8 PiperOrigin-RevId: 350337280 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cb2f10ce5d0..90aa90024f8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a4a6f0988d2dabac5118be4d9687878c6b4722e388eb96f7e057c277711edc57", - git_commit = "ca7c72bbbd6cd95ce3f4585e9eca1239acce31ff", + sha256 = "e60bfe23c6e312a93762bdd2256c5044c7ae15166063e4307fb2b58160089f44", + git_commit = "4f0759177bc77b3b8247622e8a727539bc76d814", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7f8e5be6b873e56bb3c4b9a3ba75568266ab5837 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 6 Jan 2021 12:01:31 -0800 Subject: [PATCH 4572/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c5ca771c-77d7-479e-a6ee-eac185115a25 PiperOrigin-RevId: 350400464 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 90aa90024f8..35965c2c82c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e60bfe23c6e312a93762bdd2256c5044c7ae15166063e4307fb2b58160089f44", - git_commit = "4f0759177bc77b3b8247622e8a727539bc76d814", + sha256 = "450889b58411c935709dbf98b3e4f3d0bdb880e16043ae476fb03b4bd41bf9db", + git_commit = "e2395993d0cb1a55d16a4fdf1228ffa7f2808fe8", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b394c0858134b5a25321fc744e5f85ae53ad93c3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 6 Jan 2021 18:01:33 -0800 Subject: [PATCH 4573/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3b3117d4-1b2c-4eb6-9b28-9b9e3c2363b3 PiperOrigin-RevId: 350463370 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 35965c2c82c..6bedcb2736e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "450889b58411c935709dbf98b3e4f3d0bdb880e16043ae476fb03b4bd41bf9db", - git_commit = "e2395993d0cb1a55d16a4fdf1228ffa7f2808fe8", + sha256 = "de02ea4ddd509f5dbec1a63b41c480b89cb1676552cb20454ed2427c4abdb474", + git_commit = "f5952adc00bb652d9bd56d03c43575f84bc8b4d2", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 601f0de6eed1f29dbaa4b8fbfe84d0eed1c9fa3f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Jan 2021 00:01:32 -0800 Subject: [PATCH 4574/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/293bf363-2e19-4627-9bbd-b3698c1673be PiperOrigin-RevId: 350500590 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6bedcb2736e..dde29683c16 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "de02ea4ddd509f5dbec1a63b41c480b89cb1676552cb20454ed2427c4abdb474", - git_commit = "f5952adc00bb652d9bd56d03c43575f84bc8b4d2", + sha256 = "9ac17ae76ab252c54ff036539e54b961fd97c428743df11f02269a2a238758b9", + git_commit = "95569ba915ca4cc2d29cd89b5138a8534ad4ef3e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 00dc3d695fbf8d465367a10e738c4a89e214c1a2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Jan 2021 06:01:29 -0800 Subject: [PATCH 4575/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ec729270-4826-4cc7-b42c-ae11fb2fa54f PiperOrigin-RevId: 350544030 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dde29683c16..9a07ba0e8d4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9ac17ae76ab252c54ff036539e54b961fd97c428743df11f02269a2a238758b9", - git_commit = "95569ba915ca4cc2d29cd89b5138a8534ad4ef3e", + sha256 = "57ef968b60ca5fdd6cf3fd5bb2cbae7f79615e21d077c0fc99c9f2114eb82e86", + git_commit = "e30e1d1aedb418946cddc715c3556b0c8a7ac2ca", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 971c81aa8f8b916ec3bbd60d376e57188bfb343b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Jan 2021 12:01:54 -0800 Subject: [PATCH 4576/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/889a1967-a134-4fff-b813-3043f3737200 PiperOrigin-RevId: 350610627 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9a07ba0e8d4..2ce46273e25 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "57ef968b60ca5fdd6cf3fd5bb2cbae7f79615e21d077c0fc99c9f2114eb82e86", - git_commit = "e30e1d1aedb418946cddc715c3556b0c8a7ac2ca", + sha256 = "48a8a257ef1058c53e97d007d41999de56cf1d0dcb99336cc4e7f748c99ca8ee", + git_commit = "d3ff9a39bd87e0fa5885a7d99ef587ab6bb3d8bb", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7f100885d0ce85b3a6420b0a7fd6331368f4df7f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Jan 2021 18:01:37 -0800 Subject: [PATCH 4577/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/757aff97-b959-4df4-8ba0-8159b4b6e201 PiperOrigin-RevId: 350674190 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2ce46273e25..aa5c698bf59 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "48a8a257ef1058c53e97d007d41999de56cf1d0dcb99336cc4e7f748c99ca8ee", - git_commit = "d3ff9a39bd87e0fa5885a7d99ef587ab6bb3d8bb", + sha256 = "dbaf007a6696fec907ad63ec5f11ca667e318c75327aa09f6146cbc77532d14f", + git_commit = "af3472d13f875724f0f5693e317291d970bcbf4e", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 3234fca77b7bd433bd0b657c506d3526128e4626 Mon Sep 17 00:00:00 2001 From: Brian Zhao Date: Thu, 7 Jan 2021 21:41:20 -0800 Subject: [PATCH 4578/8103] Remove an unused experimental config option "experimental_fixed_input_tensors_filepath". PiperOrigin-RevId: 350696687 --- .../tensorflow/saved_model_bundle_factory.cc | 8 ----- .../saved_model_bundle_factory_test.cc | 31 ------------------- 2 files changed, 39 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc index 9ed3153c836..31ed1cdf798 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc @@ -153,14 +153,6 @@ Status SavedModelBundleFactory::InternalCreateSavedModelBundle( session_options, GetRunOptions(config_), path, saved_model_tags, bundle->get())); } - if (!config_.experimental_fixed_input_tensors().empty()) { - LOG(INFO) << "Wrapping session to inject fixed input tensors"; - std::vector> fixed_input_tensors; - TF_RETURN_IF_ERROR(ParseFixedInputTensors( - config_.experimental_fixed_input_tensors(), &fixed_input_tensors)); - (*bundle)->session.reset( - new CurriedSession(std::move((*bundle)->session), fixed_input_tensors)); - } if (config_.remove_unused_fields_from_bundle_metagraph()) { // Save memory by removing fields in MetaGraphDef proto message stored // in the bundle that we never use. Notably the unused graphdef submessage diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory_test.cc b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory_test.cc index 6f365abaa0d..75a18f7e7be 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory_test.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory_test.cc @@ -193,37 +193,6 @@ INSTANTIATE_TEST_SUITE_P( TEST_P(SavedModelBundleFactoryTest, Basic) { TestBasic(); } -TEST_P(SavedModelBundleFactoryTest, FixedInputTensors) { - Tensor fixed_input = test::AsTensor({100.0f, 42.0f}, {2}); - NamedTensorProto fixed_input_proto; - fixed_input_proto.set_name("x:0"); - fixed_input.AsProtoField(fixed_input_proto.mutable_tensor()); - - SessionBundleConfig config = GetSessionBundleConfig(); - *config.add_saved_model_tags() = kSavedModelTagServe; - *config.add_experimental_fixed_input_tensors() = fixed_input_proto; - std::unique_ptr session; - if (ExpectCreateBundleFailure()) { - EXPECT_FALSE(CreateSession(config, &session).ok()); - return; - } - TF_ASSERT_OK(CreateSession(config, &session)); - - // half plus two: output should be input / 2 + 2. - const Tensor expected_output = - test::AsTensor({100.0f / 2 + 2, 42.0f / 2 + 2}, {2}); - - const std::vector> non_fixed_inputs = {}; - const std::vector output_names = {"y:0"}; - const std::vector empty_targets; - std::vector outputs; - TF_ASSERT_OK( - session->Run(non_fixed_inputs, output_names, empty_targets, &outputs)); - ASSERT_EQ(1, outputs.size()); - const Tensor& single_output = outputs.at(0); - test::ExpectTensorEqual(expected_output, single_output); -} - TEST_P(SavedModelBundleFactoryTest, RemoveUnusedFieldsFromMetaGraphDefault) { SessionBundleConfig config = GetSessionBundleConfig(); *config.add_saved_model_tags() = kSavedModelTagServe; From 87793ad8cd9b8c023cd03b6bb640c2a3eb66d619 Mon Sep 17 00:00:00 2001 From: Brian Zhao Date: Thu, 7 Jan 2021 23:53:26 -0800 Subject: [PATCH 4579/8103] Removing CurriedSession, since it is no longer used after deleting config option experimental_fixed_input_tensors_filepath. PiperOrigin-RevId: 350710317 --- tensorflow_serving/servables/tensorflow/BUILD | 29 --- .../servables/tensorflow/curried_session.cc | 95 --------- .../servables/tensorflow/curried_session.h | 84 -------- .../tensorflow/curried_session_test.cc | 189 ------------------ .../tensorflow/saved_model_bundle_factory.cc | 1 - 5 files changed, 398 deletions(-) delete mode 100644 tensorflow_serving/servables/tensorflow/curried_session.cc delete mode 100644 tensorflow_serving/servables/tensorflow/curried_session.h delete mode 100644 tensorflow_serving/servables/tensorflow/curried_session_test.cc diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index 6c608fbc3a7..9ed09c2d3a5 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -142,7 +142,6 @@ cc_library( ], deps = [ ":bundle_factory_util", - ":curried_session", ":session_bundle_config_cc_proto", ":tflite_session_lib", "//tensorflow_serving/batching:batching_session", @@ -312,34 +311,6 @@ cc_library( ], ) -cc_library( - name = "curried_session", - srcs = ["curried_session.cc"], - hdrs = ["curried_session.h"], - deps = [ - ":serving_session", - "@org_tensorflow//tensorflow/core:core_cpu", - "@org_tensorflow//tensorflow/core:lib", - "@org_tensorflow//tensorflow/core:protos_all_cc", - ], -) - -cc_test( - name = "curried_session_test", - size = "small", - srcs = ["curried_session_test.cc"], - deps = [ - ":curried_session", - "//tensorflow_serving/core/test_util:mock_session", - "//tensorflow_serving/core/test_util:test_main", - "//tensorflow_serving/test_util", - "@org_tensorflow//tensorflow/core:core_cpu", - "@org_tensorflow//tensorflow/core:lib", - "@org_tensorflow//tensorflow/core:protos_all_cc", - "@org_tensorflow//tensorflow/core:test", - ], -) - cc_library( name = "tflite_session_lib", srcs = [ diff --git a/tensorflow_serving/servables/tensorflow/curried_session.cc b/tensorflow_serving/servables/tensorflow/curried_session.cc deleted file mode 100644 index 9297f1a0f4b..00000000000 --- a/tensorflow_serving/servables/tensorflow/curried_session.cc +++ /dev/null @@ -1,95 +0,0 @@ -/* Copyright 2017 Google Inc. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#include "tensorflow_serving/servables/tensorflow/curried_session.h" - -namespace tensorflow { -namespace serving { - -CurriedSession::CurriedSession( - std::unique_ptr wrapped, - const std::vector>& curried_inputs) - : wrapped_(std::move(wrapped)), curried_inputs_(curried_inputs) { - for (const auto& entry : curried_inputs) { - const string& name = entry.first; - curried_input_names_.insert(name); - } -} - -Status CurriedSession::Run(const std::vector>& inputs, - const std::vector& output_tensor_names, - const std::vector& target_node_names, - std::vector* outputs) { - TF_RETURN_IF_ERROR(ValidateExplicitInputsDontMatchCurriedInputs(inputs)); - const std::vector> combined_inputs = - AddCurriedInputs(inputs); - return wrapped_->Run(combined_inputs, output_tensor_names, target_node_names, - outputs); -} - -Status CurriedSession::Run(const RunOptions& run_options, - const std::vector>& inputs, - const std::vector& output_tensor_names, - const std::vector& target_node_names, - std::vector* outputs, - RunMetadata* run_metadata) { - TF_RETURN_IF_ERROR(ValidateExplicitInputsDontMatchCurriedInputs(inputs)); - const std::vector> combined_inputs = - AddCurriedInputs(inputs); - return wrapped_->Run(run_options, combined_inputs, output_tensor_names, - target_node_names, outputs, run_metadata); -} - -Status CurriedSession::Run( - const RunOptions& run_options, - const std::vector>& inputs, - const std::vector& output_tensor_names, - const std::vector& target_node_names, std::vector* outputs, - RunMetadata* run_metadata, - const thread::ThreadPoolOptions& thread_pool_options) { - TF_RETURN_IF_ERROR(ValidateExplicitInputsDontMatchCurriedInputs(inputs)); - const std::vector> combined_inputs = - AddCurriedInputs(inputs); - return wrapped_->Run(run_options, combined_inputs, output_tensor_names, - target_node_names, outputs, run_metadata, - thread_pool_options); -} - -Status CurriedSession::ListDevices(std::vector* response) { - return wrapped_->ListDevices(response); -} - -Status CurriedSession::ValidateExplicitInputsDontMatchCurriedInputs( - const std::vector>& explicit_inputs) const { - for (const auto& entry : explicit_inputs) { - const string& name = entry.first; - if (curried_input_names_.find(name) != curried_input_names_.end()) { - return errors::InvalidArgument( - "Explicit Run() input has same name as curried input ", name); - } - } - return Status::OK(); -} - -std::vector> CurriedSession::AddCurriedInputs( - const std::vector>& explicit_inputs) const { - std::vector> combined_inputs = explicit_inputs; - std::copy(curried_inputs_.begin(), curried_inputs_.end(), - std::back_inserter(combined_inputs)); - return combined_inputs; -} - -} // namespace serving -} // namespace tensorflow diff --git a/tensorflow_serving/servables/tensorflow/curried_session.h b/tensorflow_serving/servables/tensorflow/curried_session.h deleted file mode 100644 index a6989099697..00000000000 --- a/tensorflow_serving/servables/tensorflow/curried_session.h +++ /dev/null @@ -1,84 +0,0 @@ -/* Copyright 2017 Google Inc. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#ifndef TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_CURRIED_SESSION_H_ -#define TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_CURRIED_SESSION_H_ - -#include "tensorflow/core/platform/threadpool_options.h" -#include "tensorflow_serving/servables/tensorflow/serving_session.h" - -namespace tensorflow { -namespace serving { - -// A session that wraps another session, while injecting a fixed set of -// additional input tensors into each Run() call. Useful for injecting static -// configuration tensors into a session without requiring the caller to be aware -// of them. -// -// It is an error to call Run() with an input that has the same name as one of -// the curried inputs. -class CurriedSession : public ServingSession { - public: - CurriedSession(std::unique_ptr wrapped, - const std::vector>& curried_inputs); - ~CurriedSession() override = default; - - Status Run(const std::vector>& inputs, - const std::vector& output_tensor_names, - const std::vector& target_node_names, - std::vector* outputs) override; - - Status Run(const RunOptions& run_options, - const std::vector>& inputs, - const std::vector& output_tensor_names, - const std::vector& target_node_names, - std::vector* outputs, RunMetadata* run_metadata) override; - - Status Run(const RunOptions& run_options, - const std::vector>& inputs, - const std::vector& output_tensor_names, - const std::vector& target_node_names, - std::vector* outputs, RunMetadata* run_metadata, - const thread::ThreadPoolOptions& thread_pool_options) override; - - Status ListDevices(std::vector* response) override; - - private: - // Verifies no overlap between the tensor names in 'explicit_inputs' and - // 'curried_inputs_'. - Status ValidateExplicitInputsDontMatchCurriedInputs( - const std::vector>& explicit_inputs) const; - - // Adds 'curried_inputs_' to 'explicit_inputs'. - std::vector> AddCurriedInputs( - const std::vector>& explicit_inputs) const; - - // The session to which Run() calls are forwarded (after appending the - // curried inputs). - const std::unique_ptr wrapped_; - - // The inputs that get appended to 'inputs' in each Run() call. - const std::vector> curried_inputs_; - - // The tensor names from 'curried_inputs_'. - std::set curried_input_names_; - - TF_DISALLOW_COPY_AND_ASSIGN(CurriedSession); -}; - -} // namespace serving -} // namespace tensorflow - -#endif // TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_CURRIED_SESSION_H_ diff --git a/tensorflow_serving/servables/tensorflow/curried_session_test.cc b/tensorflow_serving/servables/tensorflow/curried_session_test.cc deleted file mode 100644 index 744c58d04c1..00000000000 --- a/tensorflow_serving/servables/tensorflow/curried_session_test.cc +++ /dev/null @@ -1,189 +0,0 @@ -/* Copyright 2017 Google Inc. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#include "tensorflow_serving/servables/tensorflow/curried_session.h" - -#include -#include "tensorflow/core/framework/tensor_testutil.h" -#include "tensorflow/core/lib/core/status_test_util.h" -#include "tensorflow/core/platform/threadpool_interface.h" -#include "tensorflow/core/platform/threadpool_options.h" -#include "tensorflow_serving/core/test_util/mock_session.h" -#include "tensorflow_serving/test_util/test_util.h" - -namespace tensorflow { -namespace serving { -namespace { - -using ::testing::_; -using ::testing::ElementsAre; -using ::testing::HasSubstr; -using ::testing::Pair; -using ::testing::Ref; -using ::testing::Return; - -using test_util::EqualsProto; - -MATCHER_P(EqualsTensor, value, "") { - return arg.DebugString() == value.DebugString(); -} - -class MockThreadPool : public thread::ThreadPoolInterface { - public: - MOCK_METHOD(void, Schedule, (std::function), (override)); - MOCK_METHOD(void, Cancel, (), (override)); - MOCK_METHOD(int, NumThreads, (), (const, override)); - MOCK_METHOD(int, CurrentThreadId, (), (const, override)); -}; - -TEST(CurriedSessionTest, ZeroCurriedInputs) { - const Tensor input = test::AsScalar(0); - - test_util::MockSession* mock = new test_util::MockSession; - auto curried = std::unique_ptr( - new CurriedSession(std::unique_ptr(mock), {})); - - EXPECT_CALL(*mock, Run(ElementsAre(Pair("input", EqualsTensor(input))), - ElementsAre("output"), ElementsAre("target"), _)) - .WillOnce(Return(Status::OK())); - std::vector outputs; - TF_ASSERT_OK( - curried->Run({{"input", input}}, {"output"}, {"target"}, &outputs)); -} - -TEST(CurriedSessionTest, Basic) { - const Tensor input_a = test::AsScalar(0); - const Tensor input_b = test::AsScalar(1); - const Tensor curried_0 = test::AsScalar(2); - const Tensor curried_1 = test::AsScalar(3); - - test_util::MockSession* mock = new test_util::MockSession; - auto curried = std::unique_ptr( - new CurriedSession(std::unique_ptr(mock), - {{"curried_0", curried_0}, {"curried_1", curried_1}})); - - EXPECT_CALL(*mock, - Run(ElementsAre(Pair("input_a", EqualsTensor(input_a)), - Pair("input_b", EqualsTensor(input_b)), - Pair("curried_0", EqualsTensor(curried_0)), - Pair("curried_1", EqualsTensor(curried_1))), - ElementsAre("output_a", "output_b"), - ElementsAre("target_a", "target_b"), _)) - .WillOnce(Return(Status::OK())); - std::vector outputs; - TF_ASSERT_OK(curried->Run({{"input_a", input_a}, {"input_b", input_b}}, - {"output_a", "output_b"}, {"target_a", "target_b"}, - &outputs)); -} - -TEST(CurriedSessionTest, WithOptions) { - RunOptions run_options; - run_options.set_timeout_in_ms(42); - - const Tensor input_a = test::AsScalar(0); - const Tensor input_b = test::AsScalar(1); - const Tensor curried_0 = test::AsScalar(2); - const Tensor curried_1 = test::AsScalar(3); - - test_util::MockSession* mock = new test_util::MockSession; - auto curried = std::unique_ptr( - new CurriedSession(std::unique_ptr(mock), - {{"curried_0", curried_0}, {"curried_1", curried_1}})); - - EXPECT_CALL(*mock, - Run(EqualsProto(run_options), - ElementsAre(Pair("input_a", EqualsTensor(input_a)), - Pair("input_b", EqualsTensor(input_b)), - Pair("curried_0", EqualsTensor(curried_0)), - Pair("curried_1", EqualsTensor(curried_1))), - ElementsAre("output_a", "output_b"), - ElementsAre("target_a", "target_b"), _, _)) - .WillOnce(Return(Status::OK())); - std::vector outputs; - RunMetadata run_metadata; - TF_ASSERT_OK(curried->Run(run_options, - {{"input_a", input_a}, {"input_b", input_b}}, - {"output_a", "output_b"}, {"target_a", "target_b"}, - &outputs, &run_metadata)); -} - -TEST(CurriedSessionTest, ExplicitInputsMatchCurriedInputs) { - const Tensor t0 = test::AsScalar(0); - const Tensor t1 = test::AsScalar(1); - const Tensor t2 = test::AsScalar(2); - - test_util::MockSession* mock = new test_util::MockSession; - auto curried = std::unique_ptr(new CurriedSession( - std::unique_ptr(mock), {{"t0", t0}, {"t1", t1}})); - - EXPECT_CALL(*mock, Run(_, _, _, _)).Times(0); - std::vector outputs; - const Status status = - curried->Run({{"t1", t1}, {"t2", t2}}, {"output"}, {"target"}, &outputs); - ASSERT_FALSE(status.ok()); - EXPECT_THAT( - status.ToString(), - HasSubstr("Explicit Run() input has same name as curried input t1")); -} - -TEST(CurriedSessionTest, PropagateError) { - test_util::MockSession* mock = new test_util::MockSession; - auto curried = std::unique_ptr( - new CurriedSession(std::unique_ptr(mock), {})); - - EXPECT_CALL(*mock, Run(_, _, _, _)) - .WillOnce(Return(errors::Unknown("Tensor clog"))); - std::vector outputs; - const Status status = curried->Run({}, {}, {}, &outputs); - ASSERT_FALSE(status.ok()); - EXPECT_THAT(status.ToString(), HasSubstr("Tensor clog")); -} - -TEST(CurriedSessionTest, ThreadPoolOptions) { - const Tensor input_a = test::AsScalar(0); - const Tensor input_b = test::AsScalar(1); - const Tensor curried_0 = test::AsScalar(2); - const Tensor curried_1 = test::AsScalar(3); - - test_util::MockSession* mock = new test_util::MockSession; - auto curried = std::unique_ptr( - new CurriedSession(std::unique_ptr(mock), - {{"curried_0", curried_0}, {"curried_1", curried_1}})); - - thread::ThreadPoolOptions thread_pool_options; - MockThreadPool mock_threadpool; - thread_pool_options.inter_op_threadpool = &mock_threadpool; - thread_pool_options.intra_op_threadpool = &mock_threadpool; - EXPECT_CALL( - *mock, - Run(_, - ElementsAre(Pair("input_a", EqualsTensor(input_a)), - Pair("input_b", EqualsTensor(input_b)), - Pair("curried_0", EqualsTensor(curried_0)), - Pair("curried_1", EqualsTensor(curried_1))), - ElementsAre("output_a", "output_b"), - ElementsAre("target_a", "target_b"), _, _, Ref(thread_pool_options))) - .WillOnce(Return(Status::OK())); - std::vector outputs; - RunMetadata run_metadata; - TF_ASSERT_OK(curried->Run(RunOptions(), - {{"input_a", input_a}, {"input_b", input_b}}, - {"output_a", "output_b"}, {"target_a", "target_b"}, - &outputs, &run_metadata, thread_pool_options)); -} - -} // namespace -} // namespace serving -} // namespace tensorflow diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc index 31ed1cdf798..d4818543943 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc @@ -25,7 +25,6 @@ limitations under the License. #include "tensorflow/core/protobuf/named_tensor.pb.h" #include "tensorflow/core/public/session_options.h" #include "tensorflow_serving/servables/tensorflow/bundle_factory_util.h" -#include "tensorflow_serving/servables/tensorflow/curried_session.h" #include "tensorflow_serving/servables/tensorflow/tflite_session.h" #include "tensorflow_serving/session_bundle/session_bundle_util.h" From 4fab52fbbea4532f53fd74ec4919589d58151bae Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Jan 2021 00:01:53 -0800 Subject: [PATCH 4580/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/84e03807-6661-486b-8623-188ca4e7b1ab PiperOrigin-RevId: 350711154 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index aa5c698bf59..adb214c7b30 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dbaf007a6696fec907ad63ec5f11ca667e318c75327aa09f6146cbc77532d14f", - git_commit = "af3472d13f875724f0f5693e317291d970bcbf4e", + sha256 = "4a6ecaa3f0ba3d481a735e30465225796b0d9637d1bc84b6eeecb089fd7f5fb0", + git_commit = "9037c4301d22f29a04f48d940f6f57cf4fd10a6a", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 7b28ae41ba35ea2ce3abc4728c233b49f1cb5f89 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Jan 2021 06:02:38 -0800 Subject: [PATCH 4581/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/dee957c1-dcf8-4840-8718-78128306d89e PiperOrigin-RevId: 350749287 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index adb214c7b30..65d5854e494 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4a6ecaa3f0ba3d481a735e30465225796b0d9637d1bc84b6eeecb089fd7f5fb0", - git_commit = "9037c4301d22f29a04f48d940f6f57cf4fd10a6a", + sha256 = "f959a4f0ba45d07e7d0b8f3fa275168c58990273d0e02311930952537d4f80e5", + git_commit = "cf603aa4f9d0d48ac8d6d7935d1d5e44762bf6a5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0ae09ed6cfadb97d144e17281d9fd053666582a7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Jan 2021 12:01:39 -0800 Subject: [PATCH 4582/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/29680dcc-7f76-4bce-965b-4f26ce5232b1 PiperOrigin-RevId: 350809542 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 65d5854e494..50163146dfa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f959a4f0ba45d07e7d0b8f3fa275168c58990273d0e02311930952537d4f80e5", - git_commit = "cf603aa4f9d0d48ac8d6d7935d1d5e44762bf6a5", + sha256 = "7887df3fcdb840975c03d438b2a6de415592b8bd74f02da18569972983652dcf", + git_commit = "16407535d1199c5e9e237e132a1e7b0e0882c10c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 364e859a88048a0d8589356a658cf2ae84001808 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Jan 2021 18:01:18 -0800 Subject: [PATCH 4583/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/734c0e51-90ec-4527-8bc3-85e4b13c9ed4 PiperOrigin-RevId: 350869055 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 50163146dfa..7081f61b977 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7887df3fcdb840975c03d438b2a6de415592b8bd74f02da18569972983652dcf", - git_commit = "16407535d1199c5e9e237e132a1e7b0e0882c10c", + sha256 = "37d574589a42325b4ce046bd50efaa1b2844b587524e8f84fd6c9266238126ce", + git_commit = "587ac71f68f06edbf338fcf742055d6d8f63cb68", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 026b9826fd63092582d78b922346086d02b9a991 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 9 Jan 2021 00:02:23 -0800 Subject: [PATCH 4584/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/730f363e-1abc-4645-8db7-9fe55db55395 PiperOrigin-RevId: 350897528 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7081f61b977..d92f4e97ca1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "37d574589a42325b4ce046bd50efaa1b2844b587524e8f84fd6c9266238126ce", - git_commit = "587ac71f68f06edbf338fcf742055d6d8f63cb68", + sha256 = "d4c2de2a3f589c9611bddf9ab610d804c3f94b80fafff9145b58f1f1c5d7ff61", + git_commit = "17e705a99a7a684a0ddcd834d87dfc1e673c0b98", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 15ed377684841d254b17d6c53ba9ba1ca662304f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 9 Jan 2021 06:01:32 -0800 Subject: [PATCH 4585/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e7b9ca64-935b-4154-bf58-94576bc617db PiperOrigin-RevId: 350920883 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d92f4e97ca1..0945dbed2a2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d4c2de2a3f589c9611bddf9ab610d804c3f94b80fafff9145b58f1f1c5d7ff61", - git_commit = "17e705a99a7a684a0ddcd834d87dfc1e673c0b98", + sha256 = "a0b0d8256542239045e61f543247095d2a4ed70b85ae70b04897f75025fdf88d", + git_commit = "8730806d23e2d0546df996fc7ae36222af3edd63", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From bfbe08e647db18ec85633efcc0575ced7551b6a3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 9 Jan 2021 12:01:31 -0800 Subject: [PATCH 4586/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/195b87c4-ea78-4da5-a9e5-a6cc5a58ec71 PiperOrigin-RevId: 350942497 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0945dbed2a2..c82bb719661 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a0b0d8256542239045e61f543247095d2a4ed70b85ae70b04897f75025fdf88d", - git_commit = "8730806d23e2d0546df996fc7ae36222af3edd63", + sha256 = "216093e5044c43f4e2ce9a0a3661c4c9e30008b06a6a5ca5b63d4eaa2732ac98", + git_commit = "fa3928cd56c1f1795ca882518fce8ab9065342bb", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From e55c6a198e9c252d8faf3cc350e728008bba3f48 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 10 Jan 2021 06:01:25 -0800 Subject: [PATCH 4587/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4501b9e4-94b6-4fe5-beea-3a5224a7a295 PiperOrigin-RevId: 351012645 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c82bb719661..ff335457590 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "216093e5044c43f4e2ce9a0a3661c4c9e30008b06a6a5ca5b63d4eaa2732ac98", - git_commit = "fa3928cd56c1f1795ca882518fce8ab9065342bb", + sha256 = "d4d60ac43040037336ccbc16585a98161eda6a7a92f08ebc76f70cab18dc4171", + git_commit = "3b314f0e099185360d6b6e1e43eff966b778951c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 494418c1bb0563aaf3dac52b20ab4992d7f013e4 Mon Sep 17 00:00:00 2001 From: skawasak Date: Mon, 11 Jan 2021 02:19:19 +0900 Subject: [PATCH 4588/8103] fix args order --- tensorflow_serving/model_servers/http_rest_api_handler.cc | 3 ++- tensorflow_serving/model_servers/http_rest_api_handler.h | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/model_servers/http_rest_api_handler.cc b/tensorflow_serving/model_servers/http_rest_api_handler.cc index 034584dc6b8..17a62f67d18 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler.cc +++ b/tensorflow_serving/model_servers/http_rest_api_handler.cc @@ -64,7 +64,8 @@ HttpRestApiHandler::~HttpRestApiHandler() {} Status HttpRestApiHandler::ProcessRequest( const absl::string_view http_method, const absl::string_view request_path, const absl::string_view request_body, - std::vector>* headers, string* output, string* model_name, string* method) { + std::vector>* headers, string* model_name, + string* method, string* output) { headers->clear(); output->clear(); AddHeaders(headers); diff --git a/tensorflow_serving/model_servers/http_rest_api_handler.h b/tensorflow_serving/model_servers/http_rest_api_handler.h index 8ce88d17f2c..6985304d4ee 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler.h +++ b/tensorflow_serving/model_servers/http_rest_api_handler.h @@ -82,7 +82,7 @@ class HttpRestApiHandler { const absl::string_view request_path, const absl::string_view request_body, std::vector>* headers, - string* output, string* model_name, string* method); + string* model_name, string* method, string* output); private: Status ProcessClassifyRequest( From 1c7b60b0f437ab1dc57fa0e414a42fc7cbde26f4 Mon Sep 17 00:00:00 2001 From: skawasak Date: Mon, 11 Jan 2021 03:11:38 +0900 Subject: [PATCH 4589/8103] add request_latency --- tensorflow_serving/model_servers/http_server.cc | 2 +- .../model_servers/prediction_service_impl.cc | 12 ++++++------ tensorflow_serving/servables/tensorflow/util.cc | 15 +++++++++++++++ tensorflow_serving/servables/tensorflow/util.h | 4 ++++ 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/tensorflow_serving/model_servers/http_server.cc b/tensorflow_serving/model_servers/http_server.cc index 242ef8d117f..b54a85e04a9 100644 --- a/tensorflow_serving/model_servers/http_server.cc +++ b/tensorflow_serving/model_servers/http_server.cc @@ -174,7 +174,7 @@ class RestApiRequestDispatcher { } req->ReplyWithStatus(http_status); - RecordRuntimeLatency(model_name, /*api=*/method, /*runtime=*/"HTTP", + RecordRequestLatency(model_name, /*api=*/method, /*entrypoint=*/"REST", Env::Default()->NowMicros() - start); RecordModelRequestCount(model_name, status); } diff --git a/tensorflow_serving/model_servers/prediction_service_impl.cc b/tensorflow_serving/model_servers/prediction_service_impl.cc index 82be3464038..a6e05848a70 100644 --- a/tensorflow_serving/model_servers/prediction_service_impl.cc +++ b/tensorflow_serving/model_servers/prediction_service_impl.cc @@ -65,8 +65,8 @@ ::grpc::Status PredictionServiceImpl::Predict(::grpc::ServerContext *context, if (!status.ok()) { VLOG(1) << "Predict failed: " << status.error_message(); } - RecordRuntimeLatency(request->model_spec().name(), /*api=*/"Predict", /*runtime=*/"GRPC", - Env::Default()->NowMicros() - start); + RecordRequestLatency(request->model_spec().name(), /*api=*/"Predict", + /*runtime=*/"GRPC", Env::Default()->NowMicros() - start); RecordModelRequestCount(request->model_spec().name(), tf_status); return status; @@ -102,8 +102,8 @@ ::grpc::Status PredictionServiceImpl::Classify( if (!status.ok()) { VLOG(1) << "Classify request failed: " << status.error_message(); } - RecordRuntimeLatency(request->model_spec().name(), /*api=*/"Classify", /*runtime=*/"GRPC", - Env::Default()->NowMicros() - start); + RecordRequestLatency(request->model_spec().name(), /*api=*/"Classify", + /*runtime=*/"GRPC", Env::Default()->NowMicros() - start); RecordModelRequestCount(request->model_spec().name(), tf_status); return status; @@ -128,8 +128,8 @@ ::grpc::Status PredictionServiceImpl::Regress(::grpc::ServerContext *context, if (!status.ok()) { VLOG(1) << "Regress request failed: " << status.error_message(); } - RecordRuntimeLatency(request->model_spec().name(), /*api=*/"Regress", /*runtime=*/"GRPC", - Env::Default()->NowMicros() - start); + RecordRequestLatency(request->model_spec().name(), /*api=*/"Regress", + /*runtime=*/"GRPC", Env::Default()->NowMicros() - start); RecordModelRequestCount(request->model_spec().name(), tf_status); return status; diff --git a/tensorflow_serving/servables/tensorflow/util.cc b/tensorflow_serving/servables/tensorflow/util.cc index 96a4023db07..75e9e18e115 100644 --- a/tensorflow_serving/servables/tensorflow/util.cc +++ b/tensorflow_serving/servables/tensorflow/util.cc @@ -69,6 +69,16 @@ auto* runtime_latency = monitoring::Sampler<3>::New( }, // Scale of 10, power of 1.8 with bucket count 33 (~20 minutes). monitoring::Buckets::Exponential(10, 1.8, 33)); +auto* request_latency = monitoring::Sampler<3>::New( + { + "/tensorflow/serving/request_latency", + "Distribution of wall time (in microseconds) for Tensorflow Serving request.", + "model_name", + "API", + "entrypoint", + }, // Scale of 10, power of 1.8 with bucket count 33 (~20 minutes). + monitoring::Buckets::Exponential(10, 1.8, 33)); + // Returns the number of examples in the Input. int NumInputExamples(const internal::SerializedInput& input) { switch (input.kind_case()) { @@ -320,5 +330,10 @@ void RecordRuntimeLatency(const string& model_name, const string& api, runtime_latency->GetCell(model_name, api, runtime)->Add(latency_usec); } +void RecordRequestLatency(const string& model_name, const string& api, + const string& entrypoint, int64 latency_usec) { + request_latency->GetCell(model_name, api, entrypoint)->Add(latency_usec); +} + } // namespace serving } // namespace tensorflow diff --git a/tensorflow_serving/servables/tensorflow/util.h b/tensorflow_serving/servables/tensorflow/util.h index 78155248255..123aa392239 100644 --- a/tensorflow_serving/servables/tensorflow/util.h +++ b/tensorflow_serving/servables/tensorflow/util.h @@ -117,6 +117,10 @@ Status EstimateResourceFromPathUsingDiskState(const string& path, void RecordRuntimeLatency(const string& model_name, const string& api, const string& runtime, int64 latency_usec); +// Update metrics for request latency. +void RecordRequestLatency(const string& model_name, const string& api, + const string& entrypoint, int64 latency_usec); + } // namespace serving } // namespace tensorflow From 9b047650221dbc5336bab987128b591662238dd9 Mon Sep 17 00:00:00 2001 From: skawasak Date: Mon, 11 Jan 2021 03:16:18 +0900 Subject: [PATCH 4590/8103] <= 80 columns --- tensorflow_serving/model_servers/http_server.cc | 3 ++- tensorflow_serving/model_servers/prediction_service_impl.cc | 3 ++- tensorflow_serving/servables/tensorflow/util.cc | 6 ++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/tensorflow_serving/model_servers/http_server.cc b/tensorflow_serving/model_servers/http_server.cc index b54a85e04a9..0952d7168b3 100644 --- a/tensorflow_serving/model_servers/http_server.cc +++ b/tensorflow_serving/model_servers/http_server.cc @@ -160,7 +160,8 @@ class RestApiRequestDispatcher { VLOG(1) << "Processing HTTP request: " << req->http_method() << " " << req->uri_path() << " body: " << body.size() << " bytes."; const auto status = handler_->ProcessRequest( - req->http_method(), req->uri_path(), body, &headers, &output, &model_name, &method); + req->http_method(), req->uri_path(), body, &headers, &output, + &model_name, &method); const auto http_status = ToHTTPStatusCode(status); // Note: we add headers+output for non successful status too, in case the // output contains details about the error (e.g. error messages). diff --git a/tensorflow_serving/model_servers/prediction_service_impl.cc b/tensorflow_serving/model_servers/prediction_service_impl.cc index a6e05848a70..2a1b339313d 100644 --- a/tensorflow_serving/model_servers/prediction_service_impl.cc +++ b/tensorflow_serving/model_servers/prediction_service_impl.cc @@ -59,7 +59,8 @@ ::grpc::Status PredictionServiceImpl::Predict(::grpc::ServerContext *context, DeadlineToTimeoutMillis(context->raw_deadline())); } - const ::tensorflow::Status tf_status = predictor_->Predict(run_options, core_, *request, response); + const ::tensorflow::Status tf_status = predictor_->Predict( + run_options, core_, *request, response); const ::grpc::Status status = ToGRPCStatus(tf_status); if (!status.ok()) { diff --git a/tensorflow_serving/servables/tensorflow/util.cc b/tensorflow_serving/servables/tensorflow/util.cc index 75e9e18e115..b811c26d132 100644 --- a/tensorflow_serving/servables/tensorflow/util.cc +++ b/tensorflow_serving/servables/tensorflow/util.cc @@ -72,7 +72,8 @@ auto* runtime_latency = monitoring::Sampler<3>::New( auto* request_latency = monitoring::Sampler<3>::New( { "/tensorflow/serving/request_latency", - "Distribution of wall time (in microseconds) for Tensorflow Serving request.", + "Distribution of wall time (in microseconds) for Tensorflow Serving" + " request.", "model_name", "API", "entrypoint", @@ -139,7 +140,8 @@ void RecordModelRequestCount(const string& model_name, const Status& status) { if (status != Status::OK()) { status_label = "failed"; } - model_request_status_count_total->GetCell(model_name, status_label)->IncrementBy(1); + model_request_status_count_total->GetCell( + model_name, status_label)->IncrementBy(1); } void SetSignatureMethodNameCheckFeature(bool v) { signature_method_check = v; } From fdec5efe581a08c98d7ddcaaa1bed4adf2376bc6 Mon Sep 17 00:00:00 2001 From: skawasak Date: Mon, 11 Jan 2021 03:16:51 +0900 Subject: [PATCH 4591/8103] request_count --- tensorflow_serving/servables/tensorflow/util.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/servables/tensorflow/util.cc b/tensorflow_serving/servables/tensorflow/util.cc index b811c26d132..5358c651e49 100644 --- a/tensorflow_serving/servables/tensorflow/util.cc +++ b/tensorflow_serving/servables/tensorflow/util.cc @@ -56,7 +56,7 @@ auto* example_count_total = monitoring::Counter<1>::New( // Metrics by model auto* model_request_status_count_total = monitoring::Counter<2>::New( - "/tensorflow/serving/model_request_count", + "/tensorflow/serving/request_count", "The total number of requests.", "model_name", "status"); auto* runtime_latency = monitoring::Sampler<3>::New( From 759eec1682c81b61052183247797038a04e81961 Mon Sep 17 00:00:00 2001 From: skawasak Date: Mon, 11 Jan 2021 03:18:50 +0900 Subject: [PATCH 4592/8103] status label --- tensorflow_serving/servables/tensorflow/util.cc | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/util.cc b/tensorflow_serving/servables/tensorflow/util.cc index 5358c651e49..63f5c1ffea2 100644 --- a/tensorflow_serving/servables/tensorflow/util.cc +++ b/tensorflow_serving/servables/tensorflow/util.cc @@ -136,12 +136,8 @@ monitoring::Counter<1>* GetExampleCountTotal() { return example_count_total; } // Metrics by model void RecordModelRequestCount(const string& model_name, const Status& status) { - string status_label = "success"; - if (status != Status::OK()) { - status_label = "failed"; - } model_request_status_count_total->GetCell( - model_name, status_label)->IncrementBy(1); + model_name, error::Code_Name(status.code()))->IncrementBy(1); } void SetSignatureMethodNameCheckFeature(bool v) { signature_method_check = v; } From 2beb3b54cbb6474801c0263de0589e190841650c Mon Sep 17 00:00:00 2001 From: skawasak Date: Mon, 11 Jan 2021 03:24:22 +0900 Subject: [PATCH 4593/8103] fix args order --- tensorflow_serving/model_servers/http_server.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/model_servers/http_server.cc b/tensorflow_serving/model_servers/http_server.cc index 0952d7168b3..480bd7908fe 100644 --- a/tensorflow_serving/model_servers/http_server.cc +++ b/tensorflow_serving/model_servers/http_server.cc @@ -160,8 +160,8 @@ class RestApiRequestDispatcher { VLOG(1) << "Processing HTTP request: " << req->http_method() << " " << req->uri_path() << " body: " << body.size() << " bytes."; const auto status = handler_->ProcessRequest( - req->http_method(), req->uri_path(), body, &headers, &output, - &model_name, &method); + req->http_method(), req->uri_path(), body, &headers, &model_name, + &method, &output); const auto http_status = ToHTTPStatusCode(status); // Note: we add headers+output for non successful status too, in case the // output contains details about the error (e.g. error messages). From f923d761ad379eee12a7e3518ce6da5c1719c0f2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Jan 2021 00:01:32 -0800 Subject: [PATCH 4594/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e129d713-7adb-4352-9087-81ec681b8a5a PiperOrigin-RevId: 351093523 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ff335457590..7e13302a16f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d4d60ac43040037336ccbc16585a98161eda6a7a92f08ebc76f70cab18dc4171", - git_commit = "3b314f0e099185360d6b6e1e43eff966b778951c", + sha256 = "91651c0c847dd380fb67843215c489b5329f0b242865eb00160d28b811082f9f", + git_commit = "287ab9046604c277908969e20b7b4c0febe8b4ab", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 878e7953b892053759957b2389e2f91e1168a689 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Jan 2021 06:01:22 -0800 Subject: [PATCH 4595/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/869b5d94-1394-4b61-bc2c-5a1b481ef34b PiperOrigin-RevId: 351137227 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7e13302a16f..c8b73e7f7a3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "91651c0c847dd380fb67843215c489b5329f0b242865eb00160d28b811082f9f", - git_commit = "287ab9046604c277908969e20b7b4c0febe8b4ab", + sha256 = "f720d49ac334fe819e3afa8ef0fb684a294f4992075430f64e2e7f6676a4470d", + git_commit = "091856315b2f1c9e968750ecccbade7d5aa4d7db", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 6a35a3808203e86afb09696a1c31b0034cdca88f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Jan 2021 12:01:40 -0800 Subject: [PATCH 4596/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e448e2d6-be01-458e-a3f3-c6bf17654c61 PiperOrigin-RevId: 351205413 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c8b73e7f7a3..c5998ac3a9a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f720d49ac334fe819e3afa8ef0fb684a294f4992075430f64e2e7f6676a4470d", - git_commit = "091856315b2f1c9e968750ecccbade7d5aa4d7db", + sha256 = "f33d78ff93ae7ec01a9f1b72f9c1737ce580028e9f5cd181a007ddc4a5a195c1", + git_commit = "1b07d235993ed7d209171019e27a0fe5101db6ed", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 78d47f7031d5a60b8cfff4fd0f0a2e1ec0586c01 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Jan 2021 14:49:44 -0800 Subject: [PATCH 4597/8103] Improve error message for file not exists. PiperOrigin-RevId: 351240745 --- .../storage_path/file_system_storage_path_source.cc | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc b/tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc index db212542109..708aee779e9 100644 --- a/tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc +++ b/tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc @@ -217,10 +217,11 @@ Status PollFileSystemForServable( // we don't emit an empty aspired-versions list for a non-existent (or // transiently unavailable) base-path. (On some platforms, GetChildren() // returns an empty list instead of erring if the base path isn't found.) - if (!Env::Default()->FileExists(servable.base_path()).ok()) { - return errors::InvalidArgument("Could not find base path ", - servable.base_path(), " for servable ", - servable.servable_name()); + Status status = Env::Default()->FileExists(servable.base_path()); + if (!status.ok()) { + return errors::InvalidArgument( + "Could not find base path ", servable.base_path(), " for servable ", + servable.servable_name(), " with error ", status.ToString()); } // Retrieve a list of base-path children from the file system. From 0c0c15a861f7671d842c5a5fced0cbc4018ffe3b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Jan 2021 18:01:23 -0800 Subject: [PATCH 4598/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/186882c6-dc20-446a-bea5-3bd58d7d85a6 PiperOrigin-RevId: 351274735 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c5998ac3a9a..c34346438c8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f33d78ff93ae7ec01a9f1b72f9c1737ce580028e9f5cd181a007ddc4a5a195c1", - git_commit = "1b07d235993ed7d209171019e27a0fe5101db6ed", + sha256 = "4462dd420f470970a0eb2192c7cfa332e56eea469c36c2ac8bbca9b719b4d00d", + git_commit = "161fcca9a7767a63a304a875ff26d22026d5e1b5", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From b09da3e9371dc60962f11fe04528faf4519da7fd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Jan 2021 00:01:30 -0800 Subject: [PATCH 4599/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e8c36955-1b49-49bf-8960-12d2aebdbe28 PiperOrigin-RevId: 351312903 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c34346438c8..e6f479660ed 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4462dd420f470970a0eb2192c7cfa332e56eea469c36c2ac8bbca9b719b4d00d", - git_commit = "161fcca9a7767a63a304a875ff26d22026d5e1b5", + sha256 = "a659938840edb28a154e346527c959387382fed4f29887086565cfc95c4eaa51", + git_commit = "2ef61f7c2cc73cf7390bdaf0ae77a2c757297987", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 74f466aa10c2b51968df3ff6ffaee3eda0335f4d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Jan 2021 06:01:21 -0800 Subject: [PATCH 4600/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f13c62ff-d63d-4695-a3d1-6f1a52332099 PiperOrigin-RevId: 351355048 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e6f479660ed..6dbc3a726ba 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a659938840edb28a154e346527c959387382fed4f29887086565cfc95c4eaa51", - git_commit = "2ef61f7c2cc73cf7390bdaf0ae77a2c757297987", + sha256 = "8233fb2f7a99f40cd542e09287ae86e74cefcc7eadc5ae0d08886e6a34d6c0a0", + git_commit = "ed2134ae4327e1e09ed3808e748489405a845382", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 95c49c0f6e3331eb29949a132eb9711afdd7db0a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Jan 2021 12:01:23 -0800 Subject: [PATCH 4601/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/04da2b75-450d-4477-b47a-1016cb7a17e6 PiperOrigin-RevId: 351419055 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6dbc3a726ba..3132f63dd6d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8233fb2f7a99f40cd542e09287ae86e74cefcc7eadc5ae0d08886e6a34d6c0a0", - git_commit = "ed2134ae4327e1e09ed3808e748489405a845382", + sha256 = "aea5267c6a1f442b58bdb0557dcea16d87a06973a61ffa40d60c3796fb43d0c1", + git_commit = "61a7ab7203dc49763cc7e2805985d51cd882aa5f", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From d070776241184cda3901ddb374b9b84ab9042761 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Jan 2021 18:01:36 -0800 Subject: [PATCH 4602/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d6d998c6-ca2b-4531-9ead-e1bb38eda6b6 PiperOrigin-RevId: 351486958 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3132f63dd6d..f339a1b8b52 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "aea5267c6a1f442b58bdb0557dcea16d87a06973a61ffa40d60c3796fb43d0c1", - git_commit = "61a7ab7203dc49763cc7e2805985d51cd882aa5f", + sha256 = "8aa5d8cd50001d06fff13c7b23da0cbd3cf3e9f94922d2fd28d9a1b564b1d31c", + git_commit = "69e8792d67b5c31ee47af4b4c9cd7ccaaf5bedae", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 803dd4298af40e7b9fd193f16b86fcb795923dcc Mon Sep 17 00:00:00 2001 From: handong <455808519@qq.com> Date: Wed, 13 Jan 2021 15:22:58 +0800 Subject: [PATCH 4603/8103] The number of threads for loading and unloading models is set to 1 --- tensorflow_serving/core/aspired_versions_manager.h | 4 ++-- tensorflow_serving/core/basic_manager.h | 4 ++-- tensorflow_serving/core/caching_manager.h | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tensorflow_serving/core/aspired_versions_manager.h b/tensorflow_serving/core/aspired_versions_manager.h index d0395d72510..e158dbf8aba 100644 --- a/tensorflow_serving/core/aspired_versions_manager.h +++ b/tensorflow_serving/core/aspired_versions_manager.h @@ -110,13 +110,13 @@ class AspiredVersionsManager : public Manager, /// /// If set as 0, we don't use a thread-pool, and servable loads are /// performed serially in the manager's main work loop. - uint32 num_load_threads = 0; + uint32 num_load_threads = 1; /// The number of threads in the thread-pool used to unload servables. /// /// If set as 0, we don't use a thread-pool, and servable unloads are /// performed serially in the manager's main work loop. - uint32 num_unload_threads = 0; + uint32 num_unload_threads = 1; /// Maximum number of times we retry loading a servable, after the first /// failure, before we give up. diff --git a/tensorflow_serving/core/basic_manager.h b/tensorflow_serving/core/basic_manager.h index 59e47754112..92656da73d3 100644 --- a/tensorflow_serving/core/basic_manager.h +++ b/tensorflow_serving/core/basic_manager.h @@ -118,12 +118,12 @@ class BasicManager : public Manager { // The number of threads in the thread-pool used to load servables. // // If set as 0, we don't use a thread-pool, and LoadServable() blocks. - uint32 num_load_threads = 0; + uint32 num_load_threads = 1; // The number of threads in the thread-pool used to unload servables. // // If set as 0, we don't use a thread-pool, and UnloadServable() blocks. - uint32 num_unload_threads = 0; + uint32 num_unload_threads = 1; // EventBus to publish servable state changes. This is optional, if unset, // we don't publish. diff --git a/tensorflow_serving/core/caching_manager.h b/tensorflow_serving/core/caching_manager.h index 60d8f82f86d..1d9380a612e 100644 --- a/tensorflow_serving/core/caching_manager.h +++ b/tensorflow_serving/core/caching_manager.h @@ -54,12 +54,12 @@ class CachingManager : public Manager { // The number of threads in the thread-pool used to load servables. // // If set as 0, we don't use a thread-pool, and LoadServable() blocks. - uint32 num_load_threads = 0; + uint32 num_load_threads = 1; // The number of threads in the thread-pool used to unload servables. // // If set as 0, we don't use a thread-pool. - uint32 num_unload_threads = 0; + uint32 num_unload_threads = 1; // EventBus to publish servable state changes. This is optional, if unset, // we don't publish. From deefc50d0b49646d55d446585b71870761489cc7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Jan 2021 00:01:37 -0800 Subject: [PATCH 4604/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/31903be8-b78c-445b-920e-6bc52f3ea1a8 PiperOrigin-RevId: 351525990 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f339a1b8b52..cdf9f07e26a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8aa5d8cd50001d06fff13c7b23da0cbd3cf3e9f94922d2fd28d9a1b564b1d31c", - git_commit = "69e8792d67b5c31ee47af4b4c9cd7ccaaf5bedae", + sha256 = "a1eb1b9a8b1f8ce810e48ec02ea2aebe952c6cd70013187718a93c3442afba8b", + git_commit = "b0fcce8080f94b44195c429929361a420e9255cc", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 9ad5df1dd7e92de9d8ba94f9c9652a9d83d95ecc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Jan 2021 06:01:37 -0800 Subject: [PATCH 4605/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f20b23eb-509b-4f2e-be2f-a53d46461007 PiperOrigin-RevId: 351569467 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cdf9f07e26a..5138c3a4e7e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a1eb1b9a8b1f8ce810e48ec02ea2aebe952c6cd70013187718a93c3442afba8b", - git_commit = "b0fcce8080f94b44195c429929361a420e9255cc", + sha256 = "44f2ac8920ca8241f45725b9632ca771b741d021a328245f2dbd4c2a1d768b11", + git_commit = "15e0f259b119f53b90fc1698f7abd9b739df3b6c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From f70a981923dc92e352b87a8c8a5261503544edb9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Jan 2021 12:01:38 -0800 Subject: [PATCH 4606/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6394e6c1-7396-43ef-8a93-d737de620624 PiperOrigin-RevId: 351636130 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5138c3a4e7e..991a982e05e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "44f2ac8920ca8241f45725b9632ca771b741d021a328245f2dbd4c2a1d768b11", - git_commit = "15e0f259b119f53b90fc1698f7abd9b739df3b6c", + sha256 = "ae9b749c61e619a8b366171ec3f69726e9ebc044eddcfffb548399a20032908b", + git_commit = "d278bd04f8a44688d9183d85886344feac2f855c", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 0acaa63b45a5c461dcb4808f8745ff9088a0f6e6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Jan 2021 18:01:29 -0800 Subject: [PATCH 4607/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0a4a5fb4-4d56-4d8f-8077-700577c8f31a PiperOrigin-RevId: 351704053 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 991a982e05e..1307e604f17 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -11,8 +11,8 @@ load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ae9b749c61e619a8b366171ec3f69726e9ebc044eddcfffb548399a20032908b", - git_commit = "d278bd04f8a44688d9183d85886344feac2f855c", + sha256 = "95d9b5e48f22942fb16e254f05ab2fbd62dd8b5e4cae2b36d49d511f9eb0243f", + git_commit = "100b443d8fac3108da3240a8130b3e196e9f25d6", ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") From 50a7ef370139073640e62178ab95b5894f587667 Mon Sep 17 00:00:00 2001 From: Christian Sigg Date: Thu, 14 Jan 2021 13:24:07 -0800 Subject: [PATCH 4608/8103] Transition TensorFlow Serving to TensorFlow's new WORKSPACE protocol. Actions taken: - Remove code duplicated from TF's [old WORKSPACE](https://github.com/tensorflow/tensorflow/commit/36d0f2e19430742d307215efb7088d09618db668#diff-5493ff8e9397811510e780de47c57abb70137f1afe85d1519130dc3679d60ce5) file. - Move all external repository imports to `tf_serving_workspace()` macro. - Initialize external repositories in WORKSPACE file. In particular, the last item for TensorFlow corresponds to the following block: ``` load("@org_tensorflow//tensorflow:workspace3.bzl", "workspace") workspace() load("@org_tensorflow//tensorflow:workspace2.bzl", "workspace") workspace() load("@org_tensorflow//tensorflow:workspace1.bzl", "workspace") workspace() load("@org_tensorflow//tensorflow:workspace0.bzl", "workspace") workspace() ``` PiperOrigin-RevId: 351864461 --- WORKSPACE | 89 ++++++++++---------------------- tensorflow_serving/workspace.bzl | 66 +++++++---------------- 2 files changed, 46 insertions(+), 109 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1307e604f17..9fdfdb31c06 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -1,5 +1,10 @@ workspace(name = "tf_serving") +# ===== TensorFlow dependency ===== +# +# TensorFlow is imported here instead of in tf_serving_workspace() because +# existing automation scripts that bump the TF commit hash expect it here. +# # To update TensorFlow to a new revision. # 1. Update the 'git_commit' args below to include the new git hash. # 2. Get the sha256 hash of the archive with a command such as... @@ -8,77 +13,37 @@ workspace(name = "tf_serving") # 3. Request the new archive to be mirrored on mirror.bazel.build for more # reliable downloads. load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") - tensorflow_http_archive( name = "org_tensorflow", sha256 = "95d9b5e48f22942fb16e254f05ab2fbd62dd8b5e4cae2b36d49d511f9eb0243f", git_commit = "100b443d8fac3108da3240a8130b3e196e9f25d6", ) -load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") - -http_archive( - name = "rules_pkg", - sha256 = "352c090cc3d3f9a6b4e676cf42a6047c16824959b438895a76c2989c6d7c246a", - url = "https://github.com/bazelbuild/rules_pkg/releases/download/0.2.5/rules_pkg-0.2.5.tar.gz", -) - -load("@rules_pkg//:deps.bzl", "rules_pkg_dependencies") - -rules_pkg_dependencies() - -load( - "@org_tensorflow//third_party/toolchains/preconfig/generate:archives.bzl", - "bazel_toolchains_archive", -) - -bazel_toolchains_archive() - -load( - "@bazel_toolchains//repositories:repositories.bzl", - bazel_toolchains_repositories = "repositories", -) - -bazel_toolchains_repositories() - -# START: Upstream TensorFlow dependencies -# TensorFlow build depends on these dependencies. -# Needs to be in-sync with TensorFlow sources. -http_archive( - name = "io_bazel_rules_closure", - sha256 = "5b00383d08dd71f28503736db0500b6fb4dda47489ff5fc6bed42557c07c6ba9", - strip_prefix = "rules_closure-308b05b2419edb5c8ee0471b67a40403df940149", - urls = [ - "https://storage.googleapis.com/mirror.tensorflow.org/github.com/bazelbuild/rules_closure/archive/308b05b2419edb5c8ee0471b67a40403df940149.tar.gz", - "https://github.com/bazelbuild/rules_closure/archive/308b05b2419edb5c8ee0471b67a40403df940149.tar.gz", # 2019-06-13 - ], -) -http_archive( - name = "bazel_skylib", - sha256 = "1dde365491125a3db70731e25658dfdd3bc5dbdfd11b840b3e987ecf043c7ca0", - urls = [ - "https://storage.googleapis.com/mirror.tensorflow.org/github.com/bazelbuild/bazel-skylib/releases/download/0.9.0/bazel_skylib-0.9.0.tar.gz", - "https://github.com/bazelbuild/bazel-skylib/releases/download/0.9.0/bazel_skylib-0.9.0.tar.gz", - ], -) # https://github.com/bazelbuild/bazel-skylib/releases - -# END: Upstream TensorFlow dependencies - -# Please add all new TensorFlow Serving dependencies in workspace.bzl. +# Import all of TensorFlow Serving's external dependencies. +# Downstream projects (projects importing TensorFlow Serving) need to +# duplicate all code below in their WORKSPACE file in order to also initialize +# those external dependencies. load("//tensorflow_serving:workspace.bzl", "tf_serving_workspace") - tf_serving_workspace() -# Specify the minimum required bazel version. -load("@org_tensorflow//tensorflow:version_check.bzl", "check_bazel_version_at_least") - +# Check bazel version requirement, which is stricter than TensorFlow's. +load( + "@org_tensorflow//tensorflow:version_check.bzl", + "check_bazel_version_at_least" +) check_bazel_version_at_least("3.0.0") -# GRPC deps, required to match TF's. Only after calling tf_serving_workspace() -load("@com_github_grpc_grpc//bazel:grpc_deps.bzl", "grpc_deps") - -grpc_deps() - -load("@upb//bazel:repository_defs.bzl", "bazel_version_repository") +# Initialize TensorFlow's external dependencies. +load("@org_tensorflow//tensorflow:workspace3.bzl", "workspace") +workspace() +load("@org_tensorflow//tensorflow:workspace2.bzl", "workspace") +workspace() +load("@org_tensorflow//tensorflow:workspace1.bzl", "workspace") +workspace() +load("@org_tensorflow//tensorflow:workspace0.bzl", "workspace") +workspace() + +# Initialize bazel package rules' external dependencies. +load("@rules_pkg//:deps.bzl", "rules_pkg_dependencies") +rules_pkg_dependencies() -bazel_version_repository(name = "bazel_version") diff --git a/tensorflow_serving/workspace.bzl b/tensorflow_serving/workspace.bzl index 05bddf51ac4..1d2e374b7be 100644 --- a/tensorflow_serving/workspace.bzl +++ b/tensorflow_serving/workspace.bzl @@ -1,51 +1,42 @@ -# TensorFlow Serving external dependencies that can be loaded in WORKSPACE -# files. +"""Provides a macro to import all TensorFlow Serving dependencies. + +Some of the external dependencies need to be initialized. To do this, duplicate +the initialization code from TensorFlow Serving's WORKSPACE file. +""" -load("@org_tensorflow//third_party:repo.bzl", "tf_http_archive") -load("@org_tensorflow//tensorflow:workspace.bzl", "tf_workspace") load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") def tf_serving_workspace(): """All TensorFlow Serving external dependencies.""" - tf_workspace(path_prefix = "", tf_repo_name = "org_tensorflow") - - # ===== gRPC dependencies ===== - native.bind( - name = "libssl", - actual = "@boringssl//:ssl", - ) - - # gRPC wants the existence of a cares dependence but its contents are not - # actually important since we have set GRPC_ARES=0 in tools/bazel.rc - native.bind( - name = "cares", - actual = "@grpc//third_party/nanopb:nanopb", + # ===== Bazel package rules dependency ===== + http_archive( + name = "rules_pkg", + sha256 = "352c090cc3d3f9a6b4e676cf42a6047c16824959b438895a76c2989c6d7c246a", + url = "https://github.com/bazelbuild/rules_pkg/releases/download/0.2.5/rules_pkg-0.2.5.tar.gz", ) - # ===== RapidJSON (rapidjson.org) dependencies ===== + # ===== RapidJSON (rapidjson.org) dependency ===== http_archive( name = "com_github_tencent_rapidjson", - urls = [ - "https://github.com/Tencent/rapidjson/archive/v1.1.0.zip", - ], + url = "https://github.com/Tencent/rapidjson/archive/v1.1.0.zip", sha256 = "8e00c38829d6785a2dfb951bb87c6974fa07dfe488aa5b25deec4b8bc0f6a3ab", strip_prefix = "rapidjson-1.1.0", build_file = "@//third_party/rapidjson:BUILD", ) - # ===== libevent (libevent.org) dependencies ===== + # ===== libevent (libevent.org) dependency ===== http_archive( name = "com_github_libevent_libevent", - urls = [ - "https://github.com/libevent/libevent/archive/release-2.1.8-stable.zip", - ], + url = "https://github.com/libevent/libevent/archive/release-2.1.8-stable.zip", sha256 = "70158101eab7ed44fd9cc34e7f247b3cae91a8e4490745d9d6eb7edc184e4d96", strip_prefix = "libevent-release-2.1.8-stable", build_file = "@//third_party/libevent:BUILD", ) - # ===== Override TF & TF Text defined 'ICU'. (we need a version that contains all data). + # ===== ICU dependency ===== + # Note: This overrides the dependency from TensorFlow with a version + # that contains all data. http_archive( name = "icu", strip_prefix = "icu-release-64-2", @@ -59,21 +50,6 @@ def tf_serving_workspace(): patch_args = ["-p1", "-s"], ) - # ===== Pin `com_google_absl` with the same version(and patch) with Tensorflow. - tf_http_archive( - name = "com_google_absl", - build_file = str(Label("@org_tensorflow//third_party:com_google_absl.BUILD")), - # TODO: Remove the patch when https://github.com/abseil/abseil-cpp/issues/326 is resolved - # and when TensorFlow is build against CUDA 10.2 - patch_file = str(Label("@org_tensorflow//third_party:com_google_absl_fix_mac_and_nvcc_build.patch")), - sha256 = "f368a8476f4e2e0eccf8a7318b98dafbe30b2600f4e3cf52636e5eb145aba06a", # SHARED_ABSL_SHA - strip_prefix = "abseil-cpp-df3ea785d8c30a9503321a3d35ee7d35808f190d", - urls = [ - "https://storage.googleapis.com/mirror.tensorflow.org/github.com/abseil/abseil-cpp/archive/df3ea785d8c30a9503321a3d35ee7d35808f190d.tar.gz", - "https://github.com/abseil/abseil-cpp/archive/df3ea785d8c30a9503321a3d35ee7d35808f190d.tar.gz", - ], - ) - # ===== TF.Text dependencies # NOTE: Before updating this version, you must update the test model # and double check all custom ops have a test: @@ -82,9 +58,7 @@ def tf_serving_workspace(): name = "org_tensorflow_text", sha256 = "05cc1b0eda8f4f734cb81d4389a637d26372b8621cb4c4a7e30ee5bc1e8c63da", strip_prefix = "text-2.3.0", - urls = [ - "https://github.com/tensorflow/text/archive/v2.3.0.zip", - ], + url = "https://github.com/tensorflow/text/archive/v2.3.0.zip", patches = ["@//third_party/tf_text:tftext.patch"], patch_args = ["-p1"], repo_mapping = {"@com_google_re2": "@com_googlesource_code_re2"}, @@ -94,9 +68,7 @@ def tf_serving_workspace(): name = "com_google_sentencepiece", strip_prefix = "sentencepiece-1.0.0", sha256 = "c05901f30a1d0ed64cbcf40eba08e48894e1b0e985777217b7c9036cac631346", - urls = [ - "https://github.com/google/sentencepiece/archive/1.0.0.zip", - ], + url = "https://github.com/google/sentencepiece/archive/1.0.0.zip", ) http_archive( From 238d8f4463e8f049969cdd955ab3dbb6dcc1b3e3 Mon Sep 17 00:00:00 2001 From: handong <455808519@qq.com> Date: Fri, 15 Jan 2021 11:38:34 +0800 Subject: [PATCH 4609/8103] add two flags(num_load_threads and num_unload_threads) to the server, by setting these two flags, to solve the problem of the serving request being delayed when the model is switched. --- tensorflow_serving/core/aspired_versions_manager.h | 4 ++-- tensorflow_serving/core/basic_manager.h | 4 ++-- tensorflow_serving/core/caching_manager.h | 4 ++-- tensorflow_serving/model_servers/main.cc | 12 ++++++++++++ tensorflow_serving/model_servers/server.cc | 2 ++ tensorflow_serving/model_servers/server.h | 2 ++ 6 files changed, 22 insertions(+), 6 deletions(-) diff --git a/tensorflow_serving/core/aspired_versions_manager.h b/tensorflow_serving/core/aspired_versions_manager.h index e158dbf8aba..d0395d72510 100644 --- a/tensorflow_serving/core/aspired_versions_manager.h +++ b/tensorflow_serving/core/aspired_versions_manager.h @@ -110,13 +110,13 @@ class AspiredVersionsManager : public Manager, /// /// If set as 0, we don't use a thread-pool, and servable loads are /// performed serially in the manager's main work loop. - uint32 num_load_threads = 1; + uint32 num_load_threads = 0; /// The number of threads in the thread-pool used to unload servables. /// /// If set as 0, we don't use a thread-pool, and servable unloads are /// performed serially in the manager's main work loop. - uint32 num_unload_threads = 1; + uint32 num_unload_threads = 0; /// Maximum number of times we retry loading a servable, after the first /// failure, before we give up. diff --git a/tensorflow_serving/core/basic_manager.h b/tensorflow_serving/core/basic_manager.h index 92656da73d3..59e47754112 100644 --- a/tensorflow_serving/core/basic_manager.h +++ b/tensorflow_serving/core/basic_manager.h @@ -118,12 +118,12 @@ class BasicManager : public Manager { // The number of threads in the thread-pool used to load servables. // // If set as 0, we don't use a thread-pool, and LoadServable() blocks. - uint32 num_load_threads = 1; + uint32 num_load_threads = 0; // The number of threads in the thread-pool used to unload servables. // // If set as 0, we don't use a thread-pool, and UnloadServable() blocks. - uint32 num_unload_threads = 1; + uint32 num_unload_threads = 0; // EventBus to publish servable state changes. This is optional, if unset, // we don't publish. diff --git a/tensorflow_serving/core/caching_manager.h b/tensorflow_serving/core/caching_manager.h index 1d9380a612e..60d8f82f86d 100644 --- a/tensorflow_serving/core/caching_manager.h +++ b/tensorflow_serving/core/caching_manager.h @@ -54,12 +54,12 @@ class CachingManager : public Manager { // The number of threads in the thread-pool used to load servables. // // If set as 0, we don't use a thread-pool, and LoadServable() blocks. - uint32 num_load_threads = 1; + uint32 num_load_threads = 0; // The number of threads in the thread-pool used to unload servables. // // If set as 0, we don't use a thread-pool. - uint32 num_unload_threads = 1; + uint32 num_unload_threads = 0; // EventBus to publish servable state changes. This is optional, if unset, // we don't publish. diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index f3238f7352f..4fc06bb50fb 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -105,6 +105,18 @@ int main(int argc, char** argv) { tensorflow::Flag("model_base_path", &options.model_base_path, "path to export (ignored if --model_config_file flag " "is set, otherwise required)"), + tensorflow::Flag("num_load_threads", &options.num_load_threads, + "The number of threads in the thread-pool used to load servables." + "If set as 0, we don't use a thread-pool, and servable loads are " + "performed serially in the manager's main work loop, " + "may casue the Serving request to be delayed. " + "Default: 0"), + tensorflow::Flag("num_unload_threads", &options.num_unload_threads, + "The number of threads in the thread-pool used to unload servables." + "If set as 0, we don't use a thread-pool, and servable loads are " + "performed serially in the manager's main work loop, " + "may casue the Serving request to be delayed. " + "Default: 0"), tensorflow::Flag("max_num_load_retries", &options.max_num_load_retries, "maximum number of times it retries loading a model " "after the first failure, before giving up. " diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index 61fd64c0c51..6dfabae994e 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -289,6 +289,8 @@ Status Server::BuildAndStart(const Options& server_options) { options.custom_model_config_loader = &LoadCustomModelConfig; options.aspired_version_policy = std::unique_ptr(new AvailabilityPreservingPolicy); + options.num_load_threads = server_options.num_load_threads; + options.num_unload_threads = server_options.num_unload_threads; options.max_num_load_retries = server_options.max_num_load_retries; options.load_retry_interval_micros = server_options.load_retry_interval_micros; diff --git a/tensorflow_serving/model_servers/server.h b/tensorflow_serving/model_servers/server.h index 2601ba89e44..d06d2499867 100644 --- a/tensorflow_serving/model_servers/server.h +++ b/tensorflow_serving/model_servers/server.h @@ -60,6 +60,8 @@ class Server { float per_process_gpu_memory_fraction = 0; tensorflow::string batching_parameters_file; tensorflow::string model_name; + tensorflow::int32 num_load_threads = 0; + tensorflow::int32 num_unload_threads = 0; tensorflow::int32 max_num_load_retries = 5; tensorflow::int64 load_retry_interval_micros = 1LL * 60 * 1000 * 1000; tensorflow::int32 file_system_poll_wait_seconds = 1; From ccfb606b2c86f4ffb57ecd8454c8809ab8c13090 Mon Sep 17 00:00:00 2001 From: Robert Neale Date: Fri, 15 Jan 2021 22:13:27 -0800 Subject: [PATCH 4610/8103] Update TF Text to v2.4.3. PiperOrigin-RevId: 352138473 --- .../tf_text_regression/01/saved_model.pb | Bin 2213600 -> 4537305 bytes tensorflow_serving/workspace.bzl | 6 +-- third_party/tf_text/tftext.patch | 36 +++--------------- 3 files changed, 9 insertions(+), 33 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/saved_model.pb b/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/saved_model.pb index 4ac4a9bc8fa1c9a7ecb98463b7709e912d8c0c00..74b6adcf69c6b77fc0bd64153f1c0d343d44c9b1 100644 GIT binary patch delta 88255 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Μ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

^^1k;ZD66Yn?}B97M$$|I9}P;xVSy$+7u;muQ# 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 delta 22156 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 L(cCe#rt*IQl>wpq diff --git a/tensorflow_serving/workspace.bzl b/tensorflow_serving/workspace.bzl index 1d2e374b7be..d56b3bf79dc 100644 --- a/tensorflow_serving/workspace.bzl +++ b/tensorflow_serving/workspace.bzl @@ -56,9 +56,9 @@ def tf_serving_workspace(): # https://github.com/tensorflow/text/blob/master/oss_scripts/model_server/save_models.py http_archive( name = "org_tensorflow_text", - sha256 = "05cc1b0eda8f4f734cb81d4389a637d26372b8621cb4c4a7e30ee5bc1e8c63da", - strip_prefix = "text-2.3.0", - url = "https://github.com/tensorflow/text/archive/v2.3.0.zip", + sha256 = "918e612a4c5e00d4223db2f7eaced1dc33ec4f989ab8cfee094ae237e22b090b", + strip_prefix = "text-2.4.3", + url = "https://github.com/tensorflow/text/archive/v2.4.3.zip", patches = ["@//third_party/tf_text:tftext.patch"], patch_args = ["-p1"], repo_mapping = {"@com_google_re2": "@com_googlesource_code_re2"}, diff --git a/third_party/tf_text/tftext.patch b/third_party/tf_text/tftext.patch index ee1d89d3f5b..9e35eab8bcf 100644 --- a/third_party/tf_text/tftext.patch +++ b/third_party/tf_text/tftext.patch @@ -1,38 +1,14 @@ -diff --git a/tensorflow_text/core/kernels/BUILD b/tensorflow_text/core/kernels/BUILD -index bdca365..5f5cdf6 100644 ---- a/tensorflow_text/core/kernels/BUILD -+++ b/tensorflow_text/core/kernels/BUILD -@@ -16,8 +16,7 @@ OSS_DEPS = [ - "@com_google_absl//absl/strings", - "@com_google_absl//absl/types:optional", - "@com_google_absl//absl/types:span", -- "@local_config_tf//:libtensorflow_framework", -- "@local_config_tf//:tf_header_lib", -+ "@org_tensorflow//tensorflow/core:tensorflow_opensource", - ] - - cc_library( diff --git a/tensorflow_text/tftext.bzl b/tensorflow_text/tftext.bzl -index aa5e275..5eaff73 100644 +index 8ca1a37..c7acdac 100644 --- a/tensorflow_text/tftext.bzl +++ b/tensorflow_text/tftext.bzl -@@ -44,8 +44,7 @@ def py_tf_text_library( - copts = [ "-pthread", ], - alwayslink = 1, - deps = cc_op_kernels + [ -- "@local_config_tf//:libtensorflow_framework", -- "@local_config_tf//:tf_header_lib", -+ "@org_tensorflow//tensorflow/core:tensorflow_opensource", +@@ -98,8 +98,7 @@ def tf_deps(deps = []): + "@org_tensorflow//tensorflow/core:portable_tensorflow_lib_lite", ], - ) - -@@ -55,8 +54,7 @@ def py_tf_text_library( - linkshared = 1, - deps = [ - ":" + library_name, + "//conditions:default": [ - "@local_config_tf//:libtensorflow_framework", - "@local_config_tf//:tf_header_lib", + "@org_tensorflow//tensorflow/core:tensorflow_opensource", - ], - ) + ] + deps + oss_deps, + }) From e079e8319ceb7edb68a55015c1be0667713de6df Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 16 Jan 2021 06:01:28 -0800 Subject: [PATCH 4611/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5f39c537-4afc-4c90-bc12-1a79c91c5e0d PiperOrigin-RevId: 352172417 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9fdfdb31c06..62101e2c4e7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "95d9b5e48f22942fb16e254f05ab2fbd62dd8b5e4cae2b36d49d511f9eb0243f", - git_commit = "100b443d8fac3108da3240a8130b3e196e9f25d6", + sha256 = "10853e6723c7f5d2bb02c89084239f77a39ebe441f3f7669e921116d62250427", + git_commit = "85bf96f508aa0ae1bb812980600f55ea044838e7", ) # Import all of TensorFlow Serving's external dependencies. From 1b3f62f8a8ed52544e2404915268b17e59924209 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 16 Jan 2021 12:01:26 -0800 Subject: [PATCH 4612/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d7aebff4-def9-4a58-a552-6950fd8b9fb7 PiperOrigin-RevId: 352196126 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 62101e2c4e7..adcd1175eb3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "10853e6723c7f5d2bb02c89084239f77a39ebe441f3f7669e921116d62250427", - git_commit = "85bf96f508aa0ae1bb812980600f55ea044838e7", + sha256 = "9d84bb546d5ca90cb40f0291e559c9cfbc4d08e569c101271a3db61061ea4707", + git_commit = "a7c1a23ebb53784977af67c918a4cf5f2638066d", ) # Import all of TensorFlow Serving's external dependencies. From 7e370999465e2ac9b9af8ed9c4306245b017f590 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 16 Jan 2021 18:01:21 -0800 Subject: [PATCH 4613/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bd21b5f2-ea8f-4e11-90e6-67cc78e667e4 PiperOrigin-RevId: 352219794 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index adcd1175eb3..67d5be42b58 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9d84bb546d5ca90cb40f0291e559c9cfbc4d08e569c101271a3db61061ea4707", - git_commit = "a7c1a23ebb53784977af67c918a4cf5f2638066d", + sha256 = "1e383086139d04819744f708f8d4fac3a4b36ad9de6e3bbea93316e4738b6484", + git_commit = "10c06df9492c44062f3a6b0c04bec325c7738426", ) # Import all of TensorFlow Serving's external dependencies. From f5e5012d608e0e173f3f20c2071800d4815fe208 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 17 Jan 2021 06:01:45 -0800 Subject: [PATCH 4614/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1288fd36-7fa4-49f1-a1fd-b34c921c00b6 PiperOrigin-RevId: 352270966 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 67d5be42b58..110c685367a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1e383086139d04819744f708f8d4fac3a4b36ad9de6e3bbea93316e4738b6484", - git_commit = "10c06df9492c44062f3a6b0c04bec325c7738426", + sha256 = "a3020645ae9564b64eccc87c19ac5a9ccd21c2d51d03c7e20460ded1eb66e828", + git_commit = "9cd34cf019801aef9fc79dc2c6c02a204f4e86dd", ) # Import all of TensorFlow Serving's external dependencies. From 23498da531071b36430a31395822c264e61519b7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 18 Jan 2021 06:01:26 -0800 Subject: [PATCH 4615/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fdc76ad7-0368-4187-8ab5-c982abe8da6d PiperOrigin-RevId: 352399226 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 110c685367a..4159273a446 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a3020645ae9564b64eccc87c19ac5a9ccd21c2d51d03c7e20460ded1eb66e828", - git_commit = "9cd34cf019801aef9fc79dc2c6c02a204f4e86dd", + sha256 = "ee96140c4c221f2221316c40f2260a529cb1b3339b98817bd7f7205a5273a09d", + git_commit = "71c1ae43e2504da27ab60d1848b5fc0deec3fb31", ) # Import all of TensorFlow Serving's external dependencies. From 8385ce5e05e9ae2ed094437661a77fc8f1d9e9ce Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 18 Jan 2021 12:01:36 -0800 Subject: [PATCH 4616/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/69f95b12-e288-4c9e-824c-839312bfaffc PiperOrigin-RevId: 352440142 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4159273a446..899508d8ab1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ee96140c4c221f2221316c40f2260a529cb1b3339b98817bd7f7205a5273a09d", - git_commit = "71c1ae43e2504da27ab60d1848b5fc0deec3fb31", + sha256 = "222e2c19f290b66cdfd405a7a693887b99a3ecc16655620f0d76a28cdd57ee48", + git_commit = "9cb96ea8fda28645eff051527c1eb441691cea94", ) # Import all of TensorFlow Serving's external dependencies. From ab1ac6f8bf2bd99d4ca2cade7ebb048e1129f860 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 18 Jan 2021 18:01:22 -0800 Subject: [PATCH 4617/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/40b8a9dd-63e0-4186-99c0-0ac8e6a31a71 PiperOrigin-RevId: 352472773 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 899508d8ab1..e4a12adc4fb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "222e2c19f290b66cdfd405a7a693887b99a3ecc16655620f0d76a28cdd57ee48", - git_commit = "9cb96ea8fda28645eff051527c1eb441691cea94", + sha256 = "0368d77098b1282dd9094e9cbab79ac058f1112cd3a8ba9e3a21603a9b68ba3b", + git_commit = "673079ce30f04324cda9b8a276a4ff7eb38bbacd", ) # Import all of TensorFlow Serving's external dependencies. From 058e18f831386e48ecd51d31bda43c57f606d472 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 19 Jan 2021 00:01:32 -0800 Subject: [PATCH 4618/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f174b973-08cf-48f4-abe9-fdefc3c83cd0 PiperOrigin-RevId: 352506429 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e4a12adc4fb..b8d95e589bc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0368d77098b1282dd9094e9cbab79ac058f1112cd3a8ba9e3a21603a9b68ba3b", - git_commit = "673079ce30f04324cda9b8a276a4ff7eb38bbacd", + sha256 = "5a1888328cafdce7af1b8d166f4c9a3b7075799316c403006835c29232d18716", + git_commit = "9d6681202e062fbf6df8bcb39d70b129333f590c", ) # Import all of TensorFlow Serving's external dependencies. From 606b25a2806723210f3c8ec10086459c2eb35e9a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 19 Jan 2021 06:01:20 -0800 Subject: [PATCH 4619/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/379f55e9-6135-4ce8-a543-4df32b7a8deb PiperOrigin-RevId: 352550950 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b8d95e589bc..f9d07651306 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5a1888328cafdce7af1b8d166f4c9a3b7075799316c403006835c29232d18716", - git_commit = "9d6681202e062fbf6df8bcb39d70b129333f590c", + sha256 = "a29e2c4c6c00917f063a12718b01a7b8cb522b9d81f62b1622c9c549c4ad8378", + git_commit = "3a06f0d4754c7b146af5a071ac2cbb419ef58e81", ) # Import all of TensorFlow Serving's external dependencies. From 53da4f80a6d6a15cebfb9add0ef5e0e59abe3eb2 Mon Sep 17 00:00:00 2001 From: skawasak Date: Wed, 20 Jan 2021 02:55:16 +0900 Subject: [PATCH 4620/8103] fix http_rest_api_handler_test --- .../http_rest_api_handler_test.cc | 99 +++++++++++-------- 1 file changed, 56 insertions(+), 43 deletions(-) diff --git a/tensorflow_serving/model_servers/http_rest_api_handler_test.cc b/tensorflow_serving/model_servers/http_rest_api_handler_test.cc index f0730659547..8b7e3e46cb7 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler_test.cc +++ b/tensorflow_serving/model_servers/http_rest_api_handler_test.cc @@ -174,41 +174,46 @@ TEST_F(HttpRestApiHandlerTest, kPathRegex) { TEST_F(HttpRestApiHandlerTest, UnsupportedApiCalls) { HeaderList headers; - string output; + string model_name, method, output; Status status; - status = handler_.ProcessRequest("GET", "/v1/foo", "", &headers, &output); + status = handler_.ProcessRequest("GET", "/v1/foo", "", + &headers, &model_name, &method, &output); EXPECT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("Malformed request")); - status = handler_.ProcessRequest("POST", "/v1/foo", "", &headers, &output); + status = handler_.ProcessRequest("POST", "/v1/foo", "", + &headers, &model_name, &method, &output); EXPECT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("Malformed request")); - status = handler_.ProcessRequest("GET", "/v1/models", "", &headers, &output); + status = handler_.ProcessRequest("GET", "/v1/models", "", + &headers, &model_name, &method, &output); EXPECT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("Missing model name")); - status = handler_.ProcessRequest("POST", "/v1/models", "", &headers, &output); + status = handler_.ProcessRequest("POST", "/v1/models", "", + &headers, &model_name, &method, &output); EXPECT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("Malformed request")); status = handler_.ProcessRequest("GET", "/v1/models/foo:predict", "", - &headers, &output); + &headers, &model_name, &method, &output); EXPECT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("Malformed request")); status = handler_.ProcessRequest("GET", "/v1/models/foo/version/50:predict", - "", &headers, &output); + "", &headers, &model_name, &method, &output); EXPECT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("Malformed request")); status = handler_.ProcessRequest("POST", "/v1/models/foo/version/50:regress", - "", &headers, &output); + "", &headers, &model_name, &method, &output); EXPECT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("Malformed request")); status = handler_.ProcessRequest( - "POST", "/v1/models/foo/versions/HELLO:regress", "", &headers, &output); + "POST", "/v1/models/foo/versions/HELLO:regress", "", + &headers, &model_name, &method, &output); EXPECT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("Malformed request")); @@ -216,85 +221,90 @@ TEST_F(HttpRestApiHandlerTest, UnsupportedApiCalls) { "POST", absl::StrCat("/v1/models/foo/versions/", std::numeric_limits::max(), ":regress"), - "", &headers, &output); + "", &headers, &model_name, &method, &output); EXPECT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("Failed to convert version")); status = handler_.ProcessRequest("POST", "/v1/models/foo/metadata", "", - &headers, &output); + &headers, &model_name, &method, &output); EXPECT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("Malformed request")); status = handler_.ProcessRequest( - "POST", "/v1/models/foo/label/some_label:regress", "", &headers, &output); + "POST", "/v1/models/foo/label/some_label:regress", "", + &headers, &model_name, &method, &output); EXPECT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("Malformed request")); status = handler_.ProcessRequest( "POST", "/v1/models/foo/versions/50/labels/some_label:regress", "", - &headers, &output); + &headers, &model_name, &method, &output); EXPECT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("Malformed request")); status = handler_.ProcessRequest("POST", "/v1/models/foo/labels/some-label:regress", - "", &headers, &output); + "", &headers, &model_name, &method, &output); EXPECT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("Malformed request")); status = handler_.ProcessRequest("POST", "/v1/models/foo/versions/some_label:regress", - "", &headers, &output); + "", &headers, &model_name, &method, &output); EXPECT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("Malformed request")); } TEST_F(HttpRestApiHandlerTest, PredictModelNameVersionErrors) { HeaderList headers; - string output; + string model_name, method, output; Status status; // 'foo' is not a valid model name. status = handler_.ProcessRequest("POST", "/v1/models/foo:predict", - R"({ "instances": [1] })", &headers, &output); + R"({ "instances": [1] })", + &headers, &model_name, &method, &output); EXPECT_TRUE(errors::IsNotFound(status)); // 'foo' is not a valid model name. status = handler_.ProcessRequest("POST", "/v1/models/foo/versions/50:predict", - R"({ "instances": [1] })", &headers, &output); + R"({ "instances": [1] })", + &headers, &model_name, &method, &output); EXPECT_TRUE(errors::IsNotFound(status)); // Valid model name, but invalid version number (99). status = handler_.ProcessRequest( "POST", absl::StrCat("/v1/models/", kTestModelName, "99:predict"), - R"({ "instances": [1] })", &headers, &output); + R"({ "instances": [1] })", &headers, &model_name, &method, &output); EXPECT_TRUE(errors::IsNotFound(status)); } TEST_F(HttpRestApiHandlerTest, PredictRequestErrors) { HeaderList headers; - string output; + string model_name, method, output; Status status; const string& req_path = absl::StrCat("/v1/models/", kTestModelName, ":predict"); // Empty document. - status = handler_.ProcessRequest("POST", req_path, "", &headers, &output); + status = handler_.ProcessRequest("POST", req_path, "", + &headers, &model_name, &method, &output); EXPECT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("JSON Parse error: The document is empty")); // Badly formatted JSON. status = handler_.ProcessRequest("POST", req_path, "instances = [1, 2]", - &headers, &output); + &headers, &model_name, &method, &output); EXPECT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("JSON Parse error: Invalid value")); // Incorrect type. status = handler_.ProcessRequest( - "POST", req_path, R"({ "instances": ["x", "y"] })", &headers, &output); + "POST", req_path, R"({ "instances": ["x", "y"] })", + &headers, &model_name, &method, &output); EXPECT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("not of expected type: float")); @@ -303,14 +313,15 @@ TEST_F(HttpRestApiHandlerTest, PredictRequestErrors) { "POST", absl::StrCat("/v1/models/", kTestModelName, "/labels/", kNonexistentModelVersionLabel, ":predict"), - R"({ "instances": ["x", "y"] })", &headers, &output); + R"({ "instances": ["x", "y"] })", &headers, &model_name, &method, &output); EXPECT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("Unrecognized servable version label")); // Incorrect signature_name type. status = handler_.ProcessRequest( - "POST", req_path, R"({ "signature_name": 100 })", &headers, &output); + "POST", req_path, R"({ "signature_name": 100 })", + &headers, &model_name, &method, &output); EXPECT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(GetJsonErrorMsg(output), HasSubstr("'signature_name' key must be a string value.")); @@ -318,12 +329,13 @@ TEST_F(HttpRestApiHandlerTest, PredictRequestErrors) { TEST_F(HttpRestApiHandlerTest, Predict) { HeaderList headers; - string output; + string model_name, method, output; Status status; // Query latest version. TF_EXPECT_OK(handler_.ProcessRequest( "POST", absl::StrCat("/v1/models/", kTestModelName, ":predict"), - R"({"instances": [[1.0, 2.0], [3.0, 4.0]]})", &headers, &output)); + R"({"instances": [[1.0, 2.0], [3.0, 4.0]]})", + &headers, &model_name, &method, &output)); TF_EXPECT_OK( CompareJson(output, R"({ "predictions": [[2.5, 3.0], [3.5, 4.0]] })")); EXPECT_THAT(headers, UnorderedElementsAreArray( @@ -334,7 +346,8 @@ TEST_F(HttpRestApiHandlerTest, Predict) { "POST", absl::StrCat("/v1/models/", kTestModelName, "/versions/", kTestModelVersion1, ":predict"), - R"({"instances": [1.0, 2.0]})", &headers, &output)); + R"({"instances": [1.0, 2.0]})", + &headers, &model_name, &method, &output)); TF_EXPECT_OK(CompareJson(output, R"({ "predictions": [2.5, 3.0] })")); EXPECT_THAT(headers, UnorderedElementsAreArray( (HeaderList){{"Content-Type", "application/json"}})); @@ -344,7 +357,7 @@ TEST_F(HttpRestApiHandlerTest, Predict) { "POST", absl::StrCat("/v1/models/", kTestModelName, "/labels/", kTestModelVersionLabel, ":predict"), - R"({"instances": [1.0, 2.0]})", &headers, &output)); + R"({"instances": [1.0, 2.0]})", &headers, &model_name, &method, &output)); TF_EXPECT_OK(CompareJson(output, R"({ "predictions": [2.5, 3.0] })")); EXPECT_THAT(headers, UnorderedElementsAreArray( (HeaderList){{"Content-Type", "application/json"}})); @@ -355,7 +368,7 @@ TEST_F(HttpRestApiHandlerTest, Predict) { absl::StrCat("/v1/models/", kTestModelName, "/versions/", kTestModelVersion1, ":predict"), R"({"signature_name": "serving_default", "instances": [3.0, 4.0]})", - &headers, &output)); + &headers, &model_name, &method, &output)); TF_EXPECT_OK(CompareJson(output, R"({ "predictions": [3.5, 4.0] })")); EXPECT_THAT(headers, UnorderedElementsAreArray( (HeaderList){{"Content-Type", "application/json"}})); @@ -366,7 +379,7 @@ TEST_F(HttpRestApiHandlerTest, Predict) { absl::StrCat("/v1/models/", kTestModelName, "/versions/", kTestModelVersion1, ":predict"), R"({"signature_name": "serving_default", "inputs": [3.0, 4.0]})", - &headers, &output)); + &headers, &model_name, &method, &output)); TF_EXPECT_OK(CompareJson(output, R"({ "outputs": [3.5, 4.0] })")); EXPECT_THAT(headers, UnorderedElementsAreArray( (HeaderList){{"Content-Type", "application/json"}})); @@ -374,13 +387,13 @@ TEST_F(HttpRestApiHandlerTest, Predict) { TEST_F(HttpRestApiHandlerTest, Regress) { HeaderList headers; - string output; + string model_name, method, output; Status status; // Query latest version. TF_EXPECT_OK(handler_.ProcessRequest( "POST", absl::StrCat("/v1/models/", kTestModelName, ":regress"), R"({"signature_name": "regress_x_to_y", "examples": [ { "x": 80.0 } ] })", - &headers, &output)); + &headers, &model_name, &method, &output)); TF_EXPECT_OK(CompareJson(output, R"({ "results": [42] })")); EXPECT_THAT(headers, UnorderedElementsAreArray( (HeaderList){{"Content-Type", "application/json"}})); @@ -391,7 +404,7 @@ TEST_F(HttpRestApiHandlerTest, Regress) { absl::StrCat("/v1/models/", kTestModelName, "/versions/", kTestModelVersion1, ":regress"), R"({"signature_name": "regress_x_to_y", "examples": [ { "x": 80.0 } ] })", - &headers, &output)); + &headers, &model_name, &method, &output)); TF_EXPECT_OK(CompareJson(output, R"({ "results": [42] })")); EXPECT_THAT(headers, UnorderedElementsAreArray( (HeaderList){{"Content-Type", "application/json"}})); @@ -402,7 +415,7 @@ TEST_F(HttpRestApiHandlerTest, Regress) { absl::StrCat("/v1/models/", kTestModelName, "/labels/", kTestModelVersionLabel, ":regress"), R"({"signature_name": "regress_x_to_y", "examples": [ { "x": 80.0 } ] })", - &headers, &output)); + &headers, &model_name, &method, &output)); TF_EXPECT_OK(CompareJson(output, R"({ "results": [42] })")); EXPECT_THAT(headers, UnorderedElementsAreArray( (HeaderList){{"Content-Type", "application/json"}})); @@ -410,13 +423,13 @@ TEST_F(HttpRestApiHandlerTest, Regress) { TEST_F(HttpRestApiHandlerTest, Classify) { HeaderList headers; - string output; + string model_name, method, output; Status status; // Query latest version. TF_EXPECT_OK(handler_.ProcessRequest( "POST", absl::StrCat("/v1/models/", kTestModelName, ":classify"), R"({"signature_name": "classify_x_to_y", "examples": [ { "x": 20.0 } ] })", - &headers, &output)); + &headers, &model_name, &method, &output)); TF_EXPECT_OK(CompareJson(output, R"({ "results": [[["", 12]]] })")); EXPECT_THAT(headers, UnorderedElementsAreArray( (HeaderList){{"Content-Type", "application/json"}})); @@ -427,7 +440,7 @@ TEST_F(HttpRestApiHandlerTest, Classify) { absl::StrCat("/v1/models/", kTestModelName, "/labels/", kTestModelVersionLabel, ":classify"), R"({"signature_name": "classify_x_to_y", "examples": [ { "x": 10.0 } ] })", - &headers, &output)); + &headers, &model_name, &method, &output)); TF_EXPECT_OK(CompareJson(output, R"({ "results": [[["", 7]]] })")); EXPECT_THAT(headers, UnorderedElementsAreArray( (HeaderList){{"Content-Type", "application/json"}})); @@ -435,7 +448,7 @@ TEST_F(HttpRestApiHandlerTest, Classify) { TEST_F(HttpRestApiHandlerTest, GetStatus) { HeaderList headers; - string output; + string model_name, method, output; Status status; // Get status for all versions. @@ -462,7 +475,7 @@ TEST_F(HttpRestApiHandlerTest, GetStatus) { handler_.ProcessRequest("GET", absl::StrCat("/v1/models/", kTestModelName, "/versions/", kTestModelVersion1), - "", &headers, &output)); + "", &headers, &model_name, &method, &output)); EXPECT_THAT(headers, UnorderedElementsAreArray( (HeaderList){{"Content-Type", "application/json"}})); TF_EXPECT_OK(CompareJson(output, R"({ @@ -483,7 +496,7 @@ TEST_F(HttpRestApiHandlerTest, GetStatus) { handler_.ProcessRequest("GET", absl::StrCat("/v1/models/", kTestModelName, "/labels/", kTestModelVersionLabel), - "", &headers, &output)); + "", &headers, &model_name, &method, &output)); EXPECT_THAT(headers, UnorderedElementsAreArray( (HeaderList){{"Content-Type", "application/json"}})); TF_EXPECT_OK(CompareJson(output, R"({ @@ -502,13 +515,13 @@ TEST_F(HttpRestApiHandlerTest, GetStatus) { TEST_F(HttpRestApiHandlerTest, GetModelMetadata) { HeaderList headers; - string output; + string model_name, method, output; string test_file_contents; // Get model metadata without specifying version. TF_EXPECT_OK(handler_.ProcessRequest( "GET", absl::StrCat("/v1/models/", kTestModelName, "/metadata"), "", - &headers, &output)); + &headers, &model_name, &method, &output)); EXPECT_THAT(headers, UnorderedElementsAreArray( (HeaderList){{"Content-Type", "application/json"}})); const string fname = absl::StrCat( From 0483edb643fdfcda34ca5a2cd7923c783f0e48bb Mon Sep 17 00:00:00 2001 From: skawasak Date: Wed, 20 Jan 2021 03:15:22 +0900 Subject: [PATCH 4621/8103] add status label in request_latency --- tensorflow_serving/model_servers/http_server.cc | 2 +- .../model_servers/prediction_service_impl.cc | 9 ++++++--- tensorflow_serving/servables/tensorflow/util.cc | 9 ++++++--- tensorflow_serving/servables/tensorflow/util.h | 3 ++- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/tensorflow_serving/model_servers/http_server.cc b/tensorflow_serving/model_servers/http_server.cc index 480bd7908fe..f3e6325008c 100644 --- a/tensorflow_serving/model_servers/http_server.cc +++ b/tensorflow_serving/model_servers/http_server.cc @@ -176,7 +176,7 @@ class RestApiRequestDispatcher { req->ReplyWithStatus(http_status); RecordRequestLatency(model_name, /*api=*/method, /*entrypoint=*/"REST", - Env::Default()->NowMicros() - start); + status, Env::Default()->NowMicros() - start); RecordModelRequestCount(model_name, status); } diff --git a/tensorflow_serving/model_servers/prediction_service_impl.cc b/tensorflow_serving/model_servers/prediction_service_impl.cc index 2a1b339313d..da540d68c5b 100644 --- a/tensorflow_serving/model_servers/prediction_service_impl.cc +++ b/tensorflow_serving/model_servers/prediction_service_impl.cc @@ -67,7 +67,8 @@ ::grpc::Status PredictionServiceImpl::Predict(::grpc::ServerContext *context, VLOG(1) << "Predict failed: " << status.error_message(); } RecordRequestLatency(request->model_spec().name(), /*api=*/"Predict", - /*runtime=*/"GRPC", Env::Default()->NowMicros() - start); + /*runtime=*/"GRPC", tf_status, + Env::Default()->NowMicros() - start); RecordModelRequestCount(request->model_spec().name(), tf_status); return status; @@ -104,7 +105,8 @@ ::grpc::Status PredictionServiceImpl::Classify( VLOG(1) << "Classify request failed: " << status.error_message(); } RecordRequestLatency(request->model_spec().name(), /*api=*/"Classify", - /*runtime=*/"GRPC", Env::Default()->NowMicros() - start); + /*runtime=*/"GRPC", tf_status, + Env::Default()->NowMicros() - start); RecordModelRequestCount(request->model_spec().name(), tf_status); return status; @@ -130,7 +132,8 @@ ::grpc::Status PredictionServiceImpl::Regress(::grpc::ServerContext *context, VLOG(1) << "Regress request failed: " << status.error_message(); } RecordRequestLatency(request->model_spec().name(), /*api=*/"Regress", - /*runtime=*/"GRPC", Env::Default()->NowMicros() - start); + /*runtime=*/"GRPC", tf_status, + Env::Default()->NowMicros() - start); RecordModelRequestCount(request->model_spec().name(), tf_status); return status; diff --git a/tensorflow_serving/servables/tensorflow/util.cc b/tensorflow_serving/servables/tensorflow/util.cc index 63f5c1ffea2..d42b86ef984 100644 --- a/tensorflow_serving/servables/tensorflow/util.cc +++ b/tensorflow_serving/servables/tensorflow/util.cc @@ -69,7 +69,7 @@ auto* runtime_latency = monitoring::Sampler<3>::New( }, // Scale of 10, power of 1.8 with bucket count 33 (~20 minutes). monitoring::Buckets::Exponential(10, 1.8, 33)); -auto* request_latency = monitoring::Sampler<3>::New( +auto* request_latency = monitoring::Sampler<4>::New( { "/tensorflow/serving/request_latency", "Distribution of wall time (in microseconds) for Tensorflow Serving" @@ -77,6 +77,7 @@ auto* request_latency = monitoring::Sampler<3>::New( "model_name", "API", "entrypoint", + "status" }, // Scale of 10, power of 1.8 with bucket count 33 (~20 minutes). monitoring::Buckets::Exponential(10, 1.8, 33)); @@ -329,8 +330,10 @@ void RecordRuntimeLatency(const string& model_name, const string& api, } void RecordRequestLatency(const string& model_name, const string& api, - const string& entrypoint, int64 latency_usec) { - request_latency->GetCell(model_name, api, entrypoint)->Add(latency_usec); + const string& entrypoint, const Status& status, + int64 latency_usec) { + request_latency->GetCell(model_name, api, entrypoint, + error::Code_Name(status.code()))->Add(latency_usec); } } // namespace serving diff --git a/tensorflow_serving/servables/tensorflow/util.h b/tensorflow_serving/servables/tensorflow/util.h index 123aa392239..1ba1e83ce35 100644 --- a/tensorflow_serving/servables/tensorflow/util.h +++ b/tensorflow_serving/servables/tensorflow/util.h @@ -119,7 +119,8 @@ void RecordRuntimeLatency(const string& model_name, const string& api, // Update metrics for request latency. void RecordRequestLatency(const string& model_name, const string& api, - const string& entrypoint, int64 latency_usec); + const string& entrypoint, const Status& status, + int64 latency_usec); } // namespace serving } // namespace tensorflow From 67228ab9326c9a67408abaa90c4c5ef4a081d376 Mon Sep 17 00:00:00 2001 From: skawasak Date: Wed, 20 Jan 2021 03:28:36 +0900 Subject: [PATCH 4622/8103] Revert "add status label in request_latency" This reverts commit 0483edb643fdfcda34ca5a2cd7923c783f0e48bb. --- tensorflow_serving/model_servers/http_server.cc | 2 +- .../model_servers/prediction_service_impl.cc | 9 +++------ tensorflow_serving/servables/tensorflow/util.cc | 9 +++------ tensorflow_serving/servables/tensorflow/util.h | 3 +-- 4 files changed, 8 insertions(+), 15 deletions(-) diff --git a/tensorflow_serving/model_servers/http_server.cc b/tensorflow_serving/model_servers/http_server.cc index f3e6325008c..480bd7908fe 100644 --- a/tensorflow_serving/model_servers/http_server.cc +++ b/tensorflow_serving/model_servers/http_server.cc @@ -176,7 +176,7 @@ class RestApiRequestDispatcher { req->ReplyWithStatus(http_status); RecordRequestLatency(model_name, /*api=*/method, /*entrypoint=*/"REST", - status, Env::Default()->NowMicros() - start); + Env::Default()->NowMicros() - start); RecordModelRequestCount(model_name, status); } diff --git a/tensorflow_serving/model_servers/prediction_service_impl.cc b/tensorflow_serving/model_servers/prediction_service_impl.cc index da540d68c5b..2a1b339313d 100644 --- a/tensorflow_serving/model_servers/prediction_service_impl.cc +++ b/tensorflow_serving/model_servers/prediction_service_impl.cc @@ -67,8 +67,7 @@ ::grpc::Status PredictionServiceImpl::Predict(::grpc::ServerContext *context, VLOG(1) << "Predict failed: " << status.error_message(); } RecordRequestLatency(request->model_spec().name(), /*api=*/"Predict", - /*runtime=*/"GRPC", tf_status, - Env::Default()->NowMicros() - start); + /*runtime=*/"GRPC", Env::Default()->NowMicros() - start); RecordModelRequestCount(request->model_spec().name(), tf_status); return status; @@ -105,8 +104,7 @@ ::grpc::Status PredictionServiceImpl::Classify( VLOG(1) << "Classify request failed: " << status.error_message(); } RecordRequestLatency(request->model_spec().name(), /*api=*/"Classify", - /*runtime=*/"GRPC", tf_status, - Env::Default()->NowMicros() - start); + /*runtime=*/"GRPC", Env::Default()->NowMicros() - start); RecordModelRequestCount(request->model_spec().name(), tf_status); return status; @@ -132,8 +130,7 @@ ::grpc::Status PredictionServiceImpl::Regress(::grpc::ServerContext *context, VLOG(1) << "Regress request failed: " << status.error_message(); } RecordRequestLatency(request->model_spec().name(), /*api=*/"Regress", - /*runtime=*/"GRPC", tf_status, - Env::Default()->NowMicros() - start); + /*runtime=*/"GRPC", Env::Default()->NowMicros() - start); RecordModelRequestCount(request->model_spec().name(), tf_status); return status; diff --git a/tensorflow_serving/servables/tensorflow/util.cc b/tensorflow_serving/servables/tensorflow/util.cc index d42b86ef984..63f5c1ffea2 100644 --- a/tensorflow_serving/servables/tensorflow/util.cc +++ b/tensorflow_serving/servables/tensorflow/util.cc @@ -69,7 +69,7 @@ auto* runtime_latency = monitoring::Sampler<3>::New( }, // Scale of 10, power of 1.8 with bucket count 33 (~20 minutes). monitoring::Buckets::Exponential(10, 1.8, 33)); -auto* request_latency = monitoring::Sampler<4>::New( +auto* request_latency = monitoring::Sampler<3>::New( { "/tensorflow/serving/request_latency", "Distribution of wall time (in microseconds) for Tensorflow Serving" @@ -77,7 +77,6 @@ auto* request_latency = monitoring::Sampler<4>::New( "model_name", "API", "entrypoint", - "status" }, // Scale of 10, power of 1.8 with bucket count 33 (~20 minutes). monitoring::Buckets::Exponential(10, 1.8, 33)); @@ -330,10 +329,8 @@ void RecordRuntimeLatency(const string& model_name, const string& api, } void RecordRequestLatency(const string& model_name, const string& api, - const string& entrypoint, const Status& status, - int64 latency_usec) { - request_latency->GetCell(model_name, api, entrypoint, - error::Code_Name(status.code()))->Add(latency_usec); + const string& entrypoint, int64 latency_usec) { + request_latency->GetCell(model_name, api, entrypoint)->Add(latency_usec); } } // namespace serving diff --git a/tensorflow_serving/servables/tensorflow/util.h b/tensorflow_serving/servables/tensorflow/util.h index 1ba1e83ce35..123aa392239 100644 --- a/tensorflow_serving/servables/tensorflow/util.h +++ b/tensorflow_serving/servables/tensorflow/util.h @@ -119,8 +119,7 @@ void RecordRuntimeLatency(const string& model_name, const string& api, // Update metrics for request latency. void RecordRequestLatency(const string& model_name, const string& api, - const string& entrypoint, const Status& status, - int64 latency_usec); + const string& entrypoint, int64 latency_usec); } // namespace serving } // namespace tensorflow From a40a32db6f2bccb6e67b7f9e006a1e27eb65b3d3 Mon Sep 17 00:00:00 2001 From: skawasak Date: Wed, 20 Jan 2021 03:35:18 +0900 Subject: [PATCH 4623/8103] record request_latency only successful requests --- .../model_servers/http_server.cc | 6 ++++-- .../model_servers/prediction_service_impl.cc | 21 +++++++++++-------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/tensorflow_serving/model_servers/http_server.cc b/tensorflow_serving/model_servers/http_server.cc index 480bd7908fe..a113eca81f9 100644 --- a/tensorflow_serving/model_servers/http_server.cc +++ b/tensorflow_serving/model_servers/http_server.cc @@ -175,8 +175,10 @@ class RestApiRequestDispatcher { } req->ReplyWithStatus(http_status); - RecordRequestLatency(model_name, /*api=*/method, /*entrypoint=*/"REST", - Env::Default()->NowMicros() - start); + if (http_status == net_http::HTTPStatusCode::OK) { + RecordRequestLatency(model_name, /*api=*/method, /*entrypoint=*/"REST", + Env::Default()->NowMicros() - start); + } RecordModelRequestCount(model_name, status); } diff --git a/tensorflow_serving/model_servers/prediction_service_impl.cc b/tensorflow_serving/model_servers/prediction_service_impl.cc index 2a1b339313d..3205816fff7 100644 --- a/tensorflow_serving/model_servers/prediction_service_impl.cc +++ b/tensorflow_serving/model_servers/prediction_service_impl.cc @@ -63,11 +63,12 @@ ::grpc::Status PredictionServiceImpl::Predict(::grpc::ServerContext *context, run_options, core_, *request, response); const ::grpc::Status status = ToGRPCStatus(tf_status); - if (!status.ok()) { + if (status.ok()) { + RecordRequestLatency(request->model_spec().name(), /*api=*/"Predict", + /*runtime=*/"GRPC", Env::Default()->NowMicros() - start); + } else { VLOG(1) << "Predict failed: " << status.error_message(); } - RecordRequestLatency(request->model_spec().name(), /*api=*/"Predict", - /*runtime=*/"GRPC", Env::Default()->NowMicros() - start); RecordModelRequestCount(request->model_spec().name(), tf_status); return status; @@ -100,11 +101,12 @@ ::grpc::Status PredictionServiceImpl::Classify( *request, response); const ::grpc::Status status = ToGRPCStatus(tf_status); - if (!status.ok()) { + if (status.ok()) { + RecordRequestLatency(request->model_spec().name(), /*api=*/"Classify", + /*runtime=*/"GRPC", Env::Default()->NowMicros() - start); + } else { VLOG(1) << "Classify request failed: " << status.error_message(); } - RecordRequestLatency(request->model_spec().name(), /*api=*/"Classify", - /*runtime=*/"GRPC", Env::Default()->NowMicros() - start); RecordModelRequestCount(request->model_spec().name(), tf_status); return status; @@ -126,11 +128,12 @@ ::grpc::Status PredictionServiceImpl::Regress(::grpc::ServerContext *context, *request, response); const ::grpc::Status status = ToGRPCStatus(tf_status); - if (!status.ok()) { + if (status.ok()) { + RecordRequestLatency(request->model_spec().name(), /*api=*/"Regress", + /*runtime=*/"GRPC", Env::Default()->NowMicros() - start); + } else { VLOG(1) << "Regress request failed: " << status.error_message(); } - RecordRequestLatency(request->model_spec().name(), /*api=*/"Regress", - /*runtime=*/"GRPC", Env::Default()->NowMicros() - start); RecordModelRequestCount(request->model_spec().name(), tf_status); return status; From 392c2ccaf99c07034eca3612d05438f1d75446d9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 19 Jan 2021 12:02:47 -0800 Subject: [PATCH 4624/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e35d0066-ceb8-4af0-9122-8c2ab3e813c1 PiperOrigin-RevId: 352622290 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f9d07651306..03efc6cf118 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a29e2c4c6c00917f063a12718b01a7b8cb522b9d81f62b1622c9c549c4ad8378", - git_commit = "3a06f0d4754c7b146af5a071ac2cbb419ef58e81", + sha256 = "bd8925d5b9b0f7598a35337f966f28a908b8c03712e01c04062d39f0bea9b40f", + git_commit = "32d4c8e45ead76b6430e362f8f269268e06fabbb", ) # Import all of TensorFlow Serving's external dependencies. From 3e5022cd8b51a6eaecf173b4b8c4432d8fafecce Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 19 Jan 2021 18:01:25 -0800 Subject: [PATCH 4625/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6104d153-914d-445b-98db-80d59ee2ded4 PiperOrigin-RevId: 352694117 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 03efc6cf118..8af19f8a459 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bd8925d5b9b0f7598a35337f966f28a908b8c03712e01c04062d39f0bea9b40f", - git_commit = "32d4c8e45ead76b6430e362f8f269268e06fabbb", + sha256 = "357396a450a7628043534fa6813a11f96887ec8254c63f8a07776b6eca4bce9f", + git_commit = "71a03b46034bbb9f1fc0ee7f4028dd82ba77ee64", ) # Import all of TensorFlow Serving's external dependencies. From e20c91efcc9221109aa19cff6cca4f2495e367f3 Mon Sep 17 00:00:00 2001 From: skawasak Date: Wed, 20 Jan 2021 12:52:34 +0900 Subject: [PATCH 4626/8103] fix timing of request_latency --- tensorflow_serving/model_servers/http_server.cc | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/tensorflow_serving/model_servers/http_server.cc b/tensorflow_serving/model_servers/http_server.cc index a113eca81f9..91e2f85cf3d 100644 --- a/tensorflow_serving/model_servers/http_server.cc +++ b/tensorflow_serving/model_servers/http_server.cc @@ -169,17 +169,15 @@ class RestApiRequestDispatcher { req->OverwriteResponseHeader(kv.first, kv.second); } req->WriteResponseString(output); - if (http_status != net_http::HTTPStatusCode::OK) { - VLOG(1) << "Error Processing HTTP/REST request: " << req->http_method() - << " " << req->uri_path() << " Error: " << status.ToString(); - } - req->ReplyWithStatus(http_status); - if (http_status == net_http::HTTPStatusCode::OK) { RecordRequestLatency(model_name, /*api=*/method, /*entrypoint=*/"REST", Env::Default()->NowMicros() - start); + } else { + VLOG(1) << "Error Processing HTTP/REST request: " << req->http_method() + << " " << req->uri_path() << " Error: " << status.ToString(); } RecordModelRequestCount(model_name, status); + req->ReplyWithStatus(http_status); } const RE2 regex_; From 6254411fa3183ef51b46216a54f71675afe5b735 Mon Sep 17 00:00:00 2001 From: skawasak Date: Wed, 20 Jan 2021 14:53:04 +0900 Subject: [PATCH 4627/8103] fix http_rest_api_handler_test --- tensorflow_serving/model_servers/http_rest_api_handler_test.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/model_servers/http_rest_api_handler_test.cc b/tensorflow_serving/model_servers/http_rest_api_handler_test.cc index 8b7e3e46cb7..82147f4b92b 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler_test.cc +++ b/tensorflow_serving/model_servers/http_rest_api_handler_test.cc @@ -454,7 +454,7 @@ TEST_F(HttpRestApiHandlerTest, GetStatus) { // Get status for all versions. TF_EXPECT_OK(handler_.ProcessRequest( "GET", absl::StrCat("/v1/models/", kTestModelName), "", &headers, - &output)); + &model_name, &method, &output)); EXPECT_THAT(headers, UnorderedElementsAreArray( (HeaderList){{"Content-Type", "application/json"}})); TF_EXPECT_OK(CompareJson(output, R"({ From 82f61c9d0b5382e239470e92fb0b2aef4dfd3b79 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Jan 2021 00:01:26 -0800 Subject: [PATCH 4628/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/176c3d8a-381a-413f-ac5e-209bcb8eff4c PiperOrigin-RevId: 352734429 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8af19f8a459..6a03c08df5c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "357396a450a7628043534fa6813a11f96887ec8254c63f8a07776b6eca4bce9f", - git_commit = "71a03b46034bbb9f1fc0ee7f4028dd82ba77ee64", + sha256 = "786a63273f86e8a26c41d96d50b80b0661a00a7d0b6b1ea40d6215ba1bd322db", + git_commit = "473d70ed4ee455b41bbbc74f71bf094411bcf783", ) # Import all of TensorFlow Serving's external dependencies. From dfa8c9e7c285da42972530165b73849a8e009c50 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Jan 2021 06:01:38 -0800 Subject: [PATCH 4629/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7d469f68-791a-45f9-8169-8390a73ffeee PiperOrigin-RevId: 352777663 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6a03c08df5c..e37b9b4562e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "786a63273f86e8a26c41d96d50b80b0661a00a7d0b6b1ea40d6215ba1bd322db", - git_commit = "473d70ed4ee455b41bbbc74f71bf094411bcf783", + sha256 = "8a3b979cfee42d9e79dc6f4f4ac803e1dd0b38e8fdfc98e88b0e9d0f8bac883c", + git_commit = "eabc82e07f2e03cf4fd4d38900c7696d16069181", ) # Import all of TensorFlow Serving's external dependencies. From 6b23fa8ed8101c37e8f6291d9924170b7a66a5ce Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Jan 2021 12:01:44 -0800 Subject: [PATCH 4630/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a4183ee8-e0c0-48ae-8cb1-6d2d13859882 PiperOrigin-RevId: 352844048 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e37b9b4562e..3e13504f602 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8a3b979cfee42d9e79dc6f4f4ac803e1dd0b38e8fdfc98e88b0e9d0f8bac883c", - git_commit = "eabc82e07f2e03cf4fd4d38900c7696d16069181", + sha256 = "1fc5a4f18313f6c0794dcb5c89d606049a42d35824245dfacd7b22bca6e8a4da", + git_commit = "a801850cccd0ad1bf85b211ca2a902f1d85ebc59", ) # Import all of TensorFlow Serving's external dependencies. From 0536678a05073feaa3f2815cb9012abd7a86907a Mon Sep 17 00:00:00 2001 From: Robert Crowe Date: Wed, 20 Jan 2021 13:45:54 -0800 Subject: [PATCH 4631/8103] Clarifying object values in REST requests to include B64 encoding and similar key:value pair objects. PiperOrigin-RevId: 352866850 --- tensorflow_serving/g3doc/api_rest.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tensorflow_serving/g3doc/api_rest.md b/tensorflow_serving/g3doc/api_rest.md index b3d6875f8c1..5edd203aa59 100644 --- a/tensorflow_serving/g3doc/api_rest.md +++ b/tensorflow_serving/g3doc/api_rest.md @@ -112,9 +112,9 @@ formatted as follows: } ``` -`` is a JSON number (whole or decimal) or string, and `` is a list -of such values. See [Encoding binary values](#encoding-binary-values) section -below for details on how to represent a binary (stream of bytes) value. This +`` is a JSON number (whole or decimal), JSON string, or a JSON object +that represents binary data (see the [Encoding binary values](#encoding-binary-values) +section below for details). `` is a list of such values. This format is similar to gRPC's `ClassificationRequest` and `RegressionRequest` protos. Both versions accept list of [`Example`](https://github.com/tensorflow/tensorflow/blob/92e6c3e4f5c1cabfda1e61547a6a1b268ef95fa5/tensorflow/core/example/example.proto#L13) From e813eb02260a866f96b971f38c35efdcb0181afc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Jan 2021 18:01:26 -0800 Subject: [PATCH 4632/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2e4eaf64-c754-47ea-abc5-002318641097 PiperOrigin-RevId: 352915776 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3e13504f602..067f9a9cc91 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1fc5a4f18313f6c0794dcb5c89d606049a42d35824245dfacd7b22bca6e8a4da", - git_commit = "a801850cccd0ad1bf85b211ca2a902f1d85ebc59", + sha256 = "171eba98bc75ff6a5d4f1b330c7063fdb1561501ec66331872585a0eaaf5e87d", + git_commit = "a60a884eabb7e97cba31fd405495a5c7ac70ad5a", ) # Import all of TensorFlow Serving's external dependencies. From ab7f9a5e4946d8be08b135d18ac8172a1b494e05 Mon Sep 17 00:00:00 2001 From: Terry Heo Date: Wed, 20 Jan 2021 22:06:45 -0800 Subject: [PATCH 4633/8103] Remove experimental comment on TfLiteSession TfLiteSession is ready for production workloads. PiperOrigin-RevId: 352944723 --- tensorflow_serving/servables/tensorflow/tflite_session.h | 1 - 1 file changed, 1 deletion(-) diff --git a/tensorflow_serving/servables/tensorflow/tflite_session.h b/tensorflow_serving/servables/tensorflow/tflite_session.h index 368fc3a228e..f95f4c1b0da 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session.h +++ b/tensorflow_serving/servables/tensorflow/tflite_session.h @@ -36,7 +36,6 @@ namespace serving { // A session to run inference on a TensorFlow Lite model. // -// EXPERIMENTAL: DO NOT use for production workloads. class TfLiteSession : public ServingSession { public: // Creates a TfLiteSession object from `buffer` representing serialized From 20fe3ca4f292b1ae575217ecb69981d59addc720 Mon Sep 17 00:00:00 2001 From: David Rim Date: Wed, 20 Jan 2021 23:54:22 -0800 Subject: [PATCH 4634/8103] Register custom TfLite ParseExample and add benchmark PiperOrigin-RevId: 352955964 --- tensorflow_serving/servables/tensorflow/BUILD | 3 + .../servables/tensorflow/testdata/BUILD | 21 ++++ .../testdata/parse_example_tflite.README | 22 ++++ .../testdata/parse_example_tflite.py | 110 ++++++++++++++++++ .../00000123/model.tflite | Bin 0 -> 1792 bytes .../tensorflow/tflite_interpreter_pool.cc | 2 + .../servables/tensorflow/tflite_session.cc | 61 ++++++---- .../tensorflow/tflite_session_test.cc | 52 +++++++++ 8 files changed, 248 insertions(+), 23 deletions(-) create mode 100644 tensorflow_serving/servables/tensorflow/testdata/parse_example_tflite.README create mode 100644 tensorflow_serving/servables/tensorflow/testdata/parse_example_tflite.py create mode 100644 tensorflow_serving/servables/tensorflow/testdata/parse_example_tflite/00000123/model.tflite diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index 9ed09c2d3a5..8350bfdf6db 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -331,9 +331,11 @@ cc_library( "@org_tensorflow//tensorflow/lite:framework", "@org_tensorflow//tensorflow/lite:string_util", "@org_tensorflow//tensorflow/lite:util", + "@org_tensorflow//tensorflow/lite/c:common", "@org_tensorflow//tensorflow/lite/delegates/flex:delegate", "@org_tensorflow//tensorflow/lite/kernels:builtin_ops", "@org_tensorflow//tensorflow/lite/kernels/hashtable:hashtable_op_kernels", + "@org_tensorflow//tensorflow/lite/kernels/parse_example", "@org_tensorflow//tensorflow/lite/tools/signature:signature_def_util", ], ) @@ -344,6 +346,7 @@ cc_test( srcs = ["tflite_session_test.cc"], data = [ "//tensorflow_serving/servables/tensorflow/testdata:mobilenet_v1_quant_tflite", + "//tensorflow_serving/servables/tensorflow/testdata:parse_example_tflite", "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_tflite", "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_tflite_with_sigdef", ], diff --git a/tensorflow_serving/servables/tensorflow/testdata/BUILD b/tensorflow_serving/servables/tensorflow/testdata/BUILD index 59e84f3fa99..cc449b042d5 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/BUILD +++ b/tensorflow_serving/servables/tensorflow/testdata/BUILD @@ -76,6 +76,20 @@ py_binary( ], ) +py_binary( + name = "parse_example_tflite_with_string", + srcs = [ + "parse_example_tflite.py", + ], + main = "parse_example_tflite.py", + python_version = "PY3", + srcs_version = "PY3", + deps = [ + "@org_tensorflow//tensorflow:tensorflow_py", + "@org_tensorflow//tensorflow/lite/tools/signature:signature_def_utils", + ], +) + filegroup( name = "saved_model_half_plus_two_cpu", srcs = glob( @@ -146,6 +160,13 @@ filegroup( ), ) +filegroup( + name = "parse_example_tflite", + srcs = glob( + ["parse_example_tflite/**"], + ), +) + exports_files([ "saved_model_half_plus_three/00000123/saved_model.pb", "saved_model_half_plus_three/00000123/assets/foo.txt", diff --git a/tensorflow_serving/servables/tensorflow/testdata/parse_example_tflite.README b/tensorflow_serving/servables/tensorflow/testdata/parse_example_tflite.README new file mode 100644 index 00000000000..d3fcb3d8d85 --- /dev/null +++ b/tensorflow_serving/servables/tensorflow/testdata/parse_example_tflite.README @@ -0,0 +1,22 @@ +# Copyright 2021 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +This model is used to test TFLite parse example operations for tflite_session +and is updated using +```sh +bazel run -c opt parse_example_tflite_with_string +cp /tmp/parse_example_tflite parse_example_tflite/00000123/model.tflite +``` + diff --git a/tensorflow_serving/servables/tensorflow/testdata/parse_example_tflite.py b/tensorflow_serving/servables/tensorflow/testdata/parse_example_tflite.py new file mode 100644 index 00000000000..dd389f74b67 --- /dev/null +++ b/tensorflow_serving/servables/tensorflow/testdata/parse_example_tflite.py @@ -0,0 +1,110 @@ +## Copyright 2021 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +r"""Exports a simple graph with parse example with a string feature. + +Exports a TFLite flatbufer to `/tmp/parse_example_tflite/model.tflite`. + +This graph simply parses an example with a simple feature_spec + {"x": tf.float32[1], "y": tf.string[1]} + +\\( + out = tf.parse_example(x, feature_spec) + return out["x"], out["y"] +\\) + +Output from this program is typically used to exercise TFLite ParseExample +execution. + +To create a model: + bazel run -c opt parse_example_tflite_with_string +""" +import argparse +import sys + +# This is a placeholder for a Google-internal import. +import tensorflow.compat.v1 as tf + +from tensorflow.lite.tools.signature import signature_def_utils + +FLAGS = None + + +def _get_feature_spec(): + """Returns feature spec for parsing tensorflow.Example.""" + # tensorflow.Example contains two features "x" and "y", where y is a string. + return { + "x": tf.FixedLenFeature([1], dtype=tf.float32, default_value=[0.0]), + "y": tf.FixedLenFeature([1], dtype=tf.string, default_value=["missing"]) + } + + +def _build_predict_signature(input_tensor, output_tensor_x, output_tensor_y): + """Helper function for building a predict SignatureDef.""" + input_tensor_info = tf.saved_model.utils.build_tensor_info(input_tensor) + signature_inputs = {"input": input_tensor_info} + + output_tensor_info_x = tf.saved_model.utils.build_tensor_info(output_tensor_x) + output_tensor_info_y = tf.saved_model.utils.build_tensor_info(output_tensor_y) + signature_outputs = {"ParseExample/ParseExampleV2": output_tensor_info_x, + "ParseExample/ParseExampleV2:1": output_tensor_info_y} + return tf.saved_model.signature_def_utils.build_signature_def( + signature_inputs, signature_outputs, + tf.saved_model.signature_constants.PREDICT_METHOD_NAME) + + +def _generate_tflite_for_parse_example_with_string(export_dir): + """Generates TFLite flatbuffer for parse example with string. + + Args: + export_dir: The directory to which the flatbuffer should be written. + """ + with tf.Session( + graph=tf.Graph(), + config=tf.ConfigProto(log_device_placement=True)) as sess: + serialized_tf_example = tf.placeholder( + tf.string, name="input", shape=[None]) + tf_example = tf.parse_example(serialized_tf_example, + _get_feature_spec()) + converter = tf.lite.TFLiteConverter.from_session( + sess, [serialized_tf_example], [tf_example["x"], tf_example["y"]]) + converter.target_spec.supported_ops = [ + tf.lite.OpsSet.TFLITE_BUILTINS, tf.lite.OpsSet.SELECT_TF_OPS + ] + tflite_model = converter.convert() + predict_signature_def = _build_predict_signature(serialized_tf_example, + tf_example["x"], + tf_example["y"]) + k = tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY + tflite_model = signature_def_utils.set_signature_defs( + tflite_model, {k: predict_signature_def}) + open(export_dir + "/model.tflite", "wb").write(tflite_model) + + +def main(_): + _generate_tflite_for_parse_example_with_string(FLAGS.output_dir) + print("TFLite model generated at: %(dir)s" % { + "dir": FLAGS.output_dir + }) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "--output_dir", + type=str, + default="/tmp/parse_example_tflite", + help="Directory where to output model in TensorFlow Lite format.") + FLAGS, unparsed = parser.parse_known_args() + tf.compat.v1.app.run(main=main, argv=[sys.argv[0]] + unparsed) diff --git a/tensorflow_serving/servables/tensorflow/testdata/parse_example_tflite/00000123/model.tflite b/tensorflow_serving/servables/tensorflow/testdata/parse_example_tflite/00000123/model.tflite new file mode 100644 index 0000000000000000000000000000000000000000..831eb985bcd45f378acc4a2df8e2c98fb108faf3 GIT binary patch literal 1792 zcmah~OKTHR6h0aAa*T001}teS0Yys?lSUVkRY5HZ6+~-RLKvKBI+#pCW)jo?;KHR# z7cPrS*KP$DU5VgQa3{DZB3K>2Zyt6M+IquxALril-E+@lvM3@OYwOoUbXkh; zYdE%@4sSL_T~EHL7u1aH3`U+_R&&9mS=Vyq)B34A%nn;hf21zmH-@ftdt&qkU8|N{ zv>MG7{rZ0nfO2k{QpuTHq;)NI2x+GPdt&7 zC@Dor{U|9H;f=73@k;tfiv>rF<}cq*Zh6uAZKTgwk+cAWadTbxT0Tbmyo2p)v}TOi z;!z}vc^Z8fH|7`fh<42ZTu-*qMQv}!p7j2KeP?jy-um4Km79GBIpbO8)xb7pu1FEt zdyvaTNCq(61eiBGLtBZSVLKT9>1u&B)MaBWph4$52A=-{6q7M+HRQcMBPmPrSJl+) zhKZP2dR9$0lvJ*&s|9z!d~18#1IyJFRjTuiSl&Zq|k za_P#vRL`r0;HtK}Wste37Mf`txfu41rDHQvl+PbZr8EkQamfITRSsaIjDS0Wk>3XT zBzcy5Y}8rC#ybce0~KHwvI#()JZct0<_DW0d+b{n}( z`v~S}DfC2OC3BQK)Q@@gj^cq6W1csW4Xe;&JYwBCHEK}`!ZJ6q2?{~& z #include "tensorflow/lite/kernels/hashtable/hashtable_ops.h" +#include "tensorflow/lite/kernels/parse_example/parse_example.h" #include "tensorflow/lite/kernels/register.h" namespace tensorflow { @@ -32,6 +33,7 @@ Status TfLiteInterpreterPool::CreateTfLiteInterpreterPool( tflite::ops::builtin::BuiltinOpResolver resolver; // TODO(b/165643512): Remove adding Hashtable to resolver by default. tflite::ops::custom::AddHashtableOps(&resolver); + tflite::ops::custom::AddParseExampleOp(&resolver); num_interpreters = std::max(num_interpreters, 1); std::vector> interpreters; diff --git a/tensorflow_serving/servables/tensorflow/tflite_session.cc b/tensorflow_serving/servables/tensorflow/tflite_session.cc index 26590ea98c9..7f90b0db8b5 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session.cc @@ -22,6 +22,7 @@ limitations under the License. #include "tensorflow/cc/saved_model/signature_constants.h" #include "tensorflow/core/framework/tensor_shape.pb.h" #include "tensorflow/core/lib/core/errors.h" +#include "tensorflow/lite/c/common.h" #include "tensorflow/lite/kernels/register.h" #include "tensorflow/lite/string_util.h" #include "tensorflow/lite/tools/signature/signature_def_util.h" @@ -151,26 +152,44 @@ Status FillTfLiteTensorFromInput(const string& name, const Tensor& tensor, return errors::InvalidArgument("Failed to get TFLite tensor: ", name, " at index: ", index); } - if (tflite_tensor->type != kTfLiteString) { - auto tensor_bytes = tensor.tensor_data(); - if (tensor_bytes.size() != tflite_tensor->bytes) { - // Slow path: needs resize+realloc. - // TODO(b/140959776): Reduce the chance of taking this path by either - // having multiple instances of interpreter or sub-graphs for commonly - // used input sizes. - if (interpreter->ResizeInputTensor(index, TensorDims(tensor)) != - kTfLiteOk) { - return errors::Internal("Failed to resize input tensor: ", name, - " from ", tflite_tensor->bytes, " to ", - tensor_bytes.size(), " bytes."); - } - if (interpreter->AllocateTensors() != kTfLiteOk) { - return errors::Internal( - "Failed to AllocateTensors() due to change in input tensor ", name, - " size from ", tflite_tensor->bytes, " to ", tensor_bytes.size(), - " bytes."); - } + + // Fast check for resize and reallocate for non-string data. + const auto& tensor_bytes = tensor.tensor_data(); + bool needs_resize_and_realloc = (tflite_tensor->type != kTfLiteString) && + (tensor_bytes.size() != tflite_tensor->bytes); + + TfLiteIntArray* dims_array = nullptr; + if (tflite_tensor->type == kTfLiteString) { + // Slow check for string inputs. + dims_array = TfLiteIntArrayCreate(tensor.dims()); + for (int i = 0; i < tensor.dims(); ++i) { + dims_array->data[i] = static_cast(tensor.dim_size(i)); + } + const TfLiteIntArray* previous_dims_array = tflite_tensor->dims; + needs_resize_and_realloc = + !TfLiteIntArrayEqual(dims_array, previous_dims_array); + } + + if (needs_resize_and_realloc) { + // Slow path: needs resize+realloc. + // TODO(b/140959776): Reduce the chance of taking this path by either + // having multiple instances of interpreter or sub-graphs for commonly + // used input sizes. + if (interpreter->ResizeInputTensor(index, TensorDims(tensor)) != + kTfLiteOk) { + return errors::Internal("Failed to resize input tensor: ", name, " from ", + tflite_tensor->bytes, " to ", tensor_bytes.size(), + " bytes."); + } + if (interpreter->AllocateTensors() != kTfLiteOk) { + return errors::Internal( + "Failed to AllocateTensors() due to change in input tensor ", name, + " size from ", tflite_tensor->bytes, " to ", tensor_bytes.size(), + " bytes."); } + } + + if (tflite_tensor->type != kTfLiteString) { std::memcpy(tflite_tensor->data.raw, tensor_bytes.data(), tensor_bytes.size()); } else { @@ -179,10 +198,6 @@ Status FillTfLiteTensorFromInput(const string& name, const Tensor& tensor, for (int i = 0; i < tensor_vec.size(); i++) { buf.AddString(tensor_vec(i).data(), tensor_vec(i).size()); } - TfLiteIntArray* dims_array = TfLiteIntArrayCreate(tensor.dims()); - for (int i = 0; i < tensor.dims(); i++) { - dims_array->data[i] = static_cast(tensor.dim_size(i)); - } // WriteToTensor() takes ownership of dims_array. buf.WriteToTensor(tflite_tensor, dims_array); } diff --git a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc index 89f552092fc..abc1a65d122 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc @@ -24,6 +24,8 @@ limitations under the License. #include "absl/flags/flag.h" #include "flatbuffers/flexbuffers.h" #include "tensorflow/cc/saved_model/signature_constants.h" +#include "tensorflow/core/example/example.pb.h" +#include "tensorflow/core/example/feature.pb.h" #include "tensorflow/core/framework/attr_value.pb.h" #include "tensorflow/core/framework/node_def.pb.h" #include "tensorflow/core/framework/tensor_testutil.h" @@ -65,6 +67,10 @@ constexpr char kMobileNetModel[] = "/servables/tensorflow/testdata/mobilenet_v1_quant_tflite/00000123/" "model.tflite"; +constexpr char kParseExampleModel[] = + "/servables/tensorflow/testdata/parse_example_tflite/00000123/" + "model.tflite"; + TEST(TfLiteSession, BasicTest) { string model_bytes; TF_ASSERT_OK(ReadFileToString(tensorflow::Env::Default(), @@ -650,6 +656,52 @@ void BM_MobileNet(benchmark::State& state) { } BENCHMARK(BM_MobileNet)->ThreadRange(1, 64); +void BM_ParseExample(benchmark::State& state) { + static TfLiteSession* session; + if (state.thread_index() == 0) { + string model_bytes; + TF_ASSERT_OK(ReadFileToString(Env::Default(), + test_util::TestSrcDirPath(kParseExampleModel), + &model_bytes)); + ::google::protobuf::Map signatures; + std::unique_ptr sess; + tensorflow::SessionOptions options; + TF_ASSERT_OK( + TfLiteSession::Create(std::move(model_bytes), &sess, &signatures, + absl::GetFlag(FLAGS_num_tflite_interpreters))); + session = sess.release(); + } + const int kBatchSize = 500; + std::vector example_list; + std::mt19937 random_engine; + auto random_func = [&]() { + return std::uniform_real_distribution(-0.5, 0.5)(random_engine); + }; + for (int i = 0; i < kBatchSize; i++) { + float val = random_func(); + tensorflow::Example example; + std::string str; + auto* features = example.mutable_features(); + (*features->mutable_feature())["x"].mutable_float_list()->add_value(val); + (*features->mutable_feature())["y"].mutable_bytes_list()->add_value("Test"); + example.SerializeToString(&str); + example_list.push_back(str); + } + + Tensor input_batch = + test::AsTensor(example_list, TensorShape({kBatchSize})); + std::vector outputs; + testing::UseRealTime(); + for (auto _ : state) { + outputs.clear(); + TF_ASSERT_OK(session->Run( + {{"input", input_batch}}, + {"ParseExample/ParseExampleV2", "ParseExample/ParseExampleV2:1"}, {}, + &outputs)); + } +} +BENCHMARK(BM_ParseExample)->ThreadRange(1, 64); + #endif // PLATFORM_GOOGLE } // namespace From 7e5df55e8563f1b2b34e91a83e2cb43aac7048e1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Jan 2021 00:01:38 -0800 Subject: [PATCH 4635/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9c220817-e642-4f23-b7fb-ed04050537c4 PiperOrigin-RevId: 352956881 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 067f9a9cc91..887892ddb25 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "171eba98bc75ff6a5d4f1b330c7063fdb1561501ec66331872585a0eaaf5e87d", - git_commit = "a60a884eabb7e97cba31fd405495a5c7ac70ad5a", + sha256 = "81424386c7b22605742b2d28784adf3492fd79fe8b1d7221cdc1ed343242b12a", + git_commit = "4f56ac2f1b8a2a717059801f7aef8b4c3a30a100", ) # Import all of TensorFlow Serving's external dependencies. From 7e72ec9609eae081f5c07e1fabe6f5635c37f6e9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Jan 2021 06:01:19 -0800 Subject: [PATCH 4636/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c8aca462-03e8-477c-83df-b7f49bfffbc2 PiperOrigin-RevId: 353002211 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 887892ddb25..e032f9ffde2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "81424386c7b22605742b2d28784adf3492fd79fe8b1d7221cdc1ed343242b12a", - git_commit = "4f56ac2f1b8a2a717059801f7aef8b4c3a30a100", + sha256 = "de9c3b49ad9b8031e4f43945589b1a015c63d45957ac473e114aa3caa5c5e86f", + git_commit = "c78647ccd1d2ada2eb20a8fec7e6b38412f3ca46", ) # Import all of TensorFlow Serving's external dependencies. From 91fb4455042bb5a43c708bb103838591ee622cde Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Jan 2021 12:01:45 -0800 Subject: [PATCH 4637/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d7568b19-2ed7-445e-b1d0-f640b1f68ce0 PiperOrigin-RevId: 353070066 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e032f9ffde2..85fec98d986 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "de9c3b49ad9b8031e4f43945589b1a015c63d45957ac473e114aa3caa5c5e86f", - git_commit = "c78647ccd1d2ada2eb20a8fec7e6b38412f3ca46", + sha256 = "a17b424fb5cc5bd7b50846c1969e05fa023f7420f2def28a55fcc576315b72cf", + git_commit = "d8bd2943256d5b7be585cbd45833ab24c509eee3", ) # Import all of TensorFlow Serving's external dependencies. From 6e4da597a47344a8b462e539b65a741249f47adb Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Thu, 21 Jan 2021 15:30:21 -0800 Subject: [PATCH 4638/8103] Internal change. PiperOrigin-RevId: 353116952 --- .../model_servers/test_util/server_core_test_util.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tensorflow_serving/model_servers/test_util/server_core_test_util.h b/tensorflow_serving/model_servers/test_util/server_core_test_util.h index 102bdc3acb2..b9b7b035446 100644 --- a/tensorflow_serving/model_servers/test_util/server_core_test_util.h +++ b/tensorflow_serving/model_servers/test_util/server_core_test_util.h @@ -26,6 +26,17 @@ namespace tensorflow { namespace serving { namespace test_util { +// A test utility that provides access to private ServerCore members. +class ServerCoreTestAccess { + public: + explicit ServerCoreTestAccess(ServerCore* core) : core_(core) {} + + ServerCore::Options* mutable_options() { return &core_->options_; } + + private: + ServerCore* const core_; +}; + constexpr char kTestModelName[] = "test_model"; constexpr int kTestModelVersion = 123; constexpr int kTestModelLargerVersion = 124; From 539ff33039ff786ae2f9a8c71df386795a24cbb0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Jan 2021 18:01:13 -0800 Subject: [PATCH 4639/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b97e825f-d101-455f-b22e-524abb50a860 PiperOrigin-RevId: 353144348 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 85fec98d986..8f8dbbeb09c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a17b424fb5cc5bd7b50846c1969e05fa023f7420f2def28a55fcc576315b72cf", - git_commit = "d8bd2943256d5b7be585cbd45833ab24c509eee3", + sha256 = "ceac7f08e08f58a15439d7d8bc04a317d9b6e37a271870f845b6315144204074", + git_commit = "4fa4184a5a454eceb5b567c8b3c4fce46faf2de8", ) # Import all of TensorFlow Serving's external dependencies. From 12ecfcf11edf959782b132eb95e47c88b246c90d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Jan 2021 00:01:23 -0800 Subject: [PATCH 4640/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/374cb10e-1abb-413d-9a7d-2d72e97c1d09 PiperOrigin-RevId: 353184129 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8f8dbbeb09c..0b512da1c93 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ceac7f08e08f58a15439d7d8bc04a317d9b6e37a271870f845b6315144204074", - git_commit = "4fa4184a5a454eceb5b567c8b3c4fce46faf2de8", + sha256 = "0b5a37057cfd7a09adc79d921af5dfde0b5f50ea539ac923695c41a3505f82d5", + git_commit = "5c545e646ce54934e92ea59a24ff9bcfe52991df", ) # Import all of TensorFlow Serving's external dependencies. From f32fa2245cafc942e8759be8f01b040709d7832b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Jan 2021 06:03:05 -0800 Subject: [PATCH 4641/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/533eba9c-7244-4e5d-954a-7b8717af20d2 PiperOrigin-RevId: 353226976 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0b512da1c93..af504d2464c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0b5a37057cfd7a09adc79d921af5dfde0b5f50ea539ac923695c41a3505f82d5", - git_commit = "5c545e646ce54934e92ea59a24ff9bcfe52991df", + sha256 = "fd3dfd97daae69fb29f30197360d89d05b343897b22c48aa37ae15368a23b79d", + git_commit = "7fa31853f66a5b7d0b062eca69a7e256b08615a6", ) # Import all of TensorFlow Serving's external dependencies. From 5a819aa07f313101bc55ff33394b50632fd11a6c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Jan 2021 12:01:35 -0800 Subject: [PATCH 4642/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/973b075d-456f-4207-a409-b90de78e9ccd PiperOrigin-RevId: 353290111 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index af504d2464c..5875cd1c68c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fd3dfd97daae69fb29f30197360d89d05b343897b22c48aa37ae15368a23b79d", - git_commit = "7fa31853f66a5b7d0b062eca69a7e256b08615a6", + sha256 = "3cac90c4e8e42a4a093a7dd3ed11f7777afde07e32e9e94e8fdef43d8e5539be", + git_commit = "e110426b1f6bed965239867c4ebae6b7db9bc279", ) # Import all of TensorFlow Serving's external dependencies. From b73bd7b5f9cce14a28c15a52f683d32a81773700 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Fri, 22 Jan 2021 16:02:58 -0800 Subject: [PATCH 4643/8103] Use respectful terms. PiperOrigin-RevId: 353336795 --- .../file_system_storage_path_source_test.cc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tensorflow_serving/sources/storage_path/file_system_storage_path_source_test.cc b/tensorflow_serving/sources/storage_path/file_system_storage_path_source_test.cc index 7f812a69ff2..5caf40e3d57 100644 --- a/tensorflow_serving/sources/storage_path/file_system_storage_path_source_test.cc +++ b/tensorflow_serving/sources/storage_path/file_system_storage_path_source_test.cc @@ -670,14 +670,14 @@ TEST(FileSystemStoragePathSourceTest, ServableVersionDirRenamed) { TF_ASSERT_OK(internal::FileSystemStoragePathSourceTestAccess(source.get()) .PollFileSystemAndInvokeCallback()); - // Blacklist version 2 and 5 by renaming corresponding directories. - // Blacklist version 8 by removing the directory alltogether. - TF_ASSERT_OK(Env::Default()->RenameFile( - io::JoinPath(base_path_prefix, "2"), - io::JoinPath(base_path_prefix, "2.blacklisted"))); - TF_ASSERT_OK(Env::Default()->RenameFile( - io::JoinPath(base_path_prefix, "5"), - io::JoinPath(base_path_prefix, "5.blacklisted"))); + // Deny version 2 and 5 by renaming corresponding directories. + // Deny version 8 by removing the directory alltogether. + TF_ASSERT_OK( + Env::Default()->RenameFile(io::JoinPath(base_path_prefix, "2"), + io::JoinPath(base_path_prefix, "2.denied"))); + TF_ASSERT_OK( + Env::Default()->RenameFile(io::JoinPath(base_path_prefix, "5"), + io::JoinPath(base_path_prefix, "5.denied"))); TF_ASSERT_OK(Env::Default()->DeleteDir(io::JoinPath(base_path_prefix, "8"))); EXPECT_CALL( From c2b6e240f1cf5ac1d1e72f30c30c63bf3fd3ea6e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Jan 2021 18:01:23 -0800 Subject: [PATCH 4644/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6e7de481-cc8a-4b9e-82f7-5ab5ae81d5b0 PiperOrigin-RevId: 353354112 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5875cd1c68c..b7b0488c903 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3cac90c4e8e42a4a093a7dd3ed11f7777afde07e32e9e94e8fdef43d8e5539be", - git_commit = "e110426b1f6bed965239867c4ebae6b7db9bc279", + sha256 = "e380cee649b6e3851c0770df214629858dfd5807392e8420a5568c351793d6f3", + git_commit = "697f117f36176fc5d07c0b37d1b17b9d7e3a3bc9", ) # Import all of TensorFlow Serving's external dependencies. From 3c2acf2a7945d0d0c686c139d7c7d570944ca4b7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 23 Jan 2021 00:01:33 -0800 Subject: [PATCH 4645/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6edef1ee-b943-4bac-9c7b-8be20bf88849 PiperOrigin-RevId: 353382717 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b7b0488c903..578dd7a69fd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e380cee649b6e3851c0770df214629858dfd5807392e8420a5568c351793d6f3", - git_commit = "697f117f36176fc5d07c0b37d1b17b9d7e3a3bc9", + sha256 = "b8cd31c1a15dc8032ea72becd394a7ed6710ed6f11b8d0fb9e0f529e9751e33b", + git_commit = "98e48ecca3cfd906c23756b4b4191da1b0784dd0", ) # Import all of TensorFlow Serving's external dependencies. From 8937064e378340351bf4526801e9f79f0eb31923 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 23 Jan 2021 06:01:13 -0800 Subject: [PATCH 4646/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ba8d2c8f-5f14-4fff-bb6c-6a52dbdbbbdd PiperOrigin-RevId: 353406852 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 578dd7a69fd..436e37776d9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b8cd31c1a15dc8032ea72becd394a7ed6710ed6f11b8d0fb9e0f529e9751e33b", - git_commit = "98e48ecca3cfd906c23756b4b4191da1b0784dd0", + sha256 = "b84330e9ef9b45aca3099666d7b216c14088f348abb7888c298989e5596c7559", + git_commit = "48a4bf66915142642746b9179a90c636a0851af0", ) # Import all of TensorFlow Serving's external dependencies. From 20a1f6e6425276cb26229d24e41fb3552e5fc6a6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 24 Jan 2021 06:01:29 -0800 Subject: [PATCH 4647/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e80e2c5a-7a5e-426d-914d-c449e1bead52 PiperOrigin-RevId: 353505333 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 436e37776d9..ed69679c9b1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b84330e9ef9b45aca3099666d7b216c14088f348abb7888c298989e5596c7559", - git_commit = "48a4bf66915142642746b9179a90c636a0851af0", + sha256 = "b81379ce748af1f7e02b0cbeac3c859381ec4af2db58dcc2216908e07a003e52", + git_commit = "7c4bd4669bdbf66278c56fe6cd0d0b749732099b", ) # Import all of TensorFlow Serving's external dependencies. From 14c6729190d1c4f6301b4f9e89dc0d31e212fa59 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 24 Jan 2021 12:01:26 -0800 Subject: [PATCH 4648/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/02e7fd77-7ede-4af5-b7ba-c286934ee63c PiperOrigin-RevId: 353530130 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ed69679c9b1..b694f8df8b2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b81379ce748af1f7e02b0cbeac3c859381ec4af2db58dcc2216908e07a003e52", - git_commit = "7c4bd4669bdbf66278c56fe6cd0d0b749732099b", + sha256 = "d372dcc4f9a4595d0a777a81cbe011b60b001fcf5bb95de1212be1fc61e792a3", + git_commit = "ad4f87b0b4eb4a95dc3b95a1e8e43d7c4479d606", ) # Import all of TensorFlow Serving's external dependencies. From 54203cb2281ea738f95445606141cba9886c824c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 24 Jan 2021 18:01:32 -0800 Subject: [PATCH 4649/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/38ddad0d-5691-48a8-8a5c-645ca8d6b734 PiperOrigin-RevId: 353555793 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b694f8df8b2..1ca54dab5dd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d372dcc4f9a4595d0a777a81cbe011b60b001fcf5bb95de1212be1fc61e792a3", - git_commit = "ad4f87b0b4eb4a95dc3b95a1e8e43d7c4479d606", + sha256 = "f89bb902aab92c03279545099a16b2f47da4e5c5c8b884443da999a564e1d288", + git_commit = "1e66b5790c93a1752fd8ea92a146aff811f2ee95", ) # Import all of TensorFlow Serving's external dependencies. From 1d061805d84dbc412bb140e52a6c524beea2c15f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Jan 2021 00:01:24 -0800 Subject: [PATCH 4650/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b2831b8a-6a77-4015-87c9-5ccebec099a5 PiperOrigin-RevId: 353588293 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1ca54dab5dd..5e5646da5a1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f89bb902aab92c03279545099a16b2f47da4e5c5c8b884443da999a564e1d288", - git_commit = "1e66b5790c93a1752fd8ea92a146aff811f2ee95", + sha256 = "30cba76faaf4f9c5f1032ecd0fbc9ae3408c3f64c339f180f40d14c895af909a", + git_commit = "7d5d7d6ecb5aee76cb720a6518f2981872c225bc", ) # Import all of TensorFlow Serving's external dependencies. From fc6791858953bfb6c0124075bebfd490d1325faf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Jan 2021 06:01:28 -0800 Subject: [PATCH 4651/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/874fe3e4-a399-4919-8e28-465b61bc77cd PiperOrigin-RevId: 353630452 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5e5646da5a1..75b9e3426f0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "30cba76faaf4f9c5f1032ecd0fbc9ae3408c3f64c339f180f40d14c895af909a", - git_commit = "7d5d7d6ecb5aee76cb720a6518f2981872c225bc", + sha256 = "a4621e8f74f7835ac58c41febd260ec0f579dfecedcf2ed647b320837216c6c3", + git_commit = "5058eacec08e41764b0e1a5807292dc21452e063", ) # Import all of TensorFlow Serving's external dependencies. From 6ecfa82fa01d38bdc97226e61508434134db161e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Jan 2021 12:01:32 -0800 Subject: [PATCH 4652/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/55816f61-b6a6-4b89-8bd2-92bf5ec8b372 PiperOrigin-RevId: 353698886 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 75b9e3426f0..d3b3499b83e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a4621e8f74f7835ac58c41febd260ec0f579dfecedcf2ed647b320837216c6c3", - git_commit = "5058eacec08e41764b0e1a5807292dc21452e063", + sha256 = "ab6758ab6efe2798b233dc125ddcd73b45987f24362d25b4632a159c018f9515", + git_commit = "f63cffee03c055b6797c33f6aee201fbd6c0d29b", ) # Import all of TensorFlow Serving's external dependencies. From 79a218a2f3dcd2a16a89ed9fd1760adf285efdd5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Jan 2021 18:02:35 -0800 Subject: [PATCH 4653/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3e3b19f5-5abf-4970-b67e-cfee1454269d PiperOrigin-RevId: 353771575 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d3b3499b83e..abda1080fa4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ab6758ab6efe2798b233dc125ddcd73b45987f24362d25b4632a159c018f9515", - git_commit = "f63cffee03c055b6797c33f6aee201fbd6c0d29b", + sha256 = "16d8ec4807bcca18d8cb688ef493eadcdcf6122905468bb12ce3dcade5f5f25d", + git_commit = "2fabf2c8ed3298af711d33bd3457daabe9a86150", ) # Import all of TensorFlow Serving's external dependencies. From 619943f724aec670519dfcc78584316b141269e4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Jan 2021 00:02:55 -0800 Subject: [PATCH 4654/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9f81d529-935d-4d05-8b51-f8998ec30820 PiperOrigin-RevId: 353810959 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index abda1080fa4..4fb8548332a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "16d8ec4807bcca18d8cb688ef493eadcdcf6122905468bb12ce3dcade5f5f25d", - git_commit = "2fabf2c8ed3298af711d33bd3457daabe9a86150", + sha256 = "819044db14f47dd95da5bf5872c0ae66efa6a06fc9ce77169a83a5763ba8374d", + git_commit = "f12a518cc41ad0a53f8620f3004eedf1af04a409", ) # Import all of TensorFlow Serving's external dependencies. From 7ebcd15c3d432959cf44ba784c869433730f73f4 Mon Sep 17 00:00:00 2001 From: Oliver Sampson Date: Tue, 26 Jan 2021 12:44:24 +0100 Subject: [PATCH 4655/8103] Update docker.md Minor grammar change. --- tensorflow_serving/g3doc/docker.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/g3doc/docker.md b/tensorflow_serving/g3doc/docker.md index 1aee8647efe..49be9692bb6 100644 --- a/tensorflow_serving/g3doc/docker.md +++ b/tensorflow_serving/g3doc/docker.md @@ -47,7 +47,7 @@ docker image by running: docker pull tensorflow/serving ``` -This will pull down an minimal Docker image with TensorFlow Serving installed. +This will pull down a minimal Docker image with TensorFlow Serving installed. See the Docker Hub [tensorflow/serving repo](http://hub.docker.com/r/tensorflow/serving/tags/) for From 22b082aae33a825be54632b4e3855e150c8a2edf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Jan 2021 06:01:29 -0800 Subject: [PATCH 4656/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1e2caba2-3415-441e-be83-6253058496fd PiperOrigin-RevId: 353851122 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4fb8548332a..f3d0385a92d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "819044db14f47dd95da5bf5872c0ae66efa6a06fc9ce77169a83a5763ba8374d", - git_commit = "f12a518cc41ad0a53f8620f3004eedf1af04a409", + sha256 = "91bb742d338e4cff730e2416cd4d8e666d16eea13bb53de9a17b18290e96990f", + git_commit = "2fb5d641d852ff40df2dd85f461115ab9583d851", ) # Import all of TensorFlow Serving's external dependencies. From 2c7fa3e174e95b595791b318c37659c72bbbce85 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Jan 2021 12:01:23 -0800 Subject: [PATCH 4657/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4fe65a7e-4c5a-4297-bf3e-e31cbb611e3c PiperOrigin-RevId: 353918358 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f3d0385a92d..0dba27d9556 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "91bb742d338e4cff730e2416cd4d8e666d16eea13bb53de9a17b18290e96990f", - git_commit = "2fb5d641d852ff40df2dd85f461115ab9583d851", + sha256 = "00e81c37fa5944fdf178f4b0bc4883093dc60ed439d0c3dcb69d004591e62d8e", + git_commit = "b3846198cadd3ee0089536d2953aa5ddd7298583", ) # Import all of TensorFlow Serving's external dependencies. From e208b6ed8a621e91684dfa233b0923ea367f6a43 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Jan 2021 12:08:59 -0800 Subject: [PATCH 4658/8103] Pre-allocate memory for certain vectors where the size is known. PiperOrigin-RevId: 353920249 --- tensorflow_serving/core/aspired_versions_manager.cc | 1 + tensorflow_serving/model_servers/server_core.cc | 1 + .../servables/tensorflow/bundle_factory_test_util.cc | 1 + 3 files changed, 3 insertions(+) diff --git a/tensorflow_serving/core/aspired_versions_manager.cc b/tensorflow_serving/core/aspired_versions_manager.cc index 1dd50f82499..3436e42bd62 100644 --- a/tensorflow_serving/core/aspired_versions_manager.cc +++ b/tensorflow_serving/core/aspired_versions_manager.cc @@ -108,6 +108,7 @@ std::set GetVersionNumbers( string ServableVersionsDebugString( const std::vector>>& versions) { std::vector version_strings; + version_strings.reserve(versions.size()); for (const ServableData>& version : versions) { version_strings.push_back(version.id().DebugString()); } diff --git a/tensorflow_serving/model_servers/server_core.cc b/tensorflow_serving/model_servers/server_core.cc index bf87fcb8a4b..93c7d5977d6 100644 --- a/tensorflow_serving/model_servers/server_core.cc +++ b/tensorflow_serving/model_servers/server_core.cc @@ -285,6 +285,7 @@ Status ServerCore::Initialize(std::unique_ptr policy) { Status ServerCore::WaitUntilModelsAvailable(const std::set& models, ServableStateMonitor* monitor) { std::vector awaited_servables; + awaited_servables.reserve(models.size()); for (const string& model : models) { awaited_servables.push_back(ServableRequest::Latest(model)); } diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_test_util.cc b/tensorflow_serving/servables/tensorflow/bundle_factory_test_util.cc index f3ab4f87ac2..d7c6079be49 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_test_util.cc +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_test_util.cc @@ -120,6 +120,7 @@ void TestSingleRequest(Session* session) { void TestMultipleRequests(int num_requests, Session* session) { std::vector> request_threads; + request_threads.reserve(num_requests); for (int i = 0; i < num_requests; ++i) { request_threads.push_back( std::unique_ptr(Env::Default()->StartThread( From c27860cb9dc0c826f59b6294d4596376e664efe7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Jan 2021 18:01:16 -0800 Subject: [PATCH 4659/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fd72c6fc-b6e3-4ef9-9a26-1b6b4c53251f PiperOrigin-RevId: 353992350 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0dba27d9556..7298cf4cd7a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "00e81c37fa5944fdf178f4b0bc4883093dc60ed439d0c3dcb69d004591e62d8e", - git_commit = "b3846198cadd3ee0089536d2953aa5ddd7298583", + sha256 = "8d4658dbed4edd8a127da6598cb14a62841bcd39a5457d8f6f55aea9d5cee26d", + git_commit = "d96f268804e9bbbe0032a9bf64ff74d2b918d494", ) # Import all of TensorFlow Serving's external dependencies. From 14dbfa3df23b521bdc2250addadc202879aafe51 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Jan 2021 18:32:18 -0800 Subject: [PATCH 4660/8103] Add release notes for tf-serving 2.4.1. PiperOrigin-RevId: 353997200 --- RELEASE.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/RELEASE.md b/RELEASE.md index 17f90fff4b0..2e43fb81957 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,3 +1,17 @@ +# Release 2.4.1 + +## Major Features and Improvements + +* No major features or improvements. + +## Breaking Changes + +* No breaking changes + +## Bug Fixes and Other Changes + +* This release is based on TF version 2.4.1 + # Release 2.4.0 ## Major Features and Improvements From 135041a8b40a99f81dfd8e6673532ea851c3dda1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Jan 2021 00:01:31 -0800 Subject: [PATCH 4661/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/99c8e62b-a256-4545-b47b-d8b0d79d217e PiperOrigin-RevId: 354034907 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7298cf4cd7a..f32a48e4e25 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8d4658dbed4edd8a127da6598cb14a62841bcd39a5457d8f6f55aea9d5cee26d", - git_commit = "d96f268804e9bbbe0032a9bf64ff74d2b918d494", + sha256 = "748a4302ddae476ec4d30e425999300b7972c86db924ba4b107367feb5be5f49", + git_commit = "8812986e1189279c6d29a577a7fa8cb835b30954", ) # Import all of TensorFlow Serving's external dependencies. From 753f38db48828f6e28f618f894913cf6f57120c0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Jan 2021 06:01:23 -0800 Subject: [PATCH 4662/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ad718b17-9cce-4825-bce9-e2f9802aae17 PiperOrigin-RevId: 354075801 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f32a48e4e25..a85e65682d5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "748a4302ddae476ec4d30e425999300b7972c86db924ba4b107367feb5be5f49", - git_commit = "8812986e1189279c6d29a577a7fa8cb835b30954", + sha256 = "155c448b2348149f19fe12bbdec26052128e9d722bd25aa0060163d8ce906336", + git_commit = "1b215470642efd86e927d1c15ba026b4ff45dfa7", ) # Import all of TensorFlow Serving's external dependencies. From 4947a97851d5b694c02a1930c954363e301d726e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Jan 2021 12:01:32 -0800 Subject: [PATCH 4663/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7baede46-e6b1-473c-a343-0beb06ea2570 PiperOrigin-RevId: 354140502 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a85e65682d5..76c1689aca3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "155c448b2348149f19fe12bbdec26052128e9d722bd25aa0060163d8ce906336", - git_commit = "1b215470642efd86e927d1c15ba026b4ff45dfa7", + sha256 = "dfbe69cdc2696cde5f122cd588f883146be1693be819fab1b5206fce686f084c", + git_commit = "5f3ab2cb757fb30a28b26433787baa9c5d6e38c8", ) # Import all of TensorFlow Serving's external dependencies. From 7ea228b2d21d5db9582bc1055b92563187dc169e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Jan 2021 18:01:25 -0800 Subject: [PATCH 4664/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6a3ebf7e-719f-4cfd-a624-e71c0fe19283 PiperOrigin-RevId: 354214770 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 76c1689aca3..de89dfbcee8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dfbe69cdc2696cde5f122cd588f883146be1693be819fab1b5206fce686f084c", - git_commit = "5f3ab2cb757fb30a28b26433787baa9c5d6e38c8", + sha256 = "9ab13f76b897d992b1ef9694ac1eb020cd77d5141b83fdd50992839ee8a9e56c", + git_commit = "7c0a3f12dd00b0aeb9d2a91d157b0e9d1a4c1250", ) # Import all of TensorFlow Serving's external dependencies. From 5cad4b4bf723bd7c5ed9cf684b226d734c116439 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Thu, 28 Jan 2021 11:54:08 -0800 Subject: [PATCH 4665/8103] Update URLs. PiperOrigin-RevId: 354361251 --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ee15e2464a1..263fe7a9572 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ # TensorFlow Serving -[![Ubuntu Build Status](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges/ubuntu.svg)](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges/ubuntu.html) -[![Ubuntu Build Status at TF HEAD](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges/ubuntu-tf-head.svg)](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges/ubuntu-tf-head.html) -![Docker CPU Nightly Build Status](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges/docker-cpu-nightly.svg) -![Docker GPU Nightly Build Status](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges/docker-gpu-nightly.svg) +[![Ubuntu Build Status](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges-bucket/ubuntu.svg)](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges-bucket/ubuntu.html) +[![Ubuntu Build Status at TF HEAD](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges-bucket/ubuntu-tf-head.svg)](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges-bucket/ubuntu-tf-head.html) +![Docker CPU Nightly Build Status](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges-bucket/docker-cpu-nightly.svg) +![Docker GPU Nightly Build Status](https://storage.googleapis.com/tensorflow-serving-kokoro-build-badges-bucket/docker-gpu-nightly.svg) ---- TensorFlow Serving is a flexible, high-performance serving system for From d8c15454214f76d900e02e9a67f7b1589ec7e44e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 29 Jan 2021 00:01:31 -0800 Subject: [PATCH 4666/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/37378c76-c0f1-4a9a-b89f-80d7e354187b PiperOrigin-RevId: 354479439 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index de89dfbcee8..78f3947f816 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9ab13f76b897d992b1ef9694ac1eb020cd77d5141b83fdd50992839ee8a9e56c", - git_commit = "7c0a3f12dd00b0aeb9d2a91d157b0e9d1a4c1250", + sha256 = "26c9c87f8f433b3dcaeb65249ac392c7b280cb877828763c0db9abd6d70169d8", + git_commit = "f329ec5aec49b77bf67a3c7331e4a6417dd27284", ) # Import all of TensorFlow Serving's external dependencies. From c0c54fe5d4e0d83d0bda46005d146b804e1814af Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 29 Jan 2021 06:01:41 -0800 Subject: [PATCH 4667/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/88f567c3-e1a4-450e-b854-0c63303f4e8d PiperOrigin-RevId: 354517947 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 78f3947f816..4d49200158a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "26c9c87f8f433b3dcaeb65249ac392c7b280cb877828763c0db9abd6d70169d8", - git_commit = "f329ec5aec49b77bf67a3c7331e4a6417dd27284", + sha256 = "6bf469df813828e01f44bd4b487e53593ba23ee5a772a05c1b6d6c0f90d15242", + git_commit = "88561818bffc43aa696ee66824c2a6c923eb5135", ) # Import all of TensorFlow Serving's external dependencies. From cea306a2f3857e5715233b9f45b49097e4d5b4c8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 29 Jan 2021 10:54:44 -0800 Subject: [PATCH 4668/8103] Updating serving_basic for adjusting serving_basic.md file and making it up2date with TF2.x - including: - fixing the mentions to Tensorflow v1 - updating the links to point to tf.compat.v1 - updating the code snippets to make them consistent with https://github.com/tensorflow/serving/blob/master/tensorflow_serving/example/mnist_saved_model.py PiperOrigin-RevId: 354565926 --- tensorflow_serving/g3doc/serving_basic.md | 54 +++++++++++------------ 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/tensorflow_serving/g3doc/serving_basic.md b/tensorflow_serving/g3doc/serving_basic.md index 6a71939dbdf..1b9c1cc3fda 100644 --- a/tensorflow_serving/g3doc/serving_basic.md +++ b/tensorflow_serving/g3doc/serving_basic.md @@ -6,11 +6,9 @@ it. If you are already familiar with TensorFlow Serving, and you want to know more about how the server internals work, see the [TensorFlow Serving advanced tutorial](serving_advanced.md). -This tutorial uses the simple Softmax Regression model introduced in the -TensorFlow tutorial for handwritten image (MNIST data) classification. If you -do not know what TensorFlow or MNIST is, see the -[MNIST For ML Beginners](http://www.tensorflow.org/tutorials/mnist/beginners/index.html#mnist-for-ml-beginners) -tutorial. +This tutorial uses a simple Softmax Regression model that classifies handwritten +digits. It is very similar to the one introduced in the +[TensorFlow tutorial on image classification using the Fashion MNIST dataset](https://www.tensorflow.org/tutorials/keras/classification). The code for this tutorial consists of two parts: @@ -28,11 +26,9 @@ Before getting started, first [install Docker](docker.md#installing-docker). ## Train and export TensorFlow model -As you can see in `mnist_saved_model.py`, the training is done the same way it -is in the -[MNIST For ML Beginners tutorial](https://www.tensorflow.org/get_started/mnist/beginners). -The TensorFlow graph is launched in TensorFlow session `sess`, with the input -tensor (image) as `x` and output tensor (Softmax score) as `y`. +For the training phase, the TensorFlow graph is launched in TensorFlow session +`sess`, with the input tensor (image) as `x` and output tensor (Softmax score) +as `y`. Then we use TensorFlow's [SavedModelBuilder module](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/saved_model/builder.py) to export the model. `SavedModelBuilder` saves a "snapshot" of the trained model @@ -48,19 +44,21 @@ saving a model to disk. ```python export_path_base = sys.argv[-1] export_path = os.path.join( - compat.as_bytes(export_path_base), - compat.as_bytes(str(FLAGS.model_version))) + tf.compat.as_bytes(export_path_base), + tf.compat.as_bytes(str(FLAGS.model_version))) print('Exporting trained model to', export_path) builder = tf.saved_model.builder.SavedModelBuilder(export_path) builder.add_meta_graph_and_variables( - sess, [tf.saved_model.tag_constants.SERVING], - signature_def_map={ - 'predict_images': - prediction_signature, - signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: - classification_signature, - }, - main_op=tf.tables_initializer()) + sess, [tf.compat.v1.saved_model.tag_constants.SERVING], + signature_def_map={ + 'predict_images': + prediction_signature, + tf.compat.v1.saved_model.signature_constants + .DEFAULT_SERVING_SIGNATURE_DEF_KEY: + classification_signature, + }, + main_op=tf.compat.v1.tables_initializer(), + strip_default_attrs=True) builder.save() ``` @@ -98,11 +96,11 @@ You can add meta graph and variables to the builder using related to signatures, are defined as part of SavedModel signature constants. For more details, see [signature_constants.py](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/saved_model/signature_constants.py) - and related - [TensorFlow 1.0 API documentation](https://www.tensorflow.org/api_docs/python/tf/saved_model/signature_constants). + and + [related TensorFlow API documentation](https://www.tensorflow.org/api_docs/python/tf/compat/v1/saved_model/signature_constants). Further, to help build signature defs easily, the SavedModel API provides - [signature def utils](https://www.tensorflow.org/api_docs/python/tf/saved_model/signature_def_utils). + [signature def utils](https://www.tensorflow.org/api_docs/python/tf/compat/v1/saved_model/signature_def_utils).. Specifically, in the original [mnist_saved_model.py](https://github.com/tensorflow/serving/tree/master/tensorflow_serving/example/mnist_saved_model.py) file, we use `signature_def_utils.build_signature_def()` to build @@ -119,14 +117,16 @@ You can add meta graph and variables to the builder using requests, it should be set to `tensorflow/serving/predict`. For other method names, see [signature_constants.py](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/saved_model/signature_constants.py) - and related - [TensorFlow 1.0 API documentation](https://www.tensorflow.org/api_docs/python/tf/saved_model/signature_constants). + and + [related TensorFlow API documentation](https://www.tensorflow.org/api_docs/python/tf/compat/v1/saved_model/signature_constants). Note that `tensor_info_x` and `tensor_info_y` have the structure of -`tensorflow::TensorInfo` protocol buffer defined [here](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/protobuf/meta_graph.proto). +`tensorflow::TensorInfo` protocol buffer defined +[here](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/protobuf/meta_graph.proto). To easily build tensor infos, the TensorFlow SavedModel API also provides [utils.py](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/saved_model/utils.py), -with [related TensorFlow 1.0 API documentation](https://www.tensorflow.org/api_docs/python/tf/saved_model/utils). +with +[related TensorFlow API documentation](https://www.tensorflow.org/api_docs/python/tf/compat/v1/saved_model/utils). Also, note that `images` and `scores` are tensor alias names. They can be whatever unique strings you want, and they will become the logical names From a6547f76ccea3578c69aa717aeefcb216d2f2447 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 29 Jan 2021 12:01:57 -0800 Subject: [PATCH 4669/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f542c4b9-2c6d-4634-9182-8c6d8359569f PiperOrigin-RevId: 354581352 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4d49200158a..7d9dfa84266 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6bf469df813828e01f44bd4b487e53593ba23ee5a772a05c1b6d6c0f90d15242", - git_commit = "88561818bffc43aa696ee66824c2a6c923eb5135", + sha256 = "21bfc368cf344e39732b897ebf8c2812e72cd19e1c50411eff091ccb63b443f9", + git_commit = "ec291f05021f5133d616ee36d16851b2dad8cc73", ) # Import all of TensorFlow Serving's external dependencies. From a46fdb26bd8b78d57a47c13b116748ed9551cdc6 Mon Sep 17 00:00:00 2001 From: Philip Sun Date: Fri, 29 Jan 2021 13:35:46 -0800 Subject: [PATCH 4670/8103] Use NullSafeStringView for potentially null pointer returned from libevent PiperOrigin-RevId: 354600382 --- .../util/net_http/server/internal/evhttp_request.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_request.cc b/tensorflow_serving/util/net_http/server/internal/evhttp_request.cc index bbd74d6f134..7f52b00f16a 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_request.cc +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_request.cc @@ -289,7 +289,7 @@ void EvHTTPRequest::UncompressGzipBody(void* input, size_t input_size, absl::string_view EvHTTPRequest::GetRequestHeader( absl::string_view header) const { std::string header_str(header.data(), header.size()); - return absl::string_view( + return absl::NullSafeStringView( evhttp_find_header(parsed_request_->headers, header_str.c_str())); } From 3c1b2b34ec516afbb73543cc62d3979f013a33f1 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Fri, 29 Jan 2021 13:43:21 -0800 Subject: [PATCH 4671/8103] Allow ability to enable XLA/CPU support via `--xla_cpu_compilation_enabled` Defaults to `false` (not enabled). PiperOrigin-RevId: 354602146 --- tensorflow_serving/model_servers/BUILD | 1 + tensorflow_serving/model_servers/main.cc | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index f7de17e0251..0b9ecadc5f5 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -379,6 +379,7 @@ cc_library( deps = [ ":server_lib", "@org_tensorflow//tensorflow/c:c_api", + "@org_tensorflow//tensorflow/compiler/jit:xla_cpu_jit", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core/platform/cloud:gcs_file_system", "@org_tensorflow//tensorflow/core/platform/hadoop:hadoop_file_system", diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index 8b988949dff..2d4f257d951 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -47,6 +47,7 @@ limitations under the License. #include #include "tensorflow/c/c_api.h" +#include "tensorflow/compiler/jit/flags.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/platform/init_main.h" #include "tensorflow/core/util/command_line_flags.h" @@ -56,6 +57,7 @@ limitations under the License. int main(int argc, char** argv) { tensorflow::serving::main::Server::Options options; bool display_version = false; + bool xla_cpu_compilation_enabled = false; std::vector flag_list = { tensorflow::Flag("port", &options.grpc_port, "TCP port to listen on for gRPC/HTTP API. Disabled if " @@ -187,8 +189,7 @@ int main(int argc, char** argv) { "A comma separated list of arguments to be passed to " "the grpc server. (e.g. " "grpc.max_connection_age_ms=2000)"), - tensorflow::Flag("grpc_max_threads", - &options.grpc_max_threads, + tensorflow::Flag("grpc_max_threads", &options.grpc_max_threads, "Max grpc server threads to handle grpc messages."), tensorflow::Flag("enable_model_warmup", &options.enable_model_warmup, "Enables model warmup, which triggers lazy " @@ -221,7 +222,13 @@ int main(int argc, char** argv) { "enable_signature_method_name_check", &options.enable_signature_method_name_check, "Enable method_name check for SignatureDef. Disable this if serving " - "native TF2 regression/classification models.")}; + "native TF2 regression/classification models."), + tensorflow::Flag( + "xla_cpu_compilation_enabled", &xla_cpu_compilation_enabled, + "EXPERIMENTAL; CAN BE REMOVED ANYTIME! " + "Enable XLA:CPU JIT (default is disabled). With XLA:CPU JIT " + "disabled, models utilizing this feature will return bad Status " + "on first compilation request.")}; const auto& usage = tensorflow::Flags::Usage(argv[0], flag_list); if (!tensorflow::Flags::Parse(&argc, argv, flag_list)) { @@ -240,6 +247,10 @@ int main(int argc, char** argv) { std::cout << "unknown argument: " << argv[1] << "\n" << usage; } + if (!xla_cpu_compilation_enabled) { + tensorflow::DisableXlaCompilation(); + } + tensorflow::serving::main::Server server; const auto& status = server.BuildAndStart(options); if (!status.ok()) { From 59a36ff179964076f943df69948f9cbef7a9c023 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 29 Jan 2021 18:01:09 -0800 Subject: [PATCH 4672/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8bd62eeb-287a-4fa5-b7c2-0a676a5b13d2 PiperOrigin-RevId: 354646481 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7d9dfa84266..3872e884b0c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "21bfc368cf344e39732b897ebf8c2812e72cd19e1c50411eff091ccb63b443f9", - git_commit = "ec291f05021f5133d616ee36d16851b2dad8cc73", + sha256 = "88776f239582bcd714719b6678d8dd2f253fd4bc880007a73056eea85df40159", + git_commit = "e8e6d5d60dafca2298a7f905316ac10a4347d79e", ) # Import all of TensorFlow Serving's external dependencies. From cf6764c60270e439d0c287e34e937d5d79cc6eb3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 30 Jan 2021 00:01:34 -0800 Subject: [PATCH 4673/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/df627d10-0c63-4164-a205-62e62e09c185 PiperOrigin-RevId: 354676624 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3872e884b0c..f9f2c3ac715 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "88776f239582bcd714719b6678d8dd2f253fd4bc880007a73056eea85df40159", - git_commit = "e8e6d5d60dafca2298a7f905316ac10a4347d79e", + sha256 = "4bed38738d5abc79770e280afc2e961d35b9ebca5a298b3f7721bb51215d3f0a", + git_commit = "5581537385274c92a45ecec0881870169353099f", ) # Import all of TensorFlow Serving's external dependencies. From 14155fe2d4fdedb79b54a2178ee35584beb63cac Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 30 Jan 2021 06:01:58 -0800 Subject: [PATCH 4674/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/11a192bd-28f2-4364-a2fd-07564e0313f2 PiperOrigin-RevId: 354700817 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f9f2c3ac715..bab8fbcb6f3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4bed38738d5abc79770e280afc2e961d35b9ebca5a298b3f7721bb51215d3f0a", - git_commit = "5581537385274c92a45ecec0881870169353099f", + sha256 = "2952ec71d4e9c0a202afb263a78e07c7ff912d2ec17ce0b90c6447a3e5118610", + git_commit = "1e56da99e0748145f83b9bbd14267503c980ea8f", ) # Import all of TensorFlow Serving's external dependencies. From b2005f5548b1267572a84b72d499d0cc2a9ed47a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 30 Jan 2021 18:01:37 -0800 Subject: [PATCH 4675/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/cb3a96de-f119-4751-9978-70477cc8b9b2 PiperOrigin-RevId: 354747619 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bab8fbcb6f3..ab99f5c25d3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2952ec71d4e9c0a202afb263a78e07c7ff912d2ec17ce0b90c6447a3e5118610", - git_commit = "1e56da99e0748145f83b9bbd14267503c980ea8f", + sha256 = "7b5151f1dfb92b62914e51cf59c79cc4c5e0e91a248644e48ff68ab543616d5d", + git_commit = "86c79e9779a2d2653fddbb0e0391e2ea8121e81c", ) # Import all of TensorFlow Serving's external dependencies. From b70a0d28f48550380c1996709abc36089d135f31 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 31 Jan 2021 06:01:23 -0800 Subject: [PATCH 4676/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/85c629f9-314d-451f-a137-c9135a416409 PiperOrigin-RevId: 354796557 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ab99f5c25d3..00e34c1ea39 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7b5151f1dfb92b62914e51cf59c79cc4c5e0e91a248644e48ff68ab543616d5d", - git_commit = "86c79e9779a2d2653fddbb0e0391e2ea8121e81c", + sha256 = "d266a19e9a88de2968f28b5cda2922775f24d40723f9b7fdaf5a3c376cde9d70", + git_commit = "97f03285682d0bf459ee19e5f3ba1f84ff388a1e", ) # Import all of TensorFlow Serving's external dependencies. From 287499d68ea406120541100da98599034ff3f431 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Feb 2021 06:01:26 -0800 Subject: [PATCH 4677/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/01de45dd-4b1c-400c-a04c-d9d5c5f2c782 PiperOrigin-RevId: 354923088 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 00e34c1ea39..1949348301c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d266a19e9a88de2968f28b5cda2922775f24d40723f9b7fdaf5a3c376cde9d70", - git_commit = "97f03285682d0bf459ee19e5f3ba1f84ff388a1e", + sha256 = "f097c26498b5aea380fc1a1969b6324d28a61c6f2c7f04800089ac516bc605f2", + git_commit = "9144fd2b578efc75f990c83191dc2958051942a1", ) # Import all of TensorFlow Serving's external dependencies. From ca38d077a53aaf10d620c078ab871a4ab69c1639 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Feb 2021 12:03:17 -0800 Subject: [PATCH 4678/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1132c821-ba47-4b63-9797-2243aa1275b8 PiperOrigin-RevId: 354994723 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1949348301c..551854fff97 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f097c26498b5aea380fc1a1969b6324d28a61c6f2c7f04800089ac516bc605f2", - git_commit = "9144fd2b578efc75f990c83191dc2958051942a1", + sha256 = "72e473e19318a899d2dfcaa844fa1faf6a4385cb3fe6c1705f5c2bf9c2ca1521", + git_commit = "05e840827084935c75238c234643ce59efba12f4", ) # Import all of TensorFlow Serving's external dependencies. From fc51abdbaf1cff716c8bf448d007edc676f37861 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Feb 2021 18:01:24 -0800 Subject: [PATCH 4679/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f79224a7-7205-4763-b09d-e42a13ce5baa PiperOrigin-RevId: 355067533 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 551854fff97..dd9f672f795 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "72e473e19318a899d2dfcaa844fa1faf6a4385cb3fe6c1705f5c2bf9c2ca1521", - git_commit = "05e840827084935c75238c234643ce59efba12f4", + sha256 = "da4d806cc8545ff11fc32005232a18b386167d859aeb412dd25f11986823edd2", + git_commit = "f57dcc666650319e8e9a7904b3aa66703a323638", ) # Import all of TensorFlow Serving's external dependencies. From eaa5b02a2d588254a2e2134d3f228a5b739511b8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Feb 2021 00:01:49 -0800 Subject: [PATCH 4680/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d11c8c48-410f-41fb-be0d-7b9e201a3f4f PiperOrigin-RevId: 355108057 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dd9f672f795..fe5c4b30c12 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "da4d806cc8545ff11fc32005232a18b386167d859aeb412dd25f11986823edd2", - git_commit = "f57dcc666650319e8e9a7904b3aa66703a323638", + sha256 = "2a7e9377feb3d10f1b5922624baea9f9362015b0028b5ef3a23f54feffd55c00", + git_commit = "2eea5090c05a1cb99e631aecefd107597afd227b", ) # Import all of TensorFlow Serving's external dependencies. From dfbcaf931bf7099af79287a628497ab03c600108 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Feb 2021 06:01:33 -0800 Subject: [PATCH 4681/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0937c088-6bf1-4d13-9a1a-a79dd777e79c PiperOrigin-RevId: 355149003 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fe5c4b30c12..e636baa1de2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2a7e9377feb3d10f1b5922624baea9f9362015b0028b5ef3a23f54feffd55c00", - git_commit = "2eea5090c05a1cb99e631aecefd107597afd227b", + sha256 = "03c17ba03cf1997a6573e6a88ad61d8e440b6b945b8b725db88abb664f4d2957", + git_commit = "f53d9b952a7db2950afaacf8e07e6c66fdb07c86", ) # Import all of TensorFlow Serving's external dependencies. From a98d1649061133c589c1a3872aee9ecd774bc52a Mon Sep 17 00:00:00 2001 From: Philip Sun Date: Tue, 2 Feb 2021 12:01:14 -0800 Subject: [PATCH 4682/8103] Replace nullptr constructor for string_view with empty strings PiperOrigin-RevId: 355220048 --- .../client/testing/evhttp_echo_client.cc | 2 +- .../server/internal/evhttp_request_test.cc | 10 +++++----- .../server/internal/evhttp_server_test.cc | 18 +++++++++--------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/tensorflow_serving/util/net_http/client/testing/evhttp_echo_client.cc b/tensorflow_serving/util/net_http/client/testing/evhttp_echo_client.cc index 5c68a589ca0..d0981682c34 100644 --- a/tensorflow_serving/util/net_http/client/testing/evhttp_echo_client.cc +++ b/tensorflow_serving/util/net_http/client/testing/evhttp_echo_client.cc @@ -32,7 +32,7 @@ bool SendRequest(const char* url) { std::cerr << "Fail to connect to %s" << url; } - ClientRequest request = {url, "GET", {}, nullptr}; + ClientRequest request = {url, "GET", {}, ""}; ClientResponse response = {}; if (!connection->BlockingSendRequest(request, &response)) { diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_request_test.cc b/tensorflow_serving/util/net_http/server/internal/evhttp_request_test.cc index c0372c202db..258f24fdc3d 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_request_test.cc +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_request_test.cc @@ -79,7 +79,7 @@ TEST_F(EvHTTPRequestTest, SimpleGETNotFound) { EvHTTPConnection::Connect("localhost", server->listen_port()); ASSERT_TRUE(connection != nullptr); - ClientRequest request = {"/noop", "GET", {}, nullptr}; + ClientRequest request = {"/noop", "GET", {}, ""}; ClientResponse response = {}; EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); @@ -104,7 +104,7 @@ TEST_F(EvHTTPRequestTest, SimpleGETOK) { EvHTTPConnection::Connect("localhost", server->listen_port()); ASSERT_TRUE(connection != nullptr); - ClientRequest request = {"/ok", "GET", {}, nullptr}; + ClientRequest request = {"/ok", "GET", {}, ""}; ClientResponse response = {}; EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); @@ -175,7 +175,7 @@ TEST_F(EvHTTPRequestTest, RequestUri) { ASSERT_TRUE(connection != nullptr); for (const char* path : kUriPath) { - ClientRequest request = {path, "GET", {}, nullptr}; + ClientRequest request = {path, "GET", {}, ""}; ClientResponse response = {}; EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); @@ -207,7 +207,7 @@ TEST_F(EvHTTPRequestTest, RequestHeaders) { "GET", {ClientRequest::HeaderKeyValue("H1", "v1"), ClientRequest::HeaderKeyValue("H2", "v2")}, - nullptr}; + ""}; ClientResponse response = {}; EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); @@ -235,7 +235,7 @@ TEST_F(EvHTTPRequestTest, ResponseHeaders) { EvHTTPConnection::Connect("localhost", server->listen_port()); ASSERT_TRUE(connection != nullptr); - ClientRequest request = {"/ok", "GET", {}, nullptr}; + ClientRequest request = {"/ok", "GET", {}, ""}; ClientResponse response = {}; EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_server_test.cc b/tensorflow_serving/util/net_http/server/internal/evhttp_server_test.cc index f771fc4cce5..d542a77546c 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_server_test.cc +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_server_test.cc @@ -95,7 +95,7 @@ TEST_F(EvHTTPServerTest, ExactPathMatching) { EvHTTPConnection::Connect("localhost", server->listen_port()); ASSERT_TRUE(connection != nullptr); - ClientRequest request = {"/ok?a=foo", "GET", {}, nullptr}; + ClientRequest request = {"/ok?a=foo", "GET", {}, ""}; ClientResponse response = {}; EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); @@ -103,7 +103,7 @@ TEST_F(EvHTTPServerTest, ExactPathMatching) { EXPECT_EQ(response.body, "OK"); // no canonicalization for the trailing "/" - request = {"/ok/", "GET", {}, nullptr}; + request = {"/ok/", "GET", {}, ""}; response = {}; EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); @@ -134,7 +134,7 @@ TEST_F(EvHTTPServerTest, RequestHandlerOverwriting) { EvHTTPConnection::Connect("localhost", server->listen_port()); ASSERT_TRUE(connection != nullptr); - ClientRequest request = {"/ok", "GET", {}, nullptr}; + ClientRequest request = {"/ok", "GET", {}, ""}; ClientResponse response = {}; EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); @@ -164,7 +164,7 @@ TEST_F(EvHTTPServerTest, SingleRequestDispather) { EvHTTPConnection::Connect("localhost", server->listen_port()); ASSERT_TRUE(connection != nullptr); - ClientRequest request = {"/ok", "GET", {}, nullptr}; + ClientRequest request = {"/ok", "GET", {}, ""}; ClientResponse response = {}; EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); @@ -202,14 +202,14 @@ TEST_F(EvHTTPServerTest, UriPrecedesOverRequestDispather) { EvHTTPConnection::Connect("localhost", server->listen_port()); ASSERT_TRUE(connection != nullptr); - ClientRequest request = {"/ok", "GET", {}, nullptr}; + ClientRequest request = {"/ok", "GET", {}, ""}; ClientResponse response = {}; EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); EXPECT_EQ(response.status, HTTPStatusCode::OK); EXPECT_EQ(response.body, "OK1"); - request = {"/okxx", "GET", {}, nullptr}; + request = {"/okxx", "GET", {}, ""}; response = {}; EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); @@ -247,7 +247,7 @@ TEST_F(EvHTTPServerTest, InOrderRequestDispather) { EvHTTPConnection::Connect("localhost", server->listen_port()); ASSERT_TRUE(connection != nullptr); - ClientRequest request = {"/ok", "GET", {}, nullptr}; + ClientRequest request = {"/ok", "GET", {}, ""}; ClientResponse response = {}; EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); @@ -278,7 +278,7 @@ TEST_F(EvHTTPServerTest, RequestHandlerInteraction) { connection->SetExecutor(absl::make_unique(4)); absl::Notification response_done; - ClientRequest request = {"/ok", "GET", {}, nullptr}; + ClientRequest request = {"/ok", "GET", {}, ""}; ClientResponse response = {}; response.done = [&response_done]() { response_done.Notify(); }; @@ -320,7 +320,7 @@ TEST_F(EvHTTPServerTest, ActiveRequestCountInShutdown) { ASSERT_TRUE(connection != nullptr); connection->SetExecutor(absl::make_unique(4)); - ClientRequest request = {"/ok", "GET", {}, nullptr}; + ClientRequest request = {"/ok", "GET", {}, ""}; ClientResponse response = {}; EXPECT_TRUE(connection->SendRequest(request, &response)); From e99bf230628dd9a4f4153ca4eca8766d9cbb1187 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Feb 2021 12:01:27 -0800 Subject: [PATCH 4683/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b06c7614-c3e3-4b35-b939-aa5f330e5585 PiperOrigin-RevId: 355220103 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e636baa1de2..382336a2b88 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "03c17ba03cf1997a6573e6a88ad61d8e440b6b945b8b725db88abb664f4d2957", - git_commit = "f53d9b952a7db2950afaacf8e07e6c66fdb07c86", + sha256 = "449de3b6bf03435fe06095e88ba1b0dfe8e9d7e34b0bdba2828394ac2f35e322", + git_commit = "abb251c299db5c6318767cd90e008a63e0741808", ) # Import all of TensorFlow Serving's external dependencies. From 77a8b51a1b43c9d36cb29ea62e5ea8afa21334a9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Feb 2021 18:01:35 -0800 Subject: [PATCH 4684/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/49ec352b-7050-477b-9617-dda962cf1012 PiperOrigin-RevId: 355293598 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 382336a2b88..d4a8c26fb1c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "449de3b6bf03435fe06095e88ba1b0dfe8e9d7e34b0bdba2828394ac2f35e322", - git_commit = "abb251c299db5c6318767cd90e008a63e0741808", + sha256 = "b445b3988b3f218ae487094fdfec1f45426cefa1fe1c6d1ec84d97fb0cd22391", + git_commit = "c4d1165b15b90bf8349a3d44067c598ebf6955d5", ) # Import all of TensorFlow Serving's external dependencies. From 053eab4670debeee749e0387428b109da3f183af Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 3 Feb 2021 00:01:47 -0800 Subject: [PATCH 4685/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8739a440-4e0e-4fe7-9b63-0777f789198b PiperOrigin-RevId: 355336470 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d4a8c26fb1c..12fa6fc0713 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b445b3988b3f218ae487094fdfec1f45426cefa1fe1c6d1ec84d97fb0cd22391", - git_commit = "c4d1165b15b90bf8349a3d44067c598ebf6955d5", + sha256 = "323bc9343511fa0f3513fe085a8ff4071365d708b628d885029a98369bd359d5", + git_commit = "ddb089b72f7313f2ced3de84fde78f3184b76e7c", ) # Import all of TensorFlow Serving's external dependencies. From 5969abf11165581a2b68176c19043c04faa171db Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 3 Feb 2021 06:01:26 -0800 Subject: [PATCH 4686/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/534284f7-4100-4855-bb5f-0e88729512a9 PiperOrigin-RevId: 355379597 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 12fa6fc0713..285d35768b9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "323bc9343511fa0f3513fe085a8ff4071365d708b628d885029a98369bd359d5", - git_commit = "ddb089b72f7313f2ced3de84fde78f3184b76e7c", + sha256 = "6d4b811013b61c605e5466476affda85cb0c858c0ed2a151a65a3510ae6a250c", + git_commit = "59fcbe5e2836e109418b95219edf83a80c659b41", ) # Import all of TensorFlow Serving's external dependencies. From d0950f850bba895254efca717001de191e3c140f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 3 Feb 2021 12:01:35 -0800 Subject: [PATCH 4687/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c0ebf856-8be0-4b04-b06a-3ae0b99b6666 PiperOrigin-RevId: 355450011 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 285d35768b9..8c10a8c66ad 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6d4b811013b61c605e5466476affda85cb0c858c0ed2a151a65a3510ae6a250c", - git_commit = "59fcbe5e2836e109418b95219edf83a80c659b41", + sha256 = "62ae8e28dd3e6e1b37fa8a0ad207a33da712b58b06d6a25ef6dc99b50728fc27", + git_commit = "8130665856d6a7ed243d56b34fa40cb3cc167e61", ) # Import all of TensorFlow Serving's external dependencies. From 5fb57805b9987d1727c7326718d2c0c2bcfc7be1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 3 Feb 2021 18:01:23 -0800 Subject: [PATCH 4688/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9a05eba5-96cb-49b1-bfdb-b876f8f7a7e5 PiperOrigin-RevId: 355523341 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8c10a8c66ad..7deb56334af 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "62ae8e28dd3e6e1b37fa8a0ad207a33da712b58b06d6a25ef6dc99b50728fc27", - git_commit = "8130665856d6a7ed243d56b34fa40cb3cc167e61", + sha256 = "3855b7c9519febaf1dfe77e0b4b68f2659d7eed62981683d7aa8373f1f73691f", + git_commit = "19127667def315b1022155a0b45f1df50f886931", ) # Import all of TensorFlow Serving's external dependencies. From f92ac94bf5d597582065198e9ff50e6eeb50c078 Mon Sep 17 00:00:00 2001 From: Chao Xie Date: Wed, 3 Feb 2021 21:20:06 -0800 Subject: [PATCH 4689/8103] Make Internal Change PiperOrigin-RevId: 355546760 --- tensorflow_serving/tools/docker/tests/docker_test_lib.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/tools/docker/tests/docker_test_lib.sh b/tensorflow_serving/tools/docker/tests/docker_test_lib.sh index d1d2b6abdb1..40b784b0138 100755 --- a/tensorflow_serving/tools/docker/tests/docker_test_lib.sh +++ b/tensorflow_serving/tools/docker/tests/docker_test_lib.sh @@ -138,7 +138,7 @@ function test_docker_image { local docker_opts=" --privileged=true --rm -t -p ${rest_port}:${rest_port}" docker_opts+=" -v ${MODEL_FULL_PATH}:${model_base_path}" if [ "$USE_NVIDIA_RUNTIME" = true ]; then - docker_opts+=" --runtime=nvidia" + docker_opts+=" --runtime=nvidia --gpus all" fi if [[ "$IS_MKL_IMAGE" = true ]]; then From 87f3a0b094e526e6afbf2f16f2b44c8c6be1e6bd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Feb 2021 00:01:39 -0800 Subject: [PATCH 4690/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4e09a463-2c2d-4a81-ba5a-e0954480df1c PiperOrigin-RevId: 355565941 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7deb56334af..9c8ad61deea 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3855b7c9519febaf1dfe77e0b4b68f2659d7eed62981683d7aa8373f1f73691f", - git_commit = "19127667def315b1022155a0b45f1df50f886931", + sha256 = "9c177a49c13fe73904e11a8159246c05e56687fd4a5ea844958f9c1fbcdb4abe", + git_commit = "d1012c9ff720e081f6f52a711956136df073455d", ) # Import all of TensorFlow Serving's external dependencies. From abdbb91372d52d9e621456cb8f237b04b7568e17 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Feb 2021 06:01:28 -0800 Subject: [PATCH 4691/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/327c4e54-da53-4283-a6d5-3f2fcbff4191 PiperOrigin-RevId: 355609636 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9c8ad61deea..d384a6b0fb5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9c177a49c13fe73904e11a8159246c05e56687fd4a5ea844958f9c1fbcdb4abe", - git_commit = "d1012c9ff720e081f6f52a711956136df073455d", + sha256 = "b302ff9bbe16cd496bf8501f570076f8faab22ab3bfea5f3a5a2d01eaf7399f0", + git_commit = "4f6924d44aa914dbfee79fee8211bdbc25c6e089", ) # Import all of TensorFlow Serving's external dependencies. From 6777570634358187f644d563ee57be61a7fb2656 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Feb 2021 12:01:53 -0800 Subject: [PATCH 4692/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4a11f351-dc3e-4c55-87c2-2febde7cb89a PiperOrigin-RevId: 355679993 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d384a6b0fb5..4d323855cd3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b302ff9bbe16cd496bf8501f570076f8faab22ab3bfea5f3a5a2d01eaf7399f0", - git_commit = "4f6924d44aa914dbfee79fee8211bdbc25c6e089", + sha256 = "577b27b157a09ef5bf6912af0d53564397549b9d16f4bd6c4f1ebb553312174b", + git_commit = "3094612f3c964e89f0e98dfd6031052eec505fea", ) # Import all of TensorFlow Serving's external dependencies. From dd9c467e15b996be40ceb356f69d3d85c503e72d Mon Sep 17 00:00:00 2001 From: Guanxin Qiao Date: Thu, 4 Feb 2021 12:32:54 -0800 Subject: [PATCH 4693/8103] Support URL reserved characters in model name and label for REST API. Fixes #1726 PiperOrigin-RevId: 355687133 --- tensorflow_serving/model_servers/BUILD | 12 + .../http_rest_api_handler_test.cc | 11 +- .../model_servers/http_rest_api_util.cc | 37 ++- .../model_servers/http_rest_api_util_test.cc | 224 ++++++++++++++++++ 4 files changed, 274 insertions(+), 10 deletions(-) create mode 100644 tensorflow_serving/model_servers/http_rest_api_util_test.cc diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 0b9ecadc5f5..70e559ebfcb 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -280,10 +280,22 @@ cc_library( "@com_google_absl//absl/strings", "@com_google_absl//absl/types:optional", "@com_googlesource_code_re2//:re2", + "@curl", "@org_tensorflow//tensorflow/core:lib", ], ) +cc_test( + name = "http_rest_api_util_test", + srcs = ["http_rest_api_util_test.cc"], + deps = [ + ":http_rest_api_util", + "//tensorflow_serving/core/test_util:test_main", + "//tensorflow_serving/test_util", + "@org_tensorflow//tensorflow/core:test", + ], +) + cc_library( name = "http_rest_api_handler", srcs = ["http_rest_api_handler.cc"], diff --git a/tensorflow_serving/model_servers/http_rest_api_handler_test.cc b/tensorflow_serving/model_servers/http_rest_api_handler_test.cc index b34993107e7..b98312fede0 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler_test.cc +++ b/tensorflow_serving/model_servers/http_rest_api_handler_test.cc @@ -46,7 +46,6 @@ namespace serving { namespace { using ::testing::HasSubstr; -using ::testing::Not; using ::testing::UnorderedElementsAreArray; constexpr char kTestModelBasePath[] = "cc/saved_model/testdata/half_plus_two"; @@ -190,6 +189,10 @@ TEST_F(HttpRestApiHandlerTest, UnsupportedApiCalls) { &model_name, &method, &output); EXPECT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("Missing model name")); + status = handler_.ProcessRequest("GET", "/v1/models/debug/model_name", "", + &headers, &model_name, &method, &output); + EXPECT_TRUE(errors::IsInvalidArgument(status)); + EXPECT_THAT(status.error_message(), HasSubstr("Malformed request")); status = handler_.ProcessRequest("POST", "/v1/models", "", &headers, &model_name, &method, &output); @@ -242,12 +245,6 @@ TEST_F(HttpRestApiHandlerTest, UnsupportedApiCalls) { EXPECT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("Malformed request")); - status = handler_.ProcessRequest("POST", - "/v1/models/foo/labels/some-label:regress", - "", &headers, &model_name, &method, &output); - EXPECT_TRUE(errors::IsInvalidArgument(status)); - EXPECT_THAT(status.error_message(), HasSubstr("Malformed request")); - status = handler_.ProcessRequest("POST", "/v1/models/foo/versions/some_label:regress", "", &headers, &model_name, &method, &output); diff --git a/tensorflow_serving/model_servers/http_rest_api_util.cc b/tensorflow_serving/model_servers/http_rest_api_util.cc index 230f938e0bb..a800c1ba830 100644 --- a/tensorflow_serving/model_servers/http_rest_api_util.cc +++ b/tensorflow_serving/model_servers/http_rest_api_util.cc @@ -17,6 +17,7 @@ limitations under the License. #include "google/protobuf/util/json_util.h" #include "absl/strings/numbers.h" +#include #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/platform/errors.h" @@ -24,9 +25,9 @@ namespace tensorflow { namespace serving { const char* const kPredictionApiGegex = - R"((?i)/v1/models/([^/:]+)(?:(?:/versions/(\d+))|(?:/labels/(\w+)))?:(classify|regress|predict))"; + R"((?i)/v1/models/([^/:]+)(?:(?:/versions/(\d+))|(?:/labels/([^/:]+)))?:(classify|regress|predict))"; const char* const kModelStatusApiRegex = - R"((?i)/v1/models(?:/([^/:]+))?(?:(?:/versions/(\d+))|(?:/labels/(\w+)))?(?:\/(metadata))?)"; + R"((?i)/v1/models(?:/([^/:]+))?(?:(?:/versions/(\d+))|(?:/labels/([^/:]+)))?(?:\/(metadata))?)"; void AddHeaders(std::vector>* headers) { headers->push_back({"Content-Type", "application/json"}); @@ -55,6 +56,27 @@ Status FillModelSpecWithNameVersionAndLabel( return Status::OK(); } +bool DecodeArg(string* arg) { + static const bool run_once ABSL_ATTRIBUTE_UNUSED = [&]() { + curl_global_init(CURL_GLOBAL_ALL); + return true; + }(); + CURL* curl = curl_easy_init(); + if (curl != nullptr) { + int outlength; + char* cres = + curl_easy_unescape(curl, arg->c_str(), arg->size(), &outlength); + if (cres == nullptr) { + return false; + } + arg->assign(cres, outlength); + curl_free(cres); + curl_easy_cleanup(curl); + return true; + } + return false; +} + Status ParseModelInfo(const absl::string_view http_method, const absl::string_view request_path, string* model_name, absl::optional* model_version, @@ -73,7 +95,12 @@ Status ParseModelInfo(const absl::string_view http_method, string(request_path), kModelStatusApiRegex, model_name, &model_version_str, &model_version_label_str, model_subresource); } - + if (!model_name->empty()) { + if (!DecodeArg(model_name)) { + return errors::InvalidArgument("Failed to decode model name:", + *model_name); + } + } if (!model_version_str.empty()) { int64 version; if (!absl::SimpleAtoi(model_version_str, &version)) { @@ -83,6 +110,10 @@ Status ParseModelInfo(const absl::string_view http_method, *model_version = version; } if (!model_version_label_str.empty()) { + if (!DecodeArg(&model_version_label_str)) { + return errors::InvalidArgument("Failed to decode model version label:", + model_version_label_str); + } *model_version_label = model_version_label_str; } return Status::OK(); diff --git a/tensorflow_serving/model_servers/http_rest_api_util_test.cc b/tensorflow_serving/model_servers/http_rest_api_util_test.cc new file mode 100644 index 00000000000..bd318d2f768 --- /dev/null +++ b/tensorflow_serving/model_servers/http_rest_api_util_test.cc @@ -0,0 +1,224 @@ +/* Copyright 2021 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow_serving/model_servers/http_rest_api_util.h" + +#include +#include +#include "tensorflow/core/lib/core/status_test_util.h" +#include "tensorflow_serving/test_util/test_util.h" + +namespace tensorflow { +namespace serving { +namespace { + +using ::testing::HasSubstr; + +class HttpRestApiUtilTest : public ::testing::Test {}; + +TEST_F(HttpRestApiUtilTest, TestParseModelInfoForGet) { + string model_name; + absl::optional model_version; + absl::optional model_version_label; + string method; + string model_subresource; + bool parse_successful; + + // Test reserved charactors in model name. + const absl::string_view request_path_1 = + "/v1/models/" + "modelname%21%23%24%25%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D"; + TF_EXPECT_OK(ParseModelInfo("GET", request_path_1, &model_name, + &model_version, &model_version_label, &method, + &model_subresource, &parse_successful)); + EXPECT_EQ(model_name, "modelname!#$%&'()*+,/:;=?@[]"); + EXPECT_TRUE(parse_successful); + + // Test model version. + const absl::string_view request_path_2 = "/v1/models/modelname/versions/99"; + TF_EXPECT_OK(ParseModelInfo("GET", request_path_2, &model_name, + &model_version, &model_version_label, &method, + &model_subresource, &parse_successful)); + EXPECT_EQ(model_name, "modelname"); + EXPECT_EQ(model_version.value(), 99); + EXPECT_TRUE(parse_successful); + + // Test labels. + const absl::string_view request_path_3 = "/v1/models/modelname/labels/latest"; + TF_EXPECT_OK(ParseModelInfo("GET", request_path_3, &model_name, + &model_version, &model_version_label, &method, + &model_subresource, &parse_successful)); + EXPECT_EQ(model_name, "modelname"); + EXPECT_EQ(model_version_label.value(), "latest"); + EXPECT_TRUE(parse_successful); + + // Test labels with reserved charactors. + const absl::string_view request_path_4 = + "/v1/models/modelname/labels/" + "latest%21%23%24%25%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D"; + TF_EXPECT_OK(ParseModelInfo("GET", request_path_4, &model_name, + &model_version, &model_version_label, &method, + &model_subresource, &parse_successful)); + EXPECT_EQ(model_name, "modelname"); + EXPECT_EQ(model_version_label.value(), "latest!#$%&'()*+,/:;=?@[]"); + EXPECT_TRUE(parse_successful); + + // Test metadata. + const absl::string_view request_path_5 = + "/v1/models/modelname/labels/latest/metadata"; + TF_EXPECT_OK(ParseModelInfo("GET", request_path_5, &model_name, + &model_version, &model_version_label, &method, + &model_subresource, &parse_successful)); + EXPECT_EQ(model_name, "modelname"); + EXPECT_EQ(model_version_label.value(), "latest"); + EXPECT_EQ(model_subresource, "metadata"); + EXPECT_TRUE(parse_successful); + + // Test metadata with reserved charactors. + const absl::string_view request_path_6 = + "/v1/models/" + "modelname%21%23%24%25%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D/" + "labels/latest%21%23%24%25%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D/" + "metadata"; + TF_EXPECT_OK(ParseModelInfo("GET", request_path_6, &model_name, + &model_version, &model_version_label, &method, + &model_subresource, &parse_successful)); + EXPECT_EQ(model_name, "modelname!#$%&'()*+,/:;=?@[]"); + EXPECT_EQ(model_version_label.value(), "latest!#$%&'()*+,/:;=?@[]"); + EXPECT_EQ(model_subresource, "metadata"); + EXPECT_TRUE(parse_successful); + + // Test failure cases. + TF_EXPECT_OK(ParseModelInfo("GET", "/v1/foo", &model_name, &model_version, + &model_version_label, &method, &model_subresource, + &parse_successful)); + EXPECT_FALSE(parse_successful); + TF_EXPECT_OK(ParseModelInfo("GET", "/v1/models/foo:predict", &model_name, + &model_version, &model_version_label, &method, + &model_subresource, &parse_successful)); + EXPECT_FALSE(parse_successful); + TF_EXPECT_OK(ParseModelInfo("GET", "/v1/models/foo/version/50:predict", + &model_name, &model_version, &model_version_label, + &method, &model_subresource, &parse_successful)); + EXPECT_FALSE(parse_successful); +} + +TEST_F(HttpRestApiUtilTest, TestParseModelInfoForPost) { + string model_name; + absl::optional model_version; + absl::optional model_version_label; + string method; + string model_subresource; + bool parse_successful; + + // Test reserved charactors in model name. + const absl::string_view request_path_1 = + "/v1/models/" + "modelname%21%23%24%25%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D:" + "predict"; + TF_EXPECT_OK(ParseModelInfo("POST", request_path_1, &model_name, + &model_version, &model_version_label, &method, + &model_subresource, &parse_successful)); + EXPECT_EQ(model_name, "modelname!#$%&'()*+,/:;=?@[]"); + EXPECT_EQ(method, "predict"); + EXPECT_TRUE(parse_successful); + + // Test model version. + const absl::string_view request_path_2 = + "/v1/models/modelname/versions/99:predict"; + TF_EXPECT_OK(ParseModelInfo("POST", request_path_2, &model_name, + &model_version, &model_version_label, &method, + &model_subresource, &parse_successful)); + EXPECT_EQ(model_name, "modelname"); + EXPECT_EQ(model_version.value(), 99); + EXPECT_EQ(method, "predict"); + EXPECT_TRUE(parse_successful); + + // Test labels. + const absl::string_view request_path_3 = + "/v1/models/modelname/labels/latest:predict"; + TF_EXPECT_OK(ParseModelInfo("POST", request_path_3, &model_name, + &model_version, &model_version_label, &method, + &model_subresource, &parse_successful)); + EXPECT_EQ(model_name, "modelname"); + EXPECT_EQ(model_version_label.value(), "latest"); + EXPECT_EQ(method, "predict"); + EXPECT_TRUE(parse_successful); + + // Test labels with reserved charactors. + const absl::string_view request_path_4 = + "/v1/models/modelname/labels/" + "latest%21%23%24%25%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D:predict"; + TF_EXPECT_OK(ParseModelInfo("POST", request_path_4, &model_name, + &model_version, &model_version_label, &method, + &model_subresource, &parse_successful)); + EXPECT_EQ(model_name, "modelname"); + EXPECT_EQ(model_version_label.value(), "latest!#$%&'()*+,/:;=?@[]"); + EXPECT_EQ(method, "predict"); + EXPECT_TRUE(parse_successful); + + // Test reserved charactors in labels and model name. + const absl::string_view request_path_6 = + "/v1/models/" + "modelname%21%23%24%25%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D/" + "labels/" + "latest%21%23%24%25%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D:predict"; + TF_EXPECT_OK(ParseModelInfo("POST", request_path_6, &model_name, + &model_version, &model_version_label, &method, + &model_subresource, &parse_successful)); + EXPECT_EQ(model_name, "modelname!#$%&'()*+,/:;=?@[]"); + EXPECT_EQ(model_version_label.value(), "latest!#$%&'()*+,/:;=?@[]"); + EXPECT_EQ(method, "predict"); + EXPECT_TRUE(parse_successful); + + // Test failure cases. + TF_EXPECT_OK(ParseModelInfo("POST", "/v1/foo", &model_name, &model_version, + &model_version_label, &method, &model_subresource, + &parse_successful)); + EXPECT_FALSE(parse_successful); + TF_EXPECT_OK(ParseModelInfo("POST", "/v1/models", &model_name, &model_version, + &model_version_label, &method, &model_subresource, + &parse_successful)); + EXPECT_FALSE(parse_successful); + TF_EXPECT_OK(ParseModelInfo("POST", "/v1/models/foo/version/50:predict", + &model_name, &model_version, &model_version_label, + &method, &model_subresource, &parse_successful)); + EXPECT_FALSE(parse_successful); + TF_EXPECT_OK(ParseModelInfo("POST", "/v1/models/foo/versions/string:predict", + &model_name, &model_version, &model_version_label, + &method, &model_subresource, &parse_successful)); + EXPECT_FALSE(parse_successful); + auto status = ParseModelInfo( + "POST", + absl::StrCat("/v1/models/foo/versions/", + std::numeric_limits::max(), ":predict"), + &model_name, &model_version, &model_version_label, &method, + &model_subresource, &parse_successful); + EXPECT_TRUE(parse_successful); + EXPECT_TRUE(errors::IsInvalidArgument(status)); + EXPECT_THAT(status.error_message(), HasSubstr("Failed to convert version")); + TF_EXPECT_OK(ParseModelInfo("POST", "/v1/models/foo/metadata", &model_name, + &model_version, &model_version_label, &method, + &model_subresource, &parse_successful)); + EXPECT_FALSE(parse_successful); + TF_EXPECT_OK(ParseModelInfo( + "POST", "/v1/models/foo/versions/50/labels/some_label:regress", + &model_name, &model_version, &model_version_label, &method, + &model_subresource, &parse_successful)); + EXPECT_FALSE(parse_successful); +} +} // namespace +} // namespace serving +} // namespace tensorflow From 0ed23dfe3d02e8bfcf19907da4b3d764146eefc0 Mon Sep 17 00:00:00 2001 From: Abolfazl Shahbazi Date: Thu, 4 Feb 2021 14:39:45 -0800 Subject: [PATCH 4694/8103] Fixing MKL builds due to missing 'build_with_openmp' option --- .bazelrc | 2 +- tensorflow_serving/tools/docker/Dockerfile.devel-mkl | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.bazelrc b/.bazelrc index a759ad92eec..88b734df61b 100644 --- a/.bazelrc +++ b/.bazelrc @@ -11,7 +11,7 @@ build:cuda --action_env=TF_CUDA_COMPUTE_CAPABILITIES="sm_35,sm_50,sm_60,sm_70,sm # Please note that MKL on MacOS or windows is still not supported. # If you would like to use a local MKL instead of downloading, please set the # environment variable "TF_MKL_ROOT" every time before build. -build:mkl --define=build_with_mkl=true --define=enable_mkl=true +build:mkl --define=build_with_mkl=true --define=enable_mkl=true --define=build_with_openmp=true build:mkl --define=tensorflow_mkldnn_contraction_kernel=0 # This config option is used to enable MKL-DNN open source library only, diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl index 70c4c146f9e..26fb88bfac7 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl @@ -119,8 +119,8 @@ RUN bazel build --color=yes --curses=yes \ /tmp/pip/tensorflow_serving_api-*.whl && \ rm -rf /tmp/pip -# Copy MKL libraries -RUN cp /root/.cache/bazel/_bazel_root/*/external/mkl_linux/lib/* /usr/local/lib +# Copy openmp libraries +# RUN cp /root/.cache/bazel/_bazel_root/*/external/mkl_linux/lib/* /usr/local/lib ENV LIBRARY_PATH '/usr/local/lib:$LIBRARY_PATH' ENV LD_LIBRARY_PATH '/usr/local/lib:$LD_LIBRARY_PATH' From ca1978c87edea586e3a231af6daca3f0450e1f35 Mon Sep 17 00:00:00 2001 From: Abolfazl Shahbazi Date: Thu, 4 Feb 2021 14:43:57 -0800 Subject: [PATCH 4695/8103] Copy 'libiomp5.so' libs --- tensorflow_serving/tools/docker/Dockerfile.devel-mkl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl index 26fb88bfac7..c6e05e4de2b 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl @@ -120,7 +120,7 @@ RUN bazel build --color=yes --curses=yes \ rm -rf /tmp/pip # Copy openmp libraries -# RUN cp /root/.cache/bazel/_bazel_root/*/external/mkl_linux/lib/* /usr/local/lib +RUN cp /root/.cache/bazel/_bazel_root/*/execroot/tf_serving/bazel-out/k8-opt/bin/external/llvm_openmp/libiomp5.so /usr/local/lib/ ENV LIBRARY_PATH '/usr/local/lib:$LIBRARY_PATH' ENV LD_LIBRARY_PATH '/usr/local/lib:$LD_LIBRARY_PATH' From 70efc4a6d2bfab6d0a6d53f5d72d38ad5cf594dc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Feb 2021 18:01:35 -0800 Subject: [PATCH 4696/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ac1f407b-b337-4989-987d-242eb51a8a00 PiperOrigin-RevId: 355752225 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4d323855cd3..2bf50fd3b9a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "577b27b157a09ef5bf6912af0d53564397549b9d16f4bd6c4f1ebb553312174b", - git_commit = "3094612f3c964e89f0e98dfd6031052eec505fea", + sha256 = "23b3650f550d3486ad02e2cadee7560cc23e5a2ca8e76eba944dc29d8769a7c8", + git_commit = "e8081ab35308dbff3957490f85b1503303b9e8fa", ) # Import all of TensorFlow Serving's external dependencies. From a8b3f4d0f8bc8663fddda344b17f2bb1782a9cec Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Feb 2021 12:01:47 -0800 Subject: [PATCH 4697/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e340c5e7-cfb8-4319-ba3b-b4ca9472da5d PiperOrigin-RevId: 355898762 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2bf50fd3b9a..1588e89d898 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "23b3650f550d3486ad02e2cadee7560cc23e5a2ca8e76eba944dc29d8769a7c8", - git_commit = "e8081ab35308dbff3957490f85b1503303b9e8fa", + sha256 = "dd2763d86dd8fbd1a092ea952b543267f85a9a53d88d8c7b6296b6db54da15bb", + git_commit = "ed22f400428a669c1c6e4553cd7f4900abeaf954", ) # Import all of TensorFlow Serving's external dependencies. From 06fcebff0cd2f2b440e5393ee67e16137be6f58b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Feb 2021 18:01:35 -0800 Subject: [PATCH 4698/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5deb0aca-277d-4d4d-bf7d-281105f82716 PiperOrigin-RevId: 355965097 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1588e89d898..722bcf2c193 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dd2763d86dd8fbd1a092ea952b543267f85a9a53d88d8c7b6296b6db54da15bb", - git_commit = "ed22f400428a669c1c6e4553cd7f4900abeaf954", + sha256 = "a66ed4dbaff46d4c479f4a22c5bbdb9e8db4a5ef6b72eda8b1de7c8e261c83df", + git_commit = "4413f34d5cf499df99999cb1d99d6021cbd99e13", ) # Import all of TensorFlow Serving's external dependencies. From 702a9c1de21811e8bd765e31f7a16b191e600ad4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 6 Feb 2021 00:01:50 -0800 Subject: [PATCH 4699/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c91e7ac4-9f5e-4d3d-8e02-2b67c9aea63f PiperOrigin-RevId: 355997508 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 722bcf2c193..4b1769ff10c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a66ed4dbaff46d4c479f4a22c5bbdb9e8db4a5ef6b72eda8b1de7c8e261c83df", - git_commit = "4413f34d5cf499df99999cb1d99d6021cbd99e13", + sha256 = "ea60b74ed0649d94742eed3d95df83b4f49511159b9e69df9711e1d3a640105b", + git_commit = "5cac4cf3c9987b6b98b38b6ceffc313167f538c3", ) # Import all of TensorFlow Serving's external dependencies. From 50de41d8fdd641179306a979c96c1c0ef3cf92d4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 6 Feb 2021 06:01:30 -0800 Subject: [PATCH 4700/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/baffd680-91ec-4e6d-83e3-9295c6987ff8 PiperOrigin-RevId: 356022356 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4b1769ff10c..6de49612041 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ea60b74ed0649d94742eed3d95df83b4f49511159b9e69df9711e1d3a640105b", - git_commit = "5cac4cf3c9987b6b98b38b6ceffc313167f538c3", + sha256 = "9410d097f4deaca096ed185c3c711c1a32c7b006f6dc08fcb6ef7df3204d91b2", + git_commit = "35e18e3e7a698f7e94c6dc19162734f4e1cd162d", ) # Import all of TensorFlow Serving's external dependencies. From 44e0a4debd33fafbe06d2012300ef241375d541c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 6 Feb 2021 18:01:15 -0800 Subject: [PATCH 4701/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/42f12409-8ec5-47de-b575-d44b160564b0 PiperOrigin-RevId: 356070668 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6de49612041..82bf84a1891 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9410d097f4deaca096ed185c3c711c1a32c7b006f6dc08fcb6ef7df3204d91b2", - git_commit = "35e18e3e7a698f7e94c6dc19162734f4e1cd162d", + sha256 = "2bd5c4183a5c3dee34cb74b7ed1b3b6e7e4eb5a1694fc605b0a6dd845ce8ba69", + git_commit = "3972968db9950d9c76c190b42eac4447184f6c06", ) # Import all of TensorFlow Serving's external dependencies. From aa2ea2c446d3f150be6dd6d1e9c7e52fcc98294a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 7 Feb 2021 06:01:32 -0800 Subject: [PATCH 4702/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/26ee6574-46c2-4fff-b9f8-5085444f6ee7 PiperOrigin-RevId: 356119817 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 82bf84a1891..c1ea7d6709e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2bd5c4183a5c3dee34cb74b7ed1b3b6e7e4eb5a1694fc605b0a6dd845ce8ba69", - git_commit = "3972968db9950d9c76c190b42eac4447184f6c06", + sha256 = "c8ac52b2558d5c87a20e16eb2041e1bb7a6b6f8d3b89ec2d3e2acfc88d831bce", + git_commit = "b8d2a994e4fda783f27894689b85c73581998407", ) # Import all of TensorFlow Serving's external dependencies. From fec1d5db3cec6c81635e6f77923f3112f09a0289 Mon Sep 17 00:00:00 2001 From: David Rim Date: Sun, 7 Feb 2021 17:10:21 -0800 Subject: [PATCH 4703/8103] Implement batch parallelism for tflite sessions PiperOrigin-RevId: 356167118 --- tensorflow_serving/model_servers/main.cc | 9 +- tensorflow_serving/model_servers/server.cc | 5 +- tensorflow_serving/model_servers/server.h | 3 +- tensorflow_serving/servables/tensorflow/BUILD | 38 ++ .../tensorflow/saved_model_bundle_factory.cc | 13 +- .../tensorflow/session_bundle_config.proto | 7 +- .../testdata/parse_example_tflite.py | 5 +- .../00000123/model.tflite | Bin 1792 -> 1584 bytes .../tensorflow/tflite_interpreter_pool.cc | 246 +++++++++-- .../tensorflow/tflite_interpreter_pool.h | 177 +++++++- .../tflite_interpreter_pool_test.cc | 269 ++++++++++++ .../servables/tensorflow/tflite_session.cc | 394 ++++++++++++------ .../servables/tensorflow/tflite_session.h | 29 +- .../tensorflow/tflite_session_main.cc | 6 +- .../tensorflow/tflite_session_test.cc | 152 +++++-- 15 files changed, 1107 insertions(+), 246 deletions(-) create mode 100644 tensorflow_serving/servables/tensorflow/tflite_interpreter_pool_test.cc diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index 2d4f257d951..a83f95cce66 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -213,11 +213,18 @@ int main(int argc, char** argv) { "If no TensorFlow Lite model found, fallback to " "TensorFlow model."), tensorflow::Flag( - "num_tflite_interpreters", &options.num_tflite_interpreters, + "num_tflite_pools", &options.num_tflite_pools, "EXPERIMENTAL; CAN BE REMOVED ANYTIME! Number of TFLite interpreters " "in an interpreter pool of TfLiteSession. Typically there is one " "TfLiteSession for each TF Lite model that is loaded. If not " "set, will be auto set based on number of CPUs."), + tensorflow::Flag( + "num_tflite_interpreters_per_pool", + &options.num_tflite_interpreters_per_pool, + "EXPERIMENTAL; CAN BE REMOVED ANYTIME! Number of TFLite interpreters " + "in an interpreter pool of TfLiteSession. Typically there is one " + "TfLiteSession for each TF Lite model that is loaded. If not " + "set, will be 1."), tensorflow::Flag( "enable_signature_method_name_check", &options.enable_signature_method_name_check, diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index 6dfabae994e..0e4ca2343c6 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -277,8 +277,9 @@ Status Server::BuildAndStart(const Options& server_options) { server_options.remove_unused_fields_from_bundle_metagraph); session_bundle_config.set_prefer_tflite_model( server_options.prefer_tflite_model); - session_bundle_config.set_num_tflite_interpreters( - server_options.num_tflite_interpreters); + session_bundle_config.set_num_tflite_interpreters_per_pool( + server_options.num_tflite_interpreters_per_pool); + session_bundle_config.set_num_tflite_pools(server_options.num_tflite_pools); options.platform_config_map = CreateTensorFlowPlatformConfigMap(session_bundle_config); } else { diff --git a/tensorflow_serving/model_servers/server.h b/tensorflow_serving/model_servers/server.h index d06d2499867..bcb55db1592 100644 --- a/tensorflow_serving/model_servers/server.h +++ b/tensorflow_serving/model_servers/server.h @@ -88,7 +88,8 @@ class Server { bool enforce_session_run_timeout = true; bool remove_unused_fields_from_bundle_metagraph = true; bool prefer_tflite_model = false; - tensorflow::int32 num_tflite_interpreters = port::NumSchedulableCPUs(); + tensorflow::int32 num_tflite_pools = port::NumSchedulableCPUs(); + tensorflow::int32 num_tflite_interpreters_per_pool = 1; tensorflow::string thread_pool_factory_config_file; bool enable_signature_method_name_check = false; diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index 8350bfdf6db..04ddf572452 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -325,17 +325,25 @@ cc_library( ":serving_session", "@com_google_absl//absl/base:core_headers", "@com_google_absl//absl/synchronization", + "@com_google_absl//absl/types:span", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", + "@org_tensorflow//tensorflow/core:session_options", + "@org_tensorflow//tensorflow/lite:external_cpu_backend_context", "@org_tensorflow//tensorflow/lite:framework", "@org_tensorflow//tensorflow/lite:string_util", "@org_tensorflow//tensorflow/lite:util", "@org_tensorflow//tensorflow/lite/c:common", "@org_tensorflow//tensorflow/lite/delegates/flex:delegate", "@org_tensorflow//tensorflow/lite/kernels:builtin_ops", + "@org_tensorflow//tensorflow/lite/kernels:cpu_backend_context", "@org_tensorflow//tensorflow/lite/kernels/hashtable:hashtable_op_kernels", + "@org_tensorflow//tensorflow/lite/kernels/internal:tensor_utils", "@org_tensorflow//tensorflow/lite/kernels/parse_example", + "@org_tensorflow//tensorflow/lite/profiling:profile_summarizer", + "@org_tensorflow//tensorflow/lite/profiling:profile_summary_formatter", + "@org_tensorflow//tensorflow/lite/profiling:profiler", "@org_tensorflow//tensorflow/lite/tools/signature:signature_def_util", ], ) @@ -362,6 +370,36 @@ cc_test( "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", "@org_tensorflow//tensorflow/core:testlib", + "@org_tensorflow//tensorflow/lite:string_util", + "@org_tensorflow//tensorflow/lite:util", + "@org_tensorflow//tensorflow/lite:version", + "@org_tensorflow//tensorflow/lite/tools/signature:signature_def_util", + ], +) + +cc_test( + name = "tflite_interpreter_pool_test", + size = "small", + srcs = ["tflite_interpreter_pool_test.cc"], + data = [ + "//tensorflow_serving/servables/tensorflow/testdata:mobilenet_v1_quant_tflite", + "//tensorflow_serving/servables/tensorflow/testdata:parse_example_tflite", + "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_tflite", + "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_tflite_with_sigdef", + ], + deps = [ + ":tflite_session_lib", + "//tensorflow_serving/core/test_util:test_main", + "//tensorflow_serving/test_util", + "@com_google_absl//absl/flags:flag", + "@com_google_protobuf//:protobuf", + "@flatbuffers", + "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", + "@org_tensorflow//tensorflow/core:lib", + "@org_tensorflow//tensorflow/core:protos_all_cc", + "@org_tensorflow//tensorflow/core:test", + "@org_tensorflow//tensorflow/core:testlib", + "@org_tensorflow//tensorflow/lite:string_util", "@org_tensorflow//tensorflow/lite:util", "@org_tensorflow//tensorflow/lite:version", "@org_tensorflow//tensorflow/lite/tools/signature:signature_def_util", diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc index d4818543943..2367ebe9b9d 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc @@ -63,7 +63,8 @@ Status ParseFixedInputTensors( const char kTfLiteModelFilename[] = "model.tflite"; Status LoadTfLiteModel(const string& model_dir, SavedModelBundle* bundle, - int num_interpreters) { + const SessionOptions& options, int num_interpreter_pools, + int num_interpreters_per_pool) { std::unique_ptr session; const string& fname = io::JoinPath(model_dir, kTfLiteModelFilename); @@ -80,8 +81,9 @@ Status LoadTfLiteModel(const string& model_dir, SavedModelBundle* bundle, std::unique_ptr tflite_session; TF_RETURN_IF_ERROR(TfLiteSession::Create( - std::move(model_bytes), &tflite_session, - bundle->meta_graph_def.mutable_signature_def(), num_interpreters)); + std::move(model_bytes), options, num_interpreter_pools, + num_interpreters_per_pool, &tflite_session, + bundle->meta_graph_def.mutable_signature_def())); bundle->session = std::move(tflite_session); return Status::OK(); } @@ -145,8 +147,9 @@ Status SavedModelBundleFactory::InternalCreateSavedModelBundle( }(); if (config_.prefer_tflite_model() && TfLiteModelFound(path)) { - TF_RETURN_IF_ERROR(LoadTfLiteModel(path, bundle->get(), - config_.num_tflite_interpreters())); + TF_RETURN_IF_ERROR(LoadTfLiteModel( + path, bundle->get(), session_options, config_.num_tflite_pools(), + config_.num_tflite_interpreters_per_pool())); } else { TF_RETURN_IF_ERROR(session_bundle::LoadSessionBundleOrSavedModelBundle( session_options, GetRunOptions(config_), path, saved_model_tags, diff --git a/tensorflow_serving/servables/tensorflow/session_bundle_config.proto b/tensorflow_serving/servables/tensorflow/session_bundle_config.proto index e6fdae3df10..ae4eef45140 100644 --- a/tensorflow_serving/servables/tensorflow/session_bundle_config.proto +++ b/tensorflow_serving/servables/tensorflow/session_bundle_config.proto @@ -97,7 +97,12 @@ message SessionBundleConfig { // EXPERIMENTAL. THIS FIELD MAY CHANGE OR GO AWAY. USE WITH CAUTION. // // Number of TFLite interpreters in an interpreter pool of TfLiteSession. - int32 num_tflite_interpreters = 785; + int32 num_tflite_interpreters_per_pool = 785; + + // EXPERIMENTAL. THIS FIELD MAY CHANGE OR GO AWAY. USE WITH CAUTION. + // + // Number of TFLite interpreter pools in a TfLiteSession. + int32 num_tflite_pools = 786; } // Batching parameters. Each individual parameter is optional. If omitted, the diff --git a/tensorflow_serving/servables/tensorflow/testdata/parse_example_tflite.py b/tensorflow_serving/servables/tensorflow/testdata/parse_example_tflite.py index dd389f74b67..854322a9f08 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/parse_example_tflite.py +++ b/tensorflow_serving/servables/tensorflow/testdata/parse_example_tflite.py @@ -79,9 +79,8 @@ def _generate_tflite_for_parse_example_with_string(export_dir): _get_feature_spec()) converter = tf.lite.TFLiteConverter.from_session( sess, [serialized_tf_example], [tf_example["x"], tf_example["y"]]) - converter.target_spec.supported_ops = [ - tf.lite.OpsSet.TFLITE_BUILTINS, tf.lite.OpsSet.SELECT_TF_OPS - ] + converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS] + converter.allow_custom_ops = True tflite_model = converter.convert() predict_signature_def = _build_predict_signature(serialized_tf_example, tf_example["x"], diff --git a/tensorflow_serving/servables/tensorflow/testdata/parse_example_tflite/00000123/model.tflite b/tensorflow_serving/servables/tensorflow/testdata/parse_example_tflite/00000123/model.tflite index 831eb985bcd45f378acc4a2df8e2c98fb108faf3..4fa12ea0237d6e16f13896469622903fe319f16d 100644 GIT binary patch delta 139 zcmZqR+rTqHh3N|GMzv>*LI!{S|7Sn~4u2-gG1UnkKoh<&c`cJQ*Ak$@89>~@F!>Xc zk-7*LMgxh|7Sn~CBG-jG1UovK@(<~yq3wDtALS#Aq9v-7$<*X zGOA|)GCu(IvHAi$gt&N$3qXd%msA#{77HCaG7Z>DYmLO#Okfh2Ib4rml32<@c zmF5Cu13#{LK?|Vj%SqRWMH~|Mnr@~gK@Jr T^F<~JA)v3^a#AbMJjMV3`NC16 diff --git a/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.cc b/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.cc index 4b2e846d917..b459b0f8b8e 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.cc @@ -15,9 +15,11 @@ limitations under the License. #include "tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h" +#include #include #include +#include "tensorflow/core/platform/errors.h" #include "tensorflow/lite/kernels/hashtable/hashtable_ops.h" #include "tensorflow/lite/kernels/parse_example/parse_example.h" #include "tensorflow/lite/kernels/register.h" @@ -26,64 +28,236 @@ namespace tensorflow { namespace serving { namespace internal { -Status TfLiteInterpreterPool::CreateTfLiteInterpreterPool( - const tflite::FlatBufferModel& model, int num_interpreters, +TfLiteInterpreterWrapper::TfLiteInterpreterWrapper( + std::unique_ptr interpreter) + : +#ifdef TFLITE_PROFILE + interpreter_(std::move(interpreter)), + fixed_batch_size_(fixed_batch_size), + max_num_entries_(TFLITE_PROFILE_EVENTS), + profiler_(max_num_entries_) +#else + interpreter_(std::move(interpreter)) +#endif +{ +#ifdef TFLITE_PROFILE + interpreter_->SetProfiler(&profiler_); +#endif + for (const int& idx : interpreter_->inputs()) { + const auto* tflite_tensor = interpreter_->tensor(idx); + if (tflite_tensor->type == kTfLiteString) { + tensor_buffer_.emplace(idx, + std::unique_ptr(tflite_tensor->data.raw)); + tensor_buffer_max_bytes_[idx] = 0; + } + } +} + +tensorflow::Status TfLiteInterpreterWrapper::SetStringData( + const gtl::ArraySlice& batch, + TfLiteTensor* tflite_tensor, int tensor_index) { + // Format of the buffer for tflite: + // [0] number of strings (int32_t) + // [4] offset of each string (int32_t) + // [sizeof(int32_t) * (num_strings + 1)]] total size of strings + // [sizeof(int32_t) * (num_strings + 2)] batch.data() + int32_t num_strings = batch.size(); + offset_.clear(); + size_t total_size = 0; + offset_.push_back(static_cast(total_size)); + for (int i = 0; i < num_strings; i++) { + total_size += batch[i].size(); + offset_.push_back(static_cast(total_size)); + } + size_t required_bytes = total_size + sizeof(int32_t) * (num_strings + 2); + if (tensor_buffer_.find(tensor_index) == tensor_buffer_.end()) { + return errors::Internal("Tensor input for index not found: ", tensor_index); + } + if (tensor_buffer_max_bytes_[tensor_index] > 0 && + required_bytes > tensor_buffer_max_bytes_[tensor_index]) { + tensor_buffer_max_bytes_[tensor_index] = 0; + } + + if (tensor_buffer_max_bytes_[tensor_index] == 0) { + tensor_buffer_[tensor_index].reset( + reinterpret_cast(malloc(required_bytes))); + tensor_buffer_max_bytes_[tensor_index] = required_bytes; + } else { + tensor_buffer_[tensor_index].reset(tflite_tensor->data.raw); + } + memcpy(tensor_buffer_[tensor_index].get(), &num_strings, sizeof(int32_t)); + int32_t start = sizeof(int32_t) * (num_strings + 2); + for (size_t i = 0; i < offset_.size(); i++) { + size_t size_offset_i = start + offset_[i]; + if (size_offset_i > std::numeric_limits::max()) { + return errors::Internal("Invalid size, string input too large:", + size_offset_i); + } + int32_t offset_i = static_cast(size_offset_i); + memcpy(tensor_buffer_[tensor_index].get() + sizeof(int32_t) * (i + 1), + &offset_i, sizeof(int32_t)); + } + for (int i = 0; i < num_strings; i++) { + memcpy(tensor_buffer_[tensor_index].get() + start, batch[i].data(), + batch[i].size()); + start += batch[i].size(); + } + + // tflite_tensor will take ownership of the pointer. + tflite_tensor->data.raw = tensor_buffer_[tensor_index].release(); + tflite_tensor->bytes = required_bytes; + tflite_tensor->allocation_type = kTfLiteDynamic; + return Status::OK(); +} + +TfLiteStatus TfLiteInterpreterWrapper::Invoke() { +#ifdef TFLITE_PROFILE + if (invocation_count_ > 0) { + profiler_.Reset(); + profiler_.StartProfiling(); + } +#endif + auto status = interpreter_->Invoke(); +#ifdef TFLITE_PROFILE + if (invocation_count_ > 0) { + profiler_.StopProfiling(); + auto profile_events = profiler_.GetProfileEvents(); + run_summarizer_.ProcessProfiles(profile_events, *interpreter_); + } + if (invocation_count_++ >= MAX_PROFILE_EVENTS) { + WriteProfileData(); + run_summarizer_.Clear(); + invocation_count_ = 0; + } +#endif + return status; +} + +tensorflow::Status TfLiteInterpreterPool::CreateTfLiteInterpreterPool( + const tflite::FlatBufferModel& model, bool run_in_caller, + bool use_batch_parallelism, int batch_pool_size, int id, + const tensorflow::SessionOptions& options, std::unique_ptr& pool) { + // If can't use_batch_parallelism or pool size is 1, + // just use 1 interpreter and run in caller. + if (!use_batch_parallelism || batch_pool_size == 1) { + run_in_caller = true; + batch_pool_size = 1; + use_batch_parallelism = false; + } + std::unique_ptr thread_pool; + int num_interpreters = run_in_caller ? 1 : 0; + if (!run_in_caller || use_batch_parallelism) { + thread_pool.reset(new tensorflow::thread::ThreadPool( + options.env, tensorflow::ThreadOptions(), + absl::StrCat(kTfLiteThreadPoolName, id), batch_pool_size, false, + nullptr)); + num_interpreters += thread_pool->NumThreads(); + } + // TODO(b/140959776): Add support for non-builtin ops (flex or custom ops). tflite::ops::builtin::BuiltinOpResolver resolver; + tflite::ops::custom::AddParseExampleOp(&resolver); // TODO(b/165643512): Remove adding Hashtable to resolver by default. tflite::ops::custom::AddHashtableOps(&resolver); - tflite::ops::custom::AddParseExampleOp(&resolver); - num_interpreters = std::max(num_interpreters, 1); + int fixed_batch_size = 1; + if (use_batch_parallelism) { + if (num_interpreters < 1) { + return errors::InvalidArgument( + "CreateTfLiteInterpreterPool requested ", + "invalid number of interpreters: ", num_interpreters); + } + fixed_batch_size = + (kInitialBatchSize + num_interpreters - 1) / num_interpreters; + } + std::vector> interpreters; - std::vector> interpreters; - interpreters.reserve(num_interpreters); for (int i = 0; i < num_interpreters; i++) { std::unique_ptr interpreter; - if (tflite::InterpreterBuilder(model, resolver)(&interpreter) != - kTfLiteOk) { + if (tflite::InterpreterBuilder(model, resolver)( + &interpreter, /*num_threads=*/1) != kTfLiteOk) { return errors::Internal( "Failed to create a TFLite interpreter with the given model"); } + const int idx = interpreter->inputs()[0]; + const auto* tensor = interpreter->tensor(idx); + if (tensor->type == kTfLiteString) { + interpreter->ResizeInputTensor(idx, {fixed_batch_size}); + } if (interpreter->AllocateTensors() != kTfLiteOk) { return errors::Internal("Failed to allocate tensors"); } - interpreters.push_back(std::move(interpreter)); + interpreters.push_back( + std::make_unique(std::move(interpreter))); + interpreters.back()->SetMiniBatchSize(fixed_batch_size); } - - pool.reset(new TfLiteInterpreterPool(std::move(interpreters))); - return Status::OK(); + pool.reset(new TfLiteInterpreterPool( + id, std::move(interpreters), std::move(thread_pool), num_interpreters, + fixed_batch_size, use_batch_parallelism)); + return tensorflow::Status::OK(); } TfLiteInterpreterPool::TfLiteInterpreterPool( - std::vector> interpreters) - : interpreters_(std::move(interpreters)) { - auto num_interpreters = interpreters_.size(); - available_.reserve(num_interpreters); - for (int i = 0; i < num_interpreters; i++) { - available_.push_back(interpreters_[i].get()); - } + int id, std::vector> interpreters, + std::unique_ptr thread_pool, + int num_interpreters, int fixed_batch_size, bool use_batch_parallelism) + : id_(id), + interpreters_(std::move(interpreters)), + thread_pool_(std::move(thread_pool)), + num_interpreters_(num_interpreters), + fixed_batch_size_(fixed_batch_size), + use_batch_parallelism_(use_batch_parallelism) {} + +std::unique_ptr& +TfLiteInterpreterPool::GetInterpreter(int interpreter_idx) { + return interpreters_[interpreter_idx]; } -std::unique_ptr -TfLiteInterpreterPool::GetInterpreter() { - auto interpreter_available = [this]() ABSL_SHARED_LOCKS_REQUIRED(mutex_) { - return !this->available_.empty(); - }; - mutex_.LockWhen(absl::Condition(&interpreter_available)); - - tflite::Interpreter* interpreter = available_.back(); - available_.pop_back(); - mutex_.Unlock(); - auto interpreter_wrapper = - std::make_unique(interpreter, this); - return interpreter_wrapper; +namespace { + +bool IsBatchParallelizable(const tflite::Model* model) { + auto tflite_model = absl::make_unique(); + model->UnPackTo(tflite_model.get(), nullptr); + if (tflite_model->subgraphs.empty()) { + return false; + } + const auto& subgraph = tflite_model->subgraphs[0]; + if (subgraph->inputs.size() != 1) { + return false; + } + int input_tensor_id = subgraph->inputs[0]; + const std::vector supported_ops = {"ParseExample", "ParseExampleV2"}; + for (size_t op_idx = 0; op_idx < subgraph->operators.size(); op_idx++) { + tflite::OperatorT* op = subgraph->operators[op_idx].get(); + if (std::find(op->inputs.begin(), op->inputs.end(), input_tensor_id) != + op->inputs.end()) { + const std::string& custom_code = + tflite_model->operator_codes[op->opcode_index]->custom_code; + return std::find(supported_ops.begin(), supported_ops.end(), + custom_code) != supported_ops.end(); + } + } + return false; } -void TfLiteInterpreterPool::ReturnInterpreter( - tflite::Interpreter* interpreter) { - absl::MutexLock l(&mutex_); - available_.push_back(interpreter); +} // namespace + +tensorflow::Status TfLiteSessionPool::CreateTfLiteSessionPool( + const tflite::FlatBufferModel* model, + const tensorflow::SessionOptions& options, bool run_in_caller, + int pool_size, int batch_pool_size, + std::unique_ptr& tflite_session_pool) { + bool use_batch_parallelism = IsBatchParallelizable(model->GetModel()); + std::vector> pools; + for (int i = 0; i < pool_size; i++) { + std::unique_ptr pool; + TF_RETURN_IF_ERROR(TfLiteInterpreterPool::CreateTfLiteInterpreterPool( + *model, run_in_caller, use_batch_parallelism, batch_pool_size, i, + options, pool)); + pools.push_back(std::move(pool)); + } + tflite_session_pool.reset(new TfLiteSessionPool(std::move(pools))); + return tensorflow::Status::OK(); } } // namespace internal diff --git a/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h b/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h index c18a138ec55..9ac320be379 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h +++ b/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h @@ -21,54 +21,185 @@ limitations under the License. #include "absl/base/thread_annotations.h" #include "absl/synchronization/mutex.h" -#include "tensorflow/core/lib/core/errors.h" +#include "tensorflow/core/common_runtime/process_util.h" +#include "tensorflow/core/lib/gtl/array_slice.h" +#include "tensorflow/core/platform/cpu_info.h" +#include "tensorflow/core/platform/tstring.h" +#include "tensorflow/core/public/session_options.h" +#include "tensorflow/lite/c/common.h" #include "tensorflow/lite/model.h" +#ifdef TFLITE_PROFILE +#ifndef TFLITE_PROFILE_EVENTS +#define TFLITE_PROFILE_EVENTS 2000 +#endif +#include "tensorflow/lite/profiling/buffered_profiler.h" +#include "tensorflow/lite/profiling/profile_summarizer.h" +#include "tensorflow/lite/profiling/profile_summary_formatter.h" +#endif +#include "tensorflow/lite/string_util.h" namespace tensorflow { namespace serving { namespace internal { +constexpr char kTfLiteThreadPoolName[] = "tflite_compute"; + +constexpr int kInitialBatchSize = 500; + class TfLiteInterpreterWrapper; -// A TFLite interpreter pool to maintain pre-created tflite::Interpreter -// objects. This class is thread-safe. +// A TFLite batch pool to maintain pre-created tflite::Interpreter +// objects. class TfLiteInterpreterPool { public: - // Create an interpreter pool with the given TFLite model and number of - // interpreters. The model must outlive the returned pool instance. + // Create a vector of TfLiteInterpreterWrapper objects with the given TFLite + // FlatBufferModel `model`. + // The number of created interpreters will depend on batch_pool_size, + // whether the calling thread requires a interpreter, `run_in_caller`, and + // whether the model can make use of batch parallelism. + // If the model cannot make use of batch parallelism, only + // a single interpreter will be created. Otherwise, the setting is set by + // batch_pool_size + 1 if run_in_caller is true. + // The model must outlive the returned pool instance. static Status CreateTfLiteInterpreterPool( - const tflite::FlatBufferModel& model, int num_interpreters, + const tflite::FlatBufferModel& model, bool run_in_caller, + bool use_batch_parallelism, int batch_pool_size, int id, + const tensorflow::SessionOptions& options, std::unique_ptr& pool); - // Returns a TFLite interpreter wrapper object. Caller may *block* waiting for - // a free interpreter to be available. - std::unique_ptr GetInterpreter(); + + // The allocated batch size of the TfLite interpreters. + int FixedBatchSize() { return fixed_batch_size_; } + + // Returns an interpreter wrapper from the pool at the given index. + std::unique_ptr& GetInterpreter( + int interpreter_idx); + + // The Id of the interpreterwrapper object, used to target a specific + // interpreterwrapper. + const int Id() { return id_; } + + // Number of interpreters. + const int NumInterpreters() { return num_interpreters_; } + + // Returns a ThreadPool for use with each interpreter, will be null + // if using run_in_caller and only 1 interpreter. + tensorflow::thread::ThreadPool* ThreadPool() { return thread_pool_.get(); } + + // Returns whether the pool is configured to use batch parallelism. + const bool UseBatchParallelism() { return use_batch_parallelism_; } private: TfLiteInterpreterPool( - std::vector> interpreters); - void ReturnInterpreter(tflite::Interpreter* interpreter); - mutable absl::Mutex mutex_; + int id, + std::vector> interpreters, + std::unique_ptr thread_pool, + int num_interpreters, int fixed_batch_size, bool use_batch_parallelism); + int id_; // A vector to maintain pointers of available interpreters - std::vector available_ ABSL_GUARDED_BY(mutex_); - const std::vector> interpreters_; - - friend TfLiteInterpreterWrapper; + std::vector> interpreters_; + std::unique_ptr thread_pool_; + int num_interpreters_; + int fixed_batch_size_; + bool use_batch_parallelism_ = false; }; // A TFLite interpreter wrapper class which automatically returns used // interpreter object to TfLiteInterpreterPool. class TfLiteInterpreterWrapper { public: - TfLiteInterpreterWrapper(tflite::Interpreter* interpreter, - TfLiteInterpreterPool* pool) - : interpreter_(interpreter), pool_(pool) {} + // Constructor for wrapper takes only an initialized interpreter. + TfLiteInterpreterWrapper(std::unique_ptr interpreter); + + // Returns the underlying interpreter. + tflite::Interpreter* Get() { return interpreter_.get(); } + + // If using parallelism, get the allocated batch size of the interpreter. + int GetMiniBatchSize() { return mini_batch_size_; } + + // Set the batch size. + void SetMiniBatchSize(int mini_batch_size) { + mini_batch_size_ = mini_batch_size; + } + + // Invokes the interpreter. + TfLiteStatus Invoke(); +#ifdef TFLITE_PROFILE + void WriteOutput(const std::string& header, const string& data, + std::ostream* stream) { + (*stream) << header << std::endl; + (*stream) << data << std::endl; + } + + void WriteProfileData() { + if (run_summarizer_.HasProfiles()) { + WriteOutput("Operator-wise Profiling Info for Regular Benchmark Runs:", + run_summarizer_.GetOutputString(), &std::cout); + } + } +#endif + + // Sets the contents of the internal buffer _tensor_buffer_ to the tflite + // formatted string buffer equivalent stored in `batch` and sets + // raw pointer of `tflite_tensor` to the internal buffer. If the required + // size is larger than the current size, will allocate new memory and + // free the existing buffer. + tensorflow::Status SetStringData( + const gtl::ArraySlice& batch, + TfLiteTensor* tflite_tensor, int tensor_index); - ~TfLiteInterpreterWrapper() { pool_->ReturnInterpreter(interpreter_); } - tflite::Interpreter* Get() { return interpreter_; } + private: + std::unique_ptr interpreter_; + int mini_batch_size_ = 1; + std::map> tensor_buffer_; + std::map tensor_buffer_max_bytes_; + std::vector offset_; +#ifdef TFLITE_PROFILE + int max_num_entries_; + tflite::profiling::ProfileSummarizer run_summarizer_; + tflite::profiling::BufferedProfiler profiler_; + int invocation_count_ = 0; +#endif +}; + +// Contains a vector of TfLiteInterpreterPool, which are protected by mutex. +// When GetInterpreterPool is called, will either release a unique ptr to the +// caller or block if the vector is empty. +class TfLiteSessionPool { + public: + // Creates a TfLiteSessionPool with model, session options, + // whether to run in caller thread, pool_size and batch_pool_size for + // each InterpreterPool. + static tensorflow::Status CreateTfLiteSessionPool( + const tflite::FlatBufferModel* model, + const tensorflow::SessionOptions& options, bool run_in_caller, + int pool_size, int batch_pool_size, + std::unique_ptr& tflite_session_pool); + + // Returns a TFLite interpreter pool object. Caller may *block* waiting for + // a free interpreter pool to be available. + std::unique_ptr GetInterpreterPool() { + auto interpreter_available = [this]() ABSL_SHARED_LOCKS_REQUIRED(mutex_) { + return !this->available_.empty(); + }; + mutex_.LockWhen(absl::Condition(&interpreter_available)); + auto pool = std::move(available_.back()); + available_.pop_back(); + mutex_.Unlock(); + return pool; + } + + // Returns an interpreter pool to the available pool. + void ReturnInterpreterPool(std::unique_ptr pool) { + absl::MutexLock l(&mutex_); + available_.emplace_back(std::move(pool)); + } private: - tflite::Interpreter* const interpreter_; - TfLiteInterpreterPool* const pool_; + TfLiteSessionPool(std::vector> pools) + : available_(std::move(pools)) {} + mutable absl::Mutex mutex_; + std::vector> available_ + ABSL_GUARDED_BY(mutex_); }; } // namespace internal diff --git a/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool_test.cc b/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool_test.cc new file mode 100644 index 00000000000..c5dc1ad5f2d --- /dev/null +++ b/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool_test.cc @@ -0,0 +1,269 @@ +/* Copyright 2021 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h" + +#include + +#include +#include +#include "tensorflow/core/example/example.pb.h" +#include "tensorflow/core/example/feature.pb.h" +#include "tensorflow/core/lib/core/status_test_util.h" +#include "tensorflow/lite/kernels/parse_example/parse_example.h" +#include "tensorflow/lite/kernels/register.h" +#include "tensorflow_serving/test_util/test_util.h" + +namespace tensorflow { +namespace serving { +namespace internal { + +using tensorflow::gtl::ArraySlice; + +constexpr char kParseExampleModel[] = + "/servables/tensorflow/testdata/parse_example_tflite/00000123/" + "model.tflite"; + +constexpr char kMobileNetModel[] = + "/servables/tensorflow/testdata/mobilenet_v1_quant_tflite/00000123/" + "model.tflite"; + +TEST(TfLiteInterpreterPool, CreateTfLiteInterpreterPoolTest) { + string model_bytes; + TF_ASSERT_OK(ReadFileToString(Env::Default(), + test_util::TestSrcDirPath(kParseExampleModel), + &model_bytes)); + auto model = tflite::FlatBufferModel::BuildFromModel( + flatbuffers::GetRoot(model_bytes.data())); + int id = 0; + bool use_batch_parallelism = false; + int batch_pool_size = 1; + bool run_in_caller = true; + const tensorflow::SessionOptions options; + std::unique_ptr pool; + TF_ASSERT_OK(TfLiteInterpreterPool::CreateTfLiteInterpreterPool( + *model, run_in_caller, use_batch_parallelism, batch_pool_size, id, + options, pool)); + ASSERT_EQ(pool->NumInterpreters(), batch_pool_size); + ASSERT_EQ(pool->Id(), id); + ASSERT_EQ(pool->FixedBatchSize(), 1); // batch_parallelism turned off. + pool.reset(); + run_in_caller = false; + use_batch_parallelism = true; + TF_ASSERT_OK(TfLiteInterpreterPool::CreateTfLiteInterpreterPool( + *model, run_in_caller, use_batch_parallelism, ++batch_pool_size, id, + options, pool)); + ASSERT_EQ(pool->NumInterpreters(), batch_pool_size); + ASSERT_EQ(pool->ThreadPool()->NumThreads(), batch_pool_size); + ASSERT_EQ(pool->UseBatchParallelism(), use_batch_parallelism); + pool.reset(); + TF_ASSERT_OK(TfLiteInterpreterPool::CreateTfLiteInterpreterPool( + *model, run_in_caller, use_batch_parallelism, ++batch_pool_size, id, + options, pool)); + ASSERT_EQ(pool->NumInterpreters(), batch_pool_size); + ASSERT_EQ(pool->FixedBatchSize(), (kInitialBatchSize + 2) / batch_pool_size); + pool.reset(); + use_batch_parallelism = false; + run_in_caller = true; + TF_ASSERT_OK(TfLiteInterpreterPool::CreateTfLiteInterpreterPool( + *model, run_in_caller, use_batch_parallelism, batch_pool_size, id, + options, pool)); + ASSERT_EQ(pool->NumInterpreters(), 1); + ASSERT_EQ(pool->FixedBatchSize(), 1); // batch_parallelism turned off. + ASSERT_EQ(pool->ThreadPool(), nullptr); + ASSERT_EQ(pool->UseBatchParallelism(), use_batch_parallelism); + pool.reset(); + use_batch_parallelism = true; + TF_ASSERT_OK(TfLiteInterpreterPool::CreateTfLiteInterpreterPool( + *model, run_in_caller, use_batch_parallelism, batch_pool_size, id, + options, pool)); + ASSERT_EQ(pool->NumInterpreters(), batch_pool_size + 1); + ASSERT_EQ(pool->ThreadPool()->NumThreads(), batch_pool_size); + pool.reset(); +} + +TEST(TfLiteSessionPool, CreateTfLiteSessionPoolTest) { + string model_bytes; + TF_ASSERT_OK(ReadFileToString(Env::Default(), + test_util::TestSrcDirPath(kParseExampleModel), + &model_bytes)); + auto model = tflite::FlatBufferModel::BuildFromModel( + flatbuffers::GetRoot(model_bytes.data())); + int pool_size = 1; + int batch_pool_size = 2; + bool run_in_caller_thread = false; + const tensorflow::SessionOptions options; + std::unique_ptr session_pool; + TF_ASSERT_OK(TfLiteSessionPool::CreateTfLiteSessionPool( + model.get(), options, run_in_caller_thread, pool_size, batch_pool_size, + session_pool)); + auto pool = session_pool->GetInterpreterPool(); + ASSERT_EQ(pool->NumInterpreters(), batch_pool_size); + ASSERT_EQ(pool->Id(), 0); + ASSERT_EQ(pool->FixedBatchSize(), + (kInitialBatchSize + batch_pool_size - 1) / batch_pool_size); + session_pool->ReturnInterpreterPool(std::move(pool)); + session_pool.reset(); + + pool_size = 2; + batch_pool_size = 2; + run_in_caller_thread = false; + TF_ASSERT_OK(TfLiteSessionPool::CreateTfLiteSessionPool( + model.get(), options, run_in_caller_thread, pool_size, batch_pool_size, + session_pool)); + + pool = session_pool->GetInterpreterPool(); + ASSERT_EQ(pool->NumInterpreters(), batch_pool_size); + ASSERT_EQ(pool->Id(), 1); + ASSERT_EQ(pool->FixedBatchSize(), (kInitialBatchSize + 1) / 2); + session_pool->ReturnInterpreterPool(std::move(pool)); + session_pool.reset(); +} + +TEST(TfLiteSessionPool, CreateTfLiteSessionPoolNotBatchParallelTest) { + string model_bytes; + TF_ASSERT_OK(ReadFileToString(Env::Default(), + test_util::TestSrcDirPath(kMobileNetModel), + &model_bytes)); + auto model = tflite::FlatBufferModel::BuildFromModel( + flatbuffers::GetRoot(model_bytes.data())); + int pool_size = 1; + int batch_pool_size = 1; + bool run_in_caller_thread = false; + const tensorflow::SessionOptions options; + std::unique_ptr session_pool; + TF_ASSERT_OK(TfLiteSessionPool::CreateTfLiteSessionPool( + model.get(), options, run_in_caller_thread, pool_size, batch_pool_size, + session_pool)); + + auto pool = session_pool->GetInterpreterPool(); + ASSERT_EQ(pool->NumInterpreters(), 1); + ASSERT_EQ(pool->Id(), 0); + ASSERT_EQ(pool->FixedBatchSize(), 1); + session_pool->ReturnInterpreterPool(std::move(pool)); + session_pool.reset(); + + pool_size = 2; + batch_pool_size = 2; + run_in_caller_thread = false; + TF_ASSERT_OK(TfLiteSessionPool::CreateTfLiteSessionPool( + model.get(), options, run_in_caller_thread, pool_size, batch_pool_size, + session_pool)); + + pool = session_pool->GetInterpreterPool(); + ASSERT_EQ(pool->NumInterpreters(), 1); + ASSERT_EQ(pool->Id(), 1); + ASSERT_EQ(pool->FixedBatchSize(), 1); + session_pool->ReturnInterpreterPool(std::move(pool)); + session_pool.reset(); +} + +int GetTensorSize(const TfLiteTensor* tflite_tensor) { + int size = 1; + for (int i = 0; i < tflite_tensor->dims->size; ++i) { + size *= tflite_tensor->dims->data[i]; + } + return size; +} + +template +std::vector ExtractVector(const TfLiteTensor* tflite_tensor) { + const T* v = reinterpret_cast(tflite_tensor->data.raw); + return std::vector(v, v + GetTensorSize(tflite_tensor)); +} + +template <> +std::vector ExtractVector(const TfLiteTensor* tflite_tensor) { + std::vector out; + for (int i = 0; i < tflite::GetStringCount(tflite_tensor); ++i) { + auto ref = tflite::GetString(tflite_tensor, i); + out.emplace_back(ref.str, ref.len); + } + return out; +} + +TEST(TfLiteInterpreterWrapper, TfLiteInterpreterWrapperTest) { + string model_bytes; + TF_ASSERT_OK(ReadFileToString(Env::Default(), + test_util::TestSrcDirPath(kParseExampleModel), + &model_bytes)); + auto model = tflite::FlatBufferModel::BuildFromModel( + flatbuffers::GetRoot(model_bytes.data())); + tflite::ops::builtin::BuiltinOpResolver resolver; + tflite::ops::custom::AddParseExampleOp(&resolver); + std::unique_ptr interpreter; + ASSERT_EQ(tflite::InterpreterBuilder(*model, resolver)(&interpreter, + /*num_threads=*/1), + kTfLiteOk); + ASSERT_EQ(interpreter->inputs().size(), 1); + const int idx = interpreter->inputs()[0]; + auto* tensor = interpreter->tensor(idx); + ASSERT_EQ(tensor->type, kTfLiteString); + int fixed_batch_size = 10; + int actual_batch_size = 3; + interpreter->ResizeInputTensor(idx, {fixed_batch_size}); + ASSERT_EQ(interpreter->AllocateTensors(), kTfLiteOk); + auto interpreter_wrapper = + std::make_unique(std::move(interpreter)); + interpreter_wrapper->SetMiniBatchSize(fixed_batch_size); + ASSERT_EQ(interpreter_wrapper->GetMiniBatchSize(), fixed_batch_size); + std::vector data; + std::vector expected_floats; + std::vector expected_strs; + for (int i = 0; i < actual_batch_size; ++i) { + tensorflow::Example example; + std::string str; + auto* features = example.mutable_features(); + const float f = i % 2 == 1 ? 1.0 : -1.0; + const std::string s = i % 2 == 1 ? "test" : "missing"; + expected_floats.push_back(f); + expected_strs.push_back(s); + (*features->mutable_feature())["x"].mutable_float_list()->add_value( + expected_floats.back()); + (*features->mutable_feature())["y"].mutable_bytes_list()->add_value( + expected_strs.back()); + example.SerializeToString(&str); + data.push_back(str); + } + ASSERT_FALSE(interpreter_wrapper->SetStringData(data, tensor, -1) == + Status::OK()); + TF_ASSERT_OK(interpreter_wrapper->SetStringData(data, tensor, idx)); + auto wrapped = interpreter_wrapper->Get(); + ASSERT_EQ(wrapped->inputs().size(), 1); + int input_idx = wrapped->inputs()[0]; + auto tflite_input_tensor = wrapped->tensor(input_idx); + ASSERT_EQ(GetTensorSize(tflite_input_tensor), fixed_batch_size); + ASSERT_EQ(tflite::GetStringCount(tflite_input_tensor), actual_batch_size); + auto input_strs = ExtractVector(tflite_input_tensor); + EXPECT_THAT(input_strs, ::testing::ElementsAreArray(data)); + ASSERT_EQ(interpreter_wrapper->Invoke(), kTfLiteOk); + const std::vector& indices = wrapped->outputs(); + auto* tflite_tensor = wrapped->tensor(indices[0]); + ASSERT_EQ(tflite_tensor->type, kTfLiteFloat32); + ASSERT_EQ(GetTensorSize(tflite_tensor), fixed_batch_size); + EXPECT_THAT(ArraySlice(ExtractVector(tflite_tensor).data(), + actual_batch_size), + ::testing::ElementsAreArray(expected_floats)); + tflite_tensor = wrapped->tensor(indices[1]); + ASSERT_EQ(tflite_tensor->type, kTfLiteString); + ASSERT_EQ(GetTensorSize(tflite_tensor), fixed_batch_size); + EXPECT_THAT( + ArraySlice(ExtractVector(tflite_tensor).data(), + actual_batch_size), + ::testing::ElementsAreArray(expected_strs)); +} + +} // namespace internal +} // namespace serving +} // namespace tensorflow diff --git a/tensorflow_serving/servables/tensorflow/tflite_session.cc b/tensorflow_serving/servables/tensorflow/tflite_session.cc index 7f90b0db8b5..03d475f7030 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session.cc @@ -21,8 +21,13 @@ limitations under the License. #include "tensorflow/cc/saved_model/signature_constants.h" #include "tensorflow/core/framework/tensor_shape.pb.h" +#include "tensorflow/core/lib/core/blocking_counter.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/cpu_backend_context.h" +#include "tensorflow/lite/kernels/hashtable/hashtable_ops.h" +#include "tensorflow/lite/kernels/internal/tensor_utils.h" +#include "tensorflow/lite/kernels/parse_example/parse_example.h" #include "tensorflow/lite/kernels/register.h" #include "tensorflow/lite/string_util.h" #include "tensorflow/lite/tools/signature/signature_def_util.h" @@ -33,8 +38,6 @@ namespace tensorflow { namespace serving { // Map of TFLite tensor name to . -using TensorInfoMap = std::map>; - namespace { Status TfLiteTypeToTfType(TfLiteType tflite_type, DataType* type) { @@ -136,139 +139,258 @@ Status GetTensorInfoMap(const tflite::Interpreter* interpreter, bool input, return Status::OK(); } -std::vector TensorDims(const Tensor& tensor) { - std::vector dims; - dims.reserve(tensor.dims()); - for (int i = 0; i < tensor.dims(); ++i) { - dims.push_back(static_cast(tensor.dim_size(i))); +std::vector TensorDims(const Tensor* tensor) { + std::vector dims(tensor->dims()); + for (int i = 0; i < tensor->dims(); ++i) { + dims[i] = static_cast(tensor->dim_size(i)); } return dims; } -Status FillTfLiteTensorFromInput(const string& name, const Tensor& tensor, - tflite::Interpreter* interpreter, int index) { - auto tflite_tensor = interpreter->tensor(index); - if (tflite_tensor == nullptr) { - return errors::InvalidArgument("Failed to get TFLite tensor: ", name, - " at index: ", index); - } - - // Fast check for resize and reallocate for non-string data. - const auto& tensor_bytes = tensor.tensor_data(); - bool needs_resize_and_realloc = (tflite_tensor->type != kTfLiteString) && - (tensor_bytes.size() != tflite_tensor->bytes); - - TfLiteIntArray* dims_array = nullptr; - if (tflite_tensor->type == kTfLiteString) { - // Slow check for string inputs. - dims_array = TfLiteIntArrayCreate(tensor.dims()); - for (int i = 0; i < tensor.dims(); ++i) { - dims_array->data[i] = static_cast(tensor.dim_size(i)); +// Create output tensors making sure they are the right size. // +Status CreateOutputTensors( + std::unique_ptr& interpreter_pool, + const std::vector& output_tensor_names, + const std::map& output_tensor_to_idx, + std::map& tflite_idx_to_output_tensor, + std::vector* output_tensors, bool use_batch_parallelism = false, + int actual_batch_size = 0) { + output_tensors->reserve(output_tensor_names.size()); + for (std::string tfname : output_tensor_names) { + auto fix_status = FixTfLiteTensorName(output_tensor_to_idx, tfname); + if (fix_status != Status::OK()) { + return errors::Internal("Missing output TFLite tensor: ", tfname, ": ", + fix_status.error_message()); } - const TfLiteIntArray* previous_dims_array = tflite_tensor->dims; - needs_resize_and_realloc = - !TfLiteIntArrayEqual(dims_array, previous_dims_array); - } - - if (needs_resize_and_realloc) { - // Slow path: needs resize+realloc. - // TODO(b/140959776): Reduce the chance of taking this path by either - // having multiple instances of interpreter or sub-graphs for commonly - // used input sizes. - if (interpreter->ResizeInputTensor(index, TensorDims(tensor)) != - kTfLiteOk) { - return errors::Internal("Failed to resize input tensor: ", name, " from ", - tflite_tensor->bytes, " to ", tensor_bytes.size(), - " bytes."); + const int tflite_idx = output_tensor_to_idx.at(tfname); + TensorShape tf_shape; + const auto& interpreter = interpreter_pool->GetInterpreter(0)->Get(); + const auto* tflite_tensor = interpreter->tensor(tflite_idx); + if (use_batch_parallelism) { + tf_shape.AddDim(actual_batch_size); + } else if (tflite_tensor->dims->size > 0) { + tf_shape.AddDim(tflite_tensor->dims->data[0]); } - if (interpreter->AllocateTensors() != kTfLiteOk) { - return errors::Internal( - "Failed to AllocateTensors() due to change in input tensor ", name, - " size from ", tflite_tensor->bytes, " to ", tensor_bytes.size(), - " bytes."); + for (int i = 1; i < tflite_tensor->dims->size; ++i) { + tf_shape.AddDim(tflite_tensor->dims->data[i]); } + DataType tf_type; + TF_RETURN_IF_ERROR(TfLiteTypeToTfType(tflite_tensor->type, &tf_type)); + output_tensors->emplace_back(tf_type, tf_shape); + tflite_idx_to_output_tensor[tflite_idx] = &output_tensors->back(); } + return Status::OK(); +} - if (tflite_tensor->type != kTfLiteString) { - std::memcpy(tflite_tensor->data.raw, tensor_bytes.data(), - tensor_bytes.size()); - } else { - tflite::DynamicBuffer buf; - auto tensor_vec = tensor.flat(); - for (int i = 0; i < tensor_vec.size(); i++) { - buf.AddString(tensor_vec(i).data(), tensor_vec(i).size()); +Status SetInputAndInvokeMiniBatch( + std::unique_ptr& interpreter_pool, + const std::map& tflite_idx_to_tf_input_tensor, + bool use_batch_parallelism = false, int32_t num_minibatches = 1, + int minibatch = 0) { + const auto& interpreter_wrapper = interpreter_pool->GetInterpreter(minibatch); + auto* interpreter = interpreter_wrapper->Get(); + // Load input data from Tensorflow tensors. + for (const auto entry : tflite_idx_to_tf_input_tensor) { + int tflite_input_idx = entry.first; + auto tflite_input_tensor = interpreter->tensor(tflite_input_idx); + const auto* tf_input_tensor = entry.second; + if (tflite_input_tensor->type != kTfLiteString) { + if (use_batch_parallelism) { + return errors::Internal( + "Batch parallelism should not be enabled for non-string inputs"); + } + auto tensor_bytes = tf_input_tensor->tensor_data(); + if (tensor_bytes.size() != tflite_input_tensor->bytes) { + if (interpreter->ResizeInputTensor( + tflite_input_idx, TensorDims(tf_input_tensor)) != kTfLiteOk) { + return errors::Internal( + "Failed to resize input tensor: ", tflite_input_tensor->name, + " from ", tflite_input_tensor->bytes, " to ", tensor_bytes.size(), + " bytes."); + } + if (interpreter->AllocateTensors() != kTfLiteOk) { + return errors::Internal("Failed to allocate tensors"); + } + } + std::memcpy(tflite_input_tensor->data.raw, tensor_bytes.data(), + tensor_bytes.size()); + } else { + // Copy the string tensor data to the input tflite tensor. + const int fixed_batch_size = interpreter_pool->FixedBatchSize(); + const int actual_batch_size = entry.second->NumElements(); + const int begin = fixed_batch_size * minibatch; + int end = static_cast(actual_batch_size); + if (use_batch_parallelism) { + end = std::min(end, fixed_batch_size * (minibatch + 1)); + } + const auto batch = gtl::ArraySlice(entry.second->flat()) + .subspan(begin, end - begin); + const int minibatch_size = batch.size(); + // Always resize when not using parallelism. + const bool needs_resize = + use_batch_parallelism + ? minibatch_size > interpreter_wrapper->GetMiniBatchSize() + : minibatch_size != interpreter_wrapper->GetMiniBatchSize(); + if (needs_resize) { + interpreter->ResizeInputTensor(entry.first, {minibatch_size}); + interpreter_wrapper->SetMiniBatchSize(minibatch_size); + if (interpreter->AllocateTensors() != kTfLiteOk) { + return errors::Internal("Failed to allocate tensors"); + } + } + TF_RETURN_IF_ERROR(interpreter_wrapper->SetStringData( + batch, tflite_input_tensor, tflite_input_idx)); } - // WriteToTensor() takes ownership of dims_array. - buf.WriteToTensor(tflite_tensor, dims_array); + } + if (interpreter_wrapper->Invoke() != kTfLiteOk) { + return errors::Internal("Failed to invoke TfLite interpreter"); } return Status::OK(); } -Status AppendTfLiteToTfTensorList(const TfLiteTensor* tflite_tensor, - std::vector* outputs) { - DataType tf_type; - TF_RETURN_IF_ERROR(TfLiteTypeToTfType(tflite_tensor->type, &tf_type)); - - TensorShape shape; - for (int i = 0; i < tflite_tensor->dims->size; ++i) { - shape.AddDim(tflite_tensor->dims->data[i]); +Status SetMiniBatchOutput( + std::unique_ptr& interpreter_pool, + const std::map& tflite_idx_to_output_tensor, + std::vector* outputs, bool use_batch_parallelism = false, + int actual_batch_size = 0, int num_minibatches = 1, size_t minibatch = 0) { + const int fixed_batch_size = interpreter_pool->FixedBatchSize(); + for (const auto& entry : tflite_idx_to_output_tensor) { + Tensor* tensor = entry.second; + const DataType tf_type = tensor->dtype(); + const int begin = fixed_batch_size * minibatch; + const int end = std::min(fixed_batch_size * static_cast(minibatch + 1), + actual_batch_size); + const int actual_minibatch_size = end - begin; + const auto& interpreter_wrapper = + interpreter_pool->GetInterpreter(minibatch); + const auto* interpreter = interpreter_wrapper->Get(); + auto tflite_tensor = interpreter->tensor(entry.first); + if (DataTypeCanUseMemcpy(tf_type)) { + auto tensor_bytes = tensor->tensor_data(); + int offset = 0; + size_t tflite_tensor_bytes = tflite_tensor->bytes; + if (use_batch_parallelism) { + // Each batch will produce minibatch_size tensors. + // We want to make sure we only copy actual_batch_size. + offset = minibatch * tflite_tensor_bytes; + tflite_tensor_bytes = + tflite_tensor_bytes / fixed_batch_size * actual_minibatch_size; + } + std::memcpy(const_cast(tensor_bytes.data() + offset), + tflite_tensor->data.raw, tflite_tensor_bytes); + } else if (tflite_tensor->type == kTfLiteString) { + const int string_count = tflite::GetStringCount(tflite_tensor); + int num_strings = string_count; + int offset = 0; + if (use_batch_parallelism) { + offset = minibatch * string_count; + num_strings = string_count / fixed_batch_size * actual_minibatch_size; + } + auto str_tensors = tensor->flat(); + for (int i = 0; i < num_strings; i++) { + const auto& ref = tflite::GetString(tflite_tensor, i); + str_tensors(i + offset).assign(ref.str, ref.len); + } + } } + return Status::OK(); +} - outputs->emplace_back(Tensor(tf_type, shape)); - Tensor* tensor = &outputs->back(); - if (DataTypeCanUseMemcpy(tf_type)) { - auto tensor_bytes = tensor->tensor_data(); - if (tflite_tensor->bytes != tensor_bytes.size()) { - return errors::Internal( - "Failed to convert TFLite tensor: ", tflite_tensor->name, - " to TF tensor. Size mismatch: ", tensor_bytes.size(), " vs ", - tflite_tensor->bytes); - } - std::memcpy(const_cast(tensor_bytes.data()), tflite_tensor->data.raw, - tflite_tensor->bytes); - } else if (tflite_tensor->type == kTfLiteString) { - const int num_strings = tflite::GetStringCount(tflite_tensor); - if (num_strings != tensor->NumElements()) { - return errors::Internal( - "Failed to convert TFLite tensor: ", tflite_tensor->name, - " to TF tensor. Num elements mismatch: ", tensor->NumElements(), - " vs ", num_strings); - } - auto str_tensors = outputs->back().flat(); - for (int i = 0; i < num_strings; i++) { - auto ref = tflite::GetString(tflite_tensor, i); - str_tensors(i).assign(ref.str, ref.len); +typedef std::function&, + const std::map&, bool, int32_t, + int)> + BatchFunction; +void ParallelFor( + const BatchFunction& f, + std::unique_ptr& interpreter_pool, + const std::map& tflite_inputs, int n, + bool use_batch_parallelism, bool run_in_caller, + std::vector& status) { + if (n == 0) return; + auto* thread_pool = interpreter_pool->ThreadPool(); + if (thread_pool == nullptr) { + for (int i = 0; i < n; ++i) { + status[i] = + f(interpreter_pool, tflite_inputs, use_batch_parallelism, n, i); } - } else { - return errors::Internal("TFLite to TF Tensor copy not supported for type: ", - tflite_tensor->type); + return; + } + int num_jobs = run_in_caller ? n - 1 : n; + int first_job = run_in_caller ? 1 : 0; + tensorflow::BlockingCounter counter(num_jobs); + for (int i = first_job; i < n; ++i) { + thread_pool->Schedule([&f, &interpreter_pool, &tflite_inputs, + use_batch_parallelism, n, i, &counter, &status] { + status[i] = + f(interpreter_pool, tflite_inputs, use_batch_parallelism, n, i); + counter.DecrementCount(); + }); + } + if (run_in_caller) { + status[0] = f(interpreter_pool, tflite_inputs, use_batch_parallelism, n, 0); + } + counter.Wait(); +} + +Status RunBatchParallel( + std::unique_ptr& interpreter_pool, + const std::vector>& inputs, + const std::map& tflite_idx_to_input_tensor, + bool run_in_caller_thread, const std::vector& output_tensor_names, + const std::map& output_tensor_to_index, + std::vector* outputs) { + const int actual_batch_size = inputs[0].second.NumElements(); + const int32_t num_threads = interpreter_pool->NumInterpreters(); + const int min_batch_size = interpreter_pool->FixedBatchSize(); + int num_minibatches = std::min( + num_threads, (actual_batch_size + min_batch_size - 1) / min_batch_size); + std::vector status_of_minibatches(num_minibatches); + ParallelFor(SetInputAndInvokeMiniBatch, interpreter_pool, + tflite_idx_to_input_tensor, num_minibatches, true, + run_in_caller_thread, status_of_minibatches); + for (Status& status_of_minibatch : status_of_minibatches) { + TF_RETURN_IF_ERROR(status_of_minibatch); + } + std::map tflite_idx_to_output_tensor; + TF_RETURN_IF_ERROR(CreateOutputTensors( + interpreter_pool, output_tensor_names, output_tensor_to_index, + tflite_idx_to_output_tensor, outputs, true, actual_batch_size)); + + // Set the contents of the return tensors. + for (size_t i = 0; i < num_minibatches; ++i) { + TF_RETURN_IF_ERROR(SetMiniBatchOutput( + interpreter_pool, tflite_idx_to_output_tensor, outputs, true, + actual_batch_size, num_minibatches, i)); } return Status::OK(); } } // namespace -Status TfLiteSession::Create(string&& buffer, +Status TfLiteSession::Create(string&& buffer, const SessionOptions& options, + int num_pools, int num_interpreters_per_pool, std::unique_ptr* tflite_session, ::google::protobuf::Map* signatures, - int num_interpreters) { + bool run_in_caller_thread) { auto model = tflite::FlatBufferModel::BuildFromModel( flatbuffers::GetRoot(buffer.data())); if (model == nullptr) { return errors::InvalidArgument("Cannot build FlatBufferModel from buffer."); } - std::unique_ptr interpreter_pool; - TF_RETURN_IF_ERROR( - internal::TfLiteInterpreterPool::CreateTfLiteInterpreterPool( - *model, num_interpreters, interpreter_pool)); - auto interpreter_wrapper = interpreter_pool->GetInterpreter(); - const tflite::Interpreter* interpreter = interpreter_wrapper->Get(); + tflite::ops::builtin::BuiltinOpResolver resolver; + tflite::ops::custom::AddParseExampleOp(&resolver); + tflite::ops::custom::AddHashtableOps(&resolver); + + std::unique_ptr interpreter; + if (tflite::InterpreterBuilder(*model, resolver)(&interpreter) != kTfLiteOk) { + return errors::Internal("Cannot build Interpreter from buffer."); + } TensorInfoMap inputs; - TF_RETURN_IF_ERROR(GetTensorInfoMap(interpreter, true, &inputs)); + TF_RETURN_IF_ERROR(GetTensorInfoMap(interpreter.get(), true, &inputs)); TensorInfoMap outputs; - TF_RETURN_IF_ERROR(GetTensorInfoMap(interpreter, false, &outputs)); + TF_RETURN_IF_ERROR(GetTensorInfoMap(interpreter.get(), false, &outputs)); // Map of TFLite tensor name -> tensor index std::map input_tensor_to_index; @@ -332,9 +454,18 @@ Status TfLiteSession::Create(string&& buffer, sigdef->set_method_name(kPredictMethodName); } + num_pools = std::max(1, num_pools); + num_interpreters_per_pool = std::max(1, num_interpreters_per_pool); + + std::unique_ptr session_pool; + TF_RETURN_IF_ERROR(internal::TfLiteSessionPool::CreateTfLiteSessionPool( + model.get(), options, run_in_caller_thread, num_pools, + num_interpreters_per_pool, session_pool)); + tflite_session->reset(new TfLiteSession( std::move(input_tensor_to_index), std::move(output_tensor_to_index), - std::move(buffer), std::move(model), std::move(interpreter_pool))); + std::move(buffer), std::move(model), std::move(session_pool), + run_in_caller_thread)); return Status::OK(); } @@ -342,12 +473,14 @@ TfLiteSession::TfLiteSession( std::map&& input_tensor_to_index, std::map&& output_tensor_to_index, string&& buffer, std::unique_ptr model, - std::unique_ptr interpreter_pool) + std::unique_ptr session_pool, + bool run_in_caller_thread) : input_tensor_to_index_(std::move(input_tensor_to_index)), output_tensor_to_index_(std::move(output_tensor_to_index)), model_serialized_bytes_(std::move(buffer)), model_(std::move(model)), - interpreter_pool_(std::move(interpreter_pool)) {} + session_pool_(std::move(session_pool)), + run_in_caller_thread_(run_in_caller_thread) {} Status TfLiteSession::Run(const std::vector>& inputs, const std::vector& output_tensor_names, @@ -375,35 +508,50 @@ Status TfLiteSession::Run( const std::vector& target_node_names, std::vector* outputs, RunMetadata* run_metadata, const thread::ThreadPoolOptions& thread_pool_options) { - auto interpreter_wrapper = interpreter_pool_->GetInterpreter(); - tflite::Interpreter* interpreter = interpreter_wrapper->Get(); + std::map tflite_idx_to_input_tensor; for (const auto& input : inputs) { string name = input.first; TF_RETURN_WITH_CONTEXT_IF_ERROR( FixTfLiteTensorName(input_tensor_to_index_, name), "Missing input TFLite tensor: ", name); const int index = input_tensor_to_index_.at(name); - TF_RETURN_IF_ERROR( - FillTfLiteTensorFromInput(name, input.second, interpreter, index)); + tflite_idx_to_input_tensor[index] = &input.second; } - if (interpreter->Invoke() != kTfLiteOk) { - return errors::Internal("Failed to run interpreter."); +#define RETURN_POOL_IF_ERROR(...) \ + do { \ + ::tensorflow::Status _status = (__VA_ARGS__); \ + if (TF_PREDICT_FALSE(!_status.ok())) { \ + session_pool_->ReturnInterpreterPool(std::move(interpreter_pool)); \ + return _status; \ + } \ + } while (0); + auto interpreter_pool = session_pool_->GetInterpreterPool(); + if (interpreter_pool->UseBatchParallelism()) { + RETURN_POOL_IF_ERROR( + RunBatchParallel(interpreter_pool, inputs, tflite_idx_to_input_tensor, + run_in_caller_thread_, output_tensor_names, + output_tensor_to_index_, outputs)); + session_pool_->ReturnInterpreterPool(std::move(interpreter_pool)); + return Status::OK(); } - outputs->clear(); - for (string name : output_tensor_names) { - TF_RETURN_WITH_CONTEXT_IF_ERROR( - FixTfLiteTensorName(output_tensor_to_index_, name), - "Missing output TFLite tensor: ", name); - const int index = output_tensor_to_index_.at(name); - auto* tflite_tensor = interpreter->tensor(index); - if (tflite_tensor == nullptr) { - return errors::InvalidArgument( - "Failed to get output TFLite tensor: ", name, " at index: ", index); - } - TF_RETURN_IF_ERROR(AppendTfLiteToTfTensorList(tflite_tensor, outputs)); - } + RETURN_POOL_IF_ERROR( + SetInputAndInvokeMiniBatch(interpreter_pool, tflite_idx_to_input_tensor)); + + // Create return tensors and map the tflite tensor index to the + // index of the created tensor. + std::map tflite_idx_to_output_tensor; + RETURN_POOL_IF_ERROR(CreateOutputTensors( + interpreter_pool, output_tensor_names, output_tensor_to_index_, + tflite_idx_to_output_tensor, outputs)); + + // Set the contents of the return tensors. + RETURN_POOL_IF_ERROR(SetMiniBatchOutput( + interpreter_pool, tflite_idx_to_output_tensor, outputs)); + +#undef RETURN_POOL_IF_ERROR + session_pool_->ReturnInterpreterPool(std::move(interpreter_pool)); return Status::OK(); } diff --git a/tensorflow_serving/servables/tensorflow/tflite_session.h b/tensorflow_serving/servables/tensorflow/tflite_session.h index f95f4c1b0da..c8eb460bd92 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session.h +++ b/tensorflow_serving/servables/tensorflow/tflite_session.h @@ -24,9 +24,12 @@ limitations under the License. #include "absl/synchronization/mutex.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/platform/file_system.h" +#include "tensorflow/core/platform/threadpool.h" #include "tensorflow/core/platform/threadpool_options.h" #include "tensorflow/core/protobuf/meta_graph.pb.h" +#include "tensorflow/lite/external_cpu_backend_context.h" #include "tensorflow/lite/interpreter.h" +#include "tensorflow/lite/kernels/cpu_backend_context.h" #include "tensorflow/lite/model.h" #include "tensorflow_serving/servables/tensorflow/serving_session.h" #include "tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h" @@ -34,6 +37,8 @@ limitations under the License. namespace tensorflow { namespace serving { +using TensorInfoMap = std::map>; + // A session to run inference on a TensorFlow Lite model. // class TfLiteSession : public ServingSession { @@ -41,10 +46,15 @@ class TfLiteSession : public ServingSession { // Creates a TfLiteSession object from `buffer` representing serialized // TFLite flatbuffer model. Also returns the SignatureDef map based on // input/outputs to the model. - static Status Create(string&& buffer, + // + // run in caller thread allows a worker to run on the parent thread, + // which may be desired to increase concurrency at the cost of additional + // thread context overhead. Defaults to false. + static Status Create(string&& buffer, const SessionOptions& options, + int num_pools, int num_interpreters_per_pool, std::unique_ptr* tflite_session, ::google::protobuf::Map* signatures, - int num_interpreters); + bool run_in_caller_thread = false); ~TfLiteSession() override = default; @@ -69,18 +79,17 @@ class TfLiteSession : public ServingSession { Status ListDevices(std::vector* response) override; private: - TfLiteSession( - std::map&& input_tensor_to_index, - std::map&& output_tensor_to_index, string&& buffer, - std::unique_ptr model, - std::unique_ptr interpreter_pool); - + TfLiteSession(std::map&& input_tensor_to_index, + std::map&& output_tensor_to_index, string&& buffer, + std::unique_ptr model, + std::unique_ptr session_pool, + bool run_in_caller_thread); const std::map input_tensor_to_index_; const std::map output_tensor_to_index_; const string model_serialized_bytes_; const std::unique_ptr model_; - std::unique_ptr interpreter_pool_; - + const std::unique_ptr session_pool_; + const bool run_in_caller_thread_; TF_DISALLOW_COPY_AND_ASSIGN(TfLiteSession); }; diff --git a/tensorflow_serving/servables/tensorflow/tflite_session_main.cc b/tensorflow_serving/servables/tensorflow/tflite_session_main.cc index 09dcb943529..5219db7b0df 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session_main.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session_main.cc @@ -44,8 +44,10 @@ int main(int argc, char** argv) { ::google::protobuf::Map signatures; std::unique_ptr session; - status = tensorflow::serving::TfLiteSession::Create(std::move(model_bytes), - &session, &signatures, 1); + tensorflow::SessionOptions options; + status = tensorflow::serving::TfLiteSession::Create( + std::move(model_bytes), options, /*num_pools=*/1, + /*num_interpreters_per_pool=*/1, &session, &signatures); if (!status.ok()) { std::cerr << "ERROR: Failed to create TF Lite session with error: " << status << std::endl; diff --git a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc index abc1a65d122..a31bd33d90c 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc @@ -37,11 +37,14 @@ limitations under the License. #include "tensorflow/core/platform/test_benchmark.h" #include "tensorflow/core/platform/threadpool_options.h" #include "tensorflow/core/protobuf/config.pb.h" +#include "tensorflow/lite/string_util.h" #include "tensorflow/lite/tools/signature/signature_def_util.h" #include "tensorflow/lite/util.h" #include "tensorflow/lite/version.h" #include "tensorflow_serving/test_util/test_util.h" +ABSL_FLAG(int, num_pools, 1, "Number of interpreter pools of a TfLiteSession."); + ABSL_FLAG(int, num_tflite_interpreters, 1, "Number of TFLite interpreters " "in an interpreter pool of a TfLiteSession."); @@ -79,9 +82,10 @@ TEST(TfLiteSession, BasicTest) { ::google::protobuf::Map signatures; std::unique_ptr session; - TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &session, &signatures, - absl::GetFlag(FLAGS_num_tflite_interpreters))); + tensorflow::SessionOptions options; + TF_ASSERT_OK(TfLiteSession::Create( + std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), + absl::GetFlag(FLAGS_num_tflite_interpreters), &session, &signatures)); EXPECT_EQ(signatures.size(), 1); EXPECT_EQ(signatures.begin()->first, "serving_default"); EXPECT_THAT(signatures.begin()->second, test_util::EqualsProto(R"( @@ -139,9 +143,10 @@ TEST(TfLiteSession, ModelFromLegacyConverterWithSigdef) { ::google::protobuf::Map signatures; std::unique_ptr session; - TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &session, &signatures, - absl::GetFlag(FLAGS_num_tflite_interpreters))); + tensorflow::SessionOptions options; + TF_ASSERT_OK(TfLiteSession::Create( + std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), + absl::GetFlag(FLAGS_num_tflite_interpreters), &session, &signatures)); EXPECT_EQ(signatures.size(), 1); EXPECT_EQ(signatures.begin()->first, "serving_default"); // While, in the model, the tensor name of input "x" is "tflite_input:0". in @@ -344,9 +349,10 @@ TEST(TfLiteSession, ProcessStrings) { &model_signature_def_map); ::google::protobuf::Map signatures; std::unique_ptr session; - TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &session, &signatures, - absl::GetFlag(FLAGS_num_tflite_interpreters))); + tensorflow::SessionOptions options; + TF_ASSERT_OK(TfLiteSession::Create( + std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), + absl::GetFlag(FLAGS_num_tflite_interpreters), &session, &signatures)); Tensor input_list = test::AsTensor({"a", "b", "c", "d"}, TensorShape({4})); Tensor input_shape = test::AsTensor({2, 2}, TensorShape({2})); @@ -367,9 +373,10 @@ TEST(TfLiteSession, ProcessStringsFlex) { &model_signature_def_map); ::google::protobuf::Map signatures; std::unique_ptr session; - TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &session, &signatures, - absl::GetFlag(FLAGS_num_tflite_interpreters))); + tensorflow::SessionOptions options; + TF_ASSERT_OK(TfLiteSession::Create( + std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), + absl::GetFlag(FLAGS_num_tflite_interpreters), &session, &signatures)); Tensor input_list = test::AsTensor({"a", "b", "c", "d"}, TensorShape({4})); Tensor input_shape = test::AsTensor({2, 2}, TensorShape({2})); @@ -390,9 +397,10 @@ TEST(TfLiteSession, ThreadPoolOptions) { &model_signature_def_map); ::google::protobuf::Map signatures; std::unique_ptr session; - TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &session, &signatures, - absl::GetFlag(FLAGS_num_tflite_interpreters))); + tensorflow::SessionOptions options; + TF_ASSERT_OK(TfLiteSession::Create( + std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), + absl::GetFlag(FLAGS_num_tflite_interpreters), &session, &signatures)); Tensor input_list = test::AsTensor({"a", "b", "c", "d"}, TensorShape({4})); Tensor input_shape = test::AsTensor({2, 2}, TensorShape({2})); @@ -430,9 +438,10 @@ TEST(TfLiteSession, SimpleSignatureDef) { signatures[kResidualSignatureKey] = SignatureDef(); std::unique_ptr session; - TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &session, &signatures, - absl::GetFlag(FLAGS_num_tflite_interpreters))); + tensorflow::SessionOptions options; + TF_ASSERT_OK(TfLiteSession::Create( + std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), + absl::GetFlag(FLAGS_num_tflite_interpreters), &session, &signatures)); ASSERT_THAT(signatures, UnorderedElementsAre(Pair(kDefaultServingSignatureDefKey, _))); @@ -470,9 +479,10 @@ TEST(TfLiteSession, MultipleSignatureDef) { tflite::TensorType_STRING, /*use_flex_op=*/false, &signature_def_map); ::google::protobuf::Map signatures; std::unique_ptr session; - TF_EXPECT_OK( - TfLiteSession::Create(std::move(model_bytes), &session, &signatures, - absl::GetFlag(FLAGS_num_tflite_interpreters))); + tensorflow::SessionOptions options; + TF_EXPECT_OK(TfLiteSession::Create( + std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), + absl::GetFlag(FLAGS_num_tflite_interpreters), &session, &signatures)); ASSERT_THAT(signatures, UnorderedElementsAre(Pair(kSignatureKey1, _), Pair(kSignatureKey2, _))); @@ -523,9 +533,10 @@ TEST(TfLiteSession, SignatureDefWithCommonTensorPrefix) { /*use_flex_op=*/false, &signature_def_map); ::google::protobuf::Map signatures; std::unique_ptr session; - TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &session, &signatures, - absl::GetFlag(FLAGS_num_tflite_interpreters))); + tensorflow::SessionOptions options; + TF_ASSERT_OK(TfLiteSession::Create( + std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), + absl::GetFlag(FLAGS_num_tflite_interpreters), &session, &signatures)); // Inputs must still be processed as two different tensors. auto outputSigdef = signatures[kDefaultServingSignatureDefKey]; @@ -543,9 +554,10 @@ TEST(TfLiteSession, SimpleSignatureDefAndRun) { &model_signature_def_map); ::google::protobuf::Map signatures; std::unique_ptr session; - TF_EXPECT_OK( - TfLiteSession::Create(std::move(model_bytes), &session, &signatures, - absl::GetFlag(FLAGS_num_tflite_interpreters))); + tensorflow::SessionOptions options; + TF_EXPECT_OK(TfLiteSession::Create( + std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), + absl::GetFlag(FLAGS_num_tflite_interpreters), &session, &signatures)); auto sigdef = signatures[kDefaultServingSignatureDefKey]; ASSERT_EQ(sigdef.inputs().at(kSignatureInputList).name(), @@ -568,6 +580,65 @@ TEST(TfLiteSession, SimpleSignatureDefAndRun) { test::AsTensor({"a", "b", "c", "d"}, TensorShape({2, 2}))); } +TEST(TfLiteSession, TestBatchParallelism) { + std::string model_bytes; + TF_ASSERT_OK(ReadFileToString(Env::Default(), + test_util::TestSrcDirPath(kParseExampleModel), + &model_bytes)); + auto model = tflite::FlatBufferModel::BuildFromModel( + flatbuffers::GetRoot(model_bytes.data())); + auto model_signature_def_map = GetTestSignatureDefMap(); + ::google::protobuf::Map signatures; + std::unique_ptr sess; + tensorflow::SessionOptions options; + TF_ASSERT_OK(TfLiteSession::Create(std::move(model_bytes), options, 1, 4, + &sess, &signatures)); + const int batch_size = 500; + const float default_value = 0; + std::vector example_list; + std::vector expected; + std::vector expected_bytes; + std::vector outputs; + + std::mt19937 random_engine; + auto random_func = [&]() { + return std::uniform_real_distribution(-0.5, 0.5)(random_engine); + }; + const std::string kTestString = "test string"; + const std::string kDefaultString = "missing"; + for (int i = 0; i < batch_size; i++) { + float val = random_func(); + tensorflow::Example example; + std::string str; + if (val < -1) { + expected.push_back(default_value); + expected_bytes.push_back(kDefaultString); + } else { + expected.push_back(val); + expected_bytes.push_back(kTestString); + auto* features = example.mutable_features(); + (*features->mutable_feature())["x"].mutable_float_list()->add_value(val); + (*features->mutable_feature())["y"].mutable_bytes_list()->add_value( + kTestString); + } + example.SerializeToString(&str); + example_list.push_back(str); + } + Tensor example_list_tensor = + test::AsTensor(example_list, TensorShape({batch_size})); + TF_EXPECT_OK(sess->Run( + {{"input", example_list_tensor}}, + {"ParseExample/ParseExampleV2", "ParseExample/ParseExampleV2:1"}, {}, + &outputs)); + test::ExpectTensorEqual( + outputs[0], + test::AsTensor(expected, TensorShape({batch_size, 1}))); + EXPECT_EQ(outputs.size(), 2); + test::ExpectTensorEqual( + outputs[1], + test::AsTensor(expected_bytes, TensorShape({batch_size, 1}))); +} + #ifdef PLATFORM_GOOGLE // These benchmarks rely on https://github.com/google/benchmark features, // not available in open-sourced TF codebase. @@ -580,9 +651,10 @@ static void BM_Reshape(benchmark::State& state, bool use_flex_op) { &model_signature_def_map); ::google::protobuf::Map signatures; std::unique_ptr sess; - TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &sess, &signatures, - absl::GetFlag(FLAGS_num_tflite_interpreters))); + tensorflow::SessionOptions options; + TF_ASSERT_OK(TfLiteSession::Create( + std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), + absl::GetFlag(FLAGS_num_tflite_interpreters), &sess, &signatures)); session = sess.release(); } Tensor input = test::AsTensor({1, 2, 3, 4, 5, 6}, TensorShape({6})); @@ -615,9 +687,10 @@ void BM_HalfPlusTwo(benchmark::State& state) { Env::Default(), test_util::TestSrcDirPath(kTestModel), &model_bytes)); ::google::protobuf::Map signatures; std::unique_ptr sess; - TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &sess, &signatures, - absl::GetFlag(FLAGS_num_tflite_interpreters))); + tensorflow::SessionOptions options; + TF_ASSERT_OK(TfLiteSession::Create( + std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), + absl::GetFlag(FLAGS_num_tflite_interpreters), &sess, &signatures)); session = sess.release(); } Tensor input = test::AsTensor({1.0, 2.0, 3.0}, TensorShape({3})); @@ -639,9 +712,10 @@ void BM_MobileNet(benchmark::State& state) { &model_bytes)); ::google::protobuf::Map signatures; std::unique_ptr sess; - TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &sess, &signatures, - absl::GetFlag(FLAGS_num_tflite_interpreters))); + tensorflow::SessionOptions options; + TF_ASSERT_OK(TfLiteSession::Create( + std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), + absl::GetFlag(FLAGS_num_tflite_interpreters), &sess, &signatures)); session = sess.release(); } std::vector x_data(1 * 224 * 224 * 3, 1); @@ -666,9 +740,9 @@ void BM_ParseExample(benchmark::State& state) { ::google::protobuf::Map signatures; std::unique_ptr sess; tensorflow::SessionOptions options; - TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &sess, &signatures, - absl::GetFlag(FLAGS_num_tflite_interpreters))); + TF_ASSERT_OK(TfLiteSession::Create( + std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), + absl::GetFlag(FLAGS_num_tflite_interpreters), &sess, &signatures)); session = sess.release(); } const int kBatchSize = 500; From 01dcc84b4f0051b3af6e567a6173561a4673c6f3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 7 Feb 2021 17:31:05 -0800 Subject: [PATCH 4704/8103] Implement batch parallelism for tflite sessions PiperOrigin-RevId: 356168500 --- tensorflow_serving/model_servers/main.cc | 9 +- tensorflow_serving/model_servers/server.cc | 5 +- tensorflow_serving/model_servers/server.h | 3 +- tensorflow_serving/servables/tensorflow/BUILD | 38 -- .../tensorflow/saved_model_bundle_factory.cc | 13 +- .../tensorflow/session_bundle_config.proto | 7 +- .../testdata/parse_example_tflite.py | 5 +- .../00000123/model.tflite | Bin 1584 -> 1792 bytes .../tensorflow/tflite_interpreter_pool.cc | 246 ++--------- .../tensorflow/tflite_interpreter_pool.h | 177 +------- .../tflite_interpreter_pool_test.cc | 269 ------------ .../servables/tensorflow/tflite_session.cc | 394 ++++++------------ .../servables/tensorflow/tflite_session.h | 29 +- .../tensorflow/tflite_session_main.cc | 6 +- .../tensorflow/tflite_session_test.cc | 152 ++----- 15 files changed, 246 insertions(+), 1107 deletions(-) delete mode 100644 tensorflow_serving/servables/tensorflow/tflite_interpreter_pool_test.cc diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index a83f95cce66..2d4f257d951 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -213,18 +213,11 @@ int main(int argc, char** argv) { "If no TensorFlow Lite model found, fallback to " "TensorFlow model."), tensorflow::Flag( - "num_tflite_pools", &options.num_tflite_pools, + "num_tflite_interpreters", &options.num_tflite_interpreters, "EXPERIMENTAL; CAN BE REMOVED ANYTIME! Number of TFLite interpreters " "in an interpreter pool of TfLiteSession. Typically there is one " "TfLiteSession for each TF Lite model that is loaded. If not " "set, will be auto set based on number of CPUs."), - tensorflow::Flag( - "num_tflite_interpreters_per_pool", - &options.num_tflite_interpreters_per_pool, - "EXPERIMENTAL; CAN BE REMOVED ANYTIME! Number of TFLite interpreters " - "in an interpreter pool of TfLiteSession. Typically there is one " - "TfLiteSession for each TF Lite model that is loaded. If not " - "set, will be 1."), tensorflow::Flag( "enable_signature_method_name_check", &options.enable_signature_method_name_check, diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index 0e4ca2343c6..6dfabae994e 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -277,9 +277,8 @@ Status Server::BuildAndStart(const Options& server_options) { server_options.remove_unused_fields_from_bundle_metagraph); session_bundle_config.set_prefer_tflite_model( server_options.prefer_tflite_model); - session_bundle_config.set_num_tflite_interpreters_per_pool( - server_options.num_tflite_interpreters_per_pool); - session_bundle_config.set_num_tflite_pools(server_options.num_tflite_pools); + session_bundle_config.set_num_tflite_interpreters( + server_options.num_tflite_interpreters); options.platform_config_map = CreateTensorFlowPlatformConfigMap(session_bundle_config); } else { diff --git a/tensorflow_serving/model_servers/server.h b/tensorflow_serving/model_servers/server.h index bcb55db1592..d06d2499867 100644 --- a/tensorflow_serving/model_servers/server.h +++ b/tensorflow_serving/model_servers/server.h @@ -88,8 +88,7 @@ class Server { bool enforce_session_run_timeout = true; bool remove_unused_fields_from_bundle_metagraph = true; bool prefer_tflite_model = false; - tensorflow::int32 num_tflite_pools = port::NumSchedulableCPUs(); - tensorflow::int32 num_tflite_interpreters_per_pool = 1; + tensorflow::int32 num_tflite_interpreters = port::NumSchedulableCPUs(); tensorflow::string thread_pool_factory_config_file; bool enable_signature_method_name_check = false; diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index 04ddf572452..8350bfdf6db 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -325,25 +325,17 @@ cc_library( ":serving_session", "@com_google_absl//absl/base:core_headers", "@com_google_absl//absl/synchronization", - "@com_google_absl//absl/types:span", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", - "@org_tensorflow//tensorflow/core:session_options", - "@org_tensorflow//tensorflow/lite:external_cpu_backend_context", "@org_tensorflow//tensorflow/lite:framework", "@org_tensorflow//tensorflow/lite:string_util", "@org_tensorflow//tensorflow/lite:util", "@org_tensorflow//tensorflow/lite/c:common", "@org_tensorflow//tensorflow/lite/delegates/flex:delegate", "@org_tensorflow//tensorflow/lite/kernels:builtin_ops", - "@org_tensorflow//tensorflow/lite/kernels:cpu_backend_context", "@org_tensorflow//tensorflow/lite/kernels/hashtable:hashtable_op_kernels", - "@org_tensorflow//tensorflow/lite/kernels/internal:tensor_utils", "@org_tensorflow//tensorflow/lite/kernels/parse_example", - "@org_tensorflow//tensorflow/lite/profiling:profile_summarizer", - "@org_tensorflow//tensorflow/lite/profiling:profile_summary_formatter", - "@org_tensorflow//tensorflow/lite/profiling:profiler", "@org_tensorflow//tensorflow/lite/tools/signature:signature_def_util", ], ) @@ -370,36 +362,6 @@ cc_test( "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", "@org_tensorflow//tensorflow/core:testlib", - "@org_tensorflow//tensorflow/lite:string_util", - "@org_tensorflow//tensorflow/lite:util", - "@org_tensorflow//tensorflow/lite:version", - "@org_tensorflow//tensorflow/lite/tools/signature:signature_def_util", - ], -) - -cc_test( - name = "tflite_interpreter_pool_test", - size = "small", - srcs = ["tflite_interpreter_pool_test.cc"], - data = [ - "//tensorflow_serving/servables/tensorflow/testdata:mobilenet_v1_quant_tflite", - "//tensorflow_serving/servables/tensorflow/testdata:parse_example_tflite", - "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_tflite", - "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_tflite_with_sigdef", - ], - deps = [ - ":tflite_session_lib", - "//tensorflow_serving/core/test_util:test_main", - "//tensorflow_serving/test_util", - "@com_google_absl//absl/flags:flag", - "@com_google_protobuf//:protobuf", - "@flatbuffers", - "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", - "@org_tensorflow//tensorflow/core:lib", - "@org_tensorflow//tensorflow/core:protos_all_cc", - "@org_tensorflow//tensorflow/core:test", - "@org_tensorflow//tensorflow/core:testlib", - "@org_tensorflow//tensorflow/lite:string_util", "@org_tensorflow//tensorflow/lite:util", "@org_tensorflow//tensorflow/lite:version", "@org_tensorflow//tensorflow/lite/tools/signature:signature_def_util", diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc index 2367ebe9b9d..d4818543943 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc @@ -63,8 +63,7 @@ Status ParseFixedInputTensors( const char kTfLiteModelFilename[] = "model.tflite"; Status LoadTfLiteModel(const string& model_dir, SavedModelBundle* bundle, - const SessionOptions& options, int num_interpreter_pools, - int num_interpreters_per_pool) { + int num_interpreters) { std::unique_ptr session; const string& fname = io::JoinPath(model_dir, kTfLiteModelFilename); @@ -81,9 +80,8 @@ Status LoadTfLiteModel(const string& model_dir, SavedModelBundle* bundle, std::unique_ptr tflite_session; TF_RETURN_IF_ERROR(TfLiteSession::Create( - std::move(model_bytes), options, num_interpreter_pools, - num_interpreters_per_pool, &tflite_session, - bundle->meta_graph_def.mutable_signature_def())); + std::move(model_bytes), &tflite_session, + bundle->meta_graph_def.mutable_signature_def(), num_interpreters)); bundle->session = std::move(tflite_session); return Status::OK(); } @@ -147,9 +145,8 @@ Status SavedModelBundleFactory::InternalCreateSavedModelBundle( }(); if (config_.prefer_tflite_model() && TfLiteModelFound(path)) { - TF_RETURN_IF_ERROR(LoadTfLiteModel( - path, bundle->get(), session_options, config_.num_tflite_pools(), - config_.num_tflite_interpreters_per_pool())); + TF_RETURN_IF_ERROR(LoadTfLiteModel(path, bundle->get(), + config_.num_tflite_interpreters())); } else { TF_RETURN_IF_ERROR(session_bundle::LoadSessionBundleOrSavedModelBundle( session_options, GetRunOptions(config_), path, saved_model_tags, diff --git a/tensorflow_serving/servables/tensorflow/session_bundle_config.proto b/tensorflow_serving/servables/tensorflow/session_bundle_config.proto index ae4eef45140..e6fdae3df10 100644 --- a/tensorflow_serving/servables/tensorflow/session_bundle_config.proto +++ b/tensorflow_serving/servables/tensorflow/session_bundle_config.proto @@ -97,12 +97,7 @@ message SessionBundleConfig { // EXPERIMENTAL. THIS FIELD MAY CHANGE OR GO AWAY. USE WITH CAUTION. // // Number of TFLite interpreters in an interpreter pool of TfLiteSession. - int32 num_tflite_interpreters_per_pool = 785; - - // EXPERIMENTAL. THIS FIELD MAY CHANGE OR GO AWAY. USE WITH CAUTION. - // - // Number of TFLite interpreter pools in a TfLiteSession. - int32 num_tflite_pools = 786; + int32 num_tflite_interpreters = 785; } // Batching parameters. Each individual parameter is optional. If omitted, the diff --git a/tensorflow_serving/servables/tensorflow/testdata/parse_example_tflite.py b/tensorflow_serving/servables/tensorflow/testdata/parse_example_tflite.py index 854322a9f08..dd389f74b67 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/parse_example_tflite.py +++ b/tensorflow_serving/servables/tensorflow/testdata/parse_example_tflite.py @@ -79,8 +79,9 @@ def _generate_tflite_for_parse_example_with_string(export_dir): _get_feature_spec()) converter = tf.lite.TFLiteConverter.from_session( sess, [serialized_tf_example], [tf_example["x"], tf_example["y"]]) - converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS] - converter.allow_custom_ops = True + converter.target_spec.supported_ops = [ + tf.lite.OpsSet.TFLITE_BUILTINS, tf.lite.OpsSet.SELECT_TF_OPS + ] tflite_model = converter.convert() predict_signature_def = _build_predict_signature(serialized_tf_example, tf_example["x"], diff --git a/tensorflow_serving/servables/tensorflow/testdata/parse_example_tflite/00000123/model.tflite b/tensorflow_serving/servables/tensorflow/testdata/parse_example_tflite/00000123/model.tflite index 4fa12ea0237d6e16f13896469622903fe319f16d..831eb985bcd45f378acc4a2df8e2c98fb108faf3 100644 GIT binary patch delta 324 zcmdnM)4(@Dg=qoXMzv>*LMgxh|7Sn~CBG-jG1UovK@(<~yq3wDtALS#Aq9v-7$<*X zGOA|)GCu(IvHAi$gt&N$3qXd%msA#{77HCaG7Z>DYmLO#Okfh2Ib4rml32<@c zmF5Cu13#{LK?|Vj%SqRWMH~|Mnr@~gK@Jr T^F<~JA)v3^a#AbMJjMV3`NC16 delta 139 zcmZqR+rTqHh3N|GMzv>*LI!{S|7Sn~4u2-gG1UnkKoh<&c`cJQ*Ak$@89>~@F!>Xc zk-7 #include #include -#include "tensorflow/core/platform/errors.h" #include "tensorflow/lite/kernels/hashtable/hashtable_ops.h" #include "tensorflow/lite/kernels/parse_example/parse_example.h" #include "tensorflow/lite/kernels/register.h" @@ -28,236 +26,64 @@ namespace tensorflow { namespace serving { namespace internal { -TfLiteInterpreterWrapper::TfLiteInterpreterWrapper( - std::unique_ptr interpreter) - : -#ifdef TFLITE_PROFILE - interpreter_(std::move(interpreter)), - fixed_batch_size_(fixed_batch_size), - max_num_entries_(TFLITE_PROFILE_EVENTS), - profiler_(max_num_entries_) -#else - interpreter_(std::move(interpreter)) -#endif -{ -#ifdef TFLITE_PROFILE - interpreter_->SetProfiler(&profiler_); -#endif - for (const int& idx : interpreter_->inputs()) { - const auto* tflite_tensor = interpreter_->tensor(idx); - if (tflite_tensor->type == kTfLiteString) { - tensor_buffer_.emplace(idx, - std::unique_ptr(tflite_tensor->data.raw)); - tensor_buffer_max_bytes_[idx] = 0; - } - } -} - -tensorflow::Status TfLiteInterpreterWrapper::SetStringData( - const gtl::ArraySlice& batch, - TfLiteTensor* tflite_tensor, int tensor_index) { - // Format of the buffer for tflite: - // [0] number of strings (int32_t) - // [4] offset of each string (int32_t) - // [sizeof(int32_t) * (num_strings + 1)]] total size of strings - // [sizeof(int32_t) * (num_strings + 2)] batch.data() - int32_t num_strings = batch.size(); - offset_.clear(); - size_t total_size = 0; - offset_.push_back(static_cast(total_size)); - for (int i = 0; i < num_strings; i++) { - total_size += batch[i].size(); - offset_.push_back(static_cast(total_size)); - } - size_t required_bytes = total_size + sizeof(int32_t) * (num_strings + 2); - if (tensor_buffer_.find(tensor_index) == tensor_buffer_.end()) { - return errors::Internal("Tensor input for index not found: ", tensor_index); - } - if (tensor_buffer_max_bytes_[tensor_index] > 0 && - required_bytes > tensor_buffer_max_bytes_[tensor_index]) { - tensor_buffer_max_bytes_[tensor_index] = 0; - } - - if (tensor_buffer_max_bytes_[tensor_index] == 0) { - tensor_buffer_[tensor_index].reset( - reinterpret_cast(malloc(required_bytes))); - tensor_buffer_max_bytes_[tensor_index] = required_bytes; - } else { - tensor_buffer_[tensor_index].reset(tflite_tensor->data.raw); - } - memcpy(tensor_buffer_[tensor_index].get(), &num_strings, sizeof(int32_t)); - int32_t start = sizeof(int32_t) * (num_strings + 2); - for (size_t i = 0; i < offset_.size(); i++) { - size_t size_offset_i = start + offset_[i]; - if (size_offset_i > std::numeric_limits::max()) { - return errors::Internal("Invalid size, string input too large:", - size_offset_i); - } - int32_t offset_i = static_cast(size_offset_i); - memcpy(tensor_buffer_[tensor_index].get() + sizeof(int32_t) * (i + 1), - &offset_i, sizeof(int32_t)); - } - for (int i = 0; i < num_strings; i++) { - memcpy(tensor_buffer_[tensor_index].get() + start, batch[i].data(), - batch[i].size()); - start += batch[i].size(); - } - - // tflite_tensor will take ownership of the pointer. - tflite_tensor->data.raw = tensor_buffer_[tensor_index].release(); - tflite_tensor->bytes = required_bytes; - tflite_tensor->allocation_type = kTfLiteDynamic; - return Status::OK(); -} - -TfLiteStatus TfLiteInterpreterWrapper::Invoke() { -#ifdef TFLITE_PROFILE - if (invocation_count_ > 0) { - profiler_.Reset(); - profiler_.StartProfiling(); - } -#endif - auto status = interpreter_->Invoke(); -#ifdef TFLITE_PROFILE - if (invocation_count_ > 0) { - profiler_.StopProfiling(); - auto profile_events = profiler_.GetProfileEvents(); - run_summarizer_.ProcessProfiles(profile_events, *interpreter_); - } - if (invocation_count_++ >= MAX_PROFILE_EVENTS) { - WriteProfileData(); - run_summarizer_.Clear(); - invocation_count_ = 0; - } -#endif - return status; -} - -tensorflow::Status TfLiteInterpreterPool::CreateTfLiteInterpreterPool( - const tflite::FlatBufferModel& model, bool run_in_caller, - bool use_batch_parallelism, int batch_pool_size, int id, - const tensorflow::SessionOptions& options, +Status TfLiteInterpreterPool::CreateTfLiteInterpreterPool( + const tflite::FlatBufferModel& model, int num_interpreters, std::unique_ptr& pool) { - // If can't use_batch_parallelism or pool size is 1, - // just use 1 interpreter and run in caller. - if (!use_batch_parallelism || batch_pool_size == 1) { - run_in_caller = true; - batch_pool_size = 1; - use_batch_parallelism = false; - } - std::unique_ptr thread_pool; - int num_interpreters = run_in_caller ? 1 : 0; - if (!run_in_caller || use_batch_parallelism) { - thread_pool.reset(new tensorflow::thread::ThreadPool( - options.env, tensorflow::ThreadOptions(), - absl::StrCat(kTfLiteThreadPoolName, id), batch_pool_size, false, - nullptr)); - num_interpreters += thread_pool->NumThreads(); - } - // TODO(b/140959776): Add support for non-builtin ops (flex or custom ops). tflite::ops::builtin::BuiltinOpResolver resolver; - tflite::ops::custom::AddParseExampleOp(&resolver); // TODO(b/165643512): Remove adding Hashtable to resolver by default. tflite::ops::custom::AddHashtableOps(&resolver); - int fixed_batch_size = 1; - if (use_batch_parallelism) { - if (num_interpreters < 1) { - return errors::InvalidArgument( - "CreateTfLiteInterpreterPool requested ", - "invalid number of interpreters: ", num_interpreters); - } - fixed_batch_size = - (kInitialBatchSize + num_interpreters - 1) / num_interpreters; - } - std::vector> interpreters; + tflite::ops::custom::AddParseExampleOp(&resolver); + num_interpreters = std::max(num_interpreters, 1); + std::vector> interpreters; + interpreters.reserve(num_interpreters); for (int i = 0; i < num_interpreters; i++) { std::unique_ptr interpreter; - if (tflite::InterpreterBuilder(model, resolver)( - &interpreter, /*num_threads=*/1) != kTfLiteOk) { + if (tflite::InterpreterBuilder(model, resolver)(&interpreter) != + kTfLiteOk) { return errors::Internal( "Failed to create a TFLite interpreter with the given model"); } - const int idx = interpreter->inputs()[0]; - const auto* tensor = interpreter->tensor(idx); - if (tensor->type == kTfLiteString) { - interpreter->ResizeInputTensor(idx, {fixed_batch_size}); - } if (interpreter->AllocateTensors() != kTfLiteOk) { return errors::Internal("Failed to allocate tensors"); } - interpreters.push_back( - std::make_unique(std::move(interpreter))); - interpreters.back()->SetMiniBatchSize(fixed_batch_size); + interpreters.push_back(std::move(interpreter)); } - pool.reset(new TfLiteInterpreterPool( - id, std::move(interpreters), std::move(thread_pool), num_interpreters, - fixed_batch_size, use_batch_parallelism)); - return tensorflow::Status::OK(); -} - -TfLiteInterpreterPool::TfLiteInterpreterPool( - int id, std::vector> interpreters, - std::unique_ptr thread_pool, - int num_interpreters, int fixed_batch_size, bool use_batch_parallelism) - : id_(id), - interpreters_(std::move(interpreters)), - thread_pool_(std::move(thread_pool)), - num_interpreters_(num_interpreters), - fixed_batch_size_(fixed_batch_size), - use_batch_parallelism_(use_batch_parallelism) {} -std::unique_ptr& -TfLiteInterpreterPool::GetInterpreter(int interpreter_idx) { - return interpreters_[interpreter_idx]; + pool.reset(new TfLiteInterpreterPool(std::move(interpreters))); + return Status::OK(); } -namespace { - -bool IsBatchParallelizable(const tflite::Model* model) { - auto tflite_model = absl::make_unique(); - model->UnPackTo(tflite_model.get(), nullptr); - if (tflite_model->subgraphs.empty()) { - return false; - } - const auto& subgraph = tflite_model->subgraphs[0]; - if (subgraph->inputs.size() != 1) { - return false; - } - int input_tensor_id = subgraph->inputs[0]; - const std::vector supported_ops = {"ParseExample", "ParseExampleV2"}; - for (size_t op_idx = 0; op_idx < subgraph->operators.size(); op_idx++) { - tflite::OperatorT* op = subgraph->operators[op_idx].get(); - if (std::find(op->inputs.begin(), op->inputs.end(), input_tensor_id) != - op->inputs.end()) { - const std::string& custom_code = - tflite_model->operator_codes[op->opcode_index]->custom_code; - return std::find(supported_ops.begin(), supported_ops.end(), - custom_code) != supported_ops.end(); - } +TfLiteInterpreterPool::TfLiteInterpreterPool( + std::vector> interpreters) + : interpreters_(std::move(interpreters)) { + auto num_interpreters = interpreters_.size(); + available_.reserve(num_interpreters); + for (int i = 0; i < num_interpreters; i++) { + available_.push_back(interpreters_[i].get()); } - return false; } -} // namespace +std::unique_ptr +TfLiteInterpreterPool::GetInterpreter() { + auto interpreter_available = [this]() ABSL_SHARED_LOCKS_REQUIRED(mutex_) { + return !this->available_.empty(); + }; + mutex_.LockWhen(absl::Condition(&interpreter_available)); + + tflite::Interpreter* interpreter = available_.back(); + available_.pop_back(); + mutex_.Unlock(); + auto interpreter_wrapper = + std::make_unique(interpreter, this); + return interpreter_wrapper; +} -tensorflow::Status TfLiteSessionPool::CreateTfLiteSessionPool( - const tflite::FlatBufferModel* model, - const tensorflow::SessionOptions& options, bool run_in_caller, - int pool_size, int batch_pool_size, - std::unique_ptr& tflite_session_pool) { - bool use_batch_parallelism = IsBatchParallelizable(model->GetModel()); - std::vector> pools; - for (int i = 0; i < pool_size; i++) { - std::unique_ptr pool; - TF_RETURN_IF_ERROR(TfLiteInterpreterPool::CreateTfLiteInterpreterPool( - *model, run_in_caller, use_batch_parallelism, batch_pool_size, i, - options, pool)); - pools.push_back(std::move(pool)); - } - tflite_session_pool.reset(new TfLiteSessionPool(std::move(pools))); - return tensorflow::Status::OK(); +void TfLiteInterpreterPool::ReturnInterpreter( + tflite::Interpreter* interpreter) { + absl::MutexLock l(&mutex_); + available_.push_back(interpreter); } } // namespace internal diff --git a/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h b/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h index 9ac320be379..c18a138ec55 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h +++ b/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h @@ -21,185 +21,54 @@ limitations under the License. #include "absl/base/thread_annotations.h" #include "absl/synchronization/mutex.h" -#include "tensorflow/core/common_runtime/process_util.h" -#include "tensorflow/core/lib/gtl/array_slice.h" -#include "tensorflow/core/platform/cpu_info.h" -#include "tensorflow/core/platform/tstring.h" -#include "tensorflow/core/public/session_options.h" -#include "tensorflow/lite/c/common.h" +#include "tensorflow/core/lib/core/errors.h" #include "tensorflow/lite/model.h" -#ifdef TFLITE_PROFILE -#ifndef TFLITE_PROFILE_EVENTS -#define TFLITE_PROFILE_EVENTS 2000 -#endif -#include "tensorflow/lite/profiling/buffered_profiler.h" -#include "tensorflow/lite/profiling/profile_summarizer.h" -#include "tensorflow/lite/profiling/profile_summary_formatter.h" -#endif -#include "tensorflow/lite/string_util.h" namespace tensorflow { namespace serving { namespace internal { -constexpr char kTfLiteThreadPoolName[] = "tflite_compute"; - -constexpr int kInitialBatchSize = 500; - class TfLiteInterpreterWrapper; -// A TFLite batch pool to maintain pre-created tflite::Interpreter -// objects. +// A TFLite interpreter pool to maintain pre-created tflite::Interpreter +// objects. This class is thread-safe. class TfLiteInterpreterPool { public: - // Create a vector of TfLiteInterpreterWrapper objects with the given TFLite - // FlatBufferModel `model`. - // The number of created interpreters will depend on batch_pool_size, - // whether the calling thread requires a interpreter, `run_in_caller`, and - // whether the model can make use of batch parallelism. - // If the model cannot make use of batch parallelism, only - // a single interpreter will be created. Otherwise, the setting is set by - // batch_pool_size + 1 if run_in_caller is true. - // The model must outlive the returned pool instance. + // Create an interpreter pool with the given TFLite model and number of + // interpreters. The model must outlive the returned pool instance. static Status CreateTfLiteInterpreterPool( - const tflite::FlatBufferModel& model, bool run_in_caller, - bool use_batch_parallelism, int batch_pool_size, int id, - const tensorflow::SessionOptions& options, + const tflite::FlatBufferModel& model, int num_interpreters, std::unique_ptr& pool); - - // The allocated batch size of the TfLite interpreters. - int FixedBatchSize() { return fixed_batch_size_; } - - // Returns an interpreter wrapper from the pool at the given index. - std::unique_ptr& GetInterpreter( - int interpreter_idx); - - // The Id of the interpreterwrapper object, used to target a specific - // interpreterwrapper. - const int Id() { return id_; } - - // Number of interpreters. - const int NumInterpreters() { return num_interpreters_; } - - // Returns a ThreadPool for use with each interpreter, will be null - // if using run_in_caller and only 1 interpreter. - tensorflow::thread::ThreadPool* ThreadPool() { return thread_pool_.get(); } - - // Returns whether the pool is configured to use batch parallelism. - const bool UseBatchParallelism() { return use_batch_parallelism_; } + // Returns a TFLite interpreter wrapper object. Caller may *block* waiting for + // a free interpreter to be available. + std::unique_ptr GetInterpreter(); private: TfLiteInterpreterPool( - int id, - std::vector> interpreters, - std::unique_ptr thread_pool, - int num_interpreters, int fixed_batch_size, bool use_batch_parallelism); - int id_; + std::vector> interpreters); + void ReturnInterpreter(tflite::Interpreter* interpreter); + mutable absl::Mutex mutex_; // A vector to maintain pointers of available interpreters - std::vector> interpreters_; - std::unique_ptr thread_pool_; - int num_interpreters_; - int fixed_batch_size_; - bool use_batch_parallelism_ = false; + std::vector available_ ABSL_GUARDED_BY(mutex_); + const std::vector> interpreters_; + + friend TfLiteInterpreterWrapper; }; // A TFLite interpreter wrapper class which automatically returns used // interpreter object to TfLiteInterpreterPool. class TfLiteInterpreterWrapper { public: - // Constructor for wrapper takes only an initialized interpreter. - TfLiteInterpreterWrapper(std::unique_ptr interpreter); - - // Returns the underlying interpreter. - tflite::Interpreter* Get() { return interpreter_.get(); } - - // If using parallelism, get the allocated batch size of the interpreter. - int GetMiniBatchSize() { return mini_batch_size_; } - - // Set the batch size. - void SetMiniBatchSize(int mini_batch_size) { - mini_batch_size_ = mini_batch_size; - } - - // Invokes the interpreter. - TfLiteStatus Invoke(); -#ifdef TFLITE_PROFILE - void WriteOutput(const std::string& header, const string& data, - std::ostream* stream) { - (*stream) << header << std::endl; - (*stream) << data << std::endl; - } - - void WriteProfileData() { - if (run_summarizer_.HasProfiles()) { - WriteOutput("Operator-wise Profiling Info for Regular Benchmark Runs:", - run_summarizer_.GetOutputString(), &std::cout); - } - } -#endif - - // Sets the contents of the internal buffer _tensor_buffer_ to the tflite - // formatted string buffer equivalent stored in `batch` and sets - // raw pointer of `tflite_tensor` to the internal buffer. If the required - // size is larger than the current size, will allocate new memory and - // free the existing buffer. - tensorflow::Status SetStringData( - const gtl::ArraySlice& batch, - TfLiteTensor* tflite_tensor, int tensor_index); + TfLiteInterpreterWrapper(tflite::Interpreter* interpreter, + TfLiteInterpreterPool* pool) + : interpreter_(interpreter), pool_(pool) {} - private: - std::unique_ptr interpreter_; - int mini_batch_size_ = 1; - std::map> tensor_buffer_; - std::map tensor_buffer_max_bytes_; - std::vector offset_; -#ifdef TFLITE_PROFILE - int max_num_entries_; - tflite::profiling::ProfileSummarizer run_summarizer_; - tflite::profiling::BufferedProfiler profiler_; - int invocation_count_ = 0; -#endif -}; - -// Contains a vector of TfLiteInterpreterPool, which are protected by mutex. -// When GetInterpreterPool is called, will either release a unique ptr to the -// caller or block if the vector is empty. -class TfLiteSessionPool { - public: - // Creates a TfLiteSessionPool with model, session options, - // whether to run in caller thread, pool_size and batch_pool_size for - // each InterpreterPool. - static tensorflow::Status CreateTfLiteSessionPool( - const tflite::FlatBufferModel* model, - const tensorflow::SessionOptions& options, bool run_in_caller, - int pool_size, int batch_pool_size, - std::unique_ptr& tflite_session_pool); - - // Returns a TFLite interpreter pool object. Caller may *block* waiting for - // a free interpreter pool to be available. - std::unique_ptr GetInterpreterPool() { - auto interpreter_available = [this]() ABSL_SHARED_LOCKS_REQUIRED(mutex_) { - return !this->available_.empty(); - }; - mutex_.LockWhen(absl::Condition(&interpreter_available)); - auto pool = std::move(available_.back()); - available_.pop_back(); - mutex_.Unlock(); - return pool; - } - - // Returns an interpreter pool to the available pool. - void ReturnInterpreterPool(std::unique_ptr pool) { - absl::MutexLock l(&mutex_); - available_.emplace_back(std::move(pool)); - } + ~TfLiteInterpreterWrapper() { pool_->ReturnInterpreter(interpreter_); } + tflite::Interpreter* Get() { return interpreter_; } private: - TfLiteSessionPool(std::vector> pools) - : available_(std::move(pools)) {} - mutable absl::Mutex mutex_; - std::vector> available_ - ABSL_GUARDED_BY(mutex_); + tflite::Interpreter* const interpreter_; + TfLiteInterpreterPool* const pool_; }; } // namespace internal diff --git a/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool_test.cc b/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool_test.cc deleted file mode 100644 index c5dc1ad5f2d..00000000000 --- a/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool_test.cc +++ /dev/null @@ -1,269 +0,0 @@ -/* Copyright 2021 Google Inc. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#include "tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h" - -#include - -#include -#include -#include "tensorflow/core/example/example.pb.h" -#include "tensorflow/core/example/feature.pb.h" -#include "tensorflow/core/lib/core/status_test_util.h" -#include "tensorflow/lite/kernels/parse_example/parse_example.h" -#include "tensorflow/lite/kernels/register.h" -#include "tensorflow_serving/test_util/test_util.h" - -namespace tensorflow { -namespace serving { -namespace internal { - -using tensorflow::gtl::ArraySlice; - -constexpr char kParseExampleModel[] = - "/servables/tensorflow/testdata/parse_example_tflite/00000123/" - "model.tflite"; - -constexpr char kMobileNetModel[] = - "/servables/tensorflow/testdata/mobilenet_v1_quant_tflite/00000123/" - "model.tflite"; - -TEST(TfLiteInterpreterPool, CreateTfLiteInterpreterPoolTest) { - string model_bytes; - TF_ASSERT_OK(ReadFileToString(Env::Default(), - test_util::TestSrcDirPath(kParseExampleModel), - &model_bytes)); - auto model = tflite::FlatBufferModel::BuildFromModel( - flatbuffers::GetRoot(model_bytes.data())); - int id = 0; - bool use_batch_parallelism = false; - int batch_pool_size = 1; - bool run_in_caller = true; - const tensorflow::SessionOptions options; - std::unique_ptr pool; - TF_ASSERT_OK(TfLiteInterpreterPool::CreateTfLiteInterpreterPool( - *model, run_in_caller, use_batch_parallelism, batch_pool_size, id, - options, pool)); - ASSERT_EQ(pool->NumInterpreters(), batch_pool_size); - ASSERT_EQ(pool->Id(), id); - ASSERT_EQ(pool->FixedBatchSize(), 1); // batch_parallelism turned off. - pool.reset(); - run_in_caller = false; - use_batch_parallelism = true; - TF_ASSERT_OK(TfLiteInterpreterPool::CreateTfLiteInterpreterPool( - *model, run_in_caller, use_batch_parallelism, ++batch_pool_size, id, - options, pool)); - ASSERT_EQ(pool->NumInterpreters(), batch_pool_size); - ASSERT_EQ(pool->ThreadPool()->NumThreads(), batch_pool_size); - ASSERT_EQ(pool->UseBatchParallelism(), use_batch_parallelism); - pool.reset(); - TF_ASSERT_OK(TfLiteInterpreterPool::CreateTfLiteInterpreterPool( - *model, run_in_caller, use_batch_parallelism, ++batch_pool_size, id, - options, pool)); - ASSERT_EQ(pool->NumInterpreters(), batch_pool_size); - ASSERT_EQ(pool->FixedBatchSize(), (kInitialBatchSize + 2) / batch_pool_size); - pool.reset(); - use_batch_parallelism = false; - run_in_caller = true; - TF_ASSERT_OK(TfLiteInterpreterPool::CreateTfLiteInterpreterPool( - *model, run_in_caller, use_batch_parallelism, batch_pool_size, id, - options, pool)); - ASSERT_EQ(pool->NumInterpreters(), 1); - ASSERT_EQ(pool->FixedBatchSize(), 1); // batch_parallelism turned off. - ASSERT_EQ(pool->ThreadPool(), nullptr); - ASSERT_EQ(pool->UseBatchParallelism(), use_batch_parallelism); - pool.reset(); - use_batch_parallelism = true; - TF_ASSERT_OK(TfLiteInterpreterPool::CreateTfLiteInterpreterPool( - *model, run_in_caller, use_batch_parallelism, batch_pool_size, id, - options, pool)); - ASSERT_EQ(pool->NumInterpreters(), batch_pool_size + 1); - ASSERT_EQ(pool->ThreadPool()->NumThreads(), batch_pool_size); - pool.reset(); -} - -TEST(TfLiteSessionPool, CreateTfLiteSessionPoolTest) { - string model_bytes; - TF_ASSERT_OK(ReadFileToString(Env::Default(), - test_util::TestSrcDirPath(kParseExampleModel), - &model_bytes)); - auto model = tflite::FlatBufferModel::BuildFromModel( - flatbuffers::GetRoot(model_bytes.data())); - int pool_size = 1; - int batch_pool_size = 2; - bool run_in_caller_thread = false; - const tensorflow::SessionOptions options; - std::unique_ptr session_pool; - TF_ASSERT_OK(TfLiteSessionPool::CreateTfLiteSessionPool( - model.get(), options, run_in_caller_thread, pool_size, batch_pool_size, - session_pool)); - auto pool = session_pool->GetInterpreterPool(); - ASSERT_EQ(pool->NumInterpreters(), batch_pool_size); - ASSERT_EQ(pool->Id(), 0); - ASSERT_EQ(pool->FixedBatchSize(), - (kInitialBatchSize + batch_pool_size - 1) / batch_pool_size); - session_pool->ReturnInterpreterPool(std::move(pool)); - session_pool.reset(); - - pool_size = 2; - batch_pool_size = 2; - run_in_caller_thread = false; - TF_ASSERT_OK(TfLiteSessionPool::CreateTfLiteSessionPool( - model.get(), options, run_in_caller_thread, pool_size, batch_pool_size, - session_pool)); - - pool = session_pool->GetInterpreterPool(); - ASSERT_EQ(pool->NumInterpreters(), batch_pool_size); - ASSERT_EQ(pool->Id(), 1); - ASSERT_EQ(pool->FixedBatchSize(), (kInitialBatchSize + 1) / 2); - session_pool->ReturnInterpreterPool(std::move(pool)); - session_pool.reset(); -} - -TEST(TfLiteSessionPool, CreateTfLiteSessionPoolNotBatchParallelTest) { - string model_bytes; - TF_ASSERT_OK(ReadFileToString(Env::Default(), - test_util::TestSrcDirPath(kMobileNetModel), - &model_bytes)); - auto model = tflite::FlatBufferModel::BuildFromModel( - flatbuffers::GetRoot(model_bytes.data())); - int pool_size = 1; - int batch_pool_size = 1; - bool run_in_caller_thread = false; - const tensorflow::SessionOptions options; - std::unique_ptr session_pool; - TF_ASSERT_OK(TfLiteSessionPool::CreateTfLiteSessionPool( - model.get(), options, run_in_caller_thread, pool_size, batch_pool_size, - session_pool)); - - auto pool = session_pool->GetInterpreterPool(); - ASSERT_EQ(pool->NumInterpreters(), 1); - ASSERT_EQ(pool->Id(), 0); - ASSERT_EQ(pool->FixedBatchSize(), 1); - session_pool->ReturnInterpreterPool(std::move(pool)); - session_pool.reset(); - - pool_size = 2; - batch_pool_size = 2; - run_in_caller_thread = false; - TF_ASSERT_OK(TfLiteSessionPool::CreateTfLiteSessionPool( - model.get(), options, run_in_caller_thread, pool_size, batch_pool_size, - session_pool)); - - pool = session_pool->GetInterpreterPool(); - ASSERT_EQ(pool->NumInterpreters(), 1); - ASSERT_EQ(pool->Id(), 1); - ASSERT_EQ(pool->FixedBatchSize(), 1); - session_pool->ReturnInterpreterPool(std::move(pool)); - session_pool.reset(); -} - -int GetTensorSize(const TfLiteTensor* tflite_tensor) { - int size = 1; - for (int i = 0; i < tflite_tensor->dims->size; ++i) { - size *= tflite_tensor->dims->data[i]; - } - return size; -} - -template -std::vector ExtractVector(const TfLiteTensor* tflite_tensor) { - const T* v = reinterpret_cast(tflite_tensor->data.raw); - return std::vector(v, v + GetTensorSize(tflite_tensor)); -} - -template <> -std::vector ExtractVector(const TfLiteTensor* tflite_tensor) { - std::vector out; - for (int i = 0; i < tflite::GetStringCount(tflite_tensor); ++i) { - auto ref = tflite::GetString(tflite_tensor, i); - out.emplace_back(ref.str, ref.len); - } - return out; -} - -TEST(TfLiteInterpreterWrapper, TfLiteInterpreterWrapperTest) { - string model_bytes; - TF_ASSERT_OK(ReadFileToString(Env::Default(), - test_util::TestSrcDirPath(kParseExampleModel), - &model_bytes)); - auto model = tflite::FlatBufferModel::BuildFromModel( - flatbuffers::GetRoot(model_bytes.data())); - tflite::ops::builtin::BuiltinOpResolver resolver; - tflite::ops::custom::AddParseExampleOp(&resolver); - std::unique_ptr interpreter; - ASSERT_EQ(tflite::InterpreterBuilder(*model, resolver)(&interpreter, - /*num_threads=*/1), - kTfLiteOk); - ASSERT_EQ(interpreter->inputs().size(), 1); - const int idx = interpreter->inputs()[0]; - auto* tensor = interpreter->tensor(idx); - ASSERT_EQ(tensor->type, kTfLiteString); - int fixed_batch_size = 10; - int actual_batch_size = 3; - interpreter->ResizeInputTensor(idx, {fixed_batch_size}); - ASSERT_EQ(interpreter->AllocateTensors(), kTfLiteOk); - auto interpreter_wrapper = - std::make_unique(std::move(interpreter)); - interpreter_wrapper->SetMiniBatchSize(fixed_batch_size); - ASSERT_EQ(interpreter_wrapper->GetMiniBatchSize(), fixed_batch_size); - std::vector data; - std::vector expected_floats; - std::vector expected_strs; - for (int i = 0; i < actual_batch_size; ++i) { - tensorflow::Example example; - std::string str; - auto* features = example.mutable_features(); - const float f = i % 2 == 1 ? 1.0 : -1.0; - const std::string s = i % 2 == 1 ? "test" : "missing"; - expected_floats.push_back(f); - expected_strs.push_back(s); - (*features->mutable_feature())["x"].mutable_float_list()->add_value( - expected_floats.back()); - (*features->mutable_feature())["y"].mutable_bytes_list()->add_value( - expected_strs.back()); - example.SerializeToString(&str); - data.push_back(str); - } - ASSERT_FALSE(interpreter_wrapper->SetStringData(data, tensor, -1) == - Status::OK()); - TF_ASSERT_OK(interpreter_wrapper->SetStringData(data, tensor, idx)); - auto wrapped = interpreter_wrapper->Get(); - ASSERT_EQ(wrapped->inputs().size(), 1); - int input_idx = wrapped->inputs()[0]; - auto tflite_input_tensor = wrapped->tensor(input_idx); - ASSERT_EQ(GetTensorSize(tflite_input_tensor), fixed_batch_size); - ASSERT_EQ(tflite::GetStringCount(tflite_input_tensor), actual_batch_size); - auto input_strs = ExtractVector(tflite_input_tensor); - EXPECT_THAT(input_strs, ::testing::ElementsAreArray(data)); - ASSERT_EQ(interpreter_wrapper->Invoke(), kTfLiteOk); - const std::vector& indices = wrapped->outputs(); - auto* tflite_tensor = wrapped->tensor(indices[0]); - ASSERT_EQ(tflite_tensor->type, kTfLiteFloat32); - ASSERT_EQ(GetTensorSize(tflite_tensor), fixed_batch_size); - EXPECT_THAT(ArraySlice(ExtractVector(tflite_tensor).data(), - actual_batch_size), - ::testing::ElementsAreArray(expected_floats)); - tflite_tensor = wrapped->tensor(indices[1]); - ASSERT_EQ(tflite_tensor->type, kTfLiteString); - ASSERT_EQ(GetTensorSize(tflite_tensor), fixed_batch_size); - EXPECT_THAT( - ArraySlice(ExtractVector(tflite_tensor).data(), - actual_batch_size), - ::testing::ElementsAreArray(expected_strs)); -} - -} // namespace internal -} // namespace serving -} // namespace tensorflow diff --git a/tensorflow_serving/servables/tensorflow/tflite_session.cc b/tensorflow_serving/servables/tensorflow/tflite_session.cc index 03d475f7030..7f90b0db8b5 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session.cc @@ -21,13 +21,8 @@ limitations under the License. #include "tensorflow/cc/saved_model/signature_constants.h" #include "tensorflow/core/framework/tensor_shape.pb.h" -#include "tensorflow/core/lib/core/blocking_counter.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/lite/c/common.h" -#include "tensorflow/lite/kernels/cpu_backend_context.h" -#include "tensorflow/lite/kernels/hashtable/hashtable_ops.h" -#include "tensorflow/lite/kernels/internal/tensor_utils.h" -#include "tensorflow/lite/kernels/parse_example/parse_example.h" #include "tensorflow/lite/kernels/register.h" #include "tensorflow/lite/string_util.h" #include "tensorflow/lite/tools/signature/signature_def_util.h" @@ -38,6 +33,8 @@ namespace tensorflow { namespace serving { // Map of TFLite tensor name to . +using TensorInfoMap = std::map>; + namespace { Status TfLiteTypeToTfType(TfLiteType tflite_type, DataType* type) { @@ -139,258 +136,139 @@ Status GetTensorInfoMap(const tflite::Interpreter* interpreter, bool input, return Status::OK(); } -std::vector TensorDims(const Tensor* tensor) { - std::vector dims(tensor->dims()); - for (int i = 0; i < tensor->dims(); ++i) { - dims[i] = static_cast(tensor->dim_size(i)); +std::vector TensorDims(const Tensor& tensor) { + std::vector dims; + dims.reserve(tensor.dims()); + for (int i = 0; i < tensor.dims(); ++i) { + dims.push_back(static_cast(tensor.dim_size(i))); } return dims; } -// Create output tensors making sure they are the right size. // -Status CreateOutputTensors( - std::unique_ptr& interpreter_pool, - const std::vector& output_tensor_names, - const std::map& output_tensor_to_idx, - std::map& tflite_idx_to_output_tensor, - std::vector* output_tensors, bool use_batch_parallelism = false, - int actual_batch_size = 0) { - output_tensors->reserve(output_tensor_names.size()); - for (std::string tfname : output_tensor_names) { - auto fix_status = FixTfLiteTensorName(output_tensor_to_idx, tfname); - if (fix_status != Status::OK()) { - return errors::Internal("Missing output TFLite tensor: ", tfname, ": ", - fix_status.error_message()); - } - const int tflite_idx = output_tensor_to_idx.at(tfname); - TensorShape tf_shape; - const auto& interpreter = interpreter_pool->GetInterpreter(0)->Get(); - const auto* tflite_tensor = interpreter->tensor(tflite_idx); - if (use_batch_parallelism) { - tf_shape.AddDim(actual_batch_size); - } else if (tflite_tensor->dims->size > 0) { - tf_shape.AddDim(tflite_tensor->dims->data[0]); - } - for (int i = 1; i < tflite_tensor->dims->size; ++i) { - tf_shape.AddDim(tflite_tensor->dims->data[i]); - } - DataType tf_type; - TF_RETURN_IF_ERROR(TfLiteTypeToTfType(tflite_tensor->type, &tf_type)); - output_tensors->emplace_back(tf_type, tf_shape); - tflite_idx_to_output_tensor[tflite_idx] = &output_tensors->back(); +Status FillTfLiteTensorFromInput(const string& name, const Tensor& tensor, + tflite::Interpreter* interpreter, int index) { + auto tflite_tensor = interpreter->tensor(index); + if (tflite_tensor == nullptr) { + return errors::InvalidArgument("Failed to get TFLite tensor: ", name, + " at index: ", index); } - return Status::OK(); -} -Status SetInputAndInvokeMiniBatch( - std::unique_ptr& interpreter_pool, - const std::map& tflite_idx_to_tf_input_tensor, - bool use_batch_parallelism = false, int32_t num_minibatches = 1, - int minibatch = 0) { - const auto& interpreter_wrapper = interpreter_pool->GetInterpreter(minibatch); - auto* interpreter = interpreter_wrapper->Get(); - // Load input data from Tensorflow tensors. - for (const auto entry : tflite_idx_to_tf_input_tensor) { - int tflite_input_idx = entry.first; - auto tflite_input_tensor = interpreter->tensor(tflite_input_idx); - const auto* tf_input_tensor = entry.second; - if (tflite_input_tensor->type != kTfLiteString) { - if (use_batch_parallelism) { - return errors::Internal( - "Batch parallelism should not be enabled for non-string inputs"); - } - auto tensor_bytes = tf_input_tensor->tensor_data(); - if (tensor_bytes.size() != tflite_input_tensor->bytes) { - if (interpreter->ResizeInputTensor( - tflite_input_idx, TensorDims(tf_input_tensor)) != kTfLiteOk) { - return errors::Internal( - "Failed to resize input tensor: ", tflite_input_tensor->name, - " from ", tflite_input_tensor->bytes, " to ", tensor_bytes.size(), - " bytes."); - } - if (interpreter->AllocateTensors() != kTfLiteOk) { - return errors::Internal("Failed to allocate tensors"); - } - } - std::memcpy(tflite_input_tensor->data.raw, tensor_bytes.data(), - tensor_bytes.size()); - } else { - // Copy the string tensor data to the input tflite tensor. - const int fixed_batch_size = interpreter_pool->FixedBatchSize(); - const int actual_batch_size = entry.second->NumElements(); - const int begin = fixed_batch_size * minibatch; - int end = static_cast(actual_batch_size); - if (use_batch_parallelism) { - end = std::min(end, fixed_batch_size * (minibatch + 1)); - } - const auto batch = gtl::ArraySlice(entry.second->flat()) - .subspan(begin, end - begin); - const int minibatch_size = batch.size(); - // Always resize when not using parallelism. - const bool needs_resize = - use_batch_parallelism - ? minibatch_size > interpreter_wrapper->GetMiniBatchSize() - : minibatch_size != interpreter_wrapper->GetMiniBatchSize(); - if (needs_resize) { - interpreter->ResizeInputTensor(entry.first, {minibatch_size}); - interpreter_wrapper->SetMiniBatchSize(minibatch_size); - if (interpreter->AllocateTensors() != kTfLiteOk) { - return errors::Internal("Failed to allocate tensors"); - } - } - TF_RETURN_IF_ERROR(interpreter_wrapper->SetStringData( - batch, tflite_input_tensor, tflite_input_idx)); + // Fast check for resize and reallocate for non-string data. + const auto& tensor_bytes = tensor.tensor_data(); + bool needs_resize_and_realloc = (tflite_tensor->type != kTfLiteString) && + (tensor_bytes.size() != tflite_tensor->bytes); + + TfLiteIntArray* dims_array = nullptr; + if (tflite_tensor->type == kTfLiteString) { + // Slow check for string inputs. + dims_array = TfLiteIntArrayCreate(tensor.dims()); + for (int i = 0; i < tensor.dims(); ++i) { + dims_array->data[i] = static_cast(tensor.dim_size(i)); } + const TfLiteIntArray* previous_dims_array = tflite_tensor->dims; + needs_resize_and_realloc = + !TfLiteIntArrayEqual(dims_array, previous_dims_array); } - if (interpreter_wrapper->Invoke() != kTfLiteOk) { - return errors::Internal("Failed to invoke TfLite interpreter"); - } - return Status::OK(); -} -Status SetMiniBatchOutput( - std::unique_ptr& interpreter_pool, - const std::map& tflite_idx_to_output_tensor, - std::vector* outputs, bool use_batch_parallelism = false, - int actual_batch_size = 0, int num_minibatches = 1, size_t minibatch = 0) { - const int fixed_batch_size = interpreter_pool->FixedBatchSize(); - for (const auto& entry : tflite_idx_to_output_tensor) { - Tensor* tensor = entry.second; - const DataType tf_type = tensor->dtype(); - const int begin = fixed_batch_size * minibatch; - const int end = std::min(fixed_batch_size * static_cast(minibatch + 1), - actual_batch_size); - const int actual_minibatch_size = end - begin; - const auto& interpreter_wrapper = - interpreter_pool->GetInterpreter(minibatch); - const auto* interpreter = interpreter_wrapper->Get(); - auto tflite_tensor = interpreter->tensor(entry.first); - if (DataTypeCanUseMemcpy(tf_type)) { - auto tensor_bytes = tensor->tensor_data(); - int offset = 0; - size_t tflite_tensor_bytes = tflite_tensor->bytes; - if (use_batch_parallelism) { - // Each batch will produce minibatch_size tensors. - // We want to make sure we only copy actual_batch_size. - offset = minibatch * tflite_tensor_bytes; - tflite_tensor_bytes = - tflite_tensor_bytes / fixed_batch_size * actual_minibatch_size; - } - std::memcpy(const_cast(tensor_bytes.data() + offset), - tflite_tensor->data.raw, tflite_tensor_bytes); - } else if (tflite_tensor->type == kTfLiteString) { - const int string_count = tflite::GetStringCount(tflite_tensor); - int num_strings = string_count; - int offset = 0; - if (use_batch_parallelism) { - offset = minibatch * string_count; - num_strings = string_count / fixed_batch_size * actual_minibatch_size; - } - auto str_tensors = tensor->flat(); - for (int i = 0; i < num_strings; i++) { - const auto& ref = tflite::GetString(tflite_tensor, i); - str_tensors(i + offset).assign(ref.str, ref.len); - } + if (needs_resize_and_realloc) { + // Slow path: needs resize+realloc. + // TODO(b/140959776): Reduce the chance of taking this path by either + // having multiple instances of interpreter or sub-graphs for commonly + // used input sizes. + if (interpreter->ResizeInputTensor(index, TensorDims(tensor)) != + kTfLiteOk) { + return errors::Internal("Failed to resize input tensor: ", name, " from ", + tflite_tensor->bytes, " to ", tensor_bytes.size(), + " bytes."); + } + if (interpreter->AllocateTensors() != kTfLiteOk) { + return errors::Internal( + "Failed to AllocateTensors() due to change in input tensor ", name, + " size from ", tflite_tensor->bytes, " to ", tensor_bytes.size(), + " bytes."); } } - return Status::OK(); -} -typedef std::function&, - const std::map&, bool, int32_t, - int)> - BatchFunction; -void ParallelFor( - const BatchFunction& f, - std::unique_ptr& interpreter_pool, - const std::map& tflite_inputs, int n, - bool use_batch_parallelism, bool run_in_caller, - std::vector& status) { - if (n == 0) return; - auto* thread_pool = interpreter_pool->ThreadPool(); - if (thread_pool == nullptr) { - for (int i = 0; i < n; ++i) { - status[i] = - f(interpreter_pool, tflite_inputs, use_batch_parallelism, n, i); + if (tflite_tensor->type != kTfLiteString) { + std::memcpy(tflite_tensor->data.raw, tensor_bytes.data(), + tensor_bytes.size()); + } else { + tflite::DynamicBuffer buf; + auto tensor_vec = tensor.flat(); + for (int i = 0; i < tensor_vec.size(); i++) { + buf.AddString(tensor_vec(i).data(), tensor_vec(i).size()); } - return; - } - int num_jobs = run_in_caller ? n - 1 : n; - int first_job = run_in_caller ? 1 : 0; - tensorflow::BlockingCounter counter(num_jobs); - for (int i = first_job; i < n; ++i) { - thread_pool->Schedule([&f, &interpreter_pool, &tflite_inputs, - use_batch_parallelism, n, i, &counter, &status] { - status[i] = - f(interpreter_pool, tflite_inputs, use_batch_parallelism, n, i); - counter.DecrementCount(); - }); + // WriteToTensor() takes ownership of dims_array. + buf.WriteToTensor(tflite_tensor, dims_array); } - if (run_in_caller) { - status[0] = f(interpreter_pool, tflite_inputs, use_batch_parallelism, n, 0); - } - counter.Wait(); + return Status::OK(); } -Status RunBatchParallel( - std::unique_ptr& interpreter_pool, - const std::vector>& inputs, - const std::map& tflite_idx_to_input_tensor, - bool run_in_caller_thread, const std::vector& output_tensor_names, - const std::map& output_tensor_to_index, - std::vector* outputs) { - const int actual_batch_size = inputs[0].second.NumElements(); - const int32_t num_threads = interpreter_pool->NumInterpreters(); - const int min_batch_size = interpreter_pool->FixedBatchSize(); - int num_minibatches = std::min( - num_threads, (actual_batch_size + min_batch_size - 1) / min_batch_size); - std::vector status_of_minibatches(num_minibatches); - ParallelFor(SetInputAndInvokeMiniBatch, interpreter_pool, - tflite_idx_to_input_tensor, num_minibatches, true, - run_in_caller_thread, status_of_minibatches); - for (Status& status_of_minibatch : status_of_minibatches) { - TF_RETURN_IF_ERROR(status_of_minibatch); +Status AppendTfLiteToTfTensorList(const TfLiteTensor* tflite_tensor, + std::vector* outputs) { + DataType tf_type; + TF_RETURN_IF_ERROR(TfLiteTypeToTfType(tflite_tensor->type, &tf_type)); + + TensorShape shape; + for (int i = 0; i < tflite_tensor->dims->size; ++i) { + shape.AddDim(tflite_tensor->dims->data[i]); } - std::map tflite_idx_to_output_tensor; - TF_RETURN_IF_ERROR(CreateOutputTensors( - interpreter_pool, output_tensor_names, output_tensor_to_index, - tflite_idx_to_output_tensor, outputs, true, actual_batch_size)); - - // Set the contents of the return tensors. - for (size_t i = 0; i < num_minibatches; ++i) { - TF_RETURN_IF_ERROR(SetMiniBatchOutput( - interpreter_pool, tflite_idx_to_output_tensor, outputs, true, - actual_batch_size, num_minibatches, i)); + + outputs->emplace_back(Tensor(tf_type, shape)); + Tensor* tensor = &outputs->back(); + if (DataTypeCanUseMemcpy(tf_type)) { + auto tensor_bytes = tensor->tensor_data(); + if (tflite_tensor->bytes != tensor_bytes.size()) { + return errors::Internal( + "Failed to convert TFLite tensor: ", tflite_tensor->name, + " to TF tensor. Size mismatch: ", tensor_bytes.size(), " vs ", + tflite_tensor->bytes); + } + std::memcpy(const_cast(tensor_bytes.data()), tflite_tensor->data.raw, + tflite_tensor->bytes); + } else if (tflite_tensor->type == kTfLiteString) { + const int num_strings = tflite::GetStringCount(tflite_tensor); + if (num_strings != tensor->NumElements()) { + return errors::Internal( + "Failed to convert TFLite tensor: ", tflite_tensor->name, + " to TF tensor. Num elements mismatch: ", tensor->NumElements(), + " vs ", num_strings); + } + auto str_tensors = outputs->back().flat(); + for (int i = 0; i < num_strings; i++) { + auto ref = tflite::GetString(tflite_tensor, i); + str_tensors(i).assign(ref.str, ref.len); + } + } else { + return errors::Internal("TFLite to TF Tensor copy not supported for type: ", + tflite_tensor->type); } return Status::OK(); } } // namespace -Status TfLiteSession::Create(string&& buffer, const SessionOptions& options, - int num_pools, int num_interpreters_per_pool, +Status TfLiteSession::Create(string&& buffer, std::unique_ptr* tflite_session, ::google::protobuf::Map* signatures, - bool run_in_caller_thread) { + int num_interpreters) { auto model = tflite::FlatBufferModel::BuildFromModel( flatbuffers::GetRoot(buffer.data())); if (model == nullptr) { return errors::InvalidArgument("Cannot build FlatBufferModel from buffer."); } - tflite::ops::builtin::BuiltinOpResolver resolver; - tflite::ops::custom::AddParseExampleOp(&resolver); - tflite::ops::custom::AddHashtableOps(&resolver); - - std::unique_ptr interpreter; - if (tflite::InterpreterBuilder(*model, resolver)(&interpreter) != kTfLiteOk) { - return errors::Internal("Cannot build Interpreter from buffer."); - } + std::unique_ptr interpreter_pool; + TF_RETURN_IF_ERROR( + internal::TfLiteInterpreterPool::CreateTfLiteInterpreterPool( + *model, num_interpreters, interpreter_pool)); + auto interpreter_wrapper = interpreter_pool->GetInterpreter(); + const tflite::Interpreter* interpreter = interpreter_wrapper->Get(); TensorInfoMap inputs; - TF_RETURN_IF_ERROR(GetTensorInfoMap(interpreter.get(), true, &inputs)); + TF_RETURN_IF_ERROR(GetTensorInfoMap(interpreter, true, &inputs)); TensorInfoMap outputs; - TF_RETURN_IF_ERROR(GetTensorInfoMap(interpreter.get(), false, &outputs)); + TF_RETURN_IF_ERROR(GetTensorInfoMap(interpreter, false, &outputs)); // Map of TFLite tensor name -> tensor index std::map input_tensor_to_index; @@ -454,18 +332,9 @@ Status TfLiteSession::Create(string&& buffer, const SessionOptions& options, sigdef->set_method_name(kPredictMethodName); } - num_pools = std::max(1, num_pools); - num_interpreters_per_pool = std::max(1, num_interpreters_per_pool); - - std::unique_ptr session_pool; - TF_RETURN_IF_ERROR(internal::TfLiteSessionPool::CreateTfLiteSessionPool( - model.get(), options, run_in_caller_thread, num_pools, - num_interpreters_per_pool, session_pool)); - tflite_session->reset(new TfLiteSession( std::move(input_tensor_to_index), std::move(output_tensor_to_index), - std::move(buffer), std::move(model), std::move(session_pool), - run_in_caller_thread)); + std::move(buffer), std::move(model), std::move(interpreter_pool))); return Status::OK(); } @@ -473,14 +342,12 @@ TfLiteSession::TfLiteSession( std::map&& input_tensor_to_index, std::map&& output_tensor_to_index, string&& buffer, std::unique_ptr model, - std::unique_ptr session_pool, - bool run_in_caller_thread) + std::unique_ptr interpreter_pool) : input_tensor_to_index_(std::move(input_tensor_to_index)), output_tensor_to_index_(std::move(output_tensor_to_index)), model_serialized_bytes_(std::move(buffer)), model_(std::move(model)), - session_pool_(std::move(session_pool)), - run_in_caller_thread_(run_in_caller_thread) {} + interpreter_pool_(std::move(interpreter_pool)) {} Status TfLiteSession::Run(const std::vector>& inputs, const std::vector& output_tensor_names, @@ -508,50 +375,35 @@ Status TfLiteSession::Run( const std::vector& target_node_names, std::vector* outputs, RunMetadata* run_metadata, const thread::ThreadPoolOptions& thread_pool_options) { - std::map tflite_idx_to_input_tensor; + auto interpreter_wrapper = interpreter_pool_->GetInterpreter(); + tflite::Interpreter* interpreter = interpreter_wrapper->Get(); for (const auto& input : inputs) { string name = input.first; TF_RETURN_WITH_CONTEXT_IF_ERROR( FixTfLiteTensorName(input_tensor_to_index_, name), "Missing input TFLite tensor: ", name); const int index = input_tensor_to_index_.at(name); - tflite_idx_to_input_tensor[index] = &input.second; + TF_RETURN_IF_ERROR( + FillTfLiteTensorFromInput(name, input.second, interpreter, index)); } -#define RETURN_POOL_IF_ERROR(...) \ - do { \ - ::tensorflow::Status _status = (__VA_ARGS__); \ - if (TF_PREDICT_FALSE(!_status.ok())) { \ - session_pool_->ReturnInterpreterPool(std::move(interpreter_pool)); \ - return _status; \ - } \ - } while (0); - auto interpreter_pool = session_pool_->GetInterpreterPool(); - if (interpreter_pool->UseBatchParallelism()) { - RETURN_POOL_IF_ERROR( - RunBatchParallel(interpreter_pool, inputs, tflite_idx_to_input_tensor, - run_in_caller_thread_, output_tensor_names, - output_tensor_to_index_, outputs)); - session_pool_->ReturnInterpreterPool(std::move(interpreter_pool)); - return Status::OK(); + if (interpreter->Invoke() != kTfLiteOk) { + return errors::Internal("Failed to run interpreter."); } - RETURN_POOL_IF_ERROR( - SetInputAndInvokeMiniBatch(interpreter_pool, tflite_idx_to_input_tensor)); - - // Create return tensors and map the tflite tensor index to the - // index of the created tensor. - std::map tflite_idx_to_output_tensor; - RETURN_POOL_IF_ERROR(CreateOutputTensors( - interpreter_pool, output_tensor_names, output_tensor_to_index_, - tflite_idx_to_output_tensor, outputs)); - - // Set the contents of the return tensors. - RETURN_POOL_IF_ERROR(SetMiniBatchOutput( - interpreter_pool, tflite_idx_to_output_tensor, outputs)); - -#undef RETURN_POOL_IF_ERROR - session_pool_->ReturnInterpreterPool(std::move(interpreter_pool)); + outputs->clear(); + for (string name : output_tensor_names) { + TF_RETURN_WITH_CONTEXT_IF_ERROR( + FixTfLiteTensorName(output_tensor_to_index_, name), + "Missing output TFLite tensor: ", name); + const int index = output_tensor_to_index_.at(name); + auto* tflite_tensor = interpreter->tensor(index); + if (tflite_tensor == nullptr) { + return errors::InvalidArgument( + "Failed to get output TFLite tensor: ", name, " at index: ", index); + } + TF_RETURN_IF_ERROR(AppendTfLiteToTfTensorList(tflite_tensor, outputs)); + } return Status::OK(); } diff --git a/tensorflow_serving/servables/tensorflow/tflite_session.h b/tensorflow_serving/servables/tensorflow/tflite_session.h index c8eb460bd92..f95f4c1b0da 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session.h +++ b/tensorflow_serving/servables/tensorflow/tflite_session.h @@ -24,12 +24,9 @@ limitations under the License. #include "absl/synchronization/mutex.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/platform/file_system.h" -#include "tensorflow/core/platform/threadpool.h" #include "tensorflow/core/platform/threadpool_options.h" #include "tensorflow/core/protobuf/meta_graph.pb.h" -#include "tensorflow/lite/external_cpu_backend_context.h" #include "tensorflow/lite/interpreter.h" -#include "tensorflow/lite/kernels/cpu_backend_context.h" #include "tensorflow/lite/model.h" #include "tensorflow_serving/servables/tensorflow/serving_session.h" #include "tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h" @@ -37,8 +34,6 @@ limitations under the License. namespace tensorflow { namespace serving { -using TensorInfoMap = std::map>; - // A session to run inference on a TensorFlow Lite model. // class TfLiteSession : public ServingSession { @@ -46,15 +41,10 @@ class TfLiteSession : public ServingSession { // Creates a TfLiteSession object from `buffer` representing serialized // TFLite flatbuffer model. Also returns the SignatureDef map based on // input/outputs to the model. - // - // run in caller thread allows a worker to run on the parent thread, - // which may be desired to increase concurrency at the cost of additional - // thread context overhead. Defaults to false. - static Status Create(string&& buffer, const SessionOptions& options, - int num_pools, int num_interpreters_per_pool, + static Status Create(string&& buffer, std::unique_ptr* tflite_session, ::google::protobuf::Map* signatures, - bool run_in_caller_thread = false); + int num_interpreters); ~TfLiteSession() override = default; @@ -79,17 +69,18 @@ class TfLiteSession : public ServingSession { Status ListDevices(std::vector* response) override; private: - TfLiteSession(std::map&& input_tensor_to_index, - std::map&& output_tensor_to_index, string&& buffer, - std::unique_ptr model, - std::unique_ptr session_pool, - bool run_in_caller_thread); + TfLiteSession( + std::map&& input_tensor_to_index, + std::map&& output_tensor_to_index, string&& buffer, + std::unique_ptr model, + std::unique_ptr interpreter_pool); + const std::map input_tensor_to_index_; const std::map output_tensor_to_index_; const string model_serialized_bytes_; const std::unique_ptr model_; - const std::unique_ptr session_pool_; - const bool run_in_caller_thread_; + std::unique_ptr interpreter_pool_; + TF_DISALLOW_COPY_AND_ASSIGN(TfLiteSession); }; diff --git a/tensorflow_serving/servables/tensorflow/tflite_session_main.cc b/tensorflow_serving/servables/tensorflow/tflite_session_main.cc index 5219db7b0df..09dcb943529 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session_main.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session_main.cc @@ -44,10 +44,8 @@ int main(int argc, char** argv) { ::google::protobuf::Map signatures; std::unique_ptr session; - tensorflow::SessionOptions options; - status = tensorflow::serving::TfLiteSession::Create( - std::move(model_bytes), options, /*num_pools=*/1, - /*num_interpreters_per_pool=*/1, &session, &signatures); + status = tensorflow::serving::TfLiteSession::Create(std::move(model_bytes), + &session, &signatures, 1); if (!status.ok()) { std::cerr << "ERROR: Failed to create TF Lite session with error: " << status << std::endl; diff --git a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc index a31bd33d90c..abc1a65d122 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc @@ -37,14 +37,11 @@ limitations under the License. #include "tensorflow/core/platform/test_benchmark.h" #include "tensorflow/core/platform/threadpool_options.h" #include "tensorflow/core/protobuf/config.pb.h" -#include "tensorflow/lite/string_util.h" #include "tensorflow/lite/tools/signature/signature_def_util.h" #include "tensorflow/lite/util.h" #include "tensorflow/lite/version.h" #include "tensorflow_serving/test_util/test_util.h" -ABSL_FLAG(int, num_pools, 1, "Number of interpreter pools of a TfLiteSession."); - ABSL_FLAG(int, num_tflite_interpreters, 1, "Number of TFLite interpreters " "in an interpreter pool of a TfLiteSession."); @@ -82,10 +79,9 @@ TEST(TfLiteSession, BasicTest) { ::google::protobuf::Map signatures; std::unique_ptr session; - tensorflow::SessionOptions options; - TF_ASSERT_OK(TfLiteSession::Create( - std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), - absl::GetFlag(FLAGS_num_tflite_interpreters), &session, &signatures)); + TF_ASSERT_OK( + TfLiteSession::Create(std::move(model_bytes), &session, &signatures, + absl::GetFlag(FLAGS_num_tflite_interpreters))); EXPECT_EQ(signatures.size(), 1); EXPECT_EQ(signatures.begin()->first, "serving_default"); EXPECT_THAT(signatures.begin()->second, test_util::EqualsProto(R"( @@ -143,10 +139,9 @@ TEST(TfLiteSession, ModelFromLegacyConverterWithSigdef) { ::google::protobuf::Map signatures; std::unique_ptr session; - tensorflow::SessionOptions options; - TF_ASSERT_OK(TfLiteSession::Create( - std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), - absl::GetFlag(FLAGS_num_tflite_interpreters), &session, &signatures)); + TF_ASSERT_OK( + TfLiteSession::Create(std::move(model_bytes), &session, &signatures, + absl::GetFlag(FLAGS_num_tflite_interpreters))); EXPECT_EQ(signatures.size(), 1); EXPECT_EQ(signatures.begin()->first, "serving_default"); // While, in the model, the tensor name of input "x" is "tflite_input:0". in @@ -349,10 +344,9 @@ TEST(TfLiteSession, ProcessStrings) { &model_signature_def_map); ::google::protobuf::Map signatures; std::unique_ptr session; - tensorflow::SessionOptions options; - TF_ASSERT_OK(TfLiteSession::Create( - std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), - absl::GetFlag(FLAGS_num_tflite_interpreters), &session, &signatures)); + TF_ASSERT_OK( + TfLiteSession::Create(std::move(model_bytes), &session, &signatures, + absl::GetFlag(FLAGS_num_tflite_interpreters))); Tensor input_list = test::AsTensor({"a", "b", "c", "d"}, TensorShape({4})); Tensor input_shape = test::AsTensor({2, 2}, TensorShape({2})); @@ -373,10 +367,9 @@ TEST(TfLiteSession, ProcessStringsFlex) { &model_signature_def_map); ::google::protobuf::Map signatures; std::unique_ptr session; - tensorflow::SessionOptions options; - TF_ASSERT_OK(TfLiteSession::Create( - std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), - absl::GetFlag(FLAGS_num_tflite_interpreters), &session, &signatures)); + TF_ASSERT_OK( + TfLiteSession::Create(std::move(model_bytes), &session, &signatures, + absl::GetFlag(FLAGS_num_tflite_interpreters))); Tensor input_list = test::AsTensor({"a", "b", "c", "d"}, TensorShape({4})); Tensor input_shape = test::AsTensor({2, 2}, TensorShape({2})); @@ -397,10 +390,9 @@ TEST(TfLiteSession, ThreadPoolOptions) { &model_signature_def_map); ::google::protobuf::Map signatures; std::unique_ptr session; - tensorflow::SessionOptions options; - TF_ASSERT_OK(TfLiteSession::Create( - std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), - absl::GetFlag(FLAGS_num_tflite_interpreters), &session, &signatures)); + TF_ASSERT_OK( + TfLiteSession::Create(std::move(model_bytes), &session, &signatures, + absl::GetFlag(FLAGS_num_tflite_interpreters))); Tensor input_list = test::AsTensor({"a", "b", "c", "d"}, TensorShape({4})); Tensor input_shape = test::AsTensor({2, 2}, TensorShape({2})); @@ -438,10 +430,9 @@ TEST(TfLiteSession, SimpleSignatureDef) { signatures[kResidualSignatureKey] = SignatureDef(); std::unique_ptr session; - tensorflow::SessionOptions options; - TF_ASSERT_OK(TfLiteSession::Create( - std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), - absl::GetFlag(FLAGS_num_tflite_interpreters), &session, &signatures)); + TF_ASSERT_OK( + TfLiteSession::Create(std::move(model_bytes), &session, &signatures, + absl::GetFlag(FLAGS_num_tflite_interpreters))); ASSERT_THAT(signatures, UnorderedElementsAre(Pair(kDefaultServingSignatureDefKey, _))); @@ -479,10 +470,9 @@ TEST(TfLiteSession, MultipleSignatureDef) { tflite::TensorType_STRING, /*use_flex_op=*/false, &signature_def_map); ::google::protobuf::Map signatures; std::unique_ptr session; - tensorflow::SessionOptions options; - TF_EXPECT_OK(TfLiteSession::Create( - std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), - absl::GetFlag(FLAGS_num_tflite_interpreters), &session, &signatures)); + TF_EXPECT_OK( + TfLiteSession::Create(std::move(model_bytes), &session, &signatures, + absl::GetFlag(FLAGS_num_tflite_interpreters))); ASSERT_THAT(signatures, UnorderedElementsAre(Pair(kSignatureKey1, _), Pair(kSignatureKey2, _))); @@ -533,10 +523,9 @@ TEST(TfLiteSession, SignatureDefWithCommonTensorPrefix) { /*use_flex_op=*/false, &signature_def_map); ::google::protobuf::Map signatures; std::unique_ptr session; - tensorflow::SessionOptions options; - TF_ASSERT_OK(TfLiteSession::Create( - std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), - absl::GetFlag(FLAGS_num_tflite_interpreters), &session, &signatures)); + TF_ASSERT_OK( + TfLiteSession::Create(std::move(model_bytes), &session, &signatures, + absl::GetFlag(FLAGS_num_tflite_interpreters))); // Inputs must still be processed as two different tensors. auto outputSigdef = signatures[kDefaultServingSignatureDefKey]; @@ -554,10 +543,9 @@ TEST(TfLiteSession, SimpleSignatureDefAndRun) { &model_signature_def_map); ::google::protobuf::Map signatures; std::unique_ptr session; - tensorflow::SessionOptions options; - TF_EXPECT_OK(TfLiteSession::Create( - std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), - absl::GetFlag(FLAGS_num_tflite_interpreters), &session, &signatures)); + TF_EXPECT_OK( + TfLiteSession::Create(std::move(model_bytes), &session, &signatures, + absl::GetFlag(FLAGS_num_tflite_interpreters))); auto sigdef = signatures[kDefaultServingSignatureDefKey]; ASSERT_EQ(sigdef.inputs().at(kSignatureInputList).name(), @@ -580,65 +568,6 @@ TEST(TfLiteSession, SimpleSignatureDefAndRun) { test::AsTensor({"a", "b", "c", "d"}, TensorShape({2, 2}))); } -TEST(TfLiteSession, TestBatchParallelism) { - std::string model_bytes; - TF_ASSERT_OK(ReadFileToString(Env::Default(), - test_util::TestSrcDirPath(kParseExampleModel), - &model_bytes)); - auto model = tflite::FlatBufferModel::BuildFromModel( - flatbuffers::GetRoot(model_bytes.data())); - auto model_signature_def_map = GetTestSignatureDefMap(); - ::google::protobuf::Map signatures; - std::unique_ptr sess; - tensorflow::SessionOptions options; - TF_ASSERT_OK(TfLiteSession::Create(std::move(model_bytes), options, 1, 4, - &sess, &signatures)); - const int batch_size = 500; - const float default_value = 0; - std::vector example_list; - std::vector expected; - std::vector expected_bytes; - std::vector outputs; - - std::mt19937 random_engine; - auto random_func = [&]() { - return std::uniform_real_distribution(-0.5, 0.5)(random_engine); - }; - const std::string kTestString = "test string"; - const std::string kDefaultString = "missing"; - for (int i = 0; i < batch_size; i++) { - float val = random_func(); - tensorflow::Example example; - std::string str; - if (val < -1) { - expected.push_back(default_value); - expected_bytes.push_back(kDefaultString); - } else { - expected.push_back(val); - expected_bytes.push_back(kTestString); - auto* features = example.mutable_features(); - (*features->mutable_feature())["x"].mutable_float_list()->add_value(val); - (*features->mutable_feature())["y"].mutable_bytes_list()->add_value( - kTestString); - } - example.SerializeToString(&str); - example_list.push_back(str); - } - Tensor example_list_tensor = - test::AsTensor(example_list, TensorShape({batch_size})); - TF_EXPECT_OK(sess->Run( - {{"input", example_list_tensor}}, - {"ParseExample/ParseExampleV2", "ParseExample/ParseExampleV2:1"}, {}, - &outputs)); - test::ExpectTensorEqual( - outputs[0], - test::AsTensor(expected, TensorShape({batch_size, 1}))); - EXPECT_EQ(outputs.size(), 2); - test::ExpectTensorEqual( - outputs[1], - test::AsTensor(expected_bytes, TensorShape({batch_size, 1}))); -} - #ifdef PLATFORM_GOOGLE // These benchmarks rely on https://github.com/google/benchmark features, // not available in open-sourced TF codebase. @@ -651,10 +580,9 @@ static void BM_Reshape(benchmark::State& state, bool use_flex_op) { &model_signature_def_map); ::google::protobuf::Map signatures; std::unique_ptr sess; - tensorflow::SessionOptions options; - TF_ASSERT_OK(TfLiteSession::Create( - std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), - absl::GetFlag(FLAGS_num_tflite_interpreters), &sess, &signatures)); + TF_ASSERT_OK( + TfLiteSession::Create(std::move(model_bytes), &sess, &signatures, + absl::GetFlag(FLAGS_num_tflite_interpreters))); session = sess.release(); } Tensor input = test::AsTensor({1, 2, 3, 4, 5, 6}, TensorShape({6})); @@ -687,10 +615,9 @@ void BM_HalfPlusTwo(benchmark::State& state) { Env::Default(), test_util::TestSrcDirPath(kTestModel), &model_bytes)); ::google::protobuf::Map signatures; std::unique_ptr sess; - tensorflow::SessionOptions options; - TF_ASSERT_OK(TfLiteSession::Create( - std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), - absl::GetFlag(FLAGS_num_tflite_interpreters), &sess, &signatures)); + TF_ASSERT_OK( + TfLiteSession::Create(std::move(model_bytes), &sess, &signatures, + absl::GetFlag(FLAGS_num_tflite_interpreters))); session = sess.release(); } Tensor input = test::AsTensor({1.0, 2.0, 3.0}, TensorShape({3})); @@ -712,10 +639,9 @@ void BM_MobileNet(benchmark::State& state) { &model_bytes)); ::google::protobuf::Map signatures; std::unique_ptr sess; - tensorflow::SessionOptions options; - TF_ASSERT_OK(TfLiteSession::Create( - std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), - absl::GetFlag(FLAGS_num_tflite_interpreters), &sess, &signatures)); + TF_ASSERT_OK( + TfLiteSession::Create(std::move(model_bytes), &sess, &signatures, + absl::GetFlag(FLAGS_num_tflite_interpreters))); session = sess.release(); } std::vector x_data(1 * 224 * 224 * 3, 1); @@ -740,9 +666,9 @@ void BM_ParseExample(benchmark::State& state) { ::google::protobuf::Map signatures; std::unique_ptr sess; tensorflow::SessionOptions options; - TF_ASSERT_OK(TfLiteSession::Create( - std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), - absl::GetFlag(FLAGS_num_tflite_interpreters), &sess, &signatures)); + TF_ASSERT_OK( + TfLiteSession::Create(std::move(model_bytes), &sess, &signatures, + absl::GetFlag(FLAGS_num_tflite_interpreters))); session = sess.release(); } const int kBatchSize = 500; From fd1131c0352f2f539ab781ea1d11472ee5c17e45 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 7 Feb 2021 18:01:29 -0800 Subject: [PATCH 4705/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b0e2b2af-9bd3-4ef1-83ef-193d78d14840 PiperOrigin-RevId: 356170948 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c1ea7d6709e..6f4fc3fbe4c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c8ac52b2558d5c87a20e16eb2041e1bb7a6b6f8d3b89ec2d3e2acfc88d831bce", - git_commit = "b8d2a994e4fda783f27894689b85c73581998407", + sha256 = "d135119b4e1fbbd839053f602395c49d844d2be78603bbe1cff424a70eee5e9b", + git_commit = "b646e8951c15b460a8d8a77796dc16c6ebd8c5f0", ) # Import all of TensorFlow Serving's external dependencies. From 3fcaa5411baecc1115c92116a5314094b3707393 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 8 Feb 2021 00:01:33 -0800 Subject: [PATCH 4706/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/114734df-ef02-4c1d-813c-edb82705df5c PiperOrigin-RevId: 356203207 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6f4fc3fbe4c..36f7db36fdc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d135119b4e1fbbd839053f602395c49d844d2be78603bbe1cff424a70eee5e9b", - git_commit = "b646e8951c15b460a8d8a77796dc16c6ebd8c5f0", + sha256 = "dcc98c8ebc8d24b3355068a7a206b079fa1eaa80123f064045fb8c85fa2cd530", + git_commit = "15f82f5b792650e94dc9bf9184e2e188ea2f614c", ) # Import all of TensorFlow Serving's external dependencies. From 965100c12d66ae34643847088924fed35d42570b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 8 Feb 2021 06:01:32 -0800 Subject: [PATCH 4707/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e24f5711-3ffd-4a2e-a2d4-250668275e98 PiperOrigin-RevId: 356246353 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 36f7db36fdc..cd41283df86 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dcc98c8ebc8d24b3355068a7a206b079fa1eaa80123f064045fb8c85fa2cd530", - git_commit = "15f82f5b792650e94dc9bf9184e2e188ea2f614c", + sha256 = "37d73dd72f41d7f76420786b8eff2c191989e71b9cb7f985dd2b67823f6817d6", + git_commit = "e50edb9701a8c97f07ac56ea078b642d968d8ccd", ) # Import all of TensorFlow Serving's external dependencies. From 3bf1ac3d191eefba0e90cd5f6f277b1e7ef728f0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 8 Feb 2021 12:01:23 -0800 Subject: [PATCH 4708/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/31c58fe1-abf0-4485-9066-1f4cd1acc1c9 PiperOrigin-RevId: 356319989 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cd41283df86..bcc6c688c99 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "37d73dd72f41d7f76420786b8eff2c191989e71b9cb7f985dd2b67823f6817d6", - git_commit = "e50edb9701a8c97f07ac56ea078b642d968d8ccd", + sha256 = "6ebaf49d3ceb6de42c0f4faccc85eb93363ae3e76d15cee9c34aa1bff19224ce", + git_commit = "750119433df6b4a226b4a1cfc7230b6e39af39a0", ) # Import all of TensorFlow Serving's external dependencies. From 18370a56ac05c59aa08349e2565c325e756551f1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 8 Feb 2021 18:01:39 -0800 Subject: [PATCH 4709/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/50ef825a-cc94-4220-a835-53f02aa5d00a PiperOrigin-RevId: 356396722 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bcc6c688c99..b3f8683ab86 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6ebaf49d3ceb6de42c0f4faccc85eb93363ae3e76d15cee9c34aa1bff19224ce", - git_commit = "750119433df6b4a226b4a1cfc7230b6e39af39a0", + sha256 = "6fe309576bc96ba2e04f66c90d80303d6bad6665171f8a66157954b95b630b82", + git_commit = "324ab95fb097dd6044fa5346ee24fc610017ae85", ) # Import all of TensorFlow Serving's external dependencies. From d42b7440bb3d2be551a43f197d76b6f26cbda812 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 9 Feb 2021 00:01:36 -0800 Subject: [PATCH 4710/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f90a3af5-3587-46b5-a867-6d5964049c02 PiperOrigin-RevId: 356439681 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b3f8683ab86..ad35c3bce5e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6fe309576bc96ba2e04f66c90d80303d6bad6665171f8a66157954b95b630b82", - git_commit = "324ab95fb097dd6044fa5346ee24fc610017ae85", + sha256 = "38ef4482d2dfbc7664b590714b585cc13c19f1faa0154fcbf2c2bc0df3a57afc", + git_commit = "a0b5d0bacb979d0339a37dcac866a9e7a5cfd6c0", ) # Import all of TensorFlow Serving's external dependencies. From 185ce12c1da57a56d5a2bfa8396b70b3a8106c7d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 9 Feb 2021 06:01:37 -0800 Subject: [PATCH 4711/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b7a8ad93-3d06-4f8e-99f5-7855595ebf6d PiperOrigin-RevId: 356484088 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ad35c3bce5e..d49644ee2f3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "38ef4482d2dfbc7664b590714b585cc13c19f1faa0154fcbf2c2bc0df3a57afc", - git_commit = "a0b5d0bacb979d0339a37dcac866a9e7a5cfd6c0", + sha256 = "3dcff872aa8564b0537d5cb951f1bf27557a9d65e9b4ff4de2afeae1f16955d9", + git_commit = "5eac5b75b48232e93f2a96ed856131201cd2ae3c", ) # Import all of TensorFlow Serving's external dependencies. From 9e922320d64f27f7eee8856fc929eb9e34a03706 Mon Sep 17 00:00:00 2001 From: David Rim Date: Wed, 10 Feb 2021 00:33:36 -0800 Subject: [PATCH 4712/8103] Implement batch parallelism for tflite sessions PiperOrigin-RevId: 356683283 --- tensorflow_serving/model_servers/main.cc | 9 +- tensorflow_serving/model_servers/server.cc | 5 +- tensorflow_serving/model_servers/server.h | 3 +- tensorflow_serving/servables/tensorflow/BUILD | 38 ++ .../tensorflow/saved_model_bundle_factory.cc | 17 +- .../tensorflow/session_bundle_config.proto | 8 +- .../testdata/parse_example_tflite.py | 5 +- .../00000123/model.tflite | Bin 1792 -> 1584 bytes .../tensorflow/tflite_interpreter_pool.cc | 246 +++++++++-- .../tensorflow/tflite_interpreter_pool.h | 177 +++++++- .../tflite_interpreter_pool_test.cc | 269 ++++++++++++ .../servables/tensorflow/tflite_session.cc | 394 ++++++++++++------ .../servables/tensorflow/tflite_session.h | 29 +- .../tensorflow/tflite_session_main.cc | 6 +- .../tensorflow/tflite_session_test.cc | 152 +++++-- 15 files changed, 1112 insertions(+), 246 deletions(-) create mode 100644 tensorflow_serving/servables/tensorflow/tflite_interpreter_pool_test.cc diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index 2d4f257d951..a83f95cce66 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -213,11 +213,18 @@ int main(int argc, char** argv) { "If no TensorFlow Lite model found, fallback to " "TensorFlow model."), tensorflow::Flag( - "num_tflite_interpreters", &options.num_tflite_interpreters, + "num_tflite_pools", &options.num_tflite_pools, "EXPERIMENTAL; CAN BE REMOVED ANYTIME! Number of TFLite interpreters " "in an interpreter pool of TfLiteSession. Typically there is one " "TfLiteSession for each TF Lite model that is loaded. If not " "set, will be auto set based on number of CPUs."), + tensorflow::Flag( + "num_tflite_interpreters_per_pool", + &options.num_tflite_interpreters_per_pool, + "EXPERIMENTAL; CAN BE REMOVED ANYTIME! Number of TFLite interpreters " + "in an interpreter pool of TfLiteSession. Typically there is one " + "TfLiteSession for each TF Lite model that is loaded. If not " + "set, will be 1."), tensorflow::Flag( "enable_signature_method_name_check", &options.enable_signature_method_name_check, diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index 6dfabae994e..0e4ca2343c6 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -277,8 +277,9 @@ Status Server::BuildAndStart(const Options& server_options) { server_options.remove_unused_fields_from_bundle_metagraph); session_bundle_config.set_prefer_tflite_model( server_options.prefer_tflite_model); - session_bundle_config.set_num_tflite_interpreters( - server_options.num_tflite_interpreters); + session_bundle_config.set_num_tflite_interpreters_per_pool( + server_options.num_tflite_interpreters_per_pool); + session_bundle_config.set_num_tflite_pools(server_options.num_tflite_pools); options.platform_config_map = CreateTensorFlowPlatformConfigMap(session_bundle_config); } else { diff --git a/tensorflow_serving/model_servers/server.h b/tensorflow_serving/model_servers/server.h index d06d2499867..bcb55db1592 100644 --- a/tensorflow_serving/model_servers/server.h +++ b/tensorflow_serving/model_servers/server.h @@ -88,7 +88,8 @@ class Server { bool enforce_session_run_timeout = true; bool remove_unused_fields_from_bundle_metagraph = true; bool prefer_tflite_model = false; - tensorflow::int32 num_tflite_interpreters = port::NumSchedulableCPUs(); + tensorflow::int32 num_tflite_pools = port::NumSchedulableCPUs(); + tensorflow::int32 num_tflite_interpreters_per_pool = 1; tensorflow::string thread_pool_factory_config_file; bool enable_signature_method_name_check = false; diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index 8350bfdf6db..04ddf572452 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -325,17 +325,25 @@ cc_library( ":serving_session", "@com_google_absl//absl/base:core_headers", "@com_google_absl//absl/synchronization", + "@com_google_absl//absl/types:span", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", + "@org_tensorflow//tensorflow/core:session_options", + "@org_tensorflow//tensorflow/lite:external_cpu_backend_context", "@org_tensorflow//tensorflow/lite:framework", "@org_tensorflow//tensorflow/lite:string_util", "@org_tensorflow//tensorflow/lite:util", "@org_tensorflow//tensorflow/lite/c:common", "@org_tensorflow//tensorflow/lite/delegates/flex:delegate", "@org_tensorflow//tensorflow/lite/kernels:builtin_ops", + "@org_tensorflow//tensorflow/lite/kernels:cpu_backend_context", "@org_tensorflow//tensorflow/lite/kernels/hashtable:hashtable_op_kernels", + "@org_tensorflow//tensorflow/lite/kernels/internal:tensor_utils", "@org_tensorflow//tensorflow/lite/kernels/parse_example", + "@org_tensorflow//tensorflow/lite/profiling:profile_summarizer", + "@org_tensorflow//tensorflow/lite/profiling:profile_summary_formatter", + "@org_tensorflow//tensorflow/lite/profiling:profiler", "@org_tensorflow//tensorflow/lite/tools/signature:signature_def_util", ], ) @@ -362,6 +370,36 @@ cc_test( "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", "@org_tensorflow//tensorflow/core:testlib", + "@org_tensorflow//tensorflow/lite:string_util", + "@org_tensorflow//tensorflow/lite:util", + "@org_tensorflow//tensorflow/lite:version", + "@org_tensorflow//tensorflow/lite/tools/signature:signature_def_util", + ], +) + +cc_test( + name = "tflite_interpreter_pool_test", + size = "small", + srcs = ["tflite_interpreter_pool_test.cc"], + data = [ + "//tensorflow_serving/servables/tensorflow/testdata:mobilenet_v1_quant_tflite", + "//tensorflow_serving/servables/tensorflow/testdata:parse_example_tflite", + "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_tflite", + "//tensorflow_serving/servables/tensorflow/testdata:saved_model_half_plus_two_tflite_with_sigdef", + ], + deps = [ + ":tflite_session_lib", + "//tensorflow_serving/core/test_util:test_main", + "//tensorflow_serving/test_util", + "@com_google_absl//absl/flags:flag", + "@com_google_protobuf//:protobuf", + "@flatbuffers", + "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", + "@org_tensorflow//tensorflow/core:lib", + "@org_tensorflow//tensorflow/core:protos_all_cc", + "@org_tensorflow//tensorflow/core:test", + "@org_tensorflow//tensorflow/core:testlib", + "@org_tensorflow//tensorflow/lite:string_util", "@org_tensorflow//tensorflow/lite:util", "@org_tensorflow//tensorflow/lite:version", "@org_tensorflow//tensorflow/lite/tools/signature:signature_def_util", diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc index d4818543943..e13ebfb8553 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc @@ -63,7 +63,8 @@ Status ParseFixedInputTensors( const char kTfLiteModelFilename[] = "model.tflite"; Status LoadTfLiteModel(const string& model_dir, SavedModelBundle* bundle, - int num_interpreters) { + const SessionOptions& options, int num_interpreter_pools, + int num_interpreters_per_pool) { std::unique_ptr session; const string& fname = io::JoinPath(model_dir, kTfLiteModelFilename); @@ -80,8 +81,9 @@ Status LoadTfLiteModel(const string& model_dir, SavedModelBundle* bundle, std::unique_ptr tflite_session; TF_RETURN_IF_ERROR(TfLiteSession::Create( - std::move(model_bytes), &tflite_session, - bundle->meta_graph_def.mutable_signature_def(), num_interpreters)); + std::move(model_bytes), options, num_interpreter_pools, + num_interpreters_per_pool, &tflite_session, + bundle->meta_graph_def.mutable_signature_def())); bundle->session = std::move(tflite_session); return Status::OK(); } @@ -145,8 +147,13 @@ Status SavedModelBundleFactory::InternalCreateSavedModelBundle( }(); if (config_.prefer_tflite_model() && TfLiteModelFound(path)) { - TF_RETURN_IF_ERROR(LoadTfLiteModel(path, bundle->get(), - config_.num_tflite_interpreters())); + int num_tflite_pools = config_.num_tflite_pools(); + if (num_tflite_pools == 0 && config_.num_tflite_interpreters() > 0) { + num_tflite_pools = config_.num_tflite_interpreters(); + } + TF_RETURN_IF_ERROR(LoadTfLiteModel( + path, bundle->get(), session_options, num_tflite_pools, + config_.num_tflite_interpreters_per_pool())); } else { TF_RETURN_IF_ERROR(session_bundle::LoadSessionBundleOrSavedModelBundle( session_options, GetRunOptions(config_), path, saved_model_tags, diff --git a/tensorflow_serving/servables/tensorflow/session_bundle_config.proto b/tensorflow_serving/servables/tensorflow/session_bundle_config.proto index e6fdae3df10..74741fa0346 100644 --- a/tensorflow_serving/servables/tensorflow/session_bundle_config.proto +++ b/tensorflow_serving/servables/tensorflow/session_bundle_config.proto @@ -94,10 +94,16 @@ message SessionBundleConfig { // Tries to use infra validation result to estimate resource usage. bool resource_estimation_uses_validation_result = 784; + int32 num_tflite_interpreters = 785 [deprecated=true]; // EXPERIMENTAL. THIS FIELD MAY CHANGE OR GO AWAY. USE WITH CAUTION. // // Number of TFLite interpreters in an interpreter pool of TfLiteSession. - int32 num_tflite_interpreters = 785; + int32 num_tflite_interpreters_per_pool = 786; + + // EXPERIMENTAL. THIS FIELD MAY CHANGE OR GO AWAY. USE WITH CAUTION. + // + // Number of TFLite interpreter pools in a TfLiteSession. + int32 num_tflite_pools = 787; } // Batching parameters. Each individual parameter is optional. If omitted, the diff --git a/tensorflow_serving/servables/tensorflow/testdata/parse_example_tflite.py b/tensorflow_serving/servables/tensorflow/testdata/parse_example_tflite.py index dd389f74b67..854322a9f08 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/parse_example_tflite.py +++ b/tensorflow_serving/servables/tensorflow/testdata/parse_example_tflite.py @@ -79,9 +79,8 @@ def _generate_tflite_for_parse_example_with_string(export_dir): _get_feature_spec()) converter = tf.lite.TFLiteConverter.from_session( sess, [serialized_tf_example], [tf_example["x"], tf_example["y"]]) - converter.target_spec.supported_ops = [ - tf.lite.OpsSet.TFLITE_BUILTINS, tf.lite.OpsSet.SELECT_TF_OPS - ] + converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS] + converter.allow_custom_ops = True tflite_model = converter.convert() predict_signature_def = _build_predict_signature(serialized_tf_example, tf_example["x"], diff --git a/tensorflow_serving/servables/tensorflow/testdata/parse_example_tflite/00000123/model.tflite b/tensorflow_serving/servables/tensorflow/testdata/parse_example_tflite/00000123/model.tflite index 831eb985bcd45f378acc4a2df8e2c98fb108faf3..4fa12ea0237d6e16f13896469622903fe319f16d 100644 GIT binary patch delta 139 zcmZqR+rTqHh3N|GMzv>*LI!{S|7Sn~4u2-gG1UnkKoh<&c`cJQ*Ak$@89>~@F!>Xc zk-7*LMgxh|7Sn~CBG-jG1UovK@(<~yq3wDtALS#Aq9v-7$<*X zGOA|)GCu(IvHAi$gt&N$3qXd%msA#{77HCaG7Z>DYmLO#Okfh2Ib4rml32<@c zmF5Cu13#{LK?|Vj%SqRWMH~|Mnr@~gK@Jr T^F<~JA)v3^a#AbMJjMV3`NC16 diff --git a/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.cc b/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.cc index 4b2e846d917..b459b0f8b8e 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.cc @@ -15,9 +15,11 @@ limitations under the License. #include "tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h" +#include #include #include +#include "tensorflow/core/platform/errors.h" #include "tensorflow/lite/kernels/hashtable/hashtable_ops.h" #include "tensorflow/lite/kernels/parse_example/parse_example.h" #include "tensorflow/lite/kernels/register.h" @@ -26,64 +28,236 @@ namespace tensorflow { namespace serving { namespace internal { -Status TfLiteInterpreterPool::CreateTfLiteInterpreterPool( - const tflite::FlatBufferModel& model, int num_interpreters, +TfLiteInterpreterWrapper::TfLiteInterpreterWrapper( + std::unique_ptr interpreter) + : +#ifdef TFLITE_PROFILE + interpreter_(std::move(interpreter)), + fixed_batch_size_(fixed_batch_size), + max_num_entries_(TFLITE_PROFILE_EVENTS), + profiler_(max_num_entries_) +#else + interpreter_(std::move(interpreter)) +#endif +{ +#ifdef TFLITE_PROFILE + interpreter_->SetProfiler(&profiler_); +#endif + for (const int& idx : interpreter_->inputs()) { + const auto* tflite_tensor = interpreter_->tensor(idx); + if (tflite_tensor->type == kTfLiteString) { + tensor_buffer_.emplace(idx, + std::unique_ptr(tflite_tensor->data.raw)); + tensor_buffer_max_bytes_[idx] = 0; + } + } +} + +tensorflow::Status TfLiteInterpreterWrapper::SetStringData( + const gtl::ArraySlice& batch, + TfLiteTensor* tflite_tensor, int tensor_index) { + // Format of the buffer for tflite: + // [0] number of strings (int32_t) + // [4] offset of each string (int32_t) + // [sizeof(int32_t) * (num_strings + 1)]] total size of strings + // [sizeof(int32_t) * (num_strings + 2)] batch.data() + int32_t num_strings = batch.size(); + offset_.clear(); + size_t total_size = 0; + offset_.push_back(static_cast(total_size)); + for (int i = 0; i < num_strings; i++) { + total_size += batch[i].size(); + offset_.push_back(static_cast(total_size)); + } + size_t required_bytes = total_size + sizeof(int32_t) * (num_strings + 2); + if (tensor_buffer_.find(tensor_index) == tensor_buffer_.end()) { + return errors::Internal("Tensor input for index not found: ", tensor_index); + } + if (tensor_buffer_max_bytes_[tensor_index] > 0 && + required_bytes > tensor_buffer_max_bytes_[tensor_index]) { + tensor_buffer_max_bytes_[tensor_index] = 0; + } + + if (tensor_buffer_max_bytes_[tensor_index] == 0) { + tensor_buffer_[tensor_index].reset( + reinterpret_cast(malloc(required_bytes))); + tensor_buffer_max_bytes_[tensor_index] = required_bytes; + } else { + tensor_buffer_[tensor_index].reset(tflite_tensor->data.raw); + } + memcpy(tensor_buffer_[tensor_index].get(), &num_strings, sizeof(int32_t)); + int32_t start = sizeof(int32_t) * (num_strings + 2); + for (size_t i = 0; i < offset_.size(); i++) { + size_t size_offset_i = start + offset_[i]; + if (size_offset_i > std::numeric_limits::max()) { + return errors::Internal("Invalid size, string input too large:", + size_offset_i); + } + int32_t offset_i = static_cast(size_offset_i); + memcpy(tensor_buffer_[tensor_index].get() + sizeof(int32_t) * (i + 1), + &offset_i, sizeof(int32_t)); + } + for (int i = 0; i < num_strings; i++) { + memcpy(tensor_buffer_[tensor_index].get() + start, batch[i].data(), + batch[i].size()); + start += batch[i].size(); + } + + // tflite_tensor will take ownership of the pointer. + tflite_tensor->data.raw = tensor_buffer_[tensor_index].release(); + tflite_tensor->bytes = required_bytes; + tflite_tensor->allocation_type = kTfLiteDynamic; + return Status::OK(); +} + +TfLiteStatus TfLiteInterpreterWrapper::Invoke() { +#ifdef TFLITE_PROFILE + if (invocation_count_ > 0) { + profiler_.Reset(); + profiler_.StartProfiling(); + } +#endif + auto status = interpreter_->Invoke(); +#ifdef TFLITE_PROFILE + if (invocation_count_ > 0) { + profiler_.StopProfiling(); + auto profile_events = profiler_.GetProfileEvents(); + run_summarizer_.ProcessProfiles(profile_events, *interpreter_); + } + if (invocation_count_++ >= MAX_PROFILE_EVENTS) { + WriteProfileData(); + run_summarizer_.Clear(); + invocation_count_ = 0; + } +#endif + return status; +} + +tensorflow::Status TfLiteInterpreterPool::CreateTfLiteInterpreterPool( + const tflite::FlatBufferModel& model, bool run_in_caller, + bool use_batch_parallelism, int batch_pool_size, int id, + const tensorflow::SessionOptions& options, std::unique_ptr& pool) { + // If can't use_batch_parallelism or pool size is 1, + // just use 1 interpreter and run in caller. + if (!use_batch_parallelism || batch_pool_size == 1) { + run_in_caller = true; + batch_pool_size = 1; + use_batch_parallelism = false; + } + std::unique_ptr thread_pool; + int num_interpreters = run_in_caller ? 1 : 0; + if (!run_in_caller || use_batch_parallelism) { + thread_pool.reset(new tensorflow::thread::ThreadPool( + options.env, tensorflow::ThreadOptions(), + absl::StrCat(kTfLiteThreadPoolName, id), batch_pool_size, false, + nullptr)); + num_interpreters += thread_pool->NumThreads(); + } + // TODO(b/140959776): Add support for non-builtin ops (flex or custom ops). tflite::ops::builtin::BuiltinOpResolver resolver; + tflite::ops::custom::AddParseExampleOp(&resolver); // TODO(b/165643512): Remove adding Hashtable to resolver by default. tflite::ops::custom::AddHashtableOps(&resolver); - tflite::ops::custom::AddParseExampleOp(&resolver); - num_interpreters = std::max(num_interpreters, 1); + int fixed_batch_size = 1; + if (use_batch_parallelism) { + if (num_interpreters < 1) { + return errors::InvalidArgument( + "CreateTfLiteInterpreterPool requested ", + "invalid number of interpreters: ", num_interpreters); + } + fixed_batch_size = + (kInitialBatchSize + num_interpreters - 1) / num_interpreters; + } + std::vector> interpreters; - std::vector> interpreters; - interpreters.reserve(num_interpreters); for (int i = 0; i < num_interpreters; i++) { std::unique_ptr interpreter; - if (tflite::InterpreterBuilder(model, resolver)(&interpreter) != - kTfLiteOk) { + if (tflite::InterpreterBuilder(model, resolver)( + &interpreter, /*num_threads=*/1) != kTfLiteOk) { return errors::Internal( "Failed to create a TFLite interpreter with the given model"); } + const int idx = interpreter->inputs()[0]; + const auto* tensor = interpreter->tensor(idx); + if (tensor->type == kTfLiteString) { + interpreter->ResizeInputTensor(idx, {fixed_batch_size}); + } if (interpreter->AllocateTensors() != kTfLiteOk) { return errors::Internal("Failed to allocate tensors"); } - interpreters.push_back(std::move(interpreter)); + interpreters.push_back( + std::make_unique(std::move(interpreter))); + interpreters.back()->SetMiniBatchSize(fixed_batch_size); } - - pool.reset(new TfLiteInterpreterPool(std::move(interpreters))); - return Status::OK(); + pool.reset(new TfLiteInterpreterPool( + id, std::move(interpreters), std::move(thread_pool), num_interpreters, + fixed_batch_size, use_batch_parallelism)); + return tensorflow::Status::OK(); } TfLiteInterpreterPool::TfLiteInterpreterPool( - std::vector> interpreters) - : interpreters_(std::move(interpreters)) { - auto num_interpreters = interpreters_.size(); - available_.reserve(num_interpreters); - for (int i = 0; i < num_interpreters; i++) { - available_.push_back(interpreters_[i].get()); - } + int id, std::vector> interpreters, + std::unique_ptr thread_pool, + int num_interpreters, int fixed_batch_size, bool use_batch_parallelism) + : id_(id), + interpreters_(std::move(interpreters)), + thread_pool_(std::move(thread_pool)), + num_interpreters_(num_interpreters), + fixed_batch_size_(fixed_batch_size), + use_batch_parallelism_(use_batch_parallelism) {} + +std::unique_ptr& +TfLiteInterpreterPool::GetInterpreter(int interpreter_idx) { + return interpreters_[interpreter_idx]; } -std::unique_ptr -TfLiteInterpreterPool::GetInterpreter() { - auto interpreter_available = [this]() ABSL_SHARED_LOCKS_REQUIRED(mutex_) { - return !this->available_.empty(); - }; - mutex_.LockWhen(absl::Condition(&interpreter_available)); - - tflite::Interpreter* interpreter = available_.back(); - available_.pop_back(); - mutex_.Unlock(); - auto interpreter_wrapper = - std::make_unique(interpreter, this); - return interpreter_wrapper; +namespace { + +bool IsBatchParallelizable(const tflite::Model* model) { + auto tflite_model = absl::make_unique(); + model->UnPackTo(tflite_model.get(), nullptr); + if (tflite_model->subgraphs.empty()) { + return false; + } + const auto& subgraph = tflite_model->subgraphs[0]; + if (subgraph->inputs.size() != 1) { + return false; + } + int input_tensor_id = subgraph->inputs[0]; + const std::vector supported_ops = {"ParseExample", "ParseExampleV2"}; + for (size_t op_idx = 0; op_idx < subgraph->operators.size(); op_idx++) { + tflite::OperatorT* op = subgraph->operators[op_idx].get(); + if (std::find(op->inputs.begin(), op->inputs.end(), input_tensor_id) != + op->inputs.end()) { + const std::string& custom_code = + tflite_model->operator_codes[op->opcode_index]->custom_code; + return std::find(supported_ops.begin(), supported_ops.end(), + custom_code) != supported_ops.end(); + } + } + return false; } -void TfLiteInterpreterPool::ReturnInterpreter( - tflite::Interpreter* interpreter) { - absl::MutexLock l(&mutex_); - available_.push_back(interpreter); +} // namespace + +tensorflow::Status TfLiteSessionPool::CreateTfLiteSessionPool( + const tflite::FlatBufferModel* model, + const tensorflow::SessionOptions& options, bool run_in_caller, + int pool_size, int batch_pool_size, + std::unique_ptr& tflite_session_pool) { + bool use_batch_parallelism = IsBatchParallelizable(model->GetModel()); + std::vector> pools; + for (int i = 0; i < pool_size; i++) { + std::unique_ptr pool; + TF_RETURN_IF_ERROR(TfLiteInterpreterPool::CreateTfLiteInterpreterPool( + *model, run_in_caller, use_batch_parallelism, batch_pool_size, i, + options, pool)); + pools.push_back(std::move(pool)); + } + tflite_session_pool.reset(new TfLiteSessionPool(std::move(pools))); + return tensorflow::Status::OK(); } } // namespace internal diff --git a/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h b/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h index c18a138ec55..9ac320be379 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h +++ b/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h @@ -21,54 +21,185 @@ limitations under the License. #include "absl/base/thread_annotations.h" #include "absl/synchronization/mutex.h" -#include "tensorflow/core/lib/core/errors.h" +#include "tensorflow/core/common_runtime/process_util.h" +#include "tensorflow/core/lib/gtl/array_slice.h" +#include "tensorflow/core/platform/cpu_info.h" +#include "tensorflow/core/platform/tstring.h" +#include "tensorflow/core/public/session_options.h" +#include "tensorflow/lite/c/common.h" #include "tensorflow/lite/model.h" +#ifdef TFLITE_PROFILE +#ifndef TFLITE_PROFILE_EVENTS +#define TFLITE_PROFILE_EVENTS 2000 +#endif +#include "tensorflow/lite/profiling/buffered_profiler.h" +#include "tensorflow/lite/profiling/profile_summarizer.h" +#include "tensorflow/lite/profiling/profile_summary_formatter.h" +#endif +#include "tensorflow/lite/string_util.h" namespace tensorflow { namespace serving { namespace internal { +constexpr char kTfLiteThreadPoolName[] = "tflite_compute"; + +constexpr int kInitialBatchSize = 500; + class TfLiteInterpreterWrapper; -// A TFLite interpreter pool to maintain pre-created tflite::Interpreter -// objects. This class is thread-safe. +// A TFLite batch pool to maintain pre-created tflite::Interpreter +// objects. class TfLiteInterpreterPool { public: - // Create an interpreter pool with the given TFLite model and number of - // interpreters. The model must outlive the returned pool instance. + // Create a vector of TfLiteInterpreterWrapper objects with the given TFLite + // FlatBufferModel `model`. + // The number of created interpreters will depend on batch_pool_size, + // whether the calling thread requires a interpreter, `run_in_caller`, and + // whether the model can make use of batch parallelism. + // If the model cannot make use of batch parallelism, only + // a single interpreter will be created. Otherwise, the setting is set by + // batch_pool_size + 1 if run_in_caller is true. + // The model must outlive the returned pool instance. static Status CreateTfLiteInterpreterPool( - const tflite::FlatBufferModel& model, int num_interpreters, + const tflite::FlatBufferModel& model, bool run_in_caller, + bool use_batch_parallelism, int batch_pool_size, int id, + const tensorflow::SessionOptions& options, std::unique_ptr& pool); - // Returns a TFLite interpreter wrapper object. Caller may *block* waiting for - // a free interpreter to be available. - std::unique_ptr GetInterpreter(); + + // The allocated batch size of the TfLite interpreters. + int FixedBatchSize() { return fixed_batch_size_; } + + // Returns an interpreter wrapper from the pool at the given index. + std::unique_ptr& GetInterpreter( + int interpreter_idx); + + // The Id of the interpreterwrapper object, used to target a specific + // interpreterwrapper. + const int Id() { return id_; } + + // Number of interpreters. + const int NumInterpreters() { return num_interpreters_; } + + // Returns a ThreadPool for use with each interpreter, will be null + // if using run_in_caller and only 1 interpreter. + tensorflow::thread::ThreadPool* ThreadPool() { return thread_pool_.get(); } + + // Returns whether the pool is configured to use batch parallelism. + const bool UseBatchParallelism() { return use_batch_parallelism_; } private: TfLiteInterpreterPool( - std::vector> interpreters); - void ReturnInterpreter(tflite::Interpreter* interpreter); - mutable absl::Mutex mutex_; + int id, + std::vector> interpreters, + std::unique_ptr thread_pool, + int num_interpreters, int fixed_batch_size, bool use_batch_parallelism); + int id_; // A vector to maintain pointers of available interpreters - std::vector available_ ABSL_GUARDED_BY(mutex_); - const std::vector> interpreters_; - - friend TfLiteInterpreterWrapper; + std::vector> interpreters_; + std::unique_ptr thread_pool_; + int num_interpreters_; + int fixed_batch_size_; + bool use_batch_parallelism_ = false; }; // A TFLite interpreter wrapper class which automatically returns used // interpreter object to TfLiteInterpreterPool. class TfLiteInterpreterWrapper { public: - TfLiteInterpreterWrapper(tflite::Interpreter* interpreter, - TfLiteInterpreterPool* pool) - : interpreter_(interpreter), pool_(pool) {} + // Constructor for wrapper takes only an initialized interpreter. + TfLiteInterpreterWrapper(std::unique_ptr interpreter); + + // Returns the underlying interpreter. + tflite::Interpreter* Get() { return interpreter_.get(); } + + // If using parallelism, get the allocated batch size of the interpreter. + int GetMiniBatchSize() { return mini_batch_size_; } + + // Set the batch size. + void SetMiniBatchSize(int mini_batch_size) { + mini_batch_size_ = mini_batch_size; + } + + // Invokes the interpreter. + TfLiteStatus Invoke(); +#ifdef TFLITE_PROFILE + void WriteOutput(const std::string& header, const string& data, + std::ostream* stream) { + (*stream) << header << std::endl; + (*stream) << data << std::endl; + } + + void WriteProfileData() { + if (run_summarizer_.HasProfiles()) { + WriteOutput("Operator-wise Profiling Info for Regular Benchmark Runs:", + run_summarizer_.GetOutputString(), &std::cout); + } + } +#endif + + // Sets the contents of the internal buffer _tensor_buffer_ to the tflite + // formatted string buffer equivalent stored in `batch` and sets + // raw pointer of `tflite_tensor` to the internal buffer. If the required + // size is larger than the current size, will allocate new memory and + // free the existing buffer. + tensorflow::Status SetStringData( + const gtl::ArraySlice& batch, + TfLiteTensor* tflite_tensor, int tensor_index); - ~TfLiteInterpreterWrapper() { pool_->ReturnInterpreter(interpreter_); } - tflite::Interpreter* Get() { return interpreter_; } + private: + std::unique_ptr interpreter_; + int mini_batch_size_ = 1; + std::map> tensor_buffer_; + std::map tensor_buffer_max_bytes_; + std::vector offset_; +#ifdef TFLITE_PROFILE + int max_num_entries_; + tflite::profiling::ProfileSummarizer run_summarizer_; + tflite::profiling::BufferedProfiler profiler_; + int invocation_count_ = 0; +#endif +}; + +// Contains a vector of TfLiteInterpreterPool, which are protected by mutex. +// When GetInterpreterPool is called, will either release a unique ptr to the +// caller or block if the vector is empty. +class TfLiteSessionPool { + public: + // Creates a TfLiteSessionPool with model, session options, + // whether to run in caller thread, pool_size and batch_pool_size for + // each InterpreterPool. + static tensorflow::Status CreateTfLiteSessionPool( + const tflite::FlatBufferModel* model, + const tensorflow::SessionOptions& options, bool run_in_caller, + int pool_size, int batch_pool_size, + std::unique_ptr& tflite_session_pool); + + // Returns a TFLite interpreter pool object. Caller may *block* waiting for + // a free interpreter pool to be available. + std::unique_ptr GetInterpreterPool() { + auto interpreter_available = [this]() ABSL_SHARED_LOCKS_REQUIRED(mutex_) { + return !this->available_.empty(); + }; + mutex_.LockWhen(absl::Condition(&interpreter_available)); + auto pool = std::move(available_.back()); + available_.pop_back(); + mutex_.Unlock(); + return pool; + } + + // Returns an interpreter pool to the available pool. + void ReturnInterpreterPool(std::unique_ptr pool) { + absl::MutexLock l(&mutex_); + available_.emplace_back(std::move(pool)); + } private: - tflite::Interpreter* const interpreter_; - TfLiteInterpreterPool* const pool_; + TfLiteSessionPool(std::vector> pools) + : available_(std::move(pools)) {} + mutable absl::Mutex mutex_; + std::vector> available_ + ABSL_GUARDED_BY(mutex_); }; } // namespace internal diff --git a/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool_test.cc b/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool_test.cc new file mode 100644 index 00000000000..c5dc1ad5f2d --- /dev/null +++ b/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool_test.cc @@ -0,0 +1,269 @@ +/* Copyright 2021 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h" + +#include + +#include +#include +#include "tensorflow/core/example/example.pb.h" +#include "tensorflow/core/example/feature.pb.h" +#include "tensorflow/core/lib/core/status_test_util.h" +#include "tensorflow/lite/kernels/parse_example/parse_example.h" +#include "tensorflow/lite/kernels/register.h" +#include "tensorflow_serving/test_util/test_util.h" + +namespace tensorflow { +namespace serving { +namespace internal { + +using tensorflow::gtl::ArraySlice; + +constexpr char kParseExampleModel[] = + "/servables/tensorflow/testdata/parse_example_tflite/00000123/" + "model.tflite"; + +constexpr char kMobileNetModel[] = + "/servables/tensorflow/testdata/mobilenet_v1_quant_tflite/00000123/" + "model.tflite"; + +TEST(TfLiteInterpreterPool, CreateTfLiteInterpreterPoolTest) { + string model_bytes; + TF_ASSERT_OK(ReadFileToString(Env::Default(), + test_util::TestSrcDirPath(kParseExampleModel), + &model_bytes)); + auto model = tflite::FlatBufferModel::BuildFromModel( + flatbuffers::GetRoot(model_bytes.data())); + int id = 0; + bool use_batch_parallelism = false; + int batch_pool_size = 1; + bool run_in_caller = true; + const tensorflow::SessionOptions options; + std::unique_ptr pool; + TF_ASSERT_OK(TfLiteInterpreterPool::CreateTfLiteInterpreterPool( + *model, run_in_caller, use_batch_parallelism, batch_pool_size, id, + options, pool)); + ASSERT_EQ(pool->NumInterpreters(), batch_pool_size); + ASSERT_EQ(pool->Id(), id); + ASSERT_EQ(pool->FixedBatchSize(), 1); // batch_parallelism turned off. + pool.reset(); + run_in_caller = false; + use_batch_parallelism = true; + TF_ASSERT_OK(TfLiteInterpreterPool::CreateTfLiteInterpreterPool( + *model, run_in_caller, use_batch_parallelism, ++batch_pool_size, id, + options, pool)); + ASSERT_EQ(pool->NumInterpreters(), batch_pool_size); + ASSERT_EQ(pool->ThreadPool()->NumThreads(), batch_pool_size); + ASSERT_EQ(pool->UseBatchParallelism(), use_batch_parallelism); + pool.reset(); + TF_ASSERT_OK(TfLiteInterpreterPool::CreateTfLiteInterpreterPool( + *model, run_in_caller, use_batch_parallelism, ++batch_pool_size, id, + options, pool)); + ASSERT_EQ(pool->NumInterpreters(), batch_pool_size); + ASSERT_EQ(pool->FixedBatchSize(), (kInitialBatchSize + 2) / batch_pool_size); + pool.reset(); + use_batch_parallelism = false; + run_in_caller = true; + TF_ASSERT_OK(TfLiteInterpreterPool::CreateTfLiteInterpreterPool( + *model, run_in_caller, use_batch_parallelism, batch_pool_size, id, + options, pool)); + ASSERT_EQ(pool->NumInterpreters(), 1); + ASSERT_EQ(pool->FixedBatchSize(), 1); // batch_parallelism turned off. + ASSERT_EQ(pool->ThreadPool(), nullptr); + ASSERT_EQ(pool->UseBatchParallelism(), use_batch_parallelism); + pool.reset(); + use_batch_parallelism = true; + TF_ASSERT_OK(TfLiteInterpreterPool::CreateTfLiteInterpreterPool( + *model, run_in_caller, use_batch_parallelism, batch_pool_size, id, + options, pool)); + ASSERT_EQ(pool->NumInterpreters(), batch_pool_size + 1); + ASSERT_EQ(pool->ThreadPool()->NumThreads(), batch_pool_size); + pool.reset(); +} + +TEST(TfLiteSessionPool, CreateTfLiteSessionPoolTest) { + string model_bytes; + TF_ASSERT_OK(ReadFileToString(Env::Default(), + test_util::TestSrcDirPath(kParseExampleModel), + &model_bytes)); + auto model = tflite::FlatBufferModel::BuildFromModel( + flatbuffers::GetRoot(model_bytes.data())); + int pool_size = 1; + int batch_pool_size = 2; + bool run_in_caller_thread = false; + const tensorflow::SessionOptions options; + std::unique_ptr session_pool; + TF_ASSERT_OK(TfLiteSessionPool::CreateTfLiteSessionPool( + model.get(), options, run_in_caller_thread, pool_size, batch_pool_size, + session_pool)); + auto pool = session_pool->GetInterpreterPool(); + ASSERT_EQ(pool->NumInterpreters(), batch_pool_size); + ASSERT_EQ(pool->Id(), 0); + ASSERT_EQ(pool->FixedBatchSize(), + (kInitialBatchSize + batch_pool_size - 1) / batch_pool_size); + session_pool->ReturnInterpreterPool(std::move(pool)); + session_pool.reset(); + + pool_size = 2; + batch_pool_size = 2; + run_in_caller_thread = false; + TF_ASSERT_OK(TfLiteSessionPool::CreateTfLiteSessionPool( + model.get(), options, run_in_caller_thread, pool_size, batch_pool_size, + session_pool)); + + pool = session_pool->GetInterpreterPool(); + ASSERT_EQ(pool->NumInterpreters(), batch_pool_size); + ASSERT_EQ(pool->Id(), 1); + ASSERT_EQ(pool->FixedBatchSize(), (kInitialBatchSize + 1) / 2); + session_pool->ReturnInterpreterPool(std::move(pool)); + session_pool.reset(); +} + +TEST(TfLiteSessionPool, CreateTfLiteSessionPoolNotBatchParallelTest) { + string model_bytes; + TF_ASSERT_OK(ReadFileToString(Env::Default(), + test_util::TestSrcDirPath(kMobileNetModel), + &model_bytes)); + auto model = tflite::FlatBufferModel::BuildFromModel( + flatbuffers::GetRoot(model_bytes.data())); + int pool_size = 1; + int batch_pool_size = 1; + bool run_in_caller_thread = false; + const tensorflow::SessionOptions options; + std::unique_ptr session_pool; + TF_ASSERT_OK(TfLiteSessionPool::CreateTfLiteSessionPool( + model.get(), options, run_in_caller_thread, pool_size, batch_pool_size, + session_pool)); + + auto pool = session_pool->GetInterpreterPool(); + ASSERT_EQ(pool->NumInterpreters(), 1); + ASSERT_EQ(pool->Id(), 0); + ASSERT_EQ(pool->FixedBatchSize(), 1); + session_pool->ReturnInterpreterPool(std::move(pool)); + session_pool.reset(); + + pool_size = 2; + batch_pool_size = 2; + run_in_caller_thread = false; + TF_ASSERT_OK(TfLiteSessionPool::CreateTfLiteSessionPool( + model.get(), options, run_in_caller_thread, pool_size, batch_pool_size, + session_pool)); + + pool = session_pool->GetInterpreterPool(); + ASSERT_EQ(pool->NumInterpreters(), 1); + ASSERT_EQ(pool->Id(), 1); + ASSERT_EQ(pool->FixedBatchSize(), 1); + session_pool->ReturnInterpreterPool(std::move(pool)); + session_pool.reset(); +} + +int GetTensorSize(const TfLiteTensor* tflite_tensor) { + int size = 1; + for (int i = 0; i < tflite_tensor->dims->size; ++i) { + size *= tflite_tensor->dims->data[i]; + } + return size; +} + +template +std::vector ExtractVector(const TfLiteTensor* tflite_tensor) { + const T* v = reinterpret_cast(tflite_tensor->data.raw); + return std::vector(v, v + GetTensorSize(tflite_tensor)); +} + +template <> +std::vector ExtractVector(const TfLiteTensor* tflite_tensor) { + std::vector out; + for (int i = 0; i < tflite::GetStringCount(tflite_tensor); ++i) { + auto ref = tflite::GetString(tflite_tensor, i); + out.emplace_back(ref.str, ref.len); + } + return out; +} + +TEST(TfLiteInterpreterWrapper, TfLiteInterpreterWrapperTest) { + string model_bytes; + TF_ASSERT_OK(ReadFileToString(Env::Default(), + test_util::TestSrcDirPath(kParseExampleModel), + &model_bytes)); + auto model = tflite::FlatBufferModel::BuildFromModel( + flatbuffers::GetRoot(model_bytes.data())); + tflite::ops::builtin::BuiltinOpResolver resolver; + tflite::ops::custom::AddParseExampleOp(&resolver); + std::unique_ptr interpreter; + ASSERT_EQ(tflite::InterpreterBuilder(*model, resolver)(&interpreter, + /*num_threads=*/1), + kTfLiteOk); + ASSERT_EQ(interpreter->inputs().size(), 1); + const int idx = interpreter->inputs()[0]; + auto* tensor = interpreter->tensor(idx); + ASSERT_EQ(tensor->type, kTfLiteString); + int fixed_batch_size = 10; + int actual_batch_size = 3; + interpreter->ResizeInputTensor(idx, {fixed_batch_size}); + ASSERT_EQ(interpreter->AllocateTensors(), kTfLiteOk); + auto interpreter_wrapper = + std::make_unique(std::move(interpreter)); + interpreter_wrapper->SetMiniBatchSize(fixed_batch_size); + ASSERT_EQ(interpreter_wrapper->GetMiniBatchSize(), fixed_batch_size); + std::vector data; + std::vector expected_floats; + std::vector expected_strs; + for (int i = 0; i < actual_batch_size; ++i) { + tensorflow::Example example; + std::string str; + auto* features = example.mutable_features(); + const float f = i % 2 == 1 ? 1.0 : -1.0; + const std::string s = i % 2 == 1 ? "test" : "missing"; + expected_floats.push_back(f); + expected_strs.push_back(s); + (*features->mutable_feature())["x"].mutable_float_list()->add_value( + expected_floats.back()); + (*features->mutable_feature())["y"].mutable_bytes_list()->add_value( + expected_strs.back()); + example.SerializeToString(&str); + data.push_back(str); + } + ASSERT_FALSE(interpreter_wrapper->SetStringData(data, tensor, -1) == + Status::OK()); + TF_ASSERT_OK(interpreter_wrapper->SetStringData(data, tensor, idx)); + auto wrapped = interpreter_wrapper->Get(); + ASSERT_EQ(wrapped->inputs().size(), 1); + int input_idx = wrapped->inputs()[0]; + auto tflite_input_tensor = wrapped->tensor(input_idx); + ASSERT_EQ(GetTensorSize(tflite_input_tensor), fixed_batch_size); + ASSERT_EQ(tflite::GetStringCount(tflite_input_tensor), actual_batch_size); + auto input_strs = ExtractVector(tflite_input_tensor); + EXPECT_THAT(input_strs, ::testing::ElementsAreArray(data)); + ASSERT_EQ(interpreter_wrapper->Invoke(), kTfLiteOk); + const std::vector& indices = wrapped->outputs(); + auto* tflite_tensor = wrapped->tensor(indices[0]); + ASSERT_EQ(tflite_tensor->type, kTfLiteFloat32); + ASSERT_EQ(GetTensorSize(tflite_tensor), fixed_batch_size); + EXPECT_THAT(ArraySlice(ExtractVector(tflite_tensor).data(), + actual_batch_size), + ::testing::ElementsAreArray(expected_floats)); + tflite_tensor = wrapped->tensor(indices[1]); + ASSERT_EQ(tflite_tensor->type, kTfLiteString); + ASSERT_EQ(GetTensorSize(tflite_tensor), fixed_batch_size); + EXPECT_THAT( + ArraySlice(ExtractVector(tflite_tensor).data(), + actual_batch_size), + ::testing::ElementsAreArray(expected_strs)); +} + +} // namespace internal +} // namespace serving +} // namespace tensorflow diff --git a/tensorflow_serving/servables/tensorflow/tflite_session.cc b/tensorflow_serving/servables/tensorflow/tflite_session.cc index 7f90b0db8b5..03d475f7030 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session.cc @@ -21,8 +21,13 @@ limitations under the License. #include "tensorflow/cc/saved_model/signature_constants.h" #include "tensorflow/core/framework/tensor_shape.pb.h" +#include "tensorflow/core/lib/core/blocking_counter.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/cpu_backend_context.h" +#include "tensorflow/lite/kernels/hashtable/hashtable_ops.h" +#include "tensorflow/lite/kernels/internal/tensor_utils.h" +#include "tensorflow/lite/kernels/parse_example/parse_example.h" #include "tensorflow/lite/kernels/register.h" #include "tensorflow/lite/string_util.h" #include "tensorflow/lite/tools/signature/signature_def_util.h" @@ -33,8 +38,6 @@ namespace tensorflow { namespace serving { // Map of TFLite tensor name to . -using TensorInfoMap = std::map>; - namespace { Status TfLiteTypeToTfType(TfLiteType tflite_type, DataType* type) { @@ -136,139 +139,258 @@ Status GetTensorInfoMap(const tflite::Interpreter* interpreter, bool input, return Status::OK(); } -std::vector TensorDims(const Tensor& tensor) { - std::vector dims; - dims.reserve(tensor.dims()); - for (int i = 0; i < tensor.dims(); ++i) { - dims.push_back(static_cast(tensor.dim_size(i))); +std::vector TensorDims(const Tensor* tensor) { + std::vector dims(tensor->dims()); + for (int i = 0; i < tensor->dims(); ++i) { + dims[i] = static_cast(tensor->dim_size(i)); } return dims; } -Status FillTfLiteTensorFromInput(const string& name, const Tensor& tensor, - tflite::Interpreter* interpreter, int index) { - auto tflite_tensor = interpreter->tensor(index); - if (tflite_tensor == nullptr) { - return errors::InvalidArgument("Failed to get TFLite tensor: ", name, - " at index: ", index); - } - - // Fast check for resize and reallocate for non-string data. - const auto& tensor_bytes = tensor.tensor_data(); - bool needs_resize_and_realloc = (tflite_tensor->type != kTfLiteString) && - (tensor_bytes.size() != tflite_tensor->bytes); - - TfLiteIntArray* dims_array = nullptr; - if (tflite_tensor->type == kTfLiteString) { - // Slow check for string inputs. - dims_array = TfLiteIntArrayCreate(tensor.dims()); - for (int i = 0; i < tensor.dims(); ++i) { - dims_array->data[i] = static_cast(tensor.dim_size(i)); +// Create output tensors making sure they are the right size. // +Status CreateOutputTensors( + std::unique_ptr& interpreter_pool, + const std::vector& output_tensor_names, + const std::map& output_tensor_to_idx, + std::map& tflite_idx_to_output_tensor, + std::vector* output_tensors, bool use_batch_parallelism = false, + int actual_batch_size = 0) { + output_tensors->reserve(output_tensor_names.size()); + for (std::string tfname : output_tensor_names) { + auto fix_status = FixTfLiteTensorName(output_tensor_to_idx, tfname); + if (fix_status != Status::OK()) { + return errors::Internal("Missing output TFLite tensor: ", tfname, ": ", + fix_status.error_message()); } - const TfLiteIntArray* previous_dims_array = tflite_tensor->dims; - needs_resize_and_realloc = - !TfLiteIntArrayEqual(dims_array, previous_dims_array); - } - - if (needs_resize_and_realloc) { - // Slow path: needs resize+realloc. - // TODO(b/140959776): Reduce the chance of taking this path by either - // having multiple instances of interpreter or sub-graphs for commonly - // used input sizes. - if (interpreter->ResizeInputTensor(index, TensorDims(tensor)) != - kTfLiteOk) { - return errors::Internal("Failed to resize input tensor: ", name, " from ", - tflite_tensor->bytes, " to ", tensor_bytes.size(), - " bytes."); + const int tflite_idx = output_tensor_to_idx.at(tfname); + TensorShape tf_shape; + const auto& interpreter = interpreter_pool->GetInterpreter(0)->Get(); + const auto* tflite_tensor = interpreter->tensor(tflite_idx); + if (use_batch_parallelism) { + tf_shape.AddDim(actual_batch_size); + } else if (tflite_tensor->dims->size > 0) { + tf_shape.AddDim(tflite_tensor->dims->data[0]); } - if (interpreter->AllocateTensors() != kTfLiteOk) { - return errors::Internal( - "Failed to AllocateTensors() due to change in input tensor ", name, - " size from ", tflite_tensor->bytes, " to ", tensor_bytes.size(), - " bytes."); + for (int i = 1; i < tflite_tensor->dims->size; ++i) { + tf_shape.AddDim(tflite_tensor->dims->data[i]); } + DataType tf_type; + TF_RETURN_IF_ERROR(TfLiteTypeToTfType(tflite_tensor->type, &tf_type)); + output_tensors->emplace_back(tf_type, tf_shape); + tflite_idx_to_output_tensor[tflite_idx] = &output_tensors->back(); } + return Status::OK(); +} - if (tflite_tensor->type != kTfLiteString) { - std::memcpy(tflite_tensor->data.raw, tensor_bytes.data(), - tensor_bytes.size()); - } else { - tflite::DynamicBuffer buf; - auto tensor_vec = tensor.flat(); - for (int i = 0; i < tensor_vec.size(); i++) { - buf.AddString(tensor_vec(i).data(), tensor_vec(i).size()); +Status SetInputAndInvokeMiniBatch( + std::unique_ptr& interpreter_pool, + const std::map& tflite_idx_to_tf_input_tensor, + bool use_batch_parallelism = false, int32_t num_minibatches = 1, + int minibatch = 0) { + const auto& interpreter_wrapper = interpreter_pool->GetInterpreter(minibatch); + auto* interpreter = interpreter_wrapper->Get(); + // Load input data from Tensorflow tensors. + for (const auto entry : tflite_idx_to_tf_input_tensor) { + int tflite_input_idx = entry.first; + auto tflite_input_tensor = interpreter->tensor(tflite_input_idx); + const auto* tf_input_tensor = entry.second; + if (tflite_input_tensor->type != kTfLiteString) { + if (use_batch_parallelism) { + return errors::Internal( + "Batch parallelism should not be enabled for non-string inputs"); + } + auto tensor_bytes = tf_input_tensor->tensor_data(); + if (tensor_bytes.size() != tflite_input_tensor->bytes) { + if (interpreter->ResizeInputTensor( + tflite_input_idx, TensorDims(tf_input_tensor)) != kTfLiteOk) { + return errors::Internal( + "Failed to resize input tensor: ", tflite_input_tensor->name, + " from ", tflite_input_tensor->bytes, " to ", tensor_bytes.size(), + " bytes."); + } + if (interpreter->AllocateTensors() != kTfLiteOk) { + return errors::Internal("Failed to allocate tensors"); + } + } + std::memcpy(tflite_input_tensor->data.raw, tensor_bytes.data(), + tensor_bytes.size()); + } else { + // Copy the string tensor data to the input tflite tensor. + const int fixed_batch_size = interpreter_pool->FixedBatchSize(); + const int actual_batch_size = entry.second->NumElements(); + const int begin = fixed_batch_size * minibatch; + int end = static_cast(actual_batch_size); + if (use_batch_parallelism) { + end = std::min(end, fixed_batch_size * (minibatch + 1)); + } + const auto batch = gtl::ArraySlice(entry.second->flat()) + .subspan(begin, end - begin); + const int minibatch_size = batch.size(); + // Always resize when not using parallelism. + const bool needs_resize = + use_batch_parallelism + ? minibatch_size > interpreter_wrapper->GetMiniBatchSize() + : minibatch_size != interpreter_wrapper->GetMiniBatchSize(); + if (needs_resize) { + interpreter->ResizeInputTensor(entry.first, {minibatch_size}); + interpreter_wrapper->SetMiniBatchSize(minibatch_size); + if (interpreter->AllocateTensors() != kTfLiteOk) { + return errors::Internal("Failed to allocate tensors"); + } + } + TF_RETURN_IF_ERROR(interpreter_wrapper->SetStringData( + batch, tflite_input_tensor, tflite_input_idx)); } - // WriteToTensor() takes ownership of dims_array. - buf.WriteToTensor(tflite_tensor, dims_array); + } + if (interpreter_wrapper->Invoke() != kTfLiteOk) { + return errors::Internal("Failed to invoke TfLite interpreter"); } return Status::OK(); } -Status AppendTfLiteToTfTensorList(const TfLiteTensor* tflite_tensor, - std::vector* outputs) { - DataType tf_type; - TF_RETURN_IF_ERROR(TfLiteTypeToTfType(tflite_tensor->type, &tf_type)); - - TensorShape shape; - for (int i = 0; i < tflite_tensor->dims->size; ++i) { - shape.AddDim(tflite_tensor->dims->data[i]); +Status SetMiniBatchOutput( + std::unique_ptr& interpreter_pool, + const std::map& tflite_idx_to_output_tensor, + std::vector* outputs, bool use_batch_parallelism = false, + int actual_batch_size = 0, int num_minibatches = 1, size_t minibatch = 0) { + const int fixed_batch_size = interpreter_pool->FixedBatchSize(); + for (const auto& entry : tflite_idx_to_output_tensor) { + Tensor* tensor = entry.second; + const DataType tf_type = tensor->dtype(); + const int begin = fixed_batch_size * minibatch; + const int end = std::min(fixed_batch_size * static_cast(minibatch + 1), + actual_batch_size); + const int actual_minibatch_size = end - begin; + const auto& interpreter_wrapper = + interpreter_pool->GetInterpreter(minibatch); + const auto* interpreter = interpreter_wrapper->Get(); + auto tflite_tensor = interpreter->tensor(entry.first); + if (DataTypeCanUseMemcpy(tf_type)) { + auto tensor_bytes = tensor->tensor_data(); + int offset = 0; + size_t tflite_tensor_bytes = tflite_tensor->bytes; + if (use_batch_parallelism) { + // Each batch will produce minibatch_size tensors. + // We want to make sure we only copy actual_batch_size. + offset = minibatch * tflite_tensor_bytes; + tflite_tensor_bytes = + tflite_tensor_bytes / fixed_batch_size * actual_minibatch_size; + } + std::memcpy(const_cast(tensor_bytes.data() + offset), + tflite_tensor->data.raw, tflite_tensor_bytes); + } else if (tflite_tensor->type == kTfLiteString) { + const int string_count = tflite::GetStringCount(tflite_tensor); + int num_strings = string_count; + int offset = 0; + if (use_batch_parallelism) { + offset = minibatch * string_count; + num_strings = string_count / fixed_batch_size * actual_minibatch_size; + } + auto str_tensors = tensor->flat(); + for (int i = 0; i < num_strings; i++) { + const auto& ref = tflite::GetString(tflite_tensor, i); + str_tensors(i + offset).assign(ref.str, ref.len); + } + } } + return Status::OK(); +} - outputs->emplace_back(Tensor(tf_type, shape)); - Tensor* tensor = &outputs->back(); - if (DataTypeCanUseMemcpy(tf_type)) { - auto tensor_bytes = tensor->tensor_data(); - if (tflite_tensor->bytes != tensor_bytes.size()) { - return errors::Internal( - "Failed to convert TFLite tensor: ", tflite_tensor->name, - " to TF tensor. Size mismatch: ", tensor_bytes.size(), " vs ", - tflite_tensor->bytes); - } - std::memcpy(const_cast(tensor_bytes.data()), tflite_tensor->data.raw, - tflite_tensor->bytes); - } else if (tflite_tensor->type == kTfLiteString) { - const int num_strings = tflite::GetStringCount(tflite_tensor); - if (num_strings != tensor->NumElements()) { - return errors::Internal( - "Failed to convert TFLite tensor: ", tflite_tensor->name, - " to TF tensor. Num elements mismatch: ", tensor->NumElements(), - " vs ", num_strings); - } - auto str_tensors = outputs->back().flat(); - for (int i = 0; i < num_strings; i++) { - auto ref = tflite::GetString(tflite_tensor, i); - str_tensors(i).assign(ref.str, ref.len); +typedef std::function&, + const std::map&, bool, int32_t, + int)> + BatchFunction; +void ParallelFor( + const BatchFunction& f, + std::unique_ptr& interpreter_pool, + const std::map& tflite_inputs, int n, + bool use_batch_parallelism, bool run_in_caller, + std::vector& status) { + if (n == 0) return; + auto* thread_pool = interpreter_pool->ThreadPool(); + if (thread_pool == nullptr) { + for (int i = 0; i < n; ++i) { + status[i] = + f(interpreter_pool, tflite_inputs, use_batch_parallelism, n, i); } - } else { - return errors::Internal("TFLite to TF Tensor copy not supported for type: ", - tflite_tensor->type); + return; + } + int num_jobs = run_in_caller ? n - 1 : n; + int first_job = run_in_caller ? 1 : 0; + tensorflow::BlockingCounter counter(num_jobs); + for (int i = first_job; i < n; ++i) { + thread_pool->Schedule([&f, &interpreter_pool, &tflite_inputs, + use_batch_parallelism, n, i, &counter, &status] { + status[i] = + f(interpreter_pool, tflite_inputs, use_batch_parallelism, n, i); + counter.DecrementCount(); + }); + } + if (run_in_caller) { + status[0] = f(interpreter_pool, tflite_inputs, use_batch_parallelism, n, 0); + } + counter.Wait(); +} + +Status RunBatchParallel( + std::unique_ptr& interpreter_pool, + const std::vector>& inputs, + const std::map& tflite_idx_to_input_tensor, + bool run_in_caller_thread, const std::vector& output_tensor_names, + const std::map& output_tensor_to_index, + std::vector* outputs) { + const int actual_batch_size = inputs[0].second.NumElements(); + const int32_t num_threads = interpreter_pool->NumInterpreters(); + const int min_batch_size = interpreter_pool->FixedBatchSize(); + int num_minibatches = std::min( + num_threads, (actual_batch_size + min_batch_size - 1) / min_batch_size); + std::vector status_of_minibatches(num_minibatches); + ParallelFor(SetInputAndInvokeMiniBatch, interpreter_pool, + tflite_idx_to_input_tensor, num_minibatches, true, + run_in_caller_thread, status_of_minibatches); + for (Status& status_of_minibatch : status_of_minibatches) { + TF_RETURN_IF_ERROR(status_of_minibatch); + } + std::map tflite_idx_to_output_tensor; + TF_RETURN_IF_ERROR(CreateOutputTensors( + interpreter_pool, output_tensor_names, output_tensor_to_index, + tflite_idx_to_output_tensor, outputs, true, actual_batch_size)); + + // Set the contents of the return tensors. + for (size_t i = 0; i < num_minibatches; ++i) { + TF_RETURN_IF_ERROR(SetMiniBatchOutput( + interpreter_pool, tflite_idx_to_output_tensor, outputs, true, + actual_batch_size, num_minibatches, i)); } return Status::OK(); } } // namespace -Status TfLiteSession::Create(string&& buffer, +Status TfLiteSession::Create(string&& buffer, const SessionOptions& options, + int num_pools, int num_interpreters_per_pool, std::unique_ptr* tflite_session, ::google::protobuf::Map* signatures, - int num_interpreters) { + bool run_in_caller_thread) { auto model = tflite::FlatBufferModel::BuildFromModel( flatbuffers::GetRoot(buffer.data())); if (model == nullptr) { return errors::InvalidArgument("Cannot build FlatBufferModel from buffer."); } - std::unique_ptr interpreter_pool; - TF_RETURN_IF_ERROR( - internal::TfLiteInterpreterPool::CreateTfLiteInterpreterPool( - *model, num_interpreters, interpreter_pool)); - auto interpreter_wrapper = interpreter_pool->GetInterpreter(); - const tflite::Interpreter* interpreter = interpreter_wrapper->Get(); + tflite::ops::builtin::BuiltinOpResolver resolver; + tflite::ops::custom::AddParseExampleOp(&resolver); + tflite::ops::custom::AddHashtableOps(&resolver); + + std::unique_ptr interpreter; + if (tflite::InterpreterBuilder(*model, resolver)(&interpreter) != kTfLiteOk) { + return errors::Internal("Cannot build Interpreter from buffer."); + } TensorInfoMap inputs; - TF_RETURN_IF_ERROR(GetTensorInfoMap(interpreter, true, &inputs)); + TF_RETURN_IF_ERROR(GetTensorInfoMap(interpreter.get(), true, &inputs)); TensorInfoMap outputs; - TF_RETURN_IF_ERROR(GetTensorInfoMap(interpreter, false, &outputs)); + TF_RETURN_IF_ERROR(GetTensorInfoMap(interpreter.get(), false, &outputs)); // Map of TFLite tensor name -> tensor index std::map input_tensor_to_index; @@ -332,9 +454,18 @@ Status TfLiteSession::Create(string&& buffer, sigdef->set_method_name(kPredictMethodName); } + num_pools = std::max(1, num_pools); + num_interpreters_per_pool = std::max(1, num_interpreters_per_pool); + + std::unique_ptr session_pool; + TF_RETURN_IF_ERROR(internal::TfLiteSessionPool::CreateTfLiteSessionPool( + model.get(), options, run_in_caller_thread, num_pools, + num_interpreters_per_pool, session_pool)); + tflite_session->reset(new TfLiteSession( std::move(input_tensor_to_index), std::move(output_tensor_to_index), - std::move(buffer), std::move(model), std::move(interpreter_pool))); + std::move(buffer), std::move(model), std::move(session_pool), + run_in_caller_thread)); return Status::OK(); } @@ -342,12 +473,14 @@ TfLiteSession::TfLiteSession( std::map&& input_tensor_to_index, std::map&& output_tensor_to_index, string&& buffer, std::unique_ptr model, - std::unique_ptr interpreter_pool) + std::unique_ptr session_pool, + bool run_in_caller_thread) : input_tensor_to_index_(std::move(input_tensor_to_index)), output_tensor_to_index_(std::move(output_tensor_to_index)), model_serialized_bytes_(std::move(buffer)), model_(std::move(model)), - interpreter_pool_(std::move(interpreter_pool)) {} + session_pool_(std::move(session_pool)), + run_in_caller_thread_(run_in_caller_thread) {} Status TfLiteSession::Run(const std::vector>& inputs, const std::vector& output_tensor_names, @@ -375,35 +508,50 @@ Status TfLiteSession::Run( const std::vector& target_node_names, std::vector* outputs, RunMetadata* run_metadata, const thread::ThreadPoolOptions& thread_pool_options) { - auto interpreter_wrapper = interpreter_pool_->GetInterpreter(); - tflite::Interpreter* interpreter = interpreter_wrapper->Get(); + std::map tflite_idx_to_input_tensor; for (const auto& input : inputs) { string name = input.first; TF_RETURN_WITH_CONTEXT_IF_ERROR( FixTfLiteTensorName(input_tensor_to_index_, name), "Missing input TFLite tensor: ", name); const int index = input_tensor_to_index_.at(name); - TF_RETURN_IF_ERROR( - FillTfLiteTensorFromInput(name, input.second, interpreter, index)); + tflite_idx_to_input_tensor[index] = &input.second; } - if (interpreter->Invoke() != kTfLiteOk) { - return errors::Internal("Failed to run interpreter."); +#define RETURN_POOL_IF_ERROR(...) \ + do { \ + ::tensorflow::Status _status = (__VA_ARGS__); \ + if (TF_PREDICT_FALSE(!_status.ok())) { \ + session_pool_->ReturnInterpreterPool(std::move(interpreter_pool)); \ + return _status; \ + } \ + } while (0); + auto interpreter_pool = session_pool_->GetInterpreterPool(); + if (interpreter_pool->UseBatchParallelism()) { + RETURN_POOL_IF_ERROR( + RunBatchParallel(interpreter_pool, inputs, tflite_idx_to_input_tensor, + run_in_caller_thread_, output_tensor_names, + output_tensor_to_index_, outputs)); + session_pool_->ReturnInterpreterPool(std::move(interpreter_pool)); + return Status::OK(); } - outputs->clear(); - for (string name : output_tensor_names) { - TF_RETURN_WITH_CONTEXT_IF_ERROR( - FixTfLiteTensorName(output_tensor_to_index_, name), - "Missing output TFLite tensor: ", name); - const int index = output_tensor_to_index_.at(name); - auto* tflite_tensor = interpreter->tensor(index); - if (tflite_tensor == nullptr) { - return errors::InvalidArgument( - "Failed to get output TFLite tensor: ", name, " at index: ", index); - } - TF_RETURN_IF_ERROR(AppendTfLiteToTfTensorList(tflite_tensor, outputs)); - } + RETURN_POOL_IF_ERROR( + SetInputAndInvokeMiniBatch(interpreter_pool, tflite_idx_to_input_tensor)); + + // Create return tensors and map the tflite tensor index to the + // index of the created tensor. + std::map tflite_idx_to_output_tensor; + RETURN_POOL_IF_ERROR(CreateOutputTensors( + interpreter_pool, output_tensor_names, output_tensor_to_index_, + tflite_idx_to_output_tensor, outputs)); + + // Set the contents of the return tensors. + RETURN_POOL_IF_ERROR(SetMiniBatchOutput( + interpreter_pool, tflite_idx_to_output_tensor, outputs)); + +#undef RETURN_POOL_IF_ERROR + session_pool_->ReturnInterpreterPool(std::move(interpreter_pool)); return Status::OK(); } diff --git a/tensorflow_serving/servables/tensorflow/tflite_session.h b/tensorflow_serving/servables/tensorflow/tflite_session.h index f95f4c1b0da..c8eb460bd92 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session.h +++ b/tensorflow_serving/servables/tensorflow/tflite_session.h @@ -24,9 +24,12 @@ limitations under the License. #include "absl/synchronization/mutex.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/platform/file_system.h" +#include "tensorflow/core/platform/threadpool.h" #include "tensorflow/core/platform/threadpool_options.h" #include "tensorflow/core/protobuf/meta_graph.pb.h" +#include "tensorflow/lite/external_cpu_backend_context.h" #include "tensorflow/lite/interpreter.h" +#include "tensorflow/lite/kernels/cpu_backend_context.h" #include "tensorflow/lite/model.h" #include "tensorflow_serving/servables/tensorflow/serving_session.h" #include "tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h" @@ -34,6 +37,8 @@ limitations under the License. namespace tensorflow { namespace serving { +using TensorInfoMap = std::map>; + // A session to run inference on a TensorFlow Lite model. // class TfLiteSession : public ServingSession { @@ -41,10 +46,15 @@ class TfLiteSession : public ServingSession { // Creates a TfLiteSession object from `buffer` representing serialized // TFLite flatbuffer model. Also returns the SignatureDef map based on // input/outputs to the model. - static Status Create(string&& buffer, + // + // run in caller thread allows a worker to run on the parent thread, + // which may be desired to increase concurrency at the cost of additional + // thread context overhead. Defaults to false. + static Status Create(string&& buffer, const SessionOptions& options, + int num_pools, int num_interpreters_per_pool, std::unique_ptr* tflite_session, ::google::protobuf::Map* signatures, - int num_interpreters); + bool run_in_caller_thread = false); ~TfLiteSession() override = default; @@ -69,18 +79,17 @@ class TfLiteSession : public ServingSession { Status ListDevices(std::vector* response) override; private: - TfLiteSession( - std::map&& input_tensor_to_index, - std::map&& output_tensor_to_index, string&& buffer, - std::unique_ptr model, - std::unique_ptr interpreter_pool); - + TfLiteSession(std::map&& input_tensor_to_index, + std::map&& output_tensor_to_index, string&& buffer, + std::unique_ptr model, + std::unique_ptr session_pool, + bool run_in_caller_thread); const std::map input_tensor_to_index_; const std::map output_tensor_to_index_; const string model_serialized_bytes_; const std::unique_ptr model_; - std::unique_ptr interpreter_pool_; - + const std::unique_ptr session_pool_; + const bool run_in_caller_thread_; TF_DISALLOW_COPY_AND_ASSIGN(TfLiteSession); }; diff --git a/tensorflow_serving/servables/tensorflow/tflite_session_main.cc b/tensorflow_serving/servables/tensorflow/tflite_session_main.cc index 09dcb943529..5219db7b0df 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session_main.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session_main.cc @@ -44,8 +44,10 @@ int main(int argc, char** argv) { ::google::protobuf::Map signatures; std::unique_ptr session; - status = tensorflow::serving::TfLiteSession::Create(std::move(model_bytes), - &session, &signatures, 1); + tensorflow::SessionOptions options; + status = tensorflow::serving::TfLiteSession::Create( + std::move(model_bytes), options, /*num_pools=*/1, + /*num_interpreters_per_pool=*/1, &session, &signatures); if (!status.ok()) { std::cerr << "ERROR: Failed to create TF Lite session with error: " << status << std::endl; diff --git a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc index abc1a65d122..a31bd33d90c 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc @@ -37,11 +37,14 @@ limitations under the License. #include "tensorflow/core/platform/test_benchmark.h" #include "tensorflow/core/platform/threadpool_options.h" #include "tensorflow/core/protobuf/config.pb.h" +#include "tensorflow/lite/string_util.h" #include "tensorflow/lite/tools/signature/signature_def_util.h" #include "tensorflow/lite/util.h" #include "tensorflow/lite/version.h" #include "tensorflow_serving/test_util/test_util.h" +ABSL_FLAG(int, num_pools, 1, "Number of interpreter pools of a TfLiteSession."); + ABSL_FLAG(int, num_tflite_interpreters, 1, "Number of TFLite interpreters " "in an interpreter pool of a TfLiteSession."); @@ -79,9 +82,10 @@ TEST(TfLiteSession, BasicTest) { ::google::protobuf::Map signatures; std::unique_ptr session; - TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &session, &signatures, - absl::GetFlag(FLAGS_num_tflite_interpreters))); + tensorflow::SessionOptions options; + TF_ASSERT_OK(TfLiteSession::Create( + std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), + absl::GetFlag(FLAGS_num_tflite_interpreters), &session, &signatures)); EXPECT_EQ(signatures.size(), 1); EXPECT_EQ(signatures.begin()->first, "serving_default"); EXPECT_THAT(signatures.begin()->second, test_util::EqualsProto(R"( @@ -139,9 +143,10 @@ TEST(TfLiteSession, ModelFromLegacyConverterWithSigdef) { ::google::protobuf::Map signatures; std::unique_ptr session; - TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &session, &signatures, - absl::GetFlag(FLAGS_num_tflite_interpreters))); + tensorflow::SessionOptions options; + TF_ASSERT_OK(TfLiteSession::Create( + std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), + absl::GetFlag(FLAGS_num_tflite_interpreters), &session, &signatures)); EXPECT_EQ(signatures.size(), 1); EXPECT_EQ(signatures.begin()->first, "serving_default"); // While, in the model, the tensor name of input "x" is "tflite_input:0". in @@ -344,9 +349,10 @@ TEST(TfLiteSession, ProcessStrings) { &model_signature_def_map); ::google::protobuf::Map signatures; std::unique_ptr session; - TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &session, &signatures, - absl::GetFlag(FLAGS_num_tflite_interpreters))); + tensorflow::SessionOptions options; + TF_ASSERT_OK(TfLiteSession::Create( + std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), + absl::GetFlag(FLAGS_num_tflite_interpreters), &session, &signatures)); Tensor input_list = test::AsTensor({"a", "b", "c", "d"}, TensorShape({4})); Tensor input_shape = test::AsTensor({2, 2}, TensorShape({2})); @@ -367,9 +373,10 @@ TEST(TfLiteSession, ProcessStringsFlex) { &model_signature_def_map); ::google::protobuf::Map signatures; std::unique_ptr session; - TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &session, &signatures, - absl::GetFlag(FLAGS_num_tflite_interpreters))); + tensorflow::SessionOptions options; + TF_ASSERT_OK(TfLiteSession::Create( + std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), + absl::GetFlag(FLAGS_num_tflite_interpreters), &session, &signatures)); Tensor input_list = test::AsTensor({"a", "b", "c", "d"}, TensorShape({4})); Tensor input_shape = test::AsTensor({2, 2}, TensorShape({2})); @@ -390,9 +397,10 @@ TEST(TfLiteSession, ThreadPoolOptions) { &model_signature_def_map); ::google::protobuf::Map signatures; std::unique_ptr session; - TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &session, &signatures, - absl::GetFlag(FLAGS_num_tflite_interpreters))); + tensorflow::SessionOptions options; + TF_ASSERT_OK(TfLiteSession::Create( + std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), + absl::GetFlag(FLAGS_num_tflite_interpreters), &session, &signatures)); Tensor input_list = test::AsTensor({"a", "b", "c", "d"}, TensorShape({4})); Tensor input_shape = test::AsTensor({2, 2}, TensorShape({2})); @@ -430,9 +438,10 @@ TEST(TfLiteSession, SimpleSignatureDef) { signatures[kResidualSignatureKey] = SignatureDef(); std::unique_ptr session; - TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &session, &signatures, - absl::GetFlag(FLAGS_num_tflite_interpreters))); + tensorflow::SessionOptions options; + TF_ASSERT_OK(TfLiteSession::Create( + std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), + absl::GetFlag(FLAGS_num_tflite_interpreters), &session, &signatures)); ASSERT_THAT(signatures, UnorderedElementsAre(Pair(kDefaultServingSignatureDefKey, _))); @@ -470,9 +479,10 @@ TEST(TfLiteSession, MultipleSignatureDef) { tflite::TensorType_STRING, /*use_flex_op=*/false, &signature_def_map); ::google::protobuf::Map signatures; std::unique_ptr session; - TF_EXPECT_OK( - TfLiteSession::Create(std::move(model_bytes), &session, &signatures, - absl::GetFlag(FLAGS_num_tflite_interpreters))); + tensorflow::SessionOptions options; + TF_EXPECT_OK(TfLiteSession::Create( + std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), + absl::GetFlag(FLAGS_num_tflite_interpreters), &session, &signatures)); ASSERT_THAT(signatures, UnorderedElementsAre(Pair(kSignatureKey1, _), Pair(kSignatureKey2, _))); @@ -523,9 +533,10 @@ TEST(TfLiteSession, SignatureDefWithCommonTensorPrefix) { /*use_flex_op=*/false, &signature_def_map); ::google::protobuf::Map signatures; std::unique_ptr session; - TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &session, &signatures, - absl::GetFlag(FLAGS_num_tflite_interpreters))); + tensorflow::SessionOptions options; + TF_ASSERT_OK(TfLiteSession::Create( + std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), + absl::GetFlag(FLAGS_num_tflite_interpreters), &session, &signatures)); // Inputs must still be processed as two different tensors. auto outputSigdef = signatures[kDefaultServingSignatureDefKey]; @@ -543,9 +554,10 @@ TEST(TfLiteSession, SimpleSignatureDefAndRun) { &model_signature_def_map); ::google::protobuf::Map signatures; std::unique_ptr session; - TF_EXPECT_OK( - TfLiteSession::Create(std::move(model_bytes), &session, &signatures, - absl::GetFlag(FLAGS_num_tflite_interpreters))); + tensorflow::SessionOptions options; + TF_EXPECT_OK(TfLiteSession::Create( + std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), + absl::GetFlag(FLAGS_num_tflite_interpreters), &session, &signatures)); auto sigdef = signatures[kDefaultServingSignatureDefKey]; ASSERT_EQ(sigdef.inputs().at(kSignatureInputList).name(), @@ -568,6 +580,65 @@ TEST(TfLiteSession, SimpleSignatureDefAndRun) { test::AsTensor({"a", "b", "c", "d"}, TensorShape({2, 2}))); } +TEST(TfLiteSession, TestBatchParallelism) { + std::string model_bytes; + TF_ASSERT_OK(ReadFileToString(Env::Default(), + test_util::TestSrcDirPath(kParseExampleModel), + &model_bytes)); + auto model = tflite::FlatBufferModel::BuildFromModel( + flatbuffers::GetRoot(model_bytes.data())); + auto model_signature_def_map = GetTestSignatureDefMap(); + ::google::protobuf::Map signatures; + std::unique_ptr sess; + tensorflow::SessionOptions options; + TF_ASSERT_OK(TfLiteSession::Create(std::move(model_bytes), options, 1, 4, + &sess, &signatures)); + const int batch_size = 500; + const float default_value = 0; + std::vector example_list; + std::vector expected; + std::vector expected_bytes; + std::vector outputs; + + std::mt19937 random_engine; + auto random_func = [&]() { + return std::uniform_real_distribution(-0.5, 0.5)(random_engine); + }; + const std::string kTestString = "test string"; + const std::string kDefaultString = "missing"; + for (int i = 0; i < batch_size; i++) { + float val = random_func(); + tensorflow::Example example; + std::string str; + if (val < -1) { + expected.push_back(default_value); + expected_bytes.push_back(kDefaultString); + } else { + expected.push_back(val); + expected_bytes.push_back(kTestString); + auto* features = example.mutable_features(); + (*features->mutable_feature())["x"].mutable_float_list()->add_value(val); + (*features->mutable_feature())["y"].mutable_bytes_list()->add_value( + kTestString); + } + example.SerializeToString(&str); + example_list.push_back(str); + } + Tensor example_list_tensor = + test::AsTensor(example_list, TensorShape({batch_size})); + TF_EXPECT_OK(sess->Run( + {{"input", example_list_tensor}}, + {"ParseExample/ParseExampleV2", "ParseExample/ParseExampleV2:1"}, {}, + &outputs)); + test::ExpectTensorEqual( + outputs[0], + test::AsTensor(expected, TensorShape({batch_size, 1}))); + EXPECT_EQ(outputs.size(), 2); + test::ExpectTensorEqual( + outputs[1], + test::AsTensor(expected_bytes, TensorShape({batch_size, 1}))); +} + #ifdef PLATFORM_GOOGLE // These benchmarks rely on https://github.com/google/benchmark features, // not available in open-sourced TF codebase. @@ -580,9 +651,10 @@ static void BM_Reshape(benchmark::State& state, bool use_flex_op) { &model_signature_def_map); ::google::protobuf::Map signatures; std::unique_ptr sess; - TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &sess, &signatures, - absl::GetFlag(FLAGS_num_tflite_interpreters))); + tensorflow::SessionOptions options; + TF_ASSERT_OK(TfLiteSession::Create( + std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), + absl::GetFlag(FLAGS_num_tflite_interpreters), &sess, &signatures)); session = sess.release(); } Tensor input = test::AsTensor({1, 2, 3, 4, 5, 6}, TensorShape({6})); @@ -615,9 +687,10 @@ void BM_HalfPlusTwo(benchmark::State& state) { Env::Default(), test_util::TestSrcDirPath(kTestModel), &model_bytes)); ::google::protobuf::Map signatures; std::unique_ptr sess; - TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &sess, &signatures, - absl::GetFlag(FLAGS_num_tflite_interpreters))); + tensorflow::SessionOptions options; + TF_ASSERT_OK(TfLiteSession::Create( + std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), + absl::GetFlag(FLAGS_num_tflite_interpreters), &sess, &signatures)); session = sess.release(); } Tensor input = test::AsTensor({1.0, 2.0, 3.0}, TensorShape({3})); @@ -639,9 +712,10 @@ void BM_MobileNet(benchmark::State& state) { &model_bytes)); ::google::protobuf::Map signatures; std::unique_ptr sess; - TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &sess, &signatures, - absl::GetFlag(FLAGS_num_tflite_interpreters))); + tensorflow::SessionOptions options; + TF_ASSERT_OK(TfLiteSession::Create( + std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), + absl::GetFlag(FLAGS_num_tflite_interpreters), &sess, &signatures)); session = sess.release(); } std::vector x_data(1 * 224 * 224 * 3, 1); @@ -666,9 +740,9 @@ void BM_ParseExample(benchmark::State& state) { ::google::protobuf::Map signatures; std::unique_ptr sess; tensorflow::SessionOptions options; - TF_ASSERT_OK( - TfLiteSession::Create(std::move(model_bytes), &sess, &signatures, - absl::GetFlag(FLAGS_num_tflite_interpreters))); + TF_ASSERT_OK(TfLiteSession::Create( + std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), + absl::GetFlag(FLAGS_num_tflite_interpreters), &sess, &signatures)); session = sess.release(); } const int kBatchSize = 500; From 7c265023768455c216afed4baa0a9f52bc4b3862 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Feb 2021 12:01:31 -0800 Subject: [PATCH 4713/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/12785e89-a78d-4a11-b147-ed208f341450 PiperOrigin-RevId: 356792869 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d49644ee2f3..333f6e8adc4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3dcff872aa8564b0537d5cb951f1bf27557a9d65e9b4ff4de2afeae1f16955d9", - git_commit = "5eac5b75b48232e93f2a96ed856131201cd2ae3c", + sha256 = "c2f3cf2c76ad6330e8627e807e04f6d1f61d052f8c20c731b7aa82ef8fda7421", + git_commit = "ab4f2c149e47ffbfdc308d97c8cc96f896bc8be5", ) # Import all of TensorFlow Serving's external dependencies. From 28ec25f9255337afec955e3ca5ae212ab290f5de Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Feb 2021 18:01:22 -0800 Subject: [PATCH 4714/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/98cede8b-c818-4a9c-83ca-444dccac7cc2 PiperOrigin-RevId: 356871331 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 333f6e8adc4..0bebe86406b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c2f3cf2c76ad6330e8627e807e04f6d1f61d052f8c20c731b7aa82ef8fda7421", - git_commit = "ab4f2c149e47ffbfdc308d97c8cc96f896bc8be5", + sha256 = "e6adee761990f5e4dbdf3eb8fbee0480fec124e5ead543d2f07da7bc3691dda9", + git_commit = "dcaa3c9ed9211768b8de184a85558778e1ef4279", ) # Import all of TensorFlow Serving's external dependencies. From ea77a9c723c93299d5039d5643fe6e29758394c6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Feb 2021 00:03:32 -0800 Subject: [PATCH 4715/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/01d68f39-6d26-43e7-8aa1-4360712d9363 PiperOrigin-RevId: 356913809 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0bebe86406b..c70f615a748 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e6adee761990f5e4dbdf3eb8fbee0480fec124e5ead543d2f07da7bc3691dda9", - git_commit = "dcaa3c9ed9211768b8de184a85558778e1ef4279", + sha256 = "3cf75ddd5d15d0551a469c499ebc92a2892b4cc40dffd448fdef00230470d745", + git_commit = "69f5aecd05bedfaffc95cce68ecd1477ef2b1d7f", ) # Import all of TensorFlow Serving's external dependencies. From 24aab45ccfff075af3f3c136b760ca51d62ad3c3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Feb 2021 06:01:22 -0800 Subject: [PATCH 4716/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/718a6f0c-d76b-49f7-b40c-5e3fd5f0370e PiperOrigin-RevId: 356957092 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c70f615a748..27c0ce09a80 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3cf75ddd5d15d0551a469c499ebc92a2892b4cc40dffd448fdef00230470d745", - git_commit = "69f5aecd05bedfaffc95cce68ecd1477ef2b1d7f", + sha256 = "1d5511bff28f8ed3b66afe80b44824f19710d8cac42277985179e5e85d32a0f1", + git_commit = "cfa3af20c4d4db742250c36d122f65bd4d93e148", ) # Import all of TensorFlow Serving's external dependencies. From 7203b78eaa02947265c4b252e56379ffea33c3d7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Feb 2021 12:02:24 -0800 Subject: [PATCH 4717/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6c2bda5f-2fb4-4c25-bf8b-550830552f90 PiperOrigin-RevId: 357027873 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 27c0ce09a80..2821f114b5e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1d5511bff28f8ed3b66afe80b44824f19710d8cac42277985179e5e85d32a0f1", - git_commit = "cfa3af20c4d4db742250c36d122f65bd4d93e148", + sha256 = "6fb83ceb13db9811d483d9b4514c829405eab8e59ff960d22f7977a1519fe7a2", + git_commit = "6ba169665b33035f93849d5f5fbfdefa45473e6e", ) # Import all of TensorFlow Serving's external dependencies. From cba44ed65a94fb45f3f33f5c575f4bc3a1b2bd19 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Feb 2021 18:01:18 -0800 Subject: [PATCH 4718/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2a19983e-e35f-424b-addc-a1bacb12519b PiperOrigin-RevId: 357098015 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2821f114b5e..e6bd7312021 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6fb83ceb13db9811d483d9b4514c829405eab8e59ff960d22f7977a1519fe7a2", - git_commit = "6ba169665b33035f93849d5f5fbfdefa45473e6e", + sha256 = "2ea0890d680f3e639950253ec4e6dba6c04c86e1e2eb7e70abf5183af7f006df", + git_commit = "15a3221c1e73d3f6a9aed0a73d5e2248cb74d453", ) # Import all of TensorFlow Serving's external dependencies. From 1983c9bc614b7c9473a0205b238b2e704a9b016e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Feb 2021 00:02:14 -0800 Subject: [PATCH 4719/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4c985b13-33bb-4f13-8c72-448ee9d7c87b PiperOrigin-RevId: 357136936 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e6bd7312021..0c6e5cf5047 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2ea0890d680f3e639950253ec4e6dba6c04c86e1e2eb7e70abf5183af7f006df", - git_commit = "15a3221c1e73d3f6a9aed0a73d5e2248cb74d453", + sha256 = "f5ca89596ce1498a8db3ab7880ecd4e5ea1ae569fd1f73441f4efbfa8d577dfd", + git_commit = "a5a5259a3e68f0118ff800a0435134766aa4ca3e", ) # Import all of TensorFlow Serving's external dependencies. From 7a279e70bd2a1f7a899681342fc943cbf864e2d5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Feb 2021 18:01:21 -0800 Subject: [PATCH 4720/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/02c9cb77-2589-4c7e-bf36-4f236e59eeca PiperOrigin-RevId: 357302091 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0c6e5cf5047..8c490e20476 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f5ca89596ce1498a8db3ab7880ecd4e5ea1ae569fd1f73441f4efbfa8d577dfd", - git_commit = "a5a5259a3e68f0118ff800a0435134766aa4ca3e", + sha256 = "4705d7917a7cf9198b37ce87ce3e82a384388cd16e46da2ffb2884cae4bb6137", + git_commit = "96d508eb5b5614c8f8f00fb9b461030533313d2f", ) # Import all of TensorFlow Serving's external dependencies. From 159051cb53c3a56f6a284eb37f338f2d08b3cf75 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 13 Feb 2021 00:01:22 -0800 Subject: [PATCH 4721/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/160dc919-67f0-4d6e-a84d-1ecb43cac4d0 PiperOrigin-RevId: 357330456 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8c490e20476..b22fdc9ba0e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4705d7917a7cf9198b37ce87ce3e82a384388cd16e46da2ffb2884cae4bb6137", - git_commit = "96d508eb5b5614c8f8f00fb9b461030533313d2f", + sha256 = "1d58695b58a5029d2e155a472738a455592f61a5c54c6503bfb4a7cc0691fb6e", + git_commit = "8a1c8335edbedb275aef564308577c80a9066ccf", ) # Import all of TensorFlow Serving's external dependencies. From 5552eca5d4a5700225c68091fcefa11bd306bc2c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 13 Feb 2021 06:01:26 -0800 Subject: [PATCH 4722/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f5add564-76af-40f2-b2f3-e3fcfcf4a427 PiperOrigin-RevId: 357353068 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b22fdc9ba0e..f13cdff2255 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1d58695b58a5029d2e155a472738a455592f61a5c54c6503bfb4a7cc0691fb6e", - git_commit = "8a1c8335edbedb275aef564308577c80a9066ccf", + sha256 = "e0719d8493cbcfc2e50684a4be34183bcd7e52389c2fa253e3aa102737e2bc00", + git_commit = "37406182181eaf0356fa832b26a3a20e8f2f78a1", ) # Import all of TensorFlow Serving's external dependencies. From 0df6a9ff96bc1541fe3640138ffe45023b29381d Mon Sep 17 00:00:00 2001 From: OniB Date: Sun, 14 Feb 2021 03:59:10 +0900 Subject: [PATCH 4723/8103] Remove an unused variable from HttpRestApiHandler::ProcessRequest --- tensorflow_serving/model_servers/http_rest_api_handler.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/tensorflow_serving/model_servers/http_rest_api_handler.cc b/tensorflow_serving/model_servers/http_rest_api_handler.cc index 9a8b9509e63..5e1c083ba1f 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler.cc +++ b/tensorflow_serving/model_servers/http_rest_api_handler.cc @@ -69,7 +69,6 @@ Status HttpRestApiHandler::ProcessRequest( headers->clear(); output->clear(); AddHeaders(headers); - string model_version_str; string model_subresource; Status status = errors::InvalidArgument("Malformed request: ", http_method, " ", request_path); From 5daddf97f5631e90fc6ab383f2946a5562a5e02f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 13 Feb 2021 18:02:03 -0800 Subject: [PATCH 4724/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/aada4e68-c316-48ce-b2b8-4d8560e84ec5 PiperOrigin-RevId: 357397187 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f13cdff2255..7473db2c37a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e0719d8493cbcfc2e50684a4be34183bcd7e52389c2fa253e3aa102737e2bc00", - git_commit = "37406182181eaf0356fa832b26a3a20e8f2f78a1", + sha256 = "4dca6fd4aeadab4b7c46a8fdaa3bc6d4e617c48722db026d3dfd4557cb19d069", + git_commit = "796af3d216465c9545062fcf5cdd443af6dd08af", ) # Import all of TensorFlow Serving's external dependencies. From 3080736bd8a52a576a6e48ea0330b59dcf317e30 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 14 Feb 2021 06:01:17 -0800 Subject: [PATCH 4725/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fdaaa51d-c993-4b71-b7c0-ad9d8f83f709 PiperOrigin-RevId: 357443445 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7473db2c37a..2eaa9920fc9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4dca6fd4aeadab4b7c46a8fdaa3bc6d4e617c48722db026d3dfd4557cb19d069", - git_commit = "796af3d216465c9545062fcf5cdd443af6dd08af", + sha256 = "9fde40478720ec8f62a468e369cf8886ce9b512e4fa8c872fccbd2049b4e2ec6", + git_commit = "a0ef001fa88c27d32df4c3fcd03474552d0837c2", ) # Import all of TensorFlow Serving's external dependencies. From a2b3079657fa9d1bf93088309ca2d5d4fddee8d9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 14 Feb 2021 18:01:11 -0800 Subject: [PATCH 4726/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a40bdf1e-2152-47d9-a31f-5cb3e7181844 PiperOrigin-RevId: 357491218 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2eaa9920fc9..4b58af64fe9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9fde40478720ec8f62a468e369cf8886ce9b512e4fa8c872fccbd2049b4e2ec6", - git_commit = "a0ef001fa88c27d32df4c3fcd03474552d0837c2", + sha256 = "2914eb07ff3f6f81ccd4d6e7da030e3aa925c0fe1a91856c6a74556fefe25ce8", + git_commit = "372e7eef27e03adabceb4c7ca41d366776573a73", ) # Import all of TensorFlow Serving's external dependencies. From 33235b06798a18827d5758addcda4e5ee1c5290b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 15 Feb 2021 00:01:42 -0800 Subject: [PATCH 4727/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/02bc01dc-3e20-4dad-b9d6-e14d98ba5605 PiperOrigin-RevId: 357519110 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4b58af64fe9..51b79a73f42 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2914eb07ff3f6f81ccd4d6e7da030e3aa925c0fe1a91856c6a74556fefe25ce8", - git_commit = "372e7eef27e03adabceb4c7ca41d366776573a73", + sha256 = "6bd6543f4d990a6d16b7b3e8991e54e8a57ba8780770bde4a6a03eb1a6401499", + git_commit = "5396b5ce655e4667814cbc1dfc06bb86c1a06396", ) # Import all of TensorFlow Serving's external dependencies. From ae48b84d1933db7e1e027b4d7f25c4eff6429ec4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 15 Feb 2021 06:01:31 -0800 Subject: [PATCH 4728/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0d436216-7e88-4c67-bd20-524e39e469fe PiperOrigin-RevId: 357562111 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 51b79a73f42..1914b39ee3b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6bd6543f4d990a6d16b7b3e8991e54e8a57ba8780770bde4a6a03eb1a6401499", - git_commit = "5396b5ce655e4667814cbc1dfc06bb86c1a06396", + sha256 = "024e3385890cddf96f353b59344953a63c9259111ccef697bd4f2657fe26d61a", + git_commit = "a76ddd5b248fdcce7021e317b1018e4f9f8ad833", ) # Import all of TensorFlow Serving's external dependencies. From f48fc9a03a9b45561af5ca465b4012119c472b53 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 15 Feb 2021 12:01:24 -0800 Subject: [PATCH 4729/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/45df0650-0df3-4d89-b2c9-554f1ebfc3e9 PiperOrigin-RevId: 357599364 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1914b39ee3b..f07b493661f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "024e3385890cddf96f353b59344953a63c9259111ccef697bd4f2657fe26d61a", - git_commit = "a76ddd5b248fdcce7021e317b1018e4f9f8ad833", + sha256 = "9cfabe0e420879c26417e2dd939f3c6414b28bd878e930ec53f77d3cf1a6111c", + git_commit = "334649e0cdf778c6a5df1191ba81e30bbcefcc0f", ) # Import all of TensorFlow Serving's external dependencies. From ff42f8a60df6fcfc4a4c1d8a75659497cf32863b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 15 Feb 2021 18:01:15 -0800 Subject: [PATCH 4730/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/90e09cdf-e787-475e-b66a-01058871deff PiperOrigin-RevId: 357629222 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f07b493661f..478bb35c1ad 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9cfabe0e420879c26417e2dd939f3c6414b28bd878e930ec53f77d3cf1a6111c", - git_commit = "334649e0cdf778c6a5df1191ba81e30bbcefcc0f", + sha256 = "e7220286d884355e536a8ebd9962f607593130f1d1b042e22702959005941c5c", + git_commit = "c2db3a8fae0f6558e9dbdee79e67e74c1e95981c", ) # Import all of TensorFlow Serving's external dependencies. From fa8eebe330430e7d6a2303dc62a0ef7608af1d02 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 16 Feb 2021 00:01:25 -0800 Subject: [PATCH 4731/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fbfd94a8-9c34-4ee1-a009-efb4db8bdab4 PiperOrigin-RevId: 357659068 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 478bb35c1ad..66e70aaad27 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e7220286d884355e536a8ebd9962f607593130f1d1b042e22702959005941c5c", - git_commit = "c2db3a8fae0f6558e9dbdee79e67e74c1e95981c", + sha256 = "379b7e381fd92723b32658560d17c9b37b4183eceb79b292f1e03d85f6bb8866", + git_commit = "5581295cf032d8aa6c421f1fbda7f494a74f309d", ) # Import all of TensorFlow Serving's external dependencies. From a34e7197eb66c4913a00e2469521b11991652d29 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 16 Feb 2021 06:01:20 -0800 Subject: [PATCH 4732/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4b2c9c3c-8d7c-4b38-b2f1-9793f105b99f PiperOrigin-RevId: 357701409 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 66e70aaad27..a8f37e85ead 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "379b7e381fd92723b32658560d17c9b37b4183eceb79b292f1e03d85f6bb8866", - git_commit = "5581295cf032d8aa6c421f1fbda7f494a74f309d", + sha256 = "604e8320cad892114591bc9a5606afeabd45795acb5bc23fad17750ec00543a6", + git_commit = "a00ba6e4a20d941eb52ea68525f402c260cea2df", ) # Import all of TensorFlow Serving's external dependencies. From 6107166e1253d83f47c99d4328259369820f9811 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 16 Feb 2021 12:01:29 -0800 Subject: [PATCH 4733/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/28cb4207-71b6-4443-8be5-961a6315062c PiperOrigin-RevId: 357773701 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a8f37e85ead..e2d818dfa17 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "604e8320cad892114591bc9a5606afeabd45795acb5bc23fad17750ec00543a6", - git_commit = "a00ba6e4a20d941eb52ea68525f402c260cea2df", + sha256 = "810fe683ba1e766e263fff560441a7b471700fc64ad0d2e7e9884877049957c8", + git_commit = "967c81e52c79df5c568a031035785a0a97f26ab4", ) # Import all of TensorFlow Serving's external dependencies. From a73e314cf387a9141e4d50bb33adfb8d5e86325a Mon Sep 17 00:00:00 2001 From: Allen Wang Date: Tue, 16 Feb 2021 17:43:16 -0800 Subject: [PATCH 4734/8103] Link TPU model server initialization if built with TPU support. PiperOrigin-RevId: 357842909 --- .bazelrc | 4 ++++ tensorflow_serving/model_servers/BUILD | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.bazelrc b/.bazelrc index a759ad92eec..4ce7232b86b 100644 --- a/.bazelrc +++ b/.bazelrc @@ -8,6 +8,10 @@ build:cuda --define=using_cuda=true --define=using_cuda_nvcc=true build:cuda --action_env=TF_CUDA_COMPUTE_CAPABILITIES="sm_35,sm_50,sm_60,sm_70,sm_75,compute_80" +# Options used to build with TPU support. +build:tpu --distinct_host_configuration=false +build:tpu --define=with_tpu_support=true --define=framework_shared_object=false + # Please note that MKL on MacOS or windows is still not supported. # If you would like to use a local MKL instead of downloading, please set the # environment variable "TF_MKL_ROOT" every time before build. diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 70e559ebfcb..9abcf45f2e1 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -3,6 +3,7 @@ load("//tensorflow_serving:oss_or_google.bzl", "if_google") load("//tensorflow_serving:tensorflow_version.bzl", "if_not_v2", "if_v2") load("@rules_pkg//:pkg.bzl", "pkg_deb", "pkg_tar") +load("@org_tensorflow//tensorflow:tensorflow.bzl", "if_libtpu") package( default_visibility = [ @@ -396,7 +397,9 @@ cc_library( "@org_tensorflow//tensorflow/core/platform/cloud:gcs_file_system", "@org_tensorflow//tensorflow/core/platform/hadoop:hadoop_file_system", "@org_tensorflow//tensorflow/core/platform/s3:s3_file_system", - ], + ] + if_libtpu([ + "@org_tensorflow//tensorflow/core/tpu:tpu_model_server_initializer", + ]), ) cc_binary( From 6d994800bf4792ec1b81153d3c975924b4ae1fea Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 16 Feb 2021 18:01:21 -0800 Subject: [PATCH 4735/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/40d50719-b1b9-4795-b529-491578e400eb PiperOrigin-RevId: 357845821 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e2d818dfa17..d47052013d4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "810fe683ba1e766e263fff560441a7b471700fc64ad0d2e7e9884877049957c8", - git_commit = "967c81e52c79df5c568a031035785a0a97f26ab4", + sha256 = "3a2e44ffe6af7ab1f08f058554a0970efaf9c06e2fc54aeadfb1d9d0eecb0d31", + git_commit = "63a277f28a8e0ebd6ce5c62354d02fba4e0cdfac", ) # Import all of TensorFlow Serving's external dependencies. From 3b4431868459c64e32d5d58ca01461b9b6f393eb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Feb 2021 00:01:22 -0800 Subject: [PATCH 4736/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/40dde622-5e49-4ca0-8bc7-c19a3dfbc7fe PiperOrigin-RevId: 357888742 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d47052013d4..f4d2845be5a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3a2e44ffe6af7ab1f08f058554a0970efaf9c06e2fc54aeadfb1d9d0eecb0d31", - git_commit = "63a277f28a8e0ebd6ce5c62354d02fba4e0cdfac", + sha256 = "a3337430a20af0fe48f720379d94b6826d66778976af105167956e216f644e41", + git_commit = "8e421f5cc60e13af2f2944fd2346bf686e0e6824", ) # Import all of TensorFlow Serving's external dependencies. From 2228fc0b39ce7142f3ff18caf5401be613730e53 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Feb 2021 06:01:24 -0800 Subject: [PATCH 4737/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b1a33a98-a76f-4819-a95a-89d00a43164a PiperOrigin-RevId: 357931488 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f4d2845be5a..1655bcbe9b4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a3337430a20af0fe48f720379d94b6826d66778976af105167956e216f644e41", - git_commit = "8e421f5cc60e13af2f2944fd2346bf686e0e6824", + sha256 = "5af1d6fa69bbf382b296508f5859788bc80d93c88483c2c1c97777f0aeaeef48", + git_commit = "9663abe4c9037030b0b497c68cc4b2ba991967dd", ) # Import all of TensorFlow Serving's external dependencies. From c6b3936accc6aa75cf174b1ce3dffc4ca588fbdc Mon Sep 17 00:00:00 2001 From: Jungshik Jang Date: Wed, 17 Feb 2021 10:04:35 -0800 Subject: [PATCH 4738/8103] Use LOG_EVERY_N_SEC insted of LOG with local static time variable. PiperOrigin-RevId: 357973554 --- tensorflow_serving/batching/batching_session.cc | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/tensorflow_serving/batching/batching_session.cc b/tensorflow_serving/batching/batching_session.cc index 791d85e44a7..9519cc73260 100644 --- a/tensorflow_serving/batching/batching_session.cc +++ b/tensorflow_serving/batching/batching_session.cc @@ -344,15 +344,11 @@ Status BatchingSession::InternalRun( if (batch_scheduler_it == batch_schedulers_.end()) { // We have a Run() call that doesn't match one of our batching signatures. // Run it in-line. - static uint64 last_log_message_secs = 0; - uint64 now_secs = EnvTime::NowSeconds(); - // The time check is not strictly thread safe, but it doesn't matter. - if (now_secs - last_log_message_secs >= 120) { - LOG(WARNING) << "Request doesn't match any declared signature. Bypassing " - "batcher. Request signature is: " - << TensorSignatureDebugString(signature); - last_log_message_secs = now_secs; - } + LOG_EVERY_N_SEC(WARNING, 120) + << "Request doesn't match any declared signature. Bypassing " + "batcher. Request signature is: " + << TensorSignatureDebugString(signature); + // Because the wrapped session may not provide an implementation for // thread_pool_options, we need to invoke different Run() functions // depending on whether thread_pool_options is specified. From c6c7dae782edb5f5f83ae3633e8e62c4a0c9f661 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Feb 2021 12:01:22 -0800 Subject: [PATCH 4739/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/aed5eb21-85e2-41ef-b928-adef7946c654 PiperOrigin-RevId: 358001939 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1655bcbe9b4..84ea6b5e750 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5af1d6fa69bbf382b296508f5859788bc80d93c88483c2c1c97777f0aeaeef48", - git_commit = "9663abe4c9037030b0b497c68cc4b2ba991967dd", + sha256 = "04cf12592edf7093d87388d983566af83cadcd5a359a5fe45a52a4832f160a7c", + git_commit = "15b8b79364ebdc2e8d876a4d7b4fed59fd7cdc78", ) # Import all of TensorFlow Serving's external dependencies. From 8831e3dc58380d869e239001f767f0ecfc8ca12a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Feb 2021 18:01:19 -0800 Subject: [PATCH 4740/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/08889a26-9939-4196-8177-7777585bf68e PiperOrigin-RevId: 358074999 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 84ea6b5e750..6227121b57c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "04cf12592edf7093d87388d983566af83cadcd5a359a5fe45a52a4832f160a7c", - git_commit = "15b8b79364ebdc2e8d876a4d7b4fed59fd7cdc78", + sha256 = "37473b2525ee6c976f9eb88f04041088a03c2a71d4c833a8d6e0ab942a64d208", + git_commit = "b47c45c1ec50b2ab6ff3d132491663e75ac076b5", ) # Import all of TensorFlow Serving's external dependencies. From dd313b8c9db59ed8c4e1d3ae9badbd22746de541 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Feb 2021 06:01:23 -0800 Subject: [PATCH 4741/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4a89cabe-9c3a-4b22-9551-bb57d170b021 PiperOrigin-RevId: 358161035 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6227121b57c..924fdc5fffc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "37473b2525ee6c976f9eb88f04041088a03c2a71d4c833a8d6e0ab942a64d208", - git_commit = "b47c45c1ec50b2ab6ff3d132491663e75ac076b5", + sha256 = "028da704f1a5537ab6e667aea991f95c67ade07dc7fcb320f3746e118ef79627", + git_commit = "045b62dc3ee2ce23ace71a39b5e433abbbbe3900", ) # Import all of TensorFlow Serving's external dependencies. From 85199ba6b025eabde2c257582a5740f66f591f0b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Feb 2021 12:01:20 -0800 Subject: [PATCH 4742/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6b701821-4d5f-4046-9e6c-d084f459b0bc PiperOrigin-RevId: 358232022 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 924fdc5fffc..719e115ffb3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "028da704f1a5537ab6e667aea991f95c67ade07dc7fcb320f3746e118ef79627", - git_commit = "045b62dc3ee2ce23ace71a39b5e433abbbbe3900", + sha256 = "df3039d79a6c8891ce07b24dfad4d9c451b4bc4f6d0deb4d56e63f7793ad9bfd", + git_commit = "28e6dc5177e65b26a2f03e13583472f517c84c23", ) # Import all of TensorFlow Serving's external dependencies. From e78204892a4c1e860d3e8eab64f517d57a790705 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Feb 2021 18:02:16 -0800 Subject: [PATCH 4743/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/73808237-cc4a-426c-94b2-69df75e09381 PiperOrigin-RevId: 358307028 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 719e115ffb3..95ce926ca24 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "df3039d79a6c8891ce07b24dfad4d9c451b4bc4f6d0deb4d56e63f7793ad9bfd", - git_commit = "28e6dc5177e65b26a2f03e13583472f517c84c23", + sha256 = "0eb079993dd6d31a74df5c7d376bc0ea9cfbf0f8289d517c27491123f5ffb3be", + git_commit = "fea7106930d48f4ed739aa56c4a8f64850af6619", ) # Import all of TensorFlow Serving's external dependencies. From 5a0dfd9468d718da1bd39687da0f80fe489ea0af Mon Sep 17 00:00:00 2001 From: Guanxin Qiao Date: Thu, 18 Feb 2021 18:32:26 -0800 Subject: [PATCH 4744/8103] Reduce gpu docker image size. PiperOrigin-RevId: 358311178 --- tensorflow_serving/tools/docker/Dockerfile.devel-gpu | 3 ++- tensorflow_serving/tools/docker/Dockerfile.gpu | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 4e60d66d5e7..2d721911fc1 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -11,7 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -FROM nvidia/cuda:11.0-cudnn8-devel-ubuntu18.04 as base_build +FROM nvidia/cuda:11.0-base-ubuntu18.04 as base_build ARG TF_SERVING_VERSION_GIT_BRANCH=master ARG TF_SERVING_VERSION_GIT_COMMIT=HEAD @@ -33,6 +33,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ libcublas-dev-11-0 \ cuda-nvrtc-11-0 \ cuda-nvrtc-dev-11-0 \ + cuda-nvprune-11-0 \ cuda-cudart-dev-11-0 \ libcufft-dev-11-0 \ libcurand-dev-11-0 \ diff --git a/tensorflow_serving/tools/docker/Dockerfile.gpu b/tensorflow_serving/tools/docker/Dockerfile.gpu index 676d0975417..ba6374f47c0 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.gpu @@ -16,7 +16,7 @@ ARG TF_SERVING_VERSION=latest ARG TF_SERVING_BUILD_IMAGE=tensorflow/serving:${TF_SERVING_VERSION}-devel-gpu FROM ${TF_SERVING_BUILD_IMAGE} as build_image -FROM nvidia/cuda:11.0-cudnn8-devel-ubuntu18.04 +FROM nvidia/cuda:11.0-base-ubuntu18.04 ARG TF_SERVING_VERSION_GIT_BRANCH=master ARG TF_SERVING_VERSION_GIT_COMMIT=head From d4f3d81645300124b787c2de2cd1f9710085dfe8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Feb 2021 00:01:39 -0800 Subject: [PATCH 4745/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/cb24dd78-cb77-4430-909c-151bf9710c21 PiperOrigin-RevId: 358348899 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 95ce926ca24..18efd99f3cd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0eb079993dd6d31a74df5c7d376bc0ea9cfbf0f8289d517c27491123f5ffb3be", - git_commit = "fea7106930d48f4ed739aa56c4a8f64850af6619", + sha256 = "e312644ef2a855b8abceeb6e0d9301d65183ddf423756d24446c286e34ee2871", + git_commit = "c7b83e2b5e3021eb86fdf2d98b82247df5822f9e", ) # Import all of TensorFlow Serving's external dependencies. From a65271648401f565ab0e2518137fc6231c24cf1a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Feb 2021 06:01:44 -0800 Subject: [PATCH 4746/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d2de9c7a-c988-4512-a4e2-2c0116523238 PiperOrigin-RevId: 358389708 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 18efd99f3cd..cf8a7b5efea 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e312644ef2a855b8abceeb6e0d9301d65183ddf423756d24446c286e34ee2871", - git_commit = "c7b83e2b5e3021eb86fdf2d98b82247df5822f9e", + sha256 = "a452c0c6157362ba8bb17e71ed07a6e415b74b639b3193524aafebe3f6d2fc6d", + git_commit = "db445bbf91e9e020d0df4dbd08e9bc3ab074a4e8", ) # Import all of TensorFlow Serving's external dependencies. From 300a82be9eeb69b49b1d1dc0c0d979254df6a3df Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Feb 2021 12:01:25 -0800 Subject: [PATCH 4747/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/94798c3d-72ff-4101-b775-e6fa6c5e1943 PiperOrigin-RevId: 358454221 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cf8a7b5efea..7531d401ac1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a452c0c6157362ba8bb17e71ed07a6e415b74b639b3193524aafebe3f6d2fc6d", - git_commit = "db445bbf91e9e020d0df4dbd08e9bc3ab074a4e8", + sha256 = "ac2b7c09f07387f97600a4b8aa94051777e7bd32f32ddd57790ef3317e6fb170", + git_commit = "2401461cee208f6a734e09a69ed9a3852497a502", ) # Import all of TensorFlow Serving's external dependencies. From 6fdd93ddc744006a9c34e2337d895a67e46a3ee3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Feb 2021 18:01:40 -0800 Subject: [PATCH 4748/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/811b3523-9c97-4147-9e46-8505b708e19d PiperOrigin-RevId: 358518303 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7531d401ac1..70b231a1d9a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ac2b7c09f07387f97600a4b8aa94051777e7bd32f32ddd57790ef3317e6fb170", - git_commit = "2401461cee208f6a734e09a69ed9a3852497a502", + sha256 = "a79c309eefcf259ea4d084b91ab64cd5b3eccac7e93e9511d7524e1c3d8c896f", + git_commit = "9b7ff60faa841f0473facf618cb5b66b9cb99b5e", ) # Import all of TensorFlow Serving's external dependencies. From ddad074e9f2347e8898811c97db1e454f00c9062 Mon Sep 17 00:00:00 2001 From: Abolfazl Shahbazi Date: Fri, 19 Feb 2021 23:47:23 -0800 Subject: [PATCH 4749/8103] Fix TensorFlow Serving build with MKL+OpenMP --- tensorflow_serving/tools/docker/Dockerfile.devel-mkl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl index c6e05e4de2b..91eccf6de9d 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl @@ -92,12 +92,12 @@ RUN curl -sSL --retry 5 https://github.com/tensorflow/serving/tarball/${TF_SERVI FROM base_build as binary_build # Build, and install TensorFlow Serving -ARG TF_SERVING_BUILD_OPTIONS="--config=mkl --config=release" +ARG TF_SERVING_BUILD_OPTIONS="--config=mkl --config=release --config=build_with_mkl --config=enable_mkl --config=build_with_openmp" RUN echo "Building with build options: ${TF_SERVING_BUILD_OPTIONS}" ARG TF_SERVING_BAZEL_OPTIONS="" RUN echo "Building with Bazel options: ${TF_SERVING_BAZEL_OPTIONS}" -RUN bazel build --color=yes --curses=yes \ +RUN bazel --host_jvm_args=-Xmx24g build --color=yes --curses=yes \ ${TF_SERVING_BAZEL_OPTIONS} \ --verbose_failures \ --output_filter=DONT_MATCH_ANYTHING \ From ef6a576e116319b05a383fa1974f68bcd4ca5193 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 20 Feb 2021 00:01:24 -0800 Subject: [PATCH 4750/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/70aa2126-030a-4efc-b188-76cf576dffed PiperOrigin-RevId: 358550917 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 70b231a1d9a..602b0ab7596 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a79c309eefcf259ea4d084b91ab64cd5b3eccac7e93e9511d7524e1c3d8c896f", - git_commit = "9b7ff60faa841f0473facf618cb5b66b9cb99b5e", + sha256 = "36fb7302dd207c44e7cabe42709f767e61c793655e7fab76e3afc52158e95d55", + git_commit = "83fe4bb59b31b17e3c46d7d007be40003e5b4850", ) # Import all of TensorFlow Serving's external dependencies. From e097fceb912ad801ccbc7f257f7456a221801891 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 20 Feb 2021 06:01:26 -0800 Subject: [PATCH 4751/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/dcb7fed3-4dfc-4253-9af3-582c7d2c5d10 PiperOrigin-RevId: 358576681 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 602b0ab7596..fea31046fb8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "36fb7302dd207c44e7cabe42709f767e61c793655e7fab76e3afc52158e95d55", - git_commit = "83fe4bb59b31b17e3c46d7d007be40003e5b4850", + sha256 = "08fd77111f857d9694c9688497f3b0847d2f90d9b7c54e9528269bb78b7f6d9f", + git_commit = "a957f4e1a0488e469a28cdaf373d45d6e473435d", ) # Import all of TensorFlow Serving's external dependencies. From 30ab3c8cfd556745309bf7c91ac597f56ff56fe4 Mon Sep 17 00:00:00 2001 From: Abolfazl Shahbazi Date: Sat, 20 Feb 2021 11:27:11 -0800 Subject: [PATCH 4752/8103] Add 'ashahba' as the maintainer for MKL Dockerfile(s) --- tensorflow_serving/tools/docker/Dockerfile.devel-mkl | 2 +- tensorflow_serving/tools/docker/Dockerfile.mkl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl index 91eccf6de9d..7c7119e6d3f 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl @@ -16,7 +16,7 @@ FROM ubuntu:18.04 as base_build ARG TF_SERVING_VERSION_GIT_BRANCH=master ARG TF_SERVING_VERSION_GIT_COMMIT=HEAD -LABEL maintainer="Clayne Robison " +LABEL maintainer="Abolfazl Shahbazi " LABEL tensorflow_serving_github_branchtag=${TF_SERVING_VERSION_GIT_BRANCH} LABEL tensorflow_serving_github_commit=${TF_SERVING_VERSION_GIT_COMMIT} diff --git a/tensorflow_serving/tools/docker/Dockerfile.mkl b/tensorflow_serving/tools/docker/Dockerfile.mkl index 96a51bf6839..9a586864686 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.mkl +++ b/tensorflow_serving/tools/docker/Dockerfile.mkl @@ -21,7 +21,7 @@ FROM ubuntu:18.04 ARG TF_SERVING_VERSION_GIT_BRANCH=master ARG TF_SERVING_VERSION_GIT_COMMIT=head -LABEL maintainer="Clayne Robison " +LABEL maintainer="Abolfazl Shahbazi " LABEL tensorflow_serving_github_branchtag=${TF_SERVING_VERSION_GIT_BRANCH} LABEL tensorflow_serving_github_commit=${TF_SERVING_VERSION_GIT_COMMIT} From 1ee30d7d9efd70b546413b1bbe01cabfea45a57e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 20 Feb 2021 12:01:12 -0800 Subject: [PATCH 4753/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4460f2ce-69b0-4150-b565-7a2655807102 PiperOrigin-RevId: 358599881 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fea31046fb8..392b352fe9b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "08fd77111f857d9694c9688497f3b0847d2f90d9b7c54e9528269bb78b7f6d9f", - git_commit = "a957f4e1a0488e469a28cdaf373d45d6e473435d", + sha256 = "3229292fe844ceda3ce75305f8c6e1036f87d4ffc8d74254402446fce17cc8df", + git_commit = "37a13924beaed0b8b9acde2b2f43f23f07586031", ) # Import all of TensorFlow Serving's external dependencies. From 4e1b1de0eb92f4e66587f8926e4114945117191d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 20 Feb 2021 18:01:25 -0800 Subject: [PATCH 4754/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/aadeb900-8909-4b8d-8915-8f638e5fa478 PiperOrigin-RevId: 358624120 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 392b352fe9b..a95f8593370 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3229292fe844ceda3ce75305f8c6e1036f87d4ffc8d74254402446fce17cc8df", - git_commit = "37a13924beaed0b8b9acde2b2f43f23f07586031", + sha256 = "580cf3b4719340d7827c5f2414f69be02b9335431826bc0ab4bd2a874c949fef", + git_commit = "8417d5f88f4cca0b5066123375810fa2bdac1f80", ) # Import all of TensorFlow Serving's external dependencies. From 54f01954c9744464438176a0271c5a64b6d19d52 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 21 Feb 2021 00:01:24 -0800 Subject: [PATCH 4755/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/142a7f4e-eaf1-4105-b980-b64271d17fb1 PiperOrigin-RevId: 358647441 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a95f8593370..a90d2786aee 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "580cf3b4719340d7827c5f2414f69be02b9335431826bc0ab4bd2a874c949fef", - git_commit = "8417d5f88f4cca0b5066123375810fa2bdac1f80", + sha256 = "d14c3c08176e62e34a863573ca2f58858607a2e8d5c5a3ae5ef208d7402ca2ac", + git_commit = "4e323b1aa950784972af509a7a5f02c3f075a47e", ) # Import all of TensorFlow Serving's external dependencies. From 817699ab2ebb4e16a5ab03bf3c6bedfcd9e8084d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 21 Feb 2021 06:01:24 -0800 Subject: [PATCH 4756/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9c737749-135f-4bc0-aaa5-e36212091cc0 PiperOrigin-RevId: 358673808 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a90d2786aee..28cd5bebb3e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d14c3c08176e62e34a863573ca2f58858607a2e8d5c5a3ae5ef208d7402ca2ac", - git_commit = "4e323b1aa950784972af509a7a5f02c3f075a47e", + sha256 = "38cb9e73a5a2530fb025df8dff2023f242a98bda4ed027625941d6f42c8a0d8d", + git_commit = "a2a5b86c3bd90e03151a25c52c0f6cebbd573228", ) # Import all of TensorFlow Serving's external dependencies. From d65914b5212213ea26e61956ade0668978001fba Mon Sep 17 00:00:00 2001 From: kiddos Date: Mon, 22 Feb 2021 01:38:20 +0800 Subject: [PATCH 4757/8103] add cors headers --- tensorflow_serving/model_servers/http_rest_api_handler.cc | 3 +++ tensorflow_serving/model_servers/http_rest_api_util.cc | 6 ++++++ tensorflow_serving/model_servers/http_rest_api_util.h | 2 ++ tensorflow_serving/model_servers/main.cc | 2 ++ tensorflow_serving/model_servers/server.cc | 1 + tensorflow_serving/model_servers/server.h | 1 + tensorflow_serving/model_servers/server_core.h | 4 ++++ 7 files changed, 19 insertions(+) diff --git a/tensorflow_serving/model_servers/http_rest_api_handler.cc b/tensorflow_serving/model_servers/http_rest_api_handler.cc index 9a8b9509e63..d87b2586c07 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler.cc +++ b/tensorflow_serving/model_servers/http_rest_api_handler.cc @@ -69,6 +69,9 @@ Status HttpRestApiHandler::ProcessRequest( headers->clear(); output->clear(); AddHeaders(headers); + if (core_->enable_cors_headers()) { + AddCORSHeaders(headers); + } string model_version_str; string model_subresource; Status status = errors::InvalidArgument("Malformed request: ", http_method, diff --git a/tensorflow_serving/model_servers/http_rest_api_util.cc b/tensorflow_serving/model_servers/http_rest_api_util.cc index a800c1ba830..9a06760ecfb 100644 --- a/tensorflow_serving/model_servers/http_rest_api_util.cc +++ b/tensorflow_serving/model_servers/http_rest_api_util.cc @@ -33,6 +33,12 @@ void AddHeaders(std::vector>* headers) { headers->push_back({"Content-Type", "application/json"}); } +void AddCORSHeaders(std::vector>* headers) { + headers->push_back({"Access-Control-Allow-Origin", "*"}); + headers->push_back({"Access-Control-Allow-Methods", "POST, GET, OPTIONS"}); + headers->push_back({"Access-Control-Allow-Headers", "Content-Type"}); +} + Status FillModelSpecWithNameVersionAndLabel( const absl::string_view model_name, const absl::optional& model_version, diff --git a/tensorflow_serving/model_servers/http_rest_api_util.h b/tensorflow_serving/model_servers/http_rest_api_util.h index cbd552020c5..5dddadce5e4 100644 --- a/tensorflow_serving/model_servers/http_rest_api_util.h +++ b/tensorflow_serving/model_servers/http_rest_api_util.h @@ -33,6 +33,8 @@ const char* const kHTTPRestApiHandlerPathRegex = "(?i)/v1/.*"; void AddHeaders(std::vector>* headers); +void AddCORSHeaders(std::vector>* headers); + Status FillModelSpecWithNameVersionAndLabel( const absl::string_view model_name, const absl::optional& model_version, diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index a83f95cce66..91cfe53c422 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -75,6 +75,8 @@ int main(int argc, char** argv) { "set, will be auto set based on number of CPUs."), tensorflow::Flag("rest_api_timeout_in_ms", &options.http_timeout_in_ms, "Timeout for HTTP/REST API calls."), + tensorflow::Flag("rest_api_enable_cors_headers", &options.enable_cors_headers, + "Enable CORS headers in response"), tensorflow::Flag("enable_batching", &options.enable_batching, "enable batching"), tensorflow::Flag( diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index 0e4ca2343c6..dfc41b50b5e 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -300,6 +300,7 @@ Status Server::BuildAndStart(const Options& server_options) { options.flush_filesystem_caches = server_options.flush_filesystem_caches; options.allow_version_labels_for_unavailable_models = server_options.allow_version_labels_for_unavailable_models; + options.enable_cors_headers = server_options.enable_cors_headers; TF_RETURN_IF_ERROR(ServerCore::Create(std::move(options), &server_core_)); diff --git a/tensorflow_serving/model_servers/server.h b/tensorflow_serving/model_servers/server.h index bcb55db1592..171b2b34df7 100644 --- a/tensorflow_serving/model_servers/server.h +++ b/tensorflow_serving/model_servers/server.h @@ -51,6 +51,7 @@ class Server { tensorflow::int32 http_port = 0; tensorflow::int32 http_num_threads = 4.0 * port::NumSchedulableCPUs(); tensorflow::int32 http_timeout_in_ms = 30000; // 30 seconds. + bool enable_cors_headers = false; // // Model Server options. diff --git a/tensorflow_serving/model_servers/server_core.h b/tensorflow_serving/model_servers/server_core.h index 6ddf50b1074..58c6f537109 100644 --- a/tensorflow_serving/model_servers/server_core.h +++ b/tensorflow_serving/model_servers/server_core.h @@ -190,6 +190,8 @@ class ServerCore : public Manager { // The prefix to append to the file system storage paths. std::string storage_path_prefix; + + bool enable_cors_headers = false; }; virtual ~ServerCore() = default; @@ -266,6 +268,8 @@ class ServerCore : public Manager { return options_.predict_response_tensor_serialization_option; } + bool enable_cors_headers() const { return options_.enable_cors_headers; } + protected: ServerCore(Options options); From 68dabd9747fc8493a6901063d5e7d3291ab795f3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 21 Feb 2021 18:01:20 -0800 Subject: [PATCH 4758/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/82bd5a20-2fe4-4c43-b44e-51ae10e9646f PiperOrigin-RevId: 358725411 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 28cd5bebb3e..264cb1eb3f2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "38cb9e73a5a2530fb025df8dff2023f242a98bda4ed027625941d6f42c8a0d8d", - git_commit = "a2a5b86c3bd90e03151a25c52c0f6cebbd573228", + sha256 = "2e9f9424cf63b7e759e06af44e80f4451e1aac4f5701c316f597473452f7d9d1", + git_commit = "561d3d19886d3835e5ea7cf0ad8089fafe7d849b", ) # Import all of TensorFlow Serving's external dependencies. From 4d948b22cae8319631105f627c96481cc193f546 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 22 Feb 2021 00:01:42 -0800 Subject: [PATCH 4759/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7b6d741f-f234-48d2-ba26-43b87879edab PiperOrigin-RevId: 358758268 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 264cb1eb3f2..18072f8660d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2e9f9424cf63b7e759e06af44e80f4451e1aac4f5701c316f597473452f7d9d1", - git_commit = "561d3d19886d3835e5ea7cf0ad8089fafe7d849b", + sha256 = "72b1983f1cb69d49340e0163ef2da60d00b79c45b862bfcc2444ecd24d2c03a2", + git_commit = "88d7c1b9fc8645cf3238f451d2cbca5aadd4a7f7", ) # Import all of TensorFlow Serving's external dependencies. From 54cb73b563480ceec0aafcb36a4cf9a451a152cf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 22 Feb 2021 06:01:30 -0800 Subject: [PATCH 4760/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/52da2cc4-85fd-48ea-af24-17e7bff662f1 PiperOrigin-RevId: 358802291 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 18072f8660d..2f71e1f24eb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "72b1983f1cb69d49340e0163ef2da60d00b79c45b862bfcc2444ecd24d2c03a2", - git_commit = "88d7c1b9fc8645cf3238f451d2cbca5aadd4a7f7", + sha256 = "823c34ad24c43b6f25e2dbaf6ca7d141865ea23a080ef0af398642a593ba04a7", + git_commit = "b299b2600d2be042aa8604f83ef494cea91adb4d", ) # Import all of TensorFlow Serving's external dependencies. From b119f48619f4f3c6949c0368dd4621e0e5e4de9b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 22 Feb 2021 12:01:20 -0800 Subject: [PATCH 4761/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d2880641-cbe3-4f2d-91bf-776244664c40 PiperOrigin-RevId: 358872647 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2f71e1f24eb..c98254c3ba7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "823c34ad24c43b6f25e2dbaf6ca7d141865ea23a080ef0af398642a593ba04a7", - git_commit = "b299b2600d2be042aa8604f83ef494cea91adb4d", + sha256 = "8b1af1d571cad85f1038f47939be664cfabd58badf6a7ce7955a36760a59b7de", + git_commit = "a2939994e01e377f6ee9a40fdc49e4e1abb9f80b", ) # Import all of TensorFlow Serving's external dependencies. From 63acc954d7082f515a0c599991bab2ad4e87d449 Mon Sep 17 00:00:00 2001 From: Abolfazl Shahbazi Date: Mon, 22 Feb 2021 13:22:35 -0800 Subject: [PATCH 4762/8103] Remove extra build options for TF Serving --- tensorflow_serving/tools/docker/Dockerfile.devel-mkl | 5 +++-- tensorflow_serving/tools/docker/Dockerfile.mkl | 2 -- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl index 7c7119e6d3f..bdad49a161a 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl @@ -92,12 +92,13 @@ RUN curl -sSL --retry 5 https://github.com/tensorflow/serving/tarball/${TF_SERVI FROM base_build as binary_build # Build, and install TensorFlow Serving -ARG TF_SERVING_BUILD_OPTIONS="--config=mkl --config=release --config=build_with_mkl --config=enable_mkl --config=build_with_openmp" +ARG TF_SERVING_BUILD_OPTIONS="--config=mkl --config=release" + RUN echo "Building with build options: ${TF_SERVING_BUILD_OPTIONS}" ARG TF_SERVING_BAZEL_OPTIONS="" RUN echo "Building with Bazel options: ${TF_SERVING_BAZEL_OPTIONS}" -RUN bazel --host_jvm_args=-Xmx24g build --color=yes --curses=yes \ +RUN bazel build --color=yes --curses=yes \ ${TF_SERVING_BAZEL_OPTIONS} \ --verbose_failures \ --output_filter=DONT_MATCH_ANYTHING \ diff --git a/tensorflow_serving/tools/docker/Dockerfile.mkl b/tensorflow_serving/tools/docker/Dockerfile.mkl index 9a586864686..66e28c9bf5f 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.mkl +++ b/tensorflow_serving/tools/docker/Dockerfile.mkl @@ -36,8 +36,6 @@ COPY --from=build_image /usr/local/bin/tensorflow_model_server /usr/bin/tensorfl # Install MKL libraries COPY --from=build_image /usr/local/lib/libiomp5.so /usr/local/lib -COPY --from=build_image /usr/local/lib/libmklml_gnu.so /usr/local/lib -COPY --from=build_image /usr/local/lib/libmklml_intel.so /usr/local/lib ENV LIBRARY_PATH '/usr/local/lib:$LIBRARY_PATH' ENV LD_LIBRARY_PATH '/usr/local/lib:$LD_LIBRARY_PATH' From 652213a66266c0aafbcefaa7e09142759b4536e8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 22 Feb 2021 18:01:27 -0800 Subject: [PATCH 4763/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d1a02dab-bcbe-4dcc-bb52-f5c2bcb689ad PiperOrigin-RevId: 358945060 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c98254c3ba7..29ee51d4351 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8b1af1d571cad85f1038f47939be664cfabd58badf6a7ce7955a36760a59b7de", - git_commit = "a2939994e01e377f6ee9a40fdc49e4e1abb9f80b", + sha256 = "3f699924ce93caa0375a093d18b9c1516f1cb3c28f3fc0c58d66be3aa74ba068", + git_commit = "b60aff4c1ded72946e73edb12b678aed3fd7cf65", ) # Import all of TensorFlow Serving's external dependencies. From e1671cb64adb3782a94af6c67bdf77798651ba79 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 23 Feb 2021 00:01:38 -0800 Subject: [PATCH 4764/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3d0ebd7f-2bdd-4975-a15d-694ed4f6d287 PiperOrigin-RevId: 358986285 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 29ee51d4351..8b2c11eab5e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3f699924ce93caa0375a093d18b9c1516f1cb3c28f3fc0c58d66be3aa74ba068", - git_commit = "b60aff4c1ded72946e73edb12b678aed3fd7cf65", + sha256 = "6324637710ac843fb156eacdcb67e8c6c82e44fe824ac51ffed7e2ce1ee6a3de", + git_commit = "617fabc9f091be1b21b3602b98cf318f8f7ffe7f", ) # Import all of TensorFlow Serving's external dependencies. From 1fc8d3df2a74f2826c9af05b84ab8b2716d96ff1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 23 Feb 2021 06:01:31 -0800 Subject: [PATCH 4765/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0640a02b-2711-447f-9069-b32eaf2f3325 PiperOrigin-RevId: 359030314 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8b2c11eab5e..58816c56c88 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6324637710ac843fb156eacdcb67e8c6c82e44fe824ac51ffed7e2ce1ee6a3de", - git_commit = "617fabc9f091be1b21b3602b98cf318f8f7ffe7f", + sha256 = "14d1a8c9e1a4266c47d946574e8fe7b73be7b06c2461b78af8cebf5d0712bdb6", + git_commit = "ee6fa8155e966654f158dad7da06f0b708e9a650", ) # Import all of TensorFlow Serving's external dependencies. From 74780173555459f462e8f8be00bb5ce199df4fc2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 23 Feb 2021 12:02:10 -0800 Subject: [PATCH 4766/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3fd504b9-24c0-4947-ac7c-7f44bd5c4bdf PiperOrigin-RevId: 359100499 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 58816c56c88..daa67051887 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "14d1a8c9e1a4266c47d946574e8fe7b73be7b06c2461b78af8cebf5d0712bdb6", - git_commit = "ee6fa8155e966654f158dad7da06f0b708e9a650", + sha256 = "67b9000b2131a0d05342013b2b75719d012d665a9a0abf731f0001f16db849e7", + git_commit = "493b78098ffb172d66c77ff14f8870267b14e365", ) # Import all of TensorFlow Serving's external dependencies. From 9305be2421cc2200afbabe7ac850e7dc0ff01ade Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 23 Feb 2021 18:01:37 -0800 Subject: [PATCH 4767/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5829ecfa-13ec-4dac-ab8e-0698948b64a8 PiperOrigin-RevId: 359177445 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index daa67051887..b082a69cfc6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "67b9000b2131a0d05342013b2b75719d012d665a9a0abf731f0001f16db849e7", - git_commit = "493b78098ffb172d66c77ff14f8870267b14e365", + sha256 = "1f790a91f023ca2067e6c68c99881d7612ab516f3567c7f20bc42ecf4540fc0b", + git_commit = "33725f3c937747a0ec7b390d941606b20acbbf04", ) # Import all of TensorFlow Serving's external dependencies. From 01403ec18f2cce367fb926ca841da06c5a4c4bd7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 24 Feb 2021 00:02:05 -0800 Subject: [PATCH 4768/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a57071e5-4861-405e-81ee-5bf1051f268e PiperOrigin-RevId: 359222669 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b082a69cfc6..daaf5361603 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1f790a91f023ca2067e6c68c99881d7612ab516f3567c7f20bc42ecf4540fc0b", - git_commit = "33725f3c937747a0ec7b390d941606b20acbbf04", + sha256 = "ab5934d16e17e64ade8f02960789bac01f45f8c10f8091fabffea804371a5071", + git_commit = "65a8725672d6c863c44d5282a609858ecb33e2c5", ) # Import all of TensorFlow Serving's external dependencies. From 45ba6455d24393533f2626d773d1859b2cc9a1bf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 24 Feb 2021 06:01:33 -0800 Subject: [PATCH 4769/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/41b62425-ad88-47b4-8703-eaea1a634d8a PiperOrigin-RevId: 359266648 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index daaf5361603..f43c7819285 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ab5934d16e17e64ade8f02960789bac01f45f8c10f8091fabffea804371a5071", - git_commit = "65a8725672d6c863c44d5282a609858ecb33e2c5", + sha256 = "2fcbd8a1928cce6b9fb338983391a35e2f4a4dab218ffdfdd5ebcf47b623988f", + git_commit = "b1de80b78f1a9523e4bcdd6f906c8ebdf227d3fe", ) # Import all of TensorFlow Serving's external dependencies. From 389fdf48ad77c95bff194a049eee0616becf5bb0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 24 Feb 2021 12:01:35 -0800 Subject: [PATCH 4770/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/254ff0a1-3316-4024-9552-4a1084a4ba12 PiperOrigin-RevId: 359337977 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f43c7819285..410e0644c26 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2fcbd8a1928cce6b9fb338983391a35e2f4a4dab218ffdfdd5ebcf47b623988f", - git_commit = "b1de80b78f1a9523e4bcdd6f906c8ebdf227d3fe", + sha256 = "08dd02a925f9b13926b26f7b782e553bc7355719a137b197f34e49e93f318ad6", + git_commit = "ff851e496de52e985f62d78cd4ed9f56a8201aad", ) # Import all of TensorFlow Serving's external dependencies. From 2a601df4c9fdf678b7a70496a3a3df8bafebbcef Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 24 Feb 2021 18:01:22 -0800 Subject: [PATCH 4771/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/cb2c3f45-3c68-4ce0-bb25-7f10dc784a6f PiperOrigin-RevId: 359414052 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 410e0644c26..c39513fdb6b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "08dd02a925f9b13926b26f7b782e553bc7355719a137b197f34e49e93f318ad6", - git_commit = "ff851e496de52e985f62d78cd4ed9f56a8201aad", + sha256 = "73360613e760474c5efd609562f466dc19ba71e722726e6be34962468d7b1f37", + git_commit = "c023a829167aa4a233a36479cd338ef9784b6990", ) # Import all of TensorFlow Serving's external dependencies. From bb51722b1dea8d139c46e2fe6fb52fa379da164c Mon Sep 17 00:00:00 2001 From: Jaesung Chung Date: Wed, 24 Feb 2021 19:25:20 -0800 Subject: [PATCH 4772/8103] Remove hashtable custom op dependencies Now, hashtable use cases are covered by TFLite builtin ops. PiperOrigin-RevId: 359425197 --- tensorflow_serving/servables/tensorflow/BUILD | 1 - .../servables/tensorflow/tflite_interpreter_pool.cc | 3 --- tensorflow_serving/servables/tensorflow/tflite_session.cc | 2 -- 3 files changed, 6 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index 04ddf572452..a8ebf56da7c 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -338,7 +338,6 @@ cc_library( "@org_tensorflow//tensorflow/lite/delegates/flex:delegate", "@org_tensorflow//tensorflow/lite/kernels:builtin_ops", "@org_tensorflow//tensorflow/lite/kernels:cpu_backend_context", - "@org_tensorflow//tensorflow/lite/kernels/hashtable:hashtable_op_kernels", "@org_tensorflow//tensorflow/lite/kernels/internal:tensor_utils", "@org_tensorflow//tensorflow/lite/kernels/parse_example", "@org_tensorflow//tensorflow/lite/profiling:profile_summarizer", diff --git a/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.cc b/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.cc index b459b0f8b8e..a4d22b0c171 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.cc @@ -20,7 +20,6 @@ limitations under the License. #include #include "tensorflow/core/platform/errors.h" -#include "tensorflow/lite/kernels/hashtable/hashtable_ops.h" #include "tensorflow/lite/kernels/parse_example/parse_example.h" #include "tensorflow/lite/kernels/register.h" @@ -158,8 +157,6 @@ tensorflow::Status TfLiteInterpreterPool::CreateTfLiteInterpreterPool( // TODO(b/140959776): Add support for non-builtin ops (flex or custom ops). tflite::ops::builtin::BuiltinOpResolver resolver; tflite::ops::custom::AddParseExampleOp(&resolver); - // TODO(b/165643512): Remove adding Hashtable to resolver by default. - tflite::ops::custom::AddHashtableOps(&resolver); int fixed_batch_size = 1; if (use_batch_parallelism) { if (num_interpreters < 1) { diff --git a/tensorflow_serving/servables/tensorflow/tflite_session.cc b/tensorflow_serving/servables/tensorflow/tflite_session.cc index 03d475f7030..89eaff25c26 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session.cc @@ -25,7 +25,6 @@ limitations under the License. #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/lite/c/common.h" #include "tensorflow/lite/kernels/cpu_backend_context.h" -#include "tensorflow/lite/kernels/hashtable/hashtable_ops.h" #include "tensorflow/lite/kernels/internal/tensor_utils.h" #include "tensorflow/lite/kernels/parse_example/parse_example.h" #include "tensorflow/lite/kernels/register.h" @@ -380,7 +379,6 @@ Status TfLiteSession::Create(string&& buffer, const SessionOptions& options, tflite::ops::builtin::BuiltinOpResolver resolver; tflite::ops::custom::AddParseExampleOp(&resolver); - tflite::ops::custom::AddHashtableOps(&resolver); std::unique_ptr interpreter; if (tflite::InterpreterBuilder(*model, resolver)(&interpreter) != kTfLiteOk) { From 5b2f8f6094d79312a3ca4b8be3684e48a0525995 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 25 Feb 2021 00:01:38 -0800 Subject: [PATCH 4773/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0c6d6365-f3c5-47b6-a825-17f92456ee0b PiperOrigin-RevId: 359458856 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c39513fdb6b..15778a99df3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "73360613e760474c5efd609562f466dc19ba71e722726e6be34962468d7b1f37", - git_commit = "c023a829167aa4a233a36479cd338ef9784b6990", + sha256 = "b24f7862cc4969ca7bb984de126f1c5fa14a8de4c1913bbdbd351dcbeb45530e", + git_commit = "653c5a7455e9b9f10bf6b33daa0282a489ad0d16", ) # Import all of TensorFlow Serving's external dependencies. From 3719068dc30f9af1a1990de5bff9b011eb5c37a6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 25 Feb 2021 06:01:30 -0800 Subject: [PATCH 4774/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ef3cb55e-eb8e-416d-879c-e58d3b44a562 PiperOrigin-RevId: 359503951 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 15778a99df3..7f47f5ed068 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b24f7862cc4969ca7bb984de126f1c5fa14a8de4c1913bbdbd351dcbeb45530e", - git_commit = "653c5a7455e9b9f10bf6b33daa0282a489ad0d16", + sha256 = "6ed8608f6b819ff6764cc51adce6b0270d2dd4a0f653851eeff8753c39aa9154", + git_commit = "ed97d03e9fd8d8a8d26ec9a1c7395b63e74e7544", ) # Import all of TensorFlow Serving's external dependencies. From 6287cb42734438ae2430ee480bfa57b3d734efbc Mon Sep 17 00:00:00 2001 From: kiddos Date: Fri, 26 Feb 2021 02:27:41 +0800 Subject: [PATCH 4775/8103] allow http OPTIONS request and add default OPTIONS request handling --- tensorflow_serving/model_servers/http_rest_api_handler.cc | 2 ++ .../util/net_http/server/internal/evhttp_server.cc | 3 +++ 2 files changed, 5 insertions(+) diff --git a/tensorflow_serving/model_servers/http_rest_api_handler.cc b/tensorflow_serving/model_servers/http_rest_api_handler.cc index d87b2586c07..73552879861 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler.cc +++ b/tensorflow_serving/model_servers/http_rest_api_handler.cc @@ -105,6 +105,8 @@ Status HttpRestApiHandler::ProcessRequest( status = ProcessModelStatusRequest(*model_name, model_version, model_version_label, output); } + } else if (http_method == "OPTIONS") { + status = Status::OK(); } MakeJsonFromStatus(status, output); diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc b/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc index a3b77b5a5d8..24e0ebc1cde 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc @@ -105,6 +105,9 @@ bool EvHTTPServer::Initialize() { return false; } + evhttp_set_allowed_methods(ev_http_, + EVHTTP_REQ_GET | EVHTTP_REQ_POST | EVHTTP_REQ_HEAD | + EVHTTP_REQ_PUT | EVHTTP_REQ_DELETE | EVHTTP_REQ_OPTIONS); evhttp_set_gencb(ev_http_, &DispatchEvRequestFn, this); return true; From 74893a8276c9a428a85c843af26e609747c27284 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 25 Feb 2021 12:01:25 -0800 Subject: [PATCH 4776/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/20516f84-8569-43b1-8bf0-5c5f61fc0104 PiperOrigin-RevId: 359580067 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7f47f5ed068..62bfea9f962 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6ed8608f6b819ff6764cc51adce6b0270d2dd4a0f653851eeff8753c39aa9154", - git_commit = "ed97d03e9fd8d8a8d26ec9a1c7395b63e74e7544", + sha256 = "d88b44202ba75a7ec4a6819954ff94c203a091f7a691520cb025e2a448fd4249", + git_commit = "5ab395bcb68d42433fbe1354bef91dba88575850", ) # Import all of TensorFlow Serving's external dependencies. From c1fa430f104b0ad6dd95c180f533e1dd92a7e67f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 25 Feb 2021 18:01:23 -0800 Subject: [PATCH 4777/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d1c3e59f-7baf-47fa-9fba-5185b58e2550 PiperOrigin-RevId: 359657366 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 62bfea9f962..13730e4a0b2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d88b44202ba75a7ec4a6819954ff94c203a091f7a691520cb025e2a448fd4249", - git_commit = "5ab395bcb68d42433fbe1354bef91dba88575850", + sha256 = "d03584f289daab202ef470f0b0d80f7095bc819c9ce8a25cbae93a8c53e2afe7", + git_commit = "b2c02008c09cf74d6a53ba0ab977bec3f15510cb", ) # Import all of TensorFlow Serving's external dependencies. From 2530a336ccff3fa202fd24967562d1bbe0055a6c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 25 Feb 2021 21:17:29 -0800 Subject: [PATCH 4778/8103] Enable aspired version which failed to load to attempt reload. PiperOrigin-RevId: 359681721 --- .../core/aspired_versions_manager.cc | 31 ++++++- .../core/aspired_versions_manager.h | 8 ++ .../core/aspired_versions_manager_test.cc | 86 +++++++++++++++++-- .../model_servers/server_core.cc | 2 + .../model_servers/server_core.h | 4 + 5 files changed, 123 insertions(+), 8 deletions(-) diff --git a/tensorflow_serving/core/aspired_versions_manager.cc b/tensorflow_serving/core/aspired_versions_manager.cc index 3436e42bd62..98fb7860aca 100644 --- a/tensorflow_serving/core/aspired_versions_manager.cc +++ b/tensorflow_serving/core/aspired_versions_manager.cc @@ -170,6 +170,8 @@ Status AspiredVersionsManager::Create( manager->reset(new AspiredVersionsManager( options.manage_state_interval_micros, options.env, std::move(options.aspired_version_policy), std::move(basic_manager))); + (manager->get())->enable_reload_servables_with_error_ = + options.enable_reload_servables_with_error; return Status::OK(); } @@ -261,12 +263,16 @@ void AspiredVersionsManager::ProcessAspiredVersionsRequest( // 2. Set the aspired bool to false for all current servable harnesses which // are not aspired. std::set current_aspired_versions; + std::set current_aspired_versions_with_error; const std::vector> state_snapshots = basic_manager_->GetManagedServableStateSnapshots( string(servable_name)); for (const ServableStateSnapshot& state_snapshot : state_snapshots) { if (state_snapshot.additional_state->is_aspired) { current_aspired_versions.insert(state_snapshot.id.version); + if (state_snapshot.state == LoaderHarness::State::kError) { + current_aspired_versions_with_error.insert(state_snapshot.id.version); + } } // If this version is not part of the aspired versions. if (std::find(next_aspired_versions.begin(), next_aspired_versions.end(), @@ -290,10 +296,31 @@ void AspiredVersionsManager::ProcessAspiredVersionsRequest( // We go through the aspired_servable_versions, pull out the versions which // need to be added and add them to the harness map. for (auto& version : versions) { - // if this aspired version is not already present in the map. + bool should_add = false; if (std::find(additions.begin(), additions.end(), version.id().version) != additions.end()) { - VLOG(1) << "Adding " << version.id() << " to BasicManager"; + should_add = true; + } + if (enable_reload_servables_with_error_ && + std::find(current_aspired_versions_with_error.begin(), + current_aspired_versions_with_error.end(), + version.id().version) != + current_aspired_versions_with_error.end()) { + ServableId id; + id.name = servable_name; + id.version = version.id().version; + const Status manage_status = basic_manager_->StopManagingServable(id); + DCHECK(manage_status.ok()) << manage_status.error_message(); + if (!manage_status.ok()) { + LOG(ERROR) << "Internal error: Unable to clear errored servable " + << version.id().DebugString() << " from 'basic_manager_': " + << manage_status.error_message(); + } + should_add = true; + } + + // if this aspired version is not already present in the map. + if (should_add) { const Status manage_status = basic_manager_->ManageServableWithAdditionalState( std::move(version), std::unique_ptr(new Aspired{true})); diff --git a/tensorflow_serving/core/aspired_versions_manager.h b/tensorflow_serving/core/aspired_versions_manager.h index d0395d72510..133305d271f 100644 --- a/tensorflow_serving/core/aspired_versions_manager.h +++ b/tensorflow_serving/core/aspired_versions_manager.h @@ -140,6 +140,10 @@ class AspiredVersionsManager : public Manager, /// Callback to be called just before a servable is to be loaded. This will /// called on the same manager load thread which starts the load. PreLoadHook pre_load_hook; + + // For servables which end with LoaderHarness::State::kError, enable + // future attempts at reload to progress. + bool enable_reload_servables_with_error = false; }; static Status Create(Options options, std::unique_ptr* manager); @@ -315,6 +319,10 @@ class AspiredVersionsManager : public Manager, // This is declared last here so that it is deleted before basic_manager_. std::unique_ptr> set_num_load_threads_observer_; + // For servables which end with LoaderHarness::State::kError, enable + // future attempts at reload to progress. + bool enable_reload_servables_with_error_ = false; + TF_DISALLOW_COPY_AND_ASSIGN(AspiredVersionsManager); }; diff --git a/tensorflow_serving/core/aspired_versions_manager_test.cc b/tensorflow_serving/core/aspired_versions_manager_test.cc index 6761afb7a93..a18333e4b0a 100644 --- a/tensorflow_serving/core/aspired_versions_manager_test.cc +++ b/tensorflow_serving/core/aspired_versions_manager_test.cc @@ -69,12 +69,13 @@ struct ThreadPoolSizes { uint64 num_unload_threads; }; class AspiredVersionsManagerTest - : public ::testing::TestWithParam { + : public ::testing::TestWithParam> { protected: AspiredVersionsManagerTest() : servable_event_bus_(EventBus::CreateEventBus()), servable_state_monitor_(servable_event_bus_.get()), - thread_pool_sizes_(GetParam()) { + thread_pool_sizes_(std::get<0>(GetParam())), + enable_reload_servables_with_error_(std::get<1>(GetParam())) { AspiredVersionsManager::Options manager_options; manager_options.num_load_threads = thread_pool_sizes_.num_load_threads; manager_options.num_unload_threads = thread_pool_sizes_.num_unload_threads; @@ -87,6 +88,8 @@ class AspiredVersionsManagerTest max_num_load_retries_ = 1; manager_options.max_num_load_retries = max_num_load_retries_; manager_options.load_retry_interval_micros = 0; + manager_options.enable_reload_servables_with_error = + enable_reload_servables_with_error_; TF_CHECK_OK( AspiredVersionsManager::Create(std::move(manager_options), &manager_)); } @@ -152,16 +155,25 @@ class AspiredVersionsManagerTest ServableStateMonitor servable_state_monitor_; ThreadPoolSizes thread_pool_sizes_; uint32 max_num_load_retries_; + bool enable_reload_servables_with_error_; std::unique_ptr manager_; }; INSTANTIATE_TEST_CASE_P( WithOrWithoutThreadPools, AspiredVersionsManagerTest, ::testing::Values( - ThreadPoolSizes{0, 0} /* without load or unload threadpools */, - ThreadPoolSizes{2, 0} /* with just a load threadpool */, - ThreadPoolSizes{0, 2} /* with just an unload threadpool */, - ThreadPoolSizes{4, 4} /* with load and unload threadpools */)); + // without load or unload threadpools + std::make_tuple(ThreadPoolSizes{0, 0}, false), + // with just a load threadpool + std::make_tuple(ThreadPoolSizes{2, 0}, false), + // with just an unload threadpool + std::make_tuple(ThreadPoolSizes{0, 2}, false), + // with load and unload threadpools + std::make_tuple(ThreadPoolSizes{4, 4}, false), + // without load or unload threadpools and retries of failed loads + std::make_tuple(ThreadPoolSizes{0, 0}, true), + // with load and unload threadpools and retries of failed loads + std::make_tuple(ThreadPoolSizes{4, 4}, true))); TEST_P(AspiredVersionsManagerTest, ServableHandleNotFoundMissingLoaderName) { ServableHandle handle; @@ -237,6 +249,68 @@ TEST_P(AspiredVersionsManagerTest, ServableHandleLatestVersionIsZero) { EXPECT_EQ(id, handle.id()); } +TEST_P(AspiredVersionsManagerTest, ReloadAspiredError) { + const char kServableName[] = "kAspiredError"; + auto callback_fn = manager_->GetAspiredVersionsCallback(); + // First, load a working Servable under version 1. + { + std::vector>> aspired_versions; + const ServableId id = {kServableName, 1}; + aspired_versions.push_back(CreateAspiredVersion(id)); + callback_fn(kServableName, std::move(aspired_versions)); + HandlePendingAspiredVersionsRequests(); + InvokePolicyAndExecuteAction(); + WaitUntilServableManagerStateIsOneOf( + servable_state_monitor_, id, {ServableState::ManagerState::kAvailable}); + ServableHandle handle; + const Status status = manager_->GetServableHandle( + ServableRequest::Latest(kServableName), &handle); + TF_ASSERT_OK(status); + EXPECT_EQ(1, *handle); + EXPECT_EQ(id, handle.id()); + } + // Having a failing servable load for version 2. + { + std::vector>> aspired_versions; + const ServableId id = {kServableName, 2}; + aspired_versions.push_back(CreateErroneousAspiredVersion(id)); + callback_fn(kServableName, std::move(aspired_versions)); + HandlePendingAspiredVersionsRequests(); + InvokePolicyAndExecuteAction(); + WaitUntilServableManagerStateIsOneOf(servable_state_monitor_, id, + {ServableState::ManagerState::kEnd}); + ServableHandle handle; + Status status = manager_->GetServableHandle( + ServableRequest::Specific(kServableName, 2), &handle); + EXPECT_FALSE(status.ok()) << status; + } + // Attempt to reload servable for version 2. + { + std::vector>> aspired_versions; + const ServableId id = {kServableName, 2}; + aspired_versions.push_back(CreateAspiredVersion(id)); + callback_fn(kServableName, std::move(aspired_versions)); + HandlePendingAspiredVersionsRequests(); + InvokePolicyAndExecuteAction(); + if (enable_reload_servables_with_error_) { + WaitUntilServableManagerStateIsOneOf( + servable_state_monitor_, id, + {ServableState::ManagerState::kAvailable}); + ServableHandle handle; + Status status = manager_->GetServableHandle( + ServableRequest::Specific(kServableName, 2), &handle); + TF_ASSERT_OK(status) << status; + } else { + // Sleep for 1ms. There's nothing to wait on as the state will not change. + Env::Default()->SleepForMicroseconds(1000 /* 1 ms */); + ServableHandle handle; + Status status = manager_->GetServableHandle( + ServableRequest::Specific(kServableName, 2), &handle); + EXPECT_FALSE(status.ok()) << status; + } + } +} + TEST_P(AspiredVersionsManagerTest, ServableHandleSpecificVersion) { ServableHandle handle; const ServableId id = {kServableName2, 0}; diff --git a/tensorflow_serving/model_servers/server_core.cc b/tensorflow_serving/model_servers/server_core.cc index 93c7d5977d6..ac850a30f44 100644 --- a/tensorflow_serving/model_servers/server_core.cc +++ b/tensorflow_serving/model_servers/server_core.cc @@ -741,6 +741,8 @@ Status ServerCore::CreateAspiredVersionsManager( options_.load_retry_interval_micros; manager_options.pre_load_hook = std::move(options_.pre_load_hook); manager_options.flush_filesystem_caches = options_.flush_filesystem_caches; + manager_options.enable_reload_servables_with_error = + options_.enable_reload_servables_with_error; const tensorflow::Status status = AspiredVersionsManager::Create(std::move(manager_options), manager); if (!status.ok()) { diff --git a/tensorflow_serving/model_servers/server_core.h b/tensorflow_serving/model_servers/server_core.h index 6ddf50b1074..34984bf45e8 100644 --- a/tensorflow_serving/model_servers/server_core.h +++ b/tensorflow_serving/model_servers/server_core.h @@ -160,6 +160,10 @@ class ServerCore : public Manager { ABSL_DEPRECATED("Use servable_versions_always_present.") bool fail_if_no_model_versions_found = false; + // For servables which end with LoaderHarness::State::kError, enable + // future attempts at reload to progress. + bool enable_reload_servables_with_error = false; + // If set to true, the server will fail to start up (or fail a config // reload) if, for any configured model, no versions of the model are found // in the filesystem under the model's base path. In addition, if the From 2e9edd32f53664daf384acdda15ac1af397f7c31 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 26 Feb 2021 00:01:20 -0800 Subject: [PATCH 4779/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/793a0cb1-1ad0-409e-a6d3-98b49f351ea4 PiperOrigin-RevId: 359701290 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 13730e4a0b2..5ef6d619596 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d03584f289daab202ef470f0b0d80f7095bc819c9ce8a25cbae93a8c53e2afe7", - git_commit = "b2c02008c09cf74d6a53ba0ab977bec3f15510cb", + sha256 = "798b345246d0200e6ded624951779fbd22a9ebf088e9729a70d1df1939047bf8", + git_commit = "d138cfc2471ff47c6e028ca49b69eb60cd900ab7", ) # Import all of TensorFlow Serving's external dependencies. From 4ca9a4b41402597fea4933893cac2639d23d7ded Mon Sep 17 00:00:00 2001 From: Zhuo Peng Date: Fri, 26 Feb 2021 11:17:24 -0800 Subject: [PATCH 4780/8103] Fixed a compilation error in aspired_versions_manager.cc PiperOrigin-RevId: 359798047 --- tensorflow_serving/core/aspired_versions_manager.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/core/aspired_versions_manager.cc b/tensorflow_serving/core/aspired_versions_manager.cc index 98fb7860aca..81893ddb820 100644 --- a/tensorflow_serving/core/aspired_versions_manager.cc +++ b/tensorflow_serving/core/aspired_versions_manager.cc @@ -307,7 +307,7 @@ void AspiredVersionsManager::ProcessAspiredVersionsRequest( version.id().version) != current_aspired_versions_with_error.end()) { ServableId id; - id.name = servable_name; + id.name = std::string(servable_name); id.version = version.id().version; const Status manage_status = basic_manager_->StopManagingServable(id); DCHECK(manage_status.ok()) << manage_status.error_message(); From ca7206a85b711358389ebf719c11d0fb08e363fb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 26 Feb 2021 18:01:42 -0800 Subject: [PATCH 4781/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8ac6c2b5-f377-48e1-af8e-c56c49c0200a PiperOrigin-RevId: 359875350 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5ef6d619596..d165bfc1674 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "798b345246d0200e6ded624951779fbd22a9ebf088e9729a70d1df1939047bf8", - git_commit = "d138cfc2471ff47c6e028ca49b69eb60cd900ab7", + sha256 = "47bcc96c63db3bfe7c341e30777770af617040c5c1aadd15b7e513c90b8c5580", + git_commit = "cd8dd009b31f80344bd69f8dc5b404b5189646a5", ) # Import all of TensorFlow Serving's external dependencies. From 197c25082f223f0d54a78044971cb19d2508a08b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 27 Feb 2021 00:01:27 -0800 Subject: [PATCH 4782/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3a3785ea-a49d-4daa-a69b-eb00a14a0af0 PiperOrigin-RevId: 359906840 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d165bfc1674..c37957bab5d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "47bcc96c63db3bfe7c341e30777770af617040c5c1aadd15b7e513c90b8c5580", - git_commit = "cd8dd009b31f80344bd69f8dc5b404b5189646a5", + sha256 = "2ec4c43f17c0a585b27abe153329e7596f5a2738e45b4391938e0d09d4af0e7e", + git_commit = "d5e94aebdd8e3ab7a61502eb98d8eaea5b864a92", ) # Import all of TensorFlow Serving's external dependencies. From e21917007db0cff6b25969be3756f7948c33d53a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 27 Feb 2021 06:01:16 -0800 Subject: [PATCH 4783/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/30764cca-97a3-4c77-835f-5024aab6ad3c PiperOrigin-RevId: 359932184 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c37957bab5d..c5bba93c6a3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2ec4c43f17c0a585b27abe153329e7596f5a2738e45b4391938e0d09d4af0e7e", - git_commit = "d5e94aebdd8e3ab7a61502eb98d8eaea5b864a92", + sha256 = "d5d97cd53a79b43532b4cbb2389a6a14ef46689113fd134671c0309890ac2a3f", + git_commit = "32b8a33edbc6b4e0be0c9a1d435a14382671c2dc", ) # Import all of TensorFlow Serving's external dependencies. From 4faa3ccc121297a86591af55f73dea75f94f08e2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Mar 2021 00:01:53 -0800 Subject: [PATCH 4784/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ff615feb-84ea-4637-8332-c96b1365553d PiperOrigin-RevId: 360119550 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c5bba93c6a3..caff8c6d373 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d5d97cd53a79b43532b4cbb2389a6a14ef46689113fd134671c0309890ac2a3f", - git_commit = "32b8a33edbc6b4e0be0c9a1d435a14382671c2dc", + sha256 = "9d087724916d9d077729c24b7cd3363ceebc01b6a15bf5aed6e80c02ba8562f6", + git_commit = "b08c055e8405e87e833c25d2f4a1cadd04b95941", ) # Import all of TensorFlow Serving's external dependencies. From f4fd82343d5cd12849d66515739e5005aef7e6a7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Mar 2021 06:01:22 -0800 Subject: [PATCH 4785/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fffbe713-c784-4960-9138-dd0d03e7bdbb PiperOrigin-RevId: 360168877 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index caff8c6d373..a2a308f6394 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9d087724916d9d077729c24b7cd3363ceebc01b6a15bf5aed6e80c02ba8562f6", - git_commit = "b08c055e8405e87e833c25d2f4a1cadd04b95941", + sha256 = "28a31976ac650cf6b9cca4c92e7a62a314f2e6d34c564d195fcefca30942b684", + git_commit = "989b315e048ad1084bea3c28726eabdf4a6ccabf", ) # Import all of TensorFlow Serving's external dependencies. From 51207fb96909ee71162c2632a6655ced5ad8814e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Mar 2021 12:01:28 -0800 Subject: [PATCH 4786/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d94ce34b-da89-4ef4-9a29-3328bbc46f9b PiperOrigin-RevId: 360244253 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a2a308f6394..af8be9f2cc6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "28a31976ac650cf6b9cca4c92e7a62a314f2e6d34c564d195fcefca30942b684", - git_commit = "989b315e048ad1084bea3c28726eabdf4a6ccabf", + sha256 = "166b3219c15ded7953fe992dc4536ea642629a64537169938cd3ae1f71823ab5", + git_commit = "f5ef2238aeffa77d7f778659b5800f2f3c6723af", ) # Import all of TensorFlow Serving's external dependencies. From f8f15e23849fd44ed90bdde67c1693dd542e4c7a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Mar 2021 18:01:17 -0800 Subject: [PATCH 4787/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5046019e-12b2-4161-afe0-70a283885db1 PiperOrigin-RevId: 360319968 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index af8be9f2cc6..8dc4af95c3d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "166b3219c15ded7953fe992dc4536ea642629a64537169938cd3ae1f71823ab5", - git_commit = "f5ef2238aeffa77d7f778659b5800f2f3c6723af", + sha256 = "38fceb6e608486ec686eab49b2a749abfef0fc3765f75437062dcc19f8364200", + git_commit = "3a9288b359365be04367ba1106cf465a0326af48", ) # Import all of TensorFlow Serving's external dependencies. From cb9d56e21d81ab24e45d6c4ec069e7398215d0e3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Mar 2021 00:01:50 -0800 Subject: [PATCH 4788/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/47ef2718-921a-4fe2-8f77-b3793a47bb98 PiperOrigin-RevId: 360365561 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8dc4af95c3d..8ed5f213201 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "38fceb6e608486ec686eab49b2a749abfef0fc3765f75437062dcc19f8364200", - git_commit = "3a9288b359365be04367ba1106cf465a0326af48", + sha256 = "338a7d98136259a02866818cd30f0d6d76551ad14e53a075404a5c3dddf5f610", + git_commit = "b9ce1f83a7e7ffe3d7784f6c2d03b3e2b093f4bc", ) # Import all of TensorFlow Serving's external dependencies. From 6c6653058f71d3d02b63ad8c46a793273f8c327c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Mar 2021 06:02:13 -0800 Subject: [PATCH 4789/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2c4666be-46d3-4e99-a351-8b01fb8ec93e PiperOrigin-RevId: 360410534 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8ed5f213201..2311c489f47 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "338a7d98136259a02866818cd30f0d6d76551ad14e53a075404a5c3dddf5f610", - git_commit = "b9ce1f83a7e7ffe3d7784f6c2d03b3e2b093f4bc", + sha256 = "a1ad0fd3324342262179fd05bb0facf6cc2866eabb1b74e28ab60a325db6b762", + git_commit = "62dfa9e1bf26c58cae6aaa0663d69a872f543dc1", ) # Import all of TensorFlow Serving's external dependencies. From c51214134671d565f541fa5ef2a1a63226fb53e3 Mon Sep 17 00:00:00 2001 From: kiddos Date: Wed, 3 Mar 2021 03:01:02 +0800 Subject: [PATCH 4790/8103] handle options requests and check if Origin header exists --- .../model_servers/http_rest_api_handler.cc | 2 -- tensorflow_serving/model_servers/http_server.cc | 13 ++++++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/tensorflow_serving/model_servers/http_rest_api_handler.cc b/tensorflow_serving/model_servers/http_rest_api_handler.cc index 73552879861..d87b2586c07 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler.cc +++ b/tensorflow_serving/model_servers/http_rest_api_handler.cc @@ -105,8 +105,6 @@ Status HttpRestApiHandler::ProcessRequest( status = ProcessModelStatusRequest(*model_name, model_version, model_version_label, output); } - } else if (http_method == "OPTIONS") { - status = Status::OK(); } MakeJsonFromStatus(status, output); diff --git a/tensorflow_serving/model_servers/http_server.cc b/tensorflow_serving/model_servers/http_server.cc index e35f38f03ee..213b70dc29c 100644 --- a/tensorflow_serving/model_servers/http_server.cc +++ b/tensorflow_serving/model_servers/http_server.cc @@ -160,9 +160,20 @@ class RestApiRequestDispatcher { string output; VLOG(1) << "Processing HTTP request: " << req->http_method() << " " << req->uri_path() << " body: " << body.size() << " bytes."; - const auto status = + auto status = handler_->ProcessRequest(req->http_method(), req->uri_path(), body, &headers, &model_name, &method, &output); + + if (req->http_method() == "OPTIONS") { + absl::string_view origin_header = req->GetRequestHeader("Origin"); + if (RE2::PartialMatch(origin_header, "https?://")) { + status = Status::OK(); + } else { + status = errors::FailedPrecondition( + "Origin header not found in request: ", req->http_method()); + } + } + const auto http_status = ToHTTPStatusCode(status); // Note: we add headers+output for non successful status too, in case the // output contains details about the error (e.g. error messages). From 9edd6dd23a0cef306696b1277dd17c749737c3e0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Mar 2021 12:01:53 -0800 Subject: [PATCH 4791/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/cfbcd497-dbe7-4d4c-8a2d-276f6070d1e0 PiperOrigin-RevId: 360482998 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2311c489f47..90475c4d0df 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a1ad0fd3324342262179fd05bb0facf6cc2866eabb1b74e28ab60a325db6b762", - git_commit = "62dfa9e1bf26c58cae6aaa0663d69a872f543dc1", + sha256 = "79345624069b282b33ce5489b31f72c85e3e02abb2fb1a5e3da47e8625daf2be", + git_commit = "1e759a288300b3d4caf895b7936e03c3f2e9706f", ) # Import all of TensorFlow Serving's external dependencies. From 23f624bb1439bc6de9c4c8f76606347763480b18 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Mar 2021 18:01:21 -0800 Subject: [PATCH 4792/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/65c45db6-9b83-47e3-b698-035319b4e472 PiperOrigin-RevId: 360557592 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 90475c4d0df..b1598495d34 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "79345624069b282b33ce5489b31f72c85e3e02abb2fb1a5e3da47e8625daf2be", - git_commit = "1e759a288300b3d4caf895b7936e03c3f2e9706f", + sha256 = "925410fa95b04106f001f330c20ce9c8f1853d74510d16e07ca7997c89f68fc1", + git_commit = "06a07eced4b86da2ed07d57bd704e08d9ca8ba4a", ) # Import all of TensorFlow Serving's external dependencies. From 549afe6e485053d52adf84ba857d9c950562432d Mon Sep 17 00:00:00 2001 From: Haiming Bao Date: Wed, 3 Mar 2021 11:10:06 -0800 Subject: [PATCH 4793/8103] Internal changes PiperOrigin-RevId: 360713639 --- tensorflow_serving/g3doc/docker.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/g3doc/docker.md b/tensorflow_serving/g3doc/docker.md index 49be9692bb6..a335aa71005 100644 --- a/tensorflow_serving/g3doc/docker.md +++ b/tensorflow_serving/g3doc/docker.md @@ -282,7 +282,7 @@ Exporting HTTP/REST API at:localhost:8501 ... To query the model using the predict API, you can run ```shell -$ curl -d '{"instances": [1.0, 2.0, 5.0]}' \ +curl -d '{"instances": [1.0, 2.0, 5.0]}' \ -X POST http://localhost:8501/v1/models/half_plus_two:predict ``` From e5c3aec49d28b06f98967a609129862d81b61019 Mon Sep 17 00:00:00 2001 From: Tianrun Li Date: Fri, 5 Mar 2021 13:49:16 -0800 Subject: [PATCH 4794/8103] Add "_r" root event annotation to ProcessBatch events. PiperOrigin-RevId: 361217646 --- tensorflow_serving/batching/batching_session.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/batching/batching_session.cc b/tensorflow_serving/batching/batching_session.cc index 9519cc73260..1132e76f35c 100644 --- a/tensorflow_serving/batching/batching_session.cc +++ b/tensorflow_serving/batching/batching_session.cc @@ -335,8 +335,9 @@ Status BatchingSession::InternalRun( } profiler::TraceMe trace_me([this] { - return profiler::TraceMeEncode("BatchingSessionRun", - {{"thread_pool_name", thread_pool_name_}}); + return profiler::TraceMeEncode( + "BatchingSessionRun", + {{"thread_pool_name", thread_pool_name_}, {"_r", 1} /*root_event*/}); }); const TensorSignature signature = TensorSignatureFromRunArgs(inputs, output_tensor_names); From e33f53b4f1e01106e5348d068e5804c2b4de4385 Mon Sep 17 00:00:00 2001 From: Chao Xie Date: Thu, 11 Mar 2021 21:26:04 -0800 Subject: [PATCH 4795/8103] Make Internal Change. PiperOrigin-RevId: 362444748 --- .../servables/tensorflow/predict_util.cc | 17 ----------------- tensorflow_serving/servables/tensorflow/util.cc | 7 +++++++ tensorflow_serving/servables/tensorflow/util.h | 13 +++++++++++++ .../servables/tensorflow/util_test.cc | 15 +++++++++++++++ 4 files changed, 35 insertions(+), 17 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/predict_util.cc b/tensorflow_serving/servables/tensorflow/predict_util.cc index b0b41ae1436..72589d1f18a 100644 --- a/tensorflow_serving/servables/tensorflow/predict_util.cc +++ b/tensorflow_serving/servables/tensorflow/predict_util.cc @@ -46,23 +46,6 @@ Status VerifySignature(const SignatureDef& signature) { return Status::OK(); } -template -std::set GetMapKeys(const T& proto_map) { - std::set keys; - for (const auto& it : proto_map) { - keys.insert(it.first); - } - return keys; -} - -// Returns a \ b, i.e. all items that are in `set_a` but not in `set_b`. -std::set SetDifference(std::set set_a, std::set set_b) { - std::set result; - std::set_difference(set_a.begin(), set_a.end(), set_b.begin(), set_b.end(), - std::inserter(result, result.end())); - return result; -} - Status VerifyRequestInputsSize(const SignatureDef& signature, const PredictRequest& request) { if (request.inputs().size() != signature.inputs().size()) { diff --git a/tensorflow_serving/servables/tensorflow/util.cc b/tensorflow_serving/servables/tensorflow/util.cc index 64494eade8c..ec047e8adbc 100644 --- a/tensorflow_serving/servables/tensorflow/util.cc +++ b/tensorflow_serving/servables/tensorflow/util.cc @@ -334,5 +334,12 @@ void RecordRequestLatency(const string& model_name, const string& api, request_latency->GetCell(model_name, api, entrypoint)->Add(latency_usec); } +std::set SetDifference(std::set set_a, std::set set_b) { + std::set result; + std::set_difference(set_a.begin(), set_a.end(), set_b.begin(), set_b.end(), + std::inserter(result, result.end())); + return result; +} + } // namespace serving } // namespace tensorflow diff --git a/tensorflow_serving/servables/tensorflow/util.h b/tensorflow_serving/servables/tensorflow/util.h index 123aa392239..41c4da4aa81 100644 --- a/tensorflow_serving/servables/tensorflow/util.h +++ b/tensorflow_serving/servables/tensorflow/util.h @@ -121,6 +121,19 @@ void RecordRuntimeLatency(const string& model_name, const string& api, void RecordRequestLatency(const string& model_name, const string& api, const string& entrypoint, int64 latency_usec); +// Get string keys of a map. +template +std::set GetMapKeys(const T& map) { + std::set keys; + for (const auto& it : map) { + keys.insert(it.first); + } + return keys; +} + +// Returns a \ b, i.e. all items that are in `set_a` but not in `set_b`. +std::set SetDifference(std::set set_a, std::set set_b); + } // namespace serving } // namespace tensorflow diff --git a/tensorflow_serving/servables/tensorflow/util_test.cc b/tensorflow_serving/servables/tensorflow/util_test.cc index d1d2cc1b5e5..a9d22c758b4 100644 --- a/tensorflow_serving/servables/tensorflow/util_test.cc +++ b/tensorflow_serving/servables/tensorflow/util_test.cc @@ -310,6 +310,21 @@ TEST(ResourceEstimatorTest, EstimateResourceFromPathUsingDiskState) { EXPECT_THAT(actual, EqualsProto(expected)); } +TEST(GetMapKeysTest, GetKeys) { + std::map map = {std::pair("key1", "value1"), + std::pair("key2", "value2")}; + const auto result = GetMapKeys(map); + EXPECT_THAT(result, ::testing::UnorderedElementsAre("key1", "key2")); +} + +TEST(SetDifferenceTEST, GetDiff) { + std::set result; + EXPECT_THAT(SetDifference({"a", "b", "c"}, {"a", "b"}), + ::testing::UnorderedElementsAre("c")); + EXPECT_THAT(SetDifference({"a", "b", "c"}, {"a", "b", "d"}), + ::testing::UnorderedElementsAre("c")); +} + } // namespace } // namespace serving } // namespace tensorflow From 5edcd13d323bb133a6505fd558422d008307ce72 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Sat, 13 Mar 2021 15:11:17 -0800 Subject: [PATCH 4796/8103] Bump minimum bazel version 3.7.2. PiperOrigin-RevId: 362732697 --- WORKSPACE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WORKSPACE b/WORKSPACE index b1598495d34..6ff5059adb1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -31,7 +31,7 @@ load( "@org_tensorflow//tensorflow:version_check.bzl", "check_bazel_version_at_least" ) -check_bazel_version_at_least("3.0.0") +check_bazel_version_at_least("3.7.2") # Initialize TensorFlow's external dependencies. load("@org_tensorflow//tensorflow:workspace3.bzl", "workspace") From 34664c902f7dced15f817e7eff7aded4f5891435 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Sun, 14 Mar 2021 01:14:17 -0800 Subject: [PATCH 4797/8103] Bump minimum bazel version 3.7.2, to match with TF (and latest sources of TF need newer version to build correctly). PiperOrigin-RevId: 362773445 --- tensorflow_serving/tools/docker/Dockerfile.devel | 2 +- tensorflow_serving/tools/docker/Dockerfile.devel-gpu | 2 +- tensorflow_serving/tools/docker/Dockerfile.devel-mkl | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index 1e574c35bef..a4748a66653 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -76,7 +76,7 @@ RUN pip3 --no-cache-dir install \ --ignore-installed six>=1.12.0 # Set up Bazel -ENV BAZEL_VERSION 3.0.0 +ENV BAZEL_VERSION 3.7.2 WORKDIR / RUN mkdir /bazel && \ cd /bazel && \ diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 2d721911fc1..de22cb987ba 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -107,7 +107,7 @@ RUN pip3 --no-cache-dir install \ --ignore-installed six>=1.12.0 # Set up Bazel -ENV BAZEL_VERSION 3.0.0 +ENV BAZEL_VERSION 3.7.2 WORKDIR / RUN mkdir /bazel && \ cd /bazel && \ diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl index bdad49a161a..adc3d7f4427 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl @@ -75,7 +75,7 @@ RUN pip3 --no-cache-dir install \ --ignore-installed six>=1.12.0 # Set up Bazel -ENV BAZEL_VERSION 3.0.0 +ENV BAZEL_VERSION 3.7.2 WORKDIR / RUN mkdir /bazel && \ cd /bazel && \ From 63b2d1c097d540841a2657334f81f0421ebe11f0 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Sun, 14 Mar 2021 18:16:26 -0700 Subject: [PATCH 4798/8103] Dont hardcode path to python3. PiperOrigin-RevId: 362844038 --- .bazelrc | 3 --- 1 file changed, 3 deletions(-) diff --git a/.bazelrc b/.bazelrc index 8369da15002..71c0fdbc9b0 100644 --- a/.bazelrc +++ b/.bazelrc @@ -31,9 +31,6 @@ build:nativeopt --copt=-O3 build --keep_going build --verbose_failures=true -build --action_env PYTHON_BIN_PATH="/usr/bin/python3" -build --define PYTHON_BIN_PATH=/usr/bin/python3 - build --spawn_strategy=standalone build --genrule_strategy=standalone From 6df70a14e78f16ca4e68c11fb600354e3bca1917 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 15 Mar 2021 12:01:21 -0700 Subject: [PATCH 4799/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/37f13b51-4a5e-4dbe-99a0-6c2ba3b73367 PiperOrigin-RevId: 362996089 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6ff5059adb1..2fa8395e235 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "925410fa95b04106f001f330c20ce9c8f1853d74510d16e07ca7997c89f68fc1", - git_commit = "06a07eced4b86da2ed07d57bd704e08d9ca8ba4a", + sha256 = "85eb1b08deea457e4dc3f1e8f2a275a68a76b14add2a033fee438a02155be12a", + git_commit = "624a403ebc35d25d22678be266764204010b4477", ) # Import all of TensorFlow Serving's external dependencies. From 9cd33bff105bb17708c27cdb6ea1c982992a8f4e Mon Sep 17 00:00:00 2001 From: Chao Xie Date: Mon, 15 Mar 2021 12:27:58 -0700 Subject: [PATCH 4800/8103] Make Internal Change. PiperOrigin-RevId: 363002493 --- .../servables/tensorflow/predict_util_test.cc | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tensorflow_serving/servables/tensorflow/predict_util_test.cc b/tensorflow_serving/servables/tensorflow/predict_util_test.cc index afdb104e3db..e0063bf73d9 100644 --- a/tensorflow_serving/servables/tensorflow/predict_util_test.cc +++ b/tensorflow_serving/servables/tensorflow/predict_util_test.cc @@ -244,6 +244,26 @@ TEST_F(PredictImplTest, InputTensorsDontMatchModelSpecInputs) { kInputTensorKey, "}"))); } +TEST_F(PredictImplTest, PredictionInvalidTensor) { + PredictRequest request; + PredictResponse response; + + ModelSpec* model_spec = request.mutable_model_spec(); + model_spec->set_name(kTestModelName); + model_spec->mutable_version()->set_value(kTestModelVersion); + + TensorProto tensor_proto; + tensor_proto.add_bool_val(true); + tensor_proto.set_dtype(tensorflow::DT_BOOL); + (*request.mutable_inputs())[kInputTensorKey] = tensor_proto; + + auto status = CallPredict(GetServerCore(), request, &response); + EXPECT_EQ(status.code(), tensorflow::error::Code::INVALID_ARGUMENT); + EXPECT_THAT( + status.error_message(), + ::testing::HasSubstr("Expects arg[0] to be float but bool is provided")); +} + TEST_F(PredictImplTest, OutputFiltersDontMatchModelSpecOutputs) { PredictRequest request; PredictResponse response; From c5cb5f9681f04b59feb47f80e9f9d837fba3e4ad Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 15 Mar 2021 18:04:46 -0700 Subject: [PATCH 4801/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/672b2b15-a896-4f71-a332-54f302749549 PiperOrigin-RevId: 363075296 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2fa8395e235..c8fc2d48f26 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "85eb1b08deea457e4dc3f1e8f2a275a68a76b14add2a033fee438a02155be12a", - git_commit = "624a403ebc35d25d22678be266764204010b4477", + sha256 = "eed23ddc47473fc5faa00c7286bff0b809b99af658bf1adedc3d8691e81a64ed", + git_commit = "50f8897fdeea7f9dcb0d0709a181613585fb3d83", ) # Import all of TensorFlow Serving's external dependencies. From f1d4866f2d0089b8e8b2e0149668312f7be924c7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 16 Mar 2021 00:01:38 -0700 Subject: [PATCH 4802/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/09aa538a-bbc2-4e36-8fde-89898a1fb375 PiperOrigin-RevId: 363120472 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c8fc2d48f26..93c1d6bc7a6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eed23ddc47473fc5faa00c7286bff0b809b99af658bf1adedc3d8691e81a64ed", - git_commit = "50f8897fdeea7f9dcb0d0709a181613585fb3d83", + sha256 = "88967d92444df4ae1d6f5b2e4c77c53f98d151ce138cc5f4cb9efd7ea6ea104c", + git_commit = "c5406086d8a4e6dea6a9ddddf94b16c1e206f9d8", ) # Import all of TensorFlow Serving's external dependencies. From 774d7c0a7b51ddd0b084bd54d29406867010ee96 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 16 Mar 2021 06:01:24 -0700 Subject: [PATCH 4803/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/051d38e0-9b81-4269-a230-da6b1d9542bb PiperOrigin-RevId: 363165260 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 93c1d6bc7a6..ed374968c20 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "88967d92444df4ae1d6f5b2e4c77c53f98d151ce138cc5f4cb9efd7ea6ea104c", - git_commit = "c5406086d8a4e6dea6a9ddddf94b16c1e206f9d8", + sha256 = "e3840af53d6cd2e39b3714668fdb676fe8a0eef1c8a1dfcd94acd8a3248ff612", + git_commit = "b19a3537f9dcd882cade3d44a084649ec5ba57e4", ) # Import all of TensorFlow Serving's external dependencies. From 4c24f0ef99db0b04c8130dfcbe2a8a39a7e5541c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 16 Mar 2021 12:01:28 -0700 Subject: [PATCH 4804/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/05f9e2ec-a113-4344-972e-7e744a6732b5 PiperOrigin-RevId: 363237342 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ed374968c20..5301eb0fbd1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e3840af53d6cd2e39b3714668fdb676fe8a0eef1c8a1dfcd94acd8a3248ff612", - git_commit = "b19a3537f9dcd882cade3d44a084649ec5ba57e4", + sha256 = "f1127daafc75ffede070f6b9add5d9e033515e85c67ffbbe93c16f128a663ed6", + git_commit = "719833ec06c0f8737f000a6f4fd130bf7991b560", ) # Import all of TensorFlow Serving's external dependencies. From 7c21b223617d8293b45064b8d40c5c1297117677 Mon Sep 17 00:00:00 2001 From: Yi Situ Date: Tue, 16 Mar 2021 17:55:47 -0700 Subject: [PATCH 4805/8103] Update TensorFlow serving documentation with instructions to bind a host volume. The profiler in the docker will write to this volume, and on the host side TensorBoard will load the profile from the location. PiperOrigin-RevId: 363311537 --- tensorflow_serving/g3doc/tensorboard.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/g3doc/tensorboard.md b/tensorflow_serving/g3doc/tensorboard.md index 48bc3fa1aea..e0d00a9980e 100644 --- a/tensorflow_serving/g3doc/tensorboard.md +++ b/tensorflow_serving/g3doc/tensorboard.md @@ -51,6 +51,7 @@ docker pull tensorflow/serving MODELS_DIR="$(pwd)/tensorflow_serving/servables/tensorflow/testdata" docker run -it --rm -p 8500:8500 -p 8501:8501 \ -v $MODELS_DIR/saved_model_half_plus_two_cpu:/models/half_plus_two \ +-v /tmp/tensorboard:/tmp/tensorboard \ -e MODEL_NAME=half_plus_two \ tensorflow/serving ``` @@ -70,8 +71,8 @@ In another terminal, launch the TensorBoard tool on your machine, providing a directory to save the inference trace events to: ``` -mkdir -p ~/logs/inference_demo -tensorboard --logdir ~/logs/inference_demo/ --port 6006 +mkdir -p /tmp/tensorboard +tensorboard --logdir /tmp/tensorboard --port 6006 ``` Navigate to http://localhost:6006/ to view the TensorBoard UI. Use the drop-down From 11ae5da15c88797c9c81a262f156d2ce909f56b9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 16 Mar 2021 18:01:52 -0700 Subject: [PATCH 4806/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/561f3e9f-4467-425a-b96b-65feece3e4ab PiperOrigin-RevId: 363312408 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5301eb0fbd1..65522a79282 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f1127daafc75ffede070f6b9add5d9e033515e85c67ffbbe93c16f128a663ed6", - git_commit = "719833ec06c0f8737f000a6f4fd130bf7991b560", + sha256 = "9ec780e22befd4dc44205b40363f46e1a523d88461b047e1671353ad5615bf4d", + git_commit = "f98490da998ef0887c91d4aed55bae1ddd75f8ee", ) # Import all of TensorFlow Serving's external dependencies. From 75888760750ab5332f03d06c5c68f62d675ee55e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Mar 2021 00:01:59 -0700 Subject: [PATCH 4807/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8f752dda-cf1e-4e02-8170-67199ba49fbd PiperOrigin-RevId: 363356668 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 65522a79282..5f3709d94e3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9ec780e22befd4dc44205b40363f46e1a523d88461b047e1671353ad5615bf4d", - git_commit = "f98490da998ef0887c91d4aed55bae1ddd75f8ee", + sha256 = "cefa501c4cebe346baaf8e7e0b689e2ef0bacac9f974996138275f4162443687", + git_commit = "a044c728a18e7960025781a26fa42abf87cc0811", ) # Import all of TensorFlow Serving's external dependencies. From 292bc1fa7d0d0f7721d7d831edfce013acc9f0f4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Mar 2021 06:04:01 -0700 Subject: [PATCH 4808/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6ae9fab3-bf96-40d2-84a9-d8b0d590d7e6 PiperOrigin-RevId: 363402393 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5f3709d94e3..992201a45ec 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cefa501c4cebe346baaf8e7e0b689e2ef0bacac9f974996138275f4162443687", - git_commit = "a044c728a18e7960025781a26fa42abf87cc0811", + sha256 = "112e2b9b1a46d926d10e8389399398c998209a4cba3d7858dc113121d85d3221", + git_commit = "b87d02a3f8d8b55045bf4250dd72e746357a3eba", ) # Import all of TensorFlow Serving's external dependencies. From a2a0b335e7ae9913f25ca20ced1126a24f2ea6a7 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Wed, 17 Mar 2021 10:21:30 -0700 Subject: [PATCH 4809/8103] Move `file_system_storage_path_source.proto` file to configs/ and make it publicly visible. This file defines `FileSystemStoragePathSourceConfig` proto that is indirectly used by ModelService API request proto (which is public), so having restricted (`library_clients`) visibility for this proto file is odd. This prevents unnecessary inclusion to the `library_clients` list. PiperOrigin-RevId: 363448322 --- tensorflow_serving/config/BUILD | 16 ++++++++++++++-- .../file_system_storage_path_source.proto | 0 .../config/model_server_config.proto | 7 ++++--- tensorflow_serving/model_servers/BUILD | 2 +- .../model_servers/server_core.cc | 2 +- tensorflow_serving/servables/tensorflow/BUILD | 2 +- .../servables/tensorflow/simple_servers.cc | 2 +- tensorflow_serving/sources/storage_path/BUILD | 18 ++---------------- .../file_system_storage_path_source.h | 2 +- .../file_system_storage_path_source_test.cc | 2 +- tensorflow_serving/tools/pip_package/BUILD | 2 +- 11 files changed, 27 insertions(+), 28 deletions(-) rename tensorflow_serving/{sources/storage_path => config}/file_system_storage_path_source.proto (100%) diff --git a/tensorflow_serving/config/BUILD b/tensorflow_serving/config/BUILD index 516bf557c03..e90fc7be782 100644 --- a/tensorflow_serving/config/BUILD +++ b/tensorflow_serving/config/BUILD @@ -21,13 +21,25 @@ filegroup( load("//tensorflow_serving:serving.bzl", "serving_proto_library") load("//tensorflow_serving:serving.bzl", "serving_proto_library_py") +serving_proto_library( + name = "file_system_storage_path_source_proto", + srcs = ["file_system_storage_path_source.proto"], + cc_api_version = 2, +) + +serving_proto_library_py( + name = "file_system_storage_path_source_proto_py_pb2", + srcs = ["file_system_storage_path_source.proto"], + proto_library = "file_system_storage_path_source_proto", +) + serving_proto_library( name = "model_server_config_proto", srcs = ["model_server_config.proto"], cc_api_version = 2, deps = [ + ":file_system_storage_path_source_proto", ":logging_config_proto", - "//tensorflow_serving/sources/storage_path:file_system_storage_path_source_proto", "@com_google_protobuf//:cc_wkt_protos", ], ) @@ -37,8 +49,8 @@ serving_proto_library_py( srcs = ["model_server_config.proto"], proto_library = "model_server_config_proto", deps = [ + "file_system_storage_path_source_proto_py_pb2", ":logging_config_proto_py_pb2", - "//tensorflow_serving/sources/storage_path:file_system_storage_path_source_proto_py_pb2", ], ) diff --git a/tensorflow_serving/sources/storage_path/file_system_storage_path_source.proto b/tensorflow_serving/config/file_system_storage_path_source.proto similarity index 100% rename from tensorflow_serving/sources/storage_path/file_system_storage_path_source.proto rename to tensorflow_serving/config/file_system_storage_path_source.proto diff --git a/tensorflow_serving/config/model_server_config.proto b/tensorflow_serving/config/model_server_config.proto index 6b2983be5d9..cadc2b6e60f 100644 --- a/tensorflow_serving/config/model_server_config.proto +++ b/tensorflow_serving/config/model_server_config.proto @@ -1,11 +1,12 @@ syntax = "proto3"; package tensorflow.serving; -option cc_enable_arenas = true; import "google/protobuf/any.proto"; +import "tensorflow_serving/config/file_system_storage_path_source.proto"; import "tensorflow_serving/config/logging_config.proto"; -import "tensorflow_serving/sources/storage_path/file_system_storage_path_source.proto"; + +option cc_enable_arenas = true; // The type of model. // TODO(b/31336131): DEPRECATED. @@ -13,7 +14,7 @@ enum ModelType { MODEL_TYPE_UNSPECIFIED = 0 [deprecated = true]; TENSORFLOW = 1 [deprecated = true]; OTHER = 2 [deprecated = true]; -}; +} // Common configuration for loading a model being served. message ModelConfig { diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 9abcf45f2e1..b0af419f146 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -76,6 +76,7 @@ cc_library( deps = [ ":model_platform_types", "//tensorflow_serving/apis:model_cc_proto", + "//tensorflow_serving/config:file_system_storage_path_source_cc_proto", "//tensorflow_serving/config:logging_config_cc_proto", "//tensorflow_serving/config:model_server_config_cc_proto", "//tensorflow_serving/config:platform_config_cc_proto", @@ -92,7 +93,6 @@ cc_library( "//tensorflow_serving/servables/tensorflow:predict_util", "//tensorflow_serving/servables/tensorflow:saved_model_bundle_source_adapter", "//tensorflow_serving/sources/storage_path:file_system_storage_path_source", - "//tensorflow_serving/sources/storage_path:file_system_storage_path_source_cc_proto", "//tensorflow_serving/util:event_bus", "//tensorflow_serving/util:unique_ptr_with_deps", "@com_google_absl//absl/base:core_headers", diff --git a/tensorflow_serving/model_servers/server_core.cc b/tensorflow_serving/model_servers/server_core.cc index ac850a30f44..aac86a1233a 100644 --- a/tensorflow_serving/model_servers/server_core.cc +++ b/tensorflow_serving/model_servers/server_core.cc @@ -24,12 +24,12 @@ limitations under the License. #include "tensorflow/core/lib/io/path.h" #include "tensorflow/core/lib/strings/strcat.h" #include "tensorflow/core/platform/logging.h" +#include "tensorflow_serving/config/file_system_storage_path_source.pb.h" #include "tensorflow_serving/core/load_servables_fast.h" #include "tensorflow_serving/model_servers/model_platform_types.h" #include "tensorflow_serving/resources/resource_values.h" #include "tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter.h" #include "tensorflow_serving/sources/storage_path/file_system_storage_path_source.h" -#include "tensorflow_serving/sources/storage_path/file_system_storage_path_source.pb.h" namespace tensorflow { namespace serving { diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index a8ebf56da7c..3ad897e3f30 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -262,6 +262,7 @@ cc_library( deps = [ ":saved_model_bundle_source_adapter", ":saved_model_bundle_source_adapter_cc_proto", + "//tensorflow_serving/config:file_system_storage_path_source_cc_proto", "//tensorflow_serving/core:aspired_versions_manager_builder", "//tensorflow_serving/core:availability_preserving_policy", "//tensorflow_serving/core:loader", @@ -271,7 +272,6 @@ cc_library( "//tensorflow_serving/core:storage_path", "//tensorflow_serving/core:target", "//tensorflow_serving/sources/storage_path:file_system_storage_path_source", - "//tensorflow_serving/sources/storage_path:file_system_storage_path_source_cc_proto", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/core:lib", ], diff --git a/tensorflow_serving/servables/tensorflow/simple_servers.cc b/tensorflow_serving/servables/tensorflow/simple_servers.cc index cb238b053b4..d54bcaee4ce 100644 --- a/tensorflow_serving/servables/tensorflow/simple_servers.cc +++ b/tensorflow_serving/servables/tensorflow/simple_servers.cc @@ -21,6 +21,7 @@ limitations under the License. #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/lib/core/status.h" +#include "tensorflow_serving/config/file_system_storage_path_source.pb.h" #include "tensorflow_serving/core/aspired_versions_manager_builder.h" #include "tensorflow_serving/core/availability_preserving_policy.h" #include "tensorflow_serving/core/loader.h" @@ -31,7 +32,6 @@ limitations under the License. #include "tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter.h" #include "tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter.pb.h" #include "tensorflow_serving/sources/storage_path/file_system_storage_path_source.h" -#include "tensorflow_serving/sources/storage_path/file_system_storage_path_source.pb.h" namespace tensorflow { namespace serving { diff --git a/tensorflow_serving/sources/storage_path/BUILD b/tensorflow_serving/sources/storage_path/BUILD index 6b73bb91262..9f21e96a3e3 100644 --- a/tensorflow_serving/sources/storage_path/BUILD +++ b/tensorflow_serving/sources/storage_path/BUILD @@ -1,7 +1,6 @@ # Description: Tensorflow Serving storage path sources. load("//tensorflow_serving:serving.bzl", "serving_proto_library") -load("//tensorflow_serving:serving.bzl", "serving_proto_library_py") package( default_visibility = [ @@ -70,7 +69,7 @@ cc_library( visibility = ["//visibility:public"], deps = [ - ":file_system_storage_path_source_cc_proto", + "//tensorflow_serving/config:file_system_storage_path_source_cc_proto", "//tensorflow_serving/core:servable_data", "//tensorflow_serving/core:servable_id", "//tensorflow_serving/core:source", @@ -82,19 +81,6 @@ cc_library( ], ) -serving_proto_library( - name = "file_system_storage_path_source_proto", - srcs = ["file_system_storage_path_source.proto"], - cc_api_version = 2, - visibility = ["//visibility:public"], -) - -serving_proto_library_py( - name = "file_system_storage_path_source_proto_py_pb2", - srcs = ["file_system_storage_path_source.proto"], - proto_library = "file_system_storage_path_source_proto", -) - cc_test( name = "file_system_storage_path_source_test", srcs = @@ -103,7 +89,7 @@ cc_test( ], deps = [ ":file_system_storage_path_source", - ":file_system_storage_path_source_cc_proto", + "//tensorflow_serving/config:file_system_storage_path_source_cc_proto", "//tensorflow_serving/core:servable_data", "//tensorflow_serving/core:target", "//tensorflow_serving/core/test_util:mock_storage_path_target", diff --git a/tensorflow_serving/sources/storage_path/file_system_storage_path_source.h b/tensorflow_serving/sources/storage_path/file_system_storage_path_source.h index ef51009d634..ca0a0ba69ac 100644 --- a/tensorflow_serving/sources/storage_path/file_system_storage_path_source.h +++ b/tensorflow_serving/sources/storage_path/file_system_storage_path_source.h @@ -26,9 +26,9 @@ limitations under the License. #include "tensorflow/core/platform/env.h" #include "tensorflow/core/platform/macros.h" #include "tensorflow/core/platform/types.h" +#include "tensorflow_serving/config/file_system_storage_path_source.pb.h" #include "tensorflow_serving/core/source.h" #include "tensorflow_serving/core/storage_path.h" -#include "tensorflow_serving/sources/storage_path/file_system_storage_path_source.pb.h" namespace tensorflow { namespace serving { diff --git a/tensorflow_serving/sources/storage_path/file_system_storage_path_source_test.cc b/tensorflow_serving/sources/storage_path/file_system_storage_path_source_test.cc index 5caf40e3d57..5675292260f 100644 --- a/tensorflow_serving/sources/storage_path/file_system_storage_path_source_test.cc +++ b/tensorflow_serving/sources/storage_path/file_system_storage_path_source_test.cc @@ -28,10 +28,10 @@ limitations under the License. #include "tensorflow/core/lib/strings/stringprintf.h" #include "tensorflow/core/platform/env.h" #include "tensorflow/core/platform/test.h" +#include "tensorflow_serving/config/file_system_storage_path_source.pb.h" #include "tensorflow_serving/core/servable_data.h" #include "tensorflow_serving/core/target.h" #include "tensorflow_serving/core/test_util/mock_storage_path_target.h" -#include "tensorflow_serving/sources/storage_path/file_system_storage_path_source.pb.h" #include "tensorflow_serving/test_util/test_util.h" using ::testing::AnyOf; diff --git a/tensorflow_serving/tools/pip_package/BUILD b/tensorflow_serving/tools/pip_package/BUILD index 8450f821fba..187c0e089d7 100644 --- a/tensorflow_serving/tools/pip_package/BUILD +++ b/tensorflow_serving/tools/pip_package/BUILD @@ -25,7 +25,7 @@ sh_binary( "//tensorflow_serving/config:log_collector_config_proto_py_pb2", "//tensorflow_serving/config:logging_config_proto_py_pb2", "//tensorflow_serving/config:model_server_config_proto_py_pb2", - "//tensorflow_serving/sources/storage_path:file_system_storage_path_source_proto_py_pb2", + "//tensorflow_serving/config:file_system_storage_path_source_proto_py_pb2", "//tensorflow_serving/util:status_proto_py_pb2", "//tensorflow_serving/core:logging_proto_py_pb2", ], From 18f1d3cea3b24bd724bfc9cc5d0e7c2a3de5f661 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Mar 2021 12:03:03 -0700 Subject: [PATCH 4810/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/efb48ee4-7c66-48c4-ad89-a2c277ae326d PiperOrigin-RevId: 363474027 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 992201a45ec..6d1d0432f07 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "112e2b9b1a46d926d10e8389399398c998209a4cba3d7858dc113121d85d3221", - git_commit = "b87d02a3f8d8b55045bf4250dd72e746357a3eba", + sha256 = "f7f3b77aa94a488a8d78933512df80b0c24a0f014e9413e43a19ddf5518dc225", + git_commit = "5488f543a0e52a0f478db10431da92c6912bd7fb", ) # Import all of TensorFlow Serving's external dependencies. From 18dd7666bc7ed64c1254fb21895d1602f160b2f7 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Wed, 17 Mar 2021 14:13:10 -0700 Subject: [PATCH 4811/8103] Fix package build due to config move in: https://github.com/tensorflow/serving/commit/a2a0b335e7ae9913f25ca20ced1126a24f2ea6a7 PiperOrigin-RevId: 363504727 --- tensorflow_serving/tools/pip_package/build_pip_package.sh | 6 ------ 1 file changed, 6 deletions(-) diff --git a/tensorflow_serving/tools/pip_package/build_pip_package.sh b/tensorflow_serving/tools/pip_package/build_pip_package.sh index efd9b2b4e64..60f8136dce1 100755 --- a/tensorflow_serving/tools/pip_package/build_pip_package.sh +++ b/tensorflow_serving/tools/pip_package/build_pip_package.sh @@ -37,7 +37,6 @@ function main() { mkdir -p ${TMPDIR}/tensorflow_serving/apis mkdir -p ${TMPDIR}/tensorflow_serving/config mkdir -p ${TMPDIR}/tensorflow_serving/core - mkdir -p ${TMPDIR}/tensorflow_serving/sources/storage_path mkdir -p ${TMPDIR}/tensorflow_serving/util echo "Adding python files" @@ -56,17 +55,12 @@ function main() { cp bazel-out/k8-opt/bin/tensorflow_serving/core/*_pb2.py \ "${TMPDIR}/tensorflow_serving/core" - cp bazel-out/k8-opt/bin/tensorflow_serving/sources/storage_path/*_pb2.py \ - "${TMPDIR}/tensorflow_serving/sources/storage_path" - cp bazel-out/k8-opt/bin/tensorflow_serving/util/*_pb2.py \ "${TMPDIR}/tensorflow_serving/util" touch "${TMPDIR}/tensorflow_serving/apis/__init__.py" touch "${TMPDIR}/tensorflow_serving/config/__init__.py" touch "${TMPDIR}/tensorflow_serving/core/__init__.py" - touch "${TMPDIR}/tensorflow_serving/sources/__init__.py" - touch "${TMPDIR}/tensorflow_serving/sources/storage_path/__init__.py" touch "${TMPDIR}/tensorflow_serving/util/__init__.py" touch "${TMPDIR}/tensorflow_serving/__init__.py" From 471a0fc463398b4c8ca25db746e0faf31ee591cb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Mar 2021 15:25:09 -0700 Subject: [PATCH 4812/8103] add model_service_cc_grpc_proto PiperOrigin-RevId: 363520708 --- tensorflow_serving/apis/BUILD | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tensorflow_serving/apis/BUILD b/tensorflow_serving/apis/BUILD index f7b32aac83e..9787bd9c2f6 100644 --- a/tensorflow_serving/apis/BUILD +++ b/tensorflow_serving/apis/BUILD @@ -1,5 +1,6 @@ # Description: Tensorflow Serving APIs. +load("//tools/build_defs/proto/cpp:cc_grpc_library.bzl", "cc_grpc_library") load("//tensorflow_serving:serving.bzl", "serving_go_grpc_library", "serving_proto_library", "serving_proto_library_py", "serving_tensorflow_proto_dep") load("@org_tensorflow//tensorflow/core/platform:build_config.bzl", "tf_jspb_proto_library", "tf_pyclif_proto_library") @@ -252,6 +253,12 @@ serving_proto_library( ], ) +cc_grpc_library( + name = "model_service_cc_grpc_proto", + srcs = [":model_service_proto"], + deps = [":model_service_cc_proto"], +) + py_library( name = "model_service_proto_py_pb2", srcs = [ From 0380b5ac06e4387c0cb363d1b41524249e7ea7b0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Mar 2021 18:02:34 -0700 Subject: [PATCH 4813/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1d3128f8-a9e3-4003-8918-44608417761e PiperOrigin-RevId: 363550823 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6d1d0432f07..3d8397e0d35 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f7f3b77aa94a488a8d78933512df80b0c24a0f014e9413e43a19ddf5518dc225", - git_commit = "5488f543a0e52a0f478db10431da92c6912bd7fb", + sha256 = "21dc13e2cf11a632e1432670299caabe26ed6c4f11fb5b6e85a1ba7abe8cc05b", + git_commit = "98d5346be447c7b463f33432274e05093c584cae", ) # Import all of TensorFlow Serving's external dependencies. From 1975e3e5701d1cb266d356834ec50a326016983f Mon Sep 17 00:00:00 2001 From: Guanxin Qiao Date: Wed, 17 Mar 2021 18:44:07 -0700 Subject: [PATCH 4814/8103] Upgrade to CUDA 11.2. PiperOrigin-RevId: 363556809 --- .../tools/docker/Dockerfile.devel-gpu | 52 ++++++++++--------- .../tools/docker/Dockerfile.gpu | 27 +++++----- 2 files changed, 41 insertions(+), 38 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index de22cb987ba..4dee0c68c5a 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -11,7 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -FROM nvidia/cuda:11.0-base-ubuntu18.04 as base_build +FROM nvidia/cuda:11.2.1-base-ubuntu18.04 as base_build ARG TF_SERVING_VERSION_GIT_BRANCH=master ARG TF_SERVING_VERSION_GIT_COMMIT=HEAD @@ -20,25 +20,25 @@ LABEL maintainer=gvasudevan@google.com LABEL tensorflow_serving_github_branchtag=${TF_SERVING_VERSION_GIT_BRANCH} LABEL tensorflow_serving_github_commit=${TF_SERVING_VERSION_GIT_COMMIT} -ENV CUDNN_VERSION=8.0.4.30 -ENV TF_TENSORRT_VERSION=7.1.3 -ENV CUDA=11.0 +ENV CUDNN_VERSION=8.1.0.77 +ENV TF_TENSORRT_VERSION=7.2.2 +ENV CUDA=11.2 RUN apt-get update && apt-get install -y --no-install-recommends \ automake \ build-essential \ ca-certificates \ - cuda-command-line-tools-11-0 \ - libcublas-11-0 \ - libcublas-dev-11-0 \ - cuda-nvrtc-11-0 \ - cuda-nvrtc-dev-11-0 \ - cuda-nvprune-11-0 \ - cuda-cudart-dev-11-0 \ - libcufft-dev-11-0 \ - libcurand-dev-11-0 \ - libcusolver-dev-11-0 \ - libcusparse-dev-11-0 \ + cuda-command-line-tools-11-2 \ + libcublas-11-2 \ + libcublas-dev-11-2 \ + cuda-nvrtc-11-2 \ + cuda-nvrtc-dev-11-2 \ + cuda-nvprune-11-2 \ + cuda-cudart-dev-11-2 \ + libcufft-dev-11-2 \ + libcurand-dev-11-2 \ + libcusolver-dev-11-2 \ + libcusparse-dev-11-2 \ curl \ git \ libfreetype6-dev \ @@ -63,19 +63,20 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* && \ - find /usr/local/cuda-11.0/lib64/ -type f -name 'lib*_static.a' -not -name 'libcudart_static.a' -delete && \ + find /usr/local/cuda-11.2/lib64/ -type f -name 'lib*_static.a' -not -name 'libcudart_static.a' -delete && \ rm /usr/lib/x86_64-linux-gnu/libcudnn_static_v8.a +# NOTE: libnvinfer uses cuda11.1 versions RUN apt-get update && \ - apt-get install -y --no-install-recommends libnvinfer7=${TF_TENSORRT_VERSION}-1+cuda${CUDA} \ - libnvinfer-dev=${TF_TENSORRT_VERSION}-1+cuda${CUDA} \ - libnvinfer-plugin-dev=${TF_TENSORRT_VERSION}-1+cuda${CUDA} \ - libnvinfer-plugin7=${TF_TENSORRT_VERSION}-1+cuda${CUDA} \ + apt-get install -y --no-install-recommends libnvinfer7=${TF_TENSORRT_VERSION}-1+cuda11.1 \ + libnvinfer-dev=${TF_TENSORRT_VERSION}-1+cuda11.1 \ + libnvinfer-plugin-dev=${TF_TENSORRT_VERSION}-1+cuda11.1 \ + libnvinfer-plugin7=${TF_TENSORRT_VERSION}-1+cuda11.1 \ # TODO: need to verify - libnvonnxparsers7=${TF_TENSORRT_VERSION}-1+cuda${CUDA} \ - libnvparsers7=${TF_TENSORRT_VERSION}-1+cuda${CUDA}\ - libnvonnxparsers-dev=${TF_TENSORRT_VERSION}-1+cuda${CUDA} \ - libnvparsers-dev=${TF_TENSORRT_VERSION}-1+cuda${CUDA} \ + libnvonnxparsers7=${TF_TENSORRT_VERSION}-1+cuda11.1 \ + libnvparsers7=${TF_TENSORRT_VERSION}-1+cuda11.1\ + libnvonnxparsers-dev=${TF_TENSORRT_VERSION}-1+cuda11.1 \ + libnvparsers-dev=${TF_TENSORRT_VERSION}-1+cuda11.1 \ && apt-get clean \ && rm -rf /var/lib/apt/lists/*; @@ -125,7 +126,7 @@ ENV LD_LIBRARY_PATH /usr/local/cuda/extras/CUPTI/lib64:/usr/local/cuda/lib64:/us ENV TF_NEED_CUDA 1 ENV TF_NEED_TENSORRT 1 ENV TENSORRT_INSTALL_PATH=/usr/lib/x86_64-linux-gnu -ENV TF_CUDA_VERSION=11.0 +ENV TF_CUDA_VERSION=11.2 ENV TF_CUDNN_VERSION=8 # Fix paths so that CUDNN can be found: https://github.com/tensorflow/tensorflow/issues/8264 @@ -183,3 +184,4 @@ FROM binary_build as clean_build RUN bazel clean --expunge --color=yes && \ rm -rf /root/.cache CMD ["/bin/bash"] + diff --git a/tensorflow_serving/tools/docker/Dockerfile.gpu b/tensorflow_serving/tools/docker/Dockerfile.gpu index ba6374f47c0..09cb8478dd3 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.gpu @@ -16,7 +16,7 @@ ARG TF_SERVING_VERSION=latest ARG TF_SERVING_BUILD_IMAGE=tensorflow/serving:${TF_SERVING_VERSION}-devel-gpu FROM ${TF_SERVING_BUILD_IMAGE} as build_image -FROM nvidia/cuda:11.0-base-ubuntu18.04 +FROM nvidia/cuda:11.2.1-base-ubuntu18.04 ARG TF_SERVING_VERSION_GIT_BRANCH=master ARG TF_SERVING_VERSION_GIT_COMMIT=head @@ -25,20 +25,20 @@ LABEL maintainer="gvasudevan@google.com" LABEL tensorflow_serving_github_branchtag=${TF_SERVING_VERSION_GIT_BRANCH} LABEL tensorflow_serving_github_commit=${TF_SERVING_VERSION_GIT_COMMIT} -ENV CUDNN_VERSION=8.0.4.30 -ENV TF_TENSORRT_VERSION=7.1.3 -ENV CUDA=11.0 +ENV CUDNN_VERSION=8.1.0.77 +ENV TF_TENSORRT_VERSION=7.2.2 +ENV CUDA=11.2 ENV LD_LIBRARY_PATH /usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH RUN apt-get update && apt-get install -y --no-install-recommends \ ca-certificates \ - cuda-command-line-tools-11-0 \ - libcublas-11-0 \ - libcublas-dev-11-0 \ - libcufft-11-0 \ - libcurand-11-0 \ - libcusolver-11-0 \ - libcusparse-11-0 \ + cuda-command-line-tools-11-2 \ + libcublas-11-2 \ + libcublas-dev-11-2 \ + libcufft-11-2 \ + libcurand-11-2 \ + libcusolver-11-2 \ + libcusparse-11-2 \ libcudnn8=${CUDNN_VERSION}-1+cuda${CUDA} \ libgomp1 \ && \ @@ -47,8 +47,8 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ # We don't install libnvinfer-dev since we don't need to build against TensorRT RUN apt-get update && \ - apt-get install -y --no-install-recommends libnvinfer7=${TF_TENSORRT_VERSION}-1+cuda${CUDA} \ - libnvinfer-plugin7=${TF_TENSORRT_VERSION}-1+cuda${CUDA} \ + apt-get install -y --no-install-recommends libnvinfer7=${TF_TENSORRT_VERSION}-1+cuda11.1 \ + libnvinfer-plugin7=${TF_TENSORRT_VERSION}-1+cuda11.1 \ && apt-get clean \ && rm -rf /var/lib/apt/lists/*; @@ -78,3 +78,4 @@ tensorflow_model_server --port=8500 --rest_api_port=8501 \ && chmod +x /usr/bin/tf_serving_entrypoint.sh ENTRYPOINT ["/usr/bin/tf_serving_entrypoint.sh"] + From 9152d31fd2965c739372fb7d2427ad0464c3eee6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Mar 2021 00:01:30 -0700 Subject: [PATCH 4815/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0a71ce9e-2cdb-454c-bf7f-b665cdf87e63 PiperOrigin-RevId: 363595329 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3d8397e0d35..88ab6eb337d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "21dc13e2cf11a632e1432670299caabe26ed6c4f11fb5b6e85a1ba7abe8cc05b", - git_commit = "98d5346be447c7b463f33432274e05093c584cae", + sha256 = "5d303f5ce65124ecaf4cf9fe4380c9234337a632e7f66347acd3c56836d9f1a2", + git_commit = "906362bfcaae4cab0d318b645c2af64c1b77b811", ) # Import all of TensorFlow Serving's external dependencies. From 90fe5bfdbb7c4ef0321918679ea5ceb20c434cb9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Mar 2021 06:01:26 -0700 Subject: [PATCH 4816/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/83b6abef-3b91-4b49-a866-103981775ad8 PiperOrigin-RevId: 363640274 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 88ab6eb337d..726382f4ca3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5d303f5ce65124ecaf4cf9fe4380c9234337a632e7f66347acd3c56836d9f1a2", - git_commit = "906362bfcaae4cab0d318b645c2af64c1b77b811", + sha256 = "a334a8e6a88ea62ffc3b6f0fa99f74557e09ec607733e12477829d814357efaa", + git_commit = "dd038832499603670be2bcd038ab6aaba32b25cb", ) # Import all of TensorFlow Serving's external dependencies. From bbfc7374dc3bbb16fb6daf027141393dc36816f5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Mar 2021 12:01:39 -0700 Subject: [PATCH 4817/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/31e833b3-457d-45d5-ada7-d92a313b7adb PiperOrigin-RevId: 363711510 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 726382f4ca3..f0d85606c0e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a334a8e6a88ea62ffc3b6f0fa99f74557e09ec607733e12477829d814357efaa", - git_commit = "dd038832499603670be2bcd038ab6aaba32b25cb", + sha256 = "ce757fec19e3f661bfd7433f91625c963d614b63816111867dc07cd09d841c24", + git_commit = "3d7cd6d6afe80c701a166ce31bdf0ee520aa4df8", ) # Import all of TensorFlow Serving's external dependencies. From fc8bdde10b7052e1f6e73ec769117344866e1b07 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Mar 2021 18:01:17 -0700 Subject: [PATCH 4818/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c1c2aba6-bec1-404d-a18b-8b20b930e145 PiperOrigin-RevId: 363789276 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f0d85606c0e..1e4ff3830fd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ce757fec19e3f661bfd7433f91625c963d614b63816111867dc07cd09d841c24", - git_commit = "3d7cd6d6afe80c701a166ce31bdf0ee520aa4df8", + sha256 = "92d693b76a3b3db5f5a2a418713630b7a7edc9e7e4a736254279cfe6792cc11f", + git_commit = "2860aec5a925482e25d999e18cd41908423bfd3e", ) # Import all of TensorFlow Serving's external dependencies. From a670ff5537beb41e90020065e25a682498b9de38 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Mar 2021 20:24:34 -0700 Subject: [PATCH 4819/8103] add model_service_cc_grpc_proto PiperOrigin-RevId: 363807208 --- tensorflow_serving/apis/BUILD | 7 ------- 1 file changed, 7 deletions(-) diff --git a/tensorflow_serving/apis/BUILD b/tensorflow_serving/apis/BUILD index 9787bd9c2f6..f7b32aac83e 100644 --- a/tensorflow_serving/apis/BUILD +++ b/tensorflow_serving/apis/BUILD @@ -1,6 +1,5 @@ # Description: Tensorflow Serving APIs. -load("//tools/build_defs/proto/cpp:cc_grpc_library.bzl", "cc_grpc_library") load("//tensorflow_serving:serving.bzl", "serving_go_grpc_library", "serving_proto_library", "serving_proto_library_py", "serving_tensorflow_proto_dep") load("@org_tensorflow//tensorflow/core/platform:build_config.bzl", "tf_jspb_proto_library", "tf_pyclif_proto_library") @@ -253,12 +252,6 @@ serving_proto_library( ], ) -cc_grpc_library( - name = "model_service_cc_grpc_proto", - srcs = [":model_service_proto"], - deps = [":model_service_cc_proto"], -) - py_library( name = "model_service_proto_py_pb2", srcs = [ From f4f0622243c3bdaafd6ff578f7eaea4894cbd70c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Mar 2021 00:01:32 -0700 Subject: [PATCH 4820/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a9b07a44-dbaf-484c-9e50-4e2efcb19745 PiperOrigin-RevId: 363832688 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1e4ff3830fd..1610be9647d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "92d693b76a3b3db5f5a2a418713630b7a7edc9e7e4a736254279cfe6792cc11f", - git_commit = "2860aec5a925482e25d999e18cd41908423bfd3e", + sha256 = "04c623f86868cc28053cfc95617227c35b41f5de3ef83a2bbad9d9cbf2c7b48f", + git_commit = "292b120fdc6b0eed8dc2ebca81bb9f03889b937e", ) # Import all of TensorFlow Serving's external dependencies. From af99f8dc696323c5372c3b158f3655eb59e2729b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Mar 2021 06:01:28 -0700 Subject: [PATCH 4821/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/93d15050-5477-4901-9362-17edd15a245d PiperOrigin-RevId: 363874390 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1610be9647d..bb3c0fc93a5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "04c623f86868cc28053cfc95617227c35b41f5de3ef83a2bbad9d9cbf2c7b48f", - git_commit = "292b120fdc6b0eed8dc2ebca81bb9f03889b937e", + sha256 = "9dbfd096802f4d31676b36a3f2fa467e095f0222397655a85576f4ed306da359", + git_commit = "8211cf9859dd75022ac3b813d3bb51795e15b8a5", ) # Import all of TensorFlow Serving's external dependencies. From 4af346d55dfef83aae7c24964c49de7968d6eb25 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Mar 2021 12:01:38 -0700 Subject: [PATCH 4822/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/910373f4-e80f-41aa-9e52-faf41760084e PiperOrigin-RevId: 363940556 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bb3c0fc93a5..0e34c0d6d14 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9dbfd096802f4d31676b36a3f2fa467e095f0222397655a85576f4ed306da359", - git_commit = "8211cf9859dd75022ac3b813d3bb51795e15b8a5", + sha256 = "71b020988c14d815488b1011a5cebd6836a69d4b2da9e934947790e02170dd19", + git_commit = "388f9fa67d1f3300f25b491e69ece14f1299997d", ) # Import all of TensorFlow Serving's external dependencies. From 0050f41e29e07778bc2fa26c012ae1ddfa1eb19b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Mar 2021 18:01:35 -0700 Subject: [PATCH 4823/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7f4ebc35-f77e-48ff-8135-0c5d920016aa PiperOrigin-RevId: 364007517 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0e34c0d6d14..823e4809c65 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "71b020988c14d815488b1011a5cebd6836a69d4b2da9e934947790e02170dd19", - git_commit = "388f9fa67d1f3300f25b491e69ece14f1299997d", + sha256 = "6a56203084bed9707cb49dfe41480d73c3a376027890881f6c77bbc2ed7a2b75", + git_commit = "1c9eeb9eaa1b712d71fc29bcc9054c25c7236fa2", ) # Import all of TensorFlow Serving's external dependencies. From 3dee75e715814664ac22ae14bf481ab7e0329ce7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 20 Mar 2021 00:01:23 -0700 Subject: [PATCH 4824/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/837510f7-8e6e-467c-86eb-528cbd53e8a2 PiperOrigin-RevId: 364040240 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 823e4809c65..c984c01ab9d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6a56203084bed9707cb49dfe41480d73c3a376027890881f6c77bbc2ed7a2b75", - git_commit = "1c9eeb9eaa1b712d71fc29bcc9054c25c7236fa2", + sha256 = "374ef3f2fac93a04be56d139f597412e38e515a9453d3a50b93315f72558172c", + git_commit = "ac5f2a1f0db1ba1e585559ad4e593fdb3e73713a", ) # Import all of TensorFlow Serving's external dependencies. From 4e1cd5b58d58a9ee90a0ffddea71cad454449356 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 20 Mar 2021 06:01:30 -0700 Subject: [PATCH 4825/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a513ad50-bfce-44b5-8c0b-4c62a68134f0 PiperOrigin-RevId: 364066225 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c984c01ab9d..200fadfeb56 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "374ef3f2fac93a04be56d139f597412e38e515a9453d3a50b93315f72558172c", - git_commit = "ac5f2a1f0db1ba1e585559ad4e593fdb3e73713a", + sha256 = "87023b4752d24fa5019c9a88f5bdca9f2448bf1e0549d7a5bbb0e8241d2758b3", + git_commit = "8b68466be9c7b2c68093cf00f9494458a0ff4364", ) # Import all of TensorFlow Serving's external dependencies. From 0cbd4d342c1215f612d4f3c9ce456f23c19b65e8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 20 Mar 2021 12:01:23 -0700 Subject: [PATCH 4826/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e6862d75-3990-4752-9f09-7b2e23f144c8 PiperOrigin-RevId: 364091046 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 200fadfeb56..c83e17a28b7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "87023b4752d24fa5019c9a88f5bdca9f2448bf1e0549d7a5bbb0e8241d2758b3", - git_commit = "8b68466be9c7b2c68093cf00f9494458a0ff4364", + sha256 = "20df275aaecefd497545acab123a90ff05ec59fea289dc961415faae69cd37ee", + git_commit = "7ca84c33b5efbf96c779ae31041b11ad9fdcd431", ) # Import all of TensorFlow Serving's external dependencies. From 249446dc28f08a3d7acaf8b350af0ea1fe415691 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 20 Mar 2021 18:01:25 -0700 Subject: [PATCH 4827/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c09aa586-e6b6-4690-8828-e76361e02c41 PiperOrigin-RevId: 364116187 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c83e17a28b7..506d8015562 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "20df275aaecefd497545acab123a90ff05ec59fea289dc961415faae69cd37ee", - git_commit = "7ca84c33b5efbf96c779ae31041b11ad9fdcd431", + sha256 = "16faad1075bc0abbb4b9e52c7200a7d6cd3b07f096f20535c4f94f2aff8ebf56", + git_commit = "6f6147b9e77cf01d24eaedc7492250c10a00ab14", ) # Import all of TensorFlow Serving's external dependencies. From 8aabb92b49168393f669709711c68af684f76c2f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 21 Mar 2021 00:02:01 -0700 Subject: [PATCH 4828/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6e214bad-2755-4e6a-a26a-4ce2b0001b06 PiperOrigin-RevId: 364139671 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 506d8015562..85404969a0d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "16faad1075bc0abbb4b9e52c7200a7d6cd3b07f096f20535c4f94f2aff8ebf56", - git_commit = "6f6147b9e77cf01d24eaedc7492250c10a00ab14", + sha256 = "846631b770ee3d69faa7d7414b48275626581a89feb465f82170f459cc38716b", + git_commit = "661cd63c70971ea44f07522eaeda0a70025a43c7", ) # Import all of TensorFlow Serving's external dependencies. From 54e88fda5b52cb74b387d47387211f29b93e7fd1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 21 Mar 2021 06:01:36 -0700 Subject: [PATCH 4829/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9b8be220-3844-4dab-ba3a-823b18044889 PiperOrigin-RevId: 364166390 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 85404969a0d..84e9a2c9596 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "846631b770ee3d69faa7d7414b48275626581a89feb465f82170f459cc38716b", - git_commit = "661cd63c70971ea44f07522eaeda0a70025a43c7", + sha256 = "0458e049bd85824a84ad3e08b63f4856f331330765d882cf9ba13fba23b782a9", + git_commit = "8f46088df45cc9824b2901378106572aa0a89406", ) # Import all of TensorFlow Serving's external dependencies. From 2472e4f7902130a64dd755cf690c1b40537d8e1f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 21 Mar 2021 18:01:17 -0700 Subject: [PATCH 4830/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4b34e5e3-5c3f-4442-a118-1b68cc82db3b PiperOrigin-RevId: 364219534 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 84e9a2c9596..c6e156cc46f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0458e049bd85824a84ad3e08b63f4856f331330765d882cf9ba13fba23b782a9", - git_commit = "8f46088df45cc9824b2901378106572aa0a89406", + sha256 = "ef3c06745b0d897adf3ee1a090c5740f13af23f2c287539c4aac6f918390bbe9", + git_commit = "8077fe8b1b4a3c170a94b74d8c351c247e64a53c", ) # Import all of TensorFlow Serving's external dependencies. From 54ac65d155de65272f5a4a35351ad5ba51dd09e5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 22 Mar 2021 06:01:41 -0700 Subject: [PATCH 4831/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/03ad532b-8c7c-4b0b-b751-0081e66b9d5a PiperOrigin-RevId: 364298663 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c6e156cc46f..b748313983b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ef3c06745b0d897adf3ee1a090c5740f13af23f2c287539c4aac6f918390bbe9", - git_commit = "8077fe8b1b4a3c170a94b74d8c351c247e64a53c", + sha256 = "eb1e1d34ec6b1aacda5732c2cdf8c3cdeab09dc9de542cd57be22298906fd8eb", + git_commit = "3be36068221c996705d526eb402991af5bed5fab", ) # Import all of TensorFlow Serving's external dependencies. From 8825941de591d2cdca74c8e5ca759b88a97f3bb5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 22 Mar 2021 12:01:33 -0700 Subject: [PATCH 4832/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8c7e3fb0-7f03-4c53-93c4-c624c1b52ab4 PiperOrigin-RevId: 364375299 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b748313983b..824a846fc00 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eb1e1d34ec6b1aacda5732c2cdf8c3cdeab09dc9de542cd57be22298906fd8eb", - git_commit = "3be36068221c996705d526eb402991af5bed5fab", + sha256 = "2f14e312552cf1a5fcac388567a379d2101c81c4b37fd20032430cc7c2c1a3d0", + git_commit = "53ef3cac52d7e08548e222f59dbd753ed1af7610", ) # Import all of TensorFlow Serving's external dependencies. From 3b1042d5a89a5c7ff4ac5298d439cadd4af2fb49 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 22 Mar 2021 18:01:18 -0700 Subject: [PATCH 4833/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/84f31a99-7262-4bda-b4f5-23b95669409c PiperOrigin-RevId: 364452671 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 824a846fc00..9c2e2a92791 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2f14e312552cf1a5fcac388567a379d2101c81c4b37fd20032430cc7c2c1a3d0", - git_commit = "53ef3cac52d7e08548e222f59dbd753ed1af7610", + sha256 = "7acfafa1a4397db88b9565e63bd4c82063317d28b830e5c64dcfedcd9c15db0f", + git_commit = "2dba63671d3335ae8523e955d34f77bd2e475699", ) # Import all of TensorFlow Serving's external dependencies. From 98c86417fc413c35f31a4f38bbf38fc2ffec5331 Mon Sep 17 00:00:00 2001 From: Chao Xie Date: Mon, 22 Mar 2021 21:07:08 -0700 Subject: [PATCH 4834/8103] Make Internal Change. PiperOrigin-RevId: 364476548 --- .../tensorflow/bundle_factory_util.cc | 73 +++---------------- .../tensorflow/bundle_factory_util.h | 69 +++++++++++++++++- 2 files changed, 77 insertions(+), 65 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_util.cc b/tensorflow_serving/servables/tensorflow/bundle_factory_util.cc index ec2a66c454e..eda2b196eea 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_util.cc +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_util.cc @@ -50,33 +50,6 @@ RunOptions GetRunOptions(const SessionBundleConfig& config) { return run_options; } -Status CreateBatchScheduler(const BatchingParameters& batching_config, - std::shared_ptr* batch_scheduler) { - if (!batching_config.allowed_batch_sizes().empty()) { - // Verify that the last allowed batch size matches the max batch size. - const int last_allowed_size = batching_config.allowed_batch_sizes( - batching_config.allowed_batch_sizes().size() - 1); - const int max_size = batching_config.has_max_batch_size() - ? batching_config.max_batch_size().value() - : Batcher::QueueOptions().input_batch_size_limit; - if (last_allowed_size != max_size) { - return errors::InvalidArgument( - "Last entry in allowed_batch_sizes must match max_batch_size; last " - "entry was ", - last_allowed_size, "; expected ", max_size); - } - } - - Batcher::Options options; - if (batching_config.has_num_batch_threads()) { - options.num_batch_threads = batching_config.num_batch_threads().value(); - } - if (batching_config.has_thread_pool_name()) { - options.thread_pool_name = batching_config.thread_pool_name().value(); - } - return Batcher::Create(options, batch_scheduler); -} - Status EstimateResourceFromPath(const string& path, bool use_validation_result, ResourceAllocation* estimate) { TensorflowFileProbingEnv env(Env::Default()); @@ -97,42 +70,16 @@ Status WrapSessionForBatching(const BatchingParameters& batching_config, return errors::Internal("session not set"); } - Batcher::QueueOptions queue_options; - if (batching_config.has_max_batch_size()) { - queue_options.input_batch_size_limit = - batching_config.max_batch_size().value(); - } - if (batching_config.has_batch_timeout_micros()) { - queue_options.batch_timeout_micros = - batching_config.batch_timeout_micros().value(); - } - if (batching_config.has_max_enqueued_batches()) { - queue_options.max_enqueued_batches = - batching_config.max_enqueued_batches().value(); - } - if (batching_config.has_enable_large_batch_splitting() && - batching_config.enable_large_batch_splitting().value()) { - queue_options.enable_large_batch_splitting = true; - - if (batching_config.has_max_execution_batch_size()) { - queue_options.max_execution_batch_size = - batching_config.max_execution_batch_size().value(); - } else { - queue_options.max_execution_batch_size = - batching_config.max_batch_size().value(); - } - - queue_options.split_input_task_func = - [](std::unique_ptr* - input_task, - int open_batch_remaining_slot, int max_batch_size, - std::vector< - std::unique_ptr>* - output_tasks) -> tensorflow::Status { - return SplitInputTask(input_task, open_batch_remaining_slot, - max_batch_size, output_tasks); - }; - } + auto queue_options = GetQueueOptions< + tensorflow::serving::BatchingSessionTask>( + batching_config, + [](std::unique_ptr* input_task, + int open_batch_remaining_slot, int max_batch_size, + std::vector>* + output_tasks) -> tensorflow::Status { + return SplitInputTask(input_task, open_batch_remaining_slot, + max_batch_size, output_tasks); + }); BatchingSessionOptions batching_session_options; for (int allowed_batch_size : batching_config.allowed_batch_sizes()) { diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_util.h b/tensorflow_serving/servables/tensorflow/bundle_factory_util.h index 2279279fa90..1d1a15761e9 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_util.h +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_util.h @@ -16,6 +16,7 @@ limitations under the License. #ifndef TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_BUNDLE_FACTORY_UTIL_H_ #define TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_BUNDLE_FACTORY_UTIL_H_ +#include "google/protobuf/wrappers.pb.h" #include "tensorflow/core/kernels/batching_util/shared_batch_scheduler.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/protobuf/config.pb.h" @@ -41,10 +42,36 @@ SessionOptions GetSessionOptions(const SessionBundleConfig& config); RunOptions GetRunOptions(const SessionBundleConfig& config); // Creates a BatchScheduler based on the batching configuration. +template Status CreateBatchScheduler( const BatchingParameters& batching_config, - std::shared_ptr>* - batch_scheduler); + std::shared_ptr>* batch_scheduler) { + if (!batching_config.allowed_batch_sizes().empty()) { + // Verify that the last allowed batch size matches the max batch size. + const int last_allowed_size = batching_config.allowed_batch_sizes( + batching_config.allowed_batch_sizes().size() - 1); + const int max_size = + batching_config.has_max_batch_size() + ? batching_config.max_batch_size().value() + : typename SharedBatchScheduler::QueueOptions() + .input_batch_size_limit; + if (last_allowed_size != max_size) { + return errors::InvalidArgument( + "Last entry in allowed_batch_sizes must match max_batch_size; last " + "entry was ", + last_allowed_size, "; expected ", max_size); + } + } + + typename SharedBatchScheduler::Options options; + if (batching_config.has_num_batch_threads()) { + options.num_batch_threads = batching_config.num_batch_threads().value(); + } + if (batching_config.has_thread_pool_name()) { + options.thread_pool_name = batching_config.thread_pool_name().value(); + } + return SharedBatchScheduler::Create(options, batch_scheduler); +} // Estimates the resources a session bundle or saved model bundle will use once // loaded, from its export or saved model path. tensorflow::Env::Default() will @@ -72,6 +99,44 @@ Status WrapSessionForBatching( // Wraps a session in a new session that only supports Run() without batching. Status WrapSession(std::unique_ptr* session); +// Construct Queue Options from BatchingParameters. +template +typename SharedBatchScheduler::QueueOptions GetQueueOptions( + const BatchingParameters& batching_config, + std::function* input_task, + int first_output_task_size, int input_batch_size_limit, + std::vector>* output_tasks)> + split_input_task_func) { + typename SharedBatchScheduler::QueueOptions queue_options; + if (batching_config.has_max_batch_size()) { + queue_options.input_batch_size_limit = + batching_config.max_batch_size().value(); + } + if (batching_config.has_batch_timeout_micros()) { + queue_options.batch_timeout_micros = + batching_config.batch_timeout_micros().value(); + } + if (batching_config.has_max_enqueued_batches()) { + queue_options.max_enqueued_batches = + batching_config.max_enqueued_batches().value(); + } + if (batching_config.has_enable_large_batch_splitting() && + batching_config.enable_large_batch_splitting().value()) { + queue_options.enable_large_batch_splitting = true; + + if (batching_config.has_max_execution_batch_size()) { + queue_options.max_execution_batch_size = + batching_config.max_execution_batch_size().value(); + } else { + queue_options.max_execution_batch_size = + batching_config.max_batch_size().value(); + } + + queue_options.split_input_task_func = split_input_task_func; + } + return queue_options; +} + } // namespace serving } // namespace tensorflow From 32d6972928b7bb88dfcdfe4eacf7f42df4559913 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 23 Mar 2021 00:01:35 -0700 Subject: [PATCH 4835/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/86c17b89-5384-40de-bd04-a9ee59ae5443 PiperOrigin-RevId: 364496704 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9c2e2a92791..6b6ee6bc77d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7acfafa1a4397db88b9565e63bd4c82063317d28b830e5c64dcfedcd9c15db0f", - git_commit = "2dba63671d3335ae8523e955d34f77bd2e475699", + sha256 = "42cba2a2af59d0ac6f74107b9b7d3a993d0458e9a1a5d723a0d29ff1604a5a19", + git_commit = "d7caf30b36b2f769a9dd5449b587a8b4318eaad0", ) # Import all of TensorFlow Serving's external dependencies. From 2f9b6a0ea802ee726d1aba277650a8ddf3a411f9 Mon Sep 17 00:00:00 2001 From: David Rim Date: Tue, 23 Mar 2021 00:49:18 -0700 Subject: [PATCH 4836/8103] Fix memory leak from allocating input tensors PiperOrigin-RevId: 364502280 --- .../tensorflow/tflite_interpreter_pool.cc | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.cc b/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.cc index a4d22b0c171..363c0aff0cf 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.cc @@ -72,18 +72,14 @@ tensorflow::Status TfLiteInterpreterWrapper::SetStringData( if (tensor_buffer_.find(tensor_index) == tensor_buffer_.end()) { return errors::Internal("Tensor input for index not found: ", tensor_index); } - if (tensor_buffer_max_bytes_[tensor_index] > 0 && - required_bytes > tensor_buffer_max_bytes_[tensor_index]) { - tensor_buffer_max_bytes_[tensor_index] = 0; - } - - if (tensor_buffer_max_bytes_[tensor_index] == 0) { - tensor_buffer_[tensor_index].reset( - reinterpret_cast(malloc(required_bytes))); + if (required_bytes > tensor_buffer_max_bytes_[tensor_index]) { + if (tflite_tensor->data.raw) { + free(tflite_tensor->data.raw); + } + tflite_tensor->data.raw = reinterpret_cast(malloc(required_bytes)); tensor_buffer_max_bytes_[tensor_index] = required_bytes; - } else { - tensor_buffer_[tensor_index].reset(tflite_tensor->data.raw); } + tensor_buffer_[tensor_index].reset(tflite_tensor->data.raw); memcpy(tensor_buffer_[tensor_index].get(), &num_strings, sizeof(int32_t)); int32_t start = sizeof(int32_t) * (num_strings + 2); for (size_t i = 0; i < offset_.size(); i++) { From 7c72286781ebbde32503a0c53ff56f0d01e1c326 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 23 Mar 2021 15:58:21 -0700 Subject: [PATCH 4837/8103] Internal visibility change PiperOrigin-RevId: 364665477 --- tensorflow_serving/model_servers/BUILD | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index b0af419f146..4817d4b5ce2 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -20,7 +20,10 @@ licenses(["notice"]) # Apache 2.0 # or other implementation details. package_group( name = "tensorflow_model_server_custom_op_clients", - packages = ["//cloud/ai/documentai/..."], + packages = [ + "//cloud/ai/documentai/...", + "//cloud/ml/tfe/inference_engine/...", + ], ) package_group( From 7e1d4c7b2614982492d3433f02a53cb51d87647a Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Tue, 23 Mar 2021 20:02:35 -0700 Subject: [PATCH 4838/8103] Internal visibility change PiperOrigin-RevId: 364706319 --- tensorflow_serving/model_servers/BUILD | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 4817d4b5ce2..b0af419f146 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -20,10 +20,7 @@ licenses(["notice"]) # Apache 2.0 # or other implementation details. package_group( name = "tensorflow_model_server_custom_op_clients", - packages = [ - "//cloud/ai/documentai/...", - "//cloud/ml/tfe/inference_engine/...", - ], + packages = ["//cloud/ai/documentai/..."], ) package_group( From 3e1314af5e8377e6aae2a8fcc647b5fb5ee86856 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Tue, 23 Mar 2021 22:34:42 -0700 Subject: [PATCH 4839/8103] Internal change. PiperOrigin-RevId: 364727001 --- tensorflow_serving/model_servers/BUILD | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index b0af419f146..50746d3955d 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -18,10 +18,7 @@ licenses(["notice"]) # Apache 2.0 # vanilla TensorFlow ModelServer without any other modifications. Exclusively # for adding custom TensorFlow ops. Does not grant access to private headers # or other implementation details. -package_group( - name = "tensorflow_model_server_custom_op_clients", - packages = ["//cloud/ai/documentai/..."], -) +package_group(name = "tensorflow_model_server_custom_op_clients") package_group( name = "testing", From 57dac6cdca7ffaed0e186ff370cf346db57d1cbc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 24 Mar 2021 10:19:05 -0700 Subject: [PATCH 4840/8103] Removing the validation check on floating type inputs that tries to validate that inputs that look like integers must be exactly representable as a FP number. For instance, if the user sends, "1435774380" as an input that is a DT_FLOAT type, the previous behavior would return an error because 1435774380 "looks like" an int and cannot be exactly represented as an integer as a DT_FLOAT. But this behavior does not make sense. For instance, "1435774380.0" is exactly equivalent to "1435774380" and yet the former is accepted while the latter returns an error. Since the user clearly set the data type to DT_FLOAT, this is surprising and even undesirable behavior (see below). Imagine if `atof` in C correctly parsed the former but rejected the latter. That would be confusing to users, and sometimes make the function difficult or impossible to use. One could argue that the user can "opt-in" to the desired behavior by choosing whether or not to use ".0" at the end of the inputs. While this is true in theory, it is not true in practice since underlying libraries that generate JSON may convert something like `double d = 1435774380.0;` to "1435774380". In fact, this is _exactly_ what happens in Google's own Protobuf -> JSON conversion with the user having absolutely no control over the behavior (FWIW, the library uses `snprintf` with the format string "%.*g"). So users of Google's own libraries cannot generate JSON that is usable by tf-serving. PiperOrigin-RevId: 364832510 --- tensorflow_serving/g3doc/api_rest.md | 15 ++ tensorflow_serving/util/json_tensor.cc | 40 ----- tensorflow_serving/util/json_tensor_test.cc | 154 +++++++++++++++----- 3 files changed, 136 insertions(+), 73 deletions(-) diff --git a/tensorflow_serving/g3doc/api_rest.md b/tensorflow_serving/g3doc/api_rest.md index 5edd203aa59..d0eaf121972 100644 --- a/tensorflow_serving/g3doc/api_rest.md +++ b/tensorflow_serving/g3doc/api_rest.md @@ -330,6 +330,21 @@ DT_STRING DT_INT8, DT_UINT8, DT_INT16, DT_INT32, DT_UINT32, DT_INT64, DT_UINT64 | number | *1, -10, 0* | JSON value will be a decimal number. DT_FLOAT, DT_DOUBLE | number | *1.1, -10.0, 0, `NaN`, `Infinity`* | JSON value will be a number or one of the special token values - `NaN`, `Infinity`, and `-Infinity`. See [JSON conformance](#json-conformance) for more info. Exponent notation is also accepted. +## Floating Point Precision + +JSON has a single number data type. Thus it is possible to provide a value +for an input that results in a loss of precision. For instance, if the +input `x` is a `float` data type, and the input `{"x": 1435774380}` is +sent to the model running on hardware based on the IEEE 754 floating point +standard (e.g. Intel or AMD), then the value will be silently converted by the +underyling hardware to `1435774336` since `1435774380` cannot be exactly +represented in a 32-bit floating point number. Typically, the inputs +to serving should be the same distribution as training, so this generally +won't be problematic because the same conversions happened at training time. +However, in case full precision is needed, be sure to use an underlying data +type in your model that can handle the desired precision and/or consider +client-side checking. + ## Encoding binary values JSON uses UTF-8 encoding. If you have input feature or tensor values that need diff --git a/tensorflow_serving/util/json_tensor.cc b/tensorflow_serving/util/json_tensor.cc index c067206e2e1..d9594605a29 100644 --- a/tensorflow_serving/util/json_tensor.cc +++ b/tensorflow_serving/util/json_tensor.cc @@ -226,37 +226,6 @@ Status FormatSignatureError(const rapidjson::Value& val) { " not formatted correctly. 'signature_name' key must be a string value."); } -Status LossyDecimalError(const rapidjson::Value& val, const string& target) { - return errors::InvalidArgument( - "Cannot convert JSON value: ", JsonValueToString(val), " to ", target, - " without loss of precision."); -} - -template -bool IsLosslessDecimal(const rapidjson::Value& val) { - static_assert(std::is_same::value || std::is_same::value, - "Only floating point value types are supported."); - static_assert(std::numeric_limits::radix == 2, - "Floating point type must have base 2."); - - // Note, we use GetDouble() for both types as std::isfinite() returns false - // for decimal values that do not fit in float (due to the static_cast<> used - // in converting double to float in GetFloat() call). - if (!std::isfinite(val.GetDouble())) return true; - - // Maximum integer value that can be represented by the floating type. - static constexpr int64 kMaxInt = (1LL << std::numeric_limits::digits) - 1; - - if (val.IsUint64()) { - return val.GetUint64() <= kMaxInt; - } - if (val.IsInt64()) { - return std::abs(val.GetInt64()) <= kMaxInt; - } - return val.GetDouble() <= std::numeric_limits::max() && - val.GetDouble() >= std::numeric_limits::lowest(); -} - // Adds a JSON value to Tensor. Returns error if value cannot be converted // to dtype. In case of error (output) tensor is not modified. // @@ -266,17 +235,11 @@ Status AddValueToTensor(const rapidjson::Value& val, DataType dtype, switch (dtype) { case DT_FLOAT: if (!val.IsNumber()) return TypeError(val, dtype); - if (!IsLosslessDecimal(val)) { - return LossyDecimalError(val, "float"); - } tensor->add_float_val(val.GetFloat()); break; case DT_DOUBLE: if (!val.IsNumber()) return TypeError(val, dtype); - if (!IsLosslessDecimal(val)) { - return LossyDecimalError(val, "double"); - } tensor->add_double_val(val.GetDouble()); break; @@ -765,9 +728,6 @@ Status AddValueToFeature(const rapidjson::Value& val, if (!IsFeatureOfKind(*feature, Feature::KindCase::kFloatList)) { return IncompatibleFeatureKindError(feature_name, *feature); } - if (!IsLosslessDecimal(val)) { - return LossyDecimalError(val, "float"); - } feature->mutable_float_list()->add_value(val.GetFloat()); } else { if (!IsFeatureOfKind(*feature, Feature::KindCase::kInt64List)) { diff --git a/tensorflow_serving/util/json_tensor_test.cc b/tensorflow_serving/util/json_tensor_test.cc index 2cd3db1e5ae..c9671946167 100644 --- a/tensorflow_serving/util/json_tensor_test.cc +++ b/tensorflow_serving/util/json_tensor_test.cc @@ -137,6 +137,127 @@ TEST(JsontensorTest, MixedInputForDoubleTensor) { )")); } +// This test was borne out of b/181409782. Essentially, we expect that +// inputs 1435774380 and 1435774380.0 behave exactly the same. Prior to the +// bug fix, the former was rejected because it couldn't be exactly +// represented by DT_FLOAT, but the latter was accepted, even though it, too, +// could not be exactly represented by DT_FLOAT. Post-fix, they are both +// accepted. +TEST(JsontensorTest, FloatTensorWithPrecisionLoss) { + TensorInfoMap infomap; + ASSERT_TRUE( + TextFormat::ParseFromString("dtype: DT_FLOAT", &infomap["default"])); + + PredictRequest req; + JsonPredictRequestFormat format; + TF_EXPECT_OK(FillPredictRequestFromJson(R"( + { + "instances": [1435774380] + })", + getmap(infomap), &req, &format)); + auto tmap = req.inputs(); + EXPECT_EQ(tmap.size(), 1); + EXPECT_EQ(format, JsonPredictRequestFormat::kRow); + + // Please note that the float_val has changed due to precision loss. + EXPECT_THAT(tmap["default"], EqualsProto(R"( + dtype: DT_FLOAT + tensor_shape { dim { size: 1 } } + float_val: 1435774380 + )")); + + // Now, add a decimal point to the end, and expect exactly the same behavior. + TF_EXPECT_OK(FillPredictRequestFromJson(R"( + { + "instances": [1435774380.0] + })", + getmap(infomap), &req, &format)); + tmap = req.inputs(); + EXPECT_EQ(tmap.size(), 1); + EXPECT_EQ(format, JsonPredictRequestFormat::kRow); + + // As before, the float_val has changed due to precision loss. + EXPECT_THAT(tmap["default"], EqualsProto(R"( + dtype: DT_FLOAT + tensor_shape { dim { size: 1 } } + float_val: 1435774380.0 + )")); +} + +TEST(JsontensorTest, FloatTensorThatExceedsMaxReturnsInf) { + TensorInfoMap infomap; + ASSERT_TRUE( + TextFormat::ParseFromString("dtype: DT_FLOAT", &infomap["default"])); + + PredictRequest req; + JsonPredictRequestFormat format; + TF_EXPECT_OK(FillPredictRequestFromJson( + absl::Substitute(R"({ "instances": [$0] })", + std::numeric_limits::max()), + getmap(infomap), &req, &format)); + auto tmap = req.inputs(); + EXPECT_EQ(tmap.size(), 1); + EXPECT_EQ(format, JsonPredictRequestFormat::kRow); + + EXPECT_THAT(tmap["default"], EqualsProto(R"( + dtype: DT_FLOAT + tensor_shape { dim { size: 1 } } + float_val: inf + )")); + + // Test for minimum, too (gets converted to -inf) + TF_EXPECT_OK(FillPredictRequestFromJson( + absl::Substitute(R"({ "instances": [$0] })", + -std::numeric_limits::max()), + getmap(infomap), &req, &format)); + tmap = req.inputs(); + EXPECT_EQ(tmap.size(), 1); + EXPECT_EQ(format, JsonPredictRequestFormat::kRow); + + EXPECT_THAT(tmap["default"], EqualsProto(R"( + dtype: DT_FLOAT + tensor_shape { dim { size: 1 } } + float_val: -inf + )")); +} + +TEST(JsontensorTest, FloatTensorThatExceedsMinReturnsZero) { + TensorInfoMap infomap; + ASSERT_TRUE( + TextFormat::ParseFromString("dtype: DT_FLOAT", &infomap["default"])); + + PredictRequest req; + JsonPredictRequestFormat format; + TF_EXPECT_OK(FillPredictRequestFromJson( + absl::Substitute(R"({ "instances": [$0] })", + std::numeric_limits::min()), + getmap(infomap), &req, &format)); + auto tmap = req.inputs(); + EXPECT_EQ(tmap.size(), 1); + EXPECT_EQ(format, JsonPredictRequestFormat::kRow); + + EXPECT_THAT(tmap["default"], EqualsProto(R"( + dtype: DT_FLOAT + tensor_shape { dim { size: 1 } } + float_val: 0 + )")); + + // Test for minimum, too (gets converted to -inf) + TF_EXPECT_OK(FillPredictRequestFromJson( + absl::Substitute(R"({ "instances": [$0] })", + -std::numeric_limits::min()), + getmap(infomap), &req, &format)); + tmap = req.inputs(); + EXPECT_EQ(tmap.size(), 1); + EXPECT_EQ(format, JsonPredictRequestFormat::kRow); + + EXPECT_THAT(tmap["default"], EqualsProto(R"( + dtype: DT_FLOAT + tensor_shape { dim { size: 1 } } + float_val: -0 + )")); +} + TEST(JsontensorTest, SingleUnnamedTensorWithSignature) { TensorInfoMap infomap; ASSERT_TRUE( @@ -542,31 +663,6 @@ TEST(JsontensorTest, SingleUnnamedTensorErrors) { getmap(infomap), &req, &format); ASSERT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("not of expected type")); - - ASSERT_TRUE( - TextFormat::ParseFromString("dtype: DT_FLOAT", &infomap["default"])); - status = FillPredictRequestFromJson( - absl::Substitute(R"({ "instances": [$0] })", - std::numeric_limits::max()), - getmap(infomap), &req, &format); - ASSERT_TRUE(errors::IsInvalidArgument(status)); - EXPECT_THAT(status.error_message(), HasSubstr("loss of precision")); - - ASSERT_TRUE( - TextFormat::ParseFromString("dtype: DT_FLOAT", &infomap["default"])); - status = FillPredictRequestFromJson( - absl::Substitute(R"({ "instances": [$0] })", 16777217), getmap(infomap), - &req, &format); - ASSERT_TRUE(errors::IsInvalidArgument(status)); - EXPECT_THAT(status.error_message(), HasSubstr("loss of precision")); - - ASSERT_TRUE( - TextFormat::ParseFromString("dtype: DT_DOUBLE", &infomap["default"])); - status = FillPredictRequestFromJson( - absl::Substitute(R"({ "instances": [$0] })", 9007199254740993ull), - getmap(infomap), &req, &format); - ASSERT_TRUE(errors::IsInvalidArgument(status)); - EXPECT_THAT(status.error_message(), HasSubstr("loss of precision")); } TEST(JsontensorTest, MultipleNamedTensorErrors) { @@ -1396,14 +1492,6 @@ TYPED_TEST(ClassifyRegressRequestTest, JsonErrors) { &req); ASSERT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("Only int64 is supported")); - - req.Clear(); - status = this->FillRequest( - absl::Substitute(R"({ "examples": [ { "names": $0 } ] })", - std::numeric_limits::max()), - &req); - ASSERT_TRUE(errors::IsInvalidArgument(status)); - EXPECT_THAT(status.error_message(), HasSubstr("loss of precision")); } TEST(ClassifyRegressnResultTest, JsonFromClassificationResult) { From 7e8720dacc1e644d2858d4856fc56d6c01a81441 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 24 Mar 2021 14:30:47 -0700 Subject: [PATCH 4841/8103] Adding enable_profiler command line flag. PiperOrigin-RevId: 364891811 --- tensorflow_serving/model_servers/main.cc | 4 +++- tensorflow_serving/model_servers/server.cc | 8 ++++++-- tensorflow_serving/model_servers/server.h | 1 + 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index a83f95cce66..02376c68c9c 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -235,7 +235,9 @@ int main(int argc, char** argv) { "EXPERIMENTAL; CAN BE REMOVED ANYTIME! " "Enable XLA:CPU JIT (default is disabled). With XLA:CPU JIT " "disabled, models utilizing this feature will return bad Status " - "on first compilation request.")}; + "on first compilation request."), + tensorflow::Flag("enable_profiler", &options.enable_profiler, + "Enable profiler service.")}; const auto& usage = tensorflow::Flags::Usage(argv[0], flag_list); if (!tensorflow::Flags::Parse(&argc, argv, flag_list)) { diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index 0e4ca2343c6..aa6d9c00491 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -343,7 +343,6 @@ Status Server::BuildAndStart(const Options& server_options) { prediction_service_ = absl::make_unique(predict_server_options); - profiler_service_ = tensorflow::profiler::CreateProfilerService(); ::grpc::ServerBuilder builder; // If defined, listen to a tcp port for gRPC/HTTP. @@ -361,7 +360,11 @@ Status Server::BuildAndStart(const Options& server_options) { } builder.RegisterService(model_service_.get()); builder.RegisterService(prediction_service_.get()); - builder.RegisterService(profiler_service_.get()); + if (server_options.enable_profiler) { + profiler_service_ = tensorflow::profiler::CreateProfilerService(); + builder.RegisterService(profiler_service_.get()); + LOG(INFO) << "Profiler service is enabled"; + } builder.SetMaxMessageSize(tensorflow::kint32max); const std::vector channel_arguments = parseGrpcChannelArgs(server_options.grpc_channel_arguments); @@ -376,6 +379,7 @@ Status Server::BuildAndStart(const Options& server_options) { builder.AddChannelArgument(channel_argument.key, channel_argument.value); } } + ::grpc::ResourceQuota res_quota; res_quota.SetMaxThreads(server_options.grpc_max_threads); builder.SetResourceQuota(res_quota); diff --git a/tensorflow_serving/model_servers/server.h b/tensorflow_serving/model_servers/server.h index bcb55db1592..fa99e03c6bd 100644 --- a/tensorflow_serving/model_servers/server.h +++ b/tensorflow_serving/model_servers/server.h @@ -92,6 +92,7 @@ class Server { tensorflow::int32 num_tflite_interpreters_per_pool = 1; tensorflow::string thread_pool_factory_config_file; bool enable_signature_method_name_check = false; + bool enable_profiler = true; Options(); }; From 623da67418df5be71494a4d82065351d6e4425c3 Mon Sep 17 00:00:00 2001 From: Li Lao Date: Thu, 25 Mar 2021 13:37:27 -0700 Subject: [PATCH 4842/8103] Add logging in ServerCore. PiperOrigin-RevId: 365113816 --- tensorflow_serving/model_servers/server_core.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tensorflow_serving/model_servers/server_core.cc b/tensorflow_serving/model_servers/server_core.cc index aac86a1233a..6991e09efa1 100644 --- a/tensorflow_serving/model_servers/server_core.cc +++ b/tensorflow_serving/model_servers/server_core.cc @@ -483,12 +483,15 @@ Status ServerCore::ReloadConfig(const ModelServerConfig& new_config) { default: return errors::InvalidArgument("Invalid ServerModelConfig"); } + LOG(INFO) << "Finished adding/updating models"; + TF_RETURN_IF_ERROR(MaybeUpdateServerRequestLogger(config_.config_case())); if (options_.flush_filesystem_caches) { return Env::Default()->FlushFileSystemCaches(); } + LOG(INFO) << "Finished reloading config"; return Status::OK(); } From 28a3d7e3448cb370123b286a88a55b8258d144d9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 26 Mar 2021 00:01:22 -0700 Subject: [PATCH 4843/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c91f3c8a-72b2-484b-9438-3bb7c8246493 PiperOrigin-RevId: 365197957 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6b6ee6bc77d..cc061dbf0f2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "42cba2a2af59d0ac6f74107b9b7d3a993d0458e9a1a5d723a0d29ff1604a5a19", - git_commit = "d7caf30b36b2f769a9dd5449b587a8b4318eaad0", + sha256 = "4d4e0d55e4f4b2928f18fa741ed24d06db392bcbcc4fb9f078772610c45e204b", + git_commit = "af9a6e89d2f18607e4aa064a914ffd0499429e28", ) # Import all of TensorFlow Serving's external dependencies. From 99ff58242404240c77bf9f9396bf0a1a525a5406 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 26 Mar 2021 06:01:29 -0700 Subject: [PATCH 4844/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4a39b5d1-7616-477d-890b-ab3e270655a1 PiperOrigin-RevId: 365228582 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cc061dbf0f2..2d8d86ddb3a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4d4e0d55e4f4b2928f18fa741ed24d06db392bcbcc4fb9f078772610c45e204b", - git_commit = "af9a6e89d2f18607e4aa064a914ffd0499429e28", + sha256 = "b370e7cd6ca870f993448a415b928c5496a91820c05f553519c0b16c4cb037fd", + git_commit = "1a8ba4596115b36a174b5d5aecd0baf9359bb62f", ) # Import all of TensorFlow Serving's external dependencies. From 29a5740b1bcb0322e47ba7e3bff9d49806f36a82 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 26 Mar 2021 12:01:19 -0700 Subject: [PATCH 4845/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/72463ffe-b789-44a9-aa86-850e8a3d7cf5 PiperOrigin-RevId: 365259284 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2d8d86ddb3a..32eb5ac4ee1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b370e7cd6ca870f993448a415b928c5496a91820c05f553519c0b16c4cb037fd", - git_commit = "1a8ba4596115b36a174b5d5aecd0baf9359bb62f", + sha256 = "c8c5cc1877777cb242a91dfd6b0a3b1b28423ffdbcd67c5e07260864f6b02f0a", + git_commit = "09076668fed9d6412930de99ede666c35682fabb", ) # Import all of TensorFlow Serving's external dependencies. From bcea6d9d4c454e1fcc6f085c6ab9ad2102e80c22 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 26 Mar 2021 18:01:20 -0700 Subject: [PATCH 4846/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8cce3ca8-3a2e-424c-9444-6a53fa0d0b6a PiperOrigin-RevId: 365288130 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 32eb5ac4ee1..73efcab88fe 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c8c5cc1877777cb242a91dfd6b0a3b1b28423ffdbcd67c5e07260864f6b02f0a", - git_commit = "09076668fed9d6412930de99ede666c35682fabb", + sha256 = "11604054d0d03183e546419066f9d6e9f57d7a76ea4a5187796988a154020e60", + git_commit = "6f72753a66d6abab8b839cc263a9f1329861f6f9", ) # Import all of TensorFlow Serving's external dependencies. From 71c89ef94d75cda8551c5c31324c4c4661d82777 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 27 Mar 2021 00:01:41 -0700 Subject: [PATCH 4847/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/879fe4bd-7e07-46bb-9d86-cd54d37496c4 PiperOrigin-RevId: 365312946 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 73efcab88fe..feca3b90a76 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "11604054d0d03183e546419066f9d6e9f57d7a76ea4a5187796988a154020e60", - git_commit = "6f72753a66d6abab8b839cc263a9f1329861f6f9", + sha256 = "057f9db830d9b91ab6c7e6d0fc5a56cefee8bd2e7d99346f8f930f907ee0c97d", + git_commit = "cb3e0b2bb94ec414d709970181259e2f2cbba769", ) # Import all of TensorFlow Serving's external dependencies. From 993f3bbcfde9d1f2ae4b6901bae45fefed922052 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 27 Mar 2021 06:01:33 -0700 Subject: [PATCH 4848/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/24bb59bd-184b-41c2-930d-ea2b62434f34 PiperOrigin-RevId: 365337260 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index feca3b90a76..ac8f9ba2dd9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "057f9db830d9b91ab6c7e6d0fc5a56cefee8bd2e7d99346f8f930f907ee0c97d", - git_commit = "cb3e0b2bb94ec414d709970181259e2f2cbba769", + sha256 = "e3c6b8f1f4cd9eaa8335f4b012bf7d31a49ce17f6a3c786e4ae8ad08aa0cd400", + git_commit = "3c16284eb619732b69948f0200ee06c5dd7312d0", ) # Import all of TensorFlow Serving's external dependencies. From b97a568fd990c13fc833ae18f92317ec1d6309a5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 27 Mar 2021 18:01:12 -0700 Subject: [PATCH 4849/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5d467601-c0b1-4c38-a9a8-df918612be8b PiperOrigin-RevId: 365386271 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ac8f9ba2dd9..91a358bca80 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e3c6b8f1f4cd9eaa8335f4b012bf7d31a49ce17f6a3c786e4ae8ad08aa0cd400", - git_commit = "3c16284eb619732b69948f0200ee06c5dd7312d0", + sha256 = "c1620b5f5d5d859dfff4f105b5230c907b595082adb25437adf92f8e4f89c8c9", + git_commit = "b221f78a300a6e50564acfd94dae6b608008474d", ) # Import all of TensorFlow Serving's external dependencies. From 96fdb8cab6745aa529d9761b3ba85fa4e191248a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 28 Mar 2021 06:01:30 -0700 Subject: [PATCH 4850/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/22c12d68-4c5b-40dc-b101-c84d48b46930 PiperOrigin-RevId: 365435177 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 91a358bca80..af136b8d867 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c1620b5f5d5d859dfff4f105b5230c907b595082adb25437adf92f8e4f89c8c9", - git_commit = "b221f78a300a6e50564acfd94dae6b608008474d", + sha256 = "4a9c718e9255563dbc67456df83d92bf311a05049c2a4f175ef6868b3dda0e12", + git_commit = "0917ab03212c195797ccedece2f32c0fb10e99b7", ) # Import all of TensorFlow Serving's external dependencies. From ab1d988b28f85157b1c807366ecc0e92d0370261 Mon Sep 17 00:00:00 2001 From: kiddos Date: Sun, 28 Mar 2021 23:41:39 +0800 Subject: [PATCH 4851/8103] rename enable_cors_header -> enable_cors_support --- tensorflow_serving/model_servers/http_rest_api_handler.cc | 2 +- tensorflow_serving/model_servers/main.cc | 2 +- tensorflow_serving/model_servers/server.cc | 2 +- tensorflow_serving/model_servers/server.h | 2 +- tensorflow_serving/model_servers/server_core.h | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tensorflow_serving/model_servers/http_rest_api_handler.cc b/tensorflow_serving/model_servers/http_rest_api_handler.cc index d87b2586c07..7a87464b6ff 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler.cc +++ b/tensorflow_serving/model_servers/http_rest_api_handler.cc @@ -69,7 +69,7 @@ Status HttpRestApiHandler::ProcessRequest( headers->clear(); output->clear(); AddHeaders(headers); - if (core_->enable_cors_headers()) { + if (core_->enable_cors_support()) { AddCORSHeaders(headers); } string model_version_str; diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index 91cfe53c422..80dddc83e06 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -75,7 +75,7 @@ int main(int argc, char** argv) { "set, will be auto set based on number of CPUs."), tensorflow::Flag("rest_api_timeout_in_ms", &options.http_timeout_in_ms, "Timeout for HTTP/REST API calls."), - tensorflow::Flag("rest_api_enable_cors_headers", &options.enable_cors_headers, + tensorflow::Flag("rest_api_enable_cors_support", &options.enable_cors_support, "Enable CORS headers in response"), tensorflow::Flag("enable_batching", &options.enable_batching, "enable batching"), diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index dfc41b50b5e..46e3b2cb8d0 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -300,7 +300,7 @@ Status Server::BuildAndStart(const Options& server_options) { options.flush_filesystem_caches = server_options.flush_filesystem_caches; options.allow_version_labels_for_unavailable_models = server_options.allow_version_labels_for_unavailable_models; - options.enable_cors_headers = server_options.enable_cors_headers; + options.enable_cors_support = server_options.enable_cors_support; TF_RETURN_IF_ERROR(ServerCore::Create(std::move(options), &server_core_)); diff --git a/tensorflow_serving/model_servers/server.h b/tensorflow_serving/model_servers/server.h index 171b2b34df7..3326eb59472 100644 --- a/tensorflow_serving/model_servers/server.h +++ b/tensorflow_serving/model_servers/server.h @@ -51,7 +51,7 @@ class Server { tensorflow::int32 http_port = 0; tensorflow::int32 http_num_threads = 4.0 * port::NumSchedulableCPUs(); tensorflow::int32 http_timeout_in_ms = 30000; // 30 seconds. - bool enable_cors_headers = false; + bool enable_cors_support = false; // // Model Server options. diff --git a/tensorflow_serving/model_servers/server_core.h b/tensorflow_serving/model_servers/server_core.h index 58c6f537109..ef5a28ab093 100644 --- a/tensorflow_serving/model_servers/server_core.h +++ b/tensorflow_serving/model_servers/server_core.h @@ -191,7 +191,7 @@ class ServerCore : public Manager { // The prefix to append to the file system storage paths. std::string storage_path_prefix; - bool enable_cors_headers = false; + bool enable_cors_support = false; }; virtual ~ServerCore() = default; @@ -268,7 +268,7 @@ class ServerCore : public Manager { return options_.predict_response_tensor_serialization_option; } - bool enable_cors_headers() const { return options_.enable_cors_headers; } + bool enable_cors_support() const { return options_.enable_cors_support; } protected: ServerCore(Options options); From 88c29c4e31a1882381b7b21bfd3d180f2df989c9 Mon Sep 17 00:00:00 2001 From: kiddos Date: Sun, 28 Mar 2021 23:44:35 +0800 Subject: [PATCH 4852/8103] add notes that OPTIONS request is not allowed by default in libevent2 --- .../util/net_http/server/internal/evhttp_server.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc b/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc index 24e0ebc1cde..258ec521f34 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc @@ -105,6 +105,10 @@ bool EvHTTPServer::Initialize() { return false; } + // By default libevents only allow GET, POST, HEAD, PUT, DELETE request + // we have to manually turn OPTIONS flag on + // documentation: + // (http://www.wangafu.net/~nickm/libevent-2.0/doxygen/html/http_8h.html) evhttp_set_allowed_methods(ev_http_, EVHTTP_REQ_GET | EVHTTP_REQ_POST | EVHTTP_REQ_HEAD | EVHTTP_REQ_PUT | EVHTTP_REQ_DELETE | EVHTTP_REQ_OPTIONS); From a2c28a6b19a8fa510870cf0b5401f1bf9679ec95 Mon Sep 17 00:00:00 2001 From: kiddos Date: Sun, 28 Mar 2021 23:46:37 +0800 Subject: [PATCH 4853/8103] remove OPTIONS because it is directly handled --- tensorflow_serving/model_servers/http_rest_api_util.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/model_servers/http_rest_api_util.cc b/tensorflow_serving/model_servers/http_rest_api_util.cc index 9a06760ecfb..c60a5965b8b 100644 --- a/tensorflow_serving/model_servers/http_rest_api_util.cc +++ b/tensorflow_serving/model_servers/http_rest_api_util.cc @@ -35,7 +35,7 @@ void AddHeaders(std::vector>* headers) { void AddCORSHeaders(std::vector>* headers) { headers->push_back({"Access-Control-Allow-Origin", "*"}); - headers->push_back({"Access-Control-Allow-Methods", "POST, GET, OPTIONS"}); + headers->push_back({"Access-Control-Allow-Methods", "POST, GET"}); headers->push_back({"Access-Control-Allow-Headers", "Content-Type"}); } From 3e11e3b4e0fc2c9320187e0dad7cb06a87e6ae7a Mon Sep 17 00:00:00 2001 From: kiddos Date: Sun, 28 Mar 2021 23:48:15 +0800 Subject: [PATCH 4854/8103] change output message for OPTIONS request --- tensorflow_serving/model_servers/http_server.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tensorflow_serving/model_servers/http_server.cc b/tensorflow_serving/model_servers/http_server.cc index 213b70dc29c..fd0466ccd84 100644 --- a/tensorflow_serving/model_servers/http_server.cc +++ b/tensorflow_serving/model_servers/http_server.cc @@ -167,10 +167,11 @@ class RestApiRequestDispatcher { if (req->http_method() == "OPTIONS") { absl::string_view origin_header = req->GetRequestHeader("Origin"); if (RE2::PartialMatch(origin_header, "https?://")) { + output.clear(); status = Status::OK(); } else { status = errors::FailedPrecondition( - "Origin header not found in request: ", req->http_method()); + "Origin header is missing in CORS preflight"); } } From 56c738ec41e27ddd8005888ea97c10bc17965ef8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 29 Mar 2021 00:01:24 -0700 Subject: [PATCH 4855/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c202e818-bd22-493f-af4e-b3045cf7b359 PiperOrigin-RevId: 365513760 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index af136b8d867..547e7404d68 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4a9c718e9255563dbc67456df83d92bf311a05049c2a4f175ef6868b3dda0e12", - git_commit = "0917ab03212c195797ccedece2f32c0fb10e99b7", + sha256 = "9a9704f2f2f51a7ca965122c3ef1de8df593c24d4faa08914d23009eba0f0b94", + git_commit = "9d9ed70b564f10c8d62a94363e6975d66f94ae95", ) # Import all of TensorFlow Serving's external dependencies. From dc3186e13eee2e0f9c1dc804ae3caf54677d729b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 29 Mar 2021 06:01:30 -0700 Subject: [PATCH 4856/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/acf50d20-e86a-4294-993e-e98982c6a28f PiperOrigin-RevId: 365556669 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 547e7404d68..40116c26d7c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9a9704f2f2f51a7ca965122c3ef1de8df593c24d4faa08914d23009eba0f0b94", - git_commit = "9d9ed70b564f10c8d62a94363e6975d66f94ae95", + sha256 = "efd84bc8199fe5dbc2bd87396b48cd5c8551c2b8cf9de7b15a728dd658a9e93c", + git_commit = "1e8f4666f2fbc1bdd4ce2797b218de0453cffc63", ) # Import all of TensorFlow Serving's external dependencies. From bce89bfad83d7b23f7b16246b88ba9f51aa3008b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 29 Mar 2021 12:01:25 -0700 Subject: [PATCH 4857/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/186d0cea-3e12-4fbd-a8cf-1b0eb64b61a8 PiperOrigin-RevId: 365629814 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 40116c26d7c..9a8c4a419e6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "efd84bc8199fe5dbc2bd87396b48cd5c8551c2b8cf9de7b15a728dd658a9e93c", - git_commit = "1e8f4666f2fbc1bdd4ce2797b218de0453cffc63", + sha256 = "47124abfd0425561934b772ca258376ea9a5d59efbbed19964f1a10c854a69af", + git_commit = "c1c152074a1a234cfb62b317acb21e423ae5fce6", ) # Import all of TensorFlow Serving's external dependencies. From 8e97b59fc3376d7bea8ea8c067da09c225c1da8a Mon Sep 17 00:00:00 2001 From: Adam Wood Date: Mon, 29 Mar 2021 15:45:24 -0700 Subject: [PATCH 4858/8103] removes mention of ASCII PiperOrigin-RevId: 365681842 --- tensorflow_serving/g3doc/serving_config.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tensorflow_serving/g3doc/serving_config.md b/tensorflow_serving/g3doc/serving_config.md index 068a74a5614..ccba616784b 100644 --- a/tensorflow_serving/g3doc/serving_config.md +++ b/tensorflow_serving/g3doc/serving_config.md @@ -60,10 +60,9 @@ and unload model A. ### Model Server Config Details -The Model Server configuration file provided must be an ASCII +The Model Server configuration file provided must be a [ModelServerConfig](https://github.com/tensorflow/serving/blob/master/tensorflow_serving/config/model_server_config.proto#L76) -protocol buffer. Refer to the following to understand -[what an ASCII protocol buffer looks like](https://stackoverflow.com/questions/18873924/what-does-the-protobuf-text-format-look-like). +[protocol buffer](https://stackoverflow.com/questions/18873924/what-does-the-protobuf-text-format-look-like). For all but the most advanced use-cases, you'll want to use the ModelConfigList option, which is a list of From 1b1353bc75c1e1770aec5a9f153ab309f36493cf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 29 Mar 2021 18:01:43 -0700 Subject: [PATCH 4859/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c39ff739-1cbd-4946-84a6-705ea206a519 PiperOrigin-RevId: 365706768 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9a8c4a419e6..c5039ae3449 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "47124abfd0425561934b772ca258376ea9a5d59efbbed19964f1a10c854a69af", - git_commit = "c1c152074a1a234cfb62b317acb21e423ae5fce6", + sha256 = "009e2d92f218a4b2a9638443eaf8a9008242329d84680903a026ad6346ace1a0", + git_commit = "77c4e733c59d0a494c743401051717937a411941", ) # Import all of TensorFlow Serving's external dependencies. From 25a2784d452c9a516f5e9d41e554c3ae9f5b074a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 30 Mar 2021 00:01:28 -0700 Subject: [PATCH 4860/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/20ce5aa5-a286-479c-a9a7-9814665fd27f PiperOrigin-RevId: 365749293 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c5039ae3449..2f1a314741a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "009e2d92f218a4b2a9638443eaf8a9008242329d84680903a026ad6346ace1a0", - git_commit = "77c4e733c59d0a494c743401051717937a411941", + sha256 = "532572adc6c9f31e8dfb0e3aee9162a69e75ee1530a70f3732acca5f455a5439", + git_commit = "f541e46212636fd77075d746f25a54037751fdaa", ) # Import all of TensorFlow Serving's external dependencies. From 0ec24e8994e5b28fc5560b05fa4fea9e0ee23768 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 30 Mar 2021 06:01:43 -0700 Subject: [PATCH 4861/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1387a62b-10b4-4daf-8a54-0f00bf6589e4 PiperOrigin-RevId: 365793388 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2f1a314741a..497ab14442e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "532572adc6c9f31e8dfb0e3aee9162a69e75ee1530a70f3732acca5f455a5439", - git_commit = "f541e46212636fd77075d746f25a54037751fdaa", + sha256 = "1c23f669d3f3f3e4ee84498089428984c7885f464735ae4a4e4bfa300cd62d98", + git_commit = "ea6babbad111a61171d56ee75e405e7c7b908ffc", ) # Import all of TensorFlow Serving's external dependencies. From c2ba150f2bc00a256aba1d2a0e5dc153204576ea Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 30 Mar 2021 12:01:22 -0700 Subject: [PATCH 4862/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2e658e58-dbd6-417b-97cd-ef2cd634dca0 PiperOrigin-RevId: 365864406 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 497ab14442e..cbee7ccd695 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1c23f669d3f3f3e4ee84498089428984c7885f464735ae4a4e4bfa300cd62d98", - git_commit = "ea6babbad111a61171d56ee75e405e7c7b908ffc", + sha256 = "fa2fe87c86e8988a257a1f1c6fad81325936102dd2badaf982008423c0ba5ed1", + git_commit = "6bdbef1305ca158cf7131a53824b94e93167bfc7", ) # Import all of TensorFlow Serving's external dependencies. From e6f62c15f8b14467c77fe46fe7fe54b60753140b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 30 Mar 2021 18:01:39 -0700 Subject: [PATCH 4863/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1d73010f-68ac-4341-bb16-7001fc291a01 PiperOrigin-RevId: 365937504 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cbee7ccd695..fbb7e623093 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fa2fe87c86e8988a257a1f1c6fad81325936102dd2badaf982008423c0ba5ed1", - git_commit = "6bdbef1305ca158cf7131a53824b94e93167bfc7", + sha256 = "5050888209baaf461377eab63811d233ad7c09bfdcd0dcb8700f1430234b5ae8", + git_commit = "3daa288d88bad674cbca7eb1f7a69253303a5d96", ) # Import all of TensorFlow Serving's external dependencies. From 4f32c295af9711aeab371183f2edc0ff6ae54104 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 31 Mar 2021 00:03:08 -0700 Subject: [PATCH 4864/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/16f47a23-f61a-4c56-82fb-b84f369f7092 PiperOrigin-RevId: 365976006 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fbb7e623093..ffa1b1217dd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5050888209baaf461377eab63811d233ad7c09bfdcd0dcb8700f1430234b5ae8", - git_commit = "3daa288d88bad674cbca7eb1f7a69253303a5d96", + sha256 = "ff86b47598b487162209a8f3d39653d833038d5fc97c001fe7d4fb28fadc1195", + git_commit = "2209bb24c484960323d045d19f2718cd66ec99ea", ) # Import all of TensorFlow Serving's external dependencies. From a5435d6362c4c44e028c799d17b61a72d9fdb386 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 31 Mar 2021 06:01:53 -0700 Subject: [PATCH 4865/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0b371b7d-e313-44af-9080-1486379aa617 PiperOrigin-RevId: 366017004 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ffa1b1217dd..f01969385f6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ff86b47598b487162209a8f3d39653d833038d5fc97c001fe7d4fb28fadc1195", - git_commit = "2209bb24c484960323d045d19f2718cd66ec99ea", + sha256 = "636645d03b694021ccc37bb444d97222d524edb4c8b4a5b350b6100366d06e78", + git_commit = "dae8f2fb7106c12466efdb1c538e3288bf2904fe", ) # Import all of TensorFlow Serving's external dependencies. From 1beed529515f6d37824a8a15ffafbeb979dc8f37 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 31 Mar 2021 12:01:37 -0700 Subject: [PATCH 4866/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/35fe5ccd-8c02-4692-a4bf-b2ee616c3086 PiperOrigin-RevId: 366085438 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f01969385f6..9aab81397d8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "636645d03b694021ccc37bb444d97222d524edb4c8b4a5b350b6100366d06e78", - git_commit = "dae8f2fb7106c12466efdb1c538e3288bf2904fe", + sha256 = "a817d758a280f1a7f07ae67d8506be7650903754458abd6304e9509f360b9c6e", + git_commit = "839f6a182a5a1daa174366b7a968eda6b989b46d", ) # Import all of TensorFlow Serving's external dependencies. From 0038c27cfd6af2d21b97b297c5c215bd1a55f2eb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 31 Mar 2021 18:01:26 -0700 Subject: [PATCH 4867/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/cd42216e-9813-460e-88ca-9a210a4aa3ad PiperOrigin-RevId: 366156293 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9aab81397d8..db1ec317511 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a817d758a280f1a7f07ae67d8506be7650903754458abd6304e9509f360b9c6e", - git_commit = "839f6a182a5a1daa174366b7a968eda6b989b46d", + sha256 = "ae5f42422f5dbf999720bd59d757b060563061913459132527dbab2da6cc7c74", + git_commit = "75e42f8f26b75fe5e8af8461152fd1389e1c8229", ) # Import all of TensorFlow Serving's external dependencies. From c589521b693fe56d9c88f616000eefa5a04798ab Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 1 Apr 2021 00:01:42 -0700 Subject: [PATCH 4868/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b84c0843-68e4-4d4f-89b0-4be57a99d40b PiperOrigin-RevId: 366194165 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index db1ec317511..d080dfc9abf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ae5f42422f5dbf999720bd59d757b060563061913459132527dbab2da6cc7c74", - git_commit = "75e42f8f26b75fe5e8af8461152fd1389e1c8229", + sha256 = "151e9ec08a5a6a42e9ae3a22d51518fcdeb244d3340ffad0d76088c5f023af7e", + git_commit = "b1b396571bea408e4bfbcd94371e387f77cac5d1", ) # Import all of TensorFlow Serving's external dependencies. From 4d832837f3cc8f2b54ea176190cb821bcdfa88cf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 1 Apr 2021 06:02:23 -0700 Subject: [PATCH 4869/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9b0f27ad-b585-4765-8b33-2ba85a4a12fc PiperOrigin-RevId: 366236566 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d080dfc9abf..a6bb5b2cb5e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "151e9ec08a5a6a42e9ae3a22d51518fcdeb244d3340ffad0d76088c5f023af7e", - git_commit = "b1b396571bea408e4bfbcd94371e387f77cac5d1", + sha256 = "7a9ed9c2d0b7456b375b8d50bd083f018157c7310bebe9f19d11e3ca05e2a161", + git_commit = "1f528e9ce59015aafc61b78bf0ab99d9a4471d0f", ) # Import all of TensorFlow Serving's external dependencies. From 2f603ded3080c66e1678cd699d686fa99ba9b362 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 1 Apr 2021 12:01:22 -0700 Subject: [PATCH 4870/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3d090fe9-3745-43dc-831a-9c02777ee363 PiperOrigin-RevId: 366300541 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a6bb5b2cb5e..744640917a2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7a9ed9c2d0b7456b375b8d50bd083f018157c7310bebe9f19d11e3ca05e2a161", - git_commit = "1f528e9ce59015aafc61b78bf0ab99d9a4471d0f", + sha256 = "43503415361c92440a8bbb48fd8135affa5dc5b85e17f9ddc0b0ec9f463e30b1", + git_commit = "e34d6a9522852b042596e3484c91ea1fb25b05f6", ) # Import all of TensorFlow Serving's external dependencies. From 49351295f471136eb4eba51025e7cdbbe00d4bb9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 1 Apr 2021 18:01:28 -0700 Subject: [PATCH 4871/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/414c4ef7-c2e7-472f-b301-e024189a47ea PiperOrigin-RevId: 366368680 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 744640917a2..b41b595213f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "43503415361c92440a8bbb48fd8135affa5dc5b85e17f9ddc0b0ec9f463e30b1", - git_commit = "e34d6a9522852b042596e3484c91ea1fb25b05f6", + sha256 = "4c8a2ea8888cf234df0c552f8e4c93e1f0bbfaccca6a341d00483eba93de22ef", + git_commit = "5d16270ef25fd22ec97da39af8314f19151f99bb", ) # Import all of TensorFlow Serving's external dependencies. From e10f8686087e79865c52140a7915cf2b4502270a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 2 Apr 2021 00:01:30 -0700 Subject: [PATCH 4872/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e9f18671-88f8-4223-8126-87ef31ec49f6 PiperOrigin-RevId: 366404838 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b41b595213f..2775f7e4fbb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4c8a2ea8888cf234df0c552f8e4c93e1f0bbfaccca6a341d00483eba93de22ef", - git_commit = "5d16270ef25fd22ec97da39af8314f19151f99bb", + sha256 = "2de9f9c6d15422ce647c12adb759b452c788b8d0af64b6feb7f979803f9bd478", + git_commit = "c45ed66b524e05d9d1c29871c69006714673640e", ) # Import all of TensorFlow Serving's external dependencies. From 09619913ea5e24ad17606dfc6963c242a4ddf384 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 2 Apr 2021 06:01:26 -0700 Subject: [PATCH 4873/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a8de8d9c-03fb-4e64-b8e1-893f262d0c01 PiperOrigin-RevId: 366434409 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2775f7e4fbb..0ae43707723 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2de9f9c6d15422ce647c12adb759b452c788b8d0af64b6feb7f979803f9bd478", - git_commit = "c45ed66b524e05d9d1c29871c69006714673640e", + sha256 = "a333373b7d68b6736e36bfe99606db74a31ebb0c8276a91c3f5031747d55bd95", + git_commit = "7a26883cb88478e17d0e23ff9e4058aa853426de", ) # Import all of TensorFlow Serving's external dependencies. From e90fdba9f2ec5d952c3ccb1e3b58ec65dcec4bda Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 2 Apr 2021 12:01:59 -0700 Subject: [PATCH 4874/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/04a4f0df-bd4a-453b-8590-3cdca9c9ed23 PiperOrigin-RevId: 366487264 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0ae43707723..2e6ba026a37 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a333373b7d68b6736e36bfe99606db74a31ebb0c8276a91c3f5031747d55bd95", - git_commit = "7a26883cb88478e17d0e23ff9e4058aa853426de", + sha256 = "987258e6143c3bfbf7a16b4d15f7ab21d2f1aae5240cf9ed19536302c4797eeb", + git_commit = "93c5672c71f6adf2343879a092c4e398f59ddbf9", ) # Import all of TensorFlow Serving's external dependencies. From 2b20315418346837a26a11f640fed0da90048a08 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 2 Apr 2021 18:02:31 -0700 Subject: [PATCH 4875/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b57e7c11-79fe-4d79-8b15-c2d0a1c8c8f0 PiperOrigin-RevId: 366545646 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2e6ba026a37..76e3536215c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "987258e6143c3bfbf7a16b4d15f7ab21d2f1aae5240cf9ed19536302c4797eeb", - git_commit = "93c5672c71f6adf2343879a092c4e398f59ddbf9", + sha256 = "2fdeb0032496c3390c557b137f0c901e5934887e4477258bf930afc85a4eeacd", + git_commit = "99487be319ca212504742c7b1eeaebaaf71182ae", ) # Import all of TensorFlow Serving's external dependencies. From 9c2c65a9982e9efca6bd25b17f6b55b204ba8663 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 3 Apr 2021 00:01:43 -0700 Subject: [PATCH 4876/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c72fa4f8-e24c-4982-a3a9-72a2faea8aeb PiperOrigin-RevId: 366572137 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 76e3536215c..eccc12d7e99 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2fdeb0032496c3390c557b137f0c901e5934887e4477258bf930afc85a4eeacd", - git_commit = "99487be319ca212504742c7b1eeaebaaf71182ae", + sha256 = "95a56277dbc79dc900a811953be1dd5a31e7317191fde868de1d78927e23644e", + git_commit = "5dcfc51118817f27fad5246812d83e5dccdc5f72", ) # Import all of TensorFlow Serving's external dependencies. From cd078a89573aa05a0d4aa2e937a049d40269e1e4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 3 Apr 2021 06:01:28 -0700 Subject: [PATCH 4877/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9b3f731a-34b4-4725-b881-16c6c1a75454 PiperOrigin-RevId: 366595042 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index eccc12d7e99..3e1d8a4ddf4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "95a56277dbc79dc900a811953be1dd5a31e7317191fde868de1d78927e23644e", - git_commit = "5dcfc51118817f27fad5246812d83e5dccdc5f72", + sha256 = "dbdfb2d259b04746f94bb67378880520e1ca18d3350a14f765d2d758d49f334a", + git_commit = "38f4134e6884fb1d766999486a72810ebae6acf5", ) # Import all of TensorFlow Serving's external dependencies. From 4581678996071cb8e384f6f03dbec8ac18c2b43a Mon Sep 17 00:00:00 2001 From: kiddos Date: Sun, 4 Apr 2021 03:47:10 +0800 Subject: [PATCH 4878/8103] process OPTIONS request first --- .../model_servers/http_rest_api_handler.cc | 3 --- tensorflow_serving/model_servers/http_server.cc | 16 +++++++++++----- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/tensorflow_serving/model_servers/http_rest_api_handler.cc b/tensorflow_serving/model_servers/http_rest_api_handler.cc index 7a87464b6ff..9a8b9509e63 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler.cc +++ b/tensorflow_serving/model_servers/http_rest_api_handler.cc @@ -69,9 +69,6 @@ Status HttpRestApiHandler::ProcessRequest( headers->clear(); output->clear(); AddHeaders(headers); - if (core_->enable_cors_support()) { - AddCORSHeaders(headers); - } string model_version_str; string model_subresource; Status status = errors::InvalidArgument("Malformed request: ", http_method, diff --git a/tensorflow_serving/model_servers/http_server.cc b/tensorflow_serving/model_servers/http_server.cc index fd0466ccd84..bddea02bbc4 100644 --- a/tensorflow_serving/model_servers/http_server.cc +++ b/tensorflow_serving/model_servers/http_server.cc @@ -25,6 +25,7 @@ limitations under the License. #include "tensorflow/core/platform/env.h" #include "tensorflow/core/platform/logging.h" #include "tensorflow_serving/model_servers/http_rest_api_handler.h" +#include "tensorflow_serving/model_servers/http_rest_api_util.h" #include "tensorflow_serving/model_servers/server_core.h" #include "tensorflow_serving/servables/tensorflow/util.h" #include "tensorflow_serving/util/net_http/server/public/httpserver.h" @@ -126,7 +127,7 @@ class RequestExecutor final : public net_http::EventExecutor { class RestApiRequestDispatcher { public: RestApiRequestDispatcher(int timeout_in_ms, ServerCore* core) - : regex_(HttpRestApiHandler::kPathRegex) { + : regex_(HttpRestApiHandler::kPathRegex), core_(core) { RunOptions run_options = RunOptions(); run_options.set_timeout_in_ms(timeout_in_ms); handler_.reset(new HttpRestApiHandler(run_options, core)); @@ -160,19 +161,23 @@ class RestApiRequestDispatcher { string output; VLOG(1) << "Processing HTTP request: " << req->http_method() << " " << req->uri_path() << " body: " << body.size() << " bytes."; - auto status = - handler_->ProcessRequest(req->http_method(), req->uri_path(), body, - &headers, &model_name, &method, &output); + Status status; if (req->http_method() == "OPTIONS") { absl::string_view origin_header = req->GetRequestHeader("Origin"); if (RE2::PartialMatch(origin_header, "https?://")) { - output.clear(); status = Status::OK(); } else { status = errors::FailedPrecondition( "Origin header is missing in CORS preflight"); } + } else { + status = + handler_->ProcessRequest(req->http_method(), req->uri_path(), body, + &headers, &model_name, &method, &output); + } + if (core_->enable_cors_support()) { + AddCORSHeaders(&headers); } const auto http_status = ToHTTPStatusCode(status); @@ -195,6 +200,7 @@ class RestApiRequestDispatcher { const RE2 regex_; std::unique_ptr handler_; + ServerCore* core_; }; } // namespace From ae451d3c0267ba797f49de016e4631f146216ce3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 3 Apr 2021 18:01:29 -0700 Subject: [PATCH 4879/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1e894ca4-f37b-4ba8-8190-548279616b53 PiperOrigin-RevId: 366637705 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3e1d8a4ddf4..cc0e7bd3ef9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dbdfb2d259b04746f94bb67378880520e1ca18d3350a14f765d2d758d49f334a", - git_commit = "38f4134e6884fb1d766999486a72810ebae6acf5", + sha256 = "cae8ddba84034700e5a152dcdea1d8ffc7ceb6696a343106ed4ca47ba0db8273", + git_commit = "9e3c906aca96739cc263fa1bc9671252fe084c9d", ) # Import all of TensorFlow Serving's external dependencies. From e453692b0914080ff8d6855987ddaf556c00cdfa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 4 Apr 2021 00:01:40 -0700 Subject: [PATCH 4880/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/46950b96-b2ed-483b-9a52-a3c20242199a PiperOrigin-RevId: 366659038 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cc0e7bd3ef9..beea465a537 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cae8ddba84034700e5a152dcdea1d8ffc7ceb6696a343106ed4ca47ba0db8273", - git_commit = "9e3c906aca96739cc263fa1bc9671252fe084c9d", + sha256 = "1a2fb9bd72efe974fcbe7435bc9d73796dcb98e0f5e27c3ea050b00ecf2c849e", + git_commit = "29b42caba242820ee66cf2cc2496f064a97b84c9", ) # Import all of TensorFlow Serving's external dependencies. From 754dc52d821fb948a9500254986639198fff04d2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 4 Apr 2021 06:01:31 -0700 Subject: [PATCH 4881/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8846e3ba-c6a3-4f92-87b2-acd159859f56 PiperOrigin-RevId: 366681078 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index beea465a537..faa00f7077e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1a2fb9bd72efe974fcbe7435bc9d73796dcb98e0f5e27c3ea050b00ecf2c849e", - git_commit = "29b42caba242820ee66cf2cc2496f064a97b84c9", + sha256 = "0d94dfa0b4956eabb6570253a9279c8d897e9d9646b5890b89a7862c8be28e35", + git_commit = "4134747072f6961278c20d5cd827d32ab1b5daae", ) # Import all of TensorFlow Serving's external dependencies. From 52a14b8e2b5395aeb8c3bc53f151606dc15dd2de Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 5 Apr 2021 06:01:28 -0700 Subject: [PATCH 4882/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e19f2a23-b148-4530-923a-0fbd04358fe2 PiperOrigin-RevId: 366786248 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index faa00f7077e..e45e70848c8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0d94dfa0b4956eabb6570253a9279c8d897e9d9646b5890b89a7862c8be28e35", - git_commit = "4134747072f6961278c20d5cd827d32ab1b5daae", + sha256 = "65beb9dbc6fdf6b85ce1f570ee66620bb923355756c7a66900a613e08040b10d", + git_commit = "19c51a72a3199b1abbdd41a9b89a01c2aef31a78", ) # Import all of TensorFlow Serving's external dependencies. From 65bf77d76544293c89ba7ee17d430b325d7cae9a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 5 Apr 2021 12:03:36 -0700 Subject: [PATCH 4883/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e9e575ae-01d8-4789-a7fe-121c7f93553a PiperOrigin-RevId: 366845448 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e45e70848c8..d07bce6688f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "65beb9dbc6fdf6b85ce1f570ee66620bb923355756c7a66900a613e08040b10d", - git_commit = "19c51a72a3199b1abbdd41a9b89a01c2aef31a78", + sha256 = "a353f68332c3399e09e00a795c5e18f4fc6921fd2c6e6c27c4d96066bc5e0920", + git_commit = "c21ee2e65ab3f3b264e2fca4d4c7134f4b28674f", ) # Import all of TensorFlow Serving's external dependencies. From bdc008951a3f4bd4c4cb77805c450f0fa856967b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 5 Apr 2021 18:01:19 -0700 Subject: [PATCH 4884/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/78d2b832-ed66-475e-a0e8-cc30925dec4e PiperOrigin-RevId: 366911420 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d07bce6688f..b01e7b77ffb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a353f68332c3399e09e00a795c5e18f4fc6921fd2c6e6c27c4d96066bc5e0920", - git_commit = "c21ee2e65ab3f3b264e2fca4d4c7134f4b28674f", + sha256 = "fa78847e9ff2b06e246780d911c20304b124e179131b1d3bf76376a3e4e7ad1d", + git_commit = "22625ab1df10cc6ea550ee58e687e36deaaff184", ) # Import all of TensorFlow Serving's external dependencies. From a8d9159440ec2cf60cc0bd2550d53b28d48623db Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 6 Apr 2021 00:01:34 -0700 Subject: [PATCH 4885/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/daf597dc-08b4-4cab-bb0c-1ca6e170d061 PiperOrigin-RevId: 366948166 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b01e7b77ffb..ba174bd7270 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fa78847e9ff2b06e246780d911c20304b124e179131b1d3bf76376a3e4e7ad1d", - git_commit = "22625ab1df10cc6ea550ee58e687e36deaaff184", + sha256 = "823c41535fa871fc25e99dcd21f57d4924b5b1fda69059e895ff010506d5f6f9", + git_commit = "57caac46d0f036754f8f093fd40099eaaf6c06c2", ) # Import all of TensorFlow Serving's external dependencies. From 5b4e8b521e4ccc1d2081bd1df72f60cd80c8dda4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 6 Apr 2021 06:01:29 -0700 Subject: [PATCH 4886/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7418ff96-0845-4427-97bb-c9a66f0ad7fc PiperOrigin-RevId: 366989407 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ba174bd7270..ceaedc9ba28 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "823c41535fa871fc25e99dcd21f57d4924b5b1fda69059e895ff010506d5f6f9", - git_commit = "57caac46d0f036754f8f093fd40099eaaf6c06c2", + sha256 = "8fd530d5591b3cd71fc1509be716a0a50f2e04227ca3d7db66641aeaa8425a57", + git_commit = "2de68f005a99529c66737c28ebc1bc42a435efc3", ) # Import all of TensorFlow Serving's external dependencies. From 29dab08244d501ac7bbf4a69f8a5a783a624ac3f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 6 Apr 2021 12:01:23 -0700 Subject: [PATCH 4887/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/db7b1de2-fc68-42b6-9366-5237c5a2eb5d PiperOrigin-RevId: 367054761 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ceaedc9ba28..cdd98ed71d1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8fd530d5591b3cd71fc1509be716a0a50f2e04227ca3d7db66641aeaa8425a57", - git_commit = "2de68f005a99529c66737c28ebc1bc42a435efc3", + sha256 = "55f846ca39e0f73721c425032c0698ee29fb35b9397521ec1bbeebc4909ff692", + git_commit = "9c5d0e201006958209b29e2fb5a7e8d061f4a331", ) # Import all of TensorFlow Serving's external dependencies. From da976ec58ec67a2906ffb5d63d8506c9e2a64e4f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 6 Apr 2021 18:01:22 -0700 Subject: [PATCH 4888/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2658eb25-04e5-41e0-a81b-7886fb1ac25e PiperOrigin-RevId: 367123822 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cdd98ed71d1..42aaeabe0b9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "55f846ca39e0f73721c425032c0698ee29fb35b9397521ec1bbeebc4909ff692", - git_commit = "9c5d0e201006958209b29e2fb5a7e8d061f4a331", + sha256 = "89ca94d6ed6fbb5648469c77be4b5162fb5d3fab6bea0af67769f480de5f1604", + git_commit = "0a0b6a7f4b2b8314857e0c64ef00675a1aeac7e4", ) # Import all of TensorFlow Serving's external dependencies. From 3596a6a87f753d5bf62fbcc3e9331c339673c73a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 7 Apr 2021 00:01:27 -0700 Subject: [PATCH 4889/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b4223033-6453-491d-9e1d-653df30b3d9a PiperOrigin-RevId: 367161876 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 42aaeabe0b9..b94dc6159b3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "89ca94d6ed6fbb5648469c77be4b5162fb5d3fab6bea0af67769f480de5f1604", - git_commit = "0a0b6a7f4b2b8314857e0c64ef00675a1aeac7e4", + sha256 = "767d8244408e6e41890c90e60ea74e9c3112259c96f08044146f9959b15d1f47", + git_commit = "879979918557ba61df9569b5811e307a57553254", ) # Import all of TensorFlow Serving's external dependencies. From f65ed644009c49776bec65c845d355ba46146afe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 7 Apr 2021 06:01:21 -0700 Subject: [PATCH 4890/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1e7cdc20-3b5b-43d8-8151-67ff7bcddc80 PiperOrigin-RevId: 367204144 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b94dc6159b3..e897db23f10 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "767d8244408e6e41890c90e60ea74e9c3112259c96f08044146f9959b15d1f47", - git_commit = "879979918557ba61df9569b5811e307a57553254", + sha256 = "be845b7e7584656074b85ad1b9f94d88e3af6a62c35b384685b970c874ec12d1", + git_commit = "a0c9c13ccc8dbf57b6948c6f0f066769d688cc04", ) # Import all of TensorFlow Serving's external dependencies. From 880ce64904706bd99f2919f09f1cccd2b2aad041 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 7 Apr 2021 12:01:19 -0700 Subject: [PATCH 4891/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/19a04683-a9e6-45a4-a593-1e9167598ceb PiperOrigin-RevId: 367267780 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e897db23f10..a62230ea995 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "be845b7e7584656074b85ad1b9f94d88e3af6a62c35b384685b970c874ec12d1", - git_commit = "a0c9c13ccc8dbf57b6948c6f0f066769d688cc04", + sha256 = "2644f8c58d8e0e69e8e6352be60d8f07f2276f2990cd0b64ae8b60c0b18f87a7", + git_commit = "4d1c9c6cc95320ae4087f6dc2d768344b779288e", ) # Import all of TensorFlow Serving's external dependencies. From bc24390a45f5f9dbbf2fa1a05e39c9eb128187ee Mon Sep 17 00:00:00 2001 From: Yiming Zhang Date: Wed, 7 Apr 2021 13:07:04 -0700 Subject: [PATCH 4892/8103] Fix zlib. PiperOrigin-RevId: 367282082 --- .../util/net_http/compression/BUILD | 2 + .../util/net_http/compression/gzip_zlib.cc | 6 +- .../util/net_http/compression/gzip_zlib.h | 3 +- .../net_http/compression/gzip_zlib_test.cc | 94 +++++++++++++++++++ 4 files changed, 102 insertions(+), 3 deletions(-) diff --git a/tensorflow_serving/util/net_http/compression/BUILD b/tensorflow_serving/util/net_http/compression/BUILD index dd0c97dd7a0..ccd0c325eab 100644 --- a/tensorflow_serving/util/net_http/compression/BUILD +++ b/tensorflow_serving/util/net_http/compression/BUILD @@ -35,5 +35,7 @@ cc_test( deps = [ ":gzip_zlib", "//tensorflow_serving/core/test_util:test_main", + "@com_google_absl//absl/strings", + "@com_google_googletest//:gtest", ], ) diff --git a/tensorflow_serving/util/net_http/compression/gzip_zlib.cc b/tensorflow_serving/util/net_http/compression/gzip_zlib.cc index 0ca314bf26e..9552530b2f6 100644 --- a/tensorflow_serving/util/net_http/compression/gzip_zlib.cc +++ b/tensorflow_serving/util/net_http/compression/gzip_zlib.cc @@ -695,7 +695,9 @@ int ZLib::UncompressAtMost(Bytef *dest, uLongf *destLen, const Bytef *source, // mode, we also check the gzip footer to make sure we pass the gzip // consistency checks. We RETURN true iff both types of checks pass. bool ZLib::UncompressChunkDone() { - assert(!first_chunk_ && uncomp_init_); + if (first_chunk_ || !uncomp_init_) { + return false; + } // Make sure we're at the end-of-compressed-data point. This means // if we call inflate with Z_FINISH we won't consume any input or // write any output @@ -771,7 +773,7 @@ int ZLib::Uncompress(Bytef *dest, uLongf *destLen, const Bytef *source, // read uncompress length from gzip footer uLongf ZLib::GzipUncompressedLength(const Bytef *source, uLong len) { - assert(len > 4); + if (len <= 4) return 0; // malformed data. return (static_cast(source[len - 1]) << 24) + (static_cast(source[len - 2]) << 16) + (static_cast(source[len - 3]) << 8) + diff --git a/tensorflow_serving/util/net_http/compression/gzip_zlib.h b/tensorflow_serving/util/net_http/compression/gzip_zlib.h index e94f0e01197..78baecd042f 100644 --- a/tensorflow_serving/util/net_http/compression/gzip_zlib.h +++ b/tensorflow_serving/util/net_http/compression/gzip_zlib.h @@ -173,7 +173,8 @@ class ZLib { int Uncompress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen); - // Get the uncompressed size from the gzip footer. + // Get the uncompressed size from the gzip footer. Returns 0 if source is too + // short (len < 5). uLongf GzipUncompressedLength(const Bytef *source, uLong len); // Special helper function to help uncompress gzipped documents: diff --git a/tensorflow_serving/util/net_http/compression/gzip_zlib_test.cc b/tensorflow_serving/util/net_http/compression/gzip_zlib_test.cc index b67501103ad..082501097f6 100644 --- a/tensorflow_serving/util/net_http/compression/gzip_zlib_test.cc +++ b/tensorflow_serving/util/net_http/compression/gzip_zlib_test.cc @@ -20,7 +20,9 @@ limitations under the License. #include #include +#include #include +#include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" namespace tensorflow { @@ -602,6 +604,98 @@ TEST(ZLibTest, BytewiseRead) { ASSERT_EQ(truncated_output, text); } +TEST(ZLibTest, TruncatedData) { + const int kBufferLen = 64; + std::string uncompressed = "Hello, World!"; + std::string compressed( + "\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xf3\x48\xcd\xc9\xc9" + "\xd7\x51\x08\xcf\x2f\xca\x49\x51\x04\x00\xd0\xc3\x4a\xec\x0d" + "\x00\x00\x00", + 33); + + // Verify that "compressed" contains valid gzip data. + { + ZLib zlib; + // zlib.SetGzipHeaderMode(); + char uncompbuf[kBufferLen]; + bzero(uncompbuf, kBufferLen); + uLongf uncomplen = kBufferLen; + int err = zlib.Uncompress( + reinterpret_cast(uncompbuf), &uncomplen, + reinterpret_cast(compressed.c_str()), compressed.size()); + ASSERT_EQ(err, Z_OK); + ASSERT_EQ(uncompressed, absl::string_view(uncompbuf, uncomplen)); + } + + // Test truncated data with ZLib::Uncompress(). + for (int len = compressed.size() - 1; len > 0; len--) { + SCOPED_TRACE(absl::StrCat("Decompressing first ", len, " out of ", + compressed.size(), " bytes")); + ZLib zlib; + // zlib.SetGzipHeaderMode(); + char uncompbuf[kBufferLen]; + bzero(uncompbuf, kBufferLen); + uLongf uncomplen = kBufferLen; + int err = zlib.Uncompress( + reinterpret_cast(uncompbuf), &uncomplen, + reinterpret_cast(compressed.c_str()), len); + ASSERT_NE(err, Z_OK); + } + + // Test truncated data with ZLib::UncompressAtMost() and + // ZLib::UncompressDone(). + for (int len = compressed.size() - 1; len > 0; len--) { + SCOPED_TRACE(absl::StrCat("Decompressing first ", len, " out of ", + compressed.size(), " bytes")); + ZLib zlib; + // zlib.SetGzipHeaderMode(); + char uncompbuf[kBufferLen]; + bzero(uncompbuf, kBufferLen); + uLongf uncomplen = kBufferLen; + uLongf complen = len; + int err = zlib.UncompressAtMost( + reinterpret_cast(uncompbuf), &uncomplen, + reinterpret_cast(compressed.c_str()), &complen); + ASSERT_EQ(err, Z_OK); + ASSERT_EQ(complen, 0); + if (uncomplen > 0) { + EXPECT_THAT( + uncompressed, + testing::StartsWith(std::string(uncompbuf).substr(0, uncomplen))); + } + ASSERT_FALSE(zlib.UncompressChunkDone()); + } +} + +TEST(ZLibTest, GzipUncompressedLength) { + ZLib zlib; + + // "Hello, World!", compressed. + std::string hello_world( + "\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xf3\x48\xcd\xc9\xc9" + "\xd7\x51\x08\xcf\x2f\xca\x49\x51\x04\x00\xd0\xc3\x4a\xec\x0d" + "\x00\x00\x00", + 33); + EXPECT_EQ(13, zlib.GzipUncompressedLength( + reinterpret_cast(hello_world.c_str()), + hello_world.size())); + + // Empty string, "", compressed. + std::string empty( + "\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\x03\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00", + 20); + EXPECT_EQ(0, + zlib.GzipUncompressedLength( + reinterpret_cast(empty.c_str()), empty.size())); + + std::string bad_data("\x01\x01\x01\x01", 4); + for (int len = 0; len <= bad_data.size(); len++) { + EXPECT_EQ(0, zlib.GzipUncompressedLength( + reinterpret_cast(bad_data.c_str()), len)); + } +} + } // namespace } // namespace net_http } // namespace serving From 79860d5ccb8f29e75babe1e0293155b8ed09212e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 7 Apr 2021 18:01:38 -0700 Subject: [PATCH 4893/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7241762a-d8ba-4452-a655-0e8d250f2a5b PiperOrigin-RevId: 367335006 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a62230ea995..8cdd4dabcb9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2644f8c58d8e0e69e8e6352be60d8f07f2276f2990cd0b64ae8b60c0b18f87a7", - git_commit = "4d1c9c6cc95320ae4087f6dc2d768344b779288e", + sha256 = "150b5a4feb512d4c9f82d32fc342b70281fddf68944a61d1ff171a8024bd27a5", + git_commit = "e0b0822dd5fabe2d9b8374c7d7c7fb375ac9d98e", ) # Import all of TensorFlow Serving's external dependencies. From eb8a9f3e4ce634b900e057b2b03fd2fcc127786b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 8 Apr 2021 00:01:26 -0700 Subject: [PATCH 4894/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/761d7d2a-7302-4fdd-8bb7-a89389ed80a9 PiperOrigin-RevId: 367371906 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8cdd4dabcb9..2199368282d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "150b5a4feb512d4c9f82d32fc342b70281fddf68944a61d1ff171a8024bd27a5", - git_commit = "e0b0822dd5fabe2d9b8374c7d7c7fb375ac9d98e", + sha256 = "5a895bc082c782782e6d05d8b96e57ce55c7109dea4eae0e6157909ab111bd9f", + git_commit = "4de5ad23dd63b2a92c2490071c941b551f02f906", ) # Import all of TensorFlow Serving's external dependencies. From edeb21466da6eeb4b7d0d0c262f42a3b383680fb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 8 Apr 2021 06:01:55 -0700 Subject: [PATCH 4895/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/61f3e891-709b-4e2c-88eb-3930feede81e PiperOrigin-RevId: 367414262 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2199368282d..9e40dc19078 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5a895bc082c782782e6d05d8b96e57ce55c7109dea4eae0e6157909ab111bd9f", - git_commit = "4de5ad23dd63b2a92c2490071c941b551f02f906", + sha256 = "18a1348d9ff460daa776282c06f091b197b30e40491328e4f33b38c35fd42603", + git_commit = "7065497d6c9a3c8f51c7451ff1039447aa76049d", ) # Import all of TensorFlow Serving's external dependencies. From 1d5c65c005a7052962be6399e3bd10ebb5b5eaaf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 8 Apr 2021 12:01:51 -0700 Subject: [PATCH 4896/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c7049386-f83c-467d-b024-fd79da90cd71 PiperOrigin-RevId: 367478226 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9e40dc19078..074e98031dc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "18a1348d9ff460daa776282c06f091b197b30e40491328e4f33b38c35fd42603", - git_commit = "7065497d6c9a3c8f51c7451ff1039447aa76049d", + sha256 = "9c61b27151a7ecb2a0a486b9a0f604795829ba2102aaa48819b4eb9bd9f3c784", + git_commit = "592dc461c7092f43e221bfd576a6c81ce7599dfd", ) # Import all of TensorFlow Serving's external dependencies. From 448dbe14624538ab76fd6aeb2a456344e7f41c78 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 9 Apr 2021 17:02:29 -0700 Subject: [PATCH 4897/8103] Enable tensor output filters with batching. PiperOrigin-RevId: 367729555 --- .../batching/batching_session.cc | 100 +++++++++++++++--- .../batching/batching_session.h | 10 ++ .../batching/batching_session_test.cc | 46 ++++++++ .../tensorflow/bundle_factory_util.cc | 17 ++- .../tensorflow/bundle_factory_util.h | 11 +- .../tensorflow/saved_model_bundle_factory.cc | 12 ++- 6 files changed, 166 insertions(+), 30 deletions(-) diff --git a/tensorflow_serving/batching/batching_session.cc b/tensorflow_serving/batching/batching_session.cc index 1132e76f35c..f74ec474cef 100644 --- a/tensorflow_serving/batching/batching_session.cc +++ b/tensorflow_serving/batching/batching_session.cc @@ -160,6 +160,17 @@ class BatchingSession : public ServingSession { const std::string& thread_pool_name, std::unique_ptr* result); + // Same as above but allows for specification of a default scheduler creator + // which enables requests that don't match an exact signature to also + // have batching. + static Status Create( + const BatchingSessionOptions& options, std::unique_ptr wrapped, + const std::vector& + signatures_with_scheduler_creators, + BatchingSessionSchedulerCreator default_creator, + const std::string& thread_pool_name, + std::unique_ptr* result); + ~BatchingSession() override = default; Status Run(const std::vector>& inputs, @@ -257,9 +268,34 @@ class BatchingSession : public ServingSession { // for monitoring purpose, and can be empty if not known. const std::string thread_pool_name_; + // If set, default_scheduler_creator_ is used when the input signature does + // not match any existing signature defined during model load. This helps + // when the user uses either a combination of signatures or filter certain + // output tensors. + std::optional default_scheduler_creator_; + absl::Mutex mu_; + std::unordered_map>, + HashTensorSignature, EqTensorSignature> + custom_signature_batch_schedulers_ ABSL_GUARDED_BY(mu_); + TF_DISALLOW_COPY_AND_ASSIGN(BatchingSession); }; +Status BatchingSession::Create( + const BatchingSessionOptions& options, std::unique_ptr wrapped, + const std::vector& + signatures_with_scheduler_creators, + BatchingSessionSchedulerCreator default_creator, + const std::string& thread_pool_name, + std::unique_ptr* result) { + auto status = BatchingSession::Create(options, std::move(wrapped), + signatures_with_scheduler_creators, + thread_pool_name, result); + result->get()->default_scheduler_creator_ = default_creator; + return status; +} + Status BatchingSession::Create( const BatchingSessionOptions& options, std::unique_ptr wrapped, const std::vector& @@ -343,23 +379,40 @@ Status BatchingSession::InternalRun( TensorSignatureFromRunArgs(inputs, output_tensor_names); auto batch_scheduler_it = batch_schedulers_.find(signature); if (batch_scheduler_it == batch_schedulers_.end()) { - // We have a Run() call that doesn't match one of our batching signatures. - // Run it in-line. - LOG_EVERY_N_SEC(WARNING, 120) - << "Request doesn't match any declared signature. Bypassing " - "batcher. Request signature is: " - << TensorSignatureDebugString(signature); - - // Because the wrapped session may not provide an implementation for - // thread_pool_options, we need to invoke different Run() functions - // depending on whether thread_pool_options is specified. - if (thread_pool_options) { - return wrapped_->Run(run_options, inputs, output_tensor_names, - target_node_names, outputs, run_metadata, - thread_pool_options.value()); + if (default_scheduler_creator_.has_value()) { + absl::MutexLock l(&mu_); + batch_scheduler_it = custom_signature_batch_schedulers_.find(signature); + if (batch_scheduler_it == custom_signature_batch_schedulers_.end()) { + std::unique_ptr> batch_scheduler; + TF_RETURN_IF_ERROR(default_scheduler_creator_.value()( + [&, signature](std::unique_ptr> batch) { + ProcessBatch(signature, std::move(batch)); + }, + &batch_scheduler)); + custom_signature_batch_schedulers_[signature] = + std::move(batch_scheduler); + batch_scheduler_it = custom_signature_batch_schedulers_.find(signature); + } } else { - return wrapped_->Run(run_options, inputs, output_tensor_names, - target_node_names, outputs, run_metadata); + // We have a Run() call that doesn't match one of our batching signatures. + // Run it in-line. + LOG_EVERY_N_SEC(WARNING, 120) + << "Request doesn't match any declared signature and no default " + "scheduler creator specified. Bypassing " + "batcher. Request signature is: " + << TensorSignatureDebugString(signature); + + // Because the wrapped session may not provide an implementation for + // thread_pool_options, we need to invoke different Run() functions + // depending on whether thread_pool_options is specified. + if (thread_pool_options) { + return wrapped_->Run(run_options, inputs, output_tensor_names, + target_node_names, outputs, run_metadata, + thread_pool_options.value()); + } else { + return wrapped_->Run(run_options, inputs, output_tensor_names, + target_node_names, outputs, run_metadata); + } } } BatchScheduler* batch_scheduler = @@ -895,6 +948,21 @@ Status SplitInputTask( return Status::OK(); } +Status CreateBatchingSession( + const BatchingSessionOptions& options, + const std::vector& + signatures_with_scheduler_creators, + BatchingSessionSchedulerCreator default_creator, + std::unique_ptr session, + std::unique_ptr* batching_session) { + std::unique_ptr internal_batching_session; + TF_RETURN_IF_ERROR(BatchingSession::Create( + options, std::move(session), signatures_with_scheduler_creators, + default_creator, /*thread_pool_name=*/"", &internal_batching_session)); + *batching_session = std::move(internal_batching_session); + return Status::OK(); +} + Status CreateBatchingSession( const BatchingSessionOptions& options, const std::vector& diff --git a/tensorflow_serving/batching/batching_session.h b/tensorflow_serving/batching/batching_session.h index 92553d1e333..5190f851f17 100644 --- a/tensorflow_serving/batching/batching_session.h +++ b/tensorflow_serving/batching/batching_session.h @@ -133,6 +133,16 @@ Status CreateBatchingSession( std::unique_ptr session, std::unique_ptr* batching_session); +// Same as above but allows for a default scheduler creator for which signatures +// that don't match a supplied value during run time can still use batching. +Status CreateBatchingSession( + const BatchingSessionOptions& options, + const std::vector& + signatures_with_scheduler_creators, + BatchingSessionSchedulerCreator default_creator, + std::unique_ptr session, + std::unique_ptr* batching_session); + // A convenience for using CreateBatchingSession() to create a // BasicBatchScheduler for a single signature. Status CreateBasicBatchingSession( diff --git a/tensorflow_serving/batching/batching_session_test.cc b/tensorflow_serving/batching/batching_session_test.cc index c14cf05cdf2..63d11aea19c 100644 --- a/tensorflow_serving/batching/batching_session_test.cc +++ b/tensorflow_serving/batching/batching_session_test.cc @@ -994,6 +994,52 @@ TEST_P(BatchingSessionTest, ThreadPoolOptions) { })); } +TEST_P(BatchingSessionTest, SubsetOutputTensors) { + BasicBatchScheduler::Options schedule_options; + schedule_options.max_batch_size = 6; // fits three 2-unit tasks + schedule_options.batch_timeout_micros = 1 * 1000 * 1000; // won't trigger + schedule_options.num_batch_threads = 1; + schedule_options = annotate_options(schedule_options); + BatchingSessionOptions batching_session_options; + std::unique_ptr batching_session; + TF_ASSERT_OK(CreateBasicBatchingSession( + schedule_options, batching_session_options, {{"x", "x2"}, {"y", "y3"}}, + CreateHalfPlusTwoSession(), &batching_session)); + + const Tensor input0 = test::AsTensor({8.0f, 6.0f}, {2}); + const Tensor expected_output0 = test::AsTensor({6.0f, 5.0f}, {2}); + const Tensor input1 = test::AsTensor({100.0f, 42.0f}, {2}); + const Tensor expected_output1 = test::AsTensor({53.0f, 24.0f}, {2}); + + std::unique_ptr first_request_thread( + Env::Default()->StartThread(ThreadOptions(), "first_request_thread", [&] { + std::vector outputs; + TF_ASSERT_OK(batching_session->Run({{"x", input0}, {"x2", input1}}, + {"y"} /* outputs */, + {} /* target nodes */, &outputs)); + ASSERT_EQ(1, outputs.size()); + test::ExpectTensorEqual(expected_output0, outputs[0]); + })); + std::unique_ptr second_request_thread(Env::Default()->StartThread( + ThreadOptions(), "second_request_thread", [&] { + std::vector outputs; + TF_ASSERT_OK(batching_session->Run({{"x2", input1}, {"x", input0}}, + {"y3"} /* outputs */, + {} /* target nodes */, &outputs)); + ASSERT_EQ(1, outputs.size()); + test::ExpectTensorEqual(expected_output1, outputs[0]); + })); + std::unique_ptr third_request_thread( + Env::Default()->StartThread(ThreadOptions(), "third_request_thread", [&] { + std::vector outputs; + TF_ASSERT_OK(batching_session->Run({{"x2", input1}, {"x", input0}}, + {"y"} /* outputs */, + {} /* target nodes */, &outputs)); + ASSERT_EQ(1, outputs.size()); + test::ExpectTensorEqual(expected_output0, outputs[0]); + })); +} + INSTANTIATE_TEST_CASE_P(WithOrWithoutThreadPools, BatchingSessionTest, ::testing::Bool()); diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_util.cc b/tensorflow_serving/servables/tensorflow/bundle_factory_util.cc index eda2b196eea..4b9b899f9dd 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_util.cc +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_util.cc @@ -60,7 +60,8 @@ Status EstimateResourceFromPath(const string& path, bool use_validation_result, Status WrapSessionForBatching(const BatchingParameters& batching_config, std::shared_ptr batch_scheduler, const std::vector& signatures, - std::unique_ptr* session) { + std::unique_ptr* session, + bool enable_default_schedule_creator) { LOG(INFO) << "Wrapping session to perform batch processing"; if (batch_scheduler == nullptr) { @@ -106,9 +107,17 @@ Status WrapSessionForBatching(const BatchingParameters& batching_config, {tensor_signature, create_queue}); } - return CreateBatchingSession(batching_session_options, - signatures_with_scheduler_creators, - std::move(*session), session); + // TODO(b/184973097): Remove enable_default_schedule_creator once TFLite is + // fixed. + if (enable_default_schedule_creator) { + return CreateBatchingSession(batching_session_options, + signatures_with_scheduler_creators, + create_queue, std::move(*session), session); + } else { + return CreateBatchingSession(batching_session_options, + signatures_with_scheduler_creators, + std::move(*session), session); + } } Status WrapSession(std::unique_ptr* session) { diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_util.h b/tensorflow_serving/servables/tensorflow/bundle_factory_util.h index 1d1a15761e9..753765c8d1e 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_util.h +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_util.h @@ -85,16 +85,15 @@ Status CreateBatchScheduler( Status EstimateResourceFromPath(const string& path, bool use_validation_result, ResourceAllocation* estimate); -// Wraps a session in a new session that automatically batches Run() calls, for -// the given signatures. -// TODO(b/33233998): Support batching for Run() calls that use a combination of -// signatures -- i.e. sometimes construct a single TensorSignature for a set of -// SignatureDefs (usually just two of them) -- based on some config. +// Wraps a session in a new session that automatically batches Run() calls. +// TODO(b/184973097): Remove enable_default_schedule_creator once TFLite is +// fixed. Status WrapSessionForBatching( const BatchingParameters& batching_config, std::shared_ptr> batch_scheduler, const std::vector& signatures, - std::unique_ptr* session); + std::unique_ptr* session, + bool enable_default_schedule_creator = false); // Wraps a session in a new session that only supports Run() without batching. Status WrapSession(std::unique_ptr* session); diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc index e13ebfb8553..2b2c202063d 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc @@ -146,7 +146,8 @@ Status SavedModelBundleFactory::InternalCreateSavedModelBundle( return result; }(); - if (config_.prefer_tflite_model() && TfLiteModelFound(path)) { + bool is_tflite = config_.prefer_tflite_model() && TfLiteModelFound(path); + if (is_tflite) { int num_tflite_pools = config_.num_tflite_pools(); if (num_tflite_pools == 0 && config_.num_tflite_interpreters() > 0) { num_tflite_pools = config_.num_tflite_interpreters(); @@ -179,10 +180,13 @@ Status SavedModelBundleFactory::InternalCreateSavedModelBundle( // Enable batching of requests to any one signature_def in the SavedModel. // Note that in the future, the plan is to enable explicit configuration // of the one or many SignatureDefs to enable. + // TODO(b/184973097): Remove enable_default_schedule_creator once TFLite is + // fixed. const std::vector signatures = GetSignatureDefs(**bundle); - return WrapSessionForBatching(config_.batching_parameters(), - batch_scheduler_, signatures, - &(*bundle)->session); + return WrapSessionForBatching( + config_.batching_parameters(), batch_scheduler_, signatures, + &(*bundle)->session, + /*enable_default_schedule_creator=*/!is_tflite); } return WrapSession(&(*bundle)->session); } From 6579d2d056530565cd6606a39c82b2f6c1d3799e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 12 Apr 2021 12:25:35 -0700 Subject: [PATCH 4898/8103] Update tf.io import in warmup example doc. PiperOrigin-RevId: 368058543 --- tensorflow_serving/g3doc/saved_model_warmup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/g3doc/saved_model_warmup.md b/tensorflow_serving/g3doc/saved_model_warmup.md index ff006aff23a..bed1dcae47e 100644 --- a/tensorflow_serving/g3doc/saved_model_warmup.md +++ b/tensorflow_serving/g3doc/saved_model_warmup.md @@ -42,7 +42,7 @@ from tensorflow_serving.apis import prediction_log_pb2 from tensorflow_serving.apis import regression_pb2 def main(): - with tf.python_io.TFRecordWriter("tf_serving_warmup_requests") as writer: + with tf.io.TFRecordWriter("tf_serving_warmup_requests") as writer: # replace with one of: # predict_pb2.PredictRequest(..) # classification_pb2.ClassificationRequest(..) From ba0fa72b61bc2c42388b815253ba72e6830f03cf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 12 Apr 2021 13:35:38 -0700 Subject: [PATCH 4899/8103] Rollback incompatible C++17 changes. PiperOrigin-RevId: 368073175 --- .../batching/batching_session.cc | 100 +++--------------- .../batching/batching_session.h | 10 -- .../batching/batching_session_test.cc | 46 -------- .../tensorflow/bundle_factory_util.cc | 17 +-- .../tensorflow/bundle_factory_util.h | 11 +- .../tensorflow/saved_model_bundle_factory.cc | 12 +-- 6 files changed, 30 insertions(+), 166 deletions(-) diff --git a/tensorflow_serving/batching/batching_session.cc b/tensorflow_serving/batching/batching_session.cc index f74ec474cef..1132e76f35c 100644 --- a/tensorflow_serving/batching/batching_session.cc +++ b/tensorflow_serving/batching/batching_session.cc @@ -160,17 +160,6 @@ class BatchingSession : public ServingSession { const std::string& thread_pool_name, std::unique_ptr* result); - // Same as above but allows for specification of a default scheduler creator - // which enables requests that don't match an exact signature to also - // have batching. - static Status Create( - const BatchingSessionOptions& options, std::unique_ptr wrapped, - const std::vector& - signatures_with_scheduler_creators, - BatchingSessionSchedulerCreator default_creator, - const std::string& thread_pool_name, - std::unique_ptr* result); - ~BatchingSession() override = default; Status Run(const std::vector>& inputs, @@ -268,34 +257,9 @@ class BatchingSession : public ServingSession { // for monitoring purpose, and can be empty if not known. const std::string thread_pool_name_; - // If set, default_scheduler_creator_ is used when the input signature does - // not match any existing signature defined during model load. This helps - // when the user uses either a combination of signatures or filter certain - // output tensors. - std::optional default_scheduler_creator_; - absl::Mutex mu_; - std::unordered_map>, - HashTensorSignature, EqTensorSignature> - custom_signature_batch_schedulers_ ABSL_GUARDED_BY(mu_); - TF_DISALLOW_COPY_AND_ASSIGN(BatchingSession); }; -Status BatchingSession::Create( - const BatchingSessionOptions& options, std::unique_ptr wrapped, - const std::vector& - signatures_with_scheduler_creators, - BatchingSessionSchedulerCreator default_creator, - const std::string& thread_pool_name, - std::unique_ptr* result) { - auto status = BatchingSession::Create(options, std::move(wrapped), - signatures_with_scheduler_creators, - thread_pool_name, result); - result->get()->default_scheduler_creator_ = default_creator; - return status; -} - Status BatchingSession::Create( const BatchingSessionOptions& options, std::unique_ptr wrapped, const std::vector& @@ -379,40 +343,23 @@ Status BatchingSession::InternalRun( TensorSignatureFromRunArgs(inputs, output_tensor_names); auto batch_scheduler_it = batch_schedulers_.find(signature); if (batch_scheduler_it == batch_schedulers_.end()) { - if (default_scheduler_creator_.has_value()) { - absl::MutexLock l(&mu_); - batch_scheduler_it = custom_signature_batch_schedulers_.find(signature); - if (batch_scheduler_it == custom_signature_batch_schedulers_.end()) { - std::unique_ptr> batch_scheduler; - TF_RETURN_IF_ERROR(default_scheduler_creator_.value()( - [&, signature](std::unique_ptr> batch) { - ProcessBatch(signature, std::move(batch)); - }, - &batch_scheduler)); - custom_signature_batch_schedulers_[signature] = - std::move(batch_scheduler); - batch_scheduler_it = custom_signature_batch_schedulers_.find(signature); - } + // We have a Run() call that doesn't match one of our batching signatures. + // Run it in-line. + LOG_EVERY_N_SEC(WARNING, 120) + << "Request doesn't match any declared signature. Bypassing " + "batcher. Request signature is: " + << TensorSignatureDebugString(signature); + + // Because the wrapped session may not provide an implementation for + // thread_pool_options, we need to invoke different Run() functions + // depending on whether thread_pool_options is specified. + if (thread_pool_options) { + return wrapped_->Run(run_options, inputs, output_tensor_names, + target_node_names, outputs, run_metadata, + thread_pool_options.value()); } else { - // We have a Run() call that doesn't match one of our batching signatures. - // Run it in-line. - LOG_EVERY_N_SEC(WARNING, 120) - << "Request doesn't match any declared signature and no default " - "scheduler creator specified. Bypassing " - "batcher. Request signature is: " - << TensorSignatureDebugString(signature); - - // Because the wrapped session may not provide an implementation for - // thread_pool_options, we need to invoke different Run() functions - // depending on whether thread_pool_options is specified. - if (thread_pool_options) { - return wrapped_->Run(run_options, inputs, output_tensor_names, - target_node_names, outputs, run_metadata, - thread_pool_options.value()); - } else { - return wrapped_->Run(run_options, inputs, output_tensor_names, - target_node_names, outputs, run_metadata); - } + return wrapped_->Run(run_options, inputs, output_tensor_names, + target_node_names, outputs, run_metadata); } } BatchScheduler* batch_scheduler = @@ -948,21 +895,6 @@ Status SplitInputTask( return Status::OK(); } -Status CreateBatchingSession( - const BatchingSessionOptions& options, - const std::vector& - signatures_with_scheduler_creators, - BatchingSessionSchedulerCreator default_creator, - std::unique_ptr session, - std::unique_ptr* batching_session) { - std::unique_ptr internal_batching_session; - TF_RETURN_IF_ERROR(BatchingSession::Create( - options, std::move(session), signatures_with_scheduler_creators, - default_creator, /*thread_pool_name=*/"", &internal_batching_session)); - *batching_session = std::move(internal_batching_session); - return Status::OK(); -} - Status CreateBatchingSession( const BatchingSessionOptions& options, const std::vector& diff --git a/tensorflow_serving/batching/batching_session.h b/tensorflow_serving/batching/batching_session.h index 5190f851f17..92553d1e333 100644 --- a/tensorflow_serving/batching/batching_session.h +++ b/tensorflow_serving/batching/batching_session.h @@ -133,16 +133,6 @@ Status CreateBatchingSession( std::unique_ptr session, std::unique_ptr* batching_session); -// Same as above but allows for a default scheduler creator for which signatures -// that don't match a supplied value during run time can still use batching. -Status CreateBatchingSession( - const BatchingSessionOptions& options, - const std::vector& - signatures_with_scheduler_creators, - BatchingSessionSchedulerCreator default_creator, - std::unique_ptr session, - std::unique_ptr* batching_session); - // A convenience for using CreateBatchingSession() to create a // BasicBatchScheduler for a single signature. Status CreateBasicBatchingSession( diff --git a/tensorflow_serving/batching/batching_session_test.cc b/tensorflow_serving/batching/batching_session_test.cc index 63d11aea19c..c14cf05cdf2 100644 --- a/tensorflow_serving/batching/batching_session_test.cc +++ b/tensorflow_serving/batching/batching_session_test.cc @@ -994,52 +994,6 @@ TEST_P(BatchingSessionTest, ThreadPoolOptions) { })); } -TEST_P(BatchingSessionTest, SubsetOutputTensors) { - BasicBatchScheduler::Options schedule_options; - schedule_options.max_batch_size = 6; // fits three 2-unit tasks - schedule_options.batch_timeout_micros = 1 * 1000 * 1000; // won't trigger - schedule_options.num_batch_threads = 1; - schedule_options = annotate_options(schedule_options); - BatchingSessionOptions batching_session_options; - std::unique_ptr batching_session; - TF_ASSERT_OK(CreateBasicBatchingSession( - schedule_options, batching_session_options, {{"x", "x2"}, {"y", "y3"}}, - CreateHalfPlusTwoSession(), &batching_session)); - - const Tensor input0 = test::AsTensor({8.0f, 6.0f}, {2}); - const Tensor expected_output0 = test::AsTensor({6.0f, 5.0f}, {2}); - const Tensor input1 = test::AsTensor({100.0f, 42.0f}, {2}); - const Tensor expected_output1 = test::AsTensor({53.0f, 24.0f}, {2}); - - std::unique_ptr first_request_thread( - Env::Default()->StartThread(ThreadOptions(), "first_request_thread", [&] { - std::vector outputs; - TF_ASSERT_OK(batching_session->Run({{"x", input0}, {"x2", input1}}, - {"y"} /* outputs */, - {} /* target nodes */, &outputs)); - ASSERT_EQ(1, outputs.size()); - test::ExpectTensorEqual(expected_output0, outputs[0]); - })); - std::unique_ptr second_request_thread(Env::Default()->StartThread( - ThreadOptions(), "second_request_thread", [&] { - std::vector outputs; - TF_ASSERT_OK(batching_session->Run({{"x2", input1}, {"x", input0}}, - {"y3"} /* outputs */, - {} /* target nodes */, &outputs)); - ASSERT_EQ(1, outputs.size()); - test::ExpectTensorEqual(expected_output1, outputs[0]); - })); - std::unique_ptr third_request_thread( - Env::Default()->StartThread(ThreadOptions(), "third_request_thread", [&] { - std::vector outputs; - TF_ASSERT_OK(batching_session->Run({{"x2", input1}, {"x", input0}}, - {"y"} /* outputs */, - {} /* target nodes */, &outputs)); - ASSERT_EQ(1, outputs.size()); - test::ExpectTensorEqual(expected_output0, outputs[0]); - })); -} - INSTANTIATE_TEST_CASE_P(WithOrWithoutThreadPools, BatchingSessionTest, ::testing::Bool()); diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_util.cc b/tensorflow_serving/servables/tensorflow/bundle_factory_util.cc index 4b9b899f9dd..eda2b196eea 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_util.cc +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_util.cc @@ -60,8 +60,7 @@ Status EstimateResourceFromPath(const string& path, bool use_validation_result, Status WrapSessionForBatching(const BatchingParameters& batching_config, std::shared_ptr batch_scheduler, const std::vector& signatures, - std::unique_ptr* session, - bool enable_default_schedule_creator) { + std::unique_ptr* session) { LOG(INFO) << "Wrapping session to perform batch processing"; if (batch_scheduler == nullptr) { @@ -107,17 +106,9 @@ Status WrapSessionForBatching(const BatchingParameters& batching_config, {tensor_signature, create_queue}); } - // TODO(b/184973097): Remove enable_default_schedule_creator once TFLite is - // fixed. - if (enable_default_schedule_creator) { - return CreateBatchingSession(batching_session_options, - signatures_with_scheduler_creators, - create_queue, std::move(*session), session); - } else { - return CreateBatchingSession(batching_session_options, - signatures_with_scheduler_creators, - std::move(*session), session); - } + return CreateBatchingSession(batching_session_options, + signatures_with_scheduler_creators, + std::move(*session), session); } Status WrapSession(std::unique_ptr* session) { diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_util.h b/tensorflow_serving/servables/tensorflow/bundle_factory_util.h index 753765c8d1e..1d1a15761e9 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_util.h +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_util.h @@ -85,15 +85,16 @@ Status CreateBatchScheduler( Status EstimateResourceFromPath(const string& path, bool use_validation_result, ResourceAllocation* estimate); -// Wraps a session in a new session that automatically batches Run() calls. -// TODO(b/184973097): Remove enable_default_schedule_creator once TFLite is -// fixed. +// Wraps a session in a new session that automatically batches Run() calls, for +// the given signatures. +// TODO(b/33233998): Support batching for Run() calls that use a combination of +// signatures -- i.e. sometimes construct a single TensorSignature for a set of +// SignatureDefs (usually just two of them) -- based on some config. Status WrapSessionForBatching( const BatchingParameters& batching_config, std::shared_ptr> batch_scheduler, const std::vector& signatures, - std::unique_ptr* session, - bool enable_default_schedule_creator = false); + std::unique_ptr* session); // Wraps a session in a new session that only supports Run() without batching. Status WrapSession(std::unique_ptr* session); diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc index 2b2c202063d..e13ebfb8553 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc @@ -146,8 +146,7 @@ Status SavedModelBundleFactory::InternalCreateSavedModelBundle( return result; }(); - bool is_tflite = config_.prefer_tflite_model() && TfLiteModelFound(path); - if (is_tflite) { + if (config_.prefer_tflite_model() && TfLiteModelFound(path)) { int num_tflite_pools = config_.num_tflite_pools(); if (num_tflite_pools == 0 && config_.num_tflite_interpreters() > 0) { num_tflite_pools = config_.num_tflite_interpreters(); @@ -180,13 +179,10 @@ Status SavedModelBundleFactory::InternalCreateSavedModelBundle( // Enable batching of requests to any one signature_def in the SavedModel. // Note that in the future, the plan is to enable explicit configuration // of the one or many SignatureDefs to enable. - // TODO(b/184973097): Remove enable_default_schedule_creator once TFLite is - // fixed. const std::vector signatures = GetSignatureDefs(**bundle); - return WrapSessionForBatching( - config_.batching_parameters(), batch_scheduler_, signatures, - &(*bundle)->session, - /*enable_default_schedule_creator=*/!is_tflite); + return WrapSessionForBatching(config_.batching_parameters(), + batch_scheduler_, signatures, + &(*bundle)->session); } return WrapSession(&(*bundle)->session); } From 99a6c6fe4e4584c5d826d56d5a60eb88aefa902d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 12 Apr 2021 18:02:15 -0700 Subject: [PATCH 4900/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ee665a82-ab24-42bb-aabc-b631301efa8d PiperOrigin-RevId: 368122566 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 074e98031dc..c51eef8ae3c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9c61b27151a7ecb2a0a486b9a0f604795829ba2102aaa48819b4eb9bd9f3c784", - git_commit = "592dc461c7092f43e221bfd576a6c81ce7599dfd", + sha256 = "ccf4a28c8da3438225d9b79823cb4c975507e5ce467f12b060366b1e5e7e52e2", + git_commit = "f4cce24ff60c692d06ce79a6009f93258703698c", ) # Import all of TensorFlow Serving's external dependencies. From d4673f7874cbc1dc8e28711475bc964d615ad32c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 13 Apr 2021 00:02:21 -0700 Subject: [PATCH 4901/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/617d2c0c-0fd5-4962-8d5f-d59c2a7ea68e PiperOrigin-RevId: 368159001 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c51eef8ae3c..8459211e404 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ccf4a28c8da3438225d9b79823cb4c975507e5ce467f12b060366b1e5e7e52e2", - git_commit = "f4cce24ff60c692d06ce79a6009f93258703698c", + sha256 = "5275cfaffe40fec508f2cdd5be6c3db473d8ad9933deb847ab242c503debe0fe", + git_commit = "cccd4f29481054636aa2e9af61741c863bcbdff6", ) # Import all of TensorFlow Serving's external dependencies. From 5a9a9320d8a0e73f625ef144892a5f8f5cfdb7cf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 13 Apr 2021 06:01:41 -0700 Subject: [PATCH 4902/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/98d8a879-63c8-40eb-854f-de8cff663a15 PiperOrigin-RevId: 368199099 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8459211e404..a512b3b29aa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5275cfaffe40fec508f2cdd5be6c3db473d8ad9933deb847ab242c503debe0fe", - git_commit = "cccd4f29481054636aa2e9af61741c863bcbdff6", + sha256 = "c624c0e0d3782bb1c42facf040561fb4e557c17d1dbcf2053ba9160935303cc9", + git_commit = "119161fed5d4c2ed38895aa19bcfc5893bd58995", ) # Import all of TensorFlow Serving's external dependencies. From f9ae40482118b4ca4fb2e0a78aa5569ac0565405 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 13 Apr 2021 12:01:32 -0700 Subject: [PATCH 4903/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/18faf83b-8011-4004-b03d-661ef52e303d PiperOrigin-RevId: 368265246 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a512b3b29aa..9c8f5163641 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c624c0e0d3782bb1c42facf040561fb4e557c17d1dbcf2053ba9160935303cc9", - git_commit = "119161fed5d4c2ed38895aa19bcfc5893bd58995", + sha256 = "741311b7a3a9d5393f3500bd37342e72cc8271164f9105e74a10c371cc398a23", + git_commit = "f66782631d276c390732a513cdef6ad91eb4e779", ) # Import all of TensorFlow Serving's external dependencies. From b1b9071373008e654b2e34c102e155ead76d40b9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 13 Apr 2021 18:01:39 -0700 Subject: [PATCH 4904/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/552cbede-ec37-4ade-bb58-b19e9b17cbfe PiperOrigin-RevId: 368333475 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9c8f5163641..5d34542351f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "741311b7a3a9d5393f3500bd37342e72cc8271164f9105e74a10c371cc398a23", - git_commit = "f66782631d276c390732a513cdef6ad91eb4e779", + sha256 = "7e4475feb68d4f782cd90e64fcad6c98203a19cba1e309056631b829a7b44600", + git_commit = "b055b9c474cd376259dde8779908f9eeaf097d93", ) # Import all of TensorFlow Serving's external dependencies. From 61e47be948f57c9762e34dd00396097778c8489b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 14 Apr 2021 00:01:21 -0700 Subject: [PATCH 4905/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/741b3215-3030-4c8a-b83a-589b0d1e1399 PiperOrigin-RevId: 368371663 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5d34542351f..78afba21c2c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7e4475feb68d4f782cd90e64fcad6c98203a19cba1e309056631b829a7b44600", - git_commit = "b055b9c474cd376259dde8779908f9eeaf097d93", + sha256 = "5fc8727c6765132371d3278dc52c27003b1d62396aa537c5132837eef5eb8e27", + git_commit = "e27476b63bdb9b1ce8f6f501dfc78d9fea651e4c", ) # Import all of TensorFlow Serving's external dependencies. From 99e4db7f88d9a6bc4fba07be2deae492f8e7d418 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 14 Apr 2021 06:01:21 -0700 Subject: [PATCH 4906/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/49d8f9ec-34e0-4e48-a809-894dfb315b0a PiperOrigin-RevId: 368414340 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 78afba21c2c..93b2792a998 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5fc8727c6765132371d3278dc52c27003b1d62396aa537c5132837eef5eb8e27", - git_commit = "e27476b63bdb9b1ce8f6f501dfc78d9fea651e4c", + sha256 = "3cfde459d658df1a73136625a4b9e0edafa7b150da1d47c8051fb5c8a072f3a5", + git_commit = "d20a28794b42aa4e65f4646add6ca99543b61ce0", ) # Import all of TensorFlow Serving's external dependencies. From fb79d3e4b6b660cf28a892e9565135d7a41f79ef Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 14 Apr 2021 12:01:28 -0700 Subject: [PATCH 4907/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2dc1473a-1d4e-4881-aef4-3e4e5af4bdc8 PiperOrigin-RevId: 368478509 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 93b2792a998..2abec0075ab 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3cfde459d658df1a73136625a4b9e0edafa7b150da1d47c8051fb5c8a072f3a5", - git_commit = "d20a28794b42aa4e65f4646add6ca99543b61ce0", + sha256 = "8c5edd91f5a15557f3a09dda7769905eb5e16f9e06343d43ea6c0daa9829f3c2", + git_commit = "9a41de38fabf603f38443a08f063fda6095ba683", ) # Import all of TensorFlow Serving's external dependencies. From 6ae77c9c492a8ecaacfb87d4444e80f446247cc4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 14 Apr 2021 18:01:30 -0700 Subject: [PATCH 4908/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6521ca39-16ad-448b-9d2f-7a690b6fe060 PiperOrigin-RevId: 368545640 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2abec0075ab..3d7e62db9b2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8c5edd91f5a15557f3a09dda7769905eb5e16f9e06343d43ea6c0daa9829f3c2", - git_commit = "9a41de38fabf603f38443a08f063fda6095ba683", + sha256 = "81e97eea1435e5f8d3410dce686675edf1e373d0a58dbc70a7d9f30f40e3d7f9", + git_commit = "8fe96038501b73f485d0859461c48deef4a93057", ) # Import all of TensorFlow Serving's external dependencies. From 34ff99d04e567c8ae5145ed78fd0ca6192a17a0f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 15 Apr 2021 00:01:23 -0700 Subject: [PATCH 4909/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/05cf4ad9-ab77-4d0c-86ae-09a963de0b5f PiperOrigin-RevId: 368582809 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3d7e62db9b2..24b9e7d4476 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "81e97eea1435e5f8d3410dce686675edf1e373d0a58dbc70a7d9f30f40e3d7f9", - git_commit = "8fe96038501b73f485d0859461c48deef4a93057", + sha256 = "3259c89fa316c0da5d5dc3e89a9cc675bdc399f14c27a9cc77938a1bfe3200e4", + git_commit = "51175225e5d53e3fbf48d73a26408d8a23bbbd78", ) # Import all of TensorFlow Serving's external dependencies. From fc39beb4df1570b2626f820c7752567b1291b5eb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 15 Apr 2021 06:01:23 -0700 Subject: [PATCH 4910/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e491cf90-a7d4-44ed-9cd0-38fe83628286 PiperOrigin-RevId: 368623873 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 24b9e7d4476..7a0abae9b9f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3259c89fa316c0da5d5dc3e89a9cc675bdc399f14c27a9cc77938a1bfe3200e4", - git_commit = "51175225e5d53e3fbf48d73a26408d8a23bbbd78", + sha256 = "a54bda590a9ead8435230478e3cfb27b9a3e7f5332d367f55c8f3284308e8b4e", + git_commit = "7bc60cb41d7d1e49471b6a424d471c888ae84fbc", ) # Import all of TensorFlow Serving's external dependencies. From 9156d0b76bc86f2d99e6a0615feee17324dc0a03 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 15 Apr 2021 12:01:26 -0700 Subject: [PATCH 4911/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8ad9fe49-8671-42c1-868c-84a0409c3cbd PiperOrigin-RevId: 368688349 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7a0abae9b9f..309865f386c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a54bda590a9ead8435230478e3cfb27b9a3e7f5332d367f55c8f3284308e8b4e", - git_commit = "7bc60cb41d7d1e49471b6a424d471c888ae84fbc", + sha256 = "1fab263bf9e5abbb3a7c2f2051da5972478ef505227aebd939826c6d6ac7ed29", + git_commit = "65845ba4b8fdcf83a66c9f0084e5bdcab0a38666", ) # Import all of TensorFlow Serving's external dependencies. From 22dab65a6415a19f084afa7b29dfeddf59bf8468 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 15 Apr 2021 18:03:34 -0700 Subject: [PATCH 4912/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b5fbcefb-6e25-496f-9dee-af1043f8852c PiperOrigin-RevId: 368754936 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 309865f386c..f6229a47a1b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1fab263bf9e5abbb3a7c2f2051da5972478ef505227aebd939826c6d6ac7ed29", - git_commit = "65845ba4b8fdcf83a66c9f0084e5bdcab0a38666", + sha256 = "1bc30918dfcbe1586c5b1019be11ac6137c8775e9076360e347556ba20d3e924", + git_commit = "8040cd1cca688fdfd10f954ebc7870d3c5c1883f", ) # Import all of TensorFlow Serving's external dependencies. From 0e38c78f3c25852fa8d88191fd73ef0f18312d3f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 16 Apr 2021 00:01:24 -0700 Subject: [PATCH 4913/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0c990662-510d-4b8f-b3ab-04c58db3641b PiperOrigin-RevId: 368791634 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f6229a47a1b..3d16dedb9a4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1bc30918dfcbe1586c5b1019be11ac6137c8775e9076360e347556ba20d3e924", - git_commit = "8040cd1cca688fdfd10f954ebc7870d3c5c1883f", + sha256 = "2074b03b3b947bcd2fd952e60c2d1cc2adc86c9717df776bab08c7575b3e1786", + git_commit = "65c18509181c9a8801518e53892e7ed9dba470a1", ) # Import all of TensorFlow Serving's external dependencies. From aa95448a65937a991d8fa6230d45fd8e0816117c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 16 Apr 2021 06:01:30 -0700 Subject: [PATCH 4914/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/76ba2801-6453-432d-a379-22765d6060a7 PiperOrigin-RevId: 368831828 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3d16dedb9a4..9232b8c86ce 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2074b03b3b947bcd2fd952e60c2d1cc2adc86c9717df776bab08c7575b3e1786", - git_commit = "65c18509181c9a8801518e53892e7ed9dba470a1", + sha256 = "1fb91e9bee955b3c7065c1678adc0d395ae2fae25c359c99c8afb02b49bd5c60", + git_commit = "46ef6f1ca8954f512b7c02c30eadb357baed5520", ) # Import all of TensorFlow Serving's external dependencies. From ca16fa480f49a08e4c20b649bc7c47a681eb5c12 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 16 Apr 2021 12:03:26 -0700 Subject: [PATCH 4915/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b930a32b-f431-4b4c-bc05-99975b0c65ae PiperOrigin-RevId: 368892957 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9232b8c86ce..5cfa4eea4a1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1fb91e9bee955b3c7065c1678adc0d395ae2fae25c359c99c8afb02b49bd5c60", - git_commit = "46ef6f1ca8954f512b7c02c30eadb357baed5520", + sha256 = "b59df9e15238f7042b9de0e26be1bc792b1fffd34c750686ec1298b25b2addb8", + git_commit = "2fa483b13af1ecffdf9eb3a497e76962878779c6", ) # Import all of TensorFlow Serving's external dependencies. From 4a8dd48f0ad72fec27c455946edae108db7b6d01 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 16 Apr 2021 18:01:25 -0700 Subject: [PATCH 4916/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/679e0421-ff10-4a63-84b7-6d50c622766f PiperOrigin-RevId: 368953963 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5cfa4eea4a1..605d51ebfbe 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b59df9e15238f7042b9de0e26be1bc792b1fffd34c750686ec1298b25b2addb8", - git_commit = "2fa483b13af1ecffdf9eb3a497e76962878779c6", + sha256 = "57c92f201bad8a32796b165cc6f107faf510ea11eab7ae74e00a2f9a31b32549", + git_commit = "0bedfb5781077559377efa0e76c668ae535da22e", ) # Import all of TensorFlow Serving's external dependencies. From 59526679efe0f0ab6d3e027d46bbc6e0e37aebe7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 17 Apr 2021 00:01:38 -0700 Subject: [PATCH 4917/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/634b2284-9c8f-4475-b97b-b2939fde79aa PiperOrigin-RevId: 368981289 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 605d51ebfbe..f44723e5c1e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "57c92f201bad8a32796b165cc6f107faf510ea11eab7ae74e00a2f9a31b32549", - git_commit = "0bedfb5781077559377efa0e76c668ae535da22e", + sha256 = "a932c9286bf2c38042219112316525d92e75eee060ec054b9231ed8e7d057da4", + git_commit = "4aa609aae8600e6be900135162439375ad396f2e", ) # Import all of TensorFlow Serving's external dependencies. From 134361f9c9d0fe83ecfcffa0447d5f70a37c3cc2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 17 Apr 2021 06:01:44 -0700 Subject: [PATCH 4918/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/149a00f1-972e-4e6c-8016-36ec8a91ac7b PiperOrigin-RevId: 369004318 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f44723e5c1e..b76b14e1ecd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a932c9286bf2c38042219112316525d92e75eee060ec054b9231ed8e7d057da4", - git_commit = "4aa609aae8600e6be900135162439375ad396f2e", + sha256 = "001a6c10e63595d99be508144243c2bcad489c93aab77953d002b62f3b94e192", + git_commit = "aa44812e3e40b1c95586466bc177b07525b787ea", ) # Import all of TensorFlow Serving's external dependencies. From 46694d03ef9287d72f856b2a4a159381ff645815 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Sat, 17 Apr 2021 11:03:20 -0700 Subject: [PATCH 4919/8103] Fix broken GPU build by add TF cuda options: https://github.com/tensorflow/tensorflow/blob/aa44812e3e40b1c95586466bc177b07525b787ea/.bazelrc#L227 to TF Serving. This causes TF sources to be built with correct options (bazel options are not picked from relevant dependent repo (TF in this case), when building code from that repo). PiperOrigin-RevId: 369022405 --- .bazelrc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.bazelrc b/.bazelrc index 71c0fdbc9b0..f5e695fb8be 100644 --- a/.bazelrc +++ b/.bazelrc @@ -3,9 +3,10 @@ build:release --copt=-mavx build:release --copt=-msse4.2 # Options used to build with CUDA. +build:cuda --repo_env TF_NEED_CUDA=1 build:cuda --crosstool_top=@local_config_cuda//crosstool:toolchain +build:cuda --@local_config_cuda//:enable_cuda build:cuda --define=using_cuda=true --define=using_cuda_nvcc=true - build:cuda --action_env=TF_CUDA_COMPUTE_CAPABILITIES="sm_35,sm_50,sm_60,sm_70,sm_75,compute_80" # Options used to build with TPU support. From b2b338efdf79f04246d40ed64c205ed48cc4bc9c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 17 Apr 2021 18:01:39 -0700 Subject: [PATCH 4920/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2ff42a7b-8533-453a-ad37-1caa5bb8a7e0 PiperOrigin-RevId: 369046070 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b76b14e1ecd..0270a7cd544 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "001a6c10e63595d99be508144243c2bcad489c93aab77953d002b62f3b94e192", - git_commit = "aa44812e3e40b1c95586466bc177b07525b787ea", + sha256 = "d23ee1a5fa5288179cc7359bf1e9dd0f4f6228947b6e5a6c8e621ab41356e0f3", + git_commit = "3c333304693686ce640812b56094b6cd19de3749", ) # Import all of TensorFlow Serving's external dependencies. From 6d5de2848d2c72d7c97ce61eb5f34bb3ffede8d1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 18 Apr 2021 00:02:43 -0700 Subject: [PATCH 4921/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ba64a178-6715-4344-9d73-e2c0663ed540 PiperOrigin-RevId: 369066242 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0270a7cd544..f23f2b2acd6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d23ee1a5fa5288179cc7359bf1e9dd0f4f6228947b6e5a6c8e621ab41356e0f3", - git_commit = "3c333304693686ce640812b56094b6cd19de3749", + sha256 = "dddd16695e64132bd115348bfdb5c22d37b6ebbb477d54de70ddafbabfe4d7a7", + git_commit = "4c4f420e68f1cfaf8f4b6e8e3eb857e9e4c3ff33", ) # Import all of TensorFlow Serving's external dependencies. From 8d357f6073fdeb21ef252c8db270b127f366cc95 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 18 Apr 2021 06:01:51 -0700 Subject: [PATCH 4922/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/508e7c6a-ad36-48af-9e92-9a806ff221a6 PiperOrigin-RevId: 369089155 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f23f2b2acd6..b5ea27d5044 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dddd16695e64132bd115348bfdb5c22d37b6ebbb477d54de70ddafbabfe4d7a7", - git_commit = "4c4f420e68f1cfaf8f4b6e8e3eb857e9e4c3ff33", + sha256 = "42901c7067b276341ac0e284322ab51510413e3bbaf34cdfc76ee278e678534b", + git_commit = "2554194a47a30ac6d05ac00dd07b359c1dc18728", ) # Import all of TensorFlow Serving's external dependencies. From 34f0169cc986260f8b435a018577a489191b6eda Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 19 Apr 2021 00:01:37 -0700 Subject: [PATCH 4923/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7489a4fa-0465-4d36-b33c-d95ef17bbdb1 PiperOrigin-RevId: 369161654 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b5ea27d5044..9f65a4b12f9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "42901c7067b276341ac0e284322ab51510413e3bbaf34cdfc76ee278e678534b", - git_commit = "2554194a47a30ac6d05ac00dd07b359c1dc18728", + sha256 = "b20984ce5e1688358f76eb2225120f7253a79fd9aadc929ca046432a614b0d39", + git_commit = "3d6647c90a4d5f809966601248e220014d64054f", ) # Import all of TensorFlow Serving's external dependencies. From 8c534d89f7fc1780ca97700b738ba6ef3690687d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 19 Apr 2021 06:01:33 -0700 Subject: [PATCH 4924/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b40722ad-2e69-4ac2-bbcc-b16d4c51f3ed PiperOrigin-RevId: 369204382 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9f65a4b12f9..b1335aa330e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b20984ce5e1688358f76eb2225120f7253a79fd9aadc929ca046432a614b0d39", - git_commit = "3d6647c90a4d5f809966601248e220014d64054f", + sha256 = "cb8fa4d7e68a2cfeaae18e482ca88d11da952001a030ed86fe5a602d38f1e025", + git_commit = "a79e2685b3ef070446e1d7395df574b76dfd5286", ) # Import all of TensorFlow Serving's external dependencies. From 05f477e769f223d4272ebf553b4f160fde0676fb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 19 Apr 2021 12:01:22 -0700 Subject: [PATCH 4925/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b54bb9a8-08a2-4029-a9b4-2ae99a989dea PiperOrigin-RevId: 369271031 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b1335aa330e..57ffb3378c2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cb8fa4d7e68a2cfeaae18e482ca88d11da952001a030ed86fe5a602d38f1e025", - git_commit = "a79e2685b3ef070446e1d7395df574b76dfd5286", + sha256 = "8e3503b2e68da4b2c2fee4ff6b59e607b6b02816761772b6fe4efa7b51d7e73e", + git_commit = "90fc4108443bdcf36f1f6c6f9d08d177169c34cf", ) # Import all of TensorFlow Serving's external dependencies. From 009dac683bf84165b84702d177bb9a021ebef728 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 19 Apr 2021 13:06:53 -0700 Subject: [PATCH 4926/8103] Roll forward with std::optional -> absl::optional. PiperOrigin-RevId: 369285701 --- .../batching/batching_session.cc | 100 +++++++++++++++--- .../batching/batching_session.h | 10 ++ .../batching/batching_session_test.cc | 46 ++++++++ .../tensorflow/bundle_factory_util.cc | 17 ++- .../tensorflow/bundle_factory_util.h | 11 +- .../tensorflow/saved_model_bundle_factory.cc | 12 ++- 6 files changed, 166 insertions(+), 30 deletions(-) diff --git a/tensorflow_serving/batching/batching_session.cc b/tensorflow_serving/batching/batching_session.cc index 1132e76f35c..6ab5d01255d 100644 --- a/tensorflow_serving/batching/batching_session.cc +++ b/tensorflow_serving/batching/batching_session.cc @@ -160,6 +160,17 @@ class BatchingSession : public ServingSession { const std::string& thread_pool_name, std::unique_ptr* result); + // Same as above but allows for specification of a default scheduler creator + // which enables requests that don't match an exact signature to also + // have batching. + static Status Create( + const BatchingSessionOptions& options, std::unique_ptr wrapped, + const std::vector& + signatures_with_scheduler_creators, + BatchingSessionSchedulerCreator default_creator, + const std::string& thread_pool_name, + std::unique_ptr* result); + ~BatchingSession() override = default; Status Run(const std::vector>& inputs, @@ -257,9 +268,34 @@ class BatchingSession : public ServingSession { // for monitoring purpose, and can be empty if not known. const std::string thread_pool_name_; + // If set, default_scheduler_creator_ is used when the input signature does + // not match any existing signature defined during model load. This helps + // when the user uses either a combination of signatures or filter certain + // output tensors. + absl::optional default_scheduler_creator_; + absl::Mutex mu_; + std::unordered_map>, + HashTensorSignature, EqTensorSignature> + custom_signature_batch_schedulers_ ABSL_GUARDED_BY(mu_); + TF_DISALLOW_COPY_AND_ASSIGN(BatchingSession); }; +Status BatchingSession::Create( + const BatchingSessionOptions& options, std::unique_ptr wrapped, + const std::vector& + signatures_with_scheduler_creators, + BatchingSessionSchedulerCreator default_creator, + const std::string& thread_pool_name, + std::unique_ptr* result) { + auto status = BatchingSession::Create(options, std::move(wrapped), + signatures_with_scheduler_creators, + thread_pool_name, result); + result->get()->default_scheduler_creator_ = default_creator; + return status; +} + Status BatchingSession::Create( const BatchingSessionOptions& options, std::unique_ptr wrapped, const std::vector& @@ -343,23 +379,40 @@ Status BatchingSession::InternalRun( TensorSignatureFromRunArgs(inputs, output_tensor_names); auto batch_scheduler_it = batch_schedulers_.find(signature); if (batch_scheduler_it == batch_schedulers_.end()) { - // We have a Run() call that doesn't match one of our batching signatures. - // Run it in-line. - LOG_EVERY_N_SEC(WARNING, 120) - << "Request doesn't match any declared signature. Bypassing " - "batcher. Request signature is: " - << TensorSignatureDebugString(signature); - - // Because the wrapped session may not provide an implementation for - // thread_pool_options, we need to invoke different Run() functions - // depending on whether thread_pool_options is specified. - if (thread_pool_options) { - return wrapped_->Run(run_options, inputs, output_tensor_names, - target_node_names, outputs, run_metadata, - thread_pool_options.value()); + if (default_scheduler_creator_.has_value()) { + absl::MutexLock l(&mu_); + batch_scheduler_it = custom_signature_batch_schedulers_.find(signature); + if (batch_scheduler_it == custom_signature_batch_schedulers_.end()) { + std::unique_ptr> batch_scheduler; + TF_RETURN_IF_ERROR(default_scheduler_creator_.value()( + [&, signature](std::unique_ptr> batch) { + ProcessBatch(signature, std::move(batch)); + }, + &batch_scheduler)); + custom_signature_batch_schedulers_[signature] = + std::move(batch_scheduler); + batch_scheduler_it = custom_signature_batch_schedulers_.find(signature); + } } else { - return wrapped_->Run(run_options, inputs, output_tensor_names, - target_node_names, outputs, run_metadata); + // We have a Run() call that doesn't match one of our batching signatures. + // Run it in-line. + LOG_EVERY_N_SEC(WARNING, 120) + << "Request doesn't match any declared signature and no default " + "scheduler creator specified. Bypassing " + "batcher. Request signature is: " + << TensorSignatureDebugString(signature); + + // Because the wrapped session may not provide an implementation for + // thread_pool_options, we need to invoke different Run() functions + // depending on whether thread_pool_options is specified. + if (thread_pool_options) { + return wrapped_->Run(run_options, inputs, output_tensor_names, + target_node_names, outputs, run_metadata, + thread_pool_options.value()); + } else { + return wrapped_->Run(run_options, inputs, output_tensor_names, + target_node_names, outputs, run_metadata); + } } } BatchScheduler* batch_scheduler = @@ -895,6 +948,21 @@ Status SplitInputTask( return Status::OK(); } +Status CreateBatchingSession( + const BatchingSessionOptions& options, + const std::vector& + signatures_with_scheduler_creators, + BatchingSessionSchedulerCreator default_creator, + std::unique_ptr session, + std::unique_ptr* batching_session) { + std::unique_ptr internal_batching_session; + TF_RETURN_IF_ERROR(BatchingSession::Create( + options, std::move(session), signatures_with_scheduler_creators, + default_creator, /*thread_pool_name=*/"", &internal_batching_session)); + *batching_session = std::move(internal_batching_session); + return Status::OK(); +} + Status CreateBatchingSession( const BatchingSessionOptions& options, const std::vector& diff --git a/tensorflow_serving/batching/batching_session.h b/tensorflow_serving/batching/batching_session.h index 92553d1e333..5190f851f17 100644 --- a/tensorflow_serving/batching/batching_session.h +++ b/tensorflow_serving/batching/batching_session.h @@ -133,6 +133,16 @@ Status CreateBatchingSession( std::unique_ptr session, std::unique_ptr* batching_session); +// Same as above but allows for a default scheduler creator for which signatures +// that don't match a supplied value during run time can still use batching. +Status CreateBatchingSession( + const BatchingSessionOptions& options, + const std::vector& + signatures_with_scheduler_creators, + BatchingSessionSchedulerCreator default_creator, + std::unique_ptr session, + std::unique_ptr* batching_session); + // A convenience for using CreateBatchingSession() to create a // BasicBatchScheduler for a single signature. Status CreateBasicBatchingSession( diff --git a/tensorflow_serving/batching/batching_session_test.cc b/tensorflow_serving/batching/batching_session_test.cc index c14cf05cdf2..63d11aea19c 100644 --- a/tensorflow_serving/batching/batching_session_test.cc +++ b/tensorflow_serving/batching/batching_session_test.cc @@ -994,6 +994,52 @@ TEST_P(BatchingSessionTest, ThreadPoolOptions) { })); } +TEST_P(BatchingSessionTest, SubsetOutputTensors) { + BasicBatchScheduler::Options schedule_options; + schedule_options.max_batch_size = 6; // fits three 2-unit tasks + schedule_options.batch_timeout_micros = 1 * 1000 * 1000; // won't trigger + schedule_options.num_batch_threads = 1; + schedule_options = annotate_options(schedule_options); + BatchingSessionOptions batching_session_options; + std::unique_ptr batching_session; + TF_ASSERT_OK(CreateBasicBatchingSession( + schedule_options, batching_session_options, {{"x", "x2"}, {"y", "y3"}}, + CreateHalfPlusTwoSession(), &batching_session)); + + const Tensor input0 = test::AsTensor({8.0f, 6.0f}, {2}); + const Tensor expected_output0 = test::AsTensor({6.0f, 5.0f}, {2}); + const Tensor input1 = test::AsTensor({100.0f, 42.0f}, {2}); + const Tensor expected_output1 = test::AsTensor({53.0f, 24.0f}, {2}); + + std::unique_ptr first_request_thread( + Env::Default()->StartThread(ThreadOptions(), "first_request_thread", [&] { + std::vector outputs; + TF_ASSERT_OK(batching_session->Run({{"x", input0}, {"x2", input1}}, + {"y"} /* outputs */, + {} /* target nodes */, &outputs)); + ASSERT_EQ(1, outputs.size()); + test::ExpectTensorEqual(expected_output0, outputs[0]); + })); + std::unique_ptr second_request_thread(Env::Default()->StartThread( + ThreadOptions(), "second_request_thread", [&] { + std::vector outputs; + TF_ASSERT_OK(batching_session->Run({{"x2", input1}, {"x", input0}}, + {"y3"} /* outputs */, + {} /* target nodes */, &outputs)); + ASSERT_EQ(1, outputs.size()); + test::ExpectTensorEqual(expected_output1, outputs[0]); + })); + std::unique_ptr third_request_thread( + Env::Default()->StartThread(ThreadOptions(), "third_request_thread", [&] { + std::vector outputs; + TF_ASSERT_OK(batching_session->Run({{"x2", input1}, {"x", input0}}, + {"y"} /* outputs */, + {} /* target nodes */, &outputs)); + ASSERT_EQ(1, outputs.size()); + test::ExpectTensorEqual(expected_output0, outputs[0]); + })); +} + INSTANTIATE_TEST_CASE_P(WithOrWithoutThreadPools, BatchingSessionTest, ::testing::Bool()); diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_util.cc b/tensorflow_serving/servables/tensorflow/bundle_factory_util.cc index eda2b196eea..4b9b899f9dd 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_util.cc +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_util.cc @@ -60,7 +60,8 @@ Status EstimateResourceFromPath(const string& path, bool use_validation_result, Status WrapSessionForBatching(const BatchingParameters& batching_config, std::shared_ptr batch_scheduler, const std::vector& signatures, - std::unique_ptr* session) { + std::unique_ptr* session, + bool enable_default_schedule_creator) { LOG(INFO) << "Wrapping session to perform batch processing"; if (batch_scheduler == nullptr) { @@ -106,9 +107,17 @@ Status WrapSessionForBatching(const BatchingParameters& batching_config, {tensor_signature, create_queue}); } - return CreateBatchingSession(batching_session_options, - signatures_with_scheduler_creators, - std::move(*session), session); + // TODO(b/184973097): Remove enable_default_schedule_creator once TFLite is + // fixed. + if (enable_default_schedule_creator) { + return CreateBatchingSession(batching_session_options, + signatures_with_scheduler_creators, + create_queue, std::move(*session), session); + } else { + return CreateBatchingSession(batching_session_options, + signatures_with_scheduler_creators, + std::move(*session), session); + } } Status WrapSession(std::unique_ptr* session) { diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_util.h b/tensorflow_serving/servables/tensorflow/bundle_factory_util.h index 1d1a15761e9..753765c8d1e 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_util.h +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_util.h @@ -85,16 +85,15 @@ Status CreateBatchScheduler( Status EstimateResourceFromPath(const string& path, bool use_validation_result, ResourceAllocation* estimate); -// Wraps a session in a new session that automatically batches Run() calls, for -// the given signatures. -// TODO(b/33233998): Support batching for Run() calls that use a combination of -// signatures -- i.e. sometimes construct a single TensorSignature for a set of -// SignatureDefs (usually just two of them) -- based on some config. +// Wraps a session in a new session that automatically batches Run() calls. +// TODO(b/184973097): Remove enable_default_schedule_creator once TFLite is +// fixed. Status WrapSessionForBatching( const BatchingParameters& batching_config, std::shared_ptr> batch_scheduler, const std::vector& signatures, - std::unique_ptr* session); + std::unique_ptr* session, + bool enable_default_schedule_creator = false); // Wraps a session in a new session that only supports Run() without batching. Status WrapSession(std::unique_ptr* session); diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc index e13ebfb8553..2b2c202063d 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc @@ -146,7 +146,8 @@ Status SavedModelBundleFactory::InternalCreateSavedModelBundle( return result; }(); - if (config_.prefer_tflite_model() && TfLiteModelFound(path)) { + bool is_tflite = config_.prefer_tflite_model() && TfLiteModelFound(path); + if (is_tflite) { int num_tflite_pools = config_.num_tflite_pools(); if (num_tflite_pools == 0 && config_.num_tflite_interpreters() > 0) { num_tflite_pools = config_.num_tflite_interpreters(); @@ -179,10 +180,13 @@ Status SavedModelBundleFactory::InternalCreateSavedModelBundle( // Enable batching of requests to any one signature_def in the SavedModel. // Note that in the future, the plan is to enable explicit configuration // of the one or many SignatureDefs to enable. + // TODO(b/184973097): Remove enable_default_schedule_creator once TFLite is + // fixed. const std::vector signatures = GetSignatureDefs(**bundle); - return WrapSessionForBatching(config_.batching_parameters(), - batch_scheduler_, signatures, - &(*bundle)->session); + return WrapSessionForBatching( + config_.batching_parameters(), batch_scheduler_, signatures, + &(*bundle)->session, + /*enable_default_schedule_creator=*/!is_tflite); } return WrapSession(&(*bundle)->session); } From e01cef2bd3988a7db944d10ea8281200b4f2cfbd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 19 Apr 2021 18:01:31 -0700 Subject: [PATCH 4927/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/122bab75-86a1-4a9d-a927-d0652682f80e PiperOrigin-RevId: 369342279 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 57ffb3378c2..073494d49e7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8e3503b2e68da4b2c2fee4ff6b59e607b6b02816761772b6fe4efa7b51d7e73e", - git_commit = "90fc4108443bdcf36f1f6c6f9d08d177169c34cf", + sha256 = "bb47dbe321dceff04ca50f37a86dadd2793e2f1f46e6d91963aba80d08f9c828", + git_commit = "906c8d5c5b9dbd930b0c2d41c0fe8650b746b1cf", ) # Import all of TensorFlow Serving's external dependencies. From 10216d448cb482122ce6d821a994680fe457238f Mon Sep 17 00:00:00 2001 From: arghyaganguly Date: Tue, 20 Apr 2021 12:17:04 +0530 Subject: [PATCH 4928/8103] Fix nvidia-docker link at Serving Docker using your GPU --- tensorflow_serving/g3doc/docker.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/g3doc/docker.md b/tensorflow_serving/g3doc/docker.md index a335aa71005..340d2a1751b 100644 --- a/tensorflow_serving/g3doc/docker.md +++ b/tensorflow_serving/g3doc/docker.md @@ -232,7 +232,7 @@ details, see [running a serving image](#running-a-serving-image). Let's run through a full example where we load a model with GPU-bound ops and call it using the REST API. -First install [`nvidia-docker`](#install-nvidia-docker). Next you can pull the +First install [`nvidia-docker`](https://github.com/NVIDIA/nvidia-docker#quick-start). Next you can pull the latest TensorFlow Serving GPU docker image by running: ```shell From d0e43b02020fc0849cd01046d05e70c8acc2b879 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 20 Apr 2021 00:01:29 -0700 Subject: [PATCH 4929/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/982ffdd5-9f11-4a1c-8f55-7ce845b68553 PiperOrigin-RevId: 369380978 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 073494d49e7..bca9d908be4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bb47dbe321dceff04ca50f37a86dadd2793e2f1f46e6d91963aba80d08f9c828", - git_commit = "906c8d5c5b9dbd930b0c2d41c0fe8650b746b1cf", + sha256 = "9b1109a4923649131a7c21370e8049472a46c5652f554cfd613e7e505b003ddc", + git_commit = "bc4f9bb93bc82b086df5dd8fca5da61590649e16", ) # Import all of TensorFlow Serving's external dependencies. From 8b0b7cd33cd2007e16c2ccbb171339d1047e333c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 20 Apr 2021 06:01:32 -0700 Subject: [PATCH 4930/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0d6a89de-b1c2-4367-94f3-de17f9cec826 PiperOrigin-RevId: 369422968 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bca9d908be4..95598f3ed98 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9b1109a4923649131a7c21370e8049472a46c5652f554cfd613e7e505b003ddc", - git_commit = "bc4f9bb93bc82b086df5dd8fca5da61590649e16", + sha256 = "a3beb1931b50e62a50365b4c7f453ccea02ede1b3d206e94840b3f917e9c3bed", + git_commit = "f2e82c624a49c2b8cf8a63e95c287488b7d2ffb7", ) # Import all of TensorFlow Serving's external dependencies. From eb51729fbdc441942535c5a94474f58a317a1033 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 20 Apr 2021 12:01:33 -0700 Subject: [PATCH 4931/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e25d71f8-66ff-4d0a-a250-bcfd7e26c0b2 PiperOrigin-RevId: 369489933 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 95598f3ed98..b173318c857 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a3beb1931b50e62a50365b4c7f453ccea02ede1b3d206e94840b3f917e9c3bed", - git_commit = "f2e82c624a49c2b8cf8a63e95c287488b7d2ffb7", + sha256 = "44aa272987a3bdf914a227f2e9e190436125a9d3c952848a9079b65839b57765", + git_commit = "46b05a7385f87ebe1788d478286401569d9f1429", ) # Import all of TensorFlow Serving's external dependencies. From edce8d60f33e6759fc1c4ebe221e88268a81fc8d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 20 Apr 2021 18:01:33 -0700 Subject: [PATCH 4932/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c781fe89-6754-480d-bef4-567f6eef304a PiperOrigin-RevId: 369559419 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b173318c857..792d5cef33f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "44aa272987a3bdf914a227f2e9e190436125a9d3c952848a9079b65839b57765", - git_commit = "46b05a7385f87ebe1788d478286401569d9f1429", + sha256 = "d3e8d57422cd959f5070041913ad8836760807845a6fec7442c47ae203e7a485", + git_commit = "8bc01c710ed08abb1e6c589d7c2e99d006796479", ) # Import all of TensorFlow Serving's external dependencies. From 644f8adc93e6bc5d69e77bd6e627b2e710ba55e3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 21 Apr 2021 00:01:56 -0700 Subject: [PATCH 4933/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/97ad0b16-ae36-45a3-8209-7a3ca6405e7d PiperOrigin-RevId: 369596221 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 792d5cef33f..e792f78b3a3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d3e8d57422cd959f5070041913ad8836760807845a6fec7442c47ae203e7a485", - git_commit = "8bc01c710ed08abb1e6c589d7c2e99d006796479", + sha256 = "52dd0ccdddba146afbca7a47855e0877392bf0239400dbc7cb090a7b1caa3ccf", + git_commit = "8e55a917c06635a4005da4f42da286117741f4a8", ) # Import all of TensorFlow Serving's external dependencies. From abd2636d34afddb6dcbdc07f6ced11df09704b1d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 21 Apr 2021 06:01:28 -0700 Subject: [PATCH 4934/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/eaa570a5-5d9f-4c55-a2a2-d656b967f9ca PiperOrigin-RevId: 369639014 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e792f78b3a3..8bb18656605 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "52dd0ccdddba146afbca7a47855e0877392bf0239400dbc7cb090a7b1caa3ccf", - git_commit = "8e55a917c06635a4005da4f42da286117741f4a8", + sha256 = "c6458a1a00d6c33833d1434efe0bf7bfe4d7e895e3241b0d904342693127d45f", + git_commit = "d9ad2a9f62ada961b26d09c8f4856cb0c94d9f8a", ) # Import all of TensorFlow Serving's external dependencies. From 2e719c09da7aecf9b0afddf8a716c0f93e209393 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 21 Apr 2021 12:01:29 -0700 Subject: [PATCH 4935/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/260807ea-7e8a-4e14-92a1-e8a3d58fd2c1 PiperOrigin-RevId: 369704163 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8bb18656605..c6ea40d4d47 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c6458a1a00d6c33833d1434efe0bf7bfe4d7e895e3241b0d904342693127d45f", - git_commit = "d9ad2a9f62ada961b26d09c8f4856cb0c94d9f8a", + sha256 = "27979ed4c602aec003b631bd0e9c467f6adb679b7f0e4879e57fc60d7d60b83c", + git_commit = "e6dad508934e23b239f82264c88faf53b32e47fe", ) # Import all of TensorFlow Serving's external dependencies. From 0e64c70b3820ac9c001ddb9b9fff17b821022996 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 21 Apr 2021 18:01:27 -0700 Subject: [PATCH 4936/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c1db9798-edae-4567-ad94-216f5fdd53c9 PiperOrigin-RevId: 369773967 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c6ea40d4d47..90d0d7b01a5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "27979ed4c602aec003b631bd0e9c467f6adb679b7f0e4879e57fc60d7d60b83c", - git_commit = "e6dad508934e23b239f82264c88faf53b32e47fe", + sha256 = "4a9139fc540850b5e30fcad2d9816dbd6f79cf31148d7cb8dda67bd4a78f48bd", + git_commit = "e9305d8cfc40ec9e72ef885150ecac0932165664", ) # Import all of TensorFlow Serving's external dependencies. From e61771b3e6c9f6b9d17119ed0d10c67c618da745 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 22 Apr 2021 00:01:35 -0700 Subject: [PATCH 4937/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6edc0984-31fb-4464-9e5d-7f896ec47a12 PiperOrigin-RevId: 369812465 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 90d0d7b01a5..728424b3a33 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4a9139fc540850b5e30fcad2d9816dbd6f79cf31148d7cb8dda67bd4a78f48bd", - git_commit = "e9305d8cfc40ec9e72ef885150ecac0932165664", + sha256 = "c8094e063f511ece18f74a1febce2651619b0b203036be83583da43fcdd99bf5", + git_commit = "4d618cb1fe451d5397f821fb2021c9028cec4f5c", ) # Import all of TensorFlow Serving's external dependencies. From 25cc5f1839f8d45173f3f7a5994e658918b3bdb4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 22 Apr 2021 06:01:30 -0700 Subject: [PATCH 4938/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/307d8343-c7f2-4be4-b92c-af339437cfa7 PiperOrigin-RevId: 369854880 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 728424b3a33..39037a4aefb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c8094e063f511ece18f74a1febce2651619b0b203036be83583da43fcdd99bf5", - git_commit = "4d618cb1fe451d5397f821fb2021c9028cec4f5c", + sha256 = "d56bc1201111cad904ac03dcc8ca6e62513478c053bf7db3e2b1fc3e052715cf", + git_commit = "fd57ef146dd1b03f33d33e85e9ed3e48a4409bc8", ) # Import all of TensorFlow Serving's external dependencies. From b13d72fef50ae35b76d78352532b90d53ab4b41c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 22 Apr 2021 12:01:35 -0700 Subject: [PATCH 4939/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/499fbbd3-4c41-488a-92d5-e7f8ed30bc7e PiperOrigin-RevId: 369920665 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 39037a4aefb..96ab1ab7955 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d56bc1201111cad904ac03dcc8ca6e62513478c053bf7db3e2b1fc3e052715cf", - git_commit = "fd57ef146dd1b03f33d33e85e9ed3e48a4409bc8", + sha256 = "78aa843da3db7cde9804a24976ea4e9a370b6bba758e1497ea433942e9a739be", + git_commit = "47590d1b201f2b3af0653e11c92197dbf0953b2b", ) # Import all of TensorFlow Serving's external dependencies. From f89ecefd4f84c89b639e749c3c1a36c082e7aae8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 22 Apr 2021 18:02:02 -0700 Subject: [PATCH 4940/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/753169dd-de6c-4371-bca4-b0857044fb30 PiperOrigin-RevId: 369989398 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 96ab1ab7955..3d8c06682c5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "78aa843da3db7cde9804a24976ea4e9a370b6bba758e1497ea433942e9a739be", - git_commit = "47590d1b201f2b3af0653e11c92197dbf0953b2b", + sha256 = "e86051ce2dc78707f5963c1d56be0a71ba9de281b4a6b4f2a3e521f218c14d0b", + git_commit = "ea3b43e98c32c97b35d52b4c66f9107452ca8fb2", ) # Import all of TensorFlow Serving's external dependencies. From ad2042a00fe66b7ca748f4694d11521fd9a6335b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 23 Apr 2021 00:01:44 -0700 Subject: [PATCH 4941/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f160d6f8-e6c1-4e92-804b-ae86a6838b46 PiperOrigin-RevId: 370026120 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3d8c06682c5..885301ca945 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e86051ce2dc78707f5963c1d56be0a71ba9de281b4a6b4f2a3e521f218c14d0b", - git_commit = "ea3b43e98c32c97b35d52b4c66f9107452ca8fb2", + sha256 = "ac5f2de26f5223f3b857f8fe28d6f6c1b398c05be68198b895c65cb319cb8034", + git_commit = "57b6146cf37d03c3b03b1ad14c635552fbfcc3d3", ) # Import all of TensorFlow Serving's external dependencies. From 106e85c9cf53427652948ec19fae9687206b14cf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 23 Apr 2021 06:01:59 -0700 Subject: [PATCH 4942/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/cd24a925-e6f1-441a-9aa1-9f29c5d39d16 PiperOrigin-RevId: 370065852 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 885301ca945..db2e64c6d02 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ac5f2de26f5223f3b857f8fe28d6f6c1b398c05be68198b895c65cb319cb8034", - git_commit = "57b6146cf37d03c3b03b1ad14c635552fbfcc3d3", + sha256 = "6f866df9c6e36bba61654dd8e5401d763bf490836520ff5d91f55d9f3dfcea1a", + git_commit = "9d9fab774947cecf51d6a99afab22cd0befacd01", ) # Import all of TensorFlow Serving's external dependencies. From 2fcb14c68a47d255138381a3f1a0381ec89838a5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 23 Apr 2021 12:01:49 -0700 Subject: [PATCH 4943/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3ababb8d-4230-4daf-b3d6-1dccad9317c1 PiperOrigin-RevId: 370128376 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index db2e64c6d02..60f7c1f8546 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6f866df9c6e36bba61654dd8e5401d763bf490836520ff5d91f55d9f3dfcea1a", - git_commit = "9d9fab774947cecf51d6a99afab22cd0befacd01", + sha256 = "6118e235cbfa1d52e36ff58966ae7718d4cb58a6b456d724a11b2aeab8ab8271", + git_commit = "8f7d9ac896ce2ac43dbcd369d761f4568b6935c2", ) # Import all of TensorFlow Serving's external dependencies. From e596f7ad949834c824028dbdb958b24d3532be75 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 23 Apr 2021 18:01:23 -0700 Subject: [PATCH 4944/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a6249ec9-f484-43ba-8e73-1f348f64b9d0 PiperOrigin-RevId: 370191151 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 60f7c1f8546..2066a207687 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6118e235cbfa1d52e36ff58966ae7718d4cb58a6b456d724a11b2aeab8ab8271", - git_commit = "8f7d9ac896ce2ac43dbcd369d761f4568b6935c2", + sha256 = "57be7fc47bc18230f4ac705ecac57d734af20a432f74f3f6838a7d843b0d86fe", + git_commit = "43c6ab18e9736d2b7b367fec2101ccd3939faac2", ) # Import all of TensorFlow Serving's external dependencies. From c70e0d8a5a07024e5d979c17a7ff4366e2b57038 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 24 Apr 2021 00:01:40 -0700 Subject: [PATCH 4945/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2ea5a467-5e52-4c9f-9676-0ce0a6ae2c64 PiperOrigin-RevId: 370219721 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2066a207687..21ef217dc45 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "57be7fc47bc18230f4ac705ecac57d734af20a432f74f3f6838a7d843b0d86fe", - git_commit = "43c6ab18e9736d2b7b367fec2101ccd3939faac2", + sha256 = "b6e25ccf4f6172b24f9670c87c8a6258f7e0cbf517ded7c50addd3c01f1e1d44", + git_commit = "23bed4b80c5cbc536d3875a71a09d3f6b703fc72", ) # Import all of TensorFlow Serving's external dependencies. From 2fdcb3cebf1c93eb887cc854ad2b96f8a68aef4d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 24 Apr 2021 06:01:34 -0700 Subject: [PATCH 4946/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/347086a4-42a7-4179-8cac-0e9338a7fa9b PiperOrigin-RevId: 370245267 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 21ef217dc45..2ce57332b23 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b6e25ccf4f6172b24f9670c87c8a6258f7e0cbf517ded7c50addd3c01f1e1d44", - git_commit = "23bed4b80c5cbc536d3875a71a09d3f6b703fc72", + sha256 = "f830eda7a9e885da2c906776d2ed10a07e04001e78e7797396a33753d66de037", + git_commit = "8cae746d8449c7dda5298327353d68613f16e798", ) # Import all of TensorFlow Serving's external dependencies. From d16ab9d508a5c7bfa8746aa10ea582ef1bb74585 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 27 Apr 2021 18:01:20 -0700 Subject: [PATCH 4947/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9f7de018-6a04-4e74-910d-1b60d7c7a48f PiperOrigin-RevId: 370802049 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2ce57332b23..50558723448 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f830eda7a9e885da2c906776d2ed10a07e04001e78e7797396a33753d66de037", - git_commit = "8cae746d8449c7dda5298327353d68613f16e798", + sha256 = "020b3a73090eca8dfbaa27d05b19b57fe8d112dc6e4055b66c28c95d3ecddcb9", + git_commit = "48eb12101f2201d1565ae6e8aa013fd19c1715c9", ) # Import all of TensorFlow Serving's external dependencies. From 51e1e7dc45bc9b4ec1575494dd9c07a420d2a0e9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 28 Apr 2021 00:03:15 -0700 Subject: [PATCH 4948/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9bd9dda8-a76d-41e5-a933-06a173fec7f5 PiperOrigin-RevId: 370840716 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 50558723448..3dbfb4e51fa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "020b3a73090eca8dfbaa27d05b19b57fe8d112dc6e4055b66c28c95d3ecddcb9", - git_commit = "48eb12101f2201d1565ae6e8aa013fd19c1715c9", + sha256 = "6c4175dca1399f65a31dccef18b28b35e4edacdf9554a5f1355e39e8149e7ca3", + git_commit = "0a3773ed7b4c1fc60486dddfacbe9a5cbf2b2bdd", ) # Import all of TensorFlow Serving's external dependencies. From 716c9136d440abfd566f9fe1a552392c3e39ba59 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 28 Apr 2021 06:01:31 -0700 Subject: [PATCH 4949/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/84789fe1-e014-4aec-97e9-b7399784b76d PiperOrigin-RevId: 370885966 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3dbfb4e51fa..6bf6a2eb875 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6c4175dca1399f65a31dccef18b28b35e4edacdf9554a5f1355e39e8149e7ca3", - git_commit = "0a3773ed7b4c1fc60486dddfacbe9a5cbf2b2bdd", + sha256 = "a23d28b50bdf5377278e1057527e35be78571b065b1e8cef5db04d4a1b839696", + git_commit = "3ea5323fc345d1e625aba2a937672b0b9eacc7c4", ) # Import all of TensorFlow Serving's external dependencies. From da8f46eb84cf640d769aa60d3937dc197363882e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 28 Apr 2021 12:01:32 -0700 Subject: [PATCH 4950/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b7de98a4-bcca-4b64-8b7f-f76db2ef21dd PiperOrigin-RevId: 370954817 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6bf6a2eb875..fc93b6c49ad 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a23d28b50bdf5377278e1057527e35be78571b065b1e8cef5db04d4a1b839696", - git_commit = "3ea5323fc345d1e625aba2a937672b0b9eacc7c4", + sha256 = "7ad430942cd736ce4c0db66769b672936929f9836e3e835220dc3ae79a36e317", + git_commit = "54dbd592d460742c01ceeb43e6d061affbc99151", ) # Import all of TensorFlow Serving's external dependencies. From 47662c37fe84f7d73f85406f8cd660e4e965862f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 28 Apr 2021 18:01:12 -0700 Subject: [PATCH 4951/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/74aef135-a161-4c87-bf59-3758780aeb37 PiperOrigin-RevId: 371024793 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fc93b6c49ad..1f0f01b38a8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7ad430942cd736ce4c0db66769b672936929f9836e3e835220dc3ae79a36e317", - git_commit = "54dbd592d460742c01ceeb43e6d061affbc99151", + sha256 = "eb887f70aa2199e9dfd40e89bec8258364b8b941bad03157400bda11c931a6c7", + git_commit = "4d7db90a95e9bdeb20bbe9cc39b9ab68e35afd6d", ) # Import all of TensorFlow Serving's external dependencies. From f5bc09998e0043ce72d34b14104379163048406c Mon Sep 17 00:00:00 2001 From: Li Lao Date: Wed, 28 Apr 2021 22:18:27 -0700 Subject: [PATCH 4952/8103] Replace STL algorithm call with a container method (performance-inefficient-algorithm). PiperOrigin-RevId: 371051135 --- tensorflow_serving/core/aspired_versions_manager.cc | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/tensorflow_serving/core/aspired_versions_manager.cc b/tensorflow_serving/core/aspired_versions_manager.cc index 81893ddb820..f05aee42bf1 100644 --- a/tensorflow_serving/core/aspired_versions_manager.cc +++ b/tensorflow_serving/core/aspired_versions_manager.cc @@ -275,8 +275,8 @@ void AspiredVersionsManager::ProcessAspiredVersionsRequest( } } // If this version is not part of the aspired versions. - if (std::find(next_aspired_versions.begin(), next_aspired_versions.end(), - state_snapshot.id.version) == next_aspired_versions.end()) { + if (next_aspired_versions.find(state_snapshot.id.version) == + next_aspired_versions.end()) { VLOG(1) << "Setting is_aspired=false for " << state_snapshot.id; basic_manager_->GetAdditionalServableState(state_snapshot.id) ->is_aspired = false; @@ -297,14 +297,11 @@ void AspiredVersionsManager::ProcessAspiredVersionsRequest( // need to be added and add them to the harness map. for (auto& version : versions) { bool should_add = false; - if (std::find(additions.begin(), additions.end(), version.id().version) != - additions.end()) { + if (additions.find(version.id().version) != additions.end()) { should_add = true; } if (enable_reload_servables_with_error_ && - std::find(current_aspired_versions_with_error.begin(), - current_aspired_versions_with_error.end(), - version.id().version) != + current_aspired_versions_with_error.find(version.id().version) != current_aspired_versions_with_error.end()) { ServableId id; id.name = std::string(servable_name); From bb3094914f6a3af7593d586282d922922ffb6010 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 29 Apr 2021 00:01:48 -0700 Subject: [PATCH 4953/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2d02de8a-5397-4796-94e1-04d754f3581b PiperOrigin-RevId: 371060671 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1f0f01b38a8..809888f1da9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eb887f70aa2199e9dfd40e89bec8258364b8b941bad03157400bda11c931a6c7", - git_commit = "4d7db90a95e9bdeb20bbe9cc39b9ab68e35afd6d", + sha256 = "04827218454378f5ef6e31d0f652f47a3efa66719a38b83c78d7bd4feaf54a98", + git_commit = "22773f5bb2a238267d5d49aadad530585f130769", ) # Import all of TensorFlow Serving's external dependencies. From a7f85ef8fa2afd85023d76fc34d14996eab29188 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 29 Apr 2021 06:01:28 -0700 Subject: [PATCH 4954/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fc7aeddd-e35a-4f6b-807d-2b60e6535006 PiperOrigin-RevId: 371103879 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 809888f1da9..055627aebb6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "04827218454378f5ef6e31d0f652f47a3efa66719a38b83c78d7bd4feaf54a98", - git_commit = "22773f5bb2a238267d5d49aadad530585f130769", + sha256 = "3e0cabb07d7e2c150a1622433f6140fb6418e66dba7a67963644750d92b69e92", + git_commit = "e6986d372fab4eaf6c68e86f568d0830de41c2f2", ) # Import all of TensorFlow Serving's external dependencies. From 61ca084e5823977973bf31e72841fc423a8f8027 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Thu, 29 Apr 2021 06:03:15 -0700 Subject: [PATCH 4955/8103] Internal change. PiperOrigin-RevId: 371104163 --- tensorflow_serving/apis/session_service.proto | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/tensorflow_serving/apis/session_service.proto b/tensorflow_serving/apis/session_service.proto index cda4bad868c..cf53c548b88 100644 --- a/tensorflow_serving/apis/session_service.proto +++ b/tensorflow_serving/apis/session_service.proto @@ -1,12 +1,12 @@ syntax = "proto3"; -option cc_enable_arenas = true; +package tensorflow.serving; -import "tensorflow_serving/apis/model.proto"; import "tensorflow/core/protobuf/config.proto"; import "tensorflow/core/protobuf/named_tensor.proto"; +import "tensorflow_serving/apis/model.proto"; -package tensorflow.serving; +option cc_enable_arenas = true; message SessionRunRequest { // Model Specification. If version is not specified, will use the latest @@ -25,6 +25,11 @@ message SessionRunRequest { // to but their outputs will not be fetched. repeated string target = 4; + // If true, treat names in feed/fetch/target as alias names than actual tensor + // names (that appear in the TF graph). Alias names are resolved to actual + // names using `SignatureDef` in SavedModel associated with the model. + bool tensor_name_is_alias = 6; + // Options for the run call. **Currently ignored.** RunOptions options = 5; } From c80db5ab64f378420c00b52b773cfcea712b8f8d Mon Sep 17 00:00:00 2001 From: Li Lao Date: Thu, 29 Apr 2021 09:11:40 -0700 Subject: [PATCH 4956/8103] Remove unused lambda capture. PiperOrigin-RevId: 371132724 --- tensorflow_serving/core/basic_manager_test.cc | 2 +- tensorflow_serving/model_servers/server_core_test.cc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tensorflow_serving/core/basic_manager_test.cc b/tensorflow_serving/core/basic_manager_test.cc index ed368c63be6..150378d5920 100644 --- a/tensorflow_serving/core/basic_manager_test.cc +++ b/tensorflow_serving/core/basic_manager_test.cc @@ -780,7 +780,7 @@ TEST_P(BasicManagerTest, LoadsThenUnloads) { for (int i = 0; i < 20; ++i) { const ServableId id = {kServableName3, i}; servables.insert(id); - load_executor.Schedule([this, id, &servables]() { + load_executor.Schedule([this, id]() { TF_ASSERT_OK(basic_manager_->ManageServable(CreateServable(id))); basic_manager_->LoadServable( id, [](const Status& status) { TF_ASSERT_OK(status); }); diff --git a/tensorflow_serving/model_servers/server_core_test.cc b/tensorflow_serving/model_servers/server_core_test.cc index 7b1df94105e..b3070f35898 100644 --- a/tensorflow_serving/model_servers/server_core_test.cc +++ b/tensorflow_serving/model_servers/server_core_test.cc @@ -509,8 +509,8 @@ TEST_P(ServerCoreTest, MultiplePlatformsWithConfigChange) { EXPECT_EQ(ServableDataForPlatform(root_path, platform, 0 /* version */), *servable_handle); }; - auto verify_model_not_loaded = [&root_path](ServerCore* server_core, - const string& platform) { + auto verify_model_not_loaded = [](ServerCore* server_core, + const string& platform) { ServableHandle servable_handle; EXPECT_FALSE(server_core ->GetServableHandle(ModelSpecForPlatform(platform), From 9b3d4d7c8ab650925e081d295b51bf96c1c89d9d Mon Sep 17 00:00:00 2001 From: Li Lao Date: Thu, 29 Apr 2021 10:56:57 -0700 Subject: [PATCH 4957/8103] Use absl::StrContains instead of find() != npos. PiperOrigin-RevId: 371157003 --- tensorflow_serving/util/json_tensor.cc | 4 ++-- .../util/net_http/server/internal/evhttp_request.cc | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/tensorflow_serving/util/json_tensor.cc b/tensorflow_serving/util/json_tensor.cc index d9594605a29..c12f7cb97ea 100644 --- a/tensorflow_serving/util/json_tensor.cc +++ b/tensorflow_serving/util/json_tensor.cc @@ -149,8 +149,8 @@ bool WriteDecimal(RapidJsonWriter* writer, dtype val) { // numbers -- making it difficult for consumers to pick the correct type to // store these numbers (note, JSON does not have metadata to describe types. // These are inferred from the tokens). - if (decimal_str.find('.') == string::npos && - decimal_str.find('e') == string::npos) { + if (!absl::StrContains(decimal_str, '.') && + !absl::StrContains(decimal_str, 'e')) { absl::StrAppend(&decimal_str, ".0"); } } else if (std::isnan(val)) { diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_request.cc b/tensorflow_serving/util/net_http/server/internal/evhttp_request.cc index 7f52b00f16a..d05db9479dd 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_request.cc +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_request.cc @@ -26,6 +26,7 @@ limitations under the License. #include #include +#include "absl/strings/match.h" #include "absl/strings/string_view.h" #include "absl/types/span.h" #include "libevent/include/event2/buffer.h" @@ -258,7 +259,7 @@ bool EvHTTPRequest::NeedUncompressGzipContent() { if (handler_options_ != nullptr && handler_options_->auto_uncompress_input()) { auto content_encoding = GetRequestHeader(HTTPHeaders::CONTENT_ENCODING); - return content_encoding.find("gzip") != absl::string_view::npos; + return absl::StrContains(content_encoding, "gzip"); } return false; From c74fb75f2730184b5ae73cca88b1a1889c46d550 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 29 Apr 2021 12:01:30 -0700 Subject: [PATCH 4958/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/90b90255-7fe5-40be-af1c-78a75a25e231 PiperOrigin-RevId: 371171980 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 055627aebb6..1c3b44f7aaa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3e0cabb07d7e2c150a1622433f6140fb6418e66dba7a67963644750d92b69e92", - git_commit = "e6986d372fab4eaf6c68e86f568d0830de41c2f2", + sha256 = "49c5fc668b70f449428ad7961aa03c3662f8e68a5c5e77d0e5f8c0f0580bedd6", + git_commit = "9eac822bb2b3416f25398e44282125d0405d69ba", ) # Import all of TensorFlow Serving's external dependencies. From ffcc4a16c76c4fa1189edd9682fc486442a33e52 Mon Sep 17 00:00:00 2001 From: Li Lao Date: Thu, 29 Apr 2021 14:08:16 -0700 Subject: [PATCH 4959/8103] Remove unused "using" decl. PiperOrigin-RevId: 371200471 --- tensorflow_serving/core/loader_harness_test.cc | 2 -- tensorflow_serving/core/server_request_logger_test.cc | 1 - 2 files changed, 3 deletions(-) diff --git a/tensorflow_serving/core/loader_harness_test.cc b/tensorflow_serving/core/loader_harness_test.cc index b2ad23c2f6b..38d1b3adb17 100644 --- a/tensorflow_serving/core/loader_harness_test.cc +++ b/tensorflow_serving/core/loader_harness_test.cc @@ -32,10 +32,8 @@ namespace tensorflow { namespace serving { namespace { -using ::testing::_; using ::testing::HasSubstr; using ::testing::InvokeWithoutArgs; -using ::testing::InSequence; using ::testing::NiceMock; using ::testing::Return; using ::testing::StrictMock; diff --git a/tensorflow_serving/core/server_request_logger_test.cc b/tensorflow_serving/core/server_request_logger_test.cc index ad2bca95e4e..f3912da5a65 100644 --- a/tensorflow_serving/core/server_request_logger_test.cc +++ b/tensorflow_serving/core/server_request_logger_test.cc @@ -44,7 +44,6 @@ namespace serving { namespace { using ::testing::_; -using ::testing::HasSubstr; using ::testing::Invoke; using ::testing::NiceMock; From 05809633f4a26df4c0c2c0d6f20b4b26d375c56b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 29 Apr 2021 18:02:22 -0700 Subject: [PATCH 4960/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/22cb8a7d-04ff-4fb6-a929-4fff91ecaeb4 PiperOrigin-RevId: 371243353 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1c3b44f7aaa..04262e1cdee 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "49c5fc668b70f449428ad7961aa03c3662f8e68a5c5e77d0e5f8c0f0580bedd6", - git_commit = "9eac822bb2b3416f25398e44282125d0405d69ba", + sha256 = "1f151bb4633d4da693b19d1d36ffdf6e45709bbfaf042baf63b209557c220081", + git_commit = "8dd6803e2b438b829f864180021ffb3b92c52d06", ) # Import all of TensorFlow Serving's external dependencies. From 56175f0fe554befabf28035f9eb9b3db4f1f41ac Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 30 Apr 2021 00:01:45 -0700 Subject: [PATCH 4961/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/cf46c104-0a83-48a3-9da1-5a57079731bf PiperOrigin-RevId: 371278740 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 04262e1cdee..17645069bf5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1f151bb4633d4da693b19d1d36ffdf6e45709bbfaf042baf63b209557c220081", - git_commit = "8dd6803e2b438b829f864180021ffb3b92c52d06", + sha256 = "2bb47e54c3012472c6287ac26f2bd66ecf646ca6ac16f3794411c055d6c54a6a", + git_commit = "14ff6d859e3b8b925817906b83b3efa183569928", ) # Import all of TensorFlow Serving's external dependencies. From 51dd92c078078e1fa1503ecd98b03d9ba6d7d5b4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 30 Apr 2021 06:01:36 -0700 Subject: [PATCH 4962/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f1b15be4-6a6e-4948-b5b8-5fc5d2ffbd61 PiperOrigin-RevId: 371318325 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 17645069bf5..1d1294c4c74 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2bb47e54c3012472c6287ac26f2bd66ecf646ca6ac16f3794411c055d6c54a6a", - git_commit = "14ff6d859e3b8b925817906b83b3efa183569928", + sha256 = "fcb5456df4c583d672f3f32d21c591793959756b206e9d7834f04ea62bc1012d", + git_commit = "d735183a884ad1662750658d7292729efed15885", ) # Import all of TensorFlow Serving's external dependencies. From e48e8126287548f6fed8354b875677fd95f35f2c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 30 Apr 2021 12:01:27 -0700 Subject: [PATCH 4963/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c1ea0d2b-93d4-4ed1-9491-bd0bd67d5abb PiperOrigin-RevId: 371377070 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1d1294c4c74..5bb2a4bce89 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fcb5456df4c583d672f3f32d21c591793959756b206e9d7834f04ea62bc1012d", - git_commit = "d735183a884ad1662750658d7292729efed15885", + sha256 = "96299cb5dd718ce2f67dc81ef5e81f11b9cd7013cb18f17f1d0389ae0a0010c6", + git_commit = "8a0c6910bc583888486afdeff6112773885835f3", ) # Import all of TensorFlow Serving's external dependencies. From 55593aeb8e522bf57c96b31024b7df440c5e1539 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 30 Apr 2021 18:01:29 -0700 Subject: [PATCH 4964/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/69eefaed-6aaf-4b62-9fff-2db2c58c9d8c PiperOrigin-RevId: 371436551 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5bb2a4bce89..5596b552301 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "96299cb5dd718ce2f67dc81ef5e81f11b9cd7013cb18f17f1d0389ae0a0010c6", - git_commit = "8a0c6910bc583888486afdeff6112773885835f3", + sha256 = "ee016af07c12dc8d0f5b1e739079264d593cdc92e23a3da519bbbc54bab2ce06", + git_commit = "d1c470183d262d9f6a63a2f44141d5c04fcbfd02", ) # Import all of TensorFlow Serving's external dependencies. From f51900e7f768f11a6052850ad559987591726c45 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 1 May 2021 00:01:26 -0700 Subject: [PATCH 4965/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5dfcdd03-ec62-4b92-813a-92ff1952a2cf PiperOrigin-RevId: 371462071 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5596b552301..dc52ea17dcf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ee016af07c12dc8d0f5b1e739079264d593cdc92e23a3da519bbbc54bab2ce06", - git_commit = "d1c470183d262d9f6a63a2f44141d5c04fcbfd02", + sha256 = "401d2bb20b1fa196749e621fccea162415415cff19939bd0b3a602dfabb353d7", + git_commit = "8a9f8e2fa7460a2063ef068110858c3d84cf1a99", ) # Import all of TensorFlow Serving's external dependencies. From 32c9fbcee9800f24202418b198d0db319ffa1b5f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 1 May 2021 06:01:21 -0700 Subject: [PATCH 4966/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ae823961-1623-4d1c-adf0-427e09e3a572 PiperOrigin-RevId: 371486606 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dc52ea17dcf..5e8d221bd7b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "401d2bb20b1fa196749e621fccea162415415cff19939bd0b3a602dfabb353d7", - git_commit = "8a9f8e2fa7460a2063ef068110858c3d84cf1a99", + sha256 = "238a78e0ecc53548b45f2361ef5de2007eaca0b3940b37889e127f20faf6911a", + git_commit = "67261b0bc24a7164a8f25bf6f5b0bf1f2d6b8d09", ) # Import all of TensorFlow Serving's external dependencies. From ca0ee736cf231ce245e35b6d8d72ca0ee91b1562 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 1 May 2021 12:01:22 -0700 Subject: [PATCH 4967/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7c9b8392-9c46-4c75-8e80-e2dfd0480a19 PiperOrigin-RevId: 371507204 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5e8d221bd7b..e8e594ff44a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "238a78e0ecc53548b45f2361ef5de2007eaca0b3940b37889e127f20faf6911a", - git_commit = "67261b0bc24a7164a8f25bf6f5b0bf1f2d6b8d09", + sha256 = "75bd18aab395f79627c36d80f181bd508a8e8b8a947d716953338f8b93c03ce8", + git_commit = "cd11ef4bfb8c0769f7ec7c2900e05837bac84bbb", ) # Import all of TensorFlow Serving's external dependencies. From 68f94dc682a5a8648aa42697f4d0536fbbcec1d7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 1 May 2021 18:01:23 -0700 Subject: [PATCH 4968/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/478bc759-8606-4542-b1b3-a4b369ad66b4 PiperOrigin-RevId: 371527801 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e8e594ff44a..eb362f8a57b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "75bd18aab395f79627c36d80f181bd508a8e8b8a947d716953338f8b93c03ce8", - git_commit = "cd11ef4bfb8c0769f7ec7c2900e05837bac84bbb", + sha256 = "52ec748f3155aa7a19b9b3ed367971ba3db25bd155831abe90113b30987aec26", + git_commit = "d913cf12d0cca9823cf740a3ccfd2decb963f086", ) # Import all of TensorFlow Serving's external dependencies. From edbe5802d33a12d5a0704bcecd5286e825ad2c42 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 2 May 2021 00:01:49 -0700 Subject: [PATCH 4969/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4e968de2-9ed1-4866-a7ad-46f2722369b1 PiperOrigin-RevId: 371548359 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index eb362f8a57b..a0c81dbe0a1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "52ec748f3155aa7a19b9b3ed367971ba3db25bd155831abe90113b30987aec26", - git_commit = "d913cf12d0cca9823cf740a3ccfd2decb963f086", + sha256 = "8f1d1bbefc406cf6c3cadbe407227714e0215e5ea5f18cb6c19e15818bece37b", + git_commit = "93706b000f712cb69ffbaf2ae27e49db5d1512b4", ) # Import all of TensorFlow Serving's external dependencies. From a706709288f8bd1883940c19102f10c8cecfa5a6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 2 May 2021 06:01:40 -0700 Subject: [PATCH 4970/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/16158b66-fa92-4cf7-b855-bd92e57baf66 PiperOrigin-RevId: 371571015 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a0c81dbe0a1..232a6f39ffa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8f1d1bbefc406cf6c3cadbe407227714e0215e5ea5f18cb6c19e15818bece37b", - git_commit = "93706b000f712cb69ffbaf2ae27e49db5d1512b4", + sha256 = "98a85ae35eac564f472036476edbb8ea05f5eece97d8d6e86b84d8b26b147eaf", + git_commit = "92a470b45a19cfcf6955687912e6e5b7255256b2", ) # Import all of TensorFlow Serving's external dependencies. From 02ac1b2ebfb187c8542cda79bd6b9bcf2488fcc3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 2 May 2021 18:04:01 -0700 Subject: [PATCH 4971/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ce7063f9-ee4a-478d-818a-f6c976c48424 PiperOrigin-RevId: 371614978 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 232a6f39ffa..641be90e10c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "98a85ae35eac564f472036476edbb8ea05f5eece97d8d6e86b84d8b26b147eaf", - git_commit = "92a470b45a19cfcf6955687912e6e5b7255256b2", + sha256 = "2881563e330ff4d50b19429a1e9f9b856943d22dcb338ce91eb77da29365ff11", + git_commit = "72d2c31b674a0817e1a755fb3adf7367a2e96644", ) # Import all of TensorFlow Serving's external dependencies. From e5f556bdead52a39a174877f13a35919c6dc3c90 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 3 May 2021 00:01:18 -0700 Subject: [PATCH 4972/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/493a33a7-1bfe-4e11-8876-b6281c7adabf PiperOrigin-RevId: 371641899 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 641be90e10c..66341fffcfa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2881563e330ff4d50b19429a1e9f9b856943d22dcb338ce91eb77da29365ff11", - git_commit = "72d2c31b674a0817e1a755fb3adf7367a2e96644", + sha256 = "34fb6bdfb9b55d28e835066c05470511dd72157fcbce37b2fa8a752222ebd193", + git_commit = "73fb3af47ead97562cd1a60df53981a801d6133b", ) # Import all of TensorFlow Serving's external dependencies. From 8293f44bd5c5ecc68636cd0d036234f891d29366 Mon Sep 17 00:00:00 2001 From: David Rim Date: Mon, 3 May 2021 02:01:17 -0700 Subject: [PATCH 4973/8103] Resize tensors if the dimensions of the tflite and tensorflow inputs mismatch, even if the number of elements are the same PiperOrigin-RevId: 371655644 --- .../servables/tensorflow/tflite_session.cc | 12 +++-- .../tensorflow/tflite_session_test.cc | 50 +++++++++++++++++++ 2 files changed, 58 insertions(+), 4 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/tflite_session.cc b/tensorflow_serving/servables/tensorflow/tflite_session.cc index 89eaff25c26..1495c3cc1bb 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session.cc @@ -199,9 +199,14 @@ Status SetInputAndInvokeMiniBatch( "Batch parallelism should not be enabled for non-string inputs"); } auto tensor_bytes = tf_input_tensor->tensor_data(); - if (tensor_bytes.size() != tflite_input_tensor->bytes) { - if (interpreter->ResizeInputTensor( - tflite_input_idx, TensorDims(tf_input_tensor)) != kTfLiteOk) { + std::vector tf_dims = TensorDims(tf_input_tensor); + std::vector tflite_dims( + tflite_input_tensor->dims->data, + tflite_input_tensor->dims->data + tflite_input_tensor->dims->size); + if (tensor_bytes.size() != tflite_input_tensor->bytes || + tf_dims != tflite_dims) { + if (interpreter->ResizeInputTensor(tflite_input_idx, tf_dims) != + kTfLiteOk) { return errors::Internal( "Failed to resize input tensor: ", tflite_input_tensor->name, " from ", tflite_input_tensor->bytes, " to ", tensor_bytes.size(), @@ -354,7 +359,6 @@ Status RunBatchParallel( TF_RETURN_IF_ERROR(CreateOutputTensors( interpreter_pool, output_tensor_names, output_tensor_to_index, tflite_idx_to_output_tensor, outputs, true, actual_batch_size)); - // Set the contents of the return tensors. for (size_t i = 0; i < num_minibatches; ++i) { TF_RETURN_IF_ERROR(SetMiniBatchOutput( diff --git a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc index a31bd33d90c..d22f447f59f 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc @@ -132,6 +132,56 @@ TEST(TfLiteSession, BasicTest) { } } +TEST(TfLiteSession, ResizeWithSameNumElementsTest) { + string model_bytes; + TF_ASSERT_OK(ReadFileToString(tensorflow::Env::Default(), + test_util::TestSrcDirPath(kTestModel), + &model_bytes)); + + ::google::protobuf::Map signatures; + std::unique_ptr session; + tensorflow::SessionOptions options; + TF_ASSERT_OK(TfLiteSession::Create( + std::move(model_bytes), options, absl::GetFlag(FLAGS_num_pools), + absl::GetFlag(FLAGS_num_tflite_interpreters), &session, &signatures)); + EXPECT_EQ(signatures.size(), 1); + EXPECT_EQ(signatures.begin()->first, "serving_default"); + EXPECT_THAT(signatures.begin()->second, test_util::EqualsProto(R"pb( + inputs { + key: "x" + value { + name: "x" + dtype: DT_FLOAT + tensor_shape { + dim { size: 1 } + dim { size: 1 } + } + } + } + outputs { + key: "y" + value { + name: "y" + dtype: DT_FLOAT + tensor_shape { + dim { size: 1 } + dim { size: 1 } + } + } + } + method_name: "tensorflow/serving/predict" + )pb")); + Tensor input = test::AsTensor({2.0}, TensorShape({1})); + { + // Use TF Lite tensor names. + std::vector outputs; + TF_EXPECT_OK(session->Run({{"x", input}}, {"y"}, {}, &outputs)); + ASSERT_EQ(outputs.size(), 1); + test::ExpectTensorEqual( + outputs[0], test::AsTensor({3.0}, TensorShape({1}))); + } +} + TEST(TfLiteSession, ModelFromLegacyConverterWithSigdef) { // A model converted with TF v1 converter, having a signature def. // The signature def references an input tensor named "tflite_input:0", but From c475bd63a0b0fbd40bb840efcd93d348974418fb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 3 May 2021 06:04:07 -0700 Subject: [PATCH 4974/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/716aacb8-84bb-472c-8af0-318d0d6a503f PiperOrigin-RevId: 371681619 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 66341fffcfa..7cfec4bff20 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "34fb6bdfb9b55d28e835066c05470511dd72157fcbce37b2fa8a752222ebd193", - git_commit = "73fb3af47ead97562cd1a60df53981a801d6133b", + sha256 = "3662d2d9d59e02c994663ff9eccbf261f07436ceb8e39e689c7c77f62a6e5710", + git_commit = "7f6b36d5a511fd3fb5421551eb4e5a9eff5c61fc", ) # Import all of TensorFlow Serving's external dependencies. From 480b668fbca08b2279448a17af9f92a5bf2544dc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 3 May 2021 12:01:22 -0700 Subject: [PATCH 4975/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8a422ff7-0b9e-4470-840c-9cee96477b06 PiperOrigin-RevId: 371747522 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7cfec4bff20..43f1bebe93b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3662d2d9d59e02c994663ff9eccbf261f07436ceb8e39e689c7c77f62a6e5710", - git_commit = "7f6b36d5a511fd3fb5421551eb4e5a9eff5c61fc", + sha256 = "673cf6ec209bbdfd7aef466011ee17128aad5dcf4736c80149c7c83eb53e10d9", + git_commit = "90ed61e99f5768854f252bfc669d4160e38b84b8", ) # Import all of TensorFlow Serving's external dependencies. From e03506a28ed48bdd82af5d6e75054d675ece944a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 3 May 2021 18:01:20 -0700 Subject: [PATCH 4976/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/45efe685-0d78-40c9-b723-365b7c98f596 PiperOrigin-RevId: 371817373 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 43f1bebe93b..3bbee376130 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "673cf6ec209bbdfd7aef466011ee17128aad5dcf4736c80149c7c83eb53e10d9", - git_commit = "90ed61e99f5768854f252bfc669d4160e38b84b8", + sha256 = "e5ac78ab4ce42c4a6f1a0b2abfb3f01354bb329e86b05dc5bf0530bd7a2e54fa", + git_commit = "21e2da0326e370dca5c2727efb9f336e0009afbd", ) # Import all of TensorFlow Serving's external dependencies. From f7e771d306bb2d5baac2b980da0d4e70063311b0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 4 May 2021 00:01:28 -0700 Subject: [PATCH 4977/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f5cca007-1989-46c5-8d40-79203e461c61 PiperOrigin-RevId: 371854779 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3bbee376130..0b582075e7a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e5ac78ab4ce42c4a6f1a0b2abfb3f01354bb329e86b05dc5bf0530bd7a2e54fa", - git_commit = "21e2da0326e370dca5c2727efb9f336e0009afbd", + sha256 = "c6f7aaee9ea22e6128e3d88f60d816fdb3f141def7bc3e2ce40be4f5ede34432", + git_commit = "27bd8aaa7b58d2591fed43a6c245f3037664cfb1", ) # Import all of TensorFlow Serving's external dependencies. From 62ecf06c72744336552e9093d29e9ae1156e84db Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 4 May 2021 06:01:40 -0700 Subject: [PATCH 4978/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/634c720c-39c4-44e9-880a-fca931212fcc PiperOrigin-RevId: 371897528 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0b582075e7a..bb1b0c580c9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c6f7aaee9ea22e6128e3d88f60d816fdb3f141def7bc3e2ce40be4f5ede34432", - git_commit = "27bd8aaa7b58d2591fed43a6c245f3037664cfb1", + sha256 = "5b5e9f92856cddba09bc436d044137ba11a4f4584c57142c42195baf98907549", + git_commit = "38dc3cc0278a0e91247c872799e2c49bce831bb2", ) # Import all of TensorFlow Serving's external dependencies. From 68d6eb313aa17cd16e923f333e8ca45ca9cd1220 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 4 May 2021 12:01:21 -0700 Subject: [PATCH 4979/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/df46cdb2-3586-4a78-b2e0-23de1fd92729 PiperOrigin-RevId: 371965018 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bb1b0c580c9..36818bdc905 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5b5e9f92856cddba09bc436d044137ba11a4f4584c57142c42195baf98907549", - git_commit = "38dc3cc0278a0e91247c872799e2c49bce831bb2", + sha256 = "0b68d164f8e2e3dfc9e86acaa3e8179a5ef63efb73b6295d69fd7bc23ef12c48", + git_commit = "0f2fdd0f8bc15eab355252377f864592dd5f7026", ) # Import all of TensorFlow Serving's external dependencies. From d763e0066d9ee0cd1dce8155e3c740a7f6e8b8a5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 4 May 2021 18:01:48 -0700 Subject: [PATCH 4980/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/17faaf42-37cb-49e8-92b6-78d312ad7e56 PiperOrigin-RevId: 372033293 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 36818bdc905..d7fe11e71e9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0b68d164f8e2e3dfc9e86acaa3e8179a5ef63efb73b6295d69fd7bc23ef12c48", - git_commit = "0f2fdd0f8bc15eab355252377f864592dd5f7026", + sha256 = "6e9f36f1fa6a65f6b482f8a8fd40c132d448ff8775b076dc1716651dfa31760c", + git_commit = "6b746d6631b9dce36303ecac26b70fef9a9d8cea", ) # Import all of TensorFlow Serving's external dependencies. From 25661e8617b1349f85486511922fc381546f6dca Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 May 2021 00:01:50 -0700 Subject: [PATCH 4981/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f1588176-c03a-44fc-9778-76235ca6a243 PiperOrigin-RevId: 372068081 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d7fe11e71e9..126bca588f1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6e9f36f1fa6a65f6b482f8a8fd40c132d448ff8775b076dc1716651dfa31760c", - git_commit = "6b746d6631b9dce36303ecac26b70fef9a9d8cea", + sha256 = "69427fcccdae8d60976325e492a871aade41061c9e24ee771a953e180bf3373b", + git_commit = "e7a0ac6d1ce98177caadcd60e7e8f1ff5245c7ef", ) # Import all of TensorFlow Serving's external dependencies. From 2476f9c11d625e0bae8b1af8ccb5264ddb59349c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 May 2021 06:01:25 -0700 Subject: [PATCH 4982/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0ce9d4da-1dc2-4666-b4eb-e583153198d2 PiperOrigin-RevId: 372109909 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 126bca588f1..89e858f06ea 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "69427fcccdae8d60976325e492a871aade41061c9e24ee771a953e180bf3373b", - git_commit = "e7a0ac6d1ce98177caadcd60e7e8f1ff5245c7ef", + sha256 = "0894533ce129202759e59d201ce4c8e690b3e2f62dc56d4325f8f15f61c4e63f", + git_commit = "7cfcace858cb3ea1b0b21a18ccb2121ef2e8a7f1", ) # Import all of TensorFlow Serving's external dependencies. From 491d6a7745ed1ad470320642a4223e899717e11b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 May 2021 12:01:30 -0700 Subject: [PATCH 4983/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/dda520ff-8144-477e-9d57-d2fb8213a2b5 PiperOrigin-RevId: 372177316 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 89e858f06ea..9da6719ba5b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0894533ce129202759e59d201ce4c8e690b3e2f62dc56d4325f8f15f61c4e63f", - git_commit = "7cfcace858cb3ea1b0b21a18ccb2121ef2e8a7f1", + sha256 = "56b05652df395523d3dcf640616d6aab473f49a391cc5be5699467ac5e872cf3", + git_commit = "bc624ed5793b29cab93d29376d7c7b91c7c6b53c", ) # Import all of TensorFlow Serving's external dependencies. From 9aff31bfcb52e3baec1e6924d2224eabf458b36e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 5 May 2021 18:02:55 -0700 Subject: [PATCH 4984/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/24d921a4-cbdb-4f06-a26f-6223d0259a86 PiperOrigin-RevId: 372246101 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9da6719ba5b..2c7d35cc006 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "56b05652df395523d3dcf640616d6aab473f49a391cc5be5699467ac5e872cf3", - git_commit = "bc624ed5793b29cab93d29376d7c7b91c7c6b53c", + sha256 = "43ac50597ea9564f62f455f9992ecfed77d07ebaaaa17156651f42a597dbd6b6", + git_commit = "f15fbec84874d41592dd8622e784e455f5b580f4", ) # Import all of TensorFlow Serving's external dependencies. From 0e52d2e47011af8d16dc2063c9b7f5e3bc7ad58d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 May 2021 00:01:44 -0700 Subject: [PATCH 4985/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2875fe28-a134-4edc-a95e-2a9cf802c2db PiperOrigin-RevId: 372284519 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2c7d35cc006..482cf5bbd07 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "43ac50597ea9564f62f455f9992ecfed77d07ebaaaa17156651f42a597dbd6b6", - git_commit = "f15fbec84874d41592dd8622e784e455f5b580f4", + sha256 = "946aefe2b63b1d193712cd2b1e9c36044ecc545848f88d703ca7d8ecc9206d81", + git_commit = "fdbe5918f83cf97fac8fcee7a0c53a2315c67ef0", ) # Import all of TensorFlow Serving's external dependencies. From fca6b49aa0dcb3455468e0b09d457ca8855716fc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 May 2021 06:01:29 -0700 Subject: [PATCH 4986/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d7862d3b-3fd7-4424-8f7a-cc20627733ba PiperOrigin-RevId: 372326012 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 482cf5bbd07..69007566959 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "946aefe2b63b1d193712cd2b1e9c36044ecc545848f88d703ca7d8ecc9206d81", - git_commit = "fdbe5918f83cf97fac8fcee7a0c53a2315c67ef0", + sha256 = "dab77b04ae855f87c4551b5c9fc015b7f52888bc174bd8c218a8291cde9a3a74", + git_commit = "d0a907461fa860e03d2eabfc257fb177e9741520", ) # Import all of TensorFlow Serving's external dependencies. From bd24e5119fba8261ab7c6fcda449a6c631461e0c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 May 2021 12:01:27 -0700 Subject: [PATCH 4987/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5e64f81b-a185-42f8-abb6-2b2fa8411d7c PiperOrigin-RevId: 372393706 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 69007566959..a2e5748e1a0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dab77b04ae855f87c4551b5c9fc015b7f52888bc174bd8c218a8291cde9a3a74", - git_commit = "d0a907461fa860e03d2eabfc257fb177e9741520", + sha256 = "002d5b8886e743b950f5830f394ccf43c63f637be5ad2f656b146af78f3baba8", + git_commit = "05963dfc0aea5f8b26f0f85a84787b3f4f771db0", ) # Import all of TensorFlow Serving's external dependencies. From b73e762455974eae22566eea376c515f27f920d6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 May 2021 18:01:36 -0700 Subject: [PATCH 4988/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bd2972c2-cf9e-4b01-b5d9-edee2fb9a7f0 PiperOrigin-RevId: 372462162 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a2e5748e1a0..5d8c9ccf11d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "002d5b8886e743b950f5830f394ccf43c63f637be5ad2f656b146af78f3baba8", - git_commit = "05963dfc0aea5f8b26f0f85a84787b3f4f771db0", + sha256 = "de80eaac4d19804745563833fdb52f62bf0aeacdfa607e430ba69f613cb0d8b5", + git_commit = "bfd15af8cb02a7d1351dc981ab94a461fdbb96ec", ) # Import all of TensorFlow Serving's external dependencies. From 451c083e21299b935b3743bd7cd0ca39a214a9a0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 May 2021 00:01:52 -0700 Subject: [PATCH 4989/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d3072a4b-e4aa-492c-821e-455e5f403c8c PiperOrigin-RevId: 372499585 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5d8c9ccf11d..68da5058ef3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "de80eaac4d19804745563833fdb52f62bf0aeacdfa607e430ba69f613cb0d8b5", - git_commit = "bfd15af8cb02a7d1351dc981ab94a461fdbb96ec", + sha256 = "24f22193ae4bbd0b16d5ac86b1224bb49871d2a40800946c6fa506b16c51862a", + git_commit = "a5b6dcb32636042e99255473159e21ca34fbd15f", ) # Import all of TensorFlow Serving's external dependencies. From 39dd8b0cd19ec53caa1fba1f30cf0e84253249f2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 May 2021 06:01:46 -0700 Subject: [PATCH 4990/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/46963d18-7a57-437c-9f64-a862f06f9697 PiperOrigin-RevId: 372540390 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 68da5058ef3..e5e634a8e0e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "24f22193ae4bbd0b16d5ac86b1224bb49871d2a40800946c6fa506b16c51862a", - git_commit = "a5b6dcb32636042e99255473159e21ca34fbd15f", + sha256 = "c615b0a1d01e4d1a1d481af4488bb1b0e6c09ed4b1289d932d7741e2e84b81d7", + git_commit = "baecdb1260d1efad4ef29dcfee0082ca8c86e37e", ) # Import all of TensorFlow Serving's external dependencies. From 93579639efb1e69288b137b10d72dda176245a51 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 May 2021 12:01:33 -0700 Subject: [PATCH 4991/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7a1da71a-7b79-43d2-b8d0-be327be28dd0 PiperOrigin-RevId: 372601049 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e5e634a8e0e..fa57d210208 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c615b0a1d01e4d1a1d481af4488bb1b0e6c09ed4b1289d932d7741e2e84b81d7", - git_commit = "baecdb1260d1efad4ef29dcfee0082ca8c86e37e", + sha256 = "2419c05fd86bfd18334715456e58ff32f9ea264cf3667ea1fd517aeb85c7a128", + git_commit = "7ca63bf00a81f20f73d629d86e94eb4a132eb5f2", ) # Import all of TensorFlow Serving's external dependencies. From 12bbcedb6a30f66c4bf05816aabdac977e0871b4 Mon Sep 17 00:00:00 2001 From: Chao Xie Date: Fri, 7 May 2021 17:23:27 -0700 Subject: [PATCH 4992/8103] Make Internal Change. PiperOrigin-RevId: 372657493 --- .../servables/tensorflow/saved_model_warmup_test_util.cc | 9 +++++---- .../servables/tensorflow/saved_model_warmup_test_util.h | 6 +++++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/saved_model_warmup_test_util.cc b/tensorflow_serving/servables/tensorflow/saved_model_warmup_test_util.cc index 63cbee86bae..5481a8c5eb6 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_warmup_test_util.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_warmup_test_util.cc @@ -21,6 +21,7 @@ limitations under the License. #include "tensorflow/core/framework/tensor_shape.pb.h" #include "tensorflow/core/framework/types.pb.h" #include "tensorflow/core/platform/env.h" +#include "tensorflow_serving/apis/prediction_log.pb.h" namespace tensorflow { namespace serving { @@ -122,10 +123,10 @@ Status WriteWarmupDataAsSerializedProtos( return Status::OK(); } -void AddMixedWarmupData(std::vector* warmup_records) { - for (auto& log_type : - {PredictionLog::kRegressLog, PredictionLog::kClassifyLog, - PredictionLog::kPredictLog, PredictionLog::kMultiInferenceLog}) { +void AddMixedWarmupData( + std::vector* warmup_records, + const std::vector& log_types) { + for (auto& log_type : log_types) { PredictionLog prediction_log; PopulatePredictionLog(&prediction_log, log_type); warmup_records->push_back(prediction_log.SerializeAsString()); diff --git a/tensorflow_serving/servables/tensorflow/saved_model_warmup_test_util.h b/tensorflow_serving/servables/tensorflow/saved_model_warmup_test_util.h index 69dd5ecb8aa..a542d46ca7f 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_warmup_test_util.h +++ b/tensorflow_serving/servables/tensorflow/saved_model_warmup_test_util.h @@ -57,7 +57,11 @@ Status WriteWarmupDataAsSerializedProtos( const string& fname, const std::vector& warmup_records, int num_warmup_records); -void AddMixedWarmupData(std::vector* warmup_records); +void AddMixedWarmupData( + std::vector* warmup_records, + const std::vector& log_types = { + PredictionLog::kRegressLog, PredictionLog::kClassifyLog, + PredictionLog::kPredictLog, PredictionLog::kMultiInferenceLog}); // Creates a test SignatureDef with the given parameters SignatureDef CreateSignatureDef(const string& method_name, From ac97b7da94ec4c35761ae51044a2eed2b41d65c7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 May 2021 18:01:47 -0700 Subject: [PATCH 4993/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3b95d588-896b-4b1e-b4ea-f818213018e0 PiperOrigin-RevId: 372661167 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fa57d210208..40879526c23 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2419c05fd86bfd18334715456e58ff32f9ea264cf3667ea1fd517aeb85c7a128", - git_commit = "7ca63bf00a81f20f73d629d86e94eb4a132eb5f2", + sha256 = "84ac0285381630f810fbf02bbe7efb9c1d1409e34b922384670deb9c9044c3c4", + git_commit = "8ee2a69441c5f23b875fde54f729fa8952ef6391", ) # Import all of TensorFlow Serving's external dependencies. From 69a39fddcb67b92271be3873b66f62a4f877937a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 8 May 2021 00:03:50 -0700 Subject: [PATCH 4994/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/51488793-8fb1-472e-82c3-7c564355fd56 PiperOrigin-RevId: 372688115 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 40879526c23..f6fede63fda 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "84ac0285381630f810fbf02bbe7efb9c1d1409e34b922384670deb9c9044c3c4", - git_commit = "8ee2a69441c5f23b875fde54f729fa8952ef6391", + sha256 = "34a105f4345e8190bfce01099612b4a412d7d80ff265a8468b8e17ead247f715", + git_commit = "04f654efc697cd08a67760d0b67990dd69336cf8", ) # Import all of TensorFlow Serving's external dependencies. From 41417c323f739ebadf13984eb0a5c1768659d40e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 8 May 2021 06:01:35 -0700 Subject: [PATCH 4995/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8dccffde-e5fc-4dd0-a753-34e0c810f031 PiperOrigin-RevId: 372712095 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f6fede63fda..deac65e7041 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "34a105f4345e8190bfce01099612b4a412d7d80ff265a8468b8e17ead247f715", - git_commit = "04f654efc697cd08a67760d0b67990dd69336cf8", + sha256 = "eba6c3c4ee52192c6e338fdc208092fe4e6e9bea51ce66bb60849820dec7da7f", + git_commit = "e16d586818d5589720b5365a9eb6c78bff3c6aa3", ) # Import all of TensorFlow Serving's external dependencies. From 2082cddd18907b174d8df7913da050571ff8ee9a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 8 May 2021 18:01:40 -0700 Subject: [PATCH 4996/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bfab9644-e121-4e31-a1df-eba4e7c51db1 PiperOrigin-RevId: 372753458 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index deac65e7041..00ed9b1be19 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eba6c3c4ee52192c6e338fdc208092fe4e6e9bea51ce66bb60849820dec7da7f", - git_commit = "e16d586818d5589720b5365a9eb6c78bff3c6aa3", + sha256 = "0a5d303af0b661369990d45980fedae66b6dd55ebb3954194c1578d5da05ee1c", + git_commit = "f8730af128700a774b86307f9e7efd7f19806446", ) # Import all of TensorFlow Serving's external dependencies. From 271bd9ccb0929809fd4e24c4d91222d50b57d63c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 9 May 2021 06:01:23 -0700 Subject: [PATCH 4997/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/356ae6c4-0eb7-44bb-a486-9f8316b1659c PiperOrigin-RevId: 372795701 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 00ed9b1be19..e7552334c91 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0a5d303af0b661369990d45980fedae66b6dd55ebb3954194c1578d5da05ee1c", - git_commit = "f8730af128700a774b86307f9e7efd7f19806446", + sha256 = "cfbc80dbffcd6ed7fd7d7b539028703c54390eaa67d89e6ca13c4be74f2f4d8b", + git_commit = "e712d5f6a558ef87b7c8e25b68f7556de7690478", ) # Import all of TensorFlow Serving's external dependencies. From f659b272c5f0674b6cdf7f2b2481f6667b7ee9dd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 9 May 2021 12:01:51 -0700 Subject: [PATCH 4998/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7c82a263-5114-45e0-bd37-f23843a8211e PiperOrigin-RevId: 372816365 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e7552334c91..db333e35f94 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cfbc80dbffcd6ed7fd7d7b539028703c54390eaa67d89e6ca13c4be74f2f4d8b", - git_commit = "e712d5f6a558ef87b7c8e25b68f7556de7690478", + sha256 = "267834595d531bc5c7e47e593112bcdf6294de917d5966124730fc6a44f03855", + git_commit = "6bba1b6e6d0a3d57258acd204987869806b3a852", ) # Import all of TensorFlow Serving's external dependencies. From 08c074cadc8c7c2bacd39fca49b6c0498855fd1b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 May 2021 00:01:46 -0700 Subject: [PATCH 4999/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/365f04c9-9292-4720-96d3-a30e8a645e26 PiperOrigin-RevId: 372867254 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index db333e35f94..7a17e1d7f74 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "267834595d531bc5c7e47e593112bcdf6294de917d5966124730fc6a44f03855", - git_commit = "6bba1b6e6d0a3d57258acd204987869806b3a852", + sha256 = "aaab8df00368562f2366f397adae44c510bf305e0094ecc2fe4756b3e3ebbac9", + git_commit = "0daf99950c1071c56fa042aed9e4acff145c6c91", ) # Import all of TensorFlow Serving's external dependencies. From 3e44d4a442b854e0d2672caa97a1273e67c86f48 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 May 2021 06:01:35 -0700 Subject: [PATCH 5000/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1c403b9e-5581-40c9-aa50-a78989e24e6a PiperOrigin-RevId: 372910962 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7a17e1d7f74..9ef44139095 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "aaab8df00368562f2366f397adae44c510bf305e0094ecc2fe4756b3e3ebbac9", - git_commit = "0daf99950c1071c56fa042aed9e4acff145c6c91", + sha256 = "1e1736a759650d33a636fd71b73044adefd973a1720f972b99788a04f82d4030", + git_commit = "d7157e466e1acf0ae9711885cac4efa4e8b643ea", ) # Import all of TensorFlow Serving's external dependencies. From 9ec08058d58e52c023f54487b1e47b83a9311aeb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 May 2021 12:02:09 -0700 Subject: [PATCH 5001/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/099feb87-fe89-4587-9a2f-30ca05761cd4 PiperOrigin-RevId: 372981497 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9ef44139095..57b8e4c1448 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1e1736a759650d33a636fd71b73044adefd973a1720f972b99788a04f82d4030", - git_commit = "d7157e466e1acf0ae9711885cac4efa4e8b643ea", + sha256 = "e11d728e7ed554fa9493877ea5b86641a0914193ca768c3f2e7fcba57bd388e6", + git_commit = "d98faadf1fbd439dd65a62fa66fdee0dcbedc874", ) # Import all of TensorFlow Serving's external dependencies. From 98fdc8299bb158df17ea7e4ea5223d840e4b491f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 May 2021 18:01:48 -0700 Subject: [PATCH 5002/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fabb6a10-d552-4575-9384-9a9b6b205501 PiperOrigin-RevId: 373051576 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 57b8e4c1448..536ba6719ab 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e11d728e7ed554fa9493877ea5b86641a0914193ca768c3f2e7fcba57bd388e6", - git_commit = "d98faadf1fbd439dd65a62fa66fdee0dcbedc874", + sha256 = "1f908444f7f75fbd7aac13be8a047b999536343e3bf8c435f40a7659709b4ebc", + git_commit = "90fd69520f96c018bb134108c19282a774b4b4f8", ) # Import all of TensorFlow Serving's external dependencies. From 0d015baf4a27de39fdb797f814a237d4ff575ffb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 May 2021 00:01:42 -0700 Subject: [PATCH 5003/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e0c29be1-d2f8-48e3-9c92-521bb278b425 PiperOrigin-RevId: 373090641 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 536ba6719ab..c44a938ada6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1f908444f7f75fbd7aac13be8a047b999536343e3bf8c435f40a7659709b4ebc", - git_commit = "90fd69520f96c018bb134108c19282a774b4b4f8", + sha256 = "1db4027aa1e96fc01d43de5c6832bc98da8a0c3e5b80278d3b062af8e0ad64d6", + git_commit = "e890c0c88dc1d4ffdbecc89dc39cd7dd33ce6136", ) # Import all of TensorFlow Serving's external dependencies. From 63a32d344122f284acef56ea93b1cd3b3f240e57 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 May 2021 06:01:21 -0700 Subject: [PATCH 5004/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/70ec6d63-42e0-44c3-96db-56ec189866ba PiperOrigin-RevId: 373133648 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c44a938ada6..a716927191a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1db4027aa1e96fc01d43de5c6832bc98da8a0c3e5b80278d3b062af8e0ad64d6", - git_commit = "e890c0c88dc1d4ffdbecc89dc39cd7dd33ce6136", + sha256 = "ed30e1529cf883dfa350f412a12b00ccf0bba6faee390ccec4185752050ebcae", + git_commit = "f16473d057f382c2e1f58648b76152c56c54f456", ) # Import all of TensorFlow Serving's external dependencies. From c23f9280564bb0b39794f87040fc4bcf8376a33c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 May 2021 12:01:18 -0700 Subject: [PATCH 5005/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1a11e923-c559-4b56-a86c-c7ea3e7411fa PiperOrigin-RevId: 373202897 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a716927191a..097ad13f981 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ed30e1529cf883dfa350f412a12b00ccf0bba6faee390ccec4185752050ebcae", - git_commit = "f16473d057f382c2e1f58648b76152c56c54f456", + sha256 = "62c63135e24f7cefae04058b06c4b1f59387344aa230ce8aa4dd4ac90f9b1ef9", + git_commit = "b214a073fbdc9d47a22d6da023cfb0d5316a1747", ) # Import all of TensorFlow Serving's external dependencies. From 03d3832ba99f8267c4e3bb64930731209b9942f2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 May 2021 18:01:29 -0700 Subject: [PATCH 5006/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/cf005ce1-8d5c-4469-b94e-e5c53ea4dd17 PiperOrigin-RevId: 373271013 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 097ad13f981..0e7e45d1d03 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "62c63135e24f7cefae04058b06c4b1f59387344aa230ce8aa4dd4ac90f9b1ef9", - git_commit = "b214a073fbdc9d47a22d6da023cfb0d5316a1747", + sha256 = "8540da0f3d911c37b9c52bd43c77458d1d3e900a128ba42fb690018c78b51521", + git_commit = "ff4e72d780510cc1b676411cb82792282b6b2b8a", ) # Import all of TensorFlow Serving's external dependencies. From 63d2975dd0b7fa2453ded07851e926b9850fb554 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 May 2021 00:01:37 -0700 Subject: [PATCH 5007/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/70d751ae-fd8b-4ed3-96ce-88b060fb8a57 PiperOrigin-RevId: 373309434 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0e7e45d1d03..755a6586a13 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8540da0f3d911c37b9c52bd43c77458d1d3e900a128ba42fb690018c78b51521", - git_commit = "ff4e72d780510cc1b676411cb82792282b6b2b8a", + sha256 = "a8d244959e17476117e902bb7d8a107a4d6884262afde41ead3538afd25d737b", + git_commit = "8a1405a59b2a26125715ee167ac0982dfdb17dbe", ) # Import all of TensorFlow Serving's external dependencies. From 519b681d61d399d42dab991a54907de5764028a4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 May 2021 06:01:37 -0700 Subject: [PATCH 5008/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/51574b9b-0b68-4a43-9bc6-dcccee49c3a9 PiperOrigin-RevId: 373352804 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 755a6586a13..a647ed1d03c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a8d244959e17476117e902bb7d8a107a4d6884262afde41ead3538afd25d737b", - git_commit = "8a1405a59b2a26125715ee167ac0982dfdb17dbe", + sha256 = "462494aca65923cd8e1392285117daa9dfea2ccd01bf2e23ed86bd06c952a466", + git_commit = "c37552dbb57a0604b1550e0c9e368405985a8755", ) # Import all of TensorFlow Serving's external dependencies. From 81dd0303e2eedecf3554e970f160a17d8d77ab85 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 May 2021 12:01:28 -0700 Subject: [PATCH 5009/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b3b5d09e-835a-4dea-be66-9f07290c4e07 PiperOrigin-RevId: 373420438 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a647ed1d03c..5721040b3d6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "462494aca65923cd8e1392285117daa9dfea2ccd01bf2e23ed86bd06c952a466", - git_commit = "c37552dbb57a0604b1550e0c9e368405985a8755", + sha256 = "7a7759b690f907df8a01ce138473364ec9452816090dcffbd2b7af515c7c9485", + git_commit = "2f2aa0fe01244436f77e85839fa0a7cdbb8b9a0e", ) # Import all of TensorFlow Serving's external dependencies. From 86334156dad786ce3061c3f40f1a608556b6534d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 12 May 2021 18:01:39 -0700 Subject: [PATCH 5010/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/13dc7620-66e9-43cf-a140-6066b865bb14 PiperOrigin-RevId: 373491030 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5721040b3d6..fbca1bb3b81 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7a7759b690f907df8a01ce138473364ec9452816090dcffbd2b7af515c7c9485", - git_commit = "2f2aa0fe01244436f77e85839fa0a7cdbb8b9a0e", + sha256 = "5fe56015027ad8ab8a999a00dac0534ed328e3557ab7b8d6661e54ed9b9bbee7", + git_commit = "bcf28627b3d8161fb53274ac0eeb11c5d59bdafe", ) # Import all of TensorFlow Serving's external dependencies. From 693f7b2c9420bc8592ab61bad09637195a277c92 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 May 2021 00:01:44 -0700 Subject: [PATCH 5011/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/35fa34b5-634e-49d8-9808-d0caf73cd757 PiperOrigin-RevId: 373526421 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fbca1bb3b81..3a89327b6ca 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5fe56015027ad8ab8a999a00dac0534ed328e3557ab7b8d6661e54ed9b9bbee7", - git_commit = "bcf28627b3d8161fb53274ac0eeb11c5d59bdafe", + sha256 = "8c7033704521fdc1262820d4bc2bad9dcbbaf5896c1816e0fa03954107643b5d", + git_commit = "5bafaa70ef7d47a92f80fb9c5915067d4dbee772", ) # Import all of TensorFlow Serving's external dependencies. From d5483067ecfcf5f76565d7906e738373a8ff6535 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 May 2021 06:01:41 -0700 Subject: [PATCH 5012/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5e750b7a-beac-42a7-ba71-a92f346afb8e PiperOrigin-RevId: 373562897 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3a89327b6ca..68aacecb906 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8c7033704521fdc1262820d4bc2bad9dcbbaf5896c1816e0fa03954107643b5d", - git_commit = "5bafaa70ef7d47a92f80fb9c5915067d4dbee772", + sha256 = "4f82d01f773ce71dd574d1cd5611694da60b91bbec79fb9587360fbfba4e3363", + git_commit = "24d9b7c938698d3182c03c096f02bcb4cfe2e434", ) # Import all of TensorFlow Serving's external dependencies. From 61f9ebe2713ef1d4021cf8574169c821ff76f8a8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 May 2021 12:01:36 -0700 Subject: [PATCH 5013/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/761f978c-bac0-4da2-9265-29f7eff4dc82 PiperOrigin-RevId: 373626981 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 68aacecb906..b3855b5782b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4f82d01f773ce71dd574d1cd5611694da60b91bbec79fb9587360fbfba4e3363", - git_commit = "24d9b7c938698d3182c03c096f02bcb4cfe2e434", + sha256 = "59ca0f9ff755693e1b4d2657e71b7d9e1af98e927a5bab9087da2191a21771c2", + git_commit = "6721d4e43386384e69fd348c7e1b9a5722752ede", ) # Import all of TensorFlow Serving's external dependencies. From 4a791a90cbd868b4c986cd2ca0bb5d8ef3009cec Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 May 2021 18:01:55 -0700 Subject: [PATCH 5014/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a10d86b0-19da-4f52-8249-d56eec5bfec5 PiperOrigin-RevId: 373696252 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b3855b5782b..b46315cb8dc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "59ca0f9ff755693e1b4d2657e71b7d9e1af98e927a5bab9087da2191a21771c2", - git_commit = "6721d4e43386384e69fd348c7e1b9a5722752ede", + sha256 = "2895b742b75acbadaad6cc5d051b797e686d920968f26e2f5783955e3bded11f", + git_commit = "4d02cb37152c2199585fc9092dd0a0e17b73d5e2", ) # Import all of TensorFlow Serving's external dependencies. From 4212fe0b0d7ef1d7db79e143a4e4b6a5e1da6646 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 May 2021 00:01:35 -0700 Subject: [PATCH 5015/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8fb26eb6-cd0b-4979-b93c-2d71bae162d7 PiperOrigin-RevId: 373732544 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b46315cb8dc..bc2fa60b8a3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2895b742b75acbadaad6cc5d051b797e686d920968f26e2f5783955e3bded11f", - git_commit = "4d02cb37152c2199585fc9092dd0a0e17b73d5e2", + sha256 = "793de3b49f3b3699b1ee3450275bcb757837567734a5fc6706c4ed9ffb4c06b0", + git_commit = "d2953ce0d43781886b8976ceecaf1092656d90e3", ) # Import all of TensorFlow Serving's external dependencies. From 124b5111f289ab551fd219ec3ceb2a13fa13c5d8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 May 2021 06:01:54 -0700 Subject: [PATCH 5016/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9267088f-a6d7-410a-840b-5fb514b5e876 PiperOrigin-RevId: 373771283 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bc2fa60b8a3..89eb704092a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "793de3b49f3b3699b1ee3450275bcb757837567734a5fc6706c4ed9ffb4c06b0", - git_commit = "d2953ce0d43781886b8976ceecaf1092656d90e3", + sha256 = "68d0e5fd6fb98d6cf77c3ed3899fc450d87fe84485c51091de83bff6a4dfb982", + git_commit = "aa0a30013f9bd04a36eb02d115d31763429c381c", ) # Import all of TensorFlow Serving's external dependencies. From 7f894c79fce5e58758f3cb49e858a16e3602ae80 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Fri, 14 May 2021 09:26:23 -0700 Subject: [PATCH 5017/8103] Move status_proto to public visible apis/ (it being used by public API protos) PiperOrigin-RevId: 373803959 --- tensorflow_serving/apis/BUILD | 28 ++++++++++++++++--- .../apis/get_model_status.proto | 6 ++-- .../apis/model_management.proto | 5 ++-- .../{util => apis}/status.proto | 0 tensorflow_serving/model_servers/BUILD | 2 +- .../model_servers/get_model_status_impl.cc | 2 +- .../get_model_status_impl_test.cc | 2 +- tensorflow_serving/tools/pip_package/BUILD | 2 +- .../tools/pip_package/build_pip_package.sh | 5 ---- tensorflow_serving/util/BUILD | 25 ++--------------- tensorflow_serving/util/status_util.h | 2 +- 11 files changed, 37 insertions(+), 42 deletions(-) rename tensorflow_serving/{util => apis}/status.proto (100%) diff --git a/tensorflow_serving/apis/BUILD b/tensorflow_serving/apis/BUILD index f7b32aac83e..f6ad81bccea 100644 --- a/tensorflow_serving/apis/BUILD +++ b/tensorflow_serving/apis/BUILD @@ -200,13 +200,33 @@ serving_go_grpc_library( deps = [":prediction_service_go_proto"], ) +serving_proto_library( + name = "status_proto", + srcs = ["status.proto"], + cc_api_version = 2, + deps = [ + serving_tensorflow_proto_dep( + "@org_tensorflow//tensorflow/core:protos_all", + ), + ], +) + +serving_proto_library_py( + name = "status_proto_py_pb2", + srcs = ["status.proto"], + proto_library = "status_proto", + deps = [ + "@org_tensorflow//tensorflow/core:protos_all_py", + ], +) + serving_proto_library( name = "model_management_proto", srcs = ["model_management.proto"], cc_api_version = 2, deps = [ + ":status_proto", "//tensorflow_serving/config:model_server_config_proto", - "//tensorflow_serving/util:status_proto", ], ) @@ -215,8 +235,8 @@ serving_proto_library_py( srcs = ["model_management.proto"], proto_library = "model_management_proto", deps = [ + ":status_proto_py_pb2", "//tensorflow_serving/config:model_server_config_proto_py_pb2", - "//tensorflow_serving/util:status_proto_py_pb2", ], ) @@ -226,7 +246,7 @@ serving_proto_library( cc_api_version = 2, deps = [ ":model_proto", - "//tensorflow_serving/util:status_proto", + ":status_proto", ], ) @@ -236,7 +256,7 @@ serving_proto_library_py( proto_library = "get_model_status_proto", deps = [ ":model_proto_py_pb2", - "//tensorflow_serving/util:status_proto_py_pb2", + ":status_proto_py_pb2", ], ) diff --git a/tensorflow_serving/apis/get_model_status.proto b/tensorflow_serving/apis/get_model_status.proto index 535eb9acb68..88812472a6c 100644 --- a/tensorflow_serving/apis/get_model_status.proto +++ b/tensorflow_serving/apis/get_model_status.proto @@ -1,11 +1,11 @@ syntax = "proto3"; -option cc_enable_arenas = true; +package tensorflow.serving; import "tensorflow_serving/apis/model.proto"; -import "tensorflow_serving/util/status.proto"; +import "tensorflow_serving/apis/status.proto"; -package tensorflow.serving; +option cc_enable_arenas = true; // GetModelStatusRequest contains a ModelSpec indicating the model for which // to get status. diff --git a/tensorflow_serving/apis/model_management.proto b/tensorflow_serving/apis/model_management.proto index 9140fa19aac..6bbf00f967f 100644 --- a/tensorflow_serving/apis/model_management.proto +++ b/tensorflow_serving/apis/model_management.proto @@ -1,9 +1,10 @@ syntax = "proto3"; +package tensorflow.serving; + +import "tensorflow_serving/apis/status.proto"; import "tensorflow_serving/config/model_server_config.proto"; -import "tensorflow_serving/util/status.proto"; -package tensorflow.serving; option cc_enable_arenas = true; message ReloadConfigRequest { diff --git a/tensorflow_serving/util/status.proto b/tensorflow_serving/apis/status.proto similarity index 100% rename from tensorflow_serving/util/status.proto rename to tensorflow_serving/apis/status.proto diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 50746d3955d..cc2b2e1ac53 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -137,9 +137,9 @@ cc_library( deps = [ ":server_core", "//tensorflow_serving/apis:get_model_status_cc_proto", + "//tensorflow_serving/apis:status_cc_proto", "//tensorflow_serving/core:servable_state", "//tensorflow_serving/core:servable_state_monitor", - "//tensorflow_serving/util:status_cc_proto", "//tensorflow_serving/util:status_util", "@com_google_absl//absl/types:optional", "@org_tensorflow//tensorflow/core:lib", diff --git a/tensorflow_serving/model_servers/get_model_status_impl.cc b/tensorflow_serving/model_servers/get_model_status_impl.cc index 3f295f4383d..fb98b6fa7eb 100644 --- a/tensorflow_serving/model_servers/get_model_status_impl.cc +++ b/tensorflow_serving/model_servers/get_model_status_impl.cc @@ -18,9 +18,9 @@ limitations under the License. #include #include "absl/types/optional.h" +#include "tensorflow_serving/apis/status.pb.h" #include "tensorflow_serving/core/servable_state.h" #include "tensorflow_serving/core/servable_state_monitor.h" -#include "tensorflow_serving/util/status.pb.h" #include "tensorflow_serving/util/status_util.h" namespace tensorflow { diff --git a/tensorflow_serving/model_servers/get_model_status_impl_test.cc b/tensorflow_serving/model_servers/get_model_status_impl_test.cc index 9002a8526c4..05c51ee8d67 100644 --- a/tensorflow_serving/model_servers/get_model_status_impl_test.cc +++ b/tensorflow_serving/model_servers/get_model_status_impl_test.cc @@ -21,6 +21,7 @@ limitations under the License. #include "tensorflow/cc/saved_model/signature_constants.h" #include "tensorflow/core/lib/core/status_test_util.h" #include "tensorflow_serving/apis/model.pb.h" +#include "tensorflow_serving/apis/status.pb.h" #include "tensorflow_serving/core/availability_preserving_policy.h" #include "tensorflow_serving/model_servers/model_platform_types.h" #include "tensorflow_serving/model_servers/platform_config_util.h" @@ -28,7 +29,6 @@ limitations under the License. #include "tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter.pb.h" #include "tensorflow_serving/servables/tensorflow/session_bundle_config.pb.h" #include "tensorflow_serving/test_util/test_util.h" -#include "tensorflow_serving/util/status.pb.h" namespace tensorflow { namespace serving { diff --git a/tensorflow_serving/tools/pip_package/BUILD b/tensorflow_serving/tools/pip_package/BUILD index 187c0e089d7..22504fdb051 100644 --- a/tensorflow_serving/tools/pip_package/BUILD +++ b/tensorflow_serving/tools/pip_package/BUILD @@ -22,11 +22,11 @@ sh_binary( "//tensorflow_serving/apis:predict_proto_py_pb2", "//tensorflow_serving/apis:regression_proto_py_pb2", "//tensorflow_serving/apis:session_service_proto_py_pb2", + "//tensorflow_serving/apis:status_proto_py_pb2", "//tensorflow_serving/config:log_collector_config_proto_py_pb2", "//tensorflow_serving/config:logging_config_proto_py_pb2", "//tensorflow_serving/config:model_server_config_proto_py_pb2", "//tensorflow_serving/config:file_system_storage_path_source_proto_py_pb2", - "//tensorflow_serving/util:status_proto_py_pb2", "//tensorflow_serving/core:logging_proto_py_pb2", ], ) diff --git a/tensorflow_serving/tools/pip_package/build_pip_package.sh b/tensorflow_serving/tools/pip_package/build_pip_package.sh index 60f8136dce1..0187c5f07f0 100755 --- a/tensorflow_serving/tools/pip_package/build_pip_package.sh +++ b/tensorflow_serving/tools/pip_package/build_pip_package.sh @@ -37,7 +37,6 @@ function main() { mkdir -p ${TMPDIR}/tensorflow_serving/apis mkdir -p ${TMPDIR}/tensorflow_serving/config mkdir -p ${TMPDIR}/tensorflow_serving/core - mkdir -p ${TMPDIR}/tensorflow_serving/util echo "Adding python files" cp bazel-out/k8-opt/bin/tensorflow_serving/apis/*_pb2.py \ @@ -55,13 +54,9 @@ function main() { cp bazel-out/k8-opt/bin/tensorflow_serving/core/*_pb2.py \ "${TMPDIR}/tensorflow_serving/core" - cp bazel-out/k8-opt/bin/tensorflow_serving/util/*_pb2.py \ - "${TMPDIR}/tensorflow_serving/util" - touch "${TMPDIR}/tensorflow_serving/apis/__init__.py" touch "${TMPDIR}/tensorflow_serving/config/__init__.py" touch "${TMPDIR}/tensorflow_serving/core/__init__.py" - touch "${TMPDIR}/tensorflow_serving/util/__init__.py" touch "${TMPDIR}/tensorflow_serving/__init__.py" echo "Adding package setup files" diff --git a/tensorflow_serving/util/BUILD b/tensorflow_serving/util/BUILD index 24a63b0e754..9e13307ced1 100644 --- a/tensorflow_serving/util/BUILD +++ b/tensorflow_serving/util/BUILD @@ -1,6 +1,6 @@ # Description: Tensorflow Serving utils. -load("//tensorflow_serving:serving.bzl", "serving_proto_library", "serving_proto_library_py", "serving_tensorflow_proto_dep") +load("//tensorflow_serving:serving.bzl", "serving_proto_library") package( default_visibility = [ @@ -292,7 +292,7 @@ cc_library( srcs = ["status_util.cc"], hdrs = ["status_util.h"], deps = [ - ":status_cc_proto", + "//tensorflow_serving/apis:status_cc_proto", "@org_tensorflow//tensorflow/core:lib", ], ) @@ -354,27 +354,6 @@ serving_proto_library( ], ) -serving_proto_library( - name = "status_proto", - srcs = ["status.proto"], - cc_api_version = 2, - visibility = ["//visibility:public"], - deps = [ - serving_tensorflow_proto_dep( - "@org_tensorflow//tensorflow/core:protos_all", - ), - ], -) - -serving_proto_library_py( - name = "status_proto_py_pb2", - srcs = ["status.proto"], - proto_library = "status_proto", - deps = [ - "@org_tensorflow//tensorflow/core:protos_all_py", - ], -) - cc_library( name = "oss_or_google", hdrs = ["oss_or_google.h"], diff --git a/tensorflow_serving/util/status_util.h b/tensorflow_serving/util/status_util.h index 04308f8d3e0..9d7324b1178 100644 --- a/tensorflow_serving/util/status_util.h +++ b/tensorflow_serving/util/status_util.h @@ -16,7 +16,7 @@ limitations under the License. #define TENSORFLOW_SERVING_UTIL_STATUS_UTIL_H_ #include "tensorflow/core/lib/core/status.h" -#include "tensorflow_serving/util/status.pb.h" +#include "tensorflow_serving/apis/status.pb.h" namespace tensorflow { namespace serving { From c154e6fc0784d747c0b7c9d9c248177769b6d268 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 May 2021 12:01:20 -0700 Subject: [PATCH 5018/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0a36276e-a55b-4f5d-bde4-bd2a37930368 PiperOrigin-RevId: 373836701 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 89eb704092a..1c775b10ed0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "68d0e5fd6fb98d6cf77c3ed3899fc450d87fe84485c51091de83bff6a4dfb982", - git_commit = "aa0a30013f9bd04a36eb02d115d31763429c381c", + sha256 = "db8b2ba9b00358ace9d309aff6ab0ba3ea4c2730104f560221a7ed26e304b19c", + git_commit = "be3a0b6138c52e1ce9d9fe8bc310a3e51a470d73", ) # Import all of TensorFlow Serving's external dependencies. From 17cfd4e6e597be70aed0f3724071f50d25307669 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 May 2021 18:01:40 -0700 Subject: [PATCH 5019/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2af5cfdf-efef-4e0e-a91c-69344dba6c28 PiperOrigin-RevId: 373900108 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1c775b10ed0..f368eac2dbd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "db8b2ba9b00358ace9d309aff6ab0ba3ea4c2730104f560221a7ed26e304b19c", - git_commit = "be3a0b6138c52e1ce9d9fe8bc310a3e51a470d73", + sha256 = "90046d1e1c5f7cdc1c365621ebec76bfc50969dc5902f5c02369d0e4abfd96a7", + git_commit = "d24f1369180d52d0ad79db5fd4df369776c2dc14", ) # Import all of TensorFlow Serving's external dependencies. From 5da0552c2ac1acbe4f28119de2e391f84d69d3db Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 15 May 2021 00:01:44 -0700 Subject: [PATCH 5020/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ca8e6cf2-40de-46c7-b2e8-96c0cd4b8001 PiperOrigin-RevId: 373928709 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f368eac2dbd..c593f5f1bf3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "90046d1e1c5f7cdc1c365621ebec76bfc50969dc5902f5c02369d0e4abfd96a7", - git_commit = "d24f1369180d52d0ad79db5fd4df369776c2dc14", + sha256 = "f39d798711dc868eeac1e8ed84037fece5764b8c2051a10586e5c308f3fa5f4e", + git_commit = "de9a4335c96bec8fa69abb89618b1daa4b2459fa", ) # Import all of TensorFlow Serving's external dependencies. From 3618578591892a34fa3787d4f7b1a03543a5d39f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 15 May 2021 06:01:28 -0700 Subject: [PATCH 5021/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/209c4dad-6069-4fdd-bb79-8fc3015aaae2 PiperOrigin-RevId: 373955166 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c593f5f1bf3..6658ffecf4c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f39d798711dc868eeac1e8ed84037fece5764b8c2051a10586e5c308f3fa5f4e", - git_commit = "de9a4335c96bec8fa69abb89618b1daa4b2459fa", + sha256 = "5c0157069b7eedbefa9baf98bb5e7a4fb28ae08f587df771d5c3cc4410ad47ef", + git_commit = "4cbb8f3e53b45147ba642f9b654fb68389bcce9e", ) # Import all of TensorFlow Serving's external dependencies. From 9fb9b3d22d82f85d8243a825c71fbc723a0333ff Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 15 May 2021 12:01:58 -0700 Subject: [PATCH 5022/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/55f9e782-5649-43e1-8c61-84ad2c27aa5e PiperOrigin-RevId: 373979017 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6658ffecf4c..4de23e8072d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5c0157069b7eedbefa9baf98bb5e7a4fb28ae08f587df771d5c3cc4410ad47ef", - git_commit = "4cbb8f3e53b45147ba642f9b654fb68389bcce9e", + sha256 = "18b35f114fe977e60706a2ecc5ff5f8f4ba2b3c49a31987302496079d71b22ad", + git_commit = "5854c4a9c86ccb44d7bc43cfd2143ea5a56b2d8c", ) # Import all of TensorFlow Serving's external dependencies. From 124463690f2fc53c5c85c7bafc50ddeab30f5888 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 15 May 2021 18:01:40 -0700 Subject: [PATCH 5023/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ea3f088d-f24e-46b3-922f-f4a6eb64b2c3 PiperOrigin-RevId: 374002639 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4de23e8072d..c64b3d4e681 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "18b35f114fe977e60706a2ecc5ff5f8f4ba2b3c49a31987302496079d71b22ad", - git_commit = "5854c4a9c86ccb44d7bc43cfd2143ea5a56b2d8c", + sha256 = "107684b00e435d03e259998cbde89b29b380947bd795c9f29e75522687e2bb5a", + git_commit = "e1840bdfc30840dfda2495a53342c5b02f3c4802", ) # Import all of TensorFlow Serving's external dependencies. From e3aa03998b3044444894524cba506bc0d0c30569 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 16 May 2021 00:01:32 -0700 Subject: [PATCH 5024/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e861e2b6-85a8-43e1-b47a-6c8309dc3365 PiperOrigin-RevId: 374025755 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c64b3d4e681..dcd912868df 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "107684b00e435d03e259998cbde89b29b380947bd795c9f29e75522687e2bb5a", - git_commit = "e1840bdfc30840dfda2495a53342c5b02f3c4802", + sha256 = "228a197b41be4b53f25a72a37bd76613a996803d284741de1ae276afb74e30c3", + git_commit = "e5d85e37be319526816b2d33c5fffcf067c54c32", ) # Import all of TensorFlow Serving's external dependencies. From 905fb7647609c21f9c9f6ffdbaf5dfa2ffe25e86 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 16 May 2021 18:01:39 -0700 Subject: [PATCH 5025/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a5de712a-5514-4cc7-8141-a966ee48ae6b PiperOrigin-RevId: 374101930 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dcd912868df..dbdc1328de4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "228a197b41be4b53f25a72a37bd76613a996803d284741de1ae276afb74e30c3", - git_commit = "e5d85e37be319526816b2d33c5fffcf067c54c32", + sha256 = "bede8820f897cfd0ea1f18213657c3a5eb2a841a06664f94baab35095103b216", + git_commit = "1f9a4510b9f710b194281ceca3c1e09e6704bae8", ) # Import all of TensorFlow Serving's external dependencies. From 7480d2b6d472f9d635a30383b60ace3f0a97d0f9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 May 2021 00:02:04 -0700 Subject: [PATCH 5026/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/92892103-e219-4740-b802-90944a398dcf PiperOrigin-RevId: 374133208 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dbdc1328de4..c1dce5ad7e2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bede8820f897cfd0ea1f18213657c3a5eb2a841a06664f94baab35095103b216", - git_commit = "1f9a4510b9f710b194281ceca3c1e09e6704bae8", + sha256 = "f1922890dadf180d7417740a6f5ee8cd2b7e000eed5244566c65a0336afbf6f0", + git_commit = "704610e1d21288482bf77923b387f9bb6c119318", ) # Import all of TensorFlow Serving's external dependencies. From f2d807986ee80ffbce5003482b0cfedd277bb1bf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 May 2021 06:01:32 -0700 Subject: [PATCH 5027/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ad31a29d-68f0-4e80-9d86-ed54eb23e15d PiperOrigin-RevId: 374179223 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c1dce5ad7e2..cfacd87208e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f1922890dadf180d7417740a6f5ee8cd2b7e000eed5244566c65a0336afbf6f0", - git_commit = "704610e1d21288482bf77923b387f9bb6c119318", + sha256 = "83a121558e8d8c56ca0f04b6532b7037f62f44e22f836b217cd509f9f21cf01c", + git_commit = "d11603a3434ea8c60eea0758ae9218ffba4c557f", ) # Import all of TensorFlow Serving's external dependencies. From 6aafe0da0a0eaa2e8ad9465bcea625774c35304c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 May 2021 12:01:49 -0700 Subject: [PATCH 5028/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d499111c-b70e-4d45-8a62-dd7cb46e04a6 PiperOrigin-RevId: 374248203 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cfacd87208e..0396c90f038 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "83a121558e8d8c56ca0f04b6532b7037f62f44e22f836b217cd509f9f21cf01c", - git_commit = "d11603a3434ea8c60eea0758ae9218ffba4c557f", + sha256 = "f41951566bf32ae7ca4928bb752c0796f12eb3cb328ad907c993fa1b0214b553", + git_commit = "62d8afd6b28a94e9316260361d31c07b2ef904b4", ) # Import all of TensorFlow Serving's external dependencies. From 44d1f36505d07ece55df257896aa3b4262d1e0d3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 May 2021 18:01:38 -0700 Subject: [PATCH 5029/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5289d6c0-f360-47f5-a7c7-488f7396b602 PiperOrigin-RevId: 374319653 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0396c90f038..a66c349c92e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f41951566bf32ae7ca4928bb752c0796f12eb3cb328ad907c993fa1b0214b553", - git_commit = "62d8afd6b28a94e9316260361d31c07b2ef904b4", + sha256 = "ef95d02a74bba4c04a60c68482ded42539795d582297ec28e2c4aae28b87c22a", + git_commit = "6e43c06328a487b50b730388e9512248bb03a0ec", ) # Import all of TensorFlow Serving's external dependencies. From 067f45cdf1a0b4b942a206079c47f8aa31f483a2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 May 2021 00:01:35 -0700 Subject: [PATCH 5030/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/abb5c5cb-76ef-49a2-a4d2-53e5bbd611d3 PiperOrigin-RevId: 374356019 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a66c349c92e..c94c75be10f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ef95d02a74bba4c04a60c68482ded42539795d582297ec28e2c4aae28b87c22a", - git_commit = "6e43c06328a487b50b730388e9512248bb03a0ec", + sha256 = "3bbf659196324db73ca2cf1e7be6dfa54d2b6171e80e76531196c7aae2e37ea4", + git_commit = "38d6bf2368881e005fd4747d7385f217078806c0", ) # Import all of TensorFlow Serving's external dependencies. From e846c66423def88f37dc600f934b75668abc5d94 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 May 2021 06:01:50 -0700 Subject: [PATCH 5031/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/678cf37f-418c-4788-b0cf-459ae4543394 PiperOrigin-RevId: 374399046 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c94c75be10f..57d96b3f67b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3bbf659196324db73ca2cf1e7be6dfa54d2b6171e80e76531196c7aae2e37ea4", - git_commit = "38d6bf2368881e005fd4747d7385f217078806c0", + sha256 = "32a2389abcc2ab77f5cfbfb5fd119becc421739fe6350c253a71ec049456ef69", + git_commit = "17911f6ab408419df6865e533aeb0b0788ef4e6a", ) # Import all of TensorFlow Serving's external dependencies. From 37c64b8820a923aafc1b5c8bf264fd5cce5224f3 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Tue, 18 May 2021 11:03:31 -0700 Subject: [PATCH 5032/8103] Move core/logging.proto -> apis/logging.proto PiperOrigin-RevId: 374459486 --- tensorflow_serving/apis/BUILD | 24 +++++++++++-- .../{core => apis}/logging.proto | 0 tensorflow_serving/apis/prediction_log.proto | 6 ++-- tensorflow_serving/core/BUILD | 36 +++---------------- tensorflow_serving/core/request_logger.h | 2 +- .../core/request_logger_test.cc | 2 +- .../core/server_request_logger.cc | 2 +- .../core/server_request_logger.h | 2 +- .../core/server_request_logger_test.cc | 2 +- tensorflow_serving/core/test_util/BUILD | 2 +- .../core/test_util/mock_request_logger.h | 2 +- .../test_util/mock_server_core.h | 2 +- tensorflow_serving/tools/pip_package/BUILD | 2 +- .../tools/pip_package/build_pip_package.sh | 5 --- 14 files changed, 38 insertions(+), 51 deletions(-) rename tensorflow_serving/{core => apis}/logging.proto (100%) diff --git a/tensorflow_serving/apis/BUILD b/tensorflow_serving/apis/BUILD index f6ad81bccea..34fda27e67c 100644 --- a/tensorflow_serving/apis/BUILD +++ b/tensorflow_serving/apis/BUILD @@ -129,6 +129,26 @@ tf_jspb_proto_library( deps = [":predict_proto"], ) +serving_proto_library( + name = "logging_proto", + srcs = ["logging.proto"], + cc_api_version = 2, + deps = [ + ":model_proto", + "//tensorflow_serving/config:logging_config_proto", + ], +) + +serving_proto_library_py( + name = "logging_proto_py_pb2", + srcs = ["logging.proto"], + proto_library = "logging_proto", + deps = [ + ":model_proto_py_pb2", + "//tensorflow_serving/config:logging_config_proto_py_pb2", + ], +) + serving_proto_library( name = "prediction_log_proto", srcs = ["prediction_log.proto"], @@ -136,10 +156,10 @@ serving_proto_library( deps = [ ":classification_proto", ":inference_proto", + ":logging_proto", ":predict_proto", ":regression_proto", ":session_service_proto", - "//tensorflow_serving/core:logging_proto", ], ) @@ -153,7 +173,7 @@ serving_proto_library_py( ":predict_proto_py_pb2", ":regression_proto_py_pb2", ":session_service_proto_py_pb2", - "//tensorflow_serving/core:logging_proto_py_pb2", + "//tensorflow_serving/apis:logging_proto_py_pb2", ], ) diff --git a/tensorflow_serving/core/logging.proto b/tensorflow_serving/apis/logging.proto similarity index 100% rename from tensorflow_serving/core/logging.proto rename to tensorflow_serving/apis/logging.proto diff --git a/tensorflow_serving/apis/prediction_log.proto b/tensorflow_serving/apis/prediction_log.proto index 474d6bb37e6..c75b68acffe 100644 --- a/tensorflow_serving/apis/prediction_log.proto +++ b/tensorflow_serving/apis/prediction_log.proto @@ -1,15 +1,15 @@ syntax = "proto3"; -option cc_enable_arenas = true; +package tensorflow.serving; import "tensorflow_serving/apis/classification.proto"; import "tensorflow_serving/apis/inference.proto"; +import "tensorflow_serving/apis/logging.proto"; import "tensorflow_serving/apis/predict.proto"; import "tensorflow_serving/apis/regression.proto"; import "tensorflow_serving/apis/session_service.proto"; -import "tensorflow_serving/core/logging.proto"; -package tensorflow.serving; +option cc_enable_arenas = true; message ClassifyLog { ClassificationRequest request = 1; diff --git a/tensorflow_serving/core/BUILD b/tensorflow_serving/core/BUILD index e22dc4aec77..9a8eac4a774 100644 --- a/tensorflow_serving/core/BUILD +++ b/tensorflow_serving/core/BUILD @@ -1,7 +1,5 @@ # Description: Tensorflow Serving core. -load("//tensorflow_serving:serving.bzl", "serving_proto_library", "serving_proto_library_py") - package( default_visibility = [ "//tensorflow_serving:internal", @@ -765,32 +763,6 @@ cc_test( ], ) -serving_proto_library( - name = "logging_proto", - srcs = ["logging.proto"], - cc_api_version = 2, - visibility = [ - "//visibility:public", - ], - deps = [ - "//tensorflow_serving/apis:model_proto", - "//tensorflow_serving/config:logging_config_proto", - ], -) - -serving_proto_library_py( - name = "logging_proto_py_pb2", - srcs = ["logging.proto"], - proto_library = "logging_proto", - visibility = [ - "//visibility:public", - ], - deps = [ - "//tensorflow_serving/apis:model_proto_py_pb2", - "//tensorflow_serving/config:logging_config_proto_py_pb2", - ], -) - cc_library( name = "request_logger", srcs = ["request_logger.cc"], @@ -800,7 +772,7 @@ cc_library( ], deps = [ ":log_collector", - ":logging_cc_proto", + "//tensorflow_serving/apis:logging_cc_proto", "//tensorflow_serving/config:logging_config_cc_proto", "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/core:lib", @@ -813,8 +785,8 @@ cc_test( srcs = ["request_logger_test.cc"], deps = [ ":log_collector", - ":logging_cc_proto", ":request_logger", + "//tensorflow_serving/apis:logging_cc_proto", "//tensorflow_serving/apis:model_cc_proto", "//tensorflow_serving/apis:predict_cc_proto", "//tensorflow_serving/config:logging_config_cc_proto", @@ -837,9 +809,9 @@ cc_library( ], deps = [ ":request_logger", + "//tensorflow_serving/apis:logging_cc_proto", "//tensorflow_serving/apis:model_cc_proto", "//tensorflow_serving/config:logging_config_cc_proto", - "//tensorflow_serving/core:logging_cc_proto", "//tensorflow_serving/util:fast_read_dynamic_ptr", "@com_google_protobuf//:protobuf", "@org_tensorflow//tensorflow/core:lib", @@ -852,8 +824,8 @@ cc_test( srcs = ["server_request_logger_test.cc"], deps = [ ":log_collector", - ":logging_cc_proto", ":server_request_logger", + "//tensorflow_serving/apis:logging_cc_proto", "//tensorflow_serving/apis:model_cc_proto", "//tensorflow_serving/apis:predict_cc_proto", "//tensorflow_serving/config:log_collector_config_cc_proto", diff --git a/tensorflow_serving/core/request_logger.h b/tensorflow_serving/core/request_logger.h index de0c3293c99..b25c8d8b113 100644 --- a/tensorflow_serving/core/request_logger.h +++ b/tensorflow_serving/core/request_logger.h @@ -21,9 +21,9 @@ limitations under the License. #include "google/protobuf/message.h" #include "tensorflow/core/lib/core/status.h" +#include "tensorflow_serving/apis/logging.pb.h" #include "tensorflow_serving/config/logging_config.pb.h" #include "tensorflow_serving/core/log_collector.h" -#include "tensorflow_serving/core/logging.pb.h" namespace tensorflow { namespace serving { diff --git a/tensorflow_serving/core/request_logger_test.cc b/tensorflow_serving/core/request_logger_test.cc index c2ba4cfd3a2..b80a00b0cba 100644 --- a/tensorflow_serving/core/request_logger_test.cc +++ b/tensorflow_serving/core/request_logger_test.cc @@ -27,11 +27,11 @@ limitations under the License. #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/lib/core/status_test_util.h" +#include "tensorflow_serving/apis/logging.pb.h" #include "tensorflow_serving/apis/model.pb.h" #include "tensorflow_serving/apis/predict.pb.h" #include "tensorflow_serving/config/logging_config.pb.h" #include "tensorflow_serving/core/log_collector.h" -#include "tensorflow_serving/core/logging.pb.h" #include "tensorflow_serving/core/test_util/mock_log_collector.h" #include "tensorflow_serving/core/test_util/mock_request_logger.h" #include "tensorflow_serving/test_util/test_util.h" diff --git a/tensorflow_serving/core/server_request_logger.cc b/tensorflow_serving/core/server_request_logger.cc index 64cd8335b81..e605fb9df89 100644 --- a/tensorflow_serving/core/server_request_logger.cc +++ b/tensorflow_serving/core/server_request_logger.cc @@ -19,8 +19,8 @@ limitations under the License. #include "tensorflow/core/lib/gtl/map_util.h" #include "tensorflow/core/lib/strings/proto_serialization.h" #include "tensorflow/core/platform/macros.h" +#include "tensorflow_serving/apis/logging.pb.h" #include "tensorflow_serving/apis/model.pb.h" -#include "tensorflow_serving/core/logging.pb.h" namespace tensorflow { namespace serving { diff --git a/tensorflow_serving/core/server_request_logger.h b/tensorflow_serving/core/server_request_logger.h index 4f7a7162487..4b2ea6d16a3 100644 --- a/tensorflow_serving/core/server_request_logger.h +++ b/tensorflow_serving/core/server_request_logger.h @@ -25,8 +25,8 @@ limitations under the License. #include "google/protobuf/message.h" #include "tensorflow/core/lib/core/status.h" +#include "tensorflow_serving/apis/logging.pb.h" #include "tensorflow_serving/config/logging_config.pb.h" -#include "tensorflow_serving/core/logging.pb.h" #include "tensorflow_serving/core/request_logger.h" #include "tensorflow_serving/util/fast_read_dynamic_ptr.h" diff --git a/tensorflow_serving/core/server_request_logger_test.cc b/tensorflow_serving/core/server_request_logger_test.cc index f3912da5a65..fd1796f74f1 100644 --- a/tensorflow_serving/core/server_request_logger_test.cc +++ b/tensorflow_serving/core/server_request_logger_test.cc @@ -29,12 +29,12 @@ limitations under the License. #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/lib/core/status_test_util.h" +#include "tensorflow_serving/apis/logging.pb.h" #include "tensorflow_serving/apis/model.pb.h" #include "tensorflow_serving/apis/predict.pb.h" #include "tensorflow_serving/config/log_collector_config.pb.h" #include "tensorflow_serving/config/logging_config.pb.h" #include "tensorflow_serving/core/log_collector.h" -#include "tensorflow_serving/core/logging.pb.h" #include "tensorflow_serving/core/test_util/fake_log_collector.h" #include "tensorflow_serving/core/test_util/mock_request_logger.h" #include "tensorflow_serving/test_util/test_util.h" diff --git a/tensorflow_serving/core/test_util/BUILD b/tensorflow_serving/core/test_util/BUILD index bf9215b458b..38dfaceb8c8 100644 --- a/tensorflow_serving/core/test_util/BUILD +++ b/tensorflow_serving/core/test_util/BUILD @@ -176,7 +176,7 @@ cc_library( testonly = 1, hdrs = ["mock_request_logger.h"], deps = [ - "//tensorflow_serving/core:logging_cc_proto", + "//tensorflow_serving/apis:logging_cc_proto", "//tensorflow_serving/core:request_logger", "@com_google_googletest//:gtest", "@com_google_protobuf//:protobuf", diff --git a/tensorflow_serving/core/test_util/mock_request_logger.h b/tensorflow_serving/core/test_util/mock_request_logger.h index 89e34ece47c..c66f3e51889 100644 --- a/tensorflow_serving/core/test_util/mock_request_logger.h +++ b/tensorflow_serving/core/test_util/mock_request_logger.h @@ -21,9 +21,9 @@ limitations under the License. #include "google/protobuf/message.h" #include #include "tensorflow/core/lib/core/status.h" +#include "tensorflow_serving/apis/logging.pb.h" #include "tensorflow_serving/config/logging_config.pb.h" #include "tensorflow_serving/core/log_collector.h" -#include "tensorflow_serving/core/logging.pb.h" #include "tensorflow_serving/core/request_logger.h" namespace tensorflow { diff --git a/tensorflow_serving/model_servers/test_util/mock_server_core.h b/tensorflow_serving/model_servers/test_util/mock_server_core.h index cb965e063df..df7569b5841 100644 --- a/tensorflow_serving/model_servers/test_util/mock_server_core.h +++ b/tensorflow_serving/model_servers/test_util/mock_server_core.h @@ -26,11 +26,11 @@ limitations under the License. #include #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/platform/logging.h" +#include "tensorflow_serving/apis/logging.proto.h" #include "tensorflow_serving/apis/model.pb.h" #include "tensorflow_serving/config/model_server_config.pb.h" #include "tensorflow_serving/config/platform_config.pb.h" #include "tensorflow_serving/core/aspired_versions_manager.h" -#include "tensorflow_serving/core/logging.pb.h" #include "tensorflow_serving/core/servable_handle.h" #include "tensorflow_serving/core/servable_state.h" #include "tensorflow_serving/core/servable_state_monitor.h" diff --git a/tensorflow_serving/tools/pip_package/BUILD b/tensorflow_serving/tools/pip_package/BUILD index 22504fdb051..48daa4f43fe 100644 --- a/tensorflow_serving/tools/pip_package/BUILD +++ b/tensorflow_serving/tools/pip_package/BUILD @@ -27,6 +27,6 @@ sh_binary( "//tensorflow_serving/config:logging_config_proto_py_pb2", "//tensorflow_serving/config:model_server_config_proto_py_pb2", "//tensorflow_serving/config:file_system_storage_path_source_proto_py_pb2", - "//tensorflow_serving/core:logging_proto_py_pb2", + "//tensorflow_serving/apis:logging_proto_py_pb2", ], ) diff --git a/tensorflow_serving/tools/pip_package/build_pip_package.sh b/tensorflow_serving/tools/pip_package/build_pip_package.sh index 0187c5f07f0..31f4267674d 100755 --- a/tensorflow_serving/tools/pip_package/build_pip_package.sh +++ b/tensorflow_serving/tools/pip_package/build_pip_package.sh @@ -36,7 +36,6 @@ function main() { echo $(date) : "=== Using tmpdir: ${TMPDIR}" mkdir -p ${TMPDIR}/tensorflow_serving/apis mkdir -p ${TMPDIR}/tensorflow_serving/config - mkdir -p ${TMPDIR}/tensorflow_serving/core echo "Adding python files" cp bazel-out/k8-opt/bin/tensorflow_serving/apis/*_pb2.py \ @@ -51,12 +50,8 @@ function main() { cp bazel-out/k8-opt/bin/tensorflow_serving/config/*_pb2.py \ "${TMPDIR}/tensorflow_serving/config" - cp bazel-out/k8-opt/bin/tensorflow_serving/core/*_pb2.py \ - "${TMPDIR}/tensorflow_serving/core" - touch "${TMPDIR}/tensorflow_serving/apis/__init__.py" touch "${TMPDIR}/tensorflow_serving/config/__init__.py" - touch "${TMPDIR}/tensorflow_serving/core/__init__.py" touch "${TMPDIR}/tensorflow_serving/__init__.py" echo "Adding package setup files" From f8e6bfc5b6663609cebba13c87d6832c366bafea Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 May 2021 12:01:26 -0700 Subject: [PATCH 5033/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a86ceda1-04f4-41b4-880d-73472c850ec1 PiperOrigin-RevId: 374472613 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 57d96b3f67b..2d265c816f4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "32a2389abcc2ab77f5cfbfb5fd119becc421739fe6350c253a71ec049456ef69", - git_commit = "17911f6ab408419df6865e533aeb0b0788ef4e6a", + sha256 = "9286fdf277e1850104dcc2b2d19a74392bea8b50b4afe2dbb369c4603becbce4", + git_commit = "3e23480e675101aa4c47a14421c4432d277e6f75", ) # Import all of TensorFlow Serving's external dependencies. From 0d3b49cc2b5868827e2b6b59706eb7040314191b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 May 2021 18:01:29 -0700 Subject: [PATCH 5034/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ac7af601-06d7-4f54-90c7-a96d50dae3bb PiperOrigin-RevId: 374545095 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2d265c816f4..dc418f28bbe 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9286fdf277e1850104dcc2b2d19a74392bea8b50b4afe2dbb369c4603becbce4", - git_commit = "3e23480e675101aa4c47a14421c4432d277e6f75", + sha256 = "88ea161183146352886d838bb04c220a2cded341bfb1e8b349031860d13022a5", + git_commit = "82b7b25b1b6efe7c362a1d59d8a0ed8d5e1e7a51", ) # Import all of TensorFlow Serving's external dependencies. From 666df92e9574942935a5b513137fcf7c76daca9c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 19 May 2021 00:01:28 -0700 Subject: [PATCH 5035/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8d5c1e32-6306-4170-93cc-40ad10cf5c29 PiperOrigin-RevId: 374584688 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dc418f28bbe..bd8b19013f8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "88ea161183146352886d838bb04c220a2cded341bfb1e8b349031860d13022a5", - git_commit = "82b7b25b1b6efe7c362a1d59d8a0ed8d5e1e7a51", + sha256 = "314d069cb53692efd7bfc616d7e6d65b8838a0212a00a91c43e14ed9fe84cac8", + git_commit = "3fd3ae1fbb10961dd1aa6805280674c781fd4609", ) # Import all of TensorFlow Serving's external dependencies. From 152de4b4c7a36e25f9bd01e2d558846c8ce6f8f5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 19 May 2021 12:01:27 -0700 Subject: [PATCH 5036/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/64e9a78d-9779-479c-9ac6-c9c4b3c42a90 PiperOrigin-RevId: 374697837 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bd8b19013f8..3d2d9c83f70 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "314d069cb53692efd7bfc616d7e6d65b8838a0212a00a91c43e14ed9fe84cac8", - git_commit = "3fd3ae1fbb10961dd1aa6805280674c781fd4609", + sha256 = "51076475a49d9ba3f5a5bb8651b256e57a19ab46ceb9e3fb49f89ca2c3952e8a", + git_commit = "f5c7b0ef1d8a3dd8b09ab65b885f9f47b93dcb93", ) # Import all of TensorFlow Serving's external dependencies. From d03245e80321d956a87dd7bbc6f20fec8df16e6c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 19 May 2021 18:01:34 -0700 Subject: [PATCH 5037/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b0ce32fd-4d92-4eed-a96f-98e289bbac31 PiperOrigin-RevId: 374769710 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3d2d9c83f70..e6d4a19a064 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "51076475a49d9ba3f5a5bb8651b256e57a19ab46ceb9e3fb49f89ca2c3952e8a", - git_commit = "f5c7b0ef1d8a3dd8b09ab65b885f9f47b93dcb93", + sha256 = "2a1aedee60d0676a5f557f4066ce3e0cbb8f7ba3723aa8b67d74cf241f12b750", + git_commit = "3f53c94d55573aba3007fb72a47062262f8d83b8", ) # Import all of TensorFlow Serving's external dependencies. From 325eccf33dbf68298a5a88593ac33e0a74aae43c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 May 2021 00:03:21 -0700 Subject: [PATCH 5038/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3ebdd097-61a8-4ec4-85fe-68b4901513bc PiperOrigin-RevId: 374808997 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e6d4a19a064..51533881f63 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2a1aedee60d0676a5f557f4066ce3e0cbb8f7ba3723aa8b67d74cf241f12b750", - git_commit = "3f53c94d55573aba3007fb72a47062262f8d83b8", + sha256 = "2c97c055ae4f18d793baefe904d7bef0f37cd997d82df58ceb4aa8e2a2258a3e", + git_commit = "72088b0c4e38bbf1da804aca55ee1f7a78c0db35", ) # Import all of TensorFlow Serving's external dependencies. From d10f714346f688eaf58fa5cd60c00fa9503084f6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 May 2021 06:01:31 -0700 Subject: [PATCH 5039/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/88e3fe31-1266-4f40-a6f5-d00ffb8c7cbe PiperOrigin-RevId: 374854205 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 51533881f63..3ad3b850e7e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2c97c055ae4f18d793baefe904d7bef0f37cd997d82df58ceb4aa8e2a2258a3e", - git_commit = "72088b0c4e38bbf1da804aca55ee1f7a78c0db35", + sha256 = "fd34f1ed572a4aa5c6d52b270a1ad1668efdf0ef5811eb264f0e860022c4c9ae", + git_commit = "a0af9990a323b574737ed1f6819f354c9332b3e4", ) # Import all of TensorFlow Serving's external dependencies. From df6d3efb83f52290023e04970889853f72b4719a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 May 2021 12:03:02 -0700 Subject: [PATCH 5040/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/cb64d73e-a4eb-42ff-a6b6-f0abc42769e6 PiperOrigin-RevId: 374921160 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3ad3b850e7e..7f22c70ccc5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fd34f1ed572a4aa5c6d52b270a1ad1668efdf0ef5811eb264f0e860022c4c9ae", - git_commit = "a0af9990a323b574737ed1f6819f354c9332b3e4", + sha256 = "72d201966007e86ac0c07448dfebe0a6e393d56dbc962816427c48968c19c6c7", + git_commit = "2eb5ed7cacd56a3e05fd9a660151e800cb2c68c6", ) # Import all of TensorFlow Serving's external dependencies. From 48e5a9e23a1e0b2951b77c3e8f9832193d9b1851 Mon Sep 17 00:00:00 2001 From: Robert Neale Date: Mon, 24 May 2021 15:41:06 -0700 Subject: [PATCH 5041/8103] Update TF Text to v2.5.0. PiperOrigin-RevId: 375573705 --- .../tf_text_regression/01/saved_model.pb | Bin 4537305 -> 5131543 bytes tensorflow_serving/workspace.bzl | 6 +++--- third_party/tf_text/tftext.patch | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/saved_model.pb b/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/saved_model.pb index 74b6adcf69c6b77fc0bd64153f1c0d343d44c9b1..846214bfca94b9600d16d89db6f6465911b8c572 100644 GIT binary patch delta 167514 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�S#K(rzr>P%v&l`Ks|qfr&Og;9Fo$xn|Wi$?G&-V%=FTe+BoM zFL?q~zaV@L7F?j_{+|SueotFpYzhyXY}v4CQbBvJ_kjGYcM-K+(u7UV+f4O6p7~bn zn-_%G(>yHrdFs{B&}|+^>}QXAwpayB-%gNf5CxSi&~8@&p1)RITX zHswx)QzMpP0?SZQmI89T**z_n`nXNI-rpAFTVTB#R{d}CmcW)>yF7gcH+$QDfzM-} zrM{rR?lh?(u4x=komOe4<*^L;VG6!nmPH4) z;hxt{yJTZaO69a?i`Pq?uSeZIdtQJK8jsHsdosuO!*OGHOZ(m4T>4&-?|JL1Ir8lm ze$JTow0nvzRS`^<_bsl=CeIXeBh^1p=ips4e@R^yBh8J?o?zZ#AH%zjY^}popK!A_9JE!Js0G9{EJ*EVHo=eG>(NQE37A!my*MIFxK`FtYVL$ zx|zWAtHN5g91@OwQdoPF+44K5`~n4kT8p#szUGB&q8SUk>-ptaveo;g^{`teGfC6j z>AS)TtfBs*F5QZ`A{LrI{u=IVj!rP4W1f~qou}8@Vuwy|Xc$ZN-~;>w+9G8 zLsjg#Y;)&WdK>TAWw+G7Y1w6lQ;Fwlre|SUsw(DK_t;9X z{9DDp4)*Mk>hRNW46_3Ebr_^%MJhF(E`vicJRP~DZYF-5lRYJrm4h2fP}8ohJ4mxz zdD6Kvnu9bsm(!2@Q@V>hmvK760V>Ut6qd!!rT`7K)t!T|^xLFNn$xcG+-wR`S-zGQ zOH1tqQ`o)Y5-{R;-(;5dpHdl3DUfmyo@;9k(G>+ap0AgpJ6MoT>sNXh31S7PWdV-W zU+>{O-JdnoXkjkHfJgEeX@g#A0-pFAjt*hb_^S)*;<7&aztIZv_#{?Ay!5XvuS4ni ziMtlLAf?Ci!$c!9E(i|hu^LB?#XX(7d_6-yWQp1R77DCji2{$JC)(?X6V~Ny|1LzBUS-Oq77K9TM z;St&eJJ1irf(z<#3uVtFX;N(Rg8EYT*vdX3cGX4oU6QqTlKgN2?y^|AV-GF%ewa3f zTrl`$#RB6^%Oq(ZIW~BkE#XQmsNJhHOvdr70<19Sc@kpfzbaTdmNBLK<7ffxf2-gv zQ;)N!?W>M)Re?a2>sONe3zFV#SV^8A*Je=XbHIMjy`Iw^-TUuSU4Yitu_aQj=l9A_&Kt-eg-qzyPb~B!PkjN#9Os%OqYb{;J=$0 z+u%F3tu&xOnBD$n7LQvHi|Bvj-*WbYP~fj`sYgIZKOj`~mxEhh|_T z5$PP~dpFR!2|CBF%?0DAZw5YQ!4SwcgnKpxX{pGsRm z16>|Bwanx7jyGe0;NDsny*^J%btUzgr;8UZp!JW``jHYXa*39~(OU}A$IzeAHzv?- z2}i6&b-iw#u2)@K$aIEHKI)WrTj|(>X6%q}ZaUWzEDuIv`@#)}$Aa!mX|VL?$opxo z9XN5c#goo=?_&MuG*l;zL13XkJ7__Y_hacr${S=e9kzY1?-kLJzcrWlbkYVs`9a{E z9(dfP)cS_r457b_wW`d0<79Fism{|)jL2%=IpGT50k7V45YH5&wzkz8J@cY7I=uL~MfxGqL zWq6QHKsz$ba4L&!YVj@`dspsK!ZK)-Pe8$tZ-IXcI9z$ZfK5PoioSqJHfe0IP|YF> zEIu|J?O1Q}z|Bg>Gxf#wr@SmtQa*A?j2(yn4jp+fy}(=}>cr&Aq5dRq4SDvV+&;J# zk$z6Ez2?oq8Wp=H2SX~=wC_i?xp>Bav6Q+7`CWWA+*83DUUu8Q|8;2@-KB>4FhA#d ziSc**yY4*NbFem|g*zXpWd;Y>2*vjR?;7;7JNWVW@>QE;b_)y2+aEX>?Y(w3yW*9X4)!y3aiSjLB`Sx-0jpXbs z*&zo5p-8n0zBfLjcB|(Dazs7u*i-90uV;+m<6`r8E@wWb_=3xniA(jlUX;%EC3afkNc7{!mj1UHO%Cm-U7z@_!Sk zd(ihiOJ!wwdF|$s0S(0gQ5godj#07D6f0P9rqq09X~auKw0gLG@>OU!|`;@Zk7WllL!UY3%-O^)0lg%7jm1x9J1Z zO(mF#)~!v%sfcP9ySv%eX*v|UZG)-ZHCCaW+fC(C+@z2?7uS_oswyzO#EMDVSa1^4 ziZ3h==g5z$fQ#cZ0NgN^28Wyl0j8?DX~0xa6obC{n=!WgS5}xF{2yFN{kzXYp5x}Z z{FqPd{J(pDka+4PMr&VgthCYr4-RpypO)ccYZaD2IE+0Fw&>bGbhLUpY?WRL721m{*KtHH_;eyT{4<$Qf|EfwnnVYG7+}y=Xc`ZMb-E<@O63q6+|zs)$4%!ebpl-nOMrJ>Ka^Bo-*^%b z+pt$sA$D-DBp~+4C1&Bm@Delp@$6>c$}(5MRTVUW3ktME1an)=vKPoYcbsn$K$Xd= zf@&CS$P;dXac&b($YNxp6ad`XYL2gJ3E<^3kNOvyC*rgm&qRF{VDs4ZW))rAACfe5 zP4e;O-G|_oP(xSF#?W={4Q6$%w3l}?~jOP(<{sSBNMSX)(NZ!zGq6b{Cp%Un{9D3lB1Xa z82K_j+xjGdj{F0508t7yQ{tV6eu|aAxH@2}faz)}z94MMHG;%vT_b3G;x(-9EUfN` zPrZWuetrv=y_a2w9eB;FJsVmH6HIFhCWo|9yC8>TSB`rBzuRIotFD|#SH_92PRoX8 zWsWmiz*6WM4mTPBLryUHfhVSOvbLjB(i-_Q|PbKuu3<%hIN~sp=S%|=-yhd zP5ybN+-swbb!Hqzyt!c;1={Qh<`7oE*%XPdA*mZg10NJD<`X2Uf6%mw?LNfr__gQY z7>0AwW=gZLiSr|x```TWyEd3{AT@*q24K#FSZA;F)>x1R$`CB-KO%i79jD#nrH~~Y z2*S_nnb0;`o`&0@zKN10Rxm+2e=OrN8}Ac-nIgKdq)E z+?OfuvdQ;AVGG~JPg(H;l=~0YuJ}LYH(YVIR9E6WCx#WK$;WHh|G(4RZSuPr@=swV zb^%U8@fAmPZy;C!E%A*BCOCCEs}D`=ttrTBrM5 zw7&Rt+7)Lc~+0D=I!aZr>kgoZ~hgyO75{6Z*B&<LoN5Ld84vg-|UYeIZmO#4m&z z^O!ap8w&!0U@U}kf>;O@k$iQ4x5y=EI1bul z16KxLVj+~LUqpN%RD{)q&<{)HmlDW(8wMY2O$2EuR$FWiR8+=#pRNC7ESm`Y`{?Xx zj7k`L*b>dI{k4m6fIb+*DF4z})(SPyof$W2#Ni>nlNiEzW46!Ep4me0qdq9{GzNsJ8NNz}QG zokX6av6F~H?D|e(ByJ}WVSOjjNTTi};*^)RlZaD(Y$p*v|A(DK91GKT62&{PlW4j< zHTL@3(f^KR+lY;mwys}ZD&KuNwPTk%C4#+amsOT7&5~R#SmwAUe>S~(jcy zNz#21TzbaL>A=$dn*f>cFe#bR&G#W7kuM__+~!+q9)6$>k=hA5RI)F2(+=M}iEiG3 z)Z#qke|PwB9+E{8BC}8{{J0_~vxX65aT=17D-5zY49UrCLs)Q&vyhz3tVRp6dRmP* znb|<}#ooQnw=|0~_uvpeKbQ8@?Z{LMEI->wetqj&1MtT@x^4%}c!^;D6J1 zJzD__#SXsdd#n(_N^uiq>%V>Xvq#*nfq(g&*dJVl>1H!lxzw}naz^1=w&qn8JJMv? zJ3Z!ITzHp+Xw(tAeDm<_RxfQyE>LVBRfS;Q1$5WOa>9Gs<6uxLOV_Q+p>9qR`wukd@e)UExZUVKs8yB!z!704*a17;MkzuI{vDOd5 z?(CYYtW_cw3k7&37EkjE3Tah2s^x&UV3JxbPnBEYX_`gwDhar79tg3MsV$5YU0bnd z-}b6|daSS0dQL{{rB(jRB{OaUstu0=)YB616vD}An)`gTkdkpynvVazu{efv(zXTW zsxU4qu`}lo`Mml{I zf>oQ8Z0zE$Kjw!O%s)nR)FOqes$)Ufmgl0GTWq)pI}3&ud7B;e6u}_JEU7s*@Uj1} zgacq&H-Ybn?d&ng4LhqzYW=t>>G--}Db+75@^V@X=A3gCGY*cacfXh+c-r0W@vAS6 zuru^9VM?BR^8NHR3k`YeVH>6%?*&b*Ms~!59SfTrduEz#oHKT%r)VEq5R2jb+&Ob& z!Ot# zc138Mo;jSzQt(!P8oiShhh}!GqAlu7HD9 zU4anKanE+VPvv~nny-dhzOc@th1dGik#O$PVKI7r=^|0=rbR&;!I47^&kW4DS&6$zC>nSUftoLx?sFIml z%c&#L>EUuQzI+!veM2aOrDpp|9Bk$?^!9SGCf?-FMNIp@0t&U>Wv~>ny- z9yvI}eo~+h(4gn?rYHRz_jF@+W>~YN-Db+jJWGi9aK+ zTwL(Fd{p-KTm7fgy63B`!h1WjJfpv|;{ks@-ThY_>U{YM%X#obbL;_pei}ici4UUB z^GA5mno0w2S?7#nhSS)8Cin0x4r3q!8a zh$r{hx_&u5e9(VUW(XecM#)X}Oo6HED4r?esW&&5GW*Cdr_65hXxy&!iKFEixYSla zQ);Za^hP60h8q0BVTD16cUUokDjZe_YD=^2JS`*cu!7Sg)cJv*(YZO~t!BAhwOr42 zYvBxwGuE9{(8VnEaGzL$V7RUj1jBU&C&at15FCc<3PCVjSBNCsbp;QPFn4^8D#sbb zT~`PW?z%#Rx$BBYRG(Oa#OxV=)6ubab8H1#w%moqLz)W8rH!F$q;aN?gu5&(!%RST@*J}&ClhQkGU00?ETQV%!ss@tq2ko>x*cnHg2vm5t;+if%OwmCgE*4+)OyT1x^eh$yO zt9f7UHW$s+c(|Vkl#uy};6K7o1nN-t6M?$Y{Y0QXH9ryII6o0Q?1rT%cOnH=@i!WN zB9O1{Cj$BEej-F7?k57_;eH}`8B{+JsC4EhLa=Z@5vY6JPXsubp9rix4)?<)2+xg! zHCAN7yhOn51FIc=to}eH?-I-qF71|i?Q--6sT>NBD#g z;k9Z7$5-~jvoJk*L#6Xo6K>J=%UZa&LdGA~mSAp&gZ|8*5qGYI%7)P*5Gz!l5aJpt zn^N&5mdLFIrh z!W__fSO7W}!Qk4`VgNc{6%&BY8NUh8HD=uxl^_^^E(ivob3#0z3l0O&1;GGxk%R*} z51#<&g31A1ggKy#a6F(3(kTJD;N^hcuK_wIu2WYJ1)y`%w*dOu`7q;--Ul}YDw<ZEXIJFh3072&EB+a}mekT#e(0A$2&%D*d;^ zd0avj&W%oUDsV2|!QnhI63*iZ9L@#7fOA8{csMuGEkL1F?*a_YQD7a;d04uC?9jcL!4%HDAs?jras7AC7)ewY1bwq_~EXiw7 zjoknps+s%(s(Da_YDlF+HMljXhTv>s&!Ji^xN1e8Lp63$bf|_HI#fdp9jYTLRHIIG z=T01|Q3N)V=1`4VU{Ec1I8-B=K{fvoPz_OZs79mcPz}j7sKy?S?$U{en@#; zuMXA7SBGkmh(k5P!=akXr$RMK%b;4YaHvM1b*Kg>gKE^zaHtjp4%Ns)hib8J#i1Ho zJ~~u${(Rz4jj-YE&b$$6!D;G6qzeV9d(!-UKFw z)YY)T!M!&L!w?*))$J;_`ia8oNR1lRks4LOkedGhsh?Dl8t-|}9}!|lJ0xkeVY_mM!8qEQ@Pd!)DpI1^4Z+ z9G6gqWuwoW3M`9va9FMw3Cr;W4$FdIz_KA?JS-dO7NC|5SVn<$Smt2?%RC$p%YwjR znZKfmwU%()<5BYzuq;>&SmykI<-Hm#7gh|PWEYP%$^N*ZXsR*EhJ8&o$%gDYa$|a; zBR8s8NA8L^!xBf!t^n z9l5zY0=Y$)BlqyiHjo?DI2^f=F-PudzVgSX*x=#7U5$Avn^vQ1>TVa=xdk!B2Ak$~ z5f!QfH)?_bH~#@}A5wuEuVGW{lYL8PgP)@~-ZdP>IbkWHN1!P6T< zanKoxi)fDG=z0vrVTo%L6pyFIqqspoH551a1&SMlcoZK&6(}yK9K}VLqc{%>6vv^F z;V8~ekq8v$jNgRf8nce#f?%MyAQ&jl3GpZ{I1CgQ1OvrI5{}|Ld;*FKDo1e<<|r=0 z@hC1xr-b5ycQ}f3;ySduf#PcT6i^(!Pe*Z>LGU%h&xKf&;wX+?cHCaHR0m+No5MKI zS-?1KNoZFP`RrQ6aTr(QhR?2XbKu)yJT9RM<3^`B6&M%q;4oe}62{{R9L5E~fN?{_ zco;X*EkHFJFpdK2FwVmQ#(6j%#sz`HIDbVGYc3ted7c8s1*-w$oPQXMSDpfl|Kmp6 z1$YNXZ)C5dH|%Wa=#84y(Hke1^m#W#(9s(fHFWewK012iS|3Ai^cfw!5v`*)T9Ki5 zrHbA#s-dAbR&MlpH!GPyZyr?98&c`$4Q>s+A-Im-YL&#HH|(J3=nXM+^oAHZdRMCG zjXD{Q-Y9~O-lzqJ-hzjtH=-GO^B;lU5Jg9C)Rm6jkX%D=d^h^Mn}_4k8`)?;+^ z=KKP^5!TV0(*=5?Rdn>`@(A=6VUFIzE89SCRO4{;M$5z7n;A#U)uld;-<8~LGH5sp z$M74SQ^#+1z);{fGSl!IRjT7R>Vn}n|1t0zB{(U5<0G1?PQ_6#Y>6B%91h}~uoUzW zAP#;8;wU-;aihO_5jH>^bOz!gnu9o^;iH+k*u{oRW-v-WO)PRt5$4g|T%pp!R^?4e zZY1YL$&J)$Njk&atUfhaekZ}>(XoVzo6M)Ffo7|s(VD1bv2CUn(PRrLUz+7HIC!b*Ej%YdC9HQAVjb42Fh1$#6dLBT0spxUH~FU6*8Y zY0Ds%P>D*ONOP(SVFu&Z*_aQUlX8Z+N``L9o;rV!%;^}9W~9u-eSFxm{dIOF)!&qC zV<8;*`ycBW8ok=G&n&|?=bJTka3hZQO@zf#xS84-3D!#uYRZB0oJnfRp$E!lnnU0} z;&TM7%IA_?PsjWfr{mNtD67qI`iENy*$oz4G=&=YbY>~Nl2@8Wa6gJYMBZdfPA$SN z+JZmdc{F@JZwvl(`Rt@@s{-?vr>Wd{zQ8;q?g^Jpjo1=@DUSWIV(Bc5WL2)Sz}uRZ zVH#^yI{p<7Exq-0W)Tz3uD0%MohO^xTyDGmm_zIT4EJa}2jqCMxjsHWtMXI5oY&7w zI+Hg7=fx8WcdrTkfIr{G1fXDzinC!wv8sED51j zO-3@6pP>Yk6Ez0dbi~cjuH+dLaVl?m2P_qrU8XFQtvu*be-v5GtmZN}Rd!IzP*1meq21U(>+w!&3l*g<5iiNQ#oqDFB5t+)=J8kNu30e_aL&|Bg1*Ry2@!8te zZ4h}jICA|-HkCu!CBdEF+|z>F(^BLlVX~H=eN@hef$qUOEY;k(qT3;-#K%JLRfuo+ zqh;zX{W&MZhLnpC+r7#*wWqH?H)CYta^-n5JSMe2WXtp>GC{dyMkv0<)rzA(d9lX@ zNP5`zV0vJVBgiD3$ zP&!`COe9;jNpen4_gU<|dc)DesCw=D9|gG?muQVyUUr$ws#XWCd=LI2IhQ*SRr;+6d^KzuB(Z<=n zG-}xDig;urAuHmQ0t@)OZYt8C>#m!$>#ibK#1X%ndPSawALK64(WESK%`makvl zzNw6j1!7onQcH71V_NdCI0c<53D-7*>CCpyv3p#LGE5blG-KnW=W_2ioyvv<=!?U6~3_}|4hqrrN#-z zhbfqvUGB`F7H4WH`}jokyyY9&*&$^o^Ze5ONOB$%k-t4~NoKViVx(MtFj`_h*0b`duN*q(1V&%Wdq+cyBQyPSSr!$ke><6UF$`DnHJKIujj=vSfql@v-gquK(SrL0nbdu^t3c}wRIwlD>r-z{k=3}4vebON zHr2>2jdt1ckp$18{f+i~n}ffHdj9}_bW1ndU37Fm?lFAaVM)V>wKbT!f-XJacREAL zG7MobMiFwE=Wjk=$)a|4Ee0M7UrR1eX2TncQ-$>|c8?Ht|1;J^^G3+(y(1;xHjeXB z!z_EbnSIawrx#|a;%J+ zgguy(zJNFHk-JkeEq`Mr3|{Ai6;~RpN>yMD>)>_HZ18obI=zxYTj%G_CdYV`m=(}k zu6z&m-2GuPtam@HB%oxDyEE(gaMG|fEkl*BVS)mGHa9pEv^r(|mlfey$`nzApvyV3 z#&>_1EHh(pxasicvK&az-WpiI%Mh%^=*-K|zj-n%gE!r&mI2QhR^`vE5OcHhv_jA$ zf4~*8Dc7dCP#kG58bBe&Ne2$WR}L#jT3A^Pg>3Eejl;W?s%~&)4RH!aIy-e&S7sxh zBVDMLEIRg@D_cs&m7^(*E`~(yD^@JOU>@_Qt6YUIp?zVld)Sx4y8h|hGTy>aS^K4{ zHY%S<@b29^(Upc7EIVSV?s)UFy6V~<`;zie7<`d=%1S>VT+0BTg1u?;nvI*+@T^Xd z9bYCJtm9aeN1y=FR==(2#Mc1!R_8aRFy)-*$=p+7V)id<25&b2)uJii2|49d^_wlb zqaO05y!$Dl-Sf~S7H+%0v3kwb@WcKWv3>ouV<(S zjUVGdNB)^iDwUrN6=>a0t1^exYbNBtAX=*398Yt zd1X6{nF$&N4UO60g&65Q>vQL3Vr*BZG+GqK_BDuX;2-)qy}1J&){>=L(p!*CqW(~;1*tPsqTg#<5F#AQ)Nsc@?k2nGxr>0 zQiHg-=ErU7(VE|Lvm;!iH%}E)|Fk(lXylxrDsFBwvJR4WDY-tMF)s*VG9sqZ)!!f^ z;^Jhi9$m&GYs=!MIn@}hv`I|4G0hRhZ!%^$h*UP|r70g-nrdDer~oPA~S zbDVNyBPKEErp=BCeUE z=jxLkHRAF+0+=k0v)G@oTsSUUla1O>bJTMI7>}ad40TwGD~p>@;r!|CT>X+Ro}vmdtWo*A3Tw@n3vEw@ z5^{k((WEx)|HIy!$HiS;|HI$UEI?*pm>C8bhHZu=1PCxQ3=Bguz>vfwCK|H2MFXhO zBxZpm#--K}>#kK0<+N%PtkyjtwK`fiqPA`|lG>`RONe`Gt3hq8b;x{O(5jS1bGAj?NQ#GI&oA|AF*ZeT4aOqoyDAUBfQxR< zqJ0<{U$L>`k~w#$q$c;>?r_s4Tev8tD!{X^Otf|D?-a`|S5J5)WjZw06{UUcfS=x@wv1lABU66B>E+SWFN$QbN zx|pyHIWIPU$?{}M=9K7^BTL_O|J3;TEx}j>1A17dVUq(LdyQ(zSg@*vg!Iyn)iF8? z)RY3Dy#*{cE+7sM!Xz^HcmK?C!;~01==l)a617K$r)4K6=BnjdhV=Q=@=te3KCs}p zT$w{!BYw2_=hJO~(>)(sG80vfMjgGlH`>)+n^T6pY$Rr6C}7Z>7uj1v`WszIz-e(S zq$1T3+j@E(U?SKOeUg$B?Orn9gDZbGeUg%-cibo#NQFZ(EgmOwgSqHwY}rKM_9J=s zsSY9;xN#S@rXMlzZCj98wA{ zou5_NWoulE4r|ThXXhB4ygS7^Z+H{#)Yi@G)||4cwKiV3mq!QQ@aNHBZE8(DM$bes zdCX-@6u?WZSQeeMXNw&c!vCD&%fqrZaa_lTOxO08rsqw`j`Tb2S#7pu+b2pO7AH*P z-#c7p$G8ZzyE3~)Zj5Wi##kA!WTZ+8#g_2)xt2PyL*7$w%aBCc_e^Gfl)(#OovB)- z-}ZCu<441`9km802J|?p_~Ys4gmI+`7~bs;Oh7*wa{~IwfH?YvexLho^ozuGywCL8 zr8kYIpWJqD@Z?&{#!*rx6_gxDLY%v=F&`~RnC^!}If3`&s84LlF;wQ=pbX#x*%W&7 z#`WY+Du{JiYm&y4hk;jcv&>jUgURrPlp6>}fH>q8w_>_EFuKgi-23h>Z973&ovz#ch{rSqZrSY3bFCQ1B$c-!(iTG`Ce6hKZ28@a1xDPNs z;zNg)i>t>GZ6qlUNX(Gov}Z*&t`HwcDK`VXN76XDS$MpA$eN{&r#UqAR*Hi~#**=( zHqnjyWlX%?d#vdkSJ0wmnJu4*7L6;|^bIVc=xnY`gWzQGitKEQDN-DBAZ*gXOH0gn z*Y-(kF;^y%T2edz!|$YawcM=ZEjI&oYR&0WqZN&@x5MF^ov!}74Yme;Yt0$6Yp=%1 zmppx}R+&H=b=Tl2&^Kn!v{Tn&N3n+m9DF>WpCU@x&O_~_>Hm}gmKIppv7rX3VzkJo#yzl z5eckzT+L$x@117NGKo6GM#uQ?F@%W9%*Kom8m$W4IPvHhfU$EN7Ju`eE_-6Z3L>P_ zi=CqhX5ea} z-J)DRV{X)IPT$Y$M{(F3sAULc7bIAAfB>l}AP#l><>)zQi#j(mjFYT;xw^ltSs z;zX)4%jlnL&yvbSf3B@nRag!*ruk@ZQAPq(SU9TGTWTc4t&M4~a4fM^ETetrJIbhP zaUf}o@)9+@;J~ZvJ1lAZ2|X*Ra`K9KKD15tn7tc> zddcoT=FHNbfMw$2f14H*q7PO6>V+%{XQq+K8dcAzBQ!psAkP;9HK{TF?R9V_SO3Sf zpc$E{awH#wPMf1bCtpp+?; zPQ4?5&=;FzR%-j&6pBfJyp9f_m6q9Q8F(swbhu&;!xVYMz!Cx}`+-mgd;U{R9b$tY z+Fg~;XCpY?wR_iSd0z>KQ_o-zhdp1`I;BPy2jI)4dz3ejNN%T*xoKuqjgJP-HswMP z0Dru1!1_X^A{(h)S1R)v+>p{D_K%!e2e6hwd*-JdOE=#G>dw2r%B*Ft&b2r{Z5qi5 z30VTZGIcm(#`$-*Bb{!ZZcpUn&;@BN0ui&P-f;zQk=h$7`0!99&ppXfFN7)xx9bM^ ztnlDFI7rQsxeQj?_1F=59+**p14hKbv)SuSL4DldrkSy^)xfAncN$Iu`P-6bm^V zxq8RXm?L@qR8@#4utX;vr0E7UGIX`696!77b(G`b5ROY7TRnAx1s%B3WEWyHyuhKe z6oYYy0hBTwQV|rcI%E<+bP^S7Ni|E4}}fn&KGCdwkd-J(LoWDDes%ILcSmHPG}5S-k*`pI!e%?Fk4EHuG8yZA~{2PuF9wPWk4j+w#+LV!Cwg~ zlZLy1n%Y4U=HK`#)L~bdPx~HmOhvgOVgF~|M$x2w$9SDO(IV(xx~RJW(tHu8fI8aT z4Wd~HDbU@{twMDi)RvVS->OpfbyCxFRs(7px&~cVOd>Pr71YqqdyA~1dpWJnaVl2w z#vw<`xFwv$7>-w%<1Joe$CK3ORG7HgOvHoT7LoDas)`_DSb1$=W`edp#cE6<%e`1Y zpSd<*hMta{LQmr4eB`pUkeCVlrFVSHCm%fzn$qyjV44xbaOk>#1M>-mlwv|4(q?h$ z;aO|9XvC}wW-&-YQw1z1VFEg z3r)Gl#8r=E(E?224F+%{fz;VzIe&~g%4xSw?#Et`gfDjHf`i0&J{F(9W9 zf2s4tb5Vslov%$(>w!=_Uw9}5FHINdo5cWQFU+4?xH_X>&M1x5L}ctPME8{w-25gI zNA4@CTp;Q&@b!#r0gevz2O!^m0qWTTG=0z?F!TCop^u9!IZQxqW%pJ)6B9W&Xn0n( z0nAOL8w#81w2MYUz17BBV%aO20KT|SUWypjoK+se`1JfjL0;^uNiCPO9+!*W8x0&*|&A1eyS7Y4vD7(}+c>R`P>(S)wq7&u^52&Mj~ zJYarLnySRH;~3@(Kqv^$SisZaU@4y|4%tQzv21kc8B;pi!O>`N zRcac!ixY~+Eh31{Ik;%?`QEjH(}k|IgMkBRf{|T`diL+AI8s}zexU`CkV0~UhC~$GClkNi^?D`&yyp%_;N_Xk}Vx z?*WHB-8!}{LS9xxuD2Yk?5yh=>j56Y=mOqYxJ+&w{AJ8k=gu^fJ5>xI3-!#-bpX%0 zXIQc^R}k-Lp)niFMM^LEOge``N95+vu*p4NfL46vYPW%@w)fZ}Vmz-F*1CV4HcN0; zcxCB^nXwMM>&OGI7fE-8(N~$2@}9#E#;Rn`JYFzXL{8I7$%3WXQce%*Yr&|-Ubqnf zcg(RSOYwsEoHuj2yl*4E&d%~Uq*OtEUN%Esw-H~*J!;O03!FF48W(u>r@kDW5Iu;v z4=zeBkauh{n=Qpu_fQT?wMEdp!tz20AY`;=Q*p#?f3s3vtPvp}%re<@zhXg&OtcV( z!z>*UUv;1Rl6B%*jrdfr)yRk=m3*y6xF4LFRx7Su@t5i7B^%G$T*Y`sT&uD4+NV1t z{Q6ciaN<%8B9`eL;#LjvDW)w~CY(Scry2EJi1-BIpHOgpCi>0BnpNpUBnnB- z8j;N{OET39a|lUhiG?cdfDXu1)2ul02j78+6MsZ6LDWgA*R4%9O-YL;KG2g=kr|VP zRCCU%=mO?-3hc9vjLAf5#>hl!4wH#U-KxW7BGLSIf0R|h0@8>F%SNPfOEn!hAuuZt zRh6lZ7m+}8KSo3nXQNovo`E^%<(B%Gq=Yqnc;e5rC#h!zD4;X9VeG`m*@rk6#D>Iq zT~Df$TIOJt0R!g`xd6iDl2`Pw&hdxJzTuRM&w-b)_&klp2R`7ixMZbHYjpz*Z>JQQ zlyh=&eyC;sy?eS_@NZ6~!%Y(C)oN3Z7kmW{h)+~69Kybzc0|M<*TsJ0O<*ZOCWZ9b zc=X^22uxhmsZU)Z1S0IIXKl(X4$tcQa|H(@N0ASnv-ZI{r}Nxgx7^J4`5n67um<;m zN4yTmN?eb68D@BXlv@NXQ{*rk+a%WIZuhv;Bmmp}YCtyJax4g|6p4MV@aHeR^LK=9%UMM9Zyv!}GbK|KE+()7TOKP^1h~!ZFg}J#{#Sryq zv1}nMM~XBQTWTJ)d}N*@FpBsxuk`432Ur-V+~P-v3tle=1t18=Z%Xku2_YT6gpjU? zI#aV(Ng}>qQLKB3;Sap9i(%!W3U(Kf`z35*LFTsuOGRlMLGO5qX|rdoB_Cosk$eAN zD;VsE= zQHY6z<$5V?7_ES00T(u~7aXl9lcww6+<*<|+|i06%D%TSnOz$w;s?>rI~wk#Id1RR zD$tJ$ac>ln3#Fy{9UJ8*h9_I9?`p;tH1QShnY5?_*`NN8KpyMiKx^z3Z!T!MdkbU* z(`odxilfDJa^Z@DDk0gu+po%TGPhca_@)X#*nD@nl$v~W4+K27&&QBFw?J>8&y#G$ zG;B?oFRP5tsk%40#+I#?LLoVssM^T5P{>e7R2$jh3KDK($Z9|RmVG0Y??O4JFLdYW zc8Edyw!Ms}?YS0-&i35^42C0ZXv(}}Zxj1kIIvZ}mC^C;($r!WnEc4XSWGe5DkKcE zZ^dlvAYkKZoGxFAQCKF46u`z0uu#VH8-EE{2}YQmUQ89(m_up!R%->A1Yh|>lw6kk z;_Aowmg92-=ZIl7Fk88ti+$X{RE+8l1MULz{(-+#UUEQNStLa&%uDzy!epjmG%`)a z{6LCg-EWwezy-j@*IBY@v9>Y?W4=dQIUTbFiB&do`_$|_I=I=`BDLj^LeIx(W^82b z8N5sXtCz13x%T+yj)nNBG$RsG<<5)1p@f8mtIS`JO)>l1^P#th8omxB;vc3LBw1yygI)L6iX2UymG05e-Zeo zxgxtk0BsR(C~QsCg}ME^Kee;`Yj;9@37Q}Rhj*B!AepFF{|ne_m8kyr(FPX_erwqB-03^<@Z0$|5OHVK$3!%>4Vf87MJFNL19e(9Yjr>R!UWLZVX4ks;{0 zCZI=i;66@DRJb9WR)>>ZOJBET$ze;p5UGF>gFV({b2s-ir}7V{>e~xp4Fm_Z*$p-+ zOgR+!Pw}#jplc2<#w-zWmD}*Z&g@h@4S!<~iLGPAD?x`l_UW{Em78xg9hjY(gK378 zr*|Ts&dN#DyE&VJF z+3@=ncMXDbq--Uf)YY1EAt76-;9yv|fqt2~WH)55lY1v5Q>(D&dQ2T5S>Y=1ms$ll zWpQvss^Cehmws@-55iLn^6RjFjFv946Y`V_a=qzSC%HeZK97cLY)6XHJBuoFg*eR9 z>9$jUtxbx<@Rg7#%o0;$$Nu{yMRJLu4DT6u^|G zEIVH@;%+*)$!&lk`1XM9q{Bv?kgW*5;i|Vu#N;_XI;mV)kv1Nm8g2LSsaPAXFsmXZ zW`9Ug2$2%j+Z=Z1#0gelAe_(S%Gn>%j6XvpUcv4NF^*5orNNgR$H=a*W#vlvcHlPj zL{lS90JtZ1H`)qWz6wTrn`NtDQgB2n1Si&`ftg1}0=OXy-4KwQ8?i9+#qGdwfg1PCftP&y$2diC1x9E}& zM^4{*=GnlBS=b^PVXrQfcvJYd9bsD_D$HMeU?-rc2c%?{AEM}4J&GInCnT5j?9G0fho`Pz=SlNDTb~>M&Ab{K@rYU58(G(KH9TC#x z7Nq@ttoJFO>gDX&v)GoUgQzTx;GaeZ*QHLu_~+Q`H)D>^ zK3!nlp0FiP&sW574D=u*m>tuyj+AmZdA1nDr zw|7*jBW&X_?VHxLZ`cy~UbSKK#!bs2zSeX#+E{PEqZpFmX16X0 z9lgM+u`6XMhQwv8fk&1(+2z~H(hMmlw{JORHPm3&Y{1n7t7e+wEuTbf9sdS2ouF-) zLK8M)OzVs!@4$@NWY(>4uXq5jTzn;kD;1vo5< z)go)UaLwi|xWKY%)7DjvX@|uc(|}bm9gh+;4Ay4_9 zn42BEB2N%$BGQ&k5N}LV;)q+iK7af`Lc8PYD9L-uMC47MfV{XEG(qX#Lf~&3vlA0| zZ0v6%us6Q)-$~#xF~5z#-XBQdag~dW-iZi2wq!AWSN^XE>~(B2Ha$Fr{+af~G zmIfZHs-SH*`_s2!JMdjG9bc==F^;)JvWm^(*z;pn+eE(K{xDc!N8IQup13Bo=Wj(N zg3(7N;CIbvm3jWa`trg$o{6dL!@w8BlDhMB`(srll4OUoy>TfV*J}(F6SoDKPDG$@ zAzM9XGJeTzns8OB#{+E}`7X#NfdR46i7?6tpNv-W+vz#c6t0?NQ@)F$suDF*lx};h zs`UHlsm6EUlGeA;(>ob@&YXart*W)h7dZ3^+TUKpq-?C=o2C<&Z(6E^t?vrncwV6*_W8v#IZtQ41 zW#gH6QgIXQ`7}AS4L7SM4tBs4qv&msv(>b8OZygd?dHwLa(x^E^vOcwGmQ~R@Y8Rr zRW#Z*hc!B)qMnZNtHLqf*6RAzu$8oK6?n@GPVoa-teR(QG;wfj;%(@^av2Y&sIl z3JfOoTL5a!`_8D zdo0=8#*19boCb^7^{UH0em0z8HQFOG*+WX1-C$J*ltczH3O3SSbshTN#zorZI9tO) z+s8~N(xvy{LF316!#&pXAc7r8m^qKS?$FzXB=x|GR6D)269%CkA4ppw@84F{!9Hgmw-M^TpfzW`{*y!QDTc%Z8wKzm&OHNUi0a&^p+Sfa3dI zmJ?NDRB5I}y#w0YFy@qInup7pcyj(hE;;pFuR+$~&=HPE9qvdo=pGVvm}mReI#d9N71FKSJ8Z=(jFjb9w z*A_R{CNR_=@4G9Y*V8F8@#1CMI%kp+3reOxKWCpy*132$FXpRSKzfM@>SN=?v_wjZozQlvHM;4dMq8pRMC1n`Hp~bsXr;%rYsFaKq zwZpF_i`n5X^QgLOyc=4IV7|1){^+{)rkt42Bfy)Tiv~gtdK5z)yP%@ph%iMYXkG zH_q0+8YXP*%P?tc|3NK<3i0}4UCh>gtbZ&Q;Yql-*wVm$Yz#;P`&strYqT)PU^T4U zcuIYfAOnTINXy05i(n?VT3nwMhW6{m8`_Wa&^msjp@HK>m4xN|n6dp>9pjDd$I{|n zDeMN&6OCd(iNxZKTC_cCc3-$vv-`pwZ+2hxfZ2V$asl-phqo(5nX{O*QS1Anz*4H1 zj_YY^3RvHF(xB59EgWqvxUMQ8i`)HiS^8qUo;~n$wjEoOEgzb#lUDToK9H2H=wpmUt?1XqtmvcjB3ASf5mxjy zuW4w{En*@ItM;)0=t3UtYw;8%L5Zv4Uuq9?{4faTrdnR>L+q(INkxp_XvI{ z;wyFIYU#l(MS&)2C7Q@0*R0$ujU$VOt8lyQ`J*c_H6xg!R$>a=b)EoI#QToJ6tSRq zOcC={F-6QH9#f3-RWXI?D=>xX7MMb~RZI~WgDLP8#S|iziYaQxV2VhrD5g+7Vwghp zh+zuh5sxX<7%@ztdc-h=nnYj<;XVvgsJ;SIsBVENRChe4P`xI?6txjdp~exI;+DvZ zxx#ZJrY#7gVhZWzH+|%S&cr$35)3N#hEG666_~MJy^1REDxY}6$6x1{Z}^CuR9q1l zhbz=Dfh%O#SX>bpk1Mzu0$0SvmbfA|4!#Fh;1R1Bu22gQxFRqfSHyY5aE0m_!xgbQ z#^Z`u+IU5rcxI!c<&^Uf~ zohJe4AV9nIwUN_Mem;V3d7e=NGMZyeV+B*Z4aSyCk#6SnHRLtORGnEK7d5p`*U>MI zOW@GX%VwNGOE1OZj=q1?T&Q_WkqZnG&a*~?IzROlYJROHPY_HUg)d4jrA;p|0zh9r zl#@fh8kQfS!tye*&cqw?h}CSG9&uaVtlUKIpeX0SEK~M%?gTq04lT4Ujn>`sxi3xg zo*i72{4Y0iwyD7r$9QFJA{CLUd3YDJ$qLd+<-0<9Qb1;(MP{SsZF9?|E9 zB)UQ^8C~^MU@=G9waGTN6e+Ql8e3p1l*iag{HWLpNu$^b?TBJ4^mqhYp~IutO1R^( z6|#?FE94u+R>(Jst<*#UTfsdRTZ#HfYy}c9wo;=AY=zcDu@z!6whD~LR?;Jat&qt$ zY=!XX<3a)X0MXDCzz2~|A}iY9Pq0cX73e)Um?@!@h>)-OT!m8TzvyE`qK+z*Qr!Yd z9o7@+^wN!Dkd6aU0Rf_Pfx2ohDet56#A`$WiKFVOJrYM@G(~Y#AcmvRQ4t)40^@NM z>cX!B#fF*-?r}Iu4UFL^7GP?i#*`sZilsV`Pi-Z}W`SPzwW)wg zX?NfzJKwSsM*C_^DylkAW11McaE{bb3so4XCEhQfi|2117_nf~!q+e-fL2}st+vlV z$|1igksdc#Wc5783cHrE6~gRLP)tjtwug)hL|t}&l_@b_&uI>O--Bk{wU1PjeQ+y< zA=bWOyj*aYhzRJ<5(qH*L&l8$kV35@3uYEg0IaGbz{;-zt8u`~8xwbDjSGUgjZJA) zMpcmGcl=(V#p?j--Q#f=i)J*Qc<=qU`4SX`cjxiZRn*0MYAt|iG#djAzt@~K#!E$B zEkiI`vGM)p#KQwCbq+inMSEJ5%t(!Z!a|z1v3@{f#r(q5LRi^XGGxpe8hJM(q&+(3 zDV||`U1K;o5=&q-_wRJ+%JPU8z@`e-{3=w_o;of;2jH6aa!s@bA{T~iakUbDjM{Yf zXbmSuGKa4U-8x%}Gnkkn9%DD<^tedPB+y&`fuNbLnypMhgE(m-%s{=MF|3MpFNBV{5WBgcFj0XhIzVy@lm5lFFhtb^4Ggdok6E}d=8BGbax~g z&WNkw@uc}%5qBQ9fU(~AZ;Abw+5-E5<>LLublk=;u3EQwRpe!ubC;ZL*c!=J$eDos zSk9CL^MJ-Jt5+&|F_8pV)IFj#%!!m9F|y`J7LqX39FnjzBV&{^7HO2$h?m&FVAy^SXvCvw0FBzY z<4PJyO)zV5ON~1JBj_llM#m)R$$8Kb(li|&Ah-)SyqpSA5tVXu#4FMQ)oT3Qh<_w& z2`9BP3}Z6UIQ~GRsR>!!my9Y+|J2V{X5#{9v7jjYrpMP4-x6WQRZ;jc$kbh;jb)DN zKtc6Pbw;RCEQ7#mf+L_>rLbJ2wnyXoZcMI&P zh3ydXv?qwZXY8qgrPatc!%y9i600G@&-juUf{uy6AT&OL0HVLq(gBa)jRJ^5Cy?g> z<4~n3(i#CoJyW$DB7mss7C>~sEb7ZZRP(b~vjiAb+rn5>_cyj&qLPQvD81FEHjKgO z8RdA>;PIqlW+MWN{`}>l%yh8k!+_|$0^u>`VnEbbtT$7azc`7#g{*ICC&c$ETM`1l z{!T=c+pjAy;|a;;=QtHi<>(?-J> z)oONW$aNL=JV=Od71{3lL@(OGD( z;^GNRJe-}6dwhP;qYR1T)3C@vHLehadnRga9}~qFl=LeAh5YSJp+iIMy#!3_1L^$40jIf;N#0OCxoG zfTxBA?)6NkpQd0JX*aZ~hc_kqC_OFT@@BrkVN*&uu z6KUl=xUXhTHo|z(w$h6h~iAq96}sqKksr&d$up#vA{GE%V{ zuo{*uI<|Fb%fk7~meRhRhFYbUI)?z(|NcZZ$h^x?lABoez1d!RdqRpf;CPsNb{S3} z@7*)4KP1)FsYaY{UQn8(ar}f+rqQxNP_*euytR1bFAD5a{s;dl_|s7PWqCF-|D-f2 z-1U>vB^uiB4D6>K^*h`qS#%#BEbO`n9W?X^a_GOfG=rQs=*|ca-)A^p;fPu6nXbbd z8d@59A_yZB&)|Icn)?keCkJA9zdkZX@E{*dOP!7zllwonmC=h&1kF0f?GL9?|I>L@ zbn4Co3tK)6-G}=F&GVJ4OMbO80e^}3OA7yL=ak#NrZg~Yd$Mi0Q1Ti>BcE^)rz2z@}7sS$wRvg^>|jW{jE}POFTwKnZ8$1u zr=x#^S2DeCm-^Y2K>zH?vr_BBID%_%72Vk-F4 zLa>!%WtW+%tj440uPC{L^L@UUak`XXOaY z?E9B(Ax-%MQsT?5xk}sjWTa2>A2+P0L-!;5NXs%s5*oQyhoi3N@IootXrN6G0Ft*2 zAztlsc&6d?Z}32!62{28>p4S;*5kOnZx2Xxc^E9tmuSRAh(DAXsQ>a(T$$}HO$^_^ z$FNdM8y`mBY`md#3Jw1jZ)Ub!ReEXkGl@)AkYK|NNQck_+1zuqMthte+H9kypO@ZA zdxt@ruHWG#!F+vbC3Sa~uHb-l*=P}P=%2Qu=qWui5TE`(U?l8%#&8|&{{seN+vTMN zbVh>F#My%@e2%*^jfqAFz4eJ!^iR`!xa^F_Efo4BzSWZ{} z0aQ4+125}}?s_R5jSy}6=vjlGu6`1uw&pnlTd(}r1GqjlxTDlX9VaIwQTKC(5^c5P zcIr8V*8Jr;ykfjR(`f6v!D^=+dkp65Ixx&1fJ5W0CfAwzBgpiG{BS;D$Y9R{H>ekWAt%nmvb|+Xe3WbpyOWz zDI=kYJYmwJp9yre!+2WUXWPrAkMiKLQisksYkXGg_aQ3;WY8kL@l1N%fgYHqH%=uC z9vclaDZ$AyXnKNi0}rEloHGV{l=z^Zfl~6&XXx)#5u>(*>JYSpIG zSFyepKV-XQ^RkU+tlF^VT&QSnPXbGMBhh$*6PV?PMNKT=`%-n^8~J%B-ZB2}SgzMg zb6oE!hL-P+CMxMR8uRFxDaMd<$q$ZS;J8C;@O*FPHag#6%*bp0-iYb+sKIE-3w?LQ zfj3Hv^N#=SIFTlGI;($B1)n!!Ks5Zr_NKCjazC=QeP10sDaIO(pGa?hWHaP7e0OaS z8!z;w81JX5k8E<`rk^Yb=7`U}OY#1r-_rCgCYo4!TCOxota zI9}&4cF@kn!6dqQ5r#kf@EjsftVKCvCYJbYO~b@$;Q;5a4U1)k4yIvUg5MRKi(Mw` zdcPF$qSI+sE~b-Mnne?wmt#S$dH{=WcP_Gu@tlvA0Eo!h#nUb}yO32X&CW0$GS-gVei?|ceL+@IQf^wFQ1)2TcMjb6xf+4WQqE8nNcL9ph? zr@F!qUy)~zrcEHM@UZ&wne8s>`Up(F>zQgnwTft_=%{C^ufUb#Ji(eR``G4l;d=_Mpv2ugHcSlsk-d)`P!=iszSvTx#ZlRcZw{!_b%fdnxp|$yhv9#lb4bC zt69xjkK0RKZ9zvG%$^E?Vnp=Vtt{ys_!Jg=oXJ(xmXOk%!ti8&TZiTid zJ6YAlwOQ|RSNrAZP|_`tioTeie2uJVwcq2tP@&O3<#}mvdvIxZrz=^Pr+i4GpO;rt z(;J#KqP8@0VY!Dtk7L zNWuSUPQFt%$mjNlx6Mv|wNP`*6zXh9%j+F#ULeadE=Y0rw$+!=;48^9*%5A8an9r*rlm>X?}^4XyL}u#Moeulzj-KL3p5)oKC0TH4r<<`nsMzn1KSF(Fro zI{u*;$^3dUmrxh(Zz^Bz)I4Qi0#sAW%8X;eUG3#BeJ54BPA%Vz&iB=c&X1>Q6Ac|( z!9OJ-$^;-E-9y}fpJ}yjK>pCl+dBA@wy4bs|hz< zR=(P)xm{9_+;;>Qia|>tp@+Kf$eS7l4O=uZ(p|H8sho>7HBu8JLNzzn9XO|7Qv#ya zpcza&&T>H*)H`mfN~Mcr0icqHoPWw_qW+^WAP#C$j`>caxxYfQ+&B1&aFWOxAY;a2 z6Se%Z=J8~jC;^rJ1Rd`Hg)U_%zS+)(9bA?Lo-a8QX$PFpAa-jQb+%$SQj6IoMT5Guf z#*~zklqX5~czOl3e4Ua)E!WiQ!~ggq8eU(xk?#ef7;D|r}Qb)mVeZ{aMP#)nh$YDbpkh_TCue+gOK8gRA?VZY;G zddQ;lczm94Q&LssQOe%%;05Nbie>&-hFHIZ4(vCJG#Rw_Vojn3;>CmMg^t8|>WWcu zp&9hQwl)z{y8629R!8s1Q?~He7s7(D=0zQO2F%l8Un@udz^1A>-K+X9 zo(nUwqWS-{ANjYHG$-f~&Z0i43ue;>q-RAJeyDjHDrM%9)Urg?S#&o$HeEF)iG~7Mkb7pKDOsB5@pQYj5z(oZ) z;Th*z&tIwelb-gxmIql$iBp|GsKwQa<+!mOJRivAR$QZS=b22@u_XucAoQ}%>%ple zuSto=s{P#a7wcR(rw~>fUi_N%Rj1}0eo|{qC&$j}7IbwU7qz(2VA~XV^2B zdp8ksf^gS9&la<0L{_|a@QoB|JJF#JpOu<+{dZ@MdP78MRBU>bphAUc5vX{825)zz zi9ipb=5CSsQ9C^zaDE%2(C`>I{>@Vsq@^tbaJ1Q zH;ejD30i68rFzIUQn9l*|6Bmu(|Kz$^Qd4_`1OUshcz_Vo0k1-}yScAq+hmr#+XtS{mnvuX;9pX))!m%y0{ECs~yH316F5>&3kb#?5rk zZ+$xwy@A?*w@V?{%8W_@*~oo+4badI%?i;K;hR27|9uXfyA+-={C46eh#kRi^ikxC zhCeP!30J0NtW)UFi(rrEz3bH!i-v#a^Y(U+o)&)dl#Ji!gwcd|krLxf%<)KNDmeK@9sKLU?H6S{pCA6_teT5C zA|MUdy8lNtT?l4`gQ^G!L#T_V*ZCtA|K&7fRN$*lXbR9h4H;E5_*PSM*l>Q$yAbnv zfKfOjQCDDx;}YRjqgJzuVb5YwR{}sejZoRDF#L81qT~6ST^beaf#^M&C|$7}GYmO6 zEhV6<_C|1itW^<^Qpcel7uCs=J_HdnX zfzAg;C(}Qk5NPI44_R6>Ved<)wT0b@fy*6QA5J9%+Cr2{di-dINv@;t$MG{q?mnd0 z!mW!OFDHj{s{;2aIv+1bf**)9kySB4i-1c!ooj3E?-{WX2FOe=j7Avec zniQWaj|-kp7tRlY7atcqn$9Q&`!K&yo!EC|5Klr~oM#Cib!5<@aA<~^O$HdFPj^9p zu;+weGYwvXB|w}w)j1xdh84jT^!nwH?EHNVtY@}es>dYc_2K9hSQS265&WYDD0kl# zd8O2KH5QAEpr^>5au` z;Nu_QUCKi&v^sQIo}S8CQdIdk#8Q!j36MnKz$5nQKE2Q=1zDodm>??>B_<{|a+?kG z?@rNHM?T7d<@F0d zR_+g7fCY;CPJ!%i!zqyXbzD$tMoi?JFAo71Ka0cQk@W#!CQc)|Y2*|Lz3$`=`{I;f znUpXN-jR?MKH=0LBxd5c&)o}=<>2!=Fn^r+ap9Mg!f@mj@ZC620OS3u05-(=A7aY$ zKU8#gFZ%rND*+ltP75w)C4ofhz=33Zl@P5dG13Pt#-gUSU;&-KQ_0cRfJc{7`#vrlP?{{PUB8D>A%p9;xZ=n_(VmOY5r6GjSik+E1%b3HmvX<+iLU z8a@TM2jWz_1|dD6tVQB*f9j4qDrvKmj|0x{a{@P6#HU;%!%-ky%Uj-Kh7U)BkHeScN678H#_Pt)wjc!cLqDbieB#LNSX#@FkhxuLL0379Cb zhQ!dX;vZUfcS2HTyw9dBbI)wwbgFkcjs^$r_M~I94eSi2!@j?Gnv}mo_p0A`j*`E7 zb_LVJ)(7*ROyD;U;&oA%EAd~;bl$CosD>kyg$gmFRV}*q{dt9y(~AwF=-118gPGx$ zYl68N;VFA}IbG2k%usu}Zx3c5p8Z8G6x@@?-qAc{r>oKB01(k@;-c5YMHgd1jV{N9 zh>lA|(cEj}qKhG-Mwi1yM29+QG&=MqA`Jou!w6BM%TXkvgV{%;20^)tK`jkBZ{-v%=keK_54jh2*|>9#%}9t_?&Y@DJ2?rL8+3r`I04Nec2XtXs` zN`LSer1l$KIdqm0I-l?Mesg=Z6j+*n+AvL58g?j&bjZ|zO77BZ zr2aKXdhocWt<++lbqNixo$ck%v%>#rYWk&l5|y*8Z!V$6CuT!#{Ywc-pVYbuF>gwT}_?G7fwx3cIhUOx!TufEB~ZD`Joj$KSbSOr!#a;!Xz>Q z`L^o+ooN_MAlD8^ox~xFkZSW`iYu!zY?wrDXzx_&(kn;mf8{pxB#~>M6PvrAgifda z-!&&`>H_y|Tk%l(vV+l$4+3|1*5m zw*2m-N#x7T)(smCSJ1#TaGb6^kTDCH74JQg{2qUub%SATZ|JM0``8Zhmw z)tZZnD0qAG7F`|h3?EBx#*k8`QurRH7tC8`t=LAhD-d>z7 z@baFcn~Ism_GLDTmG!_!!FJvfm>xQZ*yVfx>}hw32N=Ut>I$*fkMOcdg}Zp zpOG!D->iT{-{ZqYnTBk5bl%p~iJt?vHO*t2&KJ?>BHY3P8hWK+y=JSIcK>TON89&$ zL#yP%Hy6$3aNLzyK_7ma?})g&uFyb2>v39X@W_Nl>i_p_M$aOe`7by~dVC&k*+x80 zc5R}KCD9mtXXa0#p?OL)g*!{*vsOg3$BUW^g!Xt2b$y<1(;VZ)le9{HB(p)6GfDGB zA`K``ZlNe~xJ{Wti@uu89%>8s+|zUf<$o=_I8I-p7ABa=qu(@mvSOk2{}E*32)*vr z7UeK{gx0vG(v4r{N2_Z7Dnf(hLbP^p5$?N>mz=@h&t7#R#%gL#kQy~48({Q&l zom!R%x}#+5MQ&=a(%vPJR6nL6?Hskh<XICxFIZ4$#mFsqvtDB`Q+ z+N+-vC0(0WGhbu4n~wfZ-fRud)(%-`m(tLV#?W;m`MR*Fukn@1&ey(M8s7kKd10ou zN>}Ii)jSZ?zCRfT)$gCZh|XJ3V4;<3XJz!ZEl8v*Uu#aK*0raa@dY}qr0#vVs9qyRIpx3TvctV+uW}0AAl+hgFS<<0fq&<} z8jq*`-3>Jnch{W_4!F5vLBSZ$Nha)7(}*))+JARLR>ULL z-7?oc>nz|}?qT^YdsvjPHR3h-9#+@+xY>_=3eWz!I%wO7*^kEZ?3Z+joBi0_#Ls?F zlla*$s;SO?)jiSdSA$}+KjIOc{n8^g`_%|PX!fgd$IO1!FE;z5EsV{6wan=3kK_}b z{n8_T_Q&WEoBe7sG5du(ZuXBYRm^@71+!m9m9t-Uj~@MuF*eD?} z`$d*3NX&lK&9gtjfLG0*6-$Pln(`Bt3+RHwYUrk5(V&e-D97}Doquw8-6#1elLbj( zlr}Er+A@eW_?*P?Bg|#FYSpbJa|VV-#X?6Q2QgpS+sACxP>g(1G5Ug z-^KhP(Qa^DpfPkr#0<5Sa*Kz=`(@c!zJ zT4+D3vJJ61@PJW%9Ph;(L>qU>R+QUBM$H!rIbW2wX3>T=Wm|kIh!H2VZ1l~>_T%@r zHOxscyyr3eI!P*hMOBxQY9MjKvo3d%XL*x{x>6cCsO#^cHtL^_cd06tH(|RP^)uhC znL*AzWfS&uN>bR_@9dmRFN+22{I$rk;|}M>z99{EwQ!Iez4vDr?uFsGz5P$(8D?jJF8pA2!L5_oz)N{ValsQjzMdq{uNty=j+_);xvSxK zlUdbbTd`XT4G*gT4bmHC(Ox%8a~Yt)P#Lr6y6E`q?fhjrKEa?*(y=i>3D9uTF&3af zRvrats(T_9tp>$dbi^adqE(N@8a%brwxbsInzS&ONx)) zjC_Up` zR`OQEvTL9>^oMG4Zo?)3hF6|-L0$N34VzY3yvH@0KKh!YP)`#ci>drZWVZe2h0!c~ zJoz?CU8`YBL5MTIcjQ)%&IV2B(YqTto9$0I>nQaeFn73j%<>5dR?B*r$ABob##Pxn z+``dzuXoPopWiF~Ng!y^>UXH6qhOBC=Lg2~^1Mkj&=EhEb*kOoHe$_qEFPTj1!yuk$j?)UwXt%{&-r%Ccm0aOn%{xoBU&o z6_Z~?!Q_`w<>Xi0vB|G`#3sM+P$$0{C?>z?jjiYuUWEUblV4<_PJZc*PJX=s%iL3> z?8aR**40zh7{iOUxxSqAdUnoe(_{LNEry%)w7U~0^WA68I*#S*zVI$z=*`KjYC>Fj z&|wglHv=mtaR<4bcWAo8-Au^+cvyQ-S@YKGVs=}GaFej zG3rzr@gsOl-bvswQLhw-!WYWa2rMe1&ViH~~`Y^YX>6U#+BIYaOedLcnryBc{`G*s8hADdO~e z9;%PHMIDBniWB*$X+18bBvQh`5okMpeJXfgH2C0$!CG<_2oZ~D{R^wWCVk>6dy668 z)a$$z-4n@7R0KEPnck>#X>V6wf#9*w^kN?CKAjWC@mRQb%&MWir#HqYA;E8Po*Ln| zI8J4Li=WBy+XLGhYmln__YGyVevN3CsMg3ME0lNX#d{mY>B17~dZ!Uuwa^}N1)HHr zbwd7<@X*?jGjkHGodI6>(9HbxivDdQA7)v$7EGu7B_U`-va)d)tp1(JaCsa9NP)Bd z?n1*`dTM`Aw<3IdQR7#W**b|@J?3jnQIx+>{%C$S1usZAhC1#~P6*GcZG3w&c}2xP zSnMH{P<|@~C%C7BT@u@S_I%RF2o9@?DmjtxQ%X*tjT4oesIXH=PJpVSk`vV}BqtIW z#Uv+V^A*fLCOHuadn3qc?GA*$S*Y1NSyG3ue>+sBBn}!4mud}7!qy;ljN-}Swzq@X)SWyBx?<24{pM=r zg~<%7c;E#ki+4-4)le~O{0bP#FMtt!VctP(Z3cTPR1H2%=jxYk~Log%2&*T^Zw_3N|fpeklch!q?g>;^q zCR#M0B;c418j3glIlr6^u7!5`(CxEIX!tH{Fc%*`+cgQXWw`Uy*~!WnSj+bIJd(Ws zKgYG2TZ_YQUeGw-GFhfs^vh;w06dp%ARSwlf?>jS3Dd(DoY~kmnUi*~`Y-i8J_Ajm zmV1qtP4U*$)>-k0?&s95cfLpFpff%EP=|AG#$>CvFx$CNQC^_ePjcn}+_-&YI?y~2 z-m%i@(M%#QoT=o{hi%TE>G$Uu{;4D7v%J}2-AQ!U`K{XwKcddF0Tzb3009TP6mze0 zsXl!5l7eGXCQ*oxGT1LxM)hN$&*+YXGOY(%v^!4}>+k;sKmUh=AN>xaVY`+_Q<~*1 zzOcTd@$vu7Dl$zMa6@hU|Ab{k`44?l-{fN%^cn_IiG1rI>`HFJ2v;4Hu9*Ne^KQE?Fkl;R1zq4X%N2YCJ7`>mKLQ$@W#^GYN)=#nZbNnjJ|2 zuQynejd0U@^SstRfd;_ z+YNK(Y4Kt!wVztx)Gm+(D!bQo=uf$+>$nY9%qDYn)0A?s#4XY|pnup-+QHh*4s=|GoUw z|4Oq4HyK-ZxSFA(;`3V98`eNarIgHnY&3;OcDVW`)87&OA>Atu!$Y*#XR}lHhUt7$ z*AJNUW=+GXw97OrF}%N~;qpm<8>v!vVW{C%{YA-!9a_HNpDAy%;mR2d|EPD%?%Cd; z*H5DRBGpyi>pfVzX$s#Jvi?pn?CA~NIoNwJY`w3dZkKfu`9W20A+Cru(#(N|N_If@ zu|mH$(eR;yD-3g3Q9BS$InX@(->u$p;*OT80*E_m0H0ecUDe@{s)D;GE27Zc1mjqV z%~{lvnO_#Z_?^c3$zUF_+z%J#zkzeHp=0v>%#-}ov`FuQ3QoWmKKR#=(>@8(?YXdN zakx#>+%Ul@7@Jr9zo%f*zUqG|q7xfLjp1EdytGO5l~_L#rg-bB-Tz-W0@E9Q>o9yJ zmmOA>4d4Br#t$aVA$BG-y{fr5nYP{TnyvTM)VZxRYS83UQ&K@5Ie+DvLL(goxU+lr ztfcUaJ6zXHlC?>hi1HMz7=uWDt#YA^w^BpI;6A61! zwqU9;(VglM6WvLVnCMQ8AVhbfg#U$F+u=%2xIQ6N9;>Ts<)IobC-I>gZd{F3d4z~8 zUg-%JLB}4dK`a_QR8!p(9jd88u|u_pNAyrldc>5T)CfOF=}C<{M(IiQi=C`RTNpc8 zQ_GAhJw@_~o~%iac%`QpJz@uIYBF)KCfsocYhz0l2Wuh<4%TE;d9bFsW5eP9Y42LV zqbSccGdr8hAeU@NNH&+fB-{cdyPM5s6C~MNKr13a#S4Wck_gBxfq>GANvy4{RSa(7 zKh>5Ju-2m@q}XSyT7g>ic&nk_FSX#&o)!y&$KGtg^Zx(L&dhEuFfr#m?P=;$GCT9% z=AW5=zWKiQdtYUT7Fc6Dl)##Dklh>Xifp9FS>u5EHDcQDhs0Yx9@HKrkiV&g55zBz$2?=eWN{ZL|L<*wI3Qm|UVY^oFvOJDF zYjo-0=EY0k3|(a3y^)dRo_C5y#l<<;Quc>;id3}@dKTMDO%BXDoyLr$iMFckVFJns zUEV-?m^AMv0{LW78=r52tUd45oOyIeZev@H4 zYS={Bk}bZPLK=P_1lJ}QANh(ZX>3*GH%8nj?5kbpuvJlIEMXdy73C5202wKu!ZJRibVr*lbSVPE>!Vm zfbpqj4X~~%-V8-mvxaTENNFMPX4s}?4O>Wbs?R_fQp1HEb@S~|8z}@>i&a$Yn`B+W z-xdP4tiG&9ra{2Lx&AiZ|DGNt0K^pQNhp=$=?fYqwm@spPeyDvqORoZD7p& zd7Hx7)DG+E>Tt((cB(w6;nHNqLKT;$me$N4b|#wnqhNm-F0B{#SHY!eRb=yL2ynp6 z`~hrNHGh;osQGiGQ2Z0#Weamb8t=>UrMo?q$XXt9fWY^%#9x}p=S4!N^oNnbTMa%| zIi&Rca0vM+i}pCeX_V6G3+Gk0y)aFDEk(?PU`+J-syyKflsArb(EIY zmD>OYm4>A&bp@{lF+U2lp{1w`JuDSj9eECPHI*LRx~gaCLtj+srT>!NMIKJ=4(mOk`Fwd;XCAh77bd6cm`tL!p%?*{3;yTCKQsUfvd zX8R&tPnJz5Z9k~YYAYJ3yi(kH5I*VtTWwVOnS&={c2nzxcp@wra@V?D);^!9wlDrr zvD@96{HV*1v$bTPVTaeQAx|GGE?QHPDUNDd)wCM?NYTdDP0dXf-j(VpGkDV0J2poGMtK=f$#t8}2pTeO-ZGYfhVfS^L7bc+}P3RhZV#;8SomFV#*KUJzRi9hfY8kK460)^y7G9(a8rH37Skr3tY0V`sbhxQ{ zPkuFhS691AMv1AHZERSzfn?O>O>HZ&iy14{G;e5)u4`Dftf>)y)~vLQ%=tY2KMr?@ zW$lL6gwLzTgIkj55d9gyN*S4yuw-g^n-_J=8ayI(7Aj)i{59M@Js;6b_ ztgH_}H=9jJ8?_3{F5PeqoHmve`LETh&2g^_-S1_#UZ~YN=POf9cC{8}`z{)wYX8@U z3MFQfU)=93YqKb)qdObx(*VXLw=18{WowmN+LEQe?CNf7u2xT;5{6$1g@3in-6M@VKSj-`m2a_1WjRs+-mRQkY@;0(cf zW#4ZPm(dfjHi~1k?i(7>dIRW=4|>hx=4B)uD%)h;B#ufbZ83v~a)GD6Gs{UROpb0H zl}VN4td22B?O2zK8Hr^Nm-?WLFow%+$V@tf8*&pBB1#;0)EytoSwE|+)`YI2r2cgX zO3-oHl21A6wqD2Vec8Yy9oKT>EcA0uF*q?{Q8zTd9Ty74MdNfO%i?^KRtW6S4+FVE ztbSAWq;veDBi!kH=Y(usZM9JhYn6UK=~+^gH8ybul~GOXy8(~&yZUjJk?s{mSr^o( z166Ky#gy*n?pL15=<!hw~S-g#tp*la!6g%~70VlA3&FtS4(tW-uPsT!R z6#PE$lJC6_L^VAW!9%H^NZ^f{NNndBvjj$$6Gm`e8eqJ)uNWC&o?%}x%~l@v6`!3= znGEDB-b<51$v2H0xmbL3fdeNr&t(sue8$a z5Vw*Yf}iItZCKxm9qE>N;vCX-WsRNuc}}H`9dHPbn2>?eaSF-lY@{i4q}C~NuRU#uC{7`#=0-~BpCy43&Q4D!O&&jr9ij~` zfx*Ek=aIUjwuvRRuoHk%US4eL+=+7AG^NE&Q(A)6p&6zEF^^;%x8)0a=#)7=;3jj$ z#690OfsdE4(dozy7Mf;b zdXR%=&U;f?@>Kn8COLVk#m(EHwb^yJc1qyf;c?~3RPA^gt4EOf+ebn`^5zZ}oA4?fu=gSrHwpOI3RQRMb$7)U)ZH9oLt(>Ly*bfKX z@zfrf4f_t7@d8CR%70BCidg%CS@JW%=&#u`u`}P{r%%TNEs6RP~nnp8gHu{RNj#JaGrR#!jJ;yOB%_ps`OUL)(P-^G?ER{ zuv1vRSR`BCmE}*4WK-CT!m6dzX}{E&MOZK!BoH*14M`C-m<`qiHJAE8;`l!3Oi+9u{tN=& z2Ua>Yz^(Lw0CzS38L#xgz?@MuAurqK^8vs#Gnosy{t<49l@TSw6bXqnNylS{Z_XoQ z_ToJZ$&!e(c)Z62)5dt1_8Q7>@v6K784kO>?y`G8;2oGS|OWK4!PiZ{eDqLj)o6+EVuIq6oGq(%#=nOES4 z)rfBwnyr82#ZCG>BryXE{Jn{XX%?37esZO;NX6<^lyV#jPbU{uX%4eSght+rYMcAyAKofx*OjGS z(cG;>{$WO0o!Hd>2_117BTDr^CSE`3yd~kb(NQKoG*bLr%^+pOQJIu8%0-ZmRZRA6 zHbE#j4L0&6S4GU^k^R9E$|D8Ufz&#-g`}ltIWy_J*a2ECXv z(!pKi+lHACdoXTj6MWlKw%f{zdC<`-Vb z5bq*~--2+^&XY42q(cJ76?DU32o|ep%|K-TIuv zMA>^}jg7DECChkFy)rsRg`<}7 zU}IaQWAtitj9wibBj#46V}#1DO2B~YovIK2_N0~Yz4EDgR*j%K&~W}mDL$$Q4@|^ z#qX2)&k84!ow+6`_P!6vva%I3QYbY^C3Rv`Y7#%`Y;(G$-=Al?$;i7*Pr$R?)l$P#mHjMD3Vo?=WOb058<`DD z??#53PIV(IV_^By~F1C!={T6mk$*OjnkqtK6%`^*O z*r&|PfMN%)Cis`c!Cfq1Oxr^ zfv;0*o3crLi5M%Z-o&vbC%|7MjU%f2HcOyTRxSk#?pjyKh6}PvqtE z0~HbkhrVZ67>~)p_Ce;!i?2z6o5J@Sx$IPcQ8*@wr-(Zs%a|hdw`qKaP~oe9dh71m zZyUX2dR7HR(9P|R3x=q|V@bRUnt&M-3>g-5Q@NfrZX-ni?f<8s+iU6K0iGN_4WduF zt_kH7x;8}1nqx07P80K^fSq64v<|TCrf9UW34o}zo0@>O0mg-Vvc>Ug&AEdaGLpdz zBSZ$6VVn zT9;W{N)MW~r5@I-E#>T)wdG5+w$##^wZ&T0tSz4|I`7k2Ti8~uEv<@dZNV`ckIut4 zN2BxjGl=NCPiJi@eNb!b?Obq=IjH#Z&UYgvLb(@=vUuT4r8HlVHn*DWQt7WFc}8w- zcJD!a8Q&j2fvE_FliroA_u-`XbLIdTPI@0s zdS@Ayl7CJf>GJ%o!%6R(hLheI5k@?bJvyB9-X~vN-=DPu=Zov>(0uXXr1$resfzSOtqk$#iK)TpXGF(|%+r8E_a$v3%5ynZO z6v6ARbV+Ac@jXTYUkYI52JVlbKodV=_RX?>=GMs}r-{mE zc8m_l@|oB`4)_BUa@&$^Dj?0r!CJuDOF?@y3!IivB{Weco(cZGjb?(=N@^x}*ZVe` z;G{a5EzK+yyyfx0(5HgOG2+b=oil;YsH~EJy38;F-eiy#rlEQ-0PBb+Gw=nZIh)D8 z8-tCp_A?X6+)*`5t+SaNoMc->0zsRf%4@DCJytH2d_KCSjCAhh*OHwpp!9k2%D_f4 zFDHB}>A5cAp+B#eJ_`iyGyH@y1V`rqp2@NPPI$^HZX>6zkXhG96Np?Eq)}!8uVtl3 zy5Fo_E^Trnj#4>XL$}{GGN{WWP zlraaydQL)GhyJpU4X4Bwohm2I-{%(+`;@wwB%yuWx+|R?x$M4@x~o~anCnx(nyzr1 zrg(d@P9>dh zhSCLhRZhCJWH0CANVLvrA$tSCOUS`GXEExyZ=I4)<{jfQNNq5<8?RnuPgjwTXF10a zS19-vd3UyR3~Nr;Nfw!QfpaWv#-V0JSD@C83!KoS3I+2>;5e5l*(1U8jR?HfUgW%l zbj}Jkk?&S>i&Z`xZbyn0X%|()bU6QjbU1B~iQ-4Ro-uyu+BJ<)1keAW7~`u&N=Dl& zj<1e28jY@NYTU4<5xligopX$G!4Fus4JX=PWlB{)VC4bodJz5Xo4H-IUaKQ7CHrPt zykwte+PI4oI8Em?tzQq?$*+o|ao!5~Bi&~a=)e61Uo;+5!c|Q3w2e)!ZiRZdOa#ju zMzk%^8p>^+oyYPVi6rB+j3y$U&d*)c>%2e%b)%k5a?aXiE0#8_3a)9ih}yPQW3eog z$65WAYL}Ig;p^su9Ey%FC{Cb$)HShI$B@amG_!QhQmq`Bw@{eq>yu9Ntn88G=;K^w z{ka3|CM5&xFm_6@$NuAUxN7?+6m>*T&l$BBRP5nB3Q)Qd!o8rXgp;L&Y z#^}qA%1>(grpgZOYggW(>6yixc{S!0p8g+-Z%lQWPa)8Njz`FP=lc{h5Xgczid8}Chi7@&sACDm?!CERxm^G zm3us-VGa_N=RL;dlY^5vL9$Kat}*hl$UZn;BW1i3x0$;VQY-cL>11A-vsQ}i3a>PB zhq1xFu_ydnv(udRqFGwzt((n5P`;9M`;huo0emc(=C6y9RDYd=3eA(L{<{5aJ92dKF@mh(?38zFl!kcv;Ai zB)vy#h~oIJ2~jJ=uIBgy9RCRyuD5-tU&e9LMqYBj?(GK0eb**%I$APDiiasfLKy#;Bd&|HKhJ4%C1JufQ|ar6B}&}6%1d(0lF>7izChGsk0SJz*sh11x9eQK zEZJk5=gGqVM_o0|H!A2Jb-6#}nHHMv@dl<%4RMyY*WTK7`G|$Q;FY~y{~A@tivhpe z+m$QNGCyp~J`}5WGqd*{d~!`Y9)f6QIygrsG3F*4OrxB_YyWQ+=P(P2DnCTCJDX z!IUYvW1;>!%|#Jz+3)dM?&l@4x~n3EBcnep2}i@<*OjG_E1#-Z!u_oI?h9R7ArNw( zseR41NU2SLLlbe%dL~$6U`vrDO7zHHH`xg0wEn5m!u{`;hSP5_cU~uRRrm@ z%?Q`up%eUG54b-r50JhlF+G;`0uKCC?t|ueVlzZ86+h$FcbV^aXb785=s4=MhD~=5 zhok>4i(?mTI-iEN`6VY8BU5k(vVZGR+zf3Cok7tP@P%NGw=9LM`lR%=2<3GfzbO5S z=7>SsB*LMM>2c6@v9`49!DrTLm37z^BR#K$Ll3&+p>M2dH1yWFiiBV&L=yDEjtHgB zKO?2P1(-7n=cl_RG+gw0v;EtKR%kV_##FkBdl^o|)CTbF*#VO07RA#iOmn|c+99^z zrLluOAjUx3otoiY&%M7#=>h+K3^binwNePV-Cdn?4l3{D9)NL?rDH{ZcD9!seWvm? zk-bazFO$?MO3jcG5HAmRJfqPELbwrL;Ut(+oBAU8rYiMGExh-h*d(?@O2=XA!wE6a z9ha!CsW0HkCI>#P-Ew*txrf6$UMUl^vt||N^#Cjts+);B=i2Rng zOkyLB>D5bZyfkvk)mLA7)!c?l=Ug*oW`j4}I@1;#z~gBtmI_Y$Y3s}pyw?kR^?ZDI z>r7mj8G-?%2;R)@JF4<3et7nGj7mEc4{tp#RxI84w| zE?6O1;*IzuYrN&c(irH`m9Ph;aL)_})TasR!}iuvBb>Of)S@(9-&&eE(2OD6w|fNS zr}x*DFBMEMJ6*7_KHYOldAM_f1nwdHlUxh*zF2!55=vi?On#|$xgMr2aK*vV3tUsV ztRV=iF)A~bzeUL&GF@RIxp@t%R&k2 zo#oe)KiyY(@la)l^rn>`6CW{4e}$qu%dBuBHS=Qf-Z<_>9b00};z((!5au3;BaIhw z-zub(dli}!>o$lXw_gS>zcc_HZ`96!=C^CtkgBA*B@y(|tMEXrzt<8^30$V$BL_m3 z+0q|i{qEEdZu8+#=n?cJbA_u--RqIJyFL}4GfS_7{YBR((UXm&dHjp661dck3$nMb zHW6CZRAnevg~w_oE(nM0LNsYOR-4L!)gf4*@r&9N=>9vG1)n|Pkl|qmKFP}J17#Z6 zdux?Zxjk`fRSn2-)(F`CipvLgI`P?c-_#~R%T0U)^f(10G<;Jl!_8mS&V$9Nc+1}3 znJT10)uel)UeK?-jv8_LBzYLPzVrL5CVaVwtOzIl3mOtwGU zQY7V__A@=$EiDz%bhqE~qDwjH@>n4jr>$`z9!}G-+Guv*>;H&ny!p?i(VUl_v2a_d z9(u+iNnj_tZvj69wj8UCQqF2y3C?r9h0h8%w&cUOFKX2z&B|XX7NV4=@HPtSw+f@6 z=N<>jA0_k->e6PWkS6A*vX-%sZf$+gL*=zcgkLuO6$5?OS4X;b9Uurr;)hcb0j!;JMK$H zA@QkvrP^;Hc4OeB?~v>=qKthT3Way#iR!-{LWQ(sSTTg3tohm|trFYcOpSxWH_|i3 zKsNG?b+4obRe_}K+ENjc-%fp-yB7*S;`};y2v0$+1SyBPDsnWbVieM@3xo`qol)_k z=1sG7zXn#{;E7WN2IS`HC}jpn;p5Ie9h|eRWF9vHe)NlL^Z|b;Xjz6r+Cg8ch9f_w zryjC^=Ywh+>8=tRIq|VrX)Cl&55z;gL5zi#*P^weCx{bSzrG{|ns>TJz)pi0N$PjH zHbp2rxb_9tUKGHZ8)|)201HA-H0Kax6mm^pRe7Ozk#G?-1Ahq=KF-HLV?&u|plmY8 zmvTh|w^(ILSq`*3QZkY5bkeh_dU&*Q+6ua>XK|XaQ`)BqA1a7dL{1bme3q9u=~-yq zUUfHgH;W^ouU6EMyiH|47|7J8%IZ%MJ5ic)qc|X>3n4iOTupUw+eNN-RKfcpY_kI8 z;n948N?&e`kUDuVw4UHSD zqoMJzm5T5FfJ{~B$wJaW})h8>*wAd#+Xw-67jW#59|KNTr~IBx-1UxJ=J`L%$|b zKLZQDtYTsi+XE>$_@LXnt+94PoH9IIL^rfu!CeG9{>;6vYAfN9cccR90y?teQT~|1 zKQ$|3q%|o1?p!*YEQ5lpgx>kd=oPq5oy8S_!pvq^~ zEAry2F#EdF(I~Rw-dKNK>Blqf z>OdVst5>S0Z(&^Zi{c55bQNr=sk1Y6l&t@_;!+Ney6o{-rMU2FISyR^s<=NXSsL0f zV|Md3a~rO{VoLL+S6d9ykQ~v%>$x00o&)2j6}O73Ez;rJIL>ujho~o4P8Pn?!7hOt z4m}I_-Q1nfG8L65Jms@RpWBlS?zcp5JMc45Ag&_K*Qc&OgJcu(2YtUT+3;^!;ZTN9 zB)Z)}4{WKcK|!LYtb}~}d|8Sr0A2E0+56(USm{B9KsAe;o*v9-Evh*|%LLeWkdKG% z^(DxMKCB)F$6u?~kx_fA?@~!+!rRq*br0#Kn|NtB6ipT!?NNch70MhW~fh;``8b>Z3)yi zM#RI2;Ta}ck_;WgWH0PEpdBIvZJW_}G4f)RP|Vp8QSk6EITLy}q10fH8L5ZwHaX02 zAZ8@)ll4Xy?1;8n>8+m3cu6{k2X~w`9vWW3x3#6nQKUD1dr;)cUfTqWW$H7aV8RDSXB^QUkn>0iS*&cxJ_ZjSv zmyHi$aSGg7m>voDeq=#8Xun|utVlw^C03SAygLZ17n;gowtCYd%dxa@PPwKQe*D0| zY8XB=3}ZDv)73)HI|eg$V#SAsBwF^!hlWJ@|DmU(Sm^!GV4ydB>H|~m*2+-uk-HN^Grsv_9PWWb z2GpqDHE7xo7|@d8m(PV!pWwI$%3%ekkAZ`S3=ymv%zj0>Y|yQI(6AGh`(-nnIA|!L z4NRw3ad62VDGEAA%EfH7@RV&NTDnHcv4ZV30ag!erP26mXc;A60Xq&G&V$iexJiyC zjEsT(A)^uMpTZ4%un2{L4jd(H`OIL1>-QOk(2aJvAlo)V!)Tf9uM)^ll2IdBuZbr( z#(4r=P1I_9bb-#*vb7lj&0ia=(A}=l!ZUf;W%ldB!^Kh1_=({XSnvjJ47_5ezyc>e zHN-;UXT{emSECE$==Q^gn1Q8Mn`_2FDK*+Y$CmIZwBZ%XHL$=b$J5(*xT{dMKnLyo zsthAaZifxC=mO)J_}buxg~L(PZ?;->(ES!J7#n!AI`9yE%tZ3PF~pC6S{JT)^(^@T z!EO5phGpZ(M>vf0Ab-Ch8t$1b2ViG5o~P7YqnYzU>l4~>Fng&?uXle}91qq$-16tx zwdt^MArAhgKHT!_QjHeq%fm_P`?NR!T zXTYm?cq{>yhtb@%qc?8TfS<{u<l~%g?&&#bJ*8!AAF(U@_CbwWp>Qs~cUKViU`vMa zR%lBYG$aYS6Gj>!i#DKatIrHJ=p4MGa$)#l`8Xbs!W`pyg4cF4ygMIH)%F~t6JGfm z=VN)cjLqZ*Z4i-*+xEzOTqn~2D0?{+Nws)X{5S#0uj{fP zInS5_ySzpN^tH%ypeA3oD!1$W#+|SuAKPjQ7>jAWOvo+38N}OIu)m4at8EdE4r$4y zv@8aWEJq60O;1j5(6|^LEi|SpKd{kZe-mJI8d6Opm?2h=T(nX?mQSX%7#lfS6G@># zy9_S8!Po#dJ*ZEF*KROQMsphq5xYO|+DYMF`LRl(d)2r{;N4!3_vLyZVxMubVv$=o z%pKUR6_ShZV$U9 zTf*)yY-ICP)3?}hzZb@zufd&DW3HfraufO@+@!h7{g#tVSZ=xvd*TOk-v}Gj&M}wL z8nH|zRdj^bcia!Az=g}Px2Pwb(|)g{fhL#P4IS6n#%`1!GvONovNAO|k_u{bMlocS zJ4FcKqTrAM(6ZNY4#6RbNq~LwfqiP)4AxNnG*o}_?n3CB9cfCcyAGUYXu6y$Y=wo;>J$-E;+;ATX`<_(49ed`7r; zb_6+*?m09JU=~i6X$&7E_1~LD(_V*^d10e&oSvFbT|Xq{xM}xrflB;r(%6t1r;kyG z6!f?W4r!5t%39s$OEx;I+pxMHn!4O*R81@S0~jC2$?A?u{R6b5c}k(vu2H&0uv^QL z2zKO7oO9&x1#ULyH;8WPfWtTY!u1aaN&Z#lZ8d@$jj3$(rd{T7BHsC+)$2`%o{K~a zxoej>wSjkM(;bT^d~GcD?*b8ptt-9JLN*$c-N}|zhk))WWf-hR=Sr`Qd8`0`%?g`V z4TYJ>meE8WYkAR(bpx>bd31~?I z_r6>!V1L|HpH&7-EleKPXuG>EdMS2{jIal5o+Z=oh?UXTiu1vq!nqnR;++S~k7px! ze9aLBvyv@o(Dy)W5<9!3?XK9WDFW)qFl7bK?tEWdA=JNLgzq^bXwXaMmcjgOFcZ34 zxo8;Kir&ZO6S1fh(R06`H8hIYt3!!);!2K7 zqamv?XDlS-8Y7_myJ8b8Sc(jBOztVnb>Y$h=GvEs++*SEhI5o=7;{z1sH}=t$YACm zSJ<164Hk|uYT!g3G84u_j~4XvP}T*;Ls=Q)p?IZAr}-IFm7uqOvRYA}a5}Nk47@EY zG|o~OY5y2hM!F}zpONB_B&eDh8XY$68wz`DRy2zj8OtuxlQl2X%)8FKK(wHq6Q6-M%?VNCO*eW1;saQy$g`W-FbL z(?!+^56ESFp>m|KCs~XQu&%V1@pItM%dwk1`)o*P%Jrp?xMGZ~+;%uKG;sZj{$J~R zGls&J!h}NT-k+z3<9(hq7*>>^R<6GXm8=CtIA?8jo_XQqYc!DjkDQTEUx6MR(_cM# zWZgd7A5%piBOa7e;xd#1<1IZ`33mJe={b(u)BZj;9%lbN*NYbyE4}WXmYW4_z1%ra zI6W7=LcQE1$bUT-S7j7s*_8Vi{?j%KdhRkuz^Kb|WpvSaQ055gtKi6Gxucca1vlHg z^ocTPb9Hl$2*<4`l2UmT4BsVxmU{%SHnp_nie8i&Q0iRrj) zrA_d8RWS!wr3<_5_Y+)@dMEyX_BXm*Y%y?TD957VAFE{Jtk7-Ict9AAr`F*h$8Q>A zt{`tOPN?ApA94ZqT+y1CVfFhb zR>?V*`(es?331SPOo)bwS0yDghPI_ODSDG zrVol{CKC^_n|U624U>Bsp0w8^@WPKm3f60%9f~1Gp0szHu{o8>V2!-?wN)xZr5FuX zmGU6?{7E}%N}q`-(C|Uga8w@RLa^nF%8|4TxyXltxOCjBb~5hOlqoO6=1Dm^m^3Np zP4S2zxu7N9>Y^sYbTFCGgwSNRN^tZJ#|3cYk{mNcJd|4kjZ9%D2?#+4+%s-RI1EmWsDIu%=G3S6TV z+d}imd~zbrTFKEmXg#r_A@P&-4z!-cS(%29YN6Ho7VHffBjI1MV@LF}j0&>oKF5tB zbl&dppp8?Dhod|bHOJc>IxyYgSO6bAh|RP4Bg}i2?11eqwjJ|gcF5E3HB^OmfN=jY2)5ac;KG9%kd7c zI8J*hx9$BD+45JL9np$6P_D~FbH%-AeJa?30FI_3#YR}k>rM2%anP|<69LA?oJiWV z4f+mXz5Meu%OGjH!-43L7<5)3bc*Uf^!zvEW~89o6Hz64iYoD>B0i4!UeN`qfzg_h zen%|=LE6V;47M~g25~C*gY4ew7{ftglyxXbU5#Cy00`)O zrnhJdil$eSpk`W*m0p?PjcvF(C-%6a6&2`*;xUj%l=nvRHYe=Xm7vT@$5+2JApy1$ z$10fF=}5p?QF%R`6}Ym~5vyR5d?A@l%&|Q#hcYMKyZH<@9SBW8A2DT>Y$mXL7;pP0 z`9xFl76-k$64e#VkTC{5-uBU#kI|QW%`X`Pt!vSmQ5{hd!8O6L39crRB$XWDVX~nF z?QhiV-?Q8C0r|#Ka!EWqn~A2ly|hKv^?zmJm3$C)+Kv$=w^X=84yP13WBR4D=gydW zZG$^xiLN|(lhbs~Ty)*!$isixjg#|#NYkj2ziFZEBL_|Ue=8roxi_ zGVGa!Z)bjU+>KhOpM!ntcU5a3Zgz>8`5<82oDvt=Ij1C!p?hX&36;#f;bWJf()27>M4D%nzN2ES(3}0P1|lUi@)z}0#ew`tZU*`GkZ?#v z%RC%Deqs~?EZp8FMssL6rrsFzHFaAmignpRnc`y5A5n27xhAUOD%C^C9O%gDwRl`o zGMo%OB*>`6p%*=V+qUxL(>&?X&~bg$2$=kKDuSw>E+4J{CYj4}B|hgN#;>X#80@Dk zd=>q$=%=u0^g-v4s?#q_}rc zXr-Dgdc#vt<@9&}9lZf4e2aUT{PP7NS$P*hm+#e_c!N#a0;^v|*HAwbL9oC#HXS;u z-K6N;nmy`FUVo$p!CG~tiBRAdQj{y^cDy-8+NOo|b2;>|Z?IlT9jba=C}8=HlfFd! zigN)p){0k#3wIdEwEKjWiXW2V{E~mdPBFJVvm&5jB)oM_fS?clK?NSge-{hmA9AhJ zQ=!=M073_f#*0pld|oRSGH+j#?hys$29rA-PI}rzJcKf|>G?mws0&J?U`r$)6P75|cQJ`z|hV(}8=?oy`fL;?nP4l)>`bq=)oM>@`|xKx7!=ATrP!8w@vSQWrZ=4ta-IMlD@yC z&$$8D*B>OuW|tF5!3=dm-754PQ(PPK96OJR@0}garuo<_K?Ina1r_m$h_+(E8}gDV z8&mhF8%2&PZ^Dg|Aa#YiUm49hszZI&O%I2?+;t`CEOPaz+a%6aeMqz4DSfShWBM9p z?jiydNY%kfYk|8-yqTdf$WP0}hgCcin@|3z0mgOl=)~Bmbwb;{X(@t?^4XRy-UiJ- zR_8Rtv>?lx;$mE2Yc9T_ZHYk?YDOBCo4GKawEG!pLzOpd-3Gk)p22 zuITdD_;}~(u562BVoq%HBjtB9M5yAoSLlKlbrc2-?L=2T^saFxk?uph=GT1rXIPf8 z42avfF?H|YWkFN=t{*E=TW1Fz)e98P-Ehe?+;c74YF;AEc7C(!`hOO-JW}4wgmf~r zxcY#KK2hNo)DTA*J3;XBB?@ktAa1#h(`<^9HXtbYOXE63_ISv_%!=EUy(WGoNjJdi zEl3Ed_^%6u01l*+Z%SdgYe1b}3Sr?Zp`rgT{uekK@WqJkk=7Sucib%y&epa~8 z>mn_!u8WjYu0SBU7tqJvwox~k{MhY$PQ{8aGz(HXYKvs#4spYNh1_*sUHLK~xeGz_ zoXRJmF9Y3d@4hJb>FrMFc}WPhzf(R5`u1{Yyn3TYk45u!OQN`NS|f^ zVaSe<6ACXk1re*|4Nx4R4cZ>&Cxhv6J_wzQxG~Unpkx}1yOBfPtQ_1U|sc=54>oRTP%LDu#|*%VVISpiIURv>{NC@wk#|c1PsOGM|b>S9tc;H?(6( z_m9p4D(k(GB3@z6lXeuC225*AiP>F^sKSPYI0N<1r`nQW7H^i@t(x1fr8LgmQw z>!>IG+YzK8EpVgcKgrqJ= zI+Ci|ae7XHl8ImIrOhzj?m#39MV~W`x93a0P6+zla4e}J368cn<8URT$PZIoHz-}# zoE{T^(0TXCm;iBOq_hH3lB!1btBG2{gQ(df&s4syAo&$Gxk8Zr*#v3VBMNiW+!P}{ zp@pKM2-~Nk1u}S@E+qf5WT9CSDJ{eC26U)JJ%Zv{eK)Vwd1W7?@y8N`pn|_OP2?=( z>kGO59r9?n=aK|Co|-uk<5xmxgTE&=VOu@7Ng*_6M(7~W(epEej^?;UdRqg#ccifh zhX7Ec4@nv4LeXacelGsaN=fIdh~mQd5{4YpY0<**b3QL_qChh$A>iau0RcgPt3!2f zq8Lz8XW)2Akpl!o-I2c8<=a&;Kn()PcKgwtdZr+dK_NF78g!u;@}lA3tg%7tID09V ziG{{OXC@!YCPRv=4=Oz5jL@iTl*ui>2^tmih(-EU!5<+M`7Gw&x)cR1d zJ4?8Q<}1DQXg~D!RCC|isGrKuS5j4r@o_47A;=1&>yVF@oexQeYD3U+!ga~EMU`cW zFs6AbQo2KpqUwE7M6T7(&Je`zmMzWFOqepC%Ypj*RE&CG!7Hq^03Fo@THg zax|06FVJ)+laKzAb_1;yQoI84DcX`YR zM0z)-&yU5XymTJ2;Fg`~I7pQFw(UxvLCevHsu?>9hON;J1^Z9vhRAv(cR0QSeVEx8 z^Y*PH1ci6SYG8;X1K||+myc9ryaoS2ltN*w)2W!63j3-`;J70r9^|Fk2+zrhxKE>*fm57;7_j&> z9kjVh&r@dn^Iho%NM2GskxfRpw*W0-12s%tB}2%w<+|HqN$}x}vAhsO%R6(EuQ@7GyL;nljKJnYEO4?i`yj5)pQ!GSI~f z`>x5flIFi;G$ioopYD9wZUf`jx=f1u#xPoMFhq(DWPBbi1QC?N`~mEFRD!6Gf(~W+ zykcl8n3suK!PCNIWyyP&k5Hk%Xk9F3KaifUGj70%?YG^s7Y)Sg!uW+cD}xAcGi7e4 zZ$!rc#bmHIQn82?^<0Cm={bix57-OwY6h@((K3SXa^eQ^dz5pGZ#ahrM+TI}+y3H6 zZC`^Omb3Vgq^BtJ)1eH9uK2leogH8l^)_wL@6Yz6g1Ig;m6}V@a$7EBqPf%FD1f$-hIAe}^Rh4oUtUlKeX)`FBY2?~vsG&5&d<7(!unVa8F}nW+aB>r7B0;1N#p1B8Gi(}5uJGRkPY$_N&6EwB0o$-BsN$1D z=)7g~b`qb=M&{P{un%9i56$rd|&f9ykChrbsRk%R?$g8RKG=p)lMr1#t)&JgePMWI&)5iC!<|dQF0kP8SlLR33xJEI2ApV z!ISY$K@!7%0-l`h@hbCo8ax@xLuZF4BSK+d*2jw!ukdT|Wb_m$y4gv1GWA5@CJ!*+ z@NYsVQ}>rL$tS_dScJg^h;JSQP8QG&prB+KI+;2JSe4(=$^ZT6;8!@bvxht4k$K}#cFpksnYg3({vvQFNT?mfA)c|k_26i&=G5idLx$o%mzz#*_e zml>q+ep@>a&n&{RqHBE)W@l24Dvqj@gnrjF_6c_g?@)?$l_1DnCpNeH0;#$8zxUQQ;ss7nM+ zhVD`635rCfuAS;f6G9ju@N>lUH3dYL|dG@ZXN8=EM>OQ7z&W zs6q;z6^gQs0n;ZzoerhV-yzliMM$+~MU1ps&F_OSAB2`5Wg^C_OBVht*U^~(Of0IA z#dUUnQi`BZ>ZeARcP!~BuIW^hQ>s8}L}z=>1f*8-ka80-M-&5nc08bU5?y&(e>T$R zZPH?K0Lha{a>FHN1WsD&k{~8ocvEw)Sqf`_E93jqUKKh=XtOPU;}C8&C$nmLSMxg) zRFLBqxaC#8NbmE9+?MH5BT~}}e|t%4Iy66@sv|jj_-GZchcM@VXl{>`Zo#ZDKWSo^ zhn40?^8&)q;-U9g)hLR)!?;a~W0QY!#zF7O%F(3rJt0Fy91H-q<$lSJ>?|t(A%-Am zyAzWPJmYjCoHR(je#W^{(0pQ&Fac?EhBl`CLEA;d?=QVcfgFk5l5`B_Oj5E$r77W3 zqi(HPuD<3Go3vdF?|uUVLnLoHD()dSIrd}4*XlqVtbeKZS zf7V=XpE;x*ny~wM3?3-eovXlC(VjrAmnzpA;V(rsD6n^=GGFRM=(SZoE#eM(5b7hb zhyAHaRqQzCxrBm0mm@CpBTfgM4>{Awiiey<>c%?yTFrLN;-S(3Oqa4E4zUlLsf0vx z@-md|etxH#25kUG90x6VTyX?CqkRgFIOT9f2s(8&)8YGNVj_hEU!x#A*WM(eNA<_* zFAYlKFT@sOW~RuRe{1$fN_VM_&L5npx+298?=(-l;^)i6`x1+}FIH;MF)KmE<4@Ew(v{ z9Qv~K1r^!0YlQTy4t6)2F*%;1ZRjWvg4~iI9#h5$@_5Xq*LibE0lZRF?N+WB9CoXc zL>1k`N)lDUhw4bmy3z#FU0nODkzf|p3pw%Mu@b=e`|;2qim#qQSy|3z&lxfOnn4|6 zISObpY7wn~LBK8rh@4mTv^w|LuRKnCH3Ac)GI%8>4oncxWI~z@qE1~l6(7yw43zLo z8V@^pno~vK>mD^rFC+L2ijHd0=Z-s<)Ll`%P6v)<74Iq_dyL@k&!&JGRr`VVtq6B5 zo2Z5au#}u!CqeA}#U^Fgn)frM+jWD<6HV%cVY|McC*`Aggjw?JROQ$q;*FukiT(4k z^1)c~M!$>YeY;DuJ(5!I{xsE27QRnYxds__h^BG{``^R}f;4%ZG8O!n5?SvrKcUbM zu7hBTxd+eO`1h&O9a`9Tho+HSzrXAwb&wkmm&I}YAvb7k%06qzjksHqzJT%Pl(GzW z>52k#l6LiH3mDL-0P~G$MTBf>6XbDx2VD0athHFZ;p_jfGNXs7|7ZxGNUg7 zUq?Y_i8Gnl6Dz}tP@-F7kv>DDHO<49p+}^c&r%@ef?MDmEHf^&O&2s|(_~@$;PitJ z5lqn;P}$NT0!1k%4YT3hA+j<-{NmRLW)J+dxb}XLBA-YTDfym7a$Tq-#>7aje<|tY zAD~e^YSPQI=g?GRAC$-s8tR44g3vF7dLhU<|8-{p6(qcaa!vC4onUs?u)v%1Sm+nA z9j>sLD96tan{qHj;)jZ-G>0A1Ga6{6`LhSa19F{IdEXgDgP(C*n!MtS-1a27Z>G)% zHzV@Uc4ZBa=BYJm?o!5q);zB8ANoJzKFS9R2ARl6ub=$jrlHx7^gYS)q?~C_iXTYQPfB|F zlR#D)$xSdD<)iBMKlXabM4AdZNb27xxmHb=uLMnDifF_c5{#AV7oE@e5d(C$1kd~t zg8_IqCdWaOB3VB@RfTr*pYdQjgs3iD8WKF@baH?J2o`96&zT@TYnEPvMm?WKqk?JZ zo%{dAwBS#~NT6nf#k?`G=rF_BiBr>{Vy5oVy;X%uz5xtH!H)ol_|*&h;o3B4{!^KT z^!8Sjr~-)+Lc}t>5YtOy_MjLd5hA3=2BI%8Ro3)8t%e${EYNy?C1z`itxh8L^Q!Ut z3+!79YU<;D3gDpmY6zx2-f;G4(v!hln2HLCR&QnnC?Nxyy|Q$V9=J=#+(DOS4t z6vJ!TgSlo}^Is;14_6d1Qht)=W9(y6QdO~@S}cD#Z0P5-lp-E}BQ53B?9GaZj*JYm zH&bWPe|HXV{!1Aae&D(<0yloP(PWh(BfH|MX zV88J#F7?A2ns(eTEI?qih9>4X^U)m4)iCLo|F?5B%@3*4omxoYTST10My8C`6 zil1CdHAql?E-j=-z<5wyRiq&E*>@`{Fw4R9sTFYKaD{bHS@(P~IlRM%;DM{e%ffkn zgkdicCx##OBNF(p^J~$( zHxo=#K1|O-8qbvL9zQ36NpXrEcOF&kOiN+seHH6zz{DfCl#XZ?c4GRXT2jY25cRHDT!`g|>hX&92LqNAZY3OfvBpbXJicGC@}O)`GSdW5EVvXu5e3~#Q)^g8dJHbLD9fSSq?cCln2{QFdzK!6>|RxK-5@G?MlBj) zDM7;hsq8~lZT`Rm`IXL__2?rHTE4*yt-C|cFG)m(b5bm0D&*mO=L}9jdmPy3rNq)$ zBurj|pD(~5QS|5xj@HvkgLH?J#tpY0-D_twZuI95U@U&XX^Peh?-|0oaZ=D}t)_L% z;M@>dT!fQ>ekKQ#!uvv&{q);RpQgS^_QY@)k<}j$+5gd;GiZSdhDcEZS;mCd_4pZrLvLWv zSHIB_vmPN+Jk#fq23v9m;!e;X9T*f;%&8d@FskBwMopqd)xNK0Ou!r_>;phMl$}d9 z=GXrDB{y^Q$pfgnp|EKhA~`teg23h0bX1vPnM) zfMM5YtD}Mx20ppTk%o#7RjV@7)lacJX9%I7|8&E%`UNfgG+5x5zo0d^_qcQEC)Bi< zT@D?ws2$V%{;#rcYmhzd{2nHLUU0^&Cns|lG|?{~xqqI-pwlWXWz5C_{qAxD>>87* z)1%Kk`0G9aC0hYYvIjZTwRO$`HJ1BymS?X@)oKw+covp7SL4v=w~Ay#X Date: Tue, 25 May 2021 00:01:45 -0700 Subject: [PATCH 5042/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/220d59c1-ff5d-4d3d-8c96-31cb4ab0153e PiperOrigin-RevId: 375640572 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7f22c70ccc5..6f4a0a93d95 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "72d201966007e86ac0c07448dfebe0a6e393d56dbc962816427c48968c19c6c7", - git_commit = "2eb5ed7cacd56a3e05fd9a660151e800cb2c68c6", + sha256 = "a251120edbee576edfe9596b295a61249f4dd5653d6295a8ea2c744ddbe46745", + git_commit = "70516aba1c38b01330f6a57404ca4a72a969b05a", ) # Import all of TensorFlow Serving's external dependencies. From 497371831655ff4aa4f74df2b65fe81dfa277697 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 25 May 2021 06:01:25 -0700 Subject: [PATCH 5043/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5634eadb-0c44-4efc-b6df-6744e7e955ae PiperOrigin-RevId: 375686333 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6f4a0a93d95..b2d0aa532f0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a251120edbee576edfe9596b295a61249f4dd5653d6295a8ea2c744ddbe46745", - git_commit = "70516aba1c38b01330f6a57404ca4a72a969b05a", + sha256 = "bc49715fa25b83eb5156283260f33034ef1a54f51a2300f3a52272e70863bf8a", + git_commit = "b037decfaf8aef5880c4332f2b62f17340201cc2", ) # Import all of TensorFlow Serving's external dependencies. From 7af9af513ab6af2e6271592e0e965b7ea6046d54 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 25 May 2021 12:01:21 -0700 Subject: [PATCH 5044/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2b2b2bdf-63cd-41fe-a1a6-92851d449b0a PiperOrigin-RevId: 375761934 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b2d0aa532f0..c544600aa30 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bc49715fa25b83eb5156283260f33034ef1a54f51a2300f3a52272e70863bf8a", - git_commit = "b037decfaf8aef5880c4332f2b62f17340201cc2", + sha256 = "8c2566cc5fc36d7da2583373ee9d9d16231d83ea5cd67f0a5cf3623050a99068", + git_commit = "87323d89e56cbab2d07ecdd838f3a1ced91b91f1", ) # Import all of TensorFlow Serving's external dependencies. From c9bd6717e0efdeda241599279c4f8f25e887549d Mon Sep 17 00:00:00 2001 From: Christina Sorokin Date: Tue, 25 May 2021 17:36:07 -0700 Subject: [PATCH 5045/8103] Fix argument name vs comment mismatch PiperOrigin-RevId: 375832891 --- tensorflow_serving/model_servers/prediction_service_impl.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tensorflow_serving/model_servers/prediction_service_impl.cc b/tensorflow_serving/model_servers/prediction_service_impl.cc index 1ef19c9de45..376ac910c4b 100644 --- a/tensorflow_serving/model_servers/prediction_service_impl.cc +++ b/tensorflow_serving/model_servers/prediction_service_impl.cc @@ -65,7 +65,7 @@ ::grpc::Status PredictionServiceImpl::Predict(::grpc::ServerContext *context, if (status.ok()) { RecordRequestLatency(request->model_spec().name(), /*api=*/"Predict", - /*runtime=*/"GRPC", + /*entrypoint=*/"GRPC", Env::Default()->NowMicros() - start); } else { VLOG(1) << "Predict failed: " << status.error_message(); @@ -105,7 +105,7 @@ ::grpc::Status PredictionServiceImpl::Classify( if (status.ok()) { RecordRequestLatency(request->model_spec().name(), /*api=*/"Classify", - /*runtime=*/"GRPC", + /*entrypoint=*/"GRPC", Env::Default()->NowMicros() - start); } else { VLOG(1) << "Classify request failed: " << status.error_message(); @@ -134,7 +134,7 @@ ::grpc::Status PredictionServiceImpl::Regress(::grpc::ServerContext *context, if (status.ok()) { RecordRequestLatency(request->model_spec().name(), /*api=*/"Regress", - /*runtime=*/"GRPC", + /*entrypoint=*/"GRPC", Env::Default()->NowMicros() - start); } else { VLOG(1) << "Regress request failed: " << status.error_message(); From 7e965fe1fa33a42c74505209d6c991f721b640e7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 25 May 2021 18:01:18 -0700 Subject: [PATCH 5046/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/48bda93f-fb99-43b8-a8f0-d45759205b77 PiperOrigin-RevId: 375836447 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c544600aa30..bfd4bfdfef1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8c2566cc5fc36d7da2583373ee9d9d16231d83ea5cd67f0a5cf3623050a99068", - git_commit = "87323d89e56cbab2d07ecdd838f3a1ced91b91f1", + sha256 = "b52bca4e511d1ec3acbc0ab8f0f9c85418994c40de103d3a4bcf87a8bf795a63", + git_commit = "336bbf97b3fe8173228a6d08e1c73556ae55fc14", ) # Import all of TensorFlow Serving's external dependencies. From 17d9c50fb511a305cb90567110c3179547089132 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 May 2021 00:01:28 -0700 Subject: [PATCH 5047/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8af553a2-c553-49f6-9092-c713fd812f9a PiperOrigin-RevId: 375879156 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bfd4bfdfef1..00b9caa69d5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b52bca4e511d1ec3acbc0ab8f0f9c85418994c40de103d3a4bcf87a8bf795a63", - git_commit = "336bbf97b3fe8173228a6d08e1c73556ae55fc14", + sha256 = "cd45fd9bd47a2f8f8795e5861e6446e7876eaaffbeb8b51935c790293a8d6d9b", + git_commit = "dc487160e67bdb9b4bb317e0922e3ae3eb513c43", ) # Import all of TensorFlow Serving's external dependencies. From 67800910463aa4ae7ee3e81aa70f51bbbd6404a2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 May 2021 06:01:32 -0700 Subject: [PATCH 5048/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/afb7f99c-61d8-4c0d-ac49-37f2cc95de2d PiperOrigin-RevId: 375924880 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 00b9caa69d5..30a6577169d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cd45fd9bd47a2f8f8795e5861e6446e7876eaaffbeb8b51935c790293a8d6d9b", - git_commit = "dc487160e67bdb9b4bb317e0922e3ae3eb513c43", + sha256 = "0d635965ea77547210858c7dcc8aa23049a1554d2ff131fb88b47717d12d7eb4", + git_commit = "5b3efc12bacb4c9197146619f419eeb696e402de", ) # Import all of TensorFlow Serving's external dependencies. From bfec93e232a95923eadad761147943f2e3841f92 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 May 2021 12:01:36 -0700 Subject: [PATCH 5049/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ce477e2a-fda0-4757-a51b-c4e744e311b5 PiperOrigin-RevId: 375997757 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 30a6577169d..b76d36298af 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0d635965ea77547210858c7dcc8aa23049a1554d2ff131fb88b47717d12d7eb4", - git_commit = "5b3efc12bacb4c9197146619f419eeb696e402de", + sha256 = "3f4663db44bb76625994d7627296ce862e69d930927761b4c575715e1190ba5f", + git_commit = "81533bafb024606fc2d6f34716b4c3be21446b92", ) # Import all of TensorFlow Serving's external dependencies. From fe039e69b61d7c32b71e46905639a195b1752c17 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 26 May 2021 18:01:38 -0700 Subject: [PATCH 5050/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1007f9c2-101e-43c4-ab8b-fb3c0068354f PiperOrigin-RevId: 376069196 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b76d36298af..aa95d8a3b25 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3f4663db44bb76625994d7627296ce862e69d930927761b4c575715e1190ba5f", - git_commit = "81533bafb024606fc2d6f34716b4c3be21446b92", + sha256 = "282ee9fbb5572405c24ea330bc4ded03c187ccee73e53ef6eaa962ae9e27e5dd", + git_commit = "6bb5020d1936d2c04da31740f14c25c08b268242", ) # Import all of TensorFlow Serving's external dependencies. From 96007d21dd50e05b075289bda6d04179e198cd5b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 May 2021 00:01:40 -0700 Subject: [PATCH 5051/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3abc529a-0456-4142-bad3-5ac8586e6d3b PiperOrigin-RevId: 376108478 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index aa95d8a3b25..698d8c27bc6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "282ee9fbb5572405c24ea330bc4ded03c187ccee73e53ef6eaa962ae9e27e5dd", - git_commit = "6bb5020d1936d2c04da31740f14c25c08b268242", + sha256 = "866ceb73ad3afb8712d14df51fb0ec34c3350710970642ef96d1593354ba07ee", + git_commit = "d59e22e35a9109a08c9101110788bf595e8977b3", ) # Import all of TensorFlow Serving's external dependencies. From b9cca8fb4615e5ee6e43be8e6237574a3ca9fddf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 May 2021 06:01:44 -0700 Subject: [PATCH 5052/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/edd108c6-79c2-432f-a8ae-f8ac83769b6e PiperOrigin-RevId: 376152288 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 698d8c27bc6..84b61b15940 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "866ceb73ad3afb8712d14df51fb0ec34c3350710970642ef96d1593354ba07ee", - git_commit = "d59e22e35a9109a08c9101110788bf595e8977b3", + sha256 = "91fd99214fcbc784b97b1769262af39a56e7ceee0a3dc09de0d061f731890c2f", + git_commit = "5d0e0fd6ce2838a603b47e9289f52537f946a20f", ) # Import all of TensorFlow Serving's external dependencies. From 12a17bbeef355578b993c9962118fac6ebb6d638 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 May 2021 12:01:25 -0700 Subject: [PATCH 5053/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/cab70f2e-a0c1-49ff-95a5-6e2576e9e36d PiperOrigin-RevId: 376218800 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 84b61b15940..963402bc694 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "91fd99214fcbc784b97b1769262af39a56e7ceee0a3dc09de0d061f731890c2f", - git_commit = "5d0e0fd6ce2838a603b47e9289f52537f946a20f", + sha256 = "a2cf03a273fa48f3527ac631a00cd367db3672414700f37891960254f9bca3e7", + git_commit = "93312aa6910f123a9cdd4f2f9e310991207efcd3", ) # Import all of TensorFlow Serving's external dependencies. From db50e5c6c9dbd1abbc82dc403f9353177d6efc62 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 May 2021 18:03:03 -0700 Subject: [PATCH 5054/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/169a22c4-a308-4bbd-a7a6-2c2f194b0c15 PiperOrigin-RevId: 376287666 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 963402bc694..35f40ff2565 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a2cf03a273fa48f3527ac631a00cd367db3672414700f37891960254f9bca3e7", - git_commit = "93312aa6910f123a9cdd4f2f9e310991207efcd3", + sha256 = "7667e29202cf381adb95cabd7e410a082a1acb320a75f25d30b3fb0670b0e400", + git_commit = "bf3d89b1e8bc5e00271c2fbd57a8b3ff55d48462", ) # Import all of TensorFlow Serving's external dependencies. From fd33d1245abe5ed9c537ba7dd64c252235a1bb19 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 28 May 2021 00:01:34 -0700 Subject: [PATCH 5055/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a6de2538-a8b3-4af2-8b38-ab1260f359dd PiperOrigin-RevId: 376321173 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 35f40ff2565..60f501facef 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7667e29202cf381adb95cabd7e410a082a1acb320a75f25d30b3fb0670b0e400", - git_commit = "bf3d89b1e8bc5e00271c2fbd57a8b3ff55d48462", + sha256 = "de0792def07f73363c17102b3005b9f7f964bd9457ba89c21c3d697d52e297f6", + git_commit = "c919389186e8229a5a5e13ac7325212a8eacb205", ) # Import all of TensorFlow Serving's external dependencies. From 3259007911045ffd0639ae0be4de31ebd26e23e9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 28 May 2021 06:01:30 -0700 Subject: [PATCH 5056/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0cc13807-975a-4576-80ef-4db7cc72920d PiperOrigin-RevId: 376353092 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 60f501facef..e747b0cc05d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "de0792def07f73363c17102b3005b9f7f964bd9457ba89c21c3d697d52e297f6", - git_commit = "c919389186e8229a5a5e13ac7325212a8eacb205", + sha256 = "290e44a192fde042b69f5c47645d6921fb26e7482d6df40672a0289930d722f1", + git_commit = "582d021829a72c5cf7d82771ebd76f665face366", ) # Import all of TensorFlow Serving's external dependencies. From 30491f99e820582007a9f7a4e30b7586688e837b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 28 May 2021 12:01:44 -0700 Subject: [PATCH 5057/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/99308b17-0997-4fb3-9b15-ed125997a426 PiperOrigin-RevId: 376382113 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e747b0cc05d..1cfab206858 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "290e44a192fde042b69f5c47645d6921fb26e7482d6df40672a0289930d722f1", - git_commit = "582d021829a72c5cf7d82771ebd76f665face366", + sha256 = "683bfeed6f094356b7cc3c8901bef7a2550c45f0198475b76a0ef6e5a1058f5e", + git_commit = "cda12732ca4610434937259b881965165564193d", ) # Import all of TensorFlow Serving's external dependencies. From 014f7ad67820501b5db235baa38d862115b50ba7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 28 May 2021 18:01:28 -0700 Subject: [PATCH 5058/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ea091acf-5b18-424d-bb02-2ad5d4e57764 PiperOrigin-RevId: 376408952 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1cfab206858..dfb8d2ae9e5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "683bfeed6f094356b7cc3c8901bef7a2550c45f0198475b76a0ef6e5a1058f5e", - git_commit = "cda12732ca4610434937259b881965165564193d", + sha256 = "0ea1f392954410758e33e599de20a75be8ef9a705063f13ceac68a11bd7e4bdd", + git_commit = "f55e8d6ac8e68f5ab3e8c38374b1203f863cb8b8", ) # Import all of TensorFlow Serving's external dependencies. From 634f97fd1ca87e58159dfa95330c82e03d9ffe1c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 29 May 2021 00:01:33 -0700 Subject: [PATCH 5059/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/01d85283-ea1a-47ed-8588-98173683e0c4 PiperOrigin-RevId: 376433519 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dfb8d2ae9e5..85089f7cee6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0ea1f392954410758e33e599de20a75be8ef9a705063f13ceac68a11bd7e4bdd", - git_commit = "f55e8d6ac8e68f5ab3e8c38374b1203f863cb8b8", + sha256 = "86a7de2c1cff39f4769a150402f1a4eaee29ccc3907fa4e0611224c25c518405", + git_commit = "e608ef6eede05b6d7864201b181968bdc962362f", ) # Import all of TensorFlow Serving's external dependencies. From 7fc6f907d1202df5317a5f4abf3e50129e0e3517 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 29 May 2021 06:01:41 -0700 Subject: [PATCH 5060/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e2762c15-d934-4dda-a76a-22ce2ff8294a PiperOrigin-RevId: 376458272 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 85089f7cee6..7cdc46f13bb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "86a7de2c1cff39f4769a150402f1a4eaee29ccc3907fa4e0611224c25c518405", - git_commit = "e608ef6eede05b6d7864201b181968bdc962362f", + sha256 = "3afcd36f3def8189fd79aea391676d97d7898b06a63666476f9eac39de95c657", + git_commit = "eaa6753876e6a5974258e7244f46bfe8b27f906d", ) # Import all of TensorFlow Serving's external dependencies. From f178c2d6ff461438b7e9edf5745868789965be03 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 30 May 2021 06:01:42 -0700 Subject: [PATCH 5061/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1d0fba34-9b7f-490a-beb2-f5269382509d PiperOrigin-RevId: 376550779 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7cdc46f13bb..3cfb3c87031 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3afcd36f3def8189fd79aea391676d97d7898b06a63666476f9eac39de95c657", - git_commit = "eaa6753876e6a5974258e7244f46bfe8b27f906d", + sha256 = "8c1b1308f5207c7457c5e60add54668f2a58a5147b003ab3e0ab89579d9dd7e7", + git_commit = "cd1d62cd15a1889bb3cef906fa5322b65b16953d", ) # Import all of TensorFlow Serving's external dependencies. From b50e6a442302cfd8459ef88d952bdca33f9124f1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 31 May 2021 00:01:48 -0700 Subject: [PATCH 5062/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7204fd00-68f3-4fd4-b2ff-cac218a95b57 PiperOrigin-RevId: 376627835 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3cfb3c87031..bccc051f91b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8c1b1308f5207c7457c5e60add54668f2a58a5147b003ab3e0ab89579d9dd7e7", - git_commit = "cd1d62cd15a1889bb3cef906fa5322b65b16953d", + sha256 = "0b00cabd3ce4ccfd0ae39a826b3918632132028023a0a70778c95bcc8cefdf6c", + git_commit = "d0e3ce5b4bc8bea4bbb9fe51635dd36104e4ad86", ) # Import all of TensorFlow Serving's external dependencies. From 12ac2205c6aebe0e9a9746d9e3436897bf123e76 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 31 May 2021 06:01:45 -0700 Subject: [PATCH 5063/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a5406929-49c3-4d45-abb8-cfe724c978be PiperOrigin-RevId: 376671052 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bccc051f91b..df824922d10 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0b00cabd3ce4ccfd0ae39a826b3918632132028023a0a70778c95bcc8cefdf6c", - git_commit = "d0e3ce5b4bc8bea4bbb9fe51635dd36104e4ad86", + sha256 = "4e0eef3d2aad18304a95296f6a148906b99690f2b731eb95a76b863a4cf42525", + git_commit = "62071f0c3745e92bddc7f16f48397bd4bdd749f8", ) # Import all of TensorFlow Serving's external dependencies. From d5bb2ef12b28f186e1c8e203cebf4ddd4d4602d6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 31 May 2021 12:01:46 -0700 Subject: [PATCH 5064/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/71f766e6-aaca-4956-9a77-b31d3456f012 PiperOrigin-RevId: 376708789 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index df824922d10..21c2a342370 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4e0eef3d2aad18304a95296f6a148906b99690f2b731eb95a76b863a4cf42525", - git_commit = "62071f0c3745e92bddc7f16f48397bd4bdd749f8", + sha256 = "7fae793cc696c7d71369a1462341ba604193c798a8e9f778152c089982623b5d", + git_commit = "f19bfff186754e621d59a65494b04ff9ab4e9ede", ) # Import all of TensorFlow Serving's external dependencies. From 6254841f1ff27c29387639df32962151503852c8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 31 May 2021 18:01:39 -0700 Subject: [PATCH 5065/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/96cf71b8-cfb8-4634-8eb4-22c421ae9d02 PiperOrigin-RevId: 376738211 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 21c2a342370..f92c676342a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7fae793cc696c7d71369a1462341ba604193c798a8e9f778152c089982623b5d", - git_commit = "f19bfff186754e621d59a65494b04ff9ab4e9ede", + sha256 = "bc000a2847b1b2b8c3b749fc64342fd69a8dbf043825ac94f7e2a43e945795b7", + git_commit = "7e71a1eb87302bca4d7aaede8668462df1438afe", ) # Import all of TensorFlow Serving's external dependencies. From 568aeb172b77e9f37e77c382a01db13667c7c64d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 1 Jun 2021 00:01:37 -0700 Subject: [PATCH 5066/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c3549186-3769-4dfc-a12d-db034f2e9355 PiperOrigin-RevId: 376769884 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f92c676342a..031e07f559f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bc000a2847b1b2b8c3b749fc64342fd69a8dbf043825ac94f7e2a43e945795b7", - git_commit = "7e71a1eb87302bca4d7aaede8668462df1438afe", + sha256 = "5255e7e5324e182026bb1f4f08a2120ed8d4cff2f202d836de90a50f3a32262c", + git_commit = "2305f9d0a58921987788fbd1d8fa43eda888233f", ) # Import all of TensorFlow Serving's external dependencies. From e71d4714d5b1e19e566a74a1f86eab9eee62c03c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 1 Jun 2021 06:01:24 -0700 Subject: [PATCH 5067/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/dc1cf067-5c8a-4bcc-a627-b137a27c84a6 PiperOrigin-RevId: 376814528 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 031e07f559f..79a0043ce9b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5255e7e5324e182026bb1f4f08a2120ed8d4cff2f202d836de90a50f3a32262c", - git_commit = "2305f9d0a58921987788fbd1d8fa43eda888233f", + sha256 = "700290b53aa54f51c1d55902f0d84f33bf3a7d73c531699c57bc58e74e033cd6", + git_commit = "a378834057a3422a9f1e52b41596b3852b2c4ae9", ) # Import all of TensorFlow Serving's external dependencies. From 5574d578c7f9074f19f786fd7d8fa3bb44db5140 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 1 Jun 2021 12:01:32 -0700 Subject: [PATCH 5068/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0dace4d2-1bfb-4142-98ad-c87227b4b3a2 PiperOrigin-RevId: 376887062 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 79a0043ce9b..7ef8977f8cf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "700290b53aa54f51c1d55902f0d84f33bf3a7d73c531699c57bc58e74e033cd6", - git_commit = "a378834057a3422a9f1e52b41596b3852b2c4ae9", + sha256 = "39f91101c1dcbb8d19e5306bcc5eec771015e87562d9542204c6d3f58dead9dd", + git_commit = "61125f278428cbd4096806f1ba78b2116f961246", ) # Import all of TensorFlow Serving's external dependencies. From 729bf545c5229d2f9f0fb8344830f7760ae541ac Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 1 Jun 2021 18:01:43 -0700 Subject: [PATCH 5069/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bff5c11a-0dfd-4d44-95ae-a0c7cd1cf1d1 PiperOrigin-RevId: 376958571 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7ef8977f8cf..cb5c04feb2b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "39f91101c1dcbb8d19e5306bcc5eec771015e87562d9542204c6d3f58dead9dd", - git_commit = "61125f278428cbd4096806f1ba78b2116f961246", + sha256 = "166bc69dfc62a0f36a6893a033377064f9581b744e3db25aacb940f1d0fa33c9", + git_commit = "1acfde6e42c1007b028c82833c5922f14023d6fe", ) # Import all of TensorFlow Serving's external dependencies. From b5ca0c6843c0a37af2bb0eb4c41bcb42f01a6593 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 2 Jun 2021 00:01:40 -0700 Subject: [PATCH 5070/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5f2ae4b6-309b-40a5-af2f-88e08eae293b PiperOrigin-RevId: 376997020 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cb5c04feb2b..105007505b3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "166bc69dfc62a0f36a6893a033377064f9581b744e3db25aacb940f1d0fa33c9", - git_commit = "1acfde6e42c1007b028c82833c5922f14023d6fe", + sha256 = "251c848cd4638ce6dd0f24513fe1f16ae06673798d167c1f0440391542bf1e72", + git_commit = "452bfa33b7e281865a71ef42b0930519da90c306", ) # Import all of TensorFlow Serving's external dependencies. From 19abe35309fabd2894609da37ac7eccdc13d38c5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 2 Jun 2021 06:02:09 -0700 Subject: [PATCH 5071/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0986bd49-d8c9-4f88-8b8c-62c01bff4c85 PiperOrigin-RevId: 377040954 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 105007505b3..b0bad36564b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "251c848cd4638ce6dd0f24513fe1f16ae06673798d167c1f0440391542bf1e72", - git_commit = "452bfa33b7e281865a71ef42b0930519da90c306", + sha256 = "d3c9866dd389413b674e2f7997afec34df8180aaf6900eaecbe5c7dbe39d3c9d", + git_commit = "3aea0a0021fe4c54f31cce4d671d0638480e7458", ) # Import all of TensorFlow Serving's external dependencies. From 2331306c3daac3e922ecdafab5c71c6904764178 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 2 Jun 2021 12:01:53 -0700 Subject: [PATCH 5072/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/62d7501e-9f6c-4a82-b96e-e5af2b3737b4 PiperOrigin-RevId: 377112486 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b0bad36564b..47c4f8871f0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d3c9866dd389413b674e2f7997afec34df8180aaf6900eaecbe5c7dbe39d3c9d", - git_commit = "3aea0a0021fe4c54f31cce4d671d0638480e7458", + sha256 = "0181e7e611a80dc1a87723f2b2362c3d04c518f1025eff5dd1ad516e2f557ac3", + git_commit = "f036fd95770d38383b579a46070897ae2d2236ee", ) # Import all of TensorFlow Serving's external dependencies. From 2789af0817bcd51f177161f67576ec2f33cb747b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 2 Jun 2021 18:06:40 -0700 Subject: [PATCH 5073/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d5381034-ef33-4b65-86e4-fb860f217bd5 PiperOrigin-RevId: 377188103 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 47c4f8871f0..6c2605f6603 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0181e7e611a80dc1a87723f2b2362c3d04c518f1025eff5dd1ad516e2f557ac3", - git_commit = "f036fd95770d38383b579a46070897ae2d2236ee", + sha256 = "959a5469f4c603f64d4d84c5cab3e574ba936d55ec2708be9d5444f695da3304", + git_commit = "68961af227509eb67147fe4af9420acfa43348c2", ) # Import all of TensorFlow Serving's external dependencies. From a3a7cd8e08a6b6648110cae0a13b6b7e4bc79d98 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 3 Jun 2021 00:01:53 -0700 Subject: [PATCH 5074/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5fdecf8f-b14e-495e-8071-5e4af582e886 PiperOrigin-RevId: 377227308 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6c2605f6603..e394cf17e99 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "959a5469f4c603f64d4d84c5cab3e574ba936d55ec2708be9d5444f695da3304", - git_commit = "68961af227509eb67147fe4af9420acfa43348c2", + sha256 = "1dcad34e55eb6f708ac5a75bae313360c31ac241518b70257464d4599bb31f80", + git_commit = "30c5cd04bb3bd069f253c0a89070edb03887bf52", ) # Import all of TensorFlow Serving's external dependencies. From f1e7ef6da1154f4657786ba6a0e5d8a81495d046 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 3 Jun 2021 06:01:22 -0700 Subject: [PATCH 5075/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f6954a40-6c5e-4245-8ea3-f7741dce54d7 PiperOrigin-RevId: 377271405 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e394cf17e99..a2a51797ab9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1dcad34e55eb6f708ac5a75bae313360c31ac241518b70257464d4599bb31f80", - git_commit = "30c5cd04bb3bd069f253c0a89070edb03887bf52", + sha256 = "e6f9c9413a795e0139ad67031d2b7ddfe89fb907895a12f5473d2e5a66ed7456", + git_commit = "f755cbe1151d02a52684b2e61f48149e6e37d078", ) # Import all of TensorFlow Serving's external dependencies. From f1de25329a21cd079f6e9bfb25d6da8fb5402436 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 3 Jun 2021 12:01:37 -0700 Subject: [PATCH 5076/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/257a025d-11f2-4bac-beb2-c0050aa327ec PiperOrigin-RevId: 377341478 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a2a51797ab9..09e16479ef2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e6f9c9413a795e0139ad67031d2b7ddfe89fb907895a12f5473d2e5a66ed7456", - git_commit = "f755cbe1151d02a52684b2e61f48149e6e37d078", + sha256 = "c8641b09f2e1eceecd8799fee87b1441475f23c79133cd873302d2171dc79831", + git_commit = "8be2640d44c8b4012e7863c93eea3ccb14f75151", ) # Import all of TensorFlow Serving's external dependencies. From 4558fcfce9eba92a943074a22925983fa55515a5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 3 Jun 2021 18:01:22 -0700 Subject: [PATCH 5077/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/505c31b3-7616-4f72-97cf-c8ab301adfab PiperOrigin-RevId: 377413441 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 09e16479ef2..2c930c15793 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c8641b09f2e1eceecd8799fee87b1441475f23c79133cd873302d2171dc79831", - git_commit = "8be2640d44c8b4012e7863c93eea3ccb14f75151", + sha256 = "bc009734c8a2b4277f2c969ec7f8ad7b77c38e72fbe4c62c1c6929e435067475", + git_commit = "932ef80eb01caf2c1bc1398a3c1b6a5ca94efa62", ) # Import all of TensorFlow Serving's external dependencies. From 74eea26f981493f3e33bad843e0b476659a56cb9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 4 Jun 2021 00:02:04 -0700 Subject: [PATCH 5078/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e8c65fb7-d410-4db5-a239-c1b137b8fd57 PiperOrigin-RevId: 377453333 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2c930c15793..5968040ab69 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bc009734c8a2b4277f2c969ec7f8ad7b77c38e72fbe4c62c1c6929e435067475", - git_commit = "932ef80eb01caf2c1bc1398a3c1b6a5ca94efa62", + sha256 = "3e64e645b55eaa914c7f953c0ae0916a40e6d292afe710a6ab86cfd04765e43f", + git_commit = "22871c07fdc4b3ad8f2c8965981be5328fdbbf57", ) # Import all of TensorFlow Serving's external dependencies. From 51c4a36ccb7f43e4762590329e661c10f0951e7c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 4 Jun 2021 06:01:24 -0700 Subject: [PATCH 5079/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/247c898b-efd0-47df-90fc-6695701ceafa PiperOrigin-RevId: 377495888 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5968040ab69..9e011605fdb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3e64e645b55eaa914c7f953c0ae0916a40e6d292afe710a6ab86cfd04765e43f", - git_commit = "22871c07fdc4b3ad8f2c8965981be5328fdbbf57", + sha256 = "bc03205d17f9fb4f4a839406d967a74f2064e5b41fe9d7f219642f4ddf32ad82", + git_commit = "695b4c93d5da7277eb845937b79b66f9f363ed94", ) # Import all of TensorFlow Serving's external dependencies. From 172ed5ced77d3f924a0fa18fc67333c535e41713 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 4 Jun 2021 12:01:53 -0700 Subject: [PATCH 5080/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/70ba9249-0ca1-4d61-ac2d-eec6d4e69a10 PiperOrigin-RevId: 377559666 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9e011605fdb..6816205290c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bc03205d17f9fb4f4a839406d967a74f2064e5b41fe9d7f219642f4ddf32ad82", - git_commit = "695b4c93d5da7277eb845937b79b66f9f363ed94", + sha256 = "76abb1f2cca56ce6b45f0eeaa01bd1ebf96ad21a25c188b9dee5d40aaf32b402", + git_commit = "8c2b12a51b30f3d477bf7f275e9334a5aca68e93", ) # Import all of TensorFlow Serving's external dependencies. From 203b01118a3485c2aeeb2ea10bde92c726c60c14 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 4 Jun 2021 18:01:22 -0700 Subject: [PATCH 5081/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/92ee3d15-4b1a-4bb6-8996-fa7883dc68df PiperOrigin-RevId: 377624282 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6816205290c..cdd2851fdb7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "76abb1f2cca56ce6b45f0eeaa01bd1ebf96ad21a25c188b9dee5d40aaf32b402", - git_commit = "8c2b12a51b30f3d477bf7f275e9334a5aca68e93", + sha256 = "a139df0987dd5306280be6dda31db0cd41e29b6d0a897113305b2630fdd61853", + git_commit = "0ac7d6c367f3993756f9755cef0b0c72e4d68039", ) # Import all of TensorFlow Serving's external dependencies. From be955a51a8842c7288e8c5465388a1e02f75d506 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 5 Jun 2021 00:04:20 -0700 Subject: [PATCH 5082/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0cfb178c-4122-4c79-a17f-8c94bb47a86a PiperOrigin-RevId: 377653292 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cdd2851fdb7..3e172d08722 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a139df0987dd5306280be6dda31db0cd41e29b6d0a897113305b2630fdd61853", - git_commit = "0ac7d6c367f3993756f9755cef0b0c72e4d68039", + sha256 = "4179cd15eb55719d49dc3bdaf204a17de00809effd553862bcd20037a693bfb7", + git_commit = "50d3d201f31cf8c4dca37255f4fda581b75afbb8", ) # Import all of TensorFlow Serving's external dependencies. From a436e55d4643123461ad3b99ce2c05092fadf2a3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 5 Jun 2021 06:02:04 -0700 Subject: [PATCH 5083/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0d1aaf3e-e9ae-480a-b386-7b9c6ab287fc PiperOrigin-RevId: 377679786 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3e172d08722..75d91951a70 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4179cd15eb55719d49dc3bdaf204a17de00809effd553862bcd20037a693bfb7", - git_commit = "50d3d201f31cf8c4dca37255f4fda581b75afbb8", + sha256 = "3e2579390c590eef8ea488fda06a424b057bc91f56c618fb287c2e246c41b446", + git_commit = "596967c699fd6b742cd11926b9d0ea2fbedc599c", ) # Import all of TensorFlow Serving's external dependencies. From 38de4f4433fbeae9c8b6495a77daa80b4c39c7e9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 5 Jun 2021 18:01:33 -0700 Subject: [PATCH 5084/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f0199f97-f39d-4e0e-b3a3-e62f7a187dec PiperOrigin-RevId: 377725215 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 75d91951a70..4850078fc7c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3e2579390c590eef8ea488fda06a424b057bc91f56c618fb287c2e246c41b446", - git_commit = "596967c699fd6b742cd11926b9d0ea2fbedc599c", + sha256 = "f13fabd6198f85055431de08f8b34fc5de5b0fba5049936b2f12caa269d623f9", + git_commit = "fc3afac450629ce2b54073beea9cf40dafbb1964", ) # Import all of TensorFlow Serving's external dependencies. From a67cf0656756a86ab32266b991755f4eaf9a572a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 6 Jun 2021 06:01:19 -0700 Subject: [PATCH 5085/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b0c7afe5-15bc-448f-ac04-5008056410de PiperOrigin-RevId: 377772093 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4850078fc7c..dd2dfb936c6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f13fabd6198f85055431de08f8b34fc5de5b0fba5049936b2f12caa269d623f9", - git_commit = "fc3afac450629ce2b54073beea9cf40dafbb1964", + sha256 = "2f74b403bc5ac22dbdce9e02b188df1fe2829f80b7b6d4012ca9d9837934c7cb", + git_commit = "a0991e859fe45ddb04d8b618e6b602684726b2e5", ) # Import all of TensorFlow Serving's external dependencies. From e847e842002c53c3a4ebe894e717c2367c8df65c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 7 Jun 2021 00:01:35 -0700 Subject: [PATCH 5086/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5960a7e4-d84e-4284-9575-b9e8d3837ecd PiperOrigin-RevId: 377850608 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dd2dfb936c6..c11ef84841b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2f74b403bc5ac22dbdce9e02b188df1fe2829f80b7b6d4012ca9d9837934c7cb", - git_commit = "a0991e859fe45ddb04d8b618e6b602684726b2e5", + sha256 = "7d6bc220c97e49a112056d284b89ba2b59d4908ea35eb4cdeb55afcaa6090ed7", + git_commit = "9addc52fb8930664bfef0fbe40f3e130e44b6b2f", ) # Import all of TensorFlow Serving's external dependencies. From 18be5cca5f2ab80f9dde942d3960b95512e155e0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 7 Jun 2021 06:01:21 -0700 Subject: [PATCH 5087/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/75570f6c-cf32-4dd5-88c1-6cdadf29dae4 PiperOrigin-RevId: 377896760 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c11ef84841b..17a0dfa1e7b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7d6bc220c97e49a112056d284b89ba2b59d4908ea35eb4cdeb55afcaa6090ed7", - git_commit = "9addc52fb8930664bfef0fbe40f3e130e44b6b2f", + sha256 = "3945506a09360634f98ccd904895f2be9f3de8781a99db6fbdcddfd2ad2aa26e", + git_commit = "f83eb8828a572338388b8ffdbe6380860387b0cc", ) # Import all of TensorFlow Serving's external dependencies. From f6f1e161f8461790af8173b60acb8378a615c05d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 7 Jun 2021 12:01:56 -0700 Subject: [PATCH 5088/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7a4b1848-c3b2-492a-9689-bd4c62d243bf PiperOrigin-RevId: 377972220 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 17a0dfa1e7b..09e8533b0af 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3945506a09360634f98ccd904895f2be9f3de8781a99db6fbdcddfd2ad2aa26e", - git_commit = "f83eb8828a572338388b8ffdbe6380860387b0cc", + sha256 = "56a425d7055497f55a7dbc39a455bf8492fb04b3fc61ae690d3990d4f3369280", + git_commit = "92e9fb1a0f8c99ff8c4fbdc026c1c9286adc2356", ) # Import all of TensorFlow Serving's external dependencies. From 4ce9c6b98753cbdcffbacf3767ae2157eb664069 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Mon, 7 Jun 2021 15:38:38 -0700 Subject: [PATCH 5089/8103] cleanup unused vars+functions. PiperOrigin-RevId: 378021765 --- tensorflow_serving/core/request_logger_test.cc | 2 -- .../model_servers/http_rest_api_handler_test.cc | 1 - .../tensorflow/classification_service_test.cc | 1 - .../servables/tensorflow/multi_inference_test.cc | 1 - .../tensorflow/regression_service_test.cc | 1 - .../tensorflow/saved_model_bundle_factory.cc | 16 ---------------- tensorflow_serving/util/json_tensor.cc | 9 --------- 7 files changed, 31 deletions(-) diff --git a/tensorflow_serving/core/request_logger_test.cc b/tensorflow_serving/core/request_logger_test.cc index b80a00b0cba..fcc269262ca 100644 --- a/tensorflow_serving/core/request_logger_test.cc +++ b/tensorflow_serving/core/request_logger_test.cc @@ -46,8 +46,6 @@ using ::testing::Invoke; using ::testing::NiceMock; using ::testing::Return; -constexpr char kSavedModelTags[] = "server,tpu"; - class RequestLoggerTest : public ::testing::Test { protected: RequestLoggerTest() { diff --git a/tensorflow_serving/model_servers/http_rest_api_handler_test.cc b/tensorflow_serving/model_servers/http_rest_api_handler_test.cc index b98312fede0..c7f1f707c2b 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler_test.cc +++ b/tensorflow_serving/model_servers/http_rest_api_handler_test.cc @@ -50,7 +50,6 @@ using ::testing::UnorderedElementsAreArray; constexpr char kTestModelBasePath[] = "cc/saved_model/testdata/half_plus_two"; constexpr char kTestModelName[] = "saved_model_half_plus_two_2_versions"; -constexpr char kNonexistentModelName[] = "nonexistent_model"; constexpr int kTestModelVersion1 = 123; constexpr char kTestModelVersionLabel[] = "Version_Label"; constexpr char kNonexistentModelVersionLabel[] = "Version_Nonexistent"; diff --git a/tensorflow_serving/servables/tensorflow/classification_service_test.cc b/tensorflow_serving/servables/tensorflow/classification_service_test.cc index f439375acde..2311d7635e7 100644 --- a/tensorflow_serving/servables/tensorflow/classification_service_test.cc +++ b/tensorflow_serving/servables/tensorflow/classification_service_test.cc @@ -37,7 +37,6 @@ namespace serving { namespace { constexpr char kTestModelName[] = "test_model"; -constexpr int kTestModelVersion = 123; // Test fixture for ClassificationService related tests sets up a ServerCore // pointing to the half_plus_two SavedModel. diff --git a/tensorflow_serving/servables/tensorflow/multi_inference_test.cc b/tensorflow_serving/servables/tensorflow/multi_inference_test.cc index 25cc73fa5ed..89533d4b96c 100644 --- a/tensorflow_serving/servables/tensorflow/multi_inference_test.cc +++ b/tensorflow_serving/servables/tensorflow/multi_inference_test.cc @@ -38,7 +38,6 @@ namespace serving { namespace { constexpr char kTestModelName[] = "test_model"; -constexpr int kTestModelVersion = 123; // Test fixture for MultiInferenceTest related tests sets up a ServerCore // pointing to TF1 or TF2 version of half_plus_two SavedModel (based on `T`). diff --git a/tensorflow_serving/servables/tensorflow/regression_service_test.cc b/tensorflow_serving/servables/tensorflow/regression_service_test.cc index 824e0df55a2..068c077e546 100644 --- a/tensorflow_serving/servables/tensorflow/regression_service_test.cc +++ b/tensorflow_serving/servables/tensorflow/regression_service_test.cc @@ -36,7 +36,6 @@ namespace serving { namespace { constexpr char kTestModelName[] = "test_model"; -constexpr int kTestModelVersion = 123; // Test fixture for RegressionService related tests sets up a ServerCore // pointing to the half_plus_two SavedModel. diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc index 2b2c202063d..008207f7ca4 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc @@ -43,22 +43,6 @@ std::vector GetSignatureDefs(const SavedModelBundle& bundle) { return signature_defs; } -// Parses a repeated field of NamedTensorProtos into a corresponding list of -// name/tensor pairs. -Status ParseFixedInputTensors( - const protobuf::RepeatedPtrField& protos, - std::vector>* parsed) { - for (const NamedTensorProto& proto : protos) { - Tensor tensor; - if (!tensor.FromProto(proto.tensor())) { - return errors::InvalidArgument("Unable to parse tensor proto: ", - proto.tensor().ShortDebugString()); - } - parsed->push_back({proto.name(), tensor}); - } - return Status::OK(); -} - // TODO(b/140959776): Move this upstream alongside `kSavedModelFilenamePb`. const char kTfLiteModelFilename[] = "model.tflite"; diff --git a/tensorflow_serving/util/json_tensor.cc b/tensorflow_serving/util/json_tensor.cc index c12f7cb97ea..58f1a920472 100644 --- a/tensorflow_serving/util/json_tensor.cc +++ b/tensorflow_serving/util/json_tensor.cc @@ -298,15 +298,6 @@ void GetDenseTensorShape(const rapidjson::Value& val, TensorShapeProto* shape) { } } -// Returns size (number of elements) expected in a tensor of given shape. -int GetTensorSize(const TensorShapeProto& shape) { - int size = 1; - for (const auto& dim : shape.dim()) { - size *= dim.size(); - } - return size; -} - bool IsValBase64Object(const rapidjson::Value& val) { // Base64 encoded data is a JSON object formatted as: // { "b64" : " Date: Mon, 7 Jun 2021 18:01:16 -0700 Subject: [PATCH 5090/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/517ecec2-acb7-4cf8-b525-93d1d4fe59cf PiperOrigin-RevId: 378047920 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 09e8533b0af..13a0371a9ed 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "56a425d7055497f55a7dbc39a455bf8492fb04b3fc61ae690d3990d4f3369280", - git_commit = "92e9fb1a0f8c99ff8c4fbdc026c1c9286adc2356", + sha256 = "3886e042f9f73b482a86005f46089b025c31c1c9692fe340570479047ad85a82", + git_commit = "3e6eb263935b2a23aa4af90751755e44263a57d7", ) # Import all of TensorFlow Serving's external dependencies. From f2958313f4a29bc107fb345d04a2c1788beb743a Mon Sep 17 00:00:00 2001 From: Li Lao Date: Mon, 7 Jun 2021 19:27:06 -0700 Subject: [PATCH 5091/8103] Internal change. PiperOrigin-RevId: 378058672 --- tensorflow_serving/core/loader_harness.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tensorflow_serving/core/loader_harness.cc b/tensorflow_serving/core/loader_harness.cc index 72141cf0370..95a7bfb2e08 100644 --- a/tensorflow_serving/core/loader_harness.cc +++ b/tensorflow_serving/core/loader_harness.cc @@ -166,8 +166,11 @@ Status LoaderHarness::TransitionState(const State from, const State to) { const Status error = errors::Internal( "Illegal request to transition from state ", StateDebugString(state_), " to ", StateDebugString(to)); - DCHECK(false) << error; +#ifndef NDEBUG + LOG(FATAL) << error; // Crash OK +#else ErrorInternal(error); +#endif return error; } state_ = to; From ddc342189e506d3c0500f9a01d831cb2df9589f0 Mon Sep 17 00:00:00 2001 From: Li Lao Date: Mon, 7 Jun 2021 20:41:00 -0700 Subject: [PATCH 5092/8103] Internal change. PiperOrigin-RevId: 378066531 --- tensorflow_serving/util/BUILD | 1 + tensorflow_serving/util/any_ptr_test.cc | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/util/BUILD b/tensorflow_serving/util/BUILD index 9e13307ced1..5beb2fb1dee 100644 --- a/tensorflow_serving/util/BUILD +++ b/tensorflow_serving/util/BUILD @@ -166,6 +166,7 @@ cc_test( deps = [ ":any_ptr", "//tensorflow_serving/core/test_util:test_main", + "@com_google_absl//absl/base:core_headers", ], ) diff --git a/tensorflow_serving/util/any_ptr_test.cc b/tensorflow_serving/util/any_ptr_test.cc index 486b3dbded9..8148f7595f0 100644 --- a/tensorflow_serving/util/any_ptr_test.cc +++ b/tensorflow_serving/util/any_ptr_test.cc @@ -16,6 +16,7 @@ limitations under the License. #include "tensorflow_serving/util/any_ptr.h" #include +#include "absl/base/attributes.h" namespace tensorflow { namespace serving { @@ -52,7 +53,7 @@ TEST(AnyPtrTest, BaseClass) { virtual ~Base() {} private: - int unused_base_var_ = 0; + int unused_base_var_ ABSL_ATTRIBUTE_UNUSED = 0; }; class Child : public Base { @@ -60,7 +61,7 @@ TEST(AnyPtrTest, BaseClass) { ~Child() override {} private: - int unused_child_var_ = 0; + int unused_child_var_ ABSL_ATTRIBUTE_UNUSED = 0; }; AnyPtr ptr; From f10c42e040adfba6b7411ea927ee27abdf787f89 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 8 Jun 2021 00:01:31 -0700 Subject: [PATCH 5093/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d2cc5732-cd71-479c-97c8-fc3b5404b6f0 PiperOrigin-RevId: 378088495 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 13a0371a9ed..e5eccbcff0c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3886e042f9f73b482a86005f46089b025c31c1c9692fe340570479047ad85a82", - git_commit = "3e6eb263935b2a23aa4af90751755e44263a57d7", + sha256 = "0e3007cc90ec0ad7248f28151e60e48939c3ccf36b352911b02f1799111361e6", + git_commit = "f588e31e54b0063dcccc415977b74810f0ed1fe6", ) # Import all of TensorFlow Serving's external dependencies. From c13804a16cf9c2f3a87c316b101a201e346bac9a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 8 Jun 2021 06:01:29 -0700 Subject: [PATCH 5094/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/de184a9d-c124-4af4-9960-bcd917124193 PiperOrigin-RevId: 378136121 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e5eccbcff0c..7ec4702342d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0e3007cc90ec0ad7248f28151e60e48939c3ccf36b352911b02f1799111361e6", - git_commit = "f588e31e54b0063dcccc415977b74810f0ed1fe6", + sha256 = "aa23af8987a78cdea89de8698aea6357919ab08b0a9068dc82ca1afa7495f075", + git_commit = "c17cfbbe0c9ce52719b445d1276fdc0732ec8aee", ) # Import all of TensorFlow Serving's external dependencies. From 6ea8f2fb3d679098b2a9f3b6288a17b5a26e2a47 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 8 Jun 2021 12:01:46 -0700 Subject: [PATCH 5095/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b3df2104-4d52-4972-ab71-524ef76c3905 PiperOrigin-RevId: 378211216 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7ec4702342d..78496e4a51f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "aa23af8987a78cdea89de8698aea6357919ab08b0a9068dc82ca1afa7495f075", - git_commit = "c17cfbbe0c9ce52719b445d1276fdc0732ec8aee", + sha256 = "cbd535a1e3b31ebaa289a368f831f5bc059a5147d0b8526c9b95b01ebc2431b7", + git_commit = "3a012e2c881d51cffa3efb2e14a328d1d94da83f", ) # Import all of TensorFlow Serving's external dependencies. From fc6b289ec37748140fad50d779d2964a73471439 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 8 Jun 2021 18:01:49 -0700 Subject: [PATCH 5096/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b7f083f0-adab-4ec7-a885-0b904aea34a2 PiperOrigin-RevId: 378290693 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 78496e4a51f..69d123ae52c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cbd535a1e3b31ebaa289a368f831f5bc059a5147d0b8526c9b95b01ebc2431b7", - git_commit = "3a012e2c881d51cffa3efb2e14a328d1d94da83f", + sha256 = "8f8168866638c360a5feadd34028a81bbadcfff8c5a339a8b65ef21bffa1b43b", + git_commit = "9e8f335a76a36611b5dffbe3c1809b9bb0e0d2bc", ) # Import all of TensorFlow Serving's external dependencies. From bb34b1d4b221d2ea02f854a3d84a64c7bcab56e2 Mon Sep 17 00:00:00 2001 From: Christina Sorokin Date: Tue, 8 Jun 2021 21:25:48 -0700 Subject: [PATCH 5097/8103] Remove unused lambda captures in loader_harness_test.cc PiperOrigin-RevId: 378317270 --- tensorflow_serving/core/loader_harness_test.cc | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/tensorflow_serving/core/loader_harness_test.cc b/tensorflow_serving/core/loader_harness_test.cc index 38d1b3adb17..2740ecb8366 100644 --- a/tensorflow_serving/core/loader_harness_test.cc +++ b/tensorflow_serving/core/loader_harness_test.cc @@ -100,8 +100,6 @@ TEST(LoaderHarnessTest, Load) { LoaderHarness harness(servable_id, std::unique_ptr(loader)); - Notification load_called; - Notification load_should_return; EXPECT_CALL(*loader, LoadWithMetadata(Loader::Metadata{servable_id})) .WillOnce(Return(Status::OK())); { @@ -130,8 +128,6 @@ TEST(LoaderHarnessTest, Unload) { TF_ASSERT_OK(harness.LoadApproved()); TF_ASSERT_OK(harness.Load()); - Notification unload_called; - Notification unload_should_return; EXPECT_CALL(*loader, Unload()).WillOnce(Return()); { std::unique_ptr test_thread(Env::Default()->StartThread( @@ -175,8 +171,6 @@ TEST(LoaderHarnessTest, LoadError) { const ServableId servable_id = {"test", 0}; LoaderHarness harness(servable_id, std::unique_ptr(loader)); - Notification load_called; - Notification load_should_return; EXPECT_CALL(*loader, LoadWithMetadata(Loader::Metadata{servable_id})) .WillOnce(Return(errors::Unknown("test load error"))); { @@ -316,12 +310,9 @@ TEST(LoaderHarnessTest, RetryOnLoadErrorCancelledLoad) { const ServableId servable_id = {"test", 0}; LoaderHarness harness(servable_id, std::unique_ptr(loader), options); - Notification load_called; - Notification load_should_return; EXPECT_CALL(*loader, LoadWithMetadata(Loader::Metadata{servable_id})) - .WillOnce(InvokeWithoutArgs([&load_called, &load_should_return]() { - return errors::Unknown("test load error"); - })) + .WillOnce(InvokeWithoutArgs( + []() { return errors::Unknown("test load error"); })) // If the load is called again, we return Status::OK() to fail the test. .WillRepeatedly(InvokeWithoutArgs([]() { return Status::OK(); })); std::unique_ptr test_thread( From f56e5017123984dc3a4c8bb01955443a99c1a574 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 9 Jun 2021 00:01:24 -0700 Subject: [PATCH 5098/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1d960cd5-c68c-4712-b258-096db8b8135c PiperOrigin-RevId: 378335783 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 69d123ae52c..3d66c142505 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8f8168866638c360a5feadd34028a81bbadcfff8c5a339a8b65ef21bffa1b43b", - git_commit = "9e8f335a76a36611b5dffbe3c1809b9bb0e0d2bc", + sha256 = "8d16ed548fa32df53c721295ba1642330c94bfbd5a008355c6388a9d0241dfed", + git_commit = "8771a623ab204a46cf893a27f4875312ffca156a", ) # Import all of TensorFlow Serving's external dependencies. From 362125b93615885a6e04797e5df86370050ed990 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 9 Jun 2021 06:01:57 -0700 Subject: [PATCH 5099/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/46f477b2-d664-4d62-907d-7a085b55692a PiperOrigin-RevId: 378387597 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3d66c142505..03b6d846b9f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8d16ed548fa32df53c721295ba1642330c94bfbd5a008355c6388a9d0241dfed", - git_commit = "8771a623ab204a46cf893a27f4875312ffca156a", + sha256 = "7057f114bc90c31aa4b91520edee47acf2f844aac6acddf1189c64cf8b7b133e", + git_commit = "a224e3454554a1e7488edae03e4140feb4ee75a6", ) # Import all of TensorFlow Serving's external dependencies. From 62b1d43ddb521a1025d18132d68f76d0c7da8bd0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 9 Jun 2021 12:01:35 -0700 Subject: [PATCH 5100/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a0967b14-ebb7-4c15-8443-937bdda68555 PiperOrigin-RevId: 378463319 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 03b6d846b9f..c9a65eb4b98 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7057f114bc90c31aa4b91520edee47acf2f844aac6acddf1189c64cf8b7b133e", - git_commit = "a224e3454554a1e7488edae03e4140feb4ee75a6", + sha256 = "bdf523f6709da55994c5f6620349948d4d46efe85b5c6f3fdc9b7ba890d2d740", + git_commit = "65d53bb182fbe2c0004e1134b803ce336fbea732", ) # Import all of TensorFlow Serving's external dependencies. From a7bc692f42936bcc49eac48a9e22a8300fb594b5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 9 Jun 2021 18:01:15 -0700 Subject: [PATCH 5101/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/207e5d1e-3547-4227-9077-2151167d4d19 PiperOrigin-RevId: 378543238 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c9a65eb4b98..5797ea0e382 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bdf523f6709da55994c5f6620349948d4d46efe85b5c6f3fdc9b7ba890d2d740", - git_commit = "65d53bb182fbe2c0004e1134b803ce336fbea732", + sha256 = "58e4de866e2613bed70bfe22413a1a4afec8a7358d9509d5949cf6e3801284b5", + git_commit = "73eaa09991af786f282a3f57057a53ba563fefd4", ) # Import all of TensorFlow Serving's external dependencies. From 23b0755182aca025a6594f1461d3a57baab5889a Mon Sep 17 00:00:00 2001 From: Christina Sorokin Date: Wed, 9 Jun 2021 19:22:51 -0700 Subject: [PATCH 5102/8103] Avoid using 'version' after it was moved. PiperOrigin-RevId: 378555173 --- tensorflow_serving/core/aspired_versions_manager.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tensorflow_serving/core/aspired_versions_manager.cc b/tensorflow_serving/core/aspired_versions_manager.cc index f05aee42bf1..1c005f7ff4e 100644 --- a/tensorflow_serving/core/aspired_versions_manager.cc +++ b/tensorflow_serving/core/aspired_versions_manager.cc @@ -297,6 +297,7 @@ void AspiredVersionsManager::ProcessAspiredVersionsRequest( // need to be added and add them to the harness map. for (auto& version : versions) { bool should_add = false; + const auto& version_id = version.id(); if (additions.find(version.id().version) != additions.end()) { should_add = true; } @@ -305,12 +306,12 @@ void AspiredVersionsManager::ProcessAspiredVersionsRequest( current_aspired_versions_with_error.end()) { ServableId id; id.name = std::string(servable_name); - id.version = version.id().version; + id.version = version_id.version; const Status manage_status = basic_manager_->StopManagingServable(id); DCHECK(manage_status.ok()) << manage_status.error_message(); if (!manage_status.ok()) { LOG(ERROR) << "Internal error: Unable to clear errored servable " - << version.id().DebugString() << " from 'basic_manager_': " + << version_id.DebugString() << " from 'basic_manager_': " << manage_status.error_message(); } should_add = true; @@ -324,7 +325,7 @@ void AspiredVersionsManager::ProcessAspiredVersionsRequest( DCHECK(manage_status.ok()) << manage_status.error_message(); if (!manage_status.ok()) { LOG(ERROR) << "Internal error: Unable to transfer servable " - << version.id().DebugString() + << version_id.DebugString() << " to 'basic_manager_': " << manage_status.error_message(); } } From 83ad19ac00ddd21580c7954f482962816aaecf2a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 10 Jun 2021 00:01:26 -0700 Subject: [PATCH 5103/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/542fb176-233b-43bf-8f43-63168b94febb PiperOrigin-RevId: 378587242 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5797ea0e382..be318306eee 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "58e4de866e2613bed70bfe22413a1a4afec8a7358d9509d5949cf6e3801284b5", - git_commit = "73eaa09991af786f282a3f57057a53ba563fefd4", + sha256 = "62fec2221d5cd417d8f10fd94505c538c2c31765efab16597399d79b50ebd529", + git_commit = "84262cc8d91f2bcf4e7063276dcca1b866b68f9d", ) # Import all of TensorFlow Serving's external dependencies. From 56ae5a627cb3d36225140f18aca9bee847642f4f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 10 Jun 2021 06:01:43 -0700 Subject: [PATCH 5104/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e04bcc05-f7e8-4556-820b-ca48bfa27ce8 PiperOrigin-RevId: 378633203 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index be318306eee..e67a1808588 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "62fec2221d5cd417d8f10fd94505c538c2c31765efab16597399d79b50ebd529", - git_commit = "84262cc8d91f2bcf4e7063276dcca1b866b68f9d", + sha256 = "8044c7617ae642c6032d1d0394c2e694600ebebb1a296cbe436c546c231856e4", + git_commit = "ab0c10371fe241e256debabaf32c8f05e8edd6e1", ) # Import all of TensorFlow Serving's external dependencies. From 757c3a6b6c8a03731dc73ff758f69a61aeddcf67 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 10 Jun 2021 07:46:30 -0700 Subject: [PATCH 5105/8103] Adding python targets for config protos PiperOrigin-RevId: 378649319 --- tensorflow_serving/config/BUILD | 5 +++++ tensorflow_serving/servables/tensorflow/BUILD | 14 +++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/tensorflow_serving/config/BUILD b/tensorflow_serving/config/BUILD index e90fc7be782..8d3a2139ac2 100644 --- a/tensorflow_serving/config/BUILD +++ b/tensorflow_serving/config/BUILD @@ -63,6 +63,11 @@ serving_proto_library( ], ) +serving_proto_library_py( + name = "platform_config_py_pb2", + proto_library = "platform_config_proto", +) + serving_proto_library( name = "log_collector_config_proto", srcs = ["log_collector_config.proto"], diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index 3ad897e3f30..0ba9239f8d7 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -1,7 +1,7 @@ # Description: TensorFlow servables. load("//tensorflow_serving:oss_or_google.bzl", "if_google", "if_oss") -load("//tensorflow_serving:serving.bzl", "serving_proto_library", "serving_tensorflow_proto_dep") +load("//tensorflow_serving:serving.bzl", "serving_proto_library", "serving_proto_library_py", "serving_tensorflow_proto_dep") package( default_visibility = [ @@ -38,6 +38,12 @@ serving_proto_library( ], ) +serving_proto_library_py( + name = "session_bundle_config_py_pb2", + proto_library = "session_bundle_config_proto", + visibility = ["//visibility:public"], +) + cc_library( name = "resource_estimator", hdrs = ["resource_estimator.h"], @@ -252,6 +258,12 @@ serving_proto_library( ], ) +serving_proto_library_py( + name = "saved_model_bundle_source_adapter_py_pb2", + proto_library = "saved_model_bundle_source_adapter_proto", + visibility = ["//visibility:public"], +) + cc_library( name = "simple_servers", srcs = ["simple_servers.cc"], From 3c041741dd30306850246611de93dc0de1ca88f8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 10 Jun 2021 12:01:18 -0700 Subject: [PATCH 5106/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/103c7d9b-7a94-407f-81f9-01bd80fca3d7 PiperOrigin-RevId: 378703501 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e67a1808588..123b58b02de 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8044c7617ae642c6032d1d0394c2e694600ebebb1a296cbe436c546c231856e4", - git_commit = "ab0c10371fe241e256debabaf32c8f05e8edd6e1", + sha256 = "0840d1c240335ad32a3de0a58d7e87f7de7a1b17c6d2efba0041dde5666697b4", + git_commit = "4fda52d02555333b317f4e1051281cda2da5081b", ) # Import all of TensorFlow Serving's external dependencies. From 0ffd6080437ca8175b067be7cc00f5b3df9ea92a Mon Sep 17 00:00:00 2001 From: David Rim Date: Thu, 10 Jun 2021 16:54:03 -0700 Subject: [PATCH 5107/8103] Add basic batch scheduler for tflite models to improve batch parallelism. PiperOrigin-RevId: 378765010 --- tensorflow_serving/servables/tensorflow/BUILD | 7 +- .../tensorflow/tflite_interpreter_pool.cc | 186 +++--- .../tensorflow/tflite_interpreter_pool.h | 128 ++--- .../tflite_interpreter_pool_test.cc | 157 ++--- .../servables/tensorflow/tflite_session.cc | 543 ++++++++++++------ .../servables/tensorflow/tflite_session.h | 125 +++- .../tensorflow/tflite_session_test.cc | 88 +++ 7 files changed, 722 insertions(+), 512 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index 0ba9239f8d7..036ed2660f1 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -335,17 +335,22 @@ cc_library( ], deps = [ ":serving_session", + "//tensorflow_serving/batching:incremental_barrier", + "//tensorflow_serving/batching:threadsafe_status", "@com_google_absl//absl/base:core_headers", + "@com_google_absl//absl/functional:bind_front", "@com_google_absl//absl/synchronization", - "@com_google_absl//absl/types:span", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", + "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:session_options", + "@org_tensorflow//tensorflow/core/kernels/batching_util:basic_batch_scheduler", "@org_tensorflow//tensorflow/lite:external_cpu_backend_context", "@org_tensorflow//tensorflow/lite:framework", "@org_tensorflow//tensorflow/lite:string_util", "@org_tensorflow//tensorflow/lite:util", + "@org_tensorflow//tensorflow/lite/c:c_api", "@org_tensorflow//tensorflow/lite/c:common", "@org_tensorflow//tensorflow/lite/delegates/flex:delegate", "@org_tensorflow//tensorflow/lite/kernels:builtin_ops", diff --git a/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.cc b/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.cc index 363c0aff0cf..3e356d78a83 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.cc @@ -19,7 +19,10 @@ limitations under the License. #include #include +#include "tensorflow/core/framework/tensor.h" #include "tensorflow/core/platform/errors.h" +#include "tensorflow/lite/external_cpu_backend_context.h" +#include "tensorflow/lite/kernels/cpu_backend_context.h" #include "tensorflow/lite/kernels/parse_example/parse_example.h" #include "tensorflow/lite/kernels/register.h" @@ -28,14 +31,16 @@ namespace serving { namespace internal { TfLiteInterpreterWrapper::TfLiteInterpreterWrapper( + std::unique_ptr external_context, std::unique_ptr interpreter) : #ifdef TFLITE_PROFILE + external_context_(std::move(external_context)), interpreter_(std::move(interpreter)), - fixed_batch_size_(fixed_batch_size), max_num_entries_(TFLITE_PROFILE_EVENTS), profiler_(max_num_entries_) #else + external_context_(std::move(external_context)), interpreter_(std::move(interpreter)) #endif { @@ -53,20 +58,23 @@ TfLiteInterpreterWrapper::TfLiteInterpreterWrapper( } tensorflow::Status TfLiteInterpreterWrapper::SetStringData( - const gtl::ArraySlice& batch, - TfLiteTensor* tflite_tensor, int tensor_index) { + const std::vector& tensors, TfLiteTensor* tflite_tensor, + int tensor_index, int batch_size) { // Format of the buffer for tflite: // [0] number of strings (int32_t) // [4] offset of each string (int32_t) // [sizeof(int32_t) * (num_strings + 1)]] total size of strings // [sizeof(int32_t) * (num_strings + 2)] batch.data() - int32_t num_strings = batch.size(); + int32_t num_strings = batch_size; offset_.clear(); size_t total_size = 0; offset_.push_back(static_cast(total_size)); - for (int i = 0; i < num_strings; i++) { - total_size += batch[i].size(); - offset_.push_back(static_cast(total_size)); + for (const auto& tensor : tensors) { + const auto& flat = tensor->flat(); + for (int i = 0; i < flat.size(); ++i) { + total_size += flat(i).size(); + offset_.push_back(static_cast(total_size)); + } } size_t required_bytes = total_size + sizeof(int32_t) * (num_strings + 2); if (tensor_buffer_.find(tensor_index) == tensor_buffer_.end()) { @@ -92,10 +100,13 @@ tensorflow::Status TfLiteInterpreterWrapper::SetStringData( memcpy(tensor_buffer_[tensor_index].get() + sizeof(int32_t) * (i + 1), &offset_i, sizeof(int32_t)); } - for (int i = 0; i < num_strings; i++) { - memcpy(tensor_buffer_[tensor_index].get() + start, batch[i].data(), - batch[i].size()); - start += batch[i].size(); + for (const auto& tensor : tensors) { + const auto& flat = tensor->flat(); + for (int i = 0; i < flat.size(); ++i) { + memcpy(tensor_buffer_[tensor_index].get() + start, flat(i).data(), + flat(i).size()); + start += flat(i).size(); + } } // tflite_tensor will take ownership of the pointer. @@ -128,128 +139,61 @@ TfLiteStatus TfLiteInterpreterWrapper::Invoke() { return status; } -tensorflow::Status TfLiteInterpreterPool::CreateTfLiteInterpreterPool( - const tflite::FlatBufferModel& model, bool run_in_caller, - bool use_batch_parallelism, int batch_pool_size, int id, +tensorflow::Status TfLiteInterpreterWrapper::CreateTfLiteInterpreterWrapper( + const tflite::FlatBufferModel& model, const tensorflow::SessionOptions& options, - std::unique_ptr& pool) { - // If can't use_batch_parallelism or pool size is 1, - // just use 1 interpreter and run in caller. - if (!use_batch_parallelism || batch_pool_size == 1) { - run_in_caller = true; - batch_pool_size = 1; - use_batch_parallelism = false; - } - std::unique_ptr thread_pool; - int num_interpreters = run_in_caller ? 1 : 0; - if (!run_in_caller || use_batch_parallelism) { - thread_pool.reset(new tensorflow::thread::ThreadPool( - options.env, tensorflow::ThreadOptions(), - absl::StrCat(kTfLiteThreadPoolName, id), batch_pool_size, false, - nullptr)); - num_interpreters += thread_pool->NumThreads(); - } - - // TODO(b/140959776): Add support for non-builtin ops (flex or custom ops). + std::unique_ptr& wrapper) { tflite::ops::builtin::BuiltinOpResolver resolver; tflite::ops::custom::AddParseExampleOp(&resolver); - int fixed_batch_size = 1; - if (use_batch_parallelism) { - if (num_interpreters < 1) { - return errors::InvalidArgument( - "CreateTfLiteInterpreterPool requested ", - "invalid number of interpreters: ", num_interpreters); + std::unique_ptr interpreter; + + // Use an initial batch_size of 1, will be resized later. + const int batch_size = 1; + // Use a single thread to reduce contention across sessions. + const int num_threads = 1; + + if (tflite::InterpreterBuilder(model, resolver)(&interpreter, num_threads) != + kTfLiteOk) { + return errors::Internal( + "Failed to create a TFLite interpreter with the given model"); + } + std::unique_ptr external_context( + new tflite::ExternalCpuBackendContext()); + std::unique_ptr cpu_backend_context( + new tflite::CpuBackendContext()); + cpu_backend_context->SetUseCaching(true); + cpu_backend_context->SetMaxNumThreads(num_threads); + external_context->set_internal_backend_context( + std::move(cpu_backend_context)); + interpreter->SetExternalContext(kTfLiteCpuBackendContext, + external_context.get()); + const int idx = interpreter->inputs()[0]; + const auto* tensor = interpreter->tensor(idx); + if (tensor->type == kTfLiteString) { + if (interpreter->ResizeInputTensor(idx, {batch_size}) != kTfLiteOk) { + return errors::Internal("Failed to resize input"); } - fixed_batch_size = - (kInitialBatchSize + num_interpreters - 1) / num_interpreters; } - std::vector> interpreters; - - for (int i = 0; i < num_interpreters; i++) { - std::unique_ptr interpreter; - if (tflite::InterpreterBuilder(model, resolver)( - &interpreter, /*num_threads=*/1) != kTfLiteOk) { - return errors::Internal( - "Failed to create a TFLite interpreter with the given model"); - } - const int idx = interpreter->inputs()[0]; - const auto* tensor = interpreter->tensor(idx); - if (tensor->type == kTfLiteString) { - interpreter->ResizeInputTensor(idx, {fixed_batch_size}); - } - if (interpreter->AllocateTensors() != kTfLiteOk) { - return errors::Internal("Failed to allocate tensors"); - } - interpreters.push_back( - std::make_unique(std::move(interpreter))); - interpreters.back()->SetMiniBatchSize(fixed_batch_size); + if (interpreter->AllocateTensors() != kTfLiteOk) { + return errors::Internal("Failed to allocate tensors"); } - pool.reset(new TfLiteInterpreterPool( - id, std::move(interpreters), std::move(thread_pool), num_interpreters, - fixed_batch_size, use_batch_parallelism)); + wrapper.reset(new TfLiteInterpreterWrapper(std::move(external_context), + std::move(interpreter))); return tensorflow::Status::OK(); } -TfLiteInterpreterPool::TfLiteInterpreterPool( - int id, std::vector> interpreters, - std::unique_ptr thread_pool, - int num_interpreters, int fixed_batch_size, bool use_batch_parallelism) - : id_(id), - interpreters_(std::move(interpreters)), - thread_pool_(std::move(thread_pool)), - num_interpreters_(num_interpreters), - fixed_batch_size_(fixed_batch_size), - use_batch_parallelism_(use_batch_parallelism) {} - -std::unique_ptr& -TfLiteInterpreterPool::GetInterpreter(int interpreter_idx) { - return interpreters_[interpreter_idx]; -} - -namespace { - -bool IsBatchParallelizable(const tflite::Model* model) { - auto tflite_model = absl::make_unique(); - model->UnPackTo(tflite_model.get(), nullptr); - if (tflite_model->subgraphs.empty()) { - return false; - } - const auto& subgraph = tflite_model->subgraphs[0]; - if (subgraph->inputs.size() != 1) { - return false; - } - int input_tensor_id = subgraph->inputs[0]; - const std::vector supported_ops = {"ParseExample", "ParseExampleV2"}; - for (size_t op_idx = 0; op_idx < subgraph->operators.size(); op_idx++) { - tflite::OperatorT* op = subgraph->operators[op_idx].get(); - if (std::find(op->inputs.begin(), op->inputs.end(), input_tensor_id) != - op->inputs.end()) { - const std::string& custom_code = - tflite_model->operator_codes[op->opcode_index]->custom_code; - return std::find(supported_ops.begin(), supported_ops.end(), - custom_code) != supported_ops.end(); - } - } - return false; -} - -} // namespace - -tensorflow::Status TfLiteSessionPool::CreateTfLiteSessionPool( +tensorflow::Status TfLiteInterpreterPool::CreateTfLiteInterpreterPool( const tflite::FlatBufferModel* model, - const tensorflow::SessionOptions& options, bool run_in_caller, - int pool_size, int batch_pool_size, - std::unique_ptr& tflite_session_pool) { - bool use_batch_parallelism = IsBatchParallelizable(model->GetModel()); - std::vector> pools; + const tensorflow::SessionOptions& options, int pool_size, + std::unique_ptr& interpreter_pool) { + std::vector> interpreters( + pool_size); for (int i = 0; i < pool_size; i++) { - std::unique_ptr pool; - TF_RETURN_IF_ERROR(TfLiteInterpreterPool::CreateTfLiteInterpreterPool( - *model, run_in_caller, use_batch_parallelism, batch_pool_size, i, - options, pool)); - pools.push_back(std::move(pool)); + auto& wrapper = interpreters[i]; + TF_RETURN_IF_ERROR(TfLiteInterpreterWrapper::CreateTfLiteInterpreterWrapper( + *model, options, wrapper)); } - tflite_session_pool.reset(new TfLiteSessionPool(std::move(pools))); + interpreter_pool.reset(new TfLiteInterpreterPool(std::move(interpreters))); return tensorflow::Status::OK(); } diff --git a/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h b/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h index 9ac320be379..33ea4c8f9c1 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h +++ b/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h @@ -22,6 +22,7 @@ limitations under the License. #include "absl/base/thread_annotations.h" #include "absl/synchronization/mutex.h" #include "tensorflow/core/common_runtime/process_util.h" +#include "tensorflow/core/framework/tensor.h" #include "tensorflow/core/lib/gtl/array_slice.h" #include "tensorflow/core/platform/cpu_info.h" #include "tensorflow/core/platform/tstring.h" @@ -42,84 +43,35 @@ namespace tensorflow { namespace serving { namespace internal { -constexpr char kTfLiteThreadPoolName[] = "tflite_compute"; - constexpr int kInitialBatchSize = 500; -class TfLiteInterpreterWrapper; - -// A TFLite batch pool to maintain pre-created tflite::Interpreter -// objects. -class TfLiteInterpreterPool { +class TfLiteInterpreterWrapper { + // Wrapper class for a single TfLite Interpreter for use in an interpreter + // pool. public: - // Create a vector of TfLiteInterpreterWrapper objects with the given TFLite - // FlatBufferModel `model`. - // The number of created interpreters will depend on batch_pool_size, - // whether the calling thread requires a interpreter, `run_in_caller`, and - // whether the model can make use of batch parallelism. - // If the model cannot make use of batch parallelism, only - // a single interpreter will be created. Otherwise, the setting is set by - // batch_pool_size + 1 if run_in_caller is true. - // The model must outlive the returned pool instance. - static Status CreateTfLiteInterpreterPool( - const tflite::FlatBufferModel& model, bool run_in_caller, - bool use_batch_parallelism, int batch_pool_size, int id, + // Create an interpreter and external context and wrap it in the class + // for use with an InterpreterPool. + static Status CreateTfLiteInterpreterWrapper( + const tflite::FlatBufferModel& model, const tensorflow::SessionOptions& options, - std::unique_ptr& pool); - - // The allocated batch size of the TfLite interpreters. - int FixedBatchSize() { return fixed_batch_size_; } - - // Returns an interpreter wrapper from the pool at the given index. - std::unique_ptr& GetInterpreter( - int interpreter_idx); - - // The Id of the interpreterwrapper object, used to target a specific - // interpreterwrapper. - const int Id() { return id_; } - - // Number of interpreters. - const int NumInterpreters() { return num_interpreters_; } - - // Returns a ThreadPool for use with each interpreter, will be null - // if using run_in_caller and only 1 interpreter. - tensorflow::thread::ThreadPool* ThreadPool() { return thread_pool_.get(); } - - // Returns whether the pool is configured to use batch parallelism. - const bool UseBatchParallelism() { return use_batch_parallelism_; } + std::unique_ptr& wrapper); - private: - TfLiteInterpreterPool( - int id, - std::vector> interpreters, - std::unique_ptr thread_pool, - int num_interpreters, int fixed_batch_size, bool use_batch_parallelism); - int id_; - // A vector to maintain pointers of available interpreters - std::vector> interpreters_; - std::unique_ptr thread_pool_; - int num_interpreters_; - int fixed_batch_size_; - bool use_batch_parallelism_ = false; -}; - -// A TFLite interpreter wrapper class which automatically returns used -// interpreter object to TfLiteInterpreterPool. -class TfLiteInterpreterWrapper { - public: // Constructor for wrapper takes only an initialized interpreter. - TfLiteInterpreterWrapper(std::unique_ptr interpreter); + TfLiteInterpreterWrapper( + std::unique_ptr external_context, + std::unique_ptr interpreter); + + TfLiteInterpreterWrapper(std::unique_ptr interpreter) + : TfLiteInterpreterWrapper(nullptr, std::move(interpreter)) {} // Returns the underlying interpreter. tflite::Interpreter* Get() { return interpreter_.get(); } - // If using parallelism, get the allocated batch size of the interpreter. - int GetMiniBatchSize() { return mini_batch_size_; } + // Get the allocated batch size of the interpreter. + int GetBatchSize() { return batch_size_; } // Set the batch size. - void SetMiniBatchSize(int mini_batch_size) { - mini_batch_size_ = mini_batch_size; - } + void SetBatchSize(int batch_size) { batch_size_ = batch_size; } // Invokes the interpreter. TfLiteStatus Invoke(); @@ -143,13 +95,15 @@ class TfLiteInterpreterWrapper { // raw pointer of `tflite_tensor` to the internal buffer. If the required // size is larger than the current size, will allocate new memory and // free the existing buffer. - tensorflow::Status SetStringData( - const gtl::ArraySlice& batch, - TfLiteTensor* tflite_tensor, int tensor_index); + tensorflow::Status SetStringData(const std::vector& tensors, + TfLiteTensor* tflite_tensor, + int tensor_index, int batch_size); private: + // External cpu context to enable caching. + std::unique_ptr external_context_; std::unique_ptr interpreter_; - int mini_batch_size_ = 1; + int batch_size_ = 1; std::map> tensor_buffer_; std::map tensor_buffer_max_bytes_; std::vector offset_; @@ -161,23 +115,21 @@ class TfLiteInterpreterWrapper { #endif }; -// Contains a vector of TfLiteInterpreterPool, which are protected by mutex. -// When GetInterpreterPool is called, will either release a unique ptr to the +// Contains a vector of TfLiteInterpreterWrapper, which are protected by mutex. +// When GetInterpreter is called, will either release a unique ptr to the // caller or block if the vector is empty. -class TfLiteSessionPool { +class TfLiteInterpreterPool { public: // Creates a TfLiteSessionPool with model, session options, - // whether to run in caller thread, pool_size and batch_pool_size for - // each InterpreterPool. - static tensorflow::Status CreateTfLiteSessionPool( + // pool_size number of interpreters. + static tensorflow::Status CreateTfLiteInterpreterPool( const tflite::FlatBufferModel* model, - const tensorflow::SessionOptions& options, bool run_in_caller, - int pool_size, int batch_pool_size, - std::unique_ptr& tflite_session_pool); + const tensorflow::SessionOptions& options, int pool_size, + std::unique_ptr& interpreter_pool); - // Returns a TFLite interpreter pool object. Caller may *block* waiting for + // Returns a TFLite interpreter wrapper object. Caller may *block* waiting for // a free interpreter pool to be available. - std::unique_ptr GetInterpreterPool() { + std::unique_ptr GetInterpreter() { auto interpreter_available = [this]() ABSL_SHARED_LOCKS_REQUIRED(mutex_) { return !this->available_.empty(); }; @@ -188,17 +140,19 @@ class TfLiteSessionPool { return pool; } - // Returns an interpreter pool to the available pool. - void ReturnInterpreterPool(std::unique_ptr pool) { + // Returns an interpreter wrapper to the available pool. + void ReturnInterpreter( + std::unique_ptr interpreter) { absl::MutexLock l(&mutex_); - available_.emplace_back(std::move(pool)); + available_.emplace_back(std::move(interpreter)); } private: - TfLiteSessionPool(std::vector> pools) - : available_(std::move(pools)) {} + TfLiteInterpreterPool( + std::vector> interpreters) + : available_(std::move(interpreters)) {} mutable absl::Mutex mutex_; - std::vector> available_ + std::vector> available_ ABSL_GUARDED_BY(mutex_); }; diff --git a/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool_test.cc b/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool_test.cc index c5dc1ad5f2d..84a904cc682 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool_test.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool_test.cc @@ -46,127 +46,28 @@ TEST(TfLiteInterpreterPool, CreateTfLiteInterpreterPoolTest) { &model_bytes)); auto model = tflite::FlatBufferModel::BuildFromModel( flatbuffers::GetRoot(model_bytes.data())); - int id = 0; - bool use_batch_parallelism = false; - int batch_pool_size = 1; - bool run_in_caller = true; - const tensorflow::SessionOptions options; - std::unique_ptr pool; - TF_ASSERT_OK(TfLiteInterpreterPool::CreateTfLiteInterpreterPool( - *model, run_in_caller, use_batch_parallelism, batch_pool_size, id, - options, pool)); - ASSERT_EQ(pool->NumInterpreters(), batch_pool_size); - ASSERT_EQ(pool->Id(), id); - ASSERT_EQ(pool->FixedBatchSize(), 1); // batch_parallelism turned off. - pool.reset(); - run_in_caller = false; - use_batch_parallelism = true; - TF_ASSERT_OK(TfLiteInterpreterPool::CreateTfLiteInterpreterPool( - *model, run_in_caller, use_batch_parallelism, ++batch_pool_size, id, - options, pool)); - ASSERT_EQ(pool->NumInterpreters(), batch_pool_size); - ASSERT_EQ(pool->ThreadPool()->NumThreads(), batch_pool_size); - ASSERT_EQ(pool->UseBatchParallelism(), use_batch_parallelism); - pool.reset(); - TF_ASSERT_OK(TfLiteInterpreterPool::CreateTfLiteInterpreterPool( - *model, run_in_caller, use_batch_parallelism, ++batch_pool_size, id, - options, pool)); - ASSERT_EQ(pool->NumInterpreters(), batch_pool_size); - ASSERT_EQ(pool->FixedBatchSize(), (kInitialBatchSize + 2) / batch_pool_size); - pool.reset(); - use_batch_parallelism = false; - run_in_caller = true; - TF_ASSERT_OK(TfLiteInterpreterPool::CreateTfLiteInterpreterPool( - *model, run_in_caller, use_batch_parallelism, batch_pool_size, id, - options, pool)); - ASSERT_EQ(pool->NumInterpreters(), 1); - ASSERT_EQ(pool->FixedBatchSize(), 1); // batch_parallelism turned off. - ASSERT_EQ(pool->ThreadPool(), nullptr); - ASSERT_EQ(pool->UseBatchParallelism(), use_batch_parallelism); - pool.reset(); - use_batch_parallelism = true; - TF_ASSERT_OK(TfLiteInterpreterPool::CreateTfLiteInterpreterPool( - *model, run_in_caller, use_batch_parallelism, batch_pool_size, id, - options, pool)); - ASSERT_EQ(pool->NumInterpreters(), batch_pool_size + 1); - ASSERT_EQ(pool->ThreadPool()->NumThreads(), batch_pool_size); - pool.reset(); -} - -TEST(TfLiteSessionPool, CreateTfLiteSessionPoolTest) { - string model_bytes; - TF_ASSERT_OK(ReadFileToString(Env::Default(), - test_util::TestSrcDirPath(kParseExampleModel), - &model_bytes)); - auto model = tflite::FlatBufferModel::BuildFromModel( - flatbuffers::GetRoot(model_bytes.data())); - int pool_size = 1; - int batch_pool_size = 2; - bool run_in_caller_thread = false; - const tensorflow::SessionOptions options; - std::unique_ptr session_pool; - TF_ASSERT_OK(TfLiteSessionPool::CreateTfLiteSessionPool( - model.get(), options, run_in_caller_thread, pool_size, batch_pool_size, - session_pool)); - auto pool = session_pool->GetInterpreterPool(); - ASSERT_EQ(pool->NumInterpreters(), batch_pool_size); - ASSERT_EQ(pool->Id(), 0); - ASSERT_EQ(pool->FixedBatchSize(), - (kInitialBatchSize + batch_pool_size - 1) / batch_pool_size); - session_pool->ReturnInterpreterPool(std::move(pool)); - session_pool.reset(); - - pool_size = 2; - batch_pool_size = 2; - run_in_caller_thread = false; - TF_ASSERT_OK(TfLiteSessionPool::CreateTfLiteSessionPool( - model.get(), options, run_in_caller_thread, pool_size, batch_pool_size, - session_pool)); - - pool = session_pool->GetInterpreterPool(); - ASSERT_EQ(pool->NumInterpreters(), batch_pool_size); - ASSERT_EQ(pool->Id(), 1); - ASSERT_EQ(pool->FixedBatchSize(), (kInitialBatchSize + 1) / 2); - session_pool->ReturnInterpreterPool(std::move(pool)); - session_pool.reset(); -} - -TEST(TfLiteSessionPool, CreateTfLiteSessionPoolNotBatchParallelTest) { - string model_bytes; - TF_ASSERT_OK(ReadFileToString(Env::Default(), - test_util::TestSrcDirPath(kMobileNetModel), - &model_bytes)); - auto model = tflite::FlatBufferModel::BuildFromModel( - flatbuffers::GetRoot(model_bytes.data())); int pool_size = 1; - int batch_pool_size = 1; - bool run_in_caller_thread = false; const tensorflow::SessionOptions options; - std::unique_ptr session_pool; - TF_ASSERT_OK(TfLiteSessionPool::CreateTfLiteSessionPool( - model.get(), options, run_in_caller_thread, pool_size, batch_pool_size, - session_pool)); + std::unique_ptr interpreter_pool; + TF_ASSERT_OK(TfLiteInterpreterPool::CreateTfLiteInterpreterPool( + model.get(), options, pool_size, interpreter_pool)); - auto pool = session_pool->GetInterpreterPool(); - ASSERT_EQ(pool->NumInterpreters(), 1); - ASSERT_EQ(pool->Id(), 0); - ASSERT_EQ(pool->FixedBatchSize(), 1); - session_pool->ReturnInterpreterPool(std::move(pool)); - session_pool.reset(); + auto interpreter = interpreter_pool->GetInterpreter(); + interpreter_pool->ReturnInterpreter(std::move(interpreter)); + interpreter_pool.reset(); pool_size = 2; - batch_pool_size = 2; - run_in_caller_thread = false; - TF_ASSERT_OK(TfLiteSessionPool::CreateTfLiteSessionPool( - model.get(), options, run_in_caller_thread, pool_size, batch_pool_size, - session_pool)); - - pool = session_pool->GetInterpreterPool(); - ASSERT_EQ(pool->NumInterpreters(), 1); - ASSERT_EQ(pool->Id(), 1); - ASSERT_EQ(pool->FixedBatchSize(), 1); - session_pool->ReturnInterpreterPool(std::move(pool)); - session_pool.reset(); + TF_ASSERT_OK(TfLiteInterpreterPool::CreateTfLiteInterpreterPool( + model.get(), options, pool_size, interpreter_pool)); + interpreter = interpreter_pool->GetInterpreter(); + interpreter_pool->ReturnInterpreter(std::move(interpreter)); + auto next_interpreter = interpreter_pool->GetInterpreter(); + interpreter_pool->ReturnInterpreter(std::move(next_interpreter)); + interpreter = interpreter_pool->GetInterpreter(); + next_interpreter = interpreter_pool->GetInterpreter(); + interpreter_pool->ReturnInterpreter(std::move(interpreter)); + interpreter_pool->ReturnInterpreter(std::move(next_interpreter)); + interpreter_pool.reset(); } int GetTensorSize(const TfLiteTensor* tflite_tensor) { @@ -214,13 +115,18 @@ TEST(TfLiteInterpreterWrapper, TfLiteInterpreterWrapperTest) { int actual_batch_size = 3; interpreter->ResizeInputTensor(idx, {fixed_batch_size}); ASSERT_EQ(interpreter->AllocateTensors(), kTfLiteOk); + auto interpreter_wrapper = std::make_unique(std::move(interpreter)); - interpreter_wrapper->SetMiniBatchSize(fixed_batch_size); - ASSERT_EQ(interpreter_wrapper->GetMiniBatchSize(), fixed_batch_size); - std::vector data; + interpreter_wrapper->SetBatchSize(fixed_batch_size); + ASSERT_EQ(interpreter_wrapper->GetBatchSize(), fixed_batch_size); + std::vector data; std::vector expected_floats; std::vector expected_strs; + std::vector expected_input_strs; + TensorShape shape; + shape.AddDim(actual_batch_size); + Tensor t(DT_STRING, shape); for (int i = 0; i < actual_batch_size; ++i) { tensorflow::Example example; std::string str; @@ -234,11 +140,14 @@ TEST(TfLiteInterpreterWrapper, TfLiteInterpreterWrapperTest) { (*features->mutable_feature())["y"].mutable_bytes_list()->add_value( expected_strs.back()); example.SerializeToString(&str); - data.push_back(str); + t.flat()(i) = str; + expected_input_strs.push_back(str); } - ASSERT_FALSE(interpreter_wrapper->SetStringData(data, tensor, -1) == - Status::OK()); - TF_ASSERT_OK(interpreter_wrapper->SetStringData(data, tensor, idx)); + data.push_back(&t); + ASSERT_FALSE(interpreter_wrapper->SetStringData( + data, tensor, -1, actual_batch_size) == Status::OK()); + TF_ASSERT_OK( + interpreter_wrapper->SetStringData(data, tensor, idx, actual_batch_size)); auto wrapped = interpreter_wrapper->Get(); ASSERT_EQ(wrapped->inputs().size(), 1); int input_idx = wrapped->inputs()[0]; @@ -246,7 +155,7 @@ TEST(TfLiteInterpreterWrapper, TfLiteInterpreterWrapperTest) { ASSERT_EQ(GetTensorSize(tflite_input_tensor), fixed_batch_size); ASSERT_EQ(tflite::GetStringCount(tflite_input_tensor), actual_batch_size); auto input_strs = ExtractVector(tflite_input_tensor); - EXPECT_THAT(input_strs, ::testing::ElementsAreArray(data)); + EXPECT_THAT(input_strs, ::testing::ElementsAreArray(expected_input_strs)); ASSERT_EQ(interpreter_wrapper->Invoke(), kTfLiteOk); const std::vector& indices = wrapped->outputs(); auto* tflite_tensor = wrapped->tensor(indices[0]); diff --git a/tensorflow_serving/servables/tensorflow/tflite_session.cc b/tensorflow_serving/servables/tensorflow/tflite_session.cc index 1495c3cc1bb..764a74fcc93 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session.cc @@ -19,10 +19,15 @@ limitations under the License. #include #include +#include "absl/functional/bind_front.h" #include "tensorflow/cc/saved_model/signature_constants.h" #include "tensorflow/core/framework/tensor_shape.pb.h" +#include "tensorflow/core/framework/tensor_util.h" #include "tensorflow/core/lib/core/blocking_counter.h" #include "tensorflow/core/lib/core/errors.h" +#include "tensorflow/core/lib/core/notification.h" +#include "tensorflow/core/lib/gtl/cleanup.h" +#include "tensorflow/core/platform/errors.h" #include "tensorflow/lite/c/common.h" #include "tensorflow/lite/kernels/cpu_backend_context.h" #include "tensorflow/lite/kernels/internal/tensor_utils.h" @@ -31,6 +36,7 @@ limitations under the License. #include "tensorflow/lite/string_util.h" #include "tensorflow/lite/tools/signature/signature_def_util.h" #include "tensorflow/lite/util.h" +#include "tensorflow_serving/batching/incremental_barrier.h" #include "tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h" namespace tensorflow { @@ -138,22 +144,21 @@ Status GetTensorInfoMap(const tflite::Interpreter* interpreter, bool input, return Status::OK(); } -std::vector TensorDims(const Tensor* tensor) { - std::vector dims(tensor->dims()); - for (int i = 0; i < tensor->dims(); ++i) { - dims[i] = static_cast(tensor->dim_size(i)); +std::vector TensorDims(const Tensor& tensor) { + std::vector dims(tensor.dims()); + for (int i = 0; i < tensor.dims(); ++i) { + dims[i] = static_cast(tensor.dim_size(i)); } return dims; } // Create output tensors making sure they are the right size. // Status CreateOutputTensors( - std::unique_ptr& interpreter_pool, + std::unique_ptr& interpreter_wrapper, const std::vector& output_tensor_names, const std::map& output_tensor_to_idx, std::map& tflite_idx_to_output_tensor, - std::vector* output_tensors, bool use_batch_parallelism = false, - int actual_batch_size = 0) { + std::vector* output_tensors) { output_tensors->reserve(output_tensor_names.size()); for (std::string tfname : output_tensor_names) { auto fix_status = FixTfLiteTensorName(output_tensor_to_idx, tfname); @@ -163,14 +168,9 @@ Status CreateOutputTensors( } const int tflite_idx = output_tensor_to_idx.at(tfname); TensorShape tf_shape; - const auto& interpreter = interpreter_pool->GetInterpreter(0)->Get(); + const auto& interpreter = interpreter_wrapper->Get(); const auto* tflite_tensor = interpreter->tensor(tflite_idx); - if (use_batch_parallelism) { - tf_shape.AddDim(actual_batch_size); - } else if (tflite_tensor->dims->size > 0) { - tf_shape.AddDim(tflite_tensor->dims->data[0]); - } - for (int i = 1; i < tflite_tensor->dims->size; ++i) { + for (int i = 0; i < tflite_tensor->dims->size; ++i) { tf_shape.AddDim(tflite_tensor->dims->data[i]); } DataType tf_type; @@ -182,24 +182,30 @@ Status CreateOutputTensors( } Status SetInputAndInvokeMiniBatch( - std::unique_ptr& interpreter_pool, - const std::map& tflite_idx_to_tf_input_tensor, - bool use_batch_parallelism = false, int32_t num_minibatches = 1, - int minibatch = 0) { - const auto& interpreter_wrapper = interpreter_pool->GetInterpreter(minibatch); + std::unique_ptr& interpreter_wrapper, + const std::vector& tflite_input_indices, + const std::vector>& inputs, int batch_size, + int* fixed_batch_size) { auto* interpreter = interpreter_wrapper->Get(); // Load input data from Tensorflow tensors. - for (const auto entry : tflite_idx_to_tf_input_tensor) { - int tflite_input_idx = entry.first; + for (int i = 0; i < tflite_input_indices.size(); ++i) { + int tflite_input_idx = tflite_input_indices[i]; auto tflite_input_tensor = interpreter->tensor(tflite_input_idx); - const auto* tf_input_tensor = entry.second; + const auto& tf_input_tensors = inputs[i]; if (tflite_input_tensor->type != kTfLiteString) { - if (use_batch_parallelism) { - return errors::Internal( - "Batch parallelism should not be enabled for non-string inputs"); + const Tensor* tf_input_tensor = tf_input_tensors[0]; + if (tf_input_tensors.size() > 1) { + Tensor concated; + std::vector to_concatenate; + to_concatenate.reserve(tf_input_tensors.size()); + for (const auto* t : tf_input_tensors) { + to_concatenate.push_back(std::move(*t)); + } + TF_RETURN_IF_ERROR(tensor::Concat(to_concatenate, &concated)); + tf_input_tensor = &concated; } auto tensor_bytes = tf_input_tensor->tensor_data(); - std::vector tf_dims = TensorDims(tf_input_tensor); + std::vector tf_dims = TensorDims(*tf_input_tensor); std::vector tflite_dims( tflite_input_tensor->dims->data, tflite_input_tensor->dims->data + tflite_input_tensor->dims->size); @@ -220,30 +226,22 @@ Status SetInputAndInvokeMiniBatch( tensor_bytes.size()); } else { // Copy the string tensor data to the input tflite tensor. - const int fixed_batch_size = interpreter_pool->FixedBatchSize(); - const int actual_batch_size = entry.second->NumElements(); - const int begin = fixed_batch_size * minibatch; - int end = static_cast(actual_batch_size); - if (use_batch_parallelism) { - end = std::min(end, fixed_batch_size * (minibatch + 1)); - } - const auto batch = gtl::ArraySlice(entry.second->flat()) - .subspan(begin, end - begin); - const int minibatch_size = batch.size(); - // Always resize when not using parallelism. const bool needs_resize = - use_batch_parallelism - ? minibatch_size > interpreter_wrapper->GetMiniBatchSize() - : minibatch_size != interpreter_wrapper->GetMiniBatchSize(); + fixed_batch_size ? batch_size > interpreter_wrapper->GetBatchSize() + : batch_size != interpreter_wrapper->GetBatchSize(); if (needs_resize) { - interpreter->ResizeInputTensor(entry.first, {minibatch_size}); - interpreter_wrapper->SetMiniBatchSize(minibatch_size); + // std::cout << "resizing to: " << batch_size << std::endl; + interpreter->ResizeInputTensor(tflite_input_idx, {batch_size}); + interpreter_wrapper->SetBatchSize(batch_size); if (interpreter->AllocateTensors() != kTfLiteOk) { return errors::Internal("Failed to allocate tensors"); } } + if (fixed_batch_size) { + *fixed_batch_size = interpreter_wrapper->GetBatchSize(); + } TF_RETURN_IF_ERROR(interpreter_wrapper->SetStringData( - batch, tflite_input_tensor, tflite_input_idx)); + tf_input_tensors, tflite_input_tensor, tflite_input_idx, batch_size)); } } if (interpreter_wrapper->Invoke() != kTfLiteOk) { @@ -253,43 +251,27 @@ Status SetInputAndInvokeMiniBatch( } Status SetMiniBatchOutput( - std::unique_ptr& interpreter_pool, + std::unique_ptr& interpreter_wrapper, const std::map& tflite_idx_to_output_tensor, - std::vector* outputs, bool use_batch_parallelism = false, - int actual_batch_size = 0, int num_minibatches = 1, size_t minibatch = 0) { - const int fixed_batch_size = interpreter_pool->FixedBatchSize(); + std::vector* outputs) { for (const auto& entry : tflite_idx_to_output_tensor) { Tensor* tensor = entry.second; const DataType tf_type = tensor->dtype(); - const int begin = fixed_batch_size * minibatch; - const int end = std::min(fixed_batch_size * static_cast(minibatch + 1), - actual_batch_size); - const int actual_minibatch_size = end - begin; - const auto& interpreter_wrapper = - interpreter_pool->GetInterpreter(minibatch); + if (tensor->NumElements() == 0) { + continue; + } const auto* interpreter = interpreter_wrapper->Get(); auto tflite_tensor = interpreter->tensor(entry.first); if (DataTypeCanUseMemcpy(tf_type)) { auto tensor_bytes = tensor->tensor_data(); int offset = 0; size_t tflite_tensor_bytes = tflite_tensor->bytes; - if (use_batch_parallelism) { - // Each batch will produce minibatch_size tensors. - // We want to make sure we only copy actual_batch_size. - offset = minibatch * tflite_tensor_bytes; - tflite_tensor_bytes = - tflite_tensor_bytes / fixed_batch_size * actual_minibatch_size; - } std::memcpy(const_cast(tensor_bytes.data() + offset), tflite_tensor->data.raw, tflite_tensor_bytes); } else if (tflite_tensor->type == kTfLiteString) { const int string_count = tflite::GetStringCount(tflite_tensor); int num_strings = string_count; int offset = 0; - if (use_batch_parallelism) { - offset = minibatch * string_count; - num_strings = string_count / fixed_batch_size * actual_minibatch_size; - } auto str_tensors = tensor->flat(); for (int i = 0; i < num_strings; i++) { const auto& ref = tflite::GetString(tflite_tensor, i); @@ -300,81 +282,125 @@ Status SetMiniBatchOutput( return Status::OK(); } -typedef std::function&, - const std::map&, bool, int32_t, - int)> - BatchFunction; -void ParallelFor( - const BatchFunction& f, - std::unique_ptr& interpreter_pool, - const std::map& tflite_inputs, int n, - bool use_batch_parallelism, bool run_in_caller, - std::vector& status) { - if (n == 0) return; - auto* thread_pool = interpreter_pool->ThreadPool(); - if (thread_pool == nullptr) { - for (int i = 0; i < n; ++i) { - status[i] = - f(interpreter_pool, tflite_inputs, use_batch_parallelism, n, i); - } - return; - } - int num_jobs = run_in_caller ? n - 1 : n; - int first_job = run_in_caller ? 1 : 0; - tensorflow::BlockingCounter counter(num_jobs); - for (int i = first_job; i < n; ++i) { - thread_pool->Schedule([&f, &interpreter_pool, &tflite_inputs, - use_batch_parallelism, n, i, &counter, &status] { - status[i] = - f(interpreter_pool, tflite_inputs, use_batch_parallelism, n, i); - counter.DecrementCount(); +} // namespace + +// Split an input task up into multiple tasks. +Status TfLiteSession::SplitTfLiteInputTask( + std::unique_ptr* input_task_ptr, + int open_batch_remaining_slot, int max_batch_size, + std::vector>* output_tasks) { + auto* input_task = input_task_ptr->get(); + auto split_output = + std::make_shared>>>(); + auto partial_status = std::make_shared(); + auto split_task_done_callback = [split_output, partial_status, input_task]() { + // notify the input task. + auto cleanup = gtl::MakeCleanup([done_notification = input_task->done]() { + done_notification->Notify(); }); + + // partial status is set during actual running. + if (!partial_status->status().ok()) { + *input_task->status = partial_status->status(); + return; + } + + // get the total number of tensors to concatenate (number of tasks) + int output_size = split_output->size(); + // each split contains the same number of output tensors. + int tensor_size = (*split_output)[0]->size(); + + // for each tensor output + for (int tensor_idx = 0; tensor_idx < tensor_size; ++tensor_idx) { + Tensor output_tensor; // the concatened tensor + std::vector to_concatenate; + to_concatenate.reserve(output_size); + // for each split task concatenate the output + for (int output_idx = 0; output_idx < output_size; ++output_idx) { + to_concatenate.push_back( + std::move((*(*split_output)[output_idx])[tensor_idx])); + } + const auto concat_status = tensor::Concat(to_concatenate, &output_tensor); + if (!concat_status.ok()) { + *input_task->status = concat_status; + return; + } + // add the concatenated tensor to input_tasks output + input_task->outputs->push_back(output_tensor); + } + *input_task->status = Status::OK(); + }; + + // The Callback will be run only after all partial tasks finished. + IncrementalBarrier barrier(std::move(split_task_done_callback)); + std::vector output_task_sizes; + + if (open_batch_remaining_slot > 0) { + output_task_sizes.push_back(open_batch_remaining_slot); + split_output->emplace_back(absl::make_unique>()); } - if (run_in_caller) { - status[0] = f(interpreter_pool, tflite_inputs, use_batch_parallelism, n, 0); + + for (int left_task_size = input_task->size() - open_batch_remaining_slot; + left_task_size > 0; left_task_size -= max_batch_size) { + int next_task_size = std::min(left_task_size, max_batch_size); + output_task_sizes.push_back(next_task_size); + split_output->emplace_back(absl::make_unique>()); } - counter.Wait(); -} -Status RunBatchParallel( - std::unique_ptr& interpreter_pool, - const std::vector>& inputs, - const std::map& tflite_idx_to_input_tensor, - bool run_in_caller_thread, const std::vector& output_tensor_names, - const std::map& output_tensor_to_index, - std::vector* outputs) { - const int actual_batch_size = inputs[0].second.NumElements(); - const int32_t num_threads = interpreter_pool->NumInterpreters(); - const int min_batch_size = interpreter_pool->FixedBatchSize(); - int num_minibatches = std::min( - num_threads, (actual_batch_size + min_batch_size - 1) / min_batch_size); - std::vector status_of_minibatches(num_minibatches); - ParallelFor(SetInputAndInvokeMiniBatch, interpreter_pool, - tflite_idx_to_input_tensor, num_minibatches, true, - run_in_caller_thread, status_of_minibatches); - for (Status& status_of_minibatch : status_of_minibatches) { - TF_RETURN_IF_ERROR(status_of_minibatch); + const int output_task_num = output_task_sizes.size(); + output_tasks->reserve(output_task_num); + for (int i = 0; i < output_task_num; ++i) { + std::unique_ptr task; + TfLiteBatchTask::CreatePartialTfLiteBatchTask( + input_task->input_indices, input_task->output_tensor_names, + (*split_output)[i].get(), barrier.Inc(), partial_status.get(), &task); + output_tasks->push_back(std::move(task)); } - std::map tflite_idx_to_output_tensor; - TF_RETURN_IF_ERROR(CreateOutputTensors( - interpreter_pool, output_tensor_names, output_tensor_to_index, - tflite_idx_to_output_tensor, outputs, true, actual_batch_size)); - // Set the contents of the return tensors. - for (size_t i = 0; i < num_minibatches; ++i) { - TF_RETURN_IF_ERROR(SetMiniBatchOutput( - interpreter_pool, tflite_idx_to_output_tensor, outputs, true, - actual_batch_size, num_minibatches, i)); + + for (int i = 0; i < input_task->inputs.size(); ++i) { + const Tensor& input = input_task->inputs[i]; + std::vector split_tensors; + auto status = tensor::Split(input, output_task_sizes, &split_tensors); + if (status != Status::OK()) { + return status; + } + for (int output_idx = 0; output_idx < output_task_num; ++output_idx) { + auto& output_task = (*output_tasks)[output_idx]; + output_task->inputs.push_back(std::move(split_tensors[output_idx])); + } } return Status::OK(); } -} // namespace +Status TfLiteSession::CreateDefaultBasicBatchScheduler( + const BasicBatchScheduler::Options& options, + std::function>)> + process_batch_callback, + std::unique_ptr>* batch_scheduler) { + std::unique_ptr> basic_batch_scheduler; + TF_RETURN_IF_ERROR(BasicBatchScheduler::Create( + options, process_batch_callback, &basic_batch_scheduler)); + *batch_scheduler = std::move(basic_batch_scheduler); + return Status::OK(); +} + +Status TfLiteSession::SetScheduler( + const SchedulerCreator& scheduler_creator, + const BasicBatchScheduler::Options& options) { + use_fixed_batch_size_ = true; + auto bound_scheduler_creator = absl::bind_front( + &TfLiteSession::CreateDefaultBasicBatchScheduler, options); + return bound_scheduler_creator( + [this](std::unique_ptr> batch) { + this->ProcessBatch(std::move(batch)); + }, + &scheduler_); +} Status TfLiteSession::Create(string&& buffer, const SessionOptions& options, int num_pools, int num_interpreters_per_pool, std::unique_ptr* tflite_session, - ::google::protobuf::Map* signatures, - bool run_in_caller_thread) { + ::google::protobuf::Map* signatures) { auto model = tflite::FlatBufferModel::BuildFromModel( flatbuffers::GetRoot(buffer.data())); if (model == nullptr) { @@ -456,18 +482,35 @@ Status TfLiteSession::Create(string&& buffer, const SessionOptions& options, sigdef->set_method_name(kPredictMethodName); } - num_pools = std::max(1, num_pools); - num_interpreters_per_pool = std::max(1, num_interpreters_per_pool); - - std::unique_ptr session_pool; - TF_RETURN_IF_ERROR(internal::TfLiteSessionPool::CreateTfLiteSessionPool( - model.get(), options, run_in_caller_thread, num_pools, - num_interpreters_per_pool, session_pool)); + int num_interpreters = std::max(1, num_pools); + std::unique_ptr interpreter_pool; + TF_RETURN_IF_ERROR( + internal::TfLiteInterpreterPool::CreateTfLiteInterpreterPool( + model.get(), options, num_interpreters, interpreter_pool)); tflite_session->reset(new TfLiteSession( std::move(input_tensor_to_index), std::move(output_tensor_to_index), - std::move(buffer), std::move(model), std::move(session_pool), - run_in_caller_thread)); + std::move(buffer), std::move(model), std::move(interpreter_pool))); + + if (num_interpreters_per_pool > 1) { + // Consider replacing with parameters loaded from the tflite model. + const int min_allowed_batch = + (internal::kInitialBatchSize + num_interpreters_per_pool - 1) / + num_interpreters_per_pool; + const int max_enqueued_batches = num_interpreters * 100; + BasicBatchScheduler::Options scheduler_options; + scheduler_options.num_batch_threads = num_interpreters; + scheduler_options.max_batch_size = internal::kInitialBatchSize; + scheduler_options.enable_large_batch_splitting = true; + scheduler_options.max_execution_batch_size = min_allowed_batch; + scheduler_options.max_enqueued_batches = max_enqueued_batches; + scheduler_options.split_input_task_func = SplitTfLiteInputTask; + + TF_RETURN_IF_ERROR( + (*tflite_session) + ->SetScheduler(&TfLiteSession::CreateDefaultBasicBatchScheduler, + scheduler_options)); + } return Status::OK(); } @@ -475,14 +518,12 @@ TfLiteSession::TfLiteSession( std::map&& input_tensor_to_index, std::map&& output_tensor_to_index, string&& buffer, std::unique_ptr model, - std::unique_ptr session_pool, - bool run_in_caller_thread) + std::unique_ptr interpreter_pool) : input_tensor_to_index_(std::move(input_tensor_to_index)), output_tensor_to_index_(std::move(output_tensor_to_index)), model_serialized_bytes_(std::move(buffer)), model_(std::move(model)), - session_pool_(std::move(session_pool)), - run_in_caller_thread_(run_in_caller_thread) {} + interpreter_pool_(std::move(interpreter_pool)) {} Status TfLiteSession::Run(const std::vector>& inputs, const std::vector& output_tensor_names, @@ -503,6 +544,41 @@ Status TfLiteSession::Run(const RunOptions& run_options, outputs, run_metadata, thread::ThreadPoolOptions()); } +Status TfLiteSession::RunInternal( + const std::vector& tflite_input_indices, + const std::vector>& merged_inputs, + const std::vector& output_tensor_names, + std::vector* combined_outputs, int batch_size, + int* fixed_batch_size) { +#define RETURN_POOL_IF_ERROR(...) \ + do { \ + ::tensorflow::Status _status = (__VA_ARGS__); \ + if (TF_PREDICT_FALSE(!_status.ok())) { \ + interpreter_pool_->ReturnInterpreter(std::move(interpreter)); \ + return _status; \ + } \ + } while (0); + auto interpreter = interpreter_pool_->GetInterpreter(); + RETURN_POOL_IF_ERROR( + SetInputAndInvokeMiniBatch(interpreter, tflite_input_indices, + merged_inputs, batch_size, fixed_batch_size)); + + // Create return tensors and map the tflite tensor index to the + // index of the created tensor. + std::map tflite_idx_to_output_tensor; + RETURN_POOL_IF_ERROR(CreateOutputTensors( + interpreter, output_tensor_names, output_tensor_to_index_, + tflite_idx_to_output_tensor, combined_outputs)); + + // Set the contents of the return tensors. + RETURN_POOL_IF_ERROR(SetMiniBatchOutput( + interpreter, tflite_idx_to_output_tensor, combined_outputs)); + +#undef RETURN_POOL_IF_ERROR + interpreter_pool_->ReturnInterpreter(std::move(interpreter)); + return Status::OK(); +} + Status TfLiteSession::Run( const RunOptions& run_options, const std::vector>& inputs, @@ -519,46 +595,173 @@ Status TfLiteSession::Run( const int index = input_tensor_to_index_.at(name); tflite_idx_to_input_tensor[index] = &input.second; } + outputs->reserve(output_tensor_names.size()); + if (!scheduler_) { + std::vector input_indices; + std::vector> inputs; + for (const auto entry : tflite_idx_to_input_tensor) { + const auto& tf_tensor = *entry.second; + inputs.push_back({&tf_tensor}); + input_indices.push_back(entry.first); + } + const int batch_size = + inputs.empty() || inputs[0].empty() ? 1 : inputs[0][0]->dim_size(0); + return RunInternal(input_indices, inputs, output_tensor_names, outputs, + batch_size); + } + Notification done; + Status status; + std::unique_ptr task; + TfLiteBatchTask::CreateTfLiteBatchTask(&output_tensor_names, outputs, &done, + &status, &task); + for (const auto entry : tflite_idx_to_input_tensor) { + task->input_indices.push_back(entry.first); + task->inputs.push_back(std::move(*entry.second)); + } + TF_RETURN_IF_ERROR(scheduler_->Schedule(&task)); + done.WaitForNotification(); + return status; +} -#define RETURN_POOL_IF_ERROR(...) \ - do { \ - ::tensorflow::Status _status = (__VA_ARGS__); \ - if (TF_PREDICT_FALSE(!_status.ok())) { \ - session_pool_->ReturnInterpreterPool(std::move(interpreter_pool)); \ - return _status; \ - } \ - } while (0); - auto interpreter_pool = session_pool_->GetInterpreterPool(); - if (interpreter_pool->UseBatchParallelism()) { - RETURN_POOL_IF_ERROR( - RunBatchParallel(interpreter_pool, inputs, tflite_idx_to_input_tensor, - run_in_caller_thread_, output_tensor_names, - output_tensor_to_index_, outputs)); - session_pool_->ReturnInterpreterPool(std::move(interpreter_pool)); - return Status::OK(); +Status TfLiteSession::ListDevices(std::vector* response) { + return errors::Unimplemented("ListDevices is not yet supported."); +} + +Status MergeInputTensors(const Batch& batch, + std::vector>* merged_inputs, + int* batch_size) { + if (batch.num_tasks() < 1) { + return errors::Internal("Batch size expected to be positive; was ", + batch.num_tasks()); + } + const int tensors_per_task = batch.task(0).inputs.size(); + *batch_size = 0; + // each entry in merged_inputs is a list of task tensors. + for (int i = 0; i < tensors_per_task; ++i) { + merged_inputs->emplace_back(); + std::vector& tensors_to_merge = merged_inputs->back(); + for (int j = 0; j < batch.num_tasks(); ++j) { + const std::vector& inputs = batch.task(j).inputs; + tensors_to_merge.push_back(&(inputs[i])); + if (i == 0) { + if (inputs[i].dims()) { + *batch_size += inputs[i].dim_size(0); + } + } + } } + return Status::OK(); +} - RETURN_POOL_IF_ERROR( - SetInputAndInvokeMiniBatch(interpreter_pool, tflite_idx_to_input_tensor)); +Status SplitOutputTensors(const std::vector& combined_outputs, + Batch* batch, int batch_size) { + std::vector task_sizes(batch->num_tasks()); + int total_size = 0; + for (int i = 0; i < batch->num_tasks(); ++i) { + const int task_size = batch->task(i).size(); + task_sizes[i] = task_size; + total_size += task_size; + } - // Create return tensors and map the tflite tensor index to the - // index of the created tensor. - std::map tflite_idx_to_output_tensor; - RETURN_POOL_IF_ERROR(CreateOutputTensors( - interpreter_pool, output_tensor_names, output_tensor_to_index_, - tflite_idx_to_output_tensor, outputs)); + if (total_size < batch_size) { + task_sizes.push_back(batch_size - total_size); + } - // Set the contents of the return tensors. - RETURN_POOL_IF_ERROR(SetMiniBatchOutput( - interpreter_pool, tflite_idx_to_output_tensor, outputs)); + for (int i = 0; i < combined_outputs.size(); i++) { + const auto& output_tensor = combined_outputs[i]; + std::vector split_tensor; + const Status split_status = + tensor::Split(output_tensor, task_sizes, &split_tensor); + if (!split_status.ok()) { + return errors::Internal("Tensor split operation failed: ", + split_status.ToString()); + } + for (int j = 0; j < batch->num_tasks(); ++j) { + TfLiteBatchTask& task = *(batch->mutable_task(j)); + task.set_output(split_tensor[j]); + } + } -#undef RETURN_POOL_IF_ERROR - session_pool_->ReturnInterpreterPool(std::move(interpreter_pool)); return Status::OK(); } -Status TfLiteSession::ListDevices(std::vector* response) { - return errors::Unimplemented("ListDevices is not yet supported."); +void TfLiteSession::ProcessBatch( + std::unique_ptr> batch) { + // As a possible performance optimization, consider overlapping the tensor + // concatenation with waiting for the batch to close (i.e. do the + // concatenation incrementally as tasks stream into the batch). + batch->WaitUntilClosed(); + + if (batch->empty()) { + return; + } + + const uint64 dequeue_time_micros = EnvTime::NowMicros(); + + // Regardless of the outcome, we need to propagate the status to the + // individual tasks and signal that they are done. We use MakeCleanup() to + // ensure that this happens no matter how we exit the method below. + Status status; + auto finally = gtl::MakeCleanup([&status, &batch] { + for (int i = 0; i < batch->num_tasks(); ++i) { + TfLiteBatchTask* task = batch->mutable_task(i); + if (task->is_partial) { + task->partial_status->Update(status); + task->done_callback(); + } else { + *batch->mutable_task(i)->status = status; + batch->mutable_task(i)->done->Notify(); + } + } + }); + + // Make sure we have at least one task that hasn't exceeded its timeout from + // queue time alone, and find the latest task deadline which we'll use for the + // overall batch. + bool all_tasks_timeout_exceeded = true; + uint64 batch_deadline_micros = 0; + for (int i = 0; i < batch->num_tasks(); ++i) { + const TfLiteBatchTask& task = batch->task(i); + // If the caller doesn't populate RunOptions, the timeout is 0 by default. + // Interpret that as "no timeout". + if (task.run_options.timeout_in_ms() <= 0) { + all_tasks_timeout_exceeded = false; + break; + } + const int64 task_timeout_micros = task.run_options.timeout_in_ms() * 1000; + const uint64 task_deadline_micros = + task.enqueue_time_micros + task_timeout_micros; + if (task_deadline_micros > dequeue_time_micros) { + all_tasks_timeout_exceeded = false; + if (task_deadline_micros > batch_deadline_micros) { + batch_deadline_micros = task_deadline_micros; + } + } + } + if (all_tasks_timeout_exceeded) { + status = Status(error::RESOURCE_EXHAUSTED, + "Run() timeout exceeded while waiting in batching queue"); + return; + } + + std::vector> merged_inputs; + int batch_size = 0; + status = MergeInputTensors(*batch, &merged_inputs, &batch_size); + if (!status.ok()) { + return; + } + std::vector combined_outputs; + const auto& tflite_input_indices = batch->task(0).input_indices; + auto& output_tensor_names = batch->task(0).output_tensor_names; + int fixed_batch_size = batch_size; + status = RunInternal(tflite_input_indices, merged_inputs, + *output_tensor_names, &combined_outputs, batch_size, + use_fixed_batch_size_ ? &fixed_batch_size : nullptr); + if (!status.ok()) { + return; + } + // The size of the batch might be smaller than the fixed_batch_size. + status = SplitOutputTensors(combined_outputs, batch.get(), fixed_batch_size); } } // namespace serving diff --git a/tensorflow_serving/servables/tensorflow/tflite_session.h b/tensorflow_serving/servables/tensorflow/tflite_session.h index c8eb460bd92..210884680f7 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session.h +++ b/tensorflow_serving/servables/tensorflow/tflite_session.h @@ -22,6 +22,8 @@ limitations under the License. #include "absl/base/thread_annotations.h" #include "absl/synchronization/mutex.h" +#include "tensorflow/core/framework/tensor.h" +#include "tensorflow/core/kernels/batching_util/basic_batch_scheduler.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/platform/file_system.h" #include "tensorflow/core/platform/threadpool.h" @@ -31,6 +33,7 @@ limitations under the License. #include "tensorflow/lite/interpreter.h" #include "tensorflow/lite/kernels/cpu_backend_context.h" #include "tensorflow/lite/model.h" +#include "tensorflow_serving/batching/threadsafe_status.h" #include "tensorflow_serving/servables/tensorflow/serving_session.h" #include "tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h" @@ -39,6 +42,88 @@ namespace serving { using TensorInfoMap = std::map>; +// Encapsulates a unit of work for BatchScheduler. +class TfLiteBatchTask : public BatchTask { + public: + // Creates a batch task. + static void CreateTfLiteBatchTask( + const std::vector* output_tensor_names, + std::vector* outputs, Notification* done, Status* status, + std::unique_ptr* batch_task) { + TfLiteBatchTask* task = new TfLiteBatchTask(); + task->is_partial = false; + task->output_tensor_names = output_tensor_names; + task->outputs = outputs; + task->done = done; + task->status = status; + batch_task->reset(task); + } + + // Create partial batch task. + static void CreatePartialTfLiteBatchTask( + std::vector input_indices, + const std::vector* output_tensor_names, + std::vector* outputs, std::function done_callback, + ThreadSafeStatus* partial_status, + std::unique_ptr* batch_task) { + TfLiteBatchTask* task = new TfLiteBatchTask(); + task->is_partial = true; + task->input_indices = input_indices; + task->output_tensor_names = output_tensor_names; + task->outputs = outputs; + task->done_callback = done_callback; + task->partial_status = partial_status; + batch_task->reset(task); + } + + TfLiteBatchTask() : enqueue_time_micros(Env::Default()->NowMicros()) {} + + TfLiteBatchTask(const TfLiteBatchTask&) = delete; + + TfLiteBatchTask& operator=(const TfLiteBatchTask&) = delete; + + ~TfLiteBatchTask() override = default; + + // Returns the batch size. + size_t size() const override { return inputs[0].dim_size(0); } + + uint64 start_time_micros() const { return enqueue_time_micros; } + + Notification* done; + + Status* status; + + // Input indices for the tflite tensors, aligned with inputs. + std::vector input_indices; + + // Vector of input tensors. + std::vector inputs; + + // Pointer to tensor of outputs. + std::vector* outputs; + + void set_output(Tensor t) { outputs->push_back(t); } + + const std::vector* output_tensor_names; + + RunOptions run_options; + + const uint64 enqueue_time_micros; + + // Required for partial execution using split batches. + bool is_partial = false; + + // A callback for when the partial task is completed. + std::function done_callback; + + ThreadSafeStatus* partial_status; +}; + +using SchedulerCreator = std::function::Options& options, + std::function>)>, + std::unique_ptr>*)>; + // A session to run inference on a TensorFlow Lite model. // class TfLiteSession : public ServingSession { @@ -53,8 +138,18 @@ class TfLiteSession : public ServingSession { static Status Create(string&& buffer, const SessionOptions& options, int num_pools, int num_interpreters_per_pool, std::unique_ptr* tflite_session, - ::google::protobuf::Map* signatures, - bool run_in_caller_thread = false); + ::google::protobuf::Map* signatures); + + static Status CreateDefaultBasicBatchScheduler( + const BasicBatchScheduler::Options& options, + std::function>)> + process_batch_callback, + std::unique_ptr>* batch_scheduler); + + static Status SplitTfLiteInputTask( + std::unique_ptr* input_task_ptr, + int open_batch_remaining_slot, int max_batch_size, + std::vector>* output_tasks); ~TfLiteSession() override = default; @@ -78,18 +173,30 @@ class TfLiteSession : public ServingSession { Status ListDevices(std::vector* response) override; + Status SetScheduler( + const SchedulerCreator& scheduler_creator, + const BasicBatchScheduler::Options& options); + private: - TfLiteSession(std::map&& input_tensor_to_index, - std::map&& output_tensor_to_index, string&& buffer, - std::unique_ptr model, - std::unique_ptr session_pool, - bool run_in_caller_thread); + TfLiteSession( + std::map&& input_tensor_to_index, + std::map&& output_tensor_to_index, string&& buffer, + std::unique_ptr model, + std::unique_ptr interpreter_pool); + Status RunInternal( + const std::vector& tflite_input_indices, + const std::vector>& merged_inputs, + const std::vector& output_tensor_names, + std::vector* combined_outputs, int batch_size, + int* fixed_batch_size = nullptr); const std::map input_tensor_to_index_; const std::map output_tensor_to_index_; const string model_serialized_bytes_; const std::unique_ptr model_; - const std::unique_ptr session_pool_; - const bool run_in_caller_thread_; + const std::unique_ptr interpreter_pool_; + bool use_fixed_batch_size_; + std::unique_ptr> scheduler_; + void ProcessBatch(std::unique_ptr> batch); TF_DISALLOW_COPY_AND_ASSIGN(TfLiteSession); }; diff --git a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc index d22f447f59f..084095d52ea 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc @@ -22,6 +22,7 @@ limitations under the License. #include #include #include "absl/flags/flag.h" +#include "absl/functional/bind_front.h" #include "flatbuffers/flexbuffers.h" #include "tensorflow/cc/saved_model/signature_constants.h" #include "tensorflow/core/example/example.pb.h" @@ -689,6 +690,93 @@ TEST(TfLiteSession, TestBatchParallelism) { test::AsTensor(expected_bytes, TensorShape({batch_size, 1}))); } +TEST(TfLiteSession, TestSetScheduler) { + std::string model_bytes; + TF_ASSERT_OK(ReadFileToString(Env::Default(), + test_util::TestSrcDirPath(kParseExampleModel), + &model_bytes)); + auto model = tflite::FlatBufferModel::BuildFromModel( + flatbuffers::GetRoot(model_bytes.data())); + auto model_signature_def_map = GetTestSignatureDefMap(); + ::google::protobuf::Map signatures; + std::unique_ptr sess; + tensorflow::SessionOptions options; + + int split_called = 0; + auto TestSplitTfLiteInputTask = + [&split_called]( + std::unique_ptr* input_task_ptr, + int open_batch_remaining_slot, int max_batch_size, + std::vector>* output_tasks) { + split_called += 1; + auto status = TfLiteSession::SplitTfLiteInputTask( + input_task_ptr, open_batch_remaining_slot, max_batch_size, + output_tasks); + return status; + }; + + BasicBatchScheduler::Options scheduler_options; + scheduler_options.num_batch_threads = 1; + scheduler_options.max_batch_size = internal::kInitialBatchSize; + scheduler_options.enable_large_batch_splitting = true; + scheduler_options.max_execution_batch_size = 130; + scheduler_options.max_enqueued_batches = 4; + scheduler_options.split_input_task_func = TestSplitTfLiteInputTask; + + TF_ASSERT_OK(TfLiteSession::Create(std::move(model_bytes), options, 1, 1, + &sess, &signatures)); + + TF_ASSERT_OK(sess->SetScheduler( + TfLiteSession::CreateDefaultBasicBatchScheduler, scheduler_options)); + + const int batch_size = 500; + const float default_value = 0; + std::vector example_list; + std::vector expected; + std::vector expected_bytes; + std::vector outputs; + + std::mt19937 random_engine; + auto random_func = [&]() { + return std::uniform_real_distribution(-0.5, 0.5)(random_engine); + }; + const std::string kTestString = "test string"; + const std::string kDefaultString = "missing"; + for (int i = 0; i < batch_size; i++) { + float val = random_func(); + tensorflow::Example example; + std::string str; + if (val < -1) { + expected.push_back(default_value); + expected_bytes.push_back(kDefaultString); + } else { + expected.push_back(val); + expected_bytes.push_back(kTestString); + auto* features = example.mutable_features(); + (*features->mutable_feature())["x"].mutable_float_list()->add_value(val); + (*features->mutable_feature())["y"].mutable_bytes_list()->add_value( + kTestString); + } + example.SerializeToString(&str); + example_list.push_back(str); + } + + Tensor example_list_tensor = + test::AsTensor(example_list, TensorShape({batch_size})); + TF_EXPECT_OK(sess->Run( + {{"input", example_list_tensor}}, + {"ParseExample/ParseExampleV2", "ParseExample/ParseExampleV2:1"}, {}, + &outputs)); + test::ExpectTensorEqual( + outputs[0], + test::AsTensor(expected, TensorShape({batch_size, 1}))); + EXPECT_EQ(outputs.size(), 2); + test::ExpectTensorEqual( + outputs[1], + test::AsTensor(expected_bytes, TensorShape({batch_size, 1}))); + EXPECT_EQ(split_called, 1); +} + #ifdef PLATFORM_GOOGLE // These benchmarks rely on https://github.com/google/benchmark features, // not available in open-sourced TF codebase. From d9c7552a0bd7ab4a57d63b04c8841920ad5879b6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 10 Jun 2021 18:01:53 -0700 Subject: [PATCH 5108/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7782cc12-94c9-4765-9046-d5fc5eaaa489 PiperOrigin-RevId: 378776166 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 123b58b02de..8742b228c53 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0840d1c240335ad32a3de0a58d7e87f7de7a1b17c6d2efba0041dde5666697b4", - git_commit = "4fda52d02555333b317f4e1051281cda2da5081b", + sha256 = "0efd0f781aca09315435670408faf7617fe704dcdce0450e48e313b83d135839", + git_commit = "dafc412b0a95dbf8ea2d0487dc6518fdd39f8dec", ) # Import all of TensorFlow Serving's external dependencies. From e14cf2cbe7535d3cf4bc73e6545986c1fb7ad852 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 11 Jun 2021 00:01:56 -0700 Subject: [PATCH 5109/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8756d6a8-c3e6-400c-8020-acc74e8f7a1b PiperOrigin-RevId: 378815728 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8742b228c53..0ee911de2a0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0efd0f781aca09315435670408faf7617fe704dcdce0450e48e313b83d135839", - git_commit = "dafc412b0a95dbf8ea2d0487dc6518fdd39f8dec", + sha256 = "2150609acdef63d9b29876cc825f889df355883b78d4958f06942a20150641d5", + git_commit = "b34d6cf6793ff4b3a37d73e126d918476e27ade0", ) # Import all of TensorFlow Serving's external dependencies. From 34903a1232e3a8bfeaceea4c5a1281d0a3bcbbb4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 11 Jun 2021 06:01:33 -0700 Subject: [PATCH 5110/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c111abc3-d009-44cb-9cda-e2649628ecdb PiperOrigin-RevId: 378857587 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0ee911de2a0..d0f924557bf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2150609acdef63d9b29876cc825f889df355883b78d4958f06942a20150641d5", - git_commit = "b34d6cf6793ff4b3a37d73e126d918476e27ade0", + sha256 = "64625f2964411e1f5fbaba64693c06dfc2f29be830afbbda0823badb2fff837c", + git_commit = "6be5741a6a00b7e5f8677c8770c08852deefad3f", ) # Import all of TensorFlow Serving's external dependencies. From 647c5e0ab0f7f82c877202dc167c2c2168e408a0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 11 Jun 2021 12:02:55 -0700 Subject: [PATCH 5111/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1aa23cb3-4158-42c7-8944-5056ba7588eb PiperOrigin-RevId: 378920814 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d0f924557bf..f448529d8d9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "64625f2964411e1f5fbaba64693c06dfc2f29be830afbbda0823badb2fff837c", - git_commit = "6be5741a6a00b7e5f8677c8770c08852deefad3f", + sha256 = "66e8b36b6abf8ac7daa3a333a19f244fa1c26904a7b22d7b1863e03fbf1e7ef4", + git_commit = "b7ca816d2ddd6e288c69ae523554fa314551343a", ) # Import all of TensorFlow Serving's external dependencies. From 2c7e79a7bc0b5779d62fa931f18d4235517ed48f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 11 Jun 2021 18:01:48 -0700 Subject: [PATCH 5112/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9de25fce-68af-4fd6-986c-94d6cf8888c2 PiperOrigin-RevId: 378984263 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f448529d8d9..9a910f5aec6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "66e8b36b6abf8ac7daa3a333a19f244fa1c26904a7b22d7b1863e03fbf1e7ef4", - git_commit = "b7ca816d2ddd6e288c69ae523554fa314551343a", + sha256 = "62e571a1c10384c92e8137c15b1bbbabfb2e8e4ed46cd8d3474cd6e2f52b0faf", + git_commit = "3457a2b122e50b4d44ceaaed5a663d635e5c22df", ) # Import all of TensorFlow Serving's external dependencies. From 32253685b98e2a592a752884c108d98589e69837 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 12 Jun 2021 00:01:32 -0700 Subject: [PATCH 5113/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/340be566-1937-4224-ac11-eb161cc04755 PiperOrigin-RevId: 379015745 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9a910f5aec6..2a45d63ff28 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "62e571a1c10384c92e8137c15b1bbbabfb2e8e4ed46cd8d3474cd6e2f52b0faf", - git_commit = "3457a2b122e50b4d44ceaaed5a663d635e5c22df", + sha256 = "bdbfc890d2f8858a78c550c6288158dd8d4f80ab4fb0532c8512c82c97cff58d", + git_commit = "6d23cf127d84f4d0cec4e14a4860b77dafc43d26", ) # Import all of TensorFlow Serving's external dependencies. From 97aa2db6dd0819dadf07e4bd2e8e49ca39c6c6f9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 14 Jun 2021 09:56:05 -0700 Subject: [PATCH 5114/8103] Remove experimental tags from uses of gRPC C++ callback API. PiperOrigin-RevId: 379299746 --- .../ops/remote_predict/kernels/prediction_service_grpc.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/prediction_service_grpc.cc b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/prediction_service_grpc.cc index 988f6b0330c..bacf88f44ef 100644 --- a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/prediction_service_grpc.cc +++ b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/prediction_service_grpc.cc @@ -58,8 +58,7 @@ void PredictionServiceGrpc::Predict( std::function wrapped_callback = [callback](::grpc::Status status) { callback(FromGrpcStatus(status)); }; - stub_->experimental_async()->Predict(rpc, request, response, - wrapped_callback); + stub_->async()->Predict(rpc, request, response, wrapped_callback); } } // namespace serving From b355023b034ca6ef72b507920d9de2a02e0f4a2a Mon Sep 17 00:00:00 2001 From: Haiming Bao Date: Mon, 14 Jun 2021 19:35:56 -0700 Subject: [PATCH 5115/8103] Remove experimental tags from uses of gRPC C++ callback API. PiperOrigin-RevId: 379399623 --- .../ops/remote_predict/kernels/prediction_service_grpc.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/prediction_service_grpc.cc b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/prediction_service_grpc.cc index bacf88f44ef..988f6b0330c 100644 --- a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/prediction_service_grpc.cc +++ b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/prediction_service_grpc.cc @@ -58,7 +58,8 @@ void PredictionServiceGrpc::Predict( std::function wrapped_callback = [callback](::grpc::Status status) { callback(FromGrpcStatus(status)); }; - stub_->async()->Predict(rpc, request, response, wrapped_callback); + stub_->experimental_async()->Predict(rpc, request, response, + wrapped_callback); } } // namespace serving From ae864bc3a7aa0f089bcd99f5106cb4173ec2e7bb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 15 Jun 2021 18:01:25 -0700 Subject: [PATCH 5116/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/29557d7c-4708-4823-8fc6-2ea23c603717 PiperOrigin-RevId: 379616787 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2a45d63ff28..7e24422f773 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bdbfc890d2f8858a78c550c6288158dd8d4f80ab4fb0532c8512c82c97cff58d", - git_commit = "6d23cf127d84f4d0cec4e14a4860b77dafc43d26", + sha256 = "dc738b72568e1df7c95990258205feb285833825115d98589aba2f50f27e2a09", + git_commit = "bee0e270e74a2a939ce47b655a4ae484fd379df9", ) # Import all of TensorFlow Serving's external dependencies. From 612d071f396aaebd127e5f265c3990ac1ec72b17 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 16 Jun 2021 00:01:48 -0700 Subject: [PATCH 5117/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c206f0f1-40fa-4b23-b018-f5087096aa32 PiperOrigin-RevId: 379656564 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7e24422f773..9ad074d1001 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dc738b72568e1df7c95990258205feb285833825115d98589aba2f50f27e2a09", - git_commit = "bee0e270e74a2a939ce47b655a4ae484fd379df9", + sha256 = "8b30034e04135dc6993c78752e3baff77e5c64a79ae566bab636f59d3f3f49d6", + git_commit = "701b4ed59184e9af54de25a90ef049321a95a243", ) # Import all of TensorFlow Serving's external dependencies. From a6e301bc0151dd695f959f2a5b2dbdb6d4cc1193 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 16 Jun 2021 06:01:36 -0700 Subject: [PATCH 5118/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a68d4a52-3ab6-443d-bd65-ba9eb71d885b PiperOrigin-RevId: 379702728 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9ad074d1001..05d1405ac82 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8b30034e04135dc6993c78752e3baff77e5c64a79ae566bab636f59d3f3f49d6", - git_commit = "701b4ed59184e9af54de25a90ef049321a95a243", + sha256 = "e539af9d1bb3a95f2432d1b2b08fcbb99f1077256723c31c3ec83a4ffad84df0", + git_commit = "6dfe928445dfde9b92a31c6724ece8c8a855924a", ) # Import all of TensorFlow Serving's external dependencies. From 2fd2011fec0ab3338c1501e375fcf04198a8fe1b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 16 Jun 2021 12:01:33 -0700 Subject: [PATCH 5119/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c0fb44eb-0150-40bf-8bac-ec572bcba8ef PiperOrigin-RevId: 379777141 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 05d1405ac82..c29b589ec4e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e539af9d1bb3a95f2432d1b2b08fcbb99f1077256723c31c3ec83a4ffad84df0", - git_commit = "6dfe928445dfde9b92a31c6724ece8c8a855924a", + sha256 = "71ec47ad18e674a01a0a5b866c33b9c597d124b67b6139aaf006dbba5249079b", + git_commit = "f9d6566ae755e21ad5524ba4c5741001c77f1626", ) # Import all of TensorFlow Serving's external dependencies. From 888b0df28dd9a5f9c5995134cb68f5f93665c971 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 16 Jun 2021 18:04:41 -0700 Subject: [PATCH 5120/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/491169d3-8630-4a77-b315-6b4c31667642 PiperOrigin-RevId: 379852421 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c29b589ec4e..0709882b74d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "71ec47ad18e674a01a0a5b866c33b9c597d124b67b6139aaf006dbba5249079b", - git_commit = "f9d6566ae755e21ad5524ba4c5741001c77f1626", + sha256 = "70f2b1520cc02eac533261815835c0616f7a127c37755aca888d064b3be5653c", + git_commit = "e48f4b59d1b8a7df838b6475b5605818d82109bb", ) # Import all of TensorFlow Serving's external dependencies. From db9aca187affd0453627a1729916acfea98ae800 Mon Sep 17 00:00:00 2001 From: Haoyu Zhang Date: Thu, 17 Jun 2021 14:16:18 -0700 Subject: [PATCH 5121/8103] Reserve Unavailable error to TF communication ops only. If a non-communication kernel returns an Unavailable error, wrap it as an Unknown error to avoid it being caught accidentally by TF error handling logic. PiperOrigin-RevId: 380043292 --- .../tensorflow/ops/remote_predict/ops/remote_predict_op.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/ops/remote_predict_op.cc b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/ops/remote_predict_op.cc index df8bb5c3dc2..fedc7f89b41 100644 --- a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/ops/remote_predict_op.cc +++ b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/ops/remote_predict_op.cc @@ -76,6 +76,7 @@ REGISTER_OP("TfServingRemotePredict") return Status::OK(); }) .SetIsStateful() + .SetIsDistributedCommunication() .Doc(R"doc( Invokes Predict on a remote graph. fail_op_on_rpc_error: If set true, the Op fails if the rpc fails, and returns From 38d777f12a2fba1915acff3c01ed1572a98f0d29 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 21 Jun 2021 18:01:34 -0700 Subject: [PATCH 5122/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/30340f90-9ba1-4a38-b29f-e8b71113f739 PiperOrigin-RevId: 380704677 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0709882b74d..f8c4a5d44da 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "70f2b1520cc02eac533261815835c0616f7a127c37755aca888d064b3be5653c", - git_commit = "e48f4b59d1b8a7df838b6475b5605818d82109bb", + sha256 = "cb4afd6ad443a44a514ccb4004c5489bc00069b53e80313dce52c053b1bb3bb3", + git_commit = "882f0950edaa00d1c420253a24585f0a264f32d7", ) # Import all of TensorFlow Serving's external dependencies. From ce8c791da0f8412e0da0612304b04a80de059372 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 22 Jun 2021 00:02:15 -0700 Subject: [PATCH 5123/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/67a4669b-ed5a-459d-b86b-191d39d098c3 PiperOrigin-RevId: 380745030 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f8c4a5d44da..3ff963c1e69 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cb4afd6ad443a44a514ccb4004c5489bc00069b53e80313dce52c053b1bb3bb3", - git_commit = "882f0950edaa00d1c420253a24585f0a264f32d7", + sha256 = "792cdbbcde054c80a02733a1ba46205a18332113b7bdc59f4b310c786537ded9", + git_commit = "cff144352e41f45e480f132bf6d7fd838720c732", ) # Import all of TensorFlow Serving's external dependencies. From ebe71b7c912a3f851f54e8b5ae319564c84d9e15 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 22 Jun 2021 06:01:36 -0700 Subject: [PATCH 5124/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/404a48e8-404f-4d4e-af31-46b75b6e0dfe PiperOrigin-RevId: 380790201 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3ff963c1e69..da6afc57b35 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "792cdbbcde054c80a02733a1ba46205a18332113b7bdc59f4b310c786537ded9", - git_commit = "cff144352e41f45e480f132bf6d7fd838720c732", + sha256 = "9b69f58bd962d6d96e7cb5721e055e6a65aebb8f91e268f52ae9cade9e66d9ed", + git_commit = "30c40919f046e7fdbc9d989767b013b870e953e8", ) # Import all of TensorFlow Serving's external dependencies. From efc445f416f8cb20606ca0d2aaf44c13fae7ea4c Mon Sep 17 00:00:00 2001 From: Li Lao Date: Tue, 22 Jun 2021 11:54:02 -0700 Subject: [PATCH 5125/8103] Add the flag thread_pool_factory_config_file to model server and fix a typo. PiperOrigin-RevId: 380859541 --- tensorflow_serving/model_servers/main.cc | 6 +++++- tensorflow_serving/servables/tensorflow/classifier.h | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index e25efe06239..478390cea63 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -240,7 +240,11 @@ int main(int argc, char** argv) { "disabled, models utilizing this feature will return bad Status " "on first compilation request."), tensorflow::Flag("enable_profiler", &options.enable_profiler, - "Enable profiler service.")}; + "Enable profiler service."), + tensorflow::Flag("thread_pool_factory_config_file", + &options.thread_pool_factory_config_file, + "If non-empty, read an ascii ThreadPoolConfig protobuf " + "from the supplied file name.")}; const auto& usage = tensorflow::Flags::Usage(argv[0], flag_list); if (!tensorflow::Flags::Parse(&argc, argv, flag_list)) { diff --git a/tensorflow_serving/servables/tensorflow/classifier.h b/tensorflow_serving/servables/tensorflow/classifier.h index 9df1b2117fe..9a2a1f2e671 100644 --- a/tensorflow_serving/servables/tensorflow/classifier.h +++ b/tensorflow_serving/servables/tensorflow/classifier.h @@ -45,7 +45,7 @@ Status CreateFlyweightTensorFlowClassifier( const SignatureDef* signature, std::unique_ptr* service); -// Similar to the above function, but with an additional thread_pool_factory. +// Similar to the above function, but with an additional 'thread_pool_options'. Status CreateFlyweightTensorFlowClassifier( const RunOptions& run_options, Session* session, const SignatureDef* signature, From 8c18f347994398508fa3c53352354e71fb0be03f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 22 Jun 2021 12:01:26 -0700 Subject: [PATCH 5126/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/599df8a4-7aad-4d73-b9fa-ee250fe2e67f PiperOrigin-RevId: 380861274 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index da6afc57b35..6846e3ca879 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9b69f58bd962d6d96e7cb5721e055e6a65aebb8f91e268f52ae9cade9e66d9ed", - git_commit = "30c40919f046e7fdbc9d989767b013b870e953e8", + sha256 = "a7b774da8be1651990318485371ea12184327863ba07136082422d0ea231f060", + git_commit = "6229d68405aeda7a09141fef3dbe1f4fa83b3290", ) # Import all of TensorFlow Serving's external dependencies. From c1a81c61c387653129df39512851b08ee910e531 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 22 Jun 2021 18:01:17 -0700 Subject: [PATCH 5127/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c51c9091-9cc0-496e-9d62-8c7cda78612b PiperOrigin-RevId: 380931507 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6846e3ca879..cf4de8e0092 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a7b774da8be1651990318485371ea12184327863ba07136082422d0ea231f060", - git_commit = "6229d68405aeda7a09141fef3dbe1f4fa83b3290", + sha256 = "95cb6be4a045bae18289ce5ed534d71fcedff8e8f44a25b6b3c71f3e87492f66", + git_commit = "0e6a2312869bc0a4ea6871eb52d17276c14202f9", ) # Import all of TensorFlow Serving's external dependencies. From 8a198003c0344402d0835f0a768c4908895211b3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 23 Jun 2021 00:01:30 -0700 Subject: [PATCH 5128/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/05d82118-c750-4510-8226-6caa80d8430e PiperOrigin-RevId: 380969128 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cf4de8e0092..97a88d53a9b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "95cb6be4a045bae18289ce5ed534d71fcedff8e8f44a25b6b3c71f3e87492f66", - git_commit = "0e6a2312869bc0a4ea6871eb52d17276c14202f9", + sha256 = "4a368072e332600645b5ed117d42dd0a24d9190c59c5aa6938d37e2312ff1969", + git_commit = "3ef6fbfd02716f774024afae711383fdb0d8a30c", ) # Import all of TensorFlow Serving's external dependencies. From d3261f16c4f4e4aa1debd48986989b313d27b1f9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 23 Jun 2021 06:01:52 -0700 Subject: [PATCH 5129/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/029d846a-7638-4f46-b94e-29e9dfc7a596 PiperOrigin-RevId: 381013157 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 97a88d53a9b..c5a69343245 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4a368072e332600645b5ed117d42dd0a24d9190c59c5aa6938d37e2312ff1969", - git_commit = "3ef6fbfd02716f774024afae711383fdb0d8a30c", + sha256 = "be42af76f02cde203906d70f63dd708b88e04d961ff81174d7a58388222b05fc", + git_commit = "d0c20b3e5dd976541a87a371b0f968812b7d8b14", ) # Import all of TensorFlow Serving's external dependencies. From 0296c0956a433e9ca077047e5ceb98ed5e9f46cc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 23 Jun 2021 12:01:22 -0700 Subject: [PATCH 5130/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c2f1ae2a-fe18-4fde-9c66-66512cc295e1 PiperOrigin-RevId: 381084791 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c5a69343245..bea378e81d3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "be42af76f02cde203906d70f63dd708b88e04d961ff81174d7a58388222b05fc", - git_commit = "d0c20b3e5dd976541a87a371b0f968812b7d8b14", + sha256 = "eebccc89c5d248aeedd5a520e22c586e5722c1f95432ec4016409caf94a3618e", + git_commit = "667e6bf43678c5af744c2facefb0fee2b53ada2a", ) # Import all of TensorFlow Serving's external dependencies. From ceba636bb7c5c98bde35d1818fd033b36300fffe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 23 Jun 2021 15:00:23 -0700 Subject: [PATCH 5131/8103] Add support for using Google ALTS to build secure server credentials. Adding --use_alts_credentials command line flag to enable this (defaults to false). PiperOrigin-RevId: 381122362 --- tensorflow_serving/model_servers/main.cc | 2 ++ tensorflow_serving/model_servers/server.cc | 38 +++++++++++++++------- tensorflow_serving/model_servers/server.h | 3 ++ 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index 478390cea63..2c7be43dced 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -168,6 +168,8 @@ int main(int argc, char** argv) { "simultaneously. Auto-configured by default." "Note that this option is ignored if " "--platform_config_file is non-empty."), + tensorflow::Flag("use_alts_credentials", &options.use_alts_credentials, + "Use Google ALTS credentials"), tensorflow::Flag( "ssl_config_file", &options.ssl_config_file, "If non-empty, read an ascii SSLConfig protobuf from " diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index 55e92f9d1b4..97215ae24c0 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -24,11 +24,11 @@ limitations under the License. #include "google/protobuf/wrappers.pb.h" #include "grpc/grpc.h" +#include "grpcpp/resource_quota.h" #include "grpcpp/security/server_credentials.h" #include "grpcpp/server_builder.h" #include "grpcpp/server_context.h" #include "grpcpp/support/status.h" -#include "grpcpp/resource_quota.h" #include "absl/memory/memory.h" #include "tensorflow/c/c_api.h" #include "tensorflow/cc/saved_model/tag_constants.h" @@ -120,16 +120,23 @@ std::vector parseGrpcChannelArgs( return result; } -// If 'ssl_config_file' is non-empty, build secure server credentials otherwise -// insecure channel -std::shared_ptr<::grpc::ServerCredentials> -BuildServerCredentialsFromSSLConfigFile(const string& ssl_config_file) { - if (ssl_config_file.empty()) { +// If 'use_alts_credentials', build secure server credentials using ALTS. +// Else if 'ssl_config_file' is non-empty, build using ssl. +// Otherwise use insecure channel. +std::shared_ptr<::grpc::ServerCredentials> BuildServerCredentials( + bool use_alts_credentials, const string& ssl_config_file) { + if (use_alts_credentials) { + LOG(INFO) << "Using ALTS credentials"; + ::grpc::experimental::AltsServerCredentialsOptions alts_opts; + return ::grpc::experimental::AltsServerCredentials(alts_opts); + } else if (ssl_config_file.empty()) { + LOG(INFO) << "Using InsecureServerCredentials"; return ::grpc::InsecureServerCredentials(); } SSLConfig ssl_config; TF_CHECK_OK(ParseProtoTextFile(ssl_config_file, &ssl_config)); + LOG(INFO) << "Using SSL credentials"; ::grpc::SslServerCredentialsOptions ssl_ops( ssl_config.client_verify() @@ -189,6 +196,13 @@ Status Server::BuildAndStart(const Options& server_options) { "server_options.grpc_socket_path must be set."); } + if (server_options.use_alts_credentials && + !server_options.ssl_config_file.empty()) { + return errors::InvalidArgument( + "Either use_alts_credentials must be false or " + "ssl_config_file must be empty."); + } + if (server_options.model_base_path.empty() && server_options.model_config_file.empty()) { return errors::InvalidArgument( @@ -348,16 +362,18 @@ Status Server::BuildAndStart(const Options& server_options) { ::grpc::ServerBuilder builder; // If defined, listen to a tcp port for gRPC/HTTP. if (server_options.grpc_port != 0) { - builder.AddListeningPort(server_address, - BuildServerCredentialsFromSSLConfigFile( + builder.AddListeningPort( + server_address, + BuildServerCredentials(server_options.use_alts_credentials, server_options.ssl_config_file)); } // If defined, listen to a UNIX socket for gRPC. if (!server_options.grpc_socket_path.empty()) { const string grpc_socket_uri = "unix:" + server_options.grpc_socket_path; - builder.AddListeningPort(grpc_socket_uri, - BuildServerCredentialsFromSSLConfigFile( - server_options.ssl_config_file)); + builder.AddListeningPort( + grpc_socket_uri, + BuildServerCredentials(server_options.use_alts_credentials, + server_options.ssl_config_file)); } builder.RegisterService(model_service_.get()); builder.RegisterService(prediction_service_.get()); diff --git a/tensorflow_serving/model_servers/server.h b/tensorflow_serving/model_servers/server.h index 50d5676c7a0..36625c2c568 100644 --- a/tensorflow_serving/model_servers/server.h +++ b/tensorflow_serving/model_servers/server.h @@ -77,6 +77,9 @@ class Server { tensorflow::int64 tensorflow_intra_op_parallelism = 0; tensorflow::int64 tensorflow_inter_op_parallelism = 0; tensorflow::string platform_config_file; + // Only one of ALTS or SSl can be specified. I.e. either + // use_alts_credentials must be false or ssl_config_file must be empty. + bool use_alts_credentials = false; tensorflow::string ssl_config_file; string model_config_file; // Zero means server will not poll FS for model config file after start-up. From 6cbc4a9eb419c8078c3a4e791381cda70dd8fc78 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 23 Jun 2021 17:04:12 -0700 Subject: [PATCH 5132/8103] Enable HTTP PATCH support in evhttp_server PiperOrigin-RevId: 381145934 --- .../util/net_http/server/internal/evhttp_server.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc b/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc index 4a650c57dcb..36c925a8e87 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_server.cc @@ -106,12 +106,12 @@ bool EvHTTPServer::Initialize() { } // By default libevents only allow GET, POST, HEAD, PUT, DELETE request - // we have to manually turn OPTIONS flag on - // documentation: + // we have to manually turn OPTIONS and PATCH flag on documentation: // (http://www.wangafu.net/~nickm/libevent-2.0/doxygen/html/http_8h.html) evhttp_set_allowed_methods( ev_http_, EVHTTP_REQ_GET | EVHTTP_REQ_POST | EVHTTP_REQ_HEAD | - EVHTTP_REQ_PUT | EVHTTP_REQ_DELETE | EVHTTP_REQ_OPTIONS); + EVHTTP_REQ_PUT | EVHTTP_REQ_DELETE | EVHTTP_REQ_OPTIONS | + EVHTTP_REQ_PATCH); evhttp_set_gencb(ev_http_, &DispatchEvRequestFn, this); return true; From 75fdbd849bef40bc78d64994eaf547a6e3350006 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 23 Jun 2021 18:01:31 -0700 Subject: [PATCH 5133/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6bb29e44-0fab-476d-9357-2077859471c7 PiperOrigin-RevId: 381154139 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bea378e81d3..808c803c510 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eebccc89c5d248aeedd5a520e22c586e5722c1f95432ec4016409caf94a3618e", - git_commit = "667e6bf43678c5af744c2facefb0fee2b53ada2a", + sha256 = "d1bc0a67fc6e7c7b3ec7416aaba592283ac39a52736caabdc82d574739f06dd9", + git_commit = "0730457fd096e12d3a50e1da12f3ceb085204e8b", ) # Import all of TensorFlow Serving's external dependencies. From b7442cb3c09d55f372ea48479b87e80820cb91f2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 24 Jun 2021 00:01:42 -0700 Subject: [PATCH 5134/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/98a882e1-1f0a-4c3d-9585-be5b76070c3f PiperOrigin-RevId: 381191807 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 808c803c510..b49719bc374 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d1bc0a67fc6e7c7b3ec7416aaba592283ac39a52736caabdc82d574739f06dd9", - git_commit = "0730457fd096e12d3a50e1da12f3ceb085204e8b", + sha256 = "d0ce9a2fbbd37306b92e70eb4e8e0e1faf245476b098148c9c6a17d24a8d98e3", + git_commit = "06892e58a86984f8b5a99404b6ffd2be3b87ed45", ) # Import all of TensorFlow Serving's external dependencies. From d3417359ce4692b292f801e85eeaef91e8eb8e9e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 24 Jun 2021 06:02:26 -0700 Subject: [PATCH 5135/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ca7505e9-a86e-475f-ba4c-befbcd0c3d4c PiperOrigin-RevId: 381237543 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b49719bc374..4b658fe003b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d0ce9a2fbbd37306b92e70eb4e8e0e1faf245476b098148c9c6a17d24a8d98e3", - git_commit = "06892e58a86984f8b5a99404b6ffd2be3b87ed45", + sha256 = "4e411117833b7a415676b95533f968adc4450f0b2f984f3c6bdaccff5583db3f", + git_commit = "1ab997b0bfd798877c93d3edde6436881fd95abb", ) # Import all of TensorFlow Serving's external dependencies. From 2f4b8175eac587330fce02a4e571072a363887c9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 24 Jun 2021 12:01:36 -0700 Subject: [PATCH 5136/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2f209aaa-bef4-40f5-8c1a-0af3ffb1dc3a PiperOrigin-RevId: 381306298 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4b658fe003b..5054f10aafb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4e411117833b7a415676b95533f968adc4450f0b2f984f3c6bdaccff5583db3f", - git_commit = "1ab997b0bfd798877c93d3edde6436881fd95abb", + sha256 = "a0227dc90e165c5f1fc9b94858562974a94c8b6e0e554907c80a45148033e105", + git_commit = "8c0e3b803393b2b632717fa2ccfb762effd6e143", ) # Import all of TensorFlow Serving's external dependencies. From ad9c83729f17864633657fddb867095bf9618a55 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 24 Jun 2021 18:01:19 -0700 Subject: [PATCH 5137/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c8a3aa6a-4288-42f1-9cea-f2bebf11e1e8 PiperOrigin-RevId: 381376021 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5054f10aafb..7132220a870 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a0227dc90e165c5f1fc9b94858562974a94c8b6e0e554907c80a45148033e105", - git_commit = "8c0e3b803393b2b632717fa2ccfb762effd6e143", + sha256 = "547c7c5041d083a42e0d75dfac685f41f2a485c53f4657c2c4d2e6ee0c2adc6c", + git_commit = "0d73a055e04a167ded2beae45c46c98728c8a4be", ) # Import all of TensorFlow Serving's external dependencies. From e7b6f2eeacf090e4adf30f7388e41da02270e893 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 25 Jun 2021 00:01:20 -0700 Subject: [PATCH 5138/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8d87bdae-64e6-41d0-ab3b-b74a4fd2c27a PiperOrigin-RevId: 381411860 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7132220a870..ff63e753925 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "547c7c5041d083a42e0d75dfac685f41f2a485c53f4657c2c4d2e6ee0c2adc6c", - git_commit = "0d73a055e04a167ded2beae45c46c98728c8a4be", + sha256 = "0dc8738d6e23cd6a2de24eedfda6ad20d52699c134c3856288310f95756b378c", + git_commit = "0c8078d48002970b6b583ead016f01153da383f8", ) # Import all of TensorFlow Serving's external dependencies. From a73cc711aec7bbf7fe7974781f4ce5093e9622d1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 25 Jun 2021 06:01:41 -0700 Subject: [PATCH 5139/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/14d2158f-80e4-4bd8-9a52-d6c89a84f1a9 PiperOrigin-RevId: 381455416 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ff63e753925..ec59f8a8e1a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0dc8738d6e23cd6a2de24eedfda6ad20d52699c134c3856288310f95756b378c", - git_commit = "0c8078d48002970b6b583ead016f01153da383f8", + sha256 = "d2c93052119c45e174def726931de118f75e9a103e2f9807cdf0d8d9567504d8", + git_commit = "935dfb5eb566732c7ad80876281c24709344bb11", ) # Import all of TensorFlow Serving's external dependencies. From 09e0ec128a35913ff87a18ac75d9869190479f65 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 25 Jun 2021 12:01:33 -0700 Subject: [PATCH 5140/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1b646ff2-b2f8-44b0-9b1c-3caebc03a4e0 PiperOrigin-RevId: 381518896 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ec59f8a8e1a..9319e4fa7e3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d2c93052119c45e174def726931de118f75e9a103e2f9807cdf0d8d9567504d8", - git_commit = "935dfb5eb566732c7ad80876281c24709344bb11", + sha256 = "a66f359fce8644d5a7026701246e8878c46efbd1f01cb5d3e3802f0a71aa6fe2", + git_commit = "5f6c0e0a50fce545238dbda854dc494f6ab6202d", ) # Import all of TensorFlow Serving's external dependencies. From 0fc835b9fffaff6473bd4475a4eb269ccaa6c717 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 25 Jun 2021 18:02:18 -0700 Subject: [PATCH 5141/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3fd7dc98-fb69-4b08-8a72-8767613c10da PiperOrigin-RevId: 381581415 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9319e4fa7e3..71abfa7b7c5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a66f359fce8644d5a7026701246e8878c46efbd1f01cb5d3e3802f0a71aa6fe2", - git_commit = "5f6c0e0a50fce545238dbda854dc494f6ab6202d", + sha256 = "84b8a276fc46ff15837a101e5445c0499e3030b165cac534557089a0a03b6c02", + git_commit = "542fa3193ad91726e08429dac722b359124477f3", ) # Import all of TensorFlow Serving's external dependencies. From f3cf70d13ab0b65edaf3bb81bd7ca5ac19f022eb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 26 Jun 2021 00:02:41 -0700 Subject: [PATCH 5142/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4b0ac1b2-48f6-4e14-bc7c-0d1a2497e55d PiperOrigin-RevId: 381608454 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 71abfa7b7c5..0b83e2b1808 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "84b8a276fc46ff15837a101e5445c0499e3030b165cac534557089a0a03b6c02", - git_commit = "542fa3193ad91726e08429dac722b359124477f3", + sha256 = "4c51c10b1693ea23e087da45b6d4a92e6b4403fd0404c6c475a02955b30544d0", + git_commit = "31fe8c5a2d0fd99f9208272820ba8c018807e179", ) # Import all of TensorFlow Serving's external dependencies. From 27c397d700a27b3dcfba016bd21e0ed5b1d02276 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 26 Jun 2021 06:01:20 -0700 Subject: [PATCH 5143/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/735df2b6-8988-49e3-a647-4bd063bd3478 PiperOrigin-RevId: 381634093 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0b83e2b1808..ebf6475989f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4c51c10b1693ea23e087da45b6d4a92e6b4403fd0404c6c475a02955b30544d0", - git_commit = "31fe8c5a2d0fd99f9208272820ba8c018807e179", + sha256 = "e86679e1ad328de5f055b166305612b345e2050826fb524b44bf323882f06e43", + git_commit = "7b5088e45f45449688625ee13193c05f6b6deff5", ) # Import all of TensorFlow Serving's external dependencies. From 225e63a41340fb14f5a5ce44d237ad9e463fd33b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 26 Jun 2021 12:02:31 -0700 Subject: [PATCH 5144/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4a12c820-db06-4343-85e4-167499cd7ddf PiperOrigin-RevId: 381656705 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ebf6475989f..2b7324b7a25 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e86679e1ad328de5f055b166305612b345e2050826fb524b44bf323882f06e43", - git_commit = "7b5088e45f45449688625ee13193c05f6b6deff5", + sha256 = "19b370a0735efed3d756d4b360c9a84da574dbde54568539aaea9a9e9686bca8", + git_commit = "50d8114a46d329d0d88c1a453c5d8efc0719bb67", ) # Import all of TensorFlow Serving's external dependencies. From daa610866a077df475ced0acda0799317bfd3658 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 27 Jun 2021 00:02:07 -0700 Subject: [PATCH 5145/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3e70aba5-35ca-4e36-89ce-182192be4122 PiperOrigin-RevId: 381700363 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2b7324b7a25..2657c354568 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "19b370a0735efed3d756d4b360c9a84da574dbde54568539aaea9a9e9686bca8", - git_commit = "50d8114a46d329d0d88c1a453c5d8efc0719bb67", + sha256 = "14f2628ddafe8253c52f8bcb77ed40e7df7ae69ab68eaa8c7bf112779b46990d", + git_commit = "2d620d83046fe4a31394aa2e5f48494a94d9e135", ) # Import all of TensorFlow Serving's external dependencies. From a180229c0848510518b6a52caf26bda348b0624d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 27 Jun 2021 12:02:05 -0700 Subject: [PATCH 5146/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/529a4b1f-f6d9-4d7e-97c9-e12ef56ea5f2 PiperOrigin-RevId: 381747382 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2657c354568..eba9b39bd35 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "14f2628ddafe8253c52f8bcb77ed40e7df7ae69ab68eaa8c7bf112779b46990d", - git_commit = "2d620d83046fe4a31394aa2e5f48494a94d9e135", + sha256 = "b98cbd081d3536992ba276debf3f1e1f9dc7b5161365b315795fd852338dfc6a", + git_commit = "1df058b0a4af8c5673251e27a57af320d7b1d29d", ) # Import all of TensorFlow Serving's external dependencies. From 1d9ff5a3054b9ecf32042c5fa937c2a77d49276b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 27 Jun 2021 18:01:49 -0700 Subject: [PATCH 5147/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ef459e7c-b968-4d57-b27b-3e87762ca15e PiperOrigin-RevId: 381769897 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index eba9b39bd35..a60909b1a48 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b98cbd081d3536992ba276debf3f1e1f9dc7b5161365b315795fd852338dfc6a", - git_commit = "1df058b0a4af8c5673251e27a57af320d7b1d29d", + sha256 = "f88ba8d26de105b30ea72bf04eb672ab9d40ac66ad2afe7d6e9cfa1255751452", + git_commit = "5a0e5d68cf5e8e272acfb44e78b5affd6ebe1c6d", ) # Import all of TensorFlow Serving's external dependencies. From 02ef2cbe8a677d7ed462ef610dec58ac2dc08775 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Jun 2021 00:02:35 -0700 Subject: [PATCH 5148/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b7102289-0ef2-4bed-be30-810a9ae7c382 PiperOrigin-RevId: 381800292 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a60909b1a48..600a7e3f8b4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f88ba8d26de105b30ea72bf04eb672ab9d40ac66ad2afe7d6e9cfa1255751452", - git_commit = "5a0e5d68cf5e8e272acfb44e78b5affd6ebe1c6d", + sha256 = "8d974f6742fcbac93e44e6df04dd1d9cfa5d1481e58c6841465077cac6b3b8aa", + git_commit = "2c4ed56aca5becc6fd51347e694f151f8c46e8fd", ) # Import all of TensorFlow Serving's external dependencies. From 0fa1e6d6a1cd8233ad3ddc8a5dce2654c9a7a0d6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Jun 2021 06:02:04 -0700 Subject: [PATCH 5149/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/05672759-5685-4d7d-8458-2cf531641eb6 PiperOrigin-RevId: 381846871 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 600a7e3f8b4..a98b812e4fb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8d974f6742fcbac93e44e6df04dd1d9cfa5d1481e58c6841465077cac6b3b8aa", - git_commit = "2c4ed56aca5becc6fd51347e694f151f8c46e8fd", + sha256 = "3c4b244f7c76df19c1d6d5b10a50e01cf4c80f8fd3d300ffa87bac0fc8a67a3c", + git_commit = "264db50a153e659bd62f2783891fb213eabccd21", ) # Import all of TensorFlow Serving's external dependencies. From a565f4658725aea11d1d82dd1c4243095215023a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Jun 2021 12:02:05 -0700 Subject: [PATCH 5150/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/129e0d1b-8cbb-495b-9c2c-5e9c66331fb6 PiperOrigin-RevId: 381915803 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a98b812e4fb..f8eb8b25026 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3c4b244f7c76df19c1d6d5b10a50e01cf4c80f8fd3d300ffa87bac0fc8a67a3c", - git_commit = "264db50a153e659bd62f2783891fb213eabccd21", + sha256 = "0cf588ebe567d40381ec483d21e40e3e9067a9ad7dfd16de4335b74cd2780464", + git_commit = "5bd8ae71503f5ff887a9f87fa995463bcc757846", ) # Import all of TensorFlow Serving's external dependencies. From 310b48a92b7dea466ff0c41d5862b383e5871e98 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 28 Jun 2021 18:01:17 -0700 Subject: [PATCH 5151/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/478dc4ec-eabf-4bad-bffd-89b25dee7c90 PiperOrigin-RevId: 381984650 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f8eb8b25026..d051250d2ef 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0cf588ebe567d40381ec483d21e40e3e9067a9ad7dfd16de4335b74cd2780464", - git_commit = "5bd8ae71503f5ff887a9f87fa995463bcc757846", + sha256 = "e1d75a38fcbc93175fabc3c73dbc9e2d06fb181be7b0ac492629c72e276a31b6", + git_commit = "bb982b7d2aa7ed1c3983beca799d2f69173fed92", ) # Import all of TensorFlow Serving's external dependencies. From dab5f6c0a2d4629f775ad76213707ed9ac80c193 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Jun 2021 00:01:26 -0700 Subject: [PATCH 5152/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fdda05c6-c3a9-4083-a716-18037093486d PiperOrigin-RevId: 382022155 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d051250d2ef..654a27a935b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e1d75a38fcbc93175fabc3c73dbc9e2d06fb181be7b0ac492629c72e276a31b6", - git_commit = "bb982b7d2aa7ed1c3983beca799d2f69173fed92", + sha256 = "26d02a62f923dcdad9f33cade160c3e2e3035d5c58eb2e47510f5142977692a6", + git_commit = "c837cf8963d4ef9cb3b3b9e8787cb35f21b68f9d", ) # Import all of TensorFlow Serving's external dependencies. From a9c9ebb9a231e75ced012e7e21a3915d3e15be5e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Jun 2021 06:01:58 -0700 Subject: [PATCH 5153/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/33e55ca4-edd2-4f6b-9c70-c82b93a2e620 PiperOrigin-RevId: 382067924 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 654a27a935b..e1928545ae6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "26d02a62f923dcdad9f33cade160c3e2e3035d5c58eb2e47510f5142977692a6", - git_commit = "c837cf8963d4ef9cb3b3b9e8787cb35f21b68f9d", + sha256 = "10a5f1a423111a1147622e2297adf0854f4dd904dc81aa48443f794baaedc4ce", + git_commit = "5e1bb83fc763bfee0e115877e5e304b9f0973c2f", ) # Import all of TensorFlow Serving's external dependencies. From c931d4de291a529fd676151634316abc8e1c4fa7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Jun 2021 12:01:23 -0700 Subject: [PATCH 5154/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d75b4eb4-c191-44a1-991b-cf95d4040d57 PiperOrigin-RevId: 382135203 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e1928545ae6..912c184bf13 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "10a5f1a423111a1147622e2297adf0854f4dd904dc81aa48443f794baaedc4ce", - git_commit = "5e1bb83fc763bfee0e115877e5e304b9f0973c2f", + sha256 = "fd687f8e26833cb917ae0bd8e434c9bd30c92042361c8ae69679983d3c66a440", + git_commit = "15198b1818bd2bf1b5b55bf5b02bf42398d222fc", ) # Import all of TensorFlow Serving's external dependencies. From 6a54e2a806cdae494e302b28318dec2f14892a06 Mon Sep 17 00:00:00 2001 From: Chao Xie Date: Tue, 29 Jun 2021 12:07:26 -0700 Subject: [PATCH 5155/8103] Make Internal Change PiperOrigin-RevId: 382136589 --- tensorflow_serving/model_servers/BUILD | 2 + .../model_servers/http_rest_api_handler.cc | 52 +---------------- .../model_servers/http_rest_api_util.cc | 56 +++++++++++++++++++ .../model_servers/http_rest_api_util.h | 3 + 4 files changed, 62 insertions(+), 51 deletions(-) diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index cc2b2e1ac53..45037434685 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -273,8 +273,10 @@ cc_library( hdrs = ["http_rest_api_util.h"], visibility = ["//visibility:public"], deps = [ + "//tensorflow_serving/apis:get_model_metadata_cc_proto", "//tensorflow_serving/apis:get_model_status_cc_proto", "//tensorflow_serving/apis:model_cc_proto", + "//tensorflow_serving/servables/tensorflow:get_model_metadata_impl", "@com_google_absl//absl/strings", "@com_google_absl//absl/types:optional", "@com_googlesource_code_re2//:re2", diff --git a/tensorflow_serving/model_servers/http_rest_api_handler.cc b/tensorflow_serving/model_servers/http_rest_api_handler.cc index 5e1c083ba1f..c8619976551 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler.cc +++ b/tensorflow_serving/model_servers/http_rest_api_handler.cc @@ -225,57 +225,7 @@ Status HttpRestApiHandler::ProcessModelMetadataRequest( ::google::protobuf::Arena::CreateMessage(&arena); TF_RETURN_IF_ERROR( GetModelMetadataImpl::GetModelMetadata(core_, *request, response)); - JsonPrintOptions opts; - opts.add_whitespace = true; - opts.always_print_primitive_fields = true; - // TODO(b/118381513): preserving proto field names on 'Any' fields has been - // fixed in the master branch of OSS protobuf but the TF ecosystem is - // currently using v3.6.0 where the fix is not present. To resolve the issue - // we invoke MessageToJsonString on invididual fields and concatenate the - // resulting strings and make it valid JSON that conforms with the response we - // expect. - opts.preserve_proto_field_names = true; - - string model_spec_output; - const auto& status1 = - MessageToJsonString(response->model_spec(), &model_spec_output, opts); - if (!status1.ok()) { - return errors::Internal( - "Failed to convert model spec proto to json. Error: ", - status1.ToString()); - } - - tensorflow::serving::SignatureDefMap signature_def_map; - if (response->metadata().end() == - response->metadata().find(GetModelMetadataImpl::kSignatureDef)) { - return errors::Internal( - "Failed to find 'signature_def' key in the GetModelMetadataResponse " - "metadata map."); - } - bool unpack_status = response->metadata() - .at(GetModelMetadataImpl::kSignatureDef) - .UnpackTo(&signature_def_map); - if (!unpack_status) { - return errors::Internal( - "Failed to unpack 'Any' object to 'SignatureDefMap'."); - } - - string signature_def_output; - const auto& status2 = - MessageToJsonString(signature_def_map, &signature_def_output, opts); - if (!status2.ok()) { - return errors::Internal( - "Failed to convert signature def proto to json. Error: ", - status2.ToString()); - } - - // Concatenate the resulting strings into a valid JSON format. - absl::StrAppend(output, "{\n"); - absl::StrAppend(output, "\"model_spec\":", model_spec_output, ",\n"); - absl::StrAppend(output, "\"metadata\": {"); - absl::StrAppend(output, "\"signature_def\": ", signature_def_output, "}\n"); - absl::StrAppend(output, "}\n"); - return Status::OK(); + return ToJsonString(*response, output); } Status HttpRestApiHandler::GetInfoMap( diff --git a/tensorflow_serving/model_servers/http_rest_api_util.cc b/tensorflow_serving/model_servers/http_rest_api_util.cc index c60a5965b8b..ff22615e7a6 100644 --- a/tensorflow_serving/model_servers/http_rest_api_util.cc +++ b/tensorflow_serving/model_servers/http_rest_api_util.cc @@ -20,6 +20,7 @@ limitations under the License. #include #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/platform/errors.h" +#include "tensorflow_serving/servables/tensorflow/get_model_metadata_impl.h" namespace tensorflow { namespace serving { @@ -138,5 +139,60 @@ Status ToJsonString(const GetModelStatusResponse& response, string* output) { return Status::OK(); } +Status ToJsonString(const GetModelMetadataResponse& response, string* output) { + google::protobuf::util::JsonPrintOptions opts; + opts.add_whitespace = true; + opts.always_print_primitive_fields = true; + // TODO(b/118381513): preserving proto field names on 'Any' fields has been + // fixed in the master branch of OSS protobuf but the TF ecosystem is + // currently using v3.6.0 where the fix is not present. To resolve the issue + // we invoke MessageToJsonString on invididual fields and concatenate the + // resulting strings and make it valid JSON that conforms with the response we + // expect. + opts.preserve_proto_field_names = true; + + string model_spec_output; + const auto& status1 = + MessageToJsonString(response.model_spec(), &model_spec_output, opts); + if (!status1.ok()) { + return errors::Internal( + "Failed to convert model spec proto to json. Error: ", + status1.ToString()); + } + + tensorflow::serving::SignatureDefMap signature_def_map; + if (response.metadata().end() == + response.metadata().find(GetModelMetadataImpl::kSignatureDef)) { + return errors::Internal( + "Failed to find 'signature_def' key in the GetModelMetadataResponse " + "metadata map."); + } + bool unpack_status = response.metadata() + .at(GetModelMetadataImpl::kSignatureDef) + .UnpackTo(&signature_def_map); + if (!unpack_status) { + return errors::Internal( + "Failed to unpack 'Any' object to 'SignatureDefMap'."); + } + + string signature_def_output; + const auto& status2 = + MessageToJsonString(signature_def_map, &signature_def_output, opts); + if (!status2.ok()) { + return errors::Internal( + "Failed to convert signature def proto to json. Error: ", + status2.ToString()); + } + + // Concatenate the resulting strings into a valid JSON format. + absl::StrAppend(output, "{\n"); + absl::StrAppend(output, "\"model_spec\":", model_spec_output, ",\n"); + absl::StrAppend(output, "\"metadata\": {"); + absl::StrAppend(output, "\"signature_def\": ", signature_def_output, "}\n"); + absl::StrAppend(output, "}\n"); + + return Status::OK(); +} + } // namespace serving } // namespace tensorflow diff --git a/tensorflow_serving/model_servers/http_rest_api_util.h b/tensorflow_serving/model_servers/http_rest_api_util.h index 5dddadce5e4..53ff3017a5e 100644 --- a/tensorflow_serving/model_servers/http_rest_api_util.h +++ b/tensorflow_serving/model_servers/http_rest_api_util.h @@ -23,6 +23,7 @@ limitations under the License. #include "absl/types/optional.h" #include "re2/re2.h" #include "tensorflow/core/lib/core/status.h" +#include "tensorflow_serving/apis/get_model_metadata.pb.h" #include "tensorflow_serving/apis/get_model_status.pb.h" #include "tensorflow_serving/apis/model.pb.h" @@ -51,6 +52,8 @@ Status ParseModelInfo(const absl::string_view http_method, Status ToJsonString(const GetModelStatusResponse& response, string* output); +Status ToJsonString(const GetModelMetadataResponse& response, string* output); + } // namespace serving } // namespace tensorflow From f9e8e0988033e6b9c8a08b8ddd13b859e205c825 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 29 Jun 2021 18:01:26 -0700 Subject: [PATCH 5156/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3de28a81-0d39-47d9-b570-067680f916ee PiperOrigin-RevId: 382203829 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 912c184bf13..4fe7cd88fdf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fd687f8e26833cb917ae0bd8e434c9bd30c92042361c8ae69679983d3c66a440", - git_commit = "15198b1818bd2bf1b5b55bf5b02bf42398d222fc", + sha256 = "959fd35c89442deb878b7dfabaf2f2d24c729f9bb642724f471ecae64c64d846", + git_commit = "a7c986632c9b7bc3ee335c63befa0b806ee4b984", ) # Import all of TensorFlow Serving's external dependencies. From 59eb844e396e3cc411d2f0d509cce25dc32a906b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Jun 2021 00:01:36 -0700 Subject: [PATCH 5157/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/79f04f5b-3e66-4273-9f59-924bee16c021 PiperOrigin-RevId: 382241741 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4fe7cd88fdf..e6609af0645 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "959fd35c89442deb878b7dfabaf2f2d24c729f9bb642724f471ecae64c64d846", - git_commit = "a7c986632c9b7bc3ee335c63befa0b806ee4b984", + sha256 = "99ea0e581facfffb9104df320cab6ef1fff74efc4adda89ba5b4f7ff53f2f319", + git_commit = "fa87fb0f815d98772098da28a68def19a21f00f1", ) # Import all of TensorFlow Serving's external dependencies. From e58902cc513ceaba1df94def32b45a9617d6dca0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Jun 2021 06:01:20 -0700 Subject: [PATCH 5158/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4f1a6208-3237-4950-bd9e-06d6daf5254c PiperOrigin-RevId: 382286915 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e6609af0645..55e190cd59b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "99ea0e581facfffb9104df320cab6ef1fff74efc4adda89ba5b4f7ff53f2f319", - git_commit = "fa87fb0f815d98772098da28a68def19a21f00f1", + sha256 = "2c89459503474f1623d10b1a372e023c85e19a5ee3cd4eceea58807e82380307", + git_commit = "c57b97aec9de0e736d9aca8d9ac14d2fb6511db1", ) # Import all of TensorFlow Serving's external dependencies. From 837b1348c8fd686414bb10c57bfab81070444aec Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Jun 2021 12:01:29 -0700 Subject: [PATCH 5159/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7125ef18-5e9e-4ac4-82f7-960e390c1e71 PiperOrigin-RevId: 382355142 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 55e190cd59b..ba31604c6b3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2c89459503474f1623d10b1a372e023c85e19a5ee3cd4eceea58807e82380307", - git_commit = "c57b97aec9de0e736d9aca8d9ac14d2fb6511db1", + sha256 = "ac4ba400b27b23198784b06ece170639f4e9e6374b34613449e7bd6717685cf0", + git_commit = "b1e3cbd52a6e4ec66cb70abcc011355dcf8e2f77", ) # Import all of TensorFlow Serving's external dependencies. From 387c4cc92201cc6c06068b0d09ee497670e59271 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 30 Jun 2021 18:01:33 -0700 Subject: [PATCH 5160/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/98b63de0-2171-49d1-baf2-6d130aa89525 PiperOrigin-RevId: 382424242 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ba31604c6b3..a697a951467 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ac4ba400b27b23198784b06ece170639f4e9e6374b34613449e7bd6717685cf0", - git_commit = "b1e3cbd52a6e4ec66cb70abcc011355dcf8e2f77", + sha256 = "060fba95035465119581bb4e14f1430eb73b0a40d284a599216755fb464d80e1", + git_commit = "1c4e6e971591f8224fb803d424ad850ec6285bce", ) # Import all of TensorFlow Serving's external dependencies. From f35d374ac4f736326c7bf238c81e4736804be8cd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 1 Jul 2021 00:02:32 -0700 Subject: [PATCH 5161/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a708209e-d3ed-4572-bba3-d40cd3ae6b7c PiperOrigin-RevId: 382461236 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a697a951467..84f2e843ffe 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "060fba95035465119581bb4e14f1430eb73b0a40d284a599216755fb464d80e1", - git_commit = "1c4e6e971591f8224fb803d424ad850ec6285bce", + sha256 = "e6729acbb464d9e04ad53e5e43b32cd6752c50b885e49a98824512e346061d53", + git_commit = "08615669d587df6a1bc78ffb71d7b6b587b04b93", ) # Import all of TensorFlow Serving's external dependencies. From b5d4027dcc5df2f9c5d0667d14b5a184cb7a85fe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 1 Jul 2021 06:01:26 -0700 Subject: [PATCH 5162/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/df449464-13c6-48eb-866e-a440eb6a247c PiperOrigin-RevId: 382507309 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 84f2e843ffe..86ae19ddc67 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e6729acbb464d9e04ad53e5e43b32cd6752c50b885e49a98824512e346061d53", - git_commit = "08615669d587df6a1bc78ffb71d7b6b587b04b93", + sha256 = "94e9a254df6c3e578c693522556c3bafedc04ce799e5cc99308d18174c54a49e", + git_commit = "7dcc81d6567aded4e0295967620da18d32d0a785", ) # Import all of TensorFlow Serving's external dependencies. From 1848006944b36257283f7b60dd1afd0daf8ee7bd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 1 Jul 2021 12:01:33 -0700 Subject: [PATCH 5163/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c7525b64-6016-4278-8bd6-133f58b898b8 PiperOrigin-RevId: 382574216 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 86ae19ddc67..9aa0651e7e9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "94e9a254df6c3e578c693522556c3bafedc04ce799e5cc99308d18174c54a49e", - git_commit = "7dcc81d6567aded4e0295967620da18d32d0a785", + sha256 = "dc0811466458829c9a69e39886d25b8c4673f2bd39c8aaf2c7cb443f273fd17a", + git_commit = "ac2879be7c5213264880198c0529c4e6036e8113", ) # Import all of TensorFlow Serving's external dependencies. From dee2a64587a5d42429bbf1b74e797e903d884643 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 1 Jul 2021 18:01:45 -0700 Subject: [PATCH 5164/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/dc2893a0-4f4d-4e73-9b3a-e95d7043256c PiperOrigin-RevId: 382643750 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9aa0651e7e9..694614f4f11 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dc0811466458829c9a69e39886d25b8c4673f2bd39c8aaf2c7cb443f273fd17a", - git_commit = "ac2879be7c5213264880198c0529c4e6036e8113", + sha256 = "640ed519efc8ae107aa2921ec058eea387c34a3f41c5f9851ff77b55e8473dbc", + git_commit = "1d1d496c7e00026d1fed3637aad73fead5844a16", ) # Import all of TensorFlow Serving's external dependencies. From ec4a3b8f8a3f32e04d7bc116bc2af391fabb4404 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 2 Jul 2021 00:02:09 -0700 Subject: [PATCH 5165/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/82403c79-9824-4302-a5d1-bb174049c66c PiperOrigin-RevId: 382682475 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 694614f4f11..ed949cf7170 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "640ed519efc8ae107aa2921ec058eea387c34a3f41c5f9851ff77b55e8473dbc", - git_commit = "1d1d496c7e00026d1fed3637aad73fead5844a16", + sha256 = "cbaa9b5beb0aa4b57eca3c221dc390855e9ab1e9ac9f21207f3bc543f38b9d10", + git_commit = "e4f883065966d41ce6e04061100c3c5d8e0eec7a", ) # Import all of TensorFlow Serving's external dependencies. From 8e417ccf10838de8ba4c392c27ad5fb77fe8ed3f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 2 Jul 2021 06:01:34 -0700 Subject: [PATCH 5166/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d32ef10b-7062-4b61-9b02-10e33d35a864 PiperOrigin-RevId: 382723818 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ed949cf7170..1b4fa2a6291 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cbaa9b5beb0aa4b57eca3c221dc390855e9ab1e9ac9f21207f3bc543f38b9d10", - git_commit = "e4f883065966d41ce6e04061100c3c5d8e0eec7a", + sha256 = "37d03fccdbe683dce76d8158d5a0a3820c1aad17536a940997052525c382bcfb", + git_commit = "6d8baa77943b076c7f7b4407c0634da204992b4f", ) # Import all of TensorFlow Serving's external dependencies. From b68c42ae5e99733f8f1c1f17ae2b1e71c1b7ca23 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 2 Jul 2021 12:01:30 -0700 Subject: [PATCH 5167/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/52f7a446-bf35-493b-9e03-4e1ce2c3cb22 PiperOrigin-RevId: 382786183 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1b4fa2a6291..9abf935dd5b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "37d03fccdbe683dce76d8158d5a0a3820c1aad17536a940997052525c382bcfb", - git_commit = "6d8baa77943b076c7f7b4407c0634da204992b4f", + sha256 = "0240b0b5c2f9b6223443f27b7b033831e92b75ac3764eb61fd897f2efed76207", + git_commit = "71de053aa2649f50e7070bdd71f6cf7377148ac2", ) # Import all of TensorFlow Serving's external dependencies. From d84d4088fba8c14d72309ce1acb8d03acf56f6fc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 2 Jul 2021 18:01:36 -0700 Subject: [PATCH 5168/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b0930db6-19c8-4d97-92f1-8389f6b6003d PiperOrigin-RevId: 382844752 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9abf935dd5b..1fbecd98a24 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0240b0b5c2f9b6223443f27b7b033831e92b75ac3764eb61fd897f2efed76207", - git_commit = "71de053aa2649f50e7070bdd71f6cf7377148ac2", + sha256 = "93112a1c28cd989673ad41ae8a342d3fdec32f05a2206792a466137329c63b5d", + git_commit = "47f53336e2ade0f31c7b1a74154328cb4c46556a", ) # Import all of TensorFlow Serving's external dependencies. From 12c9bc964fa2938217b324de60d09efbd8982923 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 3 Jul 2021 00:01:35 -0700 Subject: [PATCH 5169/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e0ba597a-5644-453e-817d-29104d61527e PiperOrigin-RevId: 382874173 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1fbecd98a24..7816fc34ce0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "93112a1c28cd989673ad41ae8a342d3fdec32f05a2206792a466137329c63b5d", - git_commit = "47f53336e2ade0f31c7b1a74154328cb4c46556a", + sha256 = "4e78c05f2f32caf0b0a5681daed9b9fa8d01953a7c3dc537b4e8a825fca2b953", + git_commit = "059b70fce231761ffa67b1de97fb98733a871323", ) # Import all of TensorFlow Serving's external dependencies. From 9d05030cf933b28e972884a1765b850628f909da Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 3 Jul 2021 06:01:56 -0700 Subject: [PATCH 5170/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/aa6c4624-e7c8-466a-b99f-4679fdcca5c9 PiperOrigin-RevId: 382902450 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7816fc34ce0..5158210ec1b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4e78c05f2f32caf0b0a5681daed9b9fa8d01953a7c3dc537b4e8a825fca2b953", - git_commit = "059b70fce231761ffa67b1de97fb98733a871323", + sha256 = "67c5be98f10c2495539293e312e58c53ced52236fe38d02521edbecdcf91f75d", + git_commit = "417a4452453c2f134c7fae035402d176cffbbce3", ) # Import all of TensorFlow Serving's external dependencies. From 0a8a882fcd2780921a99ca66cfcaed73f8d8878e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 4 Jul 2021 06:01:35 -0700 Subject: [PATCH 5171/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b1b02fd2-ad88-4a97-b189-e83bf3bfff2a PiperOrigin-RevId: 382999247 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5158210ec1b..d01234717f3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "67c5be98f10c2495539293e312e58c53ced52236fe38d02521edbecdcf91f75d", - git_commit = "417a4452453c2f134c7fae035402d176cffbbce3", + sha256 = "fee061fc3091b2e9cef0ea0732b4716ea8dd7b2a3af2ec08a67b8472358a9546", + git_commit = "35c46d26cf420e7076abdcc3324f7a8b80f4710a", ) # Import all of TensorFlow Serving's external dependencies. From 88d626e3243da6393ee038bab703ab4f672d89ea Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 4 Jul 2021 12:01:37 -0700 Subject: [PATCH 5172/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fb205e6c-4376-4e83-88c5-5c7c93a476f7 PiperOrigin-RevId: 383022987 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d01234717f3..922d8cff71f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fee061fc3091b2e9cef0ea0732b4716ea8dd7b2a3af2ec08a67b8472358a9546", - git_commit = "35c46d26cf420e7076abdcc3324f7a8b80f4710a", + sha256 = "c7da1acad829a7cbb8889e224312dab35ce363b12897de4859ef90003f28bb8b", + git_commit = "25f722379852893bc5315c7abc28363a53c00ade", ) # Import all of TensorFlow Serving's external dependencies. From 936223ce83cba25551cc224a766721976db6dd7e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 5 Jul 2021 00:01:26 -0700 Subject: [PATCH 5173/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7ed787fc-2540-445c-a1b5-360e1fc45350 PiperOrigin-RevId: 383078144 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 922d8cff71f..1f7225feeda 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c7da1acad829a7cbb8889e224312dab35ce363b12897de4859ef90003f28bb8b", - git_commit = "25f722379852893bc5315c7abc28363a53c00ade", + sha256 = "4dad18f51be326a2100d2d6cdb3529ae61ed711b3486b8c7eb7d6e37780ba989", + git_commit = "863f2b69074102b1c0b66a4cc018b9deb104087c", ) # Import all of TensorFlow Serving's external dependencies. From 5ba62c425f47a57eb20ba5669f3ef99e2082523c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 5 Jul 2021 06:01:25 -0700 Subject: [PATCH 5174/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0a37f3fd-64a9-43a6-8d36-0bfd201a6d3e PiperOrigin-RevId: 383123537 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1f7225feeda..b30c0127207 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4dad18f51be326a2100d2d6cdb3529ae61ed711b3486b8c7eb7d6e37780ba989", - git_commit = "863f2b69074102b1c0b66a4cc018b9deb104087c", + sha256 = "eaf0a05a1c2259b644415d6d1e0d0e72bfc08ea700c9ed74d9d7279f12b7ca11", + git_commit = "f2a74cf7f05bb219dedf26607e65b6ef1f186736", ) # Import all of TensorFlow Serving's external dependencies. From c353fb0614eba4c7bd7182fda844ff1966149d5a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 5 Jul 2021 12:01:25 -0700 Subject: [PATCH 5175/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/98ae3f36-41ff-4a7c-82d8-cc76a77b3b83 PiperOrigin-RevId: 383160959 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b30c0127207..879cca5f2a6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eaf0a05a1c2259b644415d6d1e0d0e72bfc08ea700c9ed74d9d7279f12b7ca11", - git_commit = "f2a74cf7f05bb219dedf26607e65b6ef1f186736", + sha256 = "5fd78ad5605302073c5b6de46a89a3ede2c21b09d53365048b838646d9603e07", + git_commit = "3d4663ac0e9669a898ade73076bcbc0d1d27e580", ) # Import all of TensorFlow Serving's external dependencies. From 2979e1de8a0aa81f843c22844ca68bb786001a77 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 5 Jul 2021 18:01:29 -0700 Subject: [PATCH 5176/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a18e7b7d-a97c-474b-acc7-7dbe0087781b PiperOrigin-RevId: 383187664 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 879cca5f2a6..09708b39730 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5fd78ad5605302073c5b6de46a89a3ede2c21b09d53365048b838646d9603e07", - git_commit = "3d4663ac0e9669a898ade73076bcbc0d1d27e580", + sha256 = "33b9d91499e66bd74ffac56c9ed73a1e74bd546af7f42fef4ac7e09b111770b4", + git_commit = "d47eeaf29f242d0cc8d1fa6390f0b945a106caf8", ) # Import all of TensorFlow Serving's external dependencies. From 8d8b952a1ae6690ac01c9366fb932204ad346058 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 6 Jul 2021 00:01:38 -0700 Subject: [PATCH 5177/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7f4ee79c-7283-45f5-944b-56c9704ba6c7 PiperOrigin-RevId: 383215778 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 09708b39730..0ef87a9c73e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "33b9d91499e66bd74ffac56c9ed73a1e74bd546af7f42fef4ac7e09b111770b4", - git_commit = "d47eeaf29f242d0cc8d1fa6390f0b945a106caf8", + sha256 = "2c5dbce18b13c9f1a324d2f29ec47025b0bebc0dc64d8a0f55cea54c3fa6a645", + git_commit = "f08430317bbd7ebb8c0b6837e5988f067046d4d6", ) # Import all of TensorFlow Serving's external dependencies. From 9865e0ef5ecfd694cdcabcf89472a77d7a711973 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 6 Jul 2021 06:01:31 -0700 Subject: [PATCH 5178/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7a76531a-28e5-4e9d-930d-479ed82acb92 PiperOrigin-RevId: 383256257 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0ef87a9c73e..2520f2ec5f7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2c5dbce18b13c9f1a324d2f29ec47025b0bebc0dc64d8a0f55cea54c3fa6a645", - git_commit = "f08430317bbd7ebb8c0b6837e5988f067046d4d6", + sha256 = "39229fc225578ae78ccd89f0ab6bb9bd409e09c263d994d090c7c39825d411f3", + git_commit = "11e12d55b539181c85e241a3810ea7f6ed89c785", ) # Import all of TensorFlow Serving's external dependencies. From 9cfa91f81760dc882be28f6b96a3b8a231cd7148 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 6 Jul 2021 12:01:21 -0700 Subject: [PATCH 5179/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6abea1ad-13c8-40ee-a3c0-04d5fc5fe29c PiperOrigin-RevId: 383295152 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2520f2ec5f7..9349ddbc8e9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "39229fc225578ae78ccd89f0ab6bb9bd409e09c263d994d090c7c39825d411f3", - git_commit = "11e12d55b539181c85e241a3810ea7f6ed89c785", + sha256 = "046854dc661c663cd6a4350a2f3da04286ff5b2bf9a4586ff2fdbd8f4b0ae573", + git_commit = "b033bb425c8fab1d8a75b0d5e7a64df89b526b6a", ) # Import all of TensorFlow Serving's external dependencies. From 08e548e3bba4fc1176e6acd32cc466b0b75d8155 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 6 Jul 2021 18:01:37 -0700 Subject: [PATCH 5180/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e7a6f408-42b3-4ca3-af96-e6c88dbf97bf PiperOrigin-RevId: 383323308 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9349ddbc8e9..11db510e6c3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "046854dc661c663cd6a4350a2f3da04286ff5b2bf9a4586ff2fdbd8f4b0ae573", - git_commit = "b033bb425c8fab1d8a75b0d5e7a64df89b526b6a", + sha256 = "5d80978482d7c57e1520ef1102afbcb1af21d61203083a875a28335cd9c9da68", + git_commit = "ede17d556ad17266d502d5a91650903b16e0f3e6", ) # Import all of TensorFlow Serving's external dependencies. From 6a1dbcd83331af6a9a900c55e7e92888573cbebc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 7 Jul 2021 00:01:38 -0700 Subject: [PATCH 5181/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/cbd54db5-8ca4-45a8-83e4-e9430e24e654 PiperOrigin-RevId: 383352186 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 11db510e6c3..c3a1f8252c5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5d80978482d7c57e1520ef1102afbcb1af21d61203083a875a28335cd9c9da68", - git_commit = "ede17d556ad17266d502d5a91650903b16e0f3e6", + sha256 = "17e01742778e1ea2b19dec883ad0701a9ea83ae71dbc663fcd89e406f61d2a25", + git_commit = "aa855d21ac89e6649ec782ef4efd4e126b37d79d", ) # Import all of TensorFlow Serving's external dependencies. From 0cfc1365b35bdcde4040fcdac96b150d82d5166b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 7 Jul 2021 06:01:22 -0700 Subject: [PATCH 5182/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6883cdbd-6459-425b-b0b8-1dc13eda0fc4 PiperOrigin-RevId: 383394602 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c3a1f8252c5..6972577a49c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "17e01742778e1ea2b19dec883ad0701a9ea83ae71dbc663fcd89e406f61d2a25", - git_commit = "aa855d21ac89e6649ec782ef4efd4e126b37d79d", + sha256 = "8dd7df2914504f5c5591396d411d9d6f03a4b0a250257a6e8526c07507ce6906", + git_commit = "7cd61a340724bf917bf8ef248022b6d5ac8512df", ) # Import all of TensorFlow Serving's external dependencies. From f8e1fd28ebe1ec79cb5e5dc3e436617874775f99 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 7 Jul 2021 12:01:22 -0700 Subject: [PATCH 5183/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9fffb5b2-b654-4d84-bff5-f6ed3b9ef4f7 PiperOrigin-RevId: 383463151 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6972577a49c..3a05e4a650e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8dd7df2914504f5c5591396d411d9d6f03a4b0a250257a6e8526c07507ce6906", - git_commit = "7cd61a340724bf917bf8ef248022b6d5ac8512df", + sha256 = "72c8cc7a8066133b5d923ae1498c9ff06a353a4bb66c52dc99a9825db242078b", + git_commit = "17f694077ee5228eb20a8e228e88cd3987e6b854", ) # Import all of TensorFlow Serving's external dependencies. From 753ccfa0842f879744aa699fcbdf4e69aa392aa3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 7 Jul 2021 18:01:40 -0700 Subject: [PATCH 5184/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c450e84a-06f5-419d-8c5c-536d45945dd1 PiperOrigin-RevId: 383531579 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3a05e4a650e..1274da23880 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "72c8cc7a8066133b5d923ae1498c9ff06a353a4bb66c52dc99a9825db242078b", - git_commit = "17f694077ee5228eb20a8e228e88cd3987e6b854", + sha256 = "88b496a3d7dc0d43547ae74472a393a4fb92b318c0ee56661f1c5bfc531dae45", + git_commit = "1dda3c8b1ce78bd286fb2a40dc0f009c4367f889", ) # Import all of TensorFlow Serving's external dependencies. From 770f261aa79659be678c16c3d7a3a01385df5b04 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 8 Jul 2021 00:01:23 -0700 Subject: [PATCH 5185/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2955db14-3ef3-4b71-9877-85476e5e7f0f PiperOrigin-RevId: 383570417 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1274da23880..b8456a5622f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "88b496a3d7dc0d43547ae74472a393a4fb92b318c0ee56661f1c5bfc531dae45", - git_commit = "1dda3c8b1ce78bd286fb2a40dc0f009c4367f889", + sha256 = "9d93d16779c84b248b2f76119c283a2ee2a2487c9fbf19b1d1f2e8890f40ab50", + git_commit = "75a4c9da2422b521cf8f186b3056803b9b3fecdb", ) # Import all of TensorFlow Serving's external dependencies. From eefbbf2c5c77a52c4daa2f3c649b70dfeebb2bbe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 8 Jul 2021 06:01:38 -0700 Subject: [PATCH 5186/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/90fcf644-5fae-40f7-a01c-b7853b144be4 PiperOrigin-RevId: 383616245 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b8456a5622f..d9ff9a4ef51 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9d93d16779c84b248b2f76119c283a2ee2a2487c9fbf19b1d1f2e8890f40ab50", - git_commit = "75a4c9da2422b521cf8f186b3056803b9b3fecdb", + sha256 = "59c54cbc6fc463772c0757bf69351da632a1d8c541de55a389006b58441260e6", + git_commit = "ee03e30745f63888e97b945c7d8041b55948cb68", ) # Import all of TensorFlow Serving's external dependencies. From 9eb2ea007353ad6f15acbe048594321cd3e5678a Mon Sep 17 00:00:00 2001 From: arghyaganguly Date: Thu, 8 Jul 2021 20:43:04 +0530 Subject: [PATCH 5187/8103] Replace --runtime=nvidia flag with --gpus all flag as --runtime=nvidia has been dpreciated from Docker19.03 --- tensorflow_serving/g3doc/docker.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/g3doc/docker.md b/tensorflow_serving/g3doc/docker.md index a335aa71005..42956c16773 100644 --- a/tensorflow_serving/g3doc/docker.md +++ b/tensorflow_serving/g3doc/docker.md @@ -258,14 +258,14 @@ Next, run the TensorFlow Serving container pointing it to this model and opening the REST API port (8501): ```shell -docker run --runtime=nvidia -p 8501:8501 \ +docker run --gpus all -p 8501:8501 \ --mount type=bind,\ source=/tmp/tfserving/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_gpu,\ target=/models/half_plus_two \ -e MODEL_NAME=half_plus_two -t tensorflow/serving:latest-gpu & ``` -This will run the docker container with the `nvidia-docker` runtime, launch the +This will run the docker container, launch the TensorFlow Serving Model Server, bind the REST API port 8501, and map our desired model from our host to where models are expected in the container. We also pass the name of the model as an environment variable, which will be From 4fc05ba9b05197cb26ab6c4c31b9cbd09fac019d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 8 Jul 2021 12:02:26 -0700 Subject: [PATCH 5188/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f74307e7-9500-4c80-8fec-6697c78d02a7 PiperOrigin-RevId: 383684498 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d9ff9a4ef51..8a8ae0e95a7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "59c54cbc6fc463772c0757bf69351da632a1d8c541de55a389006b58441260e6", - git_commit = "ee03e30745f63888e97b945c7d8041b55948cb68", + sha256 = "e9e5f5bed3cb435c1c830bd58354c9ecef961fdbe23809dd17838d6c2b46c749", + git_commit = "0f09427ca4938f1403a4c856d5cdd41ff6908594", ) # Import all of TensorFlow Serving's external dependencies. From bb1428d53abb53fe938ddf9bb8839d4dfe48d291 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 8 Jul 2021 16:41:55 -0700 Subject: [PATCH 5189/8103] Update resnet_client_grpc.py example PiperOrigin-RevId: 383740173 --- .../example/resnet_client_grpc.py | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/tensorflow_serving/example/resnet_client_grpc.py b/tensorflow_serving/example/resnet_client_grpc.py index 7c99f0b9d33..5a7171c6caf 100644 --- a/tensorflow_serving/example/resnet_client_grpc.py +++ b/tensorflow_serving/example/resnet_client_grpc.py @@ -18,9 +18,13 @@ from __future__ import print_function +import io + # This is a placeholder for a Google-internal import. import grpc +import numpy as np +from PIL import Image import requests import tensorflow as tf @@ -36,6 +40,10 @@ 'path to image in JPEG format') FLAGS = tf.compat.v1.app.flags.FLAGS +# Current Resnet model in TF Model Garden (as of 7/2021) does not accept JPEG +# as input +MODEL_ACCEPT_JPG = False + def main(_): if FLAGS.image: @@ -47,6 +55,13 @@ def main(_): dl_request.raise_for_status() data = dl_request.content + if not MODEL_ACCEPT_JPG: + data = Image.open(io.BytesIO(dl_request.content)) + # Normalize and batchify the image + data = np.array(data) / 255.0 + data = np.expand_dims(data, 0) + data = data.astype(np.float32) + channel = grpc.insecure_channel(FLAGS.server) stub = prediction_service_pb2_grpc.PredictionServiceStub(channel) # Send request @@ -54,10 +69,11 @@ def main(_): request = predict_pb2.PredictRequest() request.model_spec.name = 'resnet' request.model_spec.signature_name = 'serving_default' - request.inputs['image_bytes'].CopyFrom( - tf.make_tensor_proto(data, shape=[1])) + request.inputs['input_1'].CopyFrom( + tf.make_tensor_proto(data)) result = stub.Predict(request, 10.0) # 10 secs timeout - print(result) + result = result.outputs['activation_49'].float_val + print('Prediction class: {}'.format(np.argmax(result))) if __name__ == '__main__': From c81b5e786e31cdb1fec62a4f16f16f80b8c7d404 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 8 Jul 2021 18:02:15 -0700 Subject: [PATCH 5190/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a3403b13-6196-4822-98cc-07d32f856201 PiperOrigin-RevId: 383751669 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8a8ae0e95a7..4bb2d457a66 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e9e5f5bed3cb435c1c830bd58354c9ecef961fdbe23809dd17838d6c2b46c749", - git_commit = "0f09427ca4938f1403a4c856d5cdd41ff6908594", + sha256 = "1ab73131ca5f80996bdeba2ee51347c71f90fb4398df3ee3fe77fd0c18927bbd", + git_commit = "4fcc6135a73781d06e4762ff94ed9d2be9e30d8a", ) # Import all of TensorFlow Serving's external dependencies. From cb28fcab721b366c75f974ad6eead53659ba00d7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 8 Jul 2021 18:37:12 -0700 Subject: [PATCH 5191/8103] Update resnet_client.py example PiperOrigin-RevId: 383755518 --- tensorflow_serving/example/resnet_client.py | 28 +++++++++++++++------ 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/tensorflow_serving/example/resnet_client.py b/tensorflow_serving/example/resnet_client.py index 95a892b0215..b531166a91d 100644 --- a/tensorflow_serving/example/resnet_client.py +++ b/tensorflow_serving/example/resnet_client.py @@ -20,9 +20,7 @@ The client expects a TensorFlow Serving ModelServer running a ResNet SavedModel from: -https://github.com/tensorflow/models/tree/master/official/resnet#pre-trained-model - -The SavedModel must be one that can take JPEG images as inputs. +https://github.com/tensorflow/models/tree/master/official/vision/image_classification/resnet#pretrained-models Typical usage example: @@ -32,6 +30,11 @@ from __future__ import print_function import base64 +import io +import json + +import numpy as np +from PIL import Image import requests # The server URL specifies the endpoint of your server running the ResNet @@ -41,15 +44,26 @@ # The image URL is the location of the image we should send to the server IMAGE_URL = 'https://tensorflow.org/images/blogs/serving/cat.jpg' +# Current Resnet model in TF Model Garden (as of 7/2021) does not accept JPEG +# as input +MODEL_ACCEPT_JPG = False + def main(): # Download the image dl_request = requests.get(IMAGE_URL, stream=True) dl_request.raise_for_status() - # Compose a JSON Predict request (send JPEG image in base64). - jpeg_bytes = base64.b64encode(dl_request.content).decode('utf-8') - predict_request = '{"instances" : [{"b64": "%s"}]}' % jpeg_bytes + if MODEL_ACCEPT_JPG: + # Compose a JSON Predict request (send JPEG image in base64). + jpeg_bytes = base64.b64encode(dl_request.content).decode('utf-8') + predict_request = '{"instances" : [{"b64": "%s"}]}' % jpeg_bytes + else: + # Compose a JOSN Predict request (send the image tensor). + jpeg_rgb = Image.open(io.BytesIO(dl_request.content)) + # Normalize and batchify the image + jpeg_rgb = np.expand_dims(np.array(jpeg_rgb) / 255.0, 0).tolist() + predict_request = json.dumps({'instances': jpeg_rgb}) # Send few requests to warm-up the model. for _ in range(3): @@ -66,7 +80,7 @@ def main(): prediction = response.json()['predictions'][0] print('Prediction class: {}, avg latency: {} ms'.format( - prediction['classes'], (total_time*1000)/num_requests)) + np.argmax(prediction), (total_time * 1000) / num_requests)) if __name__ == '__main__': From b9a3c396e97e771907c844f8d67a9adfce9b6179 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 9 Jul 2021 00:02:18 -0700 Subject: [PATCH 5192/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c465ffb3-1787-4c8a-b408-23b8eae8c215 PiperOrigin-RevId: 383789554 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4bb2d457a66..0aa8f892316 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1ab73131ca5f80996bdeba2ee51347c71f90fb4398df3ee3fe77fd0c18927bbd", - git_commit = "4fcc6135a73781d06e4762ff94ed9d2be9e30d8a", + sha256 = "af4a7c252d59e0f1d5778422887342e29bbe43f255867284ce0d4d0baf77792d", + git_commit = "028f452dee867a47a25a51ed42aef50e2b1cee77", ) # Import all of TensorFlow Serving's external dependencies. From d89fce1096c487d153e8c03d64dd57153d48745a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 9 Jul 2021 06:01:33 -0700 Subject: [PATCH 5193/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0de7c733-bb2d-4054-bdee-059eb57da094 PiperOrigin-RevId: 383830639 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0aa8f892316..8e5f43ee18f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "af4a7c252d59e0f1d5778422887342e29bbe43f255867284ce0d4d0baf77792d", - git_commit = "028f452dee867a47a25a51ed42aef50e2b1cee77", + sha256 = "518c8e0d8001df1cf2659d202aeed2d705f1c2da2aa2e759415a0cf72298f413", + git_commit = "9a28b6960223514e5f7c4dfc9e21a41b455f6816", ) # Import all of TensorFlow Serving's external dependencies. From 7ea2896b00b149e3cf538f1fa6bcec0bcefaf113 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 9 Jul 2021 12:01:35 -0700 Subject: [PATCH 5194/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/72f9dcf3-9988-4b11-b040-2be0dd3b3bc6 PiperOrigin-RevId: 383893766 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8e5f43ee18f..e29c4923ee4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "518c8e0d8001df1cf2659d202aeed2d705f1c2da2aa2e759415a0cf72298f413", - git_commit = "9a28b6960223514e5f7c4dfc9e21a41b455f6816", + sha256 = "d9e9a063bbfcbb6c181c6d910a83dae8c2cfde9b9ace12584c3487d09f622222", + git_commit = "1f7e7f9cb032127a428986e05f41f560d01a06a3", ) # Import all of TensorFlow Serving's external dependencies. From 893bf273355c9c2f61b914da8069d4d79fbaadad Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 9 Jul 2021 18:01:49 -0700 Subject: [PATCH 5195/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/25533718-9b1a-4cca-bbcb-a5878de55f3f PiperOrigin-RevId: 383957423 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e29c4923ee4..ff668f40427 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d9e9a063bbfcbb6c181c6d910a83dae8c2cfde9b9ace12584c3487d09f622222", - git_commit = "1f7e7f9cb032127a428986e05f41f560d01a06a3", + sha256 = "cf2732fea4d8d7b0cdc47582cda0f7a253afab51c66bac6a1ae1b4dd8a2f4319", + git_commit = "b5778289d77aea690c7243213169c07363b36e45", ) # Import all of TensorFlow Serving's external dependencies. From 451c881c4dbe7360c22ee33d1647687ee6951f6d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 10 Jul 2021 00:03:58 -0700 Subject: [PATCH 5196/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/389286e6-2fc1-42da-b17f-abe803d5bebd PiperOrigin-RevId: 383984904 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ff668f40427..e8bbef3d67a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cf2732fea4d8d7b0cdc47582cda0f7a253afab51c66bac6a1ae1b4dd8a2f4319", - git_commit = "b5778289d77aea690c7243213169c07363b36e45", + sha256 = "9fd311620d61678b067a6c05728c72d61ff88bb8e0fe61845a56b7a5abcdc4d4", + git_commit = "9902417727b25eb2b2346dab3d4950be84d660e8", ) # Import all of TensorFlow Serving's external dependencies. From e2ef854eba5a85541919b702d7a158c30379fd8b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 10 Jul 2021 06:01:59 -0700 Subject: [PATCH 5197/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8c772f52-9812-48ac-878f-3ca9d3f1297a PiperOrigin-RevId: 384008962 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e8bbef3d67a..9a03d1a15e6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9fd311620d61678b067a6c05728c72d61ff88bb8e0fe61845a56b7a5abcdc4d4", - git_commit = "9902417727b25eb2b2346dab3d4950be84d660e8", + sha256 = "c98ebc3308c3571da12a39a506bb8be129be8f8d71b4d5728f868ecf1bedaedc", + git_commit = "e91d2e843f8ef2b35179706f8b1fe964a663a988", ) # Import all of TensorFlow Serving's external dependencies. From 8838cc9054948f83d8909058b71e2bf0c01443b4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 10 Jul 2021 12:01:45 -0700 Subject: [PATCH 5198/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/50d47b7c-761f-4281-8c5b-2f935d3f0b80 PiperOrigin-RevId: 384030724 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9a03d1a15e6..957f8e04855 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c98ebc3308c3571da12a39a506bb8be129be8f8d71b4d5728f868ecf1bedaedc", - git_commit = "e91d2e843f8ef2b35179706f8b1fe964a663a988", + sha256 = "b0d5b65061c803b900e5b2c6c5b7bd85e9787d0fa44489fc0ed868b99144abf0", + git_commit = "0d4c07f5ae1b264bdfbae9e4d683d769852d88db", ) # Import all of TensorFlow Serving's external dependencies. From 2995df49b20eed2c3ebc0deaf6524e50dd1c251b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 11 Jul 2021 00:01:53 -0700 Subject: [PATCH 5199/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/daf7fc59-809c-47b5-8f28-0701de08e574 PiperOrigin-RevId: 384076759 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 957f8e04855..900150dc424 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b0d5b65061c803b900e5b2c6c5b7bd85e9787d0fa44489fc0ed868b99144abf0", - git_commit = "0d4c07f5ae1b264bdfbae9e4d683d769852d88db", + sha256 = "40eaa1fd03e4c6457c81239ff7c5ea4e3646bcd3f7caeaf1302c4a4de259c393", + git_commit = "12c2babf7dccc00c13d6e297c0f792f89f7408aa", ) # Import all of TensorFlow Serving's external dependencies. From 74c21b3162822e51cdf31fea7b41e94f493d9a08 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 11 Jul 2021 06:01:23 -0700 Subject: [PATCH 5200/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/56132207-cca2-4eba-bc19-1d00902298b1 PiperOrigin-RevId: 384101016 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 900150dc424..21ef27a80c2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "40eaa1fd03e4c6457c81239ff7c5ea4e3646bcd3f7caeaf1302c4a4de259c393", - git_commit = "12c2babf7dccc00c13d6e297c0f792f89f7408aa", + sha256 = "03b1f9e238ae5148c17070a368f98546debd09b07a550e7121e343c1f3b61fce", + git_commit = "afcfffcdef394a0abb162e6eb8047783af95e41a", ) # Import all of TensorFlow Serving's external dependencies. From 3b528523285c15dc833ff0542dcadb064b28aae9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 11 Jul 2021 19:57:08 -0700 Subject: [PATCH 5201/8103] Update resnet_warmup.py example PiperOrigin-RevId: 384154414 --- tensorflow_serving/example/resnet_warmup.py | 26 +++++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/tensorflow_serving/example/resnet_warmup.py b/tensorflow_serving/example/resnet_warmup.py index bdc78fa2b01..c7a6af151fb 100644 --- a/tensorflow_serving/example/resnet_warmup.py +++ b/tensorflow_serving/example/resnet_warmup.py @@ -24,8 +24,8 @@ After the script is run, and tensorflow_model_server is restarted, to verify it is working look for the output: - 'Starting to read warmup data for model at' in the tensorflow_model_server - startup log + 'Starting to read warmup data for model at' and 'Finished reading warmup data + for model at' in the tensorflow_model_server startup log Usage example: python resnet_warmup.py saved_model_dir @@ -33,8 +33,12 @@ from __future__ import print_function +import io import os import sys + +import numpy as np +from PIL import Image import requests import tensorflow as tf from tensorflow_serving.apis import predict_pb2 @@ -48,6 +52,10 @@ # pylint: enable=g-line-too-long ] +# Current Resnet model in TF Model Garden (as of 7/2021) does not accept JPEG +# as input +MODEL_ACCEPT_JPG = False + def main(): if len(sys.argv) != 2 or sys.argv[-1].startswith('-'): @@ -60,7 +68,8 @@ def main(): 'Specify the path of an existing model.' % model_dir) sys.exit(-1) - # Create the assets.extra directory + # Create the assets.extra directory, assuming model_dir is the versioned + # directory containing the SavedModel assets_dir = os.path.join(model_dir, 'assets.extra') if not os.path.exists(assets_dir): os.mkdir(assets_dir) @@ -73,12 +82,19 @@ def main(): dl_request.raise_for_status() data = dl_request.content + if not MODEL_ACCEPT_JPG: + data = Image.open(io.BytesIO(dl_request.content)) + # Normalize and batchify the image + data = np.array(data) / 255.0 + data = np.expand_dims(data, 0) + data = data.astype(np.float32) + # Create the inference request request = predict_pb2.PredictRequest() request.model_spec.name = 'resnet' request.model_spec.signature_name = 'serving_default' - request.inputs['image_bytes'].CopyFrom( - tf.make_tensor_proto(data, shape=[1])) + request.inputs['input_1'].CopyFrom( + tf.make_tensor_proto(data)) log = prediction_log_pb2.PredictionLog( predict_log=prediction_log_pb2.PredictLog(request=request)) From b9a43ef6ab503d7710668f4a179c4c694a3006f9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 12 Jul 2021 00:01:22 -0700 Subject: [PATCH 5202/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0d0ff512-0a54-4ddc-ab21-7eac8f80cbcc PiperOrigin-RevId: 384173911 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 21ef27a80c2..7feebcda7e9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "03b1f9e238ae5148c17070a368f98546debd09b07a550e7121e343c1f3b61fce", - git_commit = "afcfffcdef394a0abb162e6eb8047783af95e41a", + sha256 = "beab427d90c78284c3e9d0a4ac180aaae85fff7f69ee4dd4b3d54527dfc451ff", + git_commit = "daa03a4e2e83df9bd4a5ea72fc76f9d49d34c710", ) # Import all of TensorFlow Serving's external dependencies. From f69009496183b3eb6cfbe3424b87d94b59b43dd2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 12 Jul 2021 12:02:42 -0700 Subject: [PATCH 5203/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a3bdc62c-0012-4129-b3a4-e09126775ef1 PiperOrigin-RevId: 384285765 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7feebcda7e9..a33ddfa58b2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "beab427d90c78284c3e9d0a4ac180aaae85fff7f69ee4dd4b3d54527dfc451ff", - git_commit = "daa03a4e2e83df9bd4a5ea72fc76f9d49d34c710", + sha256 = "a6ae680244820348f4277cd79d85bb5b29f066d76cdfdde7345907190a0c6015", + git_commit = "6916319db9f4ec57668cae0df53f6188abf0f708", ) # Import all of TensorFlow Serving's external dependencies. From e438ddf5a71e397b3072f0ffb805d0eee5ae2f67 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 12 Jul 2021 18:01:49 -0700 Subject: [PATCH 5204/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0920956b-72fc-433f-b194-ffb12f9272b4 PiperOrigin-RevId: 384358176 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a33ddfa58b2..fbfc3096a66 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a6ae680244820348f4277cd79d85bb5b29f066d76cdfdde7345907190a0c6015", - git_commit = "6916319db9f4ec57668cae0df53f6188abf0f708", + sha256 = "bfd64aed3b7975cde419a59bc19f895fe7d693d1ff8fd3011cd9a5f5a1356880", + git_commit = "db978a52031dd8f2c1085da60a3163b824834725", ) # Import all of TensorFlow Serving's external dependencies. From 7ff0a7b3578684f956c28e3a0d9faf511e60d731 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 13 Jul 2021 00:01:45 -0700 Subject: [PATCH 5205/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5dd78f58-8435-4fae-9b57-cba862ee5e3b PiperOrigin-RevId: 384398966 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fbfc3096a66..e3c91c6c78f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bfd64aed3b7975cde419a59bc19f895fe7d693d1ff8fd3011cd9a5f5a1356880", - git_commit = "db978a52031dd8f2c1085da60a3163b824834725", + sha256 = "d30868507998029b8da65c1e7e8ab10299467a7b80b163f4df798283d2d1152d", + git_commit = "41dc74d06e1d44e3bba8972ae3c925cffb7e4305", ) # Import all of TensorFlow Serving's external dependencies. From c1ac380691fc4b2109ce7cba7a3cfe3c98c75e10 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 13 Jul 2021 06:01:37 -0700 Subject: [PATCH 5206/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f0db819f-5633-4ea8-a56c-0e61f470f62c PiperOrigin-RevId: 384444632 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e3c91c6c78f..996037ab067 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d30868507998029b8da65c1e7e8ab10299467a7b80b163f4df798283d2d1152d", - git_commit = "41dc74d06e1d44e3bba8972ae3c925cffb7e4305", + sha256 = "62492ffffd5856a98762fccb3f19657a3fd85118cc58a9790c3d57707d2603a9", + git_commit = "3c26fdcf6a6d08259f6df44bbc57b96a5f206406", ) # Import all of TensorFlow Serving's external dependencies. From 2a27ae4c073aef1676c59d45210bacc5dedf5679 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 13 Jul 2021 12:02:01 -0700 Subject: [PATCH 5207/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0825a154-ad96-4ecc-8e63-f1dcfee3a2d8 PiperOrigin-RevId: 384518508 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 996037ab067..cfc2257e811 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "62492ffffd5856a98762fccb3f19657a3fd85118cc58a9790c3d57707d2603a9", - git_commit = "3c26fdcf6a6d08259f6df44bbc57b96a5f206406", + sha256 = "173814b96846f5f01a480b3f9542d994a8879ee82697d733ebe163ff5abad579", + git_commit = "4d8da75c8ead9e9cf3771ab418a6facb4ac3fedf", ) # Import all of TensorFlow Serving's external dependencies. From 680eb8b14b56819c524a65fa422ad1af93c76ccf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 13 Jul 2021 18:02:03 -0700 Subject: [PATCH 5208/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/94b76291-cb5f-4d6e-b4cc-ecca25ff7a25 PiperOrigin-RevId: 384592357 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cfc2257e811..837b472f3cf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "173814b96846f5f01a480b3f9542d994a8879ee82697d733ebe163ff5abad579", - git_commit = "4d8da75c8ead9e9cf3771ab418a6facb4ac3fedf", + sha256 = "eb70482d206ea5349631444011d66cd55fdf5fb722eec032b68a9f91d7da28d8", + git_commit = "b3e1fafce5a0579c8be42a4433fd45ca927115bc", ) # Import all of TensorFlow Serving's external dependencies. From 42e08e26b9bdfce050e3e2b118404eb0056e2d54 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 14 Jul 2021 00:01:49 -0700 Subject: [PATCH 5209/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/895ab68d-ccc0-4943-9f32-a996daf23476 PiperOrigin-RevId: 384634419 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 837b472f3cf..b070c72f05d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eb70482d206ea5349631444011d66cd55fdf5fb722eec032b68a9f91d7da28d8", - git_commit = "b3e1fafce5a0579c8be42a4433fd45ca927115bc", + sha256 = "dce017169e07ab3f26c418406dac3c1aaf7e18e3b5a5c13696eeadc0a3d7f52e", + git_commit = "926e8aaf98078d57175795025bf3f8a93db813bc", ) # Import all of TensorFlow Serving's external dependencies. From 6b8db56f70a48768cd9e31125220ff8a3f18db19 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 14 Jul 2021 06:01:38 -0700 Subject: [PATCH 5210/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0c839c03-ded7-4154-8565-5b90e19dd393 PiperOrigin-RevId: 384681066 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b070c72f05d..dec08fd8168 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dce017169e07ab3f26c418406dac3c1aaf7e18e3b5a5c13696eeadc0a3d7f52e", - git_commit = "926e8aaf98078d57175795025bf3f8a93db813bc", + sha256 = "fb5f7f790a955fd33399403331780040812b6230024fe27dc64123e2aec32de4", + git_commit = "20399219cc55e544e8473beba19fe506e69ed8c6", ) # Import all of TensorFlow Serving's external dependencies. From a8f8be116ed37fdb32ecd44b2352f13064e125f0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 14 Jul 2021 12:01:40 -0700 Subject: [PATCH 5211/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/02429fd3-99f7-4717-aa13-c94e20b9e272 PiperOrigin-RevId: 384752311 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dec08fd8168..bf51b249184 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fb5f7f790a955fd33399403331780040812b6230024fe27dc64123e2aec32de4", - git_commit = "20399219cc55e544e8473beba19fe506e69ed8c6", + sha256 = "e2f86ac00d5e929fede529931d9bfaf543acd5a1e195721cb55e92b2b04723fe", + git_commit = "53c3fc3e5a7cafc57e6644cbbbedea425a7b1db7", ) # Import all of TensorFlow Serving's external dependencies. From 3f154a82731b070720acb51d42b0515a3cb2bb0e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 14 Jul 2021 18:01:30 -0700 Subject: [PATCH 5212/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a38e42ca-663d-404e-9cda-2cc57d144243 PiperOrigin-RevId: 384825085 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bf51b249184..1aeacf760d8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e2f86ac00d5e929fede529931d9bfaf543acd5a1e195721cb55e92b2b04723fe", - git_commit = "53c3fc3e5a7cafc57e6644cbbbedea425a7b1db7", + sha256 = "472265afa24425f7c40d4035c83920b3054d255b20d21fd1f8dc869d079d3b70", + git_commit = "6f7fd1b82f613959779f678e827abd958c397a05", ) # Import all of TensorFlow Serving's external dependencies. From 4778923606e85bafd553e264c326b3b0064c8f01 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 15 Jul 2021 00:01:48 -0700 Subject: [PATCH 5213/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4f0d931e-3607-4609-b7f7-a577cae2a381 PiperOrigin-RevId: 384863913 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1aeacf760d8..2c707883aa7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "472265afa24425f7c40d4035c83920b3054d255b20d21fd1f8dc869d079d3b70", - git_commit = "6f7fd1b82f613959779f678e827abd958c397a05", + sha256 = "66553533ae92500d1254fc059efa214efbe4b2a44a3aa07485e7fc8341d79301", + git_commit = "b2f63ab0c4cb986770eac04cf4bdeff14276ecf7", ) # Import all of TensorFlow Serving's external dependencies. From 18549bf2bccb1606e22d78319ec37eef84b4c7cd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 16 Jul 2021 06:01:29 -0700 Subject: [PATCH 5214/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3e3ee991-6708-435a-8917-8f34c3ff0d6b PiperOrigin-RevId: 385130843 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2c707883aa7..baeabd92631 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "66553533ae92500d1254fc059efa214efbe4b2a44a3aa07485e7fc8341d79301", - git_commit = "b2f63ab0c4cb986770eac04cf4bdeff14276ecf7", + sha256 = "87bf4c3ea5853022fe8543fea7f8640192dec320fda367dda3df6ba6f9a51684", + git_commit = "34ea841774087188978754d63b8705f9490a43fa", ) # Import all of TensorFlow Serving's external dependencies. From 4e19738966dd94bea0279890deb2a7cfffdb375b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 16 Jul 2021 12:01:41 -0700 Subject: [PATCH 5215/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/db8d6035-c58f-4bf9-bb34-da9afa712d5b PiperOrigin-RevId: 385195213 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index baeabd92631..93d8ce4ce5b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "87bf4c3ea5853022fe8543fea7f8640192dec320fda367dda3df6ba6f9a51684", - git_commit = "34ea841774087188978754d63b8705f9490a43fa", + sha256 = "c87c8887dbe519bc450d54ab1345dc29acd8b85b620811a10355dea3119f8553", + git_commit = "fd3c67f2f1948a93f4545dc0ce4f4201db0069fe", ) # Import all of TensorFlow Serving's external dependencies. From 2647af075a087b8c586d39561f48a932ad3de21e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 16 Jul 2021 18:01:33 -0700 Subject: [PATCH 5216/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0ed999d4-858b-444c-aa36-92260c53c3a2 PiperOrigin-RevId: 385257164 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 93d8ce4ce5b..9280890e827 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c87c8887dbe519bc450d54ab1345dc29acd8b85b620811a10355dea3119f8553", - git_commit = "fd3c67f2f1948a93f4545dc0ce4f4201db0069fe", + sha256 = "93ce7a4ee776f1809a8dc0673e391646279cccbcd5b8095a49f87227b74eadd3", + git_commit = "b5c9beeecdd6416dc6af12790e74a14e249cbd45", ) # Import all of TensorFlow Serving's external dependencies. From 9c8e67daf940dedbc76129f0b76ee7ad7cc8853e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 17 Jul 2021 00:01:37 -0700 Subject: [PATCH 5217/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/16bdc9b2-fd77-4e5a-9e40-8f932617a3cf PiperOrigin-RevId: 385285958 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9280890e827..63314c6f233 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "93ce7a4ee776f1809a8dc0673e391646279cccbcd5b8095a49f87227b74eadd3", - git_commit = "b5c9beeecdd6416dc6af12790e74a14e249cbd45", + sha256 = "4bf46f88410683ff917e72e5e79e845a0428a73789d5264e27ed1d104556ac71", + git_commit = "9968cc26d95e024a428cbd12aa51aef90a1dc2be", ) # Import all of TensorFlow Serving's external dependencies. From 8ffd3feb72d36d0d3248b7e49901124e2cd3b0a4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 17 Jul 2021 06:01:37 -0700 Subject: [PATCH 5218/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/161cfb15-4299-47bb-9d10-e52bd220cb9d PiperOrigin-RevId: 385312008 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 63314c6f233..948d84c0a86 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4bf46f88410683ff917e72e5e79e845a0428a73789d5264e27ed1d104556ac71", - git_commit = "9968cc26d95e024a428cbd12aa51aef90a1dc2be", + sha256 = "f6abc2d55df199048f3407993d38b237074bbdccd51ccf64bcb5ec32c7475c25", + git_commit = "d52e428cae647a2e5262b685ac49190e7f98fad9", ) # Import all of TensorFlow Serving's external dependencies. From 0b158b6c1ac759216b1fcb335e684518a4be52aa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 17 Jul 2021 12:01:33 -0700 Subject: [PATCH 5219/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b56767a1-95c2-4116-b148-a85389a252f6 PiperOrigin-RevId: 385335524 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 948d84c0a86..4139d34fff8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f6abc2d55df199048f3407993d38b237074bbdccd51ccf64bcb5ec32c7475c25", - git_commit = "d52e428cae647a2e5262b685ac49190e7f98fad9", + sha256 = "d478486f777d28f01fe83768748b361ca4c76ea5f8e5d163b1ae84c79acf3e77", + git_commit = "524bc859bc8493e30172a1a042d1db093b809695", ) # Import all of TensorFlow Serving's external dependencies. From 9af6036e99119db318691254b2c29d6ded83a587 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 18 Jul 2021 06:02:06 -0700 Subject: [PATCH 5220/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/67104b8c-7d0e-4768-98db-147522c64d2b PiperOrigin-RevId: 385410099 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4139d34fff8..bdb4ed89084 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d478486f777d28f01fe83768748b361ca4c76ea5f8e5d163b1ae84c79acf3e77", - git_commit = "524bc859bc8493e30172a1a042d1db093b809695", + sha256 = "a666bc223d81726456341c4a20e1e79c40b4b89a592f4fcada6dcea264f58faa", + git_commit = "9c96d61b29c0be8dca24e73f6babf68553299f58", ) # Import all of TensorFlow Serving's external dependencies. From 5f59e3f82064654bb24bf8922159aec6db1edd9e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 19 Jul 2021 00:01:31 -0700 Subject: [PATCH 5221/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/44b1afb7-54db-4dcf-8748-019ec11e89a7 PiperOrigin-RevId: 385490985 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bdb4ed89084..c02971956fd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a666bc223d81726456341c4a20e1e79c40b4b89a592f4fcada6dcea264f58faa", - git_commit = "9c96d61b29c0be8dca24e73f6babf68553299f58", + sha256 = "f8db585a65bb01c199f6514cf20abd17407f3d19e8647c4a788e872386069ed4", + git_commit = "005a4a698d23f3f3694af57a9c0ef2ca7e53fb5a", ) # Import all of TensorFlow Serving's external dependencies. From 8403c0563851830fe8325484ed4940766012c9f9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 19 Jul 2021 06:01:31 -0700 Subject: [PATCH 5222/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/42e6126f-a2bb-4e3d-b4b8-35926c43ebd8 PiperOrigin-RevId: 385536319 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c02971956fd..e358b074d2f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f8db585a65bb01c199f6514cf20abd17407f3d19e8647c4a788e872386069ed4", - git_commit = "005a4a698d23f3f3694af57a9c0ef2ca7e53fb5a", + sha256 = "0fade0663f7f5da115975a08d298439d45b742b6d4a4cf80248bbf3aa697a1c2", + git_commit = "a4d25192f0340b7786760d57e6b5859e561d9b49", ) # Import all of TensorFlow Serving's external dependencies. From e04bde01424e77bd38efc7e4dce829399133b60a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 19 Jul 2021 12:03:31 -0700 Subject: [PATCH 5223/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/483f3d3d-c431-4046-ba75-1cfef5b75b93 PiperOrigin-RevId: 385609744 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e358b074d2f..1dc5160abe0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0fade0663f7f5da115975a08d298439d45b742b6d4a4cf80248bbf3aa697a1c2", - git_commit = "a4d25192f0340b7786760d57e6b5859e561d9b49", + sha256 = "26912e415a1249d6f31ff0e8263de536c27bdb4d2b782af2646cc87fb81e78de", + git_commit = "7921431fe9f9378d1434377829bb3a3e39e5609a", ) # Import all of TensorFlow Serving's external dependencies. From d92d95fca08db0c4260055e95565f9c23e2611bd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 19 Jul 2021 18:02:23 -0700 Subject: [PATCH 5224/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d5802396-2c56-4a9e-ad00-6442c3128170 PiperOrigin-RevId: 385681977 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1dc5160abe0..10d7511fa40 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "26912e415a1249d6f31ff0e8263de536c27bdb4d2b782af2646cc87fb81e78de", - git_commit = "7921431fe9f9378d1434377829bb3a3e39e5609a", + sha256 = "f8d82d7d2fb747b1dea3c2e8ee03f43471038f2ab9f60fa129650461aec3de44", + git_commit = "c466dfa0dce32561be1e1397e33010342d2b3fc5", ) # Import all of TensorFlow Serving's external dependencies. From 91ce5e190fa047e13e9ed683f3fb8425563710f5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 19 Jul 2021 18:39:57 -0700 Subject: [PATCH 5225/8103] Update resnet_client.cc example to send image bytes as opposed to JPEG blob. Resnet model in Model Garden no longer accept JPEG as input. PiperOrigin-RevId: 385687109 --- tensorflow_serving/example/BUILD | 1 + tensorflow_serving/example/resnet_client.cc | 104 +++++++++++++++----- 2 files changed, 83 insertions(+), 22 deletions(-) diff --git a/tensorflow_serving/example/BUILD b/tensorflow_serving/example/BUILD index 6bb890f5ec6..b6beae6c47c 100644 --- a/tensorflow_serving/example/BUILD +++ b/tensorflow_serving/example/BUILD @@ -29,5 +29,6 @@ cc_binary( "@com_google_protobuf//:protobuf_lite", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", + "@org_tensorflow//tensorflow/core/platform:jpeg", ], ) diff --git a/tensorflow_serving/example/resnet_client.cc b/tensorflow_serving/example/resnet_client.cc index 3a7cb1f1419..9c1a61c3ac7 100644 --- a/tensorflow_serving/example/resnet_client.cc +++ b/tensorflow_serving/example/resnet_client.cc @@ -13,6 +13,8 @@ See the License for the specific language governing permissions and limitations under the License. ==============================================================================*/ +#include + #include #include @@ -20,6 +22,7 @@ limitations under the License. #include "grpcpp/security/credentials.h" #include "google/protobuf/map.h" #include "tensorflow/core/framework/tensor.h" +#include "tensorflow/core/platform/jpeg.h" #include "tensorflow/core/platform/types.h" #include "tensorflow/core/util/command_line_flags.h" #include "tensorflow_serving/apis/prediction_service.grpc.pb.h" @@ -34,8 +37,81 @@ using tensorflow::serving::PredictionService; typedef google::protobuf::Map OutMap; +struct tf_jpeg_error_mgr { + struct jpeg_error_mgr pub; + jmp_buf setjmp_buffer; +}; + +typedef struct tf_jpeg_error_mgr* tf_jpeg_error_ptr; + +METHODDEF(void) +tf_jpeg_error_exit(j_common_ptr cinfo) { + tf_jpeg_error_ptr tf_jpeg_err = (tf_jpeg_error_ptr)cinfo->err; + + (*cinfo->err->output_message)(cinfo); + + longjmp(tf_jpeg_err->setjmp_buffer, 1); +} + class ServingClient { public: + // JPEG decompression code following libjpeg-turbo documentation: + // https://github.com/libjpeg-turbo/libjpeg-turbo/blob/main/example.txt + int readJPEG(const char* file_name, tensorflow::TensorProto* proto) { + struct tf_jpeg_error_mgr jerr; + FILE* infile; + JSAMPARRAY buffer; + int row_stride; + struct jpeg_decompress_struct cinfo; + + if ((infile = fopen(file_name, "rb")) == NULL) { + fprintf(stderr, "can't open %s\n", file_name); + return -1; + } + + cinfo.err = jpeg_std_error(&jerr.pub); + jerr.pub.error_exit = tf_jpeg_error_exit; + if (setjmp(jerr.setjmp_buffer)) { + jpeg_destroy_decompress(&cinfo); + fclose(infile); + return -1; + } + + jpeg_create_decompress(&cinfo); + jpeg_stdio_src(&cinfo, infile); + + (void)jpeg_read_header(&cinfo, TRUE); + + (void)jpeg_start_decompress(&cinfo); + row_stride = cinfo.output_width * cinfo.output_components; + CHECK(cinfo.output_components == 3) + << "Only 3-channel (RGB) JPEG files are supported"; + + buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr)&cinfo, JPOOL_IMAGE, + row_stride, 1); + + proto->set_dtype(tensorflow::DataType::DT_FLOAT); + while (cinfo.output_scanline < cinfo.output_height) { + (void)jpeg_read_scanlines(&cinfo, buffer, 1); + for (size_t i = 0; i < cinfo.output_width; i++) { + proto->add_float_val(buffer[0][i * 3] / 255.0); + proto->add_float_val(buffer[0][i * 3 + 1] / 255.0); + proto->add_float_val(buffer[0][i * 3 + 2] / 255.0); + } + } + + proto->mutable_tensor_shape()->add_dim()->set_size(1); + proto->mutable_tensor_shape()->add_dim()->set_size(cinfo.output_height); + proto->mutable_tensor_shape()->add_dim()->set_size(cinfo.output_width); + proto->mutable_tensor_shape()->add_dim()->set_size(cinfo.output_components); + + (void)jpeg_finish_decompress(&cinfo); + + jpeg_destroy_decompress(&cinfo); + fclose(infile); + return 0; + } + ServingClient(std::shared_ptr channel) : stub_(PredictionService::NewStub(channel)) {} @@ -55,33 +131,17 @@ class ServingClient { tensorflow::TensorProto proto; - std::ifstream imageFile(file_path, std::ios::binary); + const char* infile = file_path.c_str(); - if (!imageFile.is_open()) { - std::cout << "Failed to open " << file_path << std::endl; - return ""; + if (readJPEG(infile, &proto)) { + std::cout << "error constructing the protobuf"; + return "execution failed"; } - std::filebuf* pbuf = imageFile.rdbuf(); - auto fileSize = pbuf->pubseekoff(0, std::ios::end, std::ios::in); - - char* image = new char[fileSize](); - - pbuf->pubseekpos(0, std::ios::in); - pbuf->sgetn(image, fileSize); - imageFile.close(); - - proto.set_dtype(tensorflow::DataType::DT_STRING); - proto.add_string_val(image, fileSize); - - proto.mutable_tensor_shape()->add_dim()->set_size(1); - - inputs["image_bytes"] = proto; + inputs["input_1"] = proto; Status status = stub_->Predict(&context, predictRequest, &response); - delete[] image; - if (status.ok()) { std::cout << "call predict ok" << std::endl; std::cout << "outputs size is " << response.outputs_size() << std::endl; @@ -96,7 +156,7 @@ class ServingClient { if (converted) { std::cout << "the result tensor[" << output_index << "] is:" << std::endl - << tensor.SummarizeValue(10) << std::endl; + << tensor.SummarizeValue(1001) << std::endl; } else { std::cout << "the result tensor[" << output_index << "] convert failed." << std::endl; From 6c3f467a4321d735e31a12046d6accdebe6c0c18 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 20 Jul 2021 00:01:31 -0700 Subject: [PATCH 5226/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/81716b09-5818-4e38-beeb-6baeb30f842c PiperOrigin-RevId: 385722802 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 10d7511fa40..2d2c9a4bfd7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f8d82d7d2fb747b1dea3c2e8ee03f43471038f2ab9f60fa129650461aec3de44", - git_commit = "c466dfa0dce32561be1e1397e33010342d2b3fc5", + sha256 = "2d208f13023fb52d40ba307386d91a125be8654f471533d3de226e5a6e7d6fa5", + git_commit = "795f6b8fd73ddfd3a5bec956a15594d11dfb8cc8", ) # Import all of TensorFlow Serving's external dependencies. From 098f2bf257676ceb29b5d690cb947018d4f10284 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 20 Jul 2021 06:01:25 -0700 Subject: [PATCH 5227/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6d7a2303-8a43-4920-bf07-4e1518f54339 PiperOrigin-RevId: 385768813 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2d2c9a4bfd7..be30ee93ad4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2d208f13023fb52d40ba307386d91a125be8654f471533d3de226e5a6e7d6fa5", - git_commit = "795f6b8fd73ddfd3a5bec956a15594d11dfb8cc8", + sha256 = "ae74e0e819351b46e8690b61c8f2a25a22775cfc67306c9a5df08c2601a76d06", + git_commit = "82f55545818104a313f5995c5f676f0c62a88717", ) # Import all of TensorFlow Serving's external dependencies. From 9af561d44d641293b97df4f3c2abbeed2681f239 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 20 Jul 2021 12:01:21 -0700 Subject: [PATCH 5228/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d0da079b-8d5e-4046-8b17-c70e21369d65 PiperOrigin-RevId: 385840125 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index be30ee93ad4..74974dfa157 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ae74e0e819351b46e8690b61c8f2a25a22775cfc67306c9a5df08c2601a76d06", - git_commit = "82f55545818104a313f5995c5f676f0c62a88717", + sha256 = "c9d7d02c3d4b69b22d48ff5a6f7d3f05281abeaa3a6d5bdf49174d5faf8ef891", + git_commit = "d182f9f16e800da1b7907946dd9b93bd0f874ced", ) # Import all of TensorFlow Serving's external dependencies. From af4c407f8b21c1cb00e158a443b1245c459786b2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 20 Jul 2021 18:01:22 -0700 Subject: [PATCH 5229/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/325950f2-a75d-4d25-95ca-f932e1f579a4 PiperOrigin-RevId: 385910599 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 74974dfa157..608bc0c6732 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c9d7d02c3d4b69b22d48ff5a6f7d3f05281abeaa3a6d5bdf49174d5faf8ef891", - git_commit = "d182f9f16e800da1b7907946dd9b93bd0f874ced", + sha256 = "2bd2c2122c39e2e14e6023d7d03c63f7179e26fc872408065f4d379925bf937b", + git_commit = "fd891690d4f40c62780513290e6f6188cb28ccbd", ) # Import all of TensorFlow Serving's external dependencies. From 582dec85021a91c3af343a7e3a4d98613d542890 Mon Sep 17 00:00:00 2001 From: David Rim Date: Tue, 20 Jul 2021 18:09:09 -0700 Subject: [PATCH 5230/8103] Allow model batch size to override num_tflite_interpreters_per_pool PiperOrigin-RevId: 385911684 --- tensorflow_serving/servables/tensorflow/BUILD | 2 +- .../tensorflow/tflite_interpreter_pool.h | 1 - .../servables/tensorflow/tflite_session.cc | 27 ++++++++++--- .../servables/tensorflow/tflite_session.h | 5 +++ .../tensorflow/tflite_session_test.cc | 40 ++++++++++++++++--- 5 files changed, 62 insertions(+), 13 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index 036ed2660f1..8f6a340603c 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -379,7 +379,7 @@ cc_test( "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/test_util", "@com_google_absl//absl/flags:flag", - "@com_google_protobuf//:protobuf", + "@com_google_absl//absl/functional:bind_front", "@flatbuffers", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", "@org_tensorflow//tensorflow/core:lib", diff --git a/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h b/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h index 33ea4c8f9c1..884b47da7d8 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h +++ b/tensorflow_serving/servables/tensorflow/tflite_interpreter_pool.h @@ -21,7 +21,6 @@ limitations under the License. #include "absl/base/thread_annotations.h" #include "absl/synchronization/mutex.h" -#include "tensorflow/core/common_runtime/process_util.h" #include "tensorflow/core/framework/tensor.h" #include "tensorflow/core/lib/gtl/array_slice.h" #include "tensorflow/core/platform/cpu_info.h" diff --git a/tensorflow_serving/servables/tensorflow/tflite_session.cc b/tensorflow_serving/servables/tensorflow/tflite_session.cc index 764a74fcc93..25b2cb095ab 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session.cc @@ -23,7 +23,6 @@ limitations under the License. #include "tensorflow/cc/saved_model/signature_constants.h" #include "tensorflow/core/framework/tensor_shape.pb.h" #include "tensorflow/core/framework/tensor_util.h" -#include "tensorflow/core/lib/core/blocking_counter.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/lib/core/notification.h" #include "tensorflow/core/lib/gtl/cleanup.h" @@ -282,6 +281,19 @@ Status SetMiniBatchOutput( return Status::OK(); } +int GetModelBatchSize(const tflite::Model* model) { + const auto* primary_subgraph = model->subgraphs()->Get(0); + const auto* inputs = primary_subgraph->inputs(); + if (inputs->size() == 1) { + // Only models with 1 input tensor can be batched, since SplitTFLiteTask + // only works on a single input tensor jobs. + const int tensor_id = inputs->Get(0); + const auto* tensor = primary_subgraph->tensors()->Get(tensor_id); + return tensor->shape()->Get(0); + } + return -1; +} + } // namespace // Split an input task up into multiple tasks. @@ -388,8 +400,9 @@ Status TfLiteSession::SetScheduler( const SchedulerCreator& scheduler_creator, const BasicBatchScheduler::Options& options) { use_fixed_batch_size_ = true; + scheduler_options_ = options; auto bound_scheduler_creator = absl::bind_front( - &TfLiteSession::CreateDefaultBasicBatchScheduler, options); + &TfLiteSession::CreateDefaultBasicBatchScheduler, scheduler_options_); return bound_scheduler_creator( [this](std::unique_ptr> batch) { this->ProcessBatch(std::move(batch)); @@ -482,7 +495,9 @@ Status TfLiteSession::Create(string&& buffer, const SessionOptions& options, sigdef->set_method_name(kPredictMethodName); } - int num_interpreters = std::max(1, num_pools); + const int num_interpreters = std::max(1, num_pools); + const int model_batch_size = GetModelBatchSize(model->GetModel()); + std::unique_ptr interpreter_pool; TF_RETURN_IF_ERROR( internal::TfLiteInterpreterPool::CreateTfLiteInterpreterPool( @@ -493,10 +508,11 @@ Status TfLiteSession::Create(string&& buffer, const SessionOptions& options, std::move(buffer), std::move(model), std::move(interpreter_pool))); if (num_interpreters_per_pool > 1) { - // Consider replacing with parameters loaded from the tflite model. - const int min_allowed_batch = + const int default_allowed_batch = (internal::kInitialBatchSize + num_interpreters_per_pool - 1) / num_interpreters_per_pool; + const int min_allowed_batch = + model_batch_size > 1 ? model_batch_size : default_allowed_batch; const int max_enqueued_batches = num_interpreters * 100; BasicBatchScheduler::Options scheduler_options; scheduler_options.num_batch_threads = num_interpreters; @@ -505,7 +521,6 @@ Status TfLiteSession::Create(string&& buffer, const SessionOptions& options, scheduler_options.max_execution_batch_size = min_allowed_batch; scheduler_options.max_enqueued_batches = max_enqueued_batches; scheduler_options.split_input_task_func = SplitTfLiteInputTask; - TF_RETURN_IF_ERROR( (*tflite_session) ->SetScheduler(&TfLiteSession::CreateDefaultBasicBatchScheduler, diff --git a/tensorflow_serving/servables/tensorflow/tflite_session.h b/tensorflow_serving/servables/tensorflow/tflite_session.h index 210884680f7..4e1e62ed0f7 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session.h +++ b/tensorflow_serving/servables/tensorflow/tflite_session.h @@ -177,6 +177,10 @@ class TfLiteSession : public ServingSession { const SchedulerCreator& scheduler_creator, const BasicBatchScheduler::Options& options); + BasicBatchScheduler::Options GetSchedulerOptions() { + return scheduler_options_; + } + private: TfLiteSession( std::map&& input_tensor_to_index, @@ -196,6 +200,7 @@ class TfLiteSession : public ServingSession { const std::unique_ptr interpreter_pool_; bool use_fixed_batch_size_; std::unique_ptr> scheduler_; + BasicBatchScheduler::Options scheduler_options_; void ProcessBatch(std::unique_ptr> batch); TF_DISALLOW_COPY_AND_ASSIGN(TfLiteSession); }; diff --git a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc index 084095d52ea..d4d16d06313 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc @@ -19,8 +19,6 @@ limitations under the License. #include #include -#include -#include #include "absl/flags/flag.h" #include "absl/functional/bind_front.h" #include "flatbuffers/flexbuffers.h" @@ -631,20 +629,49 @@ TEST(TfLiteSession, SimpleSignatureDefAndRun) { test::AsTensor({"a", "b", "c", "d"}, TensorShape({2, 2}))); } -TEST(TfLiteSession, TestBatchParallelism) { +using TfLiteSessionBatchSizeTest = ::testing::TestWithParam; +TEST_P(TfLiteSessionBatchSizeTest, TestBatchParallelism) { + const bool use_model_batch_size = GetParam(); std::string model_bytes; TF_ASSERT_OK(ReadFileToString(Env::Default(), test_util::TestSrcDirPath(kParseExampleModel), &model_bytes)); auto model = tflite::FlatBufferModel::BuildFromModel( flatbuffers::GetRoot(model_bytes.data())); + const int model_batch_size = 5; + if (use_model_batch_size) { + const tflite::Model* tflite_model = model->GetModel(); + auto mutable_model = absl::make_unique(); + tflite_model->UnPackTo(mutable_model.get(), nullptr); + ASSERT_EQ(mutable_model->subgraphs.size(), 1); + auto* subgraph = mutable_model->subgraphs[0].get(); + ASSERT_EQ(subgraph->inputs.size(), 1); + auto* tensor = subgraph->tensors[subgraph->inputs[0]].get(); + ASSERT_EQ(tensor->shape.size(), 1); + ASSERT_EQ(tensor->shape[0], 1); + tensor->shape[0] = model_batch_size; + flatbuffers::FlatBufferBuilder builder; + auto packed_model = tflite::Model::Pack(builder, mutable_model.get()); + FinishModelBuffer(builder, packed_model); + model_bytes.assign( + reinterpret_cast(builder.GetBufferPointer()), + builder.GetSize()); + } auto model_signature_def_map = GetTestSignatureDefMap(); ::google::protobuf::Map signatures; std::unique_ptr sess; tensorflow::SessionOptions options; - TF_ASSERT_OK(TfLiteSession::Create(std::move(model_bytes), options, 1, 4, - &sess, &signatures)); + const int num_tflite_interpreters = 4; + + TF_ASSERT_OK(TfLiteSession::Create(std::move(model_bytes), options, 1, + num_tflite_interpreters, &sess, + &signatures)); + auto scheduler_options = sess->GetSchedulerOptions(); const int batch_size = 500; + const int expected_batch_size = use_model_batch_size + ? model_batch_size + : batch_size / num_tflite_interpreters; + ASSERT_EQ(scheduler_options.max_execution_batch_size, expected_batch_size); const float default_value = 0; std::vector example_list; std::vector expected; @@ -690,6 +717,9 @@ TEST(TfLiteSession, TestBatchParallelism) { test::AsTensor(expected_bytes, TensorShape({batch_size, 1}))); } +INSTANTIATE_TEST_SUITE_P(TfLiteSessionBatchSizeTests, + TfLiteSessionBatchSizeTest, ::testing::Bool()); + TEST(TfLiteSession, TestSetScheduler) { std::string model_bytes; TF_ASSERT_OK(ReadFileToString(Env::Default(), From eb9405ae78dc43b008ca19ac5a4814642ac737c3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 21 Jul 2021 00:01:39 -0700 Subject: [PATCH 5231/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8e955fe7-fd94-480f-8bf8-9fffd8b39119 PiperOrigin-RevId: 385949300 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 608bc0c6732..6e2cc97ea5e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2bd2c2122c39e2e14e6023d7d03c63f7179e26fc872408065f4d379925bf937b", - git_commit = "fd891690d4f40c62780513290e6f6188cb28ccbd", + sha256 = "428a9f51aff5bfe94ed3afe19e1e9b6803e92adc88950fd8bec87d393173851e", + git_commit = "28dbdcfa5186ddca24c3b1525fafde6bdbbb7f1f", ) # Import all of TensorFlow Serving's external dependencies. From 50bc2744f9b2fce2737ade14a428af6a2a535ef6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 21 Jul 2021 06:01:30 -0700 Subject: [PATCH 5232/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/43c8562d-dd7c-494d-9ef4-8e1f880e45f0 PiperOrigin-RevId: 385992433 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6e2cc97ea5e..ef36a19df21 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "428a9f51aff5bfe94ed3afe19e1e9b6803e92adc88950fd8bec87d393173851e", - git_commit = "28dbdcfa5186ddca24c3b1525fafde6bdbbb7f1f", + sha256 = "bf7001b049aa60a38fe31c9af0e5e0c9ac472f906f5ac44d38eeeba8a99953a3", + git_commit = "0c13207eeda65754532bab5888cc33693fb06834", ) # Import all of TensorFlow Serving's external dependencies. From e6452dcf33a957e5d39334d201066d0bda86dffe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 21 Jul 2021 12:01:44 -0700 Subject: [PATCH 5233/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/315f47f8-5e7d-4b75-a5e0-7fcd748c1094 PiperOrigin-RevId: 386064140 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ef36a19df21..edae2f19078 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bf7001b049aa60a38fe31c9af0e5e0c9ac472f906f5ac44d38eeeba8a99953a3", - git_commit = "0c13207eeda65754532bab5888cc33693fb06834", + sha256 = "27573040dc266445821b9aa7ddb609dff5d36187e2bfa6b2e8cd75844c40c74d", + git_commit = "47d06e96f423a0f7bc2b41242a43d5764f954777", ) # Import all of TensorFlow Serving's external dependencies. From 0d60d7c4a51f8fa91e6713fa0d963c3251ef3b58 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 22 Jul 2021 00:02:20 -0700 Subject: [PATCH 5234/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c72e550a-abfb-41d7-b496-ccb2c4622bca PiperOrigin-RevId: 386176495 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index edae2f19078..ab9e3b62724 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "27573040dc266445821b9aa7ddb609dff5d36187e2bfa6b2e8cd75844c40c74d", - git_commit = "47d06e96f423a0f7bc2b41242a43d5764f954777", + sha256 = "7d7febffd53ae4c58127b42cb4217a15790abf5b823acf2a28d93aa6908b05ec", + git_commit = "4236939c632a5434800d5aa5686548a63dc2c6d3", ) # Import all of TensorFlow Serving's external dependencies. From 01b3811edef7cecbc20f498f842c05f6814f15c7 Mon Sep 17 00:00:00 2001 From: Li Lao Date: Thu, 22 Jul 2021 23:20:14 -0700 Subject: [PATCH 5235/8103] Change ThreadPoolFactory API so that it can create thread pools not owned by the factory itself. ThreadPoolFactory will now return ScopedThreadPools, which can keep the created thread pools alive as long as the ScopedThreadPools instance is alive. PiperOrigin-RevId: 386394823 --- .../model_servers/prediction_service_impl.cc | 20 +++----- tensorflow_serving/servables/tensorflow/BUILD | 14 ++++++ .../servables/tensorflow/predict_impl.cc | 13 ++--- .../servables/tensorflow/predict_impl_test.cc | 16 +++--- .../test_util/fake_thread_pool_factory.h | 17 +++---- .../tensorflow/thread_pool_factory.cc | 35 +++++++++++++ .../tensorflow/thread_pool_factory.h | 25 +++++++++- .../tensorflow/thread_pool_factory_test.cc | 49 +++++++++++++++++++ 8 files changed, 150 insertions(+), 39 deletions(-) create mode 100644 tensorflow_serving/servables/tensorflow/thread_pool_factory.cc create mode 100644 tensorflow_serving/servables/tensorflow/thread_pool_factory_test.cc diff --git a/tensorflow_serving/model_servers/prediction_service_impl.cc b/tensorflow_serving/model_servers/prediction_service_impl.cc index 376ac910c4b..eeb71e634b0 100644 --- a/tensorflow_serving/model_servers/prediction_service_impl.cc +++ b/tensorflow_serving/model_servers/prediction_service_impl.cc @@ -22,6 +22,7 @@ limitations under the License. #include "tensorflow_serving/servables/tensorflow/get_model_metadata_impl.h" #include "tensorflow_serving/servables/tensorflow/multi_inference_helper.h" #include "tensorflow_serving/servables/tensorflow/regression_service.h" +#include "tensorflow_serving/servables/tensorflow/thread_pool_factory.h" #include "tensorflow_serving/servables/tensorflow/util.h" namespace tensorflow { @@ -35,16 +36,9 @@ int DeadlineToTimeoutMillis(const gpr_timespec deadline) { gpr_now(GPR_CLOCK_MONOTONIC))); } -thread::ThreadPoolOptions GetThreadPoolOptions( - ThreadPoolFactory *thread_pool_factory) { - thread::ThreadPoolOptions thread_pool_options; - if (thread_pool_factory != nullptr) { - thread_pool_options.inter_op_threadpool = - thread_pool_factory->GetInterOpThreadPool(); - thread_pool_options.intra_op_threadpool = - thread_pool_factory->GetIntraOpThreadPool(); - } - return thread_pool_options; +ScopedThreadPools GetThreadPools(ThreadPoolFactory *thread_pool_factory) { + return thread_pool_factory == nullptr ? ScopedThreadPools() + : thread_pool_factory->GetThreadPools(); } } // namespace @@ -99,7 +93,7 @@ ::grpc::Status PredictionServiceImpl::Classify( const ::tensorflow::Status tf_status = TensorflowClassificationServiceImpl::Classify( - run_options, core_, GetThreadPoolOptions(thread_pool_factory_), + run_options, core_, GetThreadPools(thread_pool_factory_).get(), *request, response); const ::grpc::Status status = ToGRPCStatus(tf_status); @@ -128,7 +122,7 @@ ::grpc::Status PredictionServiceImpl::Regress(::grpc::ServerContext *context, const ::tensorflow::Status tf_status = TensorflowRegressionServiceImpl::Regress( - run_options, core_, GetThreadPoolOptions(thread_pool_factory_), + run_options, core_, GetThreadPools(thread_pool_factory_).get(), *request, response); const ::grpc::Status status = ToGRPCStatus(tf_status); @@ -154,7 +148,7 @@ ::grpc::Status PredictionServiceImpl::MultiInference( DeadlineToTimeoutMillis(context->raw_deadline())); } const ::grpc::Status status = ToGRPCStatus(RunMultiInferenceWithServerCore( - run_options, core_, GetThreadPoolOptions(thread_pool_factory_), *request, + run_options, core_, GetThreadPools(thread_pool_factory_).get(), *request, response)); if (!status.ok()) { VLOG(1) << "MultiInference request failed: " << status.error_message(); diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index 8f6a340603c..b271bd23349 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -1054,6 +1054,7 @@ serving_proto_library( cc_library( name = "thread_pool_factory", + srcs = ["thread_pool_factory.cc"], hdrs = ["thread_pool_factory.h"], visibility = [ "//visibility:public", @@ -1063,3 +1064,16 @@ cc_library( "@org_tensorflow//tensorflow/core:lib", ], ) + +cc_test( + name = "thread_pool_factory_test", + size = "small", + srcs = ["thread_pool_factory_test.cc"], + deps = [ + ":thread_pool_factory", + "//tensorflow_serving/core/test_util:test_main", + "//tensorflow_serving/test_util", + "@org_tensorflow//tensorflow/core:lib", + "@org_tensorflow//tensorflow/core/platform:threadpool_options", + ], +) diff --git a/tensorflow_serving/servables/tensorflow/predict_impl.cc b/tensorflow_serving/servables/tensorflow/predict_impl.cc index 5af06a57142..ca5aa9e65ee 100644 --- a/tensorflow_serving/servables/tensorflow/predict_impl.cc +++ b/tensorflow_serving/servables/tensorflow/predict_impl.cc @@ -24,6 +24,7 @@ limitations under the License. #include "tensorflow/core/platform/threadpool_options.h" #include "tensorflow_serving/core/servable_handle.h" #include "tensorflow_serving/servables/tensorflow/predict_util.h" +#include "tensorflow_serving/servables/tensorflow/thread_pool_factory.h" #include "tensorflow_serving/servables/tensorflow/util.h" namespace tensorflow { @@ -48,17 +49,13 @@ Status TensorflowPredictor::PredictWithModelSpec(const RunOptions& run_options, PredictResponse* response) { ServableHandle bundle; TF_RETURN_IF_ERROR(core->GetServableHandle(model_spec, &bundle)); - thread::ThreadPoolOptions thread_pool_options; - if (thread_pool_factory_ != nullptr) { - thread_pool_options.inter_op_threadpool = - thread_pool_factory_->GetInterOpThreadPool(); - thread_pool_options.intra_op_threadpool = - thread_pool_factory_->GetIntraOpThreadPool(); - } return internal::RunPredict( run_options, bundle->meta_graph_def, bundle.id().version, core->predict_response_tensor_serialization_option(), - bundle->session.get(), request, response, thread_pool_options); + bundle->session.get(), request, response, + thread_pool_factory_ == nullptr + ? thread::ThreadPoolOptions() + : thread_pool_factory_->GetThreadPools().get()); } } // namespace serving diff --git a/tensorflow_serving/servables/tensorflow/predict_impl_test.cc b/tensorflow_serving/servables/tensorflow/predict_impl_test.cc index ada3cef1453..64590eef7c3 100644 --- a/tensorflow_serving/servables/tensorflow/predict_impl_test.cc +++ b/tensorflow_serving/servables/tensorflow/predict_impl_test.cc @@ -442,15 +442,17 @@ TEST_F(PredictImplTest, ThreadPoolFactory) { tensor_proto.set_dtype(tensorflow::DT_FLOAT); (*request.mutable_inputs())[kInputTensorKey] = tensor_proto; - test_util::CountingThreadPool inter_op_threadpool(Env::Default(), "InterOp", - /*num_threads=*/1); - test_util::CountingThreadPool intra_op_threadpool(Env::Default(), "IntraOp", - /*num_threads=*/1); + auto inter_op_threadpool = + std::make_shared(Env::Default(), "InterOp", + /*num_threads=*/1); + auto intra_op_threadpool = + std::make_shared(Env::Default(), "IntraOp", + /*num_threads=*/1); test_util::FakeThreadPoolFactoryConfig fake_thread_pool_factory_config; test_util::FakeThreadPoolFactory fake_thread_pool_factory( fake_thread_pool_factory_config); - fake_thread_pool_factory.SetInterOpThreadPool(&inter_op_threadpool); - fake_thread_pool_factory.SetIntraOpThreadPool(&intra_op_threadpool); + fake_thread_pool_factory.SetInterOpThreadPool(inter_op_threadpool); + fake_thread_pool_factory.SetIntraOpThreadPool(intra_op_threadpool); TensorflowPredictor predictor(&fake_thread_pool_factory); TF_EXPECT_OK( @@ -468,7 +470,7 @@ TEST_F(PredictImplTest, ThreadPoolFactory) { EXPECT_THAT(response, test_util::EqualsProto(expected_response)); // The intra_op_threadpool doesn't have anything scheduled. - ASSERT_GE(inter_op_threadpool.NumScheduled(), 1); + ASSERT_GE(inter_op_threadpool->NumScheduled(), 1); } } // namespace diff --git a/tensorflow_serving/servables/tensorflow/test_util/fake_thread_pool_factory.h b/tensorflow_serving/servables/tensorflow/test_util/fake_thread_pool_factory.h index b500b8f8e4f..c78ca438b3a 100644 --- a/tensorflow_serving/servables/tensorflow/test_util/fake_thread_pool_factory.h +++ b/tensorflow_serving/servables/tensorflow/test_util/fake_thread_pool_factory.h @@ -38,23 +38,22 @@ class FakeThreadPoolFactory final : public ThreadPoolFactory { explicit FakeThreadPoolFactory(const FakeThreadPoolFactoryConfig& config) {} virtual ~FakeThreadPoolFactory() = default; - virtual thread::ThreadPoolInterface* GetInterOpThreadPool() { - return inter_op_thread_pool_; - } - virtual thread::ThreadPoolInterface* GetIntraOpThreadPool() { - return intra_op_thread_pool_; + virtual ScopedThreadPools GetThreadPools() { + return ScopedThreadPools(inter_op_thread_pool_, intra_op_thread_pool_); } - void SetInterOpThreadPool(thread::ThreadPoolInterface* thread_pool) { + void SetInterOpThreadPool( + std::shared_ptr thread_pool) { inter_op_thread_pool_ = thread_pool; } - void SetIntraOpThreadPool(thread::ThreadPoolInterface* thread_pool) { + void SetIntraOpThreadPool( + std::shared_ptr thread_pool) { intra_op_thread_pool_ = thread_pool; } private: - thread::ThreadPoolInterface* inter_op_thread_pool_ = nullptr; - thread::ThreadPoolInterface* intra_op_thread_pool_ = nullptr; + std::shared_ptr inter_op_thread_pool_; + std::shared_ptr intra_op_thread_pool_; TF_DISALLOW_COPY_AND_ASSIGN(FakeThreadPoolFactory); }; diff --git a/tensorflow_serving/servables/tensorflow/thread_pool_factory.cc b/tensorflow_serving/servables/tensorflow/thread_pool_factory.cc new file mode 100644 index 00000000000..54e587dceb5 --- /dev/null +++ b/tensorflow_serving/servables/tensorflow/thread_pool_factory.cc @@ -0,0 +1,35 @@ +/* Copyright 2021 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow_serving/servables/tensorflow/thread_pool_factory.h" + +namespace tensorflow { +namespace serving { + +ScopedThreadPools::ScopedThreadPools( + std::shared_ptr inter_op_thread_pool, + std::shared_ptr intra_op_thread_pool) + : inter_op_thread_pool_(std::move(inter_op_thread_pool)), + intra_op_thread_pool_(std::move(intra_op_thread_pool)) {} + +tensorflow::thread::ThreadPoolOptions ScopedThreadPools::get() { + tensorflow::thread::ThreadPoolOptions options; + options.inter_op_threadpool = inter_op_thread_pool_.get(); + options.intra_op_threadpool = intra_op_thread_pool_.get(); + return options; +} + +} // namespace serving +} // namespace tensorflow diff --git a/tensorflow_serving/servables/tensorflow/thread_pool_factory.h b/tensorflow_serving/servables/tensorflow/thread_pool_factory.h index 68a3ffafd30..232f8a2128d 100644 --- a/tensorflow_serving/servables/tensorflow/thread_pool_factory.h +++ b/tensorflow_serving/servables/tensorflow/thread_pool_factory.h @@ -17,18 +17,39 @@ limitations under the License. #define TENSORFLOW_SERVING_SERVABLES_TENSORFLOW_THREAD_POOL_FACTORY_H_ #include "tensorflow/core/platform/threadpool.h" +#include "tensorflow/core/platform/threadpool_options.h" #include "tensorflow_serving/util/class_registration.h" namespace tensorflow { namespace serving { +// This class takes inter- and intra-op thread pools and returns +// tensorflow::thread::ThreadPoolOptions. The thread pools passed to an +// instance of this class will be kept alive for the lifetime of this instance. +class ScopedThreadPools { + public: + // The default constructor will set inter- and intra-op thread pools in the + // ThreadPoolOptions to nullptr, which will be ingored by Tensorflow runtime. + ScopedThreadPools() = default; + ScopedThreadPools( + std::shared_ptr inter_op_thread_pool, + std::shared_ptr intra_op_thread_pool); + ~ScopedThreadPools() = default; + + tensorflow::thread::ThreadPoolOptions get(); + + private: + std::shared_ptr inter_op_thread_pool_; + std::shared_ptr intra_op_thread_pool_; +}; + // Factory for returning intra- and inter-op thread pools to be used by // Tensorflow. class ThreadPoolFactory { public: virtual ~ThreadPoolFactory() = default; - virtual thread::ThreadPoolInterface* GetInterOpThreadPool() = 0; - virtual thread::ThreadPoolInterface* GetIntraOpThreadPool() = 0; + + virtual ScopedThreadPools GetThreadPools() = 0; }; DEFINE_CLASS_REGISTRY(ThreadPoolFactoryRegistry, ThreadPoolFactory); diff --git a/tensorflow_serving/servables/tensorflow/thread_pool_factory_test.cc b/tensorflow_serving/servables/tensorflow/thread_pool_factory_test.cc new file mode 100644 index 00000000000..5b0477430ad --- /dev/null +++ b/tensorflow_serving/servables/tensorflow/thread_pool_factory_test.cc @@ -0,0 +1,49 @@ +/* Copyright 2021 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow_serving/servables/tensorflow/thread_pool_factory.h" + +#include +#include +#include "tensorflow/core/platform/google/env.h" +#include "tensorflow/core/platform/threadpool.h" +#include "tensorflow/core/platform/threadpool_options.h" +#include "tensorflow_serving/test_util/test_util.h" + +namespace tensorflow { +namespace serving { +namespace { + +TEST(ScopedThreadPools, DefaultCtor) { + ScopedThreadPools thread_pools; + EXPECT_EQ(nullptr, thread_pools.get().inter_op_threadpool); + EXPECT_EQ(nullptr, thread_pools.get().intra_op_threadpool); +} + +TEST(ScopedThreadPools, NonDefaultCtor) { + auto inter_op_thread_pool = + std::make_shared(Env::Default(), "InterOp", + /*num_threads=*/1); + auto intra_op_thread_pool = + std::make_shared(Env::Default(), "InterOp", + /*num_threads=*/1); + ScopedThreadPools thread_pools(inter_op_thread_pool, intra_op_thread_pool); + EXPECT_EQ(inter_op_thread_pool.get(), thread_pools.get().inter_op_threadpool); + EXPECT_EQ(intra_op_thread_pool.get(), thread_pools.get().intra_op_threadpool); +} + +} // namespace +} // namespace serving +} // namespace tensorflow From d0c7490a008768be3c7e75bbf19ebd637b558d6a Mon Sep 17 00:00:00 2001 From: Li Lao Date: Fri, 23 Jul 2021 16:01:47 -0700 Subject: [PATCH 5236/8103] Fix wrong header for tensorflow Env. PiperOrigin-RevId: 386549192 --- .../servables/tensorflow/thread_pool_factory_test.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/servables/tensorflow/thread_pool_factory_test.cc b/tensorflow_serving/servables/tensorflow/thread_pool_factory_test.cc index 5b0477430ad..14cc0a7a71f 100644 --- a/tensorflow_serving/servables/tensorflow/thread_pool_factory_test.cc +++ b/tensorflow_serving/servables/tensorflow/thread_pool_factory_test.cc @@ -17,7 +17,7 @@ limitations under the License. #include #include -#include "tensorflow/core/platform/google/env.h" +#include "tensorflow/core/platform/env.h" #include "tensorflow/core/platform/threadpool.h" #include "tensorflow/core/platform/threadpool_options.h" #include "tensorflow_serving/test_util/test_util.h" From c7482d3c3cf89d22d5287bb23a820b22d57e4d25 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 28 Jul 2021 18:01:21 -0700 Subject: [PATCH 5237/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3871e114-1976-4d0d-bb1e-d42d758ac623 PiperOrigin-RevId: 387479764 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ab9e3b62724..a3471848bea 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7d7febffd53ae4c58127b42cb4217a15790abf5b823acf2a28d93aa6908b05ec", - git_commit = "4236939c632a5434800d5aa5686548a63dc2c6d3", + sha256 = "cb1a02f9045d06dfe7799214eecc9527ab996899f7906881d7a1df021e93abe3", + git_commit = "901863b6ae95c41e6481710c9d25ae30f962d5ba", ) # Import all of TensorFlow Serving's external dependencies. From 1f3301336cd7e8021e46147ce408ca91b9398d78 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 29 Jul 2021 00:01:30 -0700 Subject: [PATCH 5238/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3e81d3ef-4cf6-4799-b890-2b947f48f3f5 PiperOrigin-RevId: 387523203 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a3471848bea..6fbe1e0740b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cb1a02f9045d06dfe7799214eecc9527ab996899f7906881d7a1df021e93abe3", - git_commit = "901863b6ae95c41e6481710c9d25ae30f962d5ba", + sha256 = "c6398d1de7b848462d1b18decc46a92c3ab4eeb630cdc0cc3401fb9c9fbf6862", + git_commit = "69d2e569b12fb202b696cbb73ed7c0b76743cbe3", ) # Import all of TensorFlow Serving's external dependencies. From 0c0b30d7e3b89bacbfa43f8cb03aa679ca652ba9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 29 Jul 2021 06:01:31 -0700 Subject: [PATCH 5239/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5d7a04d2-53ae-44a0-b119-3a71ea51700d PiperOrigin-RevId: 387566262 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6fbe1e0740b..df8859dff60 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c6398d1de7b848462d1b18decc46a92c3ab4eeb630cdc0cc3401fb9c9fbf6862", - git_commit = "69d2e569b12fb202b696cbb73ed7c0b76743cbe3", + sha256 = "bff528f344c1e6ad609db194af7134443916026419c5e47cf9a3131baffdadbb", + git_commit = "7b42a9b5fa76e72fc8501dfca7202dc4c95aa5b3", ) # Import all of TensorFlow Serving's external dependencies. From d14419f4d1da32ad1c38a1d24baad60bca94ce51 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 29 Jul 2021 12:01:31 -0700 Subject: [PATCH 5240/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d11be17d-9d7a-473b-b07c-b10282ed9321 PiperOrigin-RevId: 387637329 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index df8859dff60..474529b1bec 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bff528f344c1e6ad609db194af7134443916026419c5e47cf9a3131baffdadbb", - git_commit = "7b42a9b5fa76e72fc8501dfca7202dc4c95aa5b3", + sha256 = "c5127238363177d3d606fc38eb56d9d35d27555196ffd2f90f62d31e948c29fc", + git_commit = "7bd42f80d4f403b073992e3df127ce910586c963", ) # Import all of TensorFlow Serving's external dependencies. From 3933f876de48d4ee277eb8c935126078a581cfb0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 29 Jul 2021 18:01:25 -0700 Subject: [PATCH 5241/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e12983ef-666d-4f45-bb04-0bef9d655e95 PiperOrigin-RevId: 387709350 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 474529b1bec..e634f35f4c6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c5127238363177d3d606fc38eb56d9d35d27555196ffd2f90f62d31e948c29fc", - git_commit = "7bd42f80d4f403b073992e3df127ce910586c963", + sha256 = "97052880646d8275140a4ec615ca23d2cd1c5a4496004c83e43e5ad1237ccc81", + git_commit = "a6e0220188bd7843f9768cad5617e370531a0414", ) # Import all of TensorFlow Serving's external dependencies. From 72b0767f8891ab59956d12f015aafd5fb32ad627 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 30 Jul 2021 00:01:38 -0700 Subject: [PATCH 5242/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/321cf828-169d-4ac7-bfc3-ebbff733a174 PiperOrigin-RevId: 387747600 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e634f35f4c6..906e4af32e8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "97052880646d8275140a4ec615ca23d2cd1c5a4496004c83e43e5ad1237ccc81", - git_commit = "a6e0220188bd7843f9768cad5617e370531a0414", + sha256 = "47d519a1288102e1951470bddb56ee0ceac6a96ec4a9210a0bcb7c4689a8c2d6", + git_commit = "e2d02090eee41ecdcd22631ccb2947ef16114288", ) # Import all of TensorFlow Serving's external dependencies. From e5fc80dc0fb03bbd37d44b34c12d5f4ec5c864e3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 30 Jul 2021 12:01:15 -0700 Subject: [PATCH 5243/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/47cb6858-bc6b-4492-b846-0c2acc26f41d PiperOrigin-RevId: 387853902 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 906e4af32e8..16ee65b33c6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "47d519a1288102e1951470bddb56ee0ceac6a96ec4a9210a0bcb7c4689a8c2d6", - git_commit = "e2d02090eee41ecdcd22631ccb2947ef16114288", + sha256 = "e8b59a3bfeb7f2a197fd2cda3ef7700cc43462c8740b3d7563542266b203ed07", + git_commit = "1e1b68f68d180245dad6c55de9c0cc423f24cef7", ) # Import all of TensorFlow Serving's external dependencies. From b7b21d4fd24da36c3a8f0a4191e5a971079acaee Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 30 Jul 2021 18:01:31 -0700 Subject: [PATCH 5244/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/666b725a-23f9-4367-a428-73b623dde559 PiperOrigin-RevId: 387917496 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 16ee65b33c6..ecb8299798c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e8b59a3bfeb7f2a197fd2cda3ef7700cc43462c8740b3d7563542266b203ed07", - git_commit = "1e1b68f68d180245dad6c55de9c0cc423f24cef7", + sha256 = "698454531fb2eb38c9932d7c60c6c094dccd8ccf56572d70f41f5e3d277aecf1", + git_commit = "8e56b27954e437f568d21bef7ca4d9a8be9f5266", ) # Import all of TensorFlow Serving's external dependencies. From 7a1965e7ca24a403e7c2083480108ca54d5e1805 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 31 Jul 2021 00:01:34 -0700 Subject: [PATCH 5245/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b3bba0ae-a64a-466d-b526-d642b739144a PiperOrigin-RevId: 387949420 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ecb8299798c..593035af641 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "698454531fb2eb38c9932d7c60c6c094dccd8ccf56572d70f41f5e3d277aecf1", - git_commit = "8e56b27954e437f568d21bef7ca4d9a8be9f5266", + sha256 = "31484ba9a49c5f7f19bd08cad89cd3d8bd252c2ad443de3f04ef0df54e7305e4", + git_commit = "1ef3a716cacafc1734ac35d07d96da5877208a57", ) # Import all of TensorFlow Serving's external dependencies. From 66b04487672205f209b5a6f7af413ce0445bc7ac Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 31 Jul 2021 06:01:41 -0700 Subject: [PATCH 5246/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/21c253d7-eecf-4bc1-9150-dc294807f151 PiperOrigin-RevId: 387976305 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 593035af641..194d9ca6662 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "31484ba9a49c5f7f19bd08cad89cd3d8bd252c2ad443de3f04ef0df54e7305e4", - git_commit = "1ef3a716cacafc1734ac35d07d96da5877208a57", + sha256 = "4a438fa4ff7e79793182ca3990e5ef38b7bf2dd4bdf2787c66755a371012492d", + git_commit = "a994ba5e9eff713ad9617db23aa024e27a843c34", ) # Import all of TensorFlow Serving's external dependencies. From 2a5119deffd2983e70364d5b4c7b8db7c17b20db Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 31 Jul 2021 18:01:26 -0700 Subject: [PATCH 5247/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6e30f84f-bfaf-4562-9ed9-3e9a6b650e3b PiperOrigin-RevId: 388026418 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 194d9ca6662..fafc5e3bf86 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4a438fa4ff7e79793182ca3990e5ef38b7bf2dd4bdf2787c66755a371012492d", - git_commit = "a994ba5e9eff713ad9617db23aa024e27a843c34", + sha256 = "0e091fcf4a98b6ef25b1f483206d83d87004ed15e81e02bac2e5d81f0781dc7e", + git_commit = "664cc27f8bbc09f20ecd6d189a0427f073157595", ) # Import all of TensorFlow Serving's external dependencies. From e99da93bb1d60c3cce6be95bb66f61cfe7858f0e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 1 Aug 2021 00:01:44 -0700 Subject: [PATCH 5248/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7b33a814-e39d-4c0b-9cd4-f2bf89e0525c PiperOrigin-RevId: 388050375 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fafc5e3bf86..5e8b59caac4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0e091fcf4a98b6ef25b1f483206d83d87004ed15e81e02bac2e5d81f0781dc7e", - git_commit = "664cc27f8bbc09f20ecd6d189a0427f073157595", + sha256 = "cfc538ce4098a074eb2468d8be47de365100aca3b3512df33e2352666120e108", + git_commit = "e5e989b8e20ba909c7233b06e659148486969ea2", ) # Import all of TensorFlow Serving's external dependencies. From cad3e9dfda86ce80f46e7bfa2207283b59d6d158 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 1 Aug 2021 06:01:28 -0700 Subject: [PATCH 5249/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1fddde21-a333-4098-992d-7dd60252aef2 PiperOrigin-RevId: 388076065 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5e8b59caac4..f6f4b35778a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cfc538ce4098a074eb2468d8be47de365100aca3b3512df33e2352666120e108", - git_commit = "e5e989b8e20ba909c7233b06e659148486969ea2", + sha256 = "064a0a2f8841f12dc6f06d07a572a1452896dd5e989eec290645c34bc56d208d", + git_commit = "ae940c5d8620e74c5e7cd867e91a1e31aa50417e", ) # Import all of TensorFlow Serving's external dependencies. From 755abc72aa741b2b2f396bf4a0401182637a263f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 1 Aug 2021 12:01:21 -0700 Subject: [PATCH 5250/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e6d20c66-c6c8-4dae-a991-a85969203116 PiperOrigin-RevId: 388099582 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f6f4b35778a..e176e614646 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "064a0a2f8841f12dc6f06d07a572a1452896dd5e989eec290645c34bc56d208d", - git_commit = "ae940c5d8620e74c5e7cd867e91a1e31aa50417e", + sha256 = "daa02d88a85b05149cd40e74b80a6fe42cf03761b5d278e5c5672c691d4cd4ae", + git_commit = "38028d2c5c55ed64916251274041339138f69285", ) # Import all of TensorFlow Serving's external dependencies. From b3fde3a90779dd70b1648a5acec97d6276319648 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 1 Aug 2021 18:01:23 -0700 Subject: [PATCH 5251/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1828c9b4-baeb-4848-8a2e-bcf69f9a4a46 PiperOrigin-RevId: 388125331 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e176e614646..3a5b7a55854 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "daa02d88a85b05149cd40e74b80a6fe42cf03761b5d278e5c5672c691d4cd4ae", - git_commit = "38028d2c5c55ed64916251274041339138f69285", + sha256 = "80f0cfa5da106decf1ec9ea9a251850c628a7f4d2f476ff9a1be4931ebf35b7f", + git_commit = "9f059ac876d9dbc7b4cd75583f03a74ca9d2fab9", ) # Import all of TensorFlow Serving's external dependencies. From 537f10301d15e86271f78afc777560e739b1bbf5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 2 Aug 2021 00:01:33 -0700 Subject: [PATCH 5252/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e91525a4-1122-42c2-bd88-cf9e4a2cdba9 PiperOrigin-RevId: 388157407 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3a5b7a55854..286e397bee4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "80f0cfa5da106decf1ec9ea9a251850c628a7f4d2f476ff9a1be4931ebf35b7f", - git_commit = "9f059ac876d9dbc7b4cd75583f03a74ca9d2fab9", + sha256 = "5d941518f93eb0fbfb56312f6f32b096ac769068504ff103df582304c86b3a17", + git_commit = "b1b4548b3e37c245d7de671aae5b827abde9ba29", ) # Import all of TensorFlow Serving's external dependencies. From ad08f48f70a6e2a4ed0123a39314a367c2377a9e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 2 Aug 2021 09:47:27 -0700 Subject: [PATCH 5253/8103] Update benchmarks to newer API. PiperOrigin-RevId: 388240554 --- .../tensorflow/bundle_factory_util_test.cc | 5 ++--- .../tensorflow/tflite_session_test.cc | 22 ++++++++----------- .../util/fast_read_dynamic_ptr_benchmark.cc | 5 +++-- 3 files changed, 14 insertions(+), 18 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc b/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc index 915b7c65a33..21c9d2c1059 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc @@ -150,7 +150,7 @@ TEST_F(BundleFactoryUtilTest, EstimateResourceFromPathWithGoodExport) { void BM_HalfPlusTwo(benchmark::State& state) { static Session* session; - if (state.thread_index() == 0) { + if (state.thread_index == 0) { SavedModelBundle bundle; TF_ASSERT_OK(LoadSavedModel(SessionOptions(), RunOptions(), test_util::GetTestSavedModelPath(), {"serve"}, @@ -160,13 +160,12 @@ void BM_HalfPlusTwo(benchmark::State& state) { } Tensor input = test::AsTensor({1.0, 2.0, 3.0}, TensorShape({3})); std::vector outputs; - testing::UseRealTime(); for (auto _ : state) { outputs.clear(); TF_ASSERT_OK(session->Run({{"x:0", input}}, {"y:0"}, {}, &outputs)); } } -BENCHMARK(BM_HalfPlusTwo)->ThreadRange(1, 64); +BENCHMARK(BM_HalfPlusTwo)->UseRealTime()->ThreadRange(1, 64); #endif // PLATFORM_GOOGLE diff --git a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc index d4d16d06313..265b2eaf118 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc @@ -813,7 +813,7 @@ TEST(TfLiteSession, TestSetScheduler) { static void BM_Reshape(benchmark::State& state, bool use_flex_op) { static TfLiteSession* session; - if (state.thread_index() == 0) { + if (state.thread_index == 0) { auto model_signature_def_map = GetTestSignatureDefMap(); string model_bytes = BuildTestModel(tflite::TensorType_INT32, use_flex_op, &model_signature_def_map); @@ -828,7 +828,6 @@ static void BM_Reshape(benchmark::State& state, bool use_flex_op) { Tensor input = test::AsTensor({1, 2, 3, 4, 5, 6}, TensorShape({6})); Tensor input_shape = test::AsTensor({3, 2}, TensorShape({2})); std::vector outputs; - testing::UseRealTime(); for (auto _ : state) { outputs.clear(); TF_ASSERT_OK(session->Run( @@ -840,16 +839,16 @@ static void BM_Reshape(benchmark::State& state, bool use_flex_op) { static void BM_Reshape_Builtin(benchmark::State& state) { BM_Reshape(state, /*use_flex_op=*/false); } -BENCHMARK(BM_Reshape_Builtin)->ThreadRange(1, 64); +BENCHMARK(BM_Reshape_Builtin)->UseRealTime()->ThreadRange(1, 64); static void BM_Reshape_Flex(benchmark::State& state) { BM_Reshape(state, /*use_flex_op=*/true); } -BENCHMARK(BM_Reshape_Flex)->ThreadRange(1, 64); +BENCHMARK(BM_Reshape_Flex)->UseRealTime()->ThreadRange(1, 64); void BM_HalfPlusTwo(benchmark::State& state) { static TfLiteSession* session; - if (state.thread_index() == 0) { + if (state.thread_index == 0) { string model_bytes; TF_ASSERT_OK(ReadFileToString( Env::Default(), test_util::TestSrcDirPath(kTestModel), &model_bytes)); @@ -863,17 +862,16 @@ void BM_HalfPlusTwo(benchmark::State& state) { } Tensor input = test::AsTensor({1.0, 2.0, 3.0}, TensorShape({3})); std::vector outputs; - testing::UseRealTime(); for (auto _ : state) { outputs.clear(); TF_ASSERT_OK(session->Run({{"x", input}}, {"y"}, {}, &outputs)); } } -BENCHMARK(BM_HalfPlusTwo)->ThreadRange(1, 64); +BENCHMARK(BM_HalfPlusTwo)->UseRealTime()->ThreadRange(1, 64); void BM_MobileNet(benchmark::State& state) { static TfLiteSession* session; - if (state.thread_index() == 0) { + if (state.thread_index == 0) { string model_bytes; TF_ASSERT_OK(ReadFileToString(Env::Default(), test_util::TestSrcDirPath(kMobileNetModel), @@ -889,18 +887,17 @@ void BM_MobileNet(benchmark::State& state) { std::vector x_data(1 * 224 * 224 * 3, 1); Tensor x = test::AsTensor(x_data, TensorShape({1, 224, 224, 3})); std::vector outputs; - testing::UseRealTime(); for (auto _ : state) { outputs.clear(); TF_ASSERT_OK(session->Run( {{"input", x}}, {"MobilenetV1/Predictions/Reshape_1"}, {}, &outputs)); } } -BENCHMARK(BM_MobileNet)->ThreadRange(1, 64); +BENCHMARK(BM_MobileNet)->UseRealTime()->ThreadRange(1, 64); void BM_ParseExample(benchmark::State& state) { static TfLiteSession* session; - if (state.thread_index() == 0) { + if (state.thread_index == 0) { string model_bytes; TF_ASSERT_OK(ReadFileToString(Env::Default(), test_util::TestSrcDirPath(kParseExampleModel), @@ -933,7 +930,6 @@ void BM_ParseExample(benchmark::State& state) { Tensor input_batch = test::AsTensor(example_list, TensorShape({kBatchSize})); std::vector outputs; - testing::UseRealTime(); for (auto _ : state) { outputs.clear(); TF_ASSERT_OK(session->Run( @@ -942,7 +938,7 @@ void BM_ParseExample(benchmark::State& state) { &outputs)); } } -BENCHMARK(BM_ParseExample)->ThreadRange(1, 64); +BENCHMARK(BM_ParseExample)->UseRealTime()->ThreadRange(1, 64); #endif // PLATFORM_GOOGLE diff --git a/tensorflow_serving/util/fast_read_dynamic_ptr_benchmark.cc b/tensorflow_serving/util/fast_read_dynamic_ptr_benchmark.cc index c6f7514d276..08b6adcaa8c 100644 --- a/tensorflow_serving/util/fast_read_dynamic_ptr_benchmark.cc +++ b/tensorflow_serving/util/fast_read_dynamic_ptr_benchmark.cc @@ -182,7 +182,8 @@ void BenchmarkState::RunBenchmarkReadIterations( pool.Schedule(run_reads_fn); } state.ResumeTiming(); - all_read_threads_scheduled_.Notify(); + if (!all_read_threads_scheduled_.HasBeenNotified()) + all_read_threads_scheduled_.Notify(); // Note that destructing the threadpool blocks on completion of all // scheduled execution. This is intentional as we want all threads to @@ -190,7 +191,7 @@ void BenchmarkState::RunBenchmarkReadIterations( // done == iters * num_threads) and includes time scheduling work on the // threads. } - testing::ItemsProcessed(num_threads * kSubIters * state.iterations()); + state.SetItemsProcessed(num_threads * kSubIters * state.iterations()); } void BenchmarkReadsAndUpdates(int update_micros, bool do_work, From 844ff1c1cc163d060ce008ca15e2651c3bac06fc Mon Sep 17 00:00:00 2001 From: Chao Xie Date: Mon, 2 Aug 2021 12:35:54 -0700 Subject: [PATCH 5254/8103] Make Internal Change. PiperOrigin-RevId: 388279837 --- .../servables/tensorflow/predict_util.cc | 91 +++++++++---------- .../servables/tensorflow/predict_util.h | 16 ++++ 2 files changed, 60 insertions(+), 47 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/predict_util.cc b/tensorflow_serving/servables/tensorflow/predict_util.cc index 72589d1f18a..79cf0b597d2 100644 --- a/tensorflow_serving/servables/tensorflow/predict_util.cc +++ b/tensorflow_serving/servables/tensorflow/predict_util.cc @@ -68,8 +68,50 @@ Status VerifyRequestInputsSize(const SignatureDef& signature, return Status::OK(); } -// Validate a SignatureDef to make sure it's compatible with prediction, and -// if so, populate the input and output tensor names. +} // namespace + +namespace internal { +Status RunPredict( + const RunOptions& run_options, const MetaGraphDef& meta_graph_def, + const absl::optional& servable_version, + const internal::PredictResponseTensorSerializationOption option, + Session* session, const PredictRequest& request, PredictResponse* response, + const thread::ThreadPoolOptions& thread_pool_options) { + // Validate signatures. + const string signature_name = request.model_spec().signature_name().empty() + ? kDefaultServingSignatureDefKey + : request.model_spec().signature_name(); + auto iter = meta_graph_def.signature_def().find(signature_name); + if (iter == meta_graph_def.signature_def().end()) { + return errors::FailedPrecondition(strings::StrCat( + "Serving signature key \"", signature_name, "\" not found.")); + } + const SignatureDef& signature = iter->second; + + MakeModelSpec(request.model_spec().name(), signature_name, servable_version, + response->mutable_model_spec()); + + std::vector> input_tensors; + std::vector output_tensor_names; + std::vector output_tensor_aliases; + TF_RETURN_IF_ERROR(PreProcessPrediction(signature, request, &input_tensors, + &output_tensor_names, + &output_tensor_aliases)); + std::vector outputs; + RunMetadata run_metadata; + const uint64 start_microseconds = EnvTime::NowMicros(); + TF_RETURN_IF_ERROR(session->Run(run_options, input_tensors, + output_tensor_names, {}, &outputs, + &run_metadata, thread_pool_options)); + const uint64 end_microseconds = EnvTime::NowMicros(); + RecordRuntimeLatency(request.model_spec().name(), /*api=*/"Predict", + /*runtime=*/"TF1", + end_microseconds - start_microseconds); + + return PostProcessPredictionResult(output_tensor_aliases, outputs, option, + response); +} + Status PreProcessPrediction(const SignatureDef& signature, const PredictRequest& request, std::vector>* inputs, @@ -129,8 +171,6 @@ Status PreProcessPrediction(const SignatureDef& signature, return Status::OK(); } -// Validate results and populate a PredictResponse. -// Tensors are serialized as specified. Status PostProcessPredictionResult( const std::vector& output_tensor_aliases, const std::vector& output_tensors, @@ -159,49 +199,6 @@ Status PostProcessPredictionResult( return Status::OK(); } -} // namespace - -namespace internal { -Status RunPredict( - const RunOptions& run_options, const MetaGraphDef& meta_graph_def, - const absl::optional& servable_version, - const internal::PredictResponseTensorSerializationOption option, - Session* session, const PredictRequest& request, PredictResponse* response, - const thread::ThreadPoolOptions& thread_pool_options) { - // Validate signatures. - const string signature_name = request.model_spec().signature_name().empty() - ? kDefaultServingSignatureDefKey - : request.model_spec().signature_name(); - auto iter = meta_graph_def.signature_def().find(signature_name); - if (iter == meta_graph_def.signature_def().end()) { - return errors::FailedPrecondition(strings::StrCat( - "Serving signature key \"", signature_name, "\" not found.")); - } - const SignatureDef& signature = iter->second; - - MakeModelSpec(request.model_spec().name(), signature_name, servable_version, - response->mutable_model_spec()); - - std::vector> input_tensors; - std::vector output_tensor_names; - std::vector output_tensor_aliases; - TF_RETURN_IF_ERROR(PreProcessPrediction(signature, request, &input_tensors, - &output_tensor_names, - &output_tensor_aliases)); - std::vector outputs; - RunMetadata run_metadata; - const uint64 start_microseconds = EnvTime::NowMicros(); - TF_RETURN_IF_ERROR(session->Run(run_options, input_tensors, - output_tensor_names, {}, &outputs, - &run_metadata, thread_pool_options)); - const uint64 end_microseconds = EnvTime::NowMicros(); - RecordRuntimeLatency(request.model_spec().name(), /*api=*/"Predict", - /*runtime=*/"TF1", - end_microseconds - start_microseconds); - - return PostProcessPredictionResult(output_tensor_aliases, outputs, option, - response); -} } // namespace internal Status RunPredict(const RunOptions& run_options, diff --git a/tensorflow_serving/servables/tensorflow/predict_util.h b/tensorflow_serving/servables/tensorflow/predict_util.h index f34c0bfdf4d..0fb912f0863 100644 --- a/tensorflow_serving/servables/tensorflow/predict_util.h +++ b/tensorflow_serving/servables/tensorflow/predict_util.h @@ -40,6 +40,22 @@ Status RunPredict( const thread::ThreadPoolOptions& thread_pool_options = thread::ThreadPoolOptions()); +// Validate a SignatureDef to make sure it's compatible with prediction, and +// if so, populate the input and output tensor names. +Status PreProcessPrediction(const SignatureDef& signature, + const PredictRequest& request, + std::vector>* inputs, + std::vector* output_tensor_names, + std::vector* output_tensor_aliases); + +// Validate results and populate a PredictResponse. +// Tensors are serialized as specified. +Status PostProcessPredictionResult( + const std::vector& output_tensor_aliases, + const std::vector& output_tensors, + const internal::PredictResponseTensorSerializationOption option, + PredictResponse* response); + } // namespace internal // Implementation of Predict using the SavedModel SignatureDef format. From b18406bf36a999a4409271a617f20f74cc1239ca Mon Sep 17 00:00:00 2001 From: Christina Sorokin Date: Mon, 2 Aug 2021 18:10:43 -0700 Subject: [PATCH 5255/8103] Fix aspired_versions_manager_benchmark test failure - eliminate redundant notification PiperOrigin-RevId: 388348009 --- .../core/aspired_versions_manager_benchmark.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tensorflow_serving/core/aspired_versions_manager_benchmark.cc b/tensorflow_serving/core/aspired_versions_manager_benchmark.cc index d26e6afe4f8..df94196b618 100644 --- a/tensorflow_serving/core/aspired_versions_manager_benchmark.cc +++ b/tensorflow_serving/core/aspired_versions_manager_benchmark.cc @@ -218,7 +218,8 @@ void BenchmarkState::RunBenchmark(::testing::benchmark::State& state, pool->Schedule(run_reads_fn); } state.ResumeTiming(); - all_read_threads_scheduled_.Notify(); + if (!all_read_threads_scheduled_.HasBeenNotified()) + all_read_threads_scheduled_.Notify(); // Note that destructing the threadpool blocks on completion of all // scheduled execution. This is intentional as we want all threads to @@ -356,9 +357,8 @@ void BM_GetServableHandle(::testing::benchmark::State& state) { // Ratio of requests which are asking for the latest servable as opposed to a // specific version. constexpr float kLatestRatio = 0.8; - static const std::vector& requests = []() { - std::unique_ptr> requests( - new std::vector()); + static const std::vector* requests = []() { + std::vector* requests(new std::vector()); random::PhiloxRandom philox(testing::RandomSeed()); random::SimplePhilox random(&philox); for (int i = 0; i < kNumRequests; ++i) { @@ -371,14 +371,14 @@ void BM_GetServableHandle(::testing::benchmark::State& state) { requests->push_back(ServableRequest::Latest(name)); } } - return *requests.release(); + return requests; }(); ServableHandle handle; int i = 0; for (auto s : state) { const Status status = - manager->GetServableHandle(requests[i % kNumRequests], &handle); + manager->GetServableHandle(requests->at(i % kNumRequests), &handle); TF_CHECK_OK(status) << status; ++i; } From 5c6be5dc2b157f521c193c4536260d28bce61b39 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 4 Aug 2021 11:51:04 -0700 Subject: [PATCH 5256/8103] Make tensorflow_serving's test_main behave similarly to tensorflow/core's test_main, except that the serving's test_main cannot access the benchmark library functions directly. Therefore it has to use wrappers. PiperOrigin-RevId: 388749114 --- .../core/test_util/test_main.cc | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/tensorflow_serving/core/test_util/test_main.cc b/tensorflow_serving/core/test_util/test_main.cc index 8a0741d59ec..3b718a68423 100644 --- a/tensorflow_serving/core/test_util/test_main.cc +++ b/tensorflow_serving/core/test_util/test_main.cc @@ -24,21 +24,39 @@ limitations under the License. #if defined(PLATFORM_GOOGLE) || defined(__ANDROID__) // main() is supplied by gunit_main #else +#include +#include + #include "gtest/gtest.h" +#include "absl/strings/match.h" #include "tensorflow/core/lib/strings/str_util.h" +#include "tensorflow/core/platform/stacktrace_handler.h" +#include "tensorflow/core/platform/test.h" #include "tensorflow/core/platform/test_benchmark.h" GTEST_API_ int main(int argc, char** argv) { std::cout << "Running main() from test_main.cc\n"; - testing::InitGoogleTest(&argc, argv); + tensorflow::testing::InstallStacktraceHandler(); + for (int i = 1; i < argc; i++) { - if (tensorflow::str_util::StartsWith(argv[i], "--benchmarks=")) { - const char* pattern = argv[i] + strlen("--benchmarks="); - tensorflow::testing::Benchmark::Run(pattern); + if (absl::StartsWith(argv[i], "--benchmark_filter=")) { + tensorflow::testing::InitializeBenchmarks(&argc, argv); + + // XXX: Must be called after benchmark's init because + // InitGoogleTest eventually calls absl::ParseCommandLine() which would + // complain that benchmark_filter flag is not known because that flag is + // defined by the benchmark library via its own command-line flag + // facility, which is not known to absl flags. + // FIXME(b/195442215): Fix this mess once we make benchmark use absl flags + testing::InitGoogleTest(&argc, argv); + tensorflow::testing::RunBenchmarks(); return 0; } } + + testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } + #endif From 490138352ae963ab0e11f5f58abd00edeb5f063f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 4 Aug 2021 18:01:44 -0700 Subject: [PATCH 5257/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/44d24b00-f771-47cd-b4d0-4abebacb7b21 PiperOrigin-RevId: 388826814 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 286e397bee4..b61b460cc3a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5d941518f93eb0fbfb56312f6f32b096ac769068504ff103df582304c86b3a17", - git_commit = "b1b4548b3e37c245d7de671aae5b827abde9ba29", + sha256 = "db1ac7c92b32976ef4adb254fb5381525bad6057719a9c215633cf5659bc1589", + git_commit = "39993fd10e4891b4deb9645ff527b94e87e4f950", ) # Import all of TensorFlow Serving's external dependencies. From 40f62812aa21e60a3a4f733a76453ac03fc50a56 Mon Sep 17 00:00:00 2001 From: Faizan Muhammad Date: Wed, 4 Aug 2021 23:27:00 -0700 Subject: [PATCH 5258/8103] Remove dependency on TF error code string Unblock tensorflow::Status to match absl::Status by sharing the same string representations PiperOrigin-RevId: 388865011 --- .../servables/tensorflow/classifier_test.cc | 24 +++++++++---------- .../servables/tensorflow/regressor_test.cc | 24 +++++++++---------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/classifier_test.cc b/tensorflow_serving/servables/tensorflow/classifier_test.cc index aa7eada02ca..056e1ad5461 100644 --- a/tensorflow_serving/servables/tensorflow/classifier_test.cc +++ b/tensorflow_serving/servables/tensorflow/classifier_test.cc @@ -757,15 +757,15 @@ TEST_P(ClassifierTest, EmptyInput) { request_.mutable_input(); Status status = classifier_->Classify(request_, &result_); ASSERT_FALSE(status.ok()); - EXPECT_THAT(status.ToString(), - ::testing::HasSubstr("Invalid argument: Input is empty")); + EXPECT_EQ(status.code(), error::Code::INVALID_ARGUMENT); + EXPECT_THAT(status.error_message(), ::testing::HasSubstr("Input is empty")); ClassificationResponse response; status = RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, fake_session_, request_, &response); ASSERT_FALSE(status.ok()); - EXPECT_THAT(status.ToString(), - ::testing::HasSubstr("Invalid argument: Input is empty")); + EXPECT_EQ(status.code(), error::Code::INVALID_ARGUMENT); + EXPECT_THAT(status.error_message(), ::testing::HasSubstr("Input is empty")); } TEST_P(ClassifierTest, EmptyExampleList) { @@ -774,15 +774,15 @@ TEST_P(ClassifierTest, EmptyExampleList) { request_.mutable_input()->mutable_example_list(); Status status = classifier_->Classify(request_, &result_); ASSERT_FALSE(status.ok()); - EXPECT_THAT(status.ToString(), - ::testing::HasSubstr("Invalid argument: Input is empty")); + EXPECT_EQ(status.code(), error::Code::INVALID_ARGUMENT); + EXPECT_THAT(status.error_message(), ::testing::HasSubstr("Input is empty")); ClassificationResponse response; status = RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, fake_session_, request_, &response); ASSERT_FALSE(status.ok()); - EXPECT_THAT(status.ToString(), - ::testing::HasSubstr("Invalid argument: Input is empty")); + EXPECT_EQ(status.code(), error::Code::INVALID_ARGUMENT); + EXPECT_THAT(status.error_message(), ::testing::HasSubstr("Input is empty")); } TEST_P(ClassifierTest, EmptyExampleListWithContext) { @@ -793,15 +793,15 @@ TEST_P(ClassifierTest, EmptyExampleListWithContext) { ->mutable_context() = example({{"dos", 2}}); Status status = classifier_->Classify(request_, &result_); ASSERT_FALSE(status.ok()); - EXPECT_THAT(status.ToString(), - ::testing::HasSubstr("Invalid argument: Input is empty")); + EXPECT_EQ(status.code(), error::Code::INVALID_ARGUMENT); + EXPECT_THAT(status.error_message(), ::testing::HasSubstr("Input is empty")); ClassificationResponse response; status = RunClassify(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, fake_session_, request_, &response); ASSERT_FALSE(status.ok()); - EXPECT_THAT(status.ToString(), - ::testing::HasSubstr("Invalid argument: Input is empty")); + EXPECT_EQ(status.code(), error::Code::INVALID_ARGUMENT); + EXPECT_THAT(status.error_message(), ::testing::HasSubstr("Input is empty")); } TEST_P(ClassifierTest, RunsFails) { diff --git a/tensorflow_serving/servables/tensorflow/regressor_test.cc b/tensorflow_serving/servables/tensorflow/regressor_test.cc index 3261a3d9de3..f35d7ee789f 100644 --- a/tensorflow_serving/servables/tensorflow/regressor_test.cc +++ b/tensorflow_serving/servables/tensorflow/regressor_test.cc @@ -411,14 +411,14 @@ TEST_P(RegressorTest, EmptyInput) { request_.mutable_input(); Status status = regressor_->Regress(request_, &result_); ASSERT_FALSE(status.ok()); - EXPECT_THAT(status.ToString(), - ::testing::HasSubstr("Invalid argument: Input is empty")); + EXPECT_EQ(status.code(), error::Code::INVALID_ARGUMENT); + EXPECT_THAT(status.error_message(), ::testing::HasSubstr("Input is empty")); RegressionResponse response; status = RunRegress(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, fake_session_, request_, &response); ASSERT_FALSE(status.ok()); - EXPECT_THAT(status.ToString(), - ::testing::HasSubstr("Invalid argument: Input is empty")); + EXPECT_EQ(status.code(), error::Code::INVALID_ARGUMENT); + EXPECT_THAT(status.error_message(), ::testing::HasSubstr("Input is empty")); } TEST_P(RegressorTest, EmptyExampleList) { @@ -426,14 +426,14 @@ TEST_P(RegressorTest, EmptyExampleList) { request_.mutable_input()->mutable_example_list(); Status status = regressor_->Regress(request_, &result_); ASSERT_FALSE(status.ok()); - EXPECT_THAT(status.ToString(), - ::testing::HasSubstr("Invalid argument: Input is empty")); + EXPECT_EQ(status.code(), error::Code::INVALID_ARGUMENT); + EXPECT_THAT(status.error_message(), ::testing::HasSubstr("Input is empty")); RegressionResponse response; status = RunRegress(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, fake_session_, request_, &response); ASSERT_FALSE(status.ok()); - EXPECT_THAT(status.ToString(), - ::testing::HasSubstr("Invalid argument: Input is empty")); + EXPECT_EQ(status.code(), error::Code::INVALID_ARGUMENT); + EXPECT_THAT(status.error_message(), ::testing::HasSubstr("Input is empty")); } TEST_P(RegressorTest, EmptyExampleListWithContext) { @@ -444,14 +444,14 @@ TEST_P(RegressorTest, EmptyExampleListWithContext) { ->mutable_context() = example_with_output(3); Status status = regressor_->Regress(request_, &result_); ASSERT_FALSE(status.ok()); - EXPECT_THAT(status.ToString(), - ::testing::HasSubstr("Invalid argument: Input is empty")); + EXPECT_EQ(status.code(), error::Code::INVALID_ARGUMENT); + EXPECT_THAT(status.error_message(), ::testing::HasSubstr("Input is empty")); RegressionResponse response; status = RunRegress(GetRunOptions(), saved_model_bundle_->meta_graph_def, {}, fake_session_, request_, &response); ASSERT_FALSE(status.ok()); - EXPECT_THAT(status.ToString(), - ::testing::HasSubstr("Invalid argument: Input is empty")); + EXPECT_EQ(status.code(), error::Code::INVALID_ARGUMENT); + EXPECT_THAT(status.error_message(), ::testing::HasSubstr("Input is empty")); } TEST_P(RegressorTest, RunsFails) { From 53651b7fd196bbd749b5885fad0d140f289f4bef Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 5 Aug 2021 00:01:37 -0700 Subject: [PATCH 5259/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8dafadc5-29ad-4b0c-8748-083787bf23d3 PiperOrigin-RevId: 388868732 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b61b460cc3a..6760c261a6b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "db1ac7c92b32976ef4adb254fb5381525bad6057719a9c215633cf5659bc1589", - git_commit = "39993fd10e4891b4deb9645ff527b94e87e4f950", + sha256 = "4b004209658a95b8e0bb20511cc0392914f33a3e34c83457bc1cf8763518d41a", + git_commit = "fc2505a3b6256bdd73518af513176d2c50f92fe1", ) # Import all of TensorFlow Serving's external dependencies. From 95c0d9bb37db18dd5b2f75540041ea6d06ce565e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 5 Aug 2021 06:01:33 -0700 Subject: [PATCH 5260/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/aa880f51-31f7-4f05-9142-5cd98e1b39ca PiperOrigin-RevId: 388915106 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6760c261a6b..13bf54fecfe 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4b004209658a95b8e0bb20511cc0392914f33a3e34c83457bc1cf8763518d41a", - git_commit = "fc2505a3b6256bdd73518af513176d2c50f92fe1", + sha256 = "be21cf20cbaad4ad003384c8a6dc7953a820d721a0e0e18e61a37d67317297f9", + git_commit = "662be0ed2faed7eca2ef5b5d8ceaaba38836adad", ) # Import all of TensorFlow Serving's external dependencies. From f9b67cb5e552d8c6d0605550dc65842a48de5fb8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 5 Aug 2021 12:01:42 -0700 Subject: [PATCH 5261/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/447277d0-6894-4f9c-96e2-f15902eeb52f PiperOrigin-RevId: 388990146 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 13bf54fecfe..31b60d9c164 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "be21cf20cbaad4ad003384c8a6dc7953a820d721a0e0e18e61a37d67317297f9", - git_commit = "662be0ed2faed7eca2ef5b5d8ceaaba38836adad", + sha256 = "9e0c3cc6d527329b31bae93fff1455c0c714dc80d8bcab0548283cb0d4a16473", + git_commit = "5af0903e6af1bd99dab68a33dda9341b971dd724", ) # Import all of TensorFlow Serving's external dependencies. From 37de86e12c2434e2aae3dd1f5ceddcddd0ef60c7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 5 Aug 2021 18:01:22 -0700 Subject: [PATCH 5262/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9b98eb2f-0c56-427b-9511-0c6db025578b PiperOrigin-RevId: 389067221 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 31b60d9c164..3c44a7c0ae3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9e0c3cc6d527329b31bae93fff1455c0c714dc80d8bcab0548283cb0d4a16473", - git_commit = "5af0903e6af1bd99dab68a33dda9341b971dd724", + sha256 = "9d3a7181bc2c85dbb778609d234d2e11991aac941bc3e8ae2d303df0f056face", + git_commit = "558c7de63de537e0983961fb1d47fe695adec3e1", ) # Import all of TensorFlow Serving's external dependencies. From d624bcbccf0c866769401bf3b8e2996a6e01b20b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 6 Aug 2021 00:02:26 -0700 Subject: [PATCH 5263/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1ebf7f14-6de4-4ab2-8aba-a54f6053cd13 PiperOrigin-RevId: 389111500 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3c44a7c0ae3..909aafa2e4c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9d3a7181bc2c85dbb778609d234d2e11991aac941bc3e8ae2d303df0f056face", - git_commit = "558c7de63de537e0983961fb1d47fe695adec3e1", + sha256 = "ee69c2cf55ac66b51678f43a2f01f0230a5686b2ca813136b3edd1518ae0efde", + git_commit = "1746bc20ccbb39c177ae11ff8bdb97b15d07ae24", ) # Import all of TensorFlow Serving's external dependencies. From d0e023e0a3dccbb04d521e669cbd0b584f6c29c5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 6 Aug 2021 06:02:42 -0700 Subject: [PATCH 5264/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3cd65dcc-5de2-4e2f-8b5d-c47e9efd029e PiperOrigin-RevId: 389156495 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 909aafa2e4c..7d25fa14003 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ee69c2cf55ac66b51678f43a2f01f0230a5686b2ca813136b3edd1518ae0efde", - git_commit = "1746bc20ccbb39c177ae11ff8bdb97b15d07ae24", + sha256 = "9e36ec26d7eb89a513cb8b723c0b4c3499ef26fa5a7089e48374b5e2a8ab5945", + git_commit = "5977323cf254334209a8c22a2b8c76bbf1e77a06", ) # Import all of TensorFlow Serving's external dependencies. From 54312e0db6d1740f26bfa3b7a28061e3af436542 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 6 Aug 2021 12:01:44 -0700 Subject: [PATCH 5265/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/56e137f0-08a9-431f-b5fc-811c596d13df PiperOrigin-RevId: 389228056 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7d25fa14003..0728e1b47b7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9e36ec26d7eb89a513cb8b723c0b4c3499ef26fa5a7089e48374b5e2a8ab5945", - git_commit = "5977323cf254334209a8c22a2b8c76bbf1e77a06", + sha256 = "1ab2a449387c0e7f8b58f7e565d3b90f2203204933eb8550e2a79a36c8edfab1", + git_commit = "a69457dd2bc72347a12f8ac7499366a3386f4d52", ) # Import all of TensorFlow Serving's external dependencies. From e3a8d8e009862e0e6447e02abf17b655043fed2e Mon Sep 17 00:00:00 2001 From: Mingming Liu Date: Fri, 6 Aug 2021 15:40:07 -0700 Subject: [PATCH 5266/8103] Return early if shared status sees error PiperOrigin-RevId: 389277266 --- tensorflow_serving/batching/BUILD | 2 + .../batching/batching_session.cc | 21 ++++++--- .../batching/batching_session_test.cc | 44 ++++++++++++++++++- 3 files changed, 60 insertions(+), 7 deletions(-) diff --git a/tensorflow_serving/batching/BUILD b/tensorflow_serving/batching/BUILD index 53f6701f7d6..11a973bd577 100644 --- a/tensorflow_serving/batching/BUILD +++ b/tensorflow_serving/batching/BUILD @@ -115,11 +115,13 @@ cc_test( "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/servables/tensorflow:serving_session", "//tensorflow_serving/test_util", + "@com_google_absl//absl/synchronization", "@org_tensorflow//tensorflow/cc/saved_model:loader", "@org_tensorflow//tensorflow/cc/saved_model:tag_constants", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:framework", "@org_tensorflow//tensorflow/core:lib", + "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", "@org_tensorflow//tensorflow/core:testlib", ], diff --git a/tensorflow_serving/batching/batching_session.cc b/tensorflow_serving/batching/batching_session.cc index 6ab5d01255d..9e82ec55364 100644 --- a/tensorflow_serving/batching/batching_session.cc +++ b/tensorflow_serving/batching/batching_session.cc @@ -820,9 +820,17 @@ Status SplitInputTask( outputs = input_task.outputs, status = input_task.status, run_metadata = input_task.run_metadata, split_run_metadatas = input_task.split_run_metadatas]() { - // `cost_dimension_map` aggregates costs from all splits for each - // dimension. - absl::flat_hash_map cost_dimension_map; + auto finally = gtl::MakeCleanup([&] { + *status = shared_status->status(); + done_notification->Notify(); + }); + + // Some slices of tasks encounter errors, return early without + // processing per-split result. + if (!shared_status->status().ok()) { + return; + } + for (int i = 0; i < num_output; ++i) { Tensor output_tensor; @@ -836,11 +844,15 @@ Status SplitInputTask( tensor::Concat(to_concatenate, &output_tensor); if (!concat_status.ok()) { shared_status->Update(concat_status); + return; } outputs->push_back(std::move(output_tensor)); } + // `cost_dimension_map` aggregates costs from all splits for each + // dimension. + absl::flat_hash_map cost_dimension_map; for (const auto& split : *split_run_metadatas) { if (split.has_cost_graph()) { for (const auto& cost : split.cost_graph().cost()) { @@ -848,7 +860,6 @@ Status SplitInputTask( } } } - *status = shared_status->status(); *run_metadata = (*split_run_metadatas)[0]; std::vector cost_dimensions; @@ -865,8 +876,6 @@ Status SplitInputTask( graph_cost->set_cost(iter->second); } } - - done_notification->Notify(); }; IncrementalBarrier barrier(split_task_done_callback); diff --git a/tensorflow_serving/batching/batching_session_test.cc b/tensorflow_serving/batching/batching_session_test.cc index 63d11aea19c..a24056f6544 100644 --- a/tensorflow_serving/batching/batching_session_test.cc +++ b/tensorflow_serving/batching/batching_session_test.cc @@ -420,6 +420,48 @@ TEST_P(BatchingSessionTest, BatchingWithLargeBatch) { } } +TEST_P(BatchingSessionTest, BatchHandlesSplitError) { + if (!enable_large_batch_splitting()) { + return; + } + + BasicBatchScheduler::Options schedule_options; + schedule_options.max_batch_size = 3; + schedule_options.batch_timeout_micros = INT_MAX; // set a large time out + schedule_options.num_batch_threads = 1; + schedule_options = annotate_options(schedule_options); + schedule_options.max_execution_batch_size = 2; + std::unique_ptr batching_session; + BatchingSessionOptions batching_session_options; + TF_ASSERT_OK(CreateBasicBatchingSession( + schedule_options, batching_session_options, {{"x"}, {"y"}}, + CreateHalfPlusTwoSession(), &batching_session)); + + string expected_error_msg = + "Tensors with name 'x' from different tasks" + " have different shapes and padding is turned off." + "Set pad_variable_length_inputs to true, or ensure that " + "all tensors with the same name" + "have equal dimensions starting with the first dim."; + + // `max_batch_size` is 3 and `max_execution_batch_size` is 2, so inputs of + // first thread will span over two tasks, causing errors in both batch tasks. + std::unique_ptr first_request_thread(Env::Default()->StartThread( + ThreadOptions(), "first_request", + [&batching_session, &expected_error_msg] { + ExpectError(expected_error_msg, + {{"x", test::AsTensor({1, 2, 3}, {3, 1, 1})}}, {"y"}, + batching_session.get()); + })); + std::unique_ptr second_request_thread(Env::Default()->StartThread( + ThreadOptions(), "second_request", + [&batching_session, &expected_error_msg] { + ExpectError(expected_error_msg, + {{"x", test::AsTensor({1, 2}, {1, 2})}}, {"y"}, + batching_session.get()); + })); +} + TEST(BatchingSessionTest, BatchingWithPaddingAndCost) { BasicBatchScheduler::Options schedule_options; schedule_options.max_batch_size = 2; @@ -1040,7 +1082,7 @@ TEST_P(BatchingSessionTest, SubsetOutputTensors) { })); } -INSTANTIATE_TEST_CASE_P(WithOrWithoutThreadPools, BatchingSessionTest, +INSTANTIATE_TEST_CASE_P(WithOrWithoutInputSplit, BatchingSessionTest, ::testing::Bool()); } // namespace From 4bac2cfbf70b1e9c80d1abceeb33cf1cb27b81da Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 6 Aug 2021 18:01:29 -0700 Subject: [PATCH 5267/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/82cec6c8-b263-4462-be01-5fbe837c7a6a PiperOrigin-RevId: 389301451 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0728e1b47b7..d1e7c87d20c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1ab2a449387c0e7f8b58f7e565d3b90f2203204933eb8550e2a79a36c8edfab1", - git_commit = "a69457dd2bc72347a12f8ac7499366a3386f4d52", + sha256 = "d79abc5eb5c8f1f2ec496fc7dedebe98c60047a95c6677acad38c47b9ef0ce31", + git_commit = "07e19482bbbbcba6abc37ac72ebbaeaded97e93e", ) # Import all of TensorFlow Serving's external dependencies. From 76981f93e32bf277cbaa4ac9486d2e2a96345ec9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 7 Aug 2021 00:01:43 -0700 Subject: [PATCH 5268/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/80231910-926a-442f-8033-0b5039ae6b35 PiperOrigin-RevId: 389335970 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d1e7c87d20c..07dac4bcc12 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d79abc5eb5c8f1f2ec496fc7dedebe98c60047a95c6677acad38c47b9ef0ce31", - git_commit = "07e19482bbbbcba6abc37ac72ebbaeaded97e93e", + sha256 = "8d80ffffe80e48f1736b5b379c54509056cc3b2ce13e6238edf9507759fdca92", + git_commit = "ea0d84f422dcb0c3e8a6d4ebaa463c815dd84644", ) # Import all of TensorFlow Serving's external dependencies. From fc4576cf078f1f51d4f02a23ab5ffa0cc78acc55 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 7 Aug 2021 06:01:27 -0700 Subject: [PATCH 5269/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b6c16b30-311e-439f-8e4a-57125d7b03b5 PiperOrigin-RevId: 389366623 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 07dac4bcc12..42db75eefb7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8d80ffffe80e48f1736b5b379c54509056cc3b2ce13e6238edf9507759fdca92", - git_commit = "ea0d84f422dcb0c3e8a6d4ebaa463c815dd84644", + sha256 = "8ad9e26df8610c2eaf1dc9b26df2e9d96558943a47cf1cb213f431893553329f", + git_commit = "047e3977c8ab3acae7085a5410e83ad4134e9700", ) # Import all of TensorFlow Serving's external dependencies. From b7e86340efbbc70b939b597c02593b2ff9ee66b9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 7 Aug 2021 12:01:32 -0700 Subject: [PATCH 5270/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/106008ef-1d42-4939-9d18-4a2ee788769d PiperOrigin-RevId: 389395481 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 42db75eefb7..bcdb758c042 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8ad9e26df8610c2eaf1dc9b26df2e9d96558943a47cf1cb213f431893553329f", - git_commit = "047e3977c8ab3acae7085a5410e83ad4134e9700", + sha256 = "1fec2219e39657f4bb5a7fd604fa34a02794bfb62c3d990a5f3354c544d54a06", + git_commit = "87326d99677264721bff6ebc86dca1c86ef0fbac", ) # Import all of TensorFlow Serving's external dependencies. From 41bbf889cf55a7a082b19638ab769263ecaebbf7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 7 Aug 2021 18:01:29 -0700 Subject: [PATCH 5271/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d28fa080-6191-43c8-8b74-6f0a12e934e7 PiperOrigin-RevId: 389422784 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bcdb758c042..901eea547ba 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1fec2219e39657f4bb5a7fd604fa34a02794bfb62c3d990a5f3354c544d54a06", - git_commit = "87326d99677264721bff6ebc86dca1c86ef0fbac", + sha256 = "9a1a7cad0c13ed30fc5608bc35f8af8f05a16d95e1b2a3585e92e79973160326", + git_commit = "98440734226c17f2bd7889cb85ea6d50e99f980b", ) # Import all of TensorFlow Serving's external dependencies. From 5a4908eb527db5ce56ae176c8a07ca4cd73ae45c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 8 Aug 2021 00:01:55 -0700 Subject: [PATCH 5272/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fff787cc-c173-4f72-89d3-1d660c930306 PiperOrigin-RevId: 389449340 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 901eea547ba..3cc5ca6e449 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9a1a7cad0c13ed30fc5608bc35f8af8f05a16d95e1b2a3585e92e79973160326", - git_commit = "98440734226c17f2bd7889cb85ea6d50e99f980b", + sha256 = "5415facb1bf570f8dc0c8a1d9a1ae2f98ef3cc3f4bc450a5ca5163d061a3c97e", + git_commit = "22c6e94a589b98e3ff28019759c6c9a966025dbf", ) # Import all of TensorFlow Serving's external dependencies. From 4a36f514e295f0a0832ab9c1644bbbf0589c1c31 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 8 Aug 2021 06:01:57 -0700 Subject: [PATCH 5273/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e08222a2-0f8a-4089-8eb5-6bb1c7f8a47a PiperOrigin-RevId: 389477835 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3cc5ca6e449..c3b8e45abf1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5415facb1bf570f8dc0c8a1d9a1ae2f98ef3cc3f4bc450a5ca5163d061a3c97e", - git_commit = "22c6e94a589b98e3ff28019759c6c9a966025dbf", + sha256 = "164f0d2b2647a3bc52c8f3078a8ce8405814f828e054e2860d10e4d4e960adc5", + git_commit = "fc25349a9e02b2b4a2ac9a79892317c17dea8dc5", ) # Import all of TensorFlow Serving's external dependencies. From 76bf04b3092d450c3ebfd0eeaab000b91887ad80 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 8 Aug 2021 12:01:25 -0700 Subject: [PATCH 5274/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c54b8096-67af-43cd-8928-990bd3cd6e06 PiperOrigin-RevId: 389504829 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c3b8e45abf1..f992615334b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "164f0d2b2647a3bc52c8f3078a8ce8405814f828e054e2860d10e4d4e960adc5", - git_commit = "fc25349a9e02b2b4a2ac9a79892317c17dea8dc5", + sha256 = "633eef988828e47491e5a3b38b8b40edac3a6dcea96b443867bb99a2b80b3ddb", + git_commit = "c64634eb47f6581a7cf0cb01cf30284ff480d330", ) # Import all of TensorFlow Serving's external dependencies. From bccaadd244474921fe957d6f4a345a1507b3afb0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 8 Aug 2021 18:01:27 -0700 Subject: [PATCH 5275/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/65351f6f-a337-4324-bd5c-bb663d5e4fed PiperOrigin-RevId: 389533051 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f992615334b..344a1c9f296 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "633eef988828e47491e5a3b38b8b40edac3a6dcea96b443867bb99a2b80b3ddb", - git_commit = "c64634eb47f6581a7cf0cb01cf30284ff480d330", + sha256 = "b6baafec03ed71efac9b9814f0e504fee1f0cd34a6270702736028575e0ffef8", + git_commit = "5776ce9377d1d88481969cf77c1bdd7e1efcec10", ) # Import all of TensorFlow Serving's external dependencies. From 114fddb980eaea249cd362bf253a6094df7325c7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 9 Aug 2021 00:01:43 -0700 Subject: [PATCH 5276/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4d23f67f-e869-45b0-8c34-1402fc01977a PiperOrigin-RevId: 389566384 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 344a1c9f296..0c01f8e1533 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b6baafec03ed71efac9b9814f0e504fee1f0cd34a6270702736028575e0ffef8", - git_commit = "5776ce9377d1d88481969cf77c1bdd7e1efcec10", + sha256 = "a9763ef5364c8427873f4c45dec5d38ce34fdaba01635df5168554adfe9cf7e6", + git_commit = "e9aa6033703b06276524db7972ada666bae7b038", ) # Import all of TensorFlow Serving's external dependencies. From c104679434ab3ad2c5aa0ac69819bab565338888 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 9 Aug 2021 06:01:42 -0700 Subject: [PATCH 5277/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/96951879-8512-4ebc-bdd7-b955b98fff76 PiperOrigin-RevId: 389614495 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0c01f8e1533..c33be556ba3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a9763ef5364c8427873f4c45dec5d38ce34fdaba01635df5168554adfe9cf7e6", - git_commit = "e9aa6033703b06276524db7972ada666bae7b038", + sha256 = "37fbe5c61f60789af7d20d5a0960f7167a2a2a6972dbaab57fe85e2b42013378", + git_commit = "3220ecba8eefcb924f2038b7f29db4ae17e96f5f", ) # Import all of TensorFlow Serving's external dependencies. From d79acb6ab1b53b1b87f80a4af850f33a5a6ee03d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 9 Aug 2021 12:02:02 -0700 Subject: [PATCH 5278/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/58b153d4-2286-450a-a55d-2b7b7c110d52 PiperOrigin-RevId: 389691078 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c33be556ba3..1ff4b3235e9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "37fbe5c61f60789af7d20d5a0960f7167a2a2a6972dbaab57fe85e2b42013378", - git_commit = "3220ecba8eefcb924f2038b7f29db4ae17e96f5f", + sha256 = "0def136f2f66c560d74848dd7b481eea1c4df0b1de2b3bee3e35f252470969ba", + git_commit = "a5f64629062ca19fcfd2867a73605eb150a55b99", ) # Import all of TensorFlow Serving's external dependencies. From 11406682376b70909f04998c80955f9753c36549 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 9 Aug 2021 18:02:18 -0700 Subject: [PATCH 5279/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7f014127-6c98-44a1-ad8c-addb0fd57b9c PiperOrigin-RevId: 389767807 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1ff4b3235e9..e4ed0bc70b4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0def136f2f66c560d74848dd7b481eea1c4df0b1de2b3bee3e35f252470969ba", - git_commit = "a5f64629062ca19fcfd2867a73605eb150a55b99", + sha256 = "c58d3036faf82e5befeb97259695263d9a4aa43a08308151b2e6aca72ff91e2b", + git_commit = "765ec018a017e16c9e56311be2518d580bb13d06", ) # Import all of TensorFlow Serving's external dependencies. From 188e656fb623ed747d020a671d3fc9dd921b4360 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 10 Aug 2021 00:02:28 -0700 Subject: [PATCH 5280/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2108e556-094e-4f1a-8dec-b5709e403933 PiperOrigin-RevId: 389811926 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e4ed0bc70b4..fbff74960cc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c58d3036faf82e5befeb97259695263d9a4aa43a08308151b2e6aca72ff91e2b", - git_commit = "765ec018a017e16c9e56311be2518d580bb13d06", + sha256 = "6af5006e91c656e02f4bd97ee184b0379115f8b5dbcbf9fcc4361865cee58d24", + git_commit = "a1d81c82d2b272e3814d7eb2fd67e40caad8b991", ) # Import all of TensorFlow Serving's external dependencies. From 8ca5ad75f4e86536eb1b9136005a7ae879b9ffc5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 10 Aug 2021 06:01:35 -0700 Subject: [PATCH 5281/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d0fff0ca-bcbc-465b-bd95-e33d1ad72948 PiperOrigin-RevId: 389862194 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fbff74960cc..efed33255d2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6af5006e91c656e02f4bd97ee184b0379115f8b5dbcbf9fcc4361865cee58d24", - git_commit = "a1d81c82d2b272e3814d7eb2fd67e40caad8b991", + sha256 = "773070a0243fe786ec344978bfb9619af9bfe5ba6dca44447922912aec1446b3", + git_commit = "fc85ce7fb678ed81268a10020c15ec3f76cd2b13", ) # Import all of TensorFlow Serving's external dependencies. From a8560c32fa9d6d9af127a8aee3d9253f95648f4c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 10 Aug 2021 12:01:22 -0700 Subject: [PATCH 5282/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8982fc5f-f584-43d1-9604-7962b67c9062 PiperOrigin-RevId: 389943106 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index efed33255d2..bb0bc672354 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "773070a0243fe786ec344978bfb9619af9bfe5ba6dca44447922912aec1446b3", - git_commit = "fc85ce7fb678ed81268a10020c15ec3f76cd2b13", + sha256 = "4680ae5a6e63d659bd4e994be6376980db614e1a642af277291b29482e31053e", + git_commit = "dfad859f8262dce623af19db3763bdbe439c59dd", ) # Import all of TensorFlow Serving's external dependencies. From e0a292a53a551e1aa597ccf33ebca44a973ebd69 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 10 Aug 2021 18:01:48 -0700 Subject: [PATCH 5283/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5f5e85fd-c5b5-477a-9394-f03aa508687e PiperOrigin-RevId: 390022175 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bb0bc672354..e12d0af0d19 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4680ae5a6e63d659bd4e994be6376980db614e1a642af277291b29482e31053e", - git_commit = "dfad859f8262dce623af19db3763bdbe439c59dd", + sha256 = "b2f09068cb9824b61876f83baa1c1757c47361633197df7934d7c9c96b6e067b", + git_commit = "1967dc5232f854249e34b640631828c41d68678d", ) # Import all of TensorFlow Serving's external dependencies. From 50e8f6741b6c899f12a4ff04ca6d9746e0cc94f8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 11 Aug 2021 00:02:01 -0700 Subject: [PATCH 5284/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/29a4b417-66d1-4fc6-840c-28a97199c8ac PiperOrigin-RevId: 390066016 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e12d0af0d19..2ef2f0ebddb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b2f09068cb9824b61876f83baa1c1757c47361633197df7934d7c9c96b6e067b", - git_commit = "1967dc5232f854249e34b640631828c41d68678d", + sha256 = "96121e3fca88d97a72ca9571ca3cb8a8f1c3a10ea5d585c6032d1e6f1e5448aa", + git_commit = "60d27a1bdd81115488681c0c1c505c5a33404ddb", ) # Import all of TensorFlow Serving's external dependencies. From 15bada02c1e6141eb550046ba12fe691ffd63cc6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 12 Aug 2021 12:01:39 -0700 Subject: [PATCH 5285/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b4d0e1fc-5b1b-463e-a396-622e02ce0813 PiperOrigin-RevId: 390426703 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2ef2f0ebddb..3775f24b661 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "96121e3fca88d97a72ca9571ca3cb8a8f1c3a10ea5d585c6032d1e6f1e5448aa", - git_commit = "60d27a1bdd81115488681c0c1c505c5a33404ddb", + sha256 = "ff1cd277325fc6ded435afa1802b533aa5d88704fcefa2cdf32f2af9d732f175", + git_commit = "ed577c0d02739d7176cbaf043ac460a4404f22a8", ) # Import all of TensorFlow Serving's external dependencies. From 1b049c6c8b55d56d5853cd29c827a5886e729fb4 Mon Sep 17 00:00:00 2001 From: Mingming Liu Date: Thu, 12 Aug 2021 14:45:05 -0700 Subject: [PATCH 5286/8103] Add more debugging information for `RoundToLowestAllowedBatch` PiperOrigin-RevId: 390464755 --- tensorflow_serving/batching/batching_util.cc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/batching/batching_util.cc b/tensorflow_serving/batching/batching_util.cc index 375a70fa3f2..09853b01dcb 100644 --- a/tensorflow_serving/batching/batching_util.cc +++ b/tensorflow_serving/batching/batching_util.cc @@ -214,8 +214,12 @@ int RoundToLowestAllowedBatchSize(absl::Span allowed_batch_sizes, return allowed_size; } } - LOG(WARNING) << "Maximum batch size greater than largest allowed size; " - "ignoring allowed sizes constraint"; + // `allowed_batch_sizes` is guaranteed to be not empty and sorted in + // ascending order. + LOG(WARNING) << "Input batch size " << batch_size + << " is greater than largest allowed size " + << *allowed_batch_sizes.rbegin() + << " ignoring allowed sizes constraint."; return batch_size; } From 87b9ac4965a67be9bab52cc4a0a646bfa5c085da Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 12 Aug 2021 18:01:48 -0700 Subject: [PATCH 5287/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5a2e8deb-c0f0-400e-8614-956bb82a0234 PiperOrigin-RevId: 390503381 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3775f24b661..b8fd90e24f0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ff1cd277325fc6ded435afa1802b533aa5d88704fcefa2cdf32f2af9d732f175", - git_commit = "ed577c0d02739d7176cbaf043ac460a4404f22a8", + sha256 = "cf6a30fa6209a63593c30aaabd781ac861b214cede9666474a0d0fb990ff1bfb", + git_commit = "fc6619c101f3650968d8ca879c88a1953c60c8a6", ) # Import all of TensorFlow Serving's external dependencies. From 2d7f2f4c1a904cfe60fdd23049a5dd42854d3de7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 13 Aug 2021 00:01:52 -0700 Subject: [PATCH 5288/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8a072291-2222-4459-b8e8-de415289398d PiperOrigin-RevId: 390549053 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b8fd90e24f0..356db4459f6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cf6a30fa6209a63593c30aaabd781ac861b214cede9666474a0d0fb990ff1bfb", - git_commit = "fc6619c101f3650968d8ca879c88a1953c60c8a6", + sha256 = "04fe861eb9f9ff9b67c9397c71c977d9f4f70cb6e1598d8ce2236e5aba3b79d0", + git_commit = "a0ca44b13611ec22a0f5d3bc280d22a6a4434e2c", ) # Import all of TensorFlow Serving's external dependencies. From c3415e9100baf50088b8097d3a13ea366f8d50fb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 13 Aug 2021 06:01:21 -0700 Subject: [PATCH 5289/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bb94e598-213f-4500-8a3e-79bb78fbe014 PiperOrigin-RevId: 390594998 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 356db4459f6..0c276240dfe 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "04fe861eb9f9ff9b67c9397c71c977d9f4f70cb6e1598d8ce2236e5aba3b79d0", - git_commit = "a0ca44b13611ec22a0f5d3bc280d22a6a4434e2c", + sha256 = "76dc66b008a22bea445af4e5d06d716c5fa9f7dc2383b36fb0878ed0d695f459", + git_commit = "b164e3a12f8a0d01d08f8a1895a45cedfce3106e", ) # Import all of TensorFlow Serving's external dependencies. From 98fadc8672b60e0d755910b0fe9bc068b2fa7779 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 13 Aug 2021 12:02:42 -0700 Subject: [PATCH 5290/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/47f7dd6e-3b86-4f74-a543-47785fdf6a6c PiperOrigin-RevId: 390662798 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0c276240dfe..22515c89a89 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "76dc66b008a22bea445af4e5d06d716c5fa9f7dc2383b36fb0878ed0d695f459", - git_commit = "b164e3a12f8a0d01d08f8a1895a45cedfce3106e", + sha256 = "29a6cc884170db7930f05662ab89efc5baf3e2994d5687c17f31a0bd85c34f49", + git_commit = "4bac6e0b0c7f2d63826975635c320a334046628d", ) # Import all of TensorFlow Serving's external dependencies. From 7b96281672162a32e6dcce32081cc60c435c6232 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 16 Aug 2021 12:01:34 -0700 Subject: [PATCH 5291/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/553a8771-17bd-47d0-b8e6-741f7f868393 PiperOrigin-RevId: 391103767 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 22515c89a89..20fbad72e0d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "29a6cc884170db7930f05662ab89efc5baf3e2994d5687c17f31a0bd85c34f49", - git_commit = "4bac6e0b0c7f2d63826975635c320a334046628d", + sha256 = "90d10270a372a3f608f7409f62887493845de51a597d91139c16bdf76ae12639", + git_commit = "a1f8501a52fdc46194d4412cc43c733a9c578531", ) # Import all of TensorFlow Serving's external dependencies. From 6d40ca491f2bdfa2a5a882b28232805e892e64fb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 16 Aug 2021 18:01:41 -0700 Subject: [PATCH 5292/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/91824033-7045-40fb-b54e-63aa6c54dc21 PiperOrigin-RevId: 391179263 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 20fbad72e0d..772b8038fe5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "90d10270a372a3f608f7409f62887493845de51a597d91139c16bdf76ae12639", - git_commit = "a1f8501a52fdc46194d4412cc43c733a9c578531", + sha256 = "ef559d528ef31e777617966d37a94f74fae27752aebd1deb8478cd9b3172ac50", + git_commit = "02950049c66d09e47ea9a95c0cf2b43cdbb8ba69", ) # Import all of TensorFlow Serving's external dependencies. From 706b61882073789489bea808e88bfc42264ec6f5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 17 Aug 2021 00:01:41 -0700 Subject: [PATCH 5293/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3a97789b-98c8-4921-a52b-def07d05758e PiperOrigin-RevId: 391221895 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 772b8038fe5..64d7eaeeb73 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ef559d528ef31e777617966d37a94f74fae27752aebd1deb8478cd9b3172ac50", - git_commit = "02950049c66d09e47ea9a95c0cf2b43cdbb8ba69", + sha256 = "602dcac323c5eacc09a0518977a283aabbad481cac1fb119cce2518798207154", + git_commit = "8ffe9c08dae7c962082e6b241a46bc46f65892c7", ) # Import all of TensorFlow Serving's external dependencies. From 0b549f55e0da141ea57fb529bf38a2c026bf50a0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 17 Aug 2021 06:02:01 -0700 Subject: [PATCH 5294/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/55d8c86e-e60c-4297-b939-40fa95c8fb2a PiperOrigin-RevId: 391270698 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 64d7eaeeb73..272cbdef931 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "602dcac323c5eacc09a0518977a283aabbad481cac1fb119cce2518798207154", - git_commit = "8ffe9c08dae7c962082e6b241a46bc46f65892c7", + sha256 = "d4f8a156792575141308a5b79bd15351f5b81664f2798e60ab2eb7f0920c9e81", + git_commit = "48cc4698fb0b2fd7b904c5a9e0fec1b4f7ff04fc", ) # Import all of TensorFlow Serving's external dependencies. From 52d1bec91873aacdbbdae2690c7b387fe0c33936 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 17 Aug 2021 12:01:32 -0700 Subject: [PATCH 5295/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ae1534c3-24b3-43b7-9449-22a16da0f475 PiperOrigin-RevId: 391344804 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 272cbdef931..054ae6672a3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d4f8a156792575141308a5b79bd15351f5b81664f2798e60ab2eb7f0920c9e81", - git_commit = "48cc4698fb0b2fd7b904c5a9e0fec1b4f7ff04fc", + sha256 = "cf7ea26b0f976d8e99014490fd2b867aed3cdbfb0c9c0f0501c25247d0fe3aaf", + git_commit = "5e994e6ba529afb25aa7630acd97e873e65c1a08", ) # Import all of TensorFlow Serving's external dependencies. From 0cb35ad0fd33f49cd47e7aee6ab0e7f90a54f570 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 17 Aug 2021 18:01:30 -0700 Subject: [PATCH 5296/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/72df081b-5577-496a-ab99-1850c45687c1 PiperOrigin-RevId: 391419349 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 054ae6672a3..27a9173f1f2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cf7ea26b0f976d8e99014490fd2b867aed3cdbfb0c9c0f0501c25247d0fe3aaf", - git_commit = "5e994e6ba529afb25aa7630acd97e873e65c1a08", + sha256 = "377e5ba5e14a051cab511205c1e99c217dcec238136b22b77c96beceee64a34a", + git_commit = "135b813cf21db4394047209cbb1650431c08e0ed", ) # Import all of TensorFlow Serving's external dependencies. From 5c00d3d8699dfa747ea25f8531089e31dbe028d1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 18 Aug 2021 00:03:59 -0700 Subject: [PATCH 5297/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fd7a92dc-d5d9-423f-851f-c9a5577f22e8 PiperOrigin-RevId: 391463077 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 27a9173f1f2..b25b02c3d9d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "377e5ba5e14a051cab511205c1e99c217dcec238136b22b77c96beceee64a34a", - git_commit = "135b813cf21db4394047209cbb1650431c08e0ed", + sha256 = "c435f6bdd8ca4001023894306897e0aad36f4e90fba4a0bb04c2aed823a09820", + git_commit = "6dc710fba8502be6bbe77be5beffd664fb136ba1", ) # Import all of TensorFlow Serving's external dependencies. From 9d4bbb385cda64fcaaa9b7d809d74786f9bcccf1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 18 Aug 2021 06:01:48 -0700 Subject: [PATCH 5298/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0fc0c9db-002b-4cad-b21a-e0bfed0d9e0d PiperOrigin-RevId: 391508263 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b25b02c3d9d..9f8eee43c58 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c435f6bdd8ca4001023894306897e0aad36f4e90fba4a0bb04c2aed823a09820", - git_commit = "6dc710fba8502be6bbe77be5beffd664fb136ba1", + sha256 = "b55b31400fc50efcbbb15c305855ff18262c194666591f232eadadb6129381a2", + git_commit = "5972e123114bdfb8c877a6746702b104022fe4d9", ) # Import all of TensorFlow Serving's external dependencies. From 01ef5428ac34884b12b7b0524f422297e066c2b5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 18 Aug 2021 12:01:49 -0700 Subject: [PATCH 5299/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/74902eea-f9e0-4127-b63e-debf631007d7 PiperOrigin-RevId: 391578809 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9f8eee43c58..92adc58d101 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b55b31400fc50efcbbb15c305855ff18262c194666591f232eadadb6129381a2", - git_commit = "5972e123114bdfb8c877a6746702b104022fe4d9", + sha256 = "ab53cf76f59f716cbb1c4cc80162439c07dd6358b302396a875f19b8bd4b8fb9", + git_commit = "cac8b1e006581d2e4a8e02b74cd4c1bc210ce636", ) # Import all of TensorFlow Serving's external dependencies. From f869f919fed76e306ab42510c5c06442c514260e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 18 Aug 2021 18:01:47 -0700 Subject: [PATCH 5300/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/82708358-c612-4eed-b13a-7846e3b2a5d5 PiperOrigin-RevId: 391651511 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 92adc58d101..b6d139bef6d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ab53cf76f59f716cbb1c4cc80162439c07dd6358b302396a875f19b8bd4b8fb9", - git_commit = "cac8b1e006581d2e4a8e02b74cd4c1bc210ce636", + sha256 = "cbef30ceeea35211f9fadb43178c94e975ce7e12b968d46b1d9c414a93357d73", + git_commit = "dfe02bf6604cf22a111eaa55138cbaf610797d57", ) # Import all of TensorFlow Serving's external dependencies. From 3a47647eb95f25923c350c9683fbf05177cce666 Mon Sep 17 00:00:00 2001 From: Sanjay Kumar Chotakur Date: Wed, 18 Aug 2021 18:44:21 -0700 Subject: [PATCH 5301/8103] Add release notes for tf-serving 2.3.4. PiperOrigin-RevId: 391658294 --- RELEASE.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/RELEASE.md b/RELEASE.md index 2e43fb81957..320083f9843 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,3 +1,17 @@ +# Release 2.3.4 + +## Major Features and Improvements + +* No major features or improvements. + +## Breaking Changes + +* No breaking changes + +## Bug Fixes and Other Changes + +* TensorFlow Serving using TensorFlow 2.3.4 + # Release 2.4.1 ## Major Features and Improvements From ea213334dcb5bdfd350317ad6e05c0b7b0d580c3 Mon Sep 17 00:00:00 2001 From: Robert Neale Date: Wed, 18 Aug 2021 22:19:14 -0700 Subject: [PATCH 5302/8103] Update TF Text to v2.6.0. PiperOrigin-RevId: 391682251 --- .../tf_text_regression/01/saved_model.pb | Bin 5131543 -> 5193739 bytes tensorflow_serving/workspace.bzl | 6 +++--- third_party/tf_text/tftext.patch | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/saved_model.pb b/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/saved_model.pb index 846214bfca94b9600d16d89db6f6465911b8c572..f308494431afc4c0ddc148c16c6d86961ca554cd 100644 GIT binary patch delta 29043 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 delta 15454 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 diff --git a/tensorflow_serving/workspace.bzl b/tensorflow_serving/workspace.bzl index 14f7a1e1641..08c3cc28dab 100644 --- a/tensorflow_serving/workspace.bzl +++ b/tensorflow_serving/workspace.bzl @@ -56,9 +56,9 @@ def tf_serving_workspace(): # https://github.com/tensorflow/text/blob/master/oss_scripts/model_server/save_models.py http_archive( name = "org_tensorflow_text", - sha256 = "d82856dc04c04bbce347f72d0ad7df59bb6b26b7030f96f25f036cfe8a138312", - strip_prefix = "text-2.5.0", - url = "https://github.com/tensorflow/text/archive/v2.5.0.zip", + sha256 = "0991ff93959a0e3ec7d16ba9d9ff9b4463bba565da402f1460cdbfa731112034", + strip_prefix = "text-2.6.0", + url = "https://github.com/tensorflow/text/archive/v2.6.0.zip", patches = ["@//third_party/tf_text:tftext.patch"], patch_args = ["-p1"], repo_mapping = {"@com_google_re2": "@com_googlesource_code_re2"}, diff --git a/third_party/tf_text/tftext.patch b/third_party/tf_text/tftext.patch index d9530833aa9..d0af8a65e14 100644 --- a/third_party/tf_text/tftext.patch +++ b/third_party/tf_text/tftext.patch @@ -1,14 +1,14 @@ diff --git a/tensorflow_text/tftext.bzl b/tensorflow_text/tftext.bzl -index 7f703b3..d2c590a 100644 +index 96cb329..1bb98ec 100644 --- a/tensorflow_text/tftext.bzl +++ b/tensorflow_text/tftext.bzl -@@ -93,8 +93,7 @@ def tf_deps(deps = []): +@@ -126,8 +126,7 @@ def tf_cc_library( "@org_tensorflow//tensorflow/core:portable_tensorflow_lib_lite", ], "//conditions:default": [ - "@local_config_tf//:libtensorflow_framework", - "@local_config_tf//:tf_header_lib", + "@org_tensorflow//tensorflow/core:tensorflow_opensource", - ] + deps + oss_deps, + ] + tf_deps + oss_deps, }) - + native.cc_library( From 2bc633d9b3b80cbec7ffa94a6f2e18e47839df18 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 19 Aug 2021 00:02:11 -0700 Subject: [PATCH 5303/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1974f758-1897-4fda-b258-e7aa07a2adbf PiperOrigin-RevId: 391693629 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b6d139bef6d..528a84194bc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cbef30ceeea35211f9fadb43178c94e975ce7e12b968d46b1d9c414a93357d73", - git_commit = "dfe02bf6604cf22a111eaa55138cbaf610797d57", + sha256 = "8cb52b53fd9206b4ffdfab1921d4dac744b400e2df299633535bf9522d55cb7f", + git_commit = "49b95fb4266ab79f58cd34810d3f4e6b3aa7d91a", ) # Import all of TensorFlow Serving's external dependencies. From dcdf88f0659b1768b5a0325a317580e77317eb62 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 19 Aug 2021 06:01:37 -0700 Subject: [PATCH 5304/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fbe15a9e-fed0-45e3-968b-87168dfc71c3 PiperOrigin-RevId: 391740057 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 528a84194bc..042d09b6f65 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8cb52b53fd9206b4ffdfab1921d4dac744b400e2df299633535bf9522d55cb7f", - git_commit = "49b95fb4266ab79f58cd34810d3f4e6b3aa7d91a", + sha256 = "7b6c5be18a45b79424cc63789e4e667e92a07a095c356c0b1d324271458db799", + git_commit = "61cb2f0aad70f8798bdbabf96d4103bb72828af6", ) # Import all of TensorFlow Serving's external dependencies. From 2bf45654fe99762618ccae035d10930180228401 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 19 Aug 2021 12:01:57 -0700 Subject: [PATCH 5305/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5aa5579a-8a29-410c-b4c1-cf126243f6d1 PiperOrigin-RevId: 391811837 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 042d09b6f65..97657f1baf1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7b6c5be18a45b79424cc63789e4e667e92a07a095c356c0b1d324271458db799", - git_commit = "61cb2f0aad70f8798bdbabf96d4103bb72828af6", + sha256 = "d83788a1d7f6147ba6942877a8564610bfe7984b6aba31c308aee2d87aaecbde", + git_commit = "f09caa532b6e1ac8d2aa61b7832c78c5b79300c6", ) # Import all of TensorFlow Serving's external dependencies. From a5184ce9c9421ddd7d63b8f8bb71876732227502 Mon Sep 17 00:00:00 2001 From: Sanjay Kumar Chotakur Date: Thu, 19 Aug 2021 16:05:28 -0700 Subject: [PATCH 5306/8103] Add release notes for tf-serving 2.4.3 PiperOrigin-RevId: 391865022 --- RELEASE.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/RELEASE.md b/RELEASE.md index 320083f9843..44d9ef03813 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,3 +1,17 @@ +# Release 2.4.3 + +## Major Features and Improvements + +* No major features or improvements. + +## Breaking Changes + +* No breaking changes + +## Bug Fixes and Other Changes + +* This release is based on TF version 2.4.3 + # Release 2.3.4 ## Major Features and Improvements From 3ef8aa10f100f5cb58a61a083f4fbc68813b9273 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 19 Aug 2021 18:01:47 -0700 Subject: [PATCH 5307/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/64b59077-6c00-46ad-9a46-8c80a19cd85d PiperOrigin-RevId: 391886120 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 97657f1baf1..3268ecb8543 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d83788a1d7f6147ba6942877a8564610bfe7984b6aba31c308aee2d87aaecbde", - git_commit = "f09caa532b6e1ac8d2aa61b7832c78c5b79300c6", + sha256 = "a14ace72c720edc61242fb805277799504e2814a2cbe8d99949e677dd34717e7", + git_commit = "0c0b48302c769ee69233701b18171a2a4e1c30db", ) # Import all of TensorFlow Serving's external dependencies. From 67e660ece69e6aeac384f1d19d4220bdf8a33309 Mon Sep 17 00:00:00 2001 From: Mingming Liu Date: Thu, 19 Aug 2021 20:34:00 -0700 Subject: [PATCH 5308/8103] propagate thread_pool in input-split case. PiperOrigin-RevId: 391904778 --- .../batching/batching_session.cc | 1 + .../batching/batching_session_test.cc | 85 ++++++++----------- 2 files changed, 37 insertions(+), 49 deletions(-) diff --git a/tensorflow_serving/batching/batching_session.cc b/tensorflow_serving/batching/batching_session.cc index 9e82ec55364..47140820673 100644 --- a/tensorflow_serving/batching/batching_session.cc +++ b/tensorflow_serving/batching/batching_session.cc @@ -918,6 +918,7 @@ Status SplitInputTask( task->thread_safe_status = input_task.thread_safe_status; task->is_partial = true; task->done_callback = barrier.Inc(); + task->thread_pool_options = input_task.thread_pool_options; task->split_run_metadatas = input_task.split_run_metadatas; diff --git a/tensorflow_serving/batching/batching_session_test.cc b/tensorflow_serving/batching/batching_session_test.cc index a24056f6544..a958a102b04 100644 --- a/tensorflow_serving/batching/batching_session_test.cc +++ b/tensorflow_serving/batching/batching_session_test.cc @@ -136,27 +136,24 @@ std::unique_ptr CreateMatrixHalfPlusTwoSession() { return std::move(bundle.session); } -// Similar to the above function, but takes 'run_options', 'inter_op_threadpool' -// and 'intra_op_threadpool' as addititional parameters. -void TestSingleRequest(const RunOptions& run_options, float input_0, - float input_1, Session* session, - test_util::CountingThreadPool* inter_op_threadpool, - test_util::CountingThreadPool* intra_op_threadpool) { - Tensor input = test::AsTensor({input_0, input_1}, {2}); - // Half plus two: each output should be input / 2 + 2. - Tensor expected_output = - test::AsTensor({input_0 / 2 + 2, input_1 / 2 + 2}, {2}); - - const std::vector> inputs = {{"x", input}}; - std::vector outputs; +void TestRequest(const std::vector& x_values, TensorShape x_shape, + const std::vector& y_values, TensorShape y_shape, + Session* session, + test_util::CountingThreadPool* inter_op_threadpool = nullptr, + test_util::CountingThreadPool* intra_op_threadpool = nullptr) { + Tensor input = test::AsTensor(x_values, x_shape); + Tensor expected_output = test::AsTensor(y_values, y_shape); + RunMetadata run_metadata; thread::ThreadPoolOptions thread_pool_options; thread_pool_options.inter_op_threadpool = inter_op_threadpool; thread_pool_options.intra_op_threadpool = intra_op_threadpool; - TF_ASSERT_OK(session->Run(run_options, inputs, {"y"}, {} /* target nodes */, - &outputs, &run_metadata, thread_pool_options)); - ASSERT_EQ(1, outputs.size()); - test::ExpectTensorEqual(expected_output, outputs[0]); + std::vector output; + TF_ASSERT_OK(session->Run(RunOptions(), {{"x", input}}, {"y"}, + {} /* target nodes */, &output, &run_metadata, + thread_pool_options)); + ASSERT_EQ(1, output.size()); + test::ExpectTensorEqual(expected_output, output[0]); // The intra_op_threadpool doesn't have anything scheduled. if (inter_op_threadpool != nullptr) { @@ -164,25 +161,6 @@ void TestSingleRequest(const RunOptions& run_options, float input_0, } } -// Test that a session handles a single request for the half-plus-two model -// properly. The request has two input floats (size=2 for batching purposes). -void TestSingleRequest(float input_0, float input_1, Session* session) { - TestSingleRequest(RunOptions(), input_0, input_1, session, - /*inter_op_threadpool=*/nullptr, - /*intra_op_threadpool=*/nullptr); -} - -void TestRequest(const std::vector& x_values, TensorShape x_shape, - const std::vector& y_values, TensorShape y_shape, - Session* session) { - Tensor input = test::AsTensor(x_values, x_shape); - Tensor expected_output = test::AsTensor(y_values, y_shape); - std::vector output; - TF_ASSERT_OK(session->Run({{"x", input}}, {"y"}, {}, &output)); - ASSERT_EQ(1, output.size()); - test::ExpectTensorEqual(expected_output, output[0]); -} - // Invoke Run() with the supplied arguments, and expect a particular error. void ExpectError(const string& error_message, const std::vector>& inputs, @@ -327,11 +305,13 @@ TEST_P(BatchingSessionTest, Basic) { // conjunction should trigger a batch to be processed. std::unique_ptr first_request_thread(Env::Default()->StartThread( ThreadOptions(), "first_request_thread", [&batching_session] { - TestSingleRequest(100.0f, 42.0f, batching_session.get()); + TestRequest({100.0f, 42.0f}, {2}, {52.0f, 23.0f}, {2}, + batching_session.get()); })); std::unique_ptr second_request_thread(Env::Default()->StartThread( ThreadOptions(), "second_request_thread", [&batching_session] { - TestSingleRequest(71.5f, 18.3f, batching_session.get()); + TestRequest({71.5f, 18.3f}, {2}, {37.75f, 11.15f}, {2}, + batching_session.get()); })); } @@ -659,7 +639,8 @@ TEST_P(BatchingSessionTest, SingletonBatch) { TF_ASSERT_OK(CreateBasicBatchingSession( schedule_options, batching_session_options, {{"x"}, {"y"}}, CreateHalfPlusTwoSession(), &batching_session)); - TestSingleRequest(100.0f, 42.0f, batching_session.get()); + TestRequest({100.0f, 42.0f}, {2}, {52.0f, 23.0f}, {2}, + batching_session.get()); } TEST_P(BatchingSessionTest, RequestThatDoesntMatchSignatureGetsRunAnyway) { @@ -675,7 +656,8 @@ TEST_P(BatchingSessionTest, RequestThatDoesntMatchSignatureGetsRunAnyway) { schedule_options, batching_session_options, {{"x2"}, {"y3"}}, CreateHalfPlusTwoSession(), &batching_session)); // Issue a request using x/y, which doesn't match the x2/y3 signature. - TestSingleRequest(100.0f, 42.0f, batching_session.get()); + TestRequest({100.0f, 42.0f}, {2}, {52.0f, 23.0f}, {2}, + batching_session.get()); } TEST_P(BatchingSessionTest, RequestWithIncompatibleInputTensorSizes) { @@ -735,7 +717,8 @@ TEST_P(BatchingSessionTest, AllowedBatchSizesNoPaddingNeeded) { TF_ASSERT_OK(CreateBasicBatchingSession( schedule_options, batching_session_options, {{"x"}, {"y"}}, std::move(batch_size_capturing_session), &batching_session)); - TestSingleRequest(100.0f, 42.0f, batching_session.get()); + TestRequest({100.0f, 42.0f}, {2}, {52.0f, 23.0f}, {2}, + batching_session.get()); // It should not add any padding, i.e. leave the batch size at 2. EXPECT_EQ(2, batch_size_capturing_session_raw->latest_batch_size()); @@ -776,7 +759,8 @@ TEST_P(BatchingSessionTest, AllowedBatchSizesRequirePadding) { TF_ASSERT_OK(CreateBasicBatchingSession( schedule_options, batching_session_options, {{"x"}, {"y"}}, std::move(batch_size_capturing_session), &batching_session)); - TestSingleRequest(100.0f, 42.0f, batching_session.get()); + TestRequest({100.0f, 42.0f}, {2}, {52.0f, 23.0f}, {2}, + batching_session.get()); // It should pad the batch size from 2 to 3. EXPECT_EQ(3, batch_size_capturing_session_raw->latest_batch_size()); @@ -1007,10 +991,11 @@ TEST_P(BatchingSessionTest, EnqueuedLongerThanTimeout) { TEST_P(BatchingSessionTest, ThreadPoolOptions) { BasicBatchScheduler::Options schedule_options; - schedule_options.max_batch_size = 4; // fits two 2-unit tasks + schedule_options.max_batch_size = 3; schedule_options.batch_timeout_micros = 1 * 1000 * 1000; // won't trigger schedule_options.num_batch_threads = 1; schedule_options = annotate_options(schedule_options); + schedule_options.max_execution_batch_size = 1; std::unique_ptr batching_session; BatchingSessionOptions batching_session_options; TF_ASSERT_OK(CreateBasicBatchingSession( @@ -1022,17 +1007,19 @@ TEST_P(BatchingSessionTest, ThreadPoolOptions) { test_util::CountingThreadPool intra_op_threadpool(Env::Default(), "IntraOp", /*num_threads=*/1); - // Asynchronously send two requests whose total size is 4. The two requests in - // conjunction should trigger a batch to be processed. + // Asynchronously send two requests whose total size is 4. + // They form two batches in both non-split and input-split mode. std::unique_ptr first_request_thread( Env::Default()->StartThread(ThreadOptions(), "first_request_thread", [&] { - TestSingleRequest(RunOptions(), 100.0f, 42.0f, batching_session.get(), - &inter_op_threadpool, &intra_op_threadpool); + TestRequest({100.0f, 42.0f}, {2}, {52.0f, 23.0f}, {2}, + batching_session.get(), &inter_op_threadpool, + &intra_op_threadpool); })); std::unique_ptr second_request_thread(Env::Default()->StartThread( ThreadOptions(), "second_request_thread", [&] { - TestSingleRequest(RunOptions(), 71.5f, 18.3f, batching_session.get(), - &inter_op_threadpool, &intra_op_threadpool); + TestRequest({71.5f, 18.3f}, {2}, {37.75f, 11.15f}, {2}, + batching_session.get(), &inter_op_threadpool, + &intra_op_threadpool); })); } From a4f0e564086cc826c0132e4199493fe73a39eae6 Mon Sep 17 00:00:00 2001 From: Sanjay Kumar Chotakur Date: Thu, 19 Aug 2021 23:01:23 -0700 Subject: [PATCH 5309/8103] Add release notes for tf-serving 2.5.2 PiperOrigin-RevId: 391922136 --- RELEASE.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/RELEASE.md b/RELEASE.md index 44d9ef03813..78c93c48b30 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,3 +1,17 @@ +# Release 2.5.2 + +## Major Features and Improvements + +* No major features or improvements. + +## Breaking Changes + +* No breaking changes + +## Bug Fixes and Other Changes + +* This release is based on TF version 2.5.1 + # Release 2.4.3 ## Major Features and Improvements From 9ed2c311cb5ef39f108446b27b5f4b7bc9dc6a00 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 20 Aug 2021 00:02:06 -0700 Subject: [PATCH 5310/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0158402b-4a67-4ef5-9076-80597b3e057a PiperOrigin-RevId: 391928939 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3268ecb8543..9fd2f962a24 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a14ace72c720edc61242fb805277799504e2814a2cbe8d99949e677dd34717e7", - git_commit = "0c0b48302c769ee69233701b18171a2a4e1c30db", + sha256 = "f23ba73baddea01020f35cc541ec1c8f8161ffcb3ddea658f40321e767fcda9c", + git_commit = "89216684ec30b89b3941ad016c234a1abca0cbc3", ) # Import all of TensorFlow Serving's external dependencies. From 588f16622b0d4f307f6068162332dabd89e2b096 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 20 Aug 2021 06:02:48 -0700 Subject: [PATCH 5311/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/50bbd5a8-5d93-4cc5-8010-ee005e2fbdde PiperOrigin-RevId: 391973967 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9fd2f962a24..299f11f5d17 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f23ba73baddea01020f35cc541ec1c8f8161ffcb3ddea658f40321e767fcda9c", - git_commit = "89216684ec30b89b3941ad016c234a1abca0cbc3", + sha256 = "ba6d10ed073ecd6ee7fc29e815779550b791faf33355a842aafdf482f4308de8", + git_commit = "440628e5c3bfc4c355806048ac8ae3277ee697ad", ) # Import all of TensorFlow Serving's external dependencies. From ba4a5deca6a7c4278b20f15b9b1feddcddcc65ce Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 20 Aug 2021 12:01:53 -0700 Subject: [PATCH 5312/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3f638d1b-df76-464f-a42d-f204bcd152e3 PiperOrigin-RevId: 392040071 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 299f11f5d17..1e69b9d4abd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ba6d10ed073ecd6ee7fc29e815779550b791faf33355a842aafdf482f4308de8", - git_commit = "440628e5c3bfc4c355806048ac8ae3277ee697ad", + sha256 = "c9efb56bd200cc6769a3a79534fed8e309930bbdd73ebf74c2a20d6247b69610", + git_commit = "5cfcd2c02ce53fb7766d557c516e495993f3f4b4", ) # Import all of TensorFlow Serving's external dependencies. From a461c55b6287b0c77fedd498ccb73677586cea98 Mon Sep 17 00:00:00 2001 From: Mingming Liu Date: Fri, 20 Aug 2021 12:44:45 -0700 Subject: [PATCH 5313/8103] Use InputSplitMetadata in batching-session's SplitInputTask, so it handles the lazy splits case. PiperOrigin-RevId: 392049082 --- tensorflow_serving/batching/BUILD | 2 + .../batching/batching_session.cc | 34 +++++---- .../batching/batching_session_test.cc | 70 ++++++++++++++----- 3 files changed, 69 insertions(+), 37 deletions(-) diff --git a/tensorflow_serving/batching/BUILD b/tensorflow_serving/batching/BUILD index 11a973bd577..ae86ca146da 100644 --- a/tensorflow_serving/batching/BUILD +++ b/tensorflow_serving/batching/BUILD @@ -76,6 +76,7 @@ cc_library( ":threadsafe_status", "//tensorflow_serving/servables/tensorflow:serving_session", "//tensorflow_serving/util:hash", + "@com_google_absl//absl/container:fixed_array", "@com_google_absl//absl/types:optional", "@org_tensorflow//tensorflow/core:core_cpu", "@org_tensorflow//tensorflow/core:framework", @@ -84,6 +85,7 @@ cc_library( "@org_tensorflow//tensorflow/core:tensorflow", "@org_tensorflow//tensorflow/core/kernels/batching_util:basic_batch_scheduler", "@org_tensorflow//tensorflow/core/kernels/batching_util:batch_scheduler", + "@org_tensorflow//tensorflow/core/kernels/batching_util:input_split_metadata", "@org_tensorflow//tensorflow/core/profiler/lib:traceme", "@org_tensorflow//tensorflow/core/profiler/lib:traceme_encode", ], diff --git a/tensorflow_serving/batching/batching_session.cc b/tensorflow_serving/batching/batching_session.cc index 47140820673..9768c7888c5 100644 --- a/tensorflow_serving/batching/batching_session.cc +++ b/tensorflow_serving/batching/batching_session.cc @@ -19,10 +19,12 @@ limitations under the License. #include +#include "absl/container/fixed_array.h" #include "tensorflow/core/framework/cost_graph.pb.h" #include "tensorflow/core/framework/tensor.h" #include "tensorflow/core/framework/tensor_shape.h" #include "tensorflow/core/framework/tensor_util.h" +#include "tensorflow/core/kernels/batching_util/input_split_metadata.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/lib/core/notification.h" #include "tensorflow/core/lib/core/status.h" @@ -809,7 +811,7 @@ Status SplitInputTask( BatchingSessionTask& input_task = *(*input_task_ptr); const int64 input_task_size = input_task.size(); - DCHECK_GT(input_task_size, open_batch_remaining_slot); + DCHECK_GT(input_task_size, 0); // `split_task_done_callback` runs only after all split tasks are complete. std::function split_task_done_callback = @@ -879,31 +881,27 @@ Status SplitInputTask( }; IncrementalBarrier barrier(split_task_done_callback); - std::vector output_task_sizes; + const internal::InputSplitMetadata input_split_metadata( + input_task_size, open_batch_remaining_slot, max_batch_size); - if (open_batch_remaining_slot > 0) { - output_task_sizes.push_back(open_batch_remaining_slot); - } - - for (int left_task_size = input_task_size - open_batch_remaining_slot; - left_task_size > 0; left_task_size -= max_batch_size) { - int next_task_size = std::min(left_task_size, max_batch_size); - output_task_sizes.push_back(next_task_size); - } - - const int output_task_num = output_task_sizes.size(); + // Creates an array of int64 from an array of int, since `tensor::Split` + // requires an array of int64. + const absl::FixedArray output_task_sizes( + input_split_metadata.task_sizes().begin(), + input_split_metadata.task_sizes().end()); + const int num_batches = output_task_sizes.size(); - input_task.shared_outputs->resize(output_task_num); + input_task.shared_outputs->resize(num_batches); - for (int i = 0; i < output_task_num; ++i) { + for (int i = 0; i < num_batches; ++i) { (*input_task.shared_outputs)[i].reserve( input_task.output_tensor_names->size()); } - input_task.split_run_metadatas->resize(output_task_num); + input_task.split_run_metadatas->resize(num_batches); - output_tasks->reserve(output_task_num); - for (int i = 0; i < output_task_num; i++) { + output_tasks->reserve(num_batches); + for (int i = 0; i < num_batches; i++) { auto task = absl::make_unique(); task->enqueue_time_micros = input_task.enqueue_time_micros; task->run_options = input_task.run_options; diff --git a/tensorflow_serving/batching/batching_session_test.cc b/tensorflow_serving/batching/batching_session_test.cc index a958a102b04..9b3f84ca374 100644 --- a/tensorflow_serving/batching/batching_session_test.cc +++ b/tensorflow_serving/batching/batching_session_test.cc @@ -246,31 +246,24 @@ TEST(BatchingSessionSignatureTest, TensorSignatureFromSignatureDefs) { UnorderedElementsAre("y0", "y1", "y3")); } -class BatchingSessionTest : public ::testing::TestWithParam { +class BatchingSessionTest + : public ::testing::TestWithParam> { public: BatchingSessionTest() {} - bool enable_large_batch_splitting() const { return GetParam(); } + bool enable_large_batch_splitting() const { return std::get<0>(GetParam()); } + + bool enable_lazy_split() const { return std::get<1>(GetParam()); } std::function< Status(std::unique_ptr* input_task, int first_output_task_size, int max_batch_size, std::vector>* output_tasks)> get_split_input_task_func() const { - const bool enable_large_batch_splitting = - this->enable_large_batch_splitting(); - return [enable_large_batch_splitting]( - std::unique_ptr* input_task, - int open_batch_remaining_slot, int max_batch_size, - std::vector>* output_tasks) - -> Status { - if (enable_large_batch_splitting) { - return SplitInputTask(input_task, open_batch_remaining_slot, - max_batch_size, output_tasks); - } else { - return Status::OK(); - } - }; + if (enable_large_batch_splitting()) { + return SplitInputTask; + } + return nullptr; } // If 'enable_large_batch_splitting' is true, annotate `input_options` with @@ -279,8 +272,10 @@ class BatchingSessionTest : public ::testing::TestWithParam { const BasicBatchScheduler::Options input_options) { BasicBatchScheduler::Options output_options = input_options; + output_options.enable_large_batch_splitting = + enable_large_batch_splitting(); + output_options.enable_lazy_split = enable_lazy_split(); if (enable_large_batch_splitting()) { - output_options.enable_large_batch_splitting = true; output_options.split_input_task_func = get_split_input_task_func(); output_options.max_execution_batch_size = input_options.max_batch_size; } @@ -442,6 +437,37 @@ TEST_P(BatchingSessionTest, BatchHandlesSplitError) { })); } +TEST_P(BatchingSessionTest, BatchingLazySplit) { + if (!enable_large_batch_splitting()) { + return; + } + + BasicBatchScheduler::Options schedule_options; + schedule_options.max_batch_size = 2; + schedule_options.batch_timeout_micros = INT_MAX; // set a large time out + schedule_options.num_batch_threads = 1; + schedule_options = annotate_options(schedule_options); + schedule_options.max_execution_batch_size = 1; + std::unique_ptr batching_session; + BatchingSessionOptions batching_session_options; + TF_ASSERT_OK(CreateBasicBatchingSession( + schedule_options, batching_session_options, {{"x"}, {"y"}}, + CreateHalfPlusTwoSession(), &batching_session)); + + // `max_batch_size` is 2 and `max_execution_batch_size` is 1, so inputs + // will be split and process. + std::unique_ptr first_request_thread(Env::Default()->StartThread( + ThreadOptions(), "first_request", [&batching_session] { + TestRequest({5, 6, 7, 8}, {1, 2, 2}, {4.5, 5, 5.5, 6}, {1, 2, 2}, + batching_session.get()); + })); + std::unique_ptr second_request_thread(Env::Default()->StartThread( + ThreadOptions(), "second_request", [&batching_session] { + TestRequest({1, 2, 3, 4}, {1, 2, 2}, {2.5, 3, 3.5, 4.0}, {1, 2, 2}, + batching_session.get()); + })); +} + TEST(BatchingSessionTest, BatchingWithPaddingAndCost) { BasicBatchScheduler::Options schedule_options; schedule_options.max_batch_size = 2; @@ -1069,8 +1095,14 @@ TEST_P(BatchingSessionTest, SubsetOutputTensors) { })); } -INSTANTIATE_TEST_CASE_P(WithOrWithoutInputSplit, BatchingSessionTest, - ::testing::Bool()); +INSTANTIATE_TEST_SUITE_P( + Parameter, BatchingSessionTest, + ::testing::Values(std::make_tuple(/*enable_input_batch_split=*/false, + /*enable_lazy_split=*/false), + std::make_tuple(/*enable_input_batch_split=*/true, + /*enable_lazy_split=*/false), + std::make_tuple(/*enable_input_batch_split=*/true, + /*enable_lazy_split=*/true))); } // namespace } // namespace serving From 9ec4243f53761d10cb9d0e26b08247c215fb7bd2 Mon Sep 17 00:00:00 2001 From: Mingming Liu Date: Fri, 20 Aug 2021 14:20:55 -0700 Subject: [PATCH 5314/8103] Internal change PiperOrigin-RevId: 392068457 --- tensorflow_serving/tools/docker/tests/docker_test_lib.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/tools/docker/tests/docker_test_lib.sh b/tensorflow_serving/tools/docker/tests/docker_test_lib.sh index 40b784b0138..edfd2c15291 100755 --- a/tensorflow_serving/tools/docker/tests/docker_test_lib.sh +++ b/tensorflow_serving/tools/docker/tests/docker_test_lib.sh @@ -152,7 +152,7 @@ function test_docker_image { echo "Starting TF ModelServer in Docker container from image:${IMAGE} ..." if [[ "$IS_DEVEL_IMAGE" = true ]]; then - echo "Starting TF ModelServer in Docker container from image:${image} ..." + echo "Starting TF ModelServer in Docker container from image:${IMAGE} ..." # Devel images do not run ModelServer but rather start interative shell. # Hence we need to explicitly set entrypoint to modelserver and pass the # required commandline options to serve the model. From b4c2152bd9551668959542580756057bad3655ef Mon Sep 17 00:00:00 2001 From: Sanjay Kumar Chotakur Date: Fri, 20 Aug 2021 15:47:44 -0700 Subject: [PATCH 5315/8103] Add release notes for tf-serving 2.6.0 PiperOrigin-RevId: 392084795 --- RELEASE.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/RELEASE.md b/RELEASE.md index 78c93c48b30..a2612e5f45e 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,3 +1,28 @@ +# Release 2.6.0 + +## Major Features and Improvements + +* Update TF Text to v2.5.0. (commit: 48e5a9e23a1e0b2951b77c3e8f9832193d9b1851) +* Add support for Google ALTS. (commit: ceba636bb7c5c98bde35d1818fd033b36300fffe) +* Enable HTTP PATCH support in HTTP/REST server (commit: 6cbc4a9eb419c8078c3a4e791381cda70dd8fc78) + +## Breaking Changes + +* No breaking changes + +## Bug Fixes and Other Changes + +* Enable tensor output filters with batching. (commit: 448dbe14624538ab76fd6aeb2a456344e7f41c78) +* Update tf.io import in warmup example doc. (commit: 6579d2d056530565cd6606a39c82b2f6c1d3799e) +* Resize tensors if the dimensions of the tflite and tensorflow inputs mismatch, even if the number of elements are the same (commit: 8293f44bd5c5ecc68636cd0d036234f891d29366) +* Add basic batch scheduler for tflite models to improve batch parallelism. (commit: 0ffd6080437ca8175b067be7cc00f5b3df9ea92a) +* Reserve Unavailable error to TF communication ops only. (commit: db9aca187affd0453627a1729916acfea98ae800) +* Add the flag thread_pool_factory_config_file to model server and fix a typo. (commit: efc445f416f8cb20606ca0d2aaf44c13fae7ea4c) + +## Thanks to our Contributors + +This release contains contributions from many people at Google. + # Release 2.5.2 ## Major Features and Improvements From 86646c2875ae1baec59e15e72dbc7809096e874e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 20 Aug 2021 18:01:57 -0700 Subject: [PATCH 5316/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0724fb09-ff30-4688-b3c8-4a24bd8cf0ee PiperOrigin-RevId: 392104442 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1e69b9d4abd..57b6daa2f8a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c9efb56bd200cc6769a3a79534fed8e309930bbdd73ebf74c2a20d6247b69610", - git_commit = "5cfcd2c02ce53fb7766d557c516e495993f3f4b4", + sha256 = "8c40ae2ea8d99e89ffa6207a9919f54ec058b4e661ea0db4fdd0de39a3579d4a", + git_commit = "08efa249c135502a8f466218aa4ce26b9be86cb5", ) # Import all of TensorFlow Serving's external dependencies. From 96e613f857d1110cc38624bc38d1657c5ee89747 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 21 Aug 2021 00:01:43 -0700 Subject: [PATCH 5317/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9a349375-1927-4bb2-9b95-f4b411a504f4 PiperOrigin-RevId: 392137434 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 57b6daa2f8a..5fa9c13fc03 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8c40ae2ea8d99e89ffa6207a9919f54ec058b4e661ea0db4fdd0de39a3579d4a", - git_commit = "08efa249c135502a8f466218aa4ce26b9be86cb5", + sha256 = "a3938e95d166596cb3a580b1999869b9b23bb0c2fda44ba6058910ddec2d0ac7", + git_commit = "e1b7e72bed082a8d01a40bb9d049343f1fa5a3f1", ) # Import all of TensorFlow Serving's external dependencies. From 3fac4cc0b7302ffc3b6158426b0aff020d312bc1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 21 Aug 2021 06:02:05 -0700 Subject: [PATCH 5318/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6a3771a8-81ad-4915-ac12-5a354c88174f PiperOrigin-RevId: 392165732 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5fa9c13fc03..2e5d10a25cd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a3938e95d166596cb3a580b1999869b9b23bb0c2fda44ba6058910ddec2d0ac7", - git_commit = "e1b7e72bed082a8d01a40bb9d049343f1fa5a3f1", + sha256 = "6e64fb5d9d55e8a0fd7d1ea5c11789622a2029874111c1d7f507b64e5eef9d80", + git_commit = "65766f571f8c735421bebd9f9c8029fde4f5c4e5", ) # Import all of TensorFlow Serving's external dependencies. From 87fce179661181ecbd2e57c28ff12d4c7493a1f9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 21 Aug 2021 12:01:31 -0700 Subject: [PATCH 5319/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e7fdbd5a-65fd-4bf0-aef3-dc1bc3bfe374 PiperOrigin-RevId: 392193523 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2e5d10a25cd..fedbccc58ab 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6e64fb5d9d55e8a0fd7d1ea5c11789622a2029874111c1d7f507b64e5eef9d80", - git_commit = "65766f571f8c735421bebd9f9c8029fde4f5c4e5", + sha256 = "048a83ea64b328542b59a05daebf5a535d03291510394eba5acddf197297f6fd", + git_commit = "0fb82942a0b9d734f066575eeb38963de1d7d1c9", ) # Import all of TensorFlow Serving's external dependencies. From 533ffe69720fd5354a3eb219573b2674edaafbf1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 21 Aug 2021 18:01:51 -0700 Subject: [PATCH 5320/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8223a388-5f7a-4513-8295-72f9baf76568 PiperOrigin-RevId: 392220215 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fedbccc58ab..a9b2c2dae2f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "048a83ea64b328542b59a05daebf5a535d03291510394eba5acddf197297f6fd", - git_commit = "0fb82942a0b9d734f066575eeb38963de1d7d1c9", + sha256 = "41a9432c6fc522a50c58bae762a9ea9410b815c190bb1fefb2864d546bf7310e", + git_commit = "dbe21cbc15407e34cbae66882cee3f1fbf583ff2", ) # Import all of TensorFlow Serving's external dependencies. From 065cd5225a2658a0a59cf68b9ec3f0c45559248b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 22 Aug 2021 00:01:45 -0700 Subject: [PATCH 5321/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1d5c743e-1072-428a-9e53-968313cdf7c7 PiperOrigin-RevId: 392247423 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a9b2c2dae2f..3121dda5864 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "41a9432c6fc522a50c58bae762a9ea9410b815c190bb1fefb2864d546bf7310e", - git_commit = "dbe21cbc15407e34cbae66882cee3f1fbf583ff2", + sha256 = "9626c7a2ed0a7c7e5a047369daf8caf45d3cdf3b345f7818bc4358dfc455a8b8", + git_commit = "2d2d5f71b7c06e460578781f78805995f131ef48", ) # Import all of TensorFlow Serving's external dependencies. From 955e4ee234ad0af7c3c841a964b7013959072a94 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 22 Aug 2021 06:01:47 -0700 Subject: [PATCH 5322/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f131d5f0-f94b-48c7-86e1-3fe69f03d11e PiperOrigin-RevId: 392276237 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3121dda5864..30836ab604e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9626c7a2ed0a7c7e5a047369daf8caf45d3cdf3b345f7818bc4358dfc455a8b8", - git_commit = "2d2d5f71b7c06e460578781f78805995f131ef48", + sha256 = "482f16fe96367be32345f6154db308ee075cebd5f59414d0c79213b3a3943f71", + git_commit = "3c29e255b44d49cb50a1ef4ac31fac0caf288f59", ) # Import all of TensorFlow Serving's external dependencies. From a551606885abfb5c246707c4291e2ad0e971afaa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 22 Aug 2021 12:01:54 -0700 Subject: [PATCH 5323/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2c69df54-6246-4ad8-8d22-28888836b48b PiperOrigin-RevId: 392303209 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 30836ab604e..c67eff32f35 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "482f16fe96367be32345f6154db308ee075cebd5f59414d0c79213b3a3943f71", - git_commit = "3c29e255b44d49cb50a1ef4ac31fac0caf288f59", + sha256 = "f836d91f3620855ad608b30c5b8b39e81b7803ba280c063b57c868a86ea83168", + git_commit = "5e57698fd26f9b441df03108ecbeb80a6642716a", ) # Import all of TensorFlow Serving's external dependencies. From 60cb40d289d36077cbaf8bf7513b793d37f052cf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 22 Aug 2021 18:01:54 -0700 Subject: [PATCH 5324/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f795aecb-191b-483c-b237-c43920b5d1e0 PiperOrigin-RevId: 392331518 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c67eff32f35..afe84bcf7c0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f836d91f3620855ad608b30c5b8b39e81b7803ba280c063b57c868a86ea83168", - git_commit = "5e57698fd26f9b441df03108ecbeb80a6642716a", + sha256 = "e26e97aff62e10ebd3c45aad03a53722d93b3e4e1c593ed1d5105e7fe16c13f6", + git_commit = "824316601bf8f3a44028c5ce93495ea8fd515803", ) # Import all of TensorFlow Serving's external dependencies. From df4e2105b37070f900a16b66e13f97c7a27f11f2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 23 Aug 2021 00:01:36 -0700 Subject: [PATCH 5325/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/609de127-185e-4b56-8c46-368eaf668ec5 PiperOrigin-RevId: 392366349 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index afe84bcf7c0..556f6310d67 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e26e97aff62e10ebd3c45aad03a53722d93b3e4e1c593ed1d5105e7fe16c13f6", - git_commit = "824316601bf8f3a44028c5ce93495ea8fd515803", + sha256 = "e88068e94171e7ad8a48862c4b44ca6c507e983b0aefffc832f823f444a828b8", + git_commit = "d1b4fb5e8c412ea9ef1bffe242e67a248a107e69", ) # Import all of TensorFlow Serving's external dependencies. From 25ed824236f84437b78de510d605246734442b89 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 23 Aug 2021 06:01:53 -0700 Subject: [PATCH 5326/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f7489b51-5319-40da-9f13-c8a106a2205d PiperOrigin-RevId: 392412482 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 556f6310d67..5bd83d712f7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e88068e94171e7ad8a48862c4b44ca6c507e983b0aefffc832f823f444a828b8", - git_commit = "d1b4fb5e8c412ea9ef1bffe242e67a248a107e69", + sha256 = "56562bce6465bf8ddb04b3d5965ef083721f82656e0f37219d17750c5a4ec043", + git_commit = "5ca10dc92057d721397c5e9161c3c28b2c44d24e", ) # Import all of TensorFlow Serving's external dependencies. From d60c8211f08201705fc411545722b214f684b583 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 23 Aug 2021 12:01:59 -0700 Subject: [PATCH 5327/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6194e41d-2949-45fc-9219-791608a68465 PiperOrigin-RevId: 392486762 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5bd83d712f7..cdfcfb69fd0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "56562bce6465bf8ddb04b3d5965ef083721f82656e0f37219d17750c5a4ec043", - git_commit = "5ca10dc92057d721397c5e9161c3c28b2c44d24e", + sha256 = "f778019e30d4fb029106652394b6197a4e2d873affb76dabf35b143283677865", + git_commit = "177486a8bce8e2dfbf942b158a703eb0fc33b425", ) # Import all of TensorFlow Serving's external dependencies. From 4a3725f88fc5473f8ac78e6c6c64aa2db2e1d3e7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 23 Aug 2021 18:01:42 -0700 Subject: [PATCH 5328/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0a981c25-6892-4697-a93e-3a5a1ce5a503 PiperOrigin-RevId: 392559708 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cdfcfb69fd0..bdbc4c8d5a7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f778019e30d4fb029106652394b6197a4e2d873affb76dabf35b143283677865", - git_commit = "177486a8bce8e2dfbf942b158a703eb0fc33b425", + sha256 = "e8a537a31268191e987f816729fa971630d94e7a83b6f643e0840e95379617d1", + git_commit = "9759a457d44690f0de4f5f25c51483acb12ef179", ) # Import all of TensorFlow Serving's external dependencies. From 61365e7210e5e1e810943daf30326a7864864ffd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 25 Aug 2021 18:01:35 -0700 Subject: [PATCH 5329/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/48c42fd1-7c1f-4713-8d00-4911959ee850 PiperOrigin-RevId: 393019705 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bdbc4c8d5a7..d9d5104cb4c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e8a537a31268191e987f816729fa971630d94e7a83b6f643e0840e95379617d1", - git_commit = "9759a457d44690f0de4f5f25c51483acb12ef179", + sha256 = "9a481719915ee74a158ad3d0ecb7e311d94462ff0fd915d68372809fc8ea6a56", + git_commit = "4483ab5855bb4d052934dfe7529c44590de67e29", ) # Import all of TensorFlow Serving's external dependencies. From 5147af3c9828e205c3d9e29ede8fdd47d612faa9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 26 Aug 2021 00:01:56 -0700 Subject: [PATCH 5330/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bf650992-145f-4702-ad1b-a340754297bb PiperOrigin-RevId: 393061132 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d9d5104cb4c..2a39b53b1b3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9a481719915ee74a158ad3d0ecb7e311d94462ff0fd915d68372809fc8ea6a56", - git_commit = "4483ab5855bb4d052934dfe7529c44590de67e29", + sha256 = "42e72eccd408d83a5561268fefb75fdf0bf53ac37f78cc9c161c31123bb7f7b8", + git_commit = "3edbbc918a940162fc9ae4d69bba0fff86db9ca2", ) # Import all of TensorFlow Serving's external dependencies. From 2c7172887f7137242dd84ce9995603b45e8d9389 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 26 Aug 2021 06:02:16 -0700 Subject: [PATCH 5331/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/41197871-419f-4509-b1fa-adc6a1e5e1de PiperOrigin-RevId: 393105805 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2a39b53b1b3..99cd82722d6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "42e72eccd408d83a5561268fefb75fdf0bf53ac37f78cc9c161c31123bb7f7b8", - git_commit = "3edbbc918a940162fc9ae4d69bba0fff86db9ca2", + sha256 = "ff1520191321fd10343b2b2c914f5f92751443b9d1b04bfe55e5d9ca7d6fad1d", + git_commit = "38c7871ecf1a4ede109fa0ce870c5d8d5401df05", ) # Import all of TensorFlow Serving's external dependencies. From fc56d3ff8f41bb17d9bd9e3ee5285f605f726c93 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 26 Aug 2021 12:01:46 -0700 Subject: [PATCH 5332/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f049dc9c-4be7-406d-bd60-7c9fb20fef2c PiperOrigin-RevId: 393175916 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 99cd82722d6..11d8cf43d09 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ff1520191321fd10343b2b2c914f5f92751443b9d1b04bfe55e5d9ca7d6fad1d", - git_commit = "38c7871ecf1a4ede109fa0ce870c5d8d5401df05", + sha256 = "fec9f59476d229da82770806e0bb04b08c694fa6a0cd5bd64c2afd306733bef4", + git_commit = "498b2df2204c038b2d99df6ee274311fb5cbc213", ) # Import all of TensorFlow Serving's external dependencies. From beb023e7f3b6b796e629aaa8aeafc928e248c619 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 26 Aug 2021 18:01:47 -0700 Subject: [PATCH 5333/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ae4183f0-1ea1-49fe-88a1-7c5b496c96eb PiperOrigin-RevId: 393249458 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 11d8cf43d09..2f6a258446c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fec9f59476d229da82770806e0bb04b08c694fa6a0cd5bd64c2afd306733bef4", - git_commit = "498b2df2204c038b2d99df6ee274311fb5cbc213", + sha256 = "2746a24c964df716755c90cc9373a6f9535d44cd1acb79d2bb7f6e0ab8569066", + git_commit = "a04c001c0e2e257f9d0f4d01ca24dfa1b9e83dcd", ) # Import all of TensorFlow Serving's external dependencies. From e4e53420a0d885aeaefe6bee17abb255f79c34db Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 27 Aug 2021 00:01:53 -0700 Subject: [PATCH 5334/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3fd3baa5-98ff-41ec-b487-cdea3171d59b PiperOrigin-RevId: 393290672 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2f6a258446c..4f8c4b2bfe1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2746a24c964df716755c90cc9373a6f9535d44cd1acb79d2bb7f6e0ab8569066", - git_commit = "a04c001c0e2e257f9d0f4d01ca24dfa1b9e83dcd", + sha256 = "3212022c00f4e3c27cb39eaefe460298c61f954a1575ebafe65d324fcc660eea", + git_commit = "b38d7ac9ff2c8e620990d291baa30f5c6e1aad7f", ) # Import all of TensorFlow Serving's external dependencies. From 02ef6d240cb52555488b0294a87e635cae4e8908 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 27 Aug 2021 06:01:54 -0700 Subject: [PATCH 5335/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/085cd759-cd63-49b3-82f6-e87eee3aaae1 PiperOrigin-RevId: 393334565 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4f8c4b2bfe1..a813b009f0d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3212022c00f4e3c27cb39eaefe460298c61f954a1575ebafe65d324fcc660eea", - git_commit = "b38d7ac9ff2c8e620990d291baa30f5c6e1aad7f", + sha256 = "e5314344c5a921150071714c5bb5c46713b2a8208deac30f4c201f0f7fe2c8b6", + git_commit = "d05242d2851641d80420434295e847b3daad5bbb", ) # Import all of TensorFlow Serving's external dependencies. From c51a20b09fe542c83d73419a93b306646380efee Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 27 Aug 2021 12:01:58 -0700 Subject: [PATCH 5336/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/14f9769d-a361-4f86-96f6-64d6f4650074 PiperOrigin-RevId: 393399122 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a813b009f0d..fcea1b8972b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e5314344c5a921150071714c5bb5c46713b2a8208deac30f4c201f0f7fe2c8b6", - git_commit = "d05242d2851641d80420434295e847b3daad5bbb", + sha256 = "283ba1bf576b1cce47a407c2c3865fa529950eb09a0302b59ebc8cb4a40cee0f", + git_commit = "a244390bce1c73c5ef55e42dac19599ea115d772", ) # Import all of TensorFlow Serving's external dependencies. From 56610728067fe5b39d2906884673853ef06792c2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 27 Aug 2021 18:01:44 -0700 Subject: [PATCH 5337/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ff27816c-40a0-413b-bf94-74e5b727f1c5 PiperOrigin-RevId: 393462713 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fcea1b8972b..205f6d915fa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "283ba1bf576b1cce47a407c2c3865fa529950eb09a0302b59ebc8cb4a40cee0f", - git_commit = "a244390bce1c73c5ef55e42dac19599ea115d772", + sha256 = "21605f86768eb910de1b429556c4d3ca1ad3c47e09b5eec6ff95bb2cac13068a", + git_commit = "143d0048b226570b25d54acbc31ecd9227afa44e", ) # Import all of TensorFlow Serving's external dependencies. From 6b6caa313b616bc3aed0eacea214f8046286e0a5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 28 Aug 2021 00:03:38 -0700 Subject: [PATCH 5338/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c9388334-a81e-403f-976c-9ea3ad7fe119 PiperOrigin-RevId: 393493700 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 205f6d915fa..82d01cd4b3a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "21605f86768eb910de1b429556c4d3ca1ad3c47e09b5eec6ff95bb2cac13068a", - git_commit = "143d0048b226570b25d54acbc31ecd9227afa44e", + sha256 = "4c02648c582ae17155cad9619ae86261333f19abab7530293756bb296fbd8d14", + git_commit = "685a2e3b7eaf090db1667f6e7f0b5409482d2844", ) # Import all of TensorFlow Serving's external dependencies. From a4eef7d11cd44047936c22f3a3a248d3e9f6953c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 28 Aug 2021 06:02:11 -0700 Subject: [PATCH 5339/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/82ea4114-1ce6-4b38-b27f-79d3a539735c PiperOrigin-RevId: 393520926 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 82d01cd4b3a..3d50a283e65 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4c02648c582ae17155cad9619ae86261333f19abab7530293756bb296fbd8d14", - git_commit = "685a2e3b7eaf090db1667f6e7f0b5409482d2844", + sha256 = "504ae1fe7322af5f268f2c2691db0192e4830108ecd61689337399d73ff0c9f0", + git_commit = "1d49c355b766a4337db66a67b6623cd364aecd37", ) # Import all of TensorFlow Serving's external dependencies. From bde95cb4e257f015fa2110103b7d0758c3454bfc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 28 Aug 2021 18:01:46 -0700 Subject: [PATCH 5340/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ce00b7a7-292c-4bbf-a61c-6343ab22f370 PiperOrigin-RevId: 393572578 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3d50a283e65..ad78535dde2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "504ae1fe7322af5f268f2c2691db0192e4830108ecd61689337399d73ff0c9f0", - git_commit = "1d49c355b766a4337db66a67b6623cd364aecd37", + sha256 = "fef1cda49eb3b0bb837239a69c42b863a5fda38a62b4325ca61da13acfcbd357", + git_commit = "b6263beb4a8283bf5c07dc2358f54c68a631b376", ) # Import all of TensorFlow Serving's external dependencies. From f3e9d400358ab8a69d435fb93840f79d6b7b2027 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 29 Aug 2021 00:01:52 -0700 Subject: [PATCH 5341/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e776c491-dac2-4c06-8ce7-89d91cecbe89 PiperOrigin-RevId: 393597439 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ad78535dde2..9aa45852183 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fef1cda49eb3b0bb837239a69c42b863a5fda38a62b4325ca61da13acfcbd357", - git_commit = "b6263beb4a8283bf5c07dc2358f54c68a631b376", + sha256 = "cd69cf0ff66fcb6bf5f7cfeb72a82a7ea2d5e71cb41a2d028dace652b999cc33", + git_commit = "e7f914fd16221e047e62b745b990fa22f3cfa932", ) # Import all of TensorFlow Serving's external dependencies. From 5311a23d31821cb3ab0bc1711ea2e602c8d0a95b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 29 Aug 2021 06:01:48 -0700 Subject: [PATCH 5342/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c8c7b2d5-ac98-4511-bf95-2b9f335ae1df PiperOrigin-RevId: 393625331 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9aa45852183..3a61c804435 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cd69cf0ff66fcb6bf5f7cfeb72a82a7ea2d5e71cb41a2d028dace652b999cc33", - git_commit = "e7f914fd16221e047e62b745b990fa22f3cfa932", + sha256 = "baaec2e1a6fbbc906c6f73e91d82d95a1d302764b60797d1e1ec0b84e7230412", + git_commit = "b4baf4471d13d16df1cc776447ec86721a0e2122", ) # Import all of TensorFlow Serving's external dependencies. From dabbff0e83defc89b4bc676265e6bcb7e05835e5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 30 Aug 2021 00:02:19 -0700 Subject: [PATCH 5343/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e3821f81-4184-4ba0-be0e-396e453c20f1 PiperOrigin-RevId: 393710722 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3a61c804435..34ef0e862df 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "baaec2e1a6fbbc906c6f73e91d82d95a1d302764b60797d1e1ec0b84e7230412", - git_commit = "b4baf4471d13d16df1cc776447ec86721a0e2122", + sha256 = "79825bb06f95de1b1b58f348eb0e216982a776e502ea2d52ec91857a51aeaf20", + git_commit = "19c122a81862561c031e4759cb1e5324c6023ee7", ) # Import all of TensorFlow Serving's external dependencies. From 03a7f4d26fd7f5ec7c0f99acb61853be59934305 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 30 Aug 2021 06:02:16 -0700 Subject: [PATCH 5344/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1bf89c66-8904-4b2b-880d-46bf6ea2d0b3 PiperOrigin-RevId: 393753437 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 34ef0e862df..2b020c32eff 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "79825bb06f95de1b1b58f348eb0e216982a776e502ea2d52ec91857a51aeaf20", - git_commit = "19c122a81862561c031e4759cb1e5324c6023ee7", + sha256 = "2794188d9e933118fd8bcf7617d16b5263c5af60312716e513dae820c5e80df6", + git_commit = "4e8bba06da6c3212c1d4e19ef86c42d905d47c7a", ) # Import all of TensorFlow Serving's external dependencies. From 4e9517c9ef4ecfb60ef36f56c594e4390b334f17 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 30 Aug 2021 12:02:10 -0700 Subject: [PATCH 5345/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d82bf9cd-c473-4eb0-b6eb-7628799c2159 PiperOrigin-RevId: 393823831 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2b020c32eff..395688e71b2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2794188d9e933118fd8bcf7617d16b5263c5af60312716e513dae820c5e80df6", - git_commit = "4e8bba06da6c3212c1d4e19ef86c42d905d47c7a", + sha256 = "1a7c59f877ed49e60fd8cc3c02aecadd5c435119d8875b581ded559125d3cbcc", + git_commit = "ac58751deaafcc4622064d553fdbb2763a64e707", ) # Import all of TensorFlow Serving's external dependencies. From 5a3ff0ee06d75857b2b7f3ec24c57976d208dee8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 30 Aug 2021 18:02:14 -0700 Subject: [PATCH 5346/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b3fb420a-5187-4506-8eab-987177fc8b8c PiperOrigin-RevId: 393893375 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 395688e71b2..0c1ee4699a1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1a7c59f877ed49e60fd8cc3c02aecadd5c435119d8875b581ded559125d3cbcc", - git_commit = "ac58751deaafcc4622064d553fdbb2763a64e707", + sha256 = "99efbf4ae448ac240c44194525c4a13adf75a5c6e9affabe2b7f35f1f72108d6", + git_commit = "c88f75c410676d4acd560ddd2dd42d262dad7935", ) # Import all of TensorFlow Serving's external dependencies. From e67bc35934d09a10366238a331b4684e5ed2ea1c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 30 Aug 2021 21:15:51 -0700 Subject: [PATCH 5347/8103] Internal build cleanup PiperOrigin-RevId: 393915314 --- tensorflow_serving/example/BUILD | 1 + tensorflow_serving/example/resnet_client.cc | 4 ++-- .../experimental/tensorflow/ops/remote_predict/BUILD | 3 +++ .../remote_predict/kernels/prediction_service_grpc.cc | 4 ++-- tensorflow_serving/model_servers/BUILD | 4 ++++ tensorflow_serving/model_servers/model_service_impl.h | 2 +- .../model_servers/prediction_service_impl.cc | 2 +- tensorflow_serving/model_servers/server.cc | 10 +++++----- tensorflow_serving/model_servers/server.h | 2 +- 9 files changed, 20 insertions(+), 12 deletions(-) diff --git a/tensorflow_serving/example/BUILD b/tensorflow_serving/example/BUILD index b6beae6c47c..756a2a744ca 100644 --- a/tensorflow_serving/example/BUILD +++ b/tensorflow_serving/example/BUILD @@ -25,6 +25,7 @@ cc_binary( ], deps = [ "//tensorflow_serving/apis:prediction_service_cc_proto", + "//third_party/grpc:grpc++", "@com_github_grpc_grpc//:grpc++", "@com_google_protobuf//:protobuf_lite", "@org_tensorflow//tensorflow/core:framework", diff --git a/tensorflow_serving/example/resnet_client.cc b/tensorflow_serving/example/resnet_client.cc index 9c1a61c3ac7..7a947b6a27c 100644 --- a/tensorflow_serving/example/resnet_client.cc +++ b/tensorflow_serving/example/resnet_client.cc @@ -18,9 +18,9 @@ limitations under the License. #include #include -#include "grpcpp/create_channel.h" -#include "grpcpp/security/credentials.h" #include "google/protobuf/map.h" +#include "third_party/grpc/include/grpcpp/create_channel.h" +#include "third_party/grpc/include/grpcpp/security/credentials.h" #include "tensorflow/core/framework/tensor.h" #include "tensorflow/core/platform/jpeg.h" #include "tensorflow/core/platform/types.h" diff --git a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/BUILD b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/BUILD index f821eaad8db..3f01effdfac 100644 --- a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/BUILD +++ b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/BUILD @@ -19,6 +19,7 @@ cc_library( "//tensorflow_serving/apis:model_cc_proto", "//tensorflow_serving/apis:predict_cc_proto", "//tensorflow_serving/apis:prediction_service_cc_proto", + "//third_party/grpc:grpc++", "@com_github_grpc_grpc//:grpc++", "@com_google_absl//absl/status", "@com_google_absl//absl/time", @@ -86,6 +87,7 @@ tf_kernel_library( "//tensorflow_serving/apis:model_cc_proto", "//tensorflow_serving/apis:predict_cc_proto", "//tensorflow_serving/apis:prediction_service_cc_proto", + "//third_party/grpc:grpc++", "@com_github_grpc_grpc//:grpc++", "@com_google_absl//absl/status", "@com_google_absl//absl/time", @@ -160,6 +162,7 @@ cc_library( hdrs = ["kernels/prediction_service_grpc.h"], deps = [ "//tensorflow_serving/apis:prediction_service_cc_proto", + "//third_party/grpc:grpc++", "@com_github_grpc_grpc//:grpc++", "@com_google_absl//absl/status", "@com_google_absl//absl/time", diff --git a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/prediction_service_grpc.cc b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/prediction_service_grpc.cc index 988f6b0330c..95c315d59d7 100644 --- a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/prediction_service_grpc.cc +++ b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/prediction_service_grpc.cc @@ -14,9 +14,9 @@ limitations under the License. ==============================================================================*/ #include "tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/prediction_service_grpc.h" -#include "grpcpp/create_channel.h" -#include "grpcpp/security/credentials.h" #include "absl/time/clock.h" +#include "third_party/grpc/include/grpcpp/create_channel.h" +#include "third_party/grpc/include/grpcpp/security/credentials.h" using namespace tensorflow; // NOLINT(build/namespaces) namespace tensorflow { diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 45037434685..23671aa3c82 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -210,6 +210,7 @@ cc_library( "//tensorflow_serving/apis:model_management_cc_proto", "//tensorflow_serving/apis:model_service_cc_proto", "//tensorflow_serving/util:status_util", + "//third_party/grpc:grpc++", "@com_github_grpc_grpc//:grpc++", ], ) @@ -233,6 +234,7 @@ cc_library( "//tensorflow_serving/servables/tensorflow:predict_impl", "//tensorflow_serving/servables/tensorflow:regression_service", "//tensorflow_serving/servables/tensorflow:thread_pool_factory", + "//third_party/grpc", "@com_github_grpc_grpc//:grpc++", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", @@ -350,6 +352,8 @@ cc_library( ":model_service_impl", "@com_google_protobuf//:cc_wkt_protos", "@com_github_grpc_grpc//:grpc++", + "//third_party/grpc", + "//third_party/grpc:grpc++", "@org_tensorflow//tensorflow/c:c_api", "@org_tensorflow//tensorflow/cc/saved_model:tag_constants", "@org_tensorflow//tensorflow/core:lib", diff --git a/tensorflow_serving/model_servers/model_service_impl.h b/tensorflow_serving/model_servers/model_service_impl.h index 7778359530d..99d26f51a37 100644 --- a/tensorflow_serving/model_servers/model_service_impl.h +++ b/tensorflow_serving/model_servers/model_service_impl.h @@ -16,8 +16,8 @@ limitations under the License. #ifndef TENSORFLOW_SERVING_MODEL_SERVERS_MODEL_SERVICE_IMPL_H_ #define TENSORFLOW_SERVING_MODEL_SERVERS_MODEL_SERVICE_IMPL_H_ -#include "grpcpp/server_context.h" #include "grpcpp/support/status.h" +#include "third_party/grpc/include/grpcpp/server_context.h" #include "tensorflow_serving/apis/model_management.pb.h" #include "tensorflow_serving/apis/model_service.grpc.pb.h" #include "tensorflow_serving/apis/model_service.pb.h" diff --git a/tensorflow_serving/model_servers/prediction_service_impl.cc b/tensorflow_serving/model_servers/prediction_service_impl.cc index eeb71e634b0..cd60dd10f4d 100644 --- a/tensorflow_serving/model_servers/prediction_service_impl.cc +++ b/tensorflow_serving/model_servers/prediction_service_impl.cc @@ -15,7 +15,7 @@ limitations under the License. #include "tensorflow_serving/model_servers/prediction_service_impl.h" -#include "grpc/grpc.h" +#include "third_party/grpc/include/grpc/grpc.h" #include "tensorflow/core/platform/threadpool_options.h" #include "tensorflow_serving/model_servers/grpc_status_util.h" #include "tensorflow_serving/servables/tensorflow/classification_service.h" diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index 97215ae24c0..f226a4d3b05 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -23,13 +23,13 @@ limitations under the License. #include #include "google/protobuf/wrappers.pb.h" -#include "grpc/grpc.h" -#include "grpcpp/resource_quota.h" -#include "grpcpp/security/server_credentials.h" -#include "grpcpp/server_builder.h" -#include "grpcpp/server_context.h" #include "grpcpp/support/status.h" #include "absl/memory/memory.h" +#include "third_party/grpc/include/grpc/grpc.h" +#include "third_party/grpc/include/grpcpp/resource_quota.h" +#include "third_party/grpc/include/grpcpp/security/server_credentials.h" +#include "third_party/grpc/include/grpcpp/server_builder.h" +#include "third_party/grpc/include/grpcpp/server_context.h" #include "tensorflow/c/c_api.h" #include "tensorflow/cc/saved_model/tag_constants.h" #include "tensorflow/core/lib/core/errors.h" diff --git a/tensorflow_serving/model_servers/server.h b/tensorflow_serving/model_servers/server.h index 36625c2c568..9f15f7b06be 100644 --- a/tensorflow_serving/model_servers/server.h +++ b/tensorflow_serving/model_servers/server.h @@ -18,7 +18,7 @@ limitations under the License. #include -#include "grpcpp/server.h" +#include "third_party/grpc/include/grpcpp/server.h" #include "tensorflow/core/kernels/batching_util/periodic_function.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/platform/cpu_info.h" From d384a78885cba5929e818bc9a3299612e1770c23 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 31 Aug 2021 00:03:03 -0700 Subject: [PATCH 5348/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/24a1313c-0da5-45c7-a3d8-49a5a156fb4d PiperOrigin-RevId: 393932505 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0c1ee4699a1..ba7ecb21242 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "99efbf4ae448ac240c44194525c4a13adf75a5c6e9affabe2b7f35f1f72108d6", - git_commit = "c88f75c410676d4acd560ddd2dd42d262dad7935", + sha256 = "c39d5335c4d69ddeec924f1fb9859e57a3609d20587f70ab4ebaf7b69dc27e35", + git_commit = "0bd6bf72b8777b6f8615a1ffdd7b42bef1e1774d", ) # Import all of TensorFlow Serving's external dependencies. From 6b1a02b5fc63def9b4cfd75bd9dbce9bed4c10bb Mon Sep 17 00:00:00 2001 From: Li Lao Date: Tue, 31 Aug 2021 12:58:24 -0700 Subject: [PATCH 5349/8103] Internal build cleanup PiperOrigin-RevId: 394067295 --- tensorflow_serving/example/BUILD | 1 - tensorflow_serving/example/resnet_client.cc | 4 ++-- .../experimental/tensorflow/ops/remote_predict/BUILD | 3 --- .../remote_predict/kernels/prediction_service_grpc.cc | 4 ++-- tensorflow_serving/model_servers/BUILD | 4 ---- tensorflow_serving/model_servers/model_service_impl.h | 2 +- .../model_servers/prediction_service_impl.cc | 2 +- tensorflow_serving/model_servers/server.cc | 10 +++++----- tensorflow_serving/model_servers/server.h | 2 +- 9 files changed, 12 insertions(+), 20 deletions(-) diff --git a/tensorflow_serving/example/BUILD b/tensorflow_serving/example/BUILD index 756a2a744ca..b6beae6c47c 100644 --- a/tensorflow_serving/example/BUILD +++ b/tensorflow_serving/example/BUILD @@ -25,7 +25,6 @@ cc_binary( ], deps = [ "//tensorflow_serving/apis:prediction_service_cc_proto", - "//third_party/grpc:grpc++", "@com_github_grpc_grpc//:grpc++", "@com_google_protobuf//:protobuf_lite", "@org_tensorflow//tensorflow/core:framework", diff --git a/tensorflow_serving/example/resnet_client.cc b/tensorflow_serving/example/resnet_client.cc index 7a947b6a27c..9c1a61c3ac7 100644 --- a/tensorflow_serving/example/resnet_client.cc +++ b/tensorflow_serving/example/resnet_client.cc @@ -18,9 +18,9 @@ limitations under the License. #include #include +#include "grpcpp/create_channel.h" +#include "grpcpp/security/credentials.h" #include "google/protobuf/map.h" -#include "third_party/grpc/include/grpcpp/create_channel.h" -#include "third_party/grpc/include/grpcpp/security/credentials.h" #include "tensorflow/core/framework/tensor.h" #include "tensorflow/core/platform/jpeg.h" #include "tensorflow/core/platform/types.h" diff --git a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/BUILD b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/BUILD index 3f01effdfac..f821eaad8db 100644 --- a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/BUILD +++ b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/BUILD @@ -19,7 +19,6 @@ cc_library( "//tensorflow_serving/apis:model_cc_proto", "//tensorflow_serving/apis:predict_cc_proto", "//tensorflow_serving/apis:prediction_service_cc_proto", - "//third_party/grpc:grpc++", "@com_github_grpc_grpc//:grpc++", "@com_google_absl//absl/status", "@com_google_absl//absl/time", @@ -87,7 +86,6 @@ tf_kernel_library( "//tensorflow_serving/apis:model_cc_proto", "//tensorflow_serving/apis:predict_cc_proto", "//tensorflow_serving/apis:prediction_service_cc_proto", - "//third_party/grpc:grpc++", "@com_github_grpc_grpc//:grpc++", "@com_google_absl//absl/status", "@com_google_absl//absl/time", @@ -162,7 +160,6 @@ cc_library( hdrs = ["kernels/prediction_service_grpc.h"], deps = [ "//tensorflow_serving/apis:prediction_service_cc_proto", - "//third_party/grpc:grpc++", "@com_github_grpc_grpc//:grpc++", "@com_google_absl//absl/status", "@com_google_absl//absl/time", diff --git a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/prediction_service_grpc.cc b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/prediction_service_grpc.cc index 95c315d59d7..988f6b0330c 100644 --- a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/prediction_service_grpc.cc +++ b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/prediction_service_grpc.cc @@ -14,9 +14,9 @@ limitations under the License. ==============================================================================*/ #include "tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/prediction_service_grpc.h" +#include "grpcpp/create_channel.h" +#include "grpcpp/security/credentials.h" #include "absl/time/clock.h" -#include "third_party/grpc/include/grpcpp/create_channel.h" -#include "third_party/grpc/include/grpcpp/security/credentials.h" using namespace tensorflow; // NOLINT(build/namespaces) namespace tensorflow { diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 23671aa3c82..45037434685 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -210,7 +210,6 @@ cc_library( "//tensorflow_serving/apis:model_management_cc_proto", "//tensorflow_serving/apis:model_service_cc_proto", "//tensorflow_serving/util:status_util", - "//third_party/grpc:grpc++", "@com_github_grpc_grpc//:grpc++", ], ) @@ -234,7 +233,6 @@ cc_library( "//tensorflow_serving/servables/tensorflow:predict_impl", "//tensorflow_serving/servables/tensorflow:regression_service", "//tensorflow_serving/servables/tensorflow:thread_pool_factory", - "//third_party/grpc", "@com_github_grpc_grpc//:grpc++", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", @@ -352,8 +350,6 @@ cc_library( ":model_service_impl", "@com_google_protobuf//:cc_wkt_protos", "@com_github_grpc_grpc//:grpc++", - "//third_party/grpc", - "//third_party/grpc:grpc++", "@org_tensorflow//tensorflow/c:c_api", "@org_tensorflow//tensorflow/cc/saved_model:tag_constants", "@org_tensorflow//tensorflow/core:lib", diff --git a/tensorflow_serving/model_servers/model_service_impl.h b/tensorflow_serving/model_servers/model_service_impl.h index 99d26f51a37..7778359530d 100644 --- a/tensorflow_serving/model_servers/model_service_impl.h +++ b/tensorflow_serving/model_servers/model_service_impl.h @@ -16,8 +16,8 @@ limitations under the License. #ifndef TENSORFLOW_SERVING_MODEL_SERVERS_MODEL_SERVICE_IMPL_H_ #define TENSORFLOW_SERVING_MODEL_SERVERS_MODEL_SERVICE_IMPL_H_ +#include "grpcpp/server_context.h" #include "grpcpp/support/status.h" -#include "third_party/grpc/include/grpcpp/server_context.h" #include "tensorflow_serving/apis/model_management.pb.h" #include "tensorflow_serving/apis/model_service.grpc.pb.h" #include "tensorflow_serving/apis/model_service.pb.h" diff --git a/tensorflow_serving/model_servers/prediction_service_impl.cc b/tensorflow_serving/model_servers/prediction_service_impl.cc index cd60dd10f4d..eeb71e634b0 100644 --- a/tensorflow_serving/model_servers/prediction_service_impl.cc +++ b/tensorflow_serving/model_servers/prediction_service_impl.cc @@ -15,7 +15,7 @@ limitations under the License. #include "tensorflow_serving/model_servers/prediction_service_impl.h" -#include "third_party/grpc/include/grpc/grpc.h" +#include "grpc/grpc.h" #include "tensorflow/core/platform/threadpool_options.h" #include "tensorflow_serving/model_servers/grpc_status_util.h" #include "tensorflow_serving/servables/tensorflow/classification_service.h" diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index f226a4d3b05..97215ae24c0 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -23,13 +23,13 @@ limitations under the License. #include #include "google/protobuf/wrappers.pb.h" +#include "grpc/grpc.h" +#include "grpcpp/resource_quota.h" +#include "grpcpp/security/server_credentials.h" +#include "grpcpp/server_builder.h" +#include "grpcpp/server_context.h" #include "grpcpp/support/status.h" #include "absl/memory/memory.h" -#include "third_party/grpc/include/grpc/grpc.h" -#include "third_party/grpc/include/grpcpp/resource_quota.h" -#include "third_party/grpc/include/grpcpp/security/server_credentials.h" -#include "third_party/grpc/include/grpcpp/server_builder.h" -#include "third_party/grpc/include/grpcpp/server_context.h" #include "tensorflow/c/c_api.h" #include "tensorflow/cc/saved_model/tag_constants.h" #include "tensorflow/core/lib/core/errors.h" diff --git a/tensorflow_serving/model_servers/server.h b/tensorflow_serving/model_servers/server.h index 9f15f7b06be..36625c2c568 100644 --- a/tensorflow_serving/model_servers/server.h +++ b/tensorflow_serving/model_servers/server.h @@ -18,7 +18,7 @@ limitations under the License. #include -#include "third_party/grpc/include/grpcpp/server.h" +#include "grpcpp/server.h" #include "tensorflow/core/kernels/batching_util/periodic_function.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/platform/cpu_info.h" From 08d53684739cb224a99e2900417260321308a270 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 31 Aug 2021 18:01:29 -0700 Subject: [PATCH 5350/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/17eeedf6-f484-4588-8e21-b385eb8fa2b3 PiperOrigin-RevId: 394125556 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ba7ecb21242..abf18879da5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c39d5335c4d69ddeec924f1fb9859e57a3609d20587f70ab4ebaf7b69dc27e35", - git_commit = "0bd6bf72b8777b6f8615a1ffdd7b42bef1e1774d", + sha256 = "0bf78281521c8d2c7bd7e7aae44615cfc4f831ecf19390d380c536e0ac035ec2", + git_commit = "55cab58048867975acf36569769583d941a24ab3", ) # Import all of TensorFlow Serving's external dependencies. From ab6955ebabaa3867936474c4aabe25c54a9b2628 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 1 Sep 2021 00:02:13 -0700 Subject: [PATCH 5351/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c459c5b9-2a17-4b7d-8338-935e2dccd977 PiperOrigin-RevId: 394166297 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index abf18879da5..a6930afabc7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0bf78281521c8d2c7bd7e7aae44615cfc4f831ecf19390d380c536e0ac035ec2", - git_commit = "55cab58048867975acf36569769583d941a24ab3", + sha256 = "b50eae3aa5e7b4f2c8f1c5e419e4bb4b55b053d392c1f94103f0ed9174d22223", + git_commit = "5a51fa12e54fd61ca7520fa82ad0cdd1c14591ee", ) # Import all of TensorFlow Serving's external dependencies. From 5fab754ef101c1d8400c65db459cf6676810d0e0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 1 Sep 2021 06:01:44 -0700 Subject: [PATCH 5352/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3b9b97d3-cbc8-4130-8d0f-fa51d9fb70c7 PiperOrigin-RevId: 394211968 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a6930afabc7..8371f0c9836 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b50eae3aa5e7b4f2c8f1c5e419e4bb4b55b053d392c1f94103f0ed9174d22223", - git_commit = "5a51fa12e54fd61ca7520fa82ad0cdd1c14591ee", + sha256 = "8dd4735fc384b13899bda0d42ec38f0763d7b19bb7b0522d88c177f052f7c25c", + git_commit = "3b6466f0b87a7bf93c98d3f44ae80a53957fb65f", ) # Import all of TensorFlow Serving's external dependencies. From 9baf2cd3232d10c59706de73c41aac852c5b993b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 1 Sep 2021 12:01:49 -0700 Subject: [PATCH 5353/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5d875a51-a398-442d-b3b6-b0392a6854ad PiperOrigin-RevId: 394283033 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8371f0c9836..76e38c32cc1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8dd4735fc384b13899bda0d42ec38f0763d7b19bb7b0522d88c177f052f7c25c", - git_commit = "3b6466f0b87a7bf93c98d3f44ae80a53957fb65f", + sha256 = "493641c9c53393f2b676e7c00699721c426862002e5ece89629f4657aedabd6c", + git_commit = "97c6170863275a77a879b7ac042ba82f64e85a79", ) # Import all of TensorFlow Serving's external dependencies. From dabee8b49ed0174648d2232b06e02848f5ed5de2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 1 Sep 2021 18:02:09 -0700 Subject: [PATCH 5354/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/928b6011-4472-4af4-9cb3-8744785d6e3e PiperOrigin-RevId: 394355593 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 76e38c32cc1..49170041891 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "493641c9c53393f2b676e7c00699721c426862002e5ece89629f4657aedabd6c", - git_commit = "97c6170863275a77a879b7ac042ba82f64e85a79", + sha256 = "9348ac73201391b137b188b7554239984255d6242db8b8c379218b07e3097c1c", + git_commit = "0a5d008b77c140808349159678b6d3243cb3a541", ) # Import all of TensorFlow Serving's external dependencies. From 3d6fa684938eec654076b3097ea354d6c3c0486a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 Sep 2021 00:01:59 -0700 Subject: [PATCH 5355/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7cd9b730-2a78-49ca-89b2-d37f192aa042 PiperOrigin-RevId: 394395975 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 49170041891..3f840ead328 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9348ac73201391b137b188b7554239984255d6242db8b8c379218b07e3097c1c", - git_commit = "0a5d008b77c140808349159678b6d3243cb3a541", + sha256 = "2e0be65cb84da6ce3e30ef3f1b55d449b7ac22494ad0680f99909f688f50da64", + git_commit = "7efb024c7120bd81a444cda4693901c19f37dfba", ) # Import all of TensorFlow Serving's external dependencies. From d8c703248ac4e1b102651260c2265f1f2ad7ccfa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 Sep 2021 06:01:42 -0700 Subject: [PATCH 5356/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c346bdc3-afa5-44fe-bdb6-6cbbd0f3ac90 PiperOrigin-RevId: 394441994 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3f840ead328..12c778fb949 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2e0be65cb84da6ce3e30ef3f1b55d449b7ac22494ad0680f99909f688f50da64", - git_commit = "7efb024c7120bd81a444cda4693901c19f37dfba", + sha256 = "64f138a0888d21f678e85b5db1450bfd34caaf0698ae009551eb9f4714a614c4", + git_commit = "305a8ba41978e7954c1a13baebc94bdb8ad16514", ) # Import all of TensorFlow Serving's external dependencies. From 83a63e405a483a6c8f5f294f43e9e1b579151868 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 Sep 2021 12:02:16 -0700 Subject: [PATCH 5357/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4ef2ab3e-fa66-4240-9034-5110bccb5742 PiperOrigin-RevId: 394512568 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 12c778fb949..ee79d13cc3a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "64f138a0888d21f678e85b5db1450bfd34caaf0698ae009551eb9f4714a614c4", - git_commit = "305a8ba41978e7954c1a13baebc94bdb8ad16514", + sha256 = "0ac4869b923955088adbd1dfc837e026a866902f33a41e3575b0e5cfe62cbfe6", + git_commit = "f8376f84426a0f1c047ecea1f9eb4bca4d3ee2af", ) # Import all of TensorFlow Serving's external dependencies. From dcfb51a49094225947986139a40a2eeecc328a46 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 Sep 2021 18:01:49 -0700 Subject: [PATCH 5358/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c048a81e-689f-4b67-8b96-e833feec6fd5 PiperOrigin-RevId: 394583012 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ee79d13cc3a..fadec282ef4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0ac4869b923955088adbd1dfc837e026a866902f33a41e3575b0e5cfe62cbfe6", - git_commit = "f8376f84426a0f1c047ecea1f9eb4bca4d3ee2af", + sha256 = "1432242f3d1dee2624fd710af2a8dbe1fc61d2bb1d44decf5cffc37830fffdab", + git_commit = "4df8da88467b61d54c4b4d2ecd937df07a6aac95", ) # Import all of TensorFlow Serving's external dependencies. From 5c889692c6ffd9b62f71ebba983aa1c85a87ef60 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 3 Sep 2021 00:02:56 -0700 Subject: [PATCH 5359/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1fe0666f-743d-4717-93da-8c6d1581ac75 PiperOrigin-RevId: 394623179 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fadec282ef4..91035825306 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1432242f3d1dee2624fd710af2a8dbe1fc61d2bb1d44decf5cffc37830fffdab", - git_commit = "4df8da88467b61d54c4b4d2ecd937df07a6aac95", + sha256 = "a58ce3314fb693c2f859b23290b977d6f616b3889cb0ed679a587fa1029ad7f9", + git_commit = "efcf2c796b7393f820618930015d0b3ace4f0ffa", ) # Import all of TensorFlow Serving's external dependencies. From a43e4014896bc0612f78674e4d6a97743444c400 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 3 Sep 2021 06:03:24 -0700 Subject: [PATCH 5360/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6a271896-7c3f-4294-9db4-849b089bee41 PiperOrigin-RevId: 394666732 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 91035825306..5af23ea0d92 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a58ce3314fb693c2f859b23290b977d6f616b3889cb0ed679a587fa1029ad7f9", - git_commit = "efcf2c796b7393f820618930015d0b3ace4f0ffa", + sha256 = "bb545bf86a4523e99543d82e88db2c95063c9f6ec8b164b50074cb3589b9fa52", + git_commit = "d29de95cda9e366c05b930a289dae939357f2547", ) # Import all of TensorFlow Serving's external dependencies. From 7c8c48bdfced8aebd1ab5150656ee1e72860a4e7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 3 Sep 2021 12:09:21 -0700 Subject: [PATCH 5361/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3a52bb78-5c18-451c-9eea-14680778dcc8 PiperOrigin-RevId: 394730799 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5af23ea0d92..2bd3ee25f96 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bb545bf86a4523e99543d82e88db2c95063c9f6ec8b164b50074cb3589b9fa52", - git_commit = "d29de95cda9e366c05b930a289dae939357f2547", + sha256 = "db8335fd7215e6bb9ec5dd6bef739093504975994b6e05d95e825b8c4052e65a", + git_commit = "3d8af9051087ac263d7263e3ab86ef41de8328e2", ) # Import all of TensorFlow Serving's external dependencies. From 9aed1a6a3490ddc149c3d41d84f55f3e3769ffae Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 3 Sep 2021 18:01:41 -0700 Subject: [PATCH 5362/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ca919418-71ed-46b8-8d83-07daad8cf3e7 PiperOrigin-RevId: 394788888 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2bd3ee25f96..4afd926bb6d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "db8335fd7215e6bb9ec5dd6bef739093504975994b6e05d95e825b8c4052e65a", - git_commit = "3d8af9051087ac263d7263e3ab86ef41de8328e2", + sha256 = "7a23f3cc95d5be90eb0435e5eef6149113398b6e8216dd565440eae892f5f655", + git_commit = "b4f324b4a3cd2097f830c5c99a6556f87dab859e", ) # Import all of TensorFlow Serving's external dependencies. From c37d72a646137e63f4c3e7b9016f7d46a19c2262 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 Sep 2021 00:01:30 -0700 Subject: [PATCH 5363/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c0e8b54d-3ade-4eea-bbf8-e44666e4d27b PiperOrigin-RevId: 395410227 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4afd926bb6d..0b18b076cf7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7a23f3cc95d5be90eb0435e5eef6149113398b6e8216dd565440eae892f5f655", - git_commit = "b4f324b4a3cd2097f830c5c99a6556f87dab859e", + sha256 = "0ba16145121fb511725159f5aa26e6c1ade4d84e54e4021d5e583a07c114c30d", + git_commit = "8137d0d1f752ea535d546c5fd26dc632db9affa5", ) # Import all of TensorFlow Serving's external dependencies. From 917d538f6a96b799b7060da69dfaa64bd6c78e4c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 Sep 2021 06:01:45 -0700 Subject: [PATCH 5364/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/31d907b4-43b8-4fd4-95cc-dd25824509af PiperOrigin-RevId: 395454582 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0b18b076cf7..2fdcc9fc501 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0ba16145121fb511725159f5aa26e6c1ade4d84e54e4021d5e583a07c114c30d", - git_commit = "8137d0d1f752ea535d546c5fd26dc632db9affa5", + sha256 = "ff5dd6220ca04ef9da83581d11c1a5d08ed0c3b696f6d37e14995794a3382c53", + git_commit = "516e8df2ea4d6515dcfdb0bba5f2abe2dbf7f822", ) # Import all of TensorFlow Serving's external dependencies. From aa437ce0adc5baad078de96e3efb923f0c8ef732 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 Sep 2021 12:01:49 -0700 Subject: [PATCH 5365/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/04329457-19b9-49ee-8704-b6825d7fee46 PiperOrigin-RevId: 395527250 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2fdcc9fc501..6a3b85fce40 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ff5dd6220ca04ef9da83581d11c1a5d08ed0c3b696f6d37e14995794a3382c53", - git_commit = "516e8df2ea4d6515dcfdb0bba5f2abe2dbf7f822", + sha256 = "3f94b7bc94237e7f724eb6adfe1e057e76f100b1d908dbb2c9de1958ae1ac09b", + git_commit = "93ff53b4f1684b2279eb7a137c83fd2c38403d56", ) # Import all of TensorFlow Serving's external dependencies. From 0ad2943a404ba639d4282d15d86e673b13e4d7c5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 Sep 2021 18:02:18 -0700 Subject: [PATCH 5366/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4d03525c-0305-4b3e-81c3-b972076b66bd PiperOrigin-RevId: 395597880 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6a3b85fce40..6e5c4de102c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3f94b7bc94237e7f724eb6adfe1e057e76f100b1d908dbb2c9de1958ae1ac09b", - git_commit = "93ff53b4f1684b2279eb7a137c83fd2c38403d56", + sha256 = "79a5681c4b1f9c930c7182d82bb9ca668570f522262eeb8b2670eb08cac6a001", + git_commit = "07fdb20d53090450fb8ba3662405f9628244544f", ) # Import all of TensorFlow Serving's external dependencies. From 445186d809a5072474fc0709040491cdee58c322 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 9 Sep 2021 00:01:48 -0700 Subject: [PATCH 5367/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/97d9ed29-4114-48d7-8488-a93a80c80d3b PiperOrigin-RevId: 395635672 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6e5c4de102c..a58b36ac091 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "79a5681c4b1f9c930c7182d82bb9ca668570f522262eeb8b2670eb08cac6a001", - git_commit = "07fdb20d53090450fb8ba3662405f9628244544f", + sha256 = "117ba3621f1b955bca0352470bf93bcd861b887da7c91dcf1168dc7e1738cdb1", + git_commit = "07e828e017252e038a14aeec5184ac678808605f", ) # Import all of TensorFlow Serving's external dependencies. From 13fa8f8e77030b2d738be07e7636de641b613401 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 9 Sep 2021 06:02:12 -0700 Subject: [PATCH 5368/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d8367b4a-fd39-4360-b60c-d33293f03cee PiperOrigin-RevId: 395683528 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a58b36ac091..fa3c31dbb57 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "117ba3621f1b955bca0352470bf93bcd861b887da7c91dcf1168dc7e1738cdb1", - git_commit = "07e828e017252e038a14aeec5184ac678808605f", + sha256 = "21729ed3affae41b7a00df755f71feb1b58bbdb27bd4cb47bf8509d35d8e1ee9", + git_commit = "d2e0e7958f71ac841c2d4e6e2ec0c35276c80537", ) # Import all of TensorFlow Serving's external dependencies. From 3daf3f9888d7c3f741be7d3267e2128c88b3ab99 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 9 Sep 2021 12:02:24 -0700 Subject: [PATCH 5369/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f957d18d-4d3d-4aef-a1cc-afed6de0bcd5 PiperOrigin-RevId: 395755361 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fa3c31dbb57..4869e8ceb3d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "21729ed3affae41b7a00df755f71feb1b58bbdb27bd4cb47bf8509d35d8e1ee9", - git_commit = "d2e0e7958f71ac841c2d4e6e2ec0c35276c80537", + sha256 = "e1268615ba2d52826e419a7d76b0c94113830bde14fcdfc555fed4e07b9e998d", + git_commit = "ed51725469acb08a3ddf336d1872582fa0c9a411", ) # Import all of TensorFlow Serving's external dependencies. From 7edc516a8360d5ffe304987f64cdcce7369c93fc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 9 Sep 2021 18:01:28 -0700 Subject: [PATCH 5370/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4259156a-2b29-45ce-b775-97c5176d3318 PiperOrigin-RevId: 395826785 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4869e8ceb3d..acfdb9e2778 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e1268615ba2d52826e419a7d76b0c94113830bde14fcdfc555fed4e07b9e998d", - git_commit = "ed51725469acb08a3ddf336d1872582fa0c9a411", + sha256 = "6ede391a9470473a2fbbbd8597ac49626dbf8566bca73a8cd3e1c3b9c9b27901", + git_commit = "ad1f7eef42bdbadda6574dd962e618c709a644b6", ) # Import all of TensorFlow Serving's external dependencies. From edfd69c9a3a19c751cde8a3fa6fd76cad97a5637 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 10 Sep 2021 00:03:00 -0700 Subject: [PATCH 5371/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/865a47ae-6784-4ae2-8ac4-cc95ebf80ca4 PiperOrigin-RevId: 395866209 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index acfdb9e2778..30eab671d62 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6ede391a9470473a2fbbbd8597ac49626dbf8566bca73a8cd3e1c3b9c9b27901", - git_commit = "ad1f7eef42bdbadda6574dd962e618c709a644b6", + sha256 = "c91e1411b700912ecd548c40ae5475e72c4be814428aefdc515a122babf8b778", + git_commit = "07bba62974b2e9bc39c3161be5fcdcb9b793757f", ) # Import all of TensorFlow Serving's external dependencies. From c06f71cf6a988ea1a56265c40223e4e78b92e4f2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 10 Sep 2021 06:02:11 -0700 Subject: [PATCH 5372/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a76f77f9-1f6e-404a-a0c3-3f09632d5643 PiperOrigin-RevId: 395910841 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 30eab671d62..0bc775cd2ac 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c91e1411b700912ecd548c40ae5475e72c4be814428aefdc515a122babf8b778", - git_commit = "07bba62974b2e9bc39c3161be5fcdcb9b793757f", + sha256 = "96ac8ff615e3cc609c614cf1a0917f103c21dc43ab2a5ed2884a02949ec9a698", + git_commit = "496d12275fea44e4b5a815c6f6f320f2ae967df9", ) # Import all of TensorFlow Serving's external dependencies. From a083af87061cff0db50dd65c0978d97fc97ce541 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 10 Sep 2021 12:02:08 -0700 Subject: [PATCH 5373/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1447bc06-456d-4395-99a3-65eb07d381c4 PiperOrigin-RevId: 395978229 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0bc775cd2ac..3a0264e2de0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "96ac8ff615e3cc609c614cf1a0917f103c21dc43ab2a5ed2884a02949ec9a698", - git_commit = "496d12275fea44e4b5a815c6f6f320f2ae967df9", + sha256 = "33ed747f4d6b1658c2b2e2b196e890b8dcde0542715ef9449ddbd7dd0deefd26", + git_commit = "6164e65c2f116853ece543cd3b3f04dca1e0b957", ) # Import all of TensorFlow Serving's external dependencies. From d683fa1616dfa85378ec5c2ac58da67e3180c161 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 10 Sep 2021 13:06:58 -0700 Subject: [PATCH 5374/8103] Remove references to deleted targets. PiperOrigin-RevId: 395991425 --- tensorflow_serving/model_servers/BUILD | 2 -- 1 file changed, 2 deletions(-) diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 45037434685..548c57192b1 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -394,8 +394,6 @@ cc_library( "@org_tensorflow//tensorflow/compiler/jit:xla_cpu_jit", "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core/platform/cloud:gcs_file_system", - "@org_tensorflow//tensorflow/core/platform/hadoop:hadoop_file_system", - "@org_tensorflow//tensorflow/core/platform/s3:s3_file_system", ] + if_libtpu([ "@org_tensorflow//tensorflow/core/tpu:tpu_model_server_initializer", ]), From 605ba446ba2fe7a22f4f478569016672820a8a8d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 10 Sep 2021 18:01:57 -0700 Subject: [PATCH 5375/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/07000d42-4063-407a-84fb-7cef477073a2 PiperOrigin-RevId: 396043705 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3a0264e2de0..d26c4be7366 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "33ed747f4d6b1658c2b2e2b196e890b8dcde0542715ef9449ddbd7dd0deefd26", - git_commit = "6164e65c2f116853ece543cd3b3f04dca1e0b957", + sha256 = "77e0de46f4f88aacfd4615b7d05f59033244aea36c642195b1d09a7437c040ce", + git_commit = "f3b316fd45751e399a978da893558afa81f8917f", ) # Import all of TensorFlow Serving's external dependencies. From d7ba7939168f45d1988606d646e6454eb98a8cbf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 11 Sep 2021 00:01:52 -0700 Subject: [PATCH 5376/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e2b259fd-29d7-4ad6-aab3-563f7b7e0a08 PiperOrigin-RevId: 396074613 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d26c4be7366..4d4648a1daa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "77e0de46f4f88aacfd4615b7d05f59033244aea36c642195b1d09a7437c040ce", - git_commit = "f3b316fd45751e399a978da893558afa81f8917f", + sha256 = "96e4c386ac0a165f239da4f91d5ea33a5d6890a502ea82b098e1628257687971", + git_commit = "c0e2e65e155fabd9bdfd5c41b4b816d9efac8e1f", ) # Import all of TensorFlow Serving's external dependencies. From b0904a5194000e1636e6a000729fe4dbbf1fd694 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 16 Sep 2021 12:01:48 -0700 Subject: [PATCH 5377/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7b2ebc93-57af-4d63-b868-6d241067e26e PiperOrigin-RevId: 397134842 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4d4648a1daa..456e765f98c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "96e4c386ac0a165f239da4f91d5ea33a5d6890a502ea82b098e1628257687971", - git_commit = "c0e2e65e155fabd9bdfd5c41b4b816d9efac8e1f", + sha256 = "9174e50710fc12212b85260b32d449cc708d67a336cc9de1e7894d9be28b6719", + git_commit = "7d1eb26731e78b3cc876564dfdce78811c4fbf6c", ) # Import all of TensorFlow Serving's external dependencies. From a223d14d3dfcf16089de702f3a390c5f9d44a408 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 17 Sep 2021 12:01:55 -0700 Subject: [PATCH 5378/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d2562581-896b-4f4d-bf18-6c3e766bc988 PiperOrigin-RevId: 397370114 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 456e765f98c..8270705610f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9174e50710fc12212b85260b32d449cc708d67a336cc9de1e7894d9be28b6719", - git_commit = "7d1eb26731e78b3cc876564dfdce78811c4fbf6c", + sha256 = "768d39c511c6a2cbb22607a3668cc112ca1c42914d5ec3d736f8c4ee8106e7a1", + git_commit = "1cca70b80504474402215d2a4e55bc44621b691d", ) # Import all of TensorFlow Serving's external dependencies. From 9ff301df3d55e4e9738d3c44217489c7a25edbf1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 17 Sep 2021 18:01:48 -0700 Subject: [PATCH 5379/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a8f1dbfa-1a64-4422-addc-f6c86ab7e276 PiperOrigin-RevId: 397434715 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8270705610f..91e31fef80f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "768d39c511c6a2cbb22607a3668cc112ca1c42914d5ec3d736f8c4ee8106e7a1", - git_commit = "1cca70b80504474402215d2a4e55bc44621b691d", + sha256 = "7f4bb221da51b0b830504f587d97c24a69b908c6cb356c36295cf1f4d1fb674d", + git_commit = "2af787399dc74372ff0954827432f079381e2995", ) # Import all of TensorFlow Serving's external dependencies. From 0b74766371716bf3675c13f18f2ec693b4a44cbd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 18 Sep 2021 00:01:42 -0700 Subject: [PATCH 5380/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ae00dc46-9a96-4705-8825-b9a344cfd1ef PiperOrigin-RevId: 397467196 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 91e31fef80f..c5d8fb02c22 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7f4bb221da51b0b830504f587d97c24a69b908c6cb356c36295cf1f4d1fb674d", - git_commit = "2af787399dc74372ff0954827432f079381e2995", + sha256 = "d726ee9f89bf4fae45ff0ac0c8e03d2c80d5e7dadaa1c34ea7a40978c191bcde", + git_commit = "faad219fc46032a0ae9576ccc3076612cc1f5f72", ) # Import all of TensorFlow Serving's external dependencies. From 0b36f586d7bc30a46381d5b3d8c070e82f3277b7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 18 Sep 2021 06:02:11 -0700 Subject: [PATCH 5381/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3426e3ef-6b9f-4ae8-ab25-f98e6fca5ad4 PiperOrigin-RevId: 397497251 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c5d8fb02c22..eb0cad462b5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d726ee9f89bf4fae45ff0ac0c8e03d2c80d5e7dadaa1c34ea7a40978c191bcde", - git_commit = "faad219fc46032a0ae9576ccc3076612cc1f5f72", + sha256 = "2c513af37c2a3b3cca2fea8f1d258c2685025c6177bb83be9890fc6de270bb5c", + git_commit = "afb7e60c753edc68f4b1b1960e9ebcb4967b84a1", ) # Import all of TensorFlow Serving's external dependencies. From 579a4534aec116f9e88b1ead1d0a8ef1074d72d2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 18 Sep 2021 12:01:25 -0700 Subject: [PATCH 5382/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/adca78c8-a80b-4d80-ae1f-4c0a1f771a74 PiperOrigin-RevId: 397523323 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index eb0cad462b5..2f25bd7d2f1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2c513af37c2a3b3cca2fea8f1d258c2685025c6177bb83be9890fc6de270bb5c", - git_commit = "afb7e60c753edc68f4b1b1960e9ebcb4967b84a1", + sha256 = "76c1ac9dca299435fcc97b0488a8c767d3d2b53226f4ae769775990718f28334", + git_commit = "5eaaf0e9a50d55564fcd4269f67a3fa2a335c7e4", ) # Import all of TensorFlow Serving's external dependencies. From 991dfc3932cc5b490323b5da475dc3f2998e3a69 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 18 Sep 2021 18:01:32 -0700 Subject: [PATCH 5383/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d8fe39ad-6a34-4b35-8b62-304b22ba8a5c PiperOrigin-RevId: 397548192 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2f25bd7d2f1..d2dcac8f758 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "76c1ac9dca299435fcc97b0488a8c767d3d2b53226f4ae769775990718f28334", - git_commit = "5eaaf0e9a50d55564fcd4269f67a3fa2a335c7e4", + sha256 = "d15fed13ae0aafc81c9113dffbd5e06287bf6eba22a9e7b402e741b573d3e3de", + git_commit = "cc0f9f789ec8e2f190530b31c56ebffb0cf432c3", ) # Import all of TensorFlow Serving's external dependencies. From cee9fd673f70520f3b1800f29e1b4bdb74e24ef5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 19 Sep 2021 00:03:35 -0700 Subject: [PATCH 5384/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6f9f5580-add6-4eef-9255-8bc5fc142e99 PiperOrigin-RevId: 397573167 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d2dcac8f758..7578bab3188 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d15fed13ae0aafc81c9113dffbd5e06287bf6eba22a9e7b402e741b573d3e3de", - git_commit = "cc0f9f789ec8e2f190530b31c56ebffb0cf432c3", + sha256 = "534d7f9a75dc5c367ab4de540c12ee92143036c2f5e08d7102a90ad4ee2c7d1e", + git_commit = "6b094b1d71993da49aaa0e9195a60aa9c2ed46c5", ) # Import all of TensorFlow Serving's external dependencies. From eeb22f852d5be00328d1f2ef94473f244f6ad104 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 19 Sep 2021 06:01:35 -0700 Subject: [PATCH 5385/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1633c5f9-b7a4-4efb-9f17-eb3da569c1a1 PiperOrigin-RevId: 397600776 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7578bab3188..7944da0a51e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "534d7f9a75dc5c367ab4de540c12ee92143036c2f5e08d7102a90ad4ee2c7d1e", - git_commit = "6b094b1d71993da49aaa0e9195a60aa9c2ed46c5", + sha256 = "26c919c161e306f1c919bae582941b251c7b0313876e69d228ced3c82f05b04e", + git_commit = "e82c025a6206aba82a6deb06cb1aec1ae8209f36", ) # Import all of TensorFlow Serving's external dependencies. From f986862ec117b5456d6a706685bceb1a355074fb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 19 Sep 2021 12:01:24 -0700 Subject: [PATCH 5386/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/72383f06-9afd-428f-a7ed-86023e85f1b0 PiperOrigin-RevId: 397626198 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7944da0a51e..338edf2372d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "26c919c161e306f1c919bae582941b251c7b0313876e69d228ced3c82f05b04e", - git_commit = "e82c025a6206aba82a6deb06cb1aec1ae8209f36", + sha256 = "a2d9b7e3b8d5e79591258f85075dc81bcbd128f497ef6850baeccfce6a65d654", + git_commit = "307ace0e9c343d32929a8b238ef8b8ad43c97f6f", ) # Import all of TensorFlow Serving's external dependencies. From 2fc593613b1b562c05ddaf979490f83369d89929 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 19 Sep 2021 18:01:49 -0700 Subject: [PATCH 5387/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f390d861-cfbd-4488-9493-c18bd5d80b85 PiperOrigin-RevId: 397652682 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 338edf2372d..32aca1c14d7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a2d9b7e3b8d5e79591258f85075dc81bcbd128f497ef6850baeccfce6a65d654", - git_commit = "307ace0e9c343d32929a8b238ef8b8ad43c97f6f", + sha256 = "b1464eb20abf80e11df4b0d2b09f5df7cac4d7f44a3e1157ae4b0e8a1ce14e4b", + git_commit = "2d1aa68bbbc756829fbe3f910e4394c1aa1fbb7d", ) # Import all of TensorFlow Serving's external dependencies. From d92b69f16b3fa6f8e94648a4454ae8412a6bf652 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 Sep 2021 00:01:53 -0700 Subject: [PATCH 5388/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ac38d603-fd09-42c4-a034-aaa4907fadff PiperOrigin-RevId: 397683673 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 32aca1c14d7..21b5f08921c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b1464eb20abf80e11df4b0d2b09f5df7cac4d7f44a3e1157ae4b0e8a1ce14e4b", - git_commit = "2d1aa68bbbc756829fbe3f910e4394c1aa1fbb7d", + sha256 = "7ec0136a6218d2d9035a1ad905224fe5c4ed177a9c890403dfff4ea5070ba1c0", + git_commit = "7628750678786f1b65e8905fb9406d8fbffef0db", ) # Import all of TensorFlow Serving's external dependencies. From 9a683718d4462b6eb2cdcfa9f5ff09aeb77abd69 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 Sep 2021 06:01:44 -0700 Subject: [PATCH 5389/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0d497aaa-a363-4b39-b876-de87fce26983 PiperOrigin-RevId: 397729861 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 21b5f08921c..08408c1f5a1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7ec0136a6218d2d9035a1ad905224fe5c4ed177a9c890403dfff4ea5070ba1c0", - git_commit = "7628750678786f1b65e8905fb9406d8fbffef0db", + sha256 = "a364ce246b5717b1354760c51e0242a3dd81df422be808a3ac4fd522dfe529bd", + git_commit = "cf19edcdc547dc71f3a22c1f87247e8881adacd9", ) # Import all of TensorFlow Serving's external dependencies. From fdde276573bf07d3592e49a32f804f754ed93e57 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 Sep 2021 12:01:24 -0700 Subject: [PATCH 5390/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/126b4cfd-716f-4686-9fe1-fa9c2c126068 PiperOrigin-RevId: 397807728 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 08408c1f5a1..6c1ca17fb5c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a364ce246b5717b1354760c51e0242a3dd81df422be808a3ac4fd522dfe529bd", - git_commit = "cf19edcdc547dc71f3a22c1f87247e8881adacd9", + sha256 = "1ec9c4a7616ae3621e230b978728028bab9eeb4d20f70aad3f42e76a11bee008", + git_commit = "9b8b3b93ef0ee4ea0cb208661555cc4d880e3580", ) # Import all of TensorFlow Serving's external dependencies. From 80de62e87cbdf7fd415f5e5aebb61e35c1d42ab1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 Sep 2021 18:02:18 -0700 Subject: [PATCH 5391/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5c3c82ce-0c91-4d99-b73e-6c004c2562ad PiperOrigin-RevId: 397885348 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6c1ca17fb5c..959245fda28 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1ec9c4a7616ae3621e230b978728028bab9eeb4d20f70aad3f42e76a11bee008", - git_commit = "9b8b3b93ef0ee4ea0cb208661555cc4d880e3580", + sha256 = "ac4bcd758486ea62f1a991c69fbe19163483f2b2c903a14ad763a55645ea11dd", + git_commit = "294a0c6895553ea8f1e45e7e1ccb906da23d00c8", ) # Import all of TensorFlow Serving's external dependencies. From e2f8743c066e321f9ba380ac634d15b062b36718 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 Sep 2021 00:01:44 -0700 Subject: [PATCH 5392/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/21ed85cc-4efb-41c1-af5a-a574cebf9cad PiperOrigin-RevId: 397927630 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 959245fda28..cf09e34df75 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ac4bcd758486ea62f1a991c69fbe19163483f2b2c903a14ad763a55645ea11dd", - git_commit = "294a0c6895553ea8f1e45e7e1ccb906da23d00c8", + sha256 = "e281a21182f8088e5f3d536b6dd00169ad1d2ae846b6d93049d32f5d336d12e5", + git_commit = "ab0addb80804d02aa5be54cc6e0e99aff9817a15", ) # Import all of TensorFlow Serving's external dependencies. From e64b9fd75f8f5f5c647f6c8cfe1220acd5514d03 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 Sep 2021 06:02:09 -0700 Subject: [PATCH 5393/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8428442d-e431-4d0b-ab0e-79ee26d1a57c PiperOrigin-RevId: 397976337 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cf09e34df75..448801308ae 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e281a21182f8088e5f3d536b6dd00169ad1d2ae846b6d93049d32f5d336d12e5", - git_commit = "ab0addb80804d02aa5be54cc6e0e99aff9817a15", + sha256 = "cd38b4aa94909b2104a844776d857dca3a76dd9c0ef3a430e5ea57faa2904b2f", + git_commit = "cdece408ff41b5960dc8bdc817a3860c8414cde2", ) # Import all of TensorFlow Serving's external dependencies. From 817cbb5848a2a1621106b4b6319e0f6738d55856 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 Sep 2021 12:06:30 -0700 Subject: [PATCH 5394/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/61f3c678-61fb-4dc5-bddf-7f08076c50e7 PiperOrigin-RevId: 398052783 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 448801308ae..56a8144d8e8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cd38b4aa94909b2104a844776d857dca3a76dd9c0ef3a430e5ea57faa2904b2f", - git_commit = "cdece408ff41b5960dc8bdc817a3860c8414cde2", + sha256 = "650c4fdf15f88cb007aa1a75b9b2cb04eabc86992cca59d415a4efdc20eb8a2c", + git_commit = "67b6c880e39ba02ba53c7d499e45fd136090ee32", ) # Import all of TensorFlow Serving's external dependencies. From 70eb5fada87dce17e37a65165f6d55ae5ca149d3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 Sep 2021 18:01:23 -0700 Subject: [PATCH 5395/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f4e643ff-39c6-4f84-bd56-3fe2cf837f9d PiperOrigin-RevId: 398126857 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 56a8144d8e8..ba53b461570 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "650c4fdf15f88cb007aa1a75b9b2cb04eabc86992cca59d415a4efdc20eb8a2c", - git_commit = "67b6c880e39ba02ba53c7d499e45fd136090ee32", + sha256 = "86100b871b5fc49493f3ba3e18d6aca2e893a5ec5f0e78d41e9de9c22ef62229", + git_commit = "e324b14bbbf44cb47c1b62b53874b751f9c079c5", ) # Import all of TensorFlow Serving's external dependencies. From 92a71ad5205ba0631b64ce27fd640775cf7f976b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 22 Sep 2021 00:01:30 -0700 Subject: [PATCH 5396/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3a55065c-5276-4192-a15b-a47c87aeb779 PiperOrigin-RevId: 398169508 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ba53b461570..0d1d5ef3b6c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "86100b871b5fc49493f3ba3e18d6aca2e893a5ec5f0e78d41e9de9c22ef62229", - git_commit = "e324b14bbbf44cb47c1b62b53874b751f9c079c5", + sha256 = "22d24d17878b8563e54ed7a92ecd49868e27e988bc363d4dcad69c75a0f4e087", + git_commit = "aac496f9adf5c7a72b5d4184f5874a0e45312308", ) # Import all of TensorFlow Serving's external dependencies. From 842299d18cdd0417168a548e55265888a0512510 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 22 Sep 2021 06:01:50 -0700 Subject: [PATCH 5397/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3f902c6c-3275-4cd1-86c9-1cbfce1bdd79 PiperOrigin-RevId: 398220099 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0d1d5ef3b6c..cce34b8e2db 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "22d24d17878b8563e54ed7a92ecd49868e27e988bc363d4dcad69c75a0f4e087", - git_commit = "aac496f9adf5c7a72b5d4184f5874a0e45312308", + sha256 = "52f4bcf74ddbcf3a729bd6d282434761e1d9d9db109434e4158360f18c6d8e57", + git_commit = "7ce64423d0246c6eefcb40af13b03f17c2c39924", ) # Import all of TensorFlow Serving's external dependencies. From 24747db89937a88dba894e27f9c0de2adf3555f3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 22 Sep 2021 12:02:08 -0700 Subject: [PATCH 5398/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/33d34c39-3c28-48a6-9782-b6684a444558 PiperOrigin-RevId: 398296328 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cce34b8e2db..20993cd6d28 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "52f4bcf74ddbcf3a729bd6d282434761e1d9d9db109434e4158360f18c6d8e57", - git_commit = "7ce64423d0246c6eefcb40af13b03f17c2c39924", + sha256 = "b5582115d8cd3dbdf511c02089311a56a6b67b8d6dff4c7a6090968564663888", + git_commit = "1f4cde09def18058aab33ba9fee68094a615d31c", ) # Import all of TensorFlow Serving's external dependencies. From 003b57a01b974e472acfcafcdff088ed8e15b31b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 22 Sep 2021 18:02:09 -0700 Subject: [PATCH 5399/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/501733b9-28bf-451e-8d01-53740907f3ea PiperOrigin-RevId: 398374702 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 20993cd6d28..91b90ef19d6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b5582115d8cd3dbdf511c02089311a56a6b67b8d6dff4c7a6090968564663888", - git_commit = "1f4cde09def18058aab33ba9fee68094a615d31c", + sha256 = "b7f997d4493b61d91906f53aaed3094297634076082c7288025cadeeb8fcfdc2", + git_commit = "c93491dd5e317144f9a095e1421551f987912dfa", ) # Import all of TensorFlow Serving's external dependencies. From 1fff75a18c984d781c287b1d7d95f9cdafc8423b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 Sep 2021 00:01:34 -0700 Subject: [PATCH 5400/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1dcd4f26-74d2-4211-86b6-e732901b0f64 PiperOrigin-RevId: 398418843 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 91b90ef19d6..461bdd3553b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b7f997d4493b61d91906f53aaed3094297634076082c7288025cadeeb8fcfdc2", - git_commit = "c93491dd5e317144f9a095e1421551f987912dfa", + sha256 = "e227331dbc7f2add7ee0e8e8ea5a00191ba02a018ff801af3154133bbad1b8b8", + git_commit = "10e71486c7b45e9bd4c93390cad3ceb8c9fca397", ) # Import all of TensorFlow Serving's external dependencies. From 55fdd193adc2762796b02e0a95178a855fac0907 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 Sep 2021 06:01:37 -0700 Subject: [PATCH 5401/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/005b0c44-08b8-490d-a86f-fe354a844767 PiperOrigin-RevId: 398467208 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 461bdd3553b..5340d915223 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e227331dbc7f2add7ee0e8e8ea5a00191ba02a018ff801af3154133bbad1b8b8", - git_commit = "10e71486c7b45e9bd4c93390cad3ceb8c9fca397", + sha256 = "0c4d8a43a43f5343149b54dc6aeab54da1ca8c368ee8624846bcc9dfbef473b0", + git_commit = "5e147b15964f213b668ad91c02dd666d7045a5ec", ) # Import all of TensorFlow Serving's external dependencies. From 7ce29f67ddd4fb38bb7724b3f412ddba36a1c45c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 Sep 2021 10:10:32 -0700 Subject: [PATCH 5402/8103] internal refactor PiperOrigin-RevId: 398515020 --- WORKSPACE | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/WORKSPACE b/WORKSPACE index 5340d915223..42cc44d307a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -47,3 +47,8 @@ workspace() load("@rules_pkg//:deps.bzl", "rules_pkg_dependencies") rules_pkg_dependencies() +load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies", "rules_proto_toolchains") + +rules_proto_dependencies() +rules_proto_toolchains() + From e8ed59abfae2a0635299b8f100d1e6cdf9490208 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 Sep 2021 12:06:49 -0700 Subject: [PATCH 5403/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/97988451-b0cc-4f9e-b31a-4b0001c2484a PiperOrigin-RevId: 398545765 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 42cc44d307a..4582eeadfe8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0c4d8a43a43f5343149b54dc6aeab54da1ca8c368ee8624846bcc9dfbef473b0", - git_commit = "5e147b15964f213b668ad91c02dd666d7045a5ec", + sha256 = "a4c0d07f2a00e1b19eefd58be351b36ad94724224b6d6cfecbfea8e0a781540e", + git_commit = "ba3c3fe4095378b0003c1eef6491bb74a7d8aa16", ) # Import all of TensorFlow Serving's external dependencies. From f1b263297fc57ed97232bdd18d46404fa20ce0e4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 Sep 2021 18:01:35 -0700 Subject: [PATCH 5404/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3fa30b0a-3f1b-4247-a087-cffef4735e2a PiperOrigin-RevId: 398620779 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4582eeadfe8..0ce9b341f18 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a4c0d07f2a00e1b19eefd58be351b36ad94724224b6d6cfecbfea8e0a781540e", - git_commit = "ba3c3fe4095378b0003c1eef6491bb74a7d8aa16", + sha256 = "e4e0352648efc2898ea8b45776d1e98f3b8adb132c7a816796ad6f2233091bb0", + git_commit = "da442ea34e43cc26aed197574ec77a77c4bc292b", ) # Import all of TensorFlow Serving's external dependencies. From 367c05e7edb838a080860b3327ab5ab42ed93c77 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Sep 2021 00:02:14 -0700 Subject: [PATCH 5405/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/442f6980-619a-4d8c-8bec-3503cbd617ca PiperOrigin-RevId: 398662931 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0ce9b341f18..9bcccf264b4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e4e0352648efc2898ea8b45776d1e98f3b8adb132c7a816796ad6f2233091bb0", - git_commit = "da442ea34e43cc26aed197574ec77a77c4bc292b", + sha256 = "1e3bf29ae10368df1d103ab2edff9299da28a7b9c9b39a95bbf598e7897de8e4", + git_commit = "369702b9e76814ae9a9b407209a36e76be536fec", ) # Import all of TensorFlow Serving's external dependencies. From 52e4b0185b429d35852f43fb702fcbb347b2aa70 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Sep 2021 06:01:32 -0700 Subject: [PATCH 5406/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f3a6f38e-88c5-4fc1-a84d-0b46e2675856 PiperOrigin-RevId: 398712489 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9bcccf264b4..1788b313ba2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1e3bf29ae10368df1d103ab2edff9299da28a7b9c9b39a95bbf598e7897de8e4", - git_commit = "369702b9e76814ae9a9b407209a36e76be536fec", + sha256 = "f6f419d10eccaf828c507be125059b218691da9fbaecfd947001bffa8a3dd43d", + git_commit = "a636d0f7bfd71fa7cac5b85107c866a7c0ba07d5", ) # Import all of TensorFlow Serving's external dependencies. From b8c31febbcfbf3d189deaa4023307a29a62630b2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Sep 2021 12:01:34 -0700 Subject: [PATCH 5407/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8a387f5a-77e4-484d-b484-a23c5ff1a4f0 PiperOrigin-RevId: 398782345 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1788b313ba2..f35321c4b8d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f6f419d10eccaf828c507be125059b218691da9fbaecfd947001bffa8a3dd43d", - git_commit = "a636d0f7bfd71fa7cac5b85107c866a7c0ba07d5", + sha256 = "39b24ea842be0eaf63078bed4ebbe23a58dda7215d110f82d919cd874340004c", + git_commit = "0b5e5756e2357fe635ce2f8411d56aaff306d139", ) # Import all of TensorFlow Serving's external dependencies. From 4e70f1878ef35468145226fd40364f823366474b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Sep 2021 18:04:18 -0700 Subject: [PATCH 5408/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2e44dbf4-2491-4a9a-a7fa-d3850cd3b050 PiperOrigin-RevId: 398851042 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f35321c4b8d..0f072509dba 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "39b24ea842be0eaf63078bed4ebbe23a58dda7215d110f82d919cd874340004c", - git_commit = "0b5e5756e2357fe635ce2f8411d56aaff306d139", + sha256 = "a1fa444ad8fb232f32050736eb687aafd3a6097f6eafa9759396151d49b6c1f1", + git_commit = "ab6aab60c8371f9593e331d8fd88cab6348dd86e", ) # Import all of TensorFlow Serving's external dependencies. From b44f1391596cbebe1514c5e7d8caa5c34748a0e0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 25 Sep 2021 06:01:39 -0700 Subject: [PATCH 5409/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6a08f07e-4a92-4f1b-8dd2-85e65fa648a9 PiperOrigin-RevId: 398915818 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0f072509dba..460537addd5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a1fa444ad8fb232f32050736eb687aafd3a6097f6eafa9759396151d49b6c1f1", - git_commit = "ab6aab60c8371f9593e331d8fd88cab6348dd86e", + sha256 = "4d905d2f9f16a6994d3c1b2839ee3404442c8b07e231e5895ebd560f0a3bde15", + git_commit = "d73c891f70abae35e1f431d4609e8f600be2773a", ) # Import all of TensorFlow Serving's external dependencies. From 034273d71d6940e53440293bb138ef217469281b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 25 Sep 2021 12:01:38 -0700 Subject: [PATCH 5410/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/217225db-ccba-4752-b7a0-9a74113b1d72 PiperOrigin-RevId: 398944085 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 460537addd5..21e5873196e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4d905d2f9f16a6994d3c1b2839ee3404442c8b07e231e5895ebd560f0a3bde15", - git_commit = "d73c891f70abae35e1f431d4609e8f600be2773a", + sha256 = "096a0db54c8df2fbe4612a77cfb07fd0460caf485d9a97fa27251a4951da32fb", + git_commit = "886b00271666f1d0696da0dc7f29e8e7a30a394d", ) # Import all of TensorFlow Serving's external dependencies. From cc065a797e66302ec39c20b0c71ccdf3a0c93416 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 25 Sep 2021 18:01:27 -0700 Subject: [PATCH 5411/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7eba9c48-1f4c-4814-b2c0-210033da2be0 PiperOrigin-RevId: 398971093 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 21e5873196e..046cbd013a3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "096a0db54c8df2fbe4612a77cfb07fd0460caf485d9a97fa27251a4951da32fb", - git_commit = "886b00271666f1d0696da0dc7f29e8e7a30a394d", + sha256 = "15302468c9ea841af6913217b9e18a13d80ab7d0f57f226d0c292d2848e0cb32", + git_commit = "af23f534d152a17f08f459988d211ec01ef2f461", ) # Import all of TensorFlow Serving's external dependencies. From 8d96b48c72974bf1f443ac39c96fc374aba5526d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 26 Sep 2021 00:01:35 -0700 Subject: [PATCH 5412/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/27fa4aea-9f25-4931-832c-f3cba5ed28e4 PiperOrigin-RevId: 398998254 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 046cbd013a3..5239a755bc7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "15302468c9ea841af6913217b9e18a13d80ab7d0f57f226d0c292d2848e0cb32", - git_commit = "af23f534d152a17f08f459988d211ec01ef2f461", + sha256 = "3d8d7fff058f6c3605244626c579b5e585a09d1a108d159b3f3e36a33b247ee1", + git_commit = "9f20526122e4fc84f74b224db0a4c7101d9421dd", ) # Import all of TensorFlow Serving's external dependencies. From 209b861652fdcc3dae227b124c0d980b7e5acc95 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 26 Sep 2021 12:02:04 -0700 Subject: [PATCH 5413/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a1b251b2-cb21-4fee-ba26-82f0f9fc8f25 PiperOrigin-RevId: 399055783 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5239a755bc7..e94d157e642 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3d8d7fff058f6c3605244626c579b5e585a09d1a108d159b3f3e36a33b247ee1", - git_commit = "9f20526122e4fc84f74b224db0a4c7101d9421dd", + sha256 = "29d8af985547b4ad173aec962df8bdbf047eaee9577db6ea3231f1d80d94d3dd", + git_commit = "37cacc485defb9855c4983326cbed48da684b8e5", ) # Import all of TensorFlow Serving's external dependencies. From 1d4009ba56d9fc27a71d36610451d7ed9c522cb9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 26 Sep 2021 18:01:17 -0700 Subject: [PATCH 5414/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0fe0cc39-925c-4a2a-96d8-683079ec0d8c PiperOrigin-RevId: 399084653 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e94d157e642..22f33654eb8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "29d8af985547b4ad173aec962df8bdbf047eaee9577db6ea3231f1d80d94d3dd", - git_commit = "37cacc485defb9855c4983326cbed48da684b8e5", + sha256 = "62a2825cdb4d06d4de9cd559ab50b1d9099c90bd1e28bad7854dab0ec36ff42f", + git_commit = "305d30ce6130d0d621746a59dc3116c5824ab523", ) # Import all of TensorFlow Serving's external dependencies. From 92b00ba9fa33beb974852fdfdd6696a55ad395b7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 27 Sep 2021 00:02:19 -0700 Subject: [PATCH 5415/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8c65fafe-33c1-41fd-ab71-2ff0ecbbc818 PiperOrigin-RevId: 399118101 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 22f33654eb8..2d321c4b98d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "62a2825cdb4d06d4de9cd559ab50b1d9099c90bd1e28bad7854dab0ec36ff42f", - git_commit = "305d30ce6130d0d621746a59dc3116c5824ab523", + sha256 = "a8a41d06831190451f7cf59cc505cad73318fb6120960b22b2fa026389417e8e", + git_commit = "866bade85dec9a231350201fb147f9381eee55c7", ) # Import all of TensorFlow Serving's external dependencies. From 16b236f13bc61191295f4df3a3ecd295fdacb39a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 27 Sep 2021 06:01:35 -0700 Subject: [PATCH 5416/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0af71542-75ab-4e77-90c8-ede47c3d8221 PiperOrigin-RevId: 399170163 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2d321c4b98d..abcd05531b6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a8a41d06831190451f7cf59cc505cad73318fb6120960b22b2fa026389417e8e", - git_commit = "866bade85dec9a231350201fb147f9381eee55c7", + sha256 = "2826560b7c858caee2f8c4111b6dbb75540ab31d1ae3f77fca697b7d02cbee93", + git_commit = "9ffa4a9d9e3e4d3c0f00ca90e3845cbe0f1dba72", ) # Import all of TensorFlow Serving's external dependencies. From a506a136a4c93f32531730f34f6cbb380b0ea0be Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 27 Sep 2021 12:01:38 -0700 Subject: [PATCH 5417/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ee429e18-c133-4ac8-89d9-c674f4bea73f PiperOrigin-RevId: 399246897 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index abcd05531b6..00a9f02aef6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2826560b7c858caee2f8c4111b6dbb75540ab31d1ae3f77fca697b7d02cbee93", - git_commit = "9ffa4a9d9e3e4d3c0f00ca90e3845cbe0f1dba72", + sha256 = "b67a9373673d287087b4a0409d35336e1998cbe6d529c07b75a64d3dad6e5eee", + git_commit = "89363b5e083a5c9faa12660cd05c1d79c6ea9f36", ) # Import all of TensorFlow Serving's external dependencies. From 5ecd9c7fd653d0d5125504174cc7e58a3dc56668 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 27 Sep 2021 18:01:45 -0700 Subject: [PATCH 5418/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/293a2f1d-1342-4fdc-8f28-a107f3389f03 PiperOrigin-RevId: 399325488 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 00a9f02aef6..21df4574ab2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b67a9373673d287087b4a0409d35336e1998cbe6d529c07b75a64d3dad6e5eee", - git_commit = "89363b5e083a5c9faa12660cd05c1d79c6ea9f36", + sha256 = "4eb6ff9887c21bf581122e172cd63a92189b58447e14455e2cfc2f0e28cab870", + git_commit = "94917801452c642e75ce051773c8c72412d7e414", ) # Import all of TensorFlow Serving's external dependencies. From c4d3325dc2de7e599fe89af180a1feb7d65b5b0d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 28 Sep 2021 00:01:50 -0700 Subject: [PATCH 5419/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1849dc18-6b20-42f2-b082-69f9e2007dee PiperOrigin-RevId: 399368495 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 21df4574ab2..047a6e2917a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4eb6ff9887c21bf581122e172cd63a92189b58447e14455e2cfc2f0e28cab870", - git_commit = "94917801452c642e75ce051773c8c72412d7e414", + sha256 = "6842863e44ae0d62b7a673361a548aba37893e68498c5b4b890970ddea4b5ccb", + git_commit = "01a184f17127379b5df957872b1731c59dd2a7b7", ) # Import all of TensorFlow Serving's external dependencies. From aa4f044701a560a3a1bece4ff687c96545633bda Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 28 Sep 2021 06:01:35 -0700 Subject: [PATCH 5420/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4e3c5b45-d991-4549-83ff-168b34c6eda0 PiperOrigin-RevId: 399421435 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 047a6e2917a..5534a172103 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6842863e44ae0d62b7a673361a548aba37893e68498c5b4b890970ddea4b5ccb", - git_commit = "01a184f17127379b5df957872b1731c59dd2a7b7", + sha256 = "9fcc165b16b4f986d35643347150cba46ed8a9b42f79e0213303a03750a73740", + git_commit = "a4fe268ea084e7d323133ed7b986e0ae259a2bc7", ) # Import all of TensorFlow Serving's external dependencies. From 96d248d3acea69c9d6a7b8f204f9db26e24468a6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 28 Sep 2021 12:02:23 -0700 Subject: [PATCH 5421/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/61f023f6-2512-4eb7-8020-0a4a3ea83334 PiperOrigin-RevId: 399495978 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5534a172103..4cc5ee24b14 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9fcc165b16b4f986d35643347150cba46ed8a9b42f79e0213303a03750a73740", - git_commit = "a4fe268ea084e7d323133ed7b986e0ae259a2bc7", + sha256 = "c3c931cc297ae64730db7b813997ff93204875d518f7f8929dc97f03243300ad", + git_commit = "9a9b33a3452f6295167d3a794e157baac51a663c", ) # Import all of TensorFlow Serving's external dependencies. From dfcdcd12ace8140ea866facaf6c346e1266abd23 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 28 Sep 2021 18:01:28 -0700 Subject: [PATCH 5422/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/94d5bce7-c5a6-4b87-bac9-aec591d7c1a5 PiperOrigin-RevId: 399571749 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4cc5ee24b14..b723dd5c2e7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c3c931cc297ae64730db7b813997ff93204875d518f7f8929dc97f03243300ad", - git_commit = "9a9b33a3452f6295167d3a794e157baac51a663c", + sha256 = "f2bf0e974fab8e8d2a5cd2cc852e68efd9d51b96cbe6679f1322581de818ee0f", + git_commit = "87462bfac761435a46641ff2f10ad0b6e5414a4b", ) # Import all of TensorFlow Serving's external dependencies. From 85446c0e474e0720631318f7115327b6e7af789a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 29 Sep 2021 00:02:43 -0700 Subject: [PATCH 5423/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/19eb852a-d3f2-4921-9c54-8e66bc933c1f PiperOrigin-RevId: 399617660 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b723dd5c2e7..b252cc7ddaf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f2bf0e974fab8e8d2a5cd2cc852e68efd9d51b96cbe6679f1322581de818ee0f", - git_commit = "87462bfac761435a46641ff2f10ad0b6e5414a4b", + sha256 = "37f6e4a56a1da9196367f7d68af82cc670a348720ce1948ce62b1da3fcb8f587", + git_commit = "0c0fda670bbfd5a68b0129f3038691d1211854e6", ) # Import all of TensorFlow Serving's external dependencies. From 9316d199ea52e0cecf0493a09f95fad2519024ce Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 29 Sep 2021 06:01:57 -0700 Subject: [PATCH 5424/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/977792e3-5d4c-4788-af6e-bfcb0a583d6a PiperOrigin-RevId: 399666995 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b252cc7ddaf..1bda9c0b578 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "37f6e4a56a1da9196367f7d68af82cc670a348720ce1948ce62b1da3fcb8f587", - git_commit = "0c0fda670bbfd5a68b0129f3038691d1211854e6", + sha256 = "ad62905ad83d60223f0fb3fce421237fcd097400d089c6f5cbc7e61c9da7d953", + git_commit = "66fb5e72e31de1f96864ca4f21c6bc0bc1bfef60", ) # Import all of TensorFlow Serving's external dependencies. From a98a1bbf5ff174c237aacb4f3ee57c27a4238866 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 29 Sep 2021 12:01:28 -0700 Subject: [PATCH 5425/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bf0855ad-83de-4981-8ce2-2fe5b0b099bc PiperOrigin-RevId: 399741446 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1bda9c0b578..f9452de463e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ad62905ad83d60223f0fb3fce421237fcd097400d089c6f5cbc7e61c9da7d953", - git_commit = "66fb5e72e31de1f96864ca4f21c6bc0bc1bfef60", + sha256 = "6e2856c09e1e2c36684c41f287a4e6b68f475d3c8c22f45c954eda4edf2ceaa4", + git_commit = "f13dc99a0cdc5c659f107fcc746908fbed285658", ) # Import all of TensorFlow Serving's external dependencies. From 3b95dfd515d6295913dc69651d17ad371d444f15 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 29 Sep 2021 18:01:49 -0700 Subject: [PATCH 5426/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a60aad7f-ea63-45b3-8414-fd4f2b098132 PiperOrigin-RevId: 399820076 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f9452de463e..6b4c90b0986 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6e2856c09e1e2c36684c41f287a4e6b68f475d3c8c22f45c954eda4edf2ceaa4", - git_commit = "f13dc99a0cdc5c659f107fcc746908fbed285658", + sha256 = "3eb7aa34ce6e737e0d7954a7c892de724dfa7c562af161d1dfad2a6634039862", + git_commit = "5556d26ecd7c1e063c52d2a40047741a495c79ac", ) # Import all of TensorFlow Serving's external dependencies. From 6a5dda48847cb95a0b25bc9bf7cbb0862e3857f5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 Sep 2021 00:01:40 -0700 Subject: [PATCH 5427/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/17a00907-049a-4ede-9fe4-e0a9448d5105 PiperOrigin-RevId: 399862498 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6b4c90b0986..6d46c580d95 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3eb7aa34ce6e737e0d7954a7c892de724dfa7c562af161d1dfad2a6634039862", - git_commit = "5556d26ecd7c1e063c52d2a40047741a495c79ac", + sha256 = "e6a1a8058f63facb81b831070ba6d23d6f65507ddd7b6c8345a269f4e532776e", + git_commit = "e5121a9b6abc92034c3057c0820c10c7c13c5f51", ) # Import all of TensorFlow Serving's external dependencies. From 1435e569ce315d9529f6cc8281b64560e606de81 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 Sep 2021 06:01:56 -0700 Subject: [PATCH 5428/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/90078131-c267-42e2-a92a-274d9ab27803 PiperOrigin-RevId: 399913335 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6d46c580d95..b4d9e5fa412 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e6a1a8058f63facb81b831070ba6d23d6f65507ddd7b6c8345a269f4e532776e", - git_commit = "e5121a9b6abc92034c3057c0820c10c7c13c5f51", + sha256 = "3a813796a7aa60e0c740179844cd4d7817d3ad1c95b2ec63363586c023f5938e", + git_commit = "48c0adfaca8cc623dc7784c4672556ca7ffe8f18", ) # Import all of TensorFlow Serving's external dependencies. From c35b45962044c00b5ecd28b5a9cedb6fa8f4bfa6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 Sep 2021 12:01:47 -0700 Subject: [PATCH 5429/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ac3d702d-bf5a-4142-b587-778ec11f8157 PiperOrigin-RevId: 399989200 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b4d9e5fa412..993ab5b3a94 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3a813796a7aa60e0c740179844cd4d7817d3ad1c95b2ec63363586c023f5938e", - git_commit = "48c0adfaca8cc623dc7784c4672556ca7ffe8f18", + sha256 = "7f7e85cbc9da65fbd9b412aff8aea2f76a19d9c741f5d231ce69001d6313f696", + git_commit = "951175bbc00b584983235c4c334ea0f159f01557", ) # Import all of TensorFlow Serving's external dependencies. From 67fa4c189b6b3204f47179cd00025d722b8ab877 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 Sep 2021 18:01:44 -0700 Subject: [PATCH 5430/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1de73df7-14e7-4341-b4fd-aae533ac9d02 PiperOrigin-RevId: 400072334 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 993ab5b3a94..4f45f9a243e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7f7e85cbc9da65fbd9b412aff8aea2f76a19d9c741f5d231ce69001d6313f696", - git_commit = "951175bbc00b584983235c4c334ea0f159f01557", + sha256 = "eb64f34a7bf67af98a78a60f730e3637974ae55114962ce85243509c8a7beb3c", + git_commit = "bdc75cfa670a63fde01e54174203dfc63e92c519", ) # Import all of TensorFlow Serving's external dependencies. From 23f36a10c8b53681c4345a365376af70bb636d56 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Oct 2021 00:01:38 -0700 Subject: [PATCH 5431/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e492a9d6-291a-405c-8f36-4f6d54f79306 PiperOrigin-RevId: 400121430 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4f45f9a243e..216f9377d5a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eb64f34a7bf67af98a78a60f730e3637974ae55114962ce85243509c8a7beb3c", - git_commit = "bdc75cfa670a63fde01e54174203dfc63e92c519", + sha256 = "113d422c27357837f2ac082f985f38dd9c6e208d206c9c214ca746356342a26b", + git_commit = "4af137a8fa955b5c3873afedbaf4ebb2362531d4", ) # Import all of TensorFlow Serving's external dependencies. From 566f04d6fc16940b28d531335a2674e692c1ef6c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Oct 2021 06:01:29 -0700 Subject: [PATCH 5432/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e8f868bf-9c07-4a32-885f-fb56df78e211 PiperOrigin-RevId: 400182522 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 216f9377d5a..0f8f94db282 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "113d422c27357837f2ac082f985f38dd9c6e208d206c9c214ca746356342a26b", - git_commit = "4af137a8fa955b5c3873afedbaf4ebb2362531d4", + sha256 = "688767a782d57283da8cb18e1259c02f18fea671c31a75438ea91e90ec01ebaa", + git_commit = "915f36e99bda23afc039c3e89e0268cb74ba713d", ) # Import all of TensorFlow Serving's external dependencies. From 14da2fb9a2bdec98eb09c732a947c73d913ede59 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Oct 2021 12:14:02 -0700 Subject: [PATCH 5433/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/434d5121-e956-4e92-bc4c-5c14043c5ab4 PiperOrigin-RevId: 400261840 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0f8f94db282..6455ea4ad29 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "688767a782d57283da8cb18e1259c02f18fea671c31a75438ea91e90ec01ebaa", - git_commit = "915f36e99bda23afc039c3e89e0268cb74ba713d", + sha256 = "2ba0f5d14e84a2cb2338cb378ccf8b58ed309c9015a6f43410c83e081a0ed43c", + git_commit = "ba220b14ba7950674fff2d5996862b6bdb6fe62c", ) # Import all of TensorFlow Serving's external dependencies. From b17c1d21a6e75694ecbfb85c0ccb4302a040eeef Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Oct 2021 18:01:45 -0700 Subject: [PATCH 5434/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f0c85e71-03df-4e66-91bd-24542d50e0f3 PiperOrigin-RevId: 400331435 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6455ea4ad29..861ef98cb62 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2ba0f5d14e84a2cb2338cb378ccf8b58ed309c9015a6f43410c83e081a0ed43c", - git_commit = "ba220b14ba7950674fff2d5996862b6bdb6fe62c", + sha256 = "ee58a0216f5cd35abad048f4e4072ec3cef50116e58359ef368c424247dcd072", + git_commit = "0104d97eb99c6ac96dc87c3bea3f634a29b2998e", ) # Import all of TensorFlow Serving's external dependencies. From d12ee6c520861704718b8366600dac0bfb26e2ef Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 2 Oct 2021 00:01:45 -0700 Subject: [PATCH 5435/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/406bac85-2ee0-4577-afdb-195a75494795 PiperOrigin-RevId: 400368911 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 861ef98cb62..f6891733b0f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ee58a0216f5cd35abad048f4e4072ec3cef50116e58359ef368c424247dcd072", - git_commit = "0104d97eb99c6ac96dc87c3bea3f634a29b2998e", + sha256 = "dd6cd38f8f0a47a7f529090a24c3546d31a650c1e38b995271de593da6fad901", + git_commit = "f1666f5bb7433a33668de1fd30e2563f423971c8", ) # Import all of TensorFlow Serving's external dependencies. From 96e9781aa62a4b9ff33c1297096cb740b1723374 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 2 Oct 2021 06:02:02 -0700 Subject: [PATCH 5436/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/539cc01b-6159-47b7-b3d0-335f23b24b80 PiperOrigin-RevId: 400403995 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f6891733b0f..3de1abeb3ab 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dd6cd38f8f0a47a7f529090a24c3546d31a650c1e38b995271de593da6fad901", - git_commit = "f1666f5bb7433a33668de1fd30e2563f423971c8", + sha256 = "ef29880007b78f85bb43f385a492a719f835468218ed272c381e66dadacb5b7a", + git_commit = "664872b49d2e7d94de3ea79083d82b29f6a30c4c", ) # Import all of TensorFlow Serving's external dependencies. From ef1e29233340e7faa8c12ed638135e65b073d73e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 2 Oct 2021 12:01:56 -0700 Subject: [PATCH 5437/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f8bb4ff1-e3a6-4012-89e1-d714b7648e0e PiperOrigin-RevId: 400437283 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3de1abeb3ab..b93a064d352 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ef29880007b78f85bb43f385a492a719f835468218ed272c381e66dadacb5b7a", - git_commit = "664872b49d2e7d94de3ea79083d82b29f6a30c4c", + sha256 = "ed091ea752cc8ac8ff82f6ff5f1b5a2d22ba03234e00447f2bc55c16c75e6532", + git_commit = "34d94fe2ac230755a7ef7923555b47fffede9c94", ) # Import all of TensorFlow Serving's external dependencies. From 75ea19b2dbe99fab389de06a8ebada09267c95e2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 2 Oct 2021 18:01:31 -0700 Subject: [PATCH 5438/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/84e3e1ed-a2fe-4a67-bc82-43939aa3163a PiperOrigin-RevId: 400470597 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b93a064d352..5ca2e6eb37b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ed091ea752cc8ac8ff82f6ff5f1b5a2d22ba03234e00447f2bc55c16c75e6532", - git_commit = "34d94fe2ac230755a7ef7923555b47fffede9c94", + sha256 = "5073ce495b74e1e95756a03981d12ad162cc2e32e72704ef8b3d8f460a9361b5", + git_commit = "5bb68d6bdd313d652c5295654fea1b587bad4544", ) # Import all of TensorFlow Serving's external dependencies. From aa0b9bd564a2cb6c569f0e361e3686690592309d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 3 Oct 2021 00:02:21 -0700 Subject: [PATCH 5439/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/736abbc5-a31e-4907-9c14-ad42cd277070 PiperOrigin-RevId: 400503597 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5ca2e6eb37b..7bda46e9c28 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5073ce495b74e1e95756a03981d12ad162cc2e32e72704ef8b3d8f460a9361b5", - git_commit = "5bb68d6bdd313d652c5295654fea1b587bad4544", + sha256 = "93a9ec9f2373853bc9521074eccb682bd5b13c2af8a8b0cb5cb702f69a6f0a06", + git_commit = "1d01efb25a5a6fd7c08e4cdf9695a99114185b97", ) # Import all of TensorFlow Serving's external dependencies. From e886aa167e9b0f064127b52630647d10c97916cc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 3 Oct 2021 06:01:30 -0700 Subject: [PATCH 5440/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9584fc36-a2d7-43ee-8ea3-26f7f07d6238 PiperOrigin-RevId: 400538314 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7bda46e9c28..5a7331af5f1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "93a9ec9f2373853bc9521074eccb682bd5b13c2af8a8b0cb5cb702f69a6f0a06", - git_commit = "1d01efb25a5a6fd7c08e4cdf9695a99114185b97", + sha256 = "3d30520437a57310f3a5d319450e927bf52a24f6662b419ebefe2c534ad8d064", + git_commit = "70a2d4073d95fba32db10a192a1dd708fdae2925", ) # Import all of TensorFlow Serving's external dependencies. From 494ce3247ba79466f483120f3d0e0c4eb94578c5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 3 Oct 2021 12:01:38 -0700 Subject: [PATCH 5441/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e3c2e185-906e-4ea1-ae59-a0b87ce7d69e PiperOrigin-RevId: 400572257 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5a7331af5f1..d9fad4c6df4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3d30520437a57310f3a5d319450e927bf52a24f6662b419ebefe2c534ad8d064", - git_commit = "70a2d4073d95fba32db10a192a1dd708fdae2925", + sha256 = "a30680bbc8fc659d8206e2e30a7be5fbb7404db8239dcd8eceaf9a798944b293", + git_commit = "609b3f0dde17ea883743b1bd0e10294956f6654a", ) # Import all of TensorFlow Serving's external dependencies. From e92fbad751c43ed7ac05555cd98200f13eaec55e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 3 Oct 2021 18:02:03 -0700 Subject: [PATCH 5442/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/40b92b86-7d9e-43a7-9b9b-63125a10a46f PiperOrigin-RevId: 400606870 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d9fad4c6df4..f82376c3b3d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a30680bbc8fc659d8206e2e30a7be5fbb7404db8239dcd8eceaf9a798944b293", - git_commit = "609b3f0dde17ea883743b1bd0e10294956f6654a", + sha256 = "4d038a8af2865ff9bc5a485636d5cd99c0531149ec81c3090f9b126d40d13543", + git_commit = "7d7cab61b0fe1bf8e01890fda9161c0f0c6e1a1a", ) # Import all of TensorFlow Serving's external dependencies. From 9c11a88316eb9fb84b830991f7de279c1953069f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 4 Oct 2021 00:01:53 -0700 Subject: [PATCH 5443/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/99110724-c860-49d6-9ae8-dcb511d9b552 PiperOrigin-RevId: 400645478 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f82376c3b3d..6fc6573a91b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4d038a8af2865ff9bc5a485636d5cd99c0531149ec81c3090f9b126d40d13543", - git_commit = "7d7cab61b0fe1bf8e01890fda9161c0f0c6e1a1a", + sha256 = "6a2d3bd9611820ad9439b445143e0d1713464325c8005a076563375c41f211bf", + git_commit = "77f09dd7bc4c71551336d5aabd5849d4ad50fbc5", ) # Import all of TensorFlow Serving's external dependencies. From d21d9796df23b78b79f22a604cde770c3c2020c9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 4 Oct 2021 06:01:36 -0700 Subject: [PATCH 5444/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b2883474-47ce-4473-92a9-0fae747d2982 PiperOrigin-RevId: 400698761 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6fc6573a91b..0c957a2652b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6a2d3bd9611820ad9439b445143e0d1713464325c8005a076563375c41f211bf", - git_commit = "77f09dd7bc4c71551336d5aabd5849d4ad50fbc5", + sha256 = "c050eafa77ba03e022defb843a2ad2e04f6ddbf9e4ce3e523969eae87b86040b", + git_commit = "31647c9679f7a0d120886b2e303835784548bf6f", ) # Import all of TensorFlow Serving's external dependencies. From 9d862cba3a29758eef6cf435722db1fa09a63071 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 4 Oct 2021 12:02:19 -0700 Subject: [PATCH 5445/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0aebb5c8-b7b6-4fd9-8541-f3bb7215f9ad PiperOrigin-RevId: 400780055 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0c957a2652b..71737ee7012 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c050eafa77ba03e022defb843a2ad2e04f6ddbf9e4ce3e523969eae87b86040b", - git_commit = "31647c9679f7a0d120886b2e303835784548bf6f", + sha256 = "849483b212671ca6d5d40ca559948c5c816cc0466356166183cbb9e065a368f9", + git_commit = "6e66dfbabe3d2428fee00ec6b9330a74e31a8ab6", ) # Import all of TensorFlow Serving's external dependencies. From 31a50430da7ad701fd1caeda56cf7d46e67dab45 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 4 Oct 2021 18:01:44 -0700 Subject: [PATCH 5446/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e1978f86-2b07-48f6-a785-2e81d4b36562 PiperOrigin-RevId: 400859640 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 71737ee7012..a46410fb03a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "849483b212671ca6d5d40ca559948c5c816cc0466356166183cbb9e065a368f9", - git_commit = "6e66dfbabe3d2428fee00ec6b9330a74e31a8ab6", + sha256 = "548a1da21242fac0d23f36935010dbdb0b79a10df375105f4adb5bcffb332bc0", + git_commit = "ca38dab9d3ee66c5de06f11af9a4b1200da5ef75", ) # Import all of TensorFlow Serving's external dependencies. From 435bd5235a43f9c52481a6e8b7b3a563654d4233 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 5 Oct 2021 00:02:55 -0700 Subject: [PATCH 5447/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/032793e9-64c1-463d-aa73-fd639e8d3be9 PiperOrigin-RevId: 400907280 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a46410fb03a..545a49e7b20 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "548a1da21242fac0d23f36935010dbdb0b79a10df375105f4adb5bcffb332bc0", - git_commit = "ca38dab9d3ee66c5de06f11af9a4b1200da5ef75", + sha256 = "ca82cfbee31a1ca450862bbceebad6f41e6808e3b7025219af49f089dab58d89", + git_commit = "675fb1d8e2cd74eff86257bbf75c1ff2655b00ec", ) # Import all of TensorFlow Serving's external dependencies. From 05cba95a662304323b7903d8855161908bf4917f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 5 Oct 2021 06:01:49 -0700 Subject: [PATCH 5448/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a6d6224c-e7d1-4f08-a9e7-0821ba1f881a PiperOrigin-RevId: 400964863 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 545a49e7b20..e5db00fbbe1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ca82cfbee31a1ca450862bbceebad6f41e6808e3b7025219af49f089dab58d89", - git_commit = "675fb1d8e2cd74eff86257bbf75c1ff2655b00ec", + sha256 = "9e7edcb524dbe7a1f377a44b829cfc598bb8ef86ef8aaddd49b15cdd8573a659", + git_commit = "ac43581891d768378f9a6406d7290a0bb4710264", ) # Import all of TensorFlow Serving's external dependencies. From 51c40996a501436b2b89eb31ff4324afa820d584 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 5 Oct 2021 12:01:59 -0700 Subject: [PATCH 5449/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3db0dfce-ab02-456e-a8ee-1703f07bb8e7 PiperOrigin-RevId: 401043049 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e5db00fbbe1..dca851a6db8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9e7edcb524dbe7a1f377a44b829cfc598bb8ef86ef8aaddd49b15cdd8573a659", - git_commit = "ac43581891d768378f9a6406d7290a0bb4710264", + sha256 = "dfbbc62f8fda798cadd9dc13d653f68e5c8f10c0c2bb3b488f85ae09c20ab3d2", + git_commit = "b1ca8461612426212c4ae231c6d5f54f76f28c46", ) # Import all of TensorFlow Serving's external dependencies. From 1f0f9085adead7bf9c08f7836eab4120a321d92a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 5 Oct 2021 18:02:07 -0700 Subject: [PATCH 5450/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f77003fc-b9a0-4471-a70d-4257dcb9c606 PiperOrigin-RevId: 401116379 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dca851a6db8..6cfe11fd500 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dfbbc62f8fda798cadd9dc13d653f68e5c8f10c0c2bb3b488f85ae09c20ab3d2", - git_commit = "b1ca8461612426212c4ae231c6d5f54f76f28c46", + sha256 = "a20b535a80b13aefaf03f05f7fdd1ebbc3964e0c2acf6cf966254fd3f8d3fdb6", + git_commit = "d39b221a51b53d82bdb5ce941960ac1e74f1a447", ) # Import all of TensorFlow Serving's external dependencies. From f4f5e313136d2851186c07ff4c51a8b1bac200d1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 6 Oct 2021 00:01:50 -0700 Subject: [PATCH 5451/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8c5ab412-2a31-4028-b4df-3296da1bed19 PiperOrigin-RevId: 401166191 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6cfe11fd500..18df5e7053e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a20b535a80b13aefaf03f05f7fdd1ebbc3964e0c2acf6cf966254fd3f8d3fdb6", - git_commit = "d39b221a51b53d82bdb5ce941960ac1e74f1a447", + sha256 = "5bbe5c13bd68b83205a5099c56425a212e6bf3847da86981c877d0f7c717e7a4", + git_commit = "16b664ecc210285f5bc0ae1a346e71077a1caa4c", ) # Import all of TensorFlow Serving's external dependencies. From 619697c7d133703eff146fd9117d08a22bc1eaa8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 6 Oct 2021 06:02:13 -0700 Subject: [PATCH 5452/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/22dd7d81-e16f-42dc-9d12-62c7f7d8d701 PiperOrigin-RevId: 401223528 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 18df5e7053e..daf2cd22cc2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5bbe5c13bd68b83205a5099c56425a212e6bf3847da86981c877d0f7c717e7a4", - git_commit = "16b664ecc210285f5bc0ae1a346e71077a1caa4c", + sha256 = "b4d1e817a2995977d06c0bcb1c5cd8d41ad8784029eb1ddc3514f4e1c420cd0c", + git_commit = "3eaba5f19dcca352ee603deeb6a41018b3ce046f", ) # Import all of TensorFlow Serving's external dependencies. From e03bc62f46357dca39c630d7721003da9871c2bb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 6 Oct 2021 12:01:37 -0700 Subject: [PATCH 5453/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f5fbfe7e-7760-473b-84b2-e9a9af2e098d PiperOrigin-RevId: 401304603 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index daf2cd22cc2..d5955096940 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b4d1e817a2995977d06c0bcb1c5cd8d41ad8784029eb1ddc3514f4e1c420cd0c", - git_commit = "3eaba5f19dcca352ee603deeb6a41018b3ce046f", + sha256 = "8194ca6ea3adf7dd2ea0b5a65847e3df534edbb01c3125d2cf8c308c8c4afd2d", + git_commit = "79315690449eb42d7ef867e730f08315e6de4e34", ) # Import all of TensorFlow Serving's external dependencies. From d4e5c0db43e246c2ba0ba37f6d325a322d2b6fb1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 6 Oct 2021 18:01:56 -0700 Subject: [PATCH 5454/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/aeead643-7be4-479d-bed6-bd71db7de536 PiperOrigin-RevId: 401385816 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d5955096940..2ba10a43c6a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8194ca6ea3adf7dd2ea0b5a65847e3df534edbb01c3125d2cf8c308c8c4afd2d", - git_commit = "79315690449eb42d7ef867e730f08315e6de4e34", + sha256 = "38daf4d5cf679e48e767e9c8e0c4f81a646d32e1e3a42dc38a6da5532d90a558", + git_commit = "0c73111062a82ff3d8e6e2235c1e82d58c009d56", ) # Import all of TensorFlow Serving's external dependencies. From a09360ebd9b932ceab2054eb257999f193ad31f3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Oct 2021 00:01:53 -0700 Subject: [PATCH 5455/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/93fcbbb1-02dc-4c89-841e-c174044f650a PiperOrigin-RevId: 401435632 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2ba10a43c6a..de42d16505b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "38daf4d5cf679e48e767e9c8e0c4f81a646d32e1e3a42dc38a6da5532d90a558", - git_commit = "0c73111062a82ff3d8e6e2235c1e82d58c009d56", + sha256 = "d0c1a431cc3686a0acf7903f1b56b5eabaebaaa08bf3b68351dc392d3d628f34", + git_commit = "18c61a1762d923c2c659b00845efa1964b8eaeec", ) # Import all of TensorFlow Serving's external dependencies. From 3c8d05cf0277417c0c091a42776be1ea660a6753 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Oct 2021 06:01:51 -0700 Subject: [PATCH 5456/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/23a72c79-6dfa-416f-bc2a-8fbe6745e1e9 PiperOrigin-RevId: 401491181 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index de42d16505b..2b0cdca548b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d0c1a431cc3686a0acf7903f1b56b5eabaebaaa08bf3b68351dc392d3d628f34", - git_commit = "18c61a1762d923c2c659b00845efa1964b8eaeec", + sha256 = "0500a93887e9237f7b730dac936e07f4926192d1d311e38ffc7d9491b10b8476", + git_commit = "f44013283bbfc464fc3fa235688da151420ca764", ) # Import all of TensorFlow Serving's external dependencies. From 2c50c2bf0a9609b06c2177a86ebc34b1cd68e2e2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Oct 2021 12:02:33 -0700 Subject: [PATCH 5457/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1bbec8d1-1214-474f-8489-b8a7e690744c PiperOrigin-RevId: 401570796 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2b0cdca548b..b25ad1643b2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0500a93887e9237f7b730dac936e07f4926192d1d311e38ffc7d9491b10b8476", - git_commit = "f44013283bbfc464fc3fa235688da151420ca764", + sha256 = "0bfd68b7b228a26c8ead139c17d272fe3fcf3ef9bdecb19f5ffef73ec039c70f", + git_commit = "413712b82a5c8d0d8fb4d1718994a0e2239b8cde", ) # Import all of TensorFlow Serving's external dependencies. From 3a867608776bb0a7f5ccad5ed28d507ba5963de1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Oct 2021 18:01:51 -0700 Subject: [PATCH 5458/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/43524d76-c54b-417b-bf93-f5cf2901ed40 PiperOrigin-RevId: 401650885 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b25ad1643b2..32f0b49d0cc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0bfd68b7b228a26c8ead139c17d272fe3fcf3ef9bdecb19f5ffef73ec039c70f", - git_commit = "413712b82a5c8d0d8fb4d1718994a0e2239b8cde", + sha256 = "6d63e6d6e4539a93ca1dc71845712e5d0d56e04a678ab8db1d3ab5baf24f9063", + git_commit = "368919c250e0d73e90fdcf15b1387c073cb009d8", ) # Import all of TensorFlow Serving's external dependencies. From 486b731bfaa9c2e5487e1ca5e310ec9270863a7c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Oct 2021 00:01:38 -0700 Subject: [PATCH 5459/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/33e62b39-17f2-4b03-b455-e00df642dff3 PiperOrigin-RevId: 401698704 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 32f0b49d0cc..2cfa3546d4f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6d63e6d6e4539a93ca1dc71845712e5d0d56e04a678ab8db1d3ab5baf24f9063", - git_commit = "368919c250e0d73e90fdcf15b1387c073cb009d8", + sha256 = "55b074a9008406dc06aa50843ee918683c8e1015c4f3b4804da8dd7b7b207895", + git_commit = "ab0ca4bbc66a476aea305f81c69e0201b5876d0a", ) # Import all of TensorFlow Serving's external dependencies. From 46b2e48985fcf56dd573a2dd68f5d9742e303dde Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Oct 2021 06:01:46 -0700 Subject: [PATCH 5460/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fa22f738-bc6d-4e46-969d-67fd95b9f12a PiperOrigin-RevId: 401752247 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2cfa3546d4f..53e09cdf3dd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "55b074a9008406dc06aa50843ee918683c8e1015c4f3b4804da8dd7b7b207895", - git_commit = "ab0ca4bbc66a476aea305f81c69e0201b5876d0a", + sha256 = "0d133a166dc022b55f19bb479ca9e40f4866bbe821e8a514a60d63e44c2fd24c", + git_commit = "835162f2140d4c7555d96856e78c5eda336674e0", ) # Import all of TensorFlow Serving's external dependencies. From 0687ec68e7f5ce41f17ea8896574fa5e7a0589bb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Oct 2021 12:02:03 -0700 Subject: [PATCH 5461/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/114727ca-0585-448f-bb4c-206180424e4d PiperOrigin-RevId: 401823822 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 53e09cdf3dd..b01c90ab002 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0d133a166dc022b55f19bb479ca9e40f4866bbe821e8a514a60d63e44c2fd24c", - git_commit = "835162f2140d4c7555d96856e78c5eda336674e0", + sha256 = "c5fec8c439dddd9362a9cdf7de754d20c86e97ccc5b82ef2404f15b355360b20", + git_commit = "68422b215e618df5ad375bcdc6d2052e9fd3080a", ) # Import all of TensorFlow Serving's external dependencies. From 1b72f59a35a9d67996c4b3a1bdee31b160407dd5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Oct 2021 18:02:10 -0700 Subject: [PATCH 5462/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/dfe3f21c-e0e6-49dd-8efc-3f634eca9c4d PiperOrigin-RevId: 401895869 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b01c90ab002..d318fa885b7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c5fec8c439dddd9362a9cdf7de754d20c86e97ccc5b82ef2404f15b355360b20", - git_commit = "68422b215e618df5ad375bcdc6d2052e9fd3080a", + sha256 = "2a9438981dd659072211e0940b2ea7c1c5899eb40aac01843bf1cae5e4155197", + git_commit = "98458ae6fac670df53d37456d1f23670a1000bd9", ) # Import all of TensorFlow Serving's external dependencies. From 63dd03efcc8ada816d4abaead8643eebd3338bde Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 9 Oct 2021 00:02:18 -0700 Subject: [PATCH 5463/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8b87e17a-454c-41af-9509-203099563633 PiperOrigin-RevId: 401935736 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d318fa885b7..fe9f8c7e62f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2a9438981dd659072211e0940b2ea7c1c5899eb40aac01843bf1cae5e4155197", - git_commit = "98458ae6fac670df53d37456d1f23670a1000bd9", + sha256 = "cba37ed95a99a035539f43fe92fdb6ee9ce9966537baa8371b4adcf0ee83f6dc", + git_commit = "33f8755edc9a814bf6c71a5ad9d1bb07da5b17cf", ) # Import all of TensorFlow Serving's external dependencies. From e6b1982aed71dc7ba1ea69015c500b9099a08585 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 9 Oct 2021 06:01:42 -0700 Subject: [PATCH 5464/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ec099495-346a-424c-9ac4-fb8ed1ffd86b PiperOrigin-RevId: 401975724 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fe9f8c7e62f..262426b327d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cba37ed95a99a035539f43fe92fdb6ee9ce9966537baa8371b4adcf0ee83f6dc", - git_commit = "33f8755edc9a814bf6c71a5ad9d1bb07da5b17cf", + sha256 = "55b3439e68180a6a012a4c6d5635ed5cf4262f3a360bc77ca793bccd0a8bf8d5", + git_commit = "5d8492ab786724ed811588183c93b1623f02c3c5", ) # Import all of TensorFlow Serving's external dependencies. From f15e1d3e785e453595fc9aa8174cfcff01e09e7f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 9 Oct 2021 12:01:46 -0700 Subject: [PATCH 5465/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/312ca292-0128-471a-be46-b2dc5e35bb65 PiperOrigin-RevId: 402009458 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 262426b327d..7d0a65588d7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "55b3439e68180a6a012a4c6d5635ed5cf4262f3a360bc77ca793bccd0a8bf8d5", - git_commit = "5d8492ab786724ed811588183c93b1623f02c3c5", + sha256 = "504aae0c197129c9f2046e5c3e09c40a73f0b5e4e4d0b6f22f2e243edb08d79b", + git_commit = "19b70563ed8a6ee1fc04fd8503d4d1cd4757f5b6", ) # Import all of TensorFlow Serving's external dependencies. From 35b6e5961caeecd8e2fa7edd4896bac28b442a11 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 9 Oct 2021 18:01:37 -0700 Subject: [PATCH 5466/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c562e355-de87-42d2-bdfc-585419fce898 PiperOrigin-RevId: 402043625 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7d0a65588d7..9e4c299cf16 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "504aae0c197129c9f2046e5c3e09c40a73f0b5e4e4d0b6f22f2e243edb08d79b", - git_commit = "19b70563ed8a6ee1fc04fd8503d4d1cd4757f5b6", + sha256 = "bb6245e38633a1df197b5dbe3c070a383106816d4fee3205e224ef1949bceb1c", + git_commit = "556c3a9c41ce0590c12390a0d2fb90af7e035f0a", ) # Import all of TensorFlow Serving's external dependencies. From c3ca92e4f7abc7b8a774086d10453f6ce3001273 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 10 Oct 2021 00:02:10 -0700 Subject: [PATCH 5467/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f53a7b28-10f3-4705-accd-a5c5888a4f5f PiperOrigin-RevId: 402075830 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9e4c299cf16..2ab89efca65 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bb6245e38633a1df197b5dbe3c070a383106816d4fee3205e224ef1949bceb1c", - git_commit = "556c3a9c41ce0590c12390a0d2fb90af7e035f0a", + sha256 = "8869653957f32500b76c2766c3a94c46089dd65192fa005ab8271ce3914db572", + git_commit = "60028072a1c3b4376e145b6fea8e4ccd3324377f", ) # Import all of TensorFlow Serving's external dependencies. From 6fe5eb8ee8995201cd03970b0472da7d4bef5cce Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 10 Oct 2021 06:01:56 -0700 Subject: [PATCH 5468/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7642665b-5223-40ec-88b5-6a81492edf08 PiperOrigin-RevId: 402111487 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2ab89efca65..c40eee1b091 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8869653957f32500b76c2766c3a94c46089dd65192fa005ab8271ce3914db572", - git_commit = "60028072a1c3b4376e145b6fea8e4ccd3324377f", + sha256 = "6b2d947ae8ab5b668cac31666ba8f42882afb2f3f1c740fa21469791b59e8290", + git_commit = "110270f2662b3be858cc2d8cba15e3b8f002847c", ) # Import all of TensorFlow Serving's external dependencies. From dec87dbf153fbb0ec280d961218e3db19a388aff Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 10 Oct 2021 12:02:58 -0700 Subject: [PATCH 5469/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3f51857e-f58b-4522-946f-8bab5ab3a174 PiperOrigin-RevId: 402145264 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c40eee1b091..b96677a3747 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6b2d947ae8ab5b668cac31666ba8f42882afb2f3f1c740fa21469791b59e8290", - git_commit = "110270f2662b3be858cc2d8cba15e3b8f002847c", + sha256 = "abb97fa8d0de9935d266eb5b1bd0eed1f7a987468d390131f707a4a808ebb210", + git_commit = "5e0ee987565dd6e8f42d6daf7c80cc3f1417fec2", ) # Import all of TensorFlow Serving's external dependencies. From 0d13928fe6bc297fa15f587f2d72dc9da53979e4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 10 Oct 2021 18:01:34 -0700 Subject: [PATCH 5470/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4041bf51-c13c-48fd-ac82-7b5109e13d84 PiperOrigin-RevId: 402179935 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b96677a3747..698966d86f0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "abb97fa8d0de9935d266eb5b1bd0eed1f7a987468d390131f707a4a808ebb210", - git_commit = "5e0ee987565dd6e8f42d6daf7c80cc3f1417fec2", + sha256 = "c39bef97742a9cb556870f499a43b0986d64e44983e085f7bf6d3810ee92aafe", + git_commit = "def58fb6635eee4964cb06347e831b0bf85aa151", ) # Import all of TensorFlow Serving's external dependencies. From 547626d408421ccca71b92d2313040e85958c3e5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Oct 2021 00:02:14 -0700 Subject: [PATCH 5471/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/49eabff0-932a-4d71-bafd-230d09f5e2fe PiperOrigin-RevId: 402218918 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 698966d86f0..72e7bca9ad3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c39bef97742a9cb556870f499a43b0986d64e44983e085f7bf6d3810ee92aafe", - git_commit = "def58fb6635eee4964cb06347e831b0bf85aa151", + sha256 = "13f71189eed060773f7b39fcce6eda5f20971529230d2256652633aae597ba2c", + git_commit = "aef63d879885acbc51578c57ab0c4d09074dfe49", ) # Import all of TensorFlow Serving's external dependencies. From 7934ef4568e988944542a53945430d1dbabdedd3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Oct 2021 06:01:30 -0700 Subject: [PATCH 5472/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/060e35ce-44af-4e7c-b5da-6a70f4fd221f PiperOrigin-RevId: 402274099 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 72e7bca9ad3..c0debf574eb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "13f71189eed060773f7b39fcce6eda5f20971529230d2256652633aae597ba2c", - git_commit = "aef63d879885acbc51578c57ab0c4d09074dfe49", + sha256 = "7bcecabc719ba80801f16330dc29cfe8a81aa9254c5c6c10436141539fcc9618", + git_commit = "0fb7b291092a3e2416611ac31e27cbccd198029a", ) # Import all of TensorFlow Serving's external dependencies. From 21360c763767823b82768ce42c5c90c0c9012601 Mon Sep 17 00:00:00 2001 From: Li Lao Date: Mon, 11 Oct 2021 11:18:37 -0700 Subject: [PATCH 5473/8103] Replace int64 with int64_t and uint64 with uint64_t. PiperOrigin-RevId: 402347161 --- .../batching/batch_scheduler_retrier.h | 6 +- .../batching/batching_session.cc | 20 +++--- .../batching/batching_session.h | 2 +- tensorflow_serving/batching/batching_util.cc | 4 +- .../batching/streaming_batch_scheduler.cc | 6 +- .../batching/streaming_batch_scheduler.h | 24 +++---- .../core/aspired_versions_manager.cc | 16 ++--- .../core/aspired_versions_manager.h | 6 +- .../aspired_versions_manager_benchmark.cc | 26 +++---- .../core/aspired_versions_manager_test.cc | 70 +++++++++---------- tensorflow_serving/core/basic_manager.cc | 8 +-- tensorflow_serving/core/basic_manager.h | 4 +- tensorflow_serving/core/basic_manager_test.cc | 46 ++++++------ tensorflow_serving/core/caching_manager.cc | 6 +- tensorflow_serving/core/caching_manager.h | 8 +-- .../core/caching_manager_test.cc | 24 +++---- tensorflow_serving/core/loader_harness.h | 2 +- tensorflow_serving/core/manager.h | 8 +-- tensorflow_serving/core/servable_id.h | 8 +-- .../core/servable_state_monitor.cc | 4 +- .../core/servable_state_monitor.h | 7 +- tensorflow_serving/core/simple_loader.h | 8 +-- .../core/test_util/fake_loader.cc | 2 +- .../core/test_util/fake_loader.h | 5 +- .../core/test_util/manager_test_util.cc | 2 +- .../core/test_util/manager_test_util.h | 2 +- .../kernels/remote_predict_op_kernel.h | 4 +- .../kernels/remote_predict_op_kernel_test.cc | 2 +- .../model_servers/get_model_status_impl.cc | 4 +- .../get_model_status_impl_test.cc | 5 +- .../model_servers/http_rest_api_handler.cc | 12 ++-- .../model_servers/http_rest_api_handler.h | 10 +-- .../http_rest_api_handler_test.cc | 2 +- .../model_servers/http_rest_api_util.cc | 6 +- .../model_servers/http_rest_api_util.h | 4 +- .../model_servers/http_rest_api_util_test.cc | 6 +- .../model_servers/http_server.cc | 2 +- .../model_servers/prediction_service_impl.cc | 6 +- tensorflow_serving/model_servers/server.h | 8 +-- .../model_servers/server_core.cc | 14 ++-- .../model_servers/server_core.h | 9 +-- .../model_servers/server_core_test.cc | 32 ++++----- tensorflow_serving/resources/resource_util.cc | 17 ++--- tensorflow_serving/resources/resource_util.h | 10 +-- .../tensorflow/bundle_factory_test_util.cc | 8 +-- .../tensorflow/bundle_factory_test_util.h | 2 +- .../servables/tensorflow/classifier.cc | 4 +- .../servables/tensorflow/classifier.h | 2 +- .../servables/tensorflow/classifier_test.cc | 6 +- .../tensorflow/machine_learning_metadata.cc | 2 +- .../tensorflow/machine_learning_metadata.h | 2 +- .../servables/tensorflow/multi_inference.cc | 2 +- .../servables/tensorflow/multi_inference.h | 6 +- .../tensorflow/multi_inference_helper_test.cc | 4 +- .../tensorflow/multi_inference_test.cc | 2 +- .../servables/tensorflow/predict_util.cc | 8 +-- .../servables/tensorflow/predict_util.h | 4 +- .../servables/tensorflow/regressor.cc | 4 +- .../servables/tensorflow/regressor.h | 2 +- .../servables/tensorflow/regressor_test.cc | 6 +- .../tensorflow/saved_model_bundle_factory.cc | 2 +- .../tensorflow/saved_model_warmup_util.cc | 6 +- .../servables/tensorflow/tflite_session.cc | 12 ++-- .../servables/tensorflow/tflite_session.h | 4 +- .../servables/tensorflow/util.cc | 22 +++--- .../servables/tensorflow/util.h | 11 +-- .../servables/tensorflow/util_test.cc | 2 +- .../file_system_storage_path_source.cc | 30 ++++---- tensorflow_serving/util/event_bus.h | 4 +- tensorflow_serving/util/event_bus_test.cc | 2 +- .../util/fast_read_dynamic_ptr.h | 4 +- .../util/fast_read_dynamic_ptr_benchmark.cc | 2 +- tensorflow_serving/util/file_probing_env.cc | 2 +- tensorflow_serving/util/file_probing_env.h | 4 +- tensorflow_serving/util/hash.cc | 2 +- tensorflow_serving/util/hash.h | 2 +- tensorflow_serving/util/json_tensor.cc | 2 +- tensorflow_serving/util/json_tensor_test.cc | 2 +- .../util/prometheus_exporter.cc | 2 +- .../util/prometheus_exporter_test.cc | 2 +- tensorflow_serving/util/retrier.cc | 2 +- tensorflow_serving/util/retrier.h | 8 +-- .../util/test_util/mock_file_probing_env.h | 2 +- 83 files changed, 339 insertions(+), 333 deletions(-) diff --git a/tensorflow_serving/batching/batch_scheduler_retrier.h b/tensorflow_serving/batching/batch_scheduler_retrier.h index d6fd9452ee7..6839f75d4df 100644 --- a/tensorflow_serving/batching/batch_scheduler_retrier.h +++ b/tensorflow_serving/batching/batch_scheduler_retrier.h @@ -39,10 +39,10 @@ class BatchSchedulerRetrier : public BatchScheduler { struct Options { // The maximum amount of time to spend retrying 'wrapped_->Schedule()' // calls, in microseconds. - int64 max_time_micros = 10 * 1000 /* 10 milliseconds */; + int64_t max_time_micros = 10 * 1000 /* 10 milliseconds */; // The amount of time to pause between retry attempts, in microseconds. - int64 retry_delay_micros = 100; + int64_t retry_delay_micros = 100; // The environment to use for time and sleeping. Env* env = Env::Default(); @@ -94,7 +94,7 @@ Status BatchSchedulerRetrier::Schedule( std::unique_ptr* task) { Status status; - const uint64 start_time_micros = options_.env->NowMicros(); + const uint64_t start_time_micros = options_.env->NowMicros(); for (;;) { status = wrapped_->Schedule(task); if (status.code() != error::UNAVAILABLE) { diff --git a/tensorflow_serving/batching/batching_session.cc b/tensorflow_serving/batching/batching_session.cc index 9768c7888c5..25a7e89e508 100644 --- a/tensorflow_serving/batching/batching_session.cc +++ b/tensorflow_serving/batching/batching_session.cc @@ -64,8 +64,8 @@ string TensorSignatureDebugString(const TensorSignature& signature) { } struct HashTensorSignature { - uint64 operator()(const TensorSignature& signature) const { - uint64 hash = 0xDECAFCAFFE /* seed */; + uint64_t operator()(const TensorSignature& signature) const { + uint64_t hash = 0xDECAFCAFFE /* seed */; for (const string& input_tensor : signature.input_tensors) { hash = HashCombine(hash, std::hash()(input_tensor)); } @@ -585,7 +585,7 @@ Status BatchingSession::SplitOutputTensors( batch->num_tasks()); } - std::vector task_sizes_plus_optional_padding; + std::vector task_sizes_plus_optional_padding; task_sizes_plus_optional_padding.reserve(batch->num_tasks()); for (int i = 0; i < batch->num_tasks(); ++i) { task_sizes_plus_optional_padding.push_back(batch->task(i).zeroth_dim_size); @@ -709,7 +709,7 @@ void BatchingSession::ProcessBatch( return; } - const uint64 dequeue_time_micros = EnvTime::NowMicros(); + const uint64_t dequeue_time_micros = EnvTime::NowMicros(); // Regardless of the outcome, we need to propagate the status to the // individual tasks and signal that they are done. We use MakeCleanup() to @@ -732,16 +732,16 @@ void BatchingSession::ProcessBatch( // queue time alone, and find the latest task deadline which we'll use for the // overall batch. bool all_tasks_timeout_exceeded = true; - uint64 batch_deadline_micros = 0; + uint64_t batch_deadline_micros = 0; for (int i = 0; i < batch->num_tasks(); ++i) { const BatchingSessionTask& task = batch->task(i); // If the caller doesn't populate RunOptions, the timeout is 0 by default. // Interpret that as "no timeout" i.e. infinity. - const int64 task_timeout_micros = + const int64_t task_timeout_micros = task.run_options.timeout_in_ms() <= 0 ? INT_MAX : task.run_options.timeout_in_ms() * 1000; - const uint64 task_deadline_micros = + const uint64_t task_deadline_micros = task.enqueue_time_micros + task_timeout_micros; if (task_deadline_micros > dequeue_time_micros) { all_tasks_timeout_exceeded = false; @@ -809,7 +809,7 @@ Status SplitInputTask( int open_batch_remaining_slot, int max_batch_size, std::vector>* output_tasks) { BatchingSessionTask& input_task = *(*input_task_ptr); - const int64 input_task_size = input_task.size(); + const int64_t input_task_size = input_task.size(); DCHECK_GT(input_task_size, 0); @@ -884,9 +884,9 @@ Status SplitInputTask( const internal::InputSplitMetadata input_split_metadata( input_task_size, open_batch_remaining_slot, max_batch_size); - // Creates an array of int64 from an array of int, since `tensor::Split` + // Creates an array of int64_t from an array of int, since `tensor::Split` // requires an array of int64. - const absl::FixedArray output_task_sizes( + const absl::FixedArray output_task_sizes( input_split_metadata.task_sizes().begin(), input_split_metadata.task_sizes().end()); const int num_batches = output_task_sizes.size(); diff --git a/tensorflow_serving/batching/batching_session.h b/tensorflow_serving/batching/batching_session.h index 5190f851f17..5420ab6ff01 100644 --- a/tensorflow_serving/batching/batching_session.h +++ b/tensorflow_serving/batching/batching_session.h @@ -172,7 +172,7 @@ struct BatchingSessionTask : public BatchTask { static std::string Name() { return "batching_session"; } // Fields populated when a task is received. - uint64 enqueue_time_micros; + uint64_t enqueue_time_micros; RunOptions run_options; size_t zeroth_dim_size; const std::vector>* inputs; diff --git a/tensorflow_serving/batching/batching_util.cc b/tensorflow_serving/batching/batching_util.cc index 09853b01dcb..79fe88abf1c 100644 --- a/tensorflow_serving/batching/batching_util.cc +++ b/tensorflow_serving/batching/batching_util.cc @@ -33,8 +33,8 @@ namespace serving { // It requires padding to be an array of elements that have fields // "first" and "second". struct OneDimPadding { - int64 first; // pad before - int64 second; // pad after + int64_t first; // pad before + int64_t second; // pad after }; // Constructs array of paddings, where: diff --git a/tensorflow_serving/batching/streaming_batch_scheduler.cc b/tensorflow_serving/batching/streaming_batch_scheduler.cc index 2932e7fa5cf..510ff6a7b1f 100644 --- a/tensorflow_serving/batching/streaming_batch_scheduler.cc +++ b/tensorflow_serving/batching/streaming_batch_scheduler.cc @@ -27,14 +27,14 @@ namespace internal { // SingleTaskScheduler SingleTaskScheduler::SingleTaskScheduler(Env* env, string thread_name, - uint64 no_tasks_wait_time_micros) + uint64_t no_tasks_wait_time_micros) : env_(env), thread_name_(std::move(thread_name)), no_tasks_wait_time_micros_(no_tasks_wait_time_micros) {} SingleTaskScheduler::~SingleTaskScheduler() { stop_.Notify(); } -void SingleTaskScheduler::Schedule(uint64 time_micros, +void SingleTaskScheduler::Schedule(uint64_t time_micros, std::function closure) { DCHECK_GE(time_micros, last_task_time_); last_task_time_ = time_micros; @@ -56,7 +56,7 @@ void SingleTaskScheduler::ThreadLogic() { for (;;) { // Sleep until the time specified in the current task, if any. if (current_task) { - const uint64 now = env_->NowMicros(); + const uint64_t now = env_->NowMicros(); if (current_task->time_micros > now) { env_->SleepForMicroseconds(current_task->time_micros - now); } diff --git a/tensorflow_serving/batching/streaming_batch_scheduler.h b/tensorflow_serving/batching/streaming_batch_scheduler.h index 436518d3316..fe7f9ddc3eb 100644 --- a/tensorflow_serving/batching/streaming_batch_scheduler.h +++ b/tensorflow_serving/batching/streaming_batch_scheduler.h @@ -135,7 +135,7 @@ class StreamingBatchScheduler : public BatchScheduler { // // A negative value means that no timeout will be enforced. This setting is // useful in some test code. - int64 batch_timeout_micros = 0; + int64_t batch_timeout_micros = 0; // The name to use for the pool of batch threads. string thread_pool_name = "batch_threads"; @@ -151,7 +151,7 @@ class StreamingBatchScheduler : public BatchScheduler { // How long SingleTaskScheduler should wait if there are no scheduled tasks, // in microseconds. - uint64 no_tasks_wait_time_micros = 1000; // 1 millisecond + uint64_t no_tasks_wait_time_micros = 1000; // 1 millisecond }; static Status Create( const Options& options, @@ -188,7 +188,7 @@ class StreamingBatchScheduler : public BatchScheduler { // Takes a snapshot of 'open_batch_num_', and schedules an event with // 'batch_closer_' to close it at time 'close_time_micros' if it is still open // at that time. - void ScheduleCloseOfCurrentOpenBatch(uint64 close_time_micros) + void ScheduleCloseOfCurrentOpenBatch(uint64_t close_time_micros) TF_EXCLUSIVE_LOCKS_REQUIRED(mu_); const Options options_; @@ -209,7 +209,7 @@ class StreamingBatchScheduler : public BatchScheduler { // The sequence number of 'open_batch_'. Incremented each time 'open_batch_' // is assigned to a new (non-null) batch object. - int64 open_batch_num_ TF_GUARDED_BY(mu_) = 0; + int64_t open_batch_num_ TF_GUARDED_BY(mu_) = 0; // The number of batches "in progress", i.e. batches that have been started // but for which the process-batch callback hasn't finished. Note that this @@ -246,7 +246,7 @@ namespace internal { class SingleTaskScheduler { public: SingleTaskScheduler(Env* env, string thread_name, - uint64 no_tasks_wait_time_micros); + uint64_t no_tasks_wait_time_micros); // Blocks until the currently-set closure (if any) runs. ~SingleTaskScheduler(); @@ -256,7 +256,7 @@ class SingleTaskScheduler { // cancels any closures provided in them (if they haven't already been run). // // IMPORTANT: 'time_micros' must be monotonically non-decreasing across calls. - void Schedule(uint64 time_micros, std::function closure); + void Schedule(uint64_t time_micros, std::function closure); private: // The code executed in 'thread_'. Looks for updated tasks, and executes them @@ -271,7 +271,7 @@ class SingleTaskScheduler { // The arguments to Schedule(). struct Task { - uint64 time_micros; + uint64_t time_micros; std::function closure; }; @@ -280,7 +280,7 @@ class SingleTaskScheduler { // The time parameter passed in the most recent Schedule() invocation. // Used to enforce monotonicity. - uint64 last_task_time_ = 0; + uint64_t last_task_time_ = 0; // A notification for stopping the thread, during destruction. Notification stop_; @@ -292,7 +292,7 @@ class SingleTaskScheduler { std::unique_ptr thread_; // How long to wait if there are no scheduled tasks, in microseconds. - const uint64 no_tasks_wait_time_micros_; + const uint64_t no_tasks_wait_time_micros_; TF_DISALLOW_COPY_AND_ASSIGN(SingleTaskScheduler); }; @@ -363,7 +363,7 @@ Status StreamingBatchScheduler::Schedule( // If we are about to add the first task to a batch, schedule the batch to // be closed after the timeout. if (options_.batch_timeout_micros > 0 && open_batch_->empty()) { - const uint64 batch_deadline = + const uint64_t batch_deadline = options_.env->NowMicros() + options_.batch_timeout_micros; ScheduleCloseOfCurrentOpenBatch(batch_deadline); } @@ -433,13 +433,13 @@ void StreamingBatchScheduler::StartNewBatch() { template void StreamingBatchScheduler::ScheduleCloseOfCurrentOpenBatch( - uint64 close_time_micros) { + uint64_t close_time_micros) { if (batch_closer_ == nullptr) { batch_closer_.reset(new internal::SingleTaskScheduler( options_.env, "batch_closer", options_.no_tasks_wait_time_micros)); } - const int64 batch_num_to_close = open_batch_num_; + const int64_t batch_num_to_close = open_batch_num_; batch_closer_->Schedule(close_time_micros, [this, batch_num_to_close] { { mutex_lock l(this->mu_); diff --git a/tensorflow_serving/core/aspired_versions_manager.cc b/tensorflow_serving/core/aspired_versions_manager.cc index 1c005f7ff4e..beb4cee1e90 100644 --- a/tensorflow_serving/core/aspired_versions_manager.cc +++ b/tensorflow_serving/core/aspired_versions_manager.cc @@ -95,9 +95,9 @@ Status ValidateAspiredVersions( } // Returns the set of version numbers in 'versions'. -std::set GetVersionNumbers( +std::set GetVersionNumbers( const std::vector>>& versions) { - std::set version_numbers; + std::set version_numbers; for (const auto& version : versions) { version_numbers.insert(version.id().version); } @@ -176,7 +176,7 @@ Status AspiredVersionsManager::Create( } AspiredVersionsManager::AspiredVersionsManager( - int64 manage_state_interval_micros, Env* env, + int64_t manage_state_interval_micros, Env* env, std::unique_ptr aspired_version_policy, std::unique_ptr basic_manager) : aspired_version_policy_(std::move(aspired_version_policy)), @@ -256,14 +256,14 @@ void AspiredVersionsManager::ProcessAspiredVersionsRequest( VLOG(1) << "Processing aspired versions request: " << servable_name << ": " << ServableVersionsDebugString(versions); - const std::set next_aspired_versions = GetVersionNumbers(versions); + const std::set next_aspired_versions = GetVersionNumbers(versions); // We gather all the servables with the servable_name and // 1. Add the current aspired version numbers to a set, // 2. Set the aspired bool to false for all current servable harnesses which // are not aspired. - std::set current_aspired_versions; - std::set current_aspired_versions_with_error; + std::set current_aspired_versions; + std::set current_aspired_versions_with_error; const std::vector> state_snapshots = basic_manager_->GetManagedServableStateSnapshots( string(servable_name)); @@ -287,7 +287,7 @@ void AspiredVersionsManager::ProcessAspiredVersionsRequest( // We do a set_difference (A - B), on the next aspired versions and the // current aspired versions to find the version numbers which need to be // added the harness map. - std::set additions; + std::set additions; std::set_difference( next_aspired_versions.begin(), next_aspired_versions.end(), current_aspired_versions.begin(), current_aspired_versions.end(), @@ -338,7 +338,7 @@ bool AspiredVersionsManager::ContainsAnyReaspiredVersions( const std::vector> state_snapshots = basic_manager_->GetManagedServableStateSnapshots( string(servable_name)); - const std::set version_numbers = GetVersionNumbers(versions); + const std::set version_numbers = GetVersionNumbers(versions); for (const ServableStateSnapshot& state_snapshot : state_snapshots) { if (!state_snapshot.additional_state->is_aspired && version_numbers.find(state_snapshot.id.version) != diff --git a/tensorflow_serving/core/aspired_versions_manager.h b/tensorflow_serving/core/aspired_versions_manager.h index 133305d271f..5d35b14fb84 100644 --- a/tensorflow_serving/core/aspired_versions_manager.h +++ b/tensorflow_serving/core/aspired_versions_manager.h @@ -97,7 +97,7 @@ class AspiredVersionsManager : public Manager, /// The periodicity, in microseconds, of the thread which manages the state /// of the servables. Default: 100 milliseconds. If this is set less than or /// equal to 0, we don't run this thread at all. - int64 manage_state_interval_micros = 100 * 1000; + int64_t manage_state_interval_micros = 100 * 1000; /// EventBus to publish servable state changes. This is optional, if unset, /// we don't publish. @@ -125,7 +125,7 @@ class AspiredVersionsManager : public Manager, /// The interval, in microseconds, between each servable load retry. If set /// negative, we don't wait. /// Default: 1 minute. - int64 load_retry_interval_micros = 1LL * 60 * 1000 * 1000; + int64_t load_retry_interval_micros = 1LL * 60 * 1000 * 1000; // If true, and there are not multiple load threads, filesystem caches will // be flushed after each servable is loaded. (Cache flush is skipped when @@ -218,7 +218,7 @@ class AspiredVersionsManager : public Manager, AspiredVersionsManager* manager); AspiredVersionsManager( - int64 manage_state_interval_micros, Env* env, + int64_t manage_state_interval_micros, Env* env, std::unique_ptr aspired_version_policy, std::unique_ptr basic_manager); diff --git a/tensorflow_serving/core/aspired_versions_manager_benchmark.cc b/tensorflow_serving/core/aspired_versions_manager_benchmark.cc index df94196b618..d7f71d83edc 100644 --- a/tensorflow_serving/core/aspired_versions_manager_benchmark.cc +++ b/tensorflow_serving/core/aspired_versions_manager_benchmark.cc @@ -93,10 +93,10 @@ class BenchmarkState { void RunUpdate(); // Starts serving this loader version. - void StartServing(int64 loader_version); + void StartServing(int64_t loader_version); // Gets the latest version of the loader available for serving. - int64 GetLatestVersion(bool do_work); + int64_t GetLatestVersion(bool do_work); // To avoid having the benchmark timing include time spent scheduling threads, // we use this notification to notify when the read threads should begin. @@ -119,14 +119,14 @@ class BenchmarkState { bool do_work_; }; -void BenchmarkState::StartServing(const int64 loader_version) { - std::unique_ptr loader(new SimpleLoader( - [loader_version](std::unique_ptr* const servable) { +void BenchmarkState::StartServing(const int64_t loader_version) { + std::unique_ptr loader(new SimpleLoader( + [loader_version](std::unique_ptr* const servable) { servable->reset(new int64); **servable = loader_version; return Status::OK(); }, - SimpleLoader::EstimateNoResources())); + SimpleLoader::EstimateNoResources())); std::vector>> versions; versions.push_back({{kServableName, loader_version}, std::move(loader)}); manager_->GetAspiredVersionsCallback()(kServableName, std::move(versions)); @@ -144,8 +144,8 @@ void BenchmarkState::StartServing(const int64 loader_version) { CHECK_EQ(1, manager_->ListAvailableServableIds().size()); } -int64 BenchmarkState::GetLatestVersion(const bool do_work) { - ServableHandle handle; +int64_t BenchmarkState::GetLatestVersion(const bool do_work) { + ServableHandle handle; const Status status = manager_->GetServableHandle( ServableRequest::Latest(kServableName), &handle); TF_CHECK_OK(status) << status; @@ -330,13 +330,13 @@ void BM_GetServableHandle(::testing::benchmark::State& state) { const string servable_name = strings::StrCat(kServableName, i); std::vector>> versions; for (int j = 0; j < kNumServableVersions; ++j) { - std::unique_ptr loader(new SimpleLoader( - [j](std::unique_ptr* const servable) { + std::unique_ptr loader(new SimpleLoader( + [j](std::unique_ptr* const servable) { servable->reset(new int64); **servable = j; return Status::OK(); }, - SimpleLoader::EstimateNoResources())); + SimpleLoader::EstimateNoResources())); versions.push_back({{servable_name, j}, std::move(loader)}); } @@ -365,7 +365,7 @@ void BM_GetServableHandle(::testing::benchmark::State& state) { const string name = strings::StrCat(kServableName, random.Uniform(kNumServableStreams)); if (random.RandFloat() > kLatestRatio) { - const int64 version = random.Uniform(kNumServableVersions); + const int64_t version = random.Uniform(kNumServableVersions); requests->push_back(ServableRequest::Specific(name, version)); } else { requests->push_back(ServableRequest::Latest(name)); @@ -374,7 +374,7 @@ void BM_GetServableHandle(::testing::benchmark::State& state) { return requests; }(); - ServableHandle handle; + ServableHandle handle; int i = 0; for (auto s : state) { const Status status = diff --git a/tensorflow_serving/core/aspired_versions_manager_test.cc b/tensorflow_serving/core/aspired_versions_manager_test.cc index a18333e4b0a..c05502150d1 100644 --- a/tensorflow_serving/core/aspired_versions_manager_test.cc +++ b/tensorflow_serving/core/aspired_versions_manager_test.cc @@ -65,8 +65,8 @@ ServableData> CreateAspiredVersion( // We parameterize this test with the number of load & unload threads. (Zero // means use an in-line executor instead of a thread pool.) struct ThreadPoolSizes { - uint64 num_load_threads; - uint64 num_unload_threads; + uint64_t num_load_threads; + uint64_t num_unload_threads; }; class AspiredVersionsManagerTest : public ::testing::TestWithParam> { @@ -176,7 +176,7 @@ INSTANTIATE_TEST_CASE_P( std::make_tuple(ThreadPoolSizes{4, 4}, true))); TEST_P(AspiredVersionsManagerTest, ServableHandleNotFoundMissingLoaderName) { - ServableHandle handle; + ServableHandle handle; const Status status = manager_->GetServableHandle( ServableRequest::Latest(strings::StrCat(kServableName, "missing")), &handle); @@ -186,8 +186,8 @@ TEST_P(AspiredVersionsManagerTest, ServableHandleNotFoundMissingLoaderName) { TEST_P(AspiredVersionsManagerTest, ServableHandleNotFoundMissingVersion) { // This version is missing. - const int64 missing_version = 100; - ServableHandle handle; + const int64_t missing_version = 100; + ServableHandle handle; const Status status = manager_->GetServableHandle( ServableRequest::Specific(kServableName, missing_version), &handle); ASSERT_FALSE(status.ok()) << status; @@ -219,7 +219,7 @@ TEST_P(AspiredVersionsManagerTest, ServableHandleLatest) { WaitUntilServableManagerStateIsOneOf( servable_state_monitor_, id, {ServableState::ManagerState::kAvailable}); - ServableHandle handle; + ServableHandle handle; const Status status = manager_->GetServableHandle( ServableRequest::Latest(kServableName), &handle); TF_ASSERT_OK(status); @@ -241,7 +241,7 @@ TEST_P(AspiredVersionsManagerTest, ServableHandleLatestVersionIsZero) { WaitUntilServableManagerStateIsOneOf( servable_state_monitor_, id, {ServableState::ManagerState::kAvailable}); - ServableHandle handle; + ServableHandle handle; const Status status = manager_->GetServableHandle( ServableRequest::Latest(kServableName3), &handle); TF_ASSERT_OK(status); @@ -262,7 +262,7 @@ TEST_P(AspiredVersionsManagerTest, ReloadAspiredError) { InvokePolicyAndExecuteAction(); WaitUntilServableManagerStateIsOneOf( servable_state_monitor_, id, {ServableState::ManagerState::kAvailable}); - ServableHandle handle; + ServableHandle handle; const Status status = manager_->GetServableHandle( ServableRequest::Latest(kServableName), &handle); TF_ASSERT_OK(status); @@ -279,7 +279,7 @@ TEST_P(AspiredVersionsManagerTest, ReloadAspiredError) { InvokePolicyAndExecuteAction(); WaitUntilServableManagerStateIsOneOf(servable_state_monitor_, id, {ServableState::ManagerState::kEnd}); - ServableHandle handle; + ServableHandle handle; Status status = manager_->GetServableHandle( ServableRequest::Specific(kServableName, 2), &handle); EXPECT_FALSE(status.ok()) << status; @@ -296,14 +296,14 @@ TEST_P(AspiredVersionsManagerTest, ReloadAspiredError) { WaitUntilServableManagerStateIsOneOf( servable_state_monitor_, id, {ServableState::ManagerState::kAvailable}); - ServableHandle handle; + ServableHandle handle; Status status = manager_->GetServableHandle( ServableRequest::Specific(kServableName, 2), &handle); TF_ASSERT_OK(status) << status; } else { // Sleep for 1ms. There's nothing to wait on as the state will not change. Env::Default()->SleepForMicroseconds(1000 /* 1 ms */); - ServableHandle handle; + ServableHandle handle; Status status = manager_->GetServableHandle( ServableRequest::Specific(kServableName, 2), &handle); EXPECT_FALSE(status.ok()) << status; @@ -312,7 +312,7 @@ TEST_P(AspiredVersionsManagerTest, ReloadAspiredError) { } TEST_P(AspiredVersionsManagerTest, ServableHandleSpecificVersion) { - ServableHandle handle; + ServableHandle handle; const ServableId id = {kServableName2, 0}; const Status status = manager_->GetServableHandle(ServableRequest::FromId(id), &handle); @@ -367,8 +367,8 @@ TEST_P(AspiredVersionsManagerTest, ListAvailableServableIds) { TEST_P(AspiredVersionsManagerTest, GetAvailableServableHandles) { // Scoped to destruct handles at the end of it. { - const std::map> handles_before = - manager_->GetAvailableServableHandles(); + const std::map> handles_before = + manager_->GetAvailableServableHandles(); ASSERT_EQ(kNumVersionsPerServable * 2, handles_before.size()); const std::vector expected_ids_before = {{kServableName, 0}, @@ -411,8 +411,8 @@ TEST_P(AspiredVersionsManagerTest, GetAvailableServableHandles) { {kServableName, 1}, {ServableState::ManagerState::kEnd}); { - const std::map> handles_after = - manager_->GetAvailableServableHandles(); + const std::map> handles_after = + manager_->GetAvailableServableHandles(); ASSERT_EQ(kNumVersionsPerServable, handles_after.size()); const std::vector expected_ids_after = {{kServableName2, 0}, @@ -435,7 +435,7 @@ TEST_P(AspiredVersionsManagerTest, AspiredRemovedFull) { // Scoped so that the handle is destructed at the end, and the harness is // destructed when we run the manager looping thread. { - ServableHandle handle; + ServableHandle handle; const Status status = manager_->GetServableHandle( ServableRequest::Latest(kServableName), &handle); TF_ASSERT_OK(status); @@ -460,7 +460,7 @@ TEST_P(AspiredVersionsManagerTest, AspiredRemovedFull) { EXPECT_EQ(kNumVersionsPerServable, num_fake_loaders_before - num_fake_loaders_after); - ServableHandle missing_handle; + ServableHandle missing_handle; const Status missing_status = manager_->GetServableHandle( ServableRequest::Latest(kServableName), &missing_handle); ASSERT_FALSE(missing_status.ok()); @@ -480,14 +480,14 @@ TEST_P(AspiredVersionsManagerTest, AspiredRemovedPartial) { {ServableState::ManagerState::kEnd}); // Version 0 should remain available in the manager. - ServableHandle v0_handle; + ServableHandle v0_handle; const Status v0_status = manager_->GetServableHandle( ServableRequest::Specific(kServableName, 0), &v0_handle); TF_ASSERT_OK(v0_status); EXPECT_EQ(0, *v0_handle); // Version 1 should no longer be available. - ServableHandle v1_handle; + ServableHandle v1_handle; const Status v1_status = manager_->GetServableHandle( ServableRequest::Specific(kServableName, 1), &v1_handle); ASSERT_FALSE(v1_status.ok()); @@ -496,7 +496,7 @@ TEST_P(AspiredVersionsManagerTest, AspiredRemovedPartial) { TEST_P(AspiredVersionsManagerTest, RevertToSmallerVersionNumber) { // Initially, versions 0 and 1 of kServableName are loaded. - std::set initial_versions; + std::set initial_versions; for (const ServableId& id : manager_->ListAvailableServableIds()) { if (id.name == kServableName) { initial_versions.insert(id.version); @@ -539,14 +539,14 @@ TEST_P(AspiredVersionsManagerTest, RevertToSmallerVersionNumber) { done_transitioning.Notify(); // Version 0 should be available. - ServableHandle v0_handle; + ServableHandle v0_handle; const Status v0_status = manager_->GetServableHandle( ServableRequest::Specific(kServableName, 0), &v0_handle); TF_ASSERT_OK(v0_status); EXPECT_EQ(0, *v0_handle); // Version 1 should not be available. - ServableHandle v1_handle; + ServableHandle v1_handle; const Status v1_status = manager_->GetServableHandle( ServableRequest::Specific(kServableName, 1), &v1_handle); ASSERT_FALSE(v1_status.ok()); @@ -555,7 +555,7 @@ TEST_P(AspiredVersionsManagerTest, RevertToSmallerVersionNumber) { TEST_P(AspiredVersionsManagerTest, AspiredAndManageStateLoad) { const ServableId id = {kServableName, 2}; - ServableHandle not_found_handle; + ServableHandle not_found_handle; const Status not_found_status = manager_->GetServableHandle( ServableRequest::FromId(id), ¬_found_handle); ASSERT_FALSE(not_found_status.ok()) << not_found_status; @@ -567,7 +567,7 @@ TEST_P(AspiredVersionsManagerTest, AspiredAndManageStateLoad) { std::move(aspired_versions)); HandlePendingAspiredVersionsRequests(); - ServableHandle not_ready_handle; + ServableHandle not_ready_handle; const Status not_ready_status = manager_->GetServableHandle( ServableRequest::FromId(id), ¬_ready_handle); ASSERT_FALSE(not_ready_status.ok()) << not_ready_status; @@ -581,7 +581,7 @@ TEST_P(AspiredVersionsManagerTest, AspiredAndManageStateLoad) { WaitUntilServableManagerStateIsOneOf( servable_state_monitor_, id, {ServableState::ManagerState::kAvailable}); - ServableHandle handle; + ServableHandle handle; const Status status = manager_->GetServableHandle(ServableRequest::FromId(id), &handle); TF_ASSERT_OK(status); @@ -590,7 +590,7 @@ TEST_P(AspiredVersionsManagerTest, AspiredAndManageStateLoad) { TEST_P(AspiredVersionsManagerTest, AspiredAndManageStateUnload) { { - ServableHandle handle; + ServableHandle handle; const Status status = manager_->GetServableHandle( ServableRequest::Specific(kServableName, 0), &handle); TF_ASSERT_OK(status); @@ -610,7 +610,7 @@ TEST_P(AspiredVersionsManagerTest, AspiredAndManageStateUnload) { {kServableName, 1}, {ServableState::ManagerState::kEnd}); - ServableHandle not_found_handle; + ServableHandle not_found_handle; const Status not_found_status = manager_->GetServableHandle( ServableRequest::Specific(kServableName, 0), ¬_found_handle); ASSERT_FALSE(not_found_status.ok()) << not_found_status; @@ -620,14 +620,14 @@ TEST_P(AspiredVersionsManagerTest, AspiredAndManageStateUnload) { // The manager prefers unloading over loading when deciding between different // servable actions. This behaviour is tested here. TEST_P(AspiredVersionsManagerTest, ManagerPrefersUnloadOverLoad) { - ServableHandle not_found_2_handle; + ServableHandle not_found_2_handle; Status not_found_2_status = manager_->GetServableHandle( ServableRequest::Specific(kServableName2, 2), ¬_found_2_handle); ASSERT_FALSE(not_found_2_status.ok()) << not_found_2_status; EXPECT_EQ(error::NOT_FOUND, not_found_2_status.code()); { - ServableHandle found_0_handle; + ServableHandle found_0_handle; const Status found_0_status = manager_->GetServableHandle( ServableRequest::Specific(kServableName, 0), &found_0_handle); TF_ASSERT_OK(found_0_status); @@ -659,7 +659,7 @@ TEST_P(AspiredVersionsManagerTest, ManagerPrefersUnloadOverLoad) { {kServableName, 0}, {ServableState::ManagerState::kEnd}); - ServableHandle not_found_0_handle; + ServableHandle not_found_0_handle; const Status not_found_0_status = manager_->GetServableHandle( ServableRequest::Specific(kServableName, 0), ¬_found_0_handle); ASSERT_FALSE(not_found_0_status.ok()) << not_found_0_status; @@ -676,7 +676,7 @@ TEST_P(AspiredVersionsManagerTest, ManagerPrefersUnloadOverLoad) { servable_state_monitor_, {kServableName2, 2}, {ServableState::ManagerState::kAvailable}); - ServableHandle found_2_handle; + ServableHandle found_2_handle; const Status found_2_status = manager_->GetServableHandle( ServableRequest::Specific(kServableName2, 2), &found_2_handle); TF_ASSERT_OK(found_2_status); @@ -692,7 +692,7 @@ TEST_P(AspiredVersionsManagerTest, ErroneousAspiredVersion) { std::move(aspired_versions)); HandlePendingAspiredVersionsRequests(); - ServableHandle handle; + ServableHandle handle; Status status = manager_->GetServableHandle( ServableRequest::Specific(kServableName, 3), &handle); EXPECT_FALSE(status.ok()) << status; @@ -707,8 +707,8 @@ TEST_P(AspiredVersionsManagerTest, ErroneousAspiredVersion) { // Test to ensure that the deletion of a loader/servable occurs in a manager // thread, and not a request thread. TEST_P(AspiredVersionsManagerTest, DestructOnNonServingThread) { - std::unique_ptr> latest_handle( - new ServableHandle()); + std::unique_ptr> latest_handle( + new ServableHandle()); const Status status = manager_->GetServableHandle( ServableRequest::Latest(kServableName), latest_handle.get()); TF_ASSERT_OK(status); diff --git a/tensorflow_serving/core/basic_manager.cc b/tensorflow_serving/core/basic_manager.cc index 731067623f0..9bdbaf5a0c9 100644 --- a/tensorflow_serving/core/basic_manager.cc +++ b/tensorflow_serving/core/basic_manager.cc @@ -73,7 +73,7 @@ struct BasicManager::ServingMap::EqRequest { }; struct BasicManager::ServingMap::HashRequest { - uint64 operator()(const ServableRequest& request) const { + uint64_t operator()(const ServableRequest& request) const { // Hash codes for many common types are remarkably bad, often clustering // around the same values of the low and/or high bits for linear // sequences of inputs such as 1, 2, 3; or addresses of consecutively @@ -84,9 +84,9 @@ struct BasicManager::ServingMap::HashRequest { // make the high bits contain more entropy from the entire hash code. // It's based on Fibonacci hashing from Knuth's Art of Computer // Programming volume 3, section 6.4. - const uint64 version_hash = [&]() -> uint64 { + const uint64_t version_hash = [&]() -> uint64_t { if (request.version) { - return std::hash()(request.version.value()) * + return std::hash()(request.version.value()) * 0x9E3779B97F4A7C13; // (sqrt(5) - 1)/2 as a binary fraction. } else { switch (request.auto_version_policy) { @@ -233,7 +233,7 @@ Status BasicManager::Create(Options options, BasicManager::BasicManager(Env* const env, const uint32 num_load_threads, const uint32 num_unload_threads, uint32 max_num_load_retries, - int64 load_retry_interval_micros, + int64_t load_retry_interval_micros, bool flush_filesystem_caches, std::unique_ptr resource_tracker, EventBus* servable_event_bus, diff --git a/tensorflow_serving/core/basic_manager.h b/tensorflow_serving/core/basic_manager.h index 59e47754112..36285515a81 100644 --- a/tensorflow_serving/core/basic_manager.h +++ b/tensorflow_serving/core/basic_manager.h @@ -138,7 +138,7 @@ class BasicManager : public Manager { // The interval, in microseconds, between each servable load retry. If set // negative, we don't wait. // Default: 1 minute. - int64 load_retry_interval_micros = 1LL * 60 * 1000 * 1000; + int64_t load_retry_interval_micros = 1LL * 60 * 1000 * 1000; // If true, and there are not multiple load threads, filesystem caches will // be flushed after each servable is loaded. (Cache flush is skipped when @@ -269,7 +269,7 @@ class BasicManager : public Manager { friend class test_util::BasicManagerTestAccess; BasicManager(Env* env, uint32 num_load_threads, uint32 num_unload_threads, - uint32 max_num_load_retries, int64 load_retry_interval_micros, + uint32 max_num_load_retries, int64_t load_retry_interval_micros, bool flush_filesystem_caches, std::unique_ptr resource_tracker, EventBus* servable_event_bus, diff --git a/tensorflow_serving/core/basic_manager_test.cc b/tensorflow_serving/core/basic_manager_test.cc index 150378d5920..a3c527cee4a 100644 --- a/tensorflow_serving/core/basic_manager_test.cc +++ b/tensorflow_serving/core/basic_manager_test.cc @@ -80,8 +80,8 @@ ServableData> CreateServable( // We parameterize this test with the number of load & unload threads. (Zero // means use an in-line executor instead of a thread pool.) struct ThreadPoolSizes { - uint64 num_load_threads; - uint64 num_unload_threads; + uint64_t num_load_threads; + uint64_t num_unload_threads; }; class BasicManagerTest : public ::testing::TestWithParam { protected: @@ -133,7 +133,7 @@ INSTANTIATE_TEST_CASE_P( ThreadPoolSizes{4, 4} /* with load and unload threadpools */)); TEST_P(BasicManagerTest, ServableHandleNotFoundMissingLoaderName) { - ServableHandle handle; + ServableHandle handle; const Status status = basic_manager_->GetServableHandle( ServableRequest::Latest(strings::StrCat(kServableName, "missing")), &handle); @@ -143,8 +143,8 @@ TEST_P(BasicManagerTest, ServableHandleNotFoundMissingLoaderName) { TEST_P(BasicManagerTest, ServableHandleNotFoundMissingVersion) { // This version is missing. - const int64 missing_version = 100; - ServableHandle handle; + const int64_t missing_version = 100; + ServableHandle handle; const Status status = basic_manager_->GetServableHandle( ServableRequest::Specific(kServableName, missing_version), &handle); ASSERT_FALSE(status.ok()) << status; @@ -153,7 +153,7 @@ TEST_P(BasicManagerTest, ServableHandleNotFoundMissingVersion) { TEST_P(BasicManagerTest, ServableHandleEarliest) { ASSERT_GT(kNumVersionsPerServable, 1); - ServableHandle handle; + ServableHandle handle; const Status status = basic_manager_->GetServableHandle( ServableRequest::Earliest(kServableName), &handle); TF_ASSERT_OK(status); @@ -168,7 +168,7 @@ TEST_P(BasicManagerTest, ServableHandleLatest) { WaitUntilServableManagerStateIsOneOf( servable_state_monitor_, id, {ServableState::ManagerState::kAvailable}); - ServableHandle handle; + ServableHandle handle; const Status status = basic_manager_->GetServableHandle( ServableRequest::Latest(kServableName), &handle); TF_ASSERT_OK(status); @@ -190,7 +190,7 @@ TEST_P(BasicManagerTest, ServableHandleLatestVersionIsZero) { WaitUntilServableManagerStateIsOneOf( servable_state_monitor_, id, {ServableState::ManagerState::kAvailable}); - ServableHandle handle; + ServableHandle handle; const Status status = basic_manager_->GetServableHandle( ServableRequest::Latest(kServableName3), &handle); TF_ASSERT_OK(status); @@ -256,7 +256,7 @@ TEST_P(BasicManagerTest, DontStopManagingOnError) { } TEST_P(BasicManagerTest, ServableHandleSpecificVersion) { - ServableHandle handle; + ServableHandle handle; const ServableId id = {kServableName2, 1}; const Status status = basic_manager_->GetServableHandle(ServableRequest::FromId(id), &handle); @@ -271,7 +271,7 @@ TEST_P(BasicManagerTest, UpdateServingMapServableHandleLatest) { // Using kServableName3 which doesn't have any servables loaded in the // manager, as opposed to kServableName which already has 2 loaded. const ServableId id0 = {kServableName3, 0}; - // Servable is int64 with value 0. + // Servable is int64_t with value 0. TF_ASSERT_OK(basic_manager_->ManageServable(CreateServable(id0))); basic_manager_->LoadServable( id0, [](const Status& status) { TF_ASSERT_OK(status); }); @@ -279,9 +279,9 @@ TEST_P(BasicManagerTest, UpdateServingMapServableHandleLatest) { servable_state_monitor_, id0, {ServableState::ManagerState::kAvailable}); test_util::MockLoader* notify_to_unload = new NiceMock; - // Don't make it const otherwise servable types will mismatch: const int64 vs - // int64. - int64 servable = 1; + // Don't make it const otherwise servable types will mismatch: const int64_t + // vs int64. + int64_t servable = 1; ON_CALL(*notify_to_unload, servable()) .WillByDefault(Return(AnyPtr(&servable))); ON_CALL(*notify_to_unload, EstimateResources(_)) @@ -299,7 +299,7 @@ TEST_P(BasicManagerTest, UpdateServingMapServableHandleLatest) { // We have loaded both versions 0 and 1 of kServableName3, so the latest // handle should be that of v1. { - ServableHandle handle; + ServableHandle handle; const Status status = basic_manager_->GetServableHandle( ServableRequest::Latest(kServableName3), &handle); TF_ASSERT_OK(status); @@ -327,7 +327,7 @@ TEST_P(BasicManagerTest, UpdateServingMapServableHandleLatest) { // Servable map should just have {kServableName3, 0} at this point. { - ServableHandle handle; + ServableHandle handle; const Status status = basic_manager_->GetServableHandle( ServableRequest::Latest(kServableName3), &handle); TF_EXPECT_OK(status); @@ -380,8 +380,8 @@ TEST_P(BasicManagerTest, ListAvailableServableIds) { TEST_P(BasicManagerTest, GetAvailableServableHandles) { // Scoped to destruct handles at the end of it. { - const std::map> handles_before = - basic_manager_->GetAvailableServableHandles(); + const std::map> handles_before = + basic_manager_->GetAvailableServableHandles(); ASSERT_EQ(kNumVersionsPerServable * 2, handles_before.size()); const std::vector expected_ids_before = {{kServableName, 1}, @@ -419,8 +419,8 @@ TEST_P(BasicManagerTest, GetAvailableServableHandles) { {ServableState::ManagerState::kEnd}); { - const std::map> handles_after = - basic_manager_->GetAvailableServableHandles(); + const std::map> handles_after = + basic_manager_->GetAvailableServableHandles(); ASSERT_EQ(kNumVersionsPerServable, handles_after.size()); const std::vector expected_ids_after = {{kServableName2, 1}, @@ -503,7 +503,7 @@ TEST_P(BasicManagerTest, MultipleManageCallsUsesFirstServable) { CreateServableData(id, std::move(second_ignored_loader))) .ok()); - ServableHandle handle; + ServableHandle handle; TF_ASSERT_OK(basic_manager_->GetServableHandle( ServableRequest::Specific(kServableName, 1), &handle)); EXPECT_EQ(1, *handle); @@ -516,7 +516,7 @@ TEST_P(BasicManagerTest, ErroneousServable) { TF_ASSERT_OK(basic_manager_->ManageServable( ServableData>(id, errors::Unknown("error")))); - ServableHandle handle; + ServableHandle handle; Status status = basic_manager_->GetServableHandle( ServableRequest::Specific(kServableName, 3), &handle); EXPECT_FALSE(status.ok()) << status; @@ -539,8 +539,8 @@ TEST_P(BasicManagerTest, DestructOnNonServingThread) { WaitUntilServableManagerStateIsOneOf( servable_state_monitor_, id, {ServableState::ManagerState::kAvailable}); - std::unique_ptr> latest_handle( - new ServableHandle()); + std::unique_ptr> latest_handle( + new ServableHandle()); const Status status = basic_manager_->GetServableHandle( ServableRequest::Latest(kServableName), latest_handle.get()); TF_ASSERT_OK(status); diff --git a/tensorflow_serving/core/caching_manager.cc b/tensorflow_serving/core/caching_manager.cc index 89829e644aa..4cc0fca0d77 100644 --- a/tensorflow_serving/core/caching_manager.cc +++ b/tensorflow_serving/core/caching_manager.cc @@ -69,7 +69,7 @@ Status CachingManager::GetUntypedServableHandle( } // Since there is no explicit version in the request, get the latest from the // loader-factory. - const int64 policy_dictated_version = loader_factory_->GetServableVersion( + const int64_t policy_dictated_version = loader_factory_->GetServableVersion( request.name, request.auto_version_policy); return GetUntypedServableHandleForId({request.name, policy_dictated_version}, handle); @@ -183,7 +183,7 @@ void CachingManager::MaybeEraseLoadMutexMapEntry( } } -int64 CachingManager::GetLoadMutexMapSize() const { +int64_t CachingManager::GetLoadMutexMapSize() const { mutex_lock l(load_mutex_map_mu_); return load_mutex_map_.size(); } @@ -214,7 +214,7 @@ ServableData> PathPrefixLoaderFactory::CreateLoader( return adapter_->AdaptOneVersion({id, servable_path}); } -int64 PathPrefixLoaderFactory::GetServableVersion( +int64_t PathPrefixLoaderFactory::GetServableVersion( const string& servable_name, ServableRequest::AutoVersionPolicy policy) const { return 0; diff --git a/tensorflow_serving/core/caching_manager.h b/tensorflow_serving/core/caching_manager.h index 60d8f82f86d..4a8e79980ee 100644 --- a/tensorflow_serving/core/caching_manager.h +++ b/tensorflow_serving/core/caching_manager.h @@ -72,7 +72,7 @@ class CachingManager : public Manager { // The interval, in microseconds, between each servable load retry. If set // negative, we don't wait. // Default: 1 minute. - int64 load_retry_interval_micros = 1LL * 60 * 1000 * 1000; + int64_t load_retry_interval_micros = 1LL * 60 * 1000 * 1000; // The environment to use for starting threads in the thread-pool. Env* env = Env::Default(); @@ -92,7 +92,7 @@ class CachingManager : public Manager { /// Returns a version corresponding to the servable name, for the given /// policy. - virtual int64 GetServableVersion( + virtual int64_t GetServableVersion( const string& servable_name, ServableRequest::AutoVersionPolicy policy) const = 0; }; @@ -138,7 +138,7 @@ class CachingManager : public Manager { TF_LOCKS_EXCLUDED(load_mutex_map_mu_); // Returns the size of the load_mutex_map_. - int64 GetLoadMutexMapSize() const TF_LOCKS_EXCLUDED(load_mutex_map_mu_); + int64_t GetLoadMutexMapSize() const TF_LOCKS_EXCLUDED(load_mutex_map_mu_); // Erases the entry from the map corresponding to the servable-id if there is // only one remaining reference to the mutex. @@ -173,7 +173,7 @@ class PathPrefixLoaderFactory : public CachingManager::LoaderFactory { ServableData> CreateLoader( const ServableId& id) override; - int64 GetServableVersion( + int64_t GetServableVersion( const string& servable_name, ServableRequest::AutoVersionPolicy policy) const override; diff --git a/tensorflow_serving/core/caching_manager_test.cc b/tensorflow_serving/core/caching_manager_test.cc index 3dcfa303656..dace66116fb 100644 --- a/tensorflow_serving/core/caching_manager_test.cc +++ b/tensorflow_serving/core/caching_manager_test.cc @@ -46,7 +46,7 @@ using ::testing::UnorderedElementsAreArray; // version. class StringLoaderFactory : public CachingManager::LoaderFactory { public: - explicit StringLoaderFactory(const int64 starting_version) + explicit StringLoaderFactory(const int64_t starting_version) : latest_version_(starting_version) {} ~StringLoaderFactory() override = default; @@ -71,7 +71,7 @@ class StringLoaderFactory : public CachingManager::LoaderFactory { } // Returns the earliest/latest version corresponding to the servable name. - int64 GetServableVersion( + int64_t GetServableVersion( const string& request_name, ServableRequest::AutoVersionPolicy policy) const override { mutex_lock l(mu_); @@ -84,19 +84,19 @@ class StringLoaderFactory : public CachingManager::LoaderFactory { } // Update the earliest available version. - void set_earliest_version(int64 version) { + void set_earliest_version(int64_t version) { mutex_lock l(mu_); earliest_version_ = version; } // Update the latest available version. - void set_latest_version(int64 version) { + void set_latest_version(int64_t version) { mutex_lock l(mu_); latest_version_ = version; } // Returns the number of loaders created by the loader-factory. - int64 num_loaders_dispensed() const { + int64_t num_loaders_dispensed() const { mutex_lock l(mu_); return num_loaders_dispensed_; } @@ -106,13 +106,13 @@ class StringLoaderFactory : public CachingManager::LoaderFactory { mutable mutex mu_; // The current earliest version. - int64 earliest_version_ TF_GUARDED_BY(mu_) = 0; + int64_t earliest_version_ TF_GUARDED_BY(mu_) = 0; // The current latest version. - int64 latest_version_ TF_GUARDED_BY(mu_) = 0; + int64_t latest_version_ TF_GUARDED_BY(mu_) = 0; // Tracks the number of loaders dispensed by the loader-factory. - int64 num_loaders_dispensed_ TF_GUARDED_BY(mu_) = 0; + int64_t num_loaders_dispensed_ TF_GUARDED_BY(mu_) = 0; TF_DISALLOW_COPY_AND_ASSIGN(StringLoaderFactory); }; @@ -135,7 +135,7 @@ class ErrorLoaderFactory : public CachingManager::LoaderFactory { return ServableData>(id, std::move(loader)); } - int64 GetServableVersion( + int64_t GetServableVersion( const string& request_name, ServableRequest::AutoVersionPolicy policy) const override { // A simple policy interpretation that always returns version 42. @@ -155,8 +155,8 @@ constexpr int kNumThreads = 10; // We parameterize this test with the number of load & unload threads. (Zero // means use an in-line executor instead of a thread pool.) struct ThreadPoolSizes { - uint64 num_load_threads; - uint64 num_unload_threads; + uint64_t num_load_threads; + uint64_t num_unload_threads; }; class CachingManagerTest : public ::testing::TestWithParam { protected: @@ -202,7 +202,7 @@ class CachingManagerTest : public ::testing::TestWithParam { // Helper function to return the size of the load-mutex map from the // caching-manager. - int64 GetLoadMutexMapSize() { + int64_t GetLoadMutexMapSize() { return test_util::CachingManagerTestAccess(manager_.get()) .GetLoadMutexMapSize(); } diff --git a/tensorflow_serving/core/loader_harness.h b/tensorflow_serving/core/loader_harness.h index c3d0c7aaade..eb5f8ab79b8 100644 --- a/tensorflow_serving/core/loader_harness.h +++ b/tensorflow_serving/core/loader_harness.h @@ -101,7 +101,7 @@ class LoaderHarness final { uint32 max_num_load_retries = 0; /// The interval, in microseconds, between each servable load retry. - uint64 load_retry_interval_micros = 0; + uint64_t load_retry_interval_micros = 0; /// An (optional) function to call upon transitioning to state kError. std::function diff --git a/tensorflow_serving/core/manager.h b/tensorflow_serving/core/manager.h index 9fefca206ab..773b0629285 100644 --- a/tensorflow_serving/core/manager.h +++ b/tensorflow_serving/core/manager.h @@ -38,7 +38,7 @@ namespace serving { /// latest loaded version. struct ServableRequest { // Initialization factories, for convenience and readability. - static ServableRequest Specific(const string& name, const int64 version); + static ServableRequest Specific(const string& name, const int64_t version); static ServableRequest Earliest(const string& name); static ServableRequest Latest(const string& name); static ServableRequest FromId(const ServableId& id); @@ -47,7 +47,7 @@ struct ServableRequest { string name; // An optional specific version number to use. - absl::optional version; + absl::optional version; // How to choose a version number automatically, if 'version' is left unset. enum class AutoVersionPolicy { @@ -66,7 +66,7 @@ struct ServableRequest { // Legacy constructors. Do not use in new code. ServableRequest() = default; ServableRequest(const string& name_in, - const absl::optional& version_in) + const absl::optional& version_in) : name(name_in), version(version_in), auto_version_policy(AutoVersionPolicy::kLatest) {} @@ -121,7 +121,7 @@ class Manager { // inline ServableRequest ServableRequest::Specific(const string& name, - const int64 version) { + const int64_t version) { ServableRequest request; request.name = name; request.version = version; diff --git a/tensorflow_serving/core/servable_id.h b/tensorflow_serving/core/servable_id.h index 1395bac6eb3..cffa2993eb1 100644 --- a/tensorflow_serving/core/servable_id.h +++ b/tensorflow_serving/core/servable_id.h @@ -41,7 +41,7 @@ struct ServableId { // active servable with the largest version number. // // Must be non-negative. - int64 version; + int64_t version; // Returns a string representation of this object. Useful in logging. string DebugString() const { @@ -50,7 +50,7 @@ struct ServableId { }; struct HashServableId { - uint64 operator()(const ServableId& id) const { + uint64_t operator()(const ServableId& id) const { // Hash codes for many common types are remarkably bad, often clustering // around the same values of the low and/or high bits for linear // sequences of inputs such as 1, 2, 3; or addresses of consecutively @@ -61,9 +61,9 @@ struct HashServableId { // make the high bits contain more entropy from the entire hash code. // It's based on Fibonacci hashing from Knuth's Art of Computer // Programming volume 3, section 6.4. - const uint64 version_hash = [&]() -> uint64 { + const uint64_t version_hash = [&]() -> uint64_t { if (id.version >= 0) { - return std::hash()(id.version) * + return std::hash()(id.version) * 0x9E3779B97F4A7C13; // (sqrt(5) - 1)/2 as a binary fraction. } else { return 0xDECAFCAFFE; diff --git a/tensorflow_serving/core/servable_state_monitor.cc b/tensorflow_serving/core/servable_state_monitor.cc index 135f6a5a521..0bffec6c30f 100644 --- a/tensorflow_serving/core/servable_state_monitor.cc +++ b/tensorflow_serving/core/servable_state_monitor.cc @@ -27,7 +27,7 @@ void EraseLiveStatesEntry( const ServableStateMonitor::ServableStateAndTime& state_and_time, ServableStateMonitor::ServableMap* const live_states) { const string& servable_name = state_and_time.state.id.name; - const int64 version = state_and_time.state.id.version; + const int64_t version = state_and_time.state.id.version; auto servable_map_it = live_states->find(servable_name); if (servable_map_it == live_states->end()) { return; @@ -48,7 +48,7 @@ void UpdateLiveStates( const ServableStateMonitor::ServableStateAndTime& state_and_time, ServableStateMonitor::ServableMap* const live_states) { const string& servable_name = state_and_time.state.id.name; - const int64 version = state_and_time.state.id.version; + const int64_t version = state_and_time.state.id.version; if (state_and_time.state.manager_state != ServableState::ManagerState::kEnd) { (*live_states)[servable_name][version] = state_and_time; } else { diff --git a/tensorflow_serving/core/servable_state_monitor.h b/tensorflow_serving/core/servable_state_monitor.h index 7de9b9ef596..a943ff8ef12 100644 --- a/tensorflow_serving/core/servable_state_monitor.h +++ b/tensorflow_serving/core/servable_state_monitor.h @@ -47,14 +47,15 @@ class ServableStateMonitor { // START_SKIP_DOXYGEN struct ServableStateAndTime { ServableStateAndTime() = default; - ServableStateAndTime(ServableState servable_state, const uint64 event_time) + ServableStateAndTime(ServableState servable_state, + const uint64_t event_time) : state(std::move(servable_state)), event_time_micros(event_time) {} /// State of the servable. ServableState state; /// Time at which servable state event was published. - uint64 event_time_micros; + uint64_t event_time_micros; /// Returns a string representation of this struct useful for debugging or /// logging. @@ -73,7 +74,7 @@ class ServableStateMonitor { /// Upper bound for the number of events captured in the bounded log. If set /// to 0, logging is disabled. - uint64 max_count_log_events = 0; + uint64_t max_count_log_events = 0; }; // END_SKIP_DOXYGEN diff --git a/tensorflow_serving/core/simple_loader.h b/tensorflow_serving/core/simple_loader.h index 12cfec35b8f..69a0ffcd5f5 100644 --- a/tensorflow_serving/core/simple_loader.h +++ b/tensorflow_serving/core/simple_loader.h @@ -323,12 +323,12 @@ Status SimpleLoader::EstimateResourcesPostLoad() { memoized_resource_estimate_ = post_load_resource_estimate; // Release any transient memory used only during load to the OS. - const uint64 during_load_ram_estimate = resource_util_->GetQuantity( + const uint64_t during_load_ram_estimate = resource_util_->GetQuantity( ram_resource_, during_load_resource_estimate); - const uint64 post_load_ram_estimate = + const uint64_t post_load_ram_estimate = resource_util_->GetQuantity(ram_resource_, post_load_resource_estimate); if (post_load_ram_estimate < during_load_ram_estimate) { - const uint64 transient_ram_estimate = + const uint64_t transient_ram_estimate = during_load_ram_estimate - post_load_ram_estimate; LOG(INFO) << "Calling MallocExtension_ReleaseToSystem() after servable " "load with " @@ -358,7 +358,7 @@ void SimpleLoader::Unload() { // If we have a main-memory footprint estimate, release that amount of memory // to the OS. - const uint64 memory_estimate = + const uint64_t memory_estimate = resource_util_->GetQuantity(ram_resource_, resource_estimate); if (memory_estimate > 0) { LOG(INFO) << "Calling MallocExtension_ReleaseToSystem() after servable " diff --git a/tensorflow_serving/core/test_util/fake_loader.cc b/tensorflow_serving/core/test_util/fake_loader.cc index 03b0c93c31e..e6dde38de9b 100644 --- a/tensorflow_serving/core/test_util/fake_loader.cc +++ b/tensorflow_serving/core/test_util/fake_loader.cc @@ -25,7 +25,7 @@ thread_local bool FakeLoader::was_deleted_in_this_thread_; int FakeLoader::num_fake_loaders_ = 0; mutex FakeLoader::num_fake_loaders_mu_(LINKER_INITIALIZED); -FakeLoader::FakeLoader(int64 servable, const Status load_status) +FakeLoader::FakeLoader(int64_t servable, const Status load_status) : servable_(servable), load_status_(load_status) { was_deleted_in_this_thread_ = false; { diff --git a/tensorflow_serving/core/test_util/fake_loader.h b/tensorflow_serving/core/test_util/fake_loader.h index c09c13c3ea4..8bebcbf99ab 100644 --- a/tensorflow_serving/core/test_util/fake_loader.h +++ b/tensorflow_serving/core/test_util/fake_loader.h @@ -36,7 +36,8 @@ namespace test_util { // This class is thread-safe. class FakeLoader : public ResourceUnsafeLoader { public: - explicit FakeLoader(int64 servable, const Status load_status = Status::OK()); + explicit FakeLoader(int64_t servable, + const Status load_status = Status::OK()); ~FakeLoader() override; @@ -65,7 +66,7 @@ class FakeLoader : public ResourceUnsafeLoader { // The servable returned from this loader. // // Don't make const or you'll have to change the handle type to 'const int64'. - int64 servable_; + int64_t servable_; // The status returned during load. const Status load_status_; }; diff --git a/tensorflow_serving/core/test_util/manager_test_util.cc b/tensorflow_serving/core/test_util/manager_test_util.cc index db102796192..a2d3da847bf 100644 --- a/tensorflow_serving/core/test_util/manager_test_util.cc +++ b/tensorflow_serving/core/test_util/manager_test_util.cc @@ -58,7 +58,7 @@ uint32 BasicManagerTestAccess::num_load_threads() const { CachingManagerTestAccess::CachingManagerTestAccess(CachingManager* manager) : manager_(manager) {} -int64 CachingManagerTestAccess::GetLoadMutexMapSize() const { +int64_t CachingManagerTestAccess::GetLoadMutexMapSize() const { return manager_->GetLoadMutexMapSize(); } diff --git a/tensorflow_serving/core/test_util/manager_test_util.h b/tensorflow_serving/core/test_util/manager_test_util.h index 3ceef79b6a9..907886faf03 100644 --- a/tensorflow_serving/core/test_util/manager_test_util.h +++ b/tensorflow_serving/core/test_util/manager_test_util.h @@ -70,7 +70,7 @@ class CachingManagerTestAccess { // Returns the size of the load-mutex map that stores the mutex reference per // servable-id requested for load. - int64 GetLoadMutexMapSize() const; + int64_t GetLoadMutexMapSize() const; private: CachingManager* const manager_; diff --git a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/remote_predict_op_kernel.h b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/remote_predict_op_kernel.h index fb5c31ae3ee..682e68d7272 100644 --- a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/remote_predict_op_kernel.h +++ b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/remote_predict_op_kernel.h @@ -184,9 +184,9 @@ class RemotePredictOp : public AsyncOpKernel { private: string model_name_; - int64 model_version_; + int64_t model_version_; bool fail_op_on_rpc_error_; - int64 max_rpc_deadline_millis_; + int64_t max_rpc_deadline_millis_; string signature_name_; std::unique_ptr prediction_service_; }; diff --git a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/remote_predict_op_kernel_test.cc b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/remote_predict_op_kernel_test.cc index 9698a22c333..8be766f5075 100644 --- a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/remote_predict_op_kernel_test.cc +++ b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/remote_predict_op_kernel_test.cc @@ -90,7 +90,7 @@ ::tensorflow::Status RunRemotePredict( const absl::optional<::absl::Duration> deadline = absl::nullopt, bool fail_on_rpc_error = true, const string& target_address = "target_address", - int64 target_model_version = -1, const string& signature_name = "") { + int64_t target_model_version = -1, const string& signature_name = "") { const Scope scope = Scope::DisabledShapeInferenceScope(); // Model_name will decide the result of the RPC. auto input_tensor_aliases = ops::Const( diff --git a/tensorflow_serving/model_servers/get_model_status_impl.cc b/tensorflow_serving/model_servers/get_model_status_impl.cc index fb98b6fa7eb..fc2ec44c530 100644 --- a/tensorflow_serving/model_servers/get_model_status_impl.cc +++ b/tensorflow_serving/model_servers/get_model_status_impl.cc @@ -81,7 +81,7 @@ Status GetModelStatusImpl::GetModelStatusWithModelSpec( if (model_spec.has_version()) { // Only gets status for specified version of specified model. - const int64 version = model_spec.version().value(); + const int64_t version = model_spec.version().value(); const ServableId id = {model_name, version}; const absl::optional opt_servable_state = monitor.GetState(id); @@ -100,7 +100,7 @@ Status GetModelStatusImpl::GetModelStatusWithModelSpec( "Could not find any versions of model ", model_name); } for (const auto& version_and_state : versions_and_states) { - const int64 version = version_and_state.first; + const int64_t version = version_and_state.first; const ServableState& servable_state = version_and_state.second.state; AddModelVersionStatusToResponse(response, version, servable_state); } diff --git a/tensorflow_serving/model_servers/get_model_status_impl_test.cc b/tensorflow_serving/model_servers/get_model_status_impl_test.cc index 05c51ee8d67..e8ab424fbc3 100644 --- a/tensorflow_serving/model_servers/get_model_status_impl_test.cc +++ b/tensorflow_serving/model_servers/get_model_status_impl_test.cc @@ -141,8 +141,9 @@ TEST_F(GetModelStatusImplTest, AllVersionsSuccess) { TF_EXPECT_OK( GetModelStatusImpl::GetModelStatus(GetServerCore(), request, &response)); EXPECT_EQ(2, response.model_version_status_size()); - std::set expected_versions = {kTestModelVersion1, kTestModelVersion2}; - std::set actual_versions = { + std::set expected_versions = {kTestModelVersion1, + kTestModelVersion2}; + std::set actual_versions = { response.model_version_status(0).version(), response.model_version_status(1).version()}; EXPECT_EQ(expected_versions, actual_versions); diff --git a/tensorflow_serving/model_servers/http_rest_api_handler.cc b/tensorflow_serving/model_servers/http_rest_api_handler.cc index c8619976551..277ff10e574 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler.cc +++ b/tensorflow_serving/model_servers/http_rest_api_handler.cc @@ -72,7 +72,7 @@ Status HttpRestApiHandler::ProcessRequest( string model_subresource; Status status = errors::InvalidArgument("Malformed request: ", http_method, " ", request_path); - absl::optional model_version; + absl::optional model_version; absl::optional model_version_label; bool parse_successful; @@ -109,7 +109,7 @@ Status HttpRestApiHandler::ProcessRequest( Status HttpRestApiHandler::ProcessClassifyRequest( const absl::string_view model_name, - const absl::optional& model_version, + const absl::optional& model_version, const absl::optional& model_version_label, const absl::string_view request_body, string* output) { ::google::protobuf::Arena arena; @@ -131,7 +131,7 @@ Status HttpRestApiHandler::ProcessClassifyRequest( Status HttpRestApiHandler::ProcessRegressRequest( const absl::string_view model_name, - const absl::optional& model_version, + const absl::optional& model_version, const absl::optional& model_version_label, const absl::string_view request_body, string* output) { ::google::protobuf::Arena arena; @@ -151,7 +151,7 @@ Status HttpRestApiHandler::ProcessRegressRequest( Status HttpRestApiHandler::ProcessPredictRequest( const absl::string_view model_name, - const absl::optional& model_version, + const absl::optional& model_version, const absl::optional& model_version_label, const absl::string_view request_body, string* output) { ::google::protobuf::Arena arena; @@ -179,7 +179,7 @@ Status HttpRestApiHandler::ProcessPredictRequest( Status HttpRestApiHandler::ProcessModelStatusRequest( const absl::string_view model_name, - const absl::optional& model_version, + const absl::optional& model_version, const absl::optional& model_version_label, string* output) { // We do not yet support returning status of all models @@ -204,7 +204,7 @@ Status HttpRestApiHandler::ProcessModelStatusRequest( Status HttpRestApiHandler::ProcessModelMetadataRequest( const absl::string_view model_name, - const absl::optional& model_version, + const absl::optional& model_version, const absl::optional& model_version_label, string* output) { if (model_name.empty()) { diff --git a/tensorflow_serving/model_servers/http_rest_api_handler.h b/tensorflow_serving/model_servers/http_rest_api_handler.h index 6985304d4ee..edd991d60d5 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler.h +++ b/tensorflow_serving/model_servers/http_rest_api_handler.h @@ -87,27 +87,27 @@ class HttpRestApiHandler { private: Status ProcessClassifyRequest( const absl::string_view model_name, - const absl::optional& model_version, + const absl::optional& model_version, const absl::optional& model_version_label, const absl::string_view request_body, string* output); Status ProcessRegressRequest( const absl::string_view model_name, - const absl::optional& model_version, + const absl::optional& model_version, const absl::optional& model_version_label, const absl::string_view request_body, string* output); Status ProcessPredictRequest( const absl::string_view model_name, - const absl::optional& model_version, + const absl::optional& model_version, const absl::optional& model_version_label, const absl::string_view request_body, string* output); Status ProcessModelStatusRequest( const absl::string_view model_name, - const absl::optional& model_version, + const absl::optional& model_version, const absl::optional& model_version_label, string* output); Status ProcessModelMetadataRequest( const absl::string_view model_name, - const absl::optional& model_version, + const absl::optional& model_version, const absl::optional& model_version_label, string* output); Status GetInfoMap(const ModelSpec& model_spec, const string& signature_name, diff --git a/tensorflow_serving/model_servers/http_rest_api_handler_test.cc b/tensorflow_serving/model_servers/http_rest_api_handler_test.cc index c7f1f707c2b..fe14cd77479 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler_test.cc +++ b/tensorflow_serving/model_servers/http_rest_api_handler_test.cc @@ -222,7 +222,7 @@ TEST_F(HttpRestApiHandlerTest, UnsupportedApiCalls) { status = handler_.ProcessRequest( "POST", absl::StrCat("/v1/models/foo/versions/", - std::numeric_limits::max(), ":regress"), + std::numeric_limits::max(), ":regress"), "", &headers, &model_name, &method, &output); EXPECT_TRUE(errors::IsInvalidArgument(status)); EXPECT_THAT(status.error_message(), HasSubstr("Failed to convert version")); diff --git a/tensorflow_serving/model_servers/http_rest_api_util.cc b/tensorflow_serving/model_servers/http_rest_api_util.cc index ff22615e7a6..354f67a2b26 100644 --- a/tensorflow_serving/model_servers/http_rest_api_util.cc +++ b/tensorflow_serving/model_servers/http_rest_api_util.cc @@ -42,7 +42,7 @@ void AddCORSHeaders(std::vector>* headers) { Status FillModelSpecWithNameVersionAndLabel( const absl::string_view model_name, - const absl::optional& model_version, + const absl::optional& model_version, const absl::optional model_version_label, ::tensorflow::serving::ModelSpec* model_spec) { model_spec->set_name(string(model_name)); @@ -86,7 +86,7 @@ bool DecodeArg(string* arg) { Status ParseModelInfo(const absl::string_view http_method, const absl::string_view request_path, string* model_name, - absl::optional* model_version, + absl::optional* model_version, absl::optional* model_version_label, string* method, string* model_subresource, bool* parse_successful) { @@ -109,7 +109,7 @@ Status ParseModelInfo(const absl::string_view http_method, } } if (!model_version_str.empty()) { - int64 version; + int64_t version; if (!absl::SimpleAtoi(model_version_str, &version)) { return errors::InvalidArgument( "Failed to convert version: ", model_version_str, " to numeric."); diff --git a/tensorflow_serving/model_servers/http_rest_api_util.h b/tensorflow_serving/model_servers/http_rest_api_util.h index 53ff3017a5e..937dd68bb20 100644 --- a/tensorflow_serving/model_servers/http_rest_api_util.h +++ b/tensorflow_serving/model_servers/http_rest_api_util.h @@ -38,14 +38,14 @@ void AddCORSHeaders(std::vector>* headers); Status FillModelSpecWithNameVersionAndLabel( const absl::string_view model_name, - const absl::optional& model_version, + const absl::optional& model_version, const absl::optional model_version_label, ::tensorflow::serving::ModelSpec* model_spec); // Parse model information from the request. Status ParseModelInfo(const absl::string_view http_method, const absl::string_view request_path, string* model_name, - absl::optional* model_version, + absl::optional* model_version, absl::optional* model_version_label, string* method, string* model_subresource, bool* parse_successful); diff --git a/tensorflow_serving/model_servers/http_rest_api_util_test.cc b/tensorflow_serving/model_servers/http_rest_api_util_test.cc index bd318d2f768..362b9029cd1 100644 --- a/tensorflow_serving/model_servers/http_rest_api_util_test.cc +++ b/tensorflow_serving/model_servers/http_rest_api_util_test.cc @@ -30,7 +30,7 @@ class HttpRestApiUtilTest : public ::testing::Test {}; TEST_F(HttpRestApiUtilTest, TestParseModelInfoForGet) { string model_name; - absl::optional model_version; + absl::optional model_version; absl::optional model_version_label; string method; string model_subresource; @@ -117,7 +117,7 @@ TEST_F(HttpRestApiUtilTest, TestParseModelInfoForGet) { TEST_F(HttpRestApiUtilTest, TestParseModelInfoForPost) { string model_name; - absl::optional model_version; + absl::optional model_version; absl::optional model_version_label; string method; string model_subresource; @@ -203,7 +203,7 @@ TEST_F(HttpRestApiUtilTest, TestParseModelInfoForPost) { auto status = ParseModelInfo( "POST", absl::StrCat("/v1/models/foo/versions/", - std::numeric_limits::max(), ":predict"), + std::numeric_limits::max(), ":predict"), &model_name, &model_version, &model_version_label, &method, &model_subresource, &parse_successful); EXPECT_TRUE(parse_successful); diff --git a/tensorflow_serving/model_servers/http_server.cc b/tensorflow_serving/model_servers/http_server.cc index bddea02bbc4..48e9abb8119 100644 --- a/tensorflow_serving/model_servers/http_server.cc +++ b/tensorflow_serving/model_servers/http_server.cc @@ -146,7 +146,7 @@ class RestApiRequestDispatcher { private: void ProcessRequest(net_http::ServerRequestInterface* req) { - const uint64 start = Env::Default()->NowMicros(); + const uint64_t start = Env::Default()->NowMicros(); string body; int64_t num_bytes = 0; auto request_chunk = req->ReadRequestBytes(&num_bytes); diff --git a/tensorflow_serving/model_servers/prediction_service_impl.cc b/tensorflow_serving/model_servers/prediction_service_impl.cc index eeb71e634b0..2ecb3aa66b8 100644 --- a/tensorflow_serving/model_servers/prediction_service_impl.cc +++ b/tensorflow_serving/model_servers/prediction_service_impl.cc @@ -46,7 +46,7 @@ ScopedThreadPools GetThreadPools(ThreadPoolFactory *thread_pool_factory) { ::grpc::Status PredictionServiceImpl::Predict(::grpc::ServerContext *context, const PredictRequest *request, PredictResponse *response) { - const uint64 start = Env::Default()->NowMicros(); + const uint64_t start = Env::Default()->NowMicros(); tensorflow::RunOptions run_options = tensorflow::RunOptions(); if (enforce_session_run_timeout_) { run_options.set_timeout_in_ms( @@ -83,7 +83,7 @@ ::grpc::Status PredictionServiceImpl::GetModelMetadata( ::grpc::Status PredictionServiceImpl::Classify( ::grpc::ServerContext *context, const ClassificationRequest *request, ClassificationResponse *response) { - const uint64 start = Env::Default()->NowMicros(); + const uint64_t start = Env::Default()->NowMicros(); tensorflow::RunOptions run_options = tensorflow::RunOptions(); // By default, this is infinite which is the same default as RunOptions. if (enforce_session_run_timeout_) { @@ -112,7 +112,7 @@ ::grpc::Status PredictionServiceImpl::Classify( ::grpc::Status PredictionServiceImpl::Regress(::grpc::ServerContext *context, const RegressionRequest *request, RegressionResponse *response) { - const uint64 start = Env::Default()->NowMicros(); + const uint64_t start = Env::Default()->NowMicros(); tensorflow::RunOptions run_options = tensorflow::RunOptions(); // By default, this is infinite which is the same default as RunOptions. if (enforce_session_run_timeout_) { diff --git a/tensorflow_serving/model_servers/server.h b/tensorflow_serving/model_servers/server.h index 36625c2c568..b32d720644f 100644 --- a/tensorflow_serving/model_servers/server.h +++ b/tensorflow_serving/model_servers/server.h @@ -64,18 +64,18 @@ class Server { tensorflow::int32 num_load_threads = 0; tensorflow::int32 num_unload_threads = 0; tensorflow::int32 max_num_load_retries = 5; - tensorflow::int64 load_retry_interval_micros = 1LL * 60 * 1000 * 1000; + int64_t load_retry_interval_micros = 1LL * 60 * 1000 * 1000; tensorflow::int32 file_system_poll_wait_seconds = 1; bool flush_filesystem_caches = true; tensorflow::string model_base_path; tensorflow::string saved_model_tags; // Tensorflow session parallelism of zero means that both inter and intra op // thread pools will be auto configured. - tensorflow::int64 tensorflow_session_parallelism = 0; + int64_t tensorflow_session_parallelism = 0; // Zero means that the thread pools will be auto configured. - tensorflow::int64 tensorflow_intra_op_parallelism = 0; - tensorflow::int64 tensorflow_inter_op_parallelism = 0; + int64_t tensorflow_intra_op_parallelism = 0; + int64_t tensorflow_inter_op_parallelism = 0; tensorflow::string platform_config_file; // Only one of ALTS or SSl can be specified. I.e. either // use_alts_credentials must be false or ssl_config_file must be empty. diff --git a/tensorflow_serving/model_servers/server_core.cc b/tensorflow_serving/model_servers/server_core.cc index 6991e09efa1..0d4fe6b2ca8 100644 --- a/tensorflow_serving/model_servers/server_core.cc +++ b/tensorflow_serving/model_servers/server_core.cc @@ -496,18 +496,18 @@ Status ServerCore::ReloadConfig(const ModelServerConfig& new_config) { } Status ServerCore::UpdateModelVersionLabelMap() { - std::unique_ptr>> new_label_map( - new std::map>); + std::unique_ptr>> new_label_map( + new std::map>); for (const ModelConfig& model_config : config_.model_config_list().config()) { ServableStateMonitor::VersionMap serving_states = servable_state_monitor_->GetVersionStates(model_config.name()); for (const auto& entry : model_config.version_labels()) { const string& label = entry.first; - const int64 version = entry.second; + const int64_t version = entry.second; bool contains_existing_label_with_different_version = false; - int64 existing_version; + int64_t existing_version; if (GetModelVersionForLabel(model_config.name(), label, &existing_version) .ok() && existing_version != version) { @@ -795,7 +795,7 @@ Status ServerCore::ServableRequestFromModelSpec( "ModelSpec has 'version_label' set, but it is not currently " "allowed by the server."); } - int64 version; + int64_t version; TF_RETURN_IF_ERROR(GetModelVersionForLabel( model_spec.name(), model_spec.version_label(), &version)); *servable_request = ServableRequest::Specific(model_spec.name(), version); @@ -811,7 +811,7 @@ Status ServerCore::ServableRequestFromModelSpec( Status ServerCore::GetModelVersionForLabel(const string& model_name, const string& label, - int64* version) const { + int64_t* version) const { mutex_lock l(model_labels_to_versions_mu_); if (model_labels_to_versions_ == nullptr) { return errors::Unavailable( @@ -819,7 +819,7 @@ Status ServerCore::GetModelVersionForLabel(const string& model_name, } auto version_map_it = model_labels_to_versions_->find(model_name); if (version_map_it != model_labels_to_versions_->end()) { - const std::map& version_map = version_map_it->second; + const std::map& version_map = version_map_it->second; auto version_it = version_map.find(label); if (version_it != version_map.end()) { *version = version_it->second; diff --git a/tensorflow_serving/model_servers/server_core.h b/tensorflow_serving/model_servers/server_core.h index d457c84b7d7..d98591aa6f1 100644 --- a/tensorflow_serving/model_servers/server_core.h +++ b/tensorflow_serving/model_servers/server_core.h @@ -112,7 +112,8 @@ class ServerCore : public Manager { int32 num_unload_threads = 0; // Total model size limit, in terms of main memory, in bytes. - uint64 total_model_memory_limit_bytes = std::numeric_limits::max(); + uint64_t total_model_memory_limit_bytes = + std::numeric_limits::max(); // Maximum number of times we retry loading a model, after the first // failure, before we give up. @@ -123,7 +124,7 @@ class ServerCore : public Manager { // The interval, in microseconds, between each servable load retry. If set // negative, we don't wait. // Default: 1 minute. - int64 load_retry_interval_micros = 1LL * 60 * 1000 * 1000; + int64_t load_retry_interval_micros = 1LL * 60 * 1000 * 1000; // Time interval between file-system polls, in seconds. int32 file_system_poll_wait_seconds = 30; @@ -396,7 +397,7 @@ class ServerCore : public Manager { // Gets the version associated with 'label', for the given model name. Status GetModelVersionForLabel(const string& model_name, const string& label, - int64* version) const + int64_t* version) const TF_LOCKS_EXCLUDED(model_labels_to_versions_mu_); Status GetUntypedServableHandle( @@ -426,7 +427,7 @@ class ServerCore : public Manager { ModelServerConfig config_ TF_GUARDED_BY(config_mu_); // A model_name->label->version# map. - std::unique_ptr>> + std::unique_ptr>> model_labels_to_versions_ TF_GUARDED_BY(model_labels_to_versions_mu_); struct StoragePathSourceAndRouter { diff --git a/tensorflow_serving/model_servers/server_core_test.cc b/tensorflow_serving/model_servers/server_core_test.cc index b3070f35898..6620904858e 100644 --- a/tensorflow_serving/model_servers/server_core_test.cc +++ b/tensorflow_serving/model_servers/server_core_test.cc @@ -651,7 +651,7 @@ TEST_P(ServerCoreTest, ModelSpecMultipleVersionsAvailable) { std::move(server_core_options), &server_core)); // Wait until both versions of the servable have been loaded. - for (const int64 version : + for (const int64_t version : {test_util::kTestModelVersion, test_util::kTestModelLargerVersion}) { const auto servable_id = ServableId{test_util::kTestModelName, version}; test_util::WaitUntilServableManagerStateIsOneOf( @@ -744,15 +744,15 @@ TEST_P(ServerCoreTest, AssignLabelToUnavailableVersion) { TF_ASSERT_OK(CreateServerCore(two_version_config, std::move(server_core_options), &server_core)); - const std::set aspired_versions = {test_util::kTestModelVersion, - test_util::kTestModelLargerVersion}; - const int64 bogus_version = 777; - for (const int64 aspired_version : aspired_versions) { + const std::set aspired_versions = { + test_util::kTestModelVersion, test_util::kTestModelLargerVersion}; + const int64_t bogus_version = 777; + for (const int64_t aspired_version : aspired_versions) { ASSERT_NE(bogus_version, aspired_version); } // Wait until both aspired versions of the servable have been loaded. - for (const int64 aspired_version : aspired_versions) { + for (const int64_t aspired_version : aspired_versions) { const auto servable_id = ServableId{test_util::kTestModelName, aspired_version}; test_util::WaitUntilServableManagerStateIsOneOf( @@ -782,15 +782,15 @@ TEST_P(ServerCoreTest, AssignLabelToUnavailableVersionAllowed) { TF_ASSERT_OK(CreateServerCore(two_version_config, std::move(server_core_options), &server_core)); - const std::set aspired_versions = {test_util::kTestModelVersion, - test_util::kTestModelLargerVersion}; - const int64 bogus_version = 777; - for (const int64 aspired_version : aspired_versions) { + const std::set aspired_versions = { + test_util::kTestModelVersion, test_util::kTestModelLargerVersion}; + const int64_t bogus_version = 777; + for (const int64_t aspired_version : aspired_versions) { ASSERT_NE(bogus_version, aspired_version); } // Wait until both aspired versions of the servable have been loaded. - for (const int64 aspired_version : aspired_versions) { + for (const int64_t aspired_version : aspired_versions) { const auto servable_id = ServableId{test_util::kTestModelName, aspired_version}; test_util::WaitUntilServableManagerStateIsOneOf( @@ -818,15 +818,15 @@ TEST_P(ServerCoreTest, AssignExistingLabelToUnavailableVersion) { TF_ASSERT_OK(CreateServerCore(two_version_config, std::move(server_core_options), &server_core)); - const std::set aspired_versions = {test_util::kTestModelVersion, - test_util::kTestModelLargerVersion}; - const int64 bogus_version = 777; - for (const int64 aspired_version : aspired_versions) { + const std::set aspired_versions = { + test_util::kTestModelVersion, test_util::kTestModelLargerVersion}; + const int64_t bogus_version = 777; + for (const int64_t aspired_version : aspired_versions) { ASSERT_NE(bogus_version, aspired_version); } // Wait until both aspired versions of the servable have been loaded. - for (const int64 aspired_version : aspired_versions) { + for (const int64_t aspired_version : aspired_versions) { const auto servable_id = ServableId{test_util::kTestModelName, aspired_version}; test_util::WaitUntilServableManagerStateIsOneOf( diff --git a/tensorflow_serving/resources/resource_util.cc b/tensorflow_serving/resources/resource_util.cc index 09dddbcc021..8dcf78a1524 100644 --- a/tensorflow_serving/resources/resource_util.cc +++ b/tensorflow_serving/resources/resource_util.cc @@ -198,8 +198,8 @@ Resource ResourceUtil::CreateBoundResource(const string& device, return resource; } -uint64 ResourceUtil::GetQuantity(const Resource& resource, - const ResourceAllocation& allocation) const { +uint64_t ResourceUtil::GetQuantity(const Resource& resource, + const ResourceAllocation& allocation) const { DCHECK(devices_.find(resource.device()) != devices_.end()); for (const ResourceAllocation::Entry& entry : allocation.resource_quantities()) { @@ -210,7 +210,7 @@ uint64 ResourceUtil::GetQuantity(const Resource& resource, return 0; } -void ResourceUtil::SetQuantity(const Resource& resource, uint64 quantity, +void ResourceUtil::SetQuantity(const Resource& resource, uint64_t quantity, ResourceAllocation* allocation) const { DCHECK(devices_.find(resource.device()) != devices_.end()); for (int i = 0; i < allocation->resource_quantities().size(); ++i) { @@ -238,7 +238,8 @@ bool ResourceUtil::Subtract(const ResourceAllocation& to_subtract, return SubtractNormalized(Normalize(to_subtract), base); } -void ResourceUtil::Multiply(uint64 multiplier, ResourceAllocation* base) const { +void ResourceUtil::Multiply(uint64_t multiplier, + ResourceAllocation* base) const { *base = Normalize(*base); return MultiplyNormalized(multiplier, base); } @@ -340,7 +341,7 @@ bool ResourceUtil::SubtractNormalized(const ResourceAllocation& to_subtract, DCHECK(IsNormalized(*base)); // We buffer the mutations to 'base' so that if we bail out due to a negative // quantity we leave it untouched. - std::vector> new_quantities; + std::vector> new_quantities; for (const ResourceAllocation::Entry& to_subtract_entry : to_subtract.resource_quantities()) { ResourceAllocation::Entry* base_entry = @@ -349,20 +350,20 @@ bool ResourceUtil::SubtractNormalized(const ResourceAllocation& to_subtract, base_entry->quantity() < to_subtract_entry.quantity()) { return false; } - const uint64 new_quantity = + const uint64_t new_quantity = base_entry->quantity() - to_subtract_entry.quantity(); new_quantities.push_back({base_entry, new_quantity}); } for (const auto& new_quantity : new_quantities) { ResourceAllocation::Entry* base_entry = new_quantity.first; - const uint64 quantity = new_quantity.second; + const uint64_t quantity = new_quantity.second; base_entry->set_quantity(quantity); } *base = Normalize(*base); return true; } -void ResourceUtil::MultiplyNormalized(uint64 multiplier, +void ResourceUtil::MultiplyNormalized(uint64_t multiplier, ResourceAllocation* base) const { DCHECK(IsNormalized(*base)); for (int i = 0; i < base->resource_quantities().size(); ++i) { diff --git a/tensorflow_serving/resources/resource_util.h b/tensorflow_serving/resources/resource_util.h index 482527dd321..1bb56bbead9 100644 --- a/tensorflow_serving/resources/resource_util.h +++ b/tensorflow_serving/resources/resource_util.h @@ -77,12 +77,12 @@ class ResourceUtil { // Gets the quantity of 'resource' present in 'allocation'. Returns 0 if // 'resource' is not mentioned in 'allocation', since unmentioned resources // are implicitly zero. - uint64 GetQuantity(const Resource& resource, - const ResourceAllocation& allocation) const; + uint64_t GetQuantity(const Resource& resource, + const ResourceAllocation& allocation) const; // Sets the quantity of 'resource' to 'quantity' in 'allocation', overwriting // any existing quantity. - void SetQuantity(const Resource& resource, uint64 quantity, + void SetQuantity(const Resource& resource, uint64_t quantity, ResourceAllocation* allocation) const; // Adds 'to_add' to 'base'. @@ -102,7 +102,7 @@ class ResourceUtil { // Multiplies every resource quantity in 'base' by 'multiplier'. Keeps bound // and unbound entries separate. - void Multiply(uint64 multiplier, ResourceAllocation* base) const; + void Multiply(uint64_t multiplier, ResourceAllocation* base) const; // Determines whether two ResourceAllocation objects are identical (modulo // normalization). @@ -194,7 +194,7 @@ class ResourceUtil { // Like Multiply(), but assumes the input is normalized and produces // normalized output. - void MultiplyNormalized(uint64 multiplier, ResourceAllocation* base) const; + void MultiplyNormalized(uint64_t multiplier, ResourceAllocation* base) const; // Like Equal(), but assumes the input is normalized. bool EqualNormalized(const ResourceAllocation& lhs, diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_test_util.cc b/tensorflow_serving/servables/tensorflow/bundle_factory_test_util.cc index d7c6079be49..3964521a442 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_test_util.cc +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_test_util.cc @@ -73,12 +73,12 @@ std::vector GetTestSavedModelBundleExportFiles() { tensorflow::io::JoinPath(dir, "variables/variables.data-00000-of-00001")}; } -uint64 GetTotalFileSize(const std::vector& files) { - uint64 total_file_size = 0; +uint64_t GetTotalFileSize(const std::vector& files) { + uint64_t total_file_size = 0; for (const string& file : files) { if (!(Env::Default()->IsDirectory(file).ok()) && Env::Default()->FileExists(file).ok()) { - uint64 file_size; + uint64_t file_size; TF_CHECK_OK(Env::Default()->GetFileSize(file, &file_size)); total_file_size += file_size; } @@ -134,7 +134,7 @@ ResourceAllocation GetExpectedResourceEstimate(double total_file_size) { // match the constants defined in bundle_factory_util.cc. const double kResourceEstimateRAMMultiplier = 1.2; const int kResourceEstimateRAMPadBytes = 0; - const uint64 expected_ram_requirement = + const uint64_t expected_ram_requirement = total_file_size * kResourceEstimateRAMMultiplier + kResourceEstimateRAMPadBytes; ResourceAllocation resource_alloc; diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_test_util.h b/tensorflow_serving/servables/tensorflow/bundle_factory_test_util.h index 04754ba1b80..5f4ca4ba458 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_test_util.h +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_test_util.h @@ -45,7 +45,7 @@ std::vector GetTestSessionBundleExportFiles(); std::vector GetTestSavedModelBundleExportFiles(); // Returns the total size of the given files. Requires the files to exist. -uint64 GetTotalFileSize(const std::vector& files); +uint64_t GetTotalFileSize(const std::vector& files); // Returns a signature for the half plus two model. SignatureDef GetTestSessionSignature(); diff --git a/tensorflow_serving/servables/tensorflow/classifier.cc b/tensorflow_serving/servables/tensorflow/classifier.cc index 46c63f41bd5..3cf2ebfdf4a 100644 --- a/tensorflow_serving/servables/tensorflow/classifier.cc +++ b/tensorflow_serving/servables/tensorflow/classifier.cc @@ -69,7 +69,7 @@ class SavedModelTensorFlowClassifier : public ClassifierInterface { std::vector outputs; int num_examples; - int64 runtime_latency; + int64_t runtime_latency; TF_RETURN_IF_ERROR(PerformOneShotTensorComputation( run_options_, request.input(), input_tensor_name, output_tensor_names, session_, &outputs, &num_examples, thread_pool_options_, @@ -324,7 +324,7 @@ Status PostProcessClassificationResult( Status RunClassify(const RunOptions& run_options, const MetaGraphDef& meta_graph_def, - const absl::optional& servable_version, + const absl::optional& servable_version, Session* session, const ClassificationRequest& request, ClassificationResponse* response, const thread::ThreadPoolOptions& thread_pool_options) { diff --git a/tensorflow_serving/servables/tensorflow/classifier.h b/tensorflow_serving/servables/tensorflow/classifier.h index 9a2a1f2e671..08072426068 100644 --- a/tensorflow_serving/servables/tensorflow/classifier.h +++ b/tensorflow_serving/servables/tensorflow/classifier.h @@ -79,7 +79,7 @@ Status PostProcessClassificationResult( // Creates SavedModelTensorflowClassifier and runs Classification on it. Status RunClassify(const RunOptions& run_options, const MetaGraphDef& meta_graph_def, - const absl::optional& servable_version, + const absl::optional& servable_version, Session* session, const ClassificationRequest& request, ClassificationResponse* response, const thread::ThreadPoolOptions& thread_pool_options = diff --git a/tensorflow_serving/servables/tensorflow/classifier_test.cc b/tensorflow_serving/servables/tensorflow/classifier_test.cc index 056e1ad5461..0a9a9baed2d 100644 --- a/tensorflow_serving/servables/tensorflow/classifier_test.cc +++ b/tensorflow_serving/servables/tensorflow/classifier_test.cc @@ -66,7 +66,7 @@ const char kImproperlySizedScoresSignature[] = "ImproperlySizedScoresSignature"; // class for that example. class FakeSession : public tensorflow::Session { public: - explicit FakeSession(absl::optional expected_timeout) + explicit FakeSession(absl::optional expected_timeout) : expected_timeout_(expected_timeout) {} ~FakeSession() override = default; Status Create(const GraphDef& graph) override { @@ -221,7 +221,7 @@ class FakeSession : public tensorflow::Session { } private: - const absl::optional expected_timeout_; + const absl::optional expected_timeout_; }; class ClassifierTest : public ::testing::TestWithParam { @@ -230,7 +230,7 @@ class ClassifierTest : public ::testing::TestWithParam { SetSignatureMethodNameCheckFeature(IsMethodNameCheckEnabled()); saved_model_bundle_.reset(new SavedModelBundle); meta_graph_def_ = &saved_model_bundle_->meta_graph_def; - absl::optional expected_timeout = GetRunOptions().timeout_in_ms(); + absl::optional expected_timeout = GetRunOptions().timeout_in_ms(); fake_session_ = new FakeSession(expected_timeout); saved_model_bundle_->session.reset(fake_session_); diff --git a/tensorflow_serving/servables/tensorflow/machine_learning_metadata.cc b/tensorflow_serving/servables/tensorflow/machine_learning_metadata.cc index 2ae084e9253..d1a7f2408b0 100644 --- a/tensorflow_serving/servables/tensorflow/machine_learning_metadata.cc +++ b/tensorflow_serving/servables/tensorflow/machine_learning_metadata.cc @@ -35,7 +35,7 @@ auto* mlmd_map = monitoring::Gauge::New( } // namespace void MaybePublishMLMDStreamz(const string& export_dir, const string& model_name, - int64 version) { + int64_t version) { const string mlmd_path = tensorflow::io::JoinPath( export_dir, tensorflow::kSavedModelAssetsExtraDirectory, kMLMDKeyFile); if (Env::Default()->FileExists(mlmd_path).ok()) { diff --git a/tensorflow_serving/servables/tensorflow/machine_learning_metadata.h b/tensorflow_serving/servables/tensorflow/machine_learning_metadata.h index 92d3b613ec6..c517beb7a1f 100644 --- a/tensorflow_serving/servables/tensorflow/machine_learning_metadata.h +++ b/tensorflow_serving/servables/tensorflow/machine_learning_metadata.h @@ -28,7 +28,7 @@ namespace serving { // with a loaded model. // For more information: https://www.tensorflow.org/tfx/guide/mlmd void MaybePublishMLMDStreamz(const string& export_dir, const string& model_name, - int64 version); + int64_t version); } // namespace serving } // namespace tensorflow diff --git a/tensorflow_serving/servables/tensorflow/multi_inference.cc b/tensorflow_serving/servables/tensorflow/multi_inference.cc index 1ee57b70012..3f9354841ed 100644 --- a/tensorflow_serving/servables/tensorflow/multi_inference.cc +++ b/tensorflow_serving/servables/tensorflow/multi_inference.cc @@ -125,7 +125,7 @@ Status TensorFlowMultiInferenceRunner::Infer( Status RunMultiInference( const RunOptions& run_options, const MetaGraphDef& meta_graph_def, - const absl::optional& servable_version, Session* session, + const absl::optional& servable_version, Session* session, const MultiInferenceRequest& request, MultiInferenceResponse* response, const tensorflow::thread::ThreadPoolOptions& thread_pool_options) { TRACELITERAL("RunMultiInference"); diff --git a/tensorflow_serving/servables/tensorflow/multi_inference.h b/tensorflow_serving/servables/tensorflow/multi_inference.h index a09242f937b..c73a0a78513 100644 --- a/tensorflow_serving/servables/tensorflow/multi_inference.h +++ b/tensorflow_serving/servables/tensorflow/multi_inference.h @@ -37,7 +37,7 @@ class TensorFlowMultiInferenceRunner { TensorFlowMultiInferenceRunner( Session* session, const MetaGraphDef* meta_graph_def, - absl::optional servable_version, + absl::optional servable_version, const thread::ThreadPoolOptions& thread_pool_options = thread::ThreadPoolOptions()) : session_(session), @@ -58,14 +58,14 @@ class TensorFlowMultiInferenceRunner { const MetaGraphDef* const meta_graph_def_; // If available, servable_version is used to set the ModelSpec version in the // InferenceResults of the MultiInferenceResponse. - const absl::optional servable_version_; + const absl::optional servable_version_; const tensorflow::thread::ThreadPoolOptions thread_pool_options_; }; // Creates TensorFlowMultiInferenceRunner and calls Infer on it. Status RunMultiInference( const RunOptions& run_options, const MetaGraphDef& meta_graph_def, - const absl::optional& servable_version, Session* session, + const absl::optional& servable_version, Session* session, const MultiInferenceRequest& request, MultiInferenceResponse* response, const tensorflow::thread::ThreadPoolOptions& thread_pool_options = tensorflow::thread::ThreadPoolOptions()); diff --git a/tensorflow_serving/servables/tensorflow/multi_inference_helper_test.cc b/tensorflow_serving/servables/tensorflow/multi_inference_helper_test.cc index 92f527ec922..e2b1b4c4f41 100644 --- a/tensorflow_serving/servables/tensorflow/multi_inference_helper_test.cc +++ b/tensorflow_serving/servables/tensorflow/multi_inference_helper_test.cc @@ -86,7 +86,7 @@ class MultiInferenceTest : public ::testing::Test { ServerCore* GetServerCore() { return this->server_core_.get(); } - const int64 servable_version_ = kTestModelVersion; + const int64_t servable_version_ = kTestModelVersion; private: static std::unique_ptr server_core_; @@ -111,7 +111,7 @@ void AddInput(const std::vector>& feature_kv, } void PopulateTask(const string& signature_name, const string& method_name, - int64 version, InferenceTask* task) { + int64_t version, InferenceTask* task) { ModelSpec model_spec; model_spec.set_name(kTestModelName); if (version > 0) { diff --git a/tensorflow_serving/servables/tensorflow/multi_inference_test.cc b/tensorflow_serving/servables/tensorflow/multi_inference_test.cc index 89533d4b96c..f6074f79a06 100644 --- a/tensorflow_serving/servables/tensorflow/multi_inference_test.cc +++ b/tensorflow_serving/servables/tensorflow/multi_inference_test.cc @@ -104,7 +104,7 @@ class MultiInferenceTest : public ::testing::Test { return GetServerCore()->GetServableHandle(model_spec, bundle); } - const int64 servable_version_ = 1; + const int64_t servable_version_ = 1; private: static std::unique_ptr server_core_; diff --git a/tensorflow_serving/servables/tensorflow/predict_util.cc b/tensorflow_serving/servables/tensorflow/predict_util.cc index 79cf0b597d2..4fa28de0507 100644 --- a/tensorflow_serving/servables/tensorflow/predict_util.cc +++ b/tensorflow_serving/servables/tensorflow/predict_util.cc @@ -73,7 +73,7 @@ Status VerifyRequestInputsSize(const SignatureDef& signature, namespace internal { Status RunPredict( const RunOptions& run_options, const MetaGraphDef& meta_graph_def, - const absl::optional& servable_version, + const absl::optional& servable_version, const internal::PredictResponseTensorSerializationOption option, Session* session, const PredictRequest& request, PredictResponse* response, const thread::ThreadPoolOptions& thread_pool_options) { @@ -99,11 +99,11 @@ Status RunPredict( &output_tensor_aliases)); std::vector outputs; RunMetadata run_metadata; - const uint64 start_microseconds = EnvTime::NowMicros(); + const uint64_t start_microseconds = EnvTime::NowMicros(); TF_RETURN_IF_ERROR(session->Run(run_options, input_tensors, output_tensor_names, {}, &outputs, &run_metadata, thread_pool_options)); - const uint64 end_microseconds = EnvTime::NowMicros(); + const uint64_t end_microseconds = EnvTime::NowMicros(); RecordRuntimeLatency(request.model_spec().name(), /*api=*/"Predict", /*runtime=*/"TF1", end_microseconds - start_microseconds); @@ -203,7 +203,7 @@ Status PostProcessPredictionResult( Status RunPredict(const RunOptions& run_options, const MetaGraphDef& meta_graph_def, - const absl::optional& servable_version, + const absl::optional& servable_version, Session* session, const PredictRequest& request, PredictResponse* response, const thread::ThreadPoolOptions& thread_pool_options) { diff --git a/tensorflow_serving/servables/tensorflow/predict_util.h b/tensorflow_serving/servables/tensorflow/predict_util.h index 0fb912f0863..8fce7ca68b6 100644 --- a/tensorflow_serving/servables/tensorflow/predict_util.h +++ b/tensorflow_serving/servables/tensorflow/predict_util.h @@ -34,7 +34,7 @@ namespace internal { // option for the TensorProtos in the response. Status RunPredict( const RunOptions& run_options, const MetaGraphDef& meta_graph_def, - const absl::optional& servable_version, + const absl::optional& servable_version, const PredictResponseTensorSerializationOption tensor_serialization_option, Session* session, const PredictRequest& request, PredictResponse* response, const thread::ThreadPoolOptions& thread_pool_options = @@ -64,7 +64,7 @@ Status PostProcessPredictionResult( // specifying serialization option as kAsProtoField for backward compatibility. Status RunPredict(const RunOptions& run_options, const MetaGraphDef& meta_graph_def, - const absl::optional& servable_version, + const absl::optional& servable_version, Session* session, const PredictRequest& request, PredictResponse* response, const thread::ThreadPoolOptions& thread_pool_options = diff --git a/tensorflow_serving/servables/tensorflow/regressor.cc b/tensorflow_serving/servables/tensorflow/regressor.cc index fe96cdb5fe3..c2022233b28 100644 --- a/tensorflow_serving/servables/tensorflow/regressor.cc +++ b/tensorflow_serving/servables/tensorflow/regressor.cc @@ -68,7 +68,7 @@ class SavedModelTensorFlowRegressor : public RegressorInterface { std::vector outputs; int num_examples; - int64 runtime_latency; + int64_t runtime_latency; TF_RETURN_IF_ERROR(PerformOneShotTensorComputation( run_options_, request.input(), input_tensor_name, output_tensor_names, session_, &outputs, &num_examples, thread_pool_options_, @@ -267,7 +267,7 @@ Status PostProcessRegressionResult( Status RunRegress(const RunOptions& run_options, const MetaGraphDef& meta_graph_def, - const absl::optional& servable_version, + const absl::optional& servable_version, Session* session, const RegressionRequest& request, RegressionResponse* response, const thread::ThreadPoolOptions& thread_pool_options) { diff --git a/tensorflow_serving/servables/tensorflow/regressor.h b/tensorflow_serving/servables/tensorflow/regressor.h index b12eeba954d..54482e8f8fe 100644 --- a/tensorflow_serving/servables/tensorflow/regressor.h +++ b/tensorflow_serving/servables/tensorflow/regressor.h @@ -79,7 +79,7 @@ Status PostProcessRegressionResult( // Creates SavedModelTensorflowRegressor and runs Regression on it. Status RunRegress(const RunOptions& run_options, const MetaGraphDef& meta_graph_def, - const absl::optional& servable_version, + const absl::optional& servable_version, Session* session, const RegressionRequest& request, RegressionResponse* response, const thread::ThreadPoolOptions& thread_pool_options = diff --git a/tensorflow_serving/servables/tensorflow/regressor_test.cc b/tensorflow_serving/servables/tensorflow/regressor_test.cc index f35d7ee789f..7db31e6d999 100644 --- a/tensorflow_serving/servables/tensorflow/regressor_test.cc +++ b/tensorflow_serving/servables/tensorflow/regressor_test.cc @@ -62,7 +62,7 @@ const char kImproperlySizedOutputSignature[] = "ImproperlySizedOutputSignature"; // Copies the "output" float feature from each Example. class FakeSession : public tensorflow::Session { public: - explicit FakeSession(absl::optional expected_timeout) + explicit FakeSession(absl::optional expected_timeout) : expected_timeout_(expected_timeout) {} ~FakeSession() override = default; Status Create(const GraphDef& graph) override { @@ -182,7 +182,7 @@ class FakeSession : public tensorflow::Session { } private: - const absl::optional expected_timeout_; + const absl::optional expected_timeout_; }; class RegressorTest : public ::testing::TestWithParam { @@ -191,7 +191,7 @@ class RegressorTest : public ::testing::TestWithParam { SetSignatureMethodNameCheckFeature(IsMethodNameCheckEnabled()); saved_model_bundle_.reset(new SavedModelBundle); meta_graph_def_ = &saved_model_bundle_->meta_graph_def; - absl::optional expected_timeout = GetRunOptions().timeout_in_ms(); + absl::optional expected_timeout = GetRunOptions().timeout_in_ms(); fake_session_ = new FakeSession(expected_timeout); saved_model_bundle_->session.reset(fake_session_); diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc index 008207f7ca4..c3965c9ef8a 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc @@ -52,7 +52,7 @@ Status LoadTfLiteModel(const string& model_dir, SavedModelBundle* bundle, std::unique_ptr session; const string& fname = io::JoinPath(model_dir, kTfLiteModelFilename); - uint64 size; + uint64_t size; TF_RETURN_IF_ERROR(Env::Default()->GetFileSize(fname, &size)); std::unique_ptr file; diff --git a/tensorflow_serving/servables/tensorflow/saved_model_warmup_util.cc b/tensorflow_serving/servables/tensorflow/saved_model_warmup_util.cc index 602e16814bc..e8b792d8579 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_warmup_util.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_warmup_util.cc @@ -36,8 +36,8 @@ auto* model_warm_up_latency = monitoring::Sampler<2>::New( }, // Scale of 10, power of 1.8 with bucket count 33 (~20 minutes). monitoring::Buckets::Exponential(10, 1.8, 33)); -uint64 GetLatencyMicroseconds(const uint64 start_microseconds) { - const uint64 end_microseconds = EnvTime::NowMicros(); +uint64_t GetLatencyMicroseconds(const uint64_t start_microseconds) { + const uint64_t end_microseconds = EnvTime::NowMicros(); // Avoid clock skew. if (end_microseconds < start_microseconds) return 0; return end_microseconds - start_microseconds; @@ -51,7 +51,7 @@ constexpr int WarmupConsts::kMaxNumRecords; Status RunSavedModelWarmup( const ModelWarmupOptions& model_warmup_options, const string export_dir, std::function warmup_request_executor) { - const uint64 start_microseconds = EnvTime::NowMicros(); + const uint64_t start_microseconds = EnvTime::NowMicros(); const string warmup_path = io::JoinPath(export_dir, kSavedModelAssetsExtraDirectory, WarmupConsts::kRequestsFileName); diff --git a/tensorflow_serving/servables/tensorflow/tflite_session.cc b/tensorflow_serving/servables/tensorflow/tflite_session.cc index 25b2cb095ab..b42a500899e 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session.cc @@ -345,7 +345,7 @@ Status TfLiteSession::SplitTfLiteInputTask( // The Callback will be run only after all partial tasks finished. IncrementalBarrier barrier(std::move(split_task_done_callback)); - std::vector output_task_sizes; + std::vector output_task_sizes; if (open_batch_remaining_slot > 0) { output_task_sizes.push_back(open_batch_remaining_slot); @@ -670,7 +670,7 @@ Status MergeInputTensors(const Batch& batch, Status SplitOutputTensors(const std::vector& combined_outputs, Batch* batch, int batch_size) { - std::vector task_sizes(batch->num_tasks()); + std::vector task_sizes(batch->num_tasks()); int total_size = 0; for (int i = 0; i < batch->num_tasks(); ++i) { const int task_size = batch->task(i).size(); @@ -711,7 +711,7 @@ void TfLiteSession::ProcessBatch( return; } - const uint64 dequeue_time_micros = EnvTime::NowMicros(); + const uint64_t dequeue_time_micros = EnvTime::NowMicros(); // Regardless of the outcome, we need to propagate the status to the // individual tasks and signal that they are done. We use MakeCleanup() to @@ -734,7 +734,7 @@ void TfLiteSession::ProcessBatch( // queue time alone, and find the latest task deadline which we'll use for the // overall batch. bool all_tasks_timeout_exceeded = true; - uint64 batch_deadline_micros = 0; + uint64_t batch_deadline_micros = 0; for (int i = 0; i < batch->num_tasks(); ++i) { const TfLiteBatchTask& task = batch->task(i); // If the caller doesn't populate RunOptions, the timeout is 0 by default. @@ -743,8 +743,8 @@ void TfLiteSession::ProcessBatch( all_tasks_timeout_exceeded = false; break; } - const int64 task_timeout_micros = task.run_options.timeout_in_ms() * 1000; - const uint64 task_deadline_micros = + const int64_t task_timeout_micros = task.run_options.timeout_in_ms() * 1000; + const uint64_t task_deadline_micros = task.enqueue_time_micros + task_timeout_micros; if (task_deadline_micros > dequeue_time_micros) { all_tasks_timeout_exceeded = false; diff --git a/tensorflow_serving/servables/tensorflow/tflite_session.h b/tensorflow_serving/servables/tensorflow/tflite_session.h index 4e1e62ed0f7..2b9163b2bdb 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session.h +++ b/tensorflow_serving/servables/tensorflow/tflite_session.h @@ -87,7 +87,7 @@ class TfLiteBatchTask : public BatchTask { // Returns the batch size. size_t size() const override { return inputs[0].dim_size(0); } - uint64 start_time_micros() const { return enqueue_time_micros; } + uint64_t start_time_micros() const { return enqueue_time_micros; } Notification* done; @@ -108,7 +108,7 @@ class TfLiteBatchTask : public BatchTask { RunOptions run_options; - const uint64 enqueue_time_micros; + const uint64_t enqueue_time_micros; // Required for partial execution using split batches. bool is_partial = false; diff --git a/tensorflow_serving/servables/tensorflow/util.cc b/tensorflow_serving/servables/tensorflow/util.cc index ec047e8adbc..69abfb2e975 100644 --- a/tensorflow_serving/servables/tensorflow/util.cc +++ b/tensorflow_serving/servables/tensorflow/util.cc @@ -174,7 +174,7 @@ Status InputToSerializedExampleTensor(const Input& input, Tensor* examples) { return errors::Internal("Error parsing serialized input."); } - const int64 num_examples = NumInputExamples(serialized_input); + const int64_t num_examples = NumInputExamples(serialized_input); if (num_examples == 0) { return errors::InvalidArgument("Input is empty."); } @@ -228,19 +228,19 @@ Status PerformOneShotTensorComputation( const std::vector& output_tensor_names, Session* session, std::vector* outputs, int* num_input_examples, const thread::ThreadPoolOptions& thread_pool_options, - int64* runtime_latency) { + int64_t* runtime_latency) { // Setup the input Tensor to be a vector of string containing the serialized // tensorflow.Example. Tensor input_tensor; TF_RETURN_IF_ERROR(InputToSerializedExampleTensor(input, &input_tensor)); *num_input_examples = input_tensor.dim_size(0); - const uint64 start_microseconds = EnvTime::NowMicros(); + const uint64_t start_microseconds = EnvTime::NowMicros(); RunMetadata run_metadata; TF_RETURN_IF_ERROR(session->Run( run_options, {{input_tensor_name, input_tensor}}, output_tensor_names, {}, outputs, &run_metadata, thread_pool_options)); - const uint64 end_microseconds = EnvTime::NowMicros(); + const uint64_t end_microseconds = EnvTime::NowMicros(); if (runtime_latency != nullptr) { *runtime_latency = end_microseconds - start_microseconds; } @@ -272,7 +272,7 @@ Status PerformOneShotTensorComputation( void MakeModelSpec(const string& model_name, const absl::optional& signature_name, - const absl::optional& version, + const absl::optional& version, ModelSpec* model_spec) { model_spec->Clear(); model_spec->set_name(model_name); @@ -287,7 +287,7 @@ void MakeModelSpec(const string& model_name, } Status GetModelDiskSize(const string& path, FileProbingEnv* env, - uint64* total_file_size) { + uint64_t* total_file_size) { if (env == nullptr) { return errors::Internal("FileProbingEnv not set"); } @@ -297,7 +297,7 @@ Status GetModelDiskSize(const string& path, FileProbingEnv* env, *total_file_size = 0; for (const string& descendant : descendants) { if (!(env->IsDirectory(descendant).ok())) { - uint64 file_size; + uint64_t file_size; TF_RETURN_IF_ERROR(env->GetFileSize(descendant, &file_size)); *total_file_size += file_size; } @@ -308,10 +308,10 @@ Status GetModelDiskSize(const string& path, FileProbingEnv* env, Status EstimateResourceFromPathUsingDiskState(const string& path, FileProbingEnv* env, ResourceAllocation* estimate) { - uint64 total_file_size = 0; + uint64_t total_file_size = 0; TF_RETURN_IF_ERROR(GetModelDiskSize(path, env, &total_file_size)); - const uint64 ram_requirement = + const uint64_t ram_requirement = total_file_size * kResourceEstimateRAMMultiplier + kResourceEstimateRAMPadBytes; @@ -325,12 +325,12 @@ Status EstimateResourceFromPathUsingDiskState(const string& path, } void RecordRuntimeLatency(const string& model_name, const string& api, - const string& runtime, int64 latency_usec) { + const string& runtime, int64_t latency_usec) { runtime_latency->GetCell(model_name, api, runtime)->Add(latency_usec); } void RecordRequestLatency(const string& model_name, const string& api, - const string& entrypoint, int64 latency_usec) { + const string& entrypoint, int64_t latency_usec) { request_latency->GetCell(model_name, api, entrypoint)->Add(latency_usec); } diff --git a/tensorflow_serving/servables/tensorflow/util.h b/tensorflow_serving/servables/tensorflow/util.h index 41c4da4aa81..692d0f7caa4 100644 --- a/tensorflow_serving/servables/tensorflow/util.h +++ b/tensorflow_serving/servables/tensorflow/util.h @@ -82,7 +82,7 @@ Status PerformOneShotTensorComputation( std::vector* outputs, int* num_input_examples, const thread::ThreadPoolOptions& thread_pool_options = thread::ThreadPoolOptions(), - int64* runtime_latency = nullptr); + int64_t* runtime_latency = nullptr); // Same as PerformOneShotTensorComputation() above, except allows for multiple // input tensor names (each tensor is fed the *same* `input`). @@ -100,11 +100,12 @@ Status PerformOneShotTensorComputation( // set to tensorflow::kDefaultServingSignatureDefKey. void MakeModelSpec(const string& model_name, const absl::optional& signature_name, - const absl::optional& version, ModelSpec* model_spec); + const absl::optional& version, + ModelSpec* model_spec); // Gets the disk size of the model in the given path. Status GetModelDiskSize(const string& path, FileProbingEnv* env, - uint64* total_file_size); + uint64_t* total_file_size); // Estimates the resources a session bundle or saved model bundle will use once // loaded, from its export or saved model path. Directly uses disk state for @@ -115,11 +116,11 @@ Status EstimateResourceFromPathUsingDiskState(const string& path, // Update metrics for runtime latency. void RecordRuntimeLatency(const string& model_name, const string& api, - const string& runtime, int64 latency_usec); + const string& runtime, int64_t latency_usec); // Update metrics for request latency. void RecordRequestLatency(const string& model_name, const string& api, - const string& entrypoint, int64 latency_usec); + const string& entrypoint, int64_t latency_usec); // Get string keys of a map. template diff --git a/tensorflow_serving/servables/tensorflow/util_test.cc b/tensorflow_serving/servables/tensorflow/util_test.cc index a9d22c758b4..a533afca676 100644 --- a/tensorflow_serving/servables/tensorflow/util_test.cc +++ b/tensorflow_serving/servables/tensorflow/util_test.cc @@ -61,7 +61,7 @@ class InputUtilTest : public ::testing::Test { return example; } - Example example_C(const int64 value = 33) { + Example example_C(const int64_t value = 33) { Feature feature; feature.mutable_int64_list()->add_value(value); Example example; diff --git a/tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc b/tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc index 708aee779e9..7c755b3457d 100644 --- a/tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc +++ b/tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc @@ -80,7 +80,7 @@ std::set GetDeletedServables( // aspire. void AspireVersion( const FileSystemStoragePathSourceConfig::ServableToMonitor& servable, - const string& version_relative_path, const int64 version_number, + const string& version_relative_path, const int64_t version_number, std::vector>* versions) { const ServableId servable_id = {servable.servable_name(), version_number}; const string full_path = @@ -90,7 +90,7 @@ void AspireVersion( // Converts the string version path to an integer. // Returns false if the input is invalid. -bool ParseVersionNumber(const string& version_path, int64* version_number) { +bool ParseVersionNumber(const string& version_path, int64_t* version_number) { return strings::safe_strto64(version_path.c_str(), version_number); } @@ -108,7 +108,7 @@ bool AspireAllVersions( for (const string& child : children) { // Identify all the versions, among children that can be interpreted as // version numbers. - int64 version_number; + int64_t version_number; if (ParseVersionNumber(child, &version_number)) { // Emit all the aspired-versions data. AspireVersion(servable, child, version_number, versions); @@ -122,11 +122,11 @@ bool AspireAllVersions( // Helper that indexes a list of the given "children" (where child is the // name of the directory corresponding to a servable version). Note that strings // that cannot be parsed as a number are skipped (no error is returned). -std::map +std::map IndexChildrenByVersion(const std::vector& children) { - std::map children_by_version; + std::map children_by_version; for (int i = 0; i < children.size(); ++i) { - int64 version_number; + int64_t version_number; if (!ParseVersionNumber(children[i], &version_number)) { continue; } @@ -149,7 +149,7 @@ IndexChildrenByVersion(const std::vector& children) { // Returns true iff it winds up aspiring at least one version. bool AspireLatestVersions( const FileSystemStoragePathSourceConfig::ServableToMonitor& servable, - const std::map& children_by_version, + const std::map& children_by_version, std::vector>* versions) { const int32 num_servable_versions_to_serve = std::max(servable.servable_version_policy().latest().num_versions(), 1U); @@ -161,7 +161,7 @@ bool AspireLatestVersions( if (num_versions_emitted == num_servable_versions_to_serve) { break; } - const int64 version = rit->first; + const int64_t version = rit->first; const string& child = rit->second; AspireVersion(servable, child, version, versions); num_versions_emitted++; @@ -177,18 +177,18 @@ bool AspireLatestVersions( // Returns true iff it winds up aspiring at least one version. bool AspireSpecificVersions( const FileSystemStoragePathSourceConfig::ServableToMonitor& servable, - const std::map& children_by_version, + const std::map& children_by_version, std::vector>* versions) { - const std::unordered_set versions_to_serve( + const std::unordered_set versions_to_serve( servable.servable_version_policy().specific().versions().begin(), servable.servable_version_policy().specific().versions().end()); // Identify specific version to serve (as specified by 'versions_to_serve') // among children that can be interpreted as version numbers and emit as // aspired versions. - std::unordered_set aspired_versions; + std::unordered_set aspired_versions; for (auto it = children_by_version.begin(); it != children_by_version.end(); ++it) { - const int64 version = it->first; + const int64_t version = it->first; if (versions_to_serve.count(version) == 0) { continue; // Current version is not specified by policy for serving. } @@ -196,7 +196,7 @@ bool AspireSpecificVersions( AspireVersion(servable, child, version, versions); aspired_versions.insert(version); } - for (const int64 version : versions_to_serve) { + for (const int64_t version : versions_to_serve) { if (aspired_versions.count(version) == 0) { LOG(WARNING) << "Version " << version << " of servable " @@ -238,8 +238,8 @@ Status PollFileSystemForServable( } children.clear(); children.insert(children.begin(), real_children.begin(), real_children.end()); - const std::map children_by_version = - IndexChildrenByVersion(children); + const std::map + children_by_version = IndexChildrenByVersion(children); bool at_least_one_version_found = false; switch (servable.servable_version_policy().policy_choice_case()) { diff --git a/tensorflow_serving/util/event_bus.h b/tensorflow_serving/util/event_bus.h index f3f28609dce..8222aa3b028 100644 --- a/tensorflow_serving/util/event_bus.h +++ b/tensorflow_serving/util/event_bus.h @@ -102,7 +102,7 @@ class EventBus : public std::enable_shared_from_this> { /// Event and the publish time associated with it. struct EventAndTime { const E& event; - uint64 event_time_micros; + uint64_t event_time_micros; }; /// The function type for EventBus Callbacks to be implemented by clients. @@ -208,7 +208,7 @@ void EventBus::Unsubscribe( template void EventBus::Publish(const E& event) { mutex_lock lock(mutex_); - const uint64 event_time = options_.env->NowMicros(); + const uint64_t event_time = options_.env->NowMicros(); const EventAndTime event_and_time = {event, event_time}; for (const SubscriptionTuple& subscription : subscriptions_) { subscription.callback(event_and_time); diff --git a/tensorflow_serving/util/event_bus_test.cc b/tensorflow_serving/util/event_bus_test.cc index b0e845433b9..5c4e824209e 100644 --- a/tensorflow_serving/util/event_bus_test.cc +++ b/tensorflow_serving/util/event_bus_test.cc @@ -38,7 +38,7 @@ TEST(EventBusTest, FullLifecycleTest) { // Set up a bus with a single subscriber. std::shared_ptr bus = IntEventBus::CreateEventBus(bus_options); int value = 1; - uint64 value_timestamp = 0; + uint64_t value_timestamp = 0; IntEventBus::Callback callback = [&value, &value_timestamp](IntEventBus::EventAndTime event_and_time) { value += event_and_time.event; diff --git a/tensorflow_serving/util/fast_read_dynamic_ptr.h b/tensorflow_serving/util/fast_read_dynamic_ptr.h index e39856f737d..bd35aefde44 100644 --- a/tensorflow_serving/util/fast_read_dynamic_ptr.h +++ b/tensorflow_serving/util/fast_read_dynamic_ptr.h @@ -280,14 +280,14 @@ class ShardedReadPtrs { } // Otherwise, return a random shard. random::New64 would introduce a mutex // lock here, which would defeat the purpose of the sharding. Similarly, a - // static std::atomic, if updated with any memory order other than + // static std::atomic, if updated with any memory order other than // std::memory_order_relaxed, would re-introduce contention on that memory // location. A thread_local sidesteps both problems with only eight bytes // per thread of overhead. // // MCGs need to be seeded with an odd number, so we ensure the lowest bit is // set. - thread_local uint64 state = {random::New64() | 1ULL}; + thread_local uint64_t state = {random::New64() | 1ULL}; // We just need something simple and good enough. The multiplier here was // picked from "COMPUTATIONALLY EASY, SPECTRALLY GOOD MULTIPLIERS FOR // CONGRUENTIAL PSEUDORANDOM NUMBER GENERATORS" by Steele and Vigna. diff --git a/tensorflow_serving/util/fast_read_dynamic_ptr_benchmark.cc b/tensorflow_serving/util/fast_read_dynamic_ptr_benchmark.cc index 08b6adcaa8c..24ed7143408 100644 --- a/tensorflow_serving/util/fast_read_dynamic_ptr_benchmark.cc +++ b/tensorflow_serving/util/fast_read_dynamic_ptr_benchmark.cc @@ -103,7 +103,7 @@ class BenchmarkState { FastReadIntPtr fast_ptr_; // The update interval in microseconds. - int64 update_micros_; + int64_t update_micros_; // In each iteration, to simulate a more realistic access pattern that does // more than content for the mutex. diff --git a/tensorflow_serving/util/file_probing_env.cc b/tensorflow_serving/util/file_probing_env.cc index b3515d197b1..a5f25ce7800 100644 --- a/tensorflow_serving/util/file_probing_env.cc +++ b/tensorflow_serving/util/file_probing_env.cc @@ -32,7 +32,7 @@ Status TensorflowFileProbingEnv::IsDirectory(const string& fname) { } Status TensorflowFileProbingEnv::GetFileSize(const string& fname, - uint64* file_size) { + uint64_t* file_size) { return env_->GetFileSize(fname, file_size); } diff --git a/tensorflow_serving/util/file_probing_env.h b/tensorflow_serving/util/file_probing_env.h index 8f5a94cb50b..ab8ad53b46b 100644 --- a/tensorflow_serving/util/file_probing_env.h +++ b/tensorflow_serving/util/file_probing_env.h @@ -42,7 +42,7 @@ class FileProbingEnv { virtual Status IsDirectory(const string& fname) = 0; // Stores the size of `fname` in `*file_size`. - virtual Status GetFileSize(const string& fname, uint64* file_size) = 0; + virtual Status GetFileSize(const string& fname, uint64_t* file_size) = 0; }; // An implementation of FileProbingEnv which delegates the calls to @@ -60,7 +60,7 @@ class TensorflowFileProbingEnv : public FileProbingEnv { Status IsDirectory(const string& fname) override; - Status GetFileSize(const string& fname, uint64* file_size) override; + Status GetFileSize(const string& fname, uint64_t* file_size) override; private: // Not owned. diff --git a/tensorflow_serving/util/hash.cc b/tensorflow_serving/util/hash.cc index 8a37c1f1502..2da70000fe7 100644 --- a/tensorflow_serving/util/hash.cc +++ b/tensorflow_serving/util/hash.cc @@ -18,7 +18,7 @@ limitations under the License. namespace tensorflow { namespace serving { -uint64 HashCombine(const uint64 hash1, const uint64 hash2) { +uint64_t HashCombine(const uint64_t hash1, const uint64_t hash2) { return hash1 ^ (hash2 + 0x9e3779b97f4a7800 + (hash1 << 10) + (hash1 >> 4)); } diff --git a/tensorflow_serving/util/hash.h b/tensorflow_serving/util/hash.h index 50fdf19a18c..d628f1cb2db 100644 --- a/tensorflow_serving/util/hash.h +++ b/tensorflow_serving/util/hash.h @@ -22,7 +22,7 @@ namespace tensorflow { namespace serving { // Combines 2 hashes and returns a 3rd one. -uint64 HashCombine(uint64 hash1, uint64 hash2); +uint64_t HashCombine(uint64_t hash1, uint64_t hash2); } // namespace serving } // namespace tensorflow diff --git a/tensorflow_serving/util/json_tensor.cc b/tensorflow_serving/util/json_tensor.cc index 58f1a920472..85524e75c89 100644 --- a/tensorflow_serving/util/json_tensor.cc +++ b/tensorflow_serving/util/json_tensor.cc @@ -727,7 +727,7 @@ Status AddValueToFeature(const rapidjson::Value& val, if (!val.IsInt64() && val.IsUint64()) { return errors::InvalidArgument( "Feature: ", feature_name, - " has uint64 element. Only int64 is supported."); + " has uint64_t element. Only int64_t is supported."); } feature->mutable_int64_list()->add_value(val.GetInt64()); } diff --git a/tensorflow_serving/util/json_tensor_test.cc b/tensorflow_serving/util/json_tensor_test.cc index c9671946167..f77ea21cf58 100644 --- a/tensorflow_serving/util/json_tensor_test.cc +++ b/tensorflow_serving/util/json_tensor_test.cc @@ -1491,7 +1491,7 @@ TYPED_TEST(ClassifyRegressRequestTest, JsonErrors) { })", &req); ASSERT_TRUE(errors::IsInvalidArgument(status)); - EXPECT_THAT(status.error_message(), HasSubstr("Only int64 is supported")); + EXPECT_THAT(status.error_message(), HasSubstr("Only int64_t is supported")); } TEST(ClassifyRegressnResultTest, JsonFromClassificationResult) { diff --git a/tensorflow_serving/util/prometheus_exporter.cc b/tensorflow_serving/util/prometheus_exporter.cc index 78268d9fb1c..38be6e7abcb 100644 --- a/tensorflow_serving/util/prometheus_exporter.cc +++ b/tensorflow_serving/util/prometheus_exporter.cc @@ -80,7 +80,7 @@ void SerializeHistogram(const monitoring::MetricDescriptor& metric_descriptor, SanatizeLabelName(label.name), SanitizeLabelValue(label.value))); } - int64 cumulative_count = 0; + int64_t cumulative_count = 0; string bucket_prefix = absl::StrCat(prom_metric_name, "_bucket{", absl::StrJoin(labels, ",")); if (!labels.empty()) { diff --git a/tensorflow_serving/util/prometheus_exporter_test.cc b/tensorflow_serving/util/prometheus_exporter_test.cc index 435a28844d4..57719f4ce21 100644 --- a/tensorflow_serving/util/prometheus_exporter_test.cc +++ b/tensorflow_serving/util/prometheus_exporter_test.cc @@ -45,7 +45,7 @@ TEST(PrometheusExporterTest, Counter) { TEST(PrometheusExporterTest, Gauge) { auto exporter = absl::make_unique(); - auto gauge = absl::WrapUnique(monitoring::Gauge::New( + auto gauge = absl::WrapUnique(monitoring::Gauge::New( "/test/path/gague", "A gauge", "x", "y")); gauge->GetCell("abc", "def")->Set(5); diff --git a/tensorflow_serving/util/retrier.cc b/tensorflow_serving/util/retrier.cc index 0067ccb9f8a..49d5d1fe2a9 100644 --- a/tensorflow_serving/util/retrier.cc +++ b/tensorflow_serving/util/retrier.cc @@ -22,7 +22,7 @@ namespace tensorflow { namespace serving { Status Retry(const string& description, const uint32 max_num_retries, - const int64 retry_interval_micros, + const int64_t retry_interval_micros, const std::function& retried_fn, const std::function& is_cancelled) { Status status; diff --git a/tensorflow_serving/util/retrier.h b/tensorflow_serving/util/retrier.h index 6fe26f77617..d51f4437a14 100644 --- a/tensorflow_serving/util/retrier.h +++ b/tensorflow_serving/util/retrier.h @@ -30,10 +30,10 @@ namespace serving { // interval of 'retry_interval_micros'. The 'description' is useful for logging. // // Returns the status returned by the last call to 'retried_fn'. -Status Retry(const string& description, uint32 max_num_retries, - int64 retry_interval_micros, - const std::function& retried_fn, - const std::function& is_cancelled = [] { return false; }); +Status Retry( + const string& description, uint32 max_num_retries, + int64_t retry_interval_micros, const std::function& retried_fn, + const std::function& is_cancelled = [] { return false; }); } // namespace serving } // namespace tensorflow diff --git a/tensorflow_serving/util/test_util/mock_file_probing_env.h b/tensorflow_serving/util/test_util/mock_file_probing_env.h index 78fe35d8178..f16b20904ec 100644 --- a/tensorflow_serving/util/test_util/mock_file_probing_env.h +++ b/tensorflow_serving/util/test_util/mock_file_probing_env.h @@ -30,7 +30,7 @@ class MockFileProbingEnv : public FileProbingEnv { MOCK_METHOD(Status, GetChildren, (const string& fname, std::vector* children), (override)); MOCK_METHOD(Status, IsDirectory, (const string& fname), (override)); - MOCK_METHOD(Status, GetFileSize, (const string& fname, uint64* file_size), + MOCK_METHOD(Status, GetFileSize, (const string& fname, uint64_t* file_size), (override)); }; From 78f7ac1fb7aa0685456572017b224ef74dc0d872 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Oct 2021 12:02:44 -0700 Subject: [PATCH 5474/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8eb42bc6-d5e6-41eb-b1e3-fece2e972e00 PiperOrigin-RevId: 402358302 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c0debf574eb..d3ee7ace349 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7bcecabc719ba80801f16330dc29cfe8a81aa9254c5c6c10436141539fcc9618", - git_commit = "0fb7b291092a3e2416611ac31e27cbccd198029a", + sha256 = "1e5baecb0f7b00cd696172a1bc82b52d7797c02edae44923de29af1766eb867f", + git_commit = "36490136885af40b17d7a70ffc2a9999011b7e72", ) # Import all of TensorFlow Serving's external dependencies. From d34dee26cde50f6195e7aed8793c8b51a240f387 Mon Sep 17 00:00:00 2001 From: Li Lao Date: Mon, 11 Oct 2021 13:32:14 -0700 Subject: [PATCH 5475/8103] Replace remaining deprecated int64 with int64_t. PiperOrigin-RevId: 402379379 --- tensorflow_serving/core/aspired_versions_manager_benchmark.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/core/aspired_versions_manager_benchmark.cc b/tensorflow_serving/core/aspired_versions_manager_benchmark.cc index d7f71d83edc..a6c0c7df6fc 100644 --- a/tensorflow_serving/core/aspired_versions_manager_benchmark.cc +++ b/tensorflow_serving/core/aspired_versions_manager_benchmark.cc @@ -122,7 +122,7 @@ class BenchmarkState { void BenchmarkState::StartServing(const int64_t loader_version) { std::unique_ptr loader(new SimpleLoader( [loader_version](std::unique_ptr* const servable) { - servable->reset(new int64); + servable->reset(new int64_t); **servable = loader_version; return Status::OK(); }, @@ -332,7 +332,7 @@ void BM_GetServableHandle(::testing::benchmark::State& state) { for (int j = 0; j < kNumServableVersions; ++j) { std::unique_ptr loader(new SimpleLoader( [j](std::unique_ptr* const servable) { - servable->reset(new int64); + servable->reset(new int64_t); **servable = j; return Status::OK(); }, From ad17741c5a12d4822aa35cef4de3d1f1dec063fa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Oct 2021 18:01:40 -0700 Subject: [PATCH 5476/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f4fac968-54c3-455b-82d4-19683c336b56 PiperOrigin-RevId: 402437145 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d3ee7ace349..c9a75a96384 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1e5baecb0f7b00cd696172a1bc82b52d7797c02edae44923de29af1766eb867f", - git_commit = "36490136885af40b17d7a70ffc2a9999011b7e72", + sha256 = "8d28e5d7fa48c61982cb9188a72c5f67802d20ec13dd5cad8238cc67751f4181", + git_commit = "eb54af1157c33e869d7b456abbfcf579d707dd3e", ) # Import all of TensorFlow Serving's external dependencies. From 41612efdad5d2319fb53a3680b959258cec525d5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Oct 2021 00:01:54 -0700 Subject: [PATCH 5477/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3916c00c-e249-4a9c-8b5f-6b2e8e9137fa PiperOrigin-RevId: 402486679 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c9a75a96384..d905beceba2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8d28e5d7fa48c61982cb9188a72c5f67802d20ec13dd5cad8238cc67751f4181", - git_commit = "eb54af1157c33e869d7b456abbfcf579d707dd3e", + sha256 = "e71aafa5b82b1df4ede66367bd8c09189c603edbcb25f6dd3aaa1a4cb3b245a8", + git_commit = "4fe62dc767769c7c52c8d15960be1bd80a6402c7", ) # Import all of TensorFlow Serving's external dependencies. From 0beae749d6463bf9c83c1df339d9a79babbf935e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Oct 2021 06:01:47 -0700 Subject: [PATCH 5478/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/95827e92-4b75-4ec1-84cf-044678f4126d PiperOrigin-RevId: 402541249 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d905beceba2..0f684326748 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e71aafa5b82b1df4ede66367bd8c09189c603edbcb25f6dd3aaa1a4cb3b245a8", - git_commit = "4fe62dc767769c7c52c8d15960be1bd80a6402c7", + sha256 = "94884087c905a620e222fe1143275d0cdcd98e9864555d33daf74279f7b02971", + git_commit = "98ee22a20f106a7f554578f1331957eb044f2d64", ) # Import all of TensorFlow Serving's external dependencies. From 86ad96babbec0ba41f13633e445a8e844a507fed Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Oct 2021 12:01:57 -0700 Subject: [PATCH 5479/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a466b481-e6c5-47d8-8a56-058ee71a1e11 PiperOrigin-RevId: 402620808 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0f684326748..8f6421073b8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "94884087c905a620e222fe1143275d0cdcd98e9864555d33daf74279f7b02971", - git_commit = "98ee22a20f106a7f554578f1331957eb044f2d64", + sha256 = "ff7ab998422dbae5bec620f8fd8d3cafb268567eea46b140429acf9ff3b0a920", + git_commit = "696b9076dcf77db0878be637d718a67fa4163493", ) # Import all of TensorFlow Serving's external dependencies. From 04bba25ebd0359e05b7a8453f6878a3e1e3e8e2a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Oct 2021 18:03:51 -0700 Subject: [PATCH 5480/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/25059a9a-70bb-4d61-99ff-42448ed8077e PiperOrigin-RevId: 402702048 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8f6421073b8..ec4d3aa3de5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ff7ab998422dbae5bec620f8fd8d3cafb268567eea46b140429acf9ff3b0a920", - git_commit = "696b9076dcf77db0878be637d718a67fa4163493", + sha256 = "c229ec6fbd3cbd28499a92354c64d17577f8c64eb9b6aca4181bb8e8ef609976", + git_commit = "24a08d25a08e37a4f9c1f81d396262a3e537c5d6", ) # Import all of TensorFlow Serving's external dependencies. From 055fc0d3adb7cdc4a835cd945a31babe4d794345 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Oct 2021 00:01:28 -0700 Subject: [PATCH 5481/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/08879548-4cdf-49d4-8a2a-8d9e13060d93 PiperOrigin-RevId: 402748261 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ec4d3aa3de5..6f5cb2dc186 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c229ec6fbd3cbd28499a92354c64d17577f8c64eb9b6aca4181bb8e8ef609976", - git_commit = "24a08d25a08e37a4f9c1f81d396262a3e537c5d6", + sha256 = "2cb3e2a5d1e78579e76aa67399ca36f665e8393207989d7bc5b7fb2e4e4f52ba", + git_commit = "3c1ab991293eafeafd7225deb5b6f9d077e83b62", ) # Import all of TensorFlow Serving's external dependencies. From 774779aa515c7ff79e830d334d902def2b5ed48f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Oct 2021 06:01:35 -0700 Subject: [PATCH 5482/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/80bfa263-3019-4812-a2f5-5aed09d2c74c PiperOrigin-RevId: 402810215 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6f5cb2dc186..3e9542d817f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2cb3e2a5d1e78579e76aa67399ca36f665e8393207989d7bc5b7fb2e4e4f52ba", - git_commit = "3c1ab991293eafeafd7225deb5b6f9d077e83b62", + sha256 = "a93ac798440ce37c635e11c6379e80f5cd3d4cb70e7b932ab2f8c4fe101917c5", + git_commit = "30d704726d19792cf8837f6a7ab9222d197d8ab7", ) # Import all of TensorFlow Serving's external dependencies. From 860e1013385289ad3f9eb4d854b55c23e7cb8087 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Oct 2021 07:32:31 -0700 Subject: [PATCH 5483/8103] update to latest benchmark API changes PiperOrigin-RevId: 402826803 --- .../servables/tensorflow/bundle_factory_util_test.cc | 2 +- .../servables/tensorflow/tflite_session_test.cc | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc b/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc index 21c9d2c1059..7cc4eaf8360 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc @@ -150,7 +150,7 @@ TEST_F(BundleFactoryUtilTest, EstimateResourceFromPathWithGoodExport) { void BM_HalfPlusTwo(benchmark::State& state) { static Session* session; - if (state.thread_index == 0) { + if (state.thread_index() == 0) { SavedModelBundle bundle; TF_ASSERT_OK(LoadSavedModel(SessionOptions(), RunOptions(), test_util::GetTestSavedModelPath(), {"serve"}, diff --git a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc index 265b2eaf118..51d534f0e40 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc @@ -813,7 +813,7 @@ TEST(TfLiteSession, TestSetScheduler) { static void BM_Reshape(benchmark::State& state, bool use_flex_op) { static TfLiteSession* session; - if (state.thread_index == 0) { + if (state.thread_index() == 0) { auto model_signature_def_map = GetTestSignatureDefMap(); string model_bytes = BuildTestModel(tflite::TensorType_INT32, use_flex_op, &model_signature_def_map); @@ -848,7 +848,7 @@ BENCHMARK(BM_Reshape_Flex)->UseRealTime()->ThreadRange(1, 64); void BM_HalfPlusTwo(benchmark::State& state) { static TfLiteSession* session; - if (state.thread_index == 0) { + if (state.thread_index() == 0) { string model_bytes; TF_ASSERT_OK(ReadFileToString( Env::Default(), test_util::TestSrcDirPath(kTestModel), &model_bytes)); @@ -871,7 +871,7 @@ BENCHMARK(BM_HalfPlusTwo)->UseRealTime()->ThreadRange(1, 64); void BM_MobileNet(benchmark::State& state) { static TfLiteSession* session; - if (state.thread_index == 0) { + if (state.thread_index() == 0) { string model_bytes; TF_ASSERT_OK(ReadFileToString(Env::Default(), test_util::TestSrcDirPath(kMobileNetModel), @@ -897,7 +897,7 @@ BENCHMARK(BM_MobileNet)->UseRealTime()->ThreadRange(1, 64); void BM_ParseExample(benchmark::State& state) { static TfLiteSession* session; - if (state.thread_index == 0) { + if (state.thread_index() == 0) { string model_bytes; TF_ASSERT_OK(ReadFileToString(Env::Default(), test_util::TestSrcDirPath(kParseExampleModel), From 97904f9734a127474c8cd5dccb14900b534125ea Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Oct 2021 12:02:01 -0700 Subject: [PATCH 5484/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6ad4f70b-ee58-43a9-9322-cc5e635ccc7e PiperOrigin-RevId: 402888686 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3e9542d817f..98fb83e1cf4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a93ac798440ce37c635e11c6379e80f5cd3d4cb70e7b932ab2f8c4fe101917c5", - git_commit = "30d704726d19792cf8837f6a7ab9222d197d8ab7", + sha256 = "8216a964fe292d93d80c2abfc5db0764be78dd2f8cc26dcbf596582f659f58e3", + git_commit = "12f9f76f29166406255e664c59fe4e742a78c31f", ) # Import all of TensorFlow Serving's external dependencies. From 047c51e62a2d0d8d2e1e8130a3f326b906f7123c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Oct 2021 18:01:56 -0700 Subject: [PATCH 5485/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ccd72b6f-9919-4c7a-aed9-b7a0d0575027 PiperOrigin-RevId: 402965853 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 98fb83e1cf4..05eebecf96c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8216a964fe292d93d80c2abfc5db0764be78dd2f8cc26dcbf596582f659f58e3", - git_commit = "12f9f76f29166406255e664c59fe4e742a78c31f", + sha256 = "0deb30089f56847e3166ef820899f806f9ca4a72ea3d1567e78832319969059a", + git_commit = "6fdc1445d1c3b2401293be39eba07fb5d0e95428", ) # Import all of TensorFlow Serving's external dependencies. From 5babc10b55b202f9038519e8e7e6cfefbee4bced Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Oct 2021 00:01:39 -0700 Subject: [PATCH 5486/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a8007635-6300-4927-8a49-9b3c723e6522 PiperOrigin-RevId: 403014585 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 05eebecf96c..4a5f1c7837b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0deb30089f56847e3166ef820899f806f9ca4a72ea3d1567e78832319969059a", - git_commit = "6fdc1445d1c3b2401293be39eba07fb5d0e95428", + sha256 = "0aea672bc9f2f5fd83db920abfd14963363e5b9231f23abe903af73da7e19498", + git_commit = "0cfbbb428c756dc5257ea0e8937fe7765689ab66", ) # Import all of TensorFlow Serving's external dependencies. From 6428891c6f50876905b24c6bfc07ee54e1e81a7c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Oct 2021 06:01:28 -0700 Subject: [PATCH 5487/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/836d8d0d-1cef-47fd-a976-7bcdf47bcb35 PiperOrigin-RevId: 403073975 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4a5f1c7837b..cb8c3ff6a6f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0aea672bc9f2f5fd83db920abfd14963363e5b9231f23abe903af73da7e19498", - git_commit = "0cfbbb428c756dc5257ea0e8937fe7765689ab66", + sha256 = "893ce1b8ecc48058891ac4e9979012051682de022d32b760bfb3ab61c77906b4", + git_commit = "aa7c36f606cbf15ab69a3efed92d8b3909f073b5", ) # Import all of TensorFlow Serving's external dependencies. From 42816c4766668bb6767972a8406447f898b3086c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Oct 2021 12:03:07 -0700 Subject: [PATCH 5488/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/97f211b7-ecc0-49ba-aab4-5b3b5d8d1095 PiperOrigin-RevId: 403152030 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cb8c3ff6a6f..384d36ee8d0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "893ce1b8ecc48058891ac4e9979012051682de022d32b760bfb3ab61c77906b4", - git_commit = "aa7c36f606cbf15ab69a3efed92d8b3909f073b5", + sha256 = "372a9c4d78fad1e1a53262be76f965159e539b3bebdece5f9f857c2e83990f97", + git_commit = "eaae7ecb8b1e381a45d6932e18419d1aeff2259e", ) # Import all of TensorFlow Serving's external dependencies. From 996fc52c23e4c4422ff1b385c9ac3133efd6cde4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Oct 2021 18:02:02 -0700 Subject: [PATCH 5489/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b548d517-1ad8-4663-a0a4-e3887dc26699 PiperOrigin-RevId: 403235611 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 384d36ee8d0..969d5065842 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "372a9c4d78fad1e1a53262be76f965159e539b3bebdece5f9f857c2e83990f97", - git_commit = "eaae7ecb8b1e381a45d6932e18419d1aeff2259e", + sha256 = "75066991ae149f41565bffa4e24dcb76cec72b8bfd9906aafc38498ddabfc454", + git_commit = "1690fa8e1ca8fa2bcf20d25af859b3bfda40e29d", ) # Import all of TensorFlow Serving's external dependencies. From 29f211c243f7cac1a3b5beefcc497c6aa338bd63 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 15 Oct 2021 00:02:19 -0700 Subject: [PATCH 5490/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5f2fb805-9d3b-44f9-a648-1318600769b8 PiperOrigin-RevId: 403293449 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 969d5065842..0643d9f7117 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "75066991ae149f41565bffa4e24dcb76cec72b8bfd9906aafc38498ddabfc454", - git_commit = "1690fa8e1ca8fa2bcf20d25af859b3bfda40e29d", + sha256 = "cea2c2af18ebce76013a101394c94e2ac1d85005757ab7290528962ce3775f0b", + git_commit = "cfc9d3e1ba3b50dc66f1b81eaea537772ab16024", ) # Import all of TensorFlow Serving's external dependencies. From 6169bd7d3e27d6b04ee871138815e6c150a81059 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 15 Oct 2021 06:01:41 -0700 Subject: [PATCH 5491/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ad4a7c6b-8127-42e2-893a-94cffce1bd23 PiperOrigin-RevId: 403353297 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0643d9f7117..8bb8017e406 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cea2c2af18ebce76013a101394c94e2ac1d85005757ab7290528962ce3775f0b", - git_commit = "cfc9d3e1ba3b50dc66f1b81eaea537772ab16024", + sha256 = "ea8b7ae8398aa462056220662315502b2a31ee11a80d2d10f8afeff75d8337c9", + git_commit = "f3287b863cf7aa20aa8d09fceb347963aaf81e17", ) # Import all of TensorFlow Serving's external dependencies. From a09b6e7850f47121df0b9df01e720ea2b8dde331 Mon Sep 17 00:00:00 2001 From: Sanjay Kumar Chotakur Date: Fri, 15 Oct 2021 11:45:51 -0700 Subject: [PATCH 5492/8103] Update Dockerfile.devel* with py3.7 installed. PiperOrigin-RevId: 403429336 --- tensorflow_serving/tools/docker/Dockerfile.devel | 12 ++++++------ tensorflow_serving/tools/docker/Dockerfile.devel-gpu | 12 ++++++------ tensorflow_serving/tools/docker/Dockerfile.devel-mkl | 12 ++++++------ 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index a4748a66653..5bbe2021c13 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -51,16 +51,16 @@ RUN curl -fSsL -O https://bootstrap.pypa.io/get-pip.py && \ python3 get-pip.py && \ rm get-pip.py -# Install python 3.6. +# Install python 3.7. RUN add-apt-repository ppa:deadsnakes/ppa && \ apt-get update && apt-get install -y \ - python3.6 python3.6-dev python3-pip python3.6-venv && \ + python3.7 python3.7-dev python3-pip python3.7-venv && \ rm -rf /var/lib/apt/lists/* && \ - python3.6 -m pip install pip --upgrade && \ - update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 0 + python3.7 -m pip install pip --upgrade && \ + update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 0 -# Make python3.6 the default python version -RUN update-alternatives --install /usr/bin/python python /usr/bin/python3.6 0 +# Make python3.7 the default python version +RUN update-alternatives --install /usr/bin/python python /usr/bin/python3.7 0 RUN pip3 --no-cache-dir install \ future>=0.17.1 \ diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 4dee0c68c5a..980ec38201f 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -80,16 +80,16 @@ RUN apt-get update && \ && apt-get clean \ && rm -rf /var/lib/apt/lists/*; -# Install python 3.6. +# Install python 3.7. RUN add-apt-repository ppa:deadsnakes/ppa && \ apt-get update && apt-get install -y \ - python3.6 python3.6-dev python3-pip python3.6-venv && \ + python3.7 python3.7-dev python3-pip python3.7-venv && \ rm -rf /var/lib/apt/lists/* && \ - python3.6 -m pip install pip --upgrade && \ - update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 0 + python3.7 -m pip install pip --upgrade && \ + update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 0 -# Make python3.6 the default python version -RUN update-alternatives --install /usr/bin/python python /usr/bin/python3.6 0 +# Make python3.7 the default python version +RUN update-alternatives --install /usr/bin/python python /usr/bin/python3.7 0 RUN curl -fSsL -O https://bootstrap.pypa.io/get-pip.py && \ python3 get-pip.py && \ diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl index adc3d7f4427..446ac5b95be 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl @@ -51,16 +51,16 @@ RUN curl -fSsL -O https://bootstrap.pypa.io/get-pip.py && \ python3 get-pip.py && \ rm get-pip.py -# Install python 3.6. +# Install python 3.7. RUN add-apt-repository ppa:deadsnakes/ppa && \ apt-get update && apt-get install -y \ - python3.6 python3.6-dev python3-pip python3.6-venv && \ + python3.7 python3.7-dev python3-pip python3.7-venv && \ rm -rf /var/lib/apt/lists/* && \ - python3.6 -m pip install pip --upgrade && \ - update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 0 + python3.7 -m pip install pip --upgrade && \ + update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 0 -# Make python3.6 the default python version -RUN update-alternatives --install /usr/bin/python python /usr/bin/python3.6 0 +# Make python3.7 the default python version +RUN update-alternatives --install /usr/bin/python python /usr/bin/python3.7 0 RUN pip3 --no-cache-dir install \ future>=0.17.1 \ From 416ebbb0050ac1d26b29a742e8afed979bfc4e12 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 15 Oct 2021 12:01:24 -0700 Subject: [PATCH 5493/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/23223989-adb7-418d-b374-f2221084f679 PiperOrigin-RevId: 403432853 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8bb8017e406..b0b9613ad5e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ea8b7ae8398aa462056220662315502b2a31ee11a80d2d10f8afeff75d8337c9", - git_commit = "f3287b863cf7aa20aa8d09fceb347963aaf81e17", + sha256 = "05548688765c66a1f4166ded90fa2f08d91d9ef0cd871502c0559df263ad23ee", + git_commit = "e909039ab1fe8914510791e6475596d01b2c3fed", ) # Import all of TensorFlow Serving's external dependencies. From 816c9ce940cead1f06ed9d964d537e25d22cbe1d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 15 Oct 2021 18:02:37 -0700 Subject: [PATCH 5494/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0e280b85-3466-4a36-b011-7e638cc4e193 PiperOrigin-RevId: 403509177 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b0b9613ad5e..5bcce7120c6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "05548688765c66a1f4166ded90fa2f08d91d9ef0cd871502c0559df263ad23ee", - git_commit = "e909039ab1fe8914510791e6475596d01b2c3fed", + sha256 = "9634184d7aa46b161cba84d7af8f676e6a2db84d2f0ef8b523bc1006933add32", + git_commit = "5f9afb37868ac43b9648b1f17d86ada1c85dba88", ) # Import all of TensorFlow Serving's external dependencies. From 9312845d2714863748122f3ef960a7f1a945236a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 16 Oct 2021 00:01:29 -0700 Subject: [PATCH 5495/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3731c17f-7757-4347-81be-8d593cbac241 PiperOrigin-RevId: 403552721 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5bcce7120c6..77ea62417bb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9634184d7aa46b161cba84d7af8f676e6a2db84d2f0ef8b523bc1006933add32", - git_commit = "5f9afb37868ac43b9648b1f17d86ada1c85dba88", + sha256 = "8ca9541ca7c90bec3aed4030f93cea8c1dcb4ea2187061c0f8c4f3ca91c2c52e", + git_commit = "438a53c052cbbeb395a6aafd4a0a852a640c1577", ) # Import all of TensorFlow Serving's external dependencies. From 906fea5bc3b5b5514a8abd8c8a5b6c7d8d09cce0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 16 Oct 2021 06:01:43 -0700 Subject: [PATCH 5496/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3e2e7710-2ef7-44a8-a2d5-d58fa93ef753 PiperOrigin-RevId: 403595845 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 77ea62417bb..00783facbbe 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8ca9541ca7c90bec3aed4030f93cea8c1dcb4ea2187061c0f8c4f3ca91c2c52e", - git_commit = "438a53c052cbbeb395a6aafd4a0a852a640c1577", + sha256 = "4616b4e40893c2c24074690a12030b4cd5e78a45cb6ec037643647ecdc2147d7", + git_commit = "c6999f7106cdab7aa1ad8afaaeab9f3332740777", ) # Import all of TensorFlow Serving's external dependencies. From ee83e20f3b96e789746d6158210e98a66f01545f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 16 Oct 2021 12:01:51 -0700 Subject: [PATCH 5497/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/da7eace3-f745-42ae-929d-a577c7e10f0b PiperOrigin-RevId: 403633553 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 00783facbbe..64dffccec29 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4616b4e40893c2c24074690a12030b4cd5e78a45cb6ec037643647ecdc2147d7", - git_commit = "c6999f7106cdab7aa1ad8afaaeab9f3332740777", + sha256 = "76e6bae4439796e68fdf8988ed9c2565dde6ba314d79e3320171677c30d227b2", + git_commit = "fbf3eeff1667e0107e989bae3390451da58467e0", ) # Import all of TensorFlow Serving's external dependencies. From 4cc9f05e3a99eb997d9720663609d4d29d9f035b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 16 Oct 2021 18:01:21 -0700 Subject: [PATCH 5498/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3cb198e6-afd5-4b5e-b73b-e2320bcdedf3 PiperOrigin-RevId: 403672840 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 64dffccec29..6de06ede0ce 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "76e6bae4439796e68fdf8988ed9c2565dde6ba314d79e3320171677c30d227b2", - git_commit = "fbf3eeff1667e0107e989bae3390451da58467e0", + sha256 = "518a4c6c2ceb4927d39e006b8bbdbb63885e4f2c8926320ba41c28105dafccb6", + git_commit = "6dcd6fcea73ad613e78039bd1f696c35e63abb32", ) # Import all of TensorFlow Serving's external dependencies. From b50b9a016d854ec361368f5e6627f7926765ab30 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 17 Oct 2021 00:01:44 -0700 Subject: [PATCH 5499/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/189804a7-8776-49b4-8eb6-987bbbd9fc56 PiperOrigin-RevId: 403709438 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6de06ede0ce..e58fedfaf8e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "518a4c6c2ceb4927d39e006b8bbdbb63885e4f2c8926320ba41c28105dafccb6", - git_commit = "6dcd6fcea73ad613e78039bd1f696c35e63abb32", + sha256 = "e4a6c4f2339b7e55bcea9a46cf83c737cc410bbc70d8ac0fd9a51a822d7b17db", + git_commit = "05eda75336edd16dac8b34cf89c61ed19ee6a645", ) # Import all of TensorFlow Serving's external dependencies. From b32d9cd1d44976edac754bdc562f797f1d8402de Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 17 Oct 2021 06:01:31 -0700 Subject: [PATCH 5500/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/967fcd5b-595b-4065-b301-054c8ff2546f PiperOrigin-RevId: 403749447 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e58fedfaf8e..f71fc010aff 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e4a6c4f2339b7e55bcea9a46cf83c737cc410bbc70d8ac0fd9a51a822d7b17db", - git_commit = "05eda75336edd16dac8b34cf89c61ed19ee6a645", + sha256 = "395a38a8d8b2ee51f165a69d50847961c1d23059320eff31f729bce4d4b0aaa3", + git_commit = "4e6f8988cd0bb16f732bb993072c127c1be9cb9a", ) # Import all of TensorFlow Serving's external dependencies. From 2adcfa84b82b907486ecfbf75014af89f696206a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 17 Oct 2021 12:01:56 -0700 Subject: [PATCH 5501/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ad309e12-8bb1-4297-a7f3-06283876f777 PiperOrigin-RevId: 403786809 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f71fc010aff..f2d49ac06d2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "395a38a8d8b2ee51f165a69d50847961c1d23059320eff31f729bce4d4b0aaa3", - git_commit = "4e6f8988cd0bb16f732bb993072c127c1be9cb9a", + sha256 = "1cbfe76ae6053886f29c45968ebf9f732281938c04fbf5b456522cf878a5cbf8", + git_commit = "5f8e0391b05200eb989ab618f17aa47794ba6047", ) # Import all of TensorFlow Serving's external dependencies. From 7e53992e622bee241d20e127a09fa32ff7957420 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 17 Oct 2021 18:01:52 -0700 Subject: [PATCH 5502/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b034a5de-a2ee-49ae-b41e-3104e4e9d237 PiperOrigin-RevId: 403827126 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f2d49ac06d2..7306a098e9c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1cbfe76ae6053886f29c45968ebf9f732281938c04fbf5b456522cf878a5cbf8", - git_commit = "5f8e0391b05200eb989ab618f17aa47794ba6047", + sha256 = "6eca1ff0b6dce112917c0ac5a6772fae4434dbbb510821acfcd8c534bff71f40", + git_commit = "01e79a650c07f370da320c9b2aa3a4a3641106a2", ) # Import all of TensorFlow Serving's external dependencies. From 981216ee1b5af20e249e6e6c6ba9ce481a18d329 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 18 Oct 2021 00:01:42 -0700 Subject: [PATCH 5503/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/253e3485-bb7f-4d11-9ffa-6d331c3d9463 PiperOrigin-RevId: 403871934 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7306a098e9c..dd359f28072 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6eca1ff0b6dce112917c0ac5a6772fae4434dbbb510821acfcd8c534bff71f40", - git_commit = "01e79a650c07f370da320c9b2aa3a4a3641106a2", + sha256 = "41ebd3965882818edb8446a269ce6f43b699f10cfd811cc3bf4d03006c2a53f5", + git_commit = "67cd900e19d430793f9e2df4d95d8fad95a3cd02", ) # Import all of TensorFlow Serving's external dependencies. From ea499842d614fb73587fcec438ee9e3855be6cad Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 18 Oct 2021 06:02:08 -0700 Subject: [PATCH 5504/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b807edf3-a0c3-494c-8a07-5d2d46e4692b PiperOrigin-RevId: 403935416 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dd359f28072..cdcfeec7cd6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "41ebd3965882818edb8446a269ce6f43b699f10cfd811cc3bf4d03006c2a53f5", - git_commit = "67cd900e19d430793f9e2df4d95d8fad95a3cd02", + sha256 = "5de91ee4b90ddac29e8e06c41740ab248c83e893b476f79a5b2916ab86ae1f66", + git_commit = "11c73c83a7371e33e606ea320d97426c541869e1", ) # Import all of TensorFlow Serving's external dependencies. From 9de707d82ded63fd37d1c70072f4985cb91c76e0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 18 Oct 2021 12:02:42 -0700 Subject: [PATCH 5505/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b760fc17-b4b5-491d-b695-473d5ea11a19 PiperOrigin-RevId: 404022585 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cdcfeec7cd6..cb3d17f3b0e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5de91ee4b90ddac29e8e06c41740ab248c83e893b476f79a5b2916ab86ae1f66", - git_commit = "11c73c83a7371e33e606ea320d97426c541869e1", + sha256 = "6bd78623cbee1b24786ebf03194584dffb187f6b208b3c1ad5e406c9a5083bdf", + git_commit = "3e6220ab7ed00ca217bc01740343d75a3b44eff0", ) # Import all of TensorFlow Serving's external dependencies. From 916b252d6fba3e1143c6ab6f98d9f37d6e8d4088 Mon Sep 17 00:00:00 2001 From: Haiming Bao Date: Mon, 18 Oct 2021 12:55:22 -0700 Subject: [PATCH 5506/8103] Internal changes. PiperOrigin-RevId: 404036264 --- .../model_servers/tensorflow_model_server_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/model_servers/tensorflow_model_server_test.py b/tensorflow_serving/model_servers/tensorflow_model_server_test.py index a2fcbaeb5a2..4c2195fa5b3 100644 --- a/tensorflow_serving/model_servers/tensorflow_model_server_test.py +++ b/tensorflow_serving/model_servers/tensorflow_model_server_test.py @@ -751,7 +751,7 @@ def test_profiler_service_with_valid_trace_request(self): logdir = os.path.join(self.temp_dir, 'logs') worker_list = '' duration_ms = 1000 - num_tracing_attempts = 3 + num_tracing_attempts = 10 os.makedirs(logdir) # Send a tracing request From d18baf6580ec2e0a479e642088dc8fd317aa8833 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 18 Oct 2021 18:01:23 -0700 Subject: [PATCH 5507/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/526c63af-bee8-4612-b399-369b1cc72ed3 PiperOrigin-RevId: 404113467 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cb3d17f3b0e..df5cb052efa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6bd78623cbee1b24786ebf03194584dffb187f6b208b3c1ad5e406c9a5083bdf", - git_commit = "3e6220ab7ed00ca217bc01740343d75a3b44eff0", + sha256 = "ff859abb11a597727b0b136844647f511ba87c99d95c91633e5c36fba769b86b", + git_commit = "713f19273c21b973e00ade908e345b8710d4aa33", ) # Import all of TensorFlow Serving's external dependencies. From f0624575f5f6d46dc43d46bab38fecd38b0e5b12 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 19 Oct 2021 00:01:41 -0700 Subject: [PATCH 5508/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a13c67b0-3c0c-4047-a649-6494dc84c32c PiperOrigin-RevId: 404170072 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index df5cb052efa..64a75187d26 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ff859abb11a597727b0b136844647f511ba87c99d95c91633e5c36fba769b86b", - git_commit = "713f19273c21b973e00ade908e345b8710d4aa33", + sha256 = "586fb946580a0fba063db52a57e494d584a021975150066a9d55d2d95747005a", + git_commit = "0376d9a71af773ef28550f313a29a268f33c310a", ) # Import all of TensorFlow Serving's external dependencies. From 5a05cd908e33f939a1da4362b631b88708181a1d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 19 Oct 2021 06:01:42 -0700 Subject: [PATCH 5509/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/783c8098-2ab3-49d8-b7e1-1108d9be543e PiperOrigin-RevId: 404235539 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 64a75187d26..5d0d08ae1bf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "586fb946580a0fba063db52a57e494d584a021975150066a9d55d2d95747005a", - git_commit = "0376d9a71af773ef28550f313a29a268f33c310a", + sha256 = "09ff5cf7b63a240f99eed925926749e2c4485200bf5d80c932e087dac2a2aba6", + git_commit = "f75289459cb28adcce26885a2b092951923f23dc", ) # Import all of TensorFlow Serving's external dependencies. From e765a2aed5f2cafd74a50f2a06ba70d46af7a706 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 19 Oct 2021 12:01:45 -0700 Subject: [PATCH 5510/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7e3e25f7-35de-4683-9314-dc5cca4527cc PiperOrigin-RevId: 404328206 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5d0d08ae1bf..ed611531ca1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "09ff5cf7b63a240f99eed925926749e2c4485200bf5d80c932e087dac2a2aba6", - git_commit = "f75289459cb28adcce26885a2b092951923f23dc", + sha256 = "f7fd16beb51ba116ba0fc65b45ffae8040b4f6b95ba962ae890db53ba5bef526", + git_commit = "027d84bb55be8e1370c7277d18fdc2630e28939b", ) # Import all of TensorFlow Serving's external dependencies. From 962162dfd8700717508b1e749922be97ec4e60ec Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 19 Oct 2021 18:01:34 -0700 Subject: [PATCH 5511/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/39cc1510-df50-40a1-8327-d5378cd6fd37 PiperOrigin-RevId: 404409764 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ed611531ca1..1afcb212a6d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f7fd16beb51ba116ba0fc65b45ffae8040b4f6b95ba962ae890db53ba5bef526", - git_commit = "027d84bb55be8e1370c7277d18fdc2630e28939b", + sha256 = "e1efe24031936b7908b28056d150d8198563817eeaa09524f9dd6f0f7adae0a8", + git_commit = "d61fba448b59afe79a5a7ba7c9d18540e3954df2", ) # Import all of TensorFlow Serving's external dependencies. From 818baa73004309f14364b51d3d3eaca6ed19ce9f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Oct 2021 00:01:42 -0700 Subject: [PATCH 5512/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/47e9e0e3-a44e-4080-ad38-517e7af21573 PiperOrigin-RevId: 404453598 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1afcb212a6d..588a2c764e4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e1efe24031936b7908b28056d150d8198563817eeaa09524f9dd6f0f7adae0a8", - git_commit = "d61fba448b59afe79a5a7ba7c9d18540e3954df2", + sha256 = "606b7f93e61ea1950f8dcbeb1b203b30dd2e577019d253370ae88b50df4e0817", + git_commit = "d921175cb96f9c41a57ea624464efb477e6c25a4", ) # Import all of TensorFlow Serving's external dependencies. From 148833a3a6329834cf3131dd476341588abc37f6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Oct 2021 06:01:37 -0700 Subject: [PATCH 5513/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ac748579-1698-47b6-a2e5-559ff70f4e30 PiperOrigin-RevId: 404506236 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 588a2c764e4..26ae0d142ac 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "606b7f93e61ea1950f8dcbeb1b203b30dd2e577019d253370ae88b50df4e0817", - git_commit = "d921175cb96f9c41a57ea624464efb477e6c25a4", + sha256 = "963e2acdb6f2ba6c05f1425acdf1c3d9830bd0e9f8d65a1c3833ea2d4e1a039b", + git_commit = "53b185e731bd92d762bc6bd0cac0a57402bbc54a", ) # Import all of TensorFlow Serving's external dependencies. From 9ef2e055429cd23f9d73bc5f41414a3d4d3255e3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Oct 2021 12:01:53 -0700 Subject: [PATCH 5514/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/64f21427-febf-458b-8e96-1d881eedaeb7 PiperOrigin-RevId: 404606959 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 26ae0d142ac..e9f16009e75 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "963e2acdb6f2ba6c05f1425acdf1c3d9830bd0e9f8d65a1c3833ea2d4e1a039b", - git_commit = "53b185e731bd92d762bc6bd0cac0a57402bbc54a", + sha256 = "1a25aac5f9c906b07a7a63b31c4d251ba21c67418b085eaf7fb702380a530509", + git_commit = "98edf60ccce1b06279290b3eff1239c89022bc19", ) # Import all of TensorFlow Serving's external dependencies. From 3e05381ee0fe790b368072e0148b35ed21d8a995 Mon Sep 17 00:00:00 2001 From: Li Lao Date: Wed, 20 Oct 2021 12:07:36 -0700 Subject: [PATCH 5515/8103] Remove unused "using" declarations. PiperOrigin-RevId: 404608366 --- tensorflow_serving/model_servers/http_rest_api_handler.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/tensorflow_serving/model_servers/http_rest_api_handler.cc b/tensorflow_serving/model_servers/http_rest_api_handler.cc index 277ff10e574..68f6dc1123f 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler.cc +++ b/tensorflow_serving/model_servers/http_rest_api_handler.cc @@ -46,8 +46,6 @@ limitations under the License. namespace tensorflow { namespace serving { -using protobuf::util::JsonPrintOptions; -using protobuf::util::MessageToJsonString; using tensorflow::serving::ServerCore; using tensorflow::serving::TensorflowPredictor; From e481f6a9d5ca471a544ae3675c2fe2c01d21c3ef Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Oct 2021 18:01:20 -0700 Subject: [PATCH 5516/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3b85ee20-988f-4a38-8c9e-04c3426bbd00 PiperOrigin-RevId: 404680943 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e9f16009e75..c9e033547ae 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1a25aac5f9c906b07a7a63b31c4d251ba21c67418b085eaf7fb702380a530509", - git_commit = "98edf60ccce1b06279290b3eff1239c89022bc19", + sha256 = "2cf42dcd4e78f972288280bea29805d5e9c0ec390d5574a828492bc93cae2dec", + git_commit = "b84cc9a4abd7d087653b430d26579d2d1fe3c6e9", ) # Import all of TensorFlow Serving's external dependencies. From ca1fa5d6d94dfb7f320d198e5bf60d6f3532ce02 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Oct 2021 00:02:24 -0700 Subject: [PATCH 5517/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/97a515c1-a843-46ce-a5be-8fd794fcc58c PiperOrigin-RevId: 404725707 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c9e033547ae..b90956b8471 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2cf42dcd4e78f972288280bea29805d5e9c0ec390d5574a828492bc93cae2dec", - git_commit = "b84cc9a4abd7d087653b430d26579d2d1fe3c6e9", + sha256 = "cb7cc75a66f08d49ea0addb364692c53116e29c3e0157bfbb93ac76b421becd0", + git_commit = "6953454802fbe4f5fdb5cd580443eb11e01a8e43", ) # Import all of TensorFlow Serving's external dependencies. From dc0e1c910df5d880858baa1dfc5cbe10f2d5346e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Oct 2021 06:01:53 -0700 Subject: [PATCH 5518/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9cb58290-5573-4915-a475-92d0b0faea16 PiperOrigin-RevId: 404775840 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b90956b8471..e2213a0fc64 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cb7cc75a66f08d49ea0addb364692c53116e29c3e0157bfbb93ac76b421becd0", - git_commit = "6953454802fbe4f5fdb5cd580443eb11e01a8e43", + sha256 = "a60497c3d5249978b278abd05b7b6a3b366cc9f8735d380b3e0eaa5e9f46952c", + git_commit = "8a293963c1b56461a6a94e2957f058e6b43e8ff3", ) # Import all of TensorFlow Serving's external dependencies. From ef610eb1bb1dc67d06f5867c77d04efe81c25fb1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Oct 2021 12:01:38 -0700 Subject: [PATCH 5519/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/02162ed7-6651-424d-b5f0-2ca8f76d0286 PiperOrigin-RevId: 404848462 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e2213a0fc64..50794921f2f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a60497c3d5249978b278abd05b7b6a3b366cc9f8735d380b3e0eaa5e9f46952c", - git_commit = "8a293963c1b56461a6a94e2957f058e6b43e8ff3", + sha256 = "18c50b095db8542e1349a4542962c9f535420e49669789b006f0192b909a65ad", + git_commit = "b2cb0840f233a029d70f984e6a164be3d88087f5", ) # Import all of TensorFlow Serving's external dependencies. From 02879db73c36d8d315c16d8f8d578de645925d16 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Oct 2021 18:04:20 -0700 Subject: [PATCH 5520/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/640b8427-879a-41bf-bc31-f0f5eb3aab2f PiperOrigin-RevId: 404920936 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 50794921f2f..f13390927b1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "18c50b095db8542e1349a4542962c9f535420e49669789b006f0192b909a65ad", - git_commit = "b2cb0840f233a029d70f984e6a164be3d88087f5", + sha256 = "caefb142cf4d3f508ddb71f0285adf0052465f1e6ff7fb5f04b5cd0c39d25d6d", + git_commit = "459af377812bb16fb6c4dc5a6dff8804c0dd071f", ) # Import all of TensorFlow Serving's external dependencies. From a73ee767d2f5e3e922aba2de25a9462f78b6c82e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Oct 2021 00:01:42 -0700 Subject: [PATCH 5521/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/39a2a319-195f-4bcb-b28f-fbc7f6d61b32 PiperOrigin-RevId: 404959222 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f13390927b1..ab94cdf1526 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "caefb142cf4d3f508ddb71f0285adf0052465f1e6ff7fb5f04b5cd0c39d25d6d", - git_commit = "459af377812bb16fb6c4dc5a6dff8804c0dd071f", + sha256 = "a1b4e6ccac3b089a91fefa9e78ec1be728e8af51f957d2edc7514ad70fa7c97d", + git_commit = "89428690d177fb2577359e682687f4022a89ec23", ) # Import all of TensorFlow Serving's external dependencies. From e12d549ebcc98609e7c3dc53b6a8c102af7b3f8f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Oct 2021 06:01:46 -0700 Subject: [PATCH 5522/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/94c39457-b3d3-458d-be8a-5758a03e6840 PiperOrigin-RevId: 404997568 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ab94cdf1526..5474eb158b3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a1b4e6ccac3b089a91fefa9e78ec1be728e8af51f957d2edc7514ad70fa7c97d", - git_commit = "89428690d177fb2577359e682687f4022a89ec23", + sha256 = "0d4bab9e19d34f45eef653dc096ee0761ae803aefed35685bcb7b6fb55e92da7", + git_commit = "84e88ea291a057752523697dec9347f8d2a6e9a9", ) # Import all of TensorFlow Serving's external dependencies. From fac0fdf67bf6bb94feb5fb187bab2a81d58b9177 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Oct 2021 12:01:24 -0700 Subject: [PATCH 5523/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/34c157bf-fb62-48c4-b100-1bb7f6f3c74c PiperOrigin-RevId: 405033097 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5474eb158b3..01d70ad46fc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0d4bab9e19d34f45eef653dc096ee0761ae803aefed35685bcb7b6fb55e92da7", - git_commit = "84e88ea291a057752523697dec9347f8d2a6e9a9", + sha256 = "e7425ce520d9b4eb0a75e7a2e78f8f03a43278f909b59f2880ca4a3a53c79203", + git_commit = "ca5f2060a9453d46c2c9100a9e284633d66a8447", ) # Import all of TensorFlow Serving's external dependencies. From e4ae4cb90baa9c820f9e7f7be297714a19d5e684 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Oct 2021 18:01:40 -0700 Subject: [PATCH 5524/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e8854449-7740-4716-8ae7-9619b011cc7c PiperOrigin-RevId: 405066116 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 01d70ad46fc..fe9ea020e93 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e7425ce520d9b4eb0a75e7a2e78f8f03a43278f909b59f2880ca4a3a53c79203", - git_commit = "ca5f2060a9453d46c2c9100a9e284633d66a8447", + sha256 = "9e081130aa6a1192bc255b76c035b76d82703e8f1a4d043ecb0bf4610a411416", + git_commit = "77eefd8bf0ef63b6c55235cfb393102e644e2802", ) # Import all of TensorFlow Serving's external dependencies. From 7745896a371cef57ea72fa5cf3cd0d9e62c5c18a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 23 Oct 2021 00:01:49 -0700 Subject: [PATCH 5525/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2cdb062d-321b-488c-a6f1-62c9a5eac0d1 PiperOrigin-RevId: 405094862 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fe9ea020e93..fd766f63dc5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9e081130aa6a1192bc255b76c035b76d82703e8f1a4d043ecb0bf4610a411416", - git_commit = "77eefd8bf0ef63b6c55235cfb393102e644e2802", + sha256 = "91cfcb46660e5856ffdb6d8f04dab114c2d4392dec7f57698d40cf8175b360cb", + git_commit = "7b6a2312b1d5e8922c8ca55211effc88e8030c69", ) # Import all of TensorFlow Serving's external dependencies. From 97a5dc0f2337fd991ef4724ea39a330b192f7661 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 23 Oct 2021 06:01:31 -0700 Subject: [PATCH 5526/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/411e98dd-4283-40ae-99c4-48d0748bbba3 PiperOrigin-RevId: 405124974 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fd766f63dc5..65c9b3ded66 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "91cfcb46660e5856ffdb6d8f04dab114c2d4392dec7f57698d40cf8175b360cb", - git_commit = "7b6a2312b1d5e8922c8ca55211effc88e8030c69", + sha256 = "4a159785d72aedf49eb4b5308e18ab4f48b8fa9f079693b04e687bcf4103a231", + git_commit = "62985cffee559c961c580af6ed43b7c69e2fb381", ) # Import all of TensorFlow Serving's external dependencies. From f1608d6ac141b7cd61e51d97b3e6fb12f8ec183a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 23 Oct 2021 12:01:43 -0700 Subject: [PATCH 5527/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/17a9023f-e4cd-40b0-8501-c16c9865ebf6 PiperOrigin-RevId: 405151273 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 65c9b3ded66..8907b962d30 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4a159785d72aedf49eb4b5308e18ab4f48b8fa9f079693b04e687bcf4103a231", - git_commit = "62985cffee559c961c580af6ed43b7c69e2fb381", + sha256 = "a57789cec2bc9bbd083c7403153c4d77c855147801246eb09200c857890da5a8", + git_commit = "06973b639710e6999110480b60453756f70aedfe", ) # Import all of TensorFlow Serving's external dependencies. From 57f2682108de66134a6c7b84bea68a759ba43ce9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 24 Oct 2021 00:01:21 -0700 Subject: [PATCH 5528/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d697f87e-296d-448e-b105-42b1968c74d3 PiperOrigin-RevId: 405206165 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8907b962d30..dff4400dccd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a57789cec2bc9bbd083c7403153c4d77c855147801246eb09200c857890da5a8", - git_commit = "06973b639710e6999110480b60453756f70aedfe", + sha256 = "16ec95dc888a0abb3ff55f9953669c0c56ec4537ee45934a41f98a56f2d5b6da", + git_commit = "f43786d256a68af943006ef01b29d12bcf417ca2", ) # Import all of TensorFlow Serving's external dependencies. From a26de1d30d827dfd01d92b36636d9f0d6c3e531c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 24 Oct 2021 06:01:56 -0700 Subject: [PATCH 5529/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0e9134ba-eabe-47d2-8e87-bb0a099cdc40 PiperOrigin-RevId: 405237330 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dff4400dccd..592bdf05f80 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "16ec95dc888a0abb3ff55f9953669c0c56ec4537ee45934a41f98a56f2d5b6da", - git_commit = "f43786d256a68af943006ef01b29d12bcf417ca2", + sha256 = "580ca77bfba73225508fd339582069bc6e47ec51f021fea01818a89a0f3cc05e", + git_commit = "afc4874b06eea2698824699487e8d2d03ee26573", ) # Import all of TensorFlow Serving's external dependencies. From aae191df654e2030701140d856784994154f46d4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 24 Oct 2021 12:01:36 -0700 Subject: [PATCH 5530/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/85a55d5d-950c-4c3e-8dd3-f9ceadb6eb15 PiperOrigin-RevId: 405264773 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 592bdf05f80..507f6153db2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "580ca77bfba73225508fd339582069bc6e47ec51f021fea01818a89a0f3cc05e", - git_commit = "afc4874b06eea2698824699487e8d2d03ee26573", + sha256 = "6e2805e198781c1234782e7f7b15172bd71f5877af85d7ee7fa97d07ec186c39", + git_commit = "0f5cc885fba41105ff8b79fdb843dc16f92b3816", ) # Import all of TensorFlow Serving's external dependencies. From 09876cb2a3f30635afd7bb297e5ad6bdd97503b2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 24 Oct 2021 18:01:54 -0700 Subject: [PATCH 5531/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/187a777e-a38a-4132-9b25-68f2183602c2 PiperOrigin-RevId: 405293478 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 507f6153db2..ccb654a0271 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6e2805e198781c1234782e7f7b15172bd71f5877af85d7ee7fa97d07ec186c39", - git_commit = "0f5cc885fba41105ff8b79fdb843dc16f92b3816", + sha256 = "c402a4c6093581964a85e79907882fe00d345d9d568529e7dbf407c9fa660712", + git_commit = "316726a03e6504fe76ad1d509439621df8a83a38", ) # Import all of TensorFlow Serving's external dependencies. From 9808dab82c4d2d6d2337dbde23826384f54fc9be Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Oct 2021 00:02:09 -0700 Subject: [PATCH 5532/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/aeab0266-4e58-4194-a0ab-715f80dae1a4 PiperOrigin-RevId: 405328465 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ccb654a0271..46b621897f0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c402a4c6093581964a85e79907882fe00d345d9d568529e7dbf407c9fa660712", - git_commit = "316726a03e6504fe76ad1d509439621df8a83a38", + sha256 = "1366ba513bb67b820a4b8e38a994f681628cd7c3bde6ead1a14e39e5a48c22ea", + git_commit = "f8d1a9845ab496c6a2ac460c0d7c6139c570c616", ) # Import all of TensorFlow Serving's external dependencies. From b714dccfabd18254be74568973f0160eb7bb36ed Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Oct 2021 06:01:33 -0700 Subject: [PATCH 5533/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/14b8e316-cd0f-471b-a739-39e915cf1bc4 PiperOrigin-RevId: 405380124 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 46b621897f0..151199cd132 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1366ba513bb67b820a4b8e38a994f681628cd7c3bde6ead1a14e39e5a48c22ea", - git_commit = "f8d1a9845ab496c6a2ac460c0d7c6139c570c616", + sha256 = "bef711df7f8efdefeb388680da700e2bdbc12c43982e3476b3fce31f1d5ac785", + git_commit = "94bc26a5f71ad14f2390def5a6ecead451f7c9bc", ) # Import all of TensorFlow Serving's external dependencies. From a175bb39b40294fa31335965ebf465d3fadf956f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Oct 2021 12:01:32 -0700 Subject: [PATCH 5534/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/35d7427d-60b9-4f74-99f2-dea3dd3887a1 PiperOrigin-RevId: 405458097 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 151199cd132..00f07a73249 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bef711df7f8efdefeb388680da700e2bdbc12c43982e3476b3fce31f1d5ac785", - git_commit = "94bc26a5f71ad14f2390def5a6ecead451f7c9bc", + sha256 = "1f79f598e972ead7b2e7d5b6e5c8f960597c1cd27df7ee617dd089b6ce560fef", + git_commit = "f91d17e74e4d31d64eaea5254df5058ea2f75593", ) # Import all of TensorFlow Serving's external dependencies. From ef1b13f2768f9c57692fa6f7e900cf20c532f63e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Oct 2021 18:02:24 -0700 Subject: [PATCH 5535/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6f66f162-19f9-491a-870e-fda6b51c4e8b PiperOrigin-RevId: 405533432 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 00f07a73249..d2116dac683 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1f79f598e972ead7b2e7d5b6e5c8f960597c1cd27df7ee617dd089b6ce560fef", - git_commit = "f91d17e74e4d31d64eaea5254df5058ea2f75593", + sha256 = "85476923bc186c7ff7b3c17a11f2c654eac7efab056e93edfa50ded1c8f10400", + git_commit = "973629dac50fcdc82ef15f9d4638119db529ab56", ) # Import all of TensorFlow Serving's external dependencies. From d3423eeb6fcdb8977d9a75957df07aa5f9be2bb6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Oct 2021 00:02:31 -0700 Subject: [PATCH 5536/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/76f44356-98a2-4f47-906e-7465947aacee PiperOrigin-RevId: 405577521 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d2116dac683..7cc5eb1dfb0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "85476923bc186c7ff7b3c17a11f2c654eac7efab056e93edfa50ded1c8f10400", - git_commit = "973629dac50fcdc82ef15f9d4638119db529ab56", + sha256 = "dbb0b85ec615331342a753fed6a07649ed82092004d68d4544c3eeeb6448e74d", + git_commit = "689dfd60b7d85eb0adb288d1e2bb5dc575d84229", ) # Import all of TensorFlow Serving's external dependencies. From d400a19ff77bb3435531d5c7afcd604fa4170e84 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Oct 2021 06:02:15 -0700 Subject: [PATCH 5537/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/147b4cb4-feb0-4b8a-b7ff-b48f61aed157 PiperOrigin-RevId: 405628177 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7cc5eb1dfb0..98897df756e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dbb0b85ec615331342a753fed6a07649ed82092004d68d4544c3eeeb6448e74d", - git_commit = "689dfd60b7d85eb0adb288d1e2bb5dc575d84229", + sha256 = "11c912783d300d455620724bfdbc324561e1408677fa3a8d0651bb376b4663e1", + git_commit = "04c758224ffaf85cf9f261c71feab723ca4875d3", ) # Import all of TensorFlow Serving's external dependencies. From 7de2cc1d0e48df901c7d9c9cfe868215ca6b62aa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Oct 2021 12:03:49 -0700 Subject: [PATCH 5538/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f2dc22b8-ea14-487d-a741-287047432c6e PiperOrigin-RevId: 405702415 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 98897df756e..2f34142fe28 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "11c912783d300d455620724bfdbc324561e1408677fa3a8d0651bb376b4663e1", - git_commit = "04c758224ffaf85cf9f261c71feab723ca4875d3", + sha256 = "e27e8e76d8c8083c6740b9207a6271639dbefb58810c594ac87ed03cd24b44b1", + git_commit = "126134f003a15ea00723de98092a99ffe7b57d19", ) # Import all of TensorFlow Serving's external dependencies. From 60d5766468c6087e2f7844a50f449f828e2f0c58 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Oct 2021 18:01:37 -0700 Subject: [PATCH 5539/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/54c90a5f-2995-49c8-8438-775ba3339ebd PiperOrigin-RevId: 405778415 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2f34142fe28..58366287e85 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e27e8e76d8c8083c6740b9207a6271639dbefb58810c594ac87ed03cd24b44b1", - git_commit = "126134f003a15ea00723de98092a99ffe7b57d19", + sha256 = "0cadf34f1c845ee604befc4a58d7b0105b691bbcbe5c41f54bfdbc57f0100904", + git_commit = "6ae3ff6b63f449f19dfa8e0baf1ffec38227ade9", ) # Import all of TensorFlow Serving's external dependencies. From d680fea20ced32ff310e295c433ab809632e9283 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Oct 2021 00:01:34 -0700 Subject: [PATCH 5540/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7c1ecbc5-6560-4403-89ef-0f635418417f PiperOrigin-RevId: 405822894 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 58366287e85..1e5e5c83190 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0cadf34f1c845ee604befc4a58d7b0105b691bbcbe5c41f54bfdbc57f0100904", - git_commit = "6ae3ff6b63f449f19dfa8e0baf1ffec38227ade9", + sha256 = "abfc81a93fb7e29a8a056d456a340e24081a5371ce98b9e7afc9837f93924966", + git_commit = "e6766749606c92a2a15911a8fe12489883843bd2", ) # Import all of TensorFlow Serving's external dependencies. From b3252c4f7dd6f7746880ef631f2ccad7487d4967 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Oct 2021 06:01:29 -0700 Subject: [PATCH 5541/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/dd276574-488e-4c9b-ab70-964b756e3581 PiperOrigin-RevId: 405871913 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1e5e5c83190..7455cda7548 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "abfc81a93fb7e29a8a056d456a340e24081a5371ce98b9e7afc9837f93924966", - git_commit = "e6766749606c92a2a15911a8fe12489883843bd2", + sha256 = "770c121a5301464a9a3b426f5e07de881ba8a694c147b8f87ec89dcb4d766f47", + git_commit = "7facf1cbb7eadf5b8498e9e8d0bda7f768009baf", ) # Import all of TensorFlow Serving's external dependencies. From 843e91669a07cceb15f5942a094d47b9c13fbeef Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Oct 2021 12:01:37 -0700 Subject: [PATCH 5542/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/964a078b-e7ee-4fb5-a730-8da4054f68cd PiperOrigin-RevId: 405944612 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7455cda7548..8f5fd5f37a2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "770c121a5301464a9a3b426f5e07de881ba8a694c147b8f87ec89dcb4d766f47", - git_commit = "7facf1cbb7eadf5b8498e9e8d0bda7f768009baf", + sha256 = "5cf6f56d1490bb84de1a79ea5a36606afa9cab247e2bb3351ba47713d21d276e", + git_commit = "bfb011d11b035ad30bfbd22cad7871e6da9ef2fe", ) # Import all of TensorFlow Serving's external dependencies. From 2f2f9afc6415fe29df6a0e0318d68d425c47cf69 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Oct 2021 18:01:40 -0700 Subject: [PATCH 5543/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6723b098-065f-4111-a5c4-2f7946229d8a PiperOrigin-RevId: 406024474 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8f5fd5f37a2..4f602bf2076 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5cf6f56d1490bb84de1a79ea5a36606afa9cab247e2bb3351ba47713d21d276e", - git_commit = "bfb011d11b035ad30bfbd22cad7871e6da9ef2fe", + sha256 = "a78835c472971cf175fbf9f6833062b1d31040e40b9a1e4f3ed6664a499d1bec", + git_commit = "b618120a7f0dccad050fa2161623b11ea0c747ef", ) # Import all of TensorFlow Serving's external dependencies. From eda408bb589fc495175d05e8b1577a227afe685d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Oct 2021 00:01:34 -0700 Subject: [PATCH 5544/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/32454bce-e778-45e6-a54c-c0ae675b60a4 PiperOrigin-RevId: 406069249 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4f602bf2076..7ffd14d9f78 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a78835c472971cf175fbf9f6833062b1d31040e40b9a1e4f3ed6664a499d1bec", - git_commit = "b618120a7f0dccad050fa2161623b11ea0c747ef", + sha256 = "4b8c9946ce9429247934ee0cb5e94ac8f15ec8d4e19a4eff3a447d3f1e4a31c9", + git_commit = "9fac0fac7d25a6c698d7336a08f25e450df7f7bf", ) # Import all of TensorFlow Serving's external dependencies. From a1297cb26af92a9a190a9f66215e136427eafde0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Oct 2021 06:02:56 -0700 Subject: [PATCH 5545/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3d4f0c5f-be59-4ab3-a923-77b15511c661 PiperOrigin-RevId: 406120414 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7ffd14d9f78..6b45ff5fead 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4b8c9946ce9429247934ee0cb5e94ac8f15ec8d4e19a4eff3a447d3f1e4a31c9", - git_commit = "9fac0fac7d25a6c698d7336a08f25e450df7f7bf", + sha256 = "28ac92d56a27863233cd82cbe8ea2e0b02173012d2b819992ee970753d493cb1", + git_commit = "b44241094f5bb447a8752c8ebc3eda3b190d52aa", ) # Import all of TensorFlow Serving's external dependencies. From 74a97a357f7032b78bac89df11371a3c36a856e0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Oct 2021 12:01:45 -0700 Subject: [PATCH 5546/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e464af6d-dc27-4621-8a40-5cc2f26ae057 PiperOrigin-RevId: 406190372 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6b45ff5fead..9921a2f447b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "28ac92d56a27863233cd82cbe8ea2e0b02173012d2b819992ee970753d493cb1", - git_commit = "b44241094f5bb447a8752c8ebc3eda3b190d52aa", + sha256 = "56560cc12917d9a5fb35ebf15aa39f8b5581eac706a2a780cb732daed008562e", + git_commit = "674b2924bc8b609843fc44f3b1e84891c1dca929", ) # Import all of TensorFlow Serving's external dependencies. From 10333f97c38c51ddaa57abfdd0839be49d1e4d18 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Oct 2021 18:01:23 -0700 Subject: [PATCH 5547/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/27e36ea8-525e-48d0-a9c7-c99216c60f44 PiperOrigin-RevId: 406259673 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9921a2f447b..0d8a291f1d9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "56560cc12917d9a5fb35ebf15aa39f8b5581eac706a2a780cb732daed008562e", - git_commit = "674b2924bc8b609843fc44f3b1e84891c1dca929", + sha256 = "da557722cb3c990ed48bbaecdd3a4446bace7bd936c1b4ece80dc2a2b6c615c0", + git_commit = "8d11ceab3427563df873da57dcddf4fc0325ba93", ) # Import all of TensorFlow Serving's external dependencies. From c8696756cf24e5328a558f58714cbfdc8de6d07e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 29 Oct 2021 00:01:41 -0700 Subject: [PATCH 5548/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a48ae40b-6a1d-449e-b6f1-6bdebf32935b PiperOrigin-RevId: 406298666 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0d8a291f1d9..75c9045e561 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "da557722cb3c990ed48bbaecdd3a4446bace7bd936c1b4ece80dc2a2b6c615c0", - git_commit = "8d11ceab3427563df873da57dcddf4fc0325ba93", + sha256 = "8f7d773c3232c4a30a0dae80cb7e375a3b8a5c770957c60e37725735f3f8cedf", + git_commit = "8010bfd541bb460ac339af0d666d024d69e4e504", ) # Import all of TensorFlow Serving's external dependencies. From 838937bcee0e5b4a15f462ee3f04a60e87e093f6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 29 Oct 2021 06:02:01 -0700 Subject: [PATCH 5549/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6ed8da45-963b-4df1-b65f-d3a0b27d87fb PiperOrigin-RevId: 406341934 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 75c9045e561..cf7da6c9f40 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8f7d773c3232c4a30a0dae80cb7e375a3b8a5c770957c60e37725735f3f8cedf", - git_commit = "8010bfd541bb460ac339af0d666d024d69e4e504", + sha256 = "dc675a7ec17f41cbe8c275b5f8ed62512a28f297192e010cfbf531818e54020a", + git_commit = "a2ab010ad265cc3fcb9b052482c7f094b07922ba", ) # Import all of TensorFlow Serving's external dependencies. From ef108eac3692935675bfefc65a025c0bfcab5947 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 29 Oct 2021 12:01:40 -0700 Subject: [PATCH 5550/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7f0991ca-ec54-46d9-802f-0851e0208209 PiperOrigin-RevId: 406411282 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cf7da6c9f40..1024bc18b81 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dc675a7ec17f41cbe8c275b5f8ed62512a28f297192e010cfbf531818e54020a", - git_commit = "a2ab010ad265cc3fcb9b052482c7f094b07922ba", + sha256 = "264f38ca8bdbaa68af4f703a46f81f786bd9d315dea48ec05de422ab6eb54eb7", + git_commit = "e4181e823e50ccd7436d93a23e39bb47e64e8c13", ) # Import all of TensorFlow Serving's external dependencies. From 3ef85964abb5c90e647c0bf27cac41a1c9ae067c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 29 Oct 2021 18:11:29 -0700 Subject: [PATCH 5551/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/29a98b0e-9d10-4c06-b64a-8dc6f0465329 PiperOrigin-RevId: 406492137 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1024bc18b81..66991c0f9db 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "264f38ca8bdbaa68af4f703a46f81f786bd9d315dea48ec05de422ab6eb54eb7", - git_commit = "e4181e823e50ccd7436d93a23e39bb47e64e8c13", + sha256 = "58784040b9a9bc884ec6c1a7632a4bd3b3b9ad84efdcc154c03a89bb45f56421", + git_commit = "8e8f8b6fb60390709136884b155297633c2a50b3", ) # Import all of TensorFlow Serving's external dependencies. From 7cd56e329dbd3a94e5776fad6f53cfae98be6389 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 30 Oct 2021 00:01:47 -0700 Subject: [PATCH 5552/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6ca892f2-8e40-495c-a895-316c6262ba4c PiperOrigin-RevId: 406524426 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 66991c0f9db..93d35888041 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "58784040b9a9bc884ec6c1a7632a4bd3b3b9ad84efdcc154c03a89bb45f56421", - git_commit = "8e8f8b6fb60390709136884b155297633c2a50b3", + sha256 = "2d2b2c5db671d435a2bac283c3ba340335dcf8fb7a3286018dbc4edbd7c885cd", + git_commit = "3b4c14b9a73a51bd9e100f9954a1676176b2af2d", ) # Import all of TensorFlow Serving's external dependencies. From 2ee436af1b92ba313eca616cb9faf5420f3b0d40 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 30 Oct 2021 06:01:23 -0700 Subject: [PATCH 5553/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bf6e224d-f42e-4f33-980b-710c9c36d35e PiperOrigin-RevId: 406556809 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 93d35888041..b923794f9f9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2d2b2c5db671d435a2bac283c3ba340335dcf8fb7a3286018dbc4edbd7c885cd", - git_commit = "3b4c14b9a73a51bd9e100f9954a1676176b2af2d", + sha256 = "c5dd68d97ed799f9a4266de9bff28aaf7d2ce13c728d4d7fee93d907e0aa73fa", + git_commit = "7367d842cfd77aae148ddc947e129ac19a6e8551", ) # Import all of TensorFlow Serving's external dependencies. From de63f3e1e6fddf409ec312e9b373b580462d1d47 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 30 Oct 2021 12:01:18 -0700 Subject: [PATCH 5554/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9ddb2866-cf3e-4c44-8ad9-7a0de40c989a PiperOrigin-RevId: 406584240 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b923794f9f9..89667ee5b0b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c5dd68d97ed799f9a4266de9bff28aaf7d2ce13c728d4d7fee93d907e0aa73fa", - git_commit = "7367d842cfd77aae148ddc947e129ac19a6e8551", + sha256 = "d9130f1e49591891586c39a7bc53e4fd1f1ccb5cdd4abfe1ac098397c65c31f4", + git_commit = "a2a99564c7e3b452785206aea6e26585e7da4feb", ) # Import all of TensorFlow Serving's external dependencies. From a21bfe28f48dac57807c555090a86958afa5f5cd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 30 Oct 2021 18:01:20 -0700 Subject: [PATCH 5555/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4e2d13d6-e5df-40ab-b704-b040b65b43d1 PiperOrigin-RevId: 406612619 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 89667ee5b0b..1f644a95576 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d9130f1e49591891586c39a7bc53e4fd1f1ccb5cdd4abfe1ac098397c65c31f4", - git_commit = "a2a99564c7e3b452785206aea6e26585e7da4feb", + sha256 = "a2d53395a0598fac6c38906e2252377e83d4b79b7f536079458bba6ea2306cf7", + git_commit = "45fb3fdeb1c8ab5f0689ccfc2eb7861bb5a4b1f1", ) # Import all of TensorFlow Serving's external dependencies. From 37124743601cebedc31022919a51efe415d733e7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 31 Oct 2021 00:01:39 -0700 Subject: [PATCH 5556/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5985c207-48eb-408a-a29d-11c2fc7c19fe PiperOrigin-RevId: 406638686 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1f644a95576..dde2b40cbea 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a2d53395a0598fac6c38906e2252377e83d4b79b7f536079458bba6ea2306cf7", - git_commit = "45fb3fdeb1c8ab5f0689ccfc2eb7861bb5a4b1f1", + sha256 = "92bcf47fee04032c87b0ff4a1d30237d042dc71ded04be0a1fd915e4283dea39", + git_commit = "aad52ed7097f1b8428d72219d93180e776cdf597", ) # Import all of TensorFlow Serving's external dependencies. From b97a715373b977d46dd899f14b396bc47280385f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 31 Oct 2021 06:01:29 -0700 Subject: [PATCH 5557/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bc4a5e5b-c0f7-4f7b-b91e-d36ee8550588 PiperOrigin-RevId: 406669088 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dde2b40cbea..aeeda6393fc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "92bcf47fee04032c87b0ff4a1d30237d042dc71ded04be0a1fd915e4283dea39", - git_commit = "aad52ed7097f1b8428d72219d93180e776cdf597", + sha256 = "aa1758a938afbfec68fe459d5e15e8cac0436d07a00a24ac66c247efab4a8120", + git_commit = "e10fc4c958c17cfe633dc8f47dbcefc98612715c", ) # Import all of TensorFlow Serving's external dependencies. From 4afc4657fdc68f4e5485d8597978e3d3ceed181f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 31 Oct 2021 12:01:27 -0700 Subject: [PATCH 5558/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ce1ddb31-a343-4f87-813b-56a79f4bfcae PiperOrigin-RevId: 406696892 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index aeeda6393fc..58a7cfc440b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "aa1758a938afbfec68fe459d5e15e8cac0436d07a00a24ac66c247efab4a8120", - git_commit = "e10fc4c958c17cfe633dc8f47dbcefc98612715c", + sha256 = "d2a3d3494ecbfd440be65131c41b319e0cd6b0d908afff78875cb6722ce9f452", + git_commit = "e929486e5863406770f5193dad854c067bd115cc", ) # Import all of TensorFlow Serving's external dependencies. From eb45a5a52c94ac628e51ad4e71c6894675cd67c4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 31 Oct 2021 18:01:18 -0700 Subject: [PATCH 5559/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/40824519-62e8-4c0f-a98c-861bee2858d1 PiperOrigin-RevId: 406726631 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 58a7cfc440b..dfd534994ce 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d2a3d3494ecbfd440be65131c41b319e0cd6b0d908afff78875cb6722ce9f452", - git_commit = "e929486e5863406770f5193dad854c067bd115cc", + sha256 = "6b389b73d0093301c516cebd928a33ffbaea2bc237682998eb01dd494d1a4711", + git_commit = "4275adf6d7df5793f7b87f69a958c201e7109ecc", ) # Import all of TensorFlow Serving's external dependencies. From 2c2baaa0c6f26403eb13706ee9ffc708ef4e2d36 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Nov 2021 00:01:30 -0700 Subject: [PATCH 5560/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5ee90033-3720-47cd-a94a-f635e7f35400 PiperOrigin-RevId: 406759084 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dfd534994ce..287904a02c1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6b389b73d0093301c516cebd928a33ffbaea2bc237682998eb01dd494d1a4711", - git_commit = "4275adf6d7df5793f7b87f69a958c201e7109ecc", + sha256 = "0238173a6c60b5b17485a24d1b955b9a67375bdbc83902e5bcc343b72d04a55d", + git_commit = "fb134a2b8f5e493ae1f3276df13f035c62ed1914", ) # Import all of TensorFlow Serving's external dependencies. From f60a4253c672b9376645eafb0d17e502590daa34 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Nov 2021 06:01:27 -0700 Subject: [PATCH 5561/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3d96db4e-031a-4fa5-8cde-84674b0bc983 PiperOrigin-RevId: 406807292 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 287904a02c1..ab3434df086 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0238173a6c60b5b17485a24d1b955b9a67375bdbc83902e5bcc343b72d04a55d", - git_commit = "fb134a2b8f5e493ae1f3276df13f035c62ed1914", + sha256 = "406d7599c503f79fcb9cc6c131f3ce3213e457d83b4c6651a06ec5acd1da88e4", + git_commit = "86cca8de9cbd18f7e3b3fbdff7367b34b9e1ab59", ) # Import all of TensorFlow Serving's external dependencies. From f9a3b3161a703eee815253a088571e2e190d3132 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Nov 2021 12:01:35 -0700 Subject: [PATCH 5562/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/73fb9515-89e0-422f-84c4-8bc93de746fb PiperOrigin-RevId: 406884154 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ab3434df086..c2c3e93fa82 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "406d7599c503f79fcb9cc6c131f3ce3213e457d83b4c6651a06ec5acd1da88e4", - git_commit = "86cca8de9cbd18f7e3b3fbdff7367b34b9e1ab59", + sha256 = "d881df8575f12dff91210a353569198bc7732826c3384e89431ad199f374188a", + git_commit = "2d88f60ac865f33f2c1fc2c5f4fb39787fecb8a1", ) # Import all of TensorFlow Serving's external dependencies. From db841723a65ffd4b912a5d9c32d70bad583fb21f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Nov 2021 18:01:31 -0700 Subject: [PATCH 5563/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/63b17c52-2f76-440b-af59-7bcd4529da92 PiperOrigin-RevId: 406964451 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c2c3e93fa82..16e6eeffb02 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d881df8575f12dff91210a353569198bc7732826c3384e89431ad199f374188a", - git_commit = "2d88f60ac865f33f2c1fc2c5f4fb39787fecb8a1", + sha256 = "b479f4ae9a5e3d24704cda72c62439b8d02ed73b206d91cd0cc7dd2fdf6f4a1b", + git_commit = "3232235465fa803fd49ff4b4a3b3799eb8dd6e73", ) # Import all of TensorFlow Serving's external dependencies. From 27f5df0d947c742037a0264c14bb0ab781b3f7fe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Nov 2021 00:01:34 -0700 Subject: [PATCH 5564/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0fe5fcb1-6a01-4bb8-bbe7-ce12142b4ee4 PiperOrigin-RevId: 407009003 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 16e6eeffb02..966401aadc2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b479f4ae9a5e3d24704cda72c62439b8d02ed73b206d91cd0cc7dd2fdf6f4a1b", - git_commit = "3232235465fa803fd49ff4b4a3b3799eb8dd6e73", + sha256 = "ec66c945e89b8602d1214e45d6796be7293514bfa02172faab98b7cb9322e47a", + git_commit = "9a5a502ac22b5347fd3dee85d8cf302c6b8e9385", ) # Import all of TensorFlow Serving's external dependencies. From 988bbce80038ac0b7141dcb4413124ba486344cf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Nov 2021 03:50:28 -0700 Subject: [PATCH 5565/8103] Force-allow labels for the models which are not yet loaded. The feature is meant to be used for non-prod environments only as it may break the serving until relevant models are not loaded yet. PiperOrigin-RevId: 407043032 --- tensorflow_serving/core/test_util/BUILD | 1 + .../core/test_util/availability_test_util.cc | 13 ++ .../core/test_util/availability_test_util.h | 6 + tensorflow_serving/model_servers/server.cc | 2 + tensorflow_serving/model_servers/server.h | 1 + .../model_servers/server_core.cc | 23 +-- .../model_servers/server_core.h | 4 + .../model_servers/server_core_test.cc | 146 ++++++++---------- .../model_servers/test_util/BUILD | 1 + .../test_util/server_core_test_util.h | 24 +++ 10 files changed, 128 insertions(+), 93 deletions(-) diff --git a/tensorflow_serving/core/test_util/BUILD b/tensorflow_serving/core/test_util/BUILD index 38dfaceb8c8..f90637f1434 100644 --- a/tensorflow_serving/core/test_util/BUILD +++ b/tensorflow_serving/core/test_util/BUILD @@ -117,6 +117,7 @@ cc_library( deps = [ "//tensorflow_serving/core:servable_state_monitor", "@com_google_absl//absl/types:optional", + "@com_google_absl//absl/types:span", "@com_google_googletest//:gtest", "@org_tensorflow//tensorflow/core:lib", ], diff --git a/tensorflow_serving/core/test_util/availability_test_util.cc b/tensorflow_serving/core/test_util/availability_test_util.cc index 49044ab5877..47521cdf507 100644 --- a/tensorflow_serving/core/test_util/availability_test_util.cc +++ b/tensorflow_serving/core/test_util/availability_test_util.cc @@ -15,7 +15,10 @@ limitations under the License. #include "tensorflow_serving/core/test_util/availability_test_util.h" +#include + #include "absl/types/optional.h" +#include "absl/types/span.h" #include "tensorflow/core/platform/env.h" namespace tensorflow { @@ -53,6 +56,16 @@ void WaitUntilServableManagerStateIsOneOf( } } +void WaitUntilVersionsAvailable( + const ServableStateMonitor& monitor, const string& servable_id_name, + absl::Span servable_id_versions) { + for (int64_t version : servable_id_versions) { + const ServableId servable_id = {servable_id_name, version}; + WaitUntilServableManagerStateIsOneOf( + monitor, servable_id, {ServableState::ManagerState::kAvailable}); + } +} + } // namespace test_util } // namespace serving } // namespace tensorflow diff --git a/tensorflow_serving/core/test_util/availability_test_util.h b/tensorflow_serving/core/test_util/availability_test_util.h index baa724e13ec..edf84efd39c 100644 --- a/tensorflow_serving/core/test_util/availability_test_util.h +++ b/tensorflow_serving/core/test_util/availability_test_util.h @@ -31,6 +31,12 @@ void WaitUntilServableManagerStateIsOneOf( const ServableStateMonitor& monitor, const ServableId& servable, const std::vector& states); +// Waits until 'monitor' shows that the manager state servable ids is +// kAvailable. +void WaitUntilVersionsAvailable(const ServableStateMonitor& monitor, + const string& servable_id_name, + absl::Span servable_id_versions); + } // namespace test_util } // namespace serving } // namespace tensorflow diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index 97215ae24c0..ca190e8df3e 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -314,6 +314,8 @@ Status Server::BuildAndStart(const Options& server_options) { options.flush_filesystem_caches = server_options.flush_filesystem_caches; options.allow_version_labels_for_unavailable_models = server_options.allow_version_labels_for_unavailable_models; + options.force_allow_any_version_labels_for_unavailable_models = + server_options.force_allow_any_version_labels_for_unavailable_models; options.enable_cors_support = server_options.enable_cors_support; TF_RETURN_IF_ERROR(ServerCore::Create(std::move(options), &server_core_)); diff --git a/tensorflow_serving/model_servers/server.h b/tensorflow_serving/model_servers/server.h index b32d720644f..3b944bb0fa3 100644 --- a/tensorflow_serving/model_servers/server.h +++ b/tensorflow_serving/model_servers/server.h @@ -58,6 +58,7 @@ class Server { // bool enable_batching = false; bool allow_version_labels_for_unavailable_models = false; + bool force_allow_any_version_labels_for_unavailable_models = false; float per_process_gpu_memory_fraction = 0; tensorflow::string batching_parameters_file; tensorflow::string model_name; diff --git a/tensorflow_serving/model_servers/server_core.cc b/tensorflow_serving/model_servers/server_core.cc index 0d4fe6b2ca8..088d71fdf7b 100644 --- a/tensorflow_serving/model_servers/server_core.cc +++ b/tensorflow_serving/model_servers/server_core.cc @@ -506,20 +506,23 @@ Status ServerCore::UpdateModelVersionLabelMap() { const string& label = entry.first; const int64_t version = entry.second; - bool contains_existing_label_with_different_version = false; - int64_t existing_version; - if (GetModelVersionForLabel(model_config.name(), label, &existing_version) - .ok() && - existing_version != version) { - contains_existing_label_with_different_version = true; + bool allow_any_version_labels_for_unavailable_models = false; + if (options_.force_allow_any_version_labels_for_unavailable_models) { + allow_any_version_labels_for_unavailable_models = true; + } else if (options_.allow_version_labels_for_unavailable_models) { + int64_t existing_version; + bool contains_existing_label_with_different_version = + GetModelVersionForLabel(model_config.name(), label, + &existing_version) + .ok() && + existing_version != version; + allow_any_version_labels_for_unavailable_models = + !contains_existing_label_with_different_version; } - bool allow_version_labels_for_unavailable_models = - options_.allow_version_labels_for_unavailable_models && - (!contains_existing_label_with_different_version); // Verify that the label points to a version that is currently available. auto serving_states_it = serving_states.find(version); - if (!allow_version_labels_for_unavailable_models && + if (!allow_any_version_labels_for_unavailable_models && (serving_states_it == serving_states.end() || serving_states_it->second.state.manager_state != ServableState::ManagerState::kAvailable)) { diff --git a/tensorflow_serving/model_servers/server_core.h b/tensorflow_serving/model_servers/server_core.h index d98591aa6f1..ef79d10b447 100644 --- a/tensorflow_serving/model_servers/server_core.h +++ b/tensorflow_serving/model_servers/server_core.h @@ -186,6 +186,10 @@ class ServerCore : public Manager { // available yet. bool allow_version_labels_for_unavailable_models = false; + // Whether to force-allow assigning any version labels to models that are + // not available yet. + bool force_allow_any_version_labels_for_unavailable_models = false; + // In a predict handler, this option specifies how to serialize tensors // (e.g: as proto fields or as proto content). // Serialize as proto fields by default, for backward compatibility. diff --git a/tensorflow_serving/model_servers/server_core_test.cc b/tensorflow_serving/model_servers/server_core_test.cc index 6620904858e..92c0f1826df 100644 --- a/tensorflow_serving/model_servers/server_core_test.cc +++ b/tensorflow_serving/model_servers/server_core_test.cc @@ -44,11 +44,11 @@ namespace tensorflow { namespace serving { namespace { +using test_util::ServerCoreTest; using ::testing::_; using ::testing::Invoke; using ::testing::MockFunction; using ::testing::NiceMock; -using test_util::ServerCoreTest; TEST_P(ServerCoreTest, PreLoadHook) { std::unique_ptr server_core; @@ -650,14 +650,9 @@ TEST_P(ServerCoreTest, ModelSpecMultipleVersionsAvailable) { TF_ASSERT_OK(CreateServerCore(two_version_config, std::move(server_core_options), &server_core)); - // Wait until both versions of the servable have been loaded. - for (const int64_t version : - {test_util::kTestModelVersion, test_util::kTestModelLargerVersion}) { - const auto servable_id = ServableId{test_util::kTestModelName, version}; - test_util::WaitUntilServableManagerStateIsOneOf( - *server_core->servable_state_monitor(), servable_id, - {ServableState::ManagerState::kAvailable}); - } + test_util::WaitUntilVersionsAvailable(*server_core->servable_state_monitor(), + test_util::kTestModelName, + test_util::kAspiredVersions); // Do not specify any version number; we should be given the latest version. { @@ -687,11 +682,9 @@ TEST_P(ServerCoreTest, ModelSpecMultipleVersionsAvailable) { // Assign labels to the two versions of the model. ASSERT_EQ(1, two_version_config.model_config_list().config().size()); - ModelConfig* model_config = - two_version_config.mutable_model_config_list()->mutable_config(0); - (*model_config->mutable_version_labels())["A"] = test_util::kTestModelVersion; - (*model_config->mutable_version_labels())["B"] = - test_util::kTestModelLargerVersion; + test_util::MutateModelConfig(&two_version_config) + .SetLabelVersion("A", test_util::kTestModelVersion) + .SetLabelVersion("B", test_util::kTestModelLargerVersion); TF_ASSERT_OK(server_core->ReloadConfig(two_version_config)); // Use ModelSpec::version_label to request the version labeled "A". @@ -744,27 +737,15 @@ TEST_P(ServerCoreTest, AssignLabelToUnavailableVersion) { TF_ASSERT_OK(CreateServerCore(two_version_config, std::move(server_core_options), &server_core)); - const std::set aspired_versions = { - test_util::kTestModelVersion, test_util::kTestModelLargerVersion}; - const int64_t bogus_version = 777; - for (const int64_t aspired_version : aspired_versions) { - ASSERT_NE(bogus_version, aspired_version); - } - // Wait until both aspired versions of the servable have been loaded. - for (const int64_t aspired_version : aspired_versions) { - const auto servable_id = - ServableId{test_util::kTestModelName, aspired_version}; - test_util::WaitUntilServableManagerStateIsOneOf( - *server_core->servable_state_monitor(), servable_id, - {ServableState::ManagerState::kAvailable}); - } + test_util::WaitUntilVersionsAvailable(*server_core->servable_state_monitor(), + test_util::kTestModelName, + test_util::kAspiredVersions); // Attempt to assign a label to a version that isn't one of the loaded ones. ASSERT_EQ(1, two_version_config.model_config_list().config().size()); - ModelConfig* model_config = - two_version_config.mutable_model_config_list()->mutable_config(0); - (*model_config->mutable_version_labels())["nice try"] = bogus_version; + test_util::MutateModelConfig(&two_version_config) + .SetLabelVersion("nice try", test_util::kTestModelBogusVersion); Status status = server_core->ReloadConfig(two_version_config); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), @@ -782,32 +763,19 @@ TEST_P(ServerCoreTest, AssignLabelToUnavailableVersionAllowed) { TF_ASSERT_OK(CreateServerCore(two_version_config, std::move(server_core_options), &server_core)); - const std::set aspired_versions = { - test_util::kTestModelVersion, test_util::kTestModelLargerVersion}; - const int64_t bogus_version = 777; - for (const int64_t aspired_version : aspired_versions) { - ASSERT_NE(bogus_version, aspired_version); - } - - // Wait until both aspired versions of the servable have been loaded. - for (const int64_t aspired_version : aspired_versions) { - const auto servable_id = - ServableId{test_util::kTestModelName, aspired_version}; - test_util::WaitUntilServableManagerStateIsOneOf( - *server_core->servable_state_monitor(), servable_id, - {ServableState::ManagerState::kAvailable}); - } + test_util::WaitUntilVersionsAvailable(*server_core->servable_state_monitor(), + test_util::kTestModelName, + test_util::kAspiredVersions); // Attempt to assign a label to a version that isn't one of the loaded ones. ASSERT_EQ(1, two_version_config.model_config_list().config().size()); - ModelConfig* model_config = - two_version_config.mutable_model_config_list()->mutable_config(0); - (*model_config->mutable_version_labels())["nice try"] = bogus_version; + test_util::MutateModelConfig(&two_version_config) + .SetLabelVersion("nice try", test_util::kTestModelBogusVersion); Status status = server_core->ReloadConfig(two_version_config); EXPECT_TRUE(status.ok()); } -TEST_P(ServerCoreTest, AssignExistingLabelToUnavailableVersion) { +TEST_P(ServerCoreTest, AssignExistingLabelToUnavailableVersionDisallowed) { ModelServerConfig two_version_config = GetTestModelServerConfigForFakePlatform(); SwitchToHalfPlusTwoWith2Versions(&two_version_config); @@ -818,43 +786,57 @@ TEST_P(ServerCoreTest, AssignExistingLabelToUnavailableVersion) { TF_ASSERT_OK(CreateServerCore(two_version_config, std::move(server_core_options), &server_core)); - const std::set aspired_versions = { - test_util::kTestModelVersion, test_util::kTestModelLargerVersion}; - const int64_t bogus_version = 777; - for (const int64_t aspired_version : aspired_versions) { - ASSERT_NE(bogus_version, aspired_version); - } - - // Wait until both aspired versions of the servable have been loaded. - for (const int64_t aspired_version : aspired_versions) { - const auto servable_id = - ServableId{test_util::kTestModelName, aspired_version}; - test_util::WaitUntilServableManagerStateIsOneOf( - *server_core->servable_state_monitor(), servable_id, - {ServableState::ManagerState::kAvailable}); - } + test_util::WaitUntilVersionsAvailable(*server_core->servable_state_monitor(), + test_util::kTestModelName, + test_util::kAspiredVersions); - // Assign labels to the two versions of the model. ASSERT_EQ(1, two_version_config.model_config_list().config().size()); - ModelConfig* model_config = - two_version_config.mutable_model_config_list()->mutable_config(0); - (*model_config->mutable_version_labels())["A"] = test_util::kTestModelVersion; - (*model_config->mutable_version_labels())["B"] = - test_util::kTestModelLargerVersion; + test_util::MutateModelConfig(&two_version_config) + .SetLabelVersion("A", test_util::kTestModelVersion) + .SetLabelVersion("B", test_util::kTestModelLargerVersion); TF_ASSERT_OK(server_core->ReloadConfig(two_version_config)); - // Attempt to assign an exsiting label to a different version that isn't + // Attempt to assign an existing label to a different version that isn't // one of the loaded ones. ASSERT_EQ(1, two_version_config.model_config_list().config().size()); - model_config = - two_version_config.mutable_model_config_list()->mutable_config(0); - (*model_config->mutable_version_labels())["A"] = bogus_version; + test_util::MutateModelConfig(&two_version_config) + .SetLabelVersion("A", test_util::kTestModelBogusVersion); Status status = server_core->ReloadConfig(two_version_config); ASSERT_FALSE(status.ok()); EXPECT_THAT(status.ToString(), ::testing::HasSubstr("not currently available for inference")); } +TEST_P(ServerCoreTest, AssignExistingLabelToUnavailableVersionAllowed) { + ModelServerConfig two_version_config = + GetTestModelServerConfigForFakePlatform(); + SwitchToHalfPlusTwoWith2Versions(&two_version_config); + ServerCore::Options server_core_options = GetDefaultOptions(); + server_core_options.allow_version_labels = true; + server_core_options.force_allow_any_version_labels_for_unavailable_models = + true; + std::unique_ptr server_core; + TF_ASSERT_OK(CreateServerCore(two_version_config, + std::move(server_core_options), &server_core)); + + test_util::WaitUntilVersionsAvailable(*server_core->servable_state_monitor(), + test_util::kTestModelName, + test_util::kAspiredVersions); + + ASSERT_EQ(1, two_version_config.model_config_list().config().size()); + test_util::MutateModelConfig(&two_version_config) + .SetLabelVersion("A", test_util::kTestModelVersion) + .SetLabelVersion("B", test_util::kTestModelLargerVersion); + TF_ASSERT_OK(server_core->ReloadConfig(two_version_config)); + + // Attempt to assign an existing label to a different version that isn't + // one of the loaded ones. + ASSERT_EQ(1, two_version_config.model_config_list().config().size()); + test_util::MutateModelConfig(&two_version_config) + .SetLabelVersion("A", test_util::kTestModelBogusVersion); + TF_ASSERT_OK(server_core->ReloadConfig(two_version_config)); +} + TEST_P(ServerCoreTest, VersionLabelsNotAllowed) { ServerCore::Options server_core_options = GetDefaultOptions(); server_core_options.allow_version_labels = false; @@ -862,16 +844,14 @@ TEST_P(ServerCoreTest, VersionLabelsNotAllowed) { std::unique_ptr server_core; TF_ASSERT_OK( CreateServerCore(config, std::move(server_core_options), &server_core)); - const auto servable_id = - ServableId{test_util::kTestModelName, test_util::kTestModelVersion}; - test_util::WaitUntilServableManagerStateIsOneOf( - *server_core->servable_state_monitor(), servable_id, - {ServableState::ManagerState::kAvailable}); + + test_util::WaitUntilVersionsAvailable(*server_core->servable_state_monitor(), + test_util::kTestModelName, + {test_util::kTestModelVersion}); ASSERT_EQ(1, config.model_config_list().config().size()); - ModelConfig* model_config = - config.mutable_model_config_list()->mutable_config(0); - (*model_config->mutable_version_labels())["A"] = test_util::kTestModelVersion; + test_util::MutateModelConfig(&config).SetLabelVersion( + "A", test_util::kTestModelVersion); Status status = server_core->ReloadConfig(config); ASSERT_FALSE(status.ok()); EXPECT_THAT( diff --git a/tensorflow_serving/model_servers/test_util/BUILD b/tensorflow_serving/model_servers/test_util/BUILD index 971868613bb..1da71ffa98c 100644 --- a/tensorflow_serving/model_servers/test_util/BUILD +++ b/tensorflow_serving/model_servers/test_util/BUILD @@ -84,6 +84,7 @@ cc_library( "//tensorflow_serving/servables/tensorflow:session_bundle_config_cc_proto", "//tensorflow_serving/test_util", "@com_google_googletest//:gtest", + "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:test", ], ) diff --git a/tensorflow_serving/model_servers/test_util/server_core_test_util.h b/tensorflow_serving/model_servers/test_util/server_core_test_util.h index b9b7b035446..f3c78effeee 100644 --- a/tensorflow_serving/model_servers/test_util/server_core_test_util.h +++ b/tensorflow_serving/model_servers/test_util/server_core_test_util.h @@ -16,6 +16,7 @@ limitations under the License. #ifndef TENSORFLOW_SERVING_MODEL_SERVERS_TEST_UTIL_SERVER_CORE_TEST_UTIL_H_ #define TENSORFLOW_SERVING_MODEL_SERVERS_TEST_UTIL_SERVER_CORE_TEST_UTIL_H_ +#include #include #include @@ -40,6 +41,9 @@ class ServerCoreTestAccess { constexpr char kTestModelName[] = "test_model"; constexpr int kTestModelVersion = 123; constexpr int kTestModelLargerVersion = 124; +constexpr int kTestModelBogusVersion = 777; +constexpr std::array kAspiredVersions = {kTestModelVersion, + kTestModelLargerVersion}; // The name of the platform associated with FakeLoaderSourceAdapter. constexpr char kFakePlatform[] = "fake_servable"; @@ -123,6 +127,26 @@ Status CreateServerCore(const ModelServerConfig& config, Status CreateServerCore(const ModelServerConfig& config, std::unique_ptr* server_core); +// A helper class to avoid long lines accessing mutable configuration. +class ModelConfigMutator { + public: + explicit ModelConfigMutator(ModelConfig* const config) : config_(config) {} + + // Sets or updates label and its version. + ModelConfigMutator SetLabelVersion(const string& label, const int& version) { + (*config_->mutable_version_labels())[label] = version; + return *this; + } + + private: + ModelConfig* config_; +}; + +inline ModelConfigMutator MutateModelConfig(ModelServerConfig* const config) { + return ModelConfigMutator( + config->mutable_model_config_list()->mutable_config(0)); +} + } // namespace test_util } // namespace serving } // namespace tensorflow From 84031baf7679af732ccd6f93a7ed0e8c15db9fa0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Nov 2021 06:01:32 -0700 Subject: [PATCH 5566/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e49fcf70-bd84-44d1-830e-a34b2c5b6e2d PiperOrigin-RevId: 407063730 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 966401aadc2..e30d85748fa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ec66c945e89b8602d1214e45d6796be7293514bfa02172faab98b7cb9322e47a", - git_commit = "9a5a502ac22b5347fd3dee85d8cf302c6b8e9385", + sha256 = "9ab4ad4b24c6254f596558871a2adb53141c2825f6c9648b28a6e5bb260dd241", + git_commit = "2a967b1d946ea0df21d486c119453d5dc149419f", ) # Import all of TensorFlow Serving's external dependencies. From 3d6a67356544f9d5503f27afa4e74355242f124d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Nov 2021 12:01:29 -0700 Subject: [PATCH 5567/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/26fed9d8-f364-4c55-8f90-a73124c14f16 PiperOrigin-RevId: 407143061 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e30d85748fa..2183517ff3c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9ab4ad4b24c6254f596558871a2adb53141c2825f6c9648b28a6e5bb260dd241", - git_commit = "2a967b1d946ea0df21d486c119453d5dc149419f", + sha256 = "6a61f154f3b7959bca8d89cb7970bbfbd9c3ab0b7338bb3376187a8e513476e2", + git_commit = "b73511291f1e3a1662efb4526fd5cc5e79bb61e6", ) # Import all of TensorFlow Serving's external dependencies. From d2098caafa91bdebe267aa99e4df5de20d475ca6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Nov 2021 18:01:19 -0700 Subject: [PATCH 5568/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/741c5109-d607-436b-be85-30697a5d10a8 PiperOrigin-RevId: 407221513 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2183517ff3c..2104d20095a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6a61f154f3b7959bca8d89cb7970bbfbd9c3ab0b7338bb3376187a8e513476e2", - git_commit = "b73511291f1e3a1662efb4526fd5cc5e79bb61e6", + sha256 = "078c2c8c56a5d89b702b822381df7885d1951b37055916d0d20e96deee2d479f", + git_commit = "1b6d9508b010d4207cbe4b2a3cf00a4491477a40", ) # Import all of TensorFlow Serving's external dependencies. From 4d569e2f35dfa908ab0ab3f1a4dbfd30675b1a7d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 3 Nov 2021 00:01:42 -0700 Subject: [PATCH 5569/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d2487806-3f37-46ff-8044-d0205fa1b924 PiperOrigin-RevId: 407266702 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2104d20095a..3e4708784a3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "078c2c8c56a5d89b702b822381df7885d1951b37055916d0d20e96deee2d479f", - git_commit = "1b6d9508b010d4207cbe4b2a3cf00a4491477a40", + sha256 = "e2a4fd6f945b87ba38dff034d39ca73f762da2a98260c0231b4ae63b1b7d4702", + git_commit = "6682756c0fa8fde053f44f7efc3faf200612505d", ) # Import all of TensorFlow Serving's external dependencies. From d455f725a2cb5dfea45b5f01e15c1af8e83fec88 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 3 Nov 2021 06:01:35 -0700 Subject: [PATCH 5570/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8420168d-5e85-40d6-b0b7-4b28cf8c1638 PiperOrigin-RevId: 407317399 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3e4708784a3..c9d42cf8d99 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e2a4fd6f945b87ba38dff034d39ca73f762da2a98260c0231b4ae63b1b7d4702", - git_commit = "6682756c0fa8fde053f44f7efc3faf200612505d", + sha256 = "e7784d572dec4a2a64ede6d2718552a5018cef0ac0646d0090d3b07ab66370fb", + git_commit = "fd09671c067a76a3ee271572fabccb31681dacce", ) # Import all of TensorFlow Serving's external dependencies. From 2e7ca90c18f310c542ed0dcde92d676db6454285 Mon Sep 17 00:00:00 2001 From: Guanxin Qiao Date: Wed, 3 Nov 2021 10:06:05 -0700 Subject: [PATCH 5571/8103] Update CreateRPC API interface. PiperOrigin-RevId: 407363453 --- .../tensorflow/ops/remote_predict/BUILD | 3 +++ .../kernels/prediction_service_grpc.cc | 2 +- .../kernels/prediction_service_grpc.h | 3 ++- .../kernels/prediction_service_grpc_test.cc | 4 +++- .../kernels/remote_predict_op_kernel.h | 13 +++++++++++-- .../kernels/remote_predict_op_kernel_test.cc | 5 ++++- 6 files changed, 24 insertions(+), 6 deletions(-) diff --git a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/BUILD b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/BUILD index f821eaad8db..fae521f0a04 100644 --- a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/BUILD +++ b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/BUILD @@ -26,6 +26,7 @@ cc_library( "@org_tensorflow//tensorflow/core:framework_headers_lib", "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core/kernels:ops_util_hdrs", + "@org_tensorflow//tensorflow/core/platform:statusor", ], alwayslink = 1, ) @@ -96,6 +97,7 @@ tf_kernel_library( "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core/kernels:ops_util", "@org_tensorflow//tensorflow/core/kernels:split_lib", + "@org_tensorflow//tensorflow/core/platform:statusor", ], ) @@ -163,6 +165,7 @@ cc_library( "@com_github_grpc_grpc//:grpc++", "@com_google_absl//absl/status", "@com_google_absl//absl/time", + "@org_tensorflow//tensorflow/core/platform:statusor", ], ) diff --git a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/prediction_service_grpc.cc b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/prediction_service_grpc.cc index 988f6b0330c..b2467bbeabf 100644 --- a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/prediction_service_grpc.cc +++ b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/prediction_service_grpc.cc @@ -41,7 +41,7 @@ PredictionServiceGrpc::PredictionServiceGrpc( stub_ = tensorflow::serving::PredictionService::NewStub(channel); } -::grpc::ClientContext* PredictionServiceGrpc::CreateRpc( +StatusOr<::grpc::ClientContext*> PredictionServiceGrpc::CreateRpc( absl::Duration max_rpc_deadline) { ::grpc::ClientContext* rpc = new ::grpc::ClientContext(); // TODO(b/159739577): Set deadline as the min value between diff --git a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/prediction_service_grpc.h b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/prediction_service_grpc.h index c09f77fb351..2d31d658d00 100644 --- a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/prediction_service_grpc.h +++ b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/prediction_service_grpc.h @@ -18,6 +18,7 @@ limitations under the License. #include "absl/status/status.h" #include "absl/time/time.h" +#include "tensorflow/core/platform/statusor.h" #include "tensorflow_serving/apis/prediction_service.grpc.pb.h" namespace tensorflow { @@ -33,7 +34,7 @@ class PredictionServiceGrpc { return ::absl::OkStatus(); } - ::grpc::ClientContext* CreateRpc(absl::Duration max_rpc_deadline); + StatusOr<::grpc::ClientContext*> CreateRpc(absl::Duration max_rpc_deadline); void Predict(::grpc::ClientContext* rpc, PredictRequest* request, PredictResponse* response, diff --git a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/prediction_service_grpc_test.cc b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/prediction_service_grpc_test.cc index 4fabc2e3702..9ff12cb1ba9 100644 --- a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/prediction_service_grpc_test.cc +++ b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/prediction_service_grpc_test.cc @@ -35,7 +35,9 @@ class PredictionServiceGrpcTest : public ::testing::Test { TEST_F(PredictionServiceGrpcTest, TestSetDeadline) { const absl::Duration deadline = absl::Milliseconds(30000); - rpc_.reset(grpc_stub_->CreateRpc(deadline)); + auto rpc_or = grpc_stub_->CreateRpc(deadline); + ASSERT_TRUE(rpc_or.ok()); + rpc_.reset(rpc_or.ValueOrDie()); EXPECT_NEAR(absl::ToDoubleMilliseconds(deadline), absl::ToDoubleMilliseconds(absl::FromChrono(rpc_->deadline()) - diff --git a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/remote_predict_op_kernel.h b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/remote_predict_op_kernel.h index 682e68d7272..2b51fddbdf8 100644 --- a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/remote_predict_op_kernel.h +++ b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/remote_predict_op_kernel.h @@ -29,6 +29,7 @@ limitations under the License. #include "tensorflow/core/kernels/ops_util.h" #include "tensorflow/core/lib/core/threadpool.h" #include "tensorflow/core/lib/gtl/cleanup.h" +#include "tensorflow/core/platform/status.h" #include "tensorflow/core/protobuf/named_tensor.pb.h" #include "tensorflow_serving/apis/model.pb.h" #include "tensorflow_serving/apis/predict.pb.h" @@ -103,9 +104,17 @@ class RemotePredictOp : public AsyncOpKernel { PredictResponse* response = new PredictResponse(); - auto rpc = prediction_service_->CreateRpc( + auto rpc_or = prediction_service_->CreateRpc( absl::Milliseconds(max_rpc_deadline_millis_)); - + OP_REQUIRES_ASYNC(context, rpc_or.ok(), + tensorflow::Status(rpc_or.status().code(), + rpc_or.status().error_message()), + [&]() { + delete request; + delete response; + done(); + }); + auto rpc = rpc_or.ValueOrDie(); auto callback = [this, context, rpc, request, response, output_tensor_aliases, done](const absl::Status& status) { PostProcessResponse(context, response, status, fail_op_on_rpc_error_, diff --git a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/remote_predict_op_kernel_test.cc b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/remote_predict_op_kernel_test.cc index 8be766f5075..1b020e70a3f 100644 --- a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/remote_predict_op_kernel_test.cc +++ b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/kernels/remote_predict_op_kernel_test.cc @@ -20,6 +20,7 @@ limitations under the License. #include "tensorflow/cc/ops/const_op.h" #include "tensorflow/core/framework/tensor_testutil.h" #include "tensorflow/core/lib/core/status_test_util.h" +#include "tensorflow/core/platform/status.h" #include "tensorflow_serving/apis/prediction_service.grpc.pb.h" #include "tensorflow_serving/experimental/tensorflow/ops/remote_predict/cc/ops/remote_predict_op.h" @@ -39,7 +40,9 @@ class MockPredictionService { return ::absl::OkStatus(); } - MockRpc* CreateRpc(absl::Duration max_rpc_deadline) { return new MockRpc; } + StatusOr CreateRpc(absl::Duration max_rpc_deadline) { + return new MockRpc; + } // The model_name in request determines response and/or status. void Predict(MockRpc* rpc, PredictRequest* request, PredictResponse* response, From 413b780d9d386afa5afe79bf4b6bae39b4003932 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 3 Nov 2021 12:01:59 -0700 Subject: [PATCH 5572/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f0a6b1c6-3d15-47ca-9582-a05318d90742 PiperOrigin-RevId: 407392462 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c9d42cf8d99..0315a4687cb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e7784d572dec4a2a64ede6d2718552a5018cef0ac0646d0090d3b07ab66370fb", - git_commit = "fd09671c067a76a3ee271572fabccb31681dacce", + sha256 = "c981ceb4096769d94b5a24b33f9c194e57273e67bf93f14f8a1478c14349b8d8", + git_commit = "4fdd0fc35361b2666a6ec11ba4101fc34abfec3f", ) # Import all of TensorFlow Serving's external dependencies. From 1079a83ba7f08bdae1f644c4f0265e5b72bf3359 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 3 Nov 2021 18:01:20 -0700 Subject: [PATCH 5573/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9b0aedf0-9080-4309-a632-7e0767ec0525 PiperOrigin-RevId: 407469602 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0315a4687cb..5ccb4c8c4ce 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c981ceb4096769d94b5a24b33f9c194e57273e67bf93f14f8a1478c14349b8d8", - git_commit = "4fdd0fc35361b2666a6ec11ba4101fc34abfec3f", + sha256 = "0a8634e13400dc7a8e2d8d6f8a0f99a865dea544285011a94e79a2fdb8c9d8c1", + git_commit = "98bc0159c3a8e522af2e28284c43c120a6b9bbe6", ) # Import all of TensorFlow Serving's external dependencies. From 457ee8678df7aa799d0d02c72fd476975557d1a8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Nov 2021 00:01:33 -0700 Subject: [PATCH 5574/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bb128807-6fa3-4da4-be26-a741a64a7103 PiperOrigin-RevId: 407513044 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5ccb4c8c4ce..20e68691d16 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0a8634e13400dc7a8e2d8d6f8a0f99a865dea544285011a94e79a2fdb8c9d8c1", - git_commit = "98bc0159c3a8e522af2e28284c43c120a6b9bbe6", + sha256 = "4839919836031b541f189e2db2332473ae1e882b85b1fbde9e258b0a859ac368", + git_commit = "f3200242aad7ddb53bf1b42321b04850d506184c", ) # Import all of TensorFlow Serving's external dependencies. From e2c8c50201fb8c3b94e2a89261da9be02e58a42c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Nov 2021 06:01:29 -0700 Subject: [PATCH 5575/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/66cf181b-fc80-4b86-adc3-8cdfd4b335d0 PiperOrigin-RevId: 407561541 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 20e68691d16..817a419dd3d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4839919836031b541f189e2db2332473ae1e882b85b1fbde9e258b0a859ac368", - git_commit = "f3200242aad7ddb53bf1b42321b04850d506184c", + sha256 = "240cfeaf5fabc232ba279ae4915c4a14cf577c73842d0ba920796cb3d5b0b8b7", + git_commit = "5e0f847d64b171a5feb2dc20468339f2c2e633ac", ) # Import all of TensorFlow Serving's external dependencies. From c7c057ec46df0bc3cfab2e3f868c92d8170a3d2c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Nov 2021 12:01:23 -0700 Subject: [PATCH 5576/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9d92d15c-5cf1-41bc-a0a2-e7aac48c6a10 PiperOrigin-RevId: 407637022 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 817a419dd3d..c5dbfdacf29 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "240cfeaf5fabc232ba279ae4915c4a14cf577c73842d0ba920796cb3d5b0b8b7", - git_commit = "5e0f847d64b171a5feb2dc20468339f2c2e633ac", + sha256 = "fb24061f076a58793e44bd7256f7651539504f75762ce832e42eb28d370613ab", + git_commit = "eab602d1329b80f0a9a954359ff7731eaef9da08", ) # Import all of TensorFlow Serving's external dependencies. From 35071a982b1f2bc721e6c7598aaac5b3b1679033 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Nov 2021 18:01:23 -0700 Subject: [PATCH 5577/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b2e344c5-af6c-438d-829d-eff0a78f5918 PiperOrigin-RevId: 407713038 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c5dbfdacf29..9ce1e497c87 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fb24061f076a58793e44bd7256f7651539504f75762ce832e42eb28d370613ab", - git_commit = "eab602d1329b80f0a9a954359ff7731eaef9da08", + sha256 = "b2a43dc138945844030db98bdbbe4236ec4e119300fed49420275b31751c0ee1", + git_commit = "7b2ccfaf49e7f8d6b9084871c474e96c974f6797", ) # Import all of TensorFlow Serving's external dependencies. From 6f0fbeeb5c89523f283c955f9252fd4256d102d4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Nov 2021 00:01:22 -0700 Subject: [PATCH 5578/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ba019374-cf84-48d7-8a9b-4a679b750cdc PiperOrigin-RevId: 407755004 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9ce1e497c87..3299e34356f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b2a43dc138945844030db98bdbbe4236ec4e119300fed49420275b31751c0ee1", - git_commit = "7b2ccfaf49e7f8d6b9084871c474e96c974f6797", + sha256 = "f82b9cf89c31e25ce95bfc099557a7b6706dc0d741159969c9327f7a3f224e30", + git_commit = "6985fd32c563fb4011486da37b9ea5bf485bc691", ) # Import all of TensorFlow Serving's external dependencies. From 672524bdfbdab7164ad3e9e959e529bbb9fe51e8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Nov 2021 06:01:27 -0700 Subject: [PATCH 5579/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7e136ed8-e7a5-4a77-b719-8b6e0faad293 PiperOrigin-RevId: 407803255 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3299e34356f..3eb311c307b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f82b9cf89c31e25ce95bfc099557a7b6706dc0d741159969c9327f7a3f224e30", - git_commit = "6985fd32c563fb4011486da37b9ea5bf485bc691", + sha256 = "74688bc7a4a09b9605d28ff5dd94e84dcf122ebc286bef6559fbfe03ce6055b8", + git_commit = "23b7f4a6ffae784b32b3bd5a2685706e0f1f5915", ) # Import all of TensorFlow Serving's external dependencies. From 4936e53af3ebda283f978f41aac4d040b558918e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Nov 2021 12:01:32 -0700 Subject: [PATCH 5580/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d06a18b5-b294-470b-8f7f-e0591ecd2e95 PiperOrigin-RevId: 407876406 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3eb311c307b..f0ede7cd9ed 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "74688bc7a4a09b9605d28ff5dd94e84dcf122ebc286bef6559fbfe03ce6055b8", - git_commit = "23b7f4a6ffae784b32b3bd5a2685706e0f1f5915", + sha256 = "63b61c5f681d160c191aff9d6b9e832919945b3f728180f85376db82949dbf92", + git_commit = "41f84e98629276f08a3265b14ea03f34cee99a05", ) # Import all of TensorFlow Serving's external dependencies. From 271e7da338a9b2dfd438a6714d42028e9b9cab42 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Nov 2021 18:01:18 -0700 Subject: [PATCH 5581/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/20f1d28a-9fcf-4162-a1b1-81aa656f3750 PiperOrigin-RevId: 407952390 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f0ede7cd9ed..be577e918b4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "63b61c5f681d160c191aff9d6b9e832919945b3f728180f85376db82949dbf92", - git_commit = "41f84e98629276f08a3265b14ea03f34cee99a05", + sha256 = "3bacf321acb308cebbe50e7a498ea7beed8a24df80733aa13602766bc3f18ba9", + git_commit = "4d7c565ecf2134e2987971d4a09b6ac6ea855525", ) # Import all of TensorFlow Serving's external dependencies. From aac2d8c942dd0956b3ddc6eb4197145883d79632 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 6 Nov 2021 00:01:53 -0700 Subject: [PATCH 5582/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ce585bf5-4b02-49a5-ab8c-637471a84dc1 PiperOrigin-RevId: 407990463 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index be577e918b4..9d44c35cff9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3bacf321acb308cebbe50e7a498ea7beed8a24df80733aa13602766bc3f18ba9", - git_commit = "4d7c565ecf2134e2987971d4a09b6ac6ea855525", + sha256 = "553ccbf81afca5ef23b4d3596dd0890dfbd79a4a315aa92746b402360022392c", + git_commit = "b20295a25432cd103093d126511d537646c9a4db", ) # Import all of TensorFlow Serving's external dependencies. From 3b4d881ef44a1be1738f65a9548310c4b721500f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 6 Nov 2021 06:01:25 -0700 Subject: [PATCH 5583/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/55a6439b-71e2-4dde-a154-6c67fcf2ab19 PiperOrigin-RevId: 408027536 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9d44c35cff9..f77cc12e603 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "553ccbf81afca5ef23b4d3596dd0890dfbd79a4a315aa92746b402360022392c", - git_commit = "b20295a25432cd103093d126511d537646c9a4db", + sha256 = "0a90bb52d72b31ca35d67da696706b4bb48fbb92dc0b2cd60bb89a6acc7adfd6", + git_commit = "de8034c6aa06605a215e02bac8a7f6781eb267df", ) # Import all of TensorFlow Serving's external dependencies. From 4fc92c75c8fb41cfa30b210352dc2f6621f8bd0d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 6 Nov 2021 12:01:34 -0700 Subject: [PATCH 5584/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/509cca60-1509-41ed-8085-5608235d4629 PiperOrigin-RevId: 408058043 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f77cc12e603..d922a2e9835 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0a90bb52d72b31ca35d67da696706b4bb48fbb92dc0b2cd60bb89a6acc7adfd6", - git_commit = "de8034c6aa06605a215e02bac8a7f6781eb267df", + sha256 = "e3cee7ccfa59aa433eba8d22a9a173b95f2335864177579bfd272185c6488a05", + git_commit = "c32c22cc9cfb32caf51ce3a207b85e62e7b8c960", ) # Import all of TensorFlow Serving's external dependencies. From 7ead2674495232c4ab91b7d22d5d64f250aeb9c8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 6 Nov 2021 18:01:30 -0700 Subject: [PATCH 5585/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6280109a-de30-4ab2-85cc-2260dbf95562 PiperOrigin-RevId: 408088953 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d922a2e9835..0e17c931c1d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e3cee7ccfa59aa433eba8d22a9a173b95f2335864177579bfd272185c6488a05", - git_commit = "c32c22cc9cfb32caf51ce3a207b85e62e7b8c960", + sha256 = "92d64a701bfb77ec1c9e22697c451eca41ffccd46ef5457ca9b9a70f7ca083ae", + git_commit = "7ddd7853a139fe7243e571f373d0f25743fb74fe", ) # Import all of TensorFlow Serving's external dependencies. From 95d648d2fb98a87b36f393f49804c1505855ca71 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 7 Nov 2021 00:01:37 -0700 Subject: [PATCH 5586/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d720b897-fbdc-4a83-884e-2bcdaee39b37 PiperOrigin-RevId: 408119498 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0e17c931c1d..df42fac6cff 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "92d64a701bfb77ec1c9e22697c451eca41ffccd46ef5457ca9b9a70f7ca083ae", - git_commit = "7ddd7853a139fe7243e571f373d0f25743fb74fe", + sha256 = "45145430fe4cbafb2368d354ce89fd4da5ac4d303e23b217ba419bb4a050400b", + git_commit = "f6a17097df29660c842cd6dc76fce4f832121aba", ) # Import all of TensorFlow Serving's external dependencies. From 207796d32e3588ec4181b890e65159c170ad5aa9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 7 Nov 2021 05:01:20 -0800 Subject: [PATCH 5587/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7a53a0aa-9270-4080-8d6a-4e1ea2d8d63e PiperOrigin-RevId: 408152060 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index df42fac6cff..630a166ae6b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "45145430fe4cbafb2368d354ce89fd4da5ac4d303e23b217ba419bb4a050400b", - git_commit = "f6a17097df29660c842cd6dc76fce4f832121aba", + sha256 = "f84c62d3d136433bb7b2b4f0e2d2af7ec2fd32ae76963adfb29082b92e520247", + git_commit = "2db0c374ccf3f0a5df6f4bbe3d88d932e9ccda24", ) # Import all of TensorFlow Serving's external dependencies. From 639d1e201664bcfb996c6b9487e2f2ba7c536521 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 7 Nov 2021 11:05:31 -0800 Subject: [PATCH 5588/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/08d19d50-7603-4ec5-9662-b6deec28ca75 PiperOrigin-RevId: 408185571 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 630a166ae6b..fc4d452c676 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f84c62d3d136433bb7b2b4f0e2d2af7ec2fd32ae76963adfb29082b92e520247", - git_commit = "2db0c374ccf3f0a5df6f4bbe3d88d932e9ccda24", + sha256 = "6fd2c9446f24f31509ac1e413e6dfba47eb60bba29b3f85fbc365f8a1658873c", + git_commit = "8616bf235e078fd6fe293364db1c0b6224b8c900", ) # Import all of TensorFlow Serving's external dependencies. From 4f342fdfe2f2228aba933aadd05f5074e737a55d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 7 Nov 2021 17:01:34 -0800 Subject: [PATCH 5589/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/365174b7-06e8-4cc8-bad6-55014217343d PiperOrigin-RevId: 408217032 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fc4d452c676..7364c8e0aa7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6fd2c9446f24f31509ac1e413e6dfba47eb60bba29b3f85fbc365f8a1658873c", - git_commit = "8616bf235e078fd6fe293364db1c0b6224b8c900", + sha256 = "77652d867927a31067a763824f5e1bdfb7a832bf8040969e4977bc19af7f3f44", + git_commit = "5bf31fcaffd05a9c1b999b0bc2b52a4975751ff7", ) # Import all of TensorFlow Serving's external dependencies. From fa42a4c0db2beb2ba602c892ecfa41b7e74b0cc5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 7 Nov 2021 23:01:40 -0800 Subject: [PATCH 5590/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f8ea1348-6b4d-40e0-bd2b-87f7507f8ba9 PiperOrigin-RevId: 408255482 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7364c8e0aa7..0bd61befa6e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "77652d867927a31067a763824f5e1bdfb7a832bf8040969e4977bc19af7f3f44", - git_commit = "5bf31fcaffd05a9c1b999b0bc2b52a4975751ff7", + sha256 = "1e1d62321b3e706d9ce912696945fa820fe3b70f15cab23025b90977fcd73383", + git_commit = "5751fd1b006c400fb5497ea7c86e5422655e0e20", ) # Import all of TensorFlow Serving's external dependencies. From 39b4031870a489bc061ef98c9c502eb6fba094e7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 8 Nov 2021 06:02:06 -0800 Subject: [PATCH 5591/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2c468dd6-7e46-4ba9-9dcb-a8d693582907 PiperOrigin-RevId: 408320770 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0bd61befa6e..e1de99abf02 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1e1d62321b3e706d9ce912696945fa820fe3b70f15cab23025b90977fcd73383", - git_commit = "5751fd1b006c400fb5497ea7c86e5422655e0e20", + sha256 = "2921da8dd3c99c15ee14d6119b4b01e8ac302c1f656853982c5a2f086e0b4b45", + git_commit = "c1ddc3f097997094d0e045bd81502805a169937c", ) # Import all of TensorFlow Serving's external dependencies. From 91bb2f76a5b0d8b9ccd54276020ea6469ec1e41a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 8 Nov 2021 12:01:43 -0800 Subject: [PATCH 5592/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e5dfd5b0-0f02-4aa5-8e26-1c53586e73ca PiperOrigin-RevId: 408405531 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e1de99abf02..dae09e9cf5b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2921da8dd3c99c15ee14d6119b4b01e8ac302c1f656853982c5a2f086e0b4b45", - git_commit = "c1ddc3f097997094d0e045bd81502805a169937c", + sha256 = "254c5dc2e22215c4e3a0d8e109e6a7b7d69e879c2e2e07fa3c0b39e523fa7585", + git_commit = "9f3eb61a8033efa4ef45b1f291ef67d5beef8b0e", ) # Import all of TensorFlow Serving's external dependencies. From e65940db248a34d9feb72e79a390a7419010b0d8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 8 Nov 2021 18:01:36 -0800 Subject: [PATCH 5593/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4823c22c-d57c-4129-aff0-062ff1153b6b PiperOrigin-RevId: 408486763 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dae09e9cf5b..71188815808 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "254c5dc2e22215c4e3a0d8e109e6a7b7d69e879c2e2e07fa3c0b39e523fa7585", - git_commit = "9f3eb61a8033efa4ef45b1f291ef67d5beef8b0e", + sha256 = "799cae070a714f0326bf6bf3a5cbb2dd2209b5c518b39d4f034692d3b93f1862", + git_commit = "da3133931471b66eb63421af42dd2d8f2c4c6ec0", ) # Import all of TensorFlow Serving's external dependencies. From 4f63dbf86deb2f6cd2a3d680bf6bfc7f086cfdcc Mon Sep 17 00:00:00 2001 From: Shan Han Date: Mon, 8 Nov 2021 21:23:03 -0800 Subject: [PATCH 5594/8103] Update a precondition failure log message. PiperOrigin-RevId: 408515196 --- .../batching/batching_session.cc | 10 +++++----- .../batching/batching_session_test.cc | 18 ++++++++---------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/tensorflow_serving/batching/batching_session.cc b/tensorflow_serving/batching/batching_session.cc index 25a7e89e508..dc21d7e1629 100644 --- a/tensorflow_serving/batching/batching_session.cc +++ b/tensorflow_serving/batching/batching_session.cc @@ -523,11 +523,11 @@ Status BatchingSession::MergeInputTensors( tensors_to_merge[tensor_name][0].shape(); if (!AreShapesEqualExceptZeroDim(tensor.shape(), reference_shape)) { return errors::FailedPrecondition( - "Tensors with name '" + tensor_name + "' from different tasks" + - " have different shapes and padding is turned off." + - "Set pad_variable_length_inputs to true, or ensure that " + - "all tensors with the same name" + - "have equal dimensions starting with the first dim."); + "Tensors with name '" + tensor_name + + "' from different tasks have different shapes and padding is " + "turned off. Set pad_variable_length_inputs to true, or ensure " + "that all tensors with the same name have equal dimensions " + "starting with the first dim."); } } } diff --git a/tensorflow_serving/batching/batching_session_test.cc b/tensorflow_serving/batching/batching_session_test.cc index 9b3f84ca374..4565ea4fc02 100644 --- a/tensorflow_serving/batching/batching_session_test.cc +++ b/tensorflow_serving/batching/batching_session_test.cc @@ -413,11 +413,10 @@ TEST_P(BatchingSessionTest, BatchHandlesSplitError) { CreateHalfPlusTwoSession(), &batching_session)); string expected_error_msg = - "Tensors with name 'x' from different tasks" - " have different shapes and padding is turned off." - "Set pad_variable_length_inputs to true, or ensure that " - "all tensors with the same name" - "have equal dimensions starting with the first dim."; + "Tensors with name 'x' from different tasks have different shapes and " + "padding is turned off. Set pad_variable_length_inputs to true, or " + "ensure that all tensors with the same name have equal dimensions " + "starting with the first dim."; // `max_batch_size` is 3 and `max_execution_batch_size` is 2, so inputs of // first thread will span over two tasks, causing errors in both batch tasks. @@ -632,11 +631,10 @@ TEST_P(BatchingSessionTest, UnequalTensorShapesWithPaddingTurnedOff) { schedule_options, batching_session_options, {{"x"}, {"y"}}, CreateMatrixHalfPlusTwoSession(), &batching_session)); string expected_error_msg = - "Tensors with name 'x' from different tasks" - " have different shapes and padding is turned off." - "Set pad_variable_length_inputs to true, or ensure that " - "all tensors with the same name" - "have equal dimensions starting with the first dim."; + "Tensors with name 'x' from different tasks have different shapes and " + "padding is turned off. Set pad_variable_length_inputs to true, or " + "ensure that all tensors with the same name have equal dimensions " + "starting with the first dim."; std::unique_ptr first_request_thread(Env::Default()->StartThread( ThreadOptions(), "first_request", [&batching_session, &expected_error_msg] { From 1bf36e94313e4c1e79eb21f10dbded09695f58fe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 9 Nov 2021 00:01:28 -0800 Subject: [PATCH 5595/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fb315c22-df96-4f93-a71a-00f860791136 PiperOrigin-RevId: 408534541 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 71188815808..d74add52e2a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "799cae070a714f0326bf6bf3a5cbb2dd2209b5c518b39d4f034692d3b93f1862", - git_commit = "da3133931471b66eb63421af42dd2d8f2c4c6ec0", + sha256 = "9277d8c065fa0c5fde863fdcaf6eed7eef3c5bf972b163587f301018dda1324d", + git_commit = "222970e9947371fcd6ba948c9ce1e073cf3ff673", ) # Import all of TensorFlow Serving's external dependencies. From 4fbe7ca0ab3996eea4e84ea387550af7e660e679 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 9 Nov 2021 06:01:54 -0800 Subject: [PATCH 5596/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/22cded5b-c394-4ac6-b1a1-1db0e765ae21 PiperOrigin-RevId: 408589325 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d74add52e2a..e64f4181257 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9277d8c065fa0c5fde863fdcaf6eed7eef3c5bf972b163587f301018dda1324d", - git_commit = "222970e9947371fcd6ba948c9ce1e073cf3ff673", + sha256 = "b40f77d8c9a39bdbb792852157bb2b53dc07bf265d8ff1c6e3551e2c00b8cac0", + git_commit = "30ae60ef11221bb5d3f5a972c7ac45b8d28a4471", ) # Import all of TensorFlow Serving's external dependencies. From 125190edc8c509ff602e0d8431e8618c432b42cc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 9 Nov 2021 12:01:50 -0800 Subject: [PATCH 5597/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c8de1a70-39cf-451e-8e3e-fe38a285c3e0 PiperOrigin-RevId: 408669936 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e64f4181257..448ebd2b490 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b40f77d8c9a39bdbb792852157bb2b53dc07bf265d8ff1c6e3551e2c00b8cac0", - git_commit = "30ae60ef11221bb5d3f5a972c7ac45b8d28a4471", + sha256 = "2d6fb6fd3a7b55db666ba7d91670b4e178562436ec3c3d48a2f46f43015c8ec8", + git_commit = "9f6d8c0dd76f9e87e3d40afc0b5d47264074d5d5", ) # Import all of TensorFlow Serving's external dependencies. From 28496e98af80162ffdc8e449c71fac3a6b06cf12 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 9 Nov 2021 18:01:34 -0800 Subject: [PATCH 5598/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a98b110f-a961-4af3-98a9-e0ee456e708f PiperOrigin-RevId: 408750673 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 448ebd2b490..cbcacc3dc5e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2d6fb6fd3a7b55db666ba7d91670b4e178562436ec3c3d48a2f46f43015c8ec8", - git_commit = "9f6d8c0dd76f9e87e3d40afc0b5d47264074d5d5", + sha256 = "bdb5b40378ec4c453cff79d7d669bbd566857aa7f8a185dd058dc63cdd469b35", + git_commit = "eb6308d8718d4d7fa6cb8f64e679a5672f729e78", ) # Import all of TensorFlow Serving's external dependencies. From 10f052dc764eed05dc83f586c21e998993ad7137 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Nov 2021 00:02:08 -0800 Subject: [PATCH 5599/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/027f6172-a4dd-427e-80c5-65845634427a PiperOrigin-RevId: 408800458 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cbcacc3dc5e..919982c0cfb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bdb5b40378ec4c453cff79d7d669bbd566857aa7f8a185dd058dc63cdd469b35", - git_commit = "eb6308d8718d4d7fa6cb8f64e679a5672f729e78", + sha256 = "05366579a278b98078606aec440f8e235ccdd4431203bdb006ad52bd993da00f", + git_commit = "c8a99ccd061ebbcda8dd57edf31111c6082fe32c", ) # Import all of TensorFlow Serving's external dependencies. From 1f0f295ca733c42b1c51673457d21d789e6d33ed Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Nov 2021 06:01:48 -0800 Subject: [PATCH 5600/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/25e56cb5-66d0-44a1-936d-ee9c1d09210d PiperOrigin-RevId: 408858377 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 919982c0cfb..148318fc19e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "05366579a278b98078606aec440f8e235ccdd4431203bdb006ad52bd993da00f", - git_commit = "c8a99ccd061ebbcda8dd57edf31111c6082fe32c", + sha256 = "8a81329d61a727e4f8d1b41a5f749c834908307ca36f572de19550836154895a", + git_commit = "33dc8e4b4d4115b308cc55bd99ed5a9cd8b36b4c", ) # Import all of TensorFlow Serving's external dependencies. From 785212d22dee26ad9a0e1304647c35758b89e640 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Nov 2021 12:01:40 -0800 Subject: [PATCH 5601/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bd1a1219-dc65-457f-bb08-8578065a7864 PiperOrigin-RevId: 408941386 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 148318fc19e..1202378d183 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8a81329d61a727e4f8d1b41a5f749c834908307ca36f572de19550836154895a", - git_commit = "33dc8e4b4d4115b308cc55bd99ed5a9cd8b36b4c", + sha256 = "d5899984e6aaa59429fd1cf290800a603dcffb4d2d2e1598dff300e0c92c1f41", + git_commit = "274df9b02330b790aa8de1cee164b70f72b9b244", ) # Import all of TensorFlow Serving's external dependencies. From fca9608d4f4a2e6149b8b2cbf0ba895f350661bb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Nov 2021 18:01:59 -0800 Subject: [PATCH 5602/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ca84fb3b-3826-4dda-a1ea-6bf95726c907 PiperOrigin-RevId: 409023801 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1202378d183..0824e255661 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d5899984e6aaa59429fd1cf290800a603dcffb4d2d2e1598dff300e0c92c1f41", - git_commit = "274df9b02330b790aa8de1cee164b70f72b9b244", + sha256 = "d0a7a0888708d9549d67ee65270d5f934844c3136ff17aa32d36d75404ecf0f5", + git_commit = "e86e1ecbfb02fd90a2a7177af9c8e04850a1550b", ) # Import all of TensorFlow Serving's external dependencies. From dd30a7e67e50749831e59013cd9a5210bee4b936 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Nov 2021 00:02:11 -0800 Subject: [PATCH 5603/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6869c15f-1b1d-4472-9d9d-250ae9865c95 PiperOrigin-RevId: 409074086 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0824e255661..f014712d617 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d0a7a0888708d9549d67ee65270d5f934844c3136ff17aa32d36d75404ecf0f5", - git_commit = "e86e1ecbfb02fd90a2a7177af9c8e04850a1550b", + sha256 = "0df9803d3c7064b5e6dbbdd0268a0e2fe3c8c9f59db304da332edc255c1e88a2", + git_commit = "91b4885d29b8f4d52b66ab2bfb2870fea0c64523", ) # Import all of TensorFlow Serving's external dependencies. From 74983b2f95d0e101cfb92433ee4f54e7c18acf19 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Nov 2021 06:01:38 -0800 Subject: [PATCH 5604/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bea71e1e-1afe-4136-bb25-c06525618023 PiperOrigin-RevId: 409128215 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f014712d617..9ab7d10f925 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0df9803d3c7064b5e6dbbdd0268a0e2fe3c8c9f59db304da332edc255c1e88a2", - git_commit = "91b4885d29b8f4d52b66ab2bfb2870fea0c64523", + sha256 = "c9eccb51d6e28d3b95a34ae09bca796660a76cd30a7e360094717b6b7ffedb82", + git_commit = "07768212a1df974a8487fe6badc161773164541c", ) # Import all of TensorFlow Serving's external dependencies. From 04bc290974389d23ba634f03bd7a9325fe49ab4f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Nov 2021 12:01:39 -0800 Subject: [PATCH 5605/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0a33f651-19d5-432f-b530-3dc672deb350 PiperOrigin-RevId: 409208260 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9ab7d10f925..e1663c356c7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c9eccb51d6e28d3b95a34ae09bca796660a76cd30a7e360094717b6b7ffedb82", - git_commit = "07768212a1df974a8487fe6badc161773164541c", + sha256 = "0cb2a60b869eef8dc95131406630d4e0122b0365e3fb3d467cce2f989561c49a", + git_commit = "240655511cd3e701155f944a972db71b6c0b1bb6", ) # Import all of TensorFlow Serving's external dependencies. From adf5428b4600657b946a570cc99840afb0577362 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Nov 2021 18:01:43 -0800 Subject: [PATCH 5606/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ed127e9d-e930-4638-b812-6def52bf25d2 PiperOrigin-RevId: 409289479 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e1663c356c7..a2e486d8aaf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0cb2a60b869eef8dc95131406630d4e0122b0365e3fb3d467cce2f989561c49a", - git_commit = "240655511cd3e701155f944a972db71b6c0b1bb6", + sha256 = "86c3e127c692e9964a1408f9a567e7658a0693af80fcaf37c40aae52e8526337", + git_commit = "84f24fd0492e43dee7a5a5028d37b628d3b86587", ) # Import all of TensorFlow Serving's external dependencies. From 4b685c58af75fa7802e7e3d6147d94e12088bd0a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Nov 2021 00:01:49 -0800 Subject: [PATCH 5607/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e8a06719-b0d3-47a3-86a1-9bebe830220f PiperOrigin-RevId: 409337099 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a2e486d8aaf..8682deff422 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "86c3e127c692e9964a1408f9a567e7658a0693af80fcaf37c40aae52e8526337", - git_commit = "84f24fd0492e43dee7a5a5028d37b628d3b86587", + sha256 = "8e0a3d56536bf902deb635e3b194b1a70084373d0b683a72a969ec10eceab3c4", + git_commit = "da585e4c3aee1745aa3e425efb4f1b60019f3e26", ) # Import all of TensorFlow Serving's external dependencies. From 054140352ce837ea5060d76dc36a99ab2d0c43cf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Nov 2021 06:01:34 -0800 Subject: [PATCH 5608/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a1cebcc7-5fb4-4fa4-b9f2-825367f05234 PiperOrigin-RevId: 409391935 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8682deff422..30452671cce 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8e0a3d56536bf902deb635e3b194b1a70084373d0b683a72a969ec10eceab3c4", - git_commit = "da585e4c3aee1745aa3e425efb4f1b60019f3e26", + sha256 = "36dcc93ab8e56d1b9088007e3aa5bf3ba8a91346221168736a223f6316f88045", + git_commit = "57ae041c68bf5fae125acd7dadccf95a413bc281", ) # Import all of TensorFlow Serving's external dependencies. From 6ece2f5af9baf33f1efb90ff35495186f0e636de Mon Sep 17 00:00:00 2001 From: Dero Gharibian Date: Fri, 12 Nov 2021 11:14:08 -0800 Subject: [PATCH 5609/8103] Internal change. PiperOrigin-RevId: 409456556 --- .../tensorflow/bundle_factory_util.cc | 6 +++++ .../tensorflow/bundle_factory_util.h | 5 ++++ .../tensorflow/saved_model_bundle_factory.cc | 4 ++- .../servables/tensorflow/serving_session.h | 27 +++++++++++++++++++ .../tensorflow/session_bundle_config.proto | 7 ++++- .../session_bundle/oss/session_bundle_util.cc | 5 ++++ .../session_bundle/session_bundle_util.h | 7 +++++ 7 files changed, 59 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_util.cc b/tensorflow_serving/servables/tensorflow/bundle_factory_util.cc index 4b9b899f9dd..374da84cd2e 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_util.cc +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_util.cc @@ -125,5 +125,11 @@ Status WrapSession(std::unique_ptr* session) { return Status::OK(); } +Status WrapSessionIgnoreThreadPoolOptions(std::unique_ptr* session) { + session->reset( + new SessionWrapperIgnoreThreadPoolOptions(std::move(*session))); + return Status::OK(); +} + } // namespace serving } // namespace tensorflow diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_util.h b/tensorflow_serving/servables/tensorflow/bundle_factory_util.h index 753765c8d1e..8da940e07a9 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_util.h +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_util.h @@ -98,6 +98,11 @@ Status WrapSessionForBatching( // Wraps a session in a new session that only supports Run() without batching. Status WrapSession(std::unique_ptr* session); +// Wraps a session in a new session that only supports Run() without threading +// parameters. +// TODO(b/205884936): Add test case. +Status WrapSessionIgnoreThreadPoolOptions(std::unique_ptr* session); + // Construct Queue Options from BatchingParameters. template typename SharedBatchScheduler::QueueOptions GetQueueOptions( diff --git a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc index c3965c9ef8a..c3d449cfa19 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_bundle_factory.cc @@ -156,7 +156,9 @@ Status SavedModelBundleFactory::InternalCreateSavedModelBundle( (*bundle)->meta_graph_def.mutable_signature_def()->swap( *metagraph.mutable_signature_def()); } - if (config_.has_batching_parameters()) { + if (config_.wrap_session_with_no_threading_params()) { + return WrapSessionIgnoreThreadPoolOptions(&(*bundle)->session); + } else if (config_.has_batching_parameters()) { LOG(INFO) << "Wrapping session to perform batch processing"; if (batch_scheduler_ == nullptr) { return errors::Internal("batch_scheduler_ not set"); diff --git a/tensorflow_serving/servables/tensorflow/serving_session.h b/tensorflow_serving/servables/tensorflow/serving_session.h index 5b4e8a75893..8ba132ae8b4 100644 --- a/tensorflow_serving/servables/tensorflow/serving_session.h +++ b/tensorflow_serving/servables/tensorflow/serving_session.h @@ -93,6 +93,33 @@ class ServingSessionWrapper : public ServingSession { TF_DISALLOW_COPY_AND_ASSIGN(ServingSessionWrapper); }; +// Subclass of SessionWrapper which reroutes Run() calls with +// thread_pool_options to Run() without those options. This is to provide +// support for RemoteSession::Run which does not implement the overloaded Run() +// method with thread pool options. +class SessionWrapperIgnoreThreadPoolOptions : public ServingSessionWrapper { + public: + explicit SessionWrapperIgnoreThreadPoolOptions( + std::unique_ptr wrapped) + : ServingSessionWrapper(std::move(wrapped)) { + VLOG(2) << "Created the SessionWrapperIgnoreThreadPoolOptions around the " + "Session."; + } + + Status Run(const RunOptions& run_options, + const std::vector>& inputs, + const std::vector& output_tensor_names, + const std::vector& target_node_names, + std::vector* outputs, RunMetadata* run_metadata, + const thread::ThreadPoolOptions& thread_pool_options) override { + return ServingSessionWrapper::Run(run_options, inputs, output_tensor_names, + target_node_names, outputs, run_metadata); + } + + private: + TF_DISALLOW_COPY_AND_ASSIGN(SessionWrapperIgnoreThreadPoolOptions); +}; + } // namespace serving } // namespace tensorflow diff --git a/tensorflow_serving/servables/tensorflow/session_bundle_config.proto b/tensorflow_serving/servables/tensorflow/session_bundle_config.proto index 74741fa0346..6cba9ba3b8d 100644 --- a/tensorflow_serving/servables/tensorflow/session_bundle_config.proto +++ b/tensorflow_serving/servables/tensorflow/session_bundle_config.proto @@ -94,7 +94,7 @@ message SessionBundleConfig { // Tries to use infra validation result to estimate resource usage. bool resource_estimation_uses_validation_result = 784; - int32 num_tflite_interpreters = 785 [deprecated=true]; + int32 num_tflite_interpreters = 785 [deprecated = true]; // EXPERIMENTAL. THIS FIELD MAY CHANGE OR GO AWAY. USE WITH CAUTION. // // Number of TFLite interpreters in an interpreter pool of TfLiteSession. @@ -104,6 +104,11 @@ message SessionBundleConfig { // // Number of TFLite interpreter pools in a TfLiteSession. int32 num_tflite_pools = 787; + + // EXPERIMENTAL. THIS FIELD MAY CHANGE OR GO AWAY. USE WITH CAUTION. + // + // Use SessionWrapperIgnoreThreadPoolOptions instead. + bool wrap_session_with_no_threading_params = 788; } // Batching parameters. Each individual parameter is optional. If omitted, the diff --git a/tensorflow_serving/session_bundle/oss/session_bundle_util.cc b/tensorflow_serving/session_bundle/oss/session_bundle_util.cc index beea4a7e49b..adec8df3f99 100644 --- a/tensorflow_serving/session_bundle/oss/session_bundle_util.cc +++ b/tensorflow_serving/session_bundle/oss/session_bundle_util.cc @@ -26,6 +26,11 @@ namespace serving { namespace session_bundle { +Status SetGraphRewriter( + std::function&& rewriter) { + return errors::Unimplemented("This functionality is not implemented."); +} + Status ConvertSignaturesToSignatureDefs(MetaGraphDef* meta_graph_def) { return errors::Unimplemented("Session Bundle is deprecated and removed."); } diff --git a/tensorflow_serving/session_bundle/session_bundle_util.h b/tensorflow_serving/session_bundle/session_bundle_util.h index 34fbcceb35c..b7056cf7723 100644 --- a/tensorflow_serving/session_bundle/session_bundle_util.h +++ b/tensorflow_serving/session_bundle/session_bundle_util.h @@ -100,6 +100,13 @@ Status GetNamedSignature(const string& name, const tensorflow::MetaGraphDef& meta_graph_def, Signature* default_signature); +// EXPERIMENTAL. THIS METHOD MAY CHANGE OR GO AWAY. USE WITH CAUTION. +// Sets a global graph rewrite function that is called on all saved models +// immediately after metagraph load, but before session creation. This function +// can only be called once. +Status SetGraphRewriter( + std::function&& rewriter); + } // namespace session_bundle } // namespace serving } // namespace tensorflow From 549c53f9adc93850b645e3d7c71049cb90229617 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Nov 2021 12:02:06 -0800 Subject: [PATCH 5610/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e453ebef-c676-48f6-b9d0-798473a12628 PiperOrigin-RevId: 409468952 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 30452671cce..bf390e94524 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "36dcc93ab8e56d1b9088007e3aa5bf3ba8a91346221168736a223f6316f88045", - git_commit = "57ae041c68bf5fae125acd7dadccf95a413bc281", + sha256 = "b6d53fd6d6b09b200240e94342ef38ed1723bdac51a7236155a9ae7feafa0b78", + git_commit = "f994697f9b6bba0efc41513d1783b3f64ad46992", ) # Import all of TensorFlow Serving's external dependencies. From d9a18a4791ad47b8823a6913745a51d3a8ecd434 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Nov 2021 18:01:25 -0800 Subject: [PATCH 5611/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a6efb70b-f0fd-4b29-b43a-990fb74f89cd PiperOrigin-RevId: 409553372 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bf390e94524..1c06a7d6b7d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b6d53fd6d6b09b200240e94342ef38ed1723bdac51a7236155a9ae7feafa0b78", - git_commit = "f994697f9b6bba0efc41513d1783b3f64ad46992", + sha256 = "f90381e5c5c79e73f3bd9dbb68c1babc0ff01304d3071bb4d596728bd88b11d9", + git_commit = "dfed4f9cfcad43f950ccb8748e8371d03e57822d", ) # Import all of TensorFlow Serving's external dependencies. From f493504f47f5ec6bcff1bb034272fbad6830047c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 13 Nov 2021 00:01:47 -0800 Subject: [PATCH 5612/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6dfbe4cc-7e37-499e-a5c4-3806ed023009 PiperOrigin-RevId: 409599710 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1c06a7d6b7d..32d93d68bda 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f90381e5c5c79e73f3bd9dbb68c1babc0ff01304d3071bb4d596728bd88b11d9", - git_commit = "dfed4f9cfcad43f950ccb8748e8371d03e57822d", + sha256 = "48a271e1caf5b9cb098229debacce6f057d57bcbd343b68999cef86b66605707", + git_commit = "cb0d34b71497d5bec4eaf86eddf5d9cbcd676854", ) # Import all of TensorFlow Serving's external dependencies. From 0dbc45a99cddfe06b283b1fdd441adf71aaa7646 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 13 Nov 2021 06:01:36 -0800 Subject: [PATCH 5613/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/715e0a6b-e5b9-469e-836f-9155374e3be7 PiperOrigin-RevId: 409650049 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 32d93d68bda..1e8c2b308cf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "48a271e1caf5b9cb098229debacce6f057d57bcbd343b68999cef86b66605707", - git_commit = "cb0d34b71497d5bec4eaf86eddf5d9cbcd676854", + sha256 = "5531111a83462d4a7674099c657a827abd7cc553541e0beebeac9433671e0685", + git_commit = "af2cab9355e8d5bf48c2c7042b3faaf31262ea8c", ) # Import all of TensorFlow Serving's external dependencies. From 2ed50d2675b6de4850307782ef0c8caf4f933fd1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 13 Nov 2021 12:02:15 -0800 Subject: [PATCH 5614/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fd4c22b0-18d6-4384-b051-1aeb10800d6d PiperOrigin-RevId: 409696800 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1e8c2b308cf..5b4e37b1019 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5531111a83462d4a7674099c657a827abd7cc553541e0beebeac9433671e0685", - git_commit = "af2cab9355e8d5bf48c2c7042b3faaf31262ea8c", + sha256 = "c3dffe44d27a672761a574ad8ecb3b369bd77332028cbd99e70717308c4f4fa8", + git_commit = "7a6a7276fa49f933156f39fc707b2f67a7da93d0", ) # Import all of TensorFlow Serving's external dependencies. From 7731c68cca2cbfe7f9c311c8a6542ddb5a4e26e1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 13 Nov 2021 18:01:47 -0800 Subject: [PATCH 5615/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/cec53689-6ce0-4ea4-bf2d-c0505ede83e3 PiperOrigin-RevId: 409731866 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5b4e37b1019..4df56c43ae9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c3dffe44d27a672761a574ad8ecb3b369bd77332028cbd99e70717308c4f4fa8", - git_commit = "7a6a7276fa49f933156f39fc707b2f67a7da93d0", + sha256 = "4e5d0ce7f0a1ef74d816bd56467b36e33c71d2ebb5ccb5b3ba9a1a3c64ce71da", + git_commit = "3beeeff5abbaf24562722c4cbe3af8614346286c", ) # Import all of TensorFlow Serving's external dependencies. From fc3d279b181924b3b331ebe620ee82858b52ece6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 14 Nov 2021 00:01:57 -0800 Subject: [PATCH 5616/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b8f19b20-9b1e-4af4-bccf-f2b3a44176ce PiperOrigin-RevId: 409762761 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4df56c43ae9..cd97c48b603 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4e5d0ce7f0a1ef74d816bd56467b36e33c71d2ebb5ccb5b3ba9a1a3c64ce71da", - git_commit = "3beeeff5abbaf24562722c4cbe3af8614346286c", + sha256 = "d5e972cf35ce3391ba59b11332dc0b602190ff3c45eac7c6eeda09f8ee16e3b6", + git_commit = "b2dea643050b1a94aa4b08ed74de2f2c2a7f1633", ) # Import all of TensorFlow Serving's external dependencies. From 4895db03fbbb8334a0176b9d41670acc7dea2919 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 14 Nov 2021 06:02:02 -0800 Subject: [PATCH 5617/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c88b9891-d044-4fbe-b546-a44b382f646b PiperOrigin-RevId: 409796233 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cd97c48b603..b1ab13adce2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d5e972cf35ce3391ba59b11332dc0b602190ff3c45eac7c6eeda09f8ee16e3b6", - git_commit = "b2dea643050b1a94aa4b08ed74de2f2c2a7f1633", + sha256 = "5f866428925198bb121f38f51ec84b75e491be9f59b261b17889a10a4e4c6fdf", + git_commit = "19e4297774bb928580a5bae42482c04ba05655a4", ) # Import all of TensorFlow Serving's external dependencies. From 7bc90bd5a8486c75f3ca2084dbd18a344284a2b9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 14 Nov 2021 12:01:50 -0800 Subject: [PATCH 5618/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b765e6a4-9bd4-4c77-a711-a30fba6b1126 PiperOrigin-RevId: 409826375 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b1ab13adce2..8e8b9101b61 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5f866428925198bb121f38f51ec84b75e491be9f59b261b17889a10a4e4c6fdf", - git_commit = "19e4297774bb928580a5bae42482c04ba05655a4", + sha256 = "b44c39fd83e98b7190d88b0da40fbe146b4ebe0267603f7cb23fd1679d189569", + git_commit = "bc8993215515f3f8b5191f8429ef242433f9132a", ) # Import all of TensorFlow Serving's external dependencies. From 19fb3f31c832ea103aa6af1ae0756dbeaea9e1e4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 14 Nov 2021 18:02:00 -0800 Subject: [PATCH 5619/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5310dfe9-f5e0-4c67-b2e7-7a5981308e2d PiperOrigin-RevId: 409860120 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8e8b9101b61..c0f6912425f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b44c39fd83e98b7190d88b0da40fbe146b4ebe0267603f7cb23fd1679d189569", - git_commit = "bc8993215515f3f8b5191f8429ef242433f9132a", + sha256 = "d06cd7aa16159c2b997a8c5fa35b3dee8edef3938e6834e5949420e2ece634a2", + git_commit = "061e4426d13572b986bcd5aa2a3354ee35d7089a", ) # Import all of TensorFlow Serving's external dependencies. From 8f296242ee0b2123f6efb77de0d164df6f18c498 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 15 Nov 2021 00:02:25 -0800 Subject: [PATCH 5620/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3b1c368f-5934-41a6-9cc4-0c174365c411 PiperOrigin-RevId: 409899837 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c0f6912425f..ff4aa70fdba 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d06cd7aa16159c2b997a8c5fa35b3dee8edef3938e6834e5949420e2ece634a2", - git_commit = "061e4426d13572b986bcd5aa2a3354ee35d7089a", + sha256 = "e68dfd8fbd484296fb072dc4323ff195944e2a8266f683ac92860fde342b4854", + git_commit = "c53b9bf2c0b516194a144b246d96d8a2183d7302", ) # Import all of TensorFlow Serving's external dependencies. From 71b832c6c13c17a424c500f7f4b9f27ab052798a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 15 Nov 2021 06:01:42 -0800 Subject: [PATCH 5621/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8d0d72d5-f9a7-4116-ab77-98e3163dd2b9 PiperOrigin-RevId: 409957661 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ff4aa70fdba..221961815f1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e68dfd8fbd484296fb072dc4323ff195944e2a8266f683ac92860fde342b4854", - git_commit = "c53b9bf2c0b516194a144b246d96d8a2183d7302", + sha256 = "11c4e5e6ec189a5ff314a16931375eb5be401450188e7522504f6c368eb186bd", + git_commit = "9ea420427a03857e93f53cef080cd81838e5ae55", ) # Import all of TensorFlow Serving's external dependencies. From 09580ae69be26d33c2098732bcc5857c40cb542f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 15 Nov 2021 12:02:29 -0800 Subject: [PATCH 5622/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5703efbe-0bd9-497d-aab1-2ebe565e1c70 PiperOrigin-RevId: 410044657 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 221961815f1..6377b6a30be 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "11c4e5e6ec189a5ff314a16931375eb5be401450188e7522504f6c368eb186bd", - git_commit = "9ea420427a03857e93f53cef080cd81838e5ae55", + sha256 = "9421aaf6bb2fa5719ef7154577ed7b249332ae9c7b1b44e1ed2bfae6c1b1306a", + git_commit = "8b7add39e19a9f855ef837f2e81b7ee8c61fe604", ) # Import all of TensorFlow Serving's external dependencies. From 54d779b4c196169ae95bc8aa324171cc7137d529 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 15 Nov 2021 20:02:06 -0800 Subject: [PATCH 5623/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e09e9022-452f-4ffb-824c-8339e50830d9 PiperOrigin-RevId: 410144889 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6377b6a30be..84682e86ec6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9421aaf6bb2fa5719ef7154577ed7b249332ae9c7b1b44e1ed2bfae6c1b1306a", - git_commit = "8b7add39e19a9f855ef837f2e81b7ee8c61fe604", + sha256 = "6e51ace5fe17e327e6be6aeff56eb4025deea3083f3654c6b7e8e61f7caca391", + git_commit = "8ae4d415050ba3a70e30367909e0dc77e3ee0378", ) # Import all of TensorFlow Serving's external dependencies. From 61876f6f4644c06e8591bc430efedfb7e77ab56a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 16 Nov 2021 00:01:42 -0800 Subject: [PATCH 5624/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1a394f3b-ce76-4348-8192-bb448d522f80 PiperOrigin-RevId: 410175408 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 84682e86ec6..b5cef87bca2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6e51ace5fe17e327e6be6aeff56eb4025deea3083f3654c6b7e8e61f7caca391", - git_commit = "8ae4d415050ba3a70e30367909e0dc77e3ee0378", + sha256 = "f921e875933224c5e745e5ceea2fb44ad19cd519a820273b4ad0bd21d4f3a658", + git_commit = "31aa1f3cc8799a1025611a5c2f0b1d9a58803a64", ) # Import all of TensorFlow Serving's external dependencies. From a4b8a1b665614d9ac31a6d3b7af1d11c02a29017 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Nov 2021 18:02:27 -0800 Subject: [PATCH 5625/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/806d4c40-0aea-4d55-ac71-f78b223a588c PiperOrigin-RevId: 410942764 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b5cef87bca2..7f9ee8b1639 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f921e875933224c5e745e5ceea2fb44ad19cd519a820273b4ad0bd21d4f3a658", - git_commit = "31aa1f3cc8799a1025611a5c2f0b1d9a58803a64", + sha256 = "ac14e347edc7a0bdd19c82fe266d33859a76afba7579bfe2fdf41d4d12386a8a", + git_commit = "b2f976049473041b2046e4d2a85efe9d058d7651", ) # Import all of TensorFlow Serving's external dependencies. From 14c64dc5798e2dde18d4678275954b42266cd3e5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Nov 2021 00:02:20 -0800 Subject: [PATCH 5626/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/593cfa41-f3a6-46d1-81cd-d14db7290f1e PiperOrigin-RevId: 410988541 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7f9ee8b1639..8bd3f99bf77 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ac14e347edc7a0bdd19c82fe266d33859a76afba7579bfe2fdf41d4d12386a8a", - git_commit = "b2f976049473041b2046e4d2a85efe9d058d7651", + sha256 = "e5c871b1145ea5e9b69e63879015e77d04fc95447ed4368881f84be5ff0fde2d", + git_commit = "4cb9a07e96ef039ef1074d76cecc7043020b1b80", ) # Import all of TensorFlow Serving's external dependencies. From 98d002878af8f1939d398a331ef64893004661ad Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Nov 2021 06:02:54 -0800 Subject: [PATCH 5627/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/93165df6-b763-4193-9ed8-0d08275e914b PiperOrigin-RevId: 411042997 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8bd3f99bf77..3666d056719 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e5c871b1145ea5e9b69e63879015e77d04fc95447ed4368881f84be5ff0fde2d", - git_commit = "4cb9a07e96ef039ef1074d76cecc7043020b1b80", + sha256 = "ffef4449611fdfc31212f89aed1c923c0cf992c8c3a81b16fdd5fc2775397480", + git_commit = "89a6f43026af75bd4ed9f961a89e983d47f3d593", ) # Import all of TensorFlow Serving's external dependencies. From ac1d9a857e774bc1bf39e3b4ce7bbc996805f70a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Nov 2021 12:01:48 -0800 Subject: [PATCH 5628/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/41fb5b59-23f8-4a79-9da2-594cae33a5cf PiperOrigin-RevId: 411113565 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3666d056719..41a75728549 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ffef4449611fdfc31212f89aed1c923c0cf992c8c3a81b16fdd5fc2775397480", - git_commit = "89a6f43026af75bd4ed9f961a89e983d47f3d593", + sha256 = "7856f4ad239fe08c7298bb7d465f27b49a504b7c1be6fd4e512f629f84fab5a4", + git_commit = "c97855409de2974cc4614cd4ad354ac0870d85bf", ) # Import all of TensorFlow Serving's external dependencies. From eb87f119de897eb9d6e59f7805f2040466ceee9f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Nov 2021 18:04:41 -0800 Subject: [PATCH 5629/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/504396d4-be07-4019-9895-260f3b7e81f8 PiperOrigin-RevId: 411182591 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 41a75728549..b69cbe7bcb4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7856f4ad239fe08c7298bb7d465f27b49a504b7c1be6fd4e512f629f84fab5a4", - git_commit = "c97855409de2974cc4614cd4ad354ac0870d85bf", + sha256 = "e4e1e32477c6ef25d550f943c6c7f857f8af2dbfb10700f9b550a1b2528ac60e", + git_commit = "b0d9efd1c9c72786b49b2f1471298a87def3f38e", ) # Import all of TensorFlow Serving's external dependencies. From 3aa218ee5e8e342a58726dadddd3528b5b449fa4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 20 Nov 2021 00:01:42 -0800 Subject: [PATCH 5630/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e561d077-6594-49d9-bc81-c7db5db699a9 PiperOrigin-RevId: 411218784 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b69cbe7bcb4..8809e077a48 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e4e1e32477c6ef25d550f943c6c7f857f8af2dbfb10700f9b550a1b2528ac60e", - git_commit = "b0d9efd1c9c72786b49b2f1471298a87def3f38e", + sha256 = "1561bc2331462dd6b93145d5ed24f60f2b4a2bd3cdebcb77a76607ce7284be92", + git_commit = "0b583f00a8be8348b3eb1b7be63f39de4d44c191", ) # Import all of TensorFlow Serving's external dependencies. From 2c5a7ea403082e9002501eb2584bc8f2994b2187 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 20 Nov 2021 06:02:01 -0800 Subject: [PATCH 5631/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/03dc5266-ac5e-4f04-80d2-a8d3aeacb8a7 PiperOrigin-RevId: 411254973 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8809e077a48..9c78594af7f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1561bc2331462dd6b93145d5ed24f60f2b4a2bd3cdebcb77a76607ce7284be92", - git_commit = "0b583f00a8be8348b3eb1b7be63f39de4d44c191", + sha256 = "c301bc909866e836f61e077244b2384055a6e64d827e8b964cc4ef7727468af0", + git_commit = "3b4b5130e3b7eb7ed665394b1e56ddc507f817ce", ) # Import all of TensorFlow Serving's external dependencies. From 9c02043a492657875e66069670c29da1ec9f5e05 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 20 Nov 2021 12:01:35 -0800 Subject: [PATCH 5632/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9130ac52-c4f4-40bc-9692-8c4e78ebc5f4 PiperOrigin-RevId: 411285906 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9c78594af7f..9a7a89e6748 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c301bc909866e836f61e077244b2384055a6e64d827e8b964cc4ef7727468af0", - git_commit = "3b4b5130e3b7eb7ed665394b1e56ddc507f817ce", + sha256 = "268c42aa75c2a15d04c5e098ce730cdc4155a9c70d470e228a1defedaff88abe", + git_commit = "df68913fceefc907f6109cd7b5c247db491020cf", ) # Import all of TensorFlow Serving's external dependencies. From 953dc4795304933a5091a6730b15b2e4b274a1c1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 21 Nov 2021 00:01:37 -0800 Subject: [PATCH 5633/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ae198caf-08b1-46c3-80f5-6c0cd4f80638 PiperOrigin-RevId: 411346773 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9a7a89e6748..7fed2fc8c7c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "268c42aa75c2a15d04c5e098ce730cdc4155a9c70d470e228a1defedaff88abe", - git_commit = "df68913fceefc907f6109cd7b5c247db491020cf", + sha256 = "04cd6d2c64cdb8932e2e8212e9eaf57e1b885208971131c495927536d5884fc2", + git_commit = "ce6c2f87fe7c59b42745e1e20ad8cd15e451d3e5", ) # Import all of TensorFlow Serving's external dependencies. From 2896b60e9c38169d055210dbf9839a920e0d20e8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 21 Nov 2021 06:01:57 -0800 Subject: [PATCH 5634/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/67f7dc69-7008-4496-9f21-ad3d42a467ad PiperOrigin-RevId: 411381632 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7fed2fc8c7c..2473052cc30 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "04cd6d2c64cdb8932e2e8212e9eaf57e1b885208971131c495927536d5884fc2", - git_commit = "ce6c2f87fe7c59b42745e1e20ad8cd15e451d3e5", + sha256 = "3529a6919a19d304014c4e9054be5e8e184f461277a67ae818a8720a7cf8921f", + git_commit = "e948532a7253ddab639ee688e0c66dad5075c8c1", ) # Import all of TensorFlow Serving's external dependencies. From dc59ed2b7bb34dcc19dedfe442301411f7fe35da Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 21 Nov 2021 18:01:33 -0800 Subject: [PATCH 5635/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a865e09d-fc9d-4251-8081-4dae96de1a04 PiperOrigin-RevId: 411444387 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2473052cc30..de7862fda87 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3529a6919a19d304014c4e9054be5e8e184f461277a67ae818a8720a7cf8921f", - git_commit = "e948532a7253ddab639ee688e0c66dad5075c8c1", + sha256 = "6fa8e50a27a34b4beebb88fbbb8318fa095b834508c5dc90711fd0337f167232", + git_commit = "fa496a9a11f113d516f270a599f71d0139d65776", ) # Import all of TensorFlow Serving's external dependencies. From 68ec76186b3cca00cf6e00cb100981d29edde478 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 22 Nov 2021 00:01:57 -0800 Subject: [PATCH 5636/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/be720322-cb15-4773-8c83-0ec82c3374db PiperOrigin-RevId: 411483351 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index de7862fda87..c252ecbca1b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6fa8e50a27a34b4beebb88fbbb8318fa095b834508c5dc90711fd0337f167232", - git_commit = "fa496a9a11f113d516f270a599f71d0139d65776", + sha256 = "df9a5258a1858e8f6e4a11ae25e064153ae7e3b46ad953c91d1914862edf0823", + git_commit = "73f0dd6c781b84f047e36470f3b3a934035b02e1", ) # Import all of TensorFlow Serving's external dependencies. From b8f510b6fac2ad112b95de9cabd43fe18096e494 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 22 Nov 2021 06:02:03 -0800 Subject: [PATCH 5637/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/dd4500e0-4462-4e9a-904d-4c18f3c25121 PiperOrigin-RevId: 411539935 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c252ecbca1b..876538d2e96 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "df9a5258a1858e8f6e4a11ae25e064153ae7e3b46ad953c91d1914862edf0823", - git_commit = "73f0dd6c781b84f047e36470f3b3a934035b02e1", + sha256 = "09e07c5fc978961a221f62c1bf08ba43c30d4c944e2be27103ab949ce3bedb31", + git_commit = "b1b82cb3e4082bc80370ad8e1af2641d042bd001", ) # Import all of TensorFlow Serving's external dependencies. From aedbfc81d109f2b69af0bd76e5f3923930fd8d13 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 22 Nov 2021 12:03:10 -0800 Subject: [PATCH 5638/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5616e648-4e6e-4ad2-afe0-86c34afb588e PiperOrigin-RevId: 411616365 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 876538d2e96..e64d59a507e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "09e07c5fc978961a221f62c1bf08ba43c30d4c944e2be27103ab949ce3bedb31", - git_commit = "b1b82cb3e4082bc80370ad8e1af2641d042bd001", + sha256 = "c8b0381a4f4beaf31849b07ef3aa1c20bec0408a358dbf166310987ffa633ab7", + git_commit = "90425b5390ea194ceb6802f0280c988cb3db4585", ) # Import all of TensorFlow Serving's external dependencies. From d1ef3752078a4bb566e2b071ac2fdc8549bccefe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 22 Nov 2021 18:01:40 -0800 Subject: [PATCH 5639/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7bf55c1a-5623-4fab-a639-2a8b7ea7bb43 PiperOrigin-RevId: 411689712 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e64d59a507e..1f80604af98 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c8b0381a4f4beaf31849b07ef3aa1c20bec0408a358dbf166310987ffa633ab7", - git_commit = "90425b5390ea194ceb6802f0280c988cb3db4585", + sha256 = "bd470d43e056d247957b67ea397d5166d2471aba9d1ea7a060a7f01e1a5fd3f4", + git_commit = "8a9b43612245a815443e1aaef5b769ce038ee065", ) # Import all of TensorFlow Serving's external dependencies. From 565bfb05c72c3df193bd629ce70bac80d4ee5445 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 23 Nov 2021 00:02:32 -0800 Subject: [PATCH 5640/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/391313e6-f92f-4b08-b081-8a75fee06b8f PiperOrigin-RevId: 411734426 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1f80604af98..763ed285b30 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bd470d43e056d247957b67ea397d5166d2471aba9d1ea7a060a7f01e1a5fd3f4", - git_commit = "8a9b43612245a815443e1aaef5b769ce038ee065", + sha256 = "9b0f4220db7217eada1ee92a9c5dab25a320c05ad7d2ef25edb494abe6f925b7", + git_commit = "f3c361931fe449302953596e8f99fcd737b9390c", ) # Import all of TensorFlow Serving's external dependencies. From 6e3296871d6c6f5177e8ee4e363a2dae73235e77 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 24 Nov 2021 06:02:21 -0800 Subject: [PATCH 5641/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/aaf3a271-8d84-4d7b-8685-5aabe7fbc69e PiperOrigin-RevId: 412039019 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 763ed285b30..68b3e7471f5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9b0f4220db7217eada1ee92a9c5dab25a320c05ad7d2ef25edb494abe6f925b7", - git_commit = "f3c361931fe449302953596e8f99fcd737b9390c", + sha256 = "2d6e412267a54ac80b98909508d3e65e47126e7428d615f3b78227c9b1c7987b", + git_commit = "ec227d650ce462931bf311301f656c4c1cbbbc9f", ) # Import all of TensorFlow Serving's external dependencies. From 4da4af62b59f3c0ef79a25b67cf7c2514b484dc8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 24 Nov 2021 12:02:30 -0800 Subject: [PATCH 5642/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b9d8accb-5363-44d5-a3c6-2f5b22f10801 PiperOrigin-RevId: 412109304 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 68b3e7471f5..934dd7d511a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2d6e412267a54ac80b98909508d3e65e47126e7428d615f3b78227c9b1c7987b", - git_commit = "ec227d650ce462931bf311301f656c4c1cbbbc9f", + sha256 = "c04ad3214d6dc741cba1ceacb3006a35bf10d1574939973c67f0bc43a53942fa", + git_commit = "32cc032bb046e0447335b22b541fe18d43a79985", ) # Import all of TensorFlow Serving's external dependencies. From e7d3334a0bd171941c2955a6773420bdcf10e875 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 24 Nov 2021 18:01:41 -0800 Subject: [PATCH 5643/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7f6d9f8f-40be-44d2-8aa9-3cc6efc5ec0e PiperOrigin-RevId: 412169127 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 934dd7d511a..b88f86f00cf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c04ad3214d6dc741cba1ceacb3006a35bf10d1574939973c67f0bc43a53942fa", - git_commit = "32cc032bb046e0447335b22b541fe18d43a79985", + sha256 = "bbac2c69a872ef4dd2175f902e2cb1832fc78853428a3304a7c4b5a9adfb245f", + git_commit = "8ce8d34bc803c0bd8609fbecdeb9d4ccf1296f68", ) # Import all of TensorFlow Serving's external dependencies. From 5d3f33ece9dad0afa2b70a2520caaa79b764d128 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 25 Nov 2021 00:01:36 -0800 Subject: [PATCH 5644/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ed21d78a-ad31-449f-84d7-ae6274f24a73 PiperOrigin-RevId: 412212177 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b88f86f00cf..16cb26f6c44 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bbac2c69a872ef4dd2175f902e2cb1832fc78853428a3304a7c4b5a9adfb245f", - git_commit = "8ce8d34bc803c0bd8609fbecdeb9d4ccf1296f68", + sha256 = "46880771a9dd8f7d86cee3fb0cccd3bff756eee7d17b82b236a77a87226f1448", + git_commit = "7d5dea790cd72bc7e31c65dcc601ec6d4e328b03", ) # Import all of TensorFlow Serving's external dependencies. From 009f7b626ae862cc17bea5a94d11aab54846feaf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 25 Nov 2021 06:04:57 -0800 Subject: [PATCH 5645/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e1b998dd-c06f-40d1-9fb7-733f71f10d6f PiperOrigin-RevId: 412269075 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 16cb26f6c44..134a2faa524 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "46880771a9dd8f7d86cee3fb0cccd3bff756eee7d17b82b236a77a87226f1448", - git_commit = "7d5dea790cd72bc7e31c65dcc601ec6d4e328b03", + sha256 = "6e5261ca6d7d3b10cccc9d018873868122285301e74ab0448b098197dcc30d63", + git_commit = "2ad78721a48f9dbe675b3d064a50b0bd1ea689c3", ) # Import all of TensorFlow Serving's external dependencies. From d39ebc5418f93031e73811252e116388e57d0faa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 25 Nov 2021 12:01:41 -0800 Subject: [PATCH 5646/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/74c7d895-4353-48d0-9766-10ff52d244e9 PiperOrigin-RevId: 412314550 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 134a2faa524..59a72b27261 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6e5261ca6d7d3b10cccc9d018873868122285301e74ab0448b098197dcc30d63", - git_commit = "2ad78721a48f9dbe675b3d064a50b0bd1ea689c3", + sha256 = "6ca99c1738281f35b90ebb6c3b337ecce8f12968c9ce59a455a3a88847ff28d3", + git_commit = "fc9dcbcb450253f9486ab32a7fdeb8461df462be", ) # Import all of TensorFlow Serving's external dependencies. From f3fbec59798e13cb1f7230fcf891c0ec4113331e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 26 Nov 2021 00:02:05 -0800 Subject: [PATCH 5647/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f87ec0a2-e069-4529-8d1d-450fecffd07e PiperOrigin-RevId: 412389254 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 59a72b27261..a8c4275559a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6ca99c1738281f35b90ebb6c3b337ecce8f12968c9ce59a455a3a88847ff28d3", - git_commit = "fc9dcbcb450253f9486ab32a7fdeb8461df462be", + sha256 = "a0c0ab41bc9d2b916f407f0b8f192f94627a71626f0bb8ec19b16e6519e86096", + git_commit = "46cc2fd99648e1e5cc1622dd784fdfbbc1c3b289", ) # Import all of TensorFlow Serving's external dependencies. From a10dba4a27ff7157d3f65ac1d93dd9e4a0580007 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 26 Nov 2021 06:01:40 -0800 Subject: [PATCH 5648/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/cf732f27-1283-465b-8f85-603a823fdd6f PiperOrigin-RevId: 412437157 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a8c4275559a..8e15d2c3f6d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a0c0ab41bc9d2b916f407f0b8f192f94627a71626f0bb8ec19b16e6519e86096", - git_commit = "46cc2fd99648e1e5cc1622dd784fdfbbc1c3b289", + sha256 = "2c7734ec16d6cb14f0ce7c7cffa954ba6fcf4054c874a8b61569dbd8174ce33a", + git_commit = "a8e78bcce40b362980f2b369f46e39555388332c", ) # Import all of TensorFlow Serving's external dependencies. From 1365e4d757a530be54a4dfbebe9d517c3b38ea5d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 26 Nov 2021 12:01:32 -0800 Subject: [PATCH 5649/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/411e592e-e75a-420e-a81a-becbdf1d3dac PiperOrigin-RevId: 412479644 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8e15d2c3f6d..3401f63bf92 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2c7734ec16d6cb14f0ce7c7cffa954ba6fcf4054c874a8b61569dbd8174ce33a", - git_commit = "a8e78bcce40b362980f2b369f46e39555388332c", + sha256 = "68a1fc3b59b0a06c101e62beeee97f0ca18a40010443eac62641b252f6bb7ef3", + git_commit = "7c700693e03b5803264e80bf1ff506f5721f4750", ) # Import all of TensorFlow Serving's external dependencies. From 342a8088524c33f68e3eb4d66800f01a777ceb38 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 30 Nov 2021 12:52:37 -0800 Subject: [PATCH 5650/8103] Add `--tensorflow_session_config_file` flag to tf serving model server to support custom SessionConfig PiperOrigin-RevId: 413222980 --- tensorflow_serving/model_servers/main.cc | 8 ++++++++ tensorflow_serving/model_servers/server.cc | 6 ++++++ tensorflow_serving/model_servers/server.h | 2 ++ 3 files changed, 16 insertions(+) diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index 2c7be43dced..551b6085943 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -156,6 +156,14 @@ int main(int argc, char** argv) { "Tensorflow session. Auto-configured by default." "Note that this option is ignored if " "--platform_config_file is non-empty."), + tensorflow::Flag( + "tensorflow_session_config_file", + &options.tensorflow_session_config_file, + "If non-empty, read an ascii TensorFlow Session " + "ConfigProto protobuf from the supplied file name. Note, " + "parts of the session config (threads, parallelism etc.) " + "can be overridden if needed, via corresponding command " + "line flags."), tensorflow::Flag("tensorflow_intra_op_parallelism", &options.tensorflow_intra_op_parallelism, "Number of threads to use to parallelize the execution" diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index ca190e8df3e..0d3c76750e5 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -245,6 +245,12 @@ Status Server::BuildAndStart(const Options& server_options) { "server_options.enable_batching to true."); } + if (!server_options.tensorflow_session_config_file.empty()) { + TF_RETURN_IF_ERROR( + ParseProtoTextFile(server_options.tensorflow_session_config_file, + session_bundle_config.mutable_session_config())); + } + session_bundle_config.mutable_session_config() ->mutable_gpu_options() ->set_per_process_gpu_memory_fraction( diff --git a/tensorflow_serving/model_servers/server.h b/tensorflow_serving/model_servers/server.h index 3b944bb0fa3..ed15e153871 100644 --- a/tensorflow_serving/model_servers/server.h +++ b/tensorflow_serving/model_servers/server.h @@ -83,6 +83,8 @@ class Server { bool use_alts_credentials = false; tensorflow::string ssl_config_file; string model_config_file; + // Text proto file for TensorFlow Session ConfigProto. + string tensorflow_session_config_file; // Zero means server will not poll FS for model config file after start-up. tensorflow::int32 fs_model_config_poll_wait_seconds = 0; bool enable_model_warmup = true; From 6d28088f7c3d132190b53df66d860ce86e866efe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 30 Nov 2021 18:01:27 -0800 Subject: [PATCH 5651/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3c517a08-080a-421e-87ea-022572f0bff1 PiperOrigin-RevId: 413288522 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3401f63bf92..7e1ce4c970e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "68a1fc3b59b0a06c101e62beeee97f0ca18a40010443eac62641b252f6bb7ef3", - git_commit = "7c700693e03b5803264e80bf1ff506f5721f4750", + sha256 = "f6a1577af375b3b186639240305febd68e768df49bcf187ccf61a3338fcc708c", + git_commit = "58b34c6c8250983948b5a781b426f6aa01fd47af", ) # Import all of TensorFlow Serving's external dependencies. From b837752669f4a178388f3c5e3cb51f21300a9fc9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 1 Dec 2021 00:01:36 -0800 Subject: [PATCH 5652/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ffc95425-f342-4be3-990f-3bab955910b8 PiperOrigin-RevId: 413335597 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7e1ce4c970e..386721ba4bc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f6a1577af375b3b186639240305febd68e768df49bcf187ccf61a3338fcc708c", - git_commit = "58b34c6c8250983948b5a781b426f6aa01fd47af", + sha256 = "5846a052288acf1d0cdd058cbe3ea07724eea54d66acf50d718e21c4da349d2c", + git_commit = "da1f47fa5a318d94ce2ab5940473241dcfec8717", ) # Import all of TensorFlow Serving's external dependencies. From a7fc5656f0a3eb48213b097188b6a298ddbb9247 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 1 Dec 2021 06:01:24 -0800 Subject: [PATCH 5653/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7e99428e-c53c-48f8-9e1e-f5171e0c759d PiperOrigin-RevId: 413394769 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 386721ba4bc..b54643f2add 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5846a052288acf1d0cdd058cbe3ea07724eea54d66acf50d718e21c4da349d2c", - git_commit = "da1f47fa5a318d94ce2ab5940473241dcfec8717", + sha256 = "97bd7c85853d24122fdb1c8acd2b0a12e587b9ee5441f958d3c891a9f2c8584c", + git_commit = "cce70c0c24e3b046c7d0c9f53a30f2a99c84ab74", ) # Import all of TensorFlow Serving's external dependencies. From a6fdc0738a567b7e3048927ef988d52cef54e909 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 1 Dec 2021 12:01:51 -0800 Subject: [PATCH 5654/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/85c4278f-f3c8-4b91-9bd4-cb44cb4d379b PiperOrigin-RevId: 413476329 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b54643f2add..f380d324fa2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "97bd7c85853d24122fdb1c8acd2b0a12e587b9ee5441f958d3c891a9f2c8584c", - git_commit = "cce70c0c24e3b046c7d0c9f53a30f2a99c84ab74", + sha256 = "72fcccc29c97b4382891445ad61a23d29f45853c743eb8c329b0bbc8310c4ba5", + git_commit = "477656f74ab25857ebbbca012109d8affa7d979d", ) # Import all of TensorFlow Serving's external dependencies. From 7b9d4cfdbd11760237de10a3044718054484c782 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 1 Dec 2021 18:01:57 -0800 Subject: [PATCH 5655/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b8c8a792-69f5-4714-82b5-2088865d92da PiperOrigin-RevId: 413555367 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f380d324fa2..0d958892efb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "72fcccc29c97b4382891445ad61a23d29f45853c743eb8c329b0bbc8310c4ba5", - git_commit = "477656f74ab25857ebbbca012109d8affa7d979d", + sha256 = "c2d61e63b086e354ecc4e1928ac4661844275ec9c1467d65a7343e97101f82fa", + git_commit = "ce829708e91077862a5352b6d545b1167ce89007", ) # Import all of TensorFlow Serving's external dependencies. From 7356fe87b5249f55f83811cd690ed6054a10e9d8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 Dec 2021 00:01:40 -0800 Subject: [PATCH 5656/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7e9c1a7e-1716-4454-a5ab-450e9839c4c1 PiperOrigin-RevId: 413602250 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0d958892efb..0c221f0d863 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c2d61e63b086e354ecc4e1928ac4661844275ec9c1467d65a7343e97101f82fa", - git_commit = "ce829708e91077862a5352b6d545b1167ce89007", + sha256 = "27790481da7d162b6b9b2493681f8a0c88a4bb4dafb68d862e37a966ce12c44a", + git_commit = "5ff084530b0d33bb0ef10e44786ac250e387240d", ) # Import all of TensorFlow Serving's external dependencies. From 6924b2ce89d93d479de7abb477d4dee579c57762 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 Dec 2021 06:02:23 -0800 Subject: [PATCH 5657/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ef299b1c-ec3c-4ddc-ab09-e312c33048fb PiperOrigin-RevId: 413656162 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0c221f0d863..ef6b594cea8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "27790481da7d162b6b9b2493681f8a0c88a4bb4dafb68d862e37a966ce12c44a", - git_commit = "5ff084530b0d33bb0ef10e44786ac250e387240d", + sha256 = "fdede7a19f423928ba38da121d857804abe5b1d441ca60fb1284f89cf45484f6", + git_commit = "ed4c4d9880753fccec455cddb47a5dc9f95f4540", ) # Import all of TensorFlow Serving's external dependencies. From 3d618b9eb4b0683a164099450ac219e2771e8a4e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 Dec 2021 12:02:39 -0800 Subject: [PATCH 5658/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/48890da4-500a-44f2-aaef-2aaf6eee2a71 PiperOrigin-RevId: 413736927 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ef6b594cea8..85331926ec5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fdede7a19f423928ba38da121d857804abe5b1d441ca60fb1284f89cf45484f6", - git_commit = "ed4c4d9880753fccec455cddb47a5dc9f95f4540", + sha256 = "d6d89a75dc18abad6dad3789be28abb46f1b7fdbc455740620b33aa4f0a73794", + git_commit = "386180321699d9cdc3dcb08dab02483f8803237f", ) # Import all of TensorFlow Serving's external dependencies. From b57ab19717bf25bb14a39345c791a3baa00997ce Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 Dec 2021 18:01:45 -0800 Subject: [PATCH 5659/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ac907887-db1d-4ab8-b6a4-ad7264cbdb02 PiperOrigin-RevId: 413814696 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 85331926ec5..aa1e090d99d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d6d89a75dc18abad6dad3789be28abb46f1b7fdbc455740620b33aa4f0a73794", - git_commit = "386180321699d9cdc3dcb08dab02483f8803237f", + sha256 = "3593bc7ae169400b91afb085aea21353de2220a03b27266d43208814e65835af", + git_commit = "2fadd8c05f0e7bee7ae253b2c3f648266fe74b50", ) # Import all of TensorFlow Serving's external dependencies. From daa8b44c325d34b17b07a066fd3bac7d7da1b99d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 3 Dec 2021 00:01:47 -0800 Subject: [PATCH 5660/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/962800ad-37b6-4b04-881a-6b9a934ef288 PiperOrigin-RevId: 413861031 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index aa1e090d99d..be36b4eb115 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3593bc7ae169400b91afb085aea21353de2220a03b27266d43208814e65835af", - git_commit = "2fadd8c05f0e7bee7ae253b2c3f648266fe74b50", + sha256 = "d91be9fef3b2b64a1545ee2fbaf5f8dc7fefb941444e60979c15a5dde42ab1ab", + git_commit = "e29199a3dd068eefc5c3247a82f498e6eb549867", ) # Import all of TensorFlow Serving's external dependencies. From 233fcc411ce9fac99b6365c4b7a9446e44657e1a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 3 Dec 2021 06:01:40 -0800 Subject: [PATCH 5661/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d9eeb658-adb4-4c88-8d53-a7f7b0777171 PiperOrigin-RevId: 413917097 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index be36b4eb115..90fc84740a5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d91be9fef3b2b64a1545ee2fbaf5f8dc7fefb941444e60979c15a5dde42ab1ab", - git_commit = "e29199a3dd068eefc5c3247a82f498e6eb549867", + sha256 = "f4215690d6bb8e386123f90e126b541467d8ef2f881361712ae7916227ca34fe", + git_commit = "9f4cc022c3bf6581a49c3ece93815cecabefd7dd", ) # Import all of TensorFlow Serving's external dependencies. From 8fd111cc0861c066c3392a2cd058ccae16d8b79a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 3 Dec 2021 12:01:39 -0800 Subject: [PATCH 5662/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fc56c887-e287-4270-ac14-0905c1960ad1 PiperOrigin-RevId: 413989792 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 90fc84740a5..adeb73be85d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f4215690d6bb8e386123f90e126b541467d8ef2f881361712ae7916227ca34fe", - git_commit = "9f4cc022c3bf6581a49c3ece93815cecabefd7dd", + sha256 = "05ec8f00f89bd61dbe6811701ad1cda21116b4ed8f54597ebb4fcdca986e83ba", + git_commit = "19cff800e5805097da69bb1ad0b0a2dd9f83741a", ) # Import all of TensorFlow Serving's external dependencies. From 70d3a84b599d5ca76e999269e8a14fafe5ff6e8f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 3 Dec 2021 18:01:51 -0800 Subject: [PATCH 5663/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/89abe6d8-bfb3-46dc-b1a8-0d7a5682ad0c PiperOrigin-RevId: 414062537 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index adeb73be85d..79b1c2b3582 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "05ec8f00f89bd61dbe6811701ad1cda21116b4ed8f54597ebb4fcdca986e83ba", - git_commit = "19cff800e5805097da69bb1ad0b0a2dd9f83741a", + sha256 = "96f2a9384a7b518b7d9d11bd7446f79131f2671973f726a256e66ad6023f2b4c", + git_commit = "25aeed705b0a884144ea4fd8a89fa02d09f2b2b7", ) # Import all of TensorFlow Serving's external dependencies. From 5173903bd52365c08b14c5562c50153c291c1ea0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 4 Dec 2021 00:02:29 -0800 Subject: [PATCH 5664/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/42f93ae6-6bac-4de8-93dd-451700ae07a6 PiperOrigin-RevId: 414100590 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 79b1c2b3582..4ca2dad9457 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "96f2a9384a7b518b7d9d11bd7446f79131f2671973f726a256e66ad6023f2b4c", - git_commit = "25aeed705b0a884144ea4fd8a89fa02d09f2b2b7", + sha256 = "ac832fd0031d6cc26b2ddd4da857af8fcd8fec2782165c5a037e743de0e26711", + git_commit = "a4fb02b15ec7692d1ec0ca72b376d7a8b94f281c", ) # Import all of TensorFlow Serving's external dependencies. From 16e0338edb71d94873f5730a7bec4650c8e691cb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 4 Dec 2021 06:01:39 -0800 Subject: [PATCH 5665/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7fa693ea-3c5e-40a6-a548-32dfc38e72a5 PiperOrigin-RevId: 414135548 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4ca2dad9457..62ee4ec2569 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ac832fd0031d6cc26b2ddd4da857af8fcd8fec2782165c5a037e743de0e26711", - git_commit = "a4fb02b15ec7692d1ec0ca72b376d7a8b94f281c", + sha256 = "ff728805e1e7b74052aaf85ea4840835c046faf80b401f6d9a72245a5c25beae", + git_commit = "a70a36f21098d27f2d27e5ec290e8327ef5b92ab", ) # Import all of TensorFlow Serving's external dependencies. From 7bb91da2cc40c1a554f709445c44a1dae3717f57 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 4 Dec 2021 12:01:27 -0800 Subject: [PATCH 5666/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/51359fb8-5c67-4182-b8ca-fb723f59ed56 PiperOrigin-RevId: 414167055 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 62ee4ec2569..5e481fe671b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ff728805e1e7b74052aaf85ea4840835c046faf80b401f6d9a72245a5c25beae", - git_commit = "a70a36f21098d27f2d27e5ec290e8327ef5b92ab", + sha256 = "18be4f4b470a9de7fd8680b06bbc34457839a3cb25c54195f83ccd0ddd58ed0f", + git_commit = "8c51ff3258eb89dfe02f5aec8c4705033b30684f", ) # Import all of TensorFlow Serving's external dependencies. From ba4f622119b46fb971aa16e6a1f311da230b88d0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 4 Dec 2021 18:02:32 -0800 Subject: [PATCH 5667/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d916a7ae-928a-465d-b4ee-52e0346f9964 PiperOrigin-RevId: 414198808 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5e481fe671b..8fa064c739d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "18be4f4b470a9de7fd8680b06bbc34457839a3cb25c54195f83ccd0ddd58ed0f", - git_commit = "8c51ff3258eb89dfe02f5aec8c4705033b30684f", + sha256 = "ad26196dc0eadb056f76a5129e240d31f4935404c7941bae035763859698eeca", + git_commit = "0372bb6bad341e4d721c9532a8228edc8213fc14", ) # Import all of TensorFlow Serving's external dependencies. From ba07e882e71fb1c312b50af35dc98261196c5792 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 5 Dec 2021 00:02:03 -0800 Subject: [PATCH 5668/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2a5f0ab4-331b-43c3-8430-b9a972d40504 PiperOrigin-RevId: 414229644 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8fa064c739d..2816f8ab2e2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ad26196dc0eadb056f76a5129e240d31f4935404c7941bae035763859698eeca", - git_commit = "0372bb6bad341e4d721c9532a8228edc8213fc14", + sha256 = "8834bf4554d43bfa0a8edde7e059d3309b080c18ef363c0df4a258de7385436b", + git_commit = "0627fc62530b37607e50ff02235c31c63cc8ad8c", ) # Import all of TensorFlow Serving's external dependencies. From b241402034bed95933a6a0535c0af00e26a56122 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 5 Dec 2021 06:01:52 -0800 Subject: [PATCH 5669/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/31491ce8-eefe-49f8-a1af-ce83a8031eca PiperOrigin-RevId: 414262787 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2816f8ab2e2..146ff00c443 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8834bf4554d43bfa0a8edde7e059d3309b080c18ef363c0df4a258de7385436b", - git_commit = "0627fc62530b37607e50ff02235c31c63cc8ad8c", + sha256 = "962d467dfa10b567cbbc503da8bc59a0d78d189779f7ce4c24be5b9116ff2d1b", + git_commit = "7dd2b526f2b2df3a38890b76b7525990ca858fa1", ) # Import all of TensorFlow Serving's external dependencies. From 92e044206e156d9f7fcaced1df01a19f1c25e42c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 5 Dec 2021 12:02:30 -0800 Subject: [PATCH 5670/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d4875d98-159a-49d7-ae3d-aa65364d3a3f PiperOrigin-RevId: 414293318 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 146ff00c443..acdd4047fb1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "962d467dfa10b567cbbc503da8bc59a0d78d189779f7ce4c24be5b9116ff2d1b", - git_commit = "7dd2b526f2b2df3a38890b76b7525990ca858fa1", + sha256 = "d0d495791ba98064622a1deb887ee156a0f51d9fa87f3a12010cfe94fbcf26e7", + git_commit = "7be7a228c577f5006bc18baa187a3df8f4aecb1f", ) # Import all of TensorFlow Serving's external dependencies. From b3c17571e4d1c80890c3b77a99d14fad2f8f4b6b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 5 Dec 2021 18:02:01 -0800 Subject: [PATCH 5671/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/64e9acb2-f792-4a97-89d1-b0fd0c236bcb PiperOrigin-RevId: 414326357 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index acdd4047fb1..c832e5b35c0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d0d495791ba98064622a1deb887ee156a0f51d9fa87f3a12010cfe94fbcf26e7", - git_commit = "7be7a228c577f5006bc18baa187a3df8f4aecb1f", + sha256 = "a7c8410240aee4a5f27fb6c958315fdc776ef50fc524e98e1b82e1395bf5ca8e", + git_commit = "7981864e6e4dfe703e79edfaf6941267c42f3d8b", ) # Import all of TensorFlow Serving's external dependencies. From 4667727c64310bbd537e894c582e1d63cd18c7fb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 6 Dec 2021 00:01:36 -0800 Subject: [PATCH 5672/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5d90a2a2-5573-4d6c-9fdc-a3afdae380e5 PiperOrigin-RevId: 414364660 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c832e5b35c0..05540a7c35f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a7c8410240aee4a5f27fb6c958315fdc776ef50fc524e98e1b82e1395bf5ca8e", - git_commit = "7981864e6e4dfe703e79edfaf6941267c42f3d8b", + sha256 = "9880df831c3e5db8d325ffcd23bee84bd39389c7a148439cc18a757fac18b929", + git_commit = "4347054f0664fcfc7b8236667a6ff049e075ce5c", ) # Import all of TensorFlow Serving's external dependencies. From 2b06a5b99b2e66d8f6c99ab5e91e58ca45fd8df2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 6 Dec 2021 06:02:06 -0800 Subject: [PATCH 5673/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a7d37877-47e9-4bf0-aa6a-96e29930a73b PiperOrigin-RevId: 414420501 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 05540a7c35f..c521ce2ce03 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9880df831c3e5db8d325ffcd23bee84bd39389c7a148439cc18a757fac18b929", - git_commit = "4347054f0664fcfc7b8236667a6ff049e075ce5c", + sha256 = "d78da78d9466b2950154ceff4b459764fd244618fd0e632a5b15f958a335d0ad", + git_commit = "ae017b109922772d473d6be58c123de7886d5aa7", ) # Import all of TensorFlow Serving's external dependencies. From ba3d5a021d50f120522c7c1c283664ca6c2b50e5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 6 Dec 2021 12:02:24 -0800 Subject: [PATCH 5674/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2b3d1eb4-5d51-435e-99a0-542ff1a557fa PiperOrigin-RevId: 414506617 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c521ce2ce03..84d7092f5eb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d78da78d9466b2950154ceff4b459764fd244618fd0e632a5b15f958a335d0ad", - git_commit = "ae017b109922772d473d6be58c123de7886d5aa7", + sha256 = "2d1fb060222ca5fdfa8487c9eed5271ab5ed1e52e11b333af6bf8a8f4a2b38ea", + git_commit = "b3f20900456eb88d12aee74abba640d5cf2fd076", ) # Import all of TensorFlow Serving's external dependencies. From cf22071ff68f01d83c53647464527e38480ab981 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 6 Dec 2021 18:02:15 -0800 Subject: [PATCH 5675/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/243f4fa1-f764-4180-a350-e4ddf5a40df5 PiperOrigin-RevId: 414587726 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 84d7092f5eb..31ecdc84744 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2d1fb060222ca5fdfa8487c9eed5271ab5ed1e52e11b333af6bf8a8f4a2b38ea", - git_commit = "b3f20900456eb88d12aee74abba640d5cf2fd076", + sha256 = "439e2fad0be1829cbc63e93d202e59e32b5526e9fac3173195fdd157e477c465", + git_commit = "d49dfa031d0ce46228fc77d09d4edbb8e27e7f73", ) # Import all of TensorFlow Serving's external dependencies. From b2e10ea01134847e6a264ea012ca2fa335334162 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 Dec 2021 00:01:46 -0800 Subject: [PATCH 5676/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/21391101-b48c-4f79-a1bd-07ccab21dd11 PiperOrigin-RevId: 414639075 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 31ecdc84744..6a321f7328a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "439e2fad0be1829cbc63e93d202e59e32b5526e9fac3173195fdd157e477c465", - git_commit = "d49dfa031d0ce46228fc77d09d4edbb8e27e7f73", + sha256 = "04a0785a18e8d12070374ee324c59f6a25ce36fc8e9503a2c390cb1d20bce0d5", + git_commit = "c5a9fc9d24197492d8d8b501cf2954c2e18dd982", ) # Import all of TensorFlow Serving's external dependencies. From ffdcc4a6055ad9191668aba22def3b15d8a81ff8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 Dec 2021 06:01:35 -0800 Subject: [PATCH 5677/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ad41a053-439b-4ce7-ad03-5d1af83e443e PiperOrigin-RevId: 414702365 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6a321f7328a..d99748283ae 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "04a0785a18e8d12070374ee324c59f6a25ce36fc8e9503a2c390cb1d20bce0d5", - git_commit = "c5a9fc9d24197492d8d8b501cf2954c2e18dd982", + sha256 = "384fca0331b8d3aa8c538114c2cb35642935894637b43f5dc73ee5d3629e9407", + git_commit = "d0f388b4a3d22977957504458d7e96109c80fd8b", ) # Import all of TensorFlow Serving's external dependencies. From 7953e4046a5778d0ef99a171d14a97ef6dbe0cbe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 Dec 2021 12:02:07 -0800 Subject: [PATCH 5678/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/030dadc3-0514-4e29-836c-c31ed8376dd3 PiperOrigin-RevId: 414790345 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d99748283ae..fa5a29e319e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "384fca0331b8d3aa8c538114c2cb35642935894637b43f5dc73ee5d3629e9407", - git_commit = "d0f388b4a3d22977957504458d7e96109c80fd8b", + sha256 = "02d2d5b9a17fd489066ded5de8cac4de56dc9383d2ca3db2890eaa001d97dae7", + git_commit = "dcaa60290e85d186ebd9eae9df87b2bbc4756099", ) # Import all of TensorFlow Serving's external dependencies. From 296032546377e0583e2fa2005d84ea2bde917001 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 Dec 2021 18:02:13 -0800 Subject: [PATCH 5679/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3688a3c0-22ac-43c0-9042-59c275360726 PiperOrigin-RevId: 414873973 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fa5a29e319e..fb06ddaefa3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "02d2d5b9a17fd489066ded5de8cac4de56dc9383d2ca3db2890eaa001d97dae7", - git_commit = "dcaa60290e85d186ebd9eae9df87b2bbc4756099", + sha256 = "0dcde3e403c347826071dfdf7e4c2281a64601be00c3b62f9f8f70cc067249f3", + git_commit = "da4c43b2c478a76844148b7a6d7949152bc043df", ) # Import all of TensorFlow Serving's external dependencies. From 42a103511fa9776fa05c8f35f8e52c37f7c2fc5e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 Dec 2021 00:02:07 -0800 Subject: [PATCH 5680/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c710ce2e-5b51-4585-bfa7-fb539930c4f4 PiperOrigin-RevId: 414921936 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fb06ddaefa3..8af0ec68473 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0dcde3e403c347826071dfdf7e4c2281a64601be00c3b62f9f8f70cc067249f3", - git_commit = "da4c43b2c478a76844148b7a6d7949152bc043df", + sha256 = "05dc84fb1ccaa9055c67332e92888d2c17a8c0fb2bca2e5faa923a56b741849c", + git_commit = "54fcfc9ed16a2d1a87a527a03c6d6ba39b276381", ) # Import all of TensorFlow Serving's external dependencies. From 49b138fdd4c0fb7170736193063c6f03dfb4dba4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 Dec 2021 02:22:12 -0800 Subject: [PATCH 5681/8103] Add `--experimental_cc_shared_library` by default to all builds. PiperOrigin-RevId: 414944380 --- .bazelrc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.bazelrc b/.bazelrc index f5e695fb8be..7a1ab46ece5 100644 --- a/.bazelrc +++ b/.bazelrc @@ -54,3 +54,6 @@ build --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0 build --workspace_status_command=/proc/self/cwd/tools/gen_status_stamp.sh build --experimental_repo_remote_exec + +# TF now has `cc_shared_library` targets, so it needs the experimental flag +build --experimental_cc_shared_library From 0b0312f36a1affc87769c27e0f8d1b0363df8426 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 Dec 2021 06:01:49 -0800 Subject: [PATCH 5682/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/105e87f7-b5d5-45ea-bde6-fa2543a69c6b PiperOrigin-RevId: 414980829 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8af0ec68473..415972ca579 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "05dc84fb1ccaa9055c67332e92888d2c17a8c0fb2bca2e5faa923a56b741849c", - git_commit = "54fcfc9ed16a2d1a87a527a03c6d6ba39b276381", + sha256 = "eb7afbd4e4902ba34d0d448124f4b50ee1e8699fc6f1ae6b1c0ef1c36eb495a2", + git_commit = "a6d352f031f272972da0e6271de07e8b40cac74a", ) # Import all of TensorFlow Serving's external dependencies. From 5b07ce02fd41af6d8bacd9527259018b0eb4e27b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 Dec 2021 12:01:31 -0800 Subject: [PATCH 5683/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1845f215-d142-4fd9-9a3b-6abd370f8170 PiperOrigin-RevId: 415062914 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 415972ca579..7460b5175eb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eb7afbd4e4902ba34d0d448124f4b50ee1e8699fc6f1ae6b1c0ef1c36eb495a2", - git_commit = "a6d352f031f272972da0e6271de07e8b40cac74a", + sha256 = "e9c9a09dddbdb54a4a34bb19fdd98baff86e594011d2e6ae0995e32275840978", + git_commit = "9ebfeabe02f6f84f3419a84ece148f33741c4f90", ) # Import all of TensorFlow Serving's external dependencies. From fe1b2164558831481d684d454e86c03e2604ee31 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 Dec 2021 18:01:36 -0800 Subject: [PATCH 5684/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/637f0b55-5723-4ef7-b74e-49dcbf46c6c7 PiperOrigin-RevId: 415143865 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7460b5175eb..cbab1a9e9c9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e9c9a09dddbdb54a4a34bb19fdd98baff86e594011d2e6ae0995e32275840978", - git_commit = "9ebfeabe02f6f84f3419a84ece148f33741c4f90", + sha256 = "4aba6b74120446b8818d02f100ad9b72f5922627c995294ca38e859587de9e38", + git_commit = "a07493c9e3a417d59c13ec99aa5e3726af0c2777", ) # Import all of TensorFlow Serving's external dependencies. From 86c6867d2478ee0baba7c239d7c3f8ec067f91ef Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 9 Dec 2021 00:03:46 -0800 Subject: [PATCH 5685/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e58c82df-ddfa-4eb4-a1ee-d6c2804497d8 PiperOrigin-RevId: 415192244 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cbab1a9e9c9..8f548afc35f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4aba6b74120446b8818d02f100ad9b72f5922627c995294ca38e859587de9e38", - git_commit = "a07493c9e3a417d59c13ec99aa5e3726af0c2777", + sha256 = "c2ec3a710507b498f656dda811f53dbd6a42b04789532b3b0d19f4f3e007e211", + git_commit = "9af339bdcf5767dc00b04b292733f30718e43f70", ) # Import all of TensorFlow Serving's external dependencies. From 4f1c6cd23fde81ecd577de01e9d888ed0f9719c5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 9 Dec 2021 06:03:19 -0800 Subject: [PATCH 5686/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b8860e70-50cd-4f63-b783-e614d7dc195e PiperOrigin-RevId: 415245981 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8f548afc35f..8de2abcb9f9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c2ec3a710507b498f656dda811f53dbd6a42b04789532b3b0d19f4f3e007e211", - git_commit = "9af339bdcf5767dc00b04b292733f30718e43f70", + sha256 = "e54c0be7eadd3d7a952430baff820554b5b6b824398e36075a69a8282a8ab364", + git_commit = "36d2bbdbb5c97beda8c183e42b2a535d8d1aa3d3", ) # Import all of TensorFlow Serving's external dependencies. From 1b77fdf368d57e29cec989117853b8068a1b9088 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 9 Dec 2021 12:01:25 -0800 Subject: [PATCH 5687/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/afc94a0b-60d8-4ac8-94eb-ce07387adb5f PiperOrigin-RevId: 415321198 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8de2abcb9f9..437536168b9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e54c0be7eadd3d7a952430baff820554b5b6b824398e36075a69a8282a8ab364", - git_commit = "36d2bbdbb5c97beda8c183e42b2a535d8d1aa3d3", + sha256 = "eea342a0cabdef525cfc3e004790fe1f22a6620e7b68712b1e77b803e781b9c2", + git_commit = "025a88e6602b4baa372b12cfd8492335f79c4cd8", ) # Import all of TensorFlow Serving's external dependencies. From 9ff1f08a63279139bd8e726dde8d30771a86adc1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 9 Dec 2021 18:01:46 -0800 Subject: [PATCH 5688/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1a60708f-1b5c-480e-8568-e199ac682257 PiperOrigin-RevId: 415400680 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 437536168b9..c0667461018 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eea342a0cabdef525cfc3e004790fe1f22a6620e7b68712b1e77b803e781b9c2", - git_commit = "025a88e6602b4baa372b12cfd8492335f79c4cd8", + sha256 = "37d470e77bc0b00c6282b794a749fe6e64c44921d639f721a9cb284641f86b2d", + git_commit = "f2a3593dec057af3219bcac6ff5394adeaaca7a7", ) # Import all of TensorFlow Serving's external dependencies. From 260a62ccb9eff8e2358091f89f8ee3812b883f89 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 10 Dec 2021 00:02:38 -0800 Subject: [PATCH 5689/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/65e4cedd-0140-4221-9d5a-f81edacd6b91 PiperOrigin-RevId: 415446532 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c0667461018..704ea9fee5a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "37d470e77bc0b00c6282b794a749fe6e64c44921d639f721a9cb284641f86b2d", - git_commit = "f2a3593dec057af3219bcac6ff5394adeaaca7a7", + sha256 = "e46f974b88afd9864b268507418ac952d859a398d1f8e62f9f91025f033fd59a", + git_commit = "f13bfbba6b689a35afc1c4b1508621b7e7400096", ) # Import all of TensorFlow Serving's external dependencies. From f511124cda585c865c8090f9a16cc5c768a32634 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 10 Dec 2021 06:02:19 -0800 Subject: [PATCH 5690/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1987458a-fcd9-4db2-b871-c468d9af6a24 PiperOrigin-RevId: 415500861 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 704ea9fee5a..03f797166a5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e46f974b88afd9864b268507418ac952d859a398d1f8e62f9f91025f033fd59a", - git_commit = "f13bfbba6b689a35afc1c4b1508621b7e7400096", + sha256 = "7a8516b654524dc5498c315de8c79cd5e855f336676fae63f104d0b620dd788e", + git_commit = "38f67391fa2960b16154bf14352268e574d08afb", ) # Import all of TensorFlow Serving's external dependencies. From 742394647e83ea010debdc916151bf65f8c1a581 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 10 Dec 2021 12:02:39 -0800 Subject: [PATCH 5691/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e8b11665-fb58-4de3-ac8f-1a6eab9acd05 PiperOrigin-RevId: 415576107 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 03f797166a5..2954c42812a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7a8516b654524dc5498c315de8c79cd5e855f336676fae63f104d0b620dd788e", - git_commit = "38f67391fa2960b16154bf14352268e574d08afb", + sha256 = "7386e579a4d0fdd07617c08dab83e4afec9b3f14ac099fb9925779e4e604ceca", + git_commit = "a1ad683ccd949113b618f2391b25618ec02bb4ea", ) # Import all of TensorFlow Serving's external dependencies. From ef5fbd92099ab4853f49b895aa574397e0647225 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 10 Dec 2021 18:01:41 -0800 Subject: [PATCH 5692/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d86d6b75-cde8-4d01-a751-96c8c96a50ab PiperOrigin-RevId: 415651070 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2954c42812a..5fe2255109c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7386e579a4d0fdd07617c08dab83e4afec9b3f14ac099fb9925779e4e604ceca", - git_commit = "a1ad683ccd949113b618f2391b25618ec02bb4ea", + sha256 = "2ce3a2917f89fd1eb4fefb3b466aa98ba1eaafa601d4b50e06c4fb383f2db556", + git_commit = "9ac21fbf3c4a00d7176ad58a0c4071e60dd45dbf", ) # Import all of TensorFlow Serving's external dependencies. From 731f973d92eda56d788ae2fbb9e0024d6df22656 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 11 Dec 2021 00:01:48 -0800 Subject: [PATCH 5693/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/36c661f4-c2eb-498b-8358-278efe2525bd PiperOrigin-RevId: 415689670 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5fe2255109c..bf108a2c36e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2ce3a2917f89fd1eb4fefb3b466aa98ba1eaafa601d4b50e06c4fb383f2db556", - git_commit = "9ac21fbf3c4a00d7176ad58a0c4071e60dd45dbf", + sha256 = "0aef08f119bb4aa052b11f98f9c6fed568a5b6195e7cefc76041fae310517094", + git_commit = "b79b34e74b13303eb4ebbdb5a8070c24db7cad6e", ) # Import all of TensorFlow Serving's external dependencies. From 143531070a52babc4fb16349d9fb196d281cd277 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 11 Dec 2021 06:01:48 -0800 Subject: [PATCH 5694/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/30595a88-896a-4ec8-8360-adae145dc6c0 PiperOrigin-RevId: 415727936 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bf108a2c36e..4e0a8835a80 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0aef08f119bb4aa052b11f98f9c6fed568a5b6195e7cefc76041fae310517094", - git_commit = "b79b34e74b13303eb4ebbdb5a8070c24db7cad6e", + sha256 = "6dc1d8bcb5931e421ed0f69edec271e0dfe97a59037bce68dce3515265c9a451", + git_commit = "f8b36801f6795beaab1a3c4c19cce95eb52a26ab", ) # Import all of TensorFlow Serving's external dependencies. From de90ffc81c728609e9f97de6b4db0e7c4ba6d1f2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 11 Dec 2021 12:03:31 -0800 Subject: [PATCH 5695/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1aecb51a-2579-4452-893e-0783d8e24dae PiperOrigin-RevId: 415762816 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4e0a8835a80..62f6e7bcc6c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6dc1d8bcb5931e421ed0f69edec271e0dfe97a59037bce68dce3515265c9a451", - git_commit = "f8b36801f6795beaab1a3c4c19cce95eb52a26ab", + sha256 = "145694edde7a8efc46ab7ed811fcaa10e6225d99f8e9d918f6013ba273a392ce", + git_commit = "a4f19c1934d1de24aaf8d0dfc3a8348c09342b44", ) # Import all of TensorFlow Serving's external dependencies. From 072097ff5dacd06dd746c9f1c417aa89e605b0d9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 11 Dec 2021 18:01:19 -0800 Subject: [PATCH 5696/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2b48643d-e936-4dae-a46d-cd723343f889 PiperOrigin-RevId: 415793984 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 62f6e7bcc6c..f84e16ef910 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "145694edde7a8efc46ab7ed811fcaa10e6225d99f8e9d918f6013ba273a392ce", - git_commit = "a4f19c1934d1de24aaf8d0dfc3a8348c09342b44", + sha256 = "3ddd461fb73e62d9c3e716f97983e91faf58035be1bb0e2a8fc8233052711dea", + git_commit = "ffed83825c421ca2af1246b5303c57fbbbbbaf6a", ) # Import all of TensorFlow Serving's external dependencies. From f13c65fc1f284d1e55a16008f6d6a11124d77de7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 12 Dec 2021 00:01:28 -0800 Subject: [PATCH 5697/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/04006694-6633-45a9-a3ac-1a6ef771e763 PiperOrigin-RevId: 415825084 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f84e16ef910..b814da46145 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3ddd461fb73e62d9c3e716f97983e91faf58035be1bb0e2a8fc8233052711dea", - git_commit = "ffed83825c421ca2af1246b5303c57fbbbbbaf6a", + sha256 = "84a4f2a2a932564a0a06d179b59e419a7e50f5161547b25d23a6e52fb73d4e09", + git_commit = "5b88fb99869f97e7eaf1f6c7463395291dc5e789", ) # Import all of TensorFlow Serving's external dependencies. From 26db79515e19608a94a09635e8501eb1458036ae Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 12 Dec 2021 06:01:44 -0800 Subject: [PATCH 5698/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/daacfab2-2e65-46d2-9090-f4a8bcf34bbf PiperOrigin-RevId: 415860496 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b814da46145..7eeeae5b563 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "84a4f2a2a932564a0a06d179b59e419a7e50f5161547b25d23a6e52fb73d4e09", - git_commit = "5b88fb99869f97e7eaf1f6c7463395291dc5e789", + sha256 = "19e8a1dd104f671e69a43e642c5297ff310a23c517caadb64fcf6d5e6eec5225", + git_commit = "fed00af0c1f4447d8e90417b8e2109f2ce0536ac", ) # Import all of TensorFlow Serving's external dependencies. From b96b739ec6a1199008b9d4fdc1f2d6aa2fa84770 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 12 Dec 2021 12:02:57 -0800 Subject: [PATCH 5699/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/abb7a41a-8689-40ff-887a-92adcb861b9e PiperOrigin-RevId: 415893688 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7eeeae5b563..20a19e4857c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "19e8a1dd104f671e69a43e642c5297ff310a23c517caadb64fcf6d5e6eec5225", - git_commit = "fed00af0c1f4447d8e90417b8e2109f2ce0536ac", + sha256 = "fb2d3986a6a1d6b3af2848adc1d44b695f30bcda91bc4b029bd58df28dde6b72", + git_commit = "9cbb909c7426a63965f2eb09ed1c43423821180f", ) # Import all of TensorFlow Serving's external dependencies. From e68f6f4047f1c3ef1260007510119398d5e2d740 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 12 Dec 2021 18:02:06 -0800 Subject: [PATCH 5700/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7300b474-d7e4-491b-ba22-2bb6b333d08c PiperOrigin-RevId: 415927879 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 20a19e4857c..e72b5ac2623 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fb2d3986a6a1d6b3af2848adc1d44b695f30bcda91bc4b029bd58df28dde6b72", - git_commit = "9cbb909c7426a63965f2eb09ed1c43423821180f", + sha256 = "5453fa4ef80ce108e5476a28644c1c26064aafdcf9f93fbc6be6beb9ccefad13", + git_commit = "cbb67788b6a95195bfa65d7ccd969bc4e049c462", ) # Import all of TensorFlow Serving's external dependencies. From ac32deb3e02434dec5a529efd076932eaa1664b7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 13 Dec 2021 00:01:52 -0800 Subject: [PATCH 5701/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1733ed19-769d-43a9-b4f6-96baa36b0245 PiperOrigin-RevId: 415967179 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e72b5ac2623..ebea57ec577 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5453fa4ef80ce108e5476a28644c1c26064aafdcf9f93fbc6be6beb9ccefad13", - git_commit = "cbb67788b6a95195bfa65d7ccd969bc4e049c462", + sha256 = "53095e5c18a59cc796c81c8c4c0934aa924ddb9a8b0b62fa80c3150c6b8b8a16", + git_commit = "62fa2bd4bd077b69999da66c82f140087651a3e9", ) # Import all of TensorFlow Serving's external dependencies. From 320ff8012d52854291b271c4659a6c36f2642554 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 13 Dec 2021 06:01:47 -0800 Subject: [PATCH 5702/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7d09d8bc-1b3a-4359-a090-682ab9e84b7d PiperOrigin-RevId: 416023699 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ebea57ec577..172bb23e3f8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "53095e5c18a59cc796c81c8c4c0934aa924ddb9a8b0b62fa80c3150c6b8b8a16", - git_commit = "62fa2bd4bd077b69999da66c82f140087651a3e9", + sha256 = "587c31181135ed91cf56ee81dee5861d85936b343fa4a44dd5f9fdedad3019f1", + git_commit = "f00d8bdbe097826a5ac8c88bce507e86c7430a2a", ) # Import all of TensorFlow Serving's external dependencies. From 748bd54bce937150a6807826d2952f1de7244037 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 13 Dec 2021 12:01:31 -0800 Subject: [PATCH 5703/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a08872aa-7dd7-4c10-a13d-d45a6a9cab54 PiperOrigin-RevId: 416100747 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 172bb23e3f8..3f4e23576a1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "587c31181135ed91cf56ee81dee5861d85936b343fa4a44dd5f9fdedad3019f1", - git_commit = "f00d8bdbe097826a5ac8c88bce507e86c7430a2a", + sha256 = "6f4b408595fcaadfeea20b9e6e52db26dc61d30e486130f85f5c5e4c361009b5", + git_commit = "8c1ad881784e3a555acf4000bd3cb1181dc70e88", ) # Import all of TensorFlow Serving's external dependencies. From 72d6b9794796e9230a916f6dbf0f284d5444400e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 13 Dec 2021 18:05:51 -0800 Subject: [PATCH 5704/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4b7c1298-555c-4766-bee7-3228678798de PiperOrigin-RevId: 416179787 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3f4e23576a1..eed836281e6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6f4b408595fcaadfeea20b9e6e52db26dc61d30e486130f85f5c5e4c361009b5", - git_commit = "8c1ad881784e3a555acf4000bd3cb1181dc70e88", + sha256 = "1fa141bfe9299a8bfa4dfa9617ad727474e40c9d2b6c4aed70e5c36dc94949ce", + git_commit = "4ffe56779faa9f7455f1f590ec9b2390006d6b7a", ) # Import all of TensorFlow Serving's external dependencies. From 2a55aec18cc1923ece84c7fcf701185306ef99b1 Mon Sep 17 00:00:00 2001 From: Yiming Zhang Date: Mon, 13 Dec 2021 22:34:26 -0800 Subject: [PATCH 5705/8103] Add `--num_request_iterations_for_warmup` flag to modelserver to control number of iterations during warmup. Fixes #1949 PiperOrigin-RevId: 416215049 --- tensorflow_serving/model_servers/main.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index 551b6085943..1e1a5af41c1 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -208,6 +208,10 @@ int main(int argc, char** argv) { "Enables model warmup, which triggers lazy " "initializations (such as TF optimizations) at load " "time, to reduce first request latency."), + tensorflow::Flag("num_request_iterations_for_warmup", + &options.num_request_iterations_for_warmup, + "Number of times a request is iterated during warmup " + "replay. This value is used only if > 0."), tensorflow::Flag("version", &display_version, "Display version"), tensorflow::Flag( "monitoring_config_file", &options.monitoring_config_file, From 38273672d8b5e5f7e6ef1e0464293f17acd2affe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 14 Dec 2021 00:02:23 -0800 Subject: [PATCH 5706/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/53460e14-fd30-44d7-8271-0ac70cdd397e PiperOrigin-RevId: 416225777 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index eed836281e6..a453cb70242 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1fa141bfe9299a8bfa4dfa9617ad727474e40c9d2b6c4aed70e5c36dc94949ce", - git_commit = "4ffe56779faa9f7455f1f590ec9b2390006d6b7a", + sha256 = "e85a3af637dd90177a5b8c780e91f846b3960ddd55ea10adc628ef748e452c89", + git_commit = "f47a662d5199171ac95d4bc165aa48c5bcd242da", ) # Import all of TensorFlow Serving's external dependencies. From deac9400a49c76fa858b3f6efddc0feffb4318eb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 14 Dec 2021 06:01:55 -0800 Subject: [PATCH 5707/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8ec2c2d7-88d0-4c5c-94b3-6baa1db857a6 PiperOrigin-RevId: 416282833 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a453cb70242..62c80d69b9d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e85a3af637dd90177a5b8c780e91f846b3960ddd55ea10adc628ef748e452c89", - git_commit = "f47a662d5199171ac95d4bc165aa48c5bcd242da", + sha256 = "8ae7b7c2f97d0d2cade7b6d5b4537682ec630111e9e84167fdacf48b67abf0ca", + git_commit = "bacea6dfea6d183eac5daf4653d63970b2db05f1", ) # Import all of TensorFlow Serving's external dependencies. From ba6aa913576905e8a04e9a1a92ac3d712cbe4324 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 14 Dec 2021 12:01:32 -0800 Subject: [PATCH 5708/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/cd9c176a-910f-41d0-9d2c-8bbb94022152 PiperOrigin-RevId: 416360724 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 62c80d69b9d..f82aab7551b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8ae7b7c2f97d0d2cade7b6d5b4537682ec630111e9e84167fdacf48b67abf0ca", - git_commit = "bacea6dfea6d183eac5daf4653d63970b2db05f1", + sha256 = "704edac79dc19717d9d6ccca3369f79310687f8737203473e906959c9cf1548a", + git_commit = "3d60e861c282689fa4cf96da3a3bc5012fa27988", ) # Import all of TensorFlow Serving's external dependencies. From 2a01d788aec18f619efcb5b3e765a4daa7d6de52 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 14 Dec 2021 18:01:38 -0800 Subject: [PATCH 5709/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1fdef650-be45-4024-9a6e-961c57f134e9 PiperOrigin-RevId: 416438543 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f82aab7551b..8a12357c224 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "704edac79dc19717d9d6ccca3369f79310687f8737203473e906959c9cf1548a", - git_commit = "3d60e861c282689fa4cf96da3a3bc5012fa27988", + sha256 = "b51ea0f8837bc461539d32582530d02d0bbd7a5d402b70f0f610118bab71cf83", + git_commit = "f0c200eb2deac396a3517af1294e6de16f4cbd7e", ) # Import all of TensorFlow Serving's external dependencies. From f9ebc35b6b5021f80bde0b342b9692611dbc9e60 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 15 Dec 2021 00:02:09 -0800 Subject: [PATCH 5710/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8851b804-0b6d-4e08-be50-f73db9697223 PiperOrigin-RevId: 416483102 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8a12357c224..f88b403c90b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b51ea0f8837bc461539d32582530d02d0bbd7a5d402b70f0f610118bab71cf83", - git_commit = "f0c200eb2deac396a3517af1294e6de16f4cbd7e", + sha256 = "72f8f96ef35d9a58284d18154ee3ac187abb5d0c9856603e5687eff9f7825358", + git_commit = "e1dea5731680fcda38be8fd71a6fd1a9e44cba47", ) # Import all of TensorFlow Serving's external dependencies. From 45c0d0d281c04eab0614926e489742312825eacb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 15 Dec 2021 06:01:34 -0800 Subject: [PATCH 5711/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/da485e5b-eb39-41e9-bd18-1877ff291966 PiperOrigin-RevId: 416538287 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f88b403c90b..22a4c1ec149 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "72f8f96ef35d9a58284d18154ee3ac187abb5d0c9856603e5687eff9f7825358", - git_commit = "e1dea5731680fcda38be8fd71a6fd1a9e44cba47", + sha256 = "b82c2c6f56477bd3a13f07cc810cec6696b327f51baebe0557fb3b14dfd04a2d", + git_commit = "6a48a2821744dab650e3e57a066de5210e21a9d1", ) # Import all of TensorFlow Serving's external dependencies. From a1d5e15e088773f45bc8ec0cdd441dc42c649f01 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 15 Dec 2021 12:39:28 -0800 Subject: [PATCH 5712/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/05d60040-a4bb-449f-ab7c-72a5cd648c92 PiperOrigin-RevId: 416623603 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 22a4c1ec149..42e65b1e3d3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b82c2c6f56477bd3a13f07cc810cec6696b327f51baebe0557fb3b14dfd04a2d", - git_commit = "6a48a2821744dab650e3e57a066de5210e21a9d1", + sha256 = "ccb869969a33a1082d83b6dae8925dde1d19c2c367f53b12966676493c2a878f", + git_commit = "39415d54a4ce48b093d0cbee24455cc941d0fe4b", ) # Import all of TensorFlow Serving's external dependencies. From 38126435aa6498cf56ac021c99a1c8d1e6527b97 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 15 Dec 2021 18:01:14 -0800 Subject: [PATCH 5713/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/22dba5e5-fe5e-41ac-88e7-d23cb686b8ec PiperOrigin-RevId: 416688868 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 42e65b1e3d3..9ad5b38f2d7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ccb869969a33a1082d83b6dae8925dde1d19c2c367f53b12966676493c2a878f", - git_commit = "39415d54a4ce48b093d0cbee24455cc941d0fe4b", + sha256 = "08909184b1d8ab889180604417811765f9311ef8b958f644291608b46db61ec3", + git_commit = "2768bc35c826d79f8b165fe073851559f9c4541a", ) # Import all of TensorFlow Serving's external dependencies. From a2a2ae136cb2947163f1d4022afd3d950ce891ff Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 16 Dec 2021 18:02:04 -0800 Subject: [PATCH 5714/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d7b3e16c-20b7-4d13-a556-10e0e683e61e PiperOrigin-RevId: 416932090 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9ad5b38f2d7..9dd892ed24f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "08909184b1d8ab889180604417811765f9311ef8b958f644291608b46db61ec3", - git_commit = "2768bc35c826d79f8b165fe073851559f9c4541a", + sha256 = "7a29aecee858e88d1e09d0362c00e3d4e608ca0e9418c2c26194d496a86a6481", + git_commit = "6364463d6f5b6254cac3d6aedf999b6a96225038", ) # Import all of TensorFlow Serving's external dependencies. From 052b30107b849e28bf0960f49c0f0498253e4074 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 17 Dec 2021 00:01:44 -0800 Subject: [PATCH 5715/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/84aabc1f-da10-427c-8d09-c10a07628bf9 PiperOrigin-RevId: 416969896 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9dd892ed24f..a055e8aff32 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7a29aecee858e88d1e09d0362c00e3d4e608ca0e9418c2c26194d496a86a6481", - git_commit = "6364463d6f5b6254cac3d6aedf999b6a96225038", + sha256 = "1f26bfab1acbc564bc6fdd99d3c4b1c4330d8439ec46c2cb2cb70d6a1fd2ed82", + git_commit = "ac457560364f18f24ae506d978f2ab5f04aa501b", ) # Import all of TensorFlow Serving's external dependencies. From 5b2aef704faa1004ccf495686b81d6141c2acdb1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 17 Dec 2021 06:01:51 -0800 Subject: [PATCH 5716/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/66983c57-8292-48f6-be90-c8014c4b760b PiperOrigin-RevId: 417008585 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a055e8aff32..8eafdb9a6c2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1f26bfab1acbc564bc6fdd99d3c4b1c4330d8439ec46c2cb2cb70d6a1fd2ed82", - git_commit = "ac457560364f18f24ae506d978f2ab5f04aa501b", + sha256 = "f745bd24b232f59f47c5d09345699dfdc8a70d37bbf153d38afbc833104dd625", + git_commit = "b56e6db5e7cccfffa824bbc1b5e018c6cc413c21", ) # Import all of TensorFlow Serving's external dependencies. From f13cd6c8124df9eca23d6b85207bfda717a157e9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 18 Dec 2021 00:02:12 -0800 Subject: [PATCH 5717/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b6712e0c-899e-4221-9a51-c359bbc47e0e PiperOrigin-RevId: 417105334 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8eafdb9a6c2..44dc6843ced 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f745bd24b232f59f47c5d09345699dfdc8a70d37bbf153d38afbc833104dd625", - git_commit = "b56e6db5e7cccfffa824bbc1b5e018c6cc413c21", + sha256 = "da763789e759205ab4ef480a0c40284e2317215dfb99e0f943d9223b2f2676f7", + git_commit = "c236b8e76474ea5e0fb520caabdc097ab3803cab", ) # Import all of TensorFlow Serving's external dependencies. From e80f0a382a4b399a220c545d9fdcd7dfdb1afaaf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 18 Dec 2021 06:02:03 -0800 Subject: [PATCH 5718/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ab8c30cb-c06a-46d3-aa87-60311b638f65 PiperOrigin-RevId: 417136683 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 44dc6843ced..ce3092ace29 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "da763789e759205ab4ef480a0c40284e2317215dfb99e0f943d9223b2f2676f7", - git_commit = "c236b8e76474ea5e0fb520caabdc097ab3803cab", + sha256 = "665e97c4e590157f048873fa24195b93cb3cd7a982818f3cad5237f19422d933", + git_commit = "fb140728a0b4f173bf1d2680a0f0759cbbfce5c5", ) # Import all of TensorFlow Serving's external dependencies. From 082bab662006955a326afd8f87becf3b3daf9a7b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 18 Dec 2021 18:01:32 -0800 Subject: [PATCH 5719/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3bbbd216-8e28-4fb1-81eb-796411442db6 PiperOrigin-RevId: 417192226 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ce3092ace29..33bf1e43f19 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "665e97c4e590157f048873fa24195b93cb3cd7a982818f3cad5237f19422d933", - git_commit = "fb140728a0b4f173bf1d2680a0f0759cbbfce5c5", + sha256 = "d97fdd407c9486333e490a5efceb8baf85ad1f31d20c173d7f87dce333402a54", + git_commit = "c3cce2bb8551dbb06a8d7f0082c260c3299a376b", ) # Import all of TensorFlow Serving's external dependencies. From 492b2b30fcb4019f960239d1ce4c351aa0267ad4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 19 Dec 2021 06:01:48 -0800 Subject: [PATCH 5720/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ee083b4a-a496-463c-8fcf-11a118ceee97 PiperOrigin-RevId: 417251789 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 33bf1e43f19..9d439e2a571 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d97fdd407c9486333e490a5efceb8baf85ad1f31d20c173d7f87dce333402a54", - git_commit = "c3cce2bb8551dbb06a8d7f0082c260c3299a376b", + sha256 = "b39fbb9095c87c5920319902a071da17af443d7f2da1aa07d3447630d9ba800a", + git_commit = "70e2fa14613c0cfbe98a279f9ed9320b2cef6260", ) # Import all of TensorFlow Serving's external dependencies. From 280e35cb2df2ea225de2466ce463cb398799294c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 19 Dec 2021 18:01:55 -0800 Subject: [PATCH 5721/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/18bd0ab4-558a-4240-b484-a48cdb8e4911 PiperOrigin-RevId: 417309650 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9d439e2a571..625ed3750ba 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b39fbb9095c87c5920319902a071da17af443d7f2da1aa07d3447630d9ba800a", - git_commit = "70e2fa14613c0cfbe98a279f9ed9320b2cef6260", + sha256 = "61dc71ec87f224b5f68682a703dc5d30c3ba95d752cf7efb7ad7083f51140619", + git_commit = "f518b5de7276ee81f244a3b4aaab9b760482db31", ) # Import all of TensorFlow Serving's external dependencies. From 0a8ed81e852fda6c7192044707781a2b3ba20952 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 Dec 2021 00:01:43 -0800 Subject: [PATCH 5722/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9965f100-83aa-4610-9420-501979d38ecb PiperOrigin-RevId: 417342727 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 625ed3750ba..67c912708a9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "61dc71ec87f224b5f68682a703dc5d30c3ba95d752cf7efb7ad7083f51140619", - git_commit = "f518b5de7276ee81f244a3b4aaab9b760482db31", + sha256 = "d987467e04eadb3bb71003de0b181f3fd7879f44ad69107ed2ed425c1187299f", + git_commit = "eb80c2b716d40f94266bbe4fa43287edd4be4041", ) # Import all of TensorFlow Serving's external dependencies. From ab3905eab9c08353b7e2feea769a997a6ffbdd31 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 Dec 2021 06:01:49 -0800 Subject: [PATCH 5723/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3245159a-5ad1-4e29-b440-b701b6698cd5 PiperOrigin-RevId: 417390553 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 67c912708a9..26346ee3350 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d987467e04eadb3bb71003de0b181f3fd7879f44ad69107ed2ed425c1187299f", - git_commit = "eb80c2b716d40f94266bbe4fa43287edd4be4041", + sha256 = "c384102a533f9eaf5a86b26b0906a06277d0b78ee8e859e580ea757065c01911", + git_commit = "5e1fbefd02637cac39b25723be5e7c01a5532116", ) # Import all of TensorFlow Serving's external dependencies. From 319c8b41d0e2b612e06f4955166d0db3faa67518 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 Dec 2021 12:02:37 -0800 Subject: [PATCH 5724/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e5e0bf5a-37da-4eb9-9a28-6356a249a639 PiperOrigin-RevId: 417452908 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 26346ee3350..d62706c586b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c384102a533f9eaf5a86b26b0906a06277d0b78ee8e859e580ea757065c01911", - git_commit = "5e1fbefd02637cac39b25723be5e7c01a5532116", + sha256 = "03161dabd06b40ef22c2a7c2b6381308797e469fb170318393540b8219aa29b8", + git_commit = "59f54a9f1b61a53607249c49cf902ff4a0a12eaf", ) # Import all of TensorFlow Serving's external dependencies. From 45a7cfd385a4b622c0ead831afe2f428e638dd44 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 Dec 2021 18:25:32 -0800 Subject: [PATCH 5725/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/127a5b0e-0d8d-49a4-95ab-f9825ad1b7b6 PiperOrigin-RevId: 417516302 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d62706c586b..0d06d883ec3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "03161dabd06b40ef22c2a7c2b6381308797e469fb170318393540b8219aa29b8", - git_commit = "59f54a9f1b61a53607249c49cf902ff4a0a12eaf", + sha256 = "85a98a6b5b01ed2b3a042e68b47effe5d704462ad3007f655271206146ac6e79", + git_commit = "740f052f2e724cbc06f4839f1d892a4ba2f2ae99", ) # Import all of TensorFlow Serving's external dependencies. From 0b1e4fe11fa30acce226b62016a766aa4bc5ce82 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 Dec 2021 00:01:36 -0800 Subject: [PATCH 5726/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d82e4e12-0373-48da-aa6e-992707597d08 PiperOrigin-RevId: 417554052 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0d06d883ec3..d92fa3e6b71 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "85a98a6b5b01ed2b3a042e68b47effe5d704462ad3007f655271206146ac6e79", - git_commit = "740f052f2e724cbc06f4839f1d892a4ba2f2ae99", + sha256 = "3be8889a66a4a1182b1eb4a0f7b8fab9f49cb7c627140f9b080fb7e1c359b528", + git_commit = "2d34c7e9356b038fdb70fe417309b3ea2b258bf0", ) # Import all of TensorFlow Serving's external dependencies. From 4efd81fc758f36d09eedc28ac7a234f9b6a3680b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 Dec 2021 06:01:48 -0800 Subject: [PATCH 5727/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/cd3ebef7-3b25-433a-a665-925f5290c737 PiperOrigin-RevId: 417605029 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d92fa3e6b71..39de8bcd6bd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3be8889a66a4a1182b1eb4a0f7b8fab9f49cb7c627140f9b080fb7e1c359b528", - git_commit = "2d34c7e9356b038fdb70fe417309b3ea2b258bf0", + sha256 = "9c63d629dfd5ce8f5009433a5d2b435e56fd03b478984a955cdad856a1d665d0", + git_commit = "69db6c4226c706bb6394010133d9c46c9485cae5", ) # Import all of TensorFlow Serving's external dependencies. From 4c0f451bc95e68fb5ea42eda3773af545ae06ab5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 Dec 2021 12:18:43 -0800 Subject: [PATCH 5728/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/75cb7889-d581-4f22-b1a0-b247a1677cf9 PiperOrigin-RevId: 417668543 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 39de8bcd6bd..d6822b78bef 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9c63d629dfd5ce8f5009433a5d2b435e56fd03b478984a955cdad856a1d665d0", - git_commit = "69db6c4226c706bb6394010133d9c46c9485cae5", + sha256 = "a2ab5ca37517f3fd4b33774d386c556f0b69dcd3a2eb2829ab879e43e73ceb9d", + git_commit = "369f2a0ac43cae2f6a486555d870600a5ad8004f", ) # Import all of TensorFlow Serving's external dependencies. From bf2f6d890043240313bc7a428b77e5c44dd5a4ef Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 Dec 2021 18:02:16 -0800 Subject: [PATCH 5729/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f662aa54-8202-4640-ada1-448ea090890c PiperOrigin-RevId: 417722822 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d6822b78bef..18592de27b6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a2ab5ca37517f3fd4b33774d386c556f0b69dcd3a2eb2829ab879e43e73ceb9d", - git_commit = "369f2a0ac43cae2f6a486555d870600a5ad8004f", + sha256 = "cf6580f42a2dd43b59061dbecfff4afbf5e55211ad22b4d7450fe13c817e80e2", + git_commit = "33106ca08e948061f5c2fab7ea51e930555fe47c", ) # Import all of TensorFlow Serving's external dependencies. From 1371bd845d8bb6ab5890e66e3b2097319648d08c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 22 Dec 2021 00:01:43 -0800 Subject: [PATCH 5730/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a0301729-147d-4b8b-9697-afa8a7cd808b PiperOrigin-RevId: 417761314 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 18592de27b6..c80f3cb3a60 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cf6580f42a2dd43b59061dbecfff4afbf5e55211ad22b4d7450fe13c817e80e2", - git_commit = "33106ca08e948061f5c2fab7ea51e930555fe47c", + sha256 = "93a0393640abf14d2437afde26055040b8df13545047897e21436eef3ebbd158", + git_commit = "6d99767371d88c8a8ddcd4c91ea7a5681f68f59d", ) # Import all of TensorFlow Serving's external dependencies. From 9a58f80e533e9d408cd69d3bcab4ca50356b9dbf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 22 Dec 2021 06:01:34 -0800 Subject: [PATCH 5731/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ae786e8d-01c5-4820-9900-525b7f672485 PiperOrigin-RevId: 417805736 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c80f3cb3a60..8e847e4fe4f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "93a0393640abf14d2437afde26055040b8df13545047897e21436eef3ebbd158", - git_commit = "6d99767371d88c8a8ddcd4c91ea7a5681f68f59d", + sha256 = "ef012cfd89ddb18d6dc896b3a27807fd03172fcd5c0985f66de8d0e7cebb93f2", + git_commit = "147344a59b69190b43b9172776a26467fae52447", ) # Import all of TensorFlow Serving's external dependencies. From 122a96ae233aa20f38763849d3b3a8459fc51395 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 22 Dec 2021 12:01:21 -0800 Subject: [PATCH 5732/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2b60251a-e7c8-4b55-8664-a88889c4f210 PiperOrigin-RevId: 417862053 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8e847e4fe4f..c75a4c24d4e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ef012cfd89ddb18d6dc896b3a27807fd03172fcd5c0985f66de8d0e7cebb93f2", - git_commit = "147344a59b69190b43b9172776a26467fae52447", + sha256 = "365da0bef8a0ed5b280fbd42b1024cf5cadfd4c6500c0b29c3c6e52f0d75786a", + git_commit = "5e8cd1162cc8eeb9cf493d071293a621dcbb51f0", ) # Import all of TensorFlow Serving's external dependencies. From a2eda60c98c21a085983efa2b3c2bd8ca4e4ab5e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 22 Dec 2021 18:01:36 -0800 Subject: [PATCH 5733/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ba5c4e18-19bb-43e2-b0e7-661c163e373f PiperOrigin-RevId: 417917196 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c75a4c24d4e..fe53b2a6515 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "365da0bef8a0ed5b280fbd42b1024cf5cadfd4c6500c0b29c3c6e52f0d75786a", - git_commit = "5e8cd1162cc8eeb9cf493d071293a621dcbb51f0", + sha256 = "121778bede3afc7af0ddd971ffc88e92c2a5069418d20f6862aac997e90651cb", + git_commit = "8a4676d3723cd56be092e1c82eb23248e53367e0", ) # Import all of TensorFlow Serving's external dependencies. From 8974e7d30e64cd901399ccbcd633cd1ce1f4e3b2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 Dec 2021 00:01:56 -0800 Subject: [PATCH 5734/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6f76d1df-3ef4-495b-9c5a-e652886f5947 PiperOrigin-RevId: 417952667 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fe53b2a6515..dc4defbe928 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "121778bede3afc7af0ddd971ffc88e92c2a5069418d20f6862aac997e90651cb", - git_commit = "8a4676d3723cd56be092e1c82eb23248e53367e0", + sha256 = "bef30f02e74b22ffbc69c125c86f0000758440faf248976dab20a551b10612e5", + git_commit = "08e5b94134d2d9a18e34e427660161a0c45b6567", ) # Import all of TensorFlow Serving's external dependencies. From d7258b411f924c434d5189c4e03d476c49fef4e9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 Dec 2021 06:02:03 -0800 Subject: [PATCH 5735/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/db3d0875-035b-4d22-9b7e-728f3375001e PiperOrigin-RevId: 417995228 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dc4defbe928..bb8bb1d52a0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bef30f02e74b22ffbc69c125c86f0000758440faf248976dab20a551b10612e5", - git_commit = "08e5b94134d2d9a18e34e427660161a0c45b6567", + sha256 = "e5cbe820f8207f9cdfa9910a7013cc292d3331b68a3f01747f604b1e573e95c6", + git_commit = "d61c329a065cdbe643d1dd4c973f99b2b6e1fb20", ) # Import all of TensorFlow Serving's external dependencies. From 2e351acfe10f1515195ce0c5f7e0b9b770a22e31 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 Dec 2021 12:02:18 -0800 Subject: [PATCH 5736/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8350d3fe-7b01-49f6-b90f-11a3702e3cb9 PiperOrigin-RevId: 418044633 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bb8bb1d52a0..901b7880cec 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e5cbe820f8207f9cdfa9910a7013cc292d3331b68a3f01747f604b1e573e95c6", - git_commit = "d61c329a065cdbe643d1dd4c973f99b2b6e1fb20", + sha256 = "8782b34bda5436ceb5b9b944b5f57385871490ed0344afbd0b25739aa67c511a", + git_commit = "c2ebc9cdbd4332e91d60869c82b473bdfbc97eda", ) # Import all of TensorFlow Serving's external dependencies. From afea87930c3722a8d06fc6584014d82f5cb9795e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 Dec 2021 18:01:44 -0800 Subject: [PATCH 5737/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/834e8e9b-d58a-40a2-bc4c-fdc933f1de1a PiperOrigin-RevId: 418090672 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 901b7880cec..6b7389fe26b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8782b34bda5436ceb5b9b944b5f57385871490ed0344afbd0b25739aa67c511a", - git_commit = "c2ebc9cdbd4332e91d60869c82b473bdfbc97eda", + sha256 = "6fe93b357186425c3f11edf2c409c7cd132fa457b7cfae55982d47e63440c71b", + git_commit = "b3e9b95e725d5897fda9d21c8fce1264cd95db4e", ) # Import all of TensorFlow Serving's external dependencies. From 73526c31d3eab7fe0ef3c92dfc2d14f19fa988c6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Dec 2021 00:01:24 -0800 Subject: [PATCH 5738/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2d06bd4e-1fc4-41f4-841e-b3c5c3ab6fd9 PiperOrigin-RevId: 418123175 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6b7389fe26b..b15635dbeac 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6fe93b357186425c3f11edf2c409c7cd132fa457b7cfae55982d47e63440c71b", - git_commit = "b3e9b95e725d5897fda9d21c8fce1264cd95db4e", + sha256 = "c076c272b86d14f1a44b9e6fdcfc4087f59da8d250f05051ebdcca74154a1ad0", + git_commit = "ba08cd6143f363d2305c33a3b6312634727601bf", ) # Import all of TensorFlow Serving's external dependencies. From a79431907ee36ca438a4d0f8f49871f22efa30c7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Dec 2021 06:01:30 -0800 Subject: [PATCH 5739/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f85104ba-4cd3-4459-8bb3-15131360160b PiperOrigin-RevId: 418159020 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b15635dbeac..491519f9f00 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c076c272b86d14f1a44b9e6fdcfc4087f59da8d250f05051ebdcca74154a1ad0", - git_commit = "ba08cd6143f363d2305c33a3b6312634727601bf", + sha256 = "045c2f8af3e9d1e93527307d98d77851fe44e7772a49d861cfa94f23bd36dede", + git_commit = "bb6261422b49066096cfa2b023a76208fefbc611", ) # Import all of TensorFlow Serving's external dependencies. From 6f67fe82819969ea8cd4f52dfdb561592ea569d4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Dec 2021 12:01:23 -0800 Subject: [PATCH 5740/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/84a0b7ef-fa29-4f41-9eb6-f475139b2c14 PiperOrigin-RevId: 418186742 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 491519f9f00..64533136bae 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "045c2f8af3e9d1e93527307d98d77851fe44e7772a49d861cfa94f23bd36dede", - git_commit = "bb6261422b49066096cfa2b023a76208fefbc611", + sha256 = "af5b50f8e7652cd12e005856c03cd606e94bec77e683f12fd27337b985d47668", + git_commit = "b818b3a1d6b6c82a2c127b74f5363d4e5fdaa8ac", ) # Import all of TensorFlow Serving's external dependencies. From 8f4dc6593c106cc6414c87acc8bd9a5e5d4137cf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Dec 2021 18:01:53 -0800 Subject: [PATCH 5741/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/991a1f36-b9e2-42be-bf9a-c66797886448 PiperOrigin-RevId: 418213478 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 64533136bae..610851db165 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "af5b50f8e7652cd12e005856c03cd606e94bec77e683f12fd27337b985d47668", - git_commit = "b818b3a1d6b6c82a2c127b74f5363d4e5fdaa8ac", + sha256 = "ca4e01346cfc0c910bcd94f61165c5e08454e3aeff7156eac8eff9b9fe30dd39", + git_commit = "027119e16fcd54d3c55ab283fb4b154d908c278d", ) # Import all of TensorFlow Serving's external dependencies. From b1e258e55f2c501eb94e383477b4a6c1229fdb55 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 25 Dec 2021 06:02:06 -0800 Subject: [PATCH 5742/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9431c4e8-fa19-4b67-a93c-936fc28f94e4 PiperOrigin-RevId: 418268188 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 610851db165..cfb8c5a0279 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ca4e01346cfc0c910bcd94f61165c5e08454e3aeff7156eac8eff9b9fe30dd39", - git_commit = "027119e16fcd54d3c55ab283fb4b154d908c278d", + sha256 = "73196a40de901d57d69d0e70c9d8efec899048a4c7397984b8803cbfe5e8c4e4", + git_commit = "f72a5166a424405cc103dee653c64899c7f28904", ) # Import all of TensorFlow Serving's external dependencies. From b6f36430f7220dd8c0c14a03716c6512e6c1e204 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 25 Dec 2021 18:01:44 -0800 Subject: [PATCH 5743/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/115dca01-0b8f-4c46-9dc0-287a8dd47361 PiperOrigin-RevId: 418317791 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cfb8c5a0279..6b0421671e6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "73196a40de901d57d69d0e70c9d8efec899048a4c7397984b8803cbfe5e8c4e4", - git_commit = "f72a5166a424405cc103dee653c64899c7f28904", + sha256 = "2af7eebe74f450819839c18a91779d6525cd5854e3ad4931d29c0dce687575eb", + git_commit = "03d1520ad7d88d3960028e1dca60bc641d543ba8", ) # Import all of TensorFlow Serving's external dependencies. From 28da5d3058df866020193d222885de80dfca60ae Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 26 Dec 2021 00:01:34 -0800 Subject: [PATCH 5744/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/846ce739-def6-4094-aaf4-2fef8589d4ed PiperOrigin-RevId: 418341704 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6b0421671e6..e5999294e58 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2af7eebe74f450819839c18a91779d6525cd5854e3ad4931d29c0dce687575eb", - git_commit = "03d1520ad7d88d3960028e1dca60bc641d543ba8", + sha256 = "a01154258e31760b72fa3073d027c1c730374070f8efa9929db8b6d7d55c578d", + git_commit = "10ac4ccb57af478fde1f6d479beb0dfa1aa47b8a", ) # Import all of TensorFlow Serving's external dependencies. From 1ee320b1e03ca327879641e939f5abef1114bb5c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 26 Dec 2021 06:01:44 -0800 Subject: [PATCH 5745/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8fa72147-e261-44b6-b3eb-afb0d0c54cb7 PiperOrigin-RevId: 418369888 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e5999294e58..5866e4b504c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a01154258e31760b72fa3073d027c1c730374070f8efa9929db8b6d7d55c578d", - git_commit = "10ac4ccb57af478fde1f6d479beb0dfa1aa47b8a", + sha256 = "337ee796a59a158ac1f013c9ba9ebb6d3f89cbc37d9253795c99ef4cf685c1e5", + git_commit = "a04aa75e6e0d1f48114664f06f3b45243fbb0e48", ) # Import all of TensorFlow Serving's external dependencies. From 79bdd7259db188ad59095264988a929378060bf2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 26 Dec 2021 12:01:29 -0800 Subject: [PATCH 5746/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9ffacbd0-b759-42ae-84db-e241fa09f4ff PiperOrigin-RevId: 418394931 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5866e4b504c..1a5ec625cdd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "337ee796a59a158ac1f013c9ba9ebb6d3f89cbc37d9253795c99ef4cf685c1e5", - git_commit = "a04aa75e6e0d1f48114664f06f3b45243fbb0e48", + sha256 = "4cfc36dfe9ca1f77c7a67e2e42d96d3950a4b42e70c8b9ac0124e761ad703bfc", + git_commit = "c8fe26eb52e34f67759ee2b0662b09de12641652", ) # Import all of TensorFlow Serving's external dependencies. From b90f0c16e822ac6e9a6dfd69ec901a27c974829c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 26 Dec 2021 18:01:23 -0800 Subject: [PATCH 5747/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4fcc5798-508d-4864-8afd-2343827bffde PiperOrigin-RevId: 418419299 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1a5ec625cdd..22e51552a9f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4cfc36dfe9ca1f77c7a67e2e42d96d3950a4b42e70c8b9ac0124e761ad703bfc", - git_commit = "c8fe26eb52e34f67759ee2b0662b09de12641652", + sha256 = "cf620aa3e6121c94de83af266146d2e1e6e205c5b6cfe845950d22cdbadc3d8b", + git_commit = "3fb790c51ce551c5b3bc62c6568ddc7332def508", ) # Import all of TensorFlow Serving's external dependencies. From 2b3cf4fd6cd6035158a2b4434d9a475a82615fca Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 27 Dec 2021 06:01:45 -0800 Subject: [PATCH 5748/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a812f951-1130-4a3f-8ae2-17d14ea43daa PiperOrigin-RevId: 418485320 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 22e51552a9f..e7dd7bb35fa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cf620aa3e6121c94de83af266146d2e1e6e205c5b6cfe845950d22cdbadc3d8b", - git_commit = "3fb790c51ce551c5b3bc62c6568ddc7332def508", + sha256 = "4db468507caab00ed9536f5d24a62b43091aabcc02b89bdc14c5ea13037d0f28", + git_commit = "f28fb5046d1e4d66487e0130b999c8a9074573de", ) # Import all of TensorFlow Serving's external dependencies. From 22f059945e719884fb8d4ae141d218817d14834f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 27 Dec 2021 12:01:26 -0800 Subject: [PATCH 5749/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0ef002f1-c3b6-4e4a-9b94-b0084e1ffc42 PiperOrigin-RevId: 418517305 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e7dd7bb35fa..6a3fa175631 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4db468507caab00ed9536f5d24a62b43091aabcc02b89bdc14c5ea13037d0f28", - git_commit = "f28fb5046d1e4d66487e0130b999c8a9074573de", + sha256 = "8dc128538f9a1502a81200537dde2e452372cadf9e1fe29d692bc5d4f11cd70e", + git_commit = "028c3707f0066ad0c9c2db7653cd6d0a9669256f", ) # Import all of TensorFlow Serving's external dependencies. From bc11d4a2c63f8f21f0250130ff220a410eb770f0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 27 Dec 2021 18:01:27 -0800 Subject: [PATCH 5750/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5124d59d-3ee7-49f7-a78d-e6edb15bdd15 PiperOrigin-RevId: 418546074 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6a3fa175631..1acfb966a87 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8dc128538f9a1502a81200537dde2e452372cadf9e1fe29d692bc5d4f11cd70e", - git_commit = "028c3707f0066ad0c9c2db7653cd6d0a9669256f", + sha256 = "4574dac2a92d8af6903c51391d0d464f7709484044175da6dc359c1f2b446e7e", + git_commit = "6d77b7f3f4c5147b0da526cda2df1946297a6522", ) # Import all of TensorFlow Serving's external dependencies. From 3b9af2be719ff4aedbd63fd33d1a58c590c88e93 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 28 Dec 2021 00:01:26 -0800 Subject: [PATCH 5751/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/714a15e4-b13e-4844-b77b-62b92b83ba4b PiperOrigin-RevId: 418575011 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1acfb966a87..096e657e7bc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4574dac2a92d8af6903c51391d0d464f7709484044175da6dc359c1f2b446e7e", - git_commit = "6d77b7f3f4c5147b0da526cda2df1946297a6522", + sha256 = "2472823ed27e46676f9bae6cdd5191f9c95407edb63f422dec96b82dc1e81a8f", + git_commit = "1f7940300d96085c53da823dfd3b9d2a87a8fec1", ) # Import all of TensorFlow Serving's external dependencies. From 436a317f662d09994d0034ced62b4e11ffc38393 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 28 Dec 2021 06:01:28 -0800 Subject: [PATCH 5752/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2ef9bc5a-bb3d-48bc-b7f6-36c2755d3f5a PiperOrigin-RevId: 418613386 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 096e657e7bc..5917800e3ed 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2472823ed27e46676f9bae6cdd5191f9c95407edb63f422dec96b82dc1e81a8f", - git_commit = "1f7940300d96085c53da823dfd3b9d2a87a8fec1", + sha256 = "c95e13218943494eab6f62d1a34b3ee270c44a53df36d25b1018ad3c67dc08b7", + git_commit = "4ac7f9501b01f4143ec0c05a9b5e73c098a53a0f", ) # Import all of TensorFlow Serving's external dependencies. From 9c1ab58d8e303551c46293658f058201871c59b8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 28 Dec 2021 12:01:58 -0800 Subject: [PATCH 5753/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5fe9a6e6-b53b-4c7f-8907-951776414727 PiperOrigin-RevId: 418659741 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5917800e3ed..b43d275a7c1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c95e13218943494eab6f62d1a34b3ee270c44a53df36d25b1018ad3c67dc08b7", - git_commit = "4ac7f9501b01f4143ec0c05a9b5e73c098a53a0f", + sha256 = "148b0b8eb71023e2ad1a710b8efdd6fe8bdb65a9ebe622201e475028653e932e", + git_commit = "4c20dadceb41040379ce0902a72a804af1d29450", ) # Import all of TensorFlow Serving's external dependencies. From 7d709832aaf9a951b3eb41f9183141cd625f213e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 28 Dec 2021 18:02:12 -0800 Subject: [PATCH 5754/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/81db63b5-9c87-498f-97aa-cbfaf9d88741 PiperOrigin-RevId: 418703716 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b43d275a7c1..20df232002f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "148b0b8eb71023e2ad1a710b8efdd6fe8bdb65a9ebe622201e475028653e932e", - git_commit = "4c20dadceb41040379ce0902a72a804af1d29450", + sha256 = "7a302e98792a00b32e9a3b68a1354cadda794d09f402649055eeca6e1af2d17f", + git_commit = "25f036af3cce39f628f563d5c5ff8225e7ac0e86", ) # Import all of TensorFlow Serving's external dependencies. From b095f36935cd1c56917fb4b3d62c0e6a1b76ad01 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 29 Dec 2021 00:01:28 -0800 Subject: [PATCH 5755/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3f9d7b2d-8eee-433a-aedb-8b696eb38d81 PiperOrigin-RevId: 418736206 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 20df232002f..c5f80827b70 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7a302e98792a00b32e9a3b68a1354cadda794d09f402649055eeca6e1af2d17f", - git_commit = "25f036af3cce39f628f563d5c5ff8225e7ac0e86", + sha256 = "767229bfd625c32e61ef1310f58eb5fff84dce8fa3b8c9ef212dd116cb8d6cff", + git_commit = "abf773b0abedb2111a9acdae9c0be6ebeb156bc1", ) # Import all of TensorFlow Serving's external dependencies. From 594c6e15f19605061027568e104c9373487102b0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 29 Dec 2021 06:01:33 -0800 Subject: [PATCH 5756/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c0e7f55c-f0da-47cb-b080-b46732dd3eba PiperOrigin-RevId: 418782331 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c5f80827b70..083d718f841 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "767229bfd625c32e61ef1310f58eb5fff84dce8fa3b8c9ef212dd116cb8d6cff", - git_commit = "abf773b0abedb2111a9acdae9c0be6ebeb156bc1", + sha256 = "f5481c691aa9a7eb57d974f0b0b7e674b50592a353b6c82311f50f7d78707276", + git_commit = "e9b7e9ea68ade6b5fb2dbd32c384568d1ddc1c06", ) # Import all of TensorFlow Serving's external dependencies. From 3b135ba6b0105111738870e0f8572338d18fbd2b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 29 Dec 2021 12:01:41 -0800 Subject: [PATCH 5757/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2eda6681-f7b0-4836-bd84-10f2f0afee60 PiperOrigin-RevId: 418827542 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 083d718f841..c248cd237b1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f5481c691aa9a7eb57d974f0b0b7e674b50592a353b6c82311f50f7d78707276", - git_commit = "e9b7e9ea68ade6b5fb2dbd32c384568d1ddc1c06", + sha256 = "e62f0c241c090bf6753334bd1705dd1a528e3fedaf48e97a6a49e58f9de2b72f", + git_commit = "d8b3d5b22cb61b1a19e7d1c3524f1be92ee45ca6", ) # Import all of TensorFlow Serving's external dependencies. From f73af2e241ad6c06e6c2eb9b1a76ccab2f140264 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 29 Dec 2021 18:01:27 -0800 Subject: [PATCH 5758/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/51d37a9e-d88e-4cd0-bc79-2fd39b1d4227 PiperOrigin-RevId: 418873166 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c248cd237b1..fa62aa08c6c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e62f0c241c090bf6753334bd1705dd1a528e3fedaf48e97a6a49e58f9de2b72f", - git_commit = "d8b3d5b22cb61b1a19e7d1c3524f1be92ee45ca6", + sha256 = "b2d10bb4d697a61eda50957843bec90db151679ff49c4eb1f705facacc596c54", + git_commit = "6fcfc7c8a6d46b63e4e2febb1774f9f0865bd2f2", ) # Import all of TensorFlow Serving's external dependencies. From dcf60f585421814513ed965029ad3b5a42af544e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 Dec 2021 00:01:30 -0800 Subject: [PATCH 5759/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/39c65cac-20a0-4bc2-ab80-34a696f55f6d PiperOrigin-RevId: 418906924 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fa62aa08c6c..64257bd0968 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b2d10bb4d697a61eda50957843bec90db151679ff49c4eb1f705facacc596c54", - git_commit = "6fcfc7c8a6d46b63e4e2febb1774f9f0865bd2f2", + sha256 = "031b66612cde4929602304f884d5b6341e23437eaf08eb389a0ce321e32478ff", + git_commit = "a8064326385c37dd0eb13308afdba49ebb540d57", ) # Import all of TensorFlow Serving's external dependencies. From 1a16bcec60235ce94e4293ebfd85bf0a6affe697 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 Dec 2021 06:03:02 -0800 Subject: [PATCH 5760/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d35f2dd5-954c-4272-bfde-3a82ef79572a PiperOrigin-RevId: 418947158 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 64257bd0968..cf18ebb88eb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "031b66612cde4929602304f884d5b6341e23437eaf08eb389a0ce321e32478ff", - git_commit = "a8064326385c37dd0eb13308afdba49ebb540d57", + sha256 = "d732624857a6415f7e5a757493eb82fa5b965ebc5dcea7324ce434d8103fef39", + git_commit = "1d62bf2af6e855835c4d2286678c518f56243ffc", ) # Import all of TensorFlow Serving's external dependencies. From 93de9a784fbd71b19a0734da9e36a8d2a3580ef6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 Dec 2021 12:21:59 -0800 Subject: [PATCH 5761/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b53b0e3c-4c61-426d-acc9-6f77e5a865fd PiperOrigin-RevId: 418992086 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cf18ebb88eb..bcb2f07229f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d732624857a6415f7e5a757493eb82fa5b965ebc5dcea7324ce434d8103fef39", - git_commit = "1d62bf2af6e855835c4d2286678c518f56243ffc", + sha256 = "6311738c53b21ffbc3ad51b0e3f5da6fe57bc27f006da874b7f4e362c0e4de0c", + git_commit = "8de38cd16b2c023ec4257758b28f7becefbcfcf5", ) # Import all of TensorFlow Serving's external dependencies. From 6c8bbb50d952195be8a29bde41ce237ed42053db Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 Dec 2021 18:01:36 -0800 Subject: [PATCH 5762/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6f2c39fa-9230-4c0b-97f2-2f0d42a231ec PiperOrigin-RevId: 419027962 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bcb2f07229f..6c68ab44048 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6311738c53b21ffbc3ad51b0e3f5da6fe57bc27f006da874b7f4e362c0e4de0c", - git_commit = "8de38cd16b2c023ec4257758b28f7becefbcfcf5", + sha256 = "6890f6f972246207720b93a7e4e9e31cce17911bdb8c8bab5e67042680e61b05", + git_commit = "94ebe31a0287713b167776d6a2e2e151d494eebd", ) # Import all of TensorFlow Serving's external dependencies. From 6f1eb2bac0827e543f470a0f79ea32fa8b62b676 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 31 Dec 2021 00:01:52 -0800 Subject: [PATCH 5763/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d1459ac0-436e-4da1-9524-3c7235aac174 PiperOrigin-RevId: 419058082 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6c68ab44048..d6d15a0aa24 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6890f6f972246207720b93a7e4e9e31cce17911bdb8c8bab5e67042680e61b05", - git_commit = "94ebe31a0287713b167776d6a2e2e151d494eebd", + sha256 = "9c2c5450a8c5933606bb262d081ffb3596f2926d1d62a531150786fb3daf4bfc", + git_commit = "1ef2bbae5f7521c9f1c3a831c162fe9a540df4b1", ) # Import all of TensorFlow Serving's external dependencies. From 7a0a2d41203e8d64156d918c4a1ef4145d9743f1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 31 Dec 2021 06:01:27 -0800 Subject: [PATCH 5764/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/769d4dad-3cc1-4b68-bf85-f6705622f638 PiperOrigin-RevId: 419093524 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d6d15a0aa24..34ae1c4bc25 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9c2c5450a8c5933606bb262d081ffb3596f2926d1d62a531150786fb3daf4bfc", - git_commit = "1ef2bbae5f7521c9f1c3a831c162fe9a540df4b1", + sha256 = "4c48b42ebc2467c3f1f80f0847fec36a548fa2ead97713f9fc9be2c32cd32db9", + git_commit = "d8f2ee8d746e11f9d43568dda888c33d4896aa12", ) # Import all of TensorFlow Serving's external dependencies. From db983d513a62f3c25d708209311f27f30e116525 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 31 Dec 2021 12:02:18 -0800 Subject: [PATCH 5765/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/eb21cd3a-9a86-4a61-9912-94657b57bf3c PiperOrigin-RevId: 419122479 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 34ae1c4bc25..16f48ae4ea9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4c48b42ebc2467c3f1f80f0847fec36a548fa2ead97713f9fc9be2c32cd32db9", - git_commit = "d8f2ee8d746e11f9d43568dda888c33d4896aa12", + sha256 = "a2bd99f46283ee0cfd5cfb4b7c7fe3853e1640ef4ef04f21d45cb2cbffeaeec4", + git_commit = "a9bd2d45c0ea7755197752b84ec9462d8cdf6f57", ) # Import all of TensorFlow Serving's external dependencies. From 1ecf22d95c94212c227a7ad3c515766d6704398b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 31 Dec 2021 18:01:53 -0800 Subject: [PATCH 5766/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5613ab62-1da7-4fd5-9a5d-209cfdde9967 PiperOrigin-RevId: 419149061 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 16f48ae4ea9..bb5b4fcbf16 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a2bd99f46283ee0cfd5cfb4b7c7fe3853e1640ef4ef04f21d45cb2cbffeaeec4", - git_commit = "a9bd2d45c0ea7755197752b84ec9462d8cdf6f57", + sha256 = "362e791f48d507fb911b7eabdf144a96896b7c92882d7e5a4bf0fa568376eef5", + git_commit = "221417c504c46295e72cd63acc6011f5a0cc0725", ) # Import all of TensorFlow Serving's external dependencies. From 6753163a79837e2a56d8fdd3c1191a36d0f03085 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 1 Jan 2022 06:01:26 -0800 Subject: [PATCH 5767/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c6946e7b-1707-4a3d-9169-5bdfc2253f83 PiperOrigin-RevId: 419202264 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bb5b4fcbf16..e3d7bb47e89 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "362e791f48d507fb911b7eabdf144a96896b7c92882d7e5a4bf0fa568376eef5", - git_commit = "221417c504c46295e72cd63acc6011f5a0cc0725", + sha256 = "6154be9e916d68012b8fd524d46b8e001ca9304ad264ab46053d478b63100e3b", + git_commit = "b1a8f5fafec9c8a402b2efad103fc9bd975ec3ce", ) # Import all of TensorFlow Serving's external dependencies. From f03132763b7caea07c7eeca0b3623ff813b8e55e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 2 Jan 2022 06:01:28 -0800 Subject: [PATCH 5768/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5b87a820-34a1-43fe-a45f-2df188d1e8ff PiperOrigin-RevId: 419306352 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e3d7bb47e89..711ac93f5a0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6154be9e916d68012b8fd524d46b8e001ca9304ad264ab46053d478b63100e3b", - git_commit = "b1a8f5fafec9c8a402b2efad103fc9bd975ec3ce", + sha256 = "ac1dc1ed48c958dbd0eec20e237f1e62f12c3f171609dc7f0c1a682b4aa3642c", + git_commit = "ac3f270be5421836cd11a803f0d7adf10d201ab3", ) # Import all of TensorFlow Serving's external dependencies. From f11710ef262460c686eeb70589fe1d96d9924985 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 2 Jan 2022 12:02:22 -0800 Subject: [PATCH 5769/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b3b2a979-7da1-45ec-bf5e-d7e74d4c14f9 PiperOrigin-RevId: 419333000 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 711ac93f5a0..30201d6fd17 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ac1dc1ed48c958dbd0eec20e237f1e62f12c3f171609dc7f0c1a682b4aa3642c", - git_commit = "ac3f270be5421836cd11a803f0d7adf10d201ab3", + sha256 = "7fde8cb2fd81afeb8afc4f9358272f44f05fab928f96a8a0ffd1c4eba50bc728", + git_commit = "bd9ba9309d28bc48675c029b60f45156b0c78686", ) # Import all of TensorFlow Serving's external dependencies. From 7923be4eb2fbf7e4e553442f2e91ba2d5806b016 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 3 Jan 2022 00:01:31 -0800 Subject: [PATCH 5770/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7248afeb-bd8b-4bd8-bac1-5a02596f7136 PiperOrigin-RevId: 419388574 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 30201d6fd17..14c7f2c37f2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7fde8cb2fd81afeb8afc4f9358272f44f05fab928f96a8a0ffd1c4eba50bc728", - git_commit = "bd9ba9309d28bc48675c029b60f45156b0c78686", + sha256 = "df6efc24bffc4333e16a96ed9c1d5944b647cb0b06aa8af6ea86e326b619b6de", + git_commit = "0d8705c82c64dfb39c49e346de1a66182e5eabd1", ) # Import all of TensorFlow Serving's external dependencies. From e18ed01b5ea0fe21e7e7107492acf95b7575970a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 3 Jan 2022 06:01:40 -0800 Subject: [PATCH 5771/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bc559f01-f8eb-48c7-a5cc-276d6780ba87 PiperOrigin-RevId: 419428853 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 14c7f2c37f2..bef9afb491b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "df6efc24bffc4333e16a96ed9c1d5944b647cb0b06aa8af6ea86e326b619b6de", - git_commit = "0d8705c82c64dfb39c49e346de1a66182e5eabd1", + sha256 = "729f8b4357c573453685e235c7ee35e622117a348984f29c5eb55f92197f6e3e", + git_commit = "7d12007d7800d3714a02e05059f3ea602d1aec78", ) # Import all of TensorFlow Serving's external dependencies. From 629b59018849579cc29e038e71df2eccc7e86e1d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 3 Jan 2022 12:01:56 -0800 Subject: [PATCH 5772/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9c3830b1-0c0d-4089-99d3-d80f7a386b59 PiperOrigin-RevId: 419466011 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bef9afb491b..8871abbf635 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "729f8b4357c573453685e235c7ee35e622117a348984f29c5eb55f92197f6e3e", - git_commit = "7d12007d7800d3714a02e05059f3ea602d1aec78", + sha256 = "9fd7cf7a6b36480fbca01b30ef0e9fe49f9154f4fa78bb7fa386dd8c73ae3cfa", + git_commit = "26145f7dcbaf6905d5a123a342108d202806a560", ) # Import all of TensorFlow Serving's external dependencies. From 0b5e7c019c933eea1d2163c97bc2c3a5850bfaa3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 3 Jan 2022 18:01:59 -0800 Subject: [PATCH 5773/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/236c8c56-280d-4269-8447-276da1b4f300 PiperOrigin-RevId: 419495868 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8871abbf635..549a1ed93a0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9fd7cf7a6b36480fbca01b30ef0e9fe49f9154f4fa78bb7fa386dd8c73ae3cfa", - git_commit = "26145f7dcbaf6905d5a123a342108d202806a560", + sha256 = "2b07be28f714cc3afaf481d4083b24c916d4fe8d7d9ea2dcd93c29679f153345", + git_commit = "a9e84da7b630e54fd67142355a2d6101c0053588", ) # Import all of TensorFlow Serving's external dependencies. From 6ba850c1a20266d65492791b6ba619ca47c05814 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 4 Jan 2022 00:01:33 -0800 Subject: [PATCH 5774/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/68b44bfd-6639-4380-b2a4-e518f836da25 PiperOrigin-RevId: 419528187 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 549a1ed93a0..8a3a8714c27 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2b07be28f714cc3afaf481d4083b24c916d4fe8d7d9ea2dcd93c29679f153345", - git_commit = "a9e84da7b630e54fd67142355a2d6101c0053588", + sha256 = "5fc122c8bdf79826812ce83c5170df183e7121043533d5038121187d58aabf68", + git_commit = "7e7a73b9de37b658b59d12be993271849cc02916", ) # Import all of TensorFlow Serving's external dependencies. From 8548e2da088a40025b333e30d235d44d2d1ecdd4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 4 Jan 2022 06:01:46 -0800 Subject: [PATCH 5775/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f7df591c-00db-427a-8dca-3c81134e460f PiperOrigin-RevId: 419575008 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8a3a8714c27..0a4404d2536 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5fc122c8bdf79826812ce83c5170df183e7121043533d5038121187d58aabf68", - git_commit = "7e7a73b9de37b658b59d12be993271849cc02916", + sha256 = "a8a951d8abf171362f5730bd93fcac20aed6605607935c8594cd016f205b58fd", + git_commit = "0f792fc664dd3952fbb76e4e8f8dda21bbf7971a", ) # Import all of TensorFlow Serving's external dependencies. From 923269955f5582cc26d0454992afa5c888a9377f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 4 Jan 2022 08:22:52 -0800 Subject: [PATCH 5776/8103] Do not report successful loads that are cancelled, unload immediately instead. PiperOrigin-RevId: 419600593 --- tensorflow_serving/core/loader_harness.cc | 52 ++++++++++++------- tensorflow_serving/core/loader_harness.h | 3 ++ .../core/loader_harness_test.cc | 23 ++++++++ 3 files changed, 59 insertions(+), 19 deletions(-) diff --git a/tensorflow_serving/core/loader_harness.cc b/tensorflow_serving/core/loader_harness.cc index 95a7bfb2e08..81ded30a9ac 100644 --- a/tensorflow_serving/core/loader_harness.cc +++ b/tensorflow_serving/core/loader_harness.cc @@ -80,14 +80,23 @@ Status LoaderHarness::Load() { [&]() { return loader_->LoadWithMetadata({id_}); }, [&]() { return cancel_load_retry(); }); - { - mutex_lock l(mu_); - if (status.ok()) { + if (status.ok()) { + if (cancel_load_retry()) { + // Servable is going to be unloaded very soon, + // we report a failure here so that we do not accidentally + // report that the servable is available. + TF_RETURN_IF_ERROR(UnloadDueToCancelledLoad()); + return errors::Cancelled( + strings::StrCat("Loading of servable cancelled")); + } + { + mutex_lock l(mu_); TF_RETURN_IF_ERROR(TransitionState(State::kLoading, State::kReady)); LOG(INFO) << "Successfully loaded servable version " << id_; - } else { - ErrorInternal(status); } + } else { + mutex_lock l(mu_); + ErrorInternal(status); } return status; @@ -103,21 +112,11 @@ Status LoaderHarness::UnloadRequested() { return Status::OK(); } -void LoaderHarness::set_cancel_load_retry(const bool value) { - mutex_lock l(mu_); - cancel_load_retry_ = value; -} - -bool LoaderHarness::cancel_load_retry() { - mutex_lock l(mu_); - return cancel_load_retry_; -} - -Status LoaderHarness::Unload() { +Status LoaderHarness::UnloadInternal(State from_state) { { mutex_lock l(mu_); - TF_RETURN_IF_ERROR(TransitionState(State::kQuiesced, State::kUnloading)); - LOG(INFO) << "Unloading servable version " << id_; + TF_RETURN_IF_ERROR(TransitionState(from_state, State::kUnloading)); + LOG(INFO) << "Unloading just-loaded servable version " << id_; } loader_->Unload(); @@ -127,10 +126,25 @@ Status LoaderHarness::Unload() { TF_RETURN_IF_ERROR(TransitionState(State::kUnloading, State::kDisabled)); LOG(INFO) << "Done unloading servable version " << id_; } - return Status::OK(); } +Status LoaderHarness::UnloadDueToCancelledLoad() { + return UnloadInternal(State::kLoading); +} + +void LoaderHarness::set_cancel_load_retry(const bool value) { + mutex_lock l(mu_); + cancel_load_retry_ = value; +} + +bool LoaderHarness::cancel_load_retry() { + mutex_lock l(mu_); + return cancel_load_retry_; +} + +Status LoaderHarness::Unload() { return UnloadInternal(State::kQuiesced); } + Status LoaderHarness::StartQuiescing() { mutex_lock l(mu_); TF_RETURN_IF_ERROR( diff --git a/tensorflow_serving/core/loader_harness.h b/tensorflow_serving/core/loader_harness.h index eb5f8ab79b8..7fbb2fac4ee 100644 --- a/tensorflow_serving/core/loader_harness.h +++ b/tensorflow_serving/core/loader_harness.h @@ -229,6 +229,9 @@ class LoaderHarness final { // same error. Status TransitionState(State from, State to) TF_EXCLUSIVE_LOCKS_REQUIRED(mu_); + Status UnloadInternal(State from_state) TF_LOCKS_EXCLUDED(mu_); + Status UnloadDueToCancelledLoad() TF_LOCKS_EXCLUDED(mu_); + const ServableId id_; const std::unique_ptr loader_; // Additional state that the manager uses. diff --git a/tensorflow_serving/core/loader_harness_test.cc b/tensorflow_serving/core/loader_harness_test.cc index 2740ecb8366..02f0a2c3fa1 100644 --- a/tensorflow_serving/core/loader_harness_test.cc +++ b/tensorflow_serving/core/loader_harness_test.cc @@ -325,6 +325,29 @@ TEST(LoaderHarnessTest, RetryOnLoadErrorCancelledLoad) { })); } +// Tests unload when ongoing load is cancelled. +TEST(LoaderHarnessTest, UnloadDueToCancelledLoad) { + test_util::MockLoader* loader = new NiceMock; + + const ServableId servable_id = {"test", 0}; + LoaderHarness harness(servable_id, std::unique_ptr(loader)); + + EXPECT_CALL(*loader, LoadWithMetadata(Loader::Metadata{servable_id})) + .WillOnce(InvokeWithoutArgs([]() { + Env::Default()->SleepForMicroseconds(1000000); + return Status::OK(); + })); + + std::unique_ptr test_thread( + Env::Default()->StartThread(ThreadOptions(), "test", [&harness]() { + TF_ASSERT_OK(harness.LoadRequested()); + TF_ASSERT_OK(harness.LoadApproved()); + harness.set_cancel_load_retry(true); + const Status status = harness.Load(); + EXPECT_THAT(status.error_message(), HasSubstr("cancelled")); + })); +} + } // namespace } // namespace serving } // namespace tensorflow From 530f7d0e5a5ed50b083538c82b4cf0ecd15e80bc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 4 Jan 2022 12:02:04 -0800 Subject: [PATCH 5777/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/63f94bb9-3af1-4b03-af6e-432f36a36165 PiperOrigin-RevId: 419649305 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0a4404d2536..78b0e0ce52f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a8a951d8abf171362f5730bd93fcac20aed6605607935c8594cd016f205b58fd", - git_commit = "0f792fc664dd3952fbb76e4e8f8dda21bbf7971a", + sha256 = "b20cbd03390f7f91faf26fd2000996277845139d3e4f2d00d89e4f6b8ce3a81f", + git_commit = "918434f571c61015a5e71998680729aa0bd7ffcc", ) # Import all of TensorFlow Serving's external dependencies. From 1683062089d8b3cf4dc84adce43dc8ab3ea5e709 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 4 Jan 2022 18:01:49 -0800 Subject: [PATCH 5778/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d8d66bf7-8734-499d-b813-12b0b84f8fae PiperOrigin-RevId: 419718284 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 78b0e0ce52f..cc822ac2858 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b20cbd03390f7f91faf26fd2000996277845139d3e4f2d00d89e4f6b8ce3a81f", - git_commit = "918434f571c61015a5e71998680729aa0bd7ffcc", + sha256 = "db63933cb300f035f14b5e9caa26454bc0b4aa754c9bf5802ed3ef43d39828ef", + git_commit = "c762c4501ca017994c1fa5554c3c8e47b7c80b66", ) # Import all of TensorFlow Serving's external dependencies. From 83959e364e7ff1234bf47a5d8139677d1bdb18c1 Mon Sep 17 00:00:00 2001 From: Chao Xie Date: Wed, 5 Jan 2022 13:37:26 -0800 Subject: [PATCH 5779/8103] Add a lock to avoid race condition on memoized_resource_estimate_. As the potential contention is very low, adding a lock here won't impact any performance. PiperOrigin-RevId: 419902187 --- tensorflow_serving/core/simple_loader.h | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/core/simple_loader.h b/tensorflow_serving/core/simple_loader.h index 69a0ffcd5f5..4918ca86ae0 100644 --- a/tensorflow_serving/core/simple_loader.h +++ b/tensorflow_serving/core/simple_loader.h @@ -25,6 +25,7 @@ limitations under the License. #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/platform/macros.h" #include "tensorflow/core/platform/mem.h" +#include "tensorflow/core/platform/mutex.h" #include "tensorflow/core/platform/types.h" #include "tensorflow_serving/core/loader.h" #include "tensorflow_serving/core/source_adapter.h" @@ -145,7 +146,9 @@ class SimpleLoader : public Loader { absl::optional post_load_resource_estimator_; // The memoized estimated resource requirement of the servable. - mutable absl::optional memoized_resource_estimate_; + mutable absl::optional memoized_resource_estimate_ + TF_GUARDED_BY(memoized_resource_estimate_mu_); + mutable mutex memoized_resource_estimate_mu_; std::unique_ptr resource_util_; Resource ram_resource_; @@ -275,6 +278,7 @@ SimpleLoader::SimpleLoader( template Status SimpleLoader::EstimateResources( ResourceAllocation* estimate) const { + mutex_lock l(memoized_resource_estimate_mu_); if (memoized_resource_estimate_) { *estimate = *memoized_resource_estimate_; return Status::OK(); @@ -320,7 +324,10 @@ Status SimpleLoader::EstimateResourcesPostLoad() { ResourceAllocation post_load_resource_estimate; TF_RETURN_IF_ERROR( (*post_load_resource_estimator_)(&post_load_resource_estimate)); - memoized_resource_estimate_ = post_load_resource_estimate; + { + mutex_lock l(memoized_resource_estimate_mu_); + memoized_resource_estimate_ = post_load_resource_estimate; + } // Release any transient memory used only during load to the OS. const uint64_t during_load_ram_estimate = resource_util_->GetQuantity( From 0b121be3c33e6e284aca3a8f6d67f9e62be642f3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Jan 2022 06:01:36 -0800 Subject: [PATCH 5780/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/457bf8f4-c7a3-4bec-a45e-85f75ca16058 PiperOrigin-RevId: 420043635 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cc822ac2858..f7f93beed32 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "db63933cb300f035f14b5e9caa26454bc0b4aa754c9bf5802ed3ef43d39828ef", - git_commit = "c762c4501ca017994c1fa5554c3c8e47b7c80b66", + sha256 = "7d547d55a645cec2f34762f56a63c1b0a1e484fc9682ddcb6232bf5a5ac0f41f", + git_commit = "7661179c51feff586c978394175bb8a4297edf13", ) # Import all of TensorFlow Serving's external dependencies. From d3f9b27c63950ff9bbbe3796f3320a68cf0727d9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Jan 2022 12:01:32 -0800 Subject: [PATCH 5781/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/33378c5c-ff28-4efb-b5ba-cd98b1089f9d PiperOrigin-RevId: 420113142 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f7f93beed32..f51dd022724 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7d547d55a645cec2f34762f56a63c1b0a1e484fc9682ddcb6232bf5a5ac0f41f", - git_commit = "7661179c51feff586c978394175bb8a4297edf13", + sha256 = "ac6f88051fee4706cc46ae712da95ecb0df84e56b13aaedd1271af1444b32fd0", + git_commit = "7b139a9992a86842d417c01b7eb266046b51d0a7", ) # Import all of TensorFlow Serving's external dependencies. From 6e76f6a9460bf2d37630f025fcfd3e06c4230fee Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Thu, 6 Jan 2022 16:55:49 -0800 Subject: [PATCH 5782/8103] Update Resnet model used in K8S tutorial PiperOrigin-RevId: 420172569 --- tensorflow_serving/g3doc/serving_kubernetes.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/tensorflow_serving/g3doc/serving_kubernetes.md b/tensorflow_serving/g3doc/serving_kubernetes.md index 3b22f70d099..7f909befd78 100644 --- a/tensorflow_serving/g3doc/serving_kubernetes.md +++ b/tensorflow_serving/g3doc/serving_kubernetes.md @@ -34,9 +34,12 @@ networks. For our example, we will download a TensorFlow SavedModel of ResNet for the ImageNet dataset. ```shell -mkdir /tmp/resnet -curl -s http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v2_fp32_savedmodel_NHWC_jpg.tar.gz | \ -tar --strip-components=2 -C /tmp/resnet -xvz +# Download Resnet model from TF Hub +wget https://tfhub.dev/tensorflow/resnet_50/classification/1?tf-hub-format=compressed -o resnet.tar.gz + +# Extract SavedModel into a versioned subfolder ‘123’ +mkdir -p /tmp/resnet/123 +tar xvfz resnet.tar.gz -C /tmp/resnet/123/ ``` We can verify we have the SavedModel: @@ -154,7 +157,7 @@ outputs { model_spec { name: "resnet" version { - value: 1538687457 + value: 123 } signature_name: "serving_default" } From 3cc8951424fcc61525b2ae574aec74784a6ddc58 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 6 Jan 2022 18:01:57 -0800 Subject: [PATCH 5783/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8c19f969-2425-4b1e-8418-a8fd3cfd91a2 PiperOrigin-RevId: 420182740 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f51dd022724..77ccc3ae07c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ac6f88051fee4706cc46ae712da95ecb0df84e56b13aaedd1271af1444b32fd0", - git_commit = "7b139a9992a86842d417c01b7eb266046b51d0a7", + sha256 = "149d702286dd72d917705e64261b4eca89d60a382df833bc137c27fdf7b2fb55", + git_commit = "739002567ff81d731179a4b949def7e0f14737c8", ) # Import all of TensorFlow Serving's external dependencies. From c4254506d8cec62c649369e51ac68839a1cb9db0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Jan 2022 00:01:26 -0800 Subject: [PATCH 5784/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f7ceded7-98ba-4049-be34-d875c8949f75 PiperOrigin-RevId: 420225676 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 77ccc3ae07c..385f8f67e73 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "149d702286dd72d917705e64261b4eca89d60a382df833bc137c27fdf7b2fb55", - git_commit = "739002567ff81d731179a4b949def7e0f14737c8", + sha256 = "251f5531d79ab86ef7fdbca4b2cbfdc5cd199fd33e75ac91d727ac5bb719f3f3", + git_commit = "4b4b8f06eb6d4c4e2e44a34c73063541403e6ec6", ) # Import all of TensorFlow Serving's external dependencies. From dee5bbd7a2a5f345f2f3d64a3f8eb14c6df3c3f3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Jan 2022 06:01:54 -0800 Subject: [PATCH 5785/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6876c0d4-848b-4023-9660-da2dbb83b3b3 PiperOrigin-RevId: 420276028 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 385f8f67e73..30ec57b661e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "251f5531d79ab86ef7fdbca4b2cbfdc5cd199fd33e75ac91d727ac5bb719f3f3", - git_commit = "4b4b8f06eb6d4c4e2e44a34c73063541403e6ec6", + sha256 = "2ae76646ab706d2c0ffd6e95bdc5a1b50fcd36befac47eef42c49c8604d2eeee", + git_commit = "46e2dad3e24aa775447083e60c303657ddf01f71", ) # Import all of TensorFlow Serving's external dependencies. From c44257b7e0fb294a19422791906b876d3e704fb1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Jan 2022 12:01:32 -0800 Subject: [PATCH 5786/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/453857bb-a5ad-4b35-afc5-bf30220a4973 PiperOrigin-RevId: 420341388 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 30ec57b661e..1dfd5ff63a5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2ae76646ab706d2c0ffd6e95bdc5a1b50fcd36befac47eef42c49c8604d2eeee", - git_commit = "46e2dad3e24aa775447083e60c303657ddf01f71", + sha256 = "2f10efb322b14a5f0582b9661157b64c06a1d9130f3be91d73b91344feda3b16", + git_commit = "719da15e6b0a9778c92905723d3d59465a6da82b", ) # Import all of TensorFlow Serving's external dependencies. From 5a8b577df40342ed56ea97061f599fa800cb6c97 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 7 Jan 2022 18:01:29 -0800 Subject: [PATCH 5787/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/70977416-4de5-4980-821c-e433f6408fab PiperOrigin-RevId: 420405344 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1dfd5ff63a5..e5ac3be493f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2f10efb322b14a5f0582b9661157b64c06a1d9130f3be91d73b91344feda3b16", - git_commit = "719da15e6b0a9778c92905723d3d59465a6da82b", + sha256 = "1f1820259851529a57c7ce0cf0fbaa6d09b1894cc36e161da5ef2fdfa018eef9", + git_commit = "4d4b429e04fd62d8d33af3992ecf228fe1c049f0", ) # Import all of TensorFlow Serving's external dependencies. From 5982f7f97b63d0140a1b7abcdd32989df3f97026 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 8 Jan 2022 00:01:29 -0800 Subject: [PATCH 5788/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fa8f3439-9908-4144-b071-e1a491df453a PiperOrigin-RevId: 420439795 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e5ac3be493f..cbe83fd4d91 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1f1820259851529a57c7ce0cf0fbaa6d09b1894cc36e161da5ef2fdfa018eef9", - git_commit = "4d4b429e04fd62d8d33af3992ecf228fe1c049f0", + sha256 = "eb7ee3429cc12604eca51f0fe80ec5a575c12afa1e89ce91e89eddd73ee2c320", + git_commit = "2f42aecbfec039bba426a70ff50e661ea7a21159", ) # Import all of TensorFlow Serving's external dependencies. From 9971714aaf21e291fc81273a379e658588e07f22 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 8 Jan 2022 06:01:30 -0800 Subject: [PATCH 5789/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/306b2d8f-79c5-4c29-a2cb-046844ac14db PiperOrigin-RevId: 420473624 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cbe83fd4d91..d62ce0025cb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "eb7ee3429cc12604eca51f0fe80ec5a575c12afa1e89ce91e89eddd73ee2c320", - git_commit = "2f42aecbfec039bba426a70ff50e661ea7a21159", + sha256 = "fbf35a8ac34db7c6536c43192d0060f4b322c188e3f6aad4eeb682b4ee8ae36a", + git_commit = "6a32488826f46edbb04d468f337974a2f6e7cccf", ) # Import all of TensorFlow Serving's external dependencies. From 72682f5b8f6eb2ddfb500c7e5f489ef455f7af13 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 8 Jan 2022 18:01:39 -0800 Subject: [PATCH 5790/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ba124f81-37b1-4aef-b148-2061d4b10b79 PiperOrigin-RevId: 420528971 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d62ce0025cb..36c7b048791 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fbf35a8ac34db7c6536c43192d0060f4b322c188e3f6aad4eeb682b4ee8ae36a", - git_commit = "6a32488826f46edbb04d468f337974a2f6e7cccf", + sha256 = "040d6524850ab5f3fe9f7860a8745e691d3e133e8f91ca87a718843e45a216aa", + git_commit = "729f8ca570e3da3aba407f93cf219cf06a06a9de", ) # Import all of TensorFlow Serving's external dependencies. From 7e915ac80b548fadfe2d0f9cd1cf92fd81751596 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 9 Jan 2022 00:01:25 -0800 Subject: [PATCH 5791/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6d2f3a8e-9f81-4aa0-9c8d-eb7ebb5f6359 PiperOrigin-RevId: 420557007 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 36c7b048791..2cc0c175976 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "040d6524850ab5f3fe9f7860a8745e691d3e133e8f91ca87a718843e45a216aa", - git_commit = "729f8ca570e3da3aba407f93cf219cf06a06a9de", + sha256 = "a2d801ededb48ace901f52685e2cb70b4f1e177fee6e79684ebe019f0c3eb903", + git_commit = "f7ba487504b7652ecb5fbadd4e2fcea8ae13c86e", ) # Import all of TensorFlow Serving's external dependencies. From b21ec6b7b57a10180bf6a126fbe093658149c967 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 9 Jan 2022 06:01:39 -0800 Subject: [PATCH 5792/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e24bb409-40d8-4719-adaf-aca23c30441d PiperOrigin-RevId: 420589579 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2cc0c175976..d09711bb1df 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a2d801ededb48ace901f52685e2cb70b4f1e177fee6e79684ebe019f0c3eb903", - git_commit = "f7ba487504b7652ecb5fbadd4e2fcea8ae13c86e", + sha256 = "2dec91cc750329c2da2e24240051ccfd0d5d93f7ccf93085a312640bf4735512", + git_commit = "182327b27a5d7a59cc861d0b32e4ad240c199ba4", ) # Import all of TensorFlow Serving's external dependencies. From b0a1bb8d58e82f68b28c34dcf3e872bf545522af Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 9 Jan 2022 12:01:21 -0800 Subject: [PATCH 5793/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c4b265ff-498c-4bba-a5dd-78c5f789289a PiperOrigin-RevId: 420618619 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d09711bb1df..1b06827a875 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2dec91cc750329c2da2e24240051ccfd0d5d93f7ccf93085a312640bf4735512", - git_commit = "182327b27a5d7a59cc861d0b32e4ad240c199ba4", + sha256 = "5bfc2eebdc920321f39b0c9f1dd9e305c7722d156e82981a5fe5fce70952f64c", + git_commit = "817b89ef7561101eaf2bcb8dc5665e72b026dda5", ) # Import all of TensorFlow Serving's external dependencies. From 52783fe920098414d363e74fe14ccd368bc21a60 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 9 Jan 2022 18:01:19 -0800 Subject: [PATCH 5794/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ec0ace11-5372-47ff-80dd-3260ac6e8a5a PiperOrigin-RevId: 420648719 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1b06827a875..910cd424202 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5bfc2eebdc920321f39b0c9f1dd9e305c7722d156e82981a5fe5fce70952f64c", - git_commit = "817b89ef7561101eaf2bcb8dc5665e72b026dda5", + sha256 = "db536d9c98fec71f1cf0d4e99d20a43cf4dbcaa4d2cb22b10af3f1c2ba57b422", + git_commit = "4938881323a9621b7bfa59560ecca19a19e9ebb6", ) # Import all of TensorFlow Serving's external dependencies. From a1bae5fea865b07124a0507be9de9c9ab2a64708 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Jan 2022 06:02:19 -0800 Subject: [PATCH 5795/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a83d1c70-faef-408f-824b-504f699fa2fc PiperOrigin-RevId: 420740312 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 910cd424202..f0a4c1c71ee 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "db536d9c98fec71f1cf0d4e99d20a43cf4dbcaa4d2cb22b10af3f1c2ba57b422", - git_commit = "4938881323a9621b7bfa59560ecca19a19e9ebb6", + sha256 = "201cfdbd27e49f1f4dbcac293ee05ff2812f989bccbe6533d5bd1ff6cc03aa04", + git_commit = "3397ae9fad054b290f2af22119fa836ec81b01b0", ) # Import all of TensorFlow Serving's external dependencies. From 3fac955b472fba1f832694c4cf1983d31d8a3c2a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Jan 2022 12:02:07 -0800 Subject: [PATCH 5796/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e27a9d6d-36a8-4ddf-8f94-e3c9cf472d5a PiperOrigin-RevId: 420821102 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f0a4c1c71ee..7c2cf934527 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "201cfdbd27e49f1f4dbcac293ee05ff2812f989bccbe6533d5bd1ff6cc03aa04", - git_commit = "3397ae9fad054b290f2af22119fa836ec81b01b0", + sha256 = "06f3c0b09aa708322ce679592bbfbe05d0002fb9f319859467bf1b940c992e1b", + git_commit = "83830cdee612836872806a5d6390483bc13b0c2f", ) # Import all of TensorFlow Serving's external dependencies. From 4f84aaf3610e2a8ddf21caf8f9e973453117b2e5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Jan 2022 18:03:13 -0800 Subject: [PATCH 5797/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d31abebc-7ba7-4fee-a58f-6e7be8be7303 PiperOrigin-RevId: 420902652 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7c2cf934527..5b2f29d1e2e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "06f3c0b09aa708322ce679592bbfbe05d0002fb9f319859467bf1b940c992e1b", - git_commit = "83830cdee612836872806a5d6390483bc13b0c2f", + sha256 = "d746704d0d8746bee4a4eed6ce78e09fb6f1692bc5468c0ff3f526e0400eb000", + git_commit = "c40a23ddb6e8a4ae5b18f466adde3b367456a606", ) # Import all of TensorFlow Serving's external dependencies. From 909c292d7853039d882fba43b7ce048cee2ea175 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Jan 2022 00:01:46 -0800 Subject: [PATCH 5798/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/00b343f4-b03e-4796-b008-2e8107bd159c PiperOrigin-RevId: 420953111 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5b2f29d1e2e..eb767fd445f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d746704d0d8746bee4a4eed6ce78e09fb6f1692bc5468c0ff3f526e0400eb000", - git_commit = "c40a23ddb6e8a4ae5b18f466adde3b367456a606", + sha256 = "7c3f0c1163129d9bbe1ace5f64c4ebba3fd3f880749706fb6510a0257c69d33b", + git_commit = "18bffc99ab1afd12945b1325ca312d4658b32234", ) # Import all of TensorFlow Serving's external dependencies. From 133cc92d301f2ec32cd50539174e32fe8f2783f1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Jan 2022 06:02:02 -0800 Subject: [PATCH 5799/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6f197570-993a-4d5e-923b-6c6eb5c4d84f PiperOrigin-RevId: 421012106 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index eb767fd445f..1680efdf5b5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7c3f0c1163129d9bbe1ace5f64c4ebba3fd3f880749706fb6510a0257c69d33b", - git_commit = "18bffc99ab1afd12945b1325ca312d4658b32234", + sha256 = "df48da78ea1aebee7db021b5fad7d349d10c3f2fad81d3178e2724c47e6d941e", + git_commit = "e451ab890b9e5f5bdcfbbbbb9af2e87e9816cc58", ) # Import all of TensorFlow Serving's external dependencies. From 544b67abf9ce7f37685b1cb715909580c3d3ae01 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Jan 2022 12:01:57 -0800 Subject: [PATCH 5800/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5e988f12-d525-435f-abb4-16c7b725b1ba PiperOrigin-RevId: 421090707 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1680efdf5b5..712a72a19ff 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "df48da78ea1aebee7db021b5fad7d349d10c3f2fad81d3178e2724c47e6d941e", - git_commit = "e451ab890b9e5f5bdcfbbbbb9af2e87e9816cc58", + sha256 = "a7d4cb6f46dfe688c96925f87b569cfd62dcec3e1cb83e8d824275898222a262", + git_commit = "99514f053019fe06ba26cb0d3faea06eacc1a57f", ) # Import all of TensorFlow Serving's external dependencies. From 9b15a9409e59de5c8664d4072038f8385dd5d5e6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 11 Jan 2022 18:03:20 -0800 Subject: [PATCH 5801/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d494a8c7-299b-4586-ab90-754aa0120bdb PiperOrigin-RevId: 421170394 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 712a72a19ff..188862a49f0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a7d4cb6f46dfe688c96925f87b569cfd62dcec3e1cb83e8d824275898222a262", - git_commit = "99514f053019fe06ba26cb0d3faea06eacc1a57f", + sha256 = "bb02a9f7a79d3c2681cd96eb01750d4f579552ffe0e2d84f1502692d396812dc", + git_commit = "91b8621ab8509ea11d0d782a5b1eacc772e17006", ) # Import all of TensorFlow Serving's external dependencies. From 78e94e99650deae956fe20dffa9932a72ec7d765 Mon Sep 17 00:00:00 2001 From: Jeremiah Mao Date: Wed, 8 Sep 2021 00:46:08 -0700 Subject: [PATCH 5802/8103] Prepare for development of new http client API. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Copy the old client to the new “test_client†package and update affected unit-tests. There is no functional change to the existing API or interfaces. --- .../client/test_client/internal/BUILD | 27 ++ .../client/test_client/internal/README.md | 5 + .../test_client/internal/evhttp_connection.cc | 256 ++++++++++++++++++ .../test_client/internal/evhttp_connection.h | 103 +++++++ .../net_http/client/test_client/public/BUILD | 38 +++ .../client/test_client/public/README.md | 5 + .../client/test_client/public/httpclient.h | 48 ++++ .../test_client/public/httpclient_interface.h | 85 ++++++ .../net_http/client/test_client/testing/BUILD | 15 + .../test_client/testing/evhttp_echo_client.cc | 63 +++++ .../util/net_http/server/internal/BUILD | 4 +- .../server/internal/evhttp_request_test.cc | 72 ++--- .../server/internal/evhttp_server_test.cc | 44 +-- 13 files changed, 705 insertions(+), 60 deletions(-) create mode 100644 tensorflow_serving/util/net_http/client/test_client/internal/BUILD create mode 100644 tensorflow_serving/util/net_http/client/test_client/internal/README.md create mode 100644 tensorflow_serving/util/net_http/client/test_client/internal/evhttp_connection.cc create mode 100644 tensorflow_serving/util/net_http/client/test_client/internal/evhttp_connection.h create mode 100644 tensorflow_serving/util/net_http/client/test_client/public/BUILD create mode 100644 tensorflow_serving/util/net_http/client/test_client/public/README.md create mode 100644 tensorflow_serving/util/net_http/client/test_client/public/httpclient.h create mode 100644 tensorflow_serving/util/net_http/client/test_client/public/httpclient_interface.h create mode 100644 tensorflow_serving/util/net_http/client/test_client/testing/BUILD create mode 100644 tensorflow_serving/util/net_http/client/test_client/testing/evhttp_echo_client.cc diff --git a/tensorflow_serving/util/net_http/client/test_client/internal/BUILD b/tensorflow_serving/util/net_http/client/test_client/internal/BUILD new file mode 100644 index 00000000000..03a05479dfe --- /dev/null +++ b/tensorflow_serving/util/net_http/client/test_client/internal/BUILD @@ -0,0 +1,27 @@ +# Description: a lightweight http client + +package( + default_visibility = [ + "//tensorflow_serving/util/net_http:__subpackages__", + ], +) + +licenses(["notice"]) + +cc_library( + name = "evhttp_client", + srcs = [ + "evhttp_connection.cc", + ], + hdrs = [ + "evhttp_connection.h", + ], + deps = [ + "//tensorflow_serving/util/net_http/client/test_client/public:http_client_api", + "//tensorflow_serving/util/net_http/internal:net_logging", + "//tensorflow_serving/util/net_http/server/public:http_server_api", + "@com_github_libevent_libevent//:libevent", + "@com_google_absl//absl/strings", + "@com_google_absl//absl/synchronization", + ], +) diff --git a/tensorflow_serving/util/net_http/client/test_client/internal/README.md b/tensorflow_serving/util/net_http/client/test_client/internal/README.md new file mode 100644 index 00000000000..350cd1da9d5 --- /dev/null +++ b/tensorflow_serving/util/net_http/client/test_client/internal/README.md @@ -0,0 +1,5 @@ +The client library is still under development, and has yet to be finalized. + +It should be primarily used for writing tests for users of the +ServerRequestInterface and HTTPServerInterface APIs to verify basic +functionality, and the current state should be considered experimental. diff --git a/tensorflow_serving/util/net_http/client/test_client/internal/evhttp_connection.cc b/tensorflow_serving/util/net_http/client/test_client/internal/evhttp_connection.cc new file mode 100644 index 00000000000..b990bd53d95 --- /dev/null +++ b/tensorflow_serving/util/net_http/client/test_client/internal/evhttp_connection.cc @@ -0,0 +1,256 @@ +/* Copyright 2018 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// libevent based client implementation + +#include "tensorflow_serving/util/net_http/client/test_client/internal/evhttp_connection.h" + +#include "absl/strings/str_cat.h" +#include "tensorflow_serving/util/net_http/internal/net_logging.h" +#include "tensorflow_serving/util/net_http/server/public/response_code_enum.h" + +namespace tensorflow { +namespace serving { +namespace net_http { + +TestEvHTTPConnection::~TestEvHTTPConnection() { + if (evcon_ != nullptr) { + evhttp_connection_free(evcon_); + } + if (http_uri_ != nullptr) { + evhttp_uri_free(http_uri_); + } + + event_base_free(ev_base_); +} + +// This needs be called with any async SendRequest() +void TestEvHTTPConnection::Terminate() { + event_base_loopexit(ev_base_, nullptr); + if (loop_exit_ != nullptr) { + loop_exit_->WaitForNotification(); + } +} + +std::unique_ptr TestEvHTTPConnection::Connect( + absl::string_view url) { + std::string url_str(url.data(), url.size()); + struct evhttp_uri* http_uri = evhttp_uri_parse(url_str.c_str()); + if (http_uri == nullptr) { + NET_LOG(ERROR, "Failed to connect : event_base_new()"); + return nullptr; + } + + const char* host = evhttp_uri_get_host(http_uri); + if (host == nullptr) { + NET_LOG(ERROR, "url must have a host %.*s", static_cast(url.size()), + url.data()); + return nullptr; + } + + int port = evhttp_uri_get_port(http_uri); + if (port == -1) { + port = 80; + } + + auto result = Connect(host, port); + evhttp_uri_free(http_uri); + + return result; +} + +std::unique_ptr TestEvHTTPConnection::Connect( + absl::string_view host, int port) { + std::unique_ptr result(new TestEvHTTPConnection()); + + result->ev_base_ = event_base_new(); + if (result->ev_base_ == nullptr) { + NET_LOG(ERROR, "Failed to connect : event_base_new()"); + return nullptr; + } + + // blocking call (DNS resolution) + std::string host_str(host.data(), host.size()); + result->evcon_ = evhttp_connection_base_bufferevent_new( + result->ev_base_, nullptr, nullptr, host_str.c_str(), + static_cast(port)); + if (result->evcon_ == nullptr) { + NET_LOG(ERROR, + "Failed to connect : evhttp_connection_base_bufferevent_new()"); + return nullptr; + } + + evhttp_connection_set_retries(result->evcon_, 0); + + // TODO(wenboz): make this an option (default to 5s) + evhttp_connection_set_timeout(result->evcon_, 5); + + return result; +} + +namespace { + +// Copy ev response data to ClientResponse. +void PopulateResponse(evhttp_request* req, TestClientResponse* response) { + response->status = + static_cast(evhttp_request_get_response_code(req)); + + struct evkeyvalq* headers = evhttp_request_get_input_headers(req); + struct evkeyval* header; + for (header = headers->tqh_first; header; header = header->next.tqe_next) { + response->headers.emplace_back(header->key, header->value); + } + + char buffer[1024]; + int nread; + + while ((nread = evbuffer_remove(evhttp_request_get_input_buffer(req), buffer, + sizeof(buffer))) > 0) { + absl::StrAppend(&response->body, + absl::string_view(buffer, static_cast(nread))); + } +} + +evhttp_cmd_type GetMethodEnum(absl::string_view method, bool with_body) { + if (method.compare("GET") == 0) { + return EVHTTP_REQ_GET; + } else if (method.compare("POST") == 0) { + return EVHTTP_REQ_POST; + } else if (method.compare("HEAD") == 0) { + return EVHTTP_REQ_HEAD; + } else if (method.compare("PUT") == 0) { + return EVHTTP_REQ_PUT; + } else if (method.compare("DELETE") == 0) { + return EVHTTP_REQ_DELETE; + } else if (method.compare("OPTIONS") == 0) { + return EVHTTP_REQ_OPTIONS; + } else if (method.compare("TRACE") == 0) { + return EVHTTP_REQ_TRACE; + } else if (method.compare("CONNECT") == 0) { + return EVHTTP_REQ_CONNECT; + } else if (method.compare("PATCH") == 0) { + return EVHTTP_REQ_PATCH; + } else { + if (with_body) { + return EVHTTP_REQ_POST; + } else { + return EVHTTP_REQ_GET; + } + } +} + +void ResponseDone(evhttp_request* req, void* ctx) { + TestClientResponse* response = reinterpret_cast(ctx); + + if (req == nullptr) { + // TODO(wenboz): make this a util and check safety + int errcode = EVUTIL_SOCKET_ERROR(); + NET_LOG(ERROR, "socket error = %s (%d)", + evutil_socket_error_to_string(errcode), errcode); + return; + } + + PopulateResponse(req, response); + + if (response->done != nullptr) { + response->done(); + } +} + +// Returns false if there is any error. +bool GenerateEvRequest(evhttp_connection* evcon, const TestClientRequest& request, + TestClientResponse* response) { + evhttp_request* evreq = evhttp_request_new(ResponseDone, response); + if (evreq == nullptr) { + NET_LOG(ERROR, "Failed to send request : evhttp_request_new()"); + return false; + } + + evkeyvalq* output_headers = evhttp_request_get_output_headers(evreq); + for (auto header : request.headers) { + std::string key(header.first.data(), header.first.size()); + std::string value(header.second.data(), header.second.size()); + evhttp_add_header(output_headers, key.c_str(), value.c_str()); + } + + evhttp_add_header(output_headers, "Connection", "close"); + + if (!request.body.empty()) { + evbuffer* output_buffer = evhttp_request_get_output_buffer(evreq); + + std::string body(request.body.data(), request.body.size()); + evbuffer_add(output_buffer, body.c_str(), request.body.size()); + + char length_header[16]; + evutil_snprintf(length_header, sizeof(length_header) - 1, "%lu", + request.body.size()); + evhttp_add_header(output_headers, "Content-Length", length_header); + } + + std::string uri(request.uri_path.data(), request.uri_path.size()); + int r = evhttp_make_request( + evcon, evreq, GetMethodEnum(request.method, !request.body.empty()), + uri.c_str()); + if (r != 0) { + NET_LOG(ERROR, "evhttp_make_request() failed"); + return false; + } + + return true; +} + +} // namespace + +// Sends the request and has the connection closed +bool TestEvHTTPConnection::BlockingSendRequest(const TestClientRequest& request, + TestClientResponse* response) { + if (!GenerateEvRequest(evcon_, request, response)) { + NET_LOG(ERROR, "Failed to generate the ev_request"); + return false; + } + + // inline loop blocking + event_base_dispatch(ev_base_); + return true; +} + +bool TestEvHTTPConnection::SendRequest(const TestClientRequest& request, + TestClientResponse* response) { + if (this->executor_ == nullptr) { + NET_LOG(ERROR, "EventExecutor is not configured."); + return false; + } + + if (!GenerateEvRequest(evcon_, request, response)) { + NET_LOG(ERROR, "Failed to generate the ev_request"); + return false; + } + + executor_->Schedule([this]() { + loop_exit_.reset(new absl::Notification()); + event_base_dispatch(ev_base_); + loop_exit_->Notify(); + }); + + return true; +} + +void TestEvHTTPConnection::SetExecutor(std::unique_ptr executor) { + this->executor_ = std::move(executor); +} + +} // namespace net_http +} // namespace serving +} // namespace tensorflow diff --git a/tensorflow_serving/util/net_http/client/test_client/internal/evhttp_connection.h b/tensorflow_serving/util/net_http/client/test_client/internal/evhttp_connection.h new file mode 100644 index 00000000000..2750b67eb37 --- /dev/null +++ b/tensorflow_serving/util/net_http/client/test_client/internal/evhttp_connection.h @@ -0,0 +1,103 @@ +/* Copyright 2018 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_SERVING_UTIL_NET_HTTP_CLIENT_TEST_CLIENT_INTERNAL_EVHTTP_CONNECTION_H_ +#define TENSORFLOW_SERVING_UTIL_NET_HTTP_CLIENT_TEST_CLIENT_INTERNAL_EVHTTP_CONNECTION_H_ + +#include +#include +#include +#include +#include + +#include "absl/strings/string_view.h" +#include "absl/synchronization/notification.h" + +#include "libevent/include/event2/buffer.h" +#include "libevent/include/event2/bufferevent.h" +#include "libevent/include/event2/event.h" +#include "libevent/include/event2/http.h" +#include "libevent/include/event2/keyvalq_struct.h" +#include "libevent/include/event2/util.h" + +// TODO(wenboz): move EventExecutor to net_http/common +#include "tensorflow_serving/util/net_http/client/test_client/public/httpclient_interface.h" +#include "tensorflow_serving/util/net_http/server/public/httpserver_interface.h" + +namespace tensorflow { +namespace serving { +namespace net_http { + +// The following types may be moved to an API interface in future. + +class TestEvHTTPConnection final : public TestHTTPClientInterface { + public: + TestEvHTTPConnection() = default; + + ~TestEvHTTPConnection() override; + + TestEvHTTPConnection(const TestEvHTTPConnection& other) = delete; + TestEvHTTPConnection& operator=(const TestEvHTTPConnection& other) = delete; + + // Terminates the connection. + void Terminate() override; + + // Returns a new connection given an absolute URL. + // Always treat the URL scheme as "http" for now. + // Returns nullptr if any error + static std::unique_ptr Connect(absl::string_view url); + + // Returns a new connection to the specified host:port. + // Returns nullptr if any error + static std::unique_ptr Connect(absl::string_view host, + int port); + + // Returns a new connection to the specified port of localhost. + // Returns nullptr if any error + static std::unique_ptr ConnectLocal(int port) { + return Connect("localhost", port); + } + + // Sends a request and blocks the caller till a response is received + // or any error has happened. + // Returns false if any error. + bool BlockingSendRequest(const TestClientRequest& request, + TestClientResponse* response) override; + + // Sends a request and returns immediately. The response will be handled + // asynchronously via the response->done callback. + // Returns false if any error in sending the request, or if the executor + // has not been configured. + bool SendRequest(const TestClientRequest& request, + TestClientResponse* response) override; + + // Sets the executor for processing requests asynchronously. + void SetExecutor(std::unique_ptr executor) override; + + private: + struct event_base* ev_base_; + struct evhttp_uri* http_uri_; + struct evhttp_connection* evcon_; + + std::unique_ptr executor_; + + std::unique_ptr loop_exit_; +}; + +} // namespace net_http +} // namespace serving +} // namespace tensorflow + +#endif // TENSORFLOW_SERVING_UTIL_NET_HTTP_CLIENT_TEST_CLIENT_INTERNAL_EVHTTP_CONNECTION_H_ diff --git a/tensorflow_serving/util/net_http/client/test_client/public/BUILD b/tensorflow_serving/util/net_http/client/test_client/public/BUILD new file mode 100644 index 00000000000..ced6dd3e0ec --- /dev/null +++ b/tensorflow_serving/util/net_http/client/test_client/public/BUILD @@ -0,0 +1,38 @@ +# Description: APIs for experimental testing of net_http server instances + +package( + default_visibility = [ + ":http_client_users", + "//tensorflow_serving/util/net_http:__subpackages__", + ], +) + +package_group( + name = "http_client_users", + packages = [ + "//third_party/ecclesia/...", + ], +) + +licenses(["notice"]) + +cc_library( + name = "http_client_api", + srcs = [], + hdrs = [ + "httpclient_interface.h", + ], + deps = ["//tensorflow_serving/util/net_http/server/public:http_server_api"], +) + +cc_library( + name = "http_client", + hdrs = [ + "httpclient.h", + ], + deps = [ + ":http_client_api", + "//tensorflow_serving/util/net_http/client/test_client/internal:evhttp_client", + "@com_google_absl//absl/memory", + ], +) diff --git a/tensorflow_serving/util/net_http/client/test_client/public/README.md b/tensorflow_serving/util/net_http/client/test_client/public/README.md new file mode 100644 index 00000000000..350cd1da9d5 --- /dev/null +++ b/tensorflow_serving/util/net_http/client/test_client/public/README.md @@ -0,0 +1,5 @@ +The client library is still under development, and has yet to be finalized. + +It should be primarily used for writing tests for users of the +ServerRequestInterface and HTTPServerInterface APIs to verify basic +functionality, and the current state should be considered experimental. diff --git a/tensorflow_serving/util/net_http/client/test_client/public/httpclient.h b/tensorflow_serving/util/net_http/client/test_client/public/httpclient.h new file mode 100644 index 00000000000..ea72bcd5ce9 --- /dev/null +++ b/tensorflow_serving/util/net_http/client/test_client/public/httpclient.h @@ -0,0 +1,48 @@ +/* Copyright 2020 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef THIRD_PARTY_TENSORFLOW_SERVING_UTIL_NET_HTTP_CLIENT_TEST_CLIENT_PUBLIC_HTTPCLIENT_H_ +#define THIRD_PARTY_TENSORFLOW_SERVING_UTIL_NET_HTTP_CLIENT_TEST_CLIENT_PUBLIC_HTTPCLIENT_H_ + +#include "absl/memory/memory.h" +#include "tensorflow_serving/util/net_http/client/test_client/internal/evhttp_connection.h" +#include "tensorflow_serving/util/net_http/client/test_client/public/httpclient_interface.h" + +// Factory to manage internal dependency +// NOTE: This API is not yet finalized, and should in its current state be +// considered experimental + +namespace tensorflow { +namespace serving { +namespace net_http { + +// Creates a connection to a server implemented based on the libevents library. +// Returns nullptr if there is any error. +inline std::unique_ptr CreateEvHTTPConnection( + absl::string_view host, int port) { + auto connection = absl::make_unique(); + connection = connection->Connect(host, port); + if (!connection) { + return nullptr; + } + + return std::move(connection); +} + +} // namespace net_http +} // namespace serving +} // namespace tensorflow + +#endif // THIRD_PARTY_TENSORFLOW_SERVING_UTIL_NET_HTTP_CLIENT_TEST_CLIENT_PUBLIC_HTTPCLIENT_H_ \ No newline at end of file diff --git a/tensorflow_serving/util/net_http/client/test_client/public/httpclient_interface.h b/tensorflow_serving/util/net_http/client/test_client/public/httpclient_interface.h new file mode 100644 index 00000000000..2790695a16a --- /dev/null +++ b/tensorflow_serving/util/net_http/client/test_client/public/httpclient_interface.h @@ -0,0 +1,85 @@ +/* Copyright 2020 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef THIRD_PARTY_TENSORFLOW_SERVING_UTIL_NET_HTTP_CLIENT_TEST_CLIENT_PUBLIC_HTTPCLIENT_INTERFACE_H_ +#define THIRD_PARTY_TENSORFLOW_SERVING_UTIL_NET_HTTP_CLIENT_TEST_CLIENT_PUBLIC_HTTPCLIENT_INTERFACE_H_ + +#include "tensorflow_serving/util/net_http/server/public/httpserver_interface.h" +#include "tensorflow_serving/util/net_http/server/public/response_code_enum.h" + +// API for the HTTP Client +// NOTE: This API is not yet finalized, and should be considered experimental. + +namespace tensorflow { +namespace serving { +namespace net_http { + +// Data to be copied +struct TestClientRequest { + typedef std::pair HeaderKeyValue; + + absl::string_view uri_path; + absl::string_view method; // must be in upper-case + std::vector headers; + absl::string_view body; +}; + +// Caller allocates the data for output +struct TestClientResponse { + typedef std::pair HeaderKeyValue; + + HTTPStatusCode status = HTTPStatusCode::UNDEFINED; + std::vector headers; + std::string body; + + std::function done; // callback +}; + +// This interface class specifies the API contract for the HTTP client. +class TestHTTPClientInterface { + public: + TestHTTPClientInterface(const TestHTTPClientInterface& other) = delete; + TestHTTPClientInterface& operator=(const TestHTTPClientInterface& other) = delete; + + virtual ~TestHTTPClientInterface() = default; + + // Terminates the connection. + virtual void Terminate() = 0; + + // Sends a request and blocks the caller till a response is received + // or any error has happened. + // Returns false if any error. + virtual bool BlockingSendRequest(const TestClientRequest& request, + TestClientResponse* response) = 0; + + // Sends a request and returns immediately. The response will be handled + // asynchronously via the response->done callback. + // Returns false if any error in sending the request, or if the executor + // has not been configured. + virtual bool SendRequest(const TestClientRequest& request, + TestClientResponse* response) = 0; + + // Sets the executor for processing requests asynchronously. + virtual void SetExecutor(std::unique_ptr executor) = 0; + + protected: + TestHTTPClientInterface() = default; +}; + +} // namespace net_http +} // namespace serving +} // namespace tensorflow + +#endif // THIRD_PARTY_TENSORFLOW_SERVING_UTIL_NET_HTTP_CLIENT_TEST_CLIENT_PUBLIC_HTTPCLIENT_INTERFACE_H_ diff --git a/tensorflow_serving/util/net_http/client/test_client/testing/BUILD b/tensorflow_serving/util/net_http/client/test_client/testing/BUILD new file mode 100644 index 00000000000..ef1f9ca64b0 --- /dev/null +++ b/tensorflow_serving/util/net_http/client/test_client/testing/BUILD @@ -0,0 +1,15 @@ +# Description: net_http/client/test_client/testing + +package( + default_visibility = ["//visibility:private"], +) + +licenses(["notice"]) # Apache 2.0 + +cc_binary( + name = "evhttp_echo_client", + srcs = ["evhttp_echo_client.cc"], + deps = [ + "//tensorflow_serving/util/net_http/client/test_client/internal:evhttp_client", + ], +) diff --git a/tensorflow_serving/util/net_http/client/test_client/testing/evhttp_echo_client.cc b/tensorflow_serving/util/net_http/client/test_client/testing/evhttp_echo_client.cc new file mode 100644 index 00000000000..5e36fc50c10 --- /dev/null +++ b/tensorflow_serving/util/net_http/client/test_client/testing/evhttp_echo_client.cc @@ -0,0 +1,63 @@ +/* Copyright 2018 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// A test client to print the response from the evhttp_echo_server +// URI: /print + +#include + +#include "tensorflow_serving/util/net_http/client/test_client/internal/evhttp_connection.h" + +namespace { + +using tensorflow::serving::net_http::TestClientRequest; +using tensorflow::serving::net_http::TestClientResponse; +using tensorflow::serving::net_http::TestEvHTTPConnection; + +bool SendRequest(const char* url) { + auto connection = TestEvHTTPConnection::Connect(url); + if (connection == nullptr) { + std::cerr << "Fail to connect to %s" << url; + } + + TestClientRequest request = {url, "GET", {}, ""}; + TestClientResponse response = {}; + + if (!connection->BlockingSendRequest(request, &response)) { + std::cerr << "Request failed."; + return false; + } + + std::cout << "Response received: " << std::endl + << "Status: " << static_cast(response.status) << std::endl; + + for (const auto& keyval : response.headers) { + std::cout << keyval.first << " : " << keyval.second << std::endl; + } + + std::cout << std::endl << response.body << std::endl; + return true; +} + +} // namespace + +int main(int argc, char** argv) { + if (argc < 2) { + std::cerr << "Usage: http-client " << std::endl; + return 1; + } + + return SendRequest(argv[1]); +} diff --git a/tensorflow_serving/util/net_http/server/internal/BUILD b/tensorflow_serving/util/net_http/server/internal/BUILD index d67559ea318..f087499d255 100644 --- a/tensorflow_serving/util/net_http/server/internal/BUILD +++ b/tensorflow_serving/util/net_http/server/internal/BUILD @@ -42,7 +42,7 @@ cc_test( deps = [ ":evhttp_server", "//tensorflow_serving/core/test_util:test_main", - "//tensorflow_serving/util/net_http/client/internal:evhttp_client", + "//tensorflow_serving/util/net_http/client/test_client/internal:evhttp_client", "//tensorflow_serving/util/net_http/internal:fixed_thread_pool", "//tensorflow_serving/util/net_http/server/public:http_server", "//tensorflow_serving/util/net_http/server/public:http_server_api", @@ -59,7 +59,7 @@ cc_test( deps = [ ":evhttp_server", "//tensorflow_serving/core/test_util:test_main", - "//tensorflow_serving/util/net_http/client/internal:evhttp_client", + "//tensorflow_serving/util/net_http/client/test_client/internal:evhttp_client", "//tensorflow_serving/util/net_http/compression:gzip_zlib", "//tensorflow_serving/util/net_http/internal:fixed_thread_pool", "//tensorflow_serving/util/net_http/server/public:http_server", diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_request_test.cc b/tensorflow_serving/util/net_http/server/internal/evhttp_request_test.cc index 258f24fdc3d..b6216652e63 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_request_test.cc +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_request_test.cc @@ -19,7 +19,7 @@ limitations under the License. #include #include "absl/memory/memory.h" -#include "tensorflow_serving/util/net_http/client/internal/evhttp_connection.h" +#include "tensorflow_serving/util/net_http/client/test_client/internal/evhttp_connection.h" #include "tensorflow_serving/util/net_http/compression/gzip_zlib.h" #include "tensorflow_serving/util/net_http/internal/fixed_thread_pool.h" #include "tensorflow_serving/util/net_http/server/internal/evhttp_server.h" @@ -76,11 +76,11 @@ TEST_F(EvHTTPRequestTest, SimpleGETNotFound) { server->StartAcceptingRequests(); auto connection = - EvHTTPConnection::Connect("localhost", server->listen_port()); + TestEvHTTPConnection::Connect("localhost", server->listen_port()); ASSERT_TRUE(connection != nullptr); - ClientRequest request = {"/noop", "GET", {}, ""}; - ClientResponse response = {}; + TestClientRequest request = {"/noop", "GET", {}, ""}; + TestClientResponse response = {}; EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); EXPECT_EQ(response.status, HTTPStatusCode::NOT_FOUND); @@ -101,11 +101,11 @@ TEST_F(EvHTTPRequestTest, SimpleGETOK) { server->StartAcceptingRequests(); auto connection = - EvHTTPConnection::Connect("localhost", server->listen_port()); + TestEvHTTPConnection::Connect("localhost", server->listen_port()); ASSERT_TRUE(connection != nullptr); - ClientRequest request = {"/ok", "GET", {}, ""}; - ClientResponse response = {}; + TestClientRequest request = {"/ok", "GET", {}, ""}; + TestClientResponse response = {}; EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); EXPECT_EQ(response.status, HTTPStatusCode::OK); @@ -131,11 +131,11 @@ TEST_F(EvHTTPRequestTest, SimplePOST) { server->StartAcceptingRequests(); auto connection = - EvHTTPConnection::Connect("localhost", server->listen_port()); + TestEvHTTPConnection::Connect("localhost", server->listen_port()); ASSERT_TRUE(connection != nullptr); - ClientRequest request = {"/ok", "POST", {}, "abcde"}; - ClientResponse response = {}; + TestClientRequest request = {"/ok", "POST", {}, "abcde"}; + TestClientResponse response = {}; EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); EXPECT_EQ(response.status, HTTPStatusCode::OK); @@ -171,12 +171,12 @@ TEST_F(EvHTTPRequestTest, RequestUri) { server->StartAcceptingRequests(); auto connection = - EvHTTPConnection::Connect("localhost", server->listen_port()); + TestEvHTTPConnection::Connect("localhost", server->listen_port()); ASSERT_TRUE(connection != nullptr); for (const char* path : kUriPath) { - ClientRequest request = {path, "GET", {}, ""}; - ClientResponse response = {}; + TestClientRequest request = {path, "GET", {}, ""}; + TestClientResponse response = {}; EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); } @@ -200,15 +200,15 @@ TEST_F(EvHTTPRequestTest, RequestHeaders) { server->StartAcceptingRequests(); auto connection = - EvHTTPConnection::Connect("localhost", server->listen_port()); + TestEvHTTPConnection::Connect("localhost", server->listen_port()); ASSERT_TRUE(connection != nullptr); - ClientRequest request = {"/ok", + TestClientRequest request = {"/ok", "GET", - {ClientRequest::HeaderKeyValue("H1", "v1"), - ClientRequest::HeaderKeyValue("H2", "v2")}, + {TestClientRequest::HeaderKeyValue("H1", "v1"), + TestClientRequest::HeaderKeyValue("H2", "v2")}, ""}; - ClientResponse response = {}; + TestClientResponse response = {}; EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); EXPECT_EQ(response.status, HTTPStatusCode::OK); @@ -232,11 +232,11 @@ TEST_F(EvHTTPRequestTest, ResponseHeaders) { server->StartAcceptingRequests(); auto connection = - EvHTTPConnection::Connect("localhost", server->listen_port()); + TestEvHTTPConnection::Connect("localhost", server->listen_port()); ASSERT_TRUE(connection != nullptr); - ClientRequest request = {"/ok", "GET", {}, ""}; - ClientResponse response = {}; + TestClientRequest request = {"/ok", "GET", {}, ""}; + TestClientResponse response = {}; EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); for (auto keyvalue : response.headers) { @@ -272,12 +272,12 @@ TEST_F(EvHTTPRequestTest, InvalidGzipPost) { server->StartAcceptingRequests(); auto connection = - EvHTTPConnection::Connect("localhost", server->listen_port()); + TestEvHTTPConnection::Connect("localhost", server->listen_port()); ASSERT_TRUE(connection != nullptr); - ClientRequest request = {"/ok", "POST", {}, "abcde"}; + TestClientRequest request = {"/ok", "POST", {}, "abcde"}; request.headers.emplace_back("Content-Encoding", "my_gzip"); - ClientResponse response = {}; + TestClientResponse response = {}; EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); EXPECT_EQ(response.status, HTTPStatusCode::OK); @@ -301,12 +301,12 @@ TEST_F(EvHTTPRequestTest, DisableGzipPost) { server->StartAcceptingRequests(); auto connection = - EvHTTPConnection::Connect("localhost", server->listen_port()); + TestEvHTTPConnection::Connect("localhost", server->listen_port()); ASSERT_TRUE(connection != nullptr); - ClientRequest request = {"/ok", "POST", {}, "abcde"}; + TestClientRequest request = {"/ok", "POST", {}, "abcde"}; request.headers.emplace_back("Content-Encoding", "my_gzip"); - ClientResponse response = {}; + TestClientResponse response = {}; EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); EXPECT_EQ(response.status, HTTPStatusCode::OK); @@ -352,12 +352,12 @@ TEST_F(EvHTTPRequestTest, ValidGzipPost) { server->StartAcceptingRequests(); auto connection = - EvHTTPConnection::Connect("localhost", server->listen_port()); + TestEvHTTPConnection::Connect("localhost", server->listen_port()); ASSERT_TRUE(connection != nullptr); - ClientRequest request = {"/ok", "POST", {}, compressed}; + TestClientRequest request = {"/ok", "POST", {}, compressed}; request.headers.emplace_back("Content-Encoding", "my_gzip"); - ClientResponse response = {}; + TestClientResponse response = {}; EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); EXPECT_EQ(response.status, HTTPStatusCode::OK); @@ -389,12 +389,12 @@ TEST_F(EvHTTPRequestTest, GzipExceedingLimit) { server->StartAcceptingRequests(); auto connection = - EvHTTPConnection::Connect("localhost", server->listen_port()); + TestEvHTTPConnection::Connect("localhost", server->listen_port()); ASSERT_TRUE(connection != nullptr); - ClientRequest request = {"/ok", "POST", {}, compressed}; + TestClientRequest request = {"/ok", "POST", {}, compressed}; request.headers.emplace_back("Content-Encoding", "my_gzip"); - ClientResponse response = {}; + TestClientResponse response = {}; EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); EXPECT_EQ(response.status, HTTPStatusCode::OK); @@ -439,12 +439,12 @@ TEST_F(EvHTTPRequestTest, LargeGzipPost) { server->StartAcceptingRequests(); auto connection = - EvHTTPConnection::Connect("localhost", server->listen_port()); + TestEvHTTPConnection::Connect("localhost", server->listen_port()); ASSERT_TRUE(connection != nullptr); - ClientRequest request = {"/ok", "POST", {}, compressed}; + TestClientRequest request = {"/ok", "POST", {}, compressed}; request.headers.emplace_back("Content-Encoding", "my_gzip"); - ClientResponse response = {}; + TestClientResponse response = {}; EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); EXPECT_EQ(response.status, HTTPStatusCode::OK); diff --git a/tensorflow_serving/util/net_http/server/internal/evhttp_server_test.cc b/tensorflow_serving/util/net_http/server/internal/evhttp_server_test.cc index d542a77546c..52d039351d4 100644 --- a/tensorflow_serving/util/net_http/server/internal/evhttp_server_test.cc +++ b/tensorflow_serving/util/net_http/server/internal/evhttp_server_test.cc @@ -20,7 +20,7 @@ limitations under the License. #include #include "absl/memory/memory.h" #include "absl/synchronization/notification.h" -#include "tensorflow_serving/util/net_http/client/internal/evhttp_connection.h" +#include "tensorflow_serving/util/net_http/client/test_client/internal/evhttp_connection.h" #include "tensorflow_serving/util/net_http/internal/fixed_thread_pool.h" #include "tensorflow_serving/util/net_http/server/public/httpserver.h" #include "tensorflow_serving/util/net_http/server/public/httpserver_interface.h" @@ -92,11 +92,11 @@ TEST_F(EvHTTPServerTest, ExactPathMatching) { server->StartAcceptingRequests(); auto connection = - EvHTTPConnection::Connect("localhost", server->listen_port()); + TestEvHTTPConnection::Connect("localhost", server->listen_port()); ASSERT_TRUE(connection != nullptr); - ClientRequest request = {"/ok?a=foo", "GET", {}, ""}; - ClientResponse response = {}; + TestClientRequest request = {"/ok?a=foo", "GET", {}, ""}; + TestClientResponse response = {}; EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); EXPECT_EQ(response.status, HTTPStatusCode::OK); @@ -131,11 +131,11 @@ TEST_F(EvHTTPServerTest, RequestHandlerOverwriting) { server->StartAcceptingRequests(); auto connection = - EvHTTPConnection::Connect("localhost", server->listen_port()); + TestEvHTTPConnection::Connect("localhost", server->listen_port()); ASSERT_TRUE(connection != nullptr); - ClientRequest request = {"/ok", "GET", {}, ""}; - ClientResponse response = {}; + TestClientRequest request = {"/ok", "GET", {}, ""}; + TestClientResponse response = {}; EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); EXPECT_EQ(response.status, HTTPStatusCode::OK); @@ -161,11 +161,11 @@ TEST_F(EvHTTPServerTest, SingleRequestDispather) { server->StartAcceptingRequests(); auto connection = - EvHTTPConnection::Connect("localhost", server->listen_port()); + TestEvHTTPConnection::Connect("localhost", server->listen_port()); ASSERT_TRUE(connection != nullptr); - ClientRequest request = {"/ok", "GET", {}, ""}; - ClientResponse response = {}; + TestClientRequest request = {"/ok", "GET", {}, ""}; + TestClientResponse response = {}; EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); EXPECT_EQ(response.status, HTTPStatusCode::OK); @@ -199,11 +199,11 @@ TEST_F(EvHTTPServerTest, UriPrecedesOverRequestDispather) { server->StartAcceptingRequests(); auto connection = - EvHTTPConnection::Connect("localhost", server->listen_port()); + TestEvHTTPConnection::Connect("localhost", server->listen_port()); ASSERT_TRUE(connection != nullptr); - ClientRequest request = {"/ok", "GET", {}, ""}; - ClientResponse response = {}; + TestClientRequest request = {"/ok", "GET", {}, ""}; + TestClientResponse response = {}; EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); EXPECT_EQ(response.status, HTTPStatusCode::OK); @@ -244,11 +244,11 @@ TEST_F(EvHTTPServerTest, InOrderRequestDispather) { server->StartAcceptingRequests(); auto connection = - EvHTTPConnection::Connect("localhost", server->listen_port()); + TestEvHTTPConnection::Connect("localhost", server->listen_port()); ASSERT_TRUE(connection != nullptr); - ClientRequest request = {"/ok", "GET", {}, ""}; - ClientResponse response = {}; + TestClientRequest request = {"/ok", "GET", {}, ""}; + TestClientResponse response = {}; EXPECT_TRUE(connection->BlockingSendRequest(request, &response)); EXPECT_EQ(response.status, HTTPStatusCode::OK); @@ -273,13 +273,13 @@ TEST_F(EvHTTPServerTest, RequestHandlerInteraction) { server->StartAcceptingRequests(); auto connection = - EvHTTPConnection::Connect("localhost", server->listen_port()); + TestEvHTTPConnection::Connect("localhost", server->listen_port()); ASSERT_TRUE(connection != nullptr); connection->SetExecutor(absl::make_unique(4)); absl::Notification response_done; - ClientRequest request = {"/ok", "GET", {}, ""}; - ClientResponse response = {}; + TestClientRequest request = {"/ok", "GET", {}, ""}; + TestClientResponse response = {}; response.done = [&response_done]() { response_done.Notify(); }; EXPECT_TRUE(connection->SendRequest(request, &response)); @@ -316,12 +316,12 @@ TEST_F(EvHTTPServerTest, ActiveRequestCountInShutdown) { server->StartAcceptingRequests(); auto connection = - EvHTTPConnection::Connect("localhost", server->listen_port()); + TestEvHTTPConnection::Connect("localhost", server->listen_port()); ASSERT_TRUE(connection != nullptr); connection->SetExecutor(absl::make_unique(4)); - ClientRequest request = {"/ok", "GET", {}, ""}; - ClientResponse response = {}; + TestClientRequest request = {"/ok", "GET", {}, ""}; + TestClientResponse response = {}; EXPECT_TRUE(connection->SendRequest(request, &response)); handler_enter.WaitForNotification(); From 651ee904c3f3425ba12f192b114a6c179f4cf3a3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Jan 2022 12:01:12 -0800 Subject: [PATCH 5803/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/beca2b15-7533-4952-9227-86927d2c5072 PiperOrigin-RevId: 421625269 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 188862a49f0..f8b968a0e31 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bb02a9f7a79d3c2681cd96eb01750d4f579552ffe0e2d84f1502692d396812dc", - git_commit = "91b8621ab8509ea11d0d782a5b1eacc772e17006", + sha256 = "92be4227ff30ae11403544dca2a742ba25a7d39ed03e09afdfd96ec26a6ec2d7", + git_commit = "e7b75decc7b3eed54a7164d3df60d2cb2f24d3d9", ) # Import all of TensorFlow Serving's external dependencies. From 9d81c82e39939989a7381ae97a40d3d94a753641 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 13 Jan 2022 18:01:35 -0800 Subject: [PATCH 5804/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/91ac7162-7ccf-4672-85a7-ea32b94af48f PiperOrigin-RevId: 421703876 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f8b968a0e31..4567afd2d8d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "92be4227ff30ae11403544dca2a742ba25a7d39ed03e09afdfd96ec26a6ec2d7", - git_commit = "e7b75decc7b3eed54a7164d3df60d2cb2f24d3d9", + sha256 = "77373b9757f9dd424aeafdd7ec7c80d17d88a987abd2c51c2506dbcec4dd7612", + git_commit = "3399540a34e19ef071ecf7e82e860871606ed63f", ) # Import all of TensorFlow Serving's external dependencies. From 7557c1797df1ca4fa477dd7179d0ccd17507562f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Jan 2022 00:01:43 -0800 Subject: [PATCH 5805/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e492fc3e-33a9-4e61-8c13-65abdd4c6080 PiperOrigin-RevId: 421750978 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4567afd2d8d..61a1689fc82 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "77373b9757f9dd424aeafdd7ec7c80d17d88a987abd2c51c2506dbcec4dd7612", - git_commit = "3399540a34e19ef071ecf7e82e860871606ed63f", + sha256 = "e4a2d4ecc6d6b095ca3696ac6b61b735ed099280ddcfc4212c47368eb4289a64", + git_commit = "8442f83802544b4fb91c7ffcb6aea138dfed1d98", ) # Import all of TensorFlow Serving's external dependencies. From b46867cfb4cb48b8e8e9fd51cd1abf67b45d5752 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Jan 2022 06:01:42 -0800 Subject: [PATCH 5806/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/60424c3e-a424-4f76-a362-48766e245f8b PiperOrigin-RevId: 421806183 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 61a1689fc82..c3940259d2c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e4a2d4ecc6d6b095ca3696ac6b61b735ed099280ddcfc4212c47368eb4289a64", - git_commit = "8442f83802544b4fb91c7ffcb6aea138dfed1d98", + sha256 = "bbf8e27bffddfdc68734e2717ef94d919b3e7882e246c14a41a6ec2d8b839874", + git_commit = "f87be6c7de847017c48520649e3d771e5d6b81b6", ) # Import all of TensorFlow Serving's external dependencies. From 599f430deeb0b0ff38082d301570fdd270e95e9c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Jan 2022 12:02:17 -0800 Subject: [PATCH 5807/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d7303a1e-e50e-4b81-bc4f-c2f93152c0ae PiperOrigin-RevId: 421881592 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c3940259d2c..4447970f2ac 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bbf8e27bffddfdc68734e2717ef94d919b3e7882e246c14a41a6ec2d8b839874", - git_commit = "f87be6c7de847017c48520649e3d771e5d6b81b6", + sha256 = "2f05fd3b8947bb4381a83688305d2cfff810a50367bf3402108948da0b3ef262", + git_commit = "949c3d4a9a753f556b7b4b28c0bcfbc2aece0204", ) # Import all of TensorFlow Serving's external dependencies. From 9ef8bde4d9b22c9f5291aeb2dd9d192ccb4b2f65 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 14 Jan 2022 18:01:57 -0800 Subject: [PATCH 5808/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b88586d6-1d29-4100-9b6c-8889b270c7d5 PiperOrigin-RevId: 421952071 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4447970f2ac..ba5c10a59ae 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2f05fd3b8947bb4381a83688305d2cfff810a50367bf3402108948da0b3ef262", - git_commit = "949c3d4a9a753f556b7b4b28c0bcfbc2aece0204", + sha256 = "b1119c72da989d0fab8ceaf53f8eec2cf53b19e79178dc805f469b8a5594adf5", + git_commit = "a7b687f797875242e43b3d072e2aa22dad51e006", ) # Import all of TensorFlow Serving's external dependencies. From 7e63a03463a952c2b08132a1fc66bc7cf653cf6d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 15 Jan 2022 00:01:26 -0800 Subject: [PATCH 5809/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/82b50a8e-52d5-47b2-8aaf-9f2f24555e58 PiperOrigin-RevId: 421993267 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ba5c10a59ae..ae67104959b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b1119c72da989d0fab8ceaf53f8eec2cf53b19e79178dc805f469b8a5594adf5", - git_commit = "a7b687f797875242e43b3d072e2aa22dad51e006", + sha256 = "116b63ea453591d99af267b0d2c384de3e96aba596ab4b92d6256da88ef5c71f", + git_commit = "aae314cf1c0bbe4b311cb6cddb8ff7b2a9fabd6b", ) # Import all of TensorFlow Serving's external dependencies. From 1889e1044c969c047f749cb840415448cde32370 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 15 Jan 2022 12:01:23 -0800 Subject: [PATCH 5810/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/345e6896-82d4-4b6f-8f0a-566e9dfe4421 PiperOrigin-RevId: 422070099 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ae67104959b..8b48c2ae35e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "116b63ea453591d99af267b0d2c384de3e96aba596ab4b92d6256da88ef5c71f", - git_commit = "aae314cf1c0bbe4b311cb6cddb8ff7b2a9fabd6b", + sha256 = "885db1d91beb8600a7c972d96b7a4db7b8396df3d43abe5edc6cc930903133cf", + git_commit = "19fdb506b4cfab04e391a3d9f5cf42258da61ea1", ) # Import all of TensorFlow Serving's external dependencies. From f231e3fe35e1455f1b9c275de1e286dff7ed98d9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 15 Jan 2022 18:01:32 -0800 Subject: [PATCH 5811/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7be6a005-8c68-4441-a7a9-5afba080fc37 PiperOrigin-RevId: 422105747 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8b48c2ae35e..7cebc8e204d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "885db1d91beb8600a7c972d96b7a4db7b8396df3d43abe5edc6cc930903133cf", - git_commit = "19fdb506b4cfab04e391a3d9f5cf42258da61ea1", + sha256 = "f3f0cf47cee76c80afa6d23a9a03d214108aef75ca433e3177394a477276cb77", + git_commit = "0b6cc85863c4484586d1317b08d7c42bc8a0640c", ) # Import all of TensorFlow Serving's external dependencies. From f1173f34c9a8a62c3abe2bbb92b2f7fb6c49a612 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 16 Jan 2022 06:01:34 -0800 Subject: [PATCH 5812/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0a9747dc-69e6-4bc7-a28e-26da490665ca PiperOrigin-RevId: 422178433 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7cebc8e204d..461b071143b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f3f0cf47cee76c80afa6d23a9a03d214108aef75ca433e3177394a477276cb77", - git_commit = "0b6cc85863c4484586d1317b08d7c42bc8a0640c", + sha256 = "0327d786afcd5b0db5d48d0a103b69e5875c8e30e1d74f04cd14284fedca426f", + git_commit = "27579d2e2719be5264e3877a50d6c0f9a5717553", ) # Import all of TensorFlow Serving's external dependencies. From 24ce5d99456efd998bb58ad18a34b5f239743247 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 16 Jan 2022 18:01:20 -0800 Subject: [PATCH 5813/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9026bc1e-4ba7-457f-8ed8-ed6236ae72ff PiperOrigin-RevId: 422247400 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 461b071143b..64c85d85714 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0327d786afcd5b0db5d48d0a103b69e5875c8e30e1d74f04cd14284fedca426f", - git_commit = "27579d2e2719be5264e3877a50d6c0f9a5717553", + sha256 = "0b26a61566ef99b9ce230aadf51b81faa78f022d6661078fee8b690f8b40790b", + git_commit = "64bf39d1dcfd0c67ed62a179187c3332a138226d", ) # Import all of TensorFlow Serving's external dependencies. From eab0eee978a56181692f16278766b99b862ebae2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Jan 2022 00:02:13 -0800 Subject: [PATCH 5814/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5b386b9b-ea9b-4a7d-837e-2f7fff9df772 PiperOrigin-RevId: 422288180 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 64c85d85714..50a6f3b49ec 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0b26a61566ef99b9ce230aadf51b81faa78f022d6661078fee8b690f8b40790b", - git_commit = "64bf39d1dcfd0c67ed62a179187c3332a138226d", + sha256 = "ab61937e58d51718e957c3e25c353cc7158e561fab2b1665b7364edeb0648079", + git_commit = "64ab1c01592c6a2fb2ecada1f07c860d911aec24", ) # Import all of TensorFlow Serving's external dependencies. From 8f4061d326f3e25d78a2b57898f4c2f23f871c33 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Jan 2022 06:02:04 -0800 Subject: [PATCH 5815/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b9b10801-1a03-4f46-afa5-bb041d3fd885 PiperOrigin-RevId: 422348648 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 50a6f3b49ec..e4655d4fe59 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ab61937e58d51718e957c3e25c353cc7158e561fab2b1665b7364edeb0648079", - git_commit = "64ab1c01592c6a2fb2ecada1f07c860d911aec24", + sha256 = "9e22214535a95c67be005033b637d905220f11c14298fd7102231170959c55a6", + git_commit = "8bb7a3c0f98a48ef32ec0fc6a5c45a197dfcfbee", ) # Import all of TensorFlow Serving's external dependencies. From 067ee81efbaef3d8b66bf094f67a1202f976a161 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 17 Jan 2022 12:01:26 -0800 Subject: [PATCH 5816/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e85f17d6-7163-4e3a-b310-bd26f83e05e8 PiperOrigin-RevId: 422398488 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e4655d4fe59..690d1273ffc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9e22214535a95c67be005033b637d905220f11c14298fd7102231170959c55a6", - git_commit = "8bb7a3c0f98a48ef32ec0fc6a5c45a197dfcfbee", + sha256 = "5f90199a4349c9adb66f9956de77fea7110149ffa30da495e2fe5b48f78dd8e3", + git_commit = "5c02ba4a14b0746a0452c4cc78ad629dcbe633f7", ) # Import all of TensorFlow Serving's external dependencies. From 8b0dcb6062e59f031404fc720a47893d37a1a0c6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Jan 2022 06:01:33 -0800 Subject: [PATCH 5817/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/23147408-3e31-4686-bf27-b39fb9881c95 PiperOrigin-RevId: 422537130 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 690d1273ffc..f626ec6c127 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5f90199a4349c9adb66f9956de77fea7110149ffa30da495e2fe5b48f78dd8e3", - git_commit = "5c02ba4a14b0746a0452c4cc78ad629dcbe633f7", + sha256 = "51d9e4dbb53f8a8b947b7fe4326e1c7749699bbf57a9ea4922299e0ce89ae4f1", + git_commit = "583da17bd6e0972b2c01305547ca04008b2c22a8", ) # Import all of TensorFlow Serving's external dependencies. From 1f66b4b7b141cae386fff64b6aa437cf2d01bafb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 18 Jan 2022 12:01:23 -0800 Subject: [PATCH 5818/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c44deba8-7a46-4f86-95ac-48dddbc709ba PiperOrigin-RevId: 422613980 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f626ec6c127..75985cef9e4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "51d9e4dbb53f8a8b947b7fe4326e1c7749699bbf57a9ea4922299e0ce89ae4f1", - git_commit = "583da17bd6e0972b2c01305547ca04008b2c22a8", + sha256 = "1f86195b02118d15750cc6ef0df50236073263d4eb4a16be63257fbdc0b76d99", + git_commit = "e429c41b3185e766db1a797cffaec456984425ec", ) # Import all of TensorFlow Serving's external dependencies. From ad95ebab6a214b55bd887d2ee14ba5bddbaf329d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Jan 2022 00:01:37 -0800 Subject: [PATCH 5819/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2766f7eb-8895-4bbc-ae3e-720b9ec0f6fb PiperOrigin-RevId: 422995170 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 75985cef9e4..67321f1c329 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1f86195b02118d15750cc6ef0df50236073263d4eb4a16be63257fbdc0b76d99", - git_commit = "e429c41b3185e766db1a797cffaec456984425ec", + sha256 = "27c04a79e1273067d112b8dfee41637266d75f1fab3b470bccc0aca153ec718d", + git_commit = "e93d5984d2d34de2a47b4a05b930a329afdce605", ) # Import all of TensorFlow Serving's external dependencies. From 69fe27d35aec26082df9c1dc8883f5af08eae4ca Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Jan 2022 06:01:32 -0800 Subject: [PATCH 5820/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e6fa3f48-92d3-437b-aea5-5d215bf4aa74 PiperOrigin-RevId: 423049159 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 67321f1c329..e26e147867d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "27c04a79e1273067d112b8dfee41637266d75f1fab3b470bccc0aca153ec718d", - git_commit = "e93d5984d2d34de2a47b4a05b930a329afdce605", + sha256 = "6fb44e6ab62b3845713ac86396471486d82ed15c90a4ac0c640be8eb3f270987", + git_commit = "fa60dd86e19040e8243eff0a48f9eea97d2b4f27", ) # Import all of TensorFlow Serving's external dependencies. From 1285e41acc707ba0d18e8eaf8a42c6d5110e8af8 Mon Sep 17 00:00:00 2001 From: Sunita Nadampalli Date: Thu, 20 Jan 2022 19:44:35 +0000 Subject: [PATCH 5821/8103] tfs:aarch64: add aarch64 mkl bazel config to enable onednn+acl backend --- .bazelrc | 9 +++++++++ .../tools/pip_package/build_pip_package.sh | 9 +++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/.bazelrc b/.bazelrc index 7a1ab46ece5..f02dfbe892f 100644 --- a/.bazelrc +++ b/.bazelrc @@ -25,6 +25,15 @@ build:mkl_open_source_only --define=build_with_mkl_dnn_only=true build:mkl_open_source_only --define=build_with_mkl=true --define=enable_mkl=true build:mkl_open_source_only --define=tensorflow_mkldnn_contraction_kernel=0 +# Config setting to build oneDNN with Compute Library for the Arm Architecture (ACL). +# This build is for the inference regime only. +build:mkl_aarch64 --define=build_with_mkl_aarch64=true --define=enable_mkl=true +build:mkl_aarch64 --define=tensorflow_mkldnn_contraction_kernel=0 +build:mkl_aarch64 --define=build_with_mkl_opensource=true +build:mkl_aarch64 --define=build_with_openmp=true +build:mkl_aarch64 --copt=-march=armv8.2-a +build:mkl_aarch64 --copt=-O3 + # Processor native optimizations (depends on build host capabilities). build:nativeopt --copt=-march=native build:nativeopt --host_copt=-march=native diff --git a/tensorflow_serving/tools/pip_package/build_pip_package.sh b/tensorflow_serving/tools/pip_package/build_pip_package.sh index 31f4267674d..cc621cb9920 100755 --- a/tensorflow_serving/tools/pip_package/build_pip_package.sh +++ b/tensorflow_serving/tools/pip_package/build_pip_package.sh @@ -37,8 +37,13 @@ function main() { mkdir -p ${TMPDIR}/tensorflow_serving/apis mkdir -p ${TMPDIR}/tensorflow_serving/config + BAZEL_OPT_DIR="k8-opt" + if [[ $(uname -m) == "aarch64" ]]; then + BAZEL_OPT_DIR="aarch64-opt" + fi + echo "Adding python files" - cp bazel-out/k8-opt/bin/tensorflow_serving/apis/*_pb2.py \ + cp bazel-out/${BAZEL_OPT_DIR}/bin/tensorflow_serving/apis/*_pb2.py \ "${TMPDIR}/tensorflow_serving/apis" cp ${BAZEL_PROJECT_DIR}/tensorflow_serving/apis/*_pb2.py \ @@ -47,7 +52,7 @@ function main() { cp ${BAZEL_PROJECT_DIR}/tensorflow_serving/apis/*_grpc.py \ "${TMPDIR}/tensorflow_serving/apis" - cp bazel-out/k8-opt/bin/tensorflow_serving/config/*_pb2.py \ + cp bazel-out/${BAZEL_OPT_DIR}/bin/tensorflow_serving/config/*_pb2.py \ "${TMPDIR}/tensorflow_serving/config" touch "${TMPDIR}/tensorflow_serving/apis/__init__.py" From e93dc58810f6758c2367db8ec76e74e7b3633120 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 20 Jan 2022 12:01:14 -0800 Subject: [PATCH 5822/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6343ba0c-5fcb-482f-91aa-9b794a694321 PiperOrigin-RevId: 423125090 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e26e147867d..9b304654b7f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6fb44e6ab62b3845713ac86396471486d82ed15c90a4ac0c640be8eb3f270987", - git_commit = "fa60dd86e19040e8243eff0a48f9eea97d2b4f27", + sha256 = "fbe6ea118c4792f6dff78d0affd09b5289f7aeee57f1671fa0f13f17385ba12a", + git_commit = "5375ed9bb9c72099dbf5ef98d783a30cf1d58a25", ) # Import all of TensorFlow Serving's external dependencies. From f8b48ee83a6435afd5751a89f67372ef096d4598 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Jan 2022 12:01:08 -0800 Subject: [PATCH 5823/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b8a42aa5-a56f-423e-82d7-b0fd29624a74 PiperOrigin-RevId: 424673040 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9b304654b7f..0d3b56ac235 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fbe6ea118c4792f6dff78d0affd09b5289f7aeee57f1671fa0f13f17385ba12a", - git_commit = "5375ed9bb9c72099dbf5ef98d783a30cf1d58a25", + sha256 = "9b39a54f12688445aecef780446b36325830275e3baf9aee1b2f4326551b77db", + git_commit = "0a77cdeda07cde6c0cab2a5fdef51a63fc68f78f", ) # Import all of TensorFlow Serving's external dependencies. From 335ee2d47c548f9a52884e490615a846091cb45b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 27 Jan 2022 18:01:16 -0800 Subject: [PATCH 5824/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/923d99fc-32e8-4c1b-9fe8-7b37665dc032 PiperOrigin-RevId: 424751983 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0d3b56ac235..6dd905c976a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9b39a54f12688445aecef780446b36325830275e3baf9aee1b2f4326551b77db", - git_commit = "0a77cdeda07cde6c0cab2a5fdef51a63fc68f78f", + sha256 = "65141d75ee39e36fd6001e9b22870c374ee76a75650e686d39986a2fd634bd4c", + git_commit = "b89a2f2a1b761ac68aa808f2bcd847314b15c6c1", ) # Import all of TensorFlow Serving's external dependencies. From df3170f153c3ec65a9940ea6b0a468b0a402ca1b Mon Sep 17 00:00:00 2001 From: Sungsoon Cho Date: Mon, 31 Jan 2022 13:04:10 -0800 Subject: [PATCH 5825/8103] Bump minimum bazel version 5.0.0. PiperOrigin-RevId: 425441664 --- WORKSPACE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WORKSPACE b/WORKSPACE index 6dd905c976a..2148b360a5b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -31,7 +31,7 @@ load( "@org_tensorflow//tensorflow:version_check.bzl", "check_bazel_version_at_least" ) -check_bazel_version_at_least("3.7.2") +check_bazel_version_at_least("5.0.0") # Initialize TensorFlow's external dependencies. load("@org_tensorflow//tensorflow:workspace3.bzl", "workspace") From 5fc0528491e8e58fdc10111bde6b6c8f4c3d35ab Mon Sep 17 00:00:00 2001 From: Sungsoon Cho Date: Mon, 31 Jan 2022 14:28:00 -0800 Subject: [PATCH 5826/8103] Bump minimum bazel version 5.0.0, to match with TF (and latest sources of TF need newer version to build correctly). PiperOrigin-RevId: 425462475 --- tensorflow_serving/tools/docker/Dockerfile.devel | 2 +- tensorflow_serving/tools/docker/Dockerfile.devel-gpu | 2 +- tensorflow_serving/tools/docker/Dockerfile.devel-mkl | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index 5bbe2021c13..cbf90963bb4 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -76,7 +76,7 @@ RUN pip3 --no-cache-dir install \ --ignore-installed six>=1.12.0 # Set up Bazel -ENV BAZEL_VERSION 3.7.2 +ENV BAZEL_VERSION 5.0.0 WORKDIR / RUN mkdir /bazel && \ cd /bazel && \ diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 980ec38201f..2945d6057f5 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -108,7 +108,7 @@ RUN pip3 --no-cache-dir install \ --ignore-installed six>=1.12.0 # Set up Bazel -ENV BAZEL_VERSION 3.7.2 +ENV BAZEL_VERSION 5.0.0 WORKDIR / RUN mkdir /bazel && \ cd /bazel && \ diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl index 446ac5b95be..3feb1d6e637 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl @@ -75,7 +75,7 @@ RUN pip3 --no-cache-dir install \ --ignore-installed six>=1.12.0 # Set up Bazel -ENV BAZEL_VERSION 3.7.2 +ENV BAZEL_VERSION 5.0.0 WORKDIR / RUN mkdir /bazel && \ cd /bazel && \ From 7a2fecf1695cfb4fc743adbde0be35c2dd31e82e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 31 Jan 2022 18:01:12 -0800 Subject: [PATCH 5827/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4c799744-1900-44d2-ac48-5172f6d94f9d PiperOrigin-RevId: 425504044 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2148b360a5b..545c830f40f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "65141d75ee39e36fd6001e9b22870c374ee76a75650e686d39986a2fd634bd4c", - git_commit = "b89a2f2a1b761ac68aa808f2bcd847314b15c6c1", + sha256 = "c3787b4e68fec62b653a19ae5d5b6ed150a9c150039595c98d49ae4a6f46d47b", + git_commit = "a05bee9201d95420e0d47b9567e47cc2198027e3", ) # Import all of TensorFlow Serving's external dependencies. From 140bbe7d4f6440449b61b360f227da6851b6332b Mon Sep 17 00:00:00 2001 From: Sungsoon Cho Date: Mon, 31 Jan 2022 23:34:49 -0800 Subject: [PATCH 5828/8103] Fix the bug running get-pip.py on python3.6. PiperOrigin-RevId: 425544723 --- tensorflow_serving/tools/docker/Dockerfile.devel | 8 ++++---- tensorflow_serving/tools/docker/Dockerfile.devel-mkl | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index cbf90963bb4..d054bd116df 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -47,10 +47,6 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ apt-get clean && \ rm -rf /var/lib/apt/lists/* -RUN curl -fSsL -O https://bootstrap.pypa.io/get-pip.py && \ - python3 get-pip.py && \ - rm get-pip.py - # Install python 3.7. RUN add-apt-repository ppa:deadsnakes/ppa && \ apt-get update && apt-get install -y \ @@ -62,6 +58,10 @@ RUN add-apt-repository ppa:deadsnakes/ppa && \ # Make python3.7 the default python version RUN update-alternatives --install /usr/bin/python python /usr/bin/python3.7 0 +RUN curl -fSsL -O https://bootstrap.pypa.io/get-pip.py && \ + python3 get-pip.py && \ + rm get-pip.py + RUN pip3 --no-cache-dir install \ future>=0.17.1 \ grpcio \ diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl index 3feb1d6e637..93bfdbd7134 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl @@ -47,10 +47,6 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ apt-get clean && \ rm -rf /var/lib/apt/lists/* -RUN curl -fSsL -O https://bootstrap.pypa.io/get-pip.py && \ - python3 get-pip.py && \ - rm get-pip.py - # Install python 3.7. RUN add-apt-repository ppa:deadsnakes/ppa && \ apt-get update && apt-get install -y \ @@ -62,6 +58,10 @@ RUN add-apt-repository ppa:deadsnakes/ppa && \ # Make python3.7 the default python version RUN update-alternatives --install /usr/bin/python python /usr/bin/python3.7 0 +RUN curl -fSsL -O https://bootstrap.pypa.io/get-pip.py && \ + python3 get-pip.py && \ + rm get-pip.py + RUN pip3 --no-cache-dir install \ future>=0.17.1 \ grpcio \ From c897eb246d9aeaf4286b08b445b0b7de0cfd3887 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 1 Feb 2022 00:01:15 -0800 Subject: [PATCH 5829/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/de37fbd1-d1f8-42e4-b927-55f3fd063d15 PiperOrigin-RevId: 425548056 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 545c830f40f..f57a75105e0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c3787b4e68fec62b653a19ae5d5b6ed150a9c150039595c98d49ae4a6f46d47b", - git_commit = "a05bee9201d95420e0d47b9567e47cc2198027e3", + sha256 = "fcff1657c4cc669597ca5c1945e28e46ff583c86e29e21cc66bc68b4e4a30c73", + git_commit = "58f16dd902fa84f8aa0fd452afb319c1ff65bc74", ) # Import all of TensorFlow Serving's external dependencies. From 9bbadaaa0b0988dc9d518cf0ae55d37e5678021e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 1 Feb 2022 06:01:18 -0800 Subject: [PATCH 5830/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ba43c2f0-7301-46c7-8fcf-c790d6c3ec24 PiperOrigin-RevId: 425604763 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f57a75105e0..ef2cbe000cb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fcff1657c4cc669597ca5c1945e28e46ff583c86e29e21cc66bc68b4e4a30c73", - git_commit = "58f16dd902fa84f8aa0fd452afb319c1ff65bc74", + sha256 = "b8b4c974cb8164f1514ba7fe22c38b08b56f8655f77162179e2993fe79fbb70d", + git_commit = "13fc0856ff2f7599ffe03d7de8af99efb9a8f028", ) # Import all of TensorFlow Serving's external dependencies. From 54889352599203c3ea7686fce8f8269ebd12ecb3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 1 Feb 2022 12:01:21 -0800 Subject: [PATCH 5831/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2abc6d7f-88a2-4328-82d0-3f6c54e16d15 PiperOrigin-RevId: 425682531 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ef2cbe000cb..b3c0d423a52 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b8b4c974cb8164f1514ba7fe22c38b08b56f8655f77162179e2993fe79fbb70d", - git_commit = "13fc0856ff2f7599ffe03d7de8af99efb9a8f028", + sha256 = "2990f795045a7814ec322da687e46e0ab068f23d13461e4ba1c3e30d7ac2962d", + git_commit = "fa26c7e8d06f9f6ee4f0c2d86b1acb43733648b0", ) # Import all of TensorFlow Serving's external dependencies. From 21b13e9e0b152c9f7bb071f36e48a1e0ca9f9d5c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 1 Feb 2022 18:01:16 -0800 Subject: [PATCH 5832/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/cd8b5883-e821-4ca5-a9f5-952fd20d7a8d PiperOrigin-RevId: 425760564 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b3c0d423a52..f3efb3037ca 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2990f795045a7814ec322da687e46e0ab068f23d13461e4ba1c3e30d7ac2962d", - git_commit = "fa26c7e8d06f9f6ee4f0c2d86b1acb43733648b0", + sha256 = "0d480994162a7cc52afabee9224b6a93e244d2d82b24287b3bc3101c7699b148", + git_commit = "fcfef1062556eb199faa2c2759aa93d15e6bfa3f", ) # Import all of TensorFlow Serving's external dependencies. From ab2fb84131d90f348eff6d93b920ff44cb4ee392 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 2 Feb 2022 00:01:19 -0800 Subject: [PATCH 5833/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/78d1c25c-4324-4560-a8ce-1fdc46623b2f PiperOrigin-RevId: 425808751 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f3efb3037ca..61fb844980e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0d480994162a7cc52afabee9224b6a93e244d2d82b24287b3bc3101c7699b148", - git_commit = "fcfef1062556eb199faa2c2759aa93d15e6bfa3f", + sha256 = "68bc0d8ba54d1beb3883a1cb3a9a7edbc06e3a68992633c09dc1cb7e9e419a74", + git_commit = "8dbfd47e5ad0fad3589401587d10d392acbc300f", ) # Import all of TensorFlow Serving's external dependencies. From b8b62363c517965c6be0c7efe90a96370688cbb3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 2 Feb 2022 06:01:11 -0800 Subject: [PATCH 5834/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/24a8913f-51d3-426d-acab-f1c726ab20ad PiperOrigin-RevId: 425863946 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 61fb844980e..9fc7993a6f1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "68bc0d8ba54d1beb3883a1cb3a9a7edbc06e3a68992633c09dc1cb7e9e419a74", - git_commit = "8dbfd47e5ad0fad3589401587d10d392acbc300f", + sha256 = "de19d55329fdc59354142b3f322f0a12859b541b56bf5836cd8ab62b6435c279", + git_commit = "fa47c12f55c67b7e05b19e7be2092858c6da4ae2", ) # Import all of TensorFlow Serving's external dependencies. From 6549ef2136940cd98cfbb9ee0e29221d86101d16 Mon Sep 17 00:00:00 2001 From: Allen Wang Date: Wed, 2 Feb 2022 11:29:19 -0800 Subject: [PATCH 5835/8103] Integrate TPU initialization changes into TF Serving. PiperOrigin-RevId: 425935156 --- .bazelrc | 1 + tensorflow_serving/model_servers/BUILD | 3 ++- tensorflow_serving/model_servers/main.cc | 9 +++++++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/.bazelrc b/.bazelrc index 7a1ab46ece5..768d3ccda38 100644 --- a/.bazelrc +++ b/.bazelrc @@ -12,6 +12,7 @@ build:cuda --action_env=TF_CUDA_COMPUTE_CAPABILITIES="sm_35,sm_50,sm_60,sm_70,sm # Options used to build with TPU support. build:tpu --distinct_host_configuration=false build:tpu --define=with_tpu_support=true --define=framework_shared_object=false +build:tpu --copt=-DLIBTPU_ON_GCE # Please note that MKL on MacOS or windows is still not supported. # If you would like to use a local MKL instead of downloading, please set the diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 548c57192b1..51e92e4dc0e 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -395,7 +395,8 @@ cc_library( "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core/platform/cloud:gcs_file_system", ] + if_libtpu([ - "@org_tensorflow//tensorflow/core/tpu:tpu_model_server_initializer", + "@org_tensorflow//tensorflow/core/tpu:tpu_global_init", + "@org_tensorflow//tensorflow/core/tpu:tpu_api_dlsym_initializer", ]), ) diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index 1e1a5af41c1..5079a9c84c8 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -50,6 +50,9 @@ limitations under the License. #include "tensorflow/compiler/jit/flags.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/platform/init_main.h" +#if defined(LIBTPU_ON_GCE) +#include "tensorflow/core/tpu/tpu_global_init.h" +#endif #include "tensorflow/core/util/command_line_flags.h" #include "tensorflow_serving/model_servers/server.h" #include "tensorflow_serving/model_servers/version.h" @@ -266,6 +269,12 @@ int main(int argc, char** argv) { return -1; } +#if defined(LIBTPU_ON_GCE) + std::cout << "Initializing TPU system."; + TF_QCHECK_OK(tensorflow::InitializeTPUSystemGlobally()) + << "Failed to intialize the TPU system."; +#endif + if (display_version) { std::cout << "TensorFlow ModelServer: " << TF_Serving_Version() << "\n" << "TensorFlow Library: " << TF_Version() << "\n"; From 8ae2ca4cb33202b37ecd575f143e484c7309d223 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 2 Feb 2022 12:01:12 -0800 Subject: [PATCH 5836/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/48b5089b-ef5c-432a-b18d-94eed25d7848 PiperOrigin-RevId: 425943197 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9fc7993a6f1..46d843b030d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "de19d55329fdc59354142b3f322f0a12859b541b56bf5836cd8ab62b6435c279", - git_commit = "fa47c12f55c67b7e05b19e7be2092858c6da4ae2", + sha256 = "af4b2753ef4a9eb607ca5b0464d5acb1cca77378dc69853ddf8bc1ca285f27c6", + git_commit = "da984d69c6a54b21ac0814d51031f5df4ce57130", ) # Import all of TensorFlow Serving's external dependencies. From fcfa3c046f902a5dc17e268eb7db831df593304e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 2 Feb 2022 18:01:18 -0800 Subject: [PATCH 5837/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/67ed7b09-226b-48c1-864b-e3c3aeab5df9 PiperOrigin-RevId: 426022381 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 46d843b030d..415d906644e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "af4b2753ef4a9eb607ca5b0464d5acb1cca77378dc69853ddf8bc1ca285f27c6", - git_commit = "da984d69c6a54b21ac0814d51031f5df4ce57130", + sha256 = "3e98ead7fcfa36d7b83fb4dca111a5c12ed72d13b2297b2476baf9f0e7bced2e", + git_commit = "1b771b5d88e51f7c91795a8123840b6c8128449e", ) # Import all of TensorFlow Serving's external dependencies. From 20edf2fc2f92c25a43669a29c93f57385f187e53 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 3 Feb 2022 00:01:15 -0800 Subject: [PATCH 5838/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/95f176b1-3bb5-40ae-b048-19324e302e18 PiperOrigin-RevId: 426069777 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 415d906644e..2d1f7920e35 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3e98ead7fcfa36d7b83fb4dca111a5c12ed72d13b2297b2476baf9f0e7bced2e", - git_commit = "1b771b5d88e51f7c91795a8123840b6c8128449e", + sha256 = "c5a4c8f8adbe912948e002d23681ba3004b6cfd3259ecc5a2e5f4f004d63bc0c", + git_commit = "7fdd40dab9a485dc6a95d06dce2fa9029aa72729", ) # Import all of TensorFlow Serving's external dependencies. From ff23cfbf0460cc8819cda211dda07c222eeee7fc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 3 Feb 2022 06:01:14 -0800 Subject: [PATCH 5839/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1498075c-e17f-442e-b455-44e7500012ce PiperOrigin-RevId: 426123942 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2d1f7920e35..1f7db0f47c4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c5a4c8f8adbe912948e002d23681ba3004b6cfd3259ecc5a2e5f4f004d63bc0c", - git_commit = "7fdd40dab9a485dc6a95d06dce2fa9029aa72729", + sha256 = "9b98e8fd3407b08e060eee5b93b71f83c873149a871d5ab7ce3dd0086cbca475", + git_commit = "d0c8334e2218d2984613a722861c0cd41521204c", ) # Import all of TensorFlow Serving's external dependencies. From 1f7ed1f202b6f9dce0e1fcd8e4caf0d6bc5e0bcd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 3 Feb 2022 12:01:14 -0800 Subject: [PATCH 5840/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f3524334-1790-4529-badf-00cd7279b340 PiperOrigin-RevId: 426204986 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1f7db0f47c4..29bd74c6390 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9b98e8fd3407b08e060eee5b93b71f83c873149a871d5ab7ce3dd0086cbca475", - git_commit = "d0c8334e2218d2984613a722861c0cd41521204c", + sha256 = "3e6c98de0842520a65978549be7b1b6061080ecf9fa9f3a87739e19a0447a85c", + git_commit = "1f8f692143aa9a42c55f8b35d09aeed93bdab66e", ) # Import all of TensorFlow Serving's external dependencies. From 10ef8d4cebf2ee2cf9a77066208f1ada2016336e Mon Sep 17 00:00:00 2001 From: Raviteja Gorijala Date: Mon, 7 Feb 2022 12:29:28 -0800 Subject: [PATCH 5841/8103] Add release notes for tf-serving 2.6.3 and tf-serving 2.5.4 PiperOrigin-RevId: 426986305 --- RELEASE.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/RELEASE.md b/RELEASE.md index a2612e5f45e..db63a5815c0 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,3 +1,31 @@ +# Release 2.5.4 + +## Major Features and Improvements + +* No major features or improvements. + +## Breaking Changes + +* No breaking changes + +## Bug Fixes and Other Changes + +* This release is based on TF version 2.5.3 + +# Release 2.6.3 + +## Major Features and Improvements + +* No major features or improvements. + +## Breaking Changes + +* No breaking changes + +## Bug Fixes and Other Changes + +* This release is based on TF version 2.6.3 + # Release 2.6.0 ## Major Features and Improvements From 7359725873a4f5356893309b9075da09b1fb23f2 Mon Sep 17 00:00:00 2001 From: Robert Neale Date: Thu, 10 Feb 2022 16:28:33 -0800 Subject: [PATCH 5842/8103] Updates the test model for TF Text v2.6.0. PiperOrigin-RevId: 427871547 --- .../tf_text_regression/01/keras_metadata.pb | 2 ++ .../tf_text_regression/01/saved_model.pb | Bin 5193739 -> 5370119 bytes .../variables/variables.data-00000-of-00001 | Bin 67 -> 342 bytes .../01/variables/variables.index | Bin 144 -> 145 bytes 4 files changed, 2 insertions(+) create mode 100644 tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/keras_metadata.pb diff --git a/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/keras_metadata.pb b/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/keras_metadata.pb new file mode 100644 index 00000000000..c066bb37990 --- /dev/null +++ b/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/keras_metadata.pb @@ -0,0 +1,2 @@ + +ìroot"_tf_keras_model*Ì{"name": "tf_text_ops", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "must_restore_from_config": false, "class_name": "TfTextOps", "config": {"layer was saved without config": true}, "is_graph_network": false, "full_save_spec": {"class_name": "__tuple__", "items": [[{"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [1]}, "float32", "input_1"]}], {}]}, "save_spec": {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [1]}, "float32", "input_1"]}, "keras_version": "2.6.0", "backend": "tensorflow", "model_config": {"class_name": "TfTextOps"}}2 \ No newline at end of file diff --git a/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/saved_model.pb b/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/saved_model.pb index f308494431afc4c0ddc148c16c6d86961ca554cd..a401a795f5511372a9b894aa0481ce0c3bd3e654 100644 GIT binary patch delta 36814 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

i5C-){v0`hE+R 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 De3J^~ diff --git a/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/variables/variables.data-00000-of-00001 b/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/variables/variables.data-00000-of-00001 index 3a5969d2200c0720d79527e7a00e155dbc0f5016..043b87e07f7a38954d1577525e3b14013211f74e 100644 GIT binary patch literal 342 zcmb7+;F3HvhehEq->o&m5$%$`sx= zJ1Gn)-fPERaVa=~5uulzLh*?W91|N@Il_N8bgPuQ-v$639TgV< delta 94 zcmbQpIDwIefq{*KQHqI!kwJ!gB9EfEvuU|{>>LIlU<47LV=6k}oCBX0ZeUt f3%Ptd=;^@W%Qvx5Vqya)H&8tMcSE;IsrzjJ{bUos From 3b29e18ab57c68604f599d0b3e1f8df417d22427 Mon Sep 17 00:00:00 2001 From: Raviteja Gorijala Date: Thu, 10 Feb 2022 16:41:00 -0800 Subject: [PATCH 5843/8103] Add release notes for tf-serving 2.8.0 PiperOrigin-RevId: 427874024 --- RELEASE.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/RELEASE.md b/RELEASE.md index db63a5815c0..37853a6ccaa 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,3 +1,21 @@ +# Release 2.8.0 + +## Major Features and Improvements + +* No major features or improvements. + +## Breaking Changes + +* No breaking changes + +## Bug Fixes and Other Changes + +* Force-allow labels for the models which are not yet loaded. The feature is meant to be used for non-prod environments only as it may break the serving until relevant models are not loaded yet. (commit: 988bbce80038ac0b7141dcb4413124ba486344cf) +* Update CreateRPC API interface. (commit: 2e7ca90c18f310c542ed0dcde92d676db6454285) +* Add `--tensorflow_session_config_file` flag to tf serving model server to support custom SessionConfig (commit: 342a8088524c33f68e3eb4d66800f01a777ceb38) +* Add `--experimental_cc_shared_library` by default to all builds. (commit: 49b138fdd4c0fb7170736193063c6f03dfb4dba4) +* Add --num_request_iterations_for_warmup flag (fixes #1949) (commit: 2a55aec18cc1923ece84c7fcf701185306ef99b1) + # Release 2.5.4 ## Major Features and Improvements From 5bf8880b817b144c6f52dcd0d61cde212973e6cc Mon Sep 17 00:00:00 2001 From: Guanxin Qiao Date: Thu, 3 Mar 2022 10:30:53 -0800 Subject: [PATCH 5844/8103] Refactor ResourceUtil::Normalize() and ResourceUtil::IsNormalized(). PiperOrigin-RevId: 432226916 --- tensorflow_serving/resources/resource_util.cc | 78 +++++++++++-------- tensorflow_serving/resources/resource_util.h | 12 +++ 2 files changed, 56 insertions(+), 34 deletions(-) diff --git a/tensorflow_serving/resources/resource_util.cc b/tensorflow_serving/resources/resource_util.cc index 8dcf78a1524..f79caaf48c6 100644 --- a/tensorflow_serving/resources/resource_util.cc +++ b/tensorflow_serving/resources/resource_util.cc @@ -144,43 +144,11 @@ Status ResourceUtil::VerifyResourceValidity(const Resource& resource) const { ResourceAllocation ResourceUtil::Normalize( const ResourceAllocation& allocation) const { - if (!VerifyFunctionInternal([&]() { return VerifyValidity(allocation); }, - DCHECKFailOption::kDoDCHECKFail) - .ok()) { - return allocation; - } - - ResourceAllocation normalized; - for (const ResourceAllocation::Entry& entry : - allocation.resource_quantities()) { - if (entry.quantity() == 0) { - continue; - } - - ResourceAllocation::Entry* normalized_entry = - normalized.add_resource_quantities(); - *normalized_entry->mutable_resource() = NormalizeResource(entry.resource()); - normalized_entry->set_quantity(entry.quantity()); - } - return normalized; + return NormalizeResourceAllocation(allocation); } bool ResourceUtil::IsNormalized(const ResourceAllocation& allocation) const { - if (!VerifyFunctionInternal([&]() { return VerifyValidity(allocation); }, - DCHECKFailOption::kDoDCHECKFail) - .ok()) { - return false; - } - - for (const auto& entry : allocation.resource_quantities()) { - if (entry.quantity() == 0) { - return false; - } - if (!IsResourceNormalized(entry.resource())) { - return false; - } - } - return true; + return IsResourceAllocationNormalized(allocation); } bool ResourceUtil::IsBound(const ResourceAllocation& allocation) const { @@ -275,6 +243,48 @@ ResourceAllocation ResourceUtil::Min(const ResourceAllocation& lhs, return MinNormalized(Normalize(lhs), Normalize(rhs)); } +ResourceAllocation ResourceUtil::NormalizeResourceAllocation( + const ResourceAllocation& allocation) const { + if (!VerifyFunctionInternal([&]() { return VerifyValidity(allocation); }, + DCHECKFailOption::kDoDCHECKFail) + .ok()) { + return allocation; + } + + ResourceAllocation normalized; + for (const ResourceAllocation::Entry& entry : + allocation.resource_quantities()) { + if (entry.quantity() == 0) { + continue; + } + + ResourceAllocation::Entry* normalized_entry = + normalized.add_resource_quantities(); + *normalized_entry->mutable_resource() = NormalizeResource(entry.resource()); + normalized_entry->set_quantity(entry.quantity()); + } + return normalized; +} + +bool ResourceUtil::IsResourceAllocationNormalized( + const ResourceAllocation& allocation) const { + if (!VerifyFunctionInternal([&]() { return VerifyValidity(allocation); }, + DCHECKFailOption::kDoDCHECKFail) + .ok()) { + return false; + } + + for (const auto& entry : allocation.resource_quantities()) { + if (entry.quantity() == 0) { + return false; + } + if (!IsResourceNormalized(entry.resource())) { + return false; + } + } + return true; +} + bool ResourceUtil::IsBoundNormalized( const ResourceAllocation& allocation) const { DCHECK(IsNormalized(allocation)); diff --git a/tensorflow_serving/resources/resource_util.h b/tensorflow_serving/resources/resource_util.h index 1bb56bbead9..09c40564231 100644 --- a/tensorflow_serving/resources/resource_util.h +++ b/tensorflow_serving/resources/resource_util.h @@ -165,6 +165,14 @@ class ResourceUtil { ResourceAllocation Min(const ResourceAllocation& lhs, const ResourceAllocation& rhs) const; + // The implementation of ResourceUtil::Normalize(). + // Converts 'allocation' to normal form, meaning: + // 1. It has no entries with quantity 0. + // 2. Resources of a device that has exactly one instance are bound to that + // instance. + ResourceAllocation NormalizeResourceAllocation( + const ResourceAllocation& allocation) const; + private: enum class DCHECKFailOption { kDoDCHECKFail, kDoNotDCHECKFail }; @@ -222,6 +230,10 @@ class ResourceUtil { ResourceAllocation MinNormalized(const ResourceAllocation& lhs, const ResourceAllocation& rhs) const; + // The implementation of ResourceUtil::IsNormalized(). + bool IsResourceAllocationNormalized( + const ResourceAllocation& allocation) const; + const std::map devices_; TF_DISALLOW_COPY_AND_ASSIGN(ResourceUtil); From 4de142c652756e2774f2ec50d94859dad74c596e Mon Sep 17 00:00:00 2001 From: Hongmin Fan Date: Wed, 9 Mar 2022 18:52:55 -0800 Subject: [PATCH 5845/8103] Internal changes only. PiperOrigin-RevId: 433631632 --- tensorflow_serving/model_servers/BUILD | 58 +++++++++++++-- .../model_servers/http_rest_api_handler.cc | 11 +-- .../model_servers/http_rest_api_handler.h | 14 ++-- .../http_rest_api_handler_base.h | 73 +++++++++++++++++++ .../http_rest_api_handler_test.cc | 8 +- .../model_servers/http_server.cc | 12 +-- .../model_servers/prediction_service_impl.cc | 8 -- .../model_servers/prediction_service_impl.h | 12 +-- .../model_servers/prediction_service_util.cc | 30 ++++++++ .../model_servers/prediction_service_util.h | 40 ++++++++++ tensorflow_serving/model_servers/server.cc | 18 +++-- tensorflow_serving/model_servers/server.h | 2 +- .../model_servers/server_init.cc | 63 ++++++++++++++++ .../model_servers/server_init.h | 68 +++++++++++++++++ 14 files changed, 363 insertions(+), 54 deletions(-) create mode 100644 tensorflow_serving/model_servers/http_rest_api_handler_base.h create mode 100644 tensorflow_serving/model_servers/prediction_service_util.cc create mode 100644 tensorflow_serving/model_servers/prediction_service_util.h create mode 100644 tensorflow_serving/model_servers/server_init.cc create mode 100644 tensorflow_serving/model_servers/server_init.h diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 51e92e4dc0e..8f44517865d 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -183,6 +183,7 @@ cc_test( ":model_platform_types", ":platform_config_util", ":server_core", + ":server_init", "//tensorflow_serving/core:availability_preserving_policy", "//tensorflow_serving/core/test_util:test_main", "//tensorflow_serving/servables/tensorflow:saved_model_bundle_source_adapter_cc_proto", @@ -214,28 +215,34 @@ cc_library( ], ) +cc_library( + name = "prediction_service_util", + srcs = ["prediction_service_util.cc"], + hdrs = ["prediction_service_util.h"], + deps = [ + ":server_core", + "//tensorflow_serving/apis:prediction_service_cc_proto", + "//tensorflow_serving/servables/tensorflow:thread_pool_factory", + ], +) + cc_library( name = "prediction_service_impl", srcs = ["prediction_service_impl.cc"], hdrs = ["prediction_service_impl.h"], deps = [ ":grpc_status_util", - ":server_core", - "//tensorflow_serving/apis:classification_cc_proto", - "//tensorflow_serving/apis:get_model_metadata_cc_proto", - "//tensorflow_serving/apis:inference_cc_proto", - "//tensorflow_serving/apis:predict_cc_proto", + ":prediction_service_util", "//tensorflow_serving/apis:prediction_service_cc_proto", - "//tensorflow_serving/apis:regression_cc_proto", "//tensorflow_serving/servables/tensorflow:classification_service", "//tensorflow_serving/servables/tensorflow:get_model_metadata_impl", "//tensorflow_serving/servables/tensorflow:multi_inference_helper", "//tensorflow_serving/servables/tensorflow:predict_impl", "//tensorflow_serving/servables/tensorflow:regression_service", "//tensorflow_serving/servables/tensorflow:thread_pool_factory", + "//tensorflow_serving/servables/tensorflow:util", "@com_github_grpc_grpc//:grpc++", "@org_tensorflow//tensorflow/core:lib", - "@org_tensorflow//tensorflow/core:protos_all_cc", ], ) @@ -255,13 +262,17 @@ cc_library( hdrs = ["http_server.h"], deps = [ ":http_rest_api_handler", + ":http_rest_api_util", ":server_core", + ":server_init", "//tensorflow_serving/config:monitoring_config_cc_proto", + "//tensorflow_serving/servables/tensorflow:util", "//tensorflow_serving/util:prometheus_exporter", "//tensorflow_serving/util:threadpool_executor", "//tensorflow_serving/util/net_http/server/public:http_server", "//tensorflow_serving/util/net_http/server/public:http_server_api", "@com_google_absl//absl/strings", + "@com_google_absl//absl/strings:str_format", "@com_googlesource_code_re2//:re2", "@org_tensorflow//tensorflow/core:lib", ], @@ -296,6 +307,15 @@ cc_test( ], ) +cc_library( + name = "http_rest_api_handler_base", + hdrs = ["http_rest_api_handler_base.h"], + deps = [ + "@com_google_absl//absl/strings", + "@org_tensorflow//tensorflow/core:lib", + ], +) + cc_library( name = "http_rest_api_handler", srcs = ["http_rest_api_handler.cc"], @@ -303,6 +323,7 @@ cc_library( visibility = ["//visibility:public"], deps = [ ":get_model_status_impl", + ":http_rest_api_handler_base", ":http_rest_api_util", ":server_core", "//tensorflow_serving/apis:model_cc_proto", @@ -333,6 +354,27 @@ SUPPORTED_TENSORFLOW_OPS = if_v2([]) + if_not_v2([ "@org_tensorflow_text//tensorflow_text:ops_lib", ] +cc_library( + name = "server_init", + srcs = [ + "server_init.cc", + ], + hdrs = ["server_init.h"], + deps = [ + ":http_rest_api_handler", + ":http_rest_api_handler_base", + ":platform_config_util", + ":prediction_service_impl", + ":server_core", + "//tensorflow_serving/apis:prediction_service_cc_proto", + "//tensorflow_serving/servables/tensorflow:saved_model_bundle_source_adapter", + "//tensorflow_serving/servables/tensorflow:session_bundle_config_cc_proto", + "@com_github_grpc_grpc//:grpc++", + "@com_google_protobuf//:cc_wkt_protos", + "@org_tensorflow//tensorflow/core:lib", + ], +) + cc_library( name = "server_lib", srcs = [ @@ -342,8 +384,8 @@ cc_library( visibility = ["//visibility:public"], deps = [ ":http_server", + ":server_init", ":model_platform_types", - ":platform_config_util", ":prediction_service_impl", ":server_core", ":grpc_status_util", diff --git a/tensorflow_serving/model_servers/http_rest_api_handler.cc b/tensorflow_serving/model_servers/http_rest_api_handler.cc index 68f6dc1123f..1577ef7fdd0 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler.cc +++ b/tensorflow_serving/model_servers/http_rest_api_handler.cc @@ -51,11 +51,12 @@ using tensorflow::serving::TensorflowPredictor; const char* const HttpRestApiHandler::kPathRegex = kHTTPRestApiHandlerPathRegex; -HttpRestApiHandler::HttpRestApiHandler(const RunOptions& run_options, - ServerCore* core) - : run_options_(run_options), - core_(core), - predictor_(new TensorflowPredictor()) {} +HttpRestApiHandler::HttpRestApiHandler(int timeout_in_ms, ServerCore* core) + : run_options_(), core_(core), predictor_(new TensorflowPredictor()) { + if (timeout_in_ms > 0) { + run_options_.set_timeout_in_ms(timeout_in_ms); + } +} HttpRestApiHandler::~HttpRestApiHandler() {} diff --git a/tensorflow_serving/model_servers/http_rest_api_handler.h b/tensorflow_serving/model_servers/http_rest_api_handler.h index edd991d60d5..c3d80dfb0bf 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler.h +++ b/tensorflow_serving/model_servers/http_rest_api_handler.h @@ -26,6 +26,7 @@ limitations under the License. #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/protobuf/config.pb.h" #include "tensorflow/core/protobuf/meta_graph.pb.h" +#include "tensorflow_serving/model_servers/http_rest_api_handler_base.h" namespace tensorflow { @@ -60,19 +61,19 @@ class ModelSpec; // method. // // This class is thread safe. -class HttpRestApiHandler { +class HttpRestApiHandler : public HttpRestApiHandlerBase { public: // Returns a regex that captures all API paths handled by this handler. // Typical use of this method is to register request paths with underlying // HTTP server, so incoming requests can be forwarded to this handler. static const char* const kPathRegex; - // API calls are configured to timeout after `run_optons.timeout_in_ms`. + // API calls are configured to timeout after `timeout_in_ms`. // `core` is not owned and is expected to outlive HttpRestApiHandler // instance. - HttpRestApiHandler(const RunOptions& run_options, ServerCore* core); + HttpRestApiHandler(int timeout_in_ms, ServerCore* core); - ~HttpRestApiHandler(); + ~HttpRestApiHandler() override; // Process a HTTP request. // @@ -82,7 +83,8 @@ class HttpRestApiHandler { const absl::string_view request_path, const absl::string_view request_body, std::vector>* headers, - string* model_name, string* method, string* output); + string* model_name, string* method, + string* output) override; private: Status ProcessClassifyRequest( @@ -113,7 +115,7 @@ class HttpRestApiHandler { Status GetInfoMap(const ModelSpec& model_spec, const string& signature_name, ::google::protobuf::Map* infomap); - const RunOptions run_options_; + RunOptions run_options_; ServerCore* core_; std::unique_ptr predictor_; }; diff --git a/tensorflow_serving/model_servers/http_rest_api_handler_base.h b/tensorflow_serving/model_servers/http_rest_api_handler_base.h new file mode 100644 index 00000000000..e9698f4316f --- /dev/null +++ b/tensorflow_serving/model_servers/http_rest_api_handler_base.h @@ -0,0 +1,73 @@ +/* Copyright 2022 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_SERVING_MODEL_SERVERS_HTTP_REST_API_HANDLER_BASE_H_ +#define TENSORFLOW_SERVING_MODEL_SERVERS_HTTP_REST_API_HANDLER_BASE_H_ + +#include +#include +#include +#include + +#include "absl/strings/string_view.h" +#include "tensorflow/core/lib/core/status.h" + +namespace tensorflow { +namespace serving { + +// Base class of HttpRestApiHandler classes that handles HTTP/REST APIs of TF +// serving. +// +// Currently supported APIs are as follows: +// +// o Inference - Classify/Regress/Predict +// +// POST /v1/models/:(classify|regress) +// POST /v1/models//versions/:(classify|regress) +// +// o Model status +// +// GET /v1/models/ (status of all versions) +// GET /v1/models//versions/ (status of specific version) +// +// The API is documented here: +// tensorflow_serving/g3doc/api_rest.md +// +// Users of this class should typically create one instance of it at process +// startup, register paths defined by kPathRegex with the in-process HTTP +// server, and when a request arrives, forward the request to ProcessRequest() +// method. +// +// This class is thread safe. +class HttpRestApiHandlerBase { + public: + virtual ~HttpRestApiHandlerBase() = default; + + // Process a HTTP request. + // + // In case of errors, the `headers` and `output` are still relevant as they + // contain detailed error messages, that can be relayed back to the client. + virtual Status ProcessRequest(const absl::string_view http_method, + const absl::string_view request_path, + const absl::string_view request_body, + std::vector>* headers, + string* model_name, string* method, + string* output) = 0; +}; + +} // namespace serving +} // namespace tensorflow + +#endif // TENSORFLOW_SERVING_MODEL_SERVERS_HTTP_REST_API_HANDLER_BASE_H_ diff --git a/tensorflow_serving/model_servers/http_rest_api_handler_test.cc b/tensorflow_serving/model_servers/http_rest_api_handler_test.cc index fe14cd77479..60843307d1e 100644 --- a/tensorflow_serving/model_servers/http_rest_api_handler_test.cc +++ b/tensorflow_serving/model_servers/http_rest_api_handler_test.cc @@ -37,6 +37,7 @@ limitations under the License. #include "tensorflow_serving/model_servers/model_platform_types.h" #include "tensorflow_serving/model_servers/platform_config_util.h" #include "tensorflow_serving/model_servers/server_core.h" +#include "tensorflow_serving/model_servers/server_init.h" #include "tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter.pb.h" #include "tensorflow_serving/servables/tensorflow/session_bundle_config.pb.h" #include "tensorflow_serving/test_util/test_util.h" @@ -75,7 +76,7 @@ class HttpRestApiHandlerTest : public ::testing::Test { static void TearDownTestSuite() { server_core_.reset(); } protected: - HttpRestApiHandlerTest() : handler_(RunOptions(), GetServerCore()) {} + HttpRestApiHandlerTest() : handler_(/*timeout_in_ms=*/-1, GetServerCore()) {} static Status CreateServerCore(std::unique_ptr* server_core) { ModelServerConfig config; @@ -94,8 +95,9 @@ class HttpRestApiHandlerTest : public ::testing::Test { ServerCore::Options options; options.model_server_config = config; - options.platform_config_map = - CreateTensorFlowPlatformConfigMap(SessionBundleConfig()); + TF_RETURN_IF_ERROR( + tensorflow::serving::init::SetupPlatformConfigMapForTensorFlow( + SessionBundleConfig(), options.platform_config_map)); // Reduce the number of initial load threads to be num_load_threads to avoid // timing out in tests. options.num_initial_load_threads = options.num_load_threads; diff --git a/tensorflow_serving/model_servers/http_server.cc b/tensorflow_serving/model_servers/http_server.cc index 48e9abb8119..b1e9727c2b8 100644 --- a/tensorflow_serving/model_servers/http_server.cc +++ b/tensorflow_serving/model_servers/http_server.cc @@ -27,6 +27,7 @@ limitations under the License. #include "tensorflow_serving/model_servers/http_rest_api_handler.h" #include "tensorflow_serving/model_servers/http_rest_api_util.h" #include "tensorflow_serving/model_servers/server_core.h" +#include "tensorflow_serving/model_servers/server_init.h" #include "tensorflow_serving/servables/tensorflow/util.h" #include "tensorflow_serving/util/net_http/server/public/httpserver.h" #include "tensorflow_serving/util/net_http/server/public/response_code_enum.h" @@ -127,11 +128,10 @@ class RequestExecutor final : public net_http::EventExecutor { class RestApiRequestDispatcher { public: RestApiRequestDispatcher(int timeout_in_ms, ServerCore* core) - : regex_(HttpRestApiHandler::kPathRegex), core_(core) { - RunOptions run_options = RunOptions(); - run_options.set_timeout_in_ms(timeout_in_ms); - handler_.reset(new HttpRestApiHandler(run_options, core)); - } + : regex_(HttpRestApiHandler::kPathRegex), + core_(core), + handler_(tensorflow::serving::init::CreateHttpRestApiHandler( + timeout_in_ms, core)) {} net_http::RequestHandler Dispatch(net_http::ServerRequestInterface* req) { if (RE2::FullMatch(string(req->uri_path()), regex_)) { @@ -199,8 +199,8 @@ class RestApiRequestDispatcher { } const RE2 regex_; - std::unique_ptr handler_; ServerCore* core_; + std::unique_ptr handler_; }; } // namespace diff --git a/tensorflow_serving/model_servers/prediction_service_impl.cc b/tensorflow_serving/model_servers/prediction_service_impl.cc index 2ecb3aa66b8..0fa521fd694 100644 --- a/tensorflow_serving/model_servers/prediction_service_impl.cc +++ b/tensorflow_serving/model_servers/prediction_service_impl.cc @@ -16,13 +16,11 @@ limitations under the License. #include "tensorflow_serving/model_servers/prediction_service_impl.h" #include "grpc/grpc.h" -#include "tensorflow/core/platform/threadpool_options.h" #include "tensorflow_serving/model_servers/grpc_status_util.h" #include "tensorflow_serving/servables/tensorflow/classification_service.h" #include "tensorflow_serving/servables/tensorflow/get_model_metadata_impl.h" #include "tensorflow_serving/servables/tensorflow/multi_inference_helper.h" #include "tensorflow_serving/servables/tensorflow/regression_service.h" -#include "tensorflow_serving/servables/tensorflow/thread_pool_factory.h" #include "tensorflow_serving/servables/tensorflow/util.h" namespace tensorflow { @@ -30,12 +28,6 @@ namespace serving { namespace { -int DeadlineToTimeoutMillis(const gpr_timespec deadline) { - return gpr_time_to_millis( - gpr_time_sub(gpr_convert_clock_type(deadline, GPR_CLOCK_MONOTONIC), - gpr_now(GPR_CLOCK_MONOTONIC))); -} - ScopedThreadPools GetThreadPools(ThreadPoolFactory *thread_pool_factory) { return thread_pool_factory == nullptr ? ScopedThreadPools() : thread_pool_factory->GetThreadPools(); diff --git a/tensorflow_serving/model_servers/prediction_service_impl.h b/tensorflow_serving/model_servers/prediction_service_impl.h index db89d95b0a9..cad1839e36b 100644 --- a/tensorflow_serving/model_servers/prediction_service_impl.h +++ b/tensorflow_serving/model_servers/prediction_service_impl.h @@ -17,23 +17,15 @@ limitations under the License. #define TENSORFLOW_SERVING_MODEL_SERVERS_PREDICTION_SERVICE_IMPL_H_ #include "tensorflow_serving/apis/prediction_service.grpc.pb.h" -#include "tensorflow_serving/model_servers/server_core.h" +#include "tensorflow_serving/model_servers/prediction_service_util.h" #include "tensorflow_serving/servables/tensorflow/predict_impl.h" -#include "tensorflow_serving/servables/tensorflow/thread_pool_factory.h" namespace tensorflow { namespace serving { class PredictionServiceImpl final : public PredictionService::Service { public: - // Options for configuring a PredictionServiceImpl object. - struct Options { - ServerCore* server_core; - bool enforce_session_run_timeout; - ThreadPoolFactory* thread_pool_factory = nullptr; - }; - - explicit PredictionServiceImpl(const Options& options) + explicit PredictionServiceImpl(const PredictionServiceOptions& options) : core_(options.server_core), predictor_(new TensorflowPredictor(options.thread_pool_factory)), enforce_session_run_timeout_(options.enforce_session_run_timeout), diff --git a/tensorflow_serving/model_servers/prediction_service_util.cc b/tensorflow_serving/model_servers/prediction_service_util.cc new file mode 100644 index 00000000000..c1b502e38d1 --- /dev/null +++ b/tensorflow_serving/model_servers/prediction_service_util.cc @@ -0,0 +1,30 @@ +/* Copyright 2022 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow_serving/model_servers/prediction_service_util.h" + +#include "grpc/grpc.h" + +namespace tensorflow { +namespace serving { + +int DeadlineToTimeoutMillis(const gpr_timespec deadline) { + return gpr_time_to_millis( + gpr_time_sub(gpr_convert_clock_type(deadline, GPR_CLOCK_MONOTONIC), + gpr_now(GPR_CLOCK_MONOTONIC))); +} + +} // namespace serving +} // namespace tensorflow diff --git a/tensorflow_serving/model_servers/prediction_service_util.h b/tensorflow_serving/model_servers/prediction_service_util.h new file mode 100644 index 00000000000..8219e9f865a --- /dev/null +++ b/tensorflow_serving/model_servers/prediction_service_util.h @@ -0,0 +1,40 @@ +/* Copyright 2022 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_SERVING_MODEL_SERVERS_PREDICTION_SERVICE_UTIL_H_ +#define TENSORFLOW_SERVING_MODEL_SERVERS_PREDICTION_SERVICE_UTIL_H_ + +#include "tensorflow_serving/apis/prediction_service.grpc.pb.h" +#include "tensorflow_serving/model_servers/server_core.h" +#include "tensorflow_serving/servables/tensorflow/thread_pool_factory.h" + +namespace tensorflow { +namespace serving { + +// Options for configuring a PredictionServiceBase object. +struct PredictionServiceOptions { + ServerCore* server_core; + bool enforce_session_run_timeout; + ThreadPoolFactory* thread_pool_factory = nullptr; +}; + +// Convert the request deadline represented in absolute time point into number +// of milliseconds from now. +int DeadlineToTimeoutMillis(const gpr_timespec deadline); + +} // namespace serving +} // namespace tensorflow + +#endif // TENSORFLOW_SERVING_MODEL_SERVERS_PREDICTION_SERVICE_UTIL_H_ diff --git a/tensorflow_serving/model_servers/server.cc b/tensorflow_serving/model_servers/server.cc index 0d3c76750e5..87174b8e4f7 100644 --- a/tensorflow_serving/model_servers/server.cc +++ b/tensorflow_serving/model_servers/server.cc @@ -47,8 +47,8 @@ limitations under the License. #include "tensorflow_serving/core/availability_preserving_policy.h" #include "tensorflow_serving/model_servers/grpc_status_util.h" #include "tensorflow_serving/model_servers/model_platform_types.h" -#include "tensorflow_serving/model_servers/platform_config_util.h" #include "tensorflow_serving/model_servers/server_core.h" +#include "tensorflow_serving/model_servers/server_init.h" #include "tensorflow_serving/servables/tensorflow/session_bundle_config.pb.h" #include "tensorflow_serving/servables/tensorflow/thread_pool_factory_config.pb.h" #include "tensorflow_serving/servables/tensorflow/util.h" @@ -300,11 +300,16 @@ Status Server::BuildAndStart(const Options& server_options) { session_bundle_config.set_num_tflite_interpreters_per_pool( server_options.num_tflite_interpreters_per_pool); session_bundle_config.set_num_tflite_pools(server_options.num_tflite_pools); - options.platform_config_map = - CreateTensorFlowPlatformConfigMap(session_bundle_config); + + TF_RETURN_IF_ERROR( + tensorflow::serving::init::SetupPlatformConfigMapForTensorFlow( + session_bundle_config, options.platform_config_map)); } else { TF_RETURN_IF_ERROR(ParseProtoTextFile( server_options.platform_config_file, &options.platform_config_map)); + TF_RETURN_IF_ERROR( + tensorflow::serving::init::UpdatePlatformConfigMapForTensorFlow( + options.platform_config_map)); } options.custom_model_config_loader = &LoadCustomModelConfig; @@ -349,7 +354,7 @@ Status Server::BuildAndStart(const Options& server_options) { "0.0.0.0:" + std::to_string(server_options.grpc_port); model_service_ = absl::make_unique(server_core_.get()); - PredictionServiceImpl::Options predict_server_options; + PredictionServiceOptions predict_server_options; predict_server_options.server_core = server_core_.get(); predict_server_options.enforce_session_run_timeout = server_options.enforce_session_run_timeout; @@ -363,9 +368,8 @@ Status Server::BuildAndStart(const Options& server_options) { &thread_pool_factory_)); } predict_server_options.thread_pool_factory = thread_pool_factory_.get(); - prediction_service_ = - absl::make_unique(predict_server_options); - + prediction_service_ = tensorflow::serving::init::CreatePredictionService( + predict_server_options); ::grpc::ServerBuilder builder; // If defined, listen to a tcp port for gRPC/HTTP. diff --git a/tensorflow_serving/model_servers/server.h b/tensorflow_serving/model_servers/server.h index ed15e153871..bf94070380f 100644 --- a/tensorflow_serving/model_servers/server.h +++ b/tensorflow_serving/model_servers/server.h @@ -123,7 +123,7 @@ class Server { std::unique_ptr server_core_; std::unique_ptr model_service_; - std::unique_ptr prediction_service_; + std::unique_ptr prediction_service_; std::unique_ptr profiler_service_; std::unique_ptr<::grpc::Server> grpc_server_; std::unique_ptr http_server_; diff --git a/tensorflow_serving/model_servers/server_init.cc b/tensorflow_serving/model_servers/server_init.cc new file mode 100644 index 00000000000..f8c0ed318d0 --- /dev/null +++ b/tensorflow_serving/model_servers/server_init.cc @@ -0,0 +1,63 @@ +/* Copyright 2022 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow_serving/model_servers/server_init.h" + +#include "tensorflow_serving/model_servers/http_rest_api_handler.h" +#include "tensorflow_serving/model_servers/platform_config_util.h" +#include "tensorflow_serving/model_servers/prediction_service_impl.h" +#include "tensorflow_serving/servables/tensorflow/saved_model_bundle_source_adapter.h" + +namespace tensorflow { +namespace serving { +namespace init { + +Status SetupPlatformConfigMapForTensorFlowImpl( + const SessionBundleConfig& session_bundle_config, + PlatformConfigMap& platform_config_map) { + platform_config_map = + CreateTensorFlowPlatformConfigMap(session_bundle_config); + return tensorflow::Status::OK(); +} + +Status UpdatePlatformConfigMapForTensorFlowImpl( + PlatformConfigMap& platform_config_map) { + return tensorflow::Status::OK(); +} + +std::unique_ptr CreateHttpRestApiHandlerImpl( + int timeout_in_ms, ServerCore* core) { + return absl::make_unique(timeout_in_ms, core); +} + +std::unique_ptr CreatePredictionServiceImpl( + const PredictionServiceOptions& options) { + return absl::make_unique(options); +} + +ABSL_CONST_INIT SetupPlatformConfigMapForTensorFlowFnType + SetupPlatformConfigMapForTensorFlow = + SetupPlatformConfigMapForTensorFlowImpl; +ABSL_CONST_INIT UpdatePlatformConfigMapForTensorFlowFnType + UpdatePlatformConfigMapForTensorFlow = + UpdatePlatformConfigMapForTensorFlowImpl; +ABSL_CONST_INIT CreateHttpRestApiHandlerFnType CreateHttpRestApiHandler = + CreateHttpRestApiHandlerImpl; +ABSL_CONST_INIT CreatePredictionServiceFnType CreatePredictionService = + CreatePredictionServiceImpl; + +} // namespace init +} // namespace serving +} // namespace tensorflow diff --git a/tensorflow_serving/model_servers/server_init.h b/tensorflow_serving/model_servers/server_init.h new file mode 100644 index 00000000000..2a9f1b313be --- /dev/null +++ b/tensorflow_serving/model_servers/server_init.h @@ -0,0 +1,68 @@ +/* Copyright 2022 Google Inc. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef THIRD_PARTY_TENSORFLOW_SERVING_MODEL_SERVERS_SERVER_INIT_H_ +#define THIRD_PARTY_TENSORFLOW_SERVING_MODEL_SERVERS_SERVER_INIT_H_ + +#include "google/protobuf/any.pb.h" +#include "tensorflow/core/lib/core/status.h" +#include "tensorflow_serving/apis/prediction_service.grpc.pb.h" +#include "tensorflow_serving/model_servers/http_rest_api_handler_base.h" +#include "tensorflow_serving/model_servers/prediction_service_util.h" +#include "tensorflow_serving/model_servers/server_core.h" +#include "tensorflow_serving/servables/tensorflow/session_bundle_config.pb.h" + +namespace tensorflow { +namespace serving { +namespace init { + +using SetupPlatformConfigMapForTensorFlowFnType = + Status (*)(const SessionBundleConfig&, PlatformConfigMap&); +using UpdatePlatformConfigMapForTensorFlowFnType = + Status (*)(PlatformConfigMap&); +using CreateHttpRestApiHandlerFnType = + std::unique_ptr (*)(int, ServerCore*); +using CreatePredictionServiceFnType = + std::unique_ptr (*)( + const PredictionServiceOptions&); + +Status SetupPlatformConfigMapImpl(const SessionBundleConfig&, + PlatformConfigMap&); +Status SetupPlatformConfigMapFromConfigFileImpl(const string&, + PlatformConfigMap&); +std::unique_ptr CreateHttpRestApiHandlerImpl( + int, ServerCore*); +std::unique_ptr CreatePredictionServiceImpl( + const PredictionServiceOptions&); + +// Setup the 'TensorFlow' PlatformConfigMap from the specified +// SessionBundleConfig. +extern SetupPlatformConfigMapForTensorFlowFnType + SetupPlatformConfigMapForTensorFlow; +// If the PlatformConfigMap contains the config for the 'TensorFlow' platform, +// update the PlatformConfigMap when necessary. +extern UpdatePlatformConfigMapForTensorFlowFnType + UpdatePlatformConfigMapForTensorFlow; +// Create an HttpRestApiHandler object that handles HTTP/REST request APIs for +// serving. +extern CreateHttpRestApiHandlerFnType CreateHttpRestApiHandler; +// Create a PredictionService object that handles gRPC request APIs for serving. +extern CreatePredictionServiceFnType CreatePredictionService; + +} // namespace init +} // namespace serving +} // namespace tensorflow + +#endif // THIRD_PARTY_TENSORFLOW_SERVING_MODEL_SERVERS_SERVER_INIT_H_ From 4786b76785e0d91d20a720ceafda8808a8494eb4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 10 Mar 2022 22:48:56 -0800 Subject: [PATCH 5846/8103] clean up deprecated fields PiperOrigin-RevId: 433934361 --- .../file_system_storage_path_source.proto | 11 ++--- .../servables/tensorflow/simple_servers.cc | 5 ++- .../file_system_storage_path_source.cc | 42 +++++++------------ .../file_system_storage_path_source_test.cc | 36 ++++++++++------ 4 files changed, 45 insertions(+), 49 deletions(-) diff --git a/tensorflow_serving/config/file_system_storage_path_source.proto b/tensorflow_serving/config/file_system_storage_path_source.proto index add7aa2a28e..6924fe44926 100644 --- a/tensorflow_serving/config/file_system_storage_path_source.proto +++ b/tensorflow_serving/config/file_system_storage_path_source.proto @@ -16,8 +16,7 @@ message FileSystemStoragePathSourceConfig { } // Serve all versions found on disk. - message All { - } + message All {} // Serve a specific version (or set of versions). // @@ -56,12 +55,6 @@ message FileSystemStoragePathSourceConfig { // The servables to monitor for new versions, and aspire. repeated ServableToMonitor servables = 5; - // A single servable name/base_path pair to monitor. - // DEPRECATED: Use 'servables' instead. - // TODO(b/30898016): Stop using these fields, and ultimately remove them here. - string servable_name = 1 [deprecated = true]; - string base_path = 2 [deprecated = true]; - // How long to wait between file-system polling to look for children of // 'base_path', in seconds. // @@ -85,4 +78,6 @@ message FileSystemStoragePathSourceConfig { // contain at least one version under the base path. In addition, if a polling // loop find the base path empty, it will not unload existing servables. bool servable_versions_always_present = 6; + + reserved 1, 2; } diff --git a/tensorflow_serving/servables/tensorflow/simple_servers.cc b/tensorflow_serving/servables/tensorflow/simple_servers.cc index d54bcaee4ce..b9798538915 100644 --- a/tensorflow_serving/servables/tensorflow/simple_servers.cc +++ b/tensorflow_serving/servables/tensorflow/simple_servers.cc @@ -47,9 +47,10 @@ Status CreateStoragePathSource( const string& base_path, const string& servable_name, std::unique_ptr>* path_source) { FileSystemStoragePathSourceConfig config; - config.set_servable_name(servable_name); - config.set_base_path(base_path); config.set_file_system_poll_wait_seconds(1); + auto* servable = config.add_servables(); + servable->set_servable_name(servable_name); + servable->set_base_path(base_path); std::unique_ptr file_system_source; TF_RETURN_IF_ERROR( diff --git a/tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc b/tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc index 7c755b3457d..a14b1a2449a 100644 --- a/tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc +++ b/tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc @@ -38,24 +38,8 @@ FileSystemStoragePathSource::~FileSystemStoragePathSource() { namespace { -// Converts any deprecated usage in 'config' into equivalent non-deprecated use. -// TODO(b/30898016): Eliminate this once the deprecated fields are gone. -FileSystemStoragePathSourceConfig NormalizeConfig( - const FileSystemStoragePathSourceConfig& config) { - FileSystemStoragePathSourceConfig normalized = config; - if (!normalized.servable_name().empty() || !normalized.base_path().empty()) { - FileSystemStoragePathSourceConfig::ServableToMonitor* servable = - normalized.add_servables(); - servable->set_servable_name(normalized.servable_name()); - servable->set_base_path(normalized.base_path()); - normalized.clear_servable_name(); - normalized.clear_base_path(); - } - return normalized; -} - // Returns the names of servables that appear in 'old_config' but not in -// 'new_config'. Assumes both configs are normalized. +// 'new_config'. std::set GetDeletedServables( const FileSystemStoragePathSourceConfig& old_config, const FileSystemStoragePathSourceConfig& new_config) { @@ -298,13 +282,21 @@ Status FailIfZeroVersions(const FileSystemStoragePathSourceConfig& config) { versions_by_servable_name; TF_RETURN_IF_ERROR( PollFileSystemForConfig(config, &versions_by_servable_name)); + + std::map servable_name_to_base_path_map; + for (const FileSystemStoragePathSourceConfig::ServableToMonitor& servable : + config.servables()) { + servable_name_to_base_path_map.insert( + {servable.servable_name(), servable.base_path()}); + } + for (const auto& entry : versions_by_servable_name) { const string& servable = entry.first; const std::vector>& versions = entry.second; if (versions.empty()) { return errors::NotFound( "Unable to find a numerical version path for servable ", servable, - " at: ", config.base_path()); + " at: ", servable_name_to_base_path_map[servable]); } } return Status::OK(); @@ -330,19 +322,15 @@ Status FileSystemStoragePathSource::UpdateConfig( "Changing file_system_poll_wait_seconds is not supported"); } - const FileSystemStoragePathSourceConfig normalized_config = - NormalizeConfig(config); - - if (normalized_config.fail_if_zero_versions_at_startup() || // NOLINT - normalized_config.servable_versions_always_present()) { - TF_RETURN_IF_ERROR(FailIfZeroVersions(normalized_config)); + if (config.fail_if_zero_versions_at_startup() || // NOLINT + config.servable_versions_always_present()) { + TF_RETURN_IF_ERROR(FailIfZeroVersions(config)); } if (aspired_versions_callback_) { - TF_RETURN_IF_ERROR( - UnaspireServables(GetDeletedServables(config_, normalized_config))); + TF_RETURN_IF_ERROR(UnaspireServables(GetDeletedServables(config_, config))); } - config_ = normalized_config; + config_ = config; return Status::OK(); } diff --git a/tensorflow_serving/sources/storage_path/file_system_storage_path_source_test.cc b/tensorflow_serving/sources/storage_path/file_system_storage_path_source_test.cc index 5675292260f..53cbbdf7983 100644 --- a/tensorflow_serving/sources/storage_path/file_system_storage_path_source_test.cc +++ b/tensorflow_serving/sources/storage_path/file_system_storage_path_source_test.cc @@ -83,8 +83,10 @@ TEST(FileSystemStoragePathSourceTest, NoVersionsAtStartup) { for (bool fail_if_zero_versions_at_startup : {false, true}) { auto config = test_util::CreateProto( - strings::Printf("servable_name: 'test_servable_name' " - "base_path: '%s' " + strings::Printf("servables: {" + " servable_name: 'test_servable_name' " + " base_path: '%s' " + "} " "fail_if_zero_versions_at_startup: %s " // Disable the polling thread. "file_system_poll_wait_seconds: -1 ", @@ -121,8 +123,10 @@ TEST(FileSystemStoragePathSourceTest, FilesAppearAfterStartup) { io::JoinPath(testing::TmpDir(), "FilesAppearAfterStartup"); auto config = test_util::CreateProto( - strings::Printf("servable_name: 'test_servable_name' " - "base_path: '%s' " + strings::Printf("servables: {" + " servable_name: 'test_servable_name' " + " base_path: '%s' " + "} " "fail_if_zero_versions_at_startup: false " // Disable the polling thread. "file_system_poll_wait_seconds: -1 ", @@ -158,8 +162,10 @@ TEST(FileSystemStoragePathSourceTest, MultipleVersions) { TF_ASSERT_OK(Env::Default()->CreateDir(io::JoinPath(base_path, "17"))); auto config = test_util::CreateProto( - strings::Printf("servable_name: 'test_servable_name' " - "base_path: '%s' " + strings::Printf("servables: {" + " servable_name: 'test_servable_name' " + " base_path: '%s' " + "} " // Disable the polling thread. "file_system_poll_wait_seconds: -1 ", base_path.c_str())); @@ -705,8 +711,10 @@ TEST(FileSystemStoragePathSourceTest, DuplicateVersions) { } auto config = test_util::CreateProto( - strings::Printf("servable_name: 'test_servable_name' " - "base_path: '%s' " + strings::Printf("servables: {" + " servable_name: 'test_servable_name' " + " base_path: '%s' " + "} " // Disable the polling thread. "file_system_poll_wait_seconds: -1 ", base_path.c_str())); @@ -742,8 +750,10 @@ TEST(FileSystemStoragePathSourceTest, LastVersionNotRemoved) { Env::Default()->RecursivelyCreateDir(io::JoinPath(base_path, "42"))); auto config = test_util::CreateProto( - strings::Printf("servable_name: 'test_servable_name' " - "base_path: '%s' " + strings::Printf("servables: {" + " servable_name: 'test_servable_name' " + " base_path: '%s' " + "} " "servable_versions_always_present: %s " // Disable the polling thread. "file_system_poll_wait_seconds: -1 ", @@ -782,8 +792,10 @@ TEST(FileSystemStoragePathSourceTest, LastVersionNotRemoved) { TEST(FileSystemStoragePathSourceTest, PollFilesystemOnlyOnce) { const string base_path = io::JoinPath(testing::TmpDir(), "OneShot"); auto config = test_util::CreateProto( - strings::Printf("servable_name: 'test_servable_name' " - "base_path: '%s' " + strings::Printf("servables: {" + " servable_name: 'test_servable_name' " + " base_path: '%s' " + "} " "fail_if_zero_versions_at_startup: false " // Poll only once (One shot mode). "file_system_poll_wait_seconds: 0 ", From a3ed3832cbd66c57d878c8757999fdae749b1b1e Mon Sep 17 00:00:00 2001 From: Dero Gharibian Date: Mon, 14 Mar 2022 10:09:22 -0700 Subject: [PATCH 5847/8103] Added test for WrapSessionIgnoreThreadPoolOptions PiperOrigin-RevId: 434496028 --- .../tensorflow/bundle_factory_test_util.cc | 6 ++- .../tensorflow/bundle_factory_util.h | 1 - .../tensorflow/bundle_factory_util_test.cc | 37 +++++++++++++++++++ 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_test_util.cc b/tensorflow_serving/servables/tensorflow/bundle_factory_test_util.cc index 3964521a442..bde4dbc5183 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_test_util.cc +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_test_util.cc @@ -22,6 +22,7 @@ limitations under the License. #include "tensorflow/core/lib/core/status_test_util.h" #include "tensorflow/core/lib/io/path.h" #include "tensorflow/core/platform/env.h" +#include "tensorflow/core/platform/threadpool_options.h" #include "tensorflow_serving/resources/resource_values.h" #include "tensorflow_serving/test_util/test_util.h" @@ -111,7 +112,10 @@ void TestSingleRequest(Session* session) { const std::vector empty_targets; std::vector outputs; - TF_ASSERT_OK(session->Run(inputs, output_names, empty_targets, &outputs)); + RunMetadata run_metadata; + TF_ASSERT_OK(session->Run(RunOptions{}, inputs, output_names, empty_targets, + &outputs, &run_metadata, + thread::ThreadPoolOptions{})); ASSERT_EQ(1, outputs.size()); const auto& single_output = outputs.at(0); diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_util.h b/tensorflow_serving/servables/tensorflow/bundle_factory_util.h index 8da940e07a9..550ad675702 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_util.h +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_util.h @@ -100,7 +100,6 @@ Status WrapSession(std::unique_ptr* session); // Wraps a session in a new session that only supports Run() without threading // parameters. -// TODO(b/205884936): Add test case. Status WrapSessionIgnoreThreadPoolOptions(std::unique_ptr* session); // Construct Queue Options from BatchingParameters. diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc b/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc index 7cc4eaf8360..3c49502dc22 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc @@ -49,6 +49,36 @@ using test_util::EqualsProto; using Batcher = SharedBatchScheduler; +class MockSession : public Session { + public: + MOCK_METHOD(tensorflow::Status, Create, (const GraphDef& graph), (override)); + MOCK_METHOD(tensorflow::Status, Extend, (const GraphDef& graph), (override)); + MOCK_METHOD(tensorflow::Status, ListDevices, + (std::vector * response), (override)); + MOCK_METHOD(tensorflow::Status, Close, (), (override)); + + Status Run(const RunOptions& run_options, + const std::vector>& inputs, + const std::vector& output_tensor_names, + const std::vector& target_node_names, + std::vector* outputs, RunMetadata* run_metadata) override { + outputs->push_back( + test::AsTensor({100.0f / 2 + 2, 42.0f / 2 + 2}, {2})); + return tensorflow::Status::OK(); + } + + // Unused, but we need to provide a definition (virtual = 0). + Status Run(const std::vector>&, + const std::vector&, const std::vector&, + std::vector* outputs) override { + return errors::Unimplemented( + "Run with threadpool is not supported for this session."); + } + + // NOTE: The default definition for Run(...) with threading options already + // returns errors::Unimplemented. +}; + class BundleFactoryUtilTest : public ::testing::Test { protected: BundleFactoryUtilTest() : export_dir_(test_util::GetTestSavedModelPath()) {} @@ -91,6 +121,13 @@ TEST_F(BundleFactoryUtilTest, WrapSession) { test_util::TestSingleRequest(bundle.session.get()); } +TEST_F(BundleFactoryUtilTest, WrapSessionIgnoreThreadPoolOptions) { + std::unique_ptr session(new MockSession); + + TF_ASSERT_OK(WrapSessionIgnoreThreadPoolOptions(&session)); + test_util::TestSingleRequest(session.get()); +} + TEST_F(BundleFactoryUtilTest, WrapSessionForBatching) { SavedModelBundle bundle; TF_ASSERT_OK(LoadSavedModel(SessionOptions(), RunOptions(), export_dir_, From 48a699a2fd32404c4b19f55077a1fb29112a0afe Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Fri, 18 Mar 2022 11:11:57 -0700 Subject: [PATCH 5848/8103] Allow max_execution_batch_size to be actually used by allowing max_batch_size to be more than max(allowed_batch_sizes). Also sanity check if max_execution_batch_size is max(allowed_batch_sizes). PiperOrigin-RevId: 435685377 --- tensorflow_serving/batching/batching_session.cc | 4 ++-- .../batching/batching_session_test.cc | 15 +++++++++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/tensorflow_serving/batching/batching_session.cc b/tensorflow_serving/batching/batching_session.cc index dc21d7e1629..287921ec89f 100644 --- a/tensorflow_serving/batching/batching_session.cc +++ b/tensorflow_serving/batching/batching_session.cc @@ -1012,13 +1012,13 @@ Status CreateBasicBatchingSession( max_allowed_batch_size, "; expected ", schedule_options.max_batch_size); } - if (schedule_options.max_batch_size != max_allowed_batch_size) { + if (schedule_options.max_execution_batch_size != max_allowed_batch_size) { return errors::InvalidArgument( "Last entry in allowed_batch_sizes must be equal to " "max_execution_batch_size; last " "entry was ", max_allowed_batch_size, "; expected ", - schedule_options.max_batch_size); + schedule_options.max_execution_batch_size); } } else if (allowed_batch_sizes.back() != schedule_options.max_batch_size) { // TODO(b/b/161641195): diff --git a/tensorflow_serving/batching/batching_session_test.cc b/tensorflow_serving/batching/batching_session_test.cc index 4565ea4fc02..9ec9701bb01 100644 --- a/tensorflow_serving/batching/batching_session_test.cc +++ b/tensorflow_serving/batching/batching_session_test.cc @@ -277,7 +277,11 @@ class BatchingSessionTest output_options.enable_lazy_split = enable_lazy_split(); if (enable_large_batch_splitting()) { output_options.split_input_task_func = get_split_input_task_func(); + // Bump up the max batch size, and set execution batch size to the max + // size we actually want -- this will allow us to exercise large batch + // splits (they trigger when execution_batch_size < max_batch_size). output_options.max_execution_batch_size = input_options.max_batch_size; + output_options.max_batch_size = input_options.max_batch_size * 2; } return output_options; } @@ -832,10 +836,13 @@ TEST_P(BatchingSessionTest, BatchingSessionOptions batching_session_options; batching_session_options.allowed_batch_sizes = {2, 8}; // Final entry != 4. std::unique_ptr batching_session; - EXPECT_FALSE(CreateBasicBatchingSession( - schedule_options, batching_session_options, {{"x"}, {"y"}}, - CreateHalfPlusTwoSession(), &batching_session) - .ok()); + auto status = CreateBasicBatchingSession( + schedule_options, batching_session_options, {{"x"}, {"y"}}, + CreateHalfPlusTwoSession(), &batching_session); + EXPECT_EQ(status.code(), error::INVALID_ARGUMENT); + EXPECT_THAT(status.error_message(), HasSubstr(enable_large_batch_splitting() + ? "max_execution_batch_size" + : "max_batch_size")); } TEST_P(BatchingSessionTest, DifferentOrderForInputAndOutputTensors) { From 2837812341e7c98be4717e5901286692a5dcc02a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 3 Apr 2022 22:16:21 -0700 Subject: [PATCH 5849/8103] Delete batch_schedulers_ before thread_pool_name_ PiperOrigin-RevId: 439229205 --- tensorflow_serving/batching/batching_session.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tensorflow_serving/batching/batching_session.cc b/tensorflow_serving/batching/batching_session.cc index 287921ec89f..d816b7950a5 100644 --- a/tensorflow_serving/batching/batching_session.cc +++ b/tensorflow_serving/batching/batching_session.cc @@ -260,15 +260,15 @@ class BatchingSession : public ServingSession { std::unique_ptr> batch); const BatchingSessionOptions options_; + // The name of the thread pool of the underlying batch scheduler. It is used + // for monitoring purpose, and can be empty if not known. + const std::string thread_pool_name_; std::unique_ptr wrapped_; std::unordered_map>, HashTensorSignature, EqTensorSignature> batch_schedulers_; - // The name of the thread pool of the underlying batch scheduler. It is used - // for monitoring purpose, and can be empty if not known. - const std::string thread_pool_name_; // If set, default_scheduler_creator_ is used when the input signature does // not match any existing signature defined during model load. This helps From 1a5e5a1b58372f24c2380320f68d32d28e04cdea Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Apr 2022 12:01:29 -0700 Subject: [PATCH 5850/8103] Internal cleanup. PiperOrigin-RevId: 444628474 --- tensorflow_serving/model_servers/BUILD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 8f44517865d..9afa9842863 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -211,7 +211,6 @@ cc_library( "//tensorflow_serving/apis:model_management_cc_proto", "//tensorflow_serving/apis:model_service_cc_proto", "//tensorflow_serving/util:status_util", - "@com_github_grpc_grpc//:grpc++", ], ) @@ -484,6 +483,7 @@ py_test( python_version = "PY3", srcs_version = "PY2AND3", tags = [ + "manual", # Missing grpc dependency. "noasan", # b/136281879 "nomsan", # b/165917680 ], From c0998e13451b9b83c9bdf157dd3648b2272dac59 Mon Sep 17 00:00:00 2001 From: Guanxin Qiao Date: Mon, 2 May 2022 16:41:59 -0700 Subject: [PATCH 5851/8103] Add missing NVIDIA repository key. PiperOrigin-RevId: 446061415 --- tensorflow_serving/tools/docker/Dockerfile.devel-gpu | 3 ++- tensorflow_serving/tools/docker/Dockerfile.gpu | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 2945d6057f5..24b9f3b0cc4 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -24,7 +24,8 @@ ENV CUDNN_VERSION=8.1.0.77 ENV TF_TENSORRT_VERSION=7.2.2 ENV CUDA=11.2 -RUN apt-get update && apt-get install -y --no-install-recommends \ +RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub && \ + apt-get update && apt-get install -y --no-install-recommends \ automake \ build-essential \ ca-certificates \ diff --git a/tensorflow_serving/tools/docker/Dockerfile.gpu b/tensorflow_serving/tools/docker/Dockerfile.gpu index 09cb8478dd3..d5eb058d93f 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.gpu @@ -30,7 +30,8 @@ ENV TF_TENSORRT_VERSION=7.2.2 ENV CUDA=11.2 ENV LD_LIBRARY_PATH /usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH -RUN apt-get update && apt-get install -y --no-install-recommends \ +RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub && \ + apt-get update && apt-get install -y --no-install-recommends \ ca-certificates \ cuda-command-line-tools-11-2 \ libcublas-11-2 \ From f1651ae620e7f329511d39cbe75688e54b6149f1 Mon Sep 17 00:00:00 2001 From: Dero Gharibian Date: Thu, 19 May 2022 13:59:03 -0700 Subject: [PATCH 5852/8103] Bump minimum bazel version 5.1.1. PiperOrigin-RevId: 449827384 --- WORKSPACE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WORKSPACE b/WORKSPACE index 29bd74c6390..abc5ee4f6da 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -31,7 +31,7 @@ load( "@org_tensorflow//tensorflow:version_check.bzl", "check_bazel_version_at_least" ) -check_bazel_version_at_least("5.0.0") +check_bazel_version_at_least("5.1.1") # Initialize TensorFlow's external dependencies. load("@org_tensorflow//tensorflow:workspace3.bzl", "workspace") From 8a02874cee6957e5817960613627a549bd80a6e9 Mon Sep 17 00:00:00 2001 From: Dero Gharibian Date: Sun, 22 May 2022 17:49:30 -0700 Subject: [PATCH 5853/8103] Bump minimum bazel version 5.1.1, to match with TF and root.workspace PiperOrigin-RevId: 450329081 --- tensorflow_serving/tools/docker/Dockerfile.devel | 2 +- tensorflow_serving/tools/docker/Dockerfile.devel-gpu | 2 +- tensorflow_serving/tools/docker/Dockerfile.devel-mkl | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel b/tensorflow_serving/tools/docker/Dockerfile.devel index d054bd116df..a9eb5b62ebb 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel +++ b/tensorflow_serving/tools/docker/Dockerfile.devel @@ -76,7 +76,7 @@ RUN pip3 --no-cache-dir install \ --ignore-installed six>=1.12.0 # Set up Bazel -ENV BAZEL_VERSION 5.0.0 +ENV BAZEL_VERSION 5.1.1 WORKDIR / RUN mkdir /bazel && \ cd /bazel && \ diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 24b9f3b0cc4..3d8b3fcac23 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -109,7 +109,7 @@ RUN pip3 --no-cache-dir install \ --ignore-installed six>=1.12.0 # Set up Bazel -ENV BAZEL_VERSION 5.0.0 +ENV BAZEL_VERSION 5.1.1 WORKDIR / RUN mkdir /bazel && \ cd /bazel && \ diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl index 93bfdbd7134..1a1dbc70c6f 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-mkl +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-mkl @@ -75,7 +75,7 @@ RUN pip3 --no-cache-dir install \ --ignore-installed six>=1.12.0 # Set up Bazel -ENV BAZEL_VERSION 5.0.0 +ENV BAZEL_VERSION 5.1.1 WORKDIR / RUN mkdir /bazel && \ cd /bazel && \ From 7166e2efc6b7e63c908515c6a53d0e4fe8fa0aae Mon Sep 17 00:00:00 2001 From: Dero Gharibian Date: Tue, 24 May 2022 17:59:01 -0700 Subject: [PATCH 5854/8103] Update to use C++17 TF updated to use C++17 github.com/tensorflow/tensorflow/commit/8ea5ed0c392b329a3e0481a3f1f7b0ca86821b84 PiperOrigin-RevId: 450811224 --- .bazelrc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.bazelrc b/.bazelrc index 768d3ccda38..6e237e2bb69 100644 --- a/.bazelrc +++ b/.bazelrc @@ -43,9 +43,9 @@ build --apple_platform_type=macos build -c opt -# LLVM, MLIR and TF require C++14. -build --cxxopt=-std=c++14 -build --host_cxxopt=-std=c++14 +# LLVM, MLIR and TF requires C++17. +build --cxxopt=-std=c++17 +build --host_cxxopt=-std=c++17 # Adding "--cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0" creates parity with TF # compilation options. It also addresses memory use due to From 04b8676730a882cab61b7772097f2c23c0447ef9 Mon Sep 17 00:00:00 2001 From: Dero Gharibian Date: Tue, 31 May 2022 10:50:03 -0700 Subject: [PATCH 5855/8103] Update tensorflow_model_server_test to depend on the pip installed tensorflow. Bazel BUILD dependencies on @org_tensorflow//tensorflow:tensorflow_py will be removed in subsequent CLs. PiperOrigin-RevId: 452087986 --- .../model_servers/tensorflow_model_server_test.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/tensorflow_serving/model_servers/tensorflow_model_server_test.py b/tensorflow_serving/model_servers/tensorflow_model_server_test.py index 4c2195fa5b3..faa245c25d7 100644 --- a/tensorflow_serving/model_servers/tensorflow_model_server_test.py +++ b/tensorflow_serving/model_servers/tensorflow_model_server_test.py @@ -22,9 +22,19 @@ import json import os import subprocess +import sys import time -# This is a placeholder for a Google-internal import. + +# During the creation of the 'tensorflow_serving' package, bazel emits a python +# 'tensorflow' module which contains its dependencies (e.g. example.proto). +# Since bazel python libraries take precedence in sys.path and the created +# 'tensorflow' module will not be fully constructed, we reorder the bazel-out +# python libs to take a lower precedence than the pip installed packages. +sys.path = ([i for i in sys.path if 'bazel-out' not in i] + + [i for i in sys.path if 'bazel-out' in i]) + +# This is a placeholder for a Google-internal import. # pylint: disable=g-import-not-at-top import grpc from six.moves import range From fe426c16c58aed164c72ddc267ceb9066a251e18 Mon Sep 17 00:00:00 2001 From: Dero Gharibian Date: Wed, 1 Jun 2022 15:15:51 -0700 Subject: [PATCH 5856/8103] Internal change. PiperOrigin-RevId: 452396093 --- tensorflow_serving/batching/test_util/BUILD | 1 - tensorflow_serving/experimental/example/BUILD | 11 ++--------- .../experimental/tensorflow/ops/remote_predict/BUILD | 1 - tensorflow_serving/model_servers/BUILD | 9 +-------- tensorflow_serving/model_servers/test_util/BUILD | 1 - .../servables/tensorflow/testdata/BUILD | 12 ++---------- 6 files changed, 5 insertions(+), 30 deletions(-) diff --git a/tensorflow_serving/batching/test_util/BUILD b/tensorflow_serving/batching/test_util/BUILD index 54bb56d954a..eb9995b48fc 100644 --- a/tensorflow_serving/batching/test_util/BUILD +++ b/tensorflow_serving/batching/test_util/BUILD @@ -48,5 +48,4 @@ py_binary( srcs = ["matrix_half_plus_two_saved_model.py"], python_version = "PY3", srcs_version = "PY3", - deps = ["@org_tensorflow//tensorflow:tensorflow_py"], ) diff --git a/tensorflow_serving/experimental/example/BUILD b/tensorflow_serving/experimental/example/BUILD index d7b28b82c16..16b9baadac2 100644 --- a/tensorflow_serving/experimental/example/BUILD +++ b/tensorflow_serving/experimental/example/BUILD @@ -22,10 +22,7 @@ py_binary( name = "remote_predict_client", srcs = ["remote_predict_client.py"], python_version = "PY3", - deps = [ - "//tensorflow_serving/experimental/tensorflow/ops/remote_predict:remote_predict_py", - "@org_tensorflow//tensorflow:tensorflow_py", - ], + deps = ["//tensorflow_serving/experimental/tensorflow/ops/remote_predict:remote_predict_py"], ) py_binary( @@ -35,10 +32,7 @@ py_binary( ], python_version = "PY3", srcs_version = "PY3", - deps = [ - "//tensorflow_serving/experimental/tensorflow/ops/remote_predict:remote_predict_py", - "@org_tensorflow//tensorflow:tensorflow_py", - ], + deps = ["//tensorflow_serving/experimental/tensorflow/ops/remote_predict:remote_predict_py"], ) py_binary( @@ -49,6 +43,5 @@ py_binary( "//tensorflow_serving/apis:predict_proto_py_pb2", "//tensorflow_serving/apis:prediction_service_proto_py_pb2", "//tensorflow_serving/experimental/tensorflow/ops/remote_predict:remote_predict_py", - "@org_tensorflow//tensorflow:tensorflow_py", ], ) diff --git a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/BUILD b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/BUILD index fae521f0a04..40b3b60538c 100644 --- a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/BUILD +++ b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/BUILD @@ -121,7 +121,6 @@ tf_custom_op_py_library( visibility = ["//tensorflow_serving/experimental/example:__subpackages__"], deps = [ ":gen_remote_predict_op", - "@org_tensorflow//tensorflow:tensorflow_py", "@org_tensorflow//tensorflow/python:framework_for_generated_wrappers", ], ) diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 9afa9842863..179d6e205f1 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -491,7 +491,6 @@ py_test( "//tensorflow_serving/apis:model_service_proto_py_pb2", "//tensorflow_serving/apis:prediction_service_proto_py_pb2", "//tensorflow_serving/model_servers/test_util:tensorflow_model_server_test_base", - "@org_tensorflow//tensorflow:tensorflow_py", "@six_archive//:six", ], ) @@ -501,10 +500,7 @@ py_binary( srcs = ["tensorflow_model_server_test_client.py"], python_version = "PY3", srcs_version = "PY2AND3", - deps = [ - "//tensorflow_serving/apis:prediction_service_proto_py_pb2", - "@org_tensorflow//tensorflow:tensorflow_py", - ], + deps = ["//tensorflow_serving/apis:prediction_service_proto_py_pb2"], ) py_binary( @@ -512,9 +508,6 @@ py_binary( srcs = ["profiler_client.py"], python_version = "PY3", srcs_version = "PY2AND3", - deps = [ - "@org_tensorflow//tensorflow:tensorflow_py", - ], ) pkg_tar( diff --git a/tensorflow_serving/model_servers/test_util/BUILD b/tensorflow_serving/model_servers/test_util/BUILD index 1da71ffa98c..a2d37ebd7d1 100644 --- a/tensorflow_serving/model_servers/test_util/BUILD +++ b/tensorflow_serving/model_servers/test_util/BUILD @@ -124,7 +124,6 @@ py_library( deps = [ "//tensorflow_serving/apis:predict_proto_py_pb2", "//tensorflow_serving/apis:prediction_service_proto_py_pb2", - "@org_tensorflow//tensorflow:tensorflow_py", "@org_tensorflow//tensorflow/core:protos_all_py", "@org_tensorflow//tensorflow/python:platform", "@org_tensorflow//tensorflow/python/saved_model:signature_constants", diff --git a/tensorflow_serving/servables/tensorflow/testdata/BUILD b/tensorflow_serving/servables/tensorflow/testdata/BUILD index cc449b042d5..b395caad1b5 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/BUILD +++ b/tensorflow_serving/servables/tensorflow/testdata/BUILD @@ -50,7 +50,6 @@ py_binary( ], python_version = "PY3", srcs_version = "PY3", - deps = ["@org_tensorflow//tensorflow:tensorflow_py"], ) py_binary( @@ -60,7 +59,6 @@ py_binary( ], python_version = "PY3", srcs_version = "PY3", - deps = ["@org_tensorflow//tensorflow:tensorflow_py"], ) py_binary( @@ -70,10 +68,7 @@ py_binary( ], python_version = "PY3", srcs_version = "PY3", - deps = [ - "@org_tensorflow//tensorflow:tensorflow_py", - "@org_tensorflow//tensorflow/lite/tools/signature:signature_def_utils", - ], + deps = ["@org_tensorflow//tensorflow/lite/tools/signature:signature_def_utils"], ) py_binary( @@ -84,10 +79,7 @@ py_binary( main = "parse_example_tflite.py", python_version = "PY3", srcs_version = "PY3", - deps = [ - "@org_tensorflow//tensorflow:tensorflow_py", - "@org_tensorflow//tensorflow/lite/tools/signature:signature_def_utils", - ], + deps = ["@org_tensorflow//tensorflow/lite/tools/signature:signature_def_utils"], ) filegroup( From 5b1d361e5bc581eddb99102396478f0d4731a208 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 1 Jun 2022 18:02:09 -0700 Subject: [PATCH 5857/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bd379d44-db42-4a5d-bf1f-d2fc6877d705 PiperOrigin-RevId: 452427149 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index abc5ee4f6da..6c05fa47019 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3e6c98de0842520a65978549be7b1b6061080ecf9fa9f3a87739e19a0447a85c", - git_commit = "1f8f692143aa9a42c55f8b35d09aeed93bdab66e", + sha256 = "0efb01e0d4643d56e65030212f81f2dd8cbc3bffef7b2e9c170b2008cd08c8c9", + git_commit = "bcfb14c237841195a2bfb10cb91aac5f16f97fd4", ) # Import all of TensorFlow Serving's external dependencies. From 430ec855ed1506fcd51b66597680e326bf5eb1e4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 Jun 2022 00:01:45 -0700 Subject: [PATCH 5858/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/015b816e-4cbc-45d9-9681-8f936fbd24e4 PiperOrigin-RevId: 452469785 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6c05fa47019..a2843a73f48 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0efb01e0d4643d56e65030212f81f2dd8cbc3bffef7b2e9c170b2008cd08c8c9", - git_commit = "bcfb14c237841195a2bfb10cb91aac5f16f97fd4", + sha256 = "a5ec4c1dd133480d0c30e0bbc3cdcab5b56a9fdb21b662fa563f3cb4262197c8", + git_commit = "e46454c4d1d86fc3a11d71a7573befbb3dd8f664", ) # Import all of TensorFlow Serving's external dependencies. From e4618657295f17bca8d10b724b817f74d7e8255f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 Jun 2022 06:01:41 -0700 Subject: [PATCH 5859/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5af63179-f740-4d53-a737-5fb768f0b2a5 PiperOrigin-RevId: 452519485 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a2843a73f48..f09260531ed 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a5ec4c1dd133480d0c30e0bbc3cdcab5b56a9fdb21b662fa563f3cb4262197c8", - git_commit = "e46454c4d1d86fc3a11d71a7573befbb3dd8f664", + sha256 = "e7ef7bea2c7a517cf97d7707182817d3f70303fecfd8b71662b2ed9d9b04bf7d", + git_commit = "32c0971dcdc6baaee491458da66b74565839b792", ) # Import all of TensorFlow Serving's external dependencies. From 6db028e0a14424db049af2a53d40b62a8c2f6124 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 Jun 2022 12:01:36 -0700 Subject: [PATCH 5860/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8698327f-5f58-478a-b7ed-20d614c9040a PiperOrigin-RevId: 452591363 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f09260531ed..da9ba040c31 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e7ef7bea2c7a517cf97d7707182817d3f70303fecfd8b71662b2ed9d9b04bf7d", - git_commit = "32c0971dcdc6baaee491458da66b74565839b792", + sha256 = "815edcb7c913f7b36828c0665bd730901bbe8e6bd16d26c570d049d2839c7ed5", + git_commit = "40835b92f55a342d74e5f018b2ff92543aa9ad8c", ) # Import all of TensorFlow Serving's external dependencies. From e123e6b845d84c116a9fc17bc44fbc1bab62a32d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 2 Jun 2022 18:01:37 -0700 Subject: [PATCH 5861/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/079978b7-7331-48e2-9bbc-8327362d7173 PiperOrigin-RevId: 452662376 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index da9ba040c31..252906df80c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "815edcb7c913f7b36828c0665bd730901bbe8e6bd16d26c570d049d2839c7ed5", - git_commit = "40835b92f55a342d74e5f018b2ff92543aa9ad8c", + sha256 = "6f5965eba1553017ab96d70653c303b8212bc68d2fc5abe701d68d59ef68ef41", + git_commit = "9d21209ecfb01169cb85c6aa3b81e588c1d826c0", ) # Import all of TensorFlow Serving's external dependencies. From fbb0559f7c433a23932f3ec5267dca920617aabf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 3 Jun 2022 00:01:42 -0700 Subject: [PATCH 5862/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a78ea788-24ef-4bac-b329-5495179dea05 PiperOrigin-RevId: 452703435 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 252906df80c..64e1bce828d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6f5965eba1553017ab96d70653c303b8212bc68d2fc5abe701d68d59ef68ef41", - git_commit = "9d21209ecfb01169cb85c6aa3b81e588c1d826c0", + sha256 = "0d1e9cea38af17411db43e556d04d4db8d58bbb7580b37ac42049d5619785a6b", + git_commit = "e9fd44c26e001c9819e1b977ee022ea8483ec32f", ) # Import all of TensorFlow Serving's external dependencies. From bfc50776943d6d0aceaa7618407d9e158d1e3db8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 3 Jun 2022 06:01:37 -0700 Subject: [PATCH 5863/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4b17609d-546e-4f51-9b9b-048b0f22bebe PiperOrigin-RevId: 452750583 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 64e1bce828d..4e93386053a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0d1e9cea38af17411db43e556d04d4db8d58bbb7580b37ac42049d5619785a6b", - git_commit = "e9fd44c26e001c9819e1b977ee022ea8483ec32f", + sha256 = "5b9204514c558e8699abf2c36ffef32a5a73a5dcf25f12478672a7a9ed27359e", + git_commit = "fb8fa1cbc4b64aa446ed71f596456289602a08ed", ) # Import all of TensorFlow Serving's external dependencies. From 218ec41ee43629a1cd4c0397ddaead0c2c459152 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 3 Jun 2022 12:01:39 -0700 Subject: [PATCH 5864/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/02b7e9f2-3de6-4d08-8ec4-2b6bb8ac9497 PiperOrigin-RevId: 452814217 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4e93386053a..611c90053d2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5b9204514c558e8699abf2c36ffef32a5a73a5dcf25f12478672a7a9ed27359e", - git_commit = "fb8fa1cbc4b64aa446ed71f596456289602a08ed", + sha256 = "c50f91e5c5289467e59ed9f024d18fc4b30aed0c9a139ed4e6449f52c6a86008", + git_commit = "0a723ddac486938ea3feb648c801768abb82fc0e", ) # Import all of TensorFlow Serving's external dependencies. From 21f7c6d29abf78a1142b57bec5f9ea8c561739e9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 3 Jun 2022 18:01:36 -0700 Subject: [PATCH 5865/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1b913efc-99d0-4f6a-9fe8-b34350f19068 PiperOrigin-RevId: 452878173 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 611c90053d2..c9810cf0f54 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c50f91e5c5289467e59ed9f024d18fc4b30aed0c9a139ed4e6449f52c6a86008", - git_commit = "0a723ddac486938ea3feb648c801768abb82fc0e", + sha256 = "6119ba82b05ae3c1e23aaaa9cba01c697b3137d775ad8d4109693d2197a3b0c3", + git_commit = "e9f76ac8a0e8767f0a16716e84599354d6044e69", ) # Import all of TensorFlow Serving's external dependencies. From 80a1c03826fa40e9a9ddaf1bba73cf874d1621c5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 4 Jun 2022 00:01:36 -0700 Subject: [PATCH 5866/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ccc9fd9d-8a84-46d8-881f-08baf780e143 PiperOrigin-RevId: 452910054 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c9810cf0f54..732e4410027 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6119ba82b05ae3c1e23aaaa9cba01c697b3137d775ad8d4109693d2197a3b0c3", - git_commit = "e9f76ac8a0e8767f0a16716e84599354d6044e69", + sha256 = "9b0304c8c02e7f7af9dce319492b0835df7cc9e46d489f70566d7ff70184d112", + git_commit = "baa73d9884ce8916d8098c090580acc6612e18fe", ) # Import all of TensorFlow Serving's external dependencies. From ec3f5e370b25bf9fb29113272fc4fa822a8db2c3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 4 Jun 2022 06:01:44 -0700 Subject: [PATCH 5867/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/05a40f33-a5b6-43ce-8d15-a1462be698a8 PiperOrigin-RevId: 452945140 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 732e4410027..bb050245ea0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9b0304c8c02e7f7af9dce319492b0835df7cc9e46d489f70566d7ff70184d112", - git_commit = "baa73d9884ce8916d8098c090580acc6612e18fe", + sha256 = "7ffa3c5949926db0e7e9477bf5f23175bf29a902b31333dfb326fec56eb9562e", + git_commit = "5e6618333778a1cb7944cfe691b96caba9572ce3", ) # Import all of TensorFlow Serving's external dependencies. From 4a7ecf1a3a2b0091c3b497a0951b237527594eb9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 4 Jun 2022 12:01:25 -0700 Subject: [PATCH 5868/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/cab79cfa-e56b-458c-bd18-efa8c64f1942 PiperOrigin-RevId: 452971554 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bb050245ea0..99e9be5bbc5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7ffa3c5949926db0e7e9477bf5f23175bf29a902b31333dfb326fec56eb9562e", - git_commit = "5e6618333778a1cb7944cfe691b96caba9572ce3", + sha256 = "3188786af40963eff3b11c7f88ab3789db959d88cbd1cedcf60d3beb8cf19509", + git_commit = "fe29e4e2dbd81e3c97832bddf7d6463b75368a77", ) # Import all of TensorFlow Serving's external dependencies. From cc290064690633746a13337d706ba4806ae580c6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 4 Jun 2022 18:01:30 -0700 Subject: [PATCH 5869/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5065b061-e90f-4b1e-883d-49837d4266b1 PiperOrigin-RevId: 452996234 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 99e9be5bbc5..ee0c1268188 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3188786af40963eff3b11c7f88ab3789db959d88cbd1cedcf60d3beb8cf19509", - git_commit = "fe29e4e2dbd81e3c97832bddf7d6463b75368a77", + sha256 = "99ef0e721c68b98ac490947b84193dd06439fe64ecdc5720513112556f6f9aa8", + git_commit = "72177a67c200c704c50982164bb0a52ccb10288d", ) # Import all of TensorFlow Serving's external dependencies. From 1a0c32ae56797cd17ccf17a71c1a6cb16fda59f8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 5 Jun 2022 06:01:24 -0700 Subject: [PATCH 5870/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/717f29ab-7e9e-4bcf-a943-5128b1ff85b0 PiperOrigin-RevId: 453053011 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ee0c1268188..34eb6d708ed 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "99ef0e721c68b98ac490947b84193dd06439fe64ecdc5720513112556f6f9aa8", - git_commit = "72177a67c200c704c50982164bb0a52ccb10288d", + sha256 = "8720a90770b949e158e9385f2d17d5c4290a355b09514df061707cde18cb8a7c", + git_commit = "6578dc510703c85f884505d81cc1f67e7bff6a53", ) # Import all of TensorFlow Serving's external dependencies. From 0cd3a55b3afec48738ef25656f1d817b5ab12f41 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 5 Jun 2022 18:01:29 -0700 Subject: [PATCH 5871/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8f86644e-cccf-4c92-a597-79bca374b4da PiperOrigin-RevId: 453104065 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 34eb6d708ed..22db718e7b3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8720a90770b949e158e9385f2d17d5c4290a355b09514df061707cde18cb8a7c", - git_commit = "6578dc510703c85f884505d81cc1f67e7bff6a53", + sha256 = "633665efb31233151862e792342b7a24f89dcfbc84bdfa60fd1f6fba097d4ce7", + git_commit = "a4d4545c12c19836ecad51c9551d284629ffa90d", ) # Import all of TensorFlow Serving's external dependencies. From d3b219fb7f3bbe88f3fae71a18e2fdef2f51a798 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 6 Jun 2022 06:01:28 -0700 Subject: [PATCH 5872/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b9b4b398-1447-4c6d-9568-2dd00eec13b9 PiperOrigin-RevId: 453182398 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 22db718e7b3..80cda8eb3a9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "633665efb31233151862e792342b7a24f89dcfbc84bdfa60fd1f6fba097d4ce7", - git_commit = "a4d4545c12c19836ecad51c9551d284629ffa90d", + sha256 = "6294244465579ed17d54014d014e0e647891fa7d5143ac068987eee0f4ad4f69", + git_commit = "96e0eb871a7faaaaf75eafe89365631eef6ec5e4", ) # Import all of TensorFlow Serving's external dependencies. From 24b6777bde1ddd3221efeb917f92b606a16231b0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 6 Jun 2022 12:01:35 -0700 Subject: [PATCH 5873/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/10ae5496-873f-49cf-bc40-db088a565d3c PiperOrigin-RevId: 453251657 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 80cda8eb3a9..e50b2934eed 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6294244465579ed17d54014d014e0e647891fa7d5143ac068987eee0f4ad4f69", - git_commit = "96e0eb871a7faaaaf75eafe89365631eef6ec5e4", + sha256 = "6150560bd28a6680d10a669bd3c2ea802df9cdf1fcec7f65ae1b4e1482f69047", + git_commit = "583ddd652b3ecb8c2cd8a7411e071fd9ca747d7b", ) # Import all of TensorFlow Serving's external dependencies. From d14483361d4640042ef859f39b861c9955854f3b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 6 Jun 2022 18:01:45 -0700 Subject: [PATCH 5874/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/acd49b19-9dad-4671-88de-4fe1f5bfc460 PiperOrigin-RevId: 453324295 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e50b2934eed..40b0cccfc67 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6150560bd28a6680d10a669bd3c2ea802df9cdf1fcec7f65ae1b4e1482f69047", - git_commit = "583ddd652b3ecb8c2cd8a7411e071fd9ca747d7b", + sha256 = "0d1611eb1ba12606ff5a1a6bbf96742e650388693b83ea9bfa32f5518073418c", + git_commit = "53348bc5deb78d69eba8ebee18500a3866a4283c", ) # Import all of TensorFlow Serving's external dependencies. From d78858bf54e41a7e9be29734e20e356bfaa45e8b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 Jun 2022 00:01:35 -0700 Subject: [PATCH 5875/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d489e3fd-96d4-417f-a9d3-7cb995422c0c PiperOrigin-RevId: 453365582 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 40b0cccfc67..5b2851e34c0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0d1611eb1ba12606ff5a1a6bbf96742e650388693b83ea9bfa32f5518073418c", - git_commit = "53348bc5deb78d69eba8ebee18500a3866a4283c", + sha256 = "7d309d4da38b3e5a73a08ec860358c8bc351a8cd40e64a0f3025ee320768e703", + git_commit = "7b072df0862c0a7ea3dd11ab9b82761b0abbde0d", ) # Import all of TensorFlow Serving's external dependencies. From a3f402ffde209261c2e28320b17f2bae97b01bd5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 Jun 2022 06:05:08 -0700 Subject: [PATCH 5876/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9c6fadf4-8fa2-41be-99de-ccc36f0ce416 PiperOrigin-RevId: 453418481 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5b2851e34c0..e207bdab434 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7d309d4da38b3e5a73a08ec860358c8bc351a8cd40e64a0f3025ee320768e703", - git_commit = "7b072df0862c0a7ea3dd11ab9b82761b0abbde0d", + sha256 = "709ed9db76505eb9887d1e0f7b145bdef61c3262697a010ad5990eeb1e9ee81d", + git_commit = "b7ae5b69d6442743a03f16acd43c5fdec0f3474e", ) # Import all of TensorFlow Serving's external dependencies. From 7149424a9ea9b420e08271b58a8bc4fe2de03271 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 Jun 2022 12:03:38 -0700 Subject: [PATCH 5877/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a0f5a919-2905-4f62-8a90-62a433f7e717 PiperOrigin-RevId: 453493210 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e207bdab434..645dd4fc265 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "709ed9db76505eb9887d1e0f7b145bdef61c3262697a010ad5990eeb1e9ee81d", - git_commit = "b7ae5b69d6442743a03f16acd43c5fdec0f3474e", + sha256 = "4ce206c2ca07d27358baea586895dace5160b3554c9b8d84a74f84d56a87f45b", + git_commit = "4504edefa48c5a7c83fe597f0b2f8ac74e399a1c", ) # Import all of TensorFlow Serving's external dependencies. From 79b44f703db071b6b6310b1ea695c161e3d0a6b1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 7 Jun 2022 18:01:35 -0700 Subject: [PATCH 5878/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a8f974d1-462a-490f-9bba-476b9620eead PiperOrigin-RevId: 453567583 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 645dd4fc265..292ba86a971 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4ce206c2ca07d27358baea586895dace5160b3554c9b8d84a74f84d56a87f45b", - git_commit = "4504edefa48c5a7c83fe597f0b2f8ac74e399a1c", + sha256 = "508f116508e2d5fb5ae740b30f1d183be7bee0665eb9c70c9397598c1616fa6d", + git_commit = "ba8dba4aca65beade68357bccea9e4a06fc90207", ) # Import all of TensorFlow Serving's external dependencies. From 18481a4dc5cd40dcda84fa2ea0dced25bf738bc4 Mon Sep 17 00:00:00 2001 From: Raviteja Gorijala Date: Tue, 7 Jun 2022 21:11:12 -0700 Subject: [PATCH 5879/8103] Add release notes for tf-serving 2.8.2 PiperOrigin-RevId: 453591853 --- RELEASE.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/RELEASE.md b/RELEASE.md index 37853a6ccaa..eddcde32042 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,3 +1,19 @@ +# Release 2.8.2 + +## Major Features and Improvements + +* No major features or improvements. + +## Breaking Changes + +* No breaking changes + +## Bug Fixes and Other Changes + +* Replace int64 with int64_t and uint64 with uint64_t. (commit: 21360c763767823b82768ce42c5c90c0c9012601) +* update to latest benchmark API changes (commit: 860e1013385289ad3f9eb4d854b55c23e7cb8087) +* This release is based on TF version 2.8.2 + # Release 2.8.0 ## Major Features and Improvements From fc5375a9b216c6ef209d91025d80870dcc45fa95 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 Jun 2022 00:01:57 -0700 Subject: [PATCH 5880/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a083d6c7-51b3-4ce8-820c-cfecc084453e PiperOrigin-RevId: 453610287 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 292ba86a971..926e355112f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "508f116508e2d5fb5ae740b30f1d183be7bee0665eb9c70c9397598c1616fa6d", - git_commit = "ba8dba4aca65beade68357bccea9e4a06fc90207", + sha256 = "74b9c838cc1a7d620e6d694d415750ed29d2290e3969c70129db89f87bd054cf", + git_commit = "cf547b9643e89a9cbe631f419a624e65223e36eb", ) # Import all of TensorFlow Serving's external dependencies. From 319ba8a15a56d477683ff06c74a1877f66e44d4e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 Jun 2022 06:01:37 -0700 Subject: [PATCH 5881/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d257c0e4-8bf2-482f-b290-0742bc8573ef PiperOrigin-RevId: 453661939 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 926e355112f..db67f720f65 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "74b9c838cc1a7d620e6d694d415750ed29d2290e3969c70129db89f87bd054cf", - git_commit = "cf547b9643e89a9cbe631f419a624e65223e36eb", + sha256 = "cd07a4b21282a26b45bdcc2a9a07ad2588cc09946e73e0b2c15305ea98d52490", + git_commit = "47e2269a16cf42a8d865e9f285ad90e82db10265", ) # Import all of TensorFlow Serving's external dependencies. From 4047246d306e02808e893bef14b3efea130c304a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 Jun 2022 12:01:33 -0700 Subject: [PATCH 5882/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/98527f5b-8c38-4bf9-aa1c-ee92927b08fb PiperOrigin-RevId: 453735150 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index db67f720f65..cddba9666ab 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cd07a4b21282a26b45bdcc2a9a07ad2588cc09946e73e0b2c15305ea98d52490", - git_commit = "47e2269a16cf42a8d865e9f285ad90e82db10265", + sha256 = "edff4ab8964e8778cc571442f7656b87b74104e72757cfb9127c9577c9b88128", + git_commit = "e802ab0e983392cc410868c0a27732452f025491", ) # Import all of TensorFlow Serving's external dependencies. From b205b6d18171f1db465c85507c5c1947e8ec0248 Mon Sep 17 00:00:00 2001 From: Raviteja Gorijala Date: Wed, 8 Jun 2022 13:56:51 -0700 Subject: [PATCH 5883/8103] Add missing NVIDIA repository key. PiperOrigin-RevId: 453760157 --- tensorflow_serving/tools/docker/Dockerfile.gpu | 1 + 1 file changed, 1 insertion(+) diff --git a/tensorflow_serving/tools/docker/Dockerfile.gpu b/tensorflow_serving/tools/docker/Dockerfile.gpu index d5eb058d93f..5ed69ac5db7 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.gpu @@ -48,6 +48,7 @@ RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/ # We don't install libnvinfer-dev since we don't need to build against TensorRT RUN apt-get update && \ + apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub && \ apt-get install -y --no-install-recommends libnvinfer7=${TF_TENSORRT_VERSION}-1+cuda11.1 \ libnvinfer-plugin7=${TF_TENSORRT_VERSION}-1+cuda11.1 \ && apt-get clean \ From b26154f4365a89b2ba4c3ba96d60b49fa0782c8b Mon Sep 17 00:00:00 2001 From: Raviteja Gorijala Date: Wed, 8 Jun 2022 17:28:02 -0700 Subject: [PATCH 5884/8103] Add missing NVIDIA repository key. PiperOrigin-RevId: 453804448 --- tensorflow_serving/tools/docker/Dockerfile.devel-gpu | 2 ++ tensorflow_serving/tools/docker/Dockerfile.gpu | 1 + 2 files changed, 3 insertions(+) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 3d8b3fcac23..341c3d4c4c1 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -69,6 +69,8 @@ RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/ # NOTE: libnvinfer uses cuda11.1 versions RUN apt-get update && \ + apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub && \ + echo "deb https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64 /" > /etc/apt/sources.list.d/tensorRT.list && \ apt-get install -y --no-install-recommends libnvinfer7=${TF_TENSORRT_VERSION}-1+cuda11.1 \ libnvinfer-dev=${TF_TENSORRT_VERSION}-1+cuda11.1 \ libnvinfer-plugin-dev=${TF_TENSORRT_VERSION}-1+cuda11.1 \ diff --git a/tensorflow_serving/tools/docker/Dockerfile.gpu b/tensorflow_serving/tools/docker/Dockerfile.gpu index 5ed69ac5db7..84fe9f40f7c 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.gpu @@ -49,6 +49,7 @@ RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/ # We don't install libnvinfer-dev since we don't need to build against TensorRT RUN apt-get update && \ apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub && \ + echo "deb https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64 /" > /etc/apt/sources.list.d/tensorRT.list && \ apt-get install -y --no-install-recommends libnvinfer7=${TF_TENSORRT_VERSION}-1+cuda11.1 \ libnvinfer-plugin7=${TF_TENSORRT_VERSION}-1+cuda11.1 \ && apt-get clean \ From 363f993b0c9d630362487af688ee8ce73a0c68bc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 8 Jun 2022 18:01:31 -0700 Subject: [PATCH 5885/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d2c1e017-2a68-4fcf-b933-f33c8b016351 PiperOrigin-RevId: 453809609 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cddba9666ab..6c978ca8271 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "edff4ab8964e8778cc571442f7656b87b74104e72757cfb9127c9577c9b88128", - git_commit = "e802ab0e983392cc410868c0a27732452f025491", + sha256 = "a301ac6c49a4a93063205e9ca04f17e39948d4d889af7cf886f5492b9c7edae3", + git_commit = "750757c525169b8b27ba94af4a8588a13ac14852", ) # Import all of TensorFlow Serving's external dependencies. From f2314b802b55860dbe6eb79320e80ad95842bf21 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 9 Jun 2022 00:01:40 -0700 Subject: [PATCH 5886/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3d310254-7a55-4b8a-9fb5-7684cc1f3cf6 PiperOrigin-RevId: 453852032 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6c978ca8271..b783000e1d6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a301ac6c49a4a93063205e9ca04f17e39948d4d889af7cf886f5492b9c7edae3", - git_commit = "750757c525169b8b27ba94af4a8588a13ac14852", + sha256 = "3b14393f7a43d7d7517b5b4806159b585aeb280cb947241fef166a2ae959fd5c", + git_commit = "933e49df3284758ef60eeb534b79261cf00d9404", ) # Import all of TensorFlow Serving's external dependencies. From b3363467e8b0ab6c7052dce60a7ef2b9e3ac27a1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 9 Jun 2022 06:01:36 -0700 Subject: [PATCH 5887/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d806bd20-f587-40d3-89dd-57601573bf9c PiperOrigin-RevId: 453906444 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b783000e1d6..b0b584e1a0d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3b14393f7a43d7d7517b5b4806159b585aeb280cb947241fef166a2ae959fd5c", - git_commit = "933e49df3284758ef60eeb534b79261cf00d9404", + sha256 = "cc8b004d90ca4db8d89903e377cd6f2927156cfeacb302204f51d3e8da2083bd", + git_commit = "872c4146d94cdcc70dd5af99ed076c90cdc77903", ) # Import all of TensorFlow Serving's external dependencies. From c2ea56f27d7e956487ba571df69903c9a8b9fe44 Mon Sep 17 00:00:00 2001 From: Raviteja Gorijala Date: Thu, 9 Jun 2022 10:39:58 -0700 Subject: [PATCH 5888/8103] Use 7.2.2-1+cuda11.0 for `libnvinfer` and `libnvonnxparsers` packages PiperOrigin-RevId: 453960366 --- .../tools/docker/Dockerfile.devel-gpu | 16 ++++++++-------- tensorflow_serving/tools/docker/Dockerfile.gpu | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 341c3d4c4c1..4f27746cfaf 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -71,15 +71,15 @@ RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/ RUN apt-get update && \ apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub && \ echo "deb https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64 /" > /etc/apt/sources.list.d/tensorRT.list && \ - apt-get install -y --no-install-recommends libnvinfer7=${TF_TENSORRT_VERSION}-1+cuda11.1 \ - libnvinfer-dev=${TF_TENSORRT_VERSION}-1+cuda11.1 \ - libnvinfer-plugin-dev=${TF_TENSORRT_VERSION}-1+cuda11.1 \ - libnvinfer-plugin7=${TF_TENSORRT_VERSION}-1+cuda11.1 \ + apt-get install -y --no-install-recommends libnvinfer7=${TF_TENSORRT_VERSION}-1+cuda11.0 \ + libnvinfer-dev=${TF_TENSORRT_VERSION}-1+cuda11.0 \ + libnvinfer-plugin-dev=${TF_TENSORRT_VERSION}-1+cuda11.0 \ + libnvinfer-plugin7=${TF_TENSORRT_VERSION}-1+cuda11.0 \ # TODO: need to verify - libnvonnxparsers7=${TF_TENSORRT_VERSION}-1+cuda11.1 \ - libnvparsers7=${TF_TENSORRT_VERSION}-1+cuda11.1\ - libnvonnxparsers-dev=${TF_TENSORRT_VERSION}-1+cuda11.1 \ - libnvparsers-dev=${TF_TENSORRT_VERSION}-1+cuda11.1 \ + libnvonnxparsers7=${TF_TENSORRT_VERSION}-1+cuda11.0 \ + libnvparsers7=${TF_TENSORRT_VERSION}-1+cuda11.0\ + libnvonnxparsers-dev=${TF_TENSORRT_VERSION}-1+cuda11.0 \ + libnvparsers-dev=${TF_TENSORRT_VERSION}-1+cuda11.0 \ && apt-get clean \ && rm -rf /var/lib/apt/lists/*; diff --git a/tensorflow_serving/tools/docker/Dockerfile.gpu b/tensorflow_serving/tools/docker/Dockerfile.gpu index 84fe9f40f7c..287f379afca 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.gpu @@ -50,8 +50,8 @@ RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/ RUN apt-get update && \ apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub && \ echo "deb https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64 /" > /etc/apt/sources.list.d/tensorRT.list && \ - apt-get install -y --no-install-recommends libnvinfer7=${TF_TENSORRT_VERSION}-1+cuda11.1 \ - libnvinfer-plugin7=${TF_TENSORRT_VERSION}-1+cuda11.1 \ + apt-get install -y --no-install-recommends libnvinfer7=${TF_TENSORRT_VERSION}-1+cuda11.0 \ + libnvinfer-plugin7=${TF_TENSORRT_VERSION}-1+cuda11.0 \ && apt-get clean \ && rm -rf /var/lib/apt/lists/*; From 3cda32184c13d9fe3bdb1070debed77c1b44c54e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 9 Jun 2022 12:01:35 -0700 Subject: [PATCH 5889/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/abf1e8e4-8b9c-43c3-8cb8-bdc7deed8fc4 PiperOrigin-RevId: 453980304 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b0b584e1a0d..9b66448fcbf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cc8b004d90ca4db8d89903e377cd6f2927156cfeacb302204f51d3e8da2083bd", - git_commit = "872c4146d94cdcc70dd5af99ed076c90cdc77903", + sha256 = "b5cf70363f2ee940928f4e663eb862a61bac06a7969207db9bc30f2cbdf741a3", + git_commit = "8ba7f5ef89c36e363a383b3c885c702ee7e9db1e", ) # Import all of TensorFlow Serving's external dependencies. From a8ffec79e0794650a4c0856c4122032e985296cc Mon Sep 17 00:00:00 2001 From: Raviteja Gorijala Date: Thu, 9 Jun 2022 15:10:32 -0700 Subject: [PATCH 5890/8103] Match packages in devel and non-devel GPU with TF dockerfile. PiperOrigin-RevId: 454022961 --- .../tools/docker/Dockerfile.devel-gpu | 33 +++++++++---------- .../tools/docker/Dockerfile.gpu | 24 ++++++++------ 2 files changed, 29 insertions(+), 28 deletions(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu index 4f27746cfaf..6e4ca5442dc 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.devel-gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.devel-gpu @@ -60,28 +60,25 @@ RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/ zip \ zlib1g-dev \ python3-distutils \ - python-distutils-extra \ - && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* && \ + python-distutils-extra && \ find /usr/local/cuda-11.2/lib64/ -type f -name 'lib*_static.a' -not -name 'libcudart_static.a' -delete && \ rm /usr/lib/x86_64-linux-gnu/libcudnn_static_v8.a # NOTE: libnvinfer uses cuda11.1 versions -RUN apt-get update && \ - apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub && \ - echo "deb https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64 /" > /etc/apt/sources.list.d/tensorRT.list && \ - apt-get install -y --no-install-recommends libnvinfer7=${TF_TENSORRT_VERSION}-1+cuda11.0 \ - libnvinfer-dev=${TF_TENSORRT_VERSION}-1+cuda11.0 \ - libnvinfer-plugin-dev=${TF_TENSORRT_VERSION}-1+cuda11.0 \ - libnvinfer-plugin7=${TF_TENSORRT_VERSION}-1+cuda11.0 \ - # TODO: need to verify - libnvonnxparsers7=${TF_TENSORRT_VERSION}-1+cuda11.0 \ - libnvparsers7=${TF_TENSORRT_VERSION}-1+cuda11.0\ - libnvonnxparsers-dev=${TF_TENSORRT_VERSION}-1+cuda11.0 \ - libnvparsers-dev=${TF_TENSORRT_VERSION}-1+cuda11.0 \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/*; +RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub && \ + echo "deb https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64 /" > /etc/apt/sources.list.d/tensorRT.list && \ + apt-get update && \ + apt-get install -y --no-install-recommends libnvinfer7=${TF_TENSORRT_VERSION}-1+cuda11.0 \ + libnvinfer-dev=${TF_TENSORRT_VERSION}-1+cuda11.0 \ + libnvinfer-plugin-dev=${TF_TENSORRT_VERSION}-1+cuda11.0 \ + libnvinfer-plugin7=${TF_TENSORRT_VERSION}-1+cuda11.0 \ + # TODO: need to verify + libnvonnxparsers7=${TF_TENSORRT_VERSION}-1+cuda11.0 \ + libnvparsers7=${TF_TENSORRT_VERSION}-1+cuda11.0\ + libnvonnxparsers-dev=${TF_TENSORRT_VERSION}-1+cuda11.0 \ + libnvparsers-dev=${TF_TENSORRT_VERSION}-1+cuda11.0 && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/*; # Install python 3.7. RUN add-apt-repository ppa:deadsnakes/ppa && \ diff --git a/tensorflow_serving/tools/docker/Dockerfile.gpu b/tensorflow_serving/tools/docker/Dockerfile.gpu index 287f379afca..9221dc69cd1 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.gpu @@ -34,6 +34,7 @@ RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/ apt-get update && apt-get install -y --no-install-recommends \ ca-certificates \ cuda-command-line-tools-11-2 \ + cuda-nvrtc-${CUDA/./-} \ libcublas-11-2 \ libcublas-dev-11-2 \ libcufft-11-2 \ @@ -42,18 +43,21 @@ RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/ libcusparse-11-2 \ libcudnn8=${CUDNN_VERSION}-1+cuda${CUDA} \ libgomp1 \ - && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* + build-essential \ + curl \ + libfreetype6-dev \ + pkg-config \ + software-properties-common \ + unzip # We don't install libnvinfer-dev since we don't need to build against TensorRT -RUN apt-get update && \ - apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub && \ - echo "deb https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64 /" > /etc/apt/sources.list.d/tensorRT.list && \ - apt-get install -y --no-install-recommends libnvinfer7=${TF_TENSORRT_VERSION}-1+cuda11.0 \ - libnvinfer-plugin7=${TF_TENSORRT_VERSION}-1+cuda11.0 \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/*; +RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub && \ + echo "deb https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64 /" > /etc/apt/sources.list.d/tensorRT.list && \ + apt-get update && \ + apt-get install -y --no-install-recommends libnvinfer7=${TF_TENSORRT_VERSION}-1+cuda11.0 \ + libnvinfer-plugin7=${TF_TENSORRT_VERSION}-1+cuda11.0 \ + && apt-get clean && \ + rm -rf /var/lib/apt/lists/*; # Install TF Serving GPU pkg COPY --from=build_image /usr/local/bin/tensorflow_model_server /usr/bin/tensorflow_model_server From b266e588000a0277acda527b51fc685ab84e9aee Mon Sep 17 00:00:00 2001 From: Raviteja Gorijala Date: Thu, 9 Jun 2022 17:12:28 -0700 Subject: [PATCH 5891/8103] Add release notes for tf-serving 2.9.0 PiperOrigin-RevId: 454046780 --- RELEASE.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/RELEASE.md b/RELEASE.md index eddcde32042..37cbf890caf 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,3 +1,28 @@ +# Release 2.9.0 + +## Major Features and Improvements + +* No major features or improvements. + +## Breaking Changes + +* No breaking changes + +## Bug Fixes and Other Changes + +* Do not report successful loads that are cancelled, unload immediately instead. (commit: 923269955f5582cc26d0454992afa5c888a9377f) +* Add a lock to avoid race condition on memoized_resource_estimate_. (commit: 83959e364e7ff1234bf47a5d8139677d1bdb18c1) +* Update Resnet model used in K8S tutorial (commit: 6e76f6a9460bf2d37630f025fcfd3e06c4230fee) +* Prepare for development of new http client API. (commit: 78e94e99650deae956fe20dffa9932a72ec7d765) +* Integrate TPU initialization changes into TF Serving. (commit: 6549ef2136940cd98cfbb9ee0e29221d86101d16) +* Allow max_execution_batch_size to be actually used by allowing (commit: 48a699a2fd32404c4b19f55077a1fb29112a0afe) +* Delete batch_schedulers_ before thread_pool_name_ (commit: 2837812341e7c98be4717e5901286692a5dcc02a) +* Add missing NVIDIA repository key. (commit: c0998e13451b9b83c9bdf157dd3648b2272dac59) +* Bump minimum bazel version 5.1.1, to match with TF and root.workspace (commit: 8a02874cee6957e5817960613627a549bd80a6e9) +* Update to use C++17 (commit: 7166e2efc6b7e63c908515c6a53d0e4fe8fa0aae) +* Update tensorflow_model_server_test to depend on the pip installed tensorflow. (commit: 04b8676730a882cab61b7772097f2c23c0447ef9) +* This release is based on TF version 2.9.0 + # Release 2.8.2 ## Major Features and Improvements From 72761dc39c7311650f221ef8bce5d5d08893194a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 9 Jun 2022 18:01:26 -0700 Subject: [PATCH 5892/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/15dbb29a-b2da-4686-b98a-53d3eb45d27b PiperOrigin-RevId: 454054629 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9b66448fcbf..6c46426b81d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b5cf70363f2ee940928f4e663eb862a61bac06a7969207db9bc30f2cbdf741a3", - git_commit = "8ba7f5ef89c36e363a383b3c885c702ee7e9db1e", + sha256 = "7db3e5c4a05f4ab23e4922440cba7414c950d7d3ee8cbfd75ba5fc23f740700f", + git_commit = "fb0bce69a1318394b9e5f654efdf5400c91f7b1c", ) # Import all of TensorFlow Serving's external dependencies. From 4e9aa7de9c31bf63dac9486d8619e79d83e57f93 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 10 Jun 2022 00:01:48 -0700 Subject: [PATCH 5893/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/93223a7e-2d6d-4c6a-a584-613dbbbec992 PiperOrigin-RevId: 454096106 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6c46426b81d..5369e2a7661 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7db3e5c4a05f4ab23e4922440cba7414c950d7d3ee8cbfd75ba5fc23f740700f", - git_commit = "fb0bce69a1318394b9e5f654efdf5400c91f7b1c", + sha256 = "47aa59f4dec9320b674fb5ad9bec64e1b01e472872cee719b0b14b72293f123d", + git_commit = "09710eb110e26b1454d4be70fa5fd66889f64f47", ) # Import all of TensorFlow Serving's external dependencies. From 84847704a51720a441d9a098ded61bc1658063b3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 10 Jun 2022 06:01:33 -0700 Subject: [PATCH 5894/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/518cf190-8bf3-4ca8-8377-644f324f28e2 PiperOrigin-RevId: 454146727 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5369e2a7661..1d3e570f8c0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "47aa59f4dec9320b674fb5ad9bec64e1b01e472872cee719b0b14b72293f123d", - git_commit = "09710eb110e26b1454d4be70fa5fd66889f64f47", + sha256 = "cc78e84b2c98d084a4aac9d6815a68533461cf4a289e2de24b5e3c46de5ea596", + git_commit = "511122cd9ea9afcfd2fd181b746122f2ae317b15", ) # Import all of TensorFlow Serving's external dependencies. From 48ff72dcb6582e989452ba870c88a2bb710ea0c4 Mon Sep 17 00:00:00 2001 From: Abhijit Karmarkar Date: Fri, 10 Jun 2022 09:03:12 -0700 Subject: [PATCH 5895/8103] Validate batching params when creating the wrapped (batching) session, instead of doing this when creating the shared batch scheduler. This is a more logical place to validate, as the shared batch scheduler can potentially be shared across multiple sessions, each with its own batching params. PiperOrigin-RevId: 454176092 --- .../servables/tensorflow/bundle_factory_util.cc | 15 +++++++++++++++ .../servables/tensorflow/bundle_factory_util.h | 17 ----------------- .../tensorflow/bundle_factory_util_test.cc | 13 +++++++++++-- 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_util.cc b/tensorflow_serving/servables/tensorflow/bundle_factory_util.cc index 374da84cd2e..b8b9d75f9c5 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_util.cc +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_util.cc @@ -71,6 +71,21 @@ Status WrapSessionForBatching(const BatchingParameters& batching_config, return errors::Internal("session not set"); } + if (!batching_config.allowed_batch_sizes().empty()) { + // Verify that the last allowed batch size matches the max batch size. + const int last_allowed_size = batching_config.allowed_batch_sizes( + batching_config.allowed_batch_sizes().size() - 1); + const int max_size = batching_config.has_max_batch_size() + ? batching_config.max_batch_size().value() + : Batcher::QueueOptions().input_batch_size_limit; + if (last_allowed_size != max_size) { + return errors::InvalidArgument( + "Last entry in allowed_batch_sizes must match max_batch_size; last " + "entry was ", + last_allowed_size, "; expected ", max_size); + } + } + auto queue_options = GetQueueOptions< tensorflow::serving::BatchingSessionTask>( batching_config, diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_util.h b/tensorflow_serving/servables/tensorflow/bundle_factory_util.h index 550ad675702..4dde4b2ecfe 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_util.h +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_util.h @@ -46,23 +46,6 @@ template Status CreateBatchScheduler( const BatchingParameters& batching_config, std::shared_ptr>* batch_scheduler) { - if (!batching_config.allowed_batch_sizes().empty()) { - // Verify that the last allowed batch size matches the max batch size. - const int last_allowed_size = batching_config.allowed_batch_sizes( - batching_config.allowed_batch_sizes().size() - 1); - const int max_size = - batching_config.has_max_batch_size() - ? batching_config.max_batch_size().value() - : typename SharedBatchScheduler::QueueOptions() - .input_batch_size_limit; - if (last_allowed_size != max_size) { - return errors::InvalidArgument( - "Last entry in allowed_batch_sizes must match max_batch_size; last " - "entry was ", - last_allowed_size, "; expected ", max_size); - } - } - typename SharedBatchScheduler::Options options; if (batching_config.has_num_batch_threads()) { options.num_batch_threads = batching_config.num_batch_threads().value(); diff --git a/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc b/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc index 3c49502dc22..3e709cce42c 100644 --- a/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc +++ b/tensorflow_serving/servables/tensorflow/bundle_factory_util_test.cc @@ -150,15 +150,24 @@ TEST_F(BundleFactoryUtilTest, WrapSessionForBatching) { test_util::TestMultipleRequests(10, bundle.session.get()); } -TEST_F(BundleFactoryUtilTest, BatchingConfigError) { +TEST_F(BundleFactoryUtilTest, WrapSessionForBatchingConfigError) { BatchingParameters batching_params; batching_params.mutable_max_batch_size()->set_value(2); // The last entry in 'allowed_batch_sizes' is supposed to equal // 'max_batch_size'. Let's violate that constraint and ensure we get an error. batching_params.add_allowed_batch_sizes(1); batching_params.add_allowed_batch_sizes(3); + std::shared_ptr batch_scheduler; - EXPECT_FALSE(CreateBatchScheduler(batching_params, &batch_scheduler).ok()); + TF_ASSERT_OK(CreateBatchScheduler(batching_params, &batch_scheduler)); + + SavedModelBundle bundle; + TF_ASSERT_OK(LoadSavedModel(SessionOptions(), RunOptions(), export_dir_, + {"serve"}, &bundle)); + auto status = WrapSessionForBatching(batching_params, batch_scheduler, + {test_util::GetTestSessionSignature()}, + &bundle.session); + ASSERT_TRUE(errors::IsInvalidArgument(status)); } TEST_F(BundleFactoryUtilTest, EstimateResourceFromPathWithBadExport) { From 82f1485ad5dc5abce883c783c6a20a326fd1a3b5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 10 Jun 2022 12:01:30 -0700 Subject: [PATCH 5896/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b114fdba-64e3-4c22-b22e-22d2a2e74123 PiperOrigin-RevId: 454213122 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1d3e570f8c0..849cf6adae0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cc78e84b2c98d084a4aac9d6815a68533461cf4a289e2de24b5e3c46de5ea596", - git_commit = "511122cd9ea9afcfd2fd181b746122f2ae317b15", + sha256 = "1c17a8f9318b7d288ebd84aa0386ef085d88dcdcc233d1761ac4b0a6bfdbe02b", + git_commit = "a1394226966bc1bebef0dda153224bbf0ffc95fe", ) # Import all of TensorFlow Serving's external dependencies. From 78be620d14b2b2da236ce00132b97248c00a3949 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 10 Jun 2022 18:01:33 -0700 Subject: [PATCH 5897/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7b332e60-93ff-49bd-8cb6-19919d2c1d51 PiperOrigin-RevId: 454277119 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 849cf6adae0..3e6b361eac0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1c17a8f9318b7d288ebd84aa0386ef085d88dcdcc233d1761ac4b0a6bfdbe02b", - git_commit = "a1394226966bc1bebef0dda153224bbf0ffc95fe", + sha256 = "19028e322e718a0d6c0242d21d997839c2ca31d1fd31521dbdffc88a840e8f6b", + git_commit = "b56f3f587f4d67ee57520ac6d5a76a52843f6248", ) # Import all of TensorFlow Serving's external dependencies. From 2624a8908c337e6276d786ffb47dc300a4dd13c4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 11 Jun 2022 00:01:40 -0700 Subject: [PATCH 5898/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2260d3c7-bb06-4a60-9bd1-2d67f0b73119 PiperOrigin-RevId: 454308690 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3e6b361eac0..478a6427536 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "19028e322e718a0d6c0242d21d997839c2ca31d1fd31521dbdffc88a840e8f6b", - git_commit = "b56f3f587f4d67ee57520ac6d5a76a52843f6248", + sha256 = "3bc0d06e40a75fceb17b92a473e801cf1987611328d0005143e9a80701d9b4f5", + git_commit = "fee4cabd601c3396fd23e1a9706cb740a6303078", ) # Import all of TensorFlow Serving's external dependencies. From 2ca833faf756ad732c9cad31fb4c93182ab40d04 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 11 Jun 2022 06:01:30 -0700 Subject: [PATCH 5899/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bc1c9e45-f163-46d6-b75c-88189837e8cc PiperOrigin-RevId: 454341291 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 478a6427536..8633294d010 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3bc0d06e40a75fceb17b92a473e801cf1987611328d0005143e9a80701d9b4f5", - git_commit = "fee4cabd601c3396fd23e1a9706cb740a6303078", + sha256 = "6f6e84965059b00e5d08ae2c688ac17bb8a93c0bd632a19d99415f4cc752abed", + git_commit = "7dc88b6620682d3338d6a08ff4a255f32c65aae8", ) # Import all of TensorFlow Serving's external dependencies. From ebdf9c40d20da4d6f98d86416efcf29801a46b6e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 11 Jun 2022 12:01:34 -0700 Subject: [PATCH 5900/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8614f3c6-571b-4469-8a15-9c4d328323f9 PiperOrigin-RevId: 454367191 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8633294d010..57188fa789d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6f6e84965059b00e5d08ae2c688ac17bb8a93c0bd632a19d99415f4cc752abed", - git_commit = "7dc88b6620682d3338d6a08ff4a255f32c65aae8", + sha256 = "600cc998337ad8024fcf1a00e780cdddbe8dcce4d22ca2d2bbfad6ac9fa87ced", + git_commit = "5e781882f19acead0dd890537279c48a5652af00", ) # Import all of TensorFlow Serving's external dependencies. From b5b4f5758084496eb411f43cfa02b1e94c97f62e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 11 Jun 2022 18:01:26 -0700 Subject: [PATCH 5901/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/468fa6f8-99be-41c3-96ce-688c2d73fc20 PiperOrigin-RevId: 454393511 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 57188fa789d..a602919472b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "600cc998337ad8024fcf1a00e780cdddbe8dcce4d22ca2d2bbfad6ac9fa87ced", - git_commit = "5e781882f19acead0dd890537279c48a5652af00", + sha256 = "71c3e72584107eafa42ae1cdbbda70b7944c681b47b3c0f5c65a8f36fc6d26f4", + git_commit = "325aa485592338bc4799ea5e28aa568299cb2b9b", ) # Import all of TensorFlow Serving's external dependencies. From 3b945058794d643d59a6416179f3e0a4a3b1f4a5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 12 Jun 2022 06:01:31 -0700 Subject: [PATCH 5902/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9dd6b1a5-b0fc-4256-9224-b66b9019cebc PiperOrigin-RevId: 454451399 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a602919472b..74a8b7a16cd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "71c3e72584107eafa42ae1cdbbda70b7944c681b47b3c0f5c65a8f36fc6d26f4", - git_commit = "325aa485592338bc4799ea5e28aa568299cb2b9b", + sha256 = "4dfc07bfcb55ce861742720d99c2c876c60943587bc5c59d397f48e5863c9ecb", + git_commit = "08c5ffcc3df518b0d35c60c28dd19150a9c83a21", ) # Import all of TensorFlow Serving's external dependencies. From e823002cf32226cc6c32a698f1434e71e0895a98 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 12 Jun 2022 18:01:23 -0700 Subject: [PATCH 5903/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/795a1c14-671e-40ee-99fb-db4b2325ec3e PiperOrigin-RevId: 454502638 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 74a8b7a16cd..24c1dbac089 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4dfc07bfcb55ce861742720d99c2c876c60943587bc5c59d397f48e5863c9ecb", - git_commit = "08c5ffcc3df518b0d35c60c28dd19150a9c83a21", + sha256 = "22ffa0ada3de0efc49f17456db25bdf9ba9932174b6da5aa2e770fcbac7f5f08", + git_commit = "443fe702c921de94b62878dae567b3e4c1016b27", ) # Import all of TensorFlow Serving's external dependencies. From 6da9c43c5f71abe361841fb3fd5eaad57fc847b1 Mon Sep 17 00:00:00 2001 From: Philip Sun Date: Mon, 13 Jun 2022 13:14:39 -0700 Subject: [PATCH 5904/8103] Merge and clean up implementations of `GetModelDiskSize` and `GetAllDescendants` in util.cc. PiperOrigin-RevId: 454682459 --- .../servables/tensorflow/util.cc | 59 ++++++++----------- 1 file changed, 23 insertions(+), 36 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/util.cc b/tensorflow_serving/servables/tensorflow/util.cc index 69abfb2e975..6cc65aca411 100644 --- a/tensorflow_serving/servables/tensorflow/util.cc +++ b/tensorflow_serving/servables/tensorflow/util.cc @@ -95,35 +95,6 @@ int NumInputExamples(const internal::SerializedInput& input) { std::atomic signature_method_check{true}; -// Returns all the descendants, both directories and files, recursively under -// 'dirname'. The paths returned are all prefixed with 'dirname'. -Status GetAllDescendants(const string& dirname, FileProbingEnv* env, - std::vector* const descendants) { - descendants->clear(); - // Make sure that dirname exists; - TF_RETURN_IF_ERROR(env->FileExists(dirname)); - std::deque dir_q; // Queue for the BFS - std::vector dir_list; // List of all dirs discovered - dir_q.push_back(dirname); - // Do a BFS on the directory to discover all immediate children. - while (!dir_q.empty()) { - const string dir = dir_q.front(); - dir_q.pop_front(); - std::vector children; - // GetChildren might fail if we don't have appropriate permissions. - TF_RETURN_IF_ERROR(env->GetChildren(dir, &children)); - for (const string& child : children) { - const string child_path = io::JoinPath(dir, child); - descendants->push_back(child_path); - // If the child is a directory add it to the queue. - if (env->IsDirectory(child_path).ok()) { - dir_q.push_back(child_path); - } - } - } - return Status::OK(); -} - } // namespace namespace internal { @@ -291,15 +262,31 @@ Status GetModelDiskSize(const string& path, FileProbingEnv* env, if (env == nullptr) { return errors::Internal("FileProbingEnv not set"); } + // Make sure that path exists. + TF_RETURN_IF_ERROR(env->FileExists(path)); - std::vector descendants; - TF_RETURN_IF_ERROR(GetAllDescendants(path, env, &descendants)); *total_file_size = 0; - for (const string& descendant : descendants) { - if (!(env->IsDirectory(descendant).ok())) { - uint64_t file_size; - TF_RETURN_IF_ERROR(env->GetFileSize(descendant, &file_size)); - *total_file_size += file_size; + std::deque dir_q; // Queue for the BFS + + dir_q.push_back(path); + // Do a BFS on the directory to discover all immediate children. + while (!dir_q.empty()) { + const string dir = dir_q.front(); + dir_q.pop_front(); + std::vector children; + // GetChildren might fail if we don't have appropriate permissions. + TF_RETURN_IF_ERROR(env->GetChildren(dir, &children)); + for (const string& child : children) { + const string child_path = io::JoinPath(dir, child); + if (env->IsDirectory(child_path).ok()) { + // If the child is a directory add it to the queue. + dir_q.push_back(child_path); + } else { + // Otherwise, add its file size to total_file_size. + uint64_t file_size; + TF_RETURN_IF_ERROR(env->GetFileSize(child_path, &file_size)); + *total_file_size += file_size; + } } } return Status::OK(); From d09d2efe6e9b88ef0266e5982a3e732da14dc93b Mon Sep 17 00:00:00 2001 From: Philip Sun Date: Mon, 13 Jun 2022 15:40:05 -0700 Subject: [PATCH 5905/8103] Parallelize iteration over child files in `GetModelDiskSize` PiperOrigin-RevId: 454715333 --- tensorflow_serving/servables/tensorflow/BUILD | 1 + .../servables/tensorflow/util.cc | 41 +++++++++++++++---- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index b271bd23349..3d54ece58bf 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -873,6 +873,7 @@ cc_library( "//tensorflow_serving/resources:resource_values", "//tensorflow_serving/resources:resources_cc_proto", "//tensorflow_serving/util:file_probing_env", + "//tensorflow_serving/util:threadpool_executor", "@com_google_absl//absl/types:optional", "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/cc/saved_model:signature_constants", diff --git a/tensorflow_serving/servables/tensorflow/util.cc b/tensorflow_serving/servables/tensorflow/util.cc index 6cc65aca411..fc858926440 100644 --- a/tensorflow_serving/servables/tensorflow/util.cc +++ b/tensorflow_serving/servables/tensorflow/util.cc @@ -34,6 +34,7 @@ limitations under the License. #include "tensorflow_serving/apis/internal/serialized_input.pb.h" #include "tensorflow_serving/apis/model.pb.h" #include "tensorflow_serving/resources/resource_values.h" +#include "tensorflow_serving/util/threadpool_executor.h" namespace tensorflow { namespace serving { @@ -276,16 +277,38 @@ Status GetModelDiskSize(const string& path, FileProbingEnv* env, std::vector children; // GetChildren might fail if we don't have appropriate permissions. TF_RETURN_IF_ERROR(env->GetChildren(dir, &children)); - for (const string& child : children) { - const string child_path = io::JoinPath(dir, child); - if (env->IsDirectory(child_path).ok()) { - // If the child is a directory add it to the queue. - dir_q.push_back(child_path); + // Multi-threaded writes are safe for int but not bool, so we use int below. + std::vector child_is_dir(children.size()); + std::vector> children_sizes(children.size()); + + { + // Filesystem operations may block for a long time so this process is + // vastly accelerated by parallelizing the iteration over children. + ThreadPoolExecutor executor(Env::Default(), "ModelDiskSizePool", 256); + for (int i = 0; i < children.size(); i++) { + const string child_path = io::JoinPath(dir, children[i]); + children[i] = child_path; + executor.Schedule( + [i, child_path, env, &child_is_dir, &children_sizes]() { + if (env->IsDirectory(child_path).ok()) { + // If the child is a directory add it to the queue. + child_is_dir[i] = 1; + } else { + // Otherwise, add its file size to total_file_size. + uint64_t file_size; + Status status = env->GetFileSize(child_path, &file_size); + children_sizes[i] = + status.ok() ? StatusOr(file_size) : status; + } + }); + } + } + for (int i = 0; i < children.size(); i++) { + if (child_is_dir[i] == 1) { + dir_q.push_back(children[i]); } else { - // Otherwise, add its file size to total_file_size. - uint64_t file_size; - TF_RETURN_IF_ERROR(env->GetFileSize(child_path, &file_size)); - *total_file_size += file_size; + TF_RETURN_IF_ERROR(children_sizes[i].status()); + *total_file_size += *children_sizes[i]; } } } From 0599bdf0e9dff76e89e8632fb76b752248dd4652 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 17 Jun 2022 18:01:24 -0700 Subject: [PATCH 5906/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/64323b2d-6f10-4b9f-9004-e1da374a3341 PiperOrigin-RevId: 455731857 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 24c1dbac089..56e6e34e213 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "22ffa0ada3de0efc49f17456db25bdf9ba9932174b6da5aa2e770fcbac7f5f08", - git_commit = "443fe702c921de94b62878dae567b3e4c1016b27", + sha256 = "e63d466ede347e9304422c552cae16e9f9f04fec3b52ed08b65cc53a580b81a9", + git_commit = "3ef396642bb88580b527077cf2d6dc12325085be", ) # Import all of TensorFlow Serving's external dependencies. From 34e37a531583bda4fea94b5d2c9965693ada37bd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 18 Jun 2022 00:01:34 -0700 Subject: [PATCH 5907/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c3975ddc-495f-4b80-9680-a2bdd2135e85 PiperOrigin-RevId: 455764947 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 56e6e34e213..15c2176f9a5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e63d466ede347e9304422c552cae16e9f9f04fec3b52ed08b65cc53a580b81a9", - git_commit = "3ef396642bb88580b527077cf2d6dc12325085be", + sha256 = "55baaf79946cb8be248ec7cabae19f3b18d28ef430d3d1e5ee112d9e6b178cd8", + git_commit = "bc58b1e7a97fc1bdcc8379ea25de09950e93bf01", ) # Import all of TensorFlow Serving's external dependencies. From be51d705386cff4f2cad01f51f6fee9030b9aee0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 18 Jun 2022 06:01:42 -0700 Subject: [PATCH 5908/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/64f10469-8161-4142-bb60-c2764c0c1779 PiperOrigin-RevId: 455799911 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 15c2176f9a5..4ce40845d49 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "55baaf79946cb8be248ec7cabae19f3b18d28ef430d3d1e5ee112d9e6b178cd8", - git_commit = "bc58b1e7a97fc1bdcc8379ea25de09950e93bf01", + sha256 = "2c0e8911962debf543e82e603a3af24b9d4031e53d99d2b3ee613f5b62d66745", + git_commit = "cbd5590c952f7333276da41a6a0bb53ee8ae434e", ) # Import all of TensorFlow Serving's external dependencies. From 0052ce261a60c1e21d2958e734ec330ebe08efbf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 19 Jun 2022 06:01:42 -0700 Subject: [PATCH 5909/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c299ffa2-d95b-4477-9df4-222a16fef85a PiperOrigin-RevId: 455915281 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4ce40845d49..17756f9fd45 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2c0e8911962debf543e82e603a3af24b9d4031e53d99d2b3ee613f5b62d66745", - git_commit = "cbd5590c952f7333276da41a6a0bb53ee8ae434e", + sha256 = "e19da47b2d03ed55781c33a41d1269c53de1263f91dfd8185fcb46c4b4cf2433", + git_commit = "7b5d88436b6c8e370cd8782744a11bfa3420eb50", ) # Import all of TensorFlow Serving's external dependencies. From dde2f9215da3b7c574443f26b2801503dd9c9c91 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 19 Jun 2022 12:01:33 -0700 Subject: [PATCH 5910/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c8393ab9-b544-4ad4-971b-b82f179083c0 PiperOrigin-RevId: 455942293 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 17756f9fd45..72190deaf42 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e19da47b2d03ed55781c33a41d1269c53de1263f91dfd8185fcb46c4b4cf2433", - git_commit = "7b5d88436b6c8e370cd8782744a11bfa3420eb50", + sha256 = "8b04719567533ded85bafb2e4b6a37691a002a7a5f18488976c583c04f53b9b0", + git_commit = "9358dda695280e201aad17417b7cbff2bc91cfa4", ) # Import all of TensorFlow Serving's external dependencies. From 85579642d9adcbf86c60bc47c4cfd4a8c0bd2b8d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 Jun 2022 00:01:28 -0700 Subject: [PATCH 5911/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/061aa8d5-c9fb-455f-87fb-ca7296194f6e PiperOrigin-RevId: 456005728 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 72190deaf42..ce2d2a374f9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8b04719567533ded85bafb2e4b6a37691a002a7a5f18488976c583c04f53b9b0", - git_commit = "9358dda695280e201aad17417b7cbff2bc91cfa4", + sha256 = "7d58bdcaed7f708069954ae8ba509f29a951be52f5d4eab3688658532864c174", + git_commit = "a1d43e94a3cf271bdfa69e46a59794871697de07", ) # Import all of TensorFlow Serving's external dependencies. From ff6be7af661904906c949a304cf91de1c439ec07 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 Jun 2022 06:01:32 -0700 Subject: [PATCH 5912/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0cf4a598-d890-42b9-8384-7fc96345d15e PiperOrigin-RevId: 456060079 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ce2d2a374f9..92c5b08a3a5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7d58bdcaed7f708069954ae8ba509f29a951be52f5d4eab3688658532864c174", - git_commit = "a1d43e94a3cf271bdfa69e46a59794871697de07", + sha256 = "5a3d2fbf419d7d2d4df4352f4cb91c201d63ce832cc08f5e5ece3ae2633dc34a", + git_commit = "54064a1ff236173581829b45aa119ff2a2fbdf45", ) # Import all of TensorFlow Serving's external dependencies. From b9a679f436d5adf4db30f7fe522056dcf23d3596 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 Jun 2022 12:01:32 -0700 Subject: [PATCH 5913/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/27f69406-aae2-4a1c-a537-e5ec3f3b2ecc PiperOrigin-RevId: 456107884 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 92c5b08a3a5..3e4dae8bcbf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5a3d2fbf419d7d2d4df4352f4cb91c201d63ce832cc08f5e5ece3ae2633dc34a", - git_commit = "54064a1ff236173581829b45aa119ff2a2fbdf45", + sha256 = "0494b2332a7ce466fb1352fee931f982738ca5a838174ec1e86e98fe535593df", + git_commit = "3ff8de0af8f1e29d91b483400737002776c71109", ) # Import all of TensorFlow Serving's external dependencies. From 806541567f0cead4a470fe7c3720e7f7e0b21b09 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 20 Jun 2022 18:01:25 -0700 Subject: [PATCH 5914/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f74cea09-8dd8-40cb-8343-1d4a6f8b114c PiperOrigin-RevId: 456143095 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3e4dae8bcbf..03614da88d7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0494b2332a7ce466fb1352fee931f982738ca5a838174ec1e86e98fe535593df", - git_commit = "3ff8de0af8f1e29d91b483400737002776c71109", + sha256 = "fa3845c084aee2b28a574c5aedb14909fe6c13c857ab47fb6021c6e5718fbe8d", + git_commit = "712b22feb176c2ca03706d596288e75110ef4156", ) # Import all of TensorFlow Serving's external dependencies. From 3611320dbc3e71a9803cb8ecdf154680f653b7bb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 Jun 2022 06:01:35 -0700 Subject: [PATCH 5915/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d9fb41b5-6582-489e-a675-7cc293cc2986 PiperOrigin-RevId: 456237477 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 03614da88d7..af6c7f95660 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fa3845c084aee2b28a574c5aedb14909fe6c13c857ab47fb6021c6e5718fbe8d", - git_commit = "712b22feb176c2ca03706d596288e75110ef4156", + sha256 = "a8b033346ac509ef2bf8b507bb7360dd2d90f8bad497b86bf9a960b54f2db924", + git_commit = "bfd98ceecbcc884c680e7e425609e206b3c06241", ) # Import all of TensorFlow Serving's external dependencies. From 3c6fb22fb1b71cc95fe0052b4e5f9d8c953e61c4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 Jun 2022 12:01:28 -0700 Subject: [PATCH 5916/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/600bc4ca-10c4-4b25-983f-6a646d7fcc09 PiperOrigin-RevId: 456317376 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index af6c7f95660..03c697081ad 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a8b033346ac509ef2bf8b507bb7360dd2d90f8bad497b86bf9a960b54f2db924", - git_commit = "bfd98ceecbcc884c680e7e425609e206b3c06241", + sha256 = "f2ce2a120751002e2178e12627223705ac148d42022b42ac612a56e3a2862518", + git_commit = "bd054e6bb22e6861521805073e9152fe8a89a3a2", ) # Import all of TensorFlow Serving's external dependencies. From 18f860fc29abe5417e05dd6599c503e3b91f067f Mon Sep 17 00:00:00 2001 From: Raviteja Gorijala Date: Tue, 21 Jun 2022 13:09:53 -0700 Subject: [PATCH 5917/8103] Add release notes for tf-serving 2.6.5 PiperOrigin-RevId: 456332921 --- RELEASE.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/RELEASE.md b/RELEASE.md index 37cbf890caf..03066e4df3d 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,3 +1,27 @@ +# Release 2.6.5 + +## Major Features and Improvements + +* No major features or improvements. + +## Breaking Changes + +* No breaking changes + +## Bug Fixes and Other Changes + +* Rollback incompatible C++17 changes. (commit: ba0fa72b61bc2c42388b815253ba72e6830f03cf) +* Roll forward with std::optional -> absl::optional. (commit: 009dac683bf84165b84702d177bb9a021ebef728) +* Replace STL algorithm call with a container method (performance-inefficient-algorithm). (commit: f5bc09998e0043ce72d34b14104379163048406c) +* Remove unused "using" decl. (commit: ffcc4a16c76c4fa1189edd9682fc486442a33e52) +* Move status_proto to public visible apis/ (it being used by public API protos) (commit: 7f894c79fce5e58758f3cb49e858a16e3602ae80) +* Move core/logging.proto -> apis/logging.proto (commit: 37c64b8820a923aafc1b5c8bf264fd5cce5224f3) +* Update TF Text to v2.5.0. (commit: 48e5a9e23a1e0b2951b77c3e8f9832193d9b1851) +* Adding python targets for config protos (commit: 757c3a6b6c8a03731dc73ff758f69a61aeddcf67) +* Remove experimental tags from uses of gRPC C++ callback API. (commit: b355023b034ca6ef72b507920d9de2a02e0f4a2a) +* Add new --use_alts_credentials flag, to enable building secure credentials using Google ALTS. (commit: ceba636bb7c5c98bde35d1818fd033b36300fffe) +* Enable HTTP PATCH support in evhttp_server (commit: 6cbc4a9eb419c8078c3a4e791381cda70dd8fc78) + # Release 2.9.0 ## Major Features and Improvements From 35aa337e7ec5c8f2ba870f037911c75fe9e553e4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 21 Jun 2022 18:01:28 -0700 Subject: [PATCH 5918/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e7b332d0-1879-4dca-8852-110c3ed35c56 PiperOrigin-RevId: 456395276 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 03c697081ad..5514edf5d37 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f2ce2a120751002e2178e12627223705ac148d42022b42ac612a56e3a2862518", - git_commit = "bd054e6bb22e6861521805073e9152fe8a89a3a2", + sha256 = "c0f544f5adf380c8da44c33e615f792d9ca83c669d4a2003134fe7e14f147301", + git_commit = "705e1684593327dae7b1e71087d5c0f97f6e9b25", ) # Import all of TensorFlow Serving's external dependencies. From 770bb4b3c17ded2f2a535ceba5ec6b6fae3194d9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 22 Jun 2022 00:01:35 -0700 Subject: [PATCH 5919/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/07831772-6c51-4b20-96d6-ce364ef0d1a3 PiperOrigin-RevId: 456442187 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5514edf5d37..91bdd3f0a8f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c0f544f5adf380c8da44c33e615f792d9ca83c669d4a2003134fe7e14f147301", - git_commit = "705e1684593327dae7b1e71087d5c0f97f6e9b25", + sha256 = "d7673a5407c2b05c7778fd5447b60628e0d0a839d4727a1561b9dfdd3ef93e5b", + git_commit = "be962ba7c780aed973b1c43314aff90a2d15fd87", ) # Import all of TensorFlow Serving's external dependencies. From 486b948926cfde9b9d01b4431774205806a24c2f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 22 Jun 2022 06:01:17 -0700 Subject: [PATCH 5920/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/788b237b-ad3d-4457-9728-1b94c7c52e52 PiperOrigin-RevId: 456494021 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 91bdd3f0a8f..306b9b6b6dc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d7673a5407c2b05c7778fd5447b60628e0d0a839d4727a1561b9dfdd3ef93e5b", - git_commit = "be962ba7c780aed973b1c43314aff90a2d15fd87", + sha256 = "22d5e634f202ef888879eaa982ee088c1c075f4188be3504e5cdf0161af961f7", + git_commit = "bc9692386994bee47ea0a2da66633cb03fa4ab5b", ) # Import all of TensorFlow Serving's external dependencies. From 9187d68cfa526361c5d2c86076da123a0e4fa9bc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 22 Jun 2022 12:01:16 -0700 Subject: [PATCH 5921/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e707dffb-a47d-49d1-a212-bbdf3c118680 PiperOrigin-RevId: 456573556 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 306b9b6b6dc..fc38ec2b3b7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "22d5e634f202ef888879eaa982ee088c1c075f4188be3504e5cdf0161af961f7", - git_commit = "bc9692386994bee47ea0a2da66633cb03fa4ab5b", + sha256 = "ddb23553f38a3dab0075e28bfb2bae993d0e4e7f5aa066201a533bf6a5a7cbad", + git_commit = "ddb914b13e6a48791c8cbef55375675dc1943030", ) # Import all of TensorFlow Serving's external dependencies. From f2aa0b7d4d21a30ad3554e6fe65bac2fba285263 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 22 Jun 2022 18:01:22 -0700 Subject: [PATCH 5922/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/155288b7-3938-4692-a806-f1d3a29ac38f PiperOrigin-RevId: 456651730 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fc38ec2b3b7..9838e5b555c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ddb23553f38a3dab0075e28bfb2bae993d0e4e7f5aa066201a533bf6a5a7cbad", - git_commit = "ddb914b13e6a48791c8cbef55375675dc1943030", + sha256 = "01ec12e1099e4f169dc018f92f204bd83f840f2edd6bb7c0a4bc2e8dacb11154", + git_commit = "b6277b825a79d5aba6bc82a3f8b241d50ea6f4ca", ) # Import all of TensorFlow Serving's external dependencies. From 04cda2da75ee2a9864510e981ea2e51d76434a90 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 Jun 2022 00:01:21 -0700 Subject: [PATCH 5923/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7e709510-0403-44f0-a091-fe547f42010f PiperOrigin-RevId: 456695966 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9838e5b555c..2878924e7d1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "01ec12e1099e4f169dc018f92f204bd83f840f2edd6bb7c0a4bc2e8dacb11154", - git_commit = "b6277b825a79d5aba6bc82a3f8b241d50ea6f4ca", + sha256 = "f9f99158a972b66cea1475b2af001a38ae8a68bc397103e1b2a46d8da2050ce7", + git_commit = "256d561c1001bc662cf079aef71f30df12555ea9", ) # Import all of TensorFlow Serving's external dependencies. From a22c5da55d3a41061aed4824ff46a7013da2179a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 Jun 2022 06:01:16 -0700 Subject: [PATCH 5924/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/957b0266-4444-437d-95fc-240ccc2adde1 PiperOrigin-RevId: 456748486 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2878924e7d1..cdcf3648a27 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f9f99158a972b66cea1475b2af001a38ae8a68bc397103e1b2a46d8da2050ce7", - git_commit = "256d561c1001bc662cf079aef71f30df12555ea9", + sha256 = "b4b1d30436cb5c49183e90e612876714a54c7169ab4d59d445287b5357053d90", + git_commit = "00d032ccf7c442696349ebe56759c7225944ccda", ) # Import all of TensorFlow Serving's external dependencies. From 5c4fc3c40bb2571202637efe660354f298a55663 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 Jun 2022 12:01:20 -0700 Subject: [PATCH 5925/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/dfd75f98-0b2b-4a28-a0bc-4d1510544912 PiperOrigin-RevId: 456829497 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cdcf3648a27..49876d76281 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b4b1d30436cb5c49183e90e612876714a54c7169ab4d59d445287b5357053d90", - git_commit = "00d032ccf7c442696349ebe56759c7225944ccda", + sha256 = "c63727e8b466de8727012408890d068690ff5d156da965ff34f8a5692d20a463", + git_commit = "e4fdc0c71c4cc97030a3b141ca8f005bcc09b9cf", ) # Import all of TensorFlow Serving's external dependencies. From 09c85979abc62a2dbb21bf95e487414d113734f2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 23 Jun 2022 18:01:14 -0700 Subject: [PATCH 5926/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/12147410-57ab-4563-935b-fa0404af039b PiperOrigin-RevId: 456902432 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 49876d76281..b0dd14a982d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c63727e8b466de8727012408890d068690ff5d156da965ff34f8a5692d20a463", - git_commit = "e4fdc0c71c4cc97030a3b141ca8f005bcc09b9cf", + sha256 = "ec63c2966813a824325843b36886ab30bbd7953b18217d0a02f3fab82f91c751", + git_commit = "de4926348cf4b1706700459ff88ddfdd052d8a0f", ) # Import all of TensorFlow Serving's external dependencies. From 131d4be4a3e0545f411add770311ee9352eb5ef6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Jun 2022 00:01:32 -0700 Subject: [PATCH 5927/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1fc91b54-347a-4126-9f92-59fbd232c231 PiperOrigin-RevId: 456943839 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b0dd14a982d..3c882870108 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ec63c2966813a824325843b36886ab30bbd7953b18217d0a02f3fab82f91c751", - git_commit = "de4926348cf4b1706700459ff88ddfdd052d8a0f", + sha256 = "37380006dd44074e44949ebe0be75c0f8d930e78be4939a03bdc4d9815c448a8", + git_commit = "0118c4b04ba071af27995e2eee4280408cbf82e4", ) # Import all of TensorFlow Serving's external dependencies. From 8dc390501e6003d3fb58124b4a51c5fdd1a2b908 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Jun 2022 06:01:16 -0700 Subject: [PATCH 5928/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ffa04580-d711-46da-b231-910a8fc3a038 PiperOrigin-RevId: 456994205 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3c882870108..76e2b058911 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "37380006dd44074e44949ebe0be75c0f8d930e78be4939a03bdc4d9815c448a8", - git_commit = "0118c4b04ba071af27995e2eee4280408cbf82e4", + sha256 = "969c832168190955fb002d538fb3864491275b1869762490b64b5131c00bce02", + git_commit = "857cf9caee7122194df84a853e0473b0332905f4", ) # Import all of TensorFlow Serving's external dependencies. From 501c2279a20546520cf211014327f5713a5b9899 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Jun 2022 12:01:16 -0700 Subject: [PATCH 5929/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/021bd948-4da5-4b3c-ac99-f92f0da1bec4 PiperOrigin-RevId: 457062547 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 76e2b058911..75c0c704161 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "969c832168190955fb002d538fb3864491275b1869762490b64b5131c00bce02", - git_commit = "857cf9caee7122194df84a853e0473b0332905f4", + sha256 = "25098d29d4599ebead6264bab3a0c9f0bbcf26b3e1cd308ee661d095f244a3e9", + git_commit = "28f46b2dac3fa42b1a5191edcf3a054995d34e95", ) # Import all of TensorFlow Serving's external dependencies. From 5c4a952f5b850406b21385ed05a063cd7b305687 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 24 Jun 2022 18:01:18 -0700 Subject: [PATCH 5930/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/eaf5a59c-ff77-4a64-bc08-3d691632e87a PiperOrigin-RevId: 457129018 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 75c0c704161..3c22792ad8e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "25098d29d4599ebead6264bab3a0c9f0bbcf26b3e1cd308ee661d095f244a3e9", - git_commit = "28f46b2dac3fa42b1a5191edcf3a054995d34e95", + sha256 = "ae3a29de21f01ceb27706745217e6646937e3829a914e380ab60932eb25c25ed", + git_commit = "e446f8390c0cd2311abf6f04a2fa92f8f4ec815e", ) # Import all of TensorFlow Serving's external dependencies. From 1d7cd5b2ba43c3d98f0c8bef6806c203b2c14592 Mon Sep 17 00:00:00 2001 From: Guanxin Qiao Date: Fri, 24 Jun 2022 19:56:15 -0700 Subject: [PATCH 5931/8103] Fix gpu docker build failure due to bad substitution PiperOrigin-RevId: 457141259 --- tensorflow_serving/tools/docker/Dockerfile.gpu | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/tools/docker/Dockerfile.gpu b/tensorflow_serving/tools/docker/Dockerfile.gpu index 9221dc69cd1..3d3a67290d0 100644 --- a/tensorflow_serving/tools/docker/Dockerfile.gpu +++ b/tensorflow_serving/tools/docker/Dockerfile.gpu @@ -34,7 +34,7 @@ RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/ apt-get update && apt-get install -y --no-install-recommends \ ca-certificates \ cuda-command-line-tools-11-2 \ - cuda-nvrtc-${CUDA/./-} \ + cuda-nvrtc-11-2 \ libcublas-11-2 \ libcublas-dev-11-2 \ libcufft-11-2 \ From 9145fedfef43b2e5d4c9e35d6067eb15b85512af Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 25 Jun 2022 00:01:18 -0700 Subject: [PATCH 5932/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ad7ed1de-bbc8-4135-9627-084ba64fff34 PiperOrigin-RevId: 457161888 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3c22792ad8e..93e5a8dae7b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ae3a29de21f01ceb27706745217e6646937e3829a914e380ab60932eb25c25ed", - git_commit = "e446f8390c0cd2311abf6f04a2fa92f8f4ec815e", + sha256 = "f8f577b5d350633e0499025090bed94f7e73203bfa95a70e62092f55281dfd42", + git_commit = "a75ade722b1298605f60972400536d4847f84370", ) # Import all of TensorFlow Serving's external dependencies. From cd52cf6e2112599df1c199c76cbf9422fd500bfb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 25 Jun 2022 06:01:32 -0700 Subject: [PATCH 5933/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4065d1fc-74fd-47b7-92bd-450c3bb2413d PiperOrigin-RevId: 457196115 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 93e5a8dae7b..f71e4df77b7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f8f577b5d350633e0499025090bed94f7e73203bfa95a70e62092f55281dfd42", - git_commit = "a75ade722b1298605f60972400536d4847f84370", + sha256 = "0db62823ccae12a71f6556ec1da9ff9019562c1d75bb4e652159bec135ba3a0c", + git_commit = "11dad8245a4a3a03f5f8e5bc58c3538bc940ea81", ) # Import all of TensorFlow Serving's external dependencies. From 5c2fd9cfcf3aeedf8c0db9245fe5cf0993d5f793 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 25 Jun 2022 18:01:16 -0700 Subject: [PATCH 5934/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c0289e48-b4be-4590-94c6-7a647538c259 PiperOrigin-RevId: 457252212 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f71e4df77b7..5566d95cedd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0db62823ccae12a71f6556ec1da9ff9019562c1d75bb4e652159bec135ba3a0c", - git_commit = "11dad8245a4a3a03f5f8e5bc58c3538bc940ea81", + sha256 = "cfc6fca673c021b59393c403e322850fb6e9c7e4e3552e5f14ba4ad8e805e1a2", + git_commit = "d6e6ee38f43d6e3d65a74fd49c75e00aef7b8896", ) # Import all of TensorFlow Serving's external dependencies. From ea543bc6d75eb39eecdbf8fc0ef742a3fe1196a6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 26 Jun 2022 00:01:26 -0700 Subject: [PATCH 5935/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/425f8df3-1d49-42b8-85de-a2d131955bd1 PiperOrigin-RevId: 457279549 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5566d95cedd..75c35831764 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cfc6fca673c021b59393c403e322850fb6e9c7e4e3552e5f14ba4ad8e805e1a2", - git_commit = "d6e6ee38f43d6e3d65a74fd49c75e00aef7b8896", + sha256 = "37743da672b0a87b786c8c7881a79b3b35a743aef4e24e337366bcd213a3f3f9", + git_commit = "824bca330ae48eff0f7fd88ee0a200f2f023816f", ) # Import all of TensorFlow Serving's external dependencies. From 7ab822b47be53a710dae2f57214c7c7126c9e11f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 26 Jun 2022 06:01:21 -0700 Subject: [PATCH 5936/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d3fece2e-ee8b-4f19-9fd2-7f967ce3f74a PiperOrigin-RevId: 457308453 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 75c35831764..597c8a503a6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "37743da672b0a87b786c8c7881a79b3b35a743aef4e24e337366bcd213a3f3f9", - git_commit = "824bca330ae48eff0f7fd88ee0a200f2f023816f", + sha256 = "f4c820e42aa366ccd76ab4c953a7460c4fd86fd8e0420e643e8d55da8f0334e8", + git_commit = "dcdf467d7f2e41fcba0996232927b683b536d237", ) # Import all of TensorFlow Serving's external dependencies. From 9f3eddfb75a20b18463aaa7cfed7b3a6c668bfff Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 26 Jun 2022 12:01:16 -0700 Subject: [PATCH 5937/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b2c48406-1ad3-4286-8409-b2e69f4a9735 PiperOrigin-RevId: 457339127 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 597c8a503a6..6a503df0b7c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f4c820e42aa366ccd76ab4c953a7460c4fd86fd8e0420e643e8d55da8f0334e8", - git_commit = "dcdf467d7f2e41fcba0996232927b683b536d237", + sha256 = "fe86501a592f707af04be33d517b5e1fdb7b598e799f4a9225c9f6da3dcf5eeb", + git_commit = "b7ad82af8cd379f3faac321070f918bb60ae300b", ) # Import all of TensorFlow Serving's external dependencies. From 7edfd7b2c501feefd11f5c61dffcb47c1c6d0140 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 27 Jun 2022 00:01:20 -0700 Subject: [PATCH 5938/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0b6045fc-badc-4375-ab3c-6505bb2f6989 PiperOrigin-RevId: 457404412 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6a503df0b7c..b7de7918dd7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fe86501a592f707af04be33d517b5e1fdb7b598e799f4a9225c9f6da3dcf5eeb", - git_commit = "b7ad82af8cd379f3faac321070f918bb60ae300b", + sha256 = "7d2591132c79ed4c7b4fe934bb03f4c328540ae58643f48441043915a6a1d289", + git_commit = "f1a1a094d05ba7a22916c8b572f6650c39b93543", ) # Import all of TensorFlow Serving's external dependencies. From 6bdd87e64fcae1a2543f61dfd21ef3ccd12d2123 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 27 Jun 2022 06:01:16 -0700 Subject: [PATCH 5939/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/254b03ce-fe1d-4334-afab-242d7680eea3 PiperOrigin-RevId: 457458310 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b7de7918dd7..3e444561bf9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7d2591132c79ed4c7b4fe934bb03f4c328540ae58643f48441043915a6a1d289", - git_commit = "f1a1a094d05ba7a22916c8b572f6650c39b93543", + sha256 = "d864219728c02662d114250967bffa192d922fd76541042dcf340af40d44bb2c", + git_commit = "1a08473a0f13e6c75e85a0148f0c98d4a479475d", ) # Import all of TensorFlow Serving's external dependencies. From 45951f590226f6be17369573488f5ad4bb5abfd4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 27 Jun 2022 12:01:16 -0700 Subject: [PATCH 5940/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d82315fa-b950-4bf0-87ed-68269cf8a2db PiperOrigin-RevId: 457534394 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3e444561bf9..efc362be790 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d864219728c02662d114250967bffa192d922fd76541042dcf340af40d44bb2c", - git_commit = "1a08473a0f13e6c75e85a0148f0c98d4a479475d", + sha256 = "6cdf832e8528b62bd051ed14199f3f90fdb3a3356bd95ee9664acf3d43540f23", + git_commit = "16e22e770306633dcfc7b9990a17fd4e1fbcc44b", ) # Import all of TensorFlow Serving's external dependencies. From e9183b468d2ead6a56af998bcf55d0565bddfc91 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 27 Jun 2022 18:01:18 -0700 Subject: [PATCH 5941/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d6aaf890-ddd9-47df-9ea7-56f32ff18a82 PiperOrigin-RevId: 457610320 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index efc362be790..a4e3b76c825 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6cdf832e8528b62bd051ed14199f3f90fdb3a3356bd95ee9664acf3d43540f23", - git_commit = "16e22e770306633dcfc7b9990a17fd4e1fbcc44b", + sha256 = "6caa4c79d1d967e5a87adf5d5781b0ae23211e47d0bd57c7b9e2eec5d4600255", + git_commit = "70a2f72c3c2c1abe532a30cf8584afe09afed6e8", ) # Import all of TensorFlow Serving's external dependencies. From bf245d7802413564d33b42a01d341b541fcd86f4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 28 Jun 2022 00:04:30 -0700 Subject: [PATCH 5942/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2281ffef-50eb-40e3-9ef6-bde71ee9ccd2 PiperOrigin-RevId: 457657765 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a4e3b76c825..ee7ccc0dca7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6caa4c79d1d967e5a87adf5d5781b0ae23211e47d0bd57c7b9e2eec5d4600255", - git_commit = "70a2f72c3c2c1abe532a30cf8584afe09afed6e8", + sha256 = "82dc1ca28f01a9fe3db1fa5ab45feff99e8e0176d05a615125ccc95e5c6d73df", + git_commit = "4ff6b08be52fff1c422c5f7af6b8b3701409fced", ) # Import all of TensorFlow Serving's external dependencies. From 7880aa3da0b129145f76a259bd7efb9fa221077d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 28 Jun 2022 06:01:22 -0700 Subject: [PATCH 5943/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/964f2b0f-59ba-438a-987d-d5f970365002 PiperOrigin-RevId: 457709849 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ee7ccc0dca7..9c5f55e772c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "82dc1ca28f01a9fe3db1fa5ab45feff99e8e0176d05a615125ccc95e5c6d73df", - git_commit = "4ff6b08be52fff1c422c5f7af6b8b3701409fced", + sha256 = "2005054279f9fbb87381718926f3ea5f18f2e3f9dee9bc13cef38a7ff67c4d92", + git_commit = "2a7ca476f44c58814d182c23d7f41a813468188e", ) # Import all of TensorFlow Serving's external dependencies. From 3c75079e91832ace21675dffcb555d693460a036 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 28 Jun 2022 12:01:22 -0700 Subject: [PATCH 5944/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/11247201-eb6f-4c23-ba9e-22696d2ccdbc PiperOrigin-RevId: 457787184 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9c5f55e772c..7c51730408e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2005054279f9fbb87381718926f3ea5f18f2e3f9dee9bc13cef38a7ff67c4d92", - git_commit = "2a7ca476f44c58814d182c23d7f41a813468188e", + sha256 = "5ce3002df97cd666ec51a45d0dc6cc1c1bc56c9afbdcf11c66ad4c5bf43286f4", + git_commit = "8a3ae2cc003b7d005d1a3d901d03cc7373fbaf3c", ) # Import all of TensorFlow Serving's external dependencies. From f3856ffdeff93e8771aedf63abd21a375aeb2586 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 28 Jun 2022 18:01:21 -0700 Subject: [PATCH 5945/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/84146595-efcd-46b4-909a-dac2fefc5251 PiperOrigin-RevId: 457860258 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7c51730408e..df96fcfafc8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5ce3002df97cd666ec51a45d0dc6cc1c1bc56c9afbdcf11c66ad4c5bf43286f4", - git_commit = "8a3ae2cc003b7d005d1a3d901d03cc7373fbaf3c", + sha256 = "8fca2b9e5c34f5a69121a9f35f3b863df1445e90268bb60dba62fc5c43712520", + git_commit = "e72f857c88e99fa26914107043afa517cc5ea346", ) # Import all of TensorFlow Serving's external dependencies. From 75a7a5e7552790ded9d0d01f7d92b429146eddf6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 29 Jun 2022 00:01:41 -0700 Subject: [PATCH 5946/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c27055d8-7699-4d90-a9de-3dd2b15ddad5 PiperOrigin-RevId: 457905180 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index df96fcfafc8..8761b000a9d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8fca2b9e5c34f5a69121a9f35f3b863df1445e90268bb60dba62fc5c43712520", - git_commit = "e72f857c88e99fa26914107043afa517cc5ea346", + sha256 = "4b24b70dfb97931f2d4d352cddd9f45b872db2edb4b1eab132a4817269a1fa98", + git_commit = "b6f63a2581c880fdb0b73ab515bf6a8208f06d61", ) # Import all of TensorFlow Serving's external dependencies. From d8a919bae132e9553019ae38f181f2f3f769d203 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 29 Jun 2022 06:01:24 -0700 Subject: [PATCH 5947/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7b200136-dcb0-43e2-b4f2-ed3001952891 PiperOrigin-RevId: 457956547 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8761b000a9d..fb852c4d4cf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4b24b70dfb97931f2d4d352cddd9f45b872db2edb4b1eab132a4817269a1fa98", - git_commit = "b6f63a2581c880fdb0b73ab515bf6a8208f06d61", + sha256 = "69c836f6f4e4d6dbc569234c0e702a7e55d8753403f4512b0753e21450c259b9", + git_commit = "4bf6315d03691a9377378b6af41c7890951c9544", ) # Import all of TensorFlow Serving's external dependencies. From 8f9085ac678755afea6bf0067fe40a32e37ce2fa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 29 Jun 2022 13:38:54 -0700 Subject: [PATCH 5948/8103] Call run_returning_status instead of run PiperOrigin-RevId: 458052236 --- .../experimental/example/half_plus_two_with_rpop.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/experimental/example/half_plus_two_with_rpop.py b/tensorflow_serving/experimental/example/half_plus_two_with_rpop.py index d755f37f6cf..07fe685d139 100644 --- a/tensorflow_serving/experimental/example/half_plus_two_with_rpop.py +++ b/tensorflow_serving/experimental/example/half_plus_two_with_rpop.py @@ -69,7 +69,7 @@ def _generate_saved_model_for_half_plus_two(export_dir, target_address, output_tensor_aliases = tf.constant(["y"]) output_types = [tf.float32] - results = remote_predict_ops.run( + results = remote_predict_ops.run_returning_status( input_tensor_aliases, input_tensors, output_tensor_aliases, From 76ed8dde8189983df49ae07db8c4ad666ab6f357 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 29 Jun 2022 18:02:56 -0700 Subject: [PATCH 5949/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1169249d-a75f-4f42-9f24-1a6e398b67d5 PiperOrigin-RevId: 458105283 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fb852c4d4cf..a6c32485ce6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "69c836f6f4e4d6dbc569234c0e702a7e55d8753403f4512b0753e21450c259b9", - git_commit = "4bf6315d03691a9377378b6af41c7890951c9544", + sha256 = "ea7736fe449b46b0dac47181ab917d712063b96d00ef4637d6bd003663c6050b", + git_commit = "42f8c4aec3227ec01e90319a0fb4dee8094f1a45", ) # Import all of TensorFlow Serving's external dependencies. From 74a077204233c51eab5b023a15f69b57b3235b8d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 Jun 2022 00:01:18 -0700 Subject: [PATCH 5950/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7f127f70-b43a-4c4e-9725-fb692a2751f2 PiperOrigin-RevId: 458150037 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a6c32485ce6..ff90d0799ac 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ea7736fe449b46b0dac47181ab917d712063b96d00ef4637d6bd003663c6050b", - git_commit = "42f8c4aec3227ec01e90319a0fb4dee8094f1a45", + sha256 = "347e43251c711e839e09219a7aa92556cbb24a8ee51a1cc2b27e645f9595a381", + git_commit = "0ef8bd4a8c2d8840f1a6cf3ddd3ca63685c3e24b", ) # Import all of TensorFlow Serving's external dependencies. From 8f3e3b888272633264984f2b6784012370d0f247 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 Jun 2022 06:01:20 -0700 Subject: [PATCH 5951/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6e63671b-5c2a-4d85-a618-b0d0d497d5f0 PiperOrigin-RevId: 458205694 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ff90d0799ac..cdbad8c7560 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "347e43251c711e839e09219a7aa92556cbb24a8ee51a1cc2b27e645f9595a381", - git_commit = "0ef8bd4a8c2d8840f1a6cf3ddd3ca63685c3e24b", + sha256 = "cd609c5bda91b1c11453a3b0da789e6d8727655b19c6b57cd087d9efd43ce31f", + git_commit = "286243022e772f75c254c79d313560bb9a1c3318", ) # Import all of TensorFlow Serving's external dependencies. From 46d3342a0aea447c82d6271bbf11f7064ebe2050 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 Jun 2022 12:01:22 -0700 Subject: [PATCH 5952/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/01ec8d0a-fedf-4cc7-8c71-327dded0bedb PiperOrigin-RevId: 458281293 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cdbad8c7560..b92f7797cbb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cd609c5bda91b1c11453a3b0da789e6d8727655b19c6b57cd087d9efd43ce31f", - git_commit = "286243022e772f75c254c79d313560bb9a1c3318", + sha256 = "f3bbda3176e13dbbed2ab7b03f406518037abe8ebcaef9f200910762d66575e1", + git_commit = "05925a8b41d95d881b170abe16de6d5a93de32eb", ) # Import all of TensorFlow Serving's external dependencies. From c3790005ef56d636bcd1ac59e8a8814fc4203f81 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 Jun 2022 18:01:26 -0700 Subject: [PATCH 5953/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4718e018-7def-4669-84d7-9a54ca34f13b PiperOrigin-RevId: 458353704 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b92f7797cbb..1ffbdc04ef9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f3bbda3176e13dbbed2ab7b03f406518037abe8ebcaef9f200910762d66575e1", - git_commit = "05925a8b41d95d881b170abe16de6d5a93de32eb", + sha256 = "847d7ae943d17f8ce6798dcecd90b8ddd91f34fcb0fdaa24d6ffde5cd822d44f", + git_commit = "63cfe527c7f902f63b05cc6fda1c0e076884baff", ) # Import all of TensorFlow Serving's external dependencies. From 39241353cae1ddb3bbd7918c9c148aca58ebda0e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Jul 2022 00:01:18 -0700 Subject: [PATCH 5954/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7f11491b-2927-4d3a-a298-2815e5d70d5a PiperOrigin-RevId: 458397983 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1ffbdc04ef9..5b7946a1bc7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "847d7ae943d17f8ce6798dcecd90b8ddd91f34fcb0fdaa24d6ffde5cd822d44f", - git_commit = "63cfe527c7f902f63b05cc6fda1c0e076884baff", + sha256 = "a1243a0d4adb638d3125dd4576a4255bd54e023c9ecb2640109198bf63d83a49", + git_commit = "63b057bb8f4af24052ee3571c0533fb5ccf50ec3", ) # Import all of TensorFlow Serving's external dependencies. From 94b6e1e77995c16558895035df7bc18cf7b75b62 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Jul 2022 06:01:26 -0700 Subject: [PATCH 5955/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bf9762d8-6344-4c62-acd1-bc94ead322bc PiperOrigin-RevId: 458451636 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5b7946a1bc7..af913ae7fc8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a1243a0d4adb638d3125dd4576a4255bd54e023c9ecb2640109198bf63d83a49", - git_commit = "63b057bb8f4af24052ee3571c0533fb5ccf50ec3", + sha256 = "131b9d6e3b7419d18c77d1847611d9c2ee39a6021b9a83390be874b3c0442b72", + git_commit = "f03c25764d88698d8760101a135bf1fc16011a32", ) # Import all of TensorFlow Serving's external dependencies. From 5775030c608eefc7f6f4170157f4fa21fb6e31a6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Jul 2022 12:01:56 -0700 Subject: [PATCH 5956/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/50aca06d-fb9d-4775-99fc-2a3b89635bf5 PiperOrigin-RevId: 458517002 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index af913ae7fc8..86bd6dc4361 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "131b9d6e3b7419d18c77d1847611d9c2ee39a6021b9a83390be874b3c0442b72", - git_commit = "f03c25764d88698d8760101a135bf1fc16011a32", + sha256 = "c5943af5ac69a2b6c369848c92ceed5cb0827ea5a2382ce8a0f3be41cd0fe486", + git_commit = "d6343df6d4b0abc91f81095d9b42603d4fe3dc11", ) # Import all of TensorFlow Serving's external dependencies. From 23e383ff8da78dc60be08dd471958fe3652e8a53 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 1 Jul 2022 18:04:30 -0700 Subject: [PATCH 5957/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c12aead5-edd4-4bd2-ad6e-1f165883e317 PiperOrigin-RevId: 458577404 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 86bd6dc4361..1be86bec1c6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c5943af5ac69a2b6c369848c92ceed5cb0827ea5a2382ce8a0f3be41cd0fe486", - git_commit = "d6343df6d4b0abc91f81095d9b42603d4fe3dc11", + sha256 = "44e27b7aae5d8ad50c189a077fafc3b3ecd670e08a07b5ec521f8bc0c0ba39c7", + git_commit = "32eac7bfe6e378653d66e600d7d3b281b8b0d6fa", ) # Import all of TensorFlow Serving's external dependencies. From c1687e0b1d944f3bbca373478d4c2ac919fc88a6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 2 Jul 2022 00:01:25 -0700 Subject: [PATCH 5958/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ad2d3156-6841-4a13-a5c7-a2f63fa89b22 PiperOrigin-RevId: 458610849 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1be86bec1c6..a98e87b4bbf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "44e27b7aae5d8ad50c189a077fafc3b3ecd670e08a07b5ec521f8bc0c0ba39c7", - git_commit = "32eac7bfe6e378653d66e600d7d3b281b8b0d6fa", + sha256 = "7ff912be592e8bb40e2c7d9b5ea21ae4d9fd0ba8bc755f84983abebd62feed8f", + git_commit = "4752f56e8d1b3107e272859e12652c49064c4d6a", ) # Import all of TensorFlow Serving's external dependencies. From 847b7249f1b92f9d66c801e9b57d50553ab97601 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 2 Jul 2022 06:01:20 -0700 Subject: [PATCH 5959/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/76052a8f-f85c-49dd-83de-39f8939431e4 PiperOrigin-RevId: 458644891 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a98e87b4bbf..376c7e9a0b1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7ff912be592e8bb40e2c7d9b5ea21ae4d9fd0ba8bc755f84983abebd62feed8f", - git_commit = "4752f56e8d1b3107e272859e12652c49064c4d6a", + sha256 = "20c2e314531bc89df82aeb1662b0e6bf1fd6be07aaa84ec8df2e7ea56d42e168", + git_commit = "e1505158654db40e6090789d9484c8f37d8211a7", ) # Import all of TensorFlow Serving's external dependencies. From 05635123223cd499df5942f12f3417b17a1a688a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 2 Jul 2022 12:01:17 -0700 Subject: [PATCH 5960/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7e29732b-864b-44cd-808f-4c6f07e70a11 PiperOrigin-RevId: 458671633 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 376c7e9a0b1..6c2d9d50264 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "20c2e314531bc89df82aeb1662b0e6bf1fd6be07aaa84ec8df2e7ea56d42e168", - git_commit = "e1505158654db40e6090789d9484c8f37d8211a7", + sha256 = "6effef6d1b19ea3f992a1f210855dfdd0a242cb3aaaf5dd8e230fd016a245391", + git_commit = "d97fdd3416d9b88e2812ea9aba5fa741b64c7d03", ) # Import all of TensorFlow Serving's external dependencies. From faa62215cd1afc5b99f25f2b50fff0e111d54dba Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 3 Jul 2022 06:01:17 -0700 Subject: [PATCH 5961/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/32ef9b3d-bba0-4289-8ce7-6d25af88e953 PiperOrigin-RevId: 458757254 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6c2d9d50264..699016d148b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6effef6d1b19ea3f992a1f210855dfdd0a242cb3aaaf5dd8e230fd016a245391", - git_commit = "d97fdd3416d9b88e2812ea9aba5fa741b64c7d03", + sha256 = "bd4a91d37e4aacfd70e7de091f7de54b021670f3f35531af31c8e08312950419", + git_commit = "94abea8d537bc5fade54f572ed3db2d428240b4a", ) # Import all of TensorFlow Serving's external dependencies. From 5cf3cadffffaa35fde7abe4f765eaaddf4574c08 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 3 Jul 2022 12:01:16 -0700 Subject: [PATCH 5962/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e07e0b11-3642-4f1a-8fa0-9808e77331ac PiperOrigin-RevId: 458783833 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 699016d148b..c4090f6d69d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bd4a91d37e4aacfd70e7de091f7de54b021670f3f35531af31c8e08312950419", - git_commit = "94abea8d537bc5fade54f572ed3db2d428240b4a", + sha256 = "ad66b8beba8de2ff18e56b50c4956f028db0594c32eefbe4ba93f612dbaa9d14", + git_commit = "73c8e20101ae93e9f5ff0b58f68be0b70eca44c5", ) # Import all of TensorFlow Serving's external dependencies. From 3073cda42d0dcf3ccc886f29bd5a687761a180f6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 4 Jul 2022 06:01:24 -0700 Subject: [PATCH 5963/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3cd74de2-cd0b-43e6-9c95-0054a7d82d45 PiperOrigin-RevId: 458896637 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c4090f6d69d..ea2eff2684c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ad66b8beba8de2ff18e56b50c4956f028db0594c32eefbe4ba93f612dbaa9d14", - git_commit = "73c8e20101ae93e9f5ff0b58f68be0b70eca44c5", + sha256 = "1dd101d32d1c7140abc71f7b9c66e158e71cf0d21c7a000c1d67fc37dcfa8e7a", + git_commit = "a31059a9334964756337c0f4c01999390ad7ecb1", ) # Import all of TensorFlow Serving's external dependencies. From c9e306e5764fc231f392a28034f1d5fe3a6eee92 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 4 Jul 2022 12:01:23 -0700 Subject: [PATCH 5964/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a1bbfc0a-1db3-47ac-8ad4-b508cc8b8ea0 PiperOrigin-RevId: 458941087 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ea2eff2684c..53a5bbde34f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1dd101d32d1c7140abc71f7b9c66e158e71cf0d21c7a000c1d67fc37dcfa8e7a", - git_commit = "a31059a9334964756337c0f4c01999390ad7ecb1", + sha256 = "750e22c94dd11b366683704326b271c11965ce1bbe6b2b3ce17a1039c88502e8", + git_commit = "e4065e08cb28a66bc9510782349a50fc6b25145a", ) # Import all of TensorFlow Serving's external dependencies. From 49bfb278201866d2d222bf50a216b9c84f8284d4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 4 Jul 2022 18:01:22 -0700 Subject: [PATCH 5965/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0e678349-18bb-441d-9054-64fdc855539c PiperOrigin-RevId: 458976387 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 53a5bbde34f..2c9681f3f4e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "750e22c94dd11b366683704326b271c11965ce1bbe6b2b3ce17a1039c88502e8", - git_commit = "e4065e08cb28a66bc9510782349a50fc6b25145a", + sha256 = "4e0214077e10f933f6a8d5a375968e5a8aeac2108f8f45b8c21899e3f17e6ed3", + git_commit = "db5fb0cc36462f87fae0d8212171ed07809063f5", ) # Import all of TensorFlow Serving's external dependencies. From 05d3539a322a6a0fd28e36ca1781f4b53a413838 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 5 Jul 2022 06:01:23 -0700 Subject: [PATCH 5966/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/311c5fa1-cdd7-4ce9-b35f-d23f1aef145d PiperOrigin-RevId: 459062941 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2c9681f3f4e..dd56baae920 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4e0214077e10f933f6a8d5a375968e5a8aeac2108f8f45b8c21899e3f17e6ed3", - git_commit = "db5fb0cc36462f87fae0d8212171ed07809063f5", + sha256 = "decec1b8b44b98f4b62fa9d8fb641cdad8c0d89fb1d78770af4036d5df219962", + git_commit = "f8bf583f8fc3bbada0350fbf6b36b8378ec8c7f0", ) # Import all of TensorFlow Serving's external dependencies. From be3ecfa992ce062429aebed908776180d1711378 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 5 Jul 2022 12:01:17 -0700 Subject: [PATCH 5967/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d0f0baa7-4d05-43f0-aa85-458d724e2b28 PiperOrigin-RevId: 459107453 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dd56baae920..0ea03c6fede 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "decec1b8b44b98f4b62fa9d8fb641cdad8c0d89fb1d78770af4036d5df219962", - git_commit = "f8bf583f8fc3bbada0350fbf6b36b8378ec8c7f0", + sha256 = "be2e613fb57993bfecb5299be8a044502af56e34e9c420ed00b45f261c5c7ec7", + git_commit = "eaeb6f27c75eef1964d70546721be52aa62ef6f9", ) # Import all of TensorFlow Serving's external dependencies. From 82282109a74f31756a0d9fb068b7eedc882115ca Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 6 Jul 2022 00:01:24 -0700 Subject: [PATCH 5968/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e2277b2f-b059-4001-85d3-b6fe31dd03a2 PiperOrigin-RevId: 459180898 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0ea03c6fede..3f12c246690 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "be2e613fb57993bfecb5299be8a044502af56e34e9c420ed00b45f261c5c7ec7", - git_commit = "eaeb6f27c75eef1964d70546721be52aa62ef6f9", + sha256 = "1115d02082b11e3f8ac7b4e877e29d5ade1ab87bf883c25d35a904b52b2bcc90", + git_commit = "0989aa96c3c80002b0abab347b6d225dbb484007", ) # Import all of TensorFlow Serving's external dependencies. From e16552e61bede7cec75d0cb1ced63929691da480 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 6 Jul 2022 06:01:24 -0700 Subject: [PATCH 5969/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/47eec334-0912-484d-a22a-ab5e69300b66 PiperOrigin-RevId: 459232056 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3f12c246690..7051975bed2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1115d02082b11e3f8ac7b4e877e29d5ade1ab87bf883c25d35a904b52b2bcc90", - git_commit = "0989aa96c3c80002b0abab347b6d225dbb484007", + sha256 = "23def2cceb5044421e575a8a59c6762b28faf9569d7f0147ad928b8fc974a4a3", + git_commit = "8b97cffacf5eb0e2cfa564ff1c56a94062d972b1", ) # Import all of TensorFlow Serving's external dependencies. From b00f3e53b14b060a2fd432562a8b8ac69d5c3f90 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 6 Jul 2022 12:01:21 -0700 Subject: [PATCH 5970/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0e40e6f3-0bd4-47d5-9fb7-30bf373f6e2f PiperOrigin-RevId: 459309160 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7051975bed2..de9ccb2a076 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "23def2cceb5044421e575a8a59c6762b28faf9569d7f0147ad928b8fc974a4a3", - git_commit = "8b97cffacf5eb0e2cfa564ff1c56a94062d972b1", + sha256 = "78140f25b8ffda26230d25ef25cd068d5a0d88b5bc24728724748a6e052762af", + git_commit = "695dce02ac24d6b46b6265141c9bd3c2094b974a", ) # Import all of TensorFlow Serving's external dependencies. From 6c90009e882adc26e288ecda69cb8cacd75996df Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 6 Jul 2022 18:01:16 -0700 Subject: [PATCH 5971/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b1651edf-e542-483e-8e05-90aa28564691 PiperOrigin-RevId: 459389589 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index de9ccb2a076..a32acdb01e6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "78140f25b8ffda26230d25ef25cd068d5a0d88b5bc24728724748a6e052762af", - git_commit = "695dce02ac24d6b46b6265141c9bd3c2094b974a", + sha256 = "0f62a09af8044b23b172c3da0fbcfac49fffdfc32739e6c9c7072d9cf68b93e3", + git_commit = "a37ac96c6eefe809003f29a815b915bfed5ad36b", ) # Import all of TensorFlow Serving's external dependencies. From abc6ea6052e5149bd057ab7ebcf2f5508385e0e1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Jul 2022 00:01:15 -0700 Subject: [PATCH 5972/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2289dbca-a07d-4dcd-81f6-efaf82dd3cd3 PiperOrigin-RevId: 459438687 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a32acdb01e6..1247c1f74cb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0f62a09af8044b23b172c3da0fbcfac49fffdfc32739e6c9c7072d9cf68b93e3", - git_commit = "a37ac96c6eefe809003f29a815b915bfed5ad36b", + sha256 = "2b9491a90bb989180056cb335463918bacc143befd9005b3ade5405d7a22695e", + git_commit = "e97b34ccf3fcdbb2e5cd6030038309740e69142a", ) # Import all of TensorFlow Serving's external dependencies. From 231023a56ea1f87f3cd611ddd79389f795d381fc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Jul 2022 06:01:17 -0700 Subject: [PATCH 5973/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e376d2b7-7e52-416e-a065-c480f50873cf PiperOrigin-RevId: 459491517 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1247c1f74cb..2156eb20730 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2b9491a90bb989180056cb335463918bacc143befd9005b3ade5405d7a22695e", - git_commit = "e97b34ccf3fcdbb2e5cd6030038309740e69142a", + sha256 = "533d92dc2711a98efe9466d8f43ba6a4e2a17e8708fe8a8233c4f204bdbda98a", + git_commit = "80ce185f046b560c0fec557a74609d34390accd8", ) # Import all of TensorFlow Serving's external dependencies. From b56db0b9564323f4e077a3bb3ad57aadf84bb63a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Jul 2022 12:01:22 -0700 Subject: [PATCH 5974/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/16fd2bbb-24ae-4605-8f65-a75392e4fd80 PiperOrigin-RevId: 459568338 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2156eb20730..8e5f6a4a63c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "533d92dc2711a98efe9466d8f43ba6a4e2a17e8708fe8a8233c4f204bdbda98a", - git_commit = "80ce185f046b560c0fec557a74609d34390accd8", + sha256 = "cf1b9a6f4a9158f371a5c395f866c7dad167619d55616f527ecc0e1953db4e91", + git_commit = "cc0626cc42b2cb1542c97e3aa450b8aa3ce303c7", ) # Import all of TensorFlow Serving's external dependencies. From 0fb7898550cb5b44a5c6f4d4c91080fac4d96be7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Jul 2022 12:47:28 -0700 Subject: [PATCH 5975/8103] Internal Change. PiperOrigin-RevId: 459578669 --- tensorflow_serving/model_servers/main.cc | 31 ++++++++++++++++++------ 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index 5079a9c84c8..d19ec45bdca 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -50,13 +50,30 @@ limitations under the License. #include "tensorflow/compiler/jit/flags.h" #include "tensorflow/core/lib/core/status.h" #include "tensorflow/core/platform/init_main.h" -#if defined(LIBTPU_ON_GCE) -#include "tensorflow/core/tpu/tpu_global_init.h" -#endif #include "tensorflow/core/util/command_line_flags.h" #include "tensorflow_serving/model_servers/server.h" #include "tensorflow_serving/model_servers/version.h" +#if defined(LIBTPU_ON_GCE) || defined(PLATFORM_CLOUD_TPU) +#include "tensorflow/core/protobuf/tpu/topology.proto.h" +#include "tensorflow/core/tpu/tpu_global_init.h" + +void InitializeTPU(tensorflow::serving::main::Server::Options& server_options) { + std::cout << "Initializing TPU system."; + tensorflow::tpu::TopologyProto tpu_topology; + TF_QCHECK_OK(tensorflow::InitializeTPUSystemGlobally( + tensorflow::Env::Default(), &tpu_topology)) + << "Failed to initialize TPU system."; + std::cout << "Initialized TPU topology: " << tpu_topology.DebugString(); + server_options.num_request_iterations_for_warmup = + tpu_topology.num_tpu_devices_per_task(); + server_options.enforce_session_run_timeout = false; + if (server_options.saved_model_tags.empty()) { + server_options.saved_model_tags = "tpu,serve"; + } +} +#endif + int main(int argc, char** argv) { tensorflow::serving::main::Server::Options options; bool display_version = false; @@ -269,10 +286,9 @@ int main(int argc, char** argv) { return -1; } -#if defined(LIBTPU_ON_GCE) - std::cout << "Initializing TPU system."; - TF_QCHECK_OK(tensorflow::InitializeTPUSystemGlobally()) - << "Failed to intialize the TPU system."; + tensorflow::port::InitMain(argv[0], &argc, &argv); +#if defined(LIBTPU_ON_GCE) || defined(PLATFORM_CLOUD_TPU) + InitializeTPU(options); #endif if (display_version) { @@ -281,7 +297,6 @@ int main(int argc, char** argv) { return 0; } - tensorflow::port::InitMain(argv[0], &argc, &argv); if (argc != 1) { std::cout << "unknown argument: " << argv[1] << "\n" << usage; } From b4d40d2fc0578bd35c58c56bb2a9c7b380b1170f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 7 Jul 2022 18:04:34 -0700 Subject: [PATCH 5976/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/043c51ae-9df1-47d6-9836-f9135bba5ec3 PiperOrigin-RevId: 459644878 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8e5f6a4a63c..1aabc9295f7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cf1b9a6f4a9158f371a5c395f866c7dad167619d55616f527ecc0e1953db4e91", - git_commit = "cc0626cc42b2cb1542c97e3aa450b8aa3ce303c7", + sha256 = "f9e69488868eb49eae735e25dea00ae820b7fe1827585a851527255bd176e0f9", + git_commit = "a113dd02168a01aba7aea99d8266630233d9269c", ) # Import all of TensorFlow Serving's external dependencies. From df8606366a98604a22f02ba1d36efa65aef5f4f6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Jul 2022 00:01:28 -0700 Subject: [PATCH 5977/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b63f2210-4def-4edc-8248-8b7768c9df56 PiperOrigin-RevId: 459688301 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1aabc9295f7..7ec02df3b24 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f9e69488868eb49eae735e25dea00ae820b7fe1827585a851527255bd176e0f9", - git_commit = "a113dd02168a01aba7aea99d8266630233d9269c", + sha256 = "78815b0d5ed7b761510eaa214271244737b0e5535b4c87bf09f7b44a087a3b2e", + git_commit = "ac105ab9278f2e9804e35bdbc5d4b543fca9b624", ) # Import all of TensorFlow Serving's external dependencies. From 7ac6782aaf37769d6b17dae05db7e580658760dc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Jul 2022 06:01:28 -0700 Subject: [PATCH 5978/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/50a0d773-0bc8-436f-b2ef-76ba2cade218 PiperOrigin-RevId: 459740461 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7ec02df3b24..3c3294f257a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "78815b0d5ed7b761510eaa214271244737b0e5535b4c87bf09f7b44a087a3b2e", - git_commit = "ac105ab9278f2e9804e35bdbc5d4b543fca9b624", + sha256 = "b47a6dde7aaaba3ba6ac18c14bc1eaffd2b78aa3d259a2ed279c1728e2303037", + git_commit = "de152906cfdc8c2c3f3aec5f737fe0aaf9303e60", ) # Import all of TensorFlow Serving's external dependencies. From cb601e328abe574ddfc95af2f6ef3705d5ba6ddd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Jul 2022 12:01:38 -0700 Subject: [PATCH 5979/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d86caecb-73c8-4eed-b3f9-29c0bfe433e7 PiperOrigin-RevId: 459805847 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3c3294f257a..11041b19bee 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b47a6dde7aaaba3ba6ac18c14bc1eaffd2b78aa3d259a2ed279c1728e2303037", - git_commit = "de152906cfdc8c2c3f3aec5f737fe0aaf9303e60", + sha256 = "d8e22d2bacce81f27c9658946b1a1971fe2e7b7bd167f52e03f2c56cf98935eb", + git_commit = "47e07ba0d68c55dba62bff5b8486291086840097", ) # Import all of TensorFlow Serving's external dependencies. From ceb59b709ac6850d3b2c1dc8a97090ff4df5de7e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 8 Jul 2022 18:01:19 -0700 Subject: [PATCH 5980/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9c65d934-a8b8-4482-901a-7f363718b6b4 PiperOrigin-RevId: 459869635 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 11041b19bee..e3a5ebbb52e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d8e22d2bacce81f27c9658946b1a1971fe2e7b7bd167f52e03f2c56cf98935eb", - git_commit = "47e07ba0d68c55dba62bff5b8486291086840097", + sha256 = "389ab02d624a1abd519f26430560ad926f75df45c35f741106e74c7da1503e25", + git_commit = "4309833aaa76e1f4ded874667ff109a0052b45c6", ) # Import all of TensorFlow Serving's external dependencies. From d1577bc9fe28bc66ab84c0bfe772b2c05ec5f313 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 9 Jul 2022 00:01:19 -0700 Subject: [PATCH 5981/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/98560228-dfbc-4b27-9065-bd598b2ab404 PiperOrigin-RevId: 459904003 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e3a5ebbb52e..6d9b3eb136a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "389ab02d624a1abd519f26430560ad926f75df45c35f741106e74c7da1503e25", - git_commit = "4309833aaa76e1f4ded874667ff109a0052b45c6", + sha256 = "d7bf13ee694dbf482a41826f540664102bdd93890b6c904dc8503cf883f9d67c", + git_commit = "1c3a38782310d8678c07f6d069a0f209225ff0e8", ) # Import all of TensorFlow Serving's external dependencies. From de79b79be774c9b409eb5a834bcda27d11c7c43c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 9 Jul 2022 06:01:20 -0700 Subject: [PATCH 5982/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f97d4100-27a2-4056-9f64-76c282ee1832 PiperOrigin-RevId: 459937093 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6d9b3eb136a..fd7d74d471a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d7bf13ee694dbf482a41826f540664102bdd93890b6c904dc8503cf883f9d67c", - git_commit = "1c3a38782310d8678c07f6d069a0f209225ff0e8", + sha256 = "4864c8b9ec293d5292ce6eeda52aa192ad7fdfa13125c8f929d5aa8842ded3f9", + git_commit = "c0040f4dcebaff326b6716abab76bdbbc8a7eaf3", ) # Import all of TensorFlow Serving's external dependencies. From 6b52ce29763bf1799da267799454d04e7435647a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 9 Jul 2022 18:01:20 -0700 Subject: [PATCH 5983/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/04a680f1-ed6c-4e10-9b56-16ffa5518fdc PiperOrigin-RevId: 459990421 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fd7d74d471a..b47d77aec48 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4864c8b9ec293d5292ce6eeda52aa192ad7fdfa13125c8f929d5aa8842ded3f9", - git_commit = "c0040f4dcebaff326b6716abab76bdbbc8a7eaf3", + sha256 = "5fe9f5afa3364d4eb6431f200c70583bfda9b50159d469398aab972abd64560d", + git_commit = "6404ea36fda5b0c45ff78c440fc15cf6fd9c6ee8", ) # Import all of TensorFlow Serving's external dependencies. From 6f10bf2d433596bd14b3ce20db0adf561a1e80a3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 10 Jul 2022 06:01:14 -0700 Subject: [PATCH 5984/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/704be328-34c6-46e1-97bd-4ff39eda1b9e PiperOrigin-RevId: 460048571 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b47d77aec48..d84715007f9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5fe9f5afa3364d4eb6431f200c70583bfda9b50159d469398aab972abd64560d", - git_commit = "6404ea36fda5b0c45ff78c440fc15cf6fd9c6ee8", + sha256 = "d56cb32aa63339f52b82a6352bca8c534f03198e5d182b19d59bcf4d4be86f10", + git_commit = "9584c52ecfbbc33b3be48903cdadd41b4a2bb083", ) # Import all of TensorFlow Serving's external dependencies. From ee0e9e0c2cd69eb386fd490d5a977ac55bbd9a14 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Jul 2022 00:01:34 -0700 Subject: [PATCH 5985/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/07c67291-4eb0-4400-babc-a4c3ffc083a8 PiperOrigin-RevId: 460139624 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d84715007f9..2586b3fd692 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d56cb32aa63339f52b82a6352bca8c534f03198e5d182b19d59bcf4d4be86f10", - git_commit = "9584c52ecfbbc33b3be48903cdadd41b4a2bb083", + sha256 = "0d5d970f1c7aea9ea48ee9244a34039316bf0b9821ce174b449a267dfcfd872f", + git_commit = "ffcafac3e6b660f1ca7101a4b17ab4e6f3d46a61", ) # Import all of TensorFlow Serving's external dependencies. From a91c1af3ce08bdd0c445db8732efc64cb8dd29d7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Jul 2022 06:01:19 -0700 Subject: [PATCH 5986/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/eb9302b7-cd41-4cf9-b125-b79e7dbb8099 PiperOrigin-RevId: 460192010 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2586b3fd692..d31ba3ca4eb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0d5d970f1c7aea9ea48ee9244a34039316bf0b9821ce174b449a267dfcfd872f", - git_commit = "ffcafac3e6b660f1ca7101a4b17ab4e6f3d46a61", + sha256 = "3fcf80d595add45d27bc2b785b53b1f6995aecd8f631ffae4d19695923478c59", + git_commit = "ceb1bf0931338c02477837b7cd4c11d9f09f16ec", ) # Import all of TensorFlow Serving's external dependencies. From b15210ca076b11eaa2dfd0ac2fb125be780c5d40 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Jul 2022 10:43:43 -0700 Subject: [PATCH 5987/8103] Fixing broken link for [ResNet in TensorFlow](https://www.tensorflow.org/api_docs/python/tf/keras/applications/resnet). PiperOrigin-RevId: 460249451 --- tensorflow_serving/g3doc/serving_kubernetes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/g3doc/serving_kubernetes.md b/tensorflow_serving/g3doc/serving_kubernetes.md index 7f909befd78..b0d5368b0be 100644 --- a/tensorflow_serving/g3doc/serving_kubernetes.md +++ b/tensorflow_serving/g3doc/serving_kubernetes.md @@ -9,7 +9,7 @@ To learn more about TensorFlow Serving, we recommend [TensorFlow Serving advanced tutorial](serving_advanced.md). To learn more about TensorFlow ResNet model, we recommend reading -[ResNet in TensorFlow](https://github.com/tensorflow/models/tree/master/official/resnet). +[ResNet in TensorFlow](https://www.tensorflow.org/api_docs/python/tf/keras/applications/resnet). - [Part 1](#part_1_setup) gets your environment setup - [Part 2](#part_2_running_in_docker) shows how to run the local Docker From 804bc7fc1812f40117139124b57b3c49f585d8b0 Mon Sep 17 00:00:00 2001 From: Raviteja Gorijala Date: Mon, 11 Jul 2022 11:04:37 -0700 Subject: [PATCH 5988/8103] Add release notes for tf-serving 2.9.1 PiperOrigin-RevId: 460254760 --- RELEASE.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/RELEASE.md b/RELEASE.md index 03066e4df3d..efb1f3b1d30 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,3 +1,17 @@ +# Release 2.9.1 + +## Major Features and Improvements + +* No major features or improvements. + +## Breaking Changes + +* No breaking changes + +## Bug Fixes and Other Changes + +* This release is based on TF version 2.9.0 + # Release 2.6.5 ## Major Features and Improvements From 988eebb7fbe4a3446847d3eb883b2753f65926a7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Jul 2022 12:02:11 -0700 Subject: [PATCH 5989/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/cc76e8a5-d381-4913-8ad4-7745ac8c4bd5 PiperOrigin-RevId: 460268444 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d31ba3ca4eb..bf89158e7fa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3fcf80d595add45d27bc2b785b53b1f6995aecd8f631ffae4d19695923478c59", - git_commit = "ceb1bf0931338c02477837b7cd4c11d9f09f16ec", + sha256 = "bc01d8a32a3fc7c8602c5e00a2ba1d39bb0057cf9694eb477306ee262954453d", + git_commit = "c075b1551708f283117807c65b3cd61701de95e4", ) # Import all of TensorFlow Serving's external dependencies. From 07d51101779a76d38c89180f8b3940512ace660d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Jul 2022 18:01:11 -0700 Subject: [PATCH 5990/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f82e981e-f434-40c9-8739-124cf5e757ca PiperOrigin-RevId: 460343463 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bf89158e7fa..81e231e038e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bc01d8a32a3fc7c8602c5e00a2ba1d39bb0057cf9694eb477306ee262954453d", - git_commit = "c075b1551708f283117807c65b3cd61701de95e4", + sha256 = "80cbadc4c876ec0662d72a11cb8662b6e0d1d160ad0d6d00a80f98674654cbed", + git_commit = "b0abd8c90e35200add609dcc1cf1904a6ed03cae", ) # Import all of TensorFlow Serving's external dependencies. From 315b784ecbbffb4538f19abbb958ecd65df0aab3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Jul 2022 00:01:27 -0700 Subject: [PATCH 5991/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8df82d4e-3b05-4c07-b3bb-c5f71d29e33c PiperOrigin-RevId: 460388531 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 81e231e038e..835b90fb93a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "80cbadc4c876ec0662d72a11cb8662b6e0d1d160ad0d6d00a80f98674654cbed", - git_commit = "b0abd8c90e35200add609dcc1cf1904a6ed03cae", + sha256 = "6bacdea21f73069c27925110b15942885580850b71b85dceae3d7264d2e95724", + git_commit = "2728d4bfe0dc5303920b67c73dce3208b8ef265e", ) # Import all of TensorFlow Serving's external dependencies. From b06959e271d221ee30b98e2e8d1dbd1343a3379b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Jul 2022 06:01:26 -0700 Subject: [PATCH 5992/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c3a73c14-d194-4fef-9ca5-006e0d344c48 PiperOrigin-RevId: 460442504 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 835b90fb93a..cf6d8a049e3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6bacdea21f73069c27925110b15942885580850b71b85dceae3d7264d2e95724", - git_commit = "2728d4bfe0dc5303920b67c73dce3208b8ef265e", + sha256 = "8bd4fed017ffd377707b8b350a2f0ec045dae513fd623df4f6dd6c6fdc709d72", + git_commit = "d2192b8fbec84c1a081d603b50e56a9c859b0aa3", ) # Import all of TensorFlow Serving's external dependencies. From 17a18decec2d9256e1f7d3137df213137f0aa44d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Jul 2022 12:01:13 -0700 Subject: [PATCH 5993/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8d34edcd-c0f3-49fc-9486-c3d2c3ad00da PiperOrigin-RevId: 460519698 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cf6d8a049e3..9029afa5e6e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8bd4fed017ffd377707b8b350a2f0ec045dae513fd623df4f6dd6c6fdc709d72", - git_commit = "d2192b8fbec84c1a081d603b50e56a9c859b0aa3", + sha256 = "ce209256be86940b34a3169a9a87269731e7c5cbe4672cda2960381e44a12685", + git_commit = "22e3432a51fb5402894142ce1e236807c399cb76", ) # Import all of TensorFlow Serving's external dependencies. From 141d9142b9bf49a62eadf596f186a09ce9aef58d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 12 Jul 2022 18:01:18 -0700 Subject: [PATCH 5994/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a24fd41b-dfd1-4e9d-9c55-ab4285642713 PiperOrigin-RevId: 460594368 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9029afa5e6e..9577cf1e68b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ce209256be86940b34a3169a9a87269731e7c5cbe4672cda2960381e44a12685", - git_commit = "22e3432a51fb5402894142ce1e236807c399cb76", + sha256 = "96ad9c299982127ab696a3e0094e6ad3e0fbec2af2583ae54e5f92f1d24877de", + git_commit = "acc0867a7ba07513053f4ffd2d8aab80b0d2b10f", ) # Import all of TensorFlow Serving's external dependencies. From c33c60df5d318f9f738ced1b27cdda9f3855227e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Jul 2022 00:01:29 -0700 Subject: [PATCH 5995/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2546f48c-c971-47ac-9d5e-8255539c5730 PiperOrigin-RevId: 460640900 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9577cf1e68b..957e8c0f04b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "96ad9c299982127ab696a3e0094e6ad3e0fbec2af2583ae54e5f92f1d24877de", - git_commit = "acc0867a7ba07513053f4ffd2d8aab80b0d2b10f", + sha256 = "f6d05d7b7f0847abf60b468648ea77c3681a234a6f473359141f219a1d3d1a54", + git_commit = "e000b3c7fec504a40a835afddb3bf372557d89a3", ) # Import all of TensorFlow Serving's external dependencies. From c85cf154ef571c1109da2151f179ba1e37497bc5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Jul 2022 06:01:24 -0700 Subject: [PATCH 5996/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c7859213-e548-4462-8c0d-b12173c31ee9 PiperOrigin-RevId: 460694215 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 957e8c0f04b..2364ab1eae3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f6d05d7b7f0847abf60b468648ea77c3681a234a6f473359141f219a1d3d1a54", - git_commit = "e000b3c7fec504a40a835afddb3bf372557d89a3", + sha256 = "c4c401676ef2cfb916c1e8b8c5bc9876457a2f4968011ad2ff143cc5c739f13c", + git_commit = "eb8425f115e5a93274f709cdfaf254798f9aa4c7", ) # Import all of TensorFlow Serving's external dependencies. From 05b944ad9367027a1082756a3069619f44955de1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Jul 2022 14:11:23 -0700 Subject: [PATCH 5997/8103] Update the TensorFlow BatchingSession metric monitoring class to be compatible with Google's internal monitoring tools. PiperOrigin-RevId: 460800718 --- .../batching/batching_session_test.cc | 2 +- tensorflow_serving/batching/batching_util.h | 40 ++++++++----------- 2 files changed, 18 insertions(+), 24 deletions(-) diff --git a/tensorflow_serving/batching/batching_session_test.cc b/tensorflow_serving/batching/batching_session_test.cc index 9ec9701bb01..f42d1fc35d7 100644 --- a/tensorflow_serving/batching/batching_session_test.cc +++ b/tensorflow_serving/batching/batching_session_test.cc @@ -199,7 +199,7 @@ int GetPercentileTotal(string label) { if (point_set_map.find(label) == point_set_map.end()) return 0; const monitoring::PointSet& lps = *point_set_map.at(label); for (int i = 0; i < lps.points.size(); ++i) { - total_samples += lps.points[i]->percentiles_value.accumulator; + total_samples += lps.points[i]->histogram_value.sum(); } return static_cast(total_samples); } diff --git a/tensorflow_serving/batching/batching_util.h b/tensorflow_serving/batching/batching_util.h index f4abe7bc329..0b67e8195a4 100644 --- a/tensorflow_serving/batching/batching_util.h +++ b/tensorflow_serving/batching/batching_util.h @@ -23,8 +23,6 @@ limitations under the License. #include "absl/strings/str_cat.h" #include "absl/types/span.h" #include "tensorflow/core/framework/tensor.h" -#include "tensorflow/core/lib/core/status.h" -#include "tensorflow/core/lib/monitoring/percentile_sampler.h" #include "tensorflow/core/lib/monitoring/sampler.h" namespace tensorflow { @@ -119,13 +117,13 @@ Status ComputeTensorBatchSize(TensorList inputs, size_t* size, DimFunc dim_func, template void RecordPaddingSize(int32 padding_size, int32 execution_batch_size) { static const std::string batching_task_name = BatchingTask::Name(); - static auto* cell = tensorflow::monitoring::PercentileSampler<1>::New( + static auto* cell = tensorflow::monitoring::Sampler<1>::New( {absl::StrCat("/tensorflow/serving/", batching_task_name, "/padding_size"), "Tracks the padding size distribution on batches.", "execution_batch_size"}, - /*percentiles=*/{25.0, 50.0, 75.0, 90.0, 95.0, 99.0}, - /*max_samples=*/1024, tensorflow::monitoring::UnitOfMeasure::kNumber); + // Exponential buckets [1*2^0, ..., 1*2^13, DBL_MAX]. + monitoring::Buckets::Exponential(1, 2, 14)); cell->GetCell(absl::StrCat(execution_batch_size)) ->Add(static_cast(padding_size)); } @@ -133,29 +131,25 @@ void RecordPaddingSize(int32 padding_size, int32 execution_batch_size) { template void RecordInputBatchSize(int32 batch_size) { static const std::string batching_task_name = BatchingTask::Name(); - static tensorflow::monitoring::PercentileSamplerCell* cell = - tensorflow::monitoring::PercentileSampler<0>::New( - {absl::StrCat("/tensorflow/serving/", batching_task_name, - "/input_batch_size"), - "Tracks the batch size distribution on the inputs."}, - /*percentiles=*/{25.0, 50.0, 75.0, 90.0, 95.0, 99.0}, - /*max_samples=*/1024, tensorflow::monitoring::UnitOfMeasure::kNumber) - ->GetCell(); - cell->Add(static_cast(batch_size)); + static auto* cell = tensorflow::monitoring::Sampler<0>::New( + {absl::StrCat("/tensorflow/serving/", batching_task_name, + "/input_batch_size"), + "Tracks the batch size distribution on the inputs."}, + // Exponential buckets [1*2^0, ..., 1*2^13, DBL_MAX]. + monitoring::Buckets::Exponential(1, 2, 14)); + cell->GetCell()->Add(static_cast(batch_size)); } template void RecordProcessedBatchSize(int32 batch_size) { static const std::string batching_task_name = BatchingTask::Name(); - static tensorflow::monitoring::PercentileSamplerCell* cell = - tensorflow::monitoring::PercentileSampler<0>::New( - {absl::StrCat("/tensorflow/serving/", batching_task_name, - "/processed_batch_size"), - "Tracks the batch size distribution on processing."}, - /*percentiles=*/{25.0, 50.0, 75.0, 90.0, 95.0, 99.0}, - /*max_samples=*/1024, tensorflow::monitoring::UnitOfMeasure::kNumber) - ->GetCell(); - cell->Add(static_cast(batch_size)); + static auto* cell = tensorflow::monitoring::Sampler<0>::New( + {absl::StrCat("/tensorflow/serving/", batching_task_name, + "/processed_batch_size"), + "Tracks the batch size distribution on processing."}, + // Exponential buckets [1*2^0, ..., 1*2^13, DBL_MAX]. + monitoring::Buckets::Exponential(1, 2, 14)); + cell->GetCell()->Add(static_cast(batch_size)); } } // namespace serving From 7f9d6bc454ec6c2c7558e4c5c3fa184980768020 Mon Sep 17 00:00:00 2001 From: Lequn Chen Date: Wed, 13 Jul 2022 15:28:01 -0700 Subject: [PATCH 5998/8103] Internal changes PiperOrigin-RevId: 460817518 --- .../experimental/tensorflow/ops/remote_predict/BUILD | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/BUILD b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/BUILD index 40b3b60538c..0f44a127ca2 100644 --- a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/BUILD +++ b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/BUILD @@ -49,6 +49,7 @@ cc_library( srcs = ["cc/ops/remote_predict_op.cc"], hdrs = ["cc/ops/remote_predict_op.h"], visibility = [ + "//cloud/ml/tfe/anthelion:__subpackages__", "//tensorflow_serving/experimental/example:__subpackages__", "//tensorflow_serving/model_servers:__subpackages__", ], @@ -79,6 +80,7 @@ tf_kernel_library( "kernels/remote_predict_op_kernel.h", ], visibility = [ + "//cloud/ml/tfe/anthelion:__subpackages__", "//tensorflow_serving/experimental/example:__subpackages__", "//tensorflow_serving/model_servers:__subpackages__", ], From c0d3787f85856ba0407514e9c1a3d9cf3ec01a32 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 13 Jul 2022 18:01:18 -0700 Subject: [PATCH 5999/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/cc5098b0-0e3e-4c65-bf03-a24d4eb51066 PiperOrigin-RevId: 460845768 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2364ab1eae3..f7e98f9ab34 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c4c401676ef2cfb916c1e8b8c5bc9876457a2f4968011ad2ff143cc5c739f13c", - git_commit = "eb8425f115e5a93274f709cdfaf254798f9aa4c7", + sha256 = "4a2636d4905f0dc29a0c79377fc3b54c86c93c809aeb2f68f956ceb04924440e", + git_commit = "ecaf04806d1f58fdb8f21755f61f6c2313147de8", ) # Import all of TensorFlow Serving's external dependencies. From 81aac127ce8fc00e328553a1c8055e0960d2ef32 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Jul 2022 00:01:20 -0700 Subject: [PATCH 6000/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/293ac02b-a066-4a8f-a55c-0655c15763f0 PiperOrigin-RevId: 460890269 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f7e98f9ab34..86b18f29b30 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4a2636d4905f0dc29a0c79377fc3b54c86c93c809aeb2f68f956ceb04924440e", - git_commit = "ecaf04806d1f58fdb8f21755f61f6c2313147de8", + sha256 = "67ba6686a2c997b40846978c0d7d7d5fd1333665ab61df920abad559bed9bab4", + git_commit = "372f700400ccdd5bae6d6f5dd42e74203d2fe13b", ) # Import all of TensorFlow Serving's external dependencies. From e899c4aa3e9bd19c0635010901af4b8cea0a65c3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Jul 2022 06:01:18 -0700 Subject: [PATCH 6001/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1a80bdb4-c574-4647-a1bc-10423a5c72cd PiperOrigin-RevId: 460939511 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 86b18f29b30..3ed75b4e8c3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "67ba6686a2c997b40846978c0d7d7d5fd1333665ab61df920abad559bed9bab4", - git_commit = "372f700400ccdd5bae6d6f5dd42e74203d2fe13b", + sha256 = "5f3c99a001a046d410058c329a3820bfa9d5ce45b25eb1086fa53efa104c4e43", + git_commit = "6c40ac5cbe2bfdc5caa9e43ac2e47ad4f3053dd7", ) # Import all of TensorFlow Serving's external dependencies. From 08c0c9a7c943858d4caf3ae4cb3287f3b0acab1d Mon Sep 17 00:00:00 2001 From: Lequn Chen Date: Thu, 14 Jul 2022 11:59:53 -0700 Subject: [PATCH 6002/8103] Internal changes PiperOrigin-RevId: 461017872 --- .../experimental/tensorflow/ops/remote_predict/BUILD | 2 -- 1 file changed, 2 deletions(-) diff --git a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/BUILD b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/BUILD index 0f44a127ca2..40b3b60538c 100644 --- a/tensorflow_serving/experimental/tensorflow/ops/remote_predict/BUILD +++ b/tensorflow_serving/experimental/tensorflow/ops/remote_predict/BUILD @@ -49,7 +49,6 @@ cc_library( srcs = ["cc/ops/remote_predict_op.cc"], hdrs = ["cc/ops/remote_predict_op.h"], visibility = [ - "//cloud/ml/tfe/anthelion:__subpackages__", "//tensorflow_serving/experimental/example:__subpackages__", "//tensorflow_serving/model_servers:__subpackages__", ], @@ -80,7 +79,6 @@ tf_kernel_library( "kernels/remote_predict_op_kernel.h", ], visibility = [ - "//cloud/ml/tfe/anthelion:__subpackages__", "//tensorflow_serving/experimental/example:__subpackages__", "//tensorflow_serving/model_servers:__subpackages__", ], From a4555853d25053b7b2309de778da81a7ae7602f8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Jul 2022 12:01:28 -0700 Subject: [PATCH 6003/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6d861c0f-2343-47b2-8f79-95eb211d917d PiperOrigin-RevId: 461018368 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3ed75b4e8c3..c334204be12 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5f3c99a001a046d410058c329a3820bfa9d5ce45b25eb1086fa53efa104c4e43", - git_commit = "6c40ac5cbe2bfdc5caa9e43ac2e47ad4f3053dd7", + sha256 = "f5b1b15d76f0a9ee24732916502a355653eb59c55c7e4a4d9e15d29155f9b235", + git_commit = "8bba02f4861d3619a5716b96fe723020a33593be", ) # Import all of TensorFlow Serving's external dependencies. From 6830a40f49d48e208b6eba3d63cf7ea2bbacf18d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 14 Jul 2022 18:01:19 -0700 Subject: [PATCH 6004/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d03c3d2f-32cf-453e-8ede-2893860046e7 PiperOrigin-RevId: 461091571 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c334204be12..59a60a907a9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f5b1b15d76f0a9ee24732916502a355653eb59c55c7e4a4d9e15d29155f9b235", - git_commit = "8bba02f4861d3619a5716b96fe723020a33593be", + sha256 = "096be5c5e3752023d9ce2f51e8942877cbf49a10e7e86435442996ca08b41905", + git_commit = "27ebeac0804ee51e537d1394213c39db8fecfe4d", ) # Import all of TensorFlow Serving's external dependencies. From 677ba5a07813c4fb5a2ffb4567a7ec4a137eebe6 Mon Sep 17 00:00:00 2001 From: Robert Neale Date: Thu, 14 Jul 2022 22:34:20 -0700 Subject: [PATCH 6005/8103] Increase timeout for model tests. PiperOrigin-RevId: 461126500 --- .../model_servers/tensorflow_model_server_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/model_servers/tensorflow_model_server_test.py b/tensorflow_serving/model_servers/tensorflow_model_server_test.py index faa245c25d7..32e53c05885 100644 --- a/tensorflow_serving/model_servers/tensorflow_model_server_test.py +++ b/tensorflow_serving/model_servers/tensorflow_model_server_test.py @@ -54,7 +54,7 @@ FLAGS = flags.FLAGS -RPC_TIMEOUT = 5.0 +RPC_TIMEOUT = 20.0 GRPC_SOCKET_PATH = '/tmp/tf-serving.sock' From 5ac303f15d605e2e6b1e02f0d9558667a3cd6060 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 15 Jul 2022 00:01:31 -0700 Subject: [PATCH 6006/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e43d5602-ec10-4d92-9f68-8ffa0eba2e6b PiperOrigin-RevId: 461135596 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 59a60a907a9..bece8da184e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "096be5c5e3752023d9ce2f51e8942877cbf49a10e7e86435442996ca08b41905", - git_commit = "27ebeac0804ee51e537d1394213c39db8fecfe4d", + sha256 = "1a05546297b12726b8989df5f9b9956f1574a6312aac8e92c1f0fb37310924ef", + git_commit = "4def0e5026c58fddee60bf0724c2855660b41663", ) # Import all of TensorFlow Serving's external dependencies. From 719d30ef60a520d76d2c4eaa9be862209e51298c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 15 Jul 2022 06:01:24 -0700 Subject: [PATCH 6007/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/92e0994b-59ba-46b5-b0fb-339109b03908 PiperOrigin-RevId: 461183819 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bece8da184e..0dfc63ba9e0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1a05546297b12726b8989df5f9b9956f1574a6312aac8e92c1f0fb37310924ef", - git_commit = "4def0e5026c58fddee60bf0724c2855660b41663", + sha256 = "a71da73ee00ef7e728ce5be007e0bce8b817d99fe1f959a20ff87c99a0ae7d3d", + git_commit = "d06061db3e6548612804c446762d6711aa54ffb0", ) # Import all of TensorFlow Serving's external dependencies. From 0cc0cf8016fec7447c3fe2052d34fafadb004a6e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 15 Jul 2022 12:01:23 -0700 Subject: [PATCH 6008/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b615f985-2c39-4dce-879c-e750f0eba9bf PiperOrigin-RevId: 461222607 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0dfc63ba9e0..27dd7ab5454 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a71da73ee00ef7e728ce5be007e0bce8b817d99fe1f959a20ff87c99a0ae7d3d", - git_commit = "d06061db3e6548612804c446762d6711aa54ffb0", + sha256 = "6dd22aabc9f5ef495472dbf6be9db4c2cdea62af3d6f773c82372ba7d8da0857", + git_commit = "aa21adc148c98c76f54ba5932ce34cf59da538c4", ) # Import all of TensorFlow Serving's external dependencies. From 9471326341e5e74aab508c54ded605be26f971d4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 15 Jul 2022 18:01:30 -0700 Subject: [PATCH 6009/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1f949183-e087-471a-80ac-d97c71a7c36d PiperOrigin-RevId: 461276808 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 27dd7ab5454..3d407480e65 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6dd22aabc9f5ef495472dbf6be9db4c2cdea62af3d6f773c82372ba7d8da0857", - git_commit = "aa21adc148c98c76f54ba5932ce34cf59da538c4", + sha256 = "7723f6792b06558617f5a8c130bf11f2f7af7245b7d8b45e949ec7c9a2d6e662", + git_commit = "9178ac9d6389bdc54638ab913ea0e419234d14eb", ) # Import all of TensorFlow Serving's external dependencies. From 00d60f1bc65f6846882a789b00629ef91dd73caf Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 16 Jul 2022 00:01:25 -0700 Subject: [PATCH 6010/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2b0f69b4-1424-41a0-86d9-793b0da35276 PiperOrigin-RevId: 461310466 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3d407480e65..2c12aeb8423 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7723f6792b06558617f5a8c130bf11f2f7af7245b7d8b45e949ec7c9a2d6e662", - git_commit = "9178ac9d6389bdc54638ab913ea0e419234d14eb", + sha256 = "c0ffa0acae4f17f29339fc73b32ac10d9725a81f6210c8d61f04fdadc84e541b", + git_commit = "aaf0c33eab2e80092b1e7eb0004683f20e9dd4de", ) # Import all of TensorFlow Serving's external dependencies. From 40e0b58cdff8244659ad6c749e8c989b072296e7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 16 Jul 2022 06:01:26 -0700 Subject: [PATCH 6011/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b927b5d0-7729-41e5-8c50-991796b8cfa2 PiperOrigin-RevId: 461341745 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 2c12aeb8423..a8b90d14b1a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c0ffa0acae4f17f29339fc73b32ac10d9725a81f6210c8d61f04fdadc84e541b", - git_commit = "aaf0c33eab2e80092b1e7eb0004683f20e9dd4de", + sha256 = "9ce0cc3ca7aaf87528078268d6b32504040d8b66057f390f5b953a4b380fddd3", + git_commit = "c8ec0e23f1077f385859804f4881b8d2c1213c97", ) # Import all of TensorFlow Serving's external dependencies. From 179aed754215e1160e6a587ea0640c5391882c54 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 16 Jul 2022 18:01:17 -0700 Subject: [PATCH 6012/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/778fdd60-d4b9-4164-8f9f-738c82236454 PiperOrigin-RevId: 461396964 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a8b90d14b1a..02dbbf0171a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9ce0cc3ca7aaf87528078268d6b32504040d8b66057f390f5b953a4b380fddd3", - git_commit = "c8ec0e23f1077f385859804f4881b8d2c1213c97", + sha256 = "bcf7dffca1fa19da05c313f20f6ce73ccede4154652441499afc88c49c8b6e27", + git_commit = "e61cfa87193d9160b964db75dbd2b0b617a8b24a", ) # Import all of TensorFlow Serving's external dependencies. From 05f6cfc55b128429fe52f0ecdc962f6d4829e7ad Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 17 Jul 2022 00:01:25 -0700 Subject: [PATCH 6013/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9cc8f7b3-5c2e-4728-81c6-5212a8496c4d PiperOrigin-RevId: 461424445 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 02dbbf0171a..18e916e3f36 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bcf7dffca1fa19da05c313f20f6ce73ccede4154652441499afc88c49c8b6e27", - git_commit = "e61cfa87193d9160b964db75dbd2b0b617a8b24a", + sha256 = "6b967a56cbfa8a29e47ec51899e930f8b5733268b3e475dc682b929ac17d8a11", + git_commit = "d52ee063796b1ba4f111461d2adb89ac7737b7a4", ) # Import all of TensorFlow Serving's external dependencies. From a9b11c1315f9679512e084a3ac201cd29b97c77c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 17 Jul 2022 06:01:17 -0700 Subject: [PATCH 6014/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3bf85870-e8b5-476d-b346-14382f341f6e PiperOrigin-RevId: 461454809 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 18e916e3f36..cffeff59a0c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6b967a56cbfa8a29e47ec51899e930f8b5733268b3e475dc682b929ac17d8a11", - git_commit = "d52ee063796b1ba4f111461d2adb89ac7737b7a4", + sha256 = "0c8b71d30bccc6f3f64dc3741bd23d00a6fdd998e1b5a278caf2cd93d3a50105", + git_commit = "217e604a66ee8e94b8176e11f391f7c4d71026e6", ) # Import all of TensorFlow Serving's external dependencies. From ddf25e1d56e20f932393ba1d31588ed106e03eb5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 17 Jul 2022 18:01:18 -0700 Subject: [PATCH 6015/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/82f53f28-ed48-43dd-9725-e7978129f252 PiperOrigin-RevId: 461509403 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cffeff59a0c..12692d40343 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0c8b71d30bccc6f3f64dc3741bd23d00a6fdd998e1b5a278caf2cd93d3a50105", - git_commit = "217e604a66ee8e94b8176e11f391f7c4d71026e6", + sha256 = "16b6473cba52354c71286c27c333de46bb5a7be65d31c8fd889581e07b3293b0", + git_commit = "870ed1b76209b8850f300842a67416c4a69523e3", ) # Import all of TensorFlow Serving's external dependencies. From c2c814abe620e72b4cf9158dbc1da52df02513ca Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 18 Jul 2022 00:01:21 -0700 Subject: [PATCH 6016/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8b190ef4-9eac-44c0-8b7d-d4a90f014c40 PiperOrigin-RevId: 461544274 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 12692d40343..01a35e3bc2b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "16b6473cba52354c71286c27c333de46bb5a7be65d31c8fd889581e07b3293b0", - git_commit = "870ed1b76209b8850f300842a67416c4a69523e3", + sha256 = "c9f8796c5e7cd31aa65b82519084b9e8de556caa7a6ca6bd531ad2ac48394dbc", + git_commit = "4d3c0f724dd6765869a6fb4e1c2c30dde7d271b7", ) # Import all of TensorFlow Serving's external dependencies. From b4a33662857909c3481f655f308b0240efc46a1f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 18 Jul 2022 06:01:19 -0700 Subject: [PATCH 6017/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/dae1334f-1da2-4bb1-86a6-43e86179401e PiperOrigin-RevId: 461597410 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 01a35e3bc2b..a744f3187e7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c9f8796c5e7cd31aa65b82519084b9e8de556caa7a6ca6bd531ad2ac48394dbc", - git_commit = "4d3c0f724dd6765869a6fb4e1c2c30dde7d271b7", + sha256 = "3f38410a8b142c93140e6ef3b6dd7f14bd680a55e2ba2b2882815fa9771effe0", + git_commit = "174a0a8d6f9df343cc5806f6b7890b2f1b16ead2", ) # Import all of TensorFlow Serving's external dependencies. From b59811b0cce02eb7c82a440f0ba35ecdaf2a6318 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 18 Jul 2022 12:01:21 -0700 Subject: [PATCH 6018/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4811fe3e-0c01-4487-806f-3140bd206f4d PiperOrigin-RevId: 461679072 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a744f3187e7..da80188cb20 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3f38410a8b142c93140e6ef3b6dd7f14bd680a55e2ba2b2882815fa9771effe0", - git_commit = "174a0a8d6f9df343cc5806f6b7890b2f1b16ead2", + sha256 = "2a211da3d5c05edbd74ae86c94ec6f8151c77bc9a53d9c9c296ab4eb8191112e", + git_commit = "d62962ab426ca28038fa9babbb8119961d22d112", ) # Import all of TensorFlow Serving's external dependencies. From e1e799f4f0229193b0a6c87891d5e9340f22d17c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 18 Jul 2022 18:01:21 -0700 Subject: [PATCH 6019/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/28f202bb-48c3-4030-9f96-c058ef9a3617 PiperOrigin-RevId: 461759516 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index da80188cb20..3302bdff495 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2a211da3d5c05edbd74ae86c94ec6f8151c77bc9a53d9c9c296ab4eb8191112e", - git_commit = "d62962ab426ca28038fa9babbb8119961d22d112", + sha256 = "0bc4df077ac30ec3e40cbf110a170c3ffd03f313d373deda557328598d8caac8", + git_commit = "663e63fa4dfc7dce1cb96ea203c649269902f64f", ) # Import all of TensorFlow Serving's external dependencies. From 21fda280bc72bdbc4386c7b0d2ad4b97264921ad Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 18 Jul 2022 20:09:44 -0700 Subject: [PATCH 6020/8103] Use pb.h for topology.proto. This change uses pb.h instead of proto.h because OSS proto codegen doesn't support proto.h. The OSS conversion converts proto.h to pb.h in some directories but model_servers/ and examples/ are explicitly skipped. PiperOrigin-RevId: 461780646 --- tensorflow_serving/model_servers/main.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_serving/model_servers/main.cc b/tensorflow_serving/model_servers/main.cc index d19ec45bdca..d6664c12c89 100644 --- a/tensorflow_serving/model_servers/main.cc +++ b/tensorflow_serving/model_servers/main.cc @@ -55,7 +55,7 @@ limitations under the License. #include "tensorflow_serving/model_servers/version.h" #if defined(LIBTPU_ON_GCE) || defined(PLATFORM_CLOUD_TPU) -#include "tensorflow/core/protobuf/tpu/topology.proto.h" +#include "tensorflow/core/protobuf/tpu/topology.pb.h" #include "tensorflow/core/tpu/tpu_global_init.h" void InitializeTPU(tensorflow::serving::main::Server::Options& server_options) { From 2d4be14e62557e4cbcc6751264a860142a442e91 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 19 Jul 2022 00:01:19 -0700 Subject: [PATCH 6021/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/37470d0b-da9d-45d1-8f60-f3580b62ebb5 PiperOrigin-RevId: 461810512 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3302bdff495..749acac632d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0bc4df077ac30ec3e40cbf110a170c3ffd03f313d373deda557328598d8caac8", - git_commit = "663e63fa4dfc7dce1cb96ea203c649269902f64f", + sha256 = "26ff31ae28997cbeaf14b4d7fc5251ee833e22b15ff1d0f7105d30bc344391f6", + git_commit = "1a0501831f3ef567516a42f14c61192f17adfe68", ) # Import all of TensorFlow Serving's external dependencies. From 7b0b18d3642e79172ee9c9c4e656957c8ded4415 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 19 Jul 2022 06:01:24 -0700 Subject: [PATCH 6022/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7c28a6a5-f673-4b88-9e02-a24a5965b28c PiperOrigin-RevId: 461862470 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 749acac632d..223fde6a08e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "26ff31ae28997cbeaf14b4d7fc5251ee833e22b15ff1d0f7105d30bc344391f6", - git_commit = "1a0501831f3ef567516a42f14c61192f17adfe68", + sha256 = "961d684686a996070fa466f587391bb25386620fd7aa1cd7bc502e3e758aa9cf", + git_commit = "61014f655a18c7de906ad42cb4d95de8252ab0f5", ) # Import all of TensorFlow Serving's external dependencies. From 0763707d6bca276fd649a97e95f85e21db77543a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 19 Jul 2022 12:01:23 -0700 Subject: [PATCH 6023/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/528de1d2-ca44-41ff-8e00-d2de9e1392fa PiperOrigin-RevId: 461940245 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 223fde6a08e..9cfcf26900d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "961d684686a996070fa466f587391bb25386620fd7aa1cd7bc502e3e758aa9cf", - git_commit = "61014f655a18c7de906ad42cb4d95de8252ab0f5", + sha256 = "dd18a61e3c19a31025dbd541ae47ff0e37f5d0fe619ae858b75a3fb7f8ba83f6", + git_commit = "a7404375340843e33859fad6591bfe1e93fc51a3", ) # Import all of TensorFlow Serving's external dependencies. From 436cf94d939de8409bc469b265fa25171add7539 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 19 Jul 2022 18:01:20 -0700 Subject: [PATCH 6024/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3a4f2339-8af4-4c36-9105-fb46071b221e PiperOrigin-RevId: 462019732 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9cfcf26900d..e81a028a763 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dd18a61e3c19a31025dbd541ae47ff0e37f5d0fe619ae858b75a3fb7f8ba83f6", - git_commit = "a7404375340843e33859fad6591bfe1e93fc51a3", + sha256 = "b1e1f6a3f5bf0dc692aad904ec9989cdee29c52fcb6e36621ba64d75f39b88eb", + git_commit = "c286799811ea13f6e85baaab8de83e6fbdde01b9", ) # Import all of TensorFlow Serving's external dependencies. From c02a812962373bfeee93a70bd6bd577e24ef8e12 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Jul 2022 00:01:30 -0700 Subject: [PATCH 6025/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3057d396-3e30-426e-802c-e0d6a1793e6e PiperOrigin-RevId: 462068228 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e81a028a763..fca04eb5812 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b1e1f6a3f5bf0dc692aad904ec9989cdee29c52fcb6e36621ba64d75f39b88eb", - git_commit = "c286799811ea13f6e85baaab8de83e6fbdde01b9", + sha256 = "65d0bec516e30b7c8f9f928e3997ebbbb30110d185e455c3a67ecb516bd2d18f", + git_commit = "3d5c48e3b73eecd2d56a562f2de845760865e4f2", ) # Import all of TensorFlow Serving's external dependencies. From 6375843d1e0fe7c280e5aba95e0994d4fc98c2c6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Jul 2022 06:01:28 -0700 Subject: [PATCH 6026/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3b0fc3ac-8769-4ff4-9d39-acad7464599f PiperOrigin-RevId: 462122100 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fca04eb5812..326cbc47b73 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "65d0bec516e30b7c8f9f928e3997ebbbb30110d185e455c3a67ecb516bd2d18f", - git_commit = "3d5c48e3b73eecd2d56a562f2de845760865e4f2", + sha256 = "68db31d8395405f605ccd17d2bb4ce58ec53648d86475bef3ddc8abab4dce344", + git_commit = "b6712bc0dea87fda7595a1f115d5998f40a5e77b", ) # Import all of TensorFlow Serving's external dependencies. From a098e258b7702eae793ba9ba95dff156cb0d2dd6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Jul 2022 12:01:18 -0700 Subject: [PATCH 6027/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6b057f71-c735-4fd5-8a10-797bef102280 PiperOrigin-RevId: 462198435 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 326cbc47b73..74029cb9db1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "68db31d8395405f605ccd17d2bb4ce58ec53648d86475bef3ddc8abab4dce344", - git_commit = "b6712bc0dea87fda7595a1f115d5998f40a5e77b", + sha256 = "a93bbfb4fd8c3a686eeb5515a3db0e073402ab83de62a56ce1bf45579efa62a7", + git_commit = "a33872da7a0f6a7b4f4f91e090b8992e4cafcdc8", ) # Import all of TensorFlow Serving's external dependencies. From 9898ccd0915cf8dfb4f3274be493de028e09b3e9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 20 Jul 2022 22:04:43 -0700 Subject: [PATCH 6028/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ce9a2a68-eb9f-48bd-be3f-b0808aa1483e PiperOrigin-RevId: 462300586 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 74029cb9db1..bea5e29438a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a93bbfb4fd8c3a686eeb5515a3db0e073402ab83de62a56ce1bf45579efa62a7", - git_commit = "a33872da7a0f6a7b4f4f91e090b8992e4cafcdc8", + sha256 = "60c8afac2f7d4aa40b4a6583bb705d30edc00636069fc7fb6acd709052b5b361", + git_commit = "6faa96819dc9c5b6c295a5add1e30571bd34ef2f", ) # Import all of TensorFlow Serving's external dependencies. From aef7bceb7e2bd412be0066d4586263707896beeb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Jul 2022 00:01:41 -0700 Subject: [PATCH 6029/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ee892a4a-2054-4b40-ad98-3242c3a15804 PiperOrigin-RevId: 462314599 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bea5e29438a..87c42359a3a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "60c8afac2f7d4aa40b4a6583bb705d30edc00636069fc7fb6acd709052b5b361", - git_commit = "6faa96819dc9c5b6c295a5add1e30571bd34ef2f", + sha256 = "4f2df2cd4397d2b086952914cdbe82e42b7c86e1878c3d5de0561b61370095de", + git_commit = "03a659d7be9a1154fdf5eeac221e5950fec07dad", ) # Import all of TensorFlow Serving's external dependencies. From 3188a072508915a021421d495618e175addaadd1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Jul 2022 06:01:23 -0700 Subject: [PATCH 6030/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c4fcec5d-923a-44f7-9cd8-a406328df223 PiperOrigin-RevId: 462365572 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 87c42359a3a..1cb0712fdc3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4f2df2cd4397d2b086952914cdbe82e42b7c86e1878c3d5de0561b61370095de", - git_commit = "03a659d7be9a1154fdf5eeac221e5950fec07dad", + sha256 = "55607921a93ba814edc7722ece018b6a51cf80647984dd9983c5c28ac858a876", + git_commit = "3d1a3d64492a807588618c008a084f26733f2676", ) # Import all of TensorFlow Serving's external dependencies. From 0ad1a095941b8ee9edd1f525e0116e87d7b2c235 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Jul 2022 12:01:16 -0700 Subject: [PATCH 6031/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5ce2394d-945d-4e5c-b9d3-2038ba762baa PiperOrigin-RevId: 462439951 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1cb0712fdc3..d237cb9110b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "55607921a93ba814edc7722ece018b6a51cf80647984dd9983c5c28ac858a876", - git_commit = "3d1a3d64492a807588618c008a084f26733f2676", + sha256 = "383e85581aae9cd25a532f5f0e66cb83170f313099cd90703ff2cd8bc2a6f789", + git_commit = "177036a2de94771e84069c81385b46df5f00e848", ) # Import all of TensorFlow Serving's external dependencies. From 59ed3b83cf380aabeabb5b55367b2fbfa309c46b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 21 Jul 2022 18:01:22 -0700 Subject: [PATCH 6032/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4c934c1a-7576-44c7-a7a3-8416a2fe2441 PiperOrigin-RevId: 462510109 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d237cb9110b..dc575ff74e6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "383e85581aae9cd25a532f5f0e66cb83170f313099cd90703ff2cd8bc2a6f789", - git_commit = "177036a2de94771e84069c81385b46df5f00e848", + sha256 = "3cceecccff686e738a268e3784c88e017a93591bc13d9eaf44a427ec05cb55ae", + git_commit = "f6f312dfac93fc2fbbaca59936a6edeec1bd6b96", ) # Import all of TensorFlow Serving's external dependencies. From 3e66a01d7926780c0876ecf25285205bf86ae2c1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Jul 2022 00:01:25 -0700 Subject: [PATCH 6033/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/211fe7c4-ed7b-44e6-a026-080927c04f87 PiperOrigin-RevId: 462553976 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index dc575ff74e6..b08b164edb5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3cceecccff686e738a268e3784c88e017a93591bc13d9eaf44a427ec05cb55ae", - git_commit = "f6f312dfac93fc2fbbaca59936a6edeec1bd6b96", + sha256 = "b23896566c31d11fd48dc5b5a81aaa9b79cecd294f8aef36a685042f3e84b3a9", + git_commit = "4c6efe069314393d52fc2f74d0515672688aae72", ) # Import all of TensorFlow Serving's external dependencies. From f2e43d16628b1699b57599a800be3db4f49fbf43 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Jul 2022 06:01:28 -0700 Subject: [PATCH 6034/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/52a5d558-8f03-463d-bb19-7d2ad0f6330a PiperOrigin-RevId: 462603675 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b08b164edb5..81f36f1b2b4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b23896566c31d11fd48dc5b5a81aaa9b79cecd294f8aef36a685042f3e84b3a9", - git_commit = "4c6efe069314393d52fc2f74d0515672688aae72", + sha256 = "617db3ee3aa0bd7d9673cc573692fcc91017955928a9ae8f1069c10f9155e388", + git_commit = "b7a835fc762aac0f6ac377cb2a66325a97ca82d9", ) # Import all of TensorFlow Serving's external dependencies. From e424fa0ac40af44b7e08b7215188b0863f057e7e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Jul 2022 12:01:30 -0700 Subject: [PATCH 6035/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6183dfa0-f2ed-42b7-87a2-5d679979c971 PiperOrigin-RevId: 462673243 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 81f36f1b2b4..698dec53379 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "617db3ee3aa0bd7d9673cc573692fcc91017955928a9ae8f1069c10f9155e388", - git_commit = "b7a835fc762aac0f6ac377cb2a66325a97ca82d9", + sha256 = "6b2b714e00db7b82fd79aaa1deacd321c7f0aeab8b17cf8c32062a80070842a8", + git_commit = "579c67bd60220fe66a29318191f0850ff0aa825f", ) # Import all of TensorFlow Serving's external dependencies. From 18604a74941620989e5d9f02e3caa1272d80f725 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 22 Jul 2022 18:01:25 -0700 Subject: [PATCH 6036/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0337ba61-5d8d-44ed-8fd3-ed6948b65d36 PiperOrigin-RevId: 462741238 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 698dec53379..39c16ea3863 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6b2b714e00db7b82fd79aaa1deacd321c7f0aeab8b17cf8c32062a80070842a8", - git_commit = "579c67bd60220fe66a29318191f0850ff0aa825f", + sha256 = "59edbe786bac472c6c01b816227b78eaf67046d8f0fc9bb42846b7934483f577", + git_commit = "d840e52f462fed63abe6eb9b31c559a3dd9e6db4", ) # Import all of TensorFlow Serving's external dependencies. From 4081360f5b56af296ee490fd6d17c1f3f9bfbff1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 23 Jul 2022 00:01:25 -0700 Subject: [PATCH 6037/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c2a12875-97b0-4bde-a9f6-78ec5726dc7b PiperOrigin-RevId: 462775837 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 39c16ea3863..7137724c862 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "59edbe786bac472c6c01b816227b78eaf67046d8f0fc9bb42846b7934483f577", - git_commit = "d840e52f462fed63abe6eb9b31c559a3dd9e6db4", + sha256 = "12d521f4c919d8f7714c620dfc113570af743715103d981189736514974a4127", + git_commit = "21122d1ed2e065a516d7ab98fc21948d3e912d4c", ) # Import all of TensorFlow Serving's external dependencies. From 28963366c7059567acd0c826e8a8ad660853a96e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 23 Jul 2022 06:01:27 -0700 Subject: [PATCH 6038/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/99ddcfa0-973d-413c-9758-7316dab67729 PiperOrigin-RevId: 462812137 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7137724c862..0198eb0ebf8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "12d521f4c919d8f7714c620dfc113570af743715103d981189736514974a4127", - git_commit = "21122d1ed2e065a516d7ab98fc21948d3e912d4c", + sha256 = "38e34c6f7a4e922c5c88facfa2470573e1571575cea01e6a62e2857a7e6ad6aa", + git_commit = "d42edf7010ec8e031799503759a76061b25b0068", ) # Import all of TensorFlow Serving's external dependencies. From da37b02db3f54e3493967e848ec8085f0a3a2a42 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 23 Jul 2022 18:01:30 -0700 Subject: [PATCH 6039/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4546a134-752c-4735-8b9f-cc8f947b5984 PiperOrigin-RevId: 462866907 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 0198eb0ebf8..f9e0d092d5f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "38e34c6f7a4e922c5c88facfa2470573e1571575cea01e6a62e2857a7e6ad6aa", - git_commit = "d42edf7010ec8e031799503759a76061b25b0068", + sha256 = "97b05312aed7bf890c4074a302e8425e045533bb9034bd15710168ee6d6595d1", + git_commit = "1949eec4f52bfed8349cffb677da418df95451f4", ) # Import all of TensorFlow Serving's external dependencies. From 0ce08694f970f8cb91642ed75d409fdaa6ea802e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 24 Jul 2022 00:01:27 -0700 Subject: [PATCH 6040/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b5103f78-f335-4a5d-9f58-fb34be571045 PiperOrigin-RevId: 462894612 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f9e0d092d5f..3572f22f9c2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "97b05312aed7bf890c4074a302e8425e045533bb9034bd15710168ee6d6595d1", - git_commit = "1949eec4f52bfed8349cffb677da418df95451f4", + sha256 = "5b0cc67b35dc771b106705a09c805a892ec556d5c2d7aaff44fb5d25b56d1081", + git_commit = "552bfced6ce4809db5f3ca305f60ff80dd40c5a3", ) # Import all of TensorFlow Serving's external dependencies. From c1c69472a50eb3b05a49cc17b4ad27428adc9b43 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 24 Jul 2022 06:01:24 -0700 Subject: [PATCH 6041/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3b421517-75d6-4c8d-acd0-94969284374b PiperOrigin-RevId: 462924621 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3572f22f9c2..9fd0041c85e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5b0cc67b35dc771b106705a09c805a892ec556d5c2d7aaff44fb5d25b56d1081", - git_commit = "552bfced6ce4809db5f3ca305f60ff80dd40c5a3", + sha256 = "5931435f51b9a5f099cdd5211901a32a12ded9c4de0ca5ac77697c0c2603813e", + git_commit = "b4645bdcde541799357d5483e091298205dfdc63", ) # Import all of TensorFlow Serving's external dependencies. From 4f01fbfcced2aa6b798edd22b983330b2c9d3a2c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 24 Jul 2022 12:01:16 -0700 Subject: [PATCH 6042/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/084f99d5-184f-45e2-a983-97dcf471bb4c PiperOrigin-RevId: 462953203 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9fd0041c85e..d08b3b1bf86 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5931435f51b9a5f099cdd5211901a32a12ded9c4de0ca5ac77697c0c2603813e", - git_commit = "b4645bdcde541799357d5483e091298205dfdc63", + sha256 = "a7c1f7da64eab91976666b4c19d9fde56e75b106263f71179cf2ede6956ce464", + git_commit = "2780589f2cfa635b8d5713373835621b17e11e0f", ) # Import all of TensorFlow Serving's external dependencies. From a1c602375d15b95877c909881909323134cf8fd8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Jul 2022 00:01:19 -0700 Subject: [PATCH 6043/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0c25bc01-24bc-42b6-b402-9cc0f338e9fc PiperOrigin-RevId: 463014947 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d08b3b1bf86..fd557aadef6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a7c1f7da64eab91976666b4c19d9fde56e75b106263f71179cf2ede6956ce464", - git_commit = "2780589f2cfa635b8d5713373835621b17e11e0f", + sha256 = "cadbe3b68f29a37819d2813c3f5ddbeca81d27a10b8e2995eb335929a338a4e7", + git_commit = "dfc7e7245ab6319e4c8a64dceb5667b19cd0cf51", ) # Import all of TensorFlow Serving's external dependencies. From 2ed915dd7a233e24ad502a4448af7f2c77cf53c5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Jul 2022 06:01:17 -0700 Subject: [PATCH 6044/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d583ff2f-509e-4bb3-a48d-0b9c6c8eb2aa PiperOrigin-RevId: 463066572 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fd557aadef6..8535e707398 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cadbe3b68f29a37819d2813c3f5ddbeca81d27a10b8e2995eb335929a338a4e7", - git_commit = "dfc7e7245ab6319e4c8a64dceb5667b19cd0cf51", + sha256 = "bc05f177f93004b4af360d2dde9fda0598bbfffdd5034e28bbabf02bcd16eadb", + git_commit = "b2df2dea6e613f22145f723948b04c5246f3a943", ) # Import all of TensorFlow Serving's external dependencies. From dbc3ab1a6eb743b34e1e11352c0c650c75e18e9f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Jul 2022 12:01:20 -0700 Subject: [PATCH 6045/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f9be83bf-f540-49e9-90f5-75d0b5e9b120 PiperOrigin-RevId: 463143669 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8535e707398..282e75f7375 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bc05f177f93004b4af360d2dde9fda0598bbfffdd5034e28bbabf02bcd16eadb", - git_commit = "b2df2dea6e613f22145f723948b04c5246f3a943", + sha256 = "9a017431ae62cdf2a80f8259f168d37bcab9115dc5e09a57eb935b5ca012f956", + git_commit = "b09da08e1046a4a13123fcd758cd0a984080eb65", ) # Import all of TensorFlow Serving's external dependencies. From 5a5c960d7457d3c351c1efe1b477d883b172ccbb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 25 Jul 2022 18:01:17 -0700 Subject: [PATCH 6046/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/39e20407-8bd4-455c-8ea0-62cd5e28dcd6 PiperOrigin-RevId: 463220225 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 282e75f7375..38aa47bde79 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9a017431ae62cdf2a80f8259f168d37bcab9115dc5e09a57eb935b5ca012f956", - git_commit = "b09da08e1046a4a13123fcd758cd0a984080eb65", + sha256 = "74d1885a0b08f5a8be37252b584564ffb84fbffab309d5745a2f5aedd74dfe25", + git_commit = "044fc36bf4490a9b88b8ceaa0d6f227c71aad0fb", ) # Import all of TensorFlow Serving's external dependencies. From e05422a3c1db344537cc731cf42d2554cfbe92ee Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Jul 2022 00:01:59 -0700 Subject: [PATCH 6047/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6f4e367a-88d5-45c4-9916-36eb1bec04c9 PiperOrigin-RevId: 463265503 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 38aa47bde79..4d31a77b57f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "74d1885a0b08f5a8be37252b584564ffb84fbffab309d5745a2f5aedd74dfe25", - git_commit = "044fc36bf4490a9b88b8ceaa0d6f227c71aad0fb", + sha256 = "865ee88554e0ef1fe7e24a8770076aaf5ebcd5280d9a722ca8a84815172e531d", + git_commit = "479d25da28e315a183451711849f6e71fe8aa4e1", ) # Import all of TensorFlow Serving's external dependencies. From 07f64d4136feeaa6851eda41185b19f5482cc9f8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Jul 2022 06:01:23 -0700 Subject: [PATCH 6048/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e2deb82b-c5ea-4cea-9292-b6d7339e4ea3 PiperOrigin-RevId: 463316697 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4d31a77b57f..1560c6a2fe2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "865ee88554e0ef1fe7e24a8770076aaf5ebcd5280d9a722ca8a84815172e531d", - git_commit = "479d25da28e315a183451711849f6e71fe8aa4e1", + sha256 = "99528a89e7574bcd5945c7ab6ec722cf4706e992115624901654e8ab1d24bba0", + git_commit = "368bcd818415560befcc4012529d0bde61257ed2", ) # Import all of TensorFlow Serving's external dependencies. From 75ae24093945791b48e13d4351ac771171f15017 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 26 Jul 2022 18:01:29 -0700 Subject: [PATCH 6049/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/cfa22285-bf13-4827-b3bb-3270060477d1 PiperOrigin-RevId: 463469606 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1560c6a2fe2..c8ef26903f9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "99528a89e7574bcd5945c7ab6ec722cf4706e992115624901654e8ab1d24bba0", - git_commit = "368bcd818415560befcc4012529d0bde61257ed2", + sha256 = "fe6753e0784c855e4ae9bcd8f348b6c67d2fd9afd8ba6788a64f253f692af5b9", + git_commit = "9e938054241976368f4614f96070722f9181984c", ) # Import all of TensorFlow Serving's external dependencies. From cc60438d21a43e85e38825d99e52848f83dfeff4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Jul 2022 00:04:13 -0700 Subject: [PATCH 6050/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fd89450b-32c3-46bf-9479-6d196afbb7da PiperOrigin-RevId: 463515968 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c8ef26903f9..167a5a560ce 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fe6753e0784c855e4ae9bcd8f348b6c67d2fd9afd8ba6788a64f253f692af5b9", - git_commit = "9e938054241976368f4614f96070722f9181984c", + sha256 = "db4106aefe3b47c565b44d975e6c42c117f63b41458b7d16de505306cc35f153", + git_commit = "b1853b4d39c1648501b320d46487741a938dd768", ) # Import all of TensorFlow Serving's external dependencies. From 774bd9538a45413fbf18f4c30243c6e2b12656b2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Jul 2022 06:01:35 -0700 Subject: [PATCH 6051/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ada8ee0f-530f-464c-8170-1be617bd831c PiperOrigin-RevId: 463566597 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 167a5a560ce..6e3c372bfbc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "db4106aefe3b47c565b44d975e6c42c117f63b41458b7d16de505306cc35f153", - git_commit = "b1853b4d39c1648501b320d46487741a938dd768", + sha256 = "31aaceda917f5f0fd1f848fe0a2b41932d402c225351cd9ba75f5af582288fb7", + git_commit = "3aebf075843c6db0a2a72dcf2281b61aa300a8e8", ) # Import all of TensorFlow Serving's external dependencies. From 3de50077852c16779e725497ef102462e5bacd62 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Jul 2022 12:01:26 -0700 Subject: [PATCH 6052/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/98a900ec-ec70-4928-9a67-27ee787b2942 PiperOrigin-RevId: 463644394 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6e3c372bfbc..349c6790dbe 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "31aaceda917f5f0fd1f848fe0a2b41932d402c225351cd9ba75f5af582288fb7", - git_commit = "3aebf075843c6db0a2a72dcf2281b61aa300a8e8", + sha256 = "ed7f30884a7852453e870e3e203078618bf14dbc6b1339a3aaac50af607ada8a", + git_commit = "cadeb08e85ec05d3acf64714543e6519e52448c0", ) # Import all of TensorFlow Serving's external dependencies. From 3443a287db8b7598c87a480f3e9e1df3d3565bff Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 27 Jul 2022 18:01:21 -0700 Subject: [PATCH 6053/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6ca3a6a7-fd43-440f-a1a5-7437859e3c12 PiperOrigin-RevId: 463721938 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 349c6790dbe..e7cde23e2b5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ed7f30884a7852453e870e3e203078618bf14dbc6b1339a3aaac50af607ada8a", - git_commit = "cadeb08e85ec05d3acf64714543e6519e52448c0", + sha256 = "17254e720ab83d3f0baa7330d6cfaf46c5aeee2b2220b65ccd69c951e62fdb24", + git_commit = "e3fb392bad8c79a65131ca2470ee4db2c5860b8c", ) # Import all of TensorFlow Serving's external dependencies. From 2493f56ca6ba72ded2b020178ffb6dbcf0070a84 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Jul 2022 00:01:38 -0700 Subject: [PATCH 6054/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1e53dbf1-7a58-4b27-a2ba-2b8a71690dc7 PiperOrigin-RevId: 463766788 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e7cde23e2b5..3b1c8bc00ac 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "17254e720ab83d3f0baa7330d6cfaf46c5aeee2b2220b65ccd69c951e62fdb24", - git_commit = "e3fb392bad8c79a65131ca2470ee4db2c5860b8c", + sha256 = "f5139aff2516a98aa46a9da43488eac3af79c9a56f2e1f691516af4ea675e744", + git_commit = "b835ad5009f42980328d973161b362860bcfa451", ) # Import all of TensorFlow Serving's external dependencies. From f2effa652944d640d1c7928552cce4959aa89837 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Jul 2022 06:01:27 -0700 Subject: [PATCH 6055/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5d8fa760-dda0-4954-8b27-885b8d9057b8 PiperOrigin-RevId: 463818956 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3b1c8bc00ac..88c2988541d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f5139aff2516a98aa46a9da43488eac3af79c9a56f2e1f691516af4ea675e744", - git_commit = "b835ad5009f42980328d973161b362860bcfa451", + sha256 = "2e6aef3052fb1763979a1f0913dd72babeb0a902f5c84f51b9cf1abe8bfc673f", + git_commit = "f8b8568001d16db20cbd5c1bc8722168e834bc36", ) # Import all of TensorFlow Serving's external dependencies. From f660c02519299a7e6a79be844c8f4ff5a633195f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Jul 2022 12:01:31 -0700 Subject: [PATCH 6056/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d2c45234-4b31-42ed-9d36-f0966b6951ba PiperOrigin-RevId: 463892542 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 88c2988541d..d8d92c79132 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2e6aef3052fb1763979a1f0913dd72babeb0a902f5c84f51b9cf1abe8bfc673f", - git_commit = "f8b8568001d16db20cbd5c1bc8722168e834bc36", + sha256 = "d8c8ac5ffbebef2231ad6145aa7a0d82b9cb0389f8c39378d94335a994befdd6", + git_commit = "fe6f5ecfa482bb68049810526e7331a433ba2e98", ) # Import all of TensorFlow Serving's external dependencies. From 5bf739149924ee8c0dcfd17da29c24320bd4e185 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 28 Jul 2022 18:01:27 -0700 Subject: [PATCH 6057/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c6124920-1954-4ae7-8d0a-9d7d87881701 PiperOrigin-RevId: 463968951 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d8d92c79132..9e8996e052e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d8c8ac5ffbebef2231ad6145aa7a0d82b9cb0389f8c39378d94335a994befdd6", - git_commit = "fe6f5ecfa482bb68049810526e7331a433ba2e98", + sha256 = "2e583a605cf311cf5c920905e1ead035691deee803718e9f1ba922be25125b55", + git_commit = "3420fe2ae81984711a166b4887e26c3fa3767638", ) # Import all of TensorFlow Serving's external dependencies. From 79ac1fd809ce4b09189dd4bf64da42cac9696801 Mon Sep 17 00:00:00 2001 From: Guanxin Qiao Date: Thu, 28 Jul 2022 18:04:20 -0700 Subject: [PATCH 6058/8103] Internal change. PiperOrigin-RevId: 463969580 --- tensorflow_serving/servables/tensorflow/BUILD | 1 + .../tensorflow/saved_model_warmup_util.cc | 128 +++++++++++++++--- .../saved_model_warmup_util_test.cc | 39 ++++-- .../tensorflow/session_bundle_config.proto | 2 + 4 files changed, 135 insertions(+), 35 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index 3d54ece58bf..74481e40d8f 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -912,6 +912,7 @@ cc_library( ":session_bundle_config_cc_proto", ":util", "//tensorflow_serving/apis:prediction_log_cc_proto", + "//tensorflow_serving/util:threadpool_executor", "@com_google_protobuf//:cc_wkt_protos", "@org_tensorflow//tensorflow/cc/saved_model:constants", "@org_tensorflow//tensorflow/cc/saved_model:loader", diff --git a/tensorflow_serving/servables/tensorflow/saved_model_warmup_util.cc b/tensorflow_serving/servables/tensorflow/saved_model_warmup_util.cc index e8b792d8579..43d1f2adf66 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_warmup_util.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_warmup_util.cc @@ -21,6 +21,9 @@ limitations under the License. #include "tensorflow/core/lib/io/path.h" #include "tensorflow/core/lib/io/record_reader.h" #include "tensorflow/core/lib/monitoring/sampler.h" +#include "tensorflow/core/platform/mutex.h" +#include "tensorflow/core/platform/status.h" +#include "tensorflow_serving/util/threadpool_executor.h" namespace tensorflow { namespace serving { @@ -60,7 +63,6 @@ Status RunSavedModelWarmup( // Having warmup data is optional, return OK return Status::OK(); } - const int num_request_iterations = [&]() { if (model_warmup_options.has_num_request_iterations()) { return model_warmup_options.num_request_iterations().value(); @@ -75,31 +77,117 @@ Status RunSavedModelWarmup( TF_RETURN_IF_ERROR(tensorflow::Env::Default()->NewRandomAccessFile( warmup_path, &tf_record_file)); + int num_model_warmup_threads = + model_warmup_options.has_num_model_warmup_threads() + ? std::max(model_warmup_options.num_model_warmup_threads().value(), 1) + : 1; + + struct SharedState { + ::tensorflow::mutex mu; + int num_thread_task_done ABSL_GUARDED_BY(mu){0}; + int num_warmup_records ABSL_GUARDED_BY(mu){0}; + ::tensorflow::Status warm_up_status ABSL_GUARDED_BY(mu); + // Condition variable to wait until all scheduled warmup tasks are executed. + ::tensorflow::condition_variable done ABSL_GUARDED_BY(mu); + std::unique_ptr + tf_record_file_reader ABSL_GUARDED_BY(mu); + }; + const auto state = std::make_shared(); + + std::unique_ptr executor; std::unique_ptr tf_record_file_reader; - tf_record_file_reader.reset( - new tensorflow::io::SequentialRecordReader(tf_record_file.get())); + Status status; int num_warmup_records = 0; - tstring record; - Status status = tf_record_file_reader->ReadRecord(&record); - tensorflow::serving::PredictionLog prediction_log; - while (status.ok()) { - if (!prediction_log.ParseFromArray(record.data(), record.size())) { - return errors::InvalidArgument(strings::StrCat( - "Failed to parse warmup record: ", record, " from ", warmup_path)); + if (num_model_warmup_threads <= 1) { + tf_record_file_reader.reset( + new tensorflow::io::SequentialRecordReader(tf_record_file.get())); + tstring record; + status = tf_record_file_reader->ReadRecord(&record); + tensorflow::serving::PredictionLog prediction_log; + while (status.ok()) { + if (!prediction_log.ParseFromArray(record.data(), record.size())) { + return errors::InvalidArgument(strings::StrCat( + "Failed to parse warmup record: ", record, " from ", warmup_path)); + } + + for (int i = 0; i < num_request_iterations; ++i) { + TF_RETURN_IF_ERROR(warmup_request_executor(prediction_log)); + } + ++num_warmup_records; + if (num_warmup_records > WarmupConsts::kMaxNumRecords) { + return errors::InvalidArgument( + "Number of warmup records exceeds the maximum (", + WarmupConsts::kMaxNumRecords, ") at ", warmup_path); + } + status = tf_record_file_reader->ReadRecord(&record); } - - for (int i = 0; i < num_request_iterations; ++i) { - TF_RETURN_IF_ERROR(warmup_request_executor(prediction_log)); + } else { + executor.reset(new ThreadPoolExecutor(Env::Default(), "Warmup_ThreadPool", + num_model_warmup_threads)); + { + ::tensorflow::mutex_lock lock(state->mu); + state->tf_record_file_reader.reset( + new tensorflow::io::SequentialRecordReader(tf_record_file.get())); } - ++num_warmup_records; - if (num_warmup_records > WarmupConsts::kMaxNumRecords) { - return errors::InvalidArgument( - "Number of warmup records exceeeds the maximum (", - WarmupConsts::kMaxNumRecords, ") at ", warmup_path); + for (int i = 0; i < num_model_warmup_threads; ++i) { + executor->Schedule([state, num_request_iterations, + warmup_request_executor, warmup_path, + num_model_warmup_threads]() { + Status status = OkStatus(); + while (status.ok()) { + tstring record; + Status execution_status; + tensorflow::serving::PredictionLog prediction_log; + { + ::tensorflow::mutex_lock lock(state->mu); + if (state->num_warmup_records > WarmupConsts::kMaxNumRecords) { + state->warm_up_status = errors::InvalidArgument( + "Number of warmup records exceeds the maximum (", + WarmupConsts::kMaxNumRecords, ") at ", warmup_path); + break; + } + if (!state->warm_up_status.ok()) { + break; + } + execution_status = + state->tf_record_file_reader->ReadRecord(&record); + if (!execution_status.ok()) { + state->warm_up_status = execution_status; + break; + } + if (!prediction_log.ParseFromArray(record.data(), record.size())) { + state->warm_up_status = errors::InvalidArgument( + strings::StrCat("Failed to parse warmup record: ", record, + " from ", warmup_path)); + break; + } + } + for (int i = 0; i < num_request_iterations; ++i) { + execution_status = warmup_request_executor(prediction_log); + if (!execution_status.ok()) { + ::tensorflow::mutex_lock lock(state->mu); + state->warm_up_status = execution_status; + break; + } + } + ::tensorflow::mutex_lock lock(state->mu); + ++state->num_warmup_records; + status = state->warm_up_status; + } + ::tensorflow::mutex_lock lock(state->mu); + if (++state->num_thread_task_done == num_model_warmup_threads) { + state->done.notify_one(); + } + }); } - status = tf_record_file_reader->ReadRecord(&record); + // Wait until all scheduled work are done. + ::tensorflow::mutex_lock lock(state->mu); + while (state->num_thread_task_done < num_model_warmup_threads) { + state->done.wait(lock); + } + status = state->warm_up_status; + num_warmup_records = state->num_warmup_records; } - // OUT_OF_RANGE error means EOF was reached, re-write it to OK; in this way // the 'model_warm_up_latency' metric below records OK upon successful // warm-up. diff --git a/tensorflow_serving/servables/tensorflow/saved_model_warmup_util_test.cc b/tensorflow_serving/servables/tensorflow/saved_model_warmup_util_test.cc index ee4ffdabbdd..ca6962bdf2f 100644 --- a/tensorflow_serving/servables/tensorflow/saved_model_warmup_util_test.cc +++ b/tensorflow_serving/servables/tensorflow/saved_model_warmup_util_test.cc @@ -46,21 +46,29 @@ namespace serving { namespace internal { namespace { -class SavedModelBundleWarmupUtilTest : public ::testing::Test { +class SavedModelBundleWarmupUtilTest : public ::testing::TestWithParam { protected: SavedModelBundleWarmupUtilTest() : warmup_request_counter_(0) {} + bool ParallelWarmUp() { return GetParam(); } + ModelWarmupOptions CreateModelWarmupOptions() { + ModelWarmupOptions options; + if (ParallelWarmUp()) { + options.mutable_num_model_warmup_threads()->set_value(3); + } + return options; + } void FakeRunWarmupRequest() { warmup_request_counter_++; } int warmup_request_counter_; }; -TEST_F(SavedModelBundleWarmupUtilTest, NoWarmupDataFile) { +TEST_P(SavedModelBundleWarmupUtilTest, NoWarmupDataFile) { string base_path = io::JoinPath(testing::TmpDir(), "NoWarmupDataFile"); TF_ASSERT_OK(Env::Default()->RecursivelyCreateDir( io::JoinPath(base_path, kSavedModelAssetsExtraDirectory))); SavedModelBundle saved_model_bundle; AddSignatures(&saved_model_bundle.meta_graph_def); - TF_EXPECT_OK(RunSavedModelWarmup(ModelWarmupOptions(), base_path, + TF_EXPECT_OK(RunSavedModelWarmup(CreateModelWarmupOptions(), base_path, [this](PredictionLog prediction_log) { this->FakeRunWarmupRequest(); return Status::OK(); @@ -68,7 +76,7 @@ TEST_F(SavedModelBundleWarmupUtilTest, NoWarmupDataFile) { EXPECT_EQ(warmup_request_counter_, 0); } -TEST_F(SavedModelBundleWarmupUtilTest, WarmupDataFileEmpty) { +TEST_P(SavedModelBundleWarmupUtilTest, WarmupDataFileEmpty) { string base_path = io::JoinPath(testing::TmpDir(), "WarmupDataFileEmpty"); TF_ASSERT_OK(Env::Default()->RecursivelyCreateDir( io::JoinPath(base_path, kSavedModelAssetsExtraDirectory))); @@ -79,7 +87,7 @@ TEST_F(SavedModelBundleWarmupUtilTest, WarmupDataFileEmpty) { TF_ASSERT_OK(WriteWarmupData(fname, warmup_records, 0)); SavedModelBundle saved_model_bundle; AddSignatures(&saved_model_bundle.meta_graph_def); - TF_EXPECT_OK(RunSavedModelWarmup(ModelWarmupOptions(), base_path, + TF_EXPECT_OK(RunSavedModelWarmup(CreateModelWarmupOptions(), base_path, [this](PredictionLog prediction_log) { this->FakeRunWarmupRequest(); return Status::OK(); @@ -87,7 +95,7 @@ TEST_F(SavedModelBundleWarmupUtilTest, WarmupDataFileEmpty) { EXPECT_EQ(warmup_request_counter_, 0); } -TEST_F(SavedModelBundleWarmupUtilTest, UnsupportedFileFormat) { +TEST_P(SavedModelBundleWarmupUtilTest, UnsupportedFileFormat) { string base_path = io::JoinPath(testing::TmpDir(), "UnsupportedFileFormat"); TF_ASSERT_OK(Env::Default()->RecursivelyCreateDir( io::JoinPath(base_path, kSavedModelAssetsExtraDirectory))); @@ -104,7 +112,7 @@ TEST_F(SavedModelBundleWarmupUtilTest, UnsupportedFileFormat) { SavedModelBundle saved_model_bundle; AddSignatures(&saved_model_bundle.meta_graph_def); const Status status = RunSavedModelWarmup( - ModelWarmupOptions(), base_path, + CreateModelWarmupOptions(), base_path, [](PredictionLog prediction_log) { return Status::OK(); }); ASSERT_FALSE(status.ok()); EXPECT_EQ(::tensorflow::error::DATA_LOSS, status.code()) << status; @@ -113,7 +121,7 @@ TEST_F(SavedModelBundleWarmupUtilTest, UnsupportedFileFormat) { "Please verify your warmup data is in TFRecord format")); } -TEST_F(SavedModelBundleWarmupUtilTest, TooManyWarmupRecords) { +TEST_P(SavedModelBundleWarmupUtilTest, TooManyWarmupRecords) { string base_path = io::JoinPath(testing::TmpDir(), "TooManyWarmupRecords"); TF_ASSERT_OK(Env::Default()->RecursivelyCreateDir( io::JoinPath(base_path, kSavedModelAssetsExtraDirectory))); @@ -127,16 +135,16 @@ TEST_F(SavedModelBundleWarmupUtilTest, TooManyWarmupRecords) { SavedModelBundle saved_model_bundle; AddSignatures(&saved_model_bundle.meta_graph_def); const Status status = RunSavedModelWarmup( - ModelWarmupOptions(), base_path, + CreateModelWarmupOptions(), base_path, [](PredictionLog prediction_log) { return Status::OK(); }); ASSERT_FALSE(status.ok()); EXPECT_EQ(::tensorflow::error::INVALID_ARGUMENT, status.code()) << status; EXPECT_THAT( status.ToString(), - ::testing::HasSubstr("Number of warmup records exceeeds the maximum")); + ::testing::HasSubstr("Number of warmup records exceeds the maximum")); } -TEST_F(SavedModelBundleWarmupUtilTest, UnparsableRecord) { +TEST_P(SavedModelBundleWarmupUtilTest, UnparsableRecord) { string base_path = io::JoinPath(testing::TmpDir(), "UnparsableRecord"); TF_ASSERT_OK(Env::Default()->RecursivelyCreateDir( io::JoinPath(base_path, kSavedModelAssetsExtraDirectory))); @@ -147,7 +155,7 @@ TEST_F(SavedModelBundleWarmupUtilTest, UnparsableRecord) { TF_ASSERT_OK(WriteWarmupData(fname, warmup_records, 10)); SavedModelBundle saved_model_bundle; const Status status = RunSavedModelWarmup( - ModelWarmupOptions(), base_path, + CreateModelWarmupOptions(), base_path, [](PredictionLog prediction_log) { return Status::OK(); }); ASSERT_FALSE(status.ok()); EXPECT_EQ(::tensorflow::error::INVALID_ARGUMENT, status.code()) << status; @@ -155,7 +163,7 @@ TEST_F(SavedModelBundleWarmupUtilTest, UnparsableRecord) { ::testing::HasSubstr("Failed to parse warmup record")); } -TEST_F(SavedModelBundleWarmupUtilTest, RunFailure) { +TEST_P(SavedModelBundleWarmupUtilTest, RunFailure) { string base_path = io::JoinPath(testing::TmpDir(), "RunFailure"); TF_ASSERT_OK(Env::Default()->RecursivelyCreateDir( io::JoinPath(base_path, kSavedModelAssetsExtraDirectory))); @@ -169,14 +177,15 @@ TEST_F(SavedModelBundleWarmupUtilTest, RunFailure) { SavedModelBundle saved_model_bundle; AddSignatures(&saved_model_bundle.meta_graph_def); Status status = RunSavedModelWarmup( - ModelWarmupOptions(), base_path, [](PredictionLog prediction_log) { + CreateModelWarmupOptions(), base_path, [](PredictionLog prediction_log) { return errors::InvalidArgument("Run failed"); }); ASSERT_FALSE(status.ok()); EXPECT_EQ(::tensorflow::error::INVALID_ARGUMENT, status.code()) << status; EXPECT_THAT(status.ToString(), ::testing::HasSubstr("Run failed")); } - +INSTANTIATE_TEST_SUITE_P(ParallelWarmUp, SavedModelBundleWarmupUtilTest, + ::testing::Bool()); } // namespace } // namespace internal } // namespace serving diff --git a/tensorflow_serving/servables/tensorflow/session_bundle_config.proto b/tensorflow_serving/servables/tensorflow/session_bundle_config.proto index 6cba9ba3b8d..7b83321ed23 100644 --- a/tensorflow_serving/servables/tensorflow/session_bundle_config.proto +++ b/tensorflow_serving/servables/tensorflow/session_bundle_config.proto @@ -10,6 +10,8 @@ import "tensorflow/core/protobuf/named_tensor.proto"; message ModelWarmupOptions { // Number of times a request is iterated during warmup replay. By default 1. google.protobuf.Int32Value num_request_iterations = 1; + // The number of threads to parallel execute warm up queries. By default 1. + google.protobuf.Int32Value num_model_warmup_threads = 2; } // Configuration parameters for a SessionBundle, with optional batching. From 69bc1417b09be5a5ac565ae43e634dee339667b0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 29 Jul 2022 00:03:30 -0700 Subject: [PATCH 6059/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bba5e042-c8a3-4256-a921-ff116bc9e791 PiperOrigin-RevId: 464012803 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9e8996e052e..d2e18e6c579 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2e583a605cf311cf5c920905e1ead035691deee803718e9f1ba922be25125b55", - git_commit = "3420fe2ae81984711a166b4887e26c3fa3767638", + sha256 = "5556a34872c3830e885be1810739c7dd91ce673a797f535e0ed2d297eb8bbff2", + git_commit = "24ade6b65e9f18fb7d78e324d63267cae333341a", ) # Import all of TensorFlow Serving's external dependencies. From 9672c761324fe77d95b2b6b31bd3cbd0369af64b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 29 Jul 2022 06:01:28 -0700 Subject: [PATCH 6060/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/76a50235-f9b6-4582-965c-8f84976b8ee6 PiperOrigin-RevId: 464060920 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d2e18e6c579..14f416355e5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5556a34872c3830e885be1810739c7dd91ce673a797f535e0ed2d297eb8bbff2", - git_commit = "24ade6b65e9f18fb7d78e324d63267cae333341a", + sha256 = "7ec7185af39b834dfd9db8fafed4a4d50a22745434ab0a805d157562654b40f5", + git_commit = "75e0277b14fe0e1742b217591a7117b22723a6c3", ) # Import all of TensorFlow Serving's external dependencies. From 01abc52935cf62eddfc3bb819dc337c37d09ebc4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 29 Jul 2022 12:01:20 -0700 Subject: [PATCH 6061/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ce2cc10e-7590-4f55-afc7-349c5f9501cd PiperOrigin-RevId: 464128252 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 14f416355e5..ad62cd3fe23 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7ec7185af39b834dfd9db8fafed4a4d50a22745434ab0a805d157562654b40f5", - git_commit = "75e0277b14fe0e1742b217591a7117b22723a6c3", + sha256 = "9cd230c6dbe786c083c4ae7fb225e0403df903531fa658ca694ee98e1f48487b", + git_commit = "f6f27047a8cd3f7553af3d9f0a002c04dcc061ce", ) # Import all of TensorFlow Serving's external dependencies. From ad4562e00fe66137fce16a1ffb4d44b53c8cf5f0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 29 Jul 2022 18:01:19 -0700 Subject: [PATCH 6062/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7e804d5f-2734-4485-8e9f-e2b7180cee4e PiperOrigin-RevId: 464194003 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ad62cd3fe23..a59b35d8cbc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "9cd230c6dbe786c083c4ae7fb225e0403df903531fa658ca694ee98e1f48487b", - git_commit = "f6f27047a8cd3f7553af3d9f0a002c04dcc061ce", + sha256 = "394f176e6d214155343e6cc40f2beb33790398bfd8f3ab35b59b392507bd7352", + git_commit = "d8561b70a3b6f1fc10f58e9676fe9d0794fca160", ) # Import all of TensorFlow Serving's external dependencies. From 8c1162bf663d415852f0408277653d4295e05b42 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 30 Jul 2022 00:01:21 -0700 Subject: [PATCH 6063/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/99fc9b4c-c5c2-49d0-b968-a6b68404fee5 PiperOrigin-RevId: 464229604 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a59b35d8cbc..5fb7821f72b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "394f176e6d214155343e6cc40f2beb33790398bfd8f3ab35b59b392507bd7352", - git_commit = "d8561b70a3b6f1fc10f58e9676fe9d0794fca160", + sha256 = "658fa94cb34fdc77cf4369bdb34659eeec1a38a28e8b0e70d404f27f7b4d73a1", + git_commit = "481fabfbf5e71e3fc592adbe6a60160b9e1a93ce", ) # Import all of TensorFlow Serving's external dependencies. From db44af7c023c61f95a343e43fa127f6acab4a032 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 30 Jul 2022 06:01:22 -0700 Subject: [PATCH 6064/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/60e255d3-b206-4348-b7e1-bfac0259df6b PiperOrigin-RevId: 464261734 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5fb7821f72b..4771fc7c8f4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "658fa94cb34fdc77cf4369bdb34659eeec1a38a28e8b0e70d404f27f7b4d73a1", - git_commit = "481fabfbf5e71e3fc592adbe6a60160b9e1a93ce", + sha256 = "5e6aaa7a6009a54ac00da7cce756f23bc90eced0e409ad482c1c85efab1c07b4", + git_commit = "19903d7398905eac463b2f416c58a83b6233dff9", ) # Import all of TensorFlow Serving's external dependencies. From b53413e3156b408549cd4c8f4e8533b0b9845273 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 31 Jul 2022 06:01:24 -0700 Subject: [PATCH 6065/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5267b2c3-66d4-47b2-a424-c1f44c6d0e8d PiperOrigin-RevId: 464376266 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4771fc7c8f4..9397840840b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5e6aaa7a6009a54ac00da7cce756f23bc90eced0e409ad482c1c85efab1c07b4", - git_commit = "19903d7398905eac463b2f416c58a83b6233dff9", + sha256 = "6a3546692f866383ae1e7d953a1aed56d74866d8ffbeab7198ba5c7ab7fde696", + git_commit = "cf67a8102c0f9d390aa1b43dc5daa363e753393c", ) # Import all of TensorFlow Serving's external dependencies. From 98d35d2df5f0d29bf3ed34faf9e99720ed007f79 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 31 Jul 2022 18:01:25 -0700 Subject: [PATCH 6066/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/41bfe4f3-d831-4b51-84d8-2f77bac9d262 PiperOrigin-RevId: 464433343 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9397840840b..4935ca6ebaf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6a3546692f866383ae1e7d953a1aed56d74866d8ffbeab7198ba5c7ab7fde696", - git_commit = "cf67a8102c0f9d390aa1b43dc5daa363e753393c", + sha256 = "b48b915d160a5e4b0587f8f76ec163c51a5e390470262263c3f2ca59ee6a7b3b", + git_commit = "056cbfdcaa1f2f37daa85b169aee367f06ec59f2", ) # Import all of TensorFlow Serving's external dependencies. From 4804e875ea7e9d79e2370d536e4ad9e7632ca004 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Aug 2022 00:01:30 -0700 Subject: [PATCH 6067/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b832f1e0-3686-4998-986a-8e73c8ff41de PiperOrigin-RevId: 464468947 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4935ca6ebaf..8c1a715e771 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b48b915d160a5e4b0587f8f76ec163c51a5e390470262263c3f2ca59ee6a7b3b", - git_commit = "056cbfdcaa1f2f37daa85b169aee367f06ec59f2", + sha256 = "dcd11294f2fc32e009cf2223b1e86159002bb9c0c379414cce50dd7169d28ef1", + git_commit = "d74d591e8f9e42be640dd93cfa0584914e25e98e", ) # Import all of TensorFlow Serving's external dependencies. From 4821523e92c12dd074355dfcb8a36a55241a7bb1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Aug 2022 06:01:24 -0700 Subject: [PATCH 6068/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3f939ec1-5a51-4c27-8057-0c04428dc061 PiperOrigin-RevId: 464517073 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8c1a715e771..f69d599829b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "dcd11294f2fc32e009cf2223b1e86159002bb9c0c379414cce50dd7169d28ef1", - git_commit = "d74d591e8f9e42be640dd93cfa0584914e25e98e", + sha256 = "50ea5eb0009f8459f64a31edb36c6f057deb96f08b9bcf6f27528efc21aec951", + git_commit = "c09dc18b15a56f3e72a08c9f3a53e7ef347d159d", ) # Import all of TensorFlow Serving's external dependencies. From b036dfe094dddd8bc0c7ea528404e00fc1b200dc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Aug 2022 12:01:23 -0700 Subject: [PATCH 6069/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/17e4cca4-777f-46a5-9fe0-1e8ba5c7af49 PiperOrigin-RevId: 464589496 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f69d599829b..ba72b18719b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "50ea5eb0009f8459f64a31edb36c6f057deb96f08b9bcf6f27528efc21aec951", - git_commit = "c09dc18b15a56f3e72a08c9f3a53e7ef347d159d", + sha256 = "d75f6cb6823a24e9a194d9b8a3ed6e06bc2f0ad59a81ea318af175f782c124c4", + git_commit = "01ef8fc6e36310ae1dbd077d3f28d57cd061abc8", ) # Import all of TensorFlow Serving's external dependencies. From b955d7f8e2d23bc3bae8699772bcf4991cee2154 Mon Sep 17 00:00:00 2001 From: Robert Neale Date: Mon, 1 Aug 2022 15:34:26 -0700 Subject: [PATCH 6070/8103] Update TF Text to v2.7.3. PiperOrigin-RevId: 464639642 --- .../tf_text_regression/01/keras_metadata.pb | 2 +- .../tf_text_regression/01/saved_model.pb | Bin 5370119 -> 4899007 bytes .../variables/variables.data-00000-of-00001 | Bin 342 -> 342 bytes .../01/variables/variables.index | Bin 145 -> 145 bytes tensorflow_serving/workspace.bzl | 6 +- third_party/tf_text/tftext.patch | 68 +++++++++++++++++- 6 files changed, 70 insertions(+), 6 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/keras_metadata.pb b/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/keras_metadata.pb index c066bb37990..3229f49919f 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/keras_metadata.pb +++ b/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/keras_metadata.pb @@ -1,2 +1,2 @@ -ìroot"_tf_keras_model*Ì{"name": "tf_text_ops", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "must_restore_from_config": false, "class_name": "TfTextOps", "config": {"layer was saved without config": true}, "is_graph_network": false, "full_save_spec": {"class_name": "__tuple__", "items": [[{"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [1]}, "float32", "input_1"]}], {}]}, "save_spec": {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [1]}, "float32", "input_1"]}, "keras_version": "2.6.0", "backend": "tensorflow", "model_config": {"class_name": "TfTextOps"}}2 \ No newline at end of file +ìroot"_tf_keras_model*Ì{"name": "tf_text_ops", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "must_restore_from_config": false, "class_name": "TfTextOps", "config": {"layer was saved without config": true}, "is_graph_network": false, "full_save_spec": {"class_name": "__tuple__", "items": [[{"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [1]}, "float32", "input_1"]}], {}]}, "save_spec": {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [1]}, "float32", "input_1"]}, "keras_version": "2.7.0", "backend": "tensorflow", "model_config": {"class_name": "TfTextOps"}}2 \ No newline at end of file diff --git a/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/saved_model.pb b/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/saved_model.pb index a401a795f5511372a9b894aa0481ce0c3bd3e654..f140107dbb58b413f5a636fe01cee317b474d6a6 100644 GIT binary patch literal 4899007 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

!!%DyY>(}doPZFk4m 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 z2Z#g20pb90fH*)LAPx`*hy%m{;s9}gI6xdA4iE>31H=L10C9jgKpY?r5C@0@!~x;} zaez2L93T!52Z#g20pb90fH*)LAPx`*hy%m{;s9}gI6xdA4iE>31H=L10C9jgKpY?r z5C@0@!~x;}aez2L93T!52Z#g20pb90fH*)LAPx`*hy%m{;s9}gI6xdA4iE>31H=L1 z0C9jgKpY?r5C@0@!~x;}aez2L93T!52abFW#A7Wj^pDzrI6xdA4iE>31H=L10C9jg zKpY?r5C@0@!~x;}aez2L93T!52Z#g20pb90fH*)LAPx`*hy%m{;s9}gI6xdA4iE>3 z1H=L10C9jgKpY?r5C@0@!~x;}aez2L93T!52Z#g20pb90fH*)LAPx`*hy%m{;s9}g zI6xdA4iE>31H=L10C9jgKpY?r5C@0@!~x;}aez2L93T!52Z#g20pb90fH*)LAPx`* zhy%m{;s9}gI6xdA4iE>31H=L10C9jgKpY?r5C@0@!~x;}aez2L93T!52Z#g20pb90 zfH*)LAPx`*hy%m{;s9}gI6xdA4iE>31H=L10C9jgKpY?r5C@0@!~x;}aez2L93T!5 z2Z#g20pb90fH*)LAPx`*hy%m{;s9}gI6xdA4iE>31H=L10C9jgKpY?r5C@0@!~x;} zaez2L93T!52Z#g20pb90fH*)LAPx`*hy%m{;s9}gI6xdA4iE>31H=L10C9jgKpY?r z5C@0@!~x;}aez2L93T!52Z#g20pb90fH*)LAPx`*hy%m{;s9}gI6xdA4iE>31H=L1 z0C9jgKpY?r5C@0@!~x;}aez2L93T!52Z#g20pb90fH*)LAPx`*hy%m{;s9}gI6xdA z4iE>31H=L10C9jgKpY?r5C@0@!~x;}aez2L93T!52Z#g20pb90fH*)LAPx`*hy%m{ z;s9}gI6xdA4iE>31H=L10C9jgKpY?r5C@0@!~x;}aez2L93T!52Z#g20pb90fH*)L zAPx`*hy%m{;s9}gI6xdA4iE>31H=L10C9jgKpY?r5C@0@!~x;}aez2L93T!52Z#g2 z0pb90fH*)LAPx`*hy%m{;s9}gI6xdA4iE>31H=L10C9jgKpY?r5C@0@!~x;}aez2L z93T!52Z#g20pb90fH*)LAPx`*hy%m{;s9}gI6xdA4iE>31H=L10C9jgKpY?r5C@0@ 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

;0 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: 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 z{D1iW@c-fe!~ci>5C0$jKm33A|M36e|HJ=>{}2Bk{y+SG`2X<#;s3+`hyM@%AO1i5 zfB66K|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci>5C0$jKm33A|M36e|HJ=>{}2Bk{y+SG z`2X<#;s3+`hyM@%AO1i5fB66K|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci>5C0$jKm33A z|M36e|HJ=>{}2Bk{y+SG`2X<#;s3+`hyM@%AO1i5fB66K|Kb0`|A+q%{~!K8{D1iW z@c-fe!~ci>5C0$jKm33A|M36e|HJ=>{}2Bk{y+SG`2X<#;s3+`hyM@%AO1i5fB66K z|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci>5C0$jKm33A|M36e|HJ=>{}2Bk{y+SG`2X<# z;s3+`hyM@%AO1i5fB66K|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci>5C0$jKm33A|M36e z|HJ=>{}2Bk{y+SG`2X<#;s3+`hyM@%AO1i5fB66K|Kb0`|A+q%{~!K8{D1iW@c-fe z!~ci>5C0$jKm33A|M36e|HJ=>{}2Bk{y+SG`2X<#;s3+`hyM@%AO1i5fB66K|Kb0` z|A+q%{~!K8{D1iW@c-fe!~ci>5C0$jKm33A|M36e|HJ=>{}2Bk{y+SG`2X<#;s3+` zhyM@%AO1i5fB66K|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci>5C0$jKm33A|M36e|HJ=> z{}2Bk{y+SG`2X<#;s3+`hyM@%AO1i5fB66K|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci> z5C0$jKm33A|M36e|HJ=>{}2Bk{y+SG`2X<#;s3+`hyM@%AO1i5fB66K|Kb0`|A+q% z{~!K8{D1iW@c-fe!~ci>5C0$jKm33A|M36e|HJ=>{}2Bk{y+SG`2X<#;s3+`hyM@% zAO1i5fB66K|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci>5C0$jKm33A|M36e|HJ=>{}2Bk z{y+SG`2X<#;s3+`hyM@%AO1i5fB66K|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci>5C0$j zKm33A|M36e|HJ=>{}2Bk{y+SG`2X<#;s3+`hyM@%AO1i5fB66K|Kb0`|A+q%{~!K8 z{D1iW@c-fe!~ci>5C0$jKm33A|M36e|HJ=>{}2Bk{y+SG`2X<#;s3+`hyM@%AO1i5 zfB66K|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci>5C0$jKm33A|M36e|HJ=>{}2Bk{y+SG z`2X<#;s3+`hyM@%AO1i5fB66K|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci>5C0$jKm33A z|M36e|HJ=>{}2Bk{y+SG`2X<#;s3+`hyM@%AO1i5fB66K|Kb0`|A+q%{~!K8{D1iW z@c-fe!~ci>5C0$jKm33A|M36e|HJ=>{}2Bk{y+SG`2X<#;s3+`hyM@%AO1i5fB66K z|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci>5C0$jKm33A|M36e|HJ=>{}2Bk{y+SG`2X<# z;s3+`hyM@%AO1i5fB66K|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci>5C0$jKm33A|M36e z|HJ=>{}2Bk{y+SG`2X<#;s3+`hyM@%AO1i5fB66K|Kb0`|A+q%{~!K8{D1iW@c-fe z!~ci>5C0$jKm33A|M36e|HJ=>{}2Bk{y+SG`2X<#;s3+`hyM@%AO1i5fB66K|Kb0` z|A+q%{~!K8{D1iW@c-fe!~ci>5C0$jKm33A|M36e|HJ=>{}2Bk{y+SG`2X<#;s3+` zhyM@%AO1i5fB66K|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci>5C0$jKm33A|M36e|HJ=> z{}2Bk{y+SG`2X<#;s3+`hyM@%AO1i5fB66K|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci> z5C0$jKm33A|M36e|HJ=>{}2Bk{y+SG`2X<#;s3+`hyM@%AO1i5fB66K|Kb0`|A+q% z{~!K8{D1iW@c-fe!~ci>5C0$jKm33A|M36e|HJ=>{}2Bk{y+SG`2X<#;s3+`hyM@% zAO1i5fB66K|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci>5C0$jKm33A|M36e|HJ=>{}2Bk z{y+SG`2X<#;s3+`hyM@%AO1i5fB66K|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci>5C0$j zKm33A|M36e|HJ=>{}2Bk{y+SG`2X<#;s3+`hyM@%AO1i5fB66K|Kb0`|A+q%{~!K8 z{D1iW@c-fe!~ci>5C0$jKm33A|M36e|HJ=>{}2Bk{y+SG`2X<#;s3+`hyM@%AO1i5 zfB66K|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci>5C0$jKm33A|M36e|HJ=>{}2Bk{y+SG z`2X<#;s3+`hyM@%AO1i5fB66K|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci>5C0$jKm33A z|M36e|HJ=>{}2Bk{y+SG`2X<#;s3+`hyM@%AO1i5fB66K|Kb0`|A+q%{~!K8{D1iW z@c-fe!~ci>5C0$jKm33A|M36e|HJ=>{}2Bk{y+SG`2X<#;s3+`hyM@%AO1i5fB66K z|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci>5C0$jKm33B|MLIk|I7cE|1bYv{=fWx`Tz3& z<^Rk7m;W#SU;e-RfBFCN|K0i^orl0>W|6l&UYx>vpujyaY&;OVIFaKZuzx;ps|MLIk|I7cE|1bYv{=fWx`Tz3& z<^Rk7m;W#SU;e-RfBFCN|KtENu zu76!W|6l&U>-yLAuj^me&;OVIFaKZuzx;ps|MLIk|I7cE|1bYv{=fWx`Tz3&<^Rk7 zm;W#SU;e-RfBFCN|KdL4K+OQu3_#5Q)C@q)0MraX z%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q z)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4 zK+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q) z0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K+OQu z3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX z%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q z)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4 zK+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q) z0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K+OQu z3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX z%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q z)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4 zK+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q) z0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K+OQu z3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX z%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q z)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4 zK+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q) z0MraX%>dL4K+OQu3_#5Q)C@q)0MraXXZmOQXZmOQ%>dL4Kxg`A`e*uQ`e*uQ`e*uQ z`e*uQ`e*uQ`e*uQ`e*uQ`e*uQ`pp2;3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q) z0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K+OQu z3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX z%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4KdL4K+OQu3_#5Q)C@q) z0MraX%>dL4K+OQu3_#5Q)C@q)0MraXm-?6bm-?6bm-?6bm-?6bm-?6b%>dL4K$rTL z`j`5b`pp2;3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K$rTL`j`5b z`j`5b`j`5b`j`5b`j`5b`j`5b`j`5b`j`5b`j`5b`j`5b`j`5b`j`5b`j`5b`j`5b z`j`5b`pp2;3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q z)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4 zK+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q)0MraX%>dL4K+OQu3_#5Q)C@q) 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 z2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRP zfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK( z0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g z8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^ zpaBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey z2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRP zfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK( z0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g z8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^ zpaBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey z2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRP zfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK( z0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g z8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^ zpaBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey z2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRP zfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK( z0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paJNI(H|OspaBRPfS>^g8i1ey2pWK(0SFp^ zpaBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey z2pWKX1pT1_2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK( z0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g z8i1ey2pWK(0SFp^paBRPfS>^g8i1eyXczr=(SH~HchMgjfS>^g8i1eyXczr=(SH~H zchP?r{dduS7yWn9e;56C(SH~HchP?r{dduS7yWn9e;56C(SH~HchP?r{dduS7yWn9 ze;56C(SH~HchP?r{dduS7yWn9e;56C(SH~HchP?r{dduS7yWn9e;56C(SH~HchP?r z{dduS7yWn9e-Hil(0>p8_t1Y2{rAv+5B>Mhe-Hil(0>p8_t1Y2{rAv+5B>Mhe-Hil z(0>p8_t1Y2{rAv+5B>Mhe-Hil(0>p8_t1Y2{rAv+5B>Mh9~yw50SFp^paBRPfS>^g z8i1ey2pWK(0ca2X_s}02fS>^g8i1eyXb=7O(0>p8_t1Y2{rAv+5B>Mhe-Hil(0>p8 z_t1Y2{rAv+5B>Mh9~yw50SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey z2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRP zfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK( z0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g z8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^ zpaBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey z2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRP zfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK( z0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g z8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^ zpaBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey z2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRP zfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey=*Q6?8i1ey2pWK(0SFp^paBRPfS>^g z8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^ zpaBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey z2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRP zfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK(0SFp^paBRPfS>^g8i1ey2pWK( z0SFp^paBRPfc`A{Ljw>r06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO- zK?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp z06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm z0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~ zGyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO- zK?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp z06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm z0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~ zGyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO- zK?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp z06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm z0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~ zGyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO- zK?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp z06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm z0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~ zGyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO- zK?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp z06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm z0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~ zGyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO- zK?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp06_x~Gyp*Z5HtWm0}wO-K?4vp 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ଷO?v@36eDYBtKn-+ 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%0A4_A49 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 z|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJ zr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c z|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUc zPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>? z|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm? zpZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v) z{y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6( zKmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp z{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7n zfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH z`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D z|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ z^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ z|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I* z>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq z|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq z)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ z|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJ zr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c z|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUc zPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>? z|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm? zpZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v) z{y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6( zKmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp z{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7n zfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH z`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D z|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ z^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ z|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I* z>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq z|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq z)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ z|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJ zr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c 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®=hr* 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 zPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>? z|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm? zpZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v) z{y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6( zKmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp z{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7n zfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH z`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D z|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ z^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ z|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I* z>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq z|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq z)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ z|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJ zr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c z|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUc zPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>? z|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm? zpZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v) z{y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6( zKmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp z{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7n zfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH z`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D z|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ z^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ z|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I* z>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq z|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq z)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ z|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJ zr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c z|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUc zPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>? z|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm? 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

220%{@ zv!Li7g<7&OX=1zfd^^}Eek9_`Qj)`tc(GdnSQb%Kd;?j4l!%q33{( zhbveYFP7Y^i9Q&`-v>As-mKj^vv(FP!TxyhBB#s4fR7}2W1pbTu8-FYb0X@9J%}=kCB?(E{L8q%=5z;l5ZX^}h~W%$Ndhw12PwHWAy{uFuYW*zVZAp_-hycFC*Po( z0f@^Kt-(TK0HbBVQrSt_XXx4H7ap3E3|GeS>VbCiK$QFs{ZkY_9k6}|>PBxc9*$05 z8gzI1o9PWE&lqL@O6km1gd*M6tEuL$bWVm!*N&!wNRp1NFfi&Nlw$oc&p%0C-kR zXKUGm-*zeUF&07AY1V!_Xb6YzXMJrd*nXlBUek_+HoCzW!$z9EeDdB(L~vsEUUD!2 zbhFul~q*n5UisdgS#|juM#W34}t6anVqmM;#SQ71xC%rAKZ*S=h&QC5> z8DWW%8SbN?mjwVmm=;QBxYrMUIEC~d_QlVs5BrL4s@{G>m+CuQ7I|cBi>v{EXYmH2 z>S=CXsJ%epVRhPCz0!eJOjGSyWO<1*$&jfUeAPMy4y80MaI8-rR7K{~-9C)O%LmtA+Oij`m&YcxlC7`b zmET6p%kit)tCI`aw%m$_=ppolD1J&9IHibHnC9EG-2mEri{4$(nE}6Njawc_Qx-R| zmV(klA?l+}#ZAHG;0&kker_&46NZ4LTUWH2Au+2-^jd?4N<_)pY+DM!OdKF<8*HgP z#K=*FyA)`j*1`jG0s1TAxz%R7ksE3JuaSMYCmbE7X#V02_|^3GT=M_O+NcKKN+L^k zuM2TJcX~Y8z@1?8$@gbQo5}YUY@oMCu|X_5k})=lh_J^AtMLSvx~RF+1MwBBb2vNF zl$*i6i*~HtZ>^0x*3!Rt_<^X=Xe9qb{~RivfB}SD(9?p*4T_E8tFhn-k1vlQxlf50 z0+#^2EQ(J6Fron=nA(Z(NK$Vg!s(Qcwqi&+RllCo#1I zsv5vK<$LRlfIlXO;W%USpG`sjLHro#x|lu6Cusf~tUe(~i1fzVOF(gd1CT?XHT*!M;8_X3t4j_`=+;rae%cl-7c0^dbCF&9!QML z3?10cl9kt@=ezH{;&eNR?tRVLccgpI6Sp?{gZBP--*PLSpI^8tp4-4RTkU;u zYZ(jGhs6)-Y!C10jXHZ{+>+24-_yr@)Y<8c&f}pXkBm$bdErouI-_29t1}#IU&7yw zhkGOZq(pzPyEhrPn{i{|Onk7nJ??eR;trP03+>bEYliZ8(qEa04okP>%Fz|mwAJ-MwHD)XSwXmY!Gk7rj=A?Z^ z_7%ZRrxmbJtU=Bd8#_*vdgQXB)FU%RsTh9_l={mNsFfh2P^^4<#Cn*b6#2U-hL{5s zWDoW_lCl@1WIWr1;TzPvKml9qvCkE=5LQi)Hl#EfJN+xd&KsoBXJ>D_-MV#eyGmCY z;t-@*bGVFOg!!g8ce#1j;^ApuM+1EdMm#CJq<0At*dga*hyyh|;X6;=P15khI!NYi zIRy06upX>++}3~_cM_#XGB8H~_8etMb`T+|*Ag--W_^#VQXxJv0Z+`Fl$WFCltLsr z+DU&K85Vfe+Ch?fiB_W~`i&@tG;0yyNpH^LIBnI*<^YyIggJpH7?sh&HS`Dv)~-l; zZ`uv?i71AIZ*|Z!-@hjKTQdBu6#lP8AQxVSpSMUsloa_aGX>WGJR$Fw-L{bJr3%a3 zHHoPTl1d``+<0-fJJ>qi-x)9B_(Gi$Qy0^T(4R#yL~`VyZ^!&3pccMVhBCneN}}X8 zO;E;`pf_XdT5G0VYnXFZ;gqn^-|j79;XUc^;@3Lr)oS`X`dcRoli?>??gsz!GlU}t zBog7tKAT)t()P==V9TlnF;zl*L_#3RiQ99@|D$W+=j8Oupmd>18O>}7I91|mGzVxk zNzGuwqoiVOpf5#+kdz!bC)cGpNUPa`2ZFgtAMa_K(?LDkJcgXG`FflMv)Evm@}z$!~g`84`H! zDIxHdr!VjbMj3DU3p{!^O99s^6nN%Pm)a1DAIWeCZQ;=_$5Hca`L zbk?5#IcCVr__0CQ^Al9W%A1|IFz&*0 zXK-e#62lHs`j_6O)~2)RF;59Z0h}QT^kG^^Dc;e9)q|ujir}gDxWVUO){&b2 z;G-r>-8BC&gwiuCv(Iof_^8~liSLZ>pADN>y{diiz_;jsQS#ydq>VpodU@KiIP!gp zfyr++K^5*4>h=NpU8qqn8IjzU8^pMGHm!^YMLs#vt&S#m;P?PHhOq~FAl5BCloD*j z{_sW`KTbxSUc+Hg@j#5~Oc=QvAF5+mWt@h!?+EW9>_UDJ8G5aGm5 zP=D6s!8BmpUb{MdUp}Uy^;;3T7bc}B_(J9cqUY(y*u612L6B1WjKGr5;PEIBX~XtQ zu*~*Kl#W!OIS+dq4QB!%DvpXcOrG^$Zkt~2{M!EXa-#-%Zxd8q!QmEkj|(?41p5?8 zL%e$qVF~qN=I|!^Ntmf9g=8Qkp>&iP{2+5HiqG_<&Jn4A#8QI{YAIi=zEdy|59izyCXc0Nc zb%f!-VL%f;Ap2M`>Tm!8I2LGG918^TUkI(F4jlaNkEQ7&(@lTc1@p&)VBU?!i!qMJ z8v!xCB4QlUfsUuwq@$G_20I+LqT5TiADso=PJo!UZl_>OS+^g(oOC= zW`J$2W6oaavwOHfXRq7`N{KO~3saNY&7035pt68Z^}(7Y`(rn4=n?Qg%K847-`uE# zwl;8dWeW#rV;r!Z)^M^r<>6#Et)Gtd^|#uAVM}C6SvtS2bFQ0=IXimf*pg{H*@irx z?8fyQ3@u=Q-Le5?M~)p%UfYDk-gSh?#&-!L%6!*iG(pWP^N=!}6^Hah$%ghZ$z(yN z;Dm?8v%q}p%w>J}^mQZmhz2&?PWNd-driyj4o0r9?ZRO z`3V3xEf1-2&ca$JSQs&cW&*e?`hpy%NaP9sc-S$1(M1Z? zkvYE~AofW6ALu`FY56iosGc zoi4%;BlbuM%wUp2rp8#@j0t&ECoP*;CarbutbdXr(7B+?rJCX-bAup>DZLNlRC;of z`Y>QKe%Z0~1RsgxuCPJaEtiLz{w|+f9s!oiLldRre9PA4(k_0?1sBNYi##Lbl*^;r zGWiGCHe4=`?jA0e_bR7c-m;iZNOO7c(wUQvr8e2$J2DbP571gz#z*LcZ${6`8s^QfN+aA_4K^B999|;GajMZ;0JX@x+-Hoy z(&50?|0|-{-C&|naCK*M)+LoEO*zV*m`>k0C18S~#BZt9BGO+9j~8aGwmjku{tjyk%j5=}CnO7H|7YEGrK zm|~#*nb}SKyqDXfj0tpcBqc!Eq05>y4TQ@{JUk~l#%+mCJe>YfqLN3U^4+PprUwO7DK z9nDr7!{=tQdH6u|9t2~o#43dhZ>|efC$#-b6h9LXe=-G%ZyF7EvIui$nMA#ATOZyt zUQB05xA&!AP}jCYvILuqb!KXvzM#O8|vrrtH zq9~>snzvOXl=1xX0KxX(YsOEnxvHrkxtoIzTu@^`3q4cAYn%=q#&}3}WA* z=ht~WHADNt`ZpI9*)+B<)M=1{iCoct-I4-365`XfWi7%6`eGE{T_-Wn19%9#htYAA z4_Lb&9!EKsyiva@&Kt$Urlxb2aB}Yh`{F^p*HORZtCjmHy)okjy|`ZdX8bBjzv%!F zM*iiya9`DmLz|pATZ!7ydv#tNr;1DcWUNRlC>I`;!Z| zpF211P3Vl|&M^J4gZ0)3|KnkPDoYRsy(fyFrQJX-MFWNLG>$x-&Se21NfGlhd40`b zgx(v)&#n+o4>hTW6i;rh7}9V`@Pl*lot5BJ(REJ?wTTjq+6uLQGxTQp862WY3zi&;STPDXx(hqUVAv%s+AE7as$xvBQbE1w`|SQ6hF!WN z8?fO}vbB_=%wy_2f}oi~w#dViT=^T&0-OzFesrx|VkZpN>`CKQtm$=jNcR4qL{ zBQelSXm&96u>@tx3lnCmrHS4Rdsu=|N(S5gDc(YR$U@ zN=Zt320;oV2>(8cA;W70Td1>yzOYfq}>vougYy zuO*sQ0ahz8o{Z@kEG+eJKtCV!sH||iqvXlBgc(OJ^Nw|O-3{cq`Brax(sj_ay3Hf> zYp^M#xuYjt|D=5n($bLoe2O|oVn&NY%LdS>6H)DO3_ZEs1z`Wb_0#agebJe_SKE>y7?a@@l(XRhHBNGyqCj#B4i& zp6-4$h&4815$@wb&a zQa%tKWWC@@@Yi9@0RpgmeL!HB;=R?| zW!w$4h$Dm>HXU`7{NVfI_(B&?IoX%C$yp*vf+rp=Ttl;r2iC4Q5Vf1_26|N#JE{yF z99-a;i&+IoS~4W96q0|8Vn@{{L(<;A-b;~!9K{n^h6xr!N+4qjxu`F(t7Ry%dl8Ib zN)9cP8=sJZqhm(4yz%00cd&K3zcXIk>hDlmFz}BY^4Cqq`Q>JOof~iG;AqDjrWy)~ zUEP)(yb0d8L}FpGN95jEzJGk*)oY~Jm6Hs8!aa`m0s&zop`4w)?MZ)kyEk5>@3NX` zr1NE5xL>FV+c=V)UCcDsk3RFWYW z?4G15-ws=i3YGZXeMg`8?Km`#yn?5IFqb;@4|w)fhtTlcmDnM26WQBjc3?vmORW=AEE zn387=SWGxz&@PZPU~S&BCO;`);lvb9b@@5{GVQ2c{XtBL5Mqj8jFC19Ay4Qv2wlM; zmn{@i=E#cLCj3#~m`*m!N}b;C7nQ-nE-ApEJ{z0jZ}ZurWMVsHMoM0`641LB`(w(# zCb=#JqVj=|27149CYabg84$vV{-=~TVmT4}iF@Tv%Pyx#0KVMKUPl$KjV(nx6s{d0Z zvv;b_cT^6FPvYoaD#Aw%88}8QwX2EIf*|V^=ymr(mT$mb>=w8lmyc$>+NDx={2-{* zI^2HZLe8M7OG_9s$t4g!H_)#-$NOa>W0Pe_oc*Yq(j;}jR6#PE%BCgC3n2=0I3e_9 z=j5k~Mj;N~=eLAeoCY*F=$mtrRY-dM;sy3A-mZ0Jy zDPgu5vi%II3A}kuwAfJD0aFDMaA}>F<^lq({U8`BE%F&n8^=G(>53 zpfIA89*G-1Le0{=P_ty$4j(NkN{>_}N=qqDf}B8tIlH#Btj{q?t;(%LzS%(eHx9#?Y zWIuwY1H9PPSfzmBgl3R?{+p(2N{~Y!+_WLWtF@hrhY=vhYCZ}QyC_$~k1jy4%GL>g z;bkL_M~Qt)%4coHwUjNWD)LC+31+L7cls$r;cV59l(d76Dt3^gU}c_PDYJ*5g^_kS zXPqLM8_i+X6D(H2n`HSEYq&^Lo>Z3Gjs@km@;xyGo?zTo-ZP{Sh2yplmgKf$v%qZx zErGa=A~_Vd(e(fIh^5Pwue!ANXPYsk_g}EjbNTL4{>D*$&!yHm z#@BJo=L*Ji=Me=-_Lx+gpVC@-#<2n1-eSvLJkrU3^JlGXLHf} z2&Gl%dWBjA!jHK@Qf2w`L{R>0ptqDvs1kTQ__J_cO4(j;3R*Zu{boraD#2hN zMy2-=ic#r$VHh=^!^3rLkdZ}#IflyvFe9|i?45Ou+$aK)W4x3hc7mTFwFLD}KfGjapHA&N_3 zf&vswwnX7T3MX8CqvcxTEo-!;!-1rWAw!cX;mjYWFH9xxr=_%2L` zUw!BW3k8gg?DLikj)^!1mXeqVrs%8(-?2!NG@c;Gk~8(H7*4r_@r;Q$2lZ~)+Zpfe zgvm_)tuyYk-P>1WUtI%A+08NJA;$=uaCEi?zW|W&`0B`Yj7b&*!&%EL&)s3uIBaAt z_(B} zAg7Efl8?LBATTHrgfa*cnomueCzL#FaL)H-KifTUm>f{oV|L9lr#wdnsA^|8#9|bi!BlP1@3~$%7 z!xYT!YzBoYoay6Rs5N6Rs461(nvRJA5czLsX3A(0ZU1#TKeyYZjWMu0C%N z9-sp;g1Lh~8O88|J%Ko+i=|KniJ77f6q1YJS7lwN@lIS#<3 zbk*Qo`ma$8j{^%*m_?D{HJQSv6`jW~Ai!z@idYMt!NLe*w{}S5W*|!rf}o4DNC0UMXyN9 zKD>oVSc=4?Y19eWxc^d@NT#qG0o*x)s4EKndedR*dJYC5c<3dRl`G)%>$RG!FogCt zcwjSkLZ!7SA6B#&bqK$L=0#3qauJ_f1S%BCrlWHl!pF7cPR$nKvH2_GD>laIOnUpH zACc2zIKs|poRq3ZgDw_BrTXSdmxe%fbM8-jZ;xjcdWqgFLy!Q3UBGk0(a!qto?Ci@ z^OFmUVeo=G$@hG`OABBa#5?fgN&QKGI4FkP%qLO++!S}sqOL;R_2sZ&uq+dnNLw={ zGc!=2*_4fBwm*c!^-yqnD+xzb5{__I)^D{yMQtiR6sxKarqm64(t#x2a(~3&TQ^64Iz0mYU)Xvg!fY(^@<1dc}Tsqy6zQzh^omMf= zbQ|a$P`YDv&#fM*{khd6KF_T#*YVsc#s#|`Zh9D~*Xg;{<+`6+U3PzN^$0t=!*i?n zVC-Ym{{ZzeHIsMhj{umCS1;h`a?)l?=2$_D((J)iK|bm8zP66lW-<;QZp&r`Dsp9( zXL>b!3qcy5AN99-Tb*$-`8@+Hm>uBJsA_;HoJH``Imh7*DnyEH@FFn93g&%jE0(dC zV{4Ln7}a!eo5`eKO*A5ctS7LmJ~m?z$arw8{%uwlr;PA#_T*%k*IB){5A!}N9@p(w z4~4HeJH8-nA=aTJs09Qv;x*2kjxy!S{LwMt4AY@3UvB2o+%i}!H(R@t8}`b zLKIBNHUq*GPR;&i%dsjpe{+hWb$bH^FUKaZlv6_V!Z`iIOQGxp5PZepit-b%aFQhG z$t+btSHQ#FdVDcF3Hk!|hAXazhPdQ9_|x*YKw_im{_H8HI(aB#t>0CO-vzr1i~B z$LC@>fyuCt*paj1BS@7OTRhAJx?|H62e0H)tv}iXrAc&pAvp_a6mxq@lmpLMh9kn4 zUS-s>^?0zdh+dr^S>xxB+yl>;mZ?wG`H?j%SX^0^%xpE>--5IQ7S7`Suda`*830qv zZnvkD`I<`mfZH=`d>IXmF(P+-X3e^&7__<*9MVg;&%SJdN$&P;Ybd6`AcyTL$76MT z1(enl$8ha%>zmZTJIjNcsZEx zqM(HnUjHqW@KW0>0vQ}(gcrdZBXbl+#?b5Fsq(-J7YZ+P&_;cf;^Y1SBe|RwXJ69i zeSAYcrlMy1b0|OJ`eY54bp-q%bDB?{r} z32Lv6aS(D2h-%jpeV9Nia^ab@DA4!)n9Os31s2bBg4EYZ5mP*TFPjcpG6BdBOG*}UJ|)K&UOj)c`xRwq?b7_mz$cdXBsRwHVc zEPNP|9N=XZ9Xn82fh4>T8wlB4#3ASWl%5!Zy%PI5*Wv3qmZR-bnIlw2)Qb zjSVPdODb1#^TC9+@Oo@X5lczIQ^cyFy1U)`XM(&S`};oS6#U^&`3>2UQr)Y~o?5rk zyknvL$?a`=EXESFGJ4~_hQmv;u5XOuP3ikgVJ7+hwd)(B0tCVvqs}h7@}8`Fu#*#( z=0#cO+D8eg{7SJ`9rjIGr{NofUMXxC^Fe~tf8{cKBL{F_wG*c7D>jBtCNOdvmY zP44Eof>O3p5=IGo;m+^<-~-AAI(g1BSbU+p4apuD4Fpq&ehUgyIJ@>UrEMkkZP}^y zHW1`6GA|p^q{!w*cBmBv`&J*(v{m-y-v}tredIaLK$IS$i-$fCI!j(9g()2OeWEn? zsc+3rjr$04f^i>3b~x^%D;9Deyq>_L`&G!}Qg$;$?Ztsitp(kHu`jv4On}vHw!e^p zFX^KQFVB`-NqBn}ZgUaKO~5LnKpF`HO>BtJ%UqxE#mG!{Ck6D*Qxv#$#vn${jX%aT zxaWH-O_O2Ww>7!6+rv-fn&$F`Fq-JAptGb(C`{p0$t&i{HmRy_(O!0K zPqIfrP|TUDWN?yRSvZA6S1eRWHYQTzX5~4UJkA-2gB$3rrBl81xlnfwE*vvc-cO{! zg=6Jcm1br2wc5*^l?jT2u`<1~aI8#MEXB%s&+flR?iFjoOSUBqvf~`#C0EkDW@`~@ z0qRxAd!K=XSO_zOzCh|O#PofIA-rq~Q#jdGepZJ1nC;X&T7n$T1SJg!itKPwhpt#C zbxae^VSUr;Q^4Yg#Uw6U<Mj@fnbtav`|V!;OTh#v~Cyi%cKlI~J`MHfH( zYY)_C`?Du*og-G6%x9QG&Y?a50c;hHe;c-66S+@@$pUPcsha8Nnb)5X+!&iXb=9Pq{pBds}Zj>20y6 z2*z?gJZP6sgzk-ExQ2p27RkNo7<5bJRHrNAH0 zw67>!2FwWdd)tT9LQ#*yVr9!!3;NJy1HBG5j8$>CSVfjI9EGyW@3A2YP&g^|Rz^$RWO+>57A_5?GqNKZ*}SglTWL*TtQO;)5QL$3SRB2s^sa{UXl@ z{_fo1&THcDSiP!!@W8j|f5}^MOD@3rOgb=^ZQ#+NpwIwCl|%+Xy`Khx`u!GIJj^A% z=!=3t6HeazVk-v4>$SL1tRT=tFuIU3%>Weirk~Xi3*#ABr>JEmL8F#mt3Uu5CyW^f zuYCj<)#SpL@5J3>A6fg(qMyTG<#=QlMcO+7OYupAXm|Q!*GCKe%hCQS+J}Nv#q`s#fvV2 z|JLrsb_@R>>@5rpiWqW`lLSbQ%RWo3S0hWHdtkK?6hM5U{?6Xc;zf#B?=blv1GAyZ z&h7mK1O)0EQ$D?Tk)Z~G@>0U**(ZyU`V!#Sdb;|V-gEbQgU#Np-SJ({&!_6Em|q4Q zOJxRuYiG|pju3v(#_5(MJgj#I=X>;J8_-xw^I6#4!SY&kAwp{DLxP~Z7X6@fkd!3_ z1!xgQ%_LRre^x#>+s?eRHK()@o=nwc&rXexe{p!fk@LAntRl6HoF zYr#AdJxXWzcV`yMCyOKW{{WN4`RyfUf+Y4N`@XXzw3vXp zEb#@NbK>YIZXxX;MRjmWbNL}e*2%q@5=sa#stGT;=+Yb=iP@H$n{IoqO)ZZ6Jg_TCt5i0JgU#-Q)_Bu# z-JlX}?RtqV#;``i3&12Kenc5kl)}=767`aUIM?3iqiGEUox7#QKn93Vc@L@%)h?xI zJ%(50zoc^CA(oV(*y${+A744nAn9!NcW{s;ZlNeb zxckdr1JXjlFq2YW(So(bX|I=pA`DFRH{%GcFiL@SXlmgim(G_0^*?EsqDM@z%@#~- zs<1;;{VKD`RJ%aVM}+(eq3LYBP{S=6CE*C?@4UsUAX^>F2vQ>Hu;)axd_VVRaj=c=c@BzJcw{q;n zgA^)0184Kx%CWVu1PkW6mSgLo2`6pb%CQw_lyI#>=>Q=&E+`!Adj$wJ83$?#&-AW# zB~kE{UaLU-7}Ga_%CVOhh3YWha%=@l?9Qn33XFufm19egdzWKpBG|PYTiV;;2iYBU zr%o6QfxxwMP371M5WeNu$}*`KV0Y(Ij?JjXwH#XqfuI1b!5+7AY-J~2 z4(D7e8n7JO2$WPo>JW1^$VG?jnh_*zNojEbvs*c~vb$e7wz3GnYDU{Nm18S__?2TT zi};sgD+^Uzj=j9d@$SrG`2><{IkvdH#7rLL*utEChl*Jd0xjd<_i}7?g~h{+W4*Nz^%5#6$IbwDFUJ;XgCEg}xN0uPUS5Mtw2;|0LQIv zuoy6IFM_jx`sRAqa%=!-;X*rZ<=8gRlsJz=IkvK@e>t|YkcQegA3Ky|7cVPV!!AWW zfQ1WVLuTT1Eyq@%(H9p7%IGwZTRFA{HurLDWf6%yIAJ)HV=D{lF~(Ld4qmvGODemQ zYS!WlsCfk{F!EsHIN5R^V}tw@A`7EI<>0$ez$?^cd&$DAVf9rEnTx@F3-m8GH*DE%EOF+ocg%Kz%hu@(5T>jBW<)Z|N&g9ta^(zP60L6=N|1hmdnR}FDE9=!) zj;(A=4l;#uY%L&u<=DznvMdu`ig73*RhCrln^B=lg}1V#45h&54&~U&lEP&&2x+XU zl5%Wie^PqL%YGfov9quj1KXt>TY)0O0$YjtF}AX(CUPssR(53NxwBD@ZGw*93#gKg z){{u-QJ->b6Fi18gplRf%GSQ+*vc~OzB!RqRF17|T&5gbS!(L#*a|#SfiU&CJyYMf z@YSgt+W?ARIkvJ`nR0ApsWRo*%2E=xITZ&l$G$6m6rh)QIOvT#%$x^Y`n>#-_k6pt zj@tpg(1cAEPD_N-oF{g04zBYb-A0v4$qR~5hD(>V441>#S_UJLeTJ*OIWw(nDjHB8UNrpJIP3;G}$8fkQ#_*~H>-x%&%J7%or>_Hjm&&Q@&$lvY_&QC6k7x}M*7k2QscXUUSelqkV`IPW0 z;Zdp50{kzU@njm%vp2aQ19B-LGNwZ>i>3jzLQ4DN2;N(Temja^STE4BGj*8Kia9kT zg>mL_9Wj}}b=BIz1M}$wu4p}Kp!z9ZaJc9x0NP7G!Syq9byIu>z2I`cvS#X42!XTF z^Xer?>DjZoSy-SUh5+icvjP)XpCtNf6n`H8b*Hwr+WYYTJ#87Jvobx97Kg}66Y}IF zm607D;oznTr1{g;7Fh{ni+t757FiK&k!S1gfc)#}-sW(t_w@ec!tLkIjeCpT?x-^vcFta!^g1|OFq(|9ow1-_KD(w2-;4Nm)4EwFn|cr9a~rm7#-IL*77_R%MBBA`#pJuCc$bAk=S z1u5#-qTB>B+$H+OC@xK5b-s@Kfhg{ky#)Zg!6bbH)dg`lq5qA!*kD=`6CGgHSaGb# z|LW}>v|R(uFs?&`8g>(PL@oOjstbshm75DuId=rFul!gPpRe?ODa0N!sBqxcuha&7 zIC1p%b8)9)gx4>Ss%2S9LR=*6R*b=XO;$}ih7n8oA-!L3#-%N?oD!slzYwycqC59>{?YV_m7(r2In1;qW+x;CJM-k`6Sv=>$ zw>PZNYur8R=~(tm$`Fga^`d4kSHL_pkUrkgD13Xv8MJWv%*i6okIIGM$xzM`0 zbW`k(gl_-&x z)5{TZ+BTfd{d6-nkdSm-MWKGL9z)rcv)e|7nlfo+HI{Fv!_j<3RCErXD$ru?(RTb4 zuYp^W@hF%?=8~`IF?yUy2V&Y*^r9AC7U>qP5W5!Cl3TH zNAbeL;slr{1rE ze#7R5q(rk`j{Ia48}t?h3`WsMQi?V>so7EtUC7X|Mt5A~Pev8f?2j8Q-4vUw=dE6} zV*C3+dZn9m(Go)6X0`NA zqsu~o5JTHuS7$~6C>-8IKZA`${qYHiq>Wc<@b?1Mm>&=glxX1^>Kq(cyW&99Znhif z-BE0a8R=kTK2~*5wqz(qYSwipW47j!Om+n>wKM2jeKWBSf7UkPxvX^ldM7G!tsE3;pCMWWexYD_3#S z=b+oEMaB~Q6lFu(eCmu^u>7#YBn8N&T#pyQlvEuJ^vjXKGhZYOqye~`aGnmxG?q3E zEJx^1n*|D5!m^T{vded+ro%L|C}U}98#PyDYPK_eR8UmLPE7NM3o=)>`ip#7of{cr zmoT$!OSpxl$@o{J*e;Bu%c3ApmG>g#3G{Ti@2{E#rl*4GGW_SjMD$9TnnBlE)tLfi zM#3Tw`h2{Q3r$wv1LCX47e@WTU7cijN@u4#z6(2c5yBeK5RM@Vg?Z_2Rs^zJ&?KReVKI{KsQ`P2L*b%qT|oqM8|SnqJv+c7=Aj`ti4$u^|Ae;8szL2Fa~Bvj+c2Sz7gD4N)!ar$qDF z>2q9mC6Vs{Qx4v0Ol#pfx_0Z#-dXfGy?dY>j7b?}2)gD|B8A0?P;9%@{iV+>p5HjV2EPt5uRkYL@_uIF>s=Vd>9Wm85yFT^2RG9ewXE@UF2M1G6v>h z0?btHh6Y&TP-v$saj=&Kk~k}3iXTMF^n9F_E0sAJfNnB}f+*M!xCig_c#_RM75njQ zVi7mHfNZZ7#rATRIUq?-4&^ARGW4Yxa*)KK==PL2YTV&X#*)KysCTJ=8Nk8US90R% zf2IT|ANDOz{sviwoZMhqWQE_QfzC1{u|MNd|53RSU*8$ue{~Kg)SK$8ZtUe6TDIuy zO>rV-y`h$mG))zJ6gFXOrhnUWRyEG1FWy21SkwL)Q}~7xgJzny!C<0rE3uTMDm@Ko zH4nFvSvt5XeXGBT8%^h5Gef+jKil#zz>W47zP(?2${dKxnp-mRA!x<+MK`m8kXi-XH8JH=0)JP_N8hD<;Sxb2J!8E$nUc350 ztKC?QzeWFx(En{L-=#nbAy$L(qJPQI&TbYN+MuLi&ITrCt0qWdD^d?tsI3GM4SqYw zAl|94z+_X)b?Bnqe{W1Da_9shY;XlA#u&1YApoV+mKpRa-@1exHFHrDJ>S}cyG$Hh z!?h_T;Rf^9T<{9(-R>NbYADLibZDS^U|}1wE%Ua@ZXCI8OdY548{-#W3|A<7yGIlQ z-teJ}$T^9F%yxoK{wa`?#V*0~bKDda!v-vsW28--kI+{g6m(A?W!*LY4OZrEh^*P^ zDD9Lnls}|R5d>5&N2jA)$hP$>7rJr%%H?Q<%7vVY@i77^7m5oW!E^guaOHx7 zl?HQ>G)FH@d2GQ2Q*DC`A17;r_!7N0T`NZe4S_o`ItJ`y9bK>s+%Vkmg166^LemVJ z**B2!1z9(;S)LYmD`yr1NVOj2jP@vS>v?kLvoMk1N%BO3lk3N0eF+jB8L*_ANwBnh z%rukWiSkT>6YIwe_1F3hvZ(}1%SV$50EUp9jzCyzzc81;;p6N|seU(4CcrsoQ1a}U zq+8JuE2&`LU!Zn&n6l1KBY7bJl%^-pGTAj9cq3y?0 z?)kak`X9sS24pH+`4ea_8<|Ssy)1hEpPcj8CP zH9g79>J^eN2Qk`7h79M#c|j8LB(rF%OG2KcwyDjeTPaRLVpusI3fn^p1LU|MJ(<7f zG+;L5T;HMqIf0K07J&1h(=Ab9fSm5cBne=rQUP+hVYmSKJBkA2%VNkdo$qVSsGclN zx@Lb;Ow$JGNb7YNNux(Q1U)a?2>G%$LVo;cun4)l0f~?wKT;eamnehErBD zsncnWkmF}#45=78GFSki>^s`|Ir(WXLn?a;oY#dt);_(t;vfqNYm4OxzxA$TG&!4dMT}mTz6(#pybXG`rW1}Q7T(} zONV_8N_{pCU)`v`)!XWfw{gLEhvJkmB{~jjS|ubPw&S{eFt|;5)-=W@s}#ZqE&m|L z&l=?s-GrKRhMpZ2`5f(rIly#XC-V-<$8xiOc^?VNO=RCG@G;$a3Vgg&EgzGUae{)e zBSnbd8oGTjI3E}KCb*?+rhO9vAE$1B$KdCi(481H19mFqo6rrz`6fSC|oog(s!%}A{1m>{Z5Cxd=OwlNq4sIVT6>#vQs=^1JonJ=wo5V%awt4Yxa6c!=Ks zzZkZu%X8SGF}OP(zj)S}T-wENupOR9*oXIy6fziZ!vK!uP)g94SOfjXDE5ChnWEAN zCU;J3r~`!1qN)L1f9K*(#ducq zLiP3#8dQ8DRbA}XvY)6qYTB_-i9ph+IZL|+-lk7f(88UP)?EXAJc|1j-!g^SLn1wl z&I5YD+Wqi6pk!WIB+Uf+V2$916Hfm+7h9zT%u=-~0gUV`&t!V+Op*w$!CgaDGcP41 zW+0$ZZKOMeJ;Mm8e522QZN>rYwH)>c&`TFce%niY>OfsQH1QcF4sHq&i&LPVT4H_a#@JmMsvIrnMn%#awJjw9cEC9WCHZ6Cs7mwkyanv#SZis`KF-3aJRu+3ySR0lQr_$&Cp8o`35I&HxxjlaW2hqrirg z7Cja_lxch$gP8qgVgyJJ0NZ=eUTqvmO2h+x|5p?U#>^dlw_XsN1}?Y5@+$Kqo$2`H z^ub_Bs(1$Q3SG~aM6sbcOTdZ-l7QxhHwfX3iubil#U>^!D5ite5e||@G(N>=B^bsm z=sK%@OK4wv%VifRFanH0apOqNfvNgmxT#Tha6UOtcjVF=rmJpjAozY;z3oZYLFwrB zOFaX_xTV|ylimx`d10uu$$ccn3A@q)UieL0GOjpY7ls1OYH*=uir6}|V?;p&s z@o_FmiKD%5J)sd~sGZcFCM~u!6hH_ckl2Ww#rPDV0$8enuzE?JzQHecZ1lG-rqlAx zer^-F3s4$^qSR_$Jrd2NgfN7M`58>6|Q2xx$(mB7y;ge3uBW8s1^7a1~HT-sKczr|E5b&Y2QR3r82^ zXDj*s%xE)vYscVnB=dEOYTr7HZJ9GJBE;f@Yh@`z+>E6E=#l?z3-kd-8S}YC7 zCmB=QgRUkNi*!lcXR{)|2(bDIST|nW?GCn1_jksNTm2n+kp>DEuTgK`ytx@K7s{O6 z*6o;sQAZM}Sgz(kOt8b`D(9w0nufLRUK)gWh=ES=%)&bg2FCJzXL*Ubs=L^{P@TEuBO_t zG_B%bC0GSX6ha{h#y1fv4@)@C`I#2n3{>zEhGYPOdB<$~NxX|YRyaTb4GWbJY@ zAfqTO;pD>Gyyb%0+~})QJ>>#H1tUh}$;}j{La$cIl?vs8*`HR^_jp(W*m=*oNY#O& zVD}pflqA_oeF8RE)aDaJcs`|}=Q7y7zg4fIz{K-!5&%4}a@g6I>x%r8!8 zV7aN>h{p=DUfd zL4gRT_5P=Ou0d6I#e!Aw9gE!(h1)ZOl@Ydcx`3ih&}_xgCM^v3nK|5JySq2R`XS7O z*v}fD@Ddmhw}Z7?XZFq_*F*yc*ZHFySzM49?0BE_A?XYc#7&K)Qnxt#C*LV+PA3t_ zM;6Lp*c`kTt(Xf1D$9o~U2pIPuYH%1P_F8PoZ4T+ zWmr!uUW$`is%%K4BhEJ@6;xX@Po4qTq$uk{G*2XX9{ZA-*XM|s9ci#JLCJWCXKSq)vKgbIobt;Oz2?t#UN3d zUv9?566;0|6pBX-!gk->ahuo;EZX_d0iXxA%IuDGm^8ps=NgVH+pJ zxRIi&dAODIgKzW)Te#bHoK_xQ74P5J?T)%T*^i*k!4aSaj>3XdBSEg|^G!h7fp02Y zRM_4`R9xOdp$TFIJ>LgyVw0bLRr}0pbd|fSlK#3n;=$Z~5)=%`Y(pUp<{DHLUbA=oD1V3)kPQ+r!w7@M7nu20U6!al))$HAKoR)(4yiy-UJL$s2&f+>wzuqJv|CeiAp+v#(~ ztYx+&5MH8{0ufHMey9bo)n%7jeS*4cqq{K8kFJIZ!4sodXRCrDx`arkOB9M^2-D=o zba^llc^ozn6E)Cl+_N_HeOh-WD(qzT2!v8-!g13_+__18e0T=AiQvhfn<%17a1&i3 z3^(P|4!AtT(D5%=A2@}GL%&|hT;VNWSG$8h(#usZL}vJ8cFAL^fnGaXOK)l>QFOOo^^HLbF)Fd6CC9USD6cpjO`CpoV zYC_p;&b^W7z|O_Rn(AI^+0|MxRf_|o*^`T6r;hg;g&b|8ioCAIj&X6MAmP*`Pn&k{ z6;}t5!eLaL7gaIMWG2_no{ljj;&Q{@&UkMpOv>a75IklZwy(&(0>T9u;u%%|u@d1- z>|-36Ao=(LKv!`V$G{1cEMwMTeX};|6Y>?Ns@Mj)1V~D<-JP>t52m%a?X|1%{NRQ( zJNS)|>?GY=h?^DX(dma6y4c;I;vojvl_sA6B_`Qk33Avz2@NO{zCgr)pDVTtOq@3z zj!s`1ba(ojX??5khQ`XGPsOx3)P!G$euh={+JPb7NA8cr@|l}UtS^`MdR3#GGd&KS z6hd@db*_oaBGik&TYpeOJu6|P;%l0w=e+4Y0vj2I`ei3)gpB+j$yuSJHS`pa*2Fvp zfEEUehN;Z*uZhl^#`~p&<80TNZx{L;FexSqWKTB0k89J?t#Fns^dVxpvnwZ=Wztum z50j}?V}=k3p#?@`CY`UCPPw`;LzkHTW1?m1_Q67P)YZZKXcSxL$0q7Uc$x)&dk3CP z*Z=?9dlN9pjxHOb{kz(mnC~_lw?o?v@Y9#`gg>zA#{81hxkZV`GoOFdPFj9u|Ya96Q5&EXxctJIpe$@Ug(| zfI%DYy|`b*d-2DM%q(m1_gPYR)r9Zi>-}L_uTOOfF`zEDl~MQ zaNINgc1&XZKrqlHD~>Uz4UdvhWsU`YpfDW1`^pQ1lcQYfT>==u8lC2xGTl?X0 zbZbBC*sZ-8u3I}fm!K-{@V5{WF6q|Z97DJErc<}}!~9Ui-P#Gn{5OG;pX3%;H-|xk`%#El-oIZ@gsjn+t`C(nIS>3#8J%AOspkBxMeGuwn?3=U|2f{8+auNS9;_ z3lQNn){i(OTj)S&U7&)R%beEB`~B%)>Cu|ff;jU6vi9>`LSmILdeEU_hnyyD%blPh zK+kr_j$yjClMXkfK5>3XNoZO87K)6MFvBU#>Zi5omQOgeuvGv|LT3q}HuK8>V#V(5 zUyo2}n2v$S`nQ*MbYUNe8tKvyHu*#mHFuw;BepTq3 zEg>rp|3!kUj~|Z8gRA5Sw4Z_`TT3IH>B0N!Yn`>$Aek;IAwZI^Zk^pPmv;ykK!yx3 z)?GTIi>+zDiBMhHUtgXPWZ7Ft3wuS1;wCoqWhZ$cE($trxeTZcm@^E+X6lK1Wx1Hk1H@k~{x4_uwyT zX;H`j86@VD6VueL((d8{L_riB%JRYx@wtj-zJxnXx%810+bK%g)0<$n^J-2#oeLom z;@dGMWcMYw^t3I8C7i|ggARRUEwE^2Uui!xv5cC6Q{E3VP1!4iy*qNE(FGBn{h=`#(8X{g~Q7%!FfK(_Dz zyB@(!FL!uWQFW>vCL=nTpDM3a%25_K5NYeWZ*ac9-o4OD0_UyG_TWNXzb;Bjja~d# z^nkon!o^oWztPPD46vj%gz`&anm5rcSGKa=o~=PLZ;B+(p!#AZJ=Y4`x3(I8@+PP| zLUu7|!byuyR*)8YOIv@<>n$xPLO5Y!Zw_au6@jzrYn4h1`wLuefA*w936Kz}Gy{aD z+Y^U!+Mf~dWT!?y%h+KQeM5x!X7EHwvXkUXNla%fYc?=0mC73Zv{EuIu^8sWHj%eCtnob_kW1W+xLqNsUjkV7w_%v5`~eT$^us| zu>|^IhHw5UQ(eVz=e|=!#K)azOVM*HmL=HK?mn<(?G=aMvNMp9^bChEFv4laclg91 zbhYRrcD0wN%X7j=2b|2Yix-i23LI{w{ zdokzuP?!xuz*vsx)MPKW0qqzah{I}_OcZx{M5rXf+g4MHqO@W=IfhsFcP}}_zzZh; zTw19cu1X4q!C9G}g0r#|5_4}<{IhQMqJF&z;6y=Z2?%iR=NC{7__z9qUA+^0>4+P0 zZ|W0SmV9vWA$5cIN1PBN*u}kWzCO>6%lUHe&$tCcR47=PSoY?C<58d>_xdQZ**t9q zR^k<^xUA-vLczcYC%H&vl#6w(-<>46;8e^`Azh(4>9hD*;U&AY{_y_53p2n=@V?1M zcInlA)npf3<N?;bO9|wq?I#J?35qyT2*Vc8HQu2iIoXG`#|%?P{w0TorO!sv8{AvmPg?o$<#gBpmWKsVH%T)nN_fdqu0xf)p~_8vplUm21YnD>j@uquNU%-I8&9LniHmn zZ-^mISauZ_kt{58p+iw-Oa7JO#TB$|cOb6tOq^!D!$Wa}=i`Hc5soXqUU$+X>f=Li z96w^Npr@|F6%28exPmQG$`$UxLboy;8i)#_!9VQK42$T;Y)dKf2Df0PLRt97QX_en z$FYPVPA1GL;Z#T;;oo;Fr`TAlz##IhFbxv z)I=U`I!JBg;UAkC$rnfpzX&ny;vGmbcTkm5=)+%#l2mlN6QY-`FJqiRLn6m!PVSFOKb^r*gqDU8W|J zGfAB%8JF8cqf(k}>Z$l;H#BPPIbBM!Gt6_8I5jAdPR2hJxGcil8=cCbGZzg(Ver=S zuPYzVMz-bqgWYI_&E?X!PhFp!1gv7c<9LW8CZRYAC{0yVSC5-fYKKcBJ1WKIjQTqR!1`>FnWRBTh^?~GM5 z6s9xgKa&Sa2?XC&1;Kn7H|x!{fi#VNGOM@1Ae8%@+k0A&ac#GnkExmVEbIz*RF%pK z*YOezgm6OPKf1P()?@8{O7;i@)0}{8?*`ii`F!q9eM5_ zj=TS~j%*H1BLXxPZ|gI`zSU|FZ7xFg>k7N-HnZ&&TJW)~yL~<{VRvh*3ahjEV|H!L zjBH|&sMKsn7y+Q`2^spE19c1M!Q8_YiV7ZEy8A~Nr7Uy2*#AJ(q3hO_fiTPO6f zkJ97tUuVXYl{)cjt(E9(MFQ&jCYelmi6P0`b@+LEctzVRo~FBETgtrl!TcqDW^D76 zOP}yxE=SP7+KQ5`ce?Y)cBi}AxtBEEnODfk8&liXh=F}mp@}@VjWFrdT!wGuu*>c4 zxejaDY%BM*L(Ff%>St%)Qff%UXtrl5`&|XX^g1NbKW7&f^(1fwI)rFD2=35X=$-vz z`&0tsAq5;tvrb!AYqo|Yu*FT-UV`i+1-oM71Oa>z!BqBUoKf10^C!!7pt7N40pDIC zW|i**paMuyIw)Jljkz+Ie+LNjJ)HsRT9y3M+I7>2+?2UExY+iDGJebStLshFanD*J z!!{5&1XFuHjuhcvwa1b2J1TVTHt|Nv#kHlp=Jzp@@oXtcJYsDU&9+ElTk|ARI9%V_ z=nMihk|pRXGq}|~X-frL6D=E{f&j~mK}kj@WT(vcEh@;Z<9}WL^i9q}W3skTB0GVg zQvrJ!1*oXv-!b+nqky!zPMPLB)9Yk3>v%Aj#LDhpVsxF7Mjk`gnMXz)ZP@Y92)J_ zU1qQ-7p^_QZEf+&fzaRMFE3HX3KRyilPolATRc~&q<&=yapVTR70aT6h?Nn52l~CW z`F>|@do>yQ+FI|fk%0pP_Ef4!xHbGI<;I4B+XNgU>B&E>eK?KBQ0|1wKWq!Y7}qeP zf-lB|sr@ZVa8`jx>%?v7zL07`ZAkbL5gyd3>p_CIf>FVp+5jT z;e_cI8rEz>Bb93S(Zp%l<5EF2r9V#L6+{=iD6!T(-XfK)B@5L6tCc!H?FEGSP^BNM zJ5bFyS)Dcn48-d7q*kT^Yq9o(@Q9hs)xpiJw6r2_($2`zy@%Q9n34w--&XY_0~@+?I8*vRxMuR{ts898H*G+es5kQZ%v6>9 z{Itk?Rq-F92<9Z_n90ZQ#rH#DaTv|rA{84Yl;7#DiHSRCm&ez1jYl{>)XMVs zl6QtQpEYpkp)8NjxO*@US$Q6xdH-;{U7E+I0ie0Sio=SOR0OLP+n3r_dfcEm5zqLs zELMCzFJX48ciKOXuQ@MeS^)C+wBvJ>1D~{|d3*|dkUYLjk~!q@DLYtf>Y}hrRGP;} zKpAfyUvr+syIu15l(X|YEXm`e$Kk)uEM_Zpmge!L@Qy2wk8kFh$HzZ#&*Mu!0U)R> zkBaP2Y6{7pSHNj7y)NC zRm!lfMM(mXzGZ|6Kd z?K@B&pZ0C|Jig|~VX_1lUkjIyS<&?)K-==`Qi~>fV$Jd-!{L^U)K)ELh z7L_g-g`GL*G$2O#m@Z9*DThTEG|q7Zb41!9kIw;`a1ZU$Jia1mv{!d=9-p=lD34G3 z)<7(Rzl!tt%2$#sw2}z9!&;>;bvrrLi&~Z#dB~i+R?gW@9x;bJJ`EoUI8J$d+IPzB zihC{2IeQhKg&Mmk&9mi!YS*QkBtyHYqlY2b!__PCNsCJ+ln8j4dN@*pI z*7oX!K&6|59SHbGdOAz4bqs=(@O zHE~X3V6!o2XLUWSS(?YE-B}g`hUM{TON=s)Puq$@JDxl~20Lm;Uv1gdxpGF0=AnKfOMWZ;m; zXFgD3#GY?&k>s*FlIU20(_E9>)${ml00|u1GD+C;ObN$0=JDBfwZt4N=J9E}0rL2? zFGrfkr|kvIP%ve3spv^Z2yyfq8t|*T6hJ?P~>dLI4HN z<9it0V6I(C#=W){0CzS!r$iiP$bC zi_dQ*lr#2+q$fYrQs zOSYhNo#aW}AGX#y-9e|7b>=3mqAiUX1yJen1-63|K5726VMa^_`rZBBCU2&>LEA`+ zA4$EX$$vi3?hn_Kn&RXu=|@t>a{wnbR8DHdwZ*80f3c3vjS1lRiVSdDYcO_8{Ce>A zm>|=rg0!wk+KM^mER$LCTO)^4wayQ+Yqz_<6>DymWUlQ>nIzu3w0mYYZ5t6Slj|P~ zy;9(VNS=33je%Y>fTj1?<#AuI;DODNZ=G>vvLlh8qh~pZ8u%%5QD#Tp`%HwMZN|^( z?K4FGH^{$iN+FZFX}DO`Jg;SI+lk~xNzn|;>t&y);JWun@a=cryl3Y{Q)TQ@NEBa(x6 zfq%oES@vXVB6bR2EgbgbMLWMmVn>}MT2KCsZJt9F9&(5z2bO6*$KrH*dYZa=3KfwU zqOYwt&HS3ZOJ9D^cA7^{0? zkThj08MVY|Dce-CJKgvp6-XQp#bdhpUI~SWZ*1KaRIE!#;h!=Bc1#fbFOjvwxVl%) zA#Y1y(LPK6NFK{3(}@FZZKbI$mYtV>#VD*ii1`%2 z{_Jn5F?b(2(ty?IrN2^qIT!7nLaae@LKN$MHNW1uy>Ou`1_8H`D4ccG7f(-bwS zT~DK!GC>3IHT;DLt&idc3^03Gy*6WDoKT0eh5vdAwMUL?%~U=!iVZbETIkjZNc3F5 z;QlC1WhB`N>{)8A+Z60G(Z0d?{(AR9D{&!-I_vKrk(5pB%gX?*Z;ny?W*t2=lIvu~ z@@q%3x?Ghlh-4(}mg1T3A#{_44)D)KC^UnNbD|?@w=xWTWe(s6(@r%!p#y|dRDUy7 z9G&ry>4i6->8!$ss@Y(}uNyzbaE`=p82{#yu{x3MOO=#MADdi9ka2TP@YHqEYyQ!3 z5(7Jchx97-D3f0ElQ~N`LH5Kh)E)121Q2Col_rdUgfM%2ya>zQv$8mw3;!BIzrz*LO4A%nb}KJ!=r{Y zoSyo^6ne!-aH^@J2SaV5d4SeJt!p4$&hGf^2zQYc&`9?w(KC=jlcyro3561yOIq&0 z_i(7qlw0QaE43$?P5%3Ie>Iz0X)V3MpNP=?fq){05EbfoloS9s*V`r2hVb8q3knbr zU9RbsfiY5kL3W*zj(c(oRVqXgILblFtZiKb)JT>Ah+qmS!j-@Xr)_?@feKwL+)`Aq zp{bG!;i#;TsMDT#C!ID^z}0hfY+arl?w>ON_Ftq#>?fJ0SGGtraf<{L2T36k8H9-H zi#2O6#gDtD8%PbL3iGDSx6aRQk%KueLYt?-%F9a*jz+ly>TK%Y~vSP2Yw#iufbg z{SfVtu8K!`KemRqDhe65i1)eekU!xn#Cm>u{_pJ6lZ7x$Cy{v>;Zl)UU8 ztUuP-zqvlxY!6q@?_ckVA7T4wY&)>R+HnBaTq^T=>tv9EZMk*hueggNQ_p8f1b(JdJiW8)!C} zpfI&UOs8bpMUxl-H>2xY8@-F2ertQM-aXeETwEut(c0|v$prTL^CGLMwIAVDztdi8 z^|~9E$$t%c+x^uJ8B|G(GBTV2)#hG-c6T;NA>EmNySsWmzI*vjOLlupRaq^1DCtP8 zv+ZQ1qeqXOAY(iBnoPeHw0n5I(`CEewR{IM8^R8|4g1^aX26rm5U&H(< zQb$Ni?JmbN?7yrH3(BZHr@N8uUXmO&h;_8Uts{KWLSyRf&?6d8Y6D7^+UC3#pn*k1 z&=?f>F{hi)>=S~=+$Gt~eNt-drj$>2Hae@r_=@b`7-BIk0A$`+gjl(S1Ek%<-;lI> zc*oH$!6Sfn|7B#IO0SBsjAqIEi}eYasD$}j`(S%B*j`L`IAuCp3lh^t9P^Gv3IePA z%W}pdYRv7qpSp8t^lPHmMP78za}vLs+Z$wD!uG~!?Ju{Qi4=Q)Yau!CZf>8nkK8<~ z(4OGM)bN*GNh#}nmsKyhd4lLEIRYJvo(Kh`?@;15x-YI@$7@E4O7-eVG{jAtE~l+L zDBol&0?2!tk5r8fFUB|x|S!d~~xS|K3 z8a9G@84LJymCxu9zXy4C5O9CHtVu@)L0Pz}U{vP|wgv&+z;9iHt>O zDDS9c{F3PN0vgD=M90*de-N61a0+xlxDy{TuQ z)x38(nKl&d>I(A61rRbRi}AZptVTs&77t+{R0`6U3Dk5V!|jmM3jXAfIz|$W=;DhA zBl)IW@Nf@8i!+2mGb;V{2!S9rL{bA<&=r+%4gW@DafH$Q2p*WB_%j?Qs3O}D2Vx%d z5Q4wrfg=2)4Vamv+>n-O0Mdn8Vwz(gnamzmfY9>?9GkybSCT9MYbRx+#xOu7x7Hz^ z@l(mHXyO@{Mz`C|!+eHvC2k_VknB~I^-bLY#8<;#ix9{NP%z96w37rx6zE7hN<@6I zf!y*@OhTO8&Ysg*3FhgI_0nu% z@rb;=EaS+us0zI|?#-%X+F{V!OG5>}9%eCFPhHKlV14d)j;&Nxa@lYK)$mh z?I>aR*-FB&xif?z#VqHxD#DQ6lGLWZf-q#Ol?p?<-K0->_!Q8MMzR-H+e3ZIgPVs# zNK)A=?AQv6bOUgU`qEt}pi&po5KQmsN~+<1s5>SrE8t7Lp_aULs32sJ^3iVEa}`yE z3Bq+uxKOZ>@7tSrNu=jO!Fvz?L4@359dt|Tlpz+{H2qJAntBJ#Gxb^I%?o;#JAcHoZY9f;N~jS7f^$aQXYg_x>{sdkz5Ej z>qg%@iANKro=X0WeZ&&KOTne2-uBMHFzZqv*WMN#;Jf{FgZ^55v6EcVtxFENb>NKZ zax)<@tu3sAK-h-Pcl!y| z1*8$(-FpDw%ymD!WKek*a(7J{LJwHKYUELVC$9*0P-5XRbT>blo+p zB~_55-#;mfavA_vs8B23y7=7fxtZace%&qCKOP9>=@`WU#MjvQT!Sw6{w z%22q8Iz|8QI&!Q0V~|Tj=7M#%$-;enO4~hjN*k-?cJ#XnA~ejYbF+`xAvHH=QZtx( zv6IXQ!q}u{aE*kDNhKc{S+*BVuWYsZ?al0uP7TDq=$bE_~!d1s!2&o zb)4Bo;u3DEkcmG+u9LWEW$rAUmigJbV~&V`UD8l)4^W0}j%e%_OjSKMj@|r=IDgy-B=gB~JXzjVRwuM)+p5-KB{R@{qPi07;uFAX_-%gPRSE|87*qu$ zstO2u?pFuoD}Haq!`fSMtgXC!9+vb9IR$$;JvkkOSw?#1OP)I(Q@3)HHKYS;0d<5I zijxJ+ox>DkLXpyRIyf;T+#=suKY$~w%G)jdFB4ShL*6a_gzf^W+=e0TXaJ;x|j!Jh~8U~0-enA~b-=&hzj_B0Y2 z^ej6|Xn2c2cA6a~H2$5R!}r)Xn$V!=ug2}{4l6$K*fOO;!(Ka>@3}xy3EZ;0GxynX z?zjx2y&N7r=Hw!v_w#razuQr9{Sfab!4?0InR`}mJcjnrYSiTQlorgjK>7Ef-k*V5E_PD`cew4`q?Y2pVZ*8*|y{uyM#pBilb*r12xbNMlnDYoybyAPGPx z(l;~w3ovWB=?azs%sC4$`p0;lE}_PzDb#p;;pnJBjp}|`sPXv15pbwcp-didlcrjM zLXFC5oIaTQ#U5&WkE^NAhHXgzuDcb@r`1&}WK>|Uf9K_Hdvkp??XhxqzqgtFZSh3u zRQ15#LkcoDY8f(S=d4~*Op4b5CdL9aF+91~YFjuJ61~;0b;F^9f!_~rkC2av#o!Q1 zvB(J^;Un@Aep@Q(HmO3>9xEE!%O^7GzjAL5*rMek`JTOI>E&c^r=glNqi$cbt$-l ztsGvQCMPubsmnIzT;#BE$fqvbKipIIhk#FAWm<9i)OD*eX5v46>w0_wcfU_ATE^`tG2k!N*l~8482EsvLr8C_H&!u_ z>!s)Ql43U^8E}=>DHQ`&?`|%Y=&KQWwUdu4tAj4`VUw{tv=`ZO@8V!S^>D|#(tqK? zJfL(8C4E8*6fqm7D1#(Tjp}U=Tf@s+our{yVvU9J$!q6PTueb7$Tdvzkb`yqP;bEi zwRo6TcJhuFZYI#G8jKNsY6`86hUyi3Yp(3I(QKJ=m@qKPYj%`obsXoSC zOC_$&)$&ZVZ*ac9-o4ODnu4`9+k*>9b7uUpk;z@s_%VRL{(r5bSB>aWx6fpQ5H?1% zem0M=HAn^$3bq&#^QGA4y9k|Sp$AO5&4(x3&S2PCBTAR|{*+M=R8>Vu+rvkLU!21M zf@!U^bK_)=5Ke*p!xZX{_ZBo==3&s`H;flzT}eGYiS1>5H5mX(RhLVuMef}&elfrX zv$BlGipFbNlX_{qB*Bj0A-Iyx5)EjBSD&xrbtaN8-j&F|Tg;az|g3`|cw6u{l}7r^vX5-Ln{hHyZEF9%Q9 z^cGO|DnW!mduhR$E0$>$_`-aLsUM4POD^3qw=MZQS1hwVd6y4RPFAY2u~$=m?1pd# z-@I@z3KPMC9_(5cnNCI^Ha-hSyVUlX@%=ll?V0J8bnvNLgq7idlN@$y55tegKTJ@k zjpneMS@p!sa=Tk9|HvS7S>n0PK&DU%7|lcEih`4M{Nc#b!ci|nkRVm0sHg9?)LHP| z5po+2SPWP|D=!p8;cU4tHXM`6Y&g;^HXo1aJrM1j(7AznI0@tX0<0$6RYBG(v7W3g zqli>AN7mlpIL=qPwtg~vFX6R5q@LQ8vt7g9+pl#thHZd~HEkc^FS+(j%^g4K7(k2p z+=>@+E2IeInzM$|c&R-A1Og#1qWKL3y z4OT`Jz~#>1e0z)7B*{OSe6weDO10t9+*K@8IJ0!cOcdAS8h&Sl!1}=iiI8hfuryRy z8YwJaj}Tbbsj$S;6g?O$h3GuYdFZM+hWm&#Z&gs)ANb4nLP#ylPlg<(olXRnlUtXEsIsD#)tKJh|k4cW% zIcLKCV1#@Rq*$$j(EMmehYe42C#(6DNwa4V~q*0aQ5_nYIqw83dS^}+E>qL z0m0LrOrwC7(HN(8{EBdkO6oW0vLyz0K?G|qpG*>pDcFOBY5&Sh@x2iOKcP(A$^Z+- zuMrLoS~!mV(}uS}t*`~b)}GT@w)W{HU)`~3Y5ql~@oW(GVpl4-7L?o|nakRl^Kay^ z3zu@P&1Sawl*yaLZ5mbnVu*DZH}2iu2xd58-#3eP3H(->QVe>2%jb zk=f7ryM3~9TzzhUuj7UYL6%0D1p4{>fTA~Flyrx8>xGh+x)l7R=8kc+P3B9!GgC;7 z6z6&bf~kd+fgz0sxHp8^D@fW`6==6xeL+>X2olEM>Um)40y%WdWx)HV7n9FFL$P{)j_~QW0a$ftFBglFQ_I@Mk4B%yRJ^WX_Ff9^WNT#^GM|1>Mot{C1EhrtzB z684r5eioG;KXjO8up%82LO3zN!wILadBjz9 zWJ(e2ijsw%Pv~ZIrf9LP^1B|Ey6H&7Vwp;ghARpqereT?MFypUL$unlH2>HsPkWME zbo@Y71rq6Y%5qQwAzO$zc%VwdS_&IcPM1mTnxsW$h3qUc?(**IFMC9-RgezTDAUvf z?bQoaaW62%-UR$fIcjl6&k@Yc9l|DMFohGbzg=0x9+q?ND>4W>pLFe$5wh8#LJ3)R zEMX)`IZ(4w4pg!3_~pt%_VDP0Y(?ctQ4~yQXBU_z4uV7Hx;#t7zqg3hU3HJbYg&5U z4#c@-E)n`IpS+56oK2dx9PiF7%q)kwqKUr{?wZ9)ZjFH@J2^os|6J(H=jYOio`tSm zO!{!t7xyYjMfh=e;RqXRH6O%d`KNURPN-!N#53%_JX6v+?l9chDF|z^KWwd$fk~ZK z>RB2r9)$bO*g;aHa^JS)Kci2IamG1b~x^1E0%Jf zd#Zp(*{T$xWqxvtLq1W{YqUkTImZ5#I&$keAQ|e}{!(zg;`8H(xbccB9Th8q!^RR; z`6|rGRTs~Z0=bIcT!%jVn6f`m{DPcMX3} zgeqc#ffP*QL?M9+Cvv{rfG3Ts8t>4-U@`}s-mgQFkr5|k{B2-vk|)Wu1QCQ^vQ+F8 zF+twyAwCeWLn-lr5cM=2_U2%FGfYhKuOs*! zWc$ZgWdDY{k+M7FD8yj@n}h(qins_TgY(@Hys=8={vv+0EZp7Vtwf5*UUIA2iZE*U z9j?QXCHtR41CC8Uo0WpZOZ&*2lA1E3dJcH!47#dI)D{lH9AtJRYK zbu?dKPG^!A((B)Ox!c}cUrozI$qVF(^9PZfqltUB>!Xo#vh0fL{CXzDcUNinHu2_MF>(aSPWG#OSK*t zu5iZcA2vY!rEU1q>{W=$l$O-$wU+&;-auZQ0r5((HRZakfUA}ovCy}3AdVn*Mc4=B zMmN5jz1{3M8wtOL-~x7?f@2>Hz_DyqnP-EpyJNXF zZ1rcawR$~t7%dxwYbnwKb1l0H$wM84YuUQNx%N$U z1o1XY@|k<9A$gzD_nJ-=7ZGGV2~oT`s>KcoW$BW)Q%HLwoP1z)t)V1WEtuqDkcE?6 z|2dGov9NRP4T?0uFhL{?yNb|~i>)g$q&aEYJ#CZB%z!lAl4MTiiQ*nH+EoBjEhQ~R zec#NFyc??48WF!LH#ys)O3d=b(@rlb+&Qy9zlNp7yVwS1)vciA0U&Y)`#o8ZaM6Bu2CHAHqUP6*OffGZ*_Gzt5V_+t+Zz3W(Uiu zHD@iEbKs^-%y0<0s|ZO{8Io`o*>5x)Q}J}1XcpK70L^B>3^`aLSe%&YH0YO$gNWuP zZVy!*VmM&sZFjkRMT0ptwYTKlWKpk9JI32@EaKgV7Mv8@=fum@f;~z!a z^ch8am}3Amik2LYf5=`iPL)=5OlH#`b-G)TTS2_pNtrNh)8%H&roNPxB)!a$=pr+; zo^;cP*uYsL4H4u0^|j7gYmjuO_jKxvqWU2X3gkcwW;J*f*;-%Z-4p}8*&}FHn8`$7Fa^`Z^`KCN)5TwHfRlXl_or!N=!_Y%Aa6NSRY|dn6WjpF z;3_7C5v& zuE)$(v8|Xm8)OddZ`MIsw3KP-g$P)bNw_=UUFD$=a%ZxP*1aj$3v&-bi!(_t%ygnI zVK_*3xr))`PxB<89BiiU57fc)eFd$l&`__Ghi0UxRhOGT$YnjaY)pVixsWfF^I;XW z53b|ysyha1OiCj;4=tF3&U_UI5In@s04|RftEnjFD+;G*8TEQhyA!)BFAGn9nXQV~ zW7=IIU_zT!jIq^xMs*g07S2%r6Zo_{3uv0P4xNN8R@F)+p!4p;LI!H%1P>ldSGcU~ z4|@pUGfcR#c;OOD9yVq-9E%X3L#8mM{fGQjvU1T3v|#)jCC!mS0~d~i|E5vFe%CNJ zDjp8R6YOdQ7r!bDv$2I`J`TNfDJNU}pjHPrc`A9hcd4nxld}CyQQfiv_fH^Lr_g9* z$nTe#CHCRF0Yw^3oe%WL4=OcSR)4s}?0_PT0T)iB{Y5yDrWck3GfP5=G>Sb=@;H>- zVb>zU_raGg6=`-qkUrt#Usv%$sVTxF?2}GW^7kXz61Iz;iV=Prd@7KTfbxEONjYS6h(`d`$5n4@5aZSPkDOW~tH6&X zV1Ekw$~3|h@Rbx2s&KZ%?*xcM>PCczX3?A)9?wbR^>K#69$r`Dit-aE*qSAV0(@#O zX`bbl9H_WuN%zC7ZENK)q&N_G7-dd62m?(>Max^zrw?gvKU!!P=$%u;q{`0Y5vdX% zEB<4)8>G~jiMQ=D9us^+2rUMDIHBb+@YZn6Qrx|=yrF00@uA3oK>X@+euIkN$_kj$0H=WJ0$rN+TUq!rvhWnXx;OBWPvKCIiNF8R zFW*CqW>shYR+jjl{Rx;&EY~NsqzbUx;c>I-lYc!X!4kpB=4XZJy8Ku0Nw5+O(j-_9 zA3$0aAsE=lu`1}yFap>kjZ;A`2Q6uv5OxSKu$c)ZUj`kyfgq0Yzx0Zj3Mi!Ohj>)w z$}qk026UX9M2!5pd{lurl-9W<_|ZF@SRHJHmHgyG4@#s-2aOo0i5Dx5j| zYXM9veRl9fOF1Zt1p8DrVj0rK^Q^i%maQon#^$=nqU^-{{0n-4bgkf*9oC&=onT;>qWXwsVp-W34}4R*l5_DrD_;d;Z)80rmENQ>a&Kw zF)P2+#|Xu=;I+#3BfGnh8jG!2s?CwJHHe0h2Z|C2Jf9I8MCrv}HY`z^6h_AesX(Dog ztP7G_L#MX zl|{C9s;ztIpLnJC@wz6+TsamkOXj+#Eh#GtAJcf`BH`mPf;i_SXY*$RNuOFWov$(? z7*GN8jDvy|PX7F6!zX87eOlzEBUceX9(5KvG+ExdkU*#5VPo@>a+YzpMN4H+0SnIM z?V+b4bR2%*Oqft_jz=CVEk42?=_fj_`NfIE;=C`X04LbXM=8w+W}?U@`xT#!Y5c@r zdR;*V0Uwj>;S0+yk>d}0I1?o_@O8vJ6k+|nkx$E=%za0+Lhu>M?}~gHt8#e2q5Hxq z$-nNEz`=l#{MH^hPiz&AVt%pMqqCSYE7>D=gF}-bm_q{cSJ&}JVMCJd>kNjSH9lx! zpvLKgmN`ZE`y&L=VJ@%*Gec@4fi9di@|O)zQARQDw6+i)IV+4-IhkU}AnIc1bR*@T z0d%&@%CfBzeC~M#8jiQW-T(~( zFGJ)gxH}x5u!|Ow<2Awfo2@N#_y|_7#N+vA$%pD7b1Z-TtO^q1Ps*<%rxuILfs9-& zUQ@ahH?!GywiC^?VsDiK%UsQ=FuO-<_nX{{g}UF_^@1KDs6axJ1QSWD8nAyz99OV++_ z)~0v=%Gnpi4!P9twbxcj&G<@>woK28aovP})&?gv6s37e9OKN}!pm@r`}+KOc*gwOba`ctBez5q&V6l8huS@2C?MnYOSJ@W({Rka` zsfBynm*NKbhwHc#1EM&JFip0FU4`=V-qr zat$ilfe?D!^R^>QCK&;5OToo*yL+y~MjAQxim{)E-ywF4uCb*k;iVCN$LJdSR5?z{ zrjnv85L5Leh+gHyqWe2|nnPh2<%4zCd51<62(XmF4vr(D*piYy6PN1fm0)WqHzU9@ z&Sq%L*}L0E>1>AI1e+Ji{!-Hi$LaJX$KYtOJdVmw^n|mw$Oy_koxvcUO8)6OgTc5= zDgpRmu;c69xD>Nwgaj|X)H;5nYoBDcpGrm*b!CMA#yN@1 z?7>M6PSaL^t_;C1;-ElUQ?bsMVN6~|YiXZOpowy(*W2i{yRFT{TyyjW)m0bpjc8Yz zZ4qCy6wfr`sbt2_ftjdQtJTT>0dqeX;V3XEj2zfQv$nlDT<>*T>)kanA$-70iHaOj!yf@#b;?B~&=Ji> z{^>fj!FWjJKDo@sj=^8!l4iW|wV6J!`$R~+74Q|JU?ycF7f}Y&1R=#Oi&_UGCQ?BM zd~_)&Q>cIe=YqmWRi@_PL0aG!9=ve+;2#>US@K4L*RZE)1fZKjxfe>xoOi;>S9Zx_ z=~su+3T$avFN9ybG%R6n0n zBNj4HqyhuSWLM*2DvwH(S!Ge}=J}Q3DvPR+3Npuz?JbSRm#&pV$q37FgwEepdk4@C z>SBZrFkd9`XK~P78#ET+g0ID1K*f`DND6Zm6~X(*t3&3UpRJ_{iDaxYF#kefdk&wt zpDH1RB)pME1*F zP8-y~QG`huToo6VLFBb7g}te$bM9Y4D!2YMWB#<>QSdf!R-BV6-Qc*eO4a647vP~5c~ZrCx_49z$% z#$IrVBbY0kMc1NO9EHST7bNBNhLbpKae)+Lc1B~)E^+kS3~0u=cKtM)m-eOi$~f0n z9B0P4wlzJ>L^95ep!jB-Ym2GkSE5W%POP@5cJqRlsw}EPD##p`ac+jx*h+sy8Rr@V zG>1}TG=nnEGiRDWFfhkM@l0j6#@AvmprU-PI)-MPn@^v-G|soTNGkIkNmRZd&ZTLt z;2GyO_{9A9k^FiED3n`ZT+Cngy>G!?|U^OLRj#GyP#}t*slKbRLkk|r#X|9qg`AFd~TWRkC>A4wy|DvS3& ztD{FJ13#bB=GM}fT`6Zm{FZ1kfNLa0+X^{~?_Z73@3j| zM?x<7#gVUnFGA0ALf^@?wRji#$Ae8rT_#j&nzY0r#co4NncS4yqQOKK*j`x(W3PM_ zY_BXx_DW%P=N(xyj109IhNu?K{y>qe8y_!pz2P+T7ig+vSmW25cyGhL93Dc?q_osq zAx2fN-#R@1Sf}6P?dcpI3Da{|F=a5bbj8ecTwAK)wqap{VbRauVd2?1rEhie`ao>T z%Tp01O*(GL0Z;!TJ98EkJ1MTP$~ z{4n?jBXn(hFzAps1}Ud#Z?u{x=I=`WBi@z%3knOqhMj^O$#4~5bmOym02Q{f8*ok$ zT+*txmh`M8E`_UgM4a5%h#TY|_(DQ;5vc9Z@im8FQ;cx9`%J>1$Jwo;-a4aHG? zv4%0TnLS6;Wrm*C0{xGdZnyhu#34&s0?(r9=C0}Fe{!`BIE{c`6^z@w4I(#~NOE1l|_b1WK?m7IP zz36VkUMqL6bS@2Fod3x~>%;T+pFKP13XQQ?R7Fj4XDJxlM{ zlM0JB?Ww&uQxJ)wNdC8<{6A3`|MZZRF~q5q{e zfc7UMbin{zX7xM1=I0H;9{TpD_FBK)y)d8r1EAJTqvay}QxV!26TE4{F$37qLP~m2 zNYRFDxJtAb)$zZK(1)TiK~AxryfTx77=akUIP{mu1mXN?$H{eEY4*h(Lw zQ}^}m-?A8wpN!Dk#szi;YHRg;XZ6BBhL%9z>RpJ7;QUgAx+BD{lD!u+$-9PsHbPtD z1zq?BDw1_H3E;UGp)&AapF-!yg?TM~{9ePpZW@6qfz*vTNIk41ui&C#xll6PK>J(~ z;mhOQST1)N_tqk3*O;1~1e%Q=L-P0g2ItB9_(Cg*`=*n-5_dCxGD6=mLiD9J2-9CS z*d%YHDTAtp|DQVQjSxu1p>s&}U_Ua#eHEe>xeKBENAW zcP+Selv+=twS+yy#$!KtN-BJRdl3}=yE@t&->vXC+hBZqiU{7N@ok!ty}-Xk%;5hS zp-0CD)Jfl{<7xIrefiSMQfK+n$^NQqgtEI9k*8ms7^&{L$(`1x$vVWy<#JGOy zEFP!al0&+a+V^SwxWG3(tlT=u4N|T>&CXjTnIszpA6R8c-+|YG|-XKjA1Wcj|Z2v@@2PASWiw zvn(AcHEyyH3Db=x4k;|$NjbOyh)Yr|NjFgr&$G4|$hiZOkXZ{Wb#_{12!he?PrMgmeU>-fYN z+q{w(%Xf?Wt2%mklzL$MOx!rVeFl%xbE%n2f;7grsdOv6Y_34iCHXbO5u%+wW4gU= ztJ^t8GE*MaGLaozTjn_BCmQHoV|er^kkiv_kU^|j5zc(lAt!ZE$FuxD@f#+AP(f^G zM!5Z8`%F?yBZ8SlwDnu&H?s8l4Dv25xgsSjUI4D_G`5>8ztTW&nLOF?ILvoV9u`jb zX_eJ?PaYsG?rxDV_@j07-pK=-`J>e83=70Eflkl8nmMqSmmWwR*e|aZ)7k8iqO)Fi zef8G;`|;N!v;!_u#*J_~IAN!_p6kW8?LSylXZNN0jypcL_MMJ@i4jL{X)`5`b0ZD~ z5w(!THabuU#X}QX-K}t+#{}hzjgrdRsJ6 z0mi9=w6YxoAhNiar_xo33pL1`>RAEb+s6SP2_s*iB`?-G5=Nf0bN8StTB{r681WK% zN&MoC-s<8@43A~Ey!?W$zjaLJC7KGOtwC)`>WGLeEl5iLg->|{O8K-kOiIBA;_*IR zaDsI5Jqd+p1w*9$3jTP6RtzA(PNX=<0+-bgmGj^z02D8eip~R4pExQI`RkxEh##Ip z_l3ox7Pd5%M#6|Fxo z8k}}nAQ&7@ERDyJLYr5Hy*37GFkw(js)0rYWH@o~}WRCAk~sF8n3R56%DYoe1GzM4QFQ6@*k`})gYbNdg z9--F+$Cq!-(=rQzoLYKm8Ui_~#K&5^=!v%mEvVYNu-+0k1|-<}@*p%Ar5%F$_b?)@{U zdW=UC4wQhie~DOIcu62f&PKa>b=j;Se;mdn{@^&=tzdVs8gH9i;n5RX!0nOco+%;$ zjJBzqP!K#jeDH)Vc=otjTC}y?H8s2n4pbdA&hUkh$ z8a!9;b7BOtN)NQpO$B(LYxG!ld3Oc za1T^I2i{o`@%+JvL9bKrrs=Kl&4ejv@s;Aw1Dghe0n+fl93o8kGZ6x{?5heiu{wh_ zh@1@UVZw_ani?;&rg&$e$0x>OIWjpRT{-6_Sd-$aM3-=i*m@GDcMfR2sR3&pS`{@s z*a>o;RNYksLLYjEUHxo*f(PY~B&UPEg*T3T-O}YW{x|@JUcoe~np{~>_EVF@7%X7>dKR!9EIpDU z>;f=g3r1LGE@p`O#4LK_I0YN!q3mBGzzb^r3O;ZW!&QJS?2wn~5 z3uhKuo_uynP?(I=RjM$*J6e8Egx+beUkk#ohoqlz2YJitAZIm~6gx#RHj76xz{Q$Bng|6<+P)KiKjMckD9dkp!f6 z?FL5c;2xu+mk|?ZR#-o$P?S8`?MvOSJ)4<554hSXVIZP<^Qw{VU!y7Z8X=Z|*{+-mk zgE#JzdsjX_4$o2^se=&hwU1f9Ts}10UUoev0$d3ny-nXNe zA+4Z$|4sl&OA)a6^6~dWn-z}gKBYo7W_w#;Rs$^~?PU265!w-#c~ZiTa8o$pr&=$| zpR4ac1n?Ju69V$Hx<($K;{7bYI13!(K3eX|$VdcXU|m{A1)Ch4*?AC+#iGEEg90bM zH{lvonOJ8_lJl;_R6Z3glMHY-`2McBJVp_b!EY~^`h z)Iu$vjFw5`o*&$y=b;gpXlMo$6^{n`vEkk;Bn7Ejtm5Ftgl^y-<=#LMp z!pe6H4O4}s9G@Qk$r%(PjASO|jG{$QFGM6s-$@S9je7kM5?i?h*}@;4*-6^1hro=r z^oRMC!M^65QZMypEw(pUe#8{?kb-w^fjyO03*vM~n${U~Z_?s){pBsx&D(e*fGvx; z9cdoI@2m%DuBM`+DE1&l&^GgD1qaYdHx^b+Y5mg2fxWM2SMLyDu6p6 zn1MeD9li~@0ZJ($T5EnNOph1}k$Mm0y*ylBwGM_W>@4@CDcFbx3;Oa-H;HK{=kM!= z&~&BpLWFTI1>6sG$HJGigPUwNB~i`uUCN7J6GTj?$z~OZC*5ST3hV&|AH2zC6~L>A zLU5B!D4>e5?->t!CVLF;UD`dIaFb0a3e#E*fWtLVlT9d?n#HCB3t_!& zpgSufUJy2{$tHBu^j7$0!W6W4SK&=Ip#W+4Uk(v)1UIUz2sE)eC)Z>%2<%~kl;9?t zAz)|WOJJMH5L;)_XULBsm>4K$A@< z@T$q>*<=&Csb=BGjM0LHcdIwqgu z1I|Yed9>NADj_mEMUC?lHQ088LBY1-99&h{uc(Wj8mhBVCy7OC8-s z^jW#hX0hJWf`q z?UXi~U?lpr*#vKsReH7tNvWr-ct-2DRV_G4;f$uuCKM~}^hME9a-zcoQ{inkL%>eY zBlQjm&}K6PU}`KB!>Spe0F1cJCKMbKk>xK+A-l@v47|3I{bL6vXpHk+QI z3E5T$wb?v!;`m70Y>w?bGy-$tm`9sUPl}Y0&I(DTM@C+5nF2GwHk;!DmAimhhGxJv zo6s|??%+0?(6dmLXBTFiM!;=0JwfrOVsM*HPY6kZ*^X?p`R}1^HqGZ(DpT(>)C|Mg zY<9Y9V{fu)KA7U>3L0hgXtL=HqIjZI^f!1k*>nezKO-sw32w6K0HhW?fHm1Pub*-W z*Gj-1PUa;I^eHxgb>DN|Kz1^ZY75DsJfS9=4(MR9W^k;sG}H&~UI~CUm~ilDvIzk* zoOl2?*>nO^6A+_KY|Pt_BV=<%*J2A;|4S$I<%5c&+a$O&0XNw+qeQc$?@Dqm{hDl= z*H^TIEVg0YjvN-}q{7}>0h?@^x7To&RPr!6?BJFR)MV2Mw6wS+A@@l%*#tlsrhX0F zWYZl&R;32(P3gXVc1N6)gBWNAG8G$)>>$onW#A^8PT1tZL0HQ+r?pcd>Ct4rFo zFmRJir_E3LhTwKYlTGjug&pc3uczmV<7mN~Y{HMj?Nz7aRBy6rhEP}eo=rB*i)+G6 zCRktga-X7+&=zo4&AR5x1iYhv7{&%><;P!%#iPVw z6RgRm=f>RXWG^&(Gz{Eivk;^t^wDY$TN|DBU>K&a-0wr1YytqBcqqf8#U|i*lt3ra zViN#nmA-P|7Mo_c@-8=tWhdwD1Gd;SpUquNVPK2R!u?cHP;$piPR-7Zuf^s==$V-U zT`d`BroY8E=RQsW5>I5w+@`$9^yv7nX6(@0uId0atj0Jh9#VWa}62hA=75I>H8w|T+4k>T&%T+?bbnn zw65y0`hXiqhd>}zzMacXc!G80alE5XHqecQcNAZd-4)KWmh3@!QQ;!<*+p}igV{Lu6{*#eYLmN zxwDh}bAG)`bSNWJyTFcQfjzAX?CGrW^3qIuf8t!~p2J=AY;~9APO7EnGX=gY6~u*O znU(7C(u|CE5)EnGFrKD6;~UhUr^gmI_gwX-3b_2Ygz7H96aJn^KfJPbyjS@nzDfDx zJl$FB`TX29J_}vDm~^_XFYZ-Mo$Jw+>9Ja!F1cEA5Ak%o>lG_^zvwvrs|ekgH`*Rr zAD+KI8kIz$nIIsL^F)_6UTN~@?fbLfAZ1ZAT@e?L~#ipxEa}Vi(_-drl7GtI#tv5b^tS_S%AKufcYg&9$R~FlZ^S zBTOybR9l#LG}RQ&ZxEwtS9;U2)^a^(qbc+e`x^sBLzXZko5v_^$Li#%`OvJ7=32 zL4w(4-nWvo$&A1RwaM7s{6Sr}$+W#~HW~S~0-H=*q|7EW{<>t70fnJvk{MSwn`AQqE-0AM|-R7 zGp&tY@51(0YuG-s(V2T`PN^P23z||jT0GkC%w31#&Gx0%najh@ptaTMr;rdQ&)VGc z(e>0@l=t<-#L*+n60*p?!S>m+>z7)@_q4v+9`^dlB|PUji^PGHTz6t# zz4{gRee1W+Jqum6J?OO5pVprj;U80=mcKPYupC#vfwAotgoNW{DSY~kH#fOVFo-g|0 z+$?GkpCNG(PR}7UwL&gEbr(9>ZLiF^fscay%jOvmc?a`RRXSMA9Qn~z;$S9}raPFA zQrBzdEC)K6DS(3K?DrCROJXG?|WEB+PL&e2iX`x?>Gg$*C=!4}LeX#tG20EY` ze|*>MT12*(=BXsVCtJnEKMle~IXhLec6Um%=a-<}oeg6DoFO6P)${S8<$0u;=|@@_ za_PTP9JkK4laG!aJ9xs@A>ekk7xTg8ThR-(%QG#UB@P`scpQ_r`3tlU823rHZA$xb z_)IW=Y0KeFgioh)NtZk4I+yO=-q^UeJzPES>U~ut+%$=4QXkASm#(2tg!)pW{h~8V zyV`&B#QVZ}D?Xznj4(&R8UWuS3&Y?cuP~@5aO@dF$M3wqEzZ+8bVQ z>l}Wy?14KjX}TLtdy3sSMhmvZmvpDrF;$fn?;&fhcbBBIhw1)q%8~d5JGc%={sx}YBVF1BxI0>;6?H}-yV<{ zMQcD@2dn2>o1OkSlG^dS$QG8L+mCRo-)WQP1Ko|wY;_B20diDVFx{A`b@Almzp*{|37x2T_@Mp<}cHTAHGq&UTvg= zZh#!pfBr)4bIm|W^*ldSZZ(aTazED&oBR0*CZjSg(SP35q1D`eO%2-I_a*Q(OWbwgNXE-FSuNGKyB@x;cmEc9 z?G~^0wOi3t^4r-2dfa<>X?x?sgX_d-3y=loWLU+GcfM&+nnHho7r98@{9sV;{F{<$G|F`%{6z%?Ec_Gt|MG z4pM0D;nO6GHW6?v;?SRGf1^aw?%%>M%Kz@EF3I3+Z;*(S_8Iy0Tl2q8NJ&}z&Q2P+ zA)k}qKW6y-ruzE~Mk%aEK70-TP=UCAYHg)=I?aGGuVVcL@nOO0*~%-uQ)`yhZNDJ? zo~(Yt0{eqWT<$bMjJi1gYx3#yAEvoHr&s&yTSJB$Rp_R61Aal_uaaBIB%jkSHzB{w zY@%%CyDVU2a+WAv65ey5*(ajHbzGC)tMK+m#smUf6r2r$n{tWy<{%iTs9QcdHXz^^ zaX!RF5d4hdDiXBw+Eu~_)M%~35%8<<1!4?WVF7I;8`I8ZxGe z9{f*=^Wg3)N*%0{M5jAwnbM)sTz8Y_f&yB|=nxaBiZ;-E@rN{za&8mdiL8IGd6D(+ z|Nj;X(C)w(3&_RxG#qED_dvPlUndxC9sS4JRm~khH?-QTYpt`}-PN=_dzJR%&r){N zprEmu?Z9);?sZ<2eIl0X?@kC;|MSqbEwbW(MB~KrolC>`8S&l=ceT%T`pes-u6wgX zs@nEu;Y3zbz6YT+@i?kmj zk5|NF+Nb&B5nAy$QmM@rk7U*6zlhK){J|}VxWuDbw)td)?hkB@#-SHX>DmiOI4hqW z&pypAI%3+XoNoO-Ykn$1-)7h_c?tN3apLexHh(ul=RE<1-}cycYWC4F^Qp>j-1kH4 zojZit>>*|IomX1Ydgl(S2D}0!hhtOkeymN;Sn-8MrvnV19dTG%|_SYo4!~IvA zuR$-&ty>V_j6uKMd>Fkbw>l9`?C;Xhr5q29VZYwoLPyzJ?D+kbOZ+tU{I2=45qdS- zas-jrc$AA5059UR>g8~(+I~U&J)t`b@ZxtWEZ!WV<7UM3_^`S<|7!x6_m|BT#Cl1T zMx0~k-)z1T%@xJ535%Reo%HGRHwOG}>B@>Qd>*(C)#=#il0?mst%)pI+F+4X)9K%Ig z(3+bS`+b%;shsyC+3WYy7bJC^}Jo zpZrt)AK7c%|5NC`%H_nMeU(q4`zjX%+gJIt`Sl3BKHr&BQc&918|f!Ol8WPr?%w?I zI{H8~`t!r})sBR!`M*TyOl549YpF5p(R`wg-UvAg5iy~ywh8aw{9GM<2t@q8IDnJ? z4uz}v>k(QDKsDtoFqU25Okg$#tHj=6Ob~p34<_)0VdP9OF1X-KV1_I-6L{{@yi}=S zXoY5@iP2ZoU$L<7X6*lI^Pg(dR@i%pn(ndMXifWR^Tk?^V?7%=R>xB4KW@HEYX@h{ zR*uz{amL@tL!zZL>yT(a&VR3^(dyr8KhA%z<=N`rYd_9?ucu6F-|Iilf6r`tc9H5$ z=-pTH-)jic_t$=$|6W6o{=N3&{P!Ay^zXGF=jd2JzDmd1PjkEL-Cwlb^&jWI*EZ0< z*M6Mi17pUx#s|jV$*-g#I(rqX9JOHjo#x%>n-sCE-FUW8`LE<|M%zr2FxpRZUu*ZS zeXad;@wS;-d;;0K*pX===o-=ri}b@9Y;{)G&#rgYTHW?$CvL>irNtX&>hX2R($49? zu9-Ja@7qKA)a)CyA0;cCT_>Gy$+wFK<7X#L&N^qeH+a98&e|RAjg3~5jOe)D_QQqa z^#eDftCQ8%TAO4(%tmXIbfszaw&EFdMb^J&?!_dbz9s+4I%&#~{K_ryb8J5%&6tzk zH#nKN_BeV5IqsuL^Do-?Io?1AP;@E2k!-F0q;+ZW;Jyf_UC`q>6kU#QLDr)k62FUa zHskFqX*D)a*PP$#cSuL?;o?^?`ils~WK`Uh7q?oErX9)CcGPGuLHF#V?f!bwgnNLV zMTU`GJxu!YB!4FDso4*%pP7oU?RU;?Z;-!wtesXZZ1jj5Z$OsV70+Ji^xK10duttC zIdesf2J7d#?cp}*S%&t^?2Ttyt<~fzT4-+O%J`ep|895JNKZ5JJKa|DBT}%imd>hc zZ;)B7&Rc}Dy!hOrd?Exs6kX~UtH52WN&}-2?(gAM| zsc_&eG|)9OSH=5UtE8>ku)|xbp=Zp*@owq&(6uvH$5)Z92g80(v|d}Tz4n=RY!8OL z&0DjMdM|4a&Zq6m(f$KBp=T1rtzJkGx3NALwl4PDTcjyFg(k#re5H<_Ju?$OD=}tG zw}i+T#w#}3mplCd+C78f>CF!5&apZ`H_z;jpPl}I9NKh=SIz8+_h!Gqz6n4Y>fIOK zCxkG*nGn$dorv-Tbl?UeXwG%I9fE>P;PlSCwzE2<7xF@M^~^P~&Y1_UMSD4w5m`XG zSEa;sQ^{%}u6G1$BuCUSbJ-9I;o_kCYuFS_EjQ-jXNS=4wfk!yR= zG?5+Y4@sZGm<+cff4p!pXt{B-du|9tHfoIOH6Meof(^4*vxCMxNtH3 ztB}{0UfQoki9?fURzZg;)g3!_sQA1yhnx7}LoD`TPWtqTz_{a`~`wLO? zb7W+x0yovw#3m$AA33-Kq0ZR$IWp8j(NJ337wq;@WlB#K%i+)%Im0 zzP*%=Z;Tt!GoNMIx)FazxkSA!u1DA68=q`oWRwBvS+4uB2ARy9819*fxXeUE{Gd(P zRa|!+IT6)T3jKj68#iZ|XMkR!fO1)Ofc+$Y1TqFTl$Jf^g3RYW+4v?zh6<4pkO@Zj Zy{o<#H4c()zD(?<3Ty*r%~V78{|D}OeYyYu delta 657759 zcmeFa33wD$)<0}jbtj#QWa%v3U7dtP21vrbNdlye}BuwyuC#2?8_x1%^-2H+XSvu(@OSgoY-6XPiATc45iPnbW6LEG#*7u2taU8~l^w zZKntk`jeH+8xkwcj8uKPEh~i|w!Ero#cCW6+Ci&nd2Q{w{nsUK;+nr?`NT!lHBC5R z)iZFk*5mI+Ydjy@P`j~WU3JZ>rqzx17(!^OU0YpK(b!bg(1e6xe2hYe1a0LYpAWOZfIIljir!|oU7KM7IbEekieg;5ouw9jZe}jhWr@ORNb(C zO-A{s8is8otEFNksom=2HA3U+s=Dedp8lyIkwOkXOx-i9t7=xRtG1_H z&7@jBh_)tL7(vTN3nHtvy4g@P-AP#juPag6T@#~tlgx54WY`iz&0SdCSlw{`&`q-9 zva8v!zC!Ipqn#5*@KM3mH4ojqAKALC3?CnA9Zv6xwWNCGunAUaP1FtG5;B6=q`^j; z4pM|xWEwlA%xgjEP4t(`_ITpW3qUQ#TvD)YEyMXBcEu&V}SmySYO@Lux3Rg zKitCme>*P2|K_+coYN8uB@fOKpy$Ck&e&MX$<}Bk+5U{&-3%$zSFr!!__gGxSC;qZ zd=fZFLlBwJ;Xye{auW#*(_oA1ow?q1~`3-M|zi zyT4^8&xCrj!X!JfG}?*V7~Tn0|6;P0a-(Uv!ZN6uFHSVc=@@y)#HE?=7)b|aDm#W5 z>EBa4inT9;Lr*gWCV99*Pd5u~8=RogXaV+$o!lVZt z94Ag^m=B@qwIqi>;n;A0*BzT!xd2>OC)i1t6NUS=NGRsmV(uh;v?M%CqoH_$xGI>D z1TtCSkzmHv!3ZodlM@~_Lo4IS0MX1O`^$PPfmM0p0+y8}O1{36NrJxRf(f!7N}L2= zN#f0{>;~6EiEd7~jDk0nNk*aMyD`ZfbKt*p5;&YNH7a;bNn^Xo6Bqiv5CDE z>YkQenCR%JsY)W~E@0B2bDZFVzQxXSpfAHNL)k*-nb0jW_e8%G%U{RwrO@7H#ZBgc z){4|I89q5*w$}1%mAl%x_^rXahkEtEG`(*zg)yOE{b(lDF^iuzNa{n^vyx*DPp&d} zHw-V#e`J;0F_WJfITqUEoT6zr!%qq}(BHdys!5(=AdEH(eJo!ROakqeIX>HoHQwL; z`($?VGA-+#yX~_~@>E@6iKTOLO_#C!R4q;YI;Mb`qXnh$%xNZhx-r3cXO^ECv{#2l zFcWYa2gkg3oxB+m+{{_ckMaCxET6o-s;*)qxoT99yF-PPFBf{qxfY^_eyyvmt;1v+ z@WR+&=d3w=b|_B&>w-1w@#7l0XJA?fpAt$@x2|eMbM@-lbt`E(PTppWQ={-iO|hQB z=Z7Lgze0_zsHkYDUb&%WC0_n3NXcq$ap=s=N>>NV{j;i;?J49^8fxvDm3UQJ)3nLX z3+M6)NYC3CL&iLB9$xg|Xm-MQ$aKdfFJ@({8m-0VZ4x%~aWsoYvzkagA#6m|ehUs` zVko&GJ_#znwK|&Rgz%CCV8Sb`kksOjy99(2oc^3>a#v+VSd)?DST?YWc%WTG7h)b= zhbK$dDS1$Mtent0(vQ6QtNqr#EPa?(c0sgcVQYU!*f>HY1M z$tiYScCA{Fa=B6YalNN1B=66U$!?#c7Fl z=zJ(X+aeWs#C+>{$Wff<7zb0X@f5-E<+i^t9Z>RKd^WT^iW6Vgm50}(BIu1x7)2?5 z@naL7@hlw5lg2^Y^YJP4qIAm&+f(EkrBPYoTX5CdI_N3S%B8^Ms_F591otfxUZ&@W z`D+{B6$SO%9lN1yX;w5>=lw>$%IHsL!OF)-i@LR z;vA^~#1ii$5NAneK=+5@+yMS^GMs!n6H3AgzlQn?MK?{~G0{1h{Md~jp_Yf@1ZeAw zTL_h3r4|7*$?2md`P){eL+5t(2dHD6bJ%@J5Z@=|Swy^RT1)U~?|nNj2kQEywkTP| z?J4==Z_4v0d>;)(N2GB~4@~IGyNQ)$$m`3KS>bUKmUmt=0hU$I$y4bPM{Wtrj^tg! z%i=_FZ04j)%usQJWcVbI`Hr-UVPz3o-^t5n<#FJ8M;gZp|AeYDq(VshJC2k*9;CCR z@vQI>)V`bdJMuNJdp9qS6S^6H?TvX*yv&*CFW#L3ZCBZfS$QlH$NGoebO37ZaU_EH zj+734?@Qa+JFIZ1%GY4YFTii=i^yrVR{Ne0Ty?up%P`-9lpx6+D;$ODlBn@#?wStb z49{3jc))ld^7$%+Xn-=uy3C4FUqR?LptAOg7OD)r*ZlD-oU;q-5)aSH7rzJ?VhFF0cX?Sc>j9| zj#PTDW@Sp4O)KB%YgfawI9YguB$y4EJTse6ndRQuobY-S99ok+I?#QAuOIJrr8Lx0 z=}lwaS6GmiHg_syR;Hc|$Ev-(8V^FqtniG&gJixXr$E91u?p%|d6#1^gPe#BFdedh zSFqRzaRy`_67nFS%A4%(UNVtvQ=}FHaw!t@yeZoPeXG6g40|{pKO<~~$t$}(f!3S7 zZ!zpk3{-V`H?s0s_++TuX^n=gWM}Dck5pj&6T|XPAZF@WkN0f}P>d{CvDTo;OqRqIG0xmL=MHQfb-+nPVczwP8{V1em}UQ2Gw0t^mCLp=1I7*7es7NrkATaDi)90d*vm5eiB5b{go%gt zvFs?5+!)q7I;pRl_(ntHAn8hW-hZIa4Z-`o7sv{NcT#P|{=R!MP4b5D8duCrEj4X3 z@f*S#@_XB<%tc1ppObBK*}AZz_iwf@GsznxeN~W<9TDQq0*AGlO z$(i*Pb0WLuNQG?%bBUoQxa~>%O{VvluyKbKkK2mFHW*AD>s;pVZW=tzkvY~Idm)*90hVw5EOpig-86XBec$-&dWTk58#!FW6kv^rZa zic20)5LS4pzF|k6cZh!R*!YyvU|EHw`Lrx)ldh~i;~aKlStO%bxIc>5dJV2jdk*xm zVod4~LmZka!VNPEwC3UviT>g;UPmGw_jk9&8c7o&?*ln5R1RGgj?l~*rd$YBfGwVA z8*27-Mc)0AP-v1%LY<>is^j|$DBlkYKK6vSBvcAz_ltvj7$r{SwmEuszW^w^|3rx0 z$0e<2_Y2_YN3u60F(?2E1PJ=>=0u)+|=Y&wb{?=|3-Gzi0B*Ew*BnG$@ z^%4VI-0S3vOqVjD!Jso8TJBK73YSOki{-E4R8a=(Ts&c{QxfF@>so$Qgw+6h${FN% zZ}AKZen}5)x7ku>@THLwAN4SDYGj!YU|e3uHH=)lT?!bvW{%C@CvJRF9lWr>xF|K%5lM#g*VmT{y_>`M5i?cGtbo4Ns9lrLpf#v z1;$i5M1r|c>|$b>SxV*ZuLL)}S81z&rm<)3z$}p(FZJ2-6yZ+_>}MS>hY8SpssPO+ zi-QW#d`1D9j~<$X3ebEoqyWt~qyWt~K!D~87oZV>QGkY-1{a`(H{K{f^Qqe*BtY{i zJ4z=&!~W`bln=rMXf(l40yG>F{dT}61qEoPD^BKb(mhf1KaiWk=H~|v3AUx$3k6>A zy}|1`E9f`_%4HpUK>Sk}W1v1x1Q~-%2k-=;OF!VH|JII?(rWfdER+wIrg0u*y(`al zpNdSCzv}YwQ0J23pmUua1pt$wcfNqH3Y(;OLNT$zn;_MU9|b)oF%|mP*^^-DGWQEA zpI=Iutk%m>WKii!NQcVZOaUnk85&@6NRzcV6bATRSLA_sfn@=6`3_ zZYl*jX5s!?dvRvIoalzp~jWjPH;xew3`F2{c630m(yMQ z)$)hB_UpT1WK#7pw3FJ!S}iuxwO@@2zxD?kqQCa5G~=~jC5B)7L-~!@euZwl_N!^J zb%txdmUO6VzrN34xb~~1;`~kZIj%~J`Z4&eIJ%NggY-?HeYZiK%Z5xT`&blPX-!3SfPx;%Kz(mK- zWaSHJ8j~ozK~ul2QZC?xPlDMWoB(Zc4l7iSjIlxHBh08^t|(d9VnJETzVTV-K*B7C z6L$FViqv+1IW5q3sckQ-h+0Urzs!@w_L>4ESJ>V_v1=pXk4Aj%H$l~Y`*+~nYHP=v zUb|_M4f^x#=a}(HY$pdt|KLf5&TY2S@TnvgcKiwp$Iw}d47k=1Z3^^UW!u0;A5Q0Y zh2$z;B3H>x^NE8>Rd9y&QWXr67xwdbB2XRpgdU#S-@7%*v6^2wL}E=E;|-U_3@T9Z z8U-reaDfWO4-}|SqEVpYg$M!_g@^)`mXILC3sj&|99$&%rCz#7@R0hn2UZA3khC!gBblf0Np`?kn zq2}5dl&pkJA1=_KY=t&{BJ7&w3kgF8G_Lg}uf{2(@`o~~I*E!mf<$FNAw+>flWgDs zg-KMfJ4As(CsDx?^!y*rvq7SQS~XM$BP3Cw8H^GYZk*GYH%|9A?Z_%?*_})^2FN|Jsh+C53_BQB+9e!b2 zbo+aju2G-;JK^BRqK6Rl`WGZcy`p}h6#?SY;xst?h(q?5EjbUwEM`ll#QSf9lsdGf8N^9!M*o%M8F zMn6BO1&q)FW#x@L@HEP_zSe3 zlB5*Sx07weR_uE##||xaD-V5V*i)hRHr54|?}>J(U_Cn_^8;~p^q1NEbHO7PZv84R zHT0gHCb2L$7ULVXj{f82RL0DD=FaIJTLlKyKl6|n3ZT(u%$+tqe!ydME5jx?Pjv9R2HfQ6kX*Mo{CPv*wabC4DOL6nKgU~QTE&+1FTG|hrR$sEU| zz-Q^U@g$cbpEtZ25Gt`~I9Bdn$gnRIK-X~F4pV_B7s9p6Ss!%Y<9;4?tY8ZQZP}i; zS@t&^9708Rs2pdj0P&B^rL4RYx>vDy z=~en96((7DNtXsHzwkCd*-dfzknj#`HYW85yN5yImtNYQrGdIT+?Sa-c^ea=5p{Jq za!cF|frB2;-9#si>a3$C;5w+=mdcwxHlfZsv(LR<`9}5RqMn<0x9u!wOGSN2?9?Lq zX~T?EkDX>L=4`Q?aD*c&@;e~@e5LnG6~>$D%3n>@+ymVn+r8{ys?@TS@B4p7m6|km zFlFfDt5Oe@`?#vqLuLL&mD-?5|BEX1e@2y>q!vl>Ni{@vyvx^;aE5rReGSXF4nV3wpN*(@{T1p-e-q->(R1Uob2SU(zH*Q*^@4 zFN##U$s=471&MFrIW2aIIeuahbn#YH?If?V3fabtWrbeoTP4nevTeeXzngUa*;|R zxBdOS-|S_gUykLk=Ts9C_|rG2(^$9GEePbWifo4iz2BflvR++d-#MOC2im_4qLqQ^ zv!U(IytvfJwm77~Z0LH5Nl1;XR7Dbq(Ws8Cnd89nujNscg$XIMP#Wo%&L#)`Sw5*C zIg&w6#9r8f>NQIFgvZgeGm?QlZPJ90Jq}4S-e39kFx4Q3gng<)M^J)9(+CyPU=}%~ z5t3?-L(?jjQQxQYdxBD1u0j%lnd!~RaC@XdW(18NL@K!DgW@?7M#-%(nB-PX?+v97 z7sn2&92cRgqpNI5LgdM(O`{5N#Z;I;x;JFO@?boscOZw z8VV&+TN-zn{O_!4>_&wCRyKbqD4C!= z3u)VvH*yzR>E&BrV)(<67)-LZ!Zm1g2ZcV0h$+zc>ViSquTM$@6BE0C7R2 zBJd&nMh_oN-6+ko_Ya{XpO~d9NO!#al3ija( zPt~#cQv&}th93^CZ=!|K!8N`pi!a|RTSp+tWfs$75DEnEZ`phn4JrTzZq$$;!;hqt zxK&k6s}V=Ust{4CE@i&!AhH~#HM$#T^Ek;h+>k>lG{_@2I*Md1nA?L;(+B+aRb9{ zWufG9aRxE7Lnfu<-6Xre|JP%oGM0&Eg&x1_lJWk!dy}DUv@}y6-$mnJ)#Cf-38(7f zJ5DCqU(=#{YNQ3aXn*lxjD7)4RwbqQe#Sl?`nECA0c=_aGF#NPHJ4P)3V)-@ul}+- zQ~jCu^r>2}xsVXgq;kSRR#9(liyEt{z9PL@(|RRj0>W?%+T)q-plYpO+#642c7gH) zrk7#Anc#1~&kG4}OelcPw;8mHE%3l+I}jS7b2tO=A!^45I+K|BEYlAqE18YZ9qnsn z<&Dt(W!$WtU*@sGUn!mPn+nxm_b}RoZs%wc5Esg4!{HT7T`-eBp&g^QsnLBq?RmJX z#zXg)qicdmfKWN%eI63)n0m^I_Ea+$nOM1wQ0j;!XaFriUqc-gYVz5@3CB37|D<%5 zVjGyixFx9DD-=V*Ey5|#_k)A*q0|br>s&^)0u^>}Xj>{lv5%PwnVo{{Pw1JV$j*q- zDUFyEv=x;*p0<@j@pHDv16?DT$qaj^722M#c~MoFO@+FJjw}jYVZjCN{x7g;jeaqm zzrmydFrf0{a&~Nn&y5dSgBdP`t1PDh=hssyKsM!23so1dFV&Kgu zq1wkmE!R{ufRWv7h3zY}?%1_1bV1dt3(DA&u2Ks%DsraMOjG`^&Y5q}GrZ4h) zI6*-|xGyl_Q}Htm_26~{JP07*!7_Y8SI~AS&_U&cqm}1%3Uq))HW7>iJenPdqR@Sc z{f_AOV|l#4>Ud*B+Zj7N--qJAFmKdaNXIHFGNsx4^uf{-dm&*iKXZ_HVlXt6 zoQOj1+{_qRYQ)?LXR^&g1X;p~c7lji5Shq3KmssOny}?~(gekRXn^S8M+*TI44&xM z68Wb>2Ejg^nM~GWuHsCePb?gQ%lGNob7UZH48dzA~iKN$QXoCHqC_=?ro&qvvYA%%BWt&t zD#e5YnYHXkW8Olq_ZJ*99gf*`S$u~X%Co22K-|SdgZNQNo>`LfrNTgMrDr_S#vObPg2eVr0T@6jqz67HeIm(^s8IpIzg+Ixf^LcqUBcrhAEwvEkz z?)4s#UX&l{6~=O`JYOLvjCbHg`X(+=wZ=0KZ_5h+e=OjH&skvJ6ZS)~IV~m!6P>^4zoa^1AD(tL{w9fDuX}_;v3a65{(=;0T688 z%^-V@_*KK9_a%1@;shcE&2b4gj)dU~r;VA1v(_c?TOoGJM@f&RVro2h2;qF{TVfDZ@MfD6I`4AC!<4Nt@zBON3OG4WjqIvr60BLP z`0>Ur0CSox(?8{=IGDUOCIK+jG-!KY%7U7u(h7rFF?|s1a5(HvpXhTB^86I>DeadB z!T;cc;1}8avmp~Xx9(z~n8=BRz9E#q-TI3GQFGJo1cn%LCvXm?qu5wsNK2&u;|D0J z4XUOXmRqN($X2)`TGOi36MqH>*|mnU>U9*giaz)1G!%7Iy?$bltUUqzH0?w~F*@Bu zjXso(ZTNUco;AIGVzAiIn}7zvql}3`H!+x+^s(F)`Qa$M4W-9bP7Ic6R80(0hlJS) zuWX18YxcHkzXmENYBd^F6E(63W64AT3NCF-Rsi;32Mz zhS8wU0hiF{fME78ZA6W%(?!&1K}|&VTa-e+9+IVvMFd#U6F@QKLXPS8m%lAT@h)My zCVM=3nqwmh9)l4G-ADENHUdVRZ<0{B7;s%LSn%5K*JF-8(%{e5Rv|iWx}=Ff=X9qL_{3Rd^){uK_^d_yw- zcNQuyOC1+O!~q2q9PsGd3_gZ}p!Gko+mGX-yFiT8RD>R_=upDBdaWs(=V-eE+9 z3Ow=-L!knXE^#9A-=9gCLIt8m!br?kK0nJz5CdD^Wia|-kj`{A#}sOKfk>9jZs7-x zhxWzp90cTb*x-k^nRJ3qNE;9Z8SgP&N&`}$`wVwIHsIc)?rcsTM>CCMsHlRX3dX~+ zw-Jmtn0KKjzW4|-m%1s&Adz3NLN_oUpnP0bq#c0rj2>9^A@g$bOBViWmLF%hNkI8k zF+vKWbbHA77^6xOWqMDFgYu^s8pJw%OvL-G8OMh zi6MyFxw?WfpFvHkA6B~JftK5Hu^^k|35FyD$}lmjI_!=}YR`o4e_-Nt*~^|_Cd0C0 z%=PA;c>bUXN*8&-({h9Nmec=Ax!mxzY5d2Mf?It+~>(5 z>T6LTE^)>X#)GWU-oFY3aOpD13dPv=AgW~?l)Wyb<9gk**Mr)!uM4QqCPVG(0$sF7 ztc0G^vJq#J5(&8FLrT)NBlymwf8(G)nYX+p&_&$&mOvMA|NS1ih}+|FCFdo|*QL%6e^WzMIDAt(Iy);( z`5&(GL}kOl;@ zyeu42;^|RJum;PtIFInM1&%yil+v*rl@akpG?4IVUI#LxXKGaXr1fo{Ezo~Ca~_`0 zXM+Un*_`le4oY$-r9#4$o<-2|iDM-kK2Ii?_srj2h$1W5W^%$GSvV4ho3-m>$5eV$ z-m_M|j+K{$sDUZ#l3C z1Rrl5_lXA(KQ9P>?lxedb3!|2e<*P>oZS_|Sto~c{T_C>2D84#fUr)~pKjj`C%4)oa zYjndsT%#I+DipGI5C7?ym%4%sn3pPjsGGQ9%nbaKKE`+x*Scf06JjgW`iy8dp~el0 zd8x08pwX0`5Kx8Mj4<#UwYs6eZ^Ek!UB>k>w9ndQTrD=zWn7I4zl;YPq8GHPG~;Dl zC5B(dL-~zB6$;&W8CTO{>vXn3!TC7OWnAB9BlwM4YB=VlN;X`^Rho7grz!!BXnRwb zuV@0)O_Z;o`sRU8MEO$G1i*`TND-jkEvuLDjfxV0zx)8Xgm34_5B!Xv--wNrCga6? zfB6A=FGm7i%irhyu21O$|Ng#r==(l~>GM7Ta+U!x@a6{ki{!I{5B-!>OkVr1Z+Fwn zwVNa=2-?PwCw{c)M2P4DCYKAo@V9v7LR7$hP`Ou2poUG_<9?uzahn*xmwhi(&Jrj4 z+a7;D45PxWV1N4DzQRGD(2?uYqf}sUD3pru)I*|FD2X+c3U|0#^q?peZX-&Co2tC( zU_UW_AW8)#8c{0Tkx(iWq7kLSeSDM(_W+a%T96T?!hK>W7488j6-q_}N(K5Y85;I; zz+C82DwNSMpj0RwH=tBd(qJeRO8MFodf4>oP%3ES!%!*)G%gIKLYY$?N`*TDO2vRe z3@8;iKw&5q*qtzx3M@g7Qi1bqK&fyKK&hY^j3^cEFq8^+I7$UcFceA!ZbLmv1x`&E zN`*4j8cKzmqExUSq(H0Fv(1$6EARx$=1Y&Vrh8d*Qm_YXt<+q@EMLi}VPdMm34bsv z#(UkZj>I%SnMb<&wd?w(C6gs3`q0r+d1JqbKuAl zVIj-O?F`_rc24+|Bc-^Y?jO!okhuyi#)Z|=BY0Ha-0K{nP>EGw;M%i=0}Okc9d@ko z<(oW`BnLiYy$uZWDM;_3Po6TL_cl@MWSe!xoGBchpcHDw`aRj#zJ# zYNS7$B&Sf5CTeIOsB7?D$e0e;`TL=LjV}{wc`?OQDEoYYJ!SUI+F%u*W;YHNA%q4C zLs^P9EcA|&qIH{)+2DZH{ou}mwipJnoYYYv6gD_sq(Bw9UyUXdG|B2RL;LN>0wAaW zGMAhunvUP*IB^OcKP}GRe`iz#2!ihu!XOB=futY?h(WLrY73-H=wv)rDx3%orUpq6 z983-M00%T%X-}UOZNC(MQBnxGAb`jP%Ng_Y**u!OmP|peuCvI#6j@R)K3hG9EUCE3 z{tQf-E?WYpPIX+vuwS5)j~R{)LnC0FPt)K->1#@AsN)emOIFE}@IEDfrc%!5gfF5A z@>B}+$Jx%L%;>mTj#y+yDIk?X=7eWVFy#l~q5w8&3Ena4NvNI`zJu0%xV5?-_P!0# zr#g11P*})&KI~m)7Ovs=wf-ZMSK&z!3&R#T?lQ^iHHs-9U2I>^nh(YD*K+=n+j9MH zUKmH-9HTim-l$xoqzM6W8o=16&v}+2wFkSKT0RcTyQ4bR$dD5V-`Nwye@o5DP>%mV|>GNG7Zl?C=U|?^Ux72QgC`LEmkl?NJn^(IBzm zNI9XY81%hH1^pN4F!!1iuznF5udtmpux%9mbRd~FIjCeaLg(v1^|>Gd<@YXAoh^vq z-)}!#=>g&HAZ@FnpECjsdO0F7*+717C&#ZRPaY!S;|SaxRpz1fAO}|)ibPC@&za*c zuRTS=Vx@9q*7hpD2!96Kwy8@_b4L);zW6|_!A{J+ve-&Y9$h#51GJisc{?GI1FLXGiyf>i$)kdR;T2D}f+Vf4`?2aDC^&#o$ zD*IGG=_y_e z_@+T)fJoZ23VFb$QBx1KX$-Xu+%)>=@J*wZ9=>T*a`>hRwne{bR9g6^2_+qB)99OK zl)kF@HSO7GBbK;Fw+0kNDcLOzp(y3iuK|Og-w;Ele+ai^hO|Ud|0ADh4EYUDG@gi0 zG%EGPZ^$84sZdtq6OBeUJke-W;}eZS)^5;0{fS0bkl~3&r4RK)V;HkRXO67vkfSlJ zJK;|>YJJ8hno#2geWD3(#ECu8sLcp_qEV|G>WL=2y3iAiK8E&Ld!kW`jr2sLMuk7o z1RJ8?%_`0KM57YJpJ+n)jZZWRom}lhZpqZN;ZHPL(xLRF^nErS5^Aa8Pc$mo@I<51 zf=@ICgAB-8hR8dLheNc+NcTzk1%rN1K)Q_4Fd?oH*jeG$!q$6LF)W~)i zhIGd72v}QGAjmK~j8H__wGEsel;#(5`B$R!p0StLuG~c3MSK67;M^+sv(V|V>b$$Dx~8$V zp{k*wYSa00Lv_{43Wc(6O=HulYIILoy}p8^)}`BkZtbd8tkoqX4%3^en@LF(1oLeL zPxC15!F4&+8YErT>vL+{qA6C7tdOiBQtytN# zsjeD*sz;;g$B*l?u$|#Y3{hQ$G;s7solp+pIhM~Gy5s@F9cc!_51nSix%RWyc!fCF zEaXORd=xH9JW!$dqL?wwktQKUmVR`{k2?*rG7VNU-3vK(KCYs6Llacql#GvabWa>- zR@4HHJ1g>u?TevjMZeX5(y8#HXC+#h6-1x7C}#9eo0bSY7x4Ak9a;tpsTY(P_+31` zs$or4O;esiQPy#YepZv!7CEL#@P&#~vS}wBE-Go@;7=qU>xp8{Fg|)QarX>I&mB9i zIVY1(TvJoGp{YW7Rlz?sYpt>NW5ItITq0InA>m0_`$@9*r}U`_ku7R`57OzMI2sWqL>-No|KxDwYu);By%O$b`2;#3&8yd7)*-2e|Zyc1#HnJKBhxkF?fd~To%^MdIQ?1X07s`f|M9pNc7sSGbzS-6X9 z)m>ms(a*a^7962`%9u=479_6bL_T(5$;_G4r&TO0Id!fTS7pwy7JEI%QX#<0oGXu#d18~jBBKm005ur0$f)a!KJ zx~dh`t83S-tZqQ*eoDj$K@8Oyv0W3ZYgW_}_tOpZ6agkaMpzR0`yu|=4hSpx_)zs# zD_6qN>;&|wi+U2}a$;Cq-X>uaKg^KaYA#v1@^pEyuGtNVq2z}6B&ht>>d2Dg!wM2s z^NGg9M@w=MEfyP6B`1Z&;iB9`K*EeouaJVR$;6V>83_GaS6f?$PPjMJG*veUg0U{< z{zSBy#fD`L=rqpTdAwCi?r*P5wkB!8JRGtLY2t-Ym7h3bq@1ivnWxFpTN%n7DA!bf z`P$Uc*`a3Xe_gOt^*%9hatyo=EvvOTEZrEs^S&SFV6#t$ad(9v}#jeZ-Q~oYlRu` zhHoa-d#9usXomJZrO_A2AjmVi$*7C5so7?5GAfv1zWqT0>iOLs1tm9mOXw?P@l4+? z)C(vk6vS44onWiuL;o@lq5>|8C2rsGWAd522o4r_ZO}K>m*X!!&4r442(+%Gqu_vv z_AEQJ{oURQJLdW-iH2B^lFK40;L*80iVDcQYo8q0H_sPf*vn6buKUGlrb3@j3Ut0H zFVP%;{Es*Y53^&^zmid3az2kw{^gbImsc``x@9ZW#}`!}EjIl5EDTaWeL$fg!&gMo z6>O|9Jk*fq(GxOcQk(J1D_L+x2A~S4BQ!LsfMM|Q;U@U-p_TemUdi4};NM~ROkmQi zX_kCZlC7h77bKS3(_+ys8-?czvM?bi$if~(7S2KYZbC^2A`7D^UBMQ1?PN3jnRi$a zTe#{nG0jAvh5hAsQq6D*3QPj{UX6?cp)U{85GRzI~exOwrB^s@=3L{x%DMYl&()s)? zRIIWF`uh#}4n~xSi{g^?zJqB&SRsPv%?P$MWR*404{^}_1kqblyibJu5Es&n2CJ;X z<5^{ek16#$5%lM)jE2D~OX;}5DvOdPLf!{*$m_3CtRv`UB5aN|hrzVPgBf&%Hw|DgA`_&g%)%1%mRUI02Ft9%0hU=bgV8dpFw8Qm zFx)bWBpAvv3pb$NG7G0C%rZ-vZp|{QQ1KspAd&x_s)(JeGY%lYlIdb0Vzl)z{PU5% z*m@QH@TY!#Tb zAF5g9^Bkur%HE2~fl)Wz&nfm2dfjwIr9cIVRFu(wyn?xc=BPp>IAHj1M(0>W;`oo? zB<#COC?VjSsS3JH*(<4L_``>uH<(`$Zovkf%N-LG%vtIYYBKUB0p??motVB+-lP8` z8Le)Kb;@+lE{X(84O6CjrU7yo4ygP@?xyf|Lujy+q>1PVelVvY;TjSOnCLGGESfsa z|2qmS>~q=BQfqHO=Vs`{_Wz7w82gtr|K1Cyp`C){!`lS(p66J#zjAX^&>=xCbTvt6 zB2~mTvlYAZE?w=%iu3FikO4olbwF;pGc>oFE<;83OJkStUydmxAQ& z=+90`hYmcIbeTLeTcx6dyjKG~^94Kha57-^lhHFLN_Fz2anSaBe9HC3HbhsYeOCy? zw;eUdD}Hin8amgAgSuK98mE>5ldI+-UKYMVT<&;W&yV5@1bVf*jFpR^H#T7ur4Wna zzp2??4uw1so_a{+ z2_><{5qZKnqCt@-JVqYJ6VBsc{6HRu5{*2LClZgN5RJ$ap5r4=cm^O((1MJ}6P^%{ zGmu{j@i?9V{F0K_4S6DL`talm@>8_& zVaO8$8W)Bq<8PFy*7zF_$LzU?%u3fO!P) z?y)%3-6kGJ;oy^qCrR+{Oo%y%{=DMl=>+VM;KUKv4g_J2fHA}H1X%|#cL)$*u1>va z=K(>PJ3&-Aw0R#s1fZM|(JabTDCW!mlct^RBEL79KwVr#+!95Zyi#F7;QJzb8pl4! zL2;@5`k~+gIJtwNiO@uBmy(>~1%&95@C+BgVkRJ@hmy7fLD={}{ZxCiiIaCQfWLMS z2o3_gu{*G1mi+)G)o?ieZHj=yu?w2#+V8`!juDK56F%Vri0E++7NBB#1g@QLf0bok zg+1p;N$Baj{qhuNs<$w|@c$sL_ubk2V`kNDo?Zfw>?|P?fc#(Z0e-;;XhPMiu`D`0 z{skX^;4Tb;4`8`;+d}?!9|~(*Cp$*K@L~tLwk$$?L|`jS~@H3c|;#_hg|=%yRN4pRJ=b+|C?c~lOpvqzyx z3KXh*ADhjrrN1>_lu8*W_Y69yJaRufGFZ%|4+X7&^u^p-A2U*`N&}15r64q2G1?=M zAqn1RLNyV)TWYszNa8gnQGK2mlK6~CRIEHhl6+&5f(R8A7?Ys*mDtc4N>|pt^zvyNsK z_AuySvnq`n2{li!i%fF18syOXFw|e?91R~m!9Kvs_V-_Cd zc$pL+2aet9n~T=d9yLtmgGc;!FZ8TW$%f8*Mo(kq3NTO*f9rP$hS3Mcfki0tdT4%%L^ltmHM zW_cAMtm1?>5f=A#_H@#SM5uUy-NwpmLKFhNaGO5G1Q%CsND);b3rBD^4jpu!3Ozeg z9gy%M>!B4z(~4@t;-XE$2jS_XpyzrE!uI~wcQ%JeB*wy`%#v`QAxF?yZ=fx)t~+CB4I!8r5;w zhsy+4Qjo~uiY2T1bP#=$5PF_2aT>6qizEscak{@}?r`Y4H!cOn^!h$faU(P;cI;*@ zu;5AO2&{M$;Ezpa;R%+%1j=9WZG!%%oYT#63!@9;i4}~$1m4^kR~(AJgcZ7={z1tV z=zEELgz@}*(&qvUoQXqg3RHc=?#5~^0Q_+Qb)nk(oO7>r32!F$7uD7UrSmP(){{zS z0uvoSlatZQ1}11_g)ia77o3+v+rQbhoP0S0hhK1BhU0h}7r$dxFx%S}R04DQ*h zd{-*Vr}z!u0v4X@ao)js5rh3uz~X>yz0TWFVlNlS=#qt|<%A;~Ws=|+%k9(iNQhlW zHc$7drMb}enI$$b+{BH??X8}>gw6_IgXzeH{+Zd%hkVo>IUcrL6Ei)cw`Dnz$Eh=1KVPYusQs2dBGLy2>-oTp3&KJ*>KVy1O`=$pn0FX021kH_$AnDRI0 zY*zRaX`T;S-f}Kd+vp{MB(u=R@bk%MwG`bOPQ|ho1cR9`#>MKR%WiY&qw%D{=mQ*& z^M<*Vv*=8uoqX zD}t7PjUFEO>leOREL42ptTUkp0UzvnkF~=`A2@5Hh(iJSbR}s|TdI?N4v*sxow#%8 zH@?Cwpu_KZ(3-)`g1&L_(@gTIx*&e|aZBFvjqecgRfd1jR~deAaKU?_YN zH08@&m&sK}NRMdAVdUZVNLQGYMAtHm|56o zQkI4rdfa*Gf#*#59k`s-_2NcE`UES%<=OMK^K=#^Q2001By8l9q5ayTWax>?$32B+ z0W@gFuOL4H>c4Z22(*0TT#W^xNgoZHgnHiMuj)*KZcBcd5#eVSlz->ER4Hap9EaYl z*LUP{SX~PK!TZ34yZ}{>sb`wxH2jtLVw|ARN^Wzhv?DKB1heok8V$hFlVj50Sw8eMosFxI6A-Q0K|DBy|>4zQ{~cRG>;y zIVXoM+@Sa5eDoF3$Ku852j^r~M#pSO!2`05#?`8n;Vhz~wjOh~vGOSB6}gf45EUSV zQR=OWW>%vlVYd?1`50cv&OYWGq2?OJ3BScl#o^T9(9%?t3O{^riHCTw#0Bb@w28P} zGe~3xE8Gjc8;Y)B5!fqnwJVbqzJQAJi}0NELFM^HK34b`GBy_diABh+;Tww_B)xQ= z3&%T$9|MVdEF+-1)@5e#Uf%aBODl_BIF9_vQa}Jl`){(~3bVjf02|a20C|JPR03`c_pl7!q+ZZ5}w|VLvM|%2ojj_c&Zkmzq%qfxhTY_ zF;{3raw{O&_uOjnfcP&<0^GOT;tsT3Ttx7}QI>jnksH|x+FZO>oo-#AR^skB1HF1E z6?vd!Su9#4`d!l#tR6g7GW&`tmUduu`&u&nI_k>gj;EEb_vjSGakX~ zH>^{u>)7DZYJ;vjEVR1v4X#k@kx09Q#3JbWZdjoBRw`s(;99Cije-OyLDub7hMxfY zwiJzp+O65sk-66eak8HX?A=mi!;X%F`?eIJYm$#ay4!M)Lx(ePj<#UQok@vK zXuHpX_nSLdekDlvSyn>ZMXobU^0{h|?qvzeFL8~8go|CvOtPB~1&49M)yP_2?0TK} zPr<+FKjoW1{53@-*q?kzxTYwd6?T$&b3$>KB?dBg6q(_|?M21vG>&0~8@1>&RN@He zytW80^7~Bz@!FzqX;Jti-%Jdfd4KN(DKNFIXmyf&GS3HXfUtM_$)R(o4$s2$ofZqc z&{i}D4z6P~0RqyB(9eDg!XPJ;znJPy zC|}{)svJJZz^B6S>&S5Zo@ikP!yf3~>n&4ME`u~Y?@>=QlqL!eKWLc;3D;YqjR~Vr zqx41->bO$zK+A2YzC+jmn18?$*8zCWOxfa6exzTgbSMXUwzz(Sx3{b`lh^B2Kjd9k zx?I$SQjCN|FF`fXii|StGq^k=*w~P>70+Mlt%y|G@unpwl8+;EYrjt%O ziNpWoXkM`!7d~V7Xlg-@&$K9z$buiXx*m>`(ezTK3R@U>_$n7VMY>gV!Fq0%1;j@z zqg}+HZhqATi|VRsYSz@OTHH`wEv(Ybr3^(^yXGet=2sTB!@X@q!{M&0U1K1%y~qkX zu8qg11)RIRZAJJgJRhgO`~gccbYAAlg3b?E^!!A=hlECF_UL6UIbv z+Hr-;49CuygZjKw%T^_E=l~SR1BiM6SQ5IM zx-~lr>NcdVRX(>G4K<8!(TRD?cjx1hTz@+neeN3;Q566a8YefvrhVf_wQt`a0A;3K;$8QGLi4kBYfr@w#I zq$nse6%}F#&s9U(6fo)g2GT^>jibVMMpoNF?ZYdfi zkV!LK2lDf#6IZGN;zr+4gdX5h$zNr&x^@-ODaF6RDQ*8%krQ^DSE5cQ33534(E2Fu zzk8pu_{hXz0F|6^ChguXlZ!D;(M}DUi1kOQ{0}H4&p;4F;FLQaWL+nWi1?g8oyP;ceqj@ zvwc_!8NOK9wxK8<4nEDqLq+>AblsMrWQ`G4s9O?TyDbv5mCm-q56@UE!$Nyi7M8$U z;93w%w)djdRdv-!5N~jm@dWA-mq3$H4<&aNRVEQL-G$YSBuO6qzpxI5J!=tgO&zJPpCoi*I*MfVQZZS&ZD#6r+TZ?}Xkhf(`l$ z<0e4oODx_mru(aoBAho8@R}2hzTLS|7n5fe-r)FCKw1=kN}&I@MU{9}o1}(W;kQtA z2A1D*$LvgKaZSR{rWbmPvr;I96Nm$=IBavz>F7+bD-NYmExnf8iT`DE0A!TYlbR(n*)irxu#R$n;L^+QA$LH{3dXng{r3gvnJ#RKD^Bp zi{ECouC7z!(OKF<#O^H>+A>q!P<)5$x40-!$&?btqp%RU!X?<;&ZN=EwPe_42o@> zDX{J?*H{Kx&Ot%?;VrJMkb947EvhWJMTPU-e~;@t3u-VG%H^2t(2ESRtth}oUubWs z_`YXqQ`$3Tsy1g`SEgV`UxW62t|_WKZ6>(hL;JqIvN+<>PK{FJX`v`|f%g&Y8IG$5 z)8zy*-?FU5(VGHC{$`n?Rh0RT1r6MV81&JgtQ|sNg(IZ4nR>xms9bdR_7b_P(`u2= z(Z%4c8zVl^Y8?wbqq013Noh!Oq(0dH-Wa>S=yenLQ5XBI0Q{{4@cpKKejmRM+^VAXOX3-KKDE^m4RD}_QNS3YS!4t0K zIsB6K$4$bE`ZKNzSvd#lzp;!WXBsXk94s80HR`a8H4&Byqy}8Yq7Bt>i0F<(wn|4L z;=Ax6H!7lp=jb=*z;Nu zVg^faWEvjE*a}<6+!#D&{{)9jS*er&T_4BchmP(Z8IOfOhoUeo@(lmBpxi=@mWAF> zH1uB>@7ei9ks9kpxo6;(?=2r7Z?bhvGHka^N`|gumN90@n=hgZA0o%=IqWKn!k~<7 zSLgSZd@4G_@8?_?_qU=-q8*C?dESh%ebCbT(~!9LjAi%XfYll;>VNjFB(IP!rvo@D>frBW-QrU?!c+9x!l2X z9i7x-4V=)$kU7B({Ewn6^)pUqNudylO4Ud#q$Ms!RQ5m(AM+blMuk{DW(JFFJKigB zC=+5(B>&qKe0rs=MF*=hW2ozq&e#~#pq>YNVq;K9{#U^8Ea;bG@OY-gnIwSw2t9UU zi6sYy#bjU;Y4IiMqggk-N#N5d{hUvuZfOo>6k|E_Btu4<2rhVz(o5ll&Tpx=Uz9aAU^+cthuN=Ir8o>_`dQf;Qh z4_x?tDkGm!I#W}ikLOTa_6GTS?NmQn#j22t5@)N27yX9rY zXi1Hcpl%rYQU3o(dlUF7i*tXx=OiIH2XgjoZxWJo0wgC3NlsRfND>kWxDh~c4-ukJ zAqxSOx#xAiJfd+l9T|K*F(l7=!m z9}}M}^&L`Dp`=pv{d0ZLLY^ra|A-||yEB8{j$LH#$Y+=NzD_4PRw_=#V7HGs@~E0C zmy%=lXD5%vmw|_i1%6zdK`L@=p%6GLeCM8U?^V00Oo=mFuju!545_X63JzeT;JF5n zkJ70i{$7!(y_Jp26?d-OEYGq6^L;<{h@UkiAh^7<1lrNJ^A=^aw6)1ots5J4`o4n; z7tLyGYo|k8%I(!|6`pIFcH#09wyx1#-nFFOP!9s3mv(v2lh1(RS!D>yc%Tql^|N!b zJHCXb@&riX=>#7R6d%H~UPIWPUdibI&MY+oIB%D`GS+(99tjJmol{cuov~IS0p1jA z(PX)y!cPZNpfAG;@)|H^=-oKpCjV?QC>q+ZrJ%xW@wUI?ZHWpG{ac_SLwkZZ@p(}aACG={H2yAS7e^ohgUf^l!ER>V(3!FmEL z5BITHfu{XSH{=q44x@*NLb^528Z3Lr0go7b@Sno#$+YGWg--viX-dT5%PUcYnWiLz zmKwcQeAlhMQX_9rbc8!@x3ZN_GXuiL6SUC}Y8{2*NVo$>D!->-St`k_nx&M8&M@`W7FoUQ%Z#8ZQP__?UOsaBtaCwUSmlE0+}OO%US>Sl1r`6?O0Ni zu#4n(WIx+gfN{WX4@n*G+cd~wf2i{uCz*|cLk7WZc{}z%Bzz-x8hW0F> za7;?9DyF$6qb0uotHBq>%0V1dg%mf9qH{XTq6%}t9lI;f}87lzDSX@w)^7UcJ47Nl^&JH;efdYwDi6;$z zN`;<1+|xl8E_5Q%zu9L9BwT1%?Asb#XRRhIcF)d$eWnymR3ea24T~ct#gJbV=}5oN zkq8td5*g1zcp1j(%c4o8l1iRdyF9M3OOXT9{LBv6H<%)aq$qKsT!dD3z!He}K&a(d z4q;+Ip(c*0Q>aPG7?rrWnn;LaD7h+^I>KTbEEyp9NC86i%T2zN{I8;ZJgJC!c3xy+2XTWLlf`ot|P0p{27U z;osYvz&ScAQ5xyaF2q4BecbtFB6Kwb8bdTWzJr#_iv|8(Ou`2?KlIKHEW4|22|!hU zmcR~(Rf{P5GkiGQxfiHM>&SohcUSw?=n_c2KnPtwCOWV6VXzj`-$Ji;ov1&*W01o5 z3kPgp>WYa~XA{i2XeB=U`5oEMp0*-EW53cr9~YGq^YKo(M~qBD-BEHu$A|4FTX>%e zveZLM=8Bg$!Mqy#y@Q(m@tdK`gyN^xqvfkD?Kfr&|Z^ zmIs#jtDkQ5zm5TM@E)94zWu3Ob;M=R$e`r#3pr;ZFqH0^+UjKn22wRpoc%RDR`U9qY+*207Vs=Dk%3So#(0 z?N1cI63io>nDFi3vq0$pmyeXmOE&)i&$+7;z}-b6usTu1-kJb3ZUIyqUEeW~nJVB zLms;UW;HUp47%2LGyDnBcsmx9egEF=7Ynag84%w%HxUwN8Nc4UP4ey+ckWmM!1)Ob zP?!^F;=Q4ct>XC$u*7-l>q|2hwKoXQg$X=tj9YFwbjvL@PcQuN=K5KgU-9^BWL=}x zo+8nCWd}?ZZpYGcaAmMQ6Aw43*j3^D;OrL+O95ChJ=_Z6{^QZiU9+lZ`?K`d27J{! zb(`4H?%^C?Bq!p{@#6op66;}g!2ji_zq8ffp!yqAfAiH}{STQd(0_WqTp9e3%oqRA zhw>D`JO^#kOkSHm2(NlwC*!e1RefR}br!2X^r2E0ug%&|J^ljw^caA$u0N5SKgZs; zJM_NY(*0rdZ6^A4PGY^79?B~cqhBLgb||l{j^6)s7FW-9%H!k?E#DR=_EhJ=-NFmr zT=CHQj`I3hioZEJpO}KS4BH3vX9Ms?N4^;Qbk3zQuS%?E=6Q>le0D}QPaJdVaFEZh;8xN+O2z$P`pDNHi>o_yywky#Bc&{1DFhVF?$+4Vt5m z<&=BsRN1irbVi@g#aq}{#VbX_aNyj`RJqEa3Jkxa7l=|&Aj~viuJ=$*C7aACLo5Vw zvt5rGHK@2&^QspP?T&wBLA|P5936=_;sU8G;;rCp{O-E5>zd3|0trDa*IRO1asizN zF3<9CBab7js_#F$u9D6J`=EIs>p=?Z_2YNd-k;~7XH<;N!^DMs1`pvc=VE6AK0xJM z*sA}^Ax7|9F@oB_$d|~fs_Sz&-%pChH@d3vr|YIAE2U`-=-8O}dmP;!SG_*@sL@II zsd@sxzy){D)TMojICf1OL|90}Cgt5+gSElG6Kf3tVr}r5+!X#G<(TXq6a=n5MLq&2 zf7(^)DHPMUEjUBQHLk5I&(v;&5zFK!lb1+ymIFKEC0W{UFi`}47VKSHH=A0rwvJjd zL4W2`1g=YA@N*J24Js6a_jM&i`M>2vJgDi-uGLv{QktL1g_+tm4B)Pfu=j&0-co!5 z+HNRJR!D{PYh4!BWBIc%3nDO#=8is|Gm1jUehxnyv$Q+BxFR$C&D`zgEQ;w9!I(vK zjRt8}&nDxyLOG$t#BIyE#O^zn6n42L5Gs|4$k)I0&JEY-(xQVtlrvHsdIXmb*8kR9 z5Th~XiauKB%g^Hv=ZZRTPYeo_-)47zZ?_1r8Qz z?ja;7I(;7^1{&CpgwKcpc)2?f(Z%UAPTjn`nAXPheUHdk+Wwn-ESfl3*KuQLMRoTN z@gw&9EjLXR7@9AR{VlgQZP%gRXruO&vG>|0HH@Dl8E3-+x+YzZ?+xN3x?-q6v2T04 zdLgY@j(m8KqMj_OX_MO| zE})0S)K9w#LYlLGr`Oa*Md+f4PwZYED?Keusq}R=j0|rW+^%FYylZrm$3NFm(l)XG zwa7WGB*Zvl%mN0l-8>G!?k{pA5pS)E=0%;OhPdupTc^2)6ZiD7ujTr~m5!3OiKCyZ z>1`p~P-l$6h6ZQ0&W@l~ir~NH6qYm_4=-r0ZWLX);Sv#=UQksxhwh@JsY16w#D;9f zijVgtP7{Z{fe7Gt`mIvpOWbrZbE(ax@vUXJnD~x2Ry}KmIyo;EZ?sD-pJMVORZ;P` z$8#>6J%`>(l7$*n4cofczt&3q^*3{&E7!$p%_R_=?@E5!T--rO)6J=R`3!;yV?49O z*e{DqcNy5KJA2*GmJK6Yhq}GnN4hh%ZyM^(Ja6Heh25TbcUB*saM;=HUALn# zluLpU6D7$_ep6%-)6rP@Y|GL`gt*vucJB(mxwkNJj+E0?r%xTN{jeiNVzxyDp)8t! z>eF0J>W(ch$yUM#*DE>!BeKi?1xHkMLuyrrqkSR`8?+1y*q z6p0Gy$Pg3!=JLih5S!+vBP+e@{0NMX4XHp9-#g!zz690XKOm;-%4nTC>0Q^vk<{Fk zCBsYK%{@_9KEEpz&e3c`XxB5jj=n_6Yn**qG|-fOn@#aH8+9$>(2pFwZ9!{?IRK4S zX&dwtr?S7Ih{1~@XI++dhc$|rX@@myiR56rz;2GGvfLXke1u}dwSV=8*4E95y7pPH zb7*IL*{&H@Vc8<>Tj_S%RK40HBiZ_H>Dp=0DRLJ%!EQ_)Co-bZeDU7m6|+QadcnLI zwq>J6!pY_aD{}i6oN!y#HAm^T<@kZx6K=~YuYFq%cZAYx%R1G*Ei?7hw`D!~X_?w~ ze^gAI6}mVxm4{zb*XF|E#KJhu#gkO-I91KlO_0{)z#;f;6?YWym^ednS38FuhWr60d` zfhv7$b_PoSC@DnnvyUA$NaY8D1)19Qh?ws8L5EHX5&SC1(w_DDgChJ^&RoyMlAF2W z=y0eEnvtp z!EBCLcOqjTikH?Tv|vh!)GCXpPX#uJz&E;zHF{{y#Te{Z{G9^sks8Dc53E>~nd(+S zUFA>SU+U=}?LR&KE}1f8&%&rUwyttkXn~_ZF?~aRT>N8ub#Z2DnI(BROZ$rl=B!-N z)2A;yUs|{7!NpnHk34>u<`EzN^^1kLiFK(Syr(%)!_g~bbVVButlwNvg?poC`Yp69 z?SH)f0h#9Jb-~jFYy$(*$2qc8%)n~kd)|4OsX;yCnu~q7#)7936)&&-Dreln3xeQf zUxxoeSHSmp5&4FzGRm6U9TU$YN&M^L>^2ZVCyd$Hl`xN zbE79;_a8p?vbP{Oa?Ps2ZFq`&^T;q<*jO@U!SoPUS@l95ls8-TAWV}#Z$v*Gs2^;o z(G}&1?s9g_q2aLw$LHEUzPLGA-cin%WVtA0MNtoB`;`x_jQ?!y5U^fUJ=s(b1DprR z2^iYdl(tU`yc!PG$Lr^c&ZWyfPR0WX%8~7Gu9wl;*dWI0Lu^psP5}q}IY`kABLl_B z%_A!pW!{?MACp}`j_=7TQZe?(-{N@k#O}ua=NbNPF?mUKllaRw^0f5KW@y_kQ+>KT zzgvX5arndS!?0_qnCG80uwe@hzal_bk^C(q8y0sux=>7iG+3FL>d~uO@O%I_rN809 z#i!$gHLW7FEQ*`bbPq}o;?nK^^ZHvUywr21WH7%zSR`tGg3FKp7_3QBrYy0(C)$>o zYL_WnpPgOPk0*W(2{-y1dz*KKi{> zl!-3C==)M!)itm@n(gT^a*6#_3o*5*TFS{fagBN?uZ~r(5p}07;phhpr7P5G2OqtI z+eFuzXuI^TK$-ngZ_8?P3X76IB`?bQ5J_@excK<}L3lACU7-=a1cwDsi5X!m_GbJ8 zS5;#hFrpDeGqM)g+BuFZ?|Q47cXp!em^S!RwnM zurK6B&|wod0@*Myv53R1D}8_$?h2IP?8t~CEgPQp;qU{^5g4$*7*={_)6?UGWG|f< zad_DuT5;51e7~Cu5)cVKhnp9ZcZKuCBR|N4V}n0dc4pw&ZDoW^P;6id663I}$pYsI1PC)FrK9FU} zi~37&aq#z9G;itij{j)k0*`76dH}Y)Ir)BZ{|lJ*JYo!*-ZjLLV+<6CySCvRoY%ug zUXC9Wr~iBzEP4yz4iB{KdlI)*V;P6L?}OutYu_ zv$SKpiV=q!gttZdE9NM9Z(qG$lXuS}hj4uf(|w_A&LeNqwPJEO!L57b-PWQ^?JLG; z8_Z9XpL9i<`0v~*bFe)!n2*8ss>gqUEb^Y41DK5$S%S;pd&DC}4D_eh2kA&j92~?x z`B;WNdj9l{yi)6ARZr+}J2JGDyvO8;idzG#<%I5^%)u>nWAIfxAHd*)?h6|hTvb{; zTuP~ow-;N4TRwvasAbOFrzWZOrp*YM?SDP~EzTmP^fsI}0&*M{m`j~mq(nF1j*zk) zvS1suwN6;1ytC8CW@+zv{e#YYB>8#PI;kfW05`ZxlA_@4UN_fLC`{8FDIR_yLrRa< zuLwc0-ZSK63sp3Gu5ePN0IB3(YavpU{DBhltTFFLs3dFdnwjj)d2fEo%GY{)ocCNn0 zzr&S93bMG-L$~=H{mvro$JJv?)<%+W>w(i@`<#$6u6lyWntTI9*UaB$_lXSmsrGVwu=zr(^{!@bzWq;$MAZG`ky$lJf-lC!M(SlH(| z+fop>lm+PPej(+dY`K2wHRz)BV!yL6z6i>oR@H#Aun8#SYSJK=Ik-Q#9H)WFdl4 zQV(5$O*}6@fp`ubi>c3DgeCHr_;!O2#?!AZ>9=r0G`0+4xq{Q+7}Xa=izBTCtmd_zai+8l3h$J{ZU`382v+K zsWfJ^<-sJw;cm61Ai9@p04qF-M}^bH9cBB&xgY*)B@BVX8M9c#m!7oj5w6txcLZSD zL?%OKLeOTR_q}>UP;8k8hMLq!y^4@NAc&E@|CmFX@{VTCyWKvj4=$j?&8*38aA(=94gu>PZ+Y7i9ni|H#r8zV46J z&u5n+5(B9YS~Zb3M||ur`lv)N!RCNyx&Hv|p}WG_t}#XL8BO*D3cXjkwhIOd-#D~9 zrp8o3M@?p9D{SEp{7-L@sQoq~V2Q6#LaLwxk5u7lk{qOHFxNQn0P{$w4Am4$J=5K; zPp4F2$2pcY`tlCn!b~hTjCEq-?jpJl$*w)gPauyaorW>|4B4-lL|EnLmYr;^3|}6C zhQ}DXTpF44Gv2$%C=L3jOZ;Z=3@Gdj!ItxoeSc=k5NDZ27XDeIrdE5;QUSfBWb8~sVFe%+>0pJGWY8=}LJ#t|&iz0&TA_#O z72g3pjEECK4{jSui?KovTZ9dI zm@)qZ^sp6z;tv_n!;G;)50h#_50iEx=&?vmT3X^xiaj3wYrO?~WVWVSq(6xhfe%X_ z1|O-GlnFje9v$GrjIe?alj;B;W`qNLa0J$?Qv)CNVhr$Ml0PW;FxhZ|5025H0aWvb z_->1^fe$mr3O>v#9N@!DZqef#;=2)R1s{4@R`8+IY~X{5>A;5(VFe$05q9vwR0sHA z8hXVFKJ+53;KL{}i~K-J^w5G+a~t@mJOTI^-8M2hgafW2;qi6gfWU+xx@D9JL7ut- zx1h)&g+(4EniYd2S`$`yfgl8W6MZ1LH5x%1`sf-6>*yn@x57MZ<>P^vU^d7u$^tv6 z9ymt|T4_|cx_6y*+8KoEwa+73XN<^&*#GdoJ1*n?LPd;l?Ikk(JFJMzfXp zkE9sthR8)J;s4YC7~T;dwmNl|5EBT_wPFhji}lftEf$18v}_n8m=J?g9oreKKM~Hr zw}`Tr4_8s}t!BUtE^5z(-SsDc8{+Q0E%~letY8BVDJ6BBffkopAO;6bbm15wMH!k7 zD|oy@_m(3Zu;SJKNk#72^F1vCZV%-#vIALAg1tpWMF19ynoVFquRB?R#XJ2S2C$$w zc?w}DfV}5*Si!}_4$N=|xX@_;7x1O5zy*l&=bzd#czk$e|0Nc5 zq0<&xAqEp25QAw>h_QQZM|t}7z(5z&Yy(~Bg`5aonCprIU7#{6x-j0;vSSOKd;(;l zCwZT^!kW#BDh#?EQ&`DXL}AeFc)}n%(1bxxgC%Tn79?TNEjYrUoid6rayT%ALAN6a zE7^)447vq97&HrZFlct` z5<51qCgnPuXA`yr7KFg``3uKQ#g|HnS!*0kC{l&A1#<9CRP0f3U@1=~RASsp8IUu_fxdHqV*p+B_sOjx8wP z#65vh1tC;1^A(DqAgZ2gi5+{Q_;eFTsPt$6WO=ERB~tt!Ik2%MhdX*-H2!{xrT~SW zM;x@BUFi8N*n&t?6~Pk6`GrolzzjvY-IVDS1z5yD8ALj;XT_N(z!;Qd_jLgaHc**R zjsY=0ivM97XgD1KrfA7)QYt?dTn;KDAiugEk`Gl(*ov$EBk zS=0tQ@}M;Q5WR7-K@`tmK3=EN&ovYUY5@ay5a~c;eZ_(_*dyKIYCqagxiPq5$R_az z*HM~*r9wa3P?R1E_8`*4)jk}o>W3SO(qcK<;Cz`GbIn%sdZJ?vilzqZu!F(}uJJ9M z`ACCO;43AB9df98;7)j(_}1>+Wdipc^T;6*0`PZm9sC>g4|KtE<3uh_dCA=Y1?fS6 z@Icr4lUtFEE?yB6uk6mv7KaC5NNZZu!G;SDB~35L6p!Dvq)?QewqmFBvNXNEOL$@t&J(uP++5IiGYR`Jao3{Wfv%e*zDigoIId`_my&&NiC7;7XO7~ux zhYOztlnPfIcHu(A#0K~d-q4ZY2Y}>V3?jh`u19?Kyu{WLy0T$+;M2snRbS@aeNT#l$T&EoKR3!nmFuOf8nRF89vu<$O)FT)!o1ybIJ~xf3et|0N_{SuE2pf_iiZ zGU@K;>T(QNb@{5m$c997aREC^aa{|M!cBqYZk*-j7dFtBLYEe>FO@VoN#dC?CnTNA z^3BV2wo*w7DzIE8wMCLVWL&F!ek=yx11^siXcLJ;QKzGZZHNF@8RlYmt?V@8xZV@AXwqj@{iR%#r=mZKBX z^%aR+QFX!4mY*cAv=JnLrN1WV7RAiFtG2Qy&X3GEGLE0`J3%*g#0D@JA(^M?6H4EY)2-3;{TO~Hbmc{9uUk6%afWNLO|EOPwoWFA zB#p-c%;=kzEN)DDNtR2TY3v{09-r}}O+9*ov5&|ZyB={fkNt48ZpMrg*Tj+0yiRLt zdgHsfr}E7X>+-nP5;qQ?ck{m{u%DyV%dV5i!}Fd0Rv~ef7^6w_iwTC z&3OOTC}QUOw|bHj-oJ&Ui~F}}$JHc7xUb<7(2Fli@9;veGQGo#Ch72EZi@+q-Pdrj zw?(6cmJ7Dtv_2@B^vjQq3$~wpKwYqHO7HigN%>VwbHNrnP5;KezT^z`rSW-j;G#Np zxfVV~4WAb})qc5_sgBFFx&)w01S!+!g`WJhRoZtw{;2E7^!!vL9Z_@N05y8bdgqg+ zzBGlJmkhiExVf<|uS8w^)UO!mWVbH<=lTT$J&CD{kGXFao}UtZ7q2W+mqGO_2G*>0 zeY|4EsgF0wc742}JN5C3?9#_8dRl$FC64dR$x8(Wr#5}OnYQ8tZI-u6^-BdtNiLnd zD$S{rH_3LLyrSE5@``5D$t#*uC$GpZoxGxdFrB<5vrQ*&(rr3lQo)-KLdSj99etib7iXWV+$3X4k;B zk!uFF3=Lnoebe~j1~I*RB_4M=@f8B%z^4w69!Xm?^^JQKT^4 zz1r>LSU@DQ*KZUUe7O|&s_e9idqxhZ85H+s!7jzUEF9M`b@QIoK(k$OKQGO;lJ@eiY1^Yp zuqy4FT}u0Ax6;1ZrL@PKa4PLll0#|F6uZ*C*{-x#44HC@wDqAO=2Y5qjW(ryvv4Zy zn;mG>xOG4U4myFr8;biG4q-z;oOdzr_jw3qp8N_&jLbV_?kwkhqIWK-HR z#jdnRuboV3-|SM_b0)je9-ruBN_%vxLut>M>`MD)x6+q z@SI9}OaWHfw=_V*oA11WKoe9d?OPg}EJ}M6=1|(hmdmQN=QcQ%_82zMVVlEEuCPb>4uw5a>+EQP|79#ig+4dT?v*`}+N7??6j>Xd=lcgeEGdasA)~V!HHGV?q-%s~wss zx)Yk1WIHrbbSE@XWEV71^t8~#5@&-Zif)4@X4>}yO;j!yG*NUXG%?9`XrkygXkr$v z-*Ps-s}q{2q%LTp=pPK4STft7iAlFX6O(L*CW`*gK@+nO6#jw|GLA9e4COc3H(`+b(DKnrHvtSoWk%hA#et8L@aiGPHQrzx9pfNC96s5ZZ ztqQP$lol6AX>o&;78gjtlyHI+l;i*@OtFKM7CT5$47ouHGhwqV;u>urrNsqOT4n|* z$nF3sEpCv~;sPm5v4a%OX9Forv4a$ltRSVu1yaDg1Eipn9U!H}1yURhw1X5RH$e&* zw@Q)-rUNOQ#ST*NB$dOm2#h&FN{b7mpaLgI0m%VUm|_Ph=m#rE;bKgX!d06f1#`jy zQaHUGq@e2^Af?3)Qe++%NRjz$AO)i^9Y~R68%SZ24Wux|4pPu-Cj%+)6X~!l;!Jjs zf=_fZkb-V?fE3PT2PrLXkiwl{11XAP0V(J|`_Qt36t&(tK?M(I!SwG$%$;WEVzJ^bdwnESYT>#iZLXib=L(6h;5%Fp61-9iu3^4WsC3 zO^l)_9~7g=)%K(qrPYN|$dBkrF^Vl4W0cm0MHY;rn0I0nMYdrSy`7Ge6h(Go6efRg zjAAL(#3+jRPhk|rmkXn)veRM|N1Pp_n2{z%QI$9`ikWlCn;?Mt#*u(JmE>o%vYsVF;=9~>Ov}j z?#??9tuCa3iQz;lD9M3Tm|{mNt#+iM7;+;OX2OP4xJDaNX>}o$)|rtCvOADUs~f4b zx{wM}>_~<4*^mlT>_`P9D^kIst>X>^n0Fu*bg~1fw7QUrqk(p$g5)Mr0pnJ262Wvx zg|pa^N~;U0fH5ahX>}nLRNzD^AUTi_|nedQPN*DZogj6{0r12kyKB0gf4|w6-)_kO~TO zAQkwjwH~K%8=Oc5!^VMBuoO9v3R8eoo;Q&Sx*ABO@>Ew>`weXG0B5)36;$HDD@?KD z6|~%eSD0eQE68WXD{?_G@rrD*iC4hON$`r?Wn6fL>#^gNw)A*Kl23?NRL&2ASIn$- zyrSq%yke5=ctz2jctw$2ctz3E;uTAr4X-G=4X>DK-w$3lp9nBR4s_-3{(lSC`+O%}AGSa+foMYf?8y_F8MqR39P!sHK*RxG8O zXhjkKDYT;aa-kJfc3QOJh_j;=GtxvWsuCw!F_X@KRxAl@Xa#f!TH%y-w8A78S}~}0 zw8CTuT490jQ)d5#HlO3+Kx#0?T zf(@=HiUqEq|LjA{4p-E&=Y%Vm0)Q)-t!*g)IhZoI@CsOFywV0giKhDsl;*%IZFaoE zjd0=>j2j1D!CK_ND@?KD74$XmN>y6Cl5Tx<9CYyi-yqpBE$c@GYShyYlmN&@_S>rw7CB}VzoY@Rk;c_|oHAV!4J-ph1 zhceLF$~z$6T|tm9uJ?%PjnyB|Op)0*exb>@&E6y8W6Kl~89{tE!@q>eSR$VZ>JSrG zRG&`oF;TJP?GK(@C_8)kBd;zZd{1WTbd@Pf`!ex);Hh9rytOyjExDs$cKuFmuNUva zP+;%<;aQ$uS4Tpt)M-*jL2O!cOg*;G9LhoSPImwbd%Rlj~Q5cDjUzkl*@H$Nvs^!EFL zc&CV+dLtN+{e;YP1+Q8h{Zg>HT7Q)5lnqG9Qx4@+0|h_lix(g1?h)&M>&25*G+LPU zi#i{s+gd%O}vL*3%=s!+D)G+D;w zUkrmoUKJ1(rN_l*EgKx)KF}D+q`w+mAW_#|@XcVZsCX{g5J=_dDYUizY|*$sygZr0 zJ^$XZ9fMo&na=lT@z03-qxofVi+AGv#*m2b4>snevQ--G0>4i*PE@Z*q-OhloDI(s z?9}jJh%66msA8brc`DfEiHPIfwM}M)5U_gv-jQt)-&rG9Zr(7s<=kzWEQlYBoGtb| z6|N{wWl|b#w^3}$QLJB_dvkS7mC+77*L#LPa|92QTMM2wvQ3qG=;o@5+|(?Ygr54E zBc>*MZ;7P>{yAOa<8a%m?p9vz4~VWaYR}0}h5P|)3>e>xxbRoQ=egrj+J`A_%y*h- zs0$SrxH30sFJ|~7BK}OUAf7{PGGFE|Yp2VeGrdO0{TN;&VvY8fToS9vT}9XR1@INw z*3NHL#Tx7{x5QVM`QdX2#^Gg1(wd6-BdSsI&+;9E+cv_ThQC-0{>8JvQ!EDF&RLR~ zDh1(CW=2W=)%s^{s^1yO;(Mf83H&@i8C@!N|09%V83;&W83;{|F9z?YUk^4dGQU`p z_Hm5eHA7p5Hf)cmzuIg$rkc2W?42@oXZ5-`4Q81IcW2cAY(6PxNMYfu*~OV>SG1|Z z7~MnZn%$k6V@;xM^XKRpoNa05wghFgiOZs*@%dnLJmoiYq7>!YqcvTf zMZ}@J$=iw-U^9$|sO5l}72-G%{#KmLTlJA&>RHBO42K-t4 zGm^Oq8MKh1n;d70`fmqY%4sp+IBm#3d-c%h&>-dxRvxwfgvHpN>aJKS*A_`bY>qgz zZ&}Psqv!JFm*mmZQ`zMUil6ZKV`A`7xP+5D8N~~6lhundQ~8n{%hD!2c?*YF?ps8y;j*g|FSbWhjzK z|7w~DZVDCCbHhj^%H9m6tliE@aMeu{6QAo%aG!pr3a;dEFHv;;AP71Ab98!(pYzN} zy4MCui5|HsQXx72Ox4Bc4~jneZ(&5^^{|)--(Owf0guzcd^|=;g-U^9K9?cI%lVW6 zUef3*A_cx8SL=Bdp1bxvSe0Y1o5)$@rEIR~f2eAKilnM(sRIdki(?1B*z1f%Uc^E` z&4<9*h{I5PN2B*VS)P(z^=vEr^pkvTqO~2lN_r8EA?@eM2=cqTx4Is8>>^&28a6c^9?zP3V z6R4(a;1|y8*%<@yM6NjcqhO(@R2+RSG8fH1^hk9%{!Cw0TaN8v`r^one0sjxmYKwm zkm$T5qIvK*N>N`PUiLWpdib#7jqK+g$hJhaiGjHOlWRRmMGub1tR>zpfeUE%)CE(@LG2K zZSUM@NY!PX(I}rD&PGA>aQ4w>V^>t9!v3I5K!eD!0W0B-%Lh{O)$BrX{OVAVCoFb9 z98CpynWRYBhHzcL(T1bX(5vF(;5U9_XznZ@mn6n+45j3&-k?ek;z)3Jms&vNG^9o% zJEHMrW1{~rp_mA5h-70aIF#ExR~+6IYL+vOqOvrsZ5T^`!PDeu%rm)haquspCOJSr z#Q^yY^+s23Y_6wB9QaL8!_(hgcP=kN^7s(m4%dX|hT5~mzJ=j%fx91?v}^E5j{hxG z;tB8lRdA_XxDeJq(Nt@V!9HdHaSxK-xW<2t7_l^acy;{O2%_(##vQl?OB_DM_;@RTRa|?>-sr0Yq(x340aFHih96CGJ73Do} z@X9NPHm-)hts!hnxnlZ`P|TQxJdu_U!b8`#^HXvH{?+5pfs!&5HN35|)uz0(jY&Cu zXJ{@a*Vr$^SI#HdLC=jzHGA2Pt>ZhkayfRs*UlqWEYaE%1RFScME%v|!*l9Jj;b#v zR(&zl9b^c>sp*>p#i2{8^Yv|EnJ7OVEGncvR0|1vI2a#j&~B#g>HlzTl;`J@(JpcL z-AKs-;>Eh=U{{|d!xnEZg(4)nih^?_lQcI0M`Gg8&$=q%_AWS&d6Kzk@d-ldxx7Ht zvzEEhdj=vLFKwUq`2C`MIFgr8jG7bPxuqA1!HjUPc=xyA;&NK^&7!mm6_`pXaVIFw z{c~`s39?cQk;cANy`s*9NG*^*FVPWFi!Odj@ixUHF(TglpI}qaltEj#oZ~O`TA@}e z%E1RvPzypLOUo9>7XaQW|3Ot#omo(;b|#~qloc2$F}p>fqy7h$SClGrl%nobHMFIx z!7sXwhij_M8rrlzuA#|V13{aVD*ol;VFP@zE24ln{zCLt3yi`yS~fBa^m+xhk@bHL zuPUUCLqZfi4jac-ihZqjUAowmHjLQGSF0{4N|U#V9uR`S@>*39<1Yy?h)FBdkl(^Y z&;f7sGBNho@TX%m;Z*19Q!ONq9fl|ota{=_JF6f00=~(n|2f3%)Ly+XGP$N&yKs0!ZIq_ z(|xmu_{Xc!rqj%C)=rYC4p~x8$kJ|sU(PVJ64{ zYOS?|`jg26Z8U4LAUi^)$v7Lp%QA>`V0LuPf~Yw7RBjPNC{9Z~$8Z9J+(2l06@<_h z(IR4`(5_T)4Yf#=2AvVW8s#<{;^U&l*jBulxaz!6DX%Ij9dsDjgZ>kPiQS-vdgqEgPlU5AN!VQ~=w^~q(eOZ(Pkl%fqEeLN z@t#i+qCtTGQ=d%+wE}}z9!O@l&8I{Jbi$!t0y_9pDnbudoh8LPDnZr9g*Chu3OZQQ z={bCs0ccH?9)2|G7rP$}O8zmP!5vm{Gt!aRM{f}2aLMk(KD6gyufI^{-u+Zhc;@z0 zszi?_Bc7yDUCi>^C-yH*;@u&Pb&hYr*v5LI)FT-9n9*`sF}}V&T+MEa%c46Uh|LiV z{}L;=C|G0(@-uQ@yz=94$o`F({NDLKTbG^tdN4xCG0l=#3&4oc6x-e4UGnN7|`MsXjO54gI zCB=Frnl=(5iplXO_P-X9YZfNp`4zNB8v|42V)60k5HeMcBdfqynV4z{m-#hwNtwDj zqBAYJBFjeAbtG7A;OZvXn6dL>uEzL63RruV)fCQ=8zsYQc-1!G^`wvBH8<+$ z%Q0u8y50>J#2H=NF@LL7)d}~}Us^8F_GvV3(j{f=oi2j5aNcLj1uBz}yo@%>^oh0K z5y+X!3C;Bt>qAIP9jJ~K7pBX=yB$!oFBA`Hjs(KUF_;+Jhs@!!De3Il=^sVVvl#V`?rO94Y`K^Uh0Dd^2m6}S z^sG#pre|e@rDsvuj6JI-*8ZD%_V}Z9&Yp!f1r05$c66}JC-n#Rp2a!;6VbCP-Rguk z=;3FPIsvSiQ`C^<8OzFOdfzWsbgru|hAv_7;W|<&cs9g}JVCMk8&%8dS@UM96fpat zSPvTbR4Nhdb)0WU!%EM9(?!4VTv*M=!Te|hd$3Wszf5eoBV3NU_umoTTy2BEDLR$Q zm9QMk5Uq`l`l^UYTLSHAfDN7EQaD&D&d!&q#Nz!Bi2S|rKvIwnf_c+3@`n%)4fjGbBI|Q>e3Mi|JWd_IdorB2AgpIK_i(oiSt$B1 zuTH0mXu^@BJo#->3rSQ=?Fq-kAGY=tigVxYotH9BekpB^I;{oFkXi$&erV!>99APp zOnxQaUO-*0rzX9{GJ@s%ezbh^*^-xZcnQY5EDO3<%#Dvw`OOyE^3EwWte2e(kTTfVQ~)9 zq*x&U#&m_iR7n9T1jc?DJzeSoK)_ko6CM#*v!K8OOP^H-LssN9P8e>e5ic|l}Se2|}qM64852r5cU}!W4!y+CG z4JH6yq@C^0LhoXQvkeD%(5;5UA|4LBg>zClAo^=UHeHbJ=9qLr@uG-rK&Uu1ASMph z+6IIkD+h$W5xfqpt^GV;Xk z%}lXv5%TC}MV?qn9LtDhiuI?5I+bmaPJ>$-U_jCkdF=SLCmL6N~$1^gr7P8b^CcbGZ`4L~MHlq!Y>uFdq0Q!8jfe-nAL?8{Ymn4#rL0wF8kwAk23&&=sM@FQw0>7Zn06v6fpeq6ylug1I`y!}f!lkit^;s!~ zf_SQkkgn(VwN=Jso2bkvrIXrlO%UBzxex5T5PXMp}{oTYkROZcMfJ z;4GJD(>2L_FMvm>|h@fG*UR9;QF zIJk-)uBMh#5HG8F{0aJrM|S4PUkORP*V89y_yN)vys$lJ{AfgzFE_&kW_yGXJ{LNg zo8kA=(C>sirLUn(qVvzWXapH8P)0Vy$QS2!_2i4XKD4qzme(*p21^m@CyL^SdvJa~ z4vUJzeUTi)G?VRZyJVkGY?k&>kH1WGZH^R)Jzwovo|%HuUIzEAtDTjlL57SQ;T$n~ zer+~RT0?m0xxyO3`luqAF!bY)A19{Zqu5hz#MJqp#q zd@;Q#goUP3{+iG5xsr(U#j)=MR%WJ>ei@|qn*ps=T<2*aTU<)}z8Bp*wK%yD+5miq zxM!g_)Ynt*fzxp+tYJ}Pj{f^tf8=cWSrApGsywtdQYj99K88_9RZ@`MI%9TqB*)}? z)F38x;@Le(vHP3=lG97oVFYp4z>6<9H5!V`!6+FK-}+Ndw)pN^z(yL6;+P87iT7TJ zXN!Wfd$!3>PZ`;`IZqro8(*4xH{sQ)sYqDF5==&f)T&g9cvljWo_L+Sz~Hs(+#ba% ze(Ah6w#F0@zd(GI*o;@zG^nnU9EuAfHIlh2`+F2~pU>;tBAG)SU=Hf_xahB`0RnD| zX49MpKVn~gAI2h$UW&>hG*?PLF#&djdZgH?2chJ?j}|qA@i_EFk=Y(tX4ljtF|I+X z!5^w=?==|k3yd-{_kO7gdIDPDC?6{di)r8&i&d9kjVTjjmqf~;DC1HOUJ|Lx%3ym# zN|MQ^cnA8D>s*VFJZ_K+^NQpqIgqi0>g&&;6-l-JfT-3V;kiDP*!%Mwe0Z7}6aqiA z3Ly<%fPdQ?M8BNAG^SzLQ(2;OI!vn&e%Im;GT>v-;zQ|qO$&&Ii+W;McZkAGS4&Xm zpF-8ru*_UI$(ETpo*u-M>U=tPdDe$`0#aD5oA{Z;v2FPBh?>73=aviVSP`Lb#r#+tm_GW+x;F9YKzCI33YEZCY&cw4n=BXQ zpQ5I|L0rnV8vqVNUDbDgpT>2I_*XhjWQ(KCzWKa-iERXSAt*A>vHdVp`V#>uIU#X&LO8G_SJ+m_#$9Mo95bs; z;NqCRc3wRm#+^Qr?3bs)W^a>S zo*L4F6X5yq8`X+u3aSpo&xAPk)2L#Pf-2_d#+W|XH^xAeGVoN$GH|%q&Ix7`ziIRg zZX+>8H*rM}k+8p_4kAg_} zg&BjP5*C-;+M{8_KX5A~urf-5`LwR4%{gJD2A9O{5)r?kW}}p#!;gnb=$%m*?L7_y z%44_nK+vRxmxG5dq&LM6)542zR2(_0Z#H&8{9XV9?c=utMa7Mjkeg`DrG)BQ7%ucw zh{JbAa%R38W+ZW65Hq4g->1UrmY7MquOp;i6|)duu2omTY&3K}Ul+3wJ3^4e48@H- zLaA^};-*gp6Lek9XpXuWOwxVs-&p-ey^NWh=z|v zu&c73h-!gmhu%7c<%qgKSEX zF93Y`jQI$u8)&M^x$@qbD!tqcP2Uw=C00Ef2^#m%Dq@Z|AEl~E@3sZ%L%Zp+zCpL=`CQ z5iDcxOLm`WQB1Yi6jLoO#gsJmb1SBd0zGR(wXE{iDWss1+9fonv8Q{nsi$hP>Zx!D zW7AVv-U(DTTKF~{kwq3`EHW<(i|}WXg*ocn2UUEp7yC$2tk|)H;arOki-GCN#n=N8 zYz`#F;FrDwO+J{!2Fc1Q+8`;YcA(>v`VNF&Abyv2&B0f(U637)v5n)E3{qDmxlpOC zh34SFByC4WAJn%a%13t%3Pt=?tcnL8iYRGS1`mg_WbDKfJr~H;6u$rh@!4VZJz6st ztEQe5(mY!)y-JE0SOG(yu;-Va9~q3s!W3+4&@tPp#y?!!P{pn?D-dKB=q zqRz|GzT(C90b9@-+$E4u zpi&Isr&6}ym#%@CyrnOxHb~MIQ4j|uq=uRN1++y67bgLjr@drb6tWUJ@4KmcC(yMv+Zbh!T=Yam8gL$QPm@DPK!cZ=JtJj6D^BCmr09su5kk z#8qCYxS|*eW@*3h(wF>7GG*anN+bBcIH#4ix>5;RmKzYe*W{O%2P6|7~EoWAk#KE){_@W}idbfuq$D)NHe&(d)2 z-(6RY`98I~PQ`(MI9NWEQ5;!-F2l>eFYr~jlGV^KGGj>`TM@kIxI5YrgQ}J zBI2#dz6;Z=M^d!l_2~G=FksQe3NuhpElT*QRv!Gqtl;GcKP$wlVxL;6C9or{rN@yZbxva;kqu=wyp1SeZ~v z3HJsTsTY!GIDilqQ&MM1*7qvCzG!@rRsk$u7)~#O3s`Nun1s&=p3*NSb>Hpyk7s#J{zP33 z6p-lqO0M8;ym-D{tDCnZ=nm6>WZ3=WN1Dd*kZl;9uOoi%xmOAGxa>}lich0 zsXhgM>8-)f3NiZqq-qTX(V7DUvW|W~S%r!zu{d^RM5*1zUWn8cp%V~+uY+y+Gc{O*6SdszU<`dN%dv%OaHR? ziN%4nP&9%mh%fsTeUkV?(0Cg=KgzAecc!dT0mZ)|O0WWonuHW+5>J<@X)s|?KoKWI zQ=Cjc(KpYkfTEg-rVqjCh&}|TBOpS5T|(JQ#QvO6&}4~gxqds;2z8WwAq_)h5Qq2C zx=AciCMljxz8WhO-+GOdQ1n$Pn5F%Y!0v%~I4V{>$zZqZH$5~!xUSKM>-><)kP^pn z1a>JQ?(O9=A9+7gd@N0S>YagtcKz)>HnRs**+Qw>mAYf6rEsD^QVp& zp9JxWh+k+vc4Dk}fpE#*$Ld_tEB4VNkXX_3BRE`wP=+kx;49VTqG5l$SuK3Xt3J$u zSQzpfE1~F{P>|Kx^XO-Vc<4tlh#tfb1$DU)ztO3zic(SF3a3eE`HwMcP0@|zX`Cfc zCH2o?zo?VN9^9HFArbT*vHyRUv`V%R1Y6L0!&AaL&@Ny-2BSD_WbHe}iq7Yj`@~x} zMi$EJyH+_@YN@zu!*9hPaMtY!NSyCb11sb110Gx^KmB zNBhl~WsIRP>Rrk%My~*8b(8@+KMgNLq6OFsLSpxkNIndi_Z*28pdl2&x+(XTLfR?Z zxWMi4qcNpunl27w8RYZEuF^1$7FjPvhmI6fF-WAJL>3bf8v!m<6^BcuUMf#Y=(S?% z>AE_cE+S{W*mCB|9Px!eBvB9T)s&hK#iL^3Tv(=CG;7%FbnO%lwtgAw7Q3&B%qymG zZ)&HINa?2t4mJKVq5uzmVKPCx7!^lf=qtgD*!B0GQp_ES5a%9CVty4T=gC>rm7rM! zb6Cj6zmClnp?~eo#%1#eWPX;HLCd0xlsJL_6?hcHV$ka#?_mMw~B?sI1Gecp;*IzKx}Lb`e~*PUi~$JPN=pg3BU(Yeb@BlLvn#jx5Mn&%QUsm(7WkI>kPf?NIFCBrmUQw zuy<`KXX@S5DfX^|xfA!Uy=ES{m;F<{o5FcUiKElcgY`DK0Aj0c(f`?49Xrg~MSJ#% zl4^fftDmX4}b$R*TFH_*hF*XChOGJ9u!dQRZo%2&xNygv6% zG?~?+d5Zkfw(4BJRQoXOxwqua2C?q5u}alv?j_HWMfjL#1&_@c)=^x4ckTK!tfP*kGpwUcr@W5ZQqHuFHl5-+>R`@XDbnpy_L_Me zz4TPSNZMVhiS!fH)z@qyOX97#C$tsv&t~|n9o)WoWSIApcCWsK&X8)HPOi;Twv3F7 z4s00NF)T(uyBzk>8Fn~JERoP+6a6qq_Q(IGV=1gd3hrITp&?W?9Uq@NoQo+<|{W3 z4{jNdxA@0_H?l?i^IZkAKeX8RpEz*4Z~iXIf}M5y&=qj|FgmzxaLbmVEt|);0)Bj` zy4;_6`N+ndk;2uu-+?9%@Rt}M+CXDlYEcWNfFaLDX9}WmistILKUZ=g1^Dp@yf2tc ztfZfG8c7|>rEAZ^aj&g=2?b!>VDmRO9vOBo61&I|>j%kAn!g37mN61^@F7PZbH7v{ zeodNvjGSsC8ZTK8-vxA-M)J?Aj`-(T1zCJnZ>s84+1B={J;)Sg(&1l-ID=bNM5MsF zuaNMgA~Y-}j=7cg3oYKxdpr=Nj&|XV3K&L={XST{%V|l7(G+Ivt3&|&8NMnqyHGbZ ze9u!|=#Qw;B&7tIgp3>2o^;a28BMs>3pMW88__({ozV#q=@lrPiOc9X<~_5fZ|_^V z1yUJ1Js2yHbkAe8b4BMvWMfCCO$b6u3&l-P9Q=>y-0Vvw1LD9%by3k*8t8>x8w%x% z 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

aQ)PjfGNd|NC7~I%V0PmUQd})@d$m3 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 diff --git a/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/variables/variables.data-00000-of-00001 b/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/variables/variables.data-00000-of-00001 index 043b87e07f7a38954d1577525e3b14013211f74e..4412172aa98354cb0dbb817d6c0ddb9a5e3ec48b 100644 GIT binary patch delta 87 zcmcb{bd71k98PHt4k7Wp{Ji*yh9WXt9GpUIIf<32Ma5j)99%-|xv3>ZnaRam@*La~ Z_sIzfa_|W8g5~3(G81K7cp12mAOPu+6np>x delta 111 zcmcb{bd71k9D6Pf4k5Oj#LCp7VlF`rP9a_}J3cqHq$o4Fm`k36OGp|bRFs-tnv+(^b diff --git a/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/variables/variables.index b/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/variables/variables.index index b9c932cf49a4109cb551c9e9941879d08180ca1e..3e49b8d56de7fd89971635133ba43d41a0166e48 100644 GIT binary patch delta 27 fcmbQpIFWIJf#5g(8)q1RfDuG|*u0o+qGJF6ap4FK delta 27 fcmbQpIFWIJfnZXAfd~T-FoKAv>1XaubPNChQiler diff --git a/tensorflow_serving/workspace.bzl b/tensorflow_serving/workspace.bzl index 08c3cc28dab..cc93fe815fb 100644 --- a/tensorflow_serving/workspace.bzl +++ b/tensorflow_serving/workspace.bzl @@ -56,9 +56,9 @@ def tf_serving_workspace(): # https://github.com/tensorflow/text/blob/master/oss_scripts/model_server/save_models.py http_archive( name = "org_tensorflow_text", - sha256 = "0991ff93959a0e3ec7d16ba9d9ff9b4463bba565da402f1460cdbfa731112034", - strip_prefix = "text-2.6.0", - url = "https://github.com/tensorflow/text/archive/v2.6.0.zip", + sha256 = "7c6940e1fce8574f655fd5b20ab82e60b65bddb4c08b7ce669d8d6761e245bb9", + strip_prefix = "text-2.7.3", + url = "https://github.com/tensorflow/text/archive/v2.7.3.zip", patches = ["@//third_party/tf_text:tftext.patch"], patch_args = ["-p1"], repo_mapping = {"@com_google_re2": "@com_googlesource_code_re2"}, diff --git a/third_party/tf_text/tftext.patch b/third_party/tf_text/tftext.patch index d0af8a65e14..5cd4fc6bd83 100644 --- a/third_party/tf_text/tftext.patch +++ b/third_party/tf_text/tftext.patch @@ -1,14 +1,78 @@ +diff --git a/tensorflow_text/core/kernels/fast_wordpiece_tokenizer.cc b/tensorflow_text/core/kernels/fast_wordpiece_tokenizer.cc +index c1f0e4e..a92ecd8 100644 +--- a/tensorflow_text/core/kernels/fast_wordpiece_tokenizer.cc ++++ b/tensorflow_text/core/kernels/fast_wordpiece_tokenizer.cc +@@ -32,7 +32,7 @@ namespace { + template + int GetCurrentOutputSize(std::vector* output_pieces, + std::vector* output_ids) { +- if constexpr (kGetPieces) { ++ if (kGetPieces) { + return output_pieces->size(); + } else { + return output_ids->size(); +@@ -538,10 +538,10 @@ void FastWordpieceTokenizer::AppendTokenToOutput( + std::vector* output_end_offsets) const { + auto token_id = + fast_wordpiece_tokenizer_utils::GetTokenId(encoded_token_value); +- if constexpr (kGetIds) { ++ if (kGetIds) { + output_ids->push_back(token_id); + } +- if constexpr (kGetPieces || kGetOffsets) { ++ if (kGetPieces || kGetOffsets) { + // For suffix tokens, the length below is without the suffix indicator. + int token_substr_length = + fast_wordpiece_tokenizer_utils::GetTokenLength(encoded_token_value); +@@ -553,7 +553,7 @@ void FastWordpieceTokenizer::AppendTokenToOutput( + // to adjust and add the length of the suffix indicator string. + token_substr_length += config_->suffix_indicator()->size(); + } +- if constexpr (kGetPieces) { ++ if (kGetPieces) { + // If token id is unk_token_id, it means that it is a dummy node for + // punctuations that are not contained in the vocabulary, we append + // the unk_token in this case. Otherwise, we +@@ -569,7 +569,7 @@ void FastWordpieceTokenizer::AppendTokenToOutput( + ? absl::StrCat(config_->suffix_indicator()->str(), subword_str) + : subword_str); + } +- if constexpr (kGetOffsets) { ++ if (kGetOffsets) { + // Record the offsets relative to the start of the whole text. + output_start_offsets->push_back(input_word_offset_in_text + + cur_offset_in_input_word); +@@ -646,15 +646,15 @@ void FastWordpieceTokenizer::ResetOutputAppendUnknownToken( + std::vector* output_pieces, std::vector* output_ids, + std::vector* output_start_offsets, + std::vector* output_end_offsets) const { +- if constexpr (kGetPieces) { ++ if (kGetPieces) { + output_pieces->resize(original_num_tokens + 1); + output_pieces->back() = config_->unk_token()->str(); + } +- if constexpr (kGetIds) { ++ if (kGetIds) { + output_ids->resize(original_num_tokens + 1); + output_ids->back() = config_->unk_token_id(); + } +- if constexpr (kGetOffsets) { ++ if (kGetOffsets) { + output_start_offsets->resize(original_num_tokens + 1); + output_start_offsets->back() = input_word_offset_in_text; + diff --git a/tensorflow_text/tftext.bzl b/tensorflow_text/tftext.bzl -index 96cb329..1bb98ec 100644 +index ff40480..b649cfc 100644 --- a/tensorflow_text/tftext.bzl +++ b/tensorflow_text/tftext.bzl -@@ -126,8 +126,7 @@ def tf_cc_library( +@@ -123,8 +123,8 @@ def tf_cc_library( "@org_tensorflow//tensorflow/core:portable_tensorflow_lib_lite", ], "//conditions:default": [ - "@local_config_tf//:libtensorflow_framework", - "@local_config_tf//:tf_header_lib", + "@org_tensorflow//tensorflow/core:tensorflow_opensource", ++ "@org_tensorflow//tensorflow/lite/kernels/shim:status_macros", "@org_tensorflow//tensorflow/lite/kernels/shim:tf_op_shim", "@org_tensorflow//tensorflow/lite/kernels/shim:op_kernel", "@org_tensorflow//tensorflow/lite/kernels/shim:tensor_view", "@org_tensorflow//tensorflow/lite/kernels/shim:shape", ] + tf_deps + oss_deps, }) native.cc_library( From 3798431a8c0cb6a4cb1c289a0b7d87c059389450 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 1 Aug 2022 18:01:21 -0700 Subject: [PATCH 6071/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f5f0f4c1-8882-41fa-91ae-2850d6db1dc1 PiperOrigin-RevId: 464667510 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ba72b18719b..bf94a563916 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d75f6cb6823a24e9a194d9b8a3ed6e06bc2f0ad59a81ea318af175f782c124c4", - git_commit = "01ef8fc6e36310ae1dbd077d3f28d57cd061abc8", + sha256 = "63c94e633e066155193440747c54485cc20d45b273ee0ead059a0a57b86681c7", + git_commit = "039156945c876a3e95e8c8e072c59ed24623b750", ) # Import all of TensorFlow Serving's external dependencies. From 23459df46c7ac0ee2151a42d00e4dc5d704003ba Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Aug 2022 00:01:29 -0700 Subject: [PATCH 6072/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ac49db6a-f68c-401a-9fc5-f298321e64b5 PiperOrigin-RevId: 464715509 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bf94a563916..15954a032ef 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "63c94e633e066155193440747c54485cc20d45b273ee0ead059a0a57b86681c7", - git_commit = "039156945c876a3e95e8c8e072c59ed24623b750", + sha256 = "bd4d689619a18bb414f3e593cc1d32982e6ff672c469e34e041873f050b609a3", + git_commit = "89f0aa136f7d57a11c487ad06d9689794908befd", ) # Import all of TensorFlow Serving's external dependencies. From f80a151b4dd4b464d863298d4d604160a48b0f66 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Aug 2022 06:01:28 -0700 Subject: [PATCH 6073/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7769430b-1e97-4d29-b83a-50d56ba26a5a PiperOrigin-RevId: 464770880 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 15954a032ef..4135321197e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bd4d689619a18bb414f3e593cc1d32982e6ff672c469e34e041873f050b609a3", - git_commit = "89f0aa136f7d57a11c487ad06d9689794908befd", + sha256 = "d8811e1659b404a7459e05bcefffeae087b04dc6d16df7b45c28813e9bbf8097", + git_commit = "ee2f5e75528a5c66d88a121a5cb46699fb80ed1d", ) # Import all of TensorFlow Serving's external dependencies. From 8748a3f7ec7a6c31261479dc3e47ea77faa745df Mon Sep 17 00:00:00 2001 From: Raviteja Gorijala Date: Tue, 2 Aug 2022 11:28:38 -0700 Subject: [PATCH 6074/8103] Add release notes for tf-serving 2.7.3 PiperOrigin-RevId: 464841965 --- RELEASE.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/RELEASE.md b/RELEASE.md index efb1f3b1d30..5c3e44b3fe0 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,3 +1,18 @@ +# Release 2.7.3 + +## Major Features and Improvements + +* No major features or improvements. + +## Breaking Changes + +* No breaking changes + +## Bug Fixes and Other Changes + +* Update TF Text to v2.7.3 (commit: ee7892be7801a0e4ae9a6dd8b5f7bab06ae9c87c) +* This release is based on TF version 2.7.3 + # Release 2.9.1 ## Major Features and Improvements From 47f6fdfc25471596b11ac181f6a75557af3c1799 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Aug 2022 12:01:31 -0700 Subject: [PATCH 6075/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0d45d8fd-ded6-49cc-9004-7b6455b5265a PiperOrigin-RevId: 464852460 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4135321197e..cef8dfd71c8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d8811e1659b404a7459e05bcefffeae087b04dc6d16df7b45c28813e9bbf8097", - git_commit = "ee2f5e75528a5c66d88a121a5cb46699fb80ed1d", + sha256 = "7bfbb747130a4eb5f3b56138a97c30a8b5e1c4eb8f9f91aea0341946fed41732", + git_commit = "cfc5ac84d80b705b8fc83350e7d5ca34e1daac17", ) # Import all of TensorFlow Serving's external dependencies. From 55ea7bc075cf65f254f9054ca18db6a814df5940 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 2 Aug 2022 18:01:21 -0700 Subject: [PATCH 6076/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c18dcd77-f346-497e-8ba5-9e76c7f55490 PiperOrigin-RevId: 464933155 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cef8dfd71c8..e12efcbc05f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7bfbb747130a4eb5f3b56138a97c30a8b5e1c4eb8f9f91aea0341946fed41732", - git_commit = "cfc5ac84d80b705b8fc83350e7d5ca34e1daac17", + sha256 = "5c2625ff7aff520af30e5ac13a78fb145b89ac8f99d5351582e9dd08be718f9c", + git_commit = "8e34bdd2efa458ad7099cc5e23cf5288f33c7e71", ) # Import all of TensorFlow Serving's external dependencies. From 7d6c108b1e97e189a5971a96374e6799336e5f74 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 3 Aug 2022 00:01:30 -0700 Subject: [PATCH 6077/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c86fed55-2ef3-474b-9d7a-2167a944cfff PiperOrigin-RevId: 464982982 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e12efcbc05f..d5243e893ae 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5c2625ff7aff520af30e5ac13a78fb145b89ac8f99d5351582e9dd08be718f9c", - git_commit = "8e34bdd2efa458ad7099cc5e23cf5288f33c7e71", + sha256 = "31eadff0cfd3eabdaae9312bf491cf32020b1ca3dcd2266b344efad6a1ffb24d", + git_commit = "42c62eecd6c20b072be562441d0d5e5c0fb430dc", ) # Import all of TensorFlow Serving's external dependencies. From 8829f54aa005074340383d0f6fd8c77eaf704788 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 3 Aug 2022 06:01:27 -0700 Subject: [PATCH 6078/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d8490d08-4f7c-4c69-b461-7e9b06c1d6f6 PiperOrigin-RevId: 465036036 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d5243e893ae..3aedb649c79 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "31eadff0cfd3eabdaae9312bf491cf32020b1ca3dcd2266b344efad6a1ffb24d", - git_commit = "42c62eecd6c20b072be562441d0d5e5c0fb430dc", + sha256 = "72241683de2ef2164cb073916862a67d3657212fa4f5686287069febcca37bd6", + git_commit = "e49b03f473dd84699bc4c91a45ee30aa4a3ceb3a", ) # Import all of TensorFlow Serving's external dependencies. From 2e8ce792ae259593597fce4913370eed773f5447 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 3 Aug 2022 12:01:37 -0700 Subject: [PATCH 6079/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0e8726d8-c52f-4a4b-ace4-d238a1ece5c7 PiperOrigin-RevId: 465113020 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3aedb649c79..a9c4bc65865 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "72241683de2ef2164cb073916862a67d3657212fa4f5686287069febcca37bd6", - git_commit = "e49b03f473dd84699bc4c91a45ee30aa4a3ceb3a", + sha256 = "b9e16327984e62c2d909cd3a63dd3fe14334ffcd381234e7b43cecf5fd88b61f", + git_commit = "c7680eeb0cb2ef2e02610a5a5942af6c85620fde", ) # Import all of TensorFlow Serving's external dependencies. From c5e8dc3e351ccc672b6655cc92ecb02a52b16264 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 3 Aug 2022 18:01:31 -0700 Subject: [PATCH 6080/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/00706ddd-d936-47e7-9e2a-f18d14c66e7a PiperOrigin-RevId: 465193753 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a9c4bc65865..f16eec737cd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b9e16327984e62c2d909cd3a63dd3fe14334ffcd381234e7b43cecf5fd88b61f", - git_commit = "c7680eeb0cb2ef2e02610a5a5942af6c85620fde", + sha256 = "28b26c192ab720b7fce96f0bf310e52acbb2586906cf0da6d0b69e3434160858", + git_commit = "a27c5c841be3f6cfbcb3148f68c0f6c28bf123a9", ) # Import all of TensorFlow Serving's external dependencies. From d77d96ed77c26d4e187768ffc03f22021c0270dd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Aug 2022 00:01:43 -0700 Subject: [PATCH 6081/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f526744f-55b9-4a81-a0b8-a8807beeb0dd PiperOrigin-RevId: 465240552 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f16eec737cd..f47a37b17e7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "28b26c192ab720b7fce96f0bf310e52acbb2586906cf0da6d0b69e3434160858", - git_commit = "a27c5c841be3f6cfbcb3148f68c0f6c28bf123a9", + sha256 = "b9a3653b203d949fff0707053d8ecb41f594c2c51667c5d0f2619ee292c1c891", + git_commit = "c0edbc8f170fd6b70ba0011cf2ad0092a5a98cc0", ) # Import all of TensorFlow Serving's external dependencies. From d03aeecee4d1a25553dd6ed49e2d9f8cbf60353d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Aug 2022 06:01:25 -0700 Subject: [PATCH 6082/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/07fc1efd-3425-49ed-8567-eec011af0da9 PiperOrigin-RevId: 465293381 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f47a37b17e7..e87848b38aa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b9a3653b203d949fff0707053d8ecb41f594c2c51667c5d0f2619ee292c1c891", - git_commit = "c0edbc8f170fd6b70ba0011cf2ad0092a5a98cc0", + sha256 = "e71b78392f6e75104e7cf1d8349867400f9929cb9ef55ca0ece3f5ada3c2a976", + git_commit = "cc2f2f1652d6d8571eb00068fd39b11e88f9bbf8", ) # Import all of TensorFlow Serving's external dependencies. From 7bf21eb8111b18f94219303130ac7c3e007cef7f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Aug 2022 12:01:29 -0700 Subject: [PATCH 6083/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3fa82fcf-0ce4-4c6a-bd41-49209dbcaa50 PiperOrigin-RevId: 465370761 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e87848b38aa..5a4b51fe64b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e71b78392f6e75104e7cf1d8349867400f9929cb9ef55ca0ece3f5ada3c2a976", - git_commit = "cc2f2f1652d6d8571eb00068fd39b11e88f9bbf8", + sha256 = "519ee4987c0042096f6b6cc82ace0a786e59b4c9b7ac06ddc93000c6c73641d9", + git_commit = "c56abf9f4e06105c088b2cb5a3293b73a458634d", ) # Import all of TensorFlow Serving's external dependencies. From 20655b5904fdb4a810bfd8aef22db8becd4e80f3 Mon Sep 17 00:00:00 2001 From: CJ Carey Date: Thu, 4 Aug 2022 14:13:28 -0700 Subject: [PATCH 6084/8103] No-op for public code. PiperOrigin-RevId: 465401814 --- tensorflow_serving/servables/tensorflow/util.cc | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/util.cc b/tensorflow_serving/servables/tensorflow/util.cc index fc858926440..7dbaa59d063 100644 --- a/tensorflow_serving/servables/tensorflow/util.cc +++ b/tensorflow_serving/servables/tensorflow/util.cc @@ -134,10 +134,16 @@ Status InputToSerializedExampleTensor(const Input& input, Tensor* examples) { // time get the count of num_examples as well. bool parse_serialized_input_ok = false; #if defined(PLATFORM_GOOGLE) - // Benchmark ('BM_InputToSerializedExample') can help measure the effect of - // changes in the future. - parse_serialized_input_ok = - serialized_input.ParseFromCord(input.SerializeAsCord()); + { + // Benchmark ('BM_InputToSerializedExample') can help measure the effect of + // changes in the future. + absl::Cord tmp; + if (!input.SerializeToCord(&tmp)) { + return errors::InvalidArgument("Input failed to serialize. Size = ", + input.ByteSizeLong()); + } + parse_serialized_input_ok = serialized_input.ParseFromCord(tmp); + } #else parse_serialized_input_ok = serialized_input.ParseFromString(input.SerializeAsString()); From 066be18a042dc2fd23d612460ae3b8c2dc1ed1bb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 4 Aug 2022 18:01:21 -0700 Subject: [PATCH 6085/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e573fb5c-7d56-4f4a-ae9e-2c05d345f4f3 PiperOrigin-RevId: 465448923 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5a4b51fe64b..6a644ce153f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "519ee4987c0042096f6b6cc82ace0a786e59b4c9b7ac06ddc93000c6c73641d9", - git_commit = "c56abf9f4e06105c088b2cb5a3293b73a458634d", + sha256 = "4e8c6ba4a39d5cb206341fa0f6d95bb7f11f98b0439fad84ee9af7f8bca106d6", + git_commit = "a0bc657d63da06aa44267ed04950664fa29a4fd0", ) # Import all of TensorFlow Serving's external dependencies. From a854cb89bdf388f1227a80c2cf379cb977a768a0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Aug 2022 00:01:29 -0700 Subject: [PATCH 6086/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/62eb71c4-30d6-436d-823d-fcf0542b1dc5 PiperOrigin-RevId: 465496708 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6a644ce153f..fd3b9ea97c5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4e8c6ba4a39d5cb206341fa0f6d95bb7f11f98b0439fad84ee9af7f8bca106d6", - git_commit = "a0bc657d63da06aa44267ed04950664fa29a4fd0", + sha256 = "6f0e9e1e00bc6ff8d22a8625106f1604f9b465a15810dbb51bea8fb74347953e", + git_commit = "c371435ab14c40b42caf8fab385cf4cc6d7965fc", ) # Import all of TensorFlow Serving's external dependencies. From 238435b5fece7f3cb89a75c55ab3e30a0bab2dd0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Aug 2022 06:01:26 -0700 Subject: [PATCH 6087/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/657eb277-ed29-4a73-9ad2-bbdb5d8cdce6 PiperOrigin-RevId: 465546089 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fd3b9ea97c5..ce4512d5e67 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6f0e9e1e00bc6ff8d22a8625106f1604f9b465a15810dbb51bea8fb74347953e", - git_commit = "c371435ab14c40b42caf8fab385cf4cc6d7965fc", + sha256 = "284cfd3f109b8714d5945c09f4cda1153a9093ff23140dce811369d69919f5a8", + git_commit = "1f4cb41d9d85380673059cb730bd731a38c24cd8", ) # Import all of TensorFlow Serving's external dependencies. From 27848d2c2348505345c15c3e71a7b36d248c07fe Mon Sep 17 00:00:00 2001 From: Raviteja Gorijala Date: Fri, 5 Aug 2022 11:04:08 -0700 Subject: [PATCH 6088/8103] Add release notes for tf-serving 2.10.0-rc0 PiperOrigin-RevId: 465602393 --- RELEASE.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/RELEASE.md b/RELEASE.md index 5c3e44b3fe0..f34f0461955 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,3 +1,27 @@ +# Release 2.10.0-rc0 + +## Major Features and Improvements + +* No major features or improvements. + +## Breaking Changes + +* No breaking changes + +## Bug Fixes and Other Changes + +* tfs:aarch64: add aarch64 mkl bazel config to enable onednn+acl backend (commit: 1285e41acc707ba0d18e8eaf8a42c6d5110e8af8) +* Match packages in devel and non-devel GPU with TF dockerfile. (commit: a8ffec79e0794650a4c0856c4122032e985296cc) +* Validate batching params when creating the wrapped (batching) session, (commit: 48ff72dcb6582e989452ba870c88a2bb710ea0c4) +* Merge and clean up implementations of `GetModelDiskSize` and `GetAllDescendants` in util.cc. (commit: 6da9c43c5f71abe361841fb3fd5eaad57fc847b1) +* Parallelize iteration over child files in `GetModelDiskSize` (commit: d09d2efe6e9b88ef0266e5982a3e732da14dc93b) +* Fix gpu docker build failure due to bad substitution (commit: 1d7cd5b2ba43c3d98f0c8bef6806c203b2c14592) +* Call run_returning_status instead of run (commit: 8f9085ac678755afea6bf0067fe40a32e37ce2fa) +* Fixing broken link for [ResNet in TensorFlow](https://www.tensorflow.org/api_docs/python/tf/keras/applications/resnet). (commit: b15210ca076b11eaa2dfd0ac2fb125be780c5d40) +* Update the TensorFlow BatchingSession metric monitoring class to be compatible with Google's internal monitoring tools. (commit: 05b944ad9367027a1082756a3069619f44955de1) +* Increase timeout for model tests. (commit: 677ba5a07813c4fb5a2ffb4567a7ec4a137eebe6) +* Use pb.h for topology.proto. (commit: 21fda280bc72bdbc4386c7b0d2ad4b97264921ad) + # Release 2.7.3 ## Major Features and Improvements From 395401989b0e882384f00ae8eea282eca19db7a6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Aug 2022 12:01:26 -0700 Subject: [PATCH 6089/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9a174913-944c-4574-bce2-c323192b72ce PiperOrigin-RevId: 465617484 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ce4512d5e67..7223f0c7c8f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "284cfd3f109b8714d5945c09f4cda1153a9093ff23140dce811369d69919f5a8", - git_commit = "1f4cb41d9d85380673059cb730bd731a38c24cd8", + sha256 = "4538cb294e5602042975b3b951eb27285363edb643abce4307743daab70cbed1", + git_commit = "ea80429637ec588545fb2b0712394333701a031a", ) # Import all of TensorFlow Serving's external dependencies. From cee0b3e3abfbbbb36b210ed421a6d85d0231428c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 5 Aug 2022 18:01:20 -0700 Subject: [PATCH 6090/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2bf106cc-c252-44f1-9b80-94284908d379 PiperOrigin-RevId: 465685303 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7223f0c7c8f..edfbb5d85b2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4538cb294e5602042975b3b951eb27285363edb643abce4307743daab70cbed1", - git_commit = "ea80429637ec588545fb2b0712394333701a031a", + sha256 = "3d3fc5f3bed7b0c110479274b9ee63bb51158f0f7e328d808332981d22eafc2d", + git_commit = "81c440628b6026dd92a8c9d148558249fe8a243c", ) # Import all of TensorFlow Serving's external dependencies. From c499d1cb7761129d2b85ebeaefd3bd87ad9a4ddc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 6 Aug 2022 00:01:43 -0700 Subject: [PATCH 6091/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7de26c5b-b7b0-488d-a57d-9373ced54df3 PiperOrigin-RevId: 465721241 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index edfbb5d85b2..588bbdef33f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3d3fc5f3bed7b0c110479274b9ee63bb51158f0f7e328d808332981d22eafc2d", - git_commit = "81c440628b6026dd92a8c9d148558249fe8a243c", + sha256 = "25a066fc2c804afb81e225166e0b5ae5f762c9fc8b713f295e7042e2fe4b1999", + git_commit = "6479186fba791386a5962f53c1e2d2cbf51c3dc0", ) # Import all of TensorFlow Serving's external dependencies. From a0c80e9d57d06fc58cca8d5d12a9dd5cb3918eac Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 6 Aug 2022 06:02:18 -0700 Subject: [PATCH 6092/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0b727dcf-8b2e-4de2-b0a1-fe7c65b69de7 PiperOrigin-RevId: 465755537 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 588bbdef33f..fdc55fde6b7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "25a066fc2c804afb81e225166e0b5ae5f762c9fc8b713f295e7042e2fe4b1999", - git_commit = "6479186fba791386a5962f53c1e2d2cbf51c3dc0", + sha256 = "7339efa7faba73e2b8f1da1684f6a7c45009c670001fe5fd03bcee83d4508e69", + git_commit = "f7bd96e6d866a22f020bfade79ca1f14b76724bb", ) # Import all of TensorFlow Serving's external dependencies. From c0ec9f2ba312d6c4706c331949f4d65461a9e5bc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 7 Aug 2022 00:01:36 -0700 Subject: [PATCH 6093/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5ac0049a-ed42-47bb-ab80-7a42e182b1f9 PiperOrigin-RevId: 465838010 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fdc55fde6b7..7d255b4db42 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7339efa7faba73e2b8f1da1684f6a7c45009c670001fe5fd03bcee83d4508e69", - git_commit = "f7bd96e6d866a22f020bfade79ca1f14b76724bb", + sha256 = "e348d3d2672310e9b8667473e5ed044def93e717fed213588f23eb3859c591ac", + git_commit = "079714df7864320ba1b2d07a6d31ff0799308960", ) # Import all of TensorFlow Serving's external dependencies. From 360c699e947dc5d5daf99a692476ba1948d7c6a2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 7 Aug 2022 06:01:25 -0700 Subject: [PATCH 6094/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d67f8975-6ffe-4faf-bdbf-38574a8e16ea PiperOrigin-RevId: 465868714 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7d255b4db42..d86fddd4193 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "e348d3d2672310e9b8667473e5ed044def93e717fed213588f23eb3859c591ac", - git_commit = "079714df7864320ba1b2d07a6d31ff0799308960", + sha256 = "79eb24a9af7d66e2e7316d37d53cd9a8b74875dfa5826efac6a214c2388591f9", + git_commit = "99a1782a03f531879c402e6c7ef8595c1d1af460", ) # Import all of TensorFlow Serving's external dependencies. From 2cde5ff61f42b400952f3884017e3520ed53b344 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 8 Aug 2022 00:01:36 -0700 Subject: [PATCH 6095/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/368184ee-3f46-4df4-8117-d1786d3afbe0 PiperOrigin-RevId: 465968399 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d86fddd4193..4f1af1475f0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "79eb24a9af7d66e2e7316d37d53cd9a8b74875dfa5826efac6a214c2388591f9", - git_commit = "99a1782a03f531879c402e6c7ef8595c1d1af460", + sha256 = "32949ad5163e05e2dcdbff1cbc01568285483d85aaff23d4b4927fe5159ba5c6", + git_commit = "31fab0597cbfa61ea34f07113f21a789c126eb59", ) # Import all of TensorFlow Serving's external dependencies. From f65a3eeba90c7e3bbbe7b8efc57be8f2a9ee0e8a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 8 Aug 2022 06:01:24 -0700 Subject: [PATCH 6096/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e19d0357-8d53-465b-9667-d7b8373a9f9a PiperOrigin-RevId: 466022163 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4f1af1475f0..f6271ef04fd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "32949ad5163e05e2dcdbff1cbc01568285483d85aaff23d4b4927fe5159ba5c6", - git_commit = "31fab0597cbfa61ea34f07113f21a789c126eb59", + sha256 = "b21949ff11ec4736e43338a15c7f9ac3640f7031ec15e6a357859c3c4f72b2a2", + git_commit = "548ea339318aea6401ec5767f1f815a77bd93718", ) # Import all of TensorFlow Serving's external dependencies. From 42a9b7fd655a561737b3c8e4dcd9359583f5b65e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 8 Aug 2022 12:01:27 -0700 Subject: [PATCH 6097/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ece14f61-9c4d-4109-8d3a-bfb69c45498b PiperOrigin-RevId: 466108716 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f6271ef04fd..b01a1f1c66d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b21949ff11ec4736e43338a15c7f9ac3640f7031ec15e6a357859c3c4f72b2a2", - git_commit = "548ea339318aea6401ec5767f1f815a77bd93718", + sha256 = "29feb8447b3b26d3e2ae25396de4878412a36556e15f57dd41c262df88f62cb9", + git_commit = "13ac4b60106e7b06b00bb196ddfac6716f9cc78c", ) # Import all of TensorFlow Serving's external dependencies. From 468e51721253c53fc2ea1e7fcec16f86287c218c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 8 Aug 2022 18:01:29 -0700 Subject: [PATCH 6098/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/788bc85f-8b20-475c-a00b-923ce7a1b63e PiperOrigin-RevId: 466202906 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b01a1f1c66d..1c7bc1ef3d5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "29feb8447b3b26d3e2ae25396de4878412a36556e15f57dd41c262df88f62cb9", - git_commit = "13ac4b60106e7b06b00bb196ddfac6716f9cc78c", + sha256 = "3f461421045d3349544cdaef978326a4197c00265745597f000aed75aa50860c", + git_commit = "d23cf0841af26fdb8abeb7e541616313afa98a0a", ) # Import all of TensorFlow Serving's external dependencies. From 7c8308b085737c4b0fd958e0f829befcb450ba2b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 9 Aug 2022 00:01:25 -0700 Subject: [PATCH 6099/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3972cc7c-5dcd-4248-a77c-7ec449f101fd PiperOrigin-RevId: 466263790 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1c7bc1ef3d5..c6585e0a155 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "3f461421045d3349544cdaef978326a4197c00265745597f000aed75aa50860c", - git_commit = "d23cf0841af26fdb8abeb7e541616313afa98a0a", + sha256 = "d13ebe5973956bfccb936e81e72d56bb8a57377aad88911d43970795527392b3", + git_commit = "22508dc6a463c4012362cadc76ba9de6b310b86f", ) # Import all of TensorFlow Serving's external dependencies. From 103d1a6f0eb42c8358d19e89069846883b1ce957 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 9 Aug 2022 06:01:23 -0700 Subject: [PATCH 6100/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a2ca40c6-4b70-4c92-9233-ea9fdb367ddb PiperOrigin-RevId: 466334078 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c6585e0a155..f51ab7dd30b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d13ebe5973956bfccb936e81e72d56bb8a57377aad88911d43970795527392b3", - git_commit = "22508dc6a463c4012362cadc76ba9de6b310b86f", + sha256 = "870328cc10185c40c79411b5be5959281764de05c43640e9bc1f916f9828100f", + git_commit = "389527382c8c3a305700962b83dc75cf5537dea0", ) # Import all of TensorFlow Serving's external dependencies. From 8962ffb49d56097cc7d5f329a1400da921710a51 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 9 Aug 2022 12:01:33 -0700 Subject: [PATCH 6101/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2144a086-d648-4b1d-9c4d-1acf9e894a2d PiperOrigin-RevId: 466427386 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f51ab7dd30b..6ae7b790872 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "870328cc10185c40c79411b5be5959281764de05c43640e9bc1f916f9828100f", - git_commit = "389527382c8c3a305700962b83dc75cf5537dea0", + sha256 = "c5a929c765cd969812e94865ddc0e942f063f9e4ac975616276f1b9ccc7bc081", + git_commit = "8f8bc9f323a06eaaa5b19e2369d6dfd5a5cb9fb0", ) # Import all of TensorFlow Serving's external dependencies. From 7a80c96cf7aa0832d067e836acf6310a5a6f2bd3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 9 Aug 2022 18:01:23 -0700 Subject: [PATCH 6102/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/798d7e68-ca21-48ea-bb80-f93076558479 PiperOrigin-RevId: 466523928 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6ae7b790872..78b14a55fb1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c5a929c765cd969812e94865ddc0e942f063f9e4ac975616276f1b9ccc7bc081", - git_commit = "8f8bc9f323a06eaaa5b19e2369d6dfd5a5cb9fb0", + sha256 = "d42c89bf2efdafa4b086d35b9856fda1bbadc91ea3c1c7ee208d909c0940eb38", + git_commit = "f12aa0d9d3d1a1cc2767ab76e71435ac95ba0528", ) # Import all of TensorFlow Serving's external dependencies. From d01e73bbf5502dc87703ccdbc691169e649a398e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Aug 2022 00:01:25 -0700 Subject: [PATCH 6103/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/643de078-fff2-43b2-85b1-9f50e3ddcc11 PiperOrigin-RevId: 466590704 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 78b14a55fb1..e76a7f7f2a5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d42c89bf2efdafa4b086d35b9856fda1bbadc91ea3c1c7ee208d909c0940eb38", - git_commit = "f12aa0d9d3d1a1cc2767ab76e71435ac95ba0528", + sha256 = "627678b17de68c0c511ffb295a1c92fe8458401d488c807980fa8314f1f95374", + git_commit = "f16d1f0568a9d01af5ead4987748a1531cd2deef", ) # Import all of TensorFlow Serving's external dependencies. From 38fd810613f5f9ef17e85f6bea4ea1936dd7c3df Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Aug 2022 06:01:24 -0700 Subject: [PATCH 6104/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f6ec7ac6-fa50-4b6b-9fff-5a72b0f46047 PiperOrigin-RevId: 466659492 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e76a7f7f2a5..96ed3b02384 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "627678b17de68c0c511ffb295a1c92fe8458401d488c807980fa8314f1f95374", - git_commit = "f16d1f0568a9d01af5ead4987748a1531cd2deef", + sha256 = "b0d13b90199367b69beebcc436fae37d0db4b53dc16ed1cfd07bec07af397b50", + git_commit = "d3494e7679a4d000837caea9b0ff3f3ac7750919", ) # Import all of TensorFlow Serving's external dependencies. From 14dcef36144410f65b9eb74b268c1555572b2cad Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Aug 2022 12:01:35 -0700 Subject: [PATCH 6105/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4d4aa886-823e-45a1-97fa-546a7cf39b75 PiperOrigin-RevId: 466752811 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 96ed3b02384..138b2b72153 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b0d13b90199367b69beebcc436fae37d0db4b53dc16ed1cfd07bec07af397b50", - git_commit = "d3494e7679a4d000837caea9b0ff3f3ac7750919", + sha256 = "f62128cff26199945a41018e4846b6fd387be0e072394c9716ed64d59144ffc9", + git_commit = "ade9a09fb78de6abe032d81f9c6f731fc63f518e", ) # Import all of TensorFlow Serving's external dependencies. From cc58711223392af8ef1a2fe05b4c6ed1370d81b6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 10 Aug 2022 18:15:37 -0700 Subject: [PATCH 6106/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/4fb7f109-f917-49f5-ae1b-57715c8e9a24 PiperOrigin-RevId: 466830234 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 138b2b72153..5aca35ff527 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f62128cff26199945a41018e4846b6fd387be0e072394c9716ed64d59144ffc9", - git_commit = "ade9a09fb78de6abe032d81f9c6f731fc63f518e", + sha256 = "44d4f65d6fbcd949bb698981fc5c35c746abe0435ac5132ba207fa9fd11414d9", + git_commit = "f4ee6b9f399964ea9896bac57183aaf88b7b5abe", ) # Import all of TensorFlow Serving's external dependencies. From e465871f05e1b58394a3fb4babb1987a28afa199 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Aug 2022 12:01:48 -0700 Subject: [PATCH 6107/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3eb4e9c0-3ebd-493b-a9e7-997afa1add06 PiperOrigin-RevId: 467014846 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5aca35ff527..8b71093a120 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "44d4f65d6fbcd949bb698981fc5c35c746abe0435ac5132ba207fa9fd11414d9", - git_commit = "f4ee6b9f399964ea9896bac57183aaf88b7b5abe", + sha256 = "ee63e7339f4f05ae5e188deccf1b2d8c25c47789dc01bbf315538747a19056a8", + git_commit = "058b4aa88e8ea6c232fae5b89da511c122b0f300", ) # Import all of TensorFlow Serving's external dependencies. From e44a585eec968dc292b3abc898d797d065b0c351 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 11 Aug 2022 18:01:34 -0700 Subject: [PATCH 6108/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f027f93c-e4bb-4779-842c-461e5fb07886 PiperOrigin-RevId: 467093783 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8b71093a120..5185479ffde 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ee63e7339f4f05ae5e188deccf1b2d8c25c47789dc01bbf315538747a19056a8", - git_commit = "058b4aa88e8ea6c232fae5b89da511c122b0f300", + sha256 = "b6bb84938af34cae1b3c9e2d9da1bb5028d3d3280a9faa937525134d935a4689", + git_commit = "e6566ebfb11ac45323bcba42f85c1568f2ad84f9", ) # Import all of TensorFlow Serving's external dependencies. From 7e88aada783360372ee56e7638bfc37d912253cd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Aug 2022 00:01:45 -0700 Subject: [PATCH 6109/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/93f6ee86-3005-4896-a0ee-735c977f07ac PiperOrigin-RevId: 467138663 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5185479ffde..8377db65a84 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b6bb84938af34cae1b3c9e2d9da1bb5028d3d3280a9faa937525134d935a4689", - git_commit = "e6566ebfb11ac45323bcba42f85c1568f2ad84f9", + sha256 = "68abd0be76348fa265963b9c66d878cc8bb9b8bd08b23c9d192bdd956ff067dd", + git_commit = "d6edcb244bcf352fb1a1ca8b957046ce0bb13fdb", ) # Import all of TensorFlow Serving's external dependencies. From 62fd08b5969ec57bfb54be29c566173413a02281 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Aug 2022 06:01:37 -0700 Subject: [PATCH 6110/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/32a48623-6a0f-4c10-b64b-6e4f3e3dd064 PiperOrigin-RevId: 467192285 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8377db65a84..bedf7374fb8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "68abd0be76348fa265963b9c66d878cc8bb9b8bd08b23c9d192bdd956ff067dd", - git_commit = "d6edcb244bcf352fb1a1ca8b957046ce0bb13fdb", + sha256 = "13c387193102ed69b46ea43a7de00db1dcf64770edda9b8014490e6b223460fd", + git_commit = "0951632e45fed605600f9f482014a884e424ae76", ) # Import all of TensorFlow Serving's external dependencies. From aa90754b5c538096ad0659f4cb1b237a33d2c1eb Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Aug 2022 12:01:28 -0700 Subject: [PATCH 6111/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8c55e207-c483-4f4d-8e9a-f92cdb96d95d PiperOrigin-RevId: 467263139 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bedf7374fb8..592cb12a7b1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "13c387193102ed69b46ea43a7de00db1dcf64770edda9b8014490e6b223460fd", - git_commit = "0951632e45fed605600f9f482014a884e424ae76", + sha256 = "bed98ea7f8f59d89f39308860981a09b672eafbe5b2d139d088782fcb6411987", + git_commit = "0b6717ad70c61086d06809b38564710c516f4664", ) # Import all of TensorFlow Serving's external dependencies. From 41f934becdd0e2f06d190f5cf301da2dc4be31d1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 12 Aug 2022 18:01:36 -0700 Subject: [PATCH 6112/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/0008bdb5-4526-46a5-9d73-3539aa3e5a9f PiperOrigin-RevId: 467333437 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 592cb12a7b1..a1b6717453c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bed98ea7f8f59d89f39308860981a09b672eafbe5b2d139d088782fcb6411987", - git_commit = "0b6717ad70c61086d06809b38564710c516f4664", + sha256 = "16ae1575b9012700d513a374517f132ba73cba48520687b23fbb850608592418", + git_commit = "db84fb33e9c075855685064dedf7923ee05b9eff", ) # Import all of TensorFlow Serving's external dependencies. From ddf44c0131aee26ef49b4d4f23583e2708820844 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 13 Aug 2022 12:01:34 -0700 Subject: [PATCH 6113/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1cb1a7ce-7865-43ef-9ac3-c21a5201f46f PiperOrigin-RevId: 467427463 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a1b6717453c..05063063a3f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "16ae1575b9012700d513a374517f132ba73cba48520687b23fbb850608592418", - git_commit = "db84fb33e9c075855685064dedf7923ee05b9eff", + sha256 = "6c873c8d0c71b8e3b0732975d319c9a3303d900a2270f2d226eaa564db1f8d76", + git_commit = "49f97f135a2e1d5d22e60d2a80ec668d53f9708a", ) # Import all of TensorFlow Serving's external dependencies. From 5b18a3df9f524e9f29fee92e5bf94066e364edfd Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 14 Aug 2022 00:01:29 -0700 Subject: [PATCH 6114/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1102c5aa-dedd-49d8-91db-e09af1a2a212 PiperOrigin-RevId: 467482078 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 05063063a3f..068ea7bdf07 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6c873c8d0c71b8e3b0732975d319c9a3303d900a2270f2d226eaa564db1f8d76", - git_commit = "49f97f135a2e1d5d22e60d2a80ec668d53f9708a", + sha256 = "bc19c1bcb934f6a8e663f85c728d3a7cf26a3d815ded898ef2f1559f50fa2bde", + git_commit = "edad11233bce065a07a6c6bd5041f4f1ba9021b1", ) # Import all of TensorFlow Serving's external dependencies. From fdf51365af8ec79499e5650daab57b097f813647 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 14 Aug 2022 06:01:22 -0700 Subject: [PATCH 6115/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1e155bc9-5089-4270-929e-46526fa90b0e PiperOrigin-RevId: 467511797 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 068ea7bdf07..8748a3d98bd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bc19c1bcb934f6a8e663f85c728d3a7cf26a3d815ded898ef2f1559f50fa2bde", - git_commit = "edad11233bce065a07a6c6bd5041f4f1ba9021b1", + sha256 = "b5971e26301c0f6875269ebe59eaf4be18b659c7c13de8bf0c6b6a2a5495296f", + git_commit = "f9aa9e6b869c6f2f169a9c5c32932da4d0a4f490", ) # Import all of TensorFlow Serving's external dependencies. From 14f545f7af8348ae436b8562096422e94d0d5e98 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 15 Aug 2022 00:01:29 -0700 Subject: [PATCH 6116/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9ecfe0c8-37a8-46b1-b3f7-11d666b86fa9 PiperOrigin-RevId: 467603051 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8748a3d98bd..84c0ee82e2e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b5971e26301c0f6875269ebe59eaf4be18b659c7c13de8bf0c6b6a2a5495296f", - git_commit = "f9aa9e6b869c6f2f169a9c5c32932da4d0a4f490", + sha256 = "b2df5502dd0c53ff01d9693a531ac6c8c05c0d9471ef4dfc042123463eeb1055", + git_commit = "0ffaf4f9193f2a0765d096d5f7d771912ca0a6a3", ) # Import all of TensorFlow Serving's external dependencies. From 6800164520b72834be3f43c2c58c4179806e85d9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 15 Aug 2022 06:01:27 -0700 Subject: [PATCH 6117/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ccb7884c-e3ef-49f8-adb2-6614b3b9882d PiperOrigin-RevId: 467650746 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 84c0ee82e2e..ac8def64bb0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b2df5502dd0c53ff01d9693a531ac6c8c05c0d9471ef4dfc042123463eeb1055", - git_commit = "0ffaf4f9193f2a0765d096d5f7d771912ca0a6a3", + sha256 = "7d402e649d0615330e3ba9a475aa2443fc1d56f9bfcc6e75f43dabbbe8ba4af9", + git_commit = "1fcfa1a9de831103a606a0162ac61e8a85ccde97", ) # Import all of TensorFlow Serving's external dependencies. From e8105cc316418657df1979d3e8cca928f341fd8e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 15 Aug 2022 12:01:27 -0700 Subject: [PATCH 6118/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/683e7aaf-2551-4afe-badf-60d20ac3f84c PiperOrigin-RevId: 467727334 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ac8def64bb0..bb6ef9e4b85 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7d402e649d0615330e3ba9a475aa2443fc1d56f9bfcc6e75f43dabbbe8ba4af9", - git_commit = "1fcfa1a9de831103a606a0162ac61e8a85ccde97", + sha256 = "1019035314bd4658ec0176da004b5898d61ad97596e234dd03b0ddac40aa5359", + git_commit = "5ddb6d71ec0ebb8d244a551f9adf1993e1e574b1", ) # Import all of TensorFlow Serving's external dependencies. From 0c8e01ae605021d7c1340e22c21ead627dd4eca6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 15 Aug 2022 18:01:30 -0700 Subject: [PATCH 6119/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/80ef267b-70ba-4d43-bec1-8d04d72056a2 PiperOrigin-RevId: 467806062 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bb6ef9e4b85..f118c8f87ef 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1019035314bd4658ec0176da004b5898d61ad97596e234dd03b0ddac40aa5359", - git_commit = "5ddb6d71ec0ebb8d244a551f9adf1993e1e574b1", + sha256 = "350ae39947873931aa55a76e87b1e4ea7dd3073053cae2563761dd1228e8d7cd", + git_commit = "4ee81c2870b5e3672d3e947ee3812acdf47d41c2", ) # Import all of TensorFlow Serving's external dependencies. From 0cc317af05eeee5de67ac11cdd8a509a934f8c30 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 16 Aug 2022 00:01:41 -0700 Subject: [PATCH 6120/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d080db4e-d840-40d6-bd72-9c6c1cc6bba6 PiperOrigin-RevId: 467850478 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f118c8f87ef..85807316b5f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "350ae39947873931aa55a76e87b1e4ea7dd3073053cae2563761dd1228e8d7cd", - git_commit = "4ee81c2870b5e3672d3e947ee3812acdf47d41c2", + sha256 = "6d83627541f639c025a6143d0d2a3c5c50793df1e91a9c8c2e4d5a7523d6b57c", + git_commit = "e7c55d0b23d5d5fb6fa930b2c582dac51e767a0b", ) # Import all of TensorFlow Serving's external dependencies. From c90744e75827bf25b7396fbcaa1d88748b474925 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 16 Aug 2022 06:01:36 -0700 Subject: [PATCH 6121/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/dac2cba7-abc3-4f97-96af-1f34a12af886 PiperOrigin-RevId: 467904918 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 85807316b5f..bc24b631dd3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6d83627541f639c025a6143d0d2a3c5c50793df1e91a9c8c2e4d5a7523d6b57c", - git_commit = "e7c55d0b23d5d5fb6fa930b2c582dac51e767a0b", + sha256 = "1d4ccd16e5ac50bd1fcdec4d42d6d50a6295d025d1282da1b166e0bcbfbde9d6", + git_commit = "8a14428882b6a39aadcb9f62e83dbaee36c44e49", ) # Import all of TensorFlow Serving's external dependencies. From e64a73afc23ea8f9538660cb8bc20f48d5682848 Mon Sep 17 00:00:00 2001 From: Wenbo Zhu Date: Tue, 16 Aug 2022 11:03:55 -0700 Subject: [PATCH 6122/8103] Removed net_http/client/public/* now that all the users have been migrated to test_client/ PiperOrigin-RevId: 467972322 --- .../util/net_http/client/internal/BUILD | 2 +- .../client/internal/evhttp_connection.cc | 17 ++-- .../client/internal/evhttp_connection.h | 12 +-- .../util/net_http/client/public/BUILD | 38 --------- .../util/net_http/client/public/httpclient.h | 48 ----------- .../client/public/httpclient_interface.h | 85 ------------------- .../client/testing/evhttp_echo_client.cc | 8 +- 7 files changed, 20 insertions(+), 190 deletions(-) delete mode 100644 tensorflow_serving/util/net_http/client/public/BUILD delete mode 100644 tensorflow_serving/util/net_http/client/public/httpclient.h delete mode 100644 tensorflow_serving/util/net_http/client/public/httpclient_interface.h diff --git a/tensorflow_serving/util/net_http/client/internal/BUILD b/tensorflow_serving/util/net_http/client/internal/BUILD index 5e42816c6a7..03a05479dfe 100644 --- a/tensorflow_serving/util/net_http/client/internal/BUILD +++ b/tensorflow_serving/util/net_http/client/internal/BUILD @@ -17,7 +17,7 @@ cc_library( "evhttp_connection.h", ], deps = [ - "//tensorflow_serving/util/net_http/client/public:http_client_api", + "//tensorflow_serving/util/net_http/client/test_client/public:http_client_api", "//tensorflow_serving/util/net_http/internal:net_logging", "//tensorflow_serving/util/net_http/server/public:http_server_api", "@com_github_libevent_libevent//:libevent", diff --git a/tensorflow_serving/util/net_http/client/internal/evhttp_connection.cc b/tensorflow_serving/util/net_http/client/internal/evhttp_connection.cc index 1ae587a64a1..afe5d9117df 100644 --- a/tensorflow_serving/util/net_http/client/internal/evhttp_connection.cc +++ b/tensorflow_serving/util/net_http/client/internal/evhttp_connection.cc @@ -103,7 +103,7 @@ std::unique_ptr EvHTTPConnection::Connect( namespace { // Copy ev response data to ClientResponse. -void PopulateResponse(evhttp_request* req, ClientResponse* response) { +void PopulateResponse(evhttp_request* req, TestClientResponse* response) { response->status = static_cast(evhttp_request_get_response_code(req)); @@ -152,7 +152,7 @@ evhttp_cmd_type GetMethodEnum(absl::string_view method, bool with_body) { } void ResponseDone(evhttp_request* req, void* ctx) { - ClientResponse* response = reinterpret_cast(ctx); + TestClientResponse* response = reinterpret_cast(ctx); if (req == nullptr) { // TODO(wenboz): make this a util and check safety @@ -170,8 +170,9 @@ void ResponseDone(evhttp_request* req, void* ctx) { } // Returns false if there is any error. -bool GenerateEvRequest(evhttp_connection* evcon, const ClientRequest& request, - ClientResponse* response) { +bool GenerateEvRequest(evhttp_connection* evcon, + const TestClientRequest& request, + TestClientResponse* response) { evhttp_request* evreq = evhttp_request_new(ResponseDone, response); if (evreq == nullptr) { NET_LOG(ERROR, "Failed to send request : evhttp_request_new()"); @@ -214,8 +215,8 @@ bool GenerateEvRequest(evhttp_connection* evcon, const ClientRequest& request, } // namespace // Sends the request and has the connection closed -bool EvHTTPConnection::BlockingSendRequest(const ClientRequest& request, - ClientResponse* response) { +bool EvHTTPConnection::BlockingSendRequest(const TestClientRequest& request, + TestClientResponse* response) { if (!GenerateEvRequest(evcon_, request, response)) { NET_LOG(ERROR, "Failed to generate the ev_request"); return false; @@ -226,8 +227,8 @@ bool EvHTTPConnection::BlockingSendRequest(const ClientRequest& request, return true; } -bool EvHTTPConnection::SendRequest(const ClientRequest& request, - ClientResponse* response) { +bool EvHTTPConnection::SendRequest(const TestClientRequest& request, + TestClientResponse* response) { if (this->executor_ == nullptr) { NET_LOG(ERROR, "EventExecutor is not configured."); return false; diff --git a/tensorflow_serving/util/net_http/client/internal/evhttp_connection.h b/tensorflow_serving/util/net_http/client/internal/evhttp_connection.h index b58e3e13088..976fd6c4dee 100644 --- a/tensorflow_serving/util/net_http/client/internal/evhttp_connection.h +++ b/tensorflow_serving/util/net_http/client/internal/evhttp_connection.h @@ -33,7 +33,7 @@ limitations under the License. #include "libevent/include/event2/util.h" // TODO(wenboz): move EventExecutor to net_http/common -#include "tensorflow_serving/util/net_http/client/public/httpclient_interface.h" +#include "tensorflow_serving/util/net_http/client/test_client/public/httpclient_interface.h" #include "tensorflow_serving/util/net_http/server/public/httpserver_interface.h" namespace tensorflow { @@ -42,7 +42,7 @@ namespace net_http { // The following types may be moved to an API interface in future. -class EvHTTPConnection final : public HTTPClientInterface { +class EvHTTPConnection final : public TestHTTPClientInterface { public: EvHTTPConnection() = default; @@ -73,15 +73,15 @@ class EvHTTPConnection final : public HTTPClientInterface { // Sends a request and blocks the caller till a response is received // or any error has happened. // Returns false if any error. - bool BlockingSendRequest(const ClientRequest& request, - ClientResponse* response) override; + bool BlockingSendRequest(const TestClientRequest& request, + TestClientResponse* response) override; // Sends a request and returns immediately. The response will be handled // asynchronously via the response->done callback. // Returns false if any error in sending the request, or if the executor // has not been configured. - bool SendRequest(const ClientRequest& request, - ClientResponse* response) override; + bool SendRequest(const TestClientRequest& request, + TestClientResponse* response) override; // Sets the executor for processing requests asynchronously. void SetExecutor(std::unique_ptr executor) override; diff --git a/tensorflow_serving/util/net_http/client/public/BUILD b/tensorflow_serving/util/net_http/client/public/BUILD deleted file mode 100644 index 34e9d41fe0e..00000000000 --- a/tensorflow_serving/util/net_http/client/public/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -# Description: APIs for experimental testing of net_http server instances - -package( - default_visibility = [ - ":http_client_users", - "//tensorflow_serving/util/net_http:__subpackages__", - ], -) - -package_group( - name = "http_client_users", - packages = [ - "//third_party/ecclesia/...", - ], -) - -licenses(["notice"]) - -cc_library( - name = "http_client_api", - srcs = [], - hdrs = [ - "httpclient_interface.h", - ], - deps = ["//tensorflow_serving/util/net_http/server/public:http_server_api"], -) - -cc_library( - name = "http_client", - hdrs = [ - "httpclient.h", - ], - deps = [ - ":http_client_api", - "//tensorflow_serving/util/net_http/client/internal:evhttp_client", - "@com_google_absl//absl/memory", - ], -) diff --git a/tensorflow_serving/util/net_http/client/public/httpclient.h b/tensorflow_serving/util/net_http/client/public/httpclient.h deleted file mode 100644 index 315394b3bb5..00000000000 --- a/tensorflow_serving/util/net_http/client/public/httpclient.h +++ /dev/null @@ -1,48 +0,0 @@ -/* Copyright 2020 Google Inc. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#ifndef THIRD_PARTY_TENSORFLOW_SERVING_UTIL_NET_HTTP_CLIENT_PUBLIC_HTTPCLIENT_H_ -#define THIRD_PARTY_TENSORFLOW_SERVING_UTIL_NET_HTTP_CLIENT_PUBLIC_HTTPCLIENT_H_ - -#include "absl/memory/memory.h" -#include "tensorflow_serving/util/net_http/client/internal/evhttp_connection.h" -#include "tensorflow_serving/util/net_http/client/public/httpclient_interface.h" - -// Factory to manage internal dependency -// NOTE: This API is not yet finalized, and should in its current state be -// considered experimental - -namespace tensorflow { -namespace serving { -namespace net_http { - -// Creates a connection to a server implemented based on the libevents library. -// Returns nullptr if there is any error. -inline std::unique_ptr CreateEvHTTPConnection( - absl::string_view host, int port) { - auto connection = absl::make_unique(); - connection = connection->Connect(host, port); - if (!connection) { - return nullptr; - } - - return std::move(connection); -} - -} // namespace net_http -} // namespace serving -} // namespace tensorflow - -#endif // THIRD_PARTY_TENSORFLOW_SERVING_UTIL_NET_HTTP_CLIENT_PUBLIC_HTTPCLIENT_H_ diff --git a/tensorflow_serving/util/net_http/client/public/httpclient_interface.h b/tensorflow_serving/util/net_http/client/public/httpclient_interface.h deleted file mode 100644 index cdc59c91ba5..00000000000 --- a/tensorflow_serving/util/net_http/client/public/httpclient_interface.h +++ /dev/null @@ -1,85 +0,0 @@ -/* Copyright 2020 Google Inc. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#ifndef THIRD_PARTY_TENSORFLOW_SERVING_UTIL_NET_HTTP_CLIENT_PUBLIC_HTTPCLIENT_INTERFACE_H_ -#define THIRD_PARTY_TENSORFLOW_SERVING_UTIL_NET_HTTP_CLIENT_PUBLIC_HTTPCLIENT_INTERFACE_H_ - -#include "tensorflow_serving/util/net_http/server/public/httpserver_interface.h" -#include "tensorflow_serving/util/net_http/server/public/response_code_enum.h" - -// API for the HTTP Client -// NOTE: This API is not yet finalized, and should be considered experimental. - -namespace tensorflow { -namespace serving { -namespace net_http { - -// Data to be copied -struct ClientRequest { - typedef std::pair HeaderKeyValue; - - absl::string_view uri_path; - absl::string_view method; // must be in upper-case - std::vector headers; - absl::string_view body; -}; - -// Caller allocates the data for output -struct ClientResponse { - typedef std::pair HeaderKeyValue; - - HTTPStatusCode status = HTTPStatusCode::UNDEFINED; - std::vector headers; - std::string body; - - std::function done; // callback -}; - -// This interface class specifies the API contract for the HTTP client. -class HTTPClientInterface { - public: - HTTPClientInterface(const HTTPClientInterface& other) = delete; - HTTPClientInterface& operator=(const HTTPClientInterface& other) = delete; - - virtual ~HTTPClientInterface() = default; - - // Terminates the connection. - virtual void Terminate() = 0; - - // Sends a request and blocks the caller till a response is received - // or any error has happened. - // Returns false if any error. - virtual bool BlockingSendRequest(const ClientRequest& request, - ClientResponse* response) = 0; - - // Sends a request and returns immediately. The response will be handled - // asynchronously via the response->done callback. - // Returns false if any error in sending the request, or if the executor - // has not been configured. - virtual bool SendRequest(const ClientRequest& request, - ClientResponse* response) = 0; - - // Sets the executor for processing requests asynchronously. - virtual void SetExecutor(std::unique_ptr executor) = 0; - - protected: - HTTPClientInterface() = default; -}; - -} // namespace net_http -} // namespace serving -} // namespace tensorflow - -#endif // THIRD_PARTY_TENSORFLOW_SERVING_UTIL_NET_HTTP_CLIENT_PUBLIC_HTTPCLIENT_INTERFACE_H_ diff --git a/tensorflow_serving/util/net_http/client/testing/evhttp_echo_client.cc b/tensorflow_serving/util/net_http/client/testing/evhttp_echo_client.cc index d0981682c34..79f929d13c3 100644 --- a/tensorflow_serving/util/net_http/client/testing/evhttp_echo_client.cc +++ b/tensorflow_serving/util/net_http/client/testing/evhttp_echo_client.cc @@ -22,9 +22,9 @@ limitations under the License. namespace { -using tensorflow::serving::net_http::ClientRequest; -using tensorflow::serving::net_http::ClientResponse; using tensorflow::serving::net_http::EvHTTPConnection; +using tensorflow::serving::net_http::TestClientRequest; +using tensorflow::serving::net_http::TestClientResponse; bool SendRequest(const char* url) { auto connection = EvHTTPConnection::Connect(url); @@ -32,8 +32,8 @@ bool SendRequest(const char* url) { std::cerr << "Fail to connect to %s" << url; } - ClientRequest request = {url, "GET", {}, ""}; - ClientResponse response = {}; + TestClientRequest request = {url, "GET", {}, ""}; + TestClientResponse response = {}; if (!connection->BlockingSendRequest(request, &response)) { std::cerr << "Request failed."; From 35efa8b95b0b4245565a3fae0255286eecd9f091 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 16 Aug 2022 12:01:33 -0700 Subject: [PATCH 6123/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/93b7bff3-5586-4587-b976-4ca5d5f7a64c PiperOrigin-RevId: 467987853 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bc24b631dd3..c599c31b974 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1d4ccd16e5ac50bd1fcdec4d42d6d50a6295d025d1282da1b166e0bcbfbde9d6", - git_commit = "8a14428882b6a39aadcb9f62e83dbaee36c44e49", + sha256 = "8a258588c71b8994c8d651ef2c6d0cc1847f1444090bbfcb2d575a4839107af1", + git_commit = "8c9a0432a2986527032bc2c4267b36dd1b7e2825", ) # Import all of TensorFlow Serving's external dependencies. From 2d98012e789a4ac7c4e97fcf5c30aeaef43f02f8 Mon Sep 17 00:00:00 2001 From: Raviteja Gorijala Date: Tue, 16 Aug 2022 13:25:10 -0700 Subject: [PATCH 6124/8103] Add release notes for tf-serving 2.10.0-rc1 PiperOrigin-RevId: 468008553 --- RELEASE.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/RELEASE.md b/RELEASE.md index f34f0461955..42d9c1ac6bd 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,3 +1,17 @@ +# Release 2.10.0-rc1 + +## Major Features and Improvements + +* No major features or improvements. + +## Breaking Changes + +* No breaking changes + +## Bug Fixes and Other Changes + +* This release is based on TF version 2.10.0-rc1 + # Release 2.10.0-rc0 ## Major Features and Improvements From dff9f9d3f34d9315daa6b84c8db89be58ade9866 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 16 Aug 2022 18:01:25 -0700 Subject: [PATCH 6125/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/51bea438-33ef-480e-a0ca-fb37356694da PiperOrigin-RevId: 468071920 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c599c31b974..598cd8ab058 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8a258588c71b8994c8d651ef2c6d0cc1847f1444090bbfcb2d575a4839107af1", - git_commit = "8c9a0432a2986527032bc2c4267b36dd1b7e2825", + sha256 = "fc1a7a8987d3108be7592ae550b2fd69d7a635414828b5c91df894b231519833", + git_commit = "d4f6b1a949c5b62a813a180dc6f955efb642aa12", ) # Import all of TensorFlow Serving's external dependencies. From a2b802bff2baf05e3859444d3912d7f9429dc0c3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Aug 2022 00:01:24 -0700 Subject: [PATCH 6126/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8ffb0d97-b842-4b98-9425-631314e64dd7 PiperOrigin-RevId: 468119050 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 598cd8ab058..438558b57fc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fc1a7a8987d3108be7592ae550b2fd69d7a635414828b5c91df894b231519833", - git_commit = "d4f6b1a949c5b62a813a180dc6f955efb642aa12", + sha256 = "4eb6f7a187023f1d9733f6a53c691e0c735e63ae8e25b3cc844f02c9014f52d8", + git_commit = "744a9d49ee6a5a5555c965e769e9779ed9f9cb29", ) # Import all of TensorFlow Serving's external dependencies. From 5aaf5c9a705f9da56b527f28ac86055a9d47d6a2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Aug 2022 06:01:32 -0700 Subject: [PATCH 6127/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1e0eab63-7d38-4378-8b28-d2526e9395b5 PiperOrigin-RevId: 468176977 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 438558b57fc..a0c7c0009a3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4eb6f7a187023f1d9733f6a53c691e0c735e63ae8e25b3cc844f02c9014f52d8", - git_commit = "744a9d49ee6a5a5555c965e769e9779ed9f9cb29", + sha256 = "81f6e0fed898dcb38d7c2ed146fa9be04d46d69b4a2fc7e26d7591806898d1a2", + git_commit = "a9231bfcce568fb6bd9bceec2b0eabf83cccc737", ) # Import all of TensorFlow Serving's external dependencies. From 22cf72e3a4aa6a241f4cedf7dcdea9a8c7aa071f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Aug 2022 12:01:31 -0700 Subject: [PATCH 6128/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6061187e-530c-4726-9301-43dee975dd5c PiperOrigin-RevId: 468259479 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a0c7c0009a3..3a751a172ba 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "81f6e0fed898dcb38d7c2ed146fa9be04d46d69b4a2fc7e26d7591806898d1a2", - git_commit = "a9231bfcce568fb6bd9bceec2b0eabf83cccc737", + sha256 = "22011aea5a03994bd2dc71a7e943ba9ae6df49b5ef20194aa5d9144b680c680d", + git_commit = "13c1ce43cbbc2eeb17fa372cd0af1f89fb6f9926", ) # Import all of TensorFlow Serving's external dependencies. From ac91b36c15699335bc417658577fbd6f39768701 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 17 Aug 2022 18:01:26 -0700 Subject: [PATCH 6129/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fc8f97ba-674b-4c03-93f6-0897758a8dba PiperOrigin-RevId: 468338896 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3a751a172ba..8836f6e13b1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "22011aea5a03994bd2dc71a7e943ba9ae6df49b5ef20194aa5d9144b680c680d", - git_commit = "13c1ce43cbbc2eeb17fa372cd0af1f89fb6f9926", + sha256 = "76a923c024e977c30b89643377bd496ab5ccfbb44df44475773109ed46390d56", + git_commit = "a3fa21360c974bfe6000361dbc688c449d46e1f0", ) # Import all of TensorFlow Serving's external dependencies. From 280de6fe164f8a2df6617453b6e7a98a026bf9e6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Aug 2022 00:01:32 -0700 Subject: [PATCH 6130/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c601e2bb-be39-41ba-8720-548c9416f95d PiperOrigin-RevId: 468384188 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 8836f6e13b1..bc492bc92cc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "76a923c024e977c30b89643377bd496ab5ccfbb44df44475773109ed46390d56", - git_commit = "a3fa21360c974bfe6000361dbc688c449d46e1f0", + sha256 = "48d61fe39078888457eb13f049d7a8b79825b9fd4d15c7b9eff6602c76ae85f6", + git_commit = "18f5b4dadb78191e4cd4ea48ead00cccd522ce24", ) # Import all of TensorFlow Serving's external dependencies. From d6ea8afd1a95046a11ef6dc84e6d87ab6e1dab42 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Aug 2022 06:01:23 -0700 Subject: [PATCH 6131/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/770c3618-6acc-4983-bf79-e6e4018f2c0c PiperOrigin-RevId: 468438206 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index bc492bc92cc..27e8a870aa1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "48d61fe39078888457eb13f049d7a8b79825b9fd4d15c7b9eff6602c76ae85f6", - git_commit = "18f5b4dadb78191e4cd4ea48ead00cccd522ce24", + sha256 = "966fd38fcff0aefb55eeadbef29f7da95f62347d101cc460152a59628f99e16a", + git_commit = "01bc5f1fecc1fd0d8b6375b6617a471fb9ff8433", ) # Import all of TensorFlow Serving's external dependencies. From b5967c55c5ee0b2f62bac1009235ae1a35448465 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Aug 2022 12:01:19 -0700 Subject: [PATCH 6132/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/36253cf9-a9f7-44ec-ab06-792b48148473 PiperOrigin-RevId: 468515076 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 27e8a870aa1..95969ba011d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "966fd38fcff0aefb55eeadbef29f7da95f62347d101cc460152a59628f99e16a", - git_commit = "01bc5f1fecc1fd0d8b6375b6617a471fb9ff8433", + sha256 = "8668077c4a08b75ac3a2c5d59712c0a3e4886f1699675d411faef9f564609f56", + git_commit = "93036060c2dda6b5d3e630b322dfedc35f3c79a0", ) # Import all of TensorFlow Serving's external dependencies. From f5ddffea1db0fae2f4bffdd08c1f9d07c60a0924 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 18 Aug 2022 18:01:36 -0700 Subject: [PATCH 6133/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7b5b56a5-512e-4432-9294-c60d96f8d02b PiperOrigin-RevId: 468590903 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 95969ba011d..b5f62941529 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8668077c4a08b75ac3a2c5d59712c0a3e4886f1699675d411faef9f564609f56", - git_commit = "93036060c2dda6b5d3e630b322dfedc35f3c79a0", + sha256 = "b28a77880c76608fb4af069c83d69be59954c0339449da890a8ba9d564b1f587", + git_commit = "fc4021a8dd654606cd95e61a033691157853e122", ) # Import all of TensorFlow Serving's external dependencies. From 2b7629811658bbb64f3e3a3469d4c84fea5d7269 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Aug 2022 00:03:14 -0700 Subject: [PATCH 6134/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9de43aab-60b2-4c5e-96bf-78749350d69b PiperOrigin-RevId: 468634984 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b5f62941529..afc7773bb4c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b28a77880c76608fb4af069c83d69be59954c0339449da890a8ba9d564b1f587", - git_commit = "fc4021a8dd654606cd95e61a033691157853e122", + sha256 = "64772ebdfa38daf53223af8e81fb87a1c129fbe9c3788eb1c15264d4a6451be1", + git_commit = "d43ac20b2b0deaead208bad8bb50dc85514eec6e", ) # Import all of TensorFlow Serving's external dependencies. From 3b83810630bdce33b16cf7872053d501cc5f6093 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Aug 2022 06:02:07 -0700 Subject: [PATCH 6135/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/678356f1-04f1-4a51-b057-f4ae1d4ec275 PiperOrigin-RevId: 468684191 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index afc7773bb4c..5205c0cd7c2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "64772ebdfa38daf53223af8e81fb87a1c129fbe9c3788eb1c15264d4a6451be1", - git_commit = "d43ac20b2b0deaead208bad8bb50dc85514eec6e", + sha256 = "c6b8a558e7a22b83f8b7dd4c7471a9b24255b52375b07a189c84b200085af474", + git_commit = "28bcc6ccd586ec29737c51c89a64ebe525375053", ) # Import all of TensorFlow Serving's external dependencies. From 7d4be122e5050d3329f42df559976316ba470297 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Aug 2022 12:01:25 -0700 Subject: [PATCH 6136/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/b94bd42f-6926-417a-a727-131216e4cb86 PiperOrigin-RevId: 468755002 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5205c0cd7c2..5be66de3949 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c6b8a558e7a22b83f8b7dd4c7471a9b24255b52375b07a189c84b200085af474", - git_commit = "28bcc6ccd586ec29737c51c89a64ebe525375053", + sha256 = "caf4a3950042ad55c89358cdd5afc05d80bb6d09128091249544876fc95a0e10", + git_commit = "ed85b8e63210882a5d83019e013f85db8e258bcc", ) # Import all of TensorFlow Serving's external dependencies. From de2d7fab35bfb714ab0e478461fd3fa8c78d02c0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 19 Aug 2022 18:01:34 -0700 Subject: [PATCH 6137/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d6254e01-b9ac-4c16-a08e-558310b030d6 PiperOrigin-RevId: 468821702 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 5be66de3949..b9cf6dbc6c3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "caf4a3950042ad55c89358cdd5afc05d80bb6d09128091249544876fc95a0e10", - git_commit = "ed85b8e63210882a5d83019e013f85db8e258bcc", + sha256 = "a4d88d9b8f2fb2be81157b712e8eb8e49a6c8f6112148229073aa3ef5e832f57", + git_commit = "79381dddd83b4b581861ee13c06c10ce4c3e28b0", ) # Import all of TensorFlow Serving's external dependencies. From 666c283f5c701dadd4a601c2be3b98563433ea0b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 20 Aug 2022 00:01:34 -0700 Subject: [PATCH 6138/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/9f78c047-bef6-4328-90fa-cb70f7cb5db5 PiperOrigin-RevId: 468855937 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b9cf6dbc6c3..09a8bdc0047 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a4d88d9b8f2fb2be81157b712e8eb8e49a6c8f6112148229073aa3ef5e832f57", - git_commit = "79381dddd83b4b581861ee13c06c10ce4c3e28b0", + sha256 = "d5113af31530c7ce484941f896f06ef92d24cb514f67be3650d8e30b7d44f825", + git_commit = "026cc44a940be7fe50360f206f5065cc014fd57c", ) # Import all of TensorFlow Serving's external dependencies. From 7697a62d990f792d5034eaae4fe638ba24ac9ed4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 20 Aug 2022 06:02:14 -0700 Subject: [PATCH 6139/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/681dfdb6-c8b8-4c0e-8209-1bc39a3edde7 PiperOrigin-RevId: 468890345 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 09a8bdc0047..132ba9f0de9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "d5113af31530c7ce484941f896f06ef92d24cb514f67be3650d8e30b7d44f825", - git_commit = "026cc44a940be7fe50360f206f5065cc014fd57c", + sha256 = "17403deb9ee3c604f981a298e17e7ccaed9a6181e9648e3013a9777b8a6264f9", + git_commit = "cc707964d552aa74ef95dae2adf5b19b3dca5c22", ) # Import all of TensorFlow Serving's external dependencies. From fcbf023c124a9417a38edde5f7eab96f1d5641e6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 20 Aug 2022 18:01:29 -0700 Subject: [PATCH 6140/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bb161061-2ea4-462d-9b02-9e742f6d5b7e PiperOrigin-RevId: 468945406 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 132ba9f0de9..43202fb97fc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "17403deb9ee3c604f981a298e17e7ccaed9a6181e9648e3013a9777b8a6264f9", - git_commit = "cc707964d552aa74ef95dae2adf5b19b3dca5c22", + sha256 = "918565349c1e697681cf4777c68d3e4acbf16075f7e62105ba07e1996a79fcce", + git_commit = "3a10c81cf47aadf8acb727e0f8bca55de6bf70f6", ) # Import all of TensorFlow Serving's external dependencies. From 7a6e08d3cdd33ab1b90a2e35fa5dcd5f7c1b29c2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 21 Aug 2022 00:01:30 -0700 Subject: [PATCH 6141/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c484fa31-697b-43a0-abf0-3c39aafc481a PiperOrigin-RevId: 468976142 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 43202fb97fc..c6e6ce55d69 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "918565349c1e697681cf4777c68d3e4acbf16075f7e62105ba07e1996a79fcce", - git_commit = "3a10c81cf47aadf8acb727e0f8bca55de6bf70f6", + sha256 = "4d806d96cf729bc38474ad1b0f87e5e5d364c3be17e29c38b7085f52008571dd", + git_commit = "9ec03c98f72263a2d0a94296c3f37b8ea7697e23", ) # Import all of TensorFlow Serving's external dependencies. From b72dafaa63b43d4606d519bd779e1a93ef9465fe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 21 Aug 2022 06:02:35 -0700 Subject: [PATCH 6142/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2a20e0b1-0a4a-4ce8-b634-842b0e465839 PiperOrigin-RevId: 469010227 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c6e6ce55d69..abcac896830 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4d806d96cf729bc38474ad1b0f87e5e5d364c3be17e29c38b7085f52008571dd", - git_commit = "9ec03c98f72263a2d0a94296c3f37b8ea7697e23", + sha256 = "533af86c626572b8f47fe3b86fe379164792f06fcdec4373725380a4ea992fb2", + git_commit = "72692aeb3b4ca6e8607fd90aa7de9b6952caecd6", ) # Import all of TensorFlow Serving's external dependencies. From 32f1da3d28a8d8ad20246ee38542030befc4daba Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 21 Aug 2022 12:01:40 -0700 Subject: [PATCH 6143/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/bb8c6c39-7f3c-4ac3-bb4b-c28ac29b058d PiperOrigin-RevId: 469039003 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index abcac896830..7d3ad2db4d1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "533af86c626572b8f47fe3b86fe379164792f06fcdec4373725380a4ea992fb2", - git_commit = "72692aeb3b4ca6e8607fd90aa7de9b6952caecd6", + sha256 = "06444b9b5ec73c228ec54b34a563dcf8fbb5b0c30d240f84372fea115d21ad1a", + git_commit = "479da0fa9696de0bc46ada76ff9cf12fcd645e7f", ) # Import all of TensorFlow Serving's external dependencies. From 30ad482ece1b93880c38033417a58e306fc6aec8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 22 Aug 2022 06:01:37 -0700 Subject: [PATCH 6144/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/666c4380-667e-4013-8707-fff45bb61a13 PiperOrigin-RevId: 469163483 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7d3ad2db4d1..d82a0e21dcf 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "06444b9b5ec73c228ec54b34a563dcf8fbb5b0c30d240f84372fea115d21ad1a", - git_commit = "479da0fa9696de0bc46ada76ff9cf12fcd645e7f", + sha256 = "aa651523c3e176bed85c7ce35cddc939a6d6a8ebdfd2a89be72832ffd1874a52", + git_commit = "83f0dd240a6e35cde81a147fdd6b5cd966214ad8", ) # Import all of TensorFlow Serving's external dependencies. From 2872f96dd99561940ebdca071473ff7860384c43 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 22 Aug 2022 12:01:39 -0700 Subject: [PATCH 6145/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/7f0fc801-e078-4eee-82d9-8c3a6b9ed7fe PiperOrigin-RevId: 469248567 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d82a0e21dcf..d9325779487 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "aa651523c3e176bed85c7ce35cddc939a6d6a8ebdfd2a89be72832ffd1874a52", - git_commit = "83f0dd240a6e35cde81a147fdd6b5cd966214ad8", + sha256 = "fcde5cd8fce93f4ce8745ffdd10a53315d5c420bb727cc41a72300f501a84ea4", + git_commit = "1f55fc4de1653ee3196ceada5b0d3d297a0e1a62", ) # Import all of TensorFlow Serving's external dependencies. From 94684e609c8ee8de505134805f8cb60ab2eaeea8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 22 Aug 2022 18:01:40 -0700 Subject: [PATCH 6146/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2e011811-7a16-4249-9c7c-399e8e8a57a7 PiperOrigin-RevId: 469331357 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d9325779487..788b539ebd5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "fcde5cd8fce93f4ce8745ffdd10a53315d5c420bb727cc41a72300f501a84ea4", - git_commit = "1f55fc4de1653ee3196ceada5b0d3d297a0e1a62", + sha256 = "4ba076eccbf14b5858e5a0aa26fa518a0ebf254730d6ac98f868ce7d78444616", + git_commit = "ec394c5861072e20e8aa86fe29ed75085f977fe6", ) # Import all of TensorFlow Serving's external dependencies. From cc3720091867c06615b8b3f50c1c2468a90e6b1c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 22 Aug 2022 18:29:19 -0700 Subject: [PATCH 6147/8103] Fix the bug when accessing concat.tensor_data() outside its lifecycle PiperOrigin-RevId: 469336261 --- .../servables/tensorflow/tflite_session.cc | 3 +- .../tensorflow/tflite_session_test.cc | 96 ++++++++++++++----- 2 files changed, 76 insertions(+), 23 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/tflite_session.cc b/tensorflow_serving/servables/tensorflow/tflite_session.cc index b42a500899e..0a5fb3d94f4 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session.cc @@ -193,8 +193,9 @@ Status SetInputAndInvokeMiniBatch( const auto& tf_input_tensors = inputs[i]; if (tflite_input_tensor->type != kTfLiteString) { const Tensor* tf_input_tensor = tf_input_tensors[0]; + // concated.tensor_data() may be accessed later. + Tensor concated; if (tf_input_tensors.size() > 1) { - Tensor concated; std::vector to_concatenate; to_concatenate.reserve(tf_input_tensors.size()); for (const auto* t : tf_input_tensors) { diff --git a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc index 51d534f0e40..2f44aba4f9f 100644 --- a/tensorflow_serving/servables/tensorflow/tflite_session_test.cc +++ b/tensorflow_serving/servables/tensorflow/tflite_session_test.cc @@ -19,6 +19,7 @@ limitations under the License. #include #include +#include #include "absl/flags/flag.h" #include "absl/functional/bind_front.h" #include "flatbuffers/flexbuffers.h" @@ -33,9 +34,11 @@ limitations under the License. #include "tensorflow/core/platform/env.h" #include "tensorflow/core/platform/logging.h" #include "tensorflow/core/platform/protobuf.h" +#include "tensorflow/core/platform/strcat.h" #include "tensorflow/core/platform/test_benchmark.h" #include "tensorflow/core/platform/threadpool_options.h" #include "tensorflow/core/protobuf/config.pb.h" +#include "tensorflow/core/protobuf/error_codes.pb.h" #include "tensorflow/lite/string_util.h" #include "tensorflow/lite/tools/signature/signature_def_util.h" #include "tensorflow/lite/util.h" @@ -254,6 +257,8 @@ constexpr char kSignatureInputList[] = "input_list"; constexpr char kSignatureInputShape[] = "input_shape"; constexpr char kSignatureOutput[] = "sigdef_output"; +constexpr int kBatchSize = 500; + std::map GetTestSignatureDefMap() { auto signature_def = SignatureDef(); TensorInfo input_list_tensor; @@ -629,13 +634,12 @@ TEST(TfLiteSession, SimpleSignatureDefAndRun) { test::AsTensor({"a", "b", "c", "d"}, TensorShape({2, 2}))); } -using TfLiteSessionBatchSizeTest = ::testing::TestWithParam; -TEST_P(TfLiteSessionBatchSizeTest, TestBatchParallelism) { - const bool use_model_batch_size = GetParam(); +Status BuildSessionInBatch(std::unique_ptr* sess, + bool use_model_batch_size, + const string& model_path) { std::string model_bytes; - TF_ASSERT_OK(ReadFileToString(Env::Default(), - test_util::TestSrcDirPath(kParseExampleModel), - &model_bytes)); + TF_RETURN_IF_ERROR(ReadFileToString( + Env::Default(), test_util::TestSrcDirPath(model_path), &model_bytes)); auto model = tflite::FlatBufferModel::BuildFromModel( flatbuffers::GetRoot(model_bytes.data())); const int model_batch_size = 5; @@ -643,12 +647,27 @@ TEST_P(TfLiteSessionBatchSizeTest, TestBatchParallelism) { const tflite::Model* tflite_model = model->GetModel(); auto mutable_model = absl::make_unique(); tflite_model->UnPackTo(mutable_model.get(), nullptr); - ASSERT_EQ(mutable_model->subgraphs.size(), 1); + + if (mutable_model->subgraphs.size() != 1) { + return Status( + tensorflow::error::INVALID_ARGUMENT, + strings::StrCat("Model subgraph size ", + mutable_model->subgraphs.size(), " not equal to 1")); + } auto* subgraph = mutable_model->subgraphs[0].get(); - ASSERT_EQ(subgraph->inputs.size(), 1); + if (subgraph->inputs.size() != 1) { + return Status( + tensorflow::error::INVALID_ARGUMENT, + strings::StrCat("Model subgraph input size ", + mutable_model->subgraphs.size(), " not equal to 1")); + } auto* tensor = subgraph->tensors[subgraph->inputs[0]].get(); - ASSERT_EQ(tensor->shape.size(), 1); - ASSERT_EQ(tensor->shape[0], 1); + if (tensor->shape[0] != 1) { + return Status( + tensorflow::error::INVALID_ARGUMENT, + strings::StrCat("Model subgraph input shape[0] ", + mutable_model->subgraphs.size(), " not equal to 1")); + } tensor->shape[0] = model_batch_size; flatbuffers::FlatBufferBuilder builder; auto packed_model = tflite::Model::Pack(builder, mutable_model.get()); @@ -659,19 +678,52 @@ TEST_P(TfLiteSessionBatchSizeTest, TestBatchParallelism) { } auto model_signature_def_map = GetTestSignatureDefMap(); ::google::protobuf::Map signatures; - std::unique_ptr sess; tensorflow::SessionOptions options; const int num_tflite_interpreters = 4; - TF_ASSERT_OK(TfLiteSession::Create(std::move(model_bytes), options, 1, - num_tflite_interpreters, &sess, - &signatures)); - auto scheduler_options = sess->GetSchedulerOptions(); - const int batch_size = 500; + TF_RETURN_IF_ERROR(TfLiteSession::Create(std::move(model_bytes), options, 1, + num_tflite_interpreters, sess, + &signatures)); + auto scheduler_options = (*sess)->GetSchedulerOptions(); const int expected_batch_size = use_model_batch_size ? model_batch_size - : batch_size / num_tflite_interpreters; - ASSERT_EQ(scheduler_options.max_execution_batch_size, expected_batch_size); + : kBatchSize / num_tflite_interpreters; + if (scheduler_options.max_execution_batch_size != expected_batch_size) { + return Status( + tensorflow::error::INVALID_ARGUMENT, + strings::StrCat("Scheulder max_execution_batch_size ", + scheduler_options.max_execution_batch_size, + " not equal to expected ", expected_batch_size)); + } + return Status(); +} + +using TfLiteSessionBatchSizeTest = ::testing::TestWithParam; +TEST_P(TfLiteSessionBatchSizeTest, TestBatchParallelismForFloat) { + std::unique_ptr sess; + TF_ASSERT_OK(BuildSessionInBatch(&sess, GetParam(), kTestModel)); + std::vector example_list; + std::vector expected; + std::vector expected_bytes; + std::vector outputs; + + std::mt19937 random_engine; + auto random_func = [&]() { + return std::uniform_real_distribution(-0.5, 0.5)(random_engine); + }; + for (int i = 0; i < kBatchSize; i++) { + example_list.push_back(random_func()); + } + + Tensor example_list_tensor = + test::AsTensor(example_list, TensorShape({kBatchSize, 1})); + TF_EXPECT_OK(sess->Run({{"x", example_list_tensor}}, {"y"}, {}, &outputs)); + EXPECT_TRUE(outputs[0].shape().IsSameSize(TensorShape({kBatchSize, 1}))); +} + +TEST_P(TfLiteSessionBatchSizeTest, TestBatchParallelismForString) { + std::unique_ptr sess; + TF_ASSERT_OK(BuildSessionInBatch(&sess, GetParam(), kParseExampleModel)); const float default_value = 0; std::vector example_list; std::vector expected; @@ -684,7 +736,7 @@ TEST_P(TfLiteSessionBatchSizeTest, TestBatchParallelism) { }; const std::string kTestString = "test string"; const std::string kDefaultString = "missing"; - for (int i = 0; i < batch_size; i++) { + for (int i = 0; i < kBatchSize; i++) { float val = random_func(); tensorflow::Example example; std::string str; @@ -703,18 +755,18 @@ TEST_P(TfLiteSessionBatchSizeTest, TestBatchParallelism) { example_list.push_back(str); } Tensor example_list_tensor = - test::AsTensor(example_list, TensorShape({batch_size})); + test::AsTensor(example_list, TensorShape({kBatchSize})); TF_EXPECT_OK(sess->Run( {{"input", example_list_tensor}}, {"ParseExample/ParseExampleV2", "ParseExample/ParseExampleV2:1"}, {}, &outputs)); test::ExpectTensorEqual( outputs[0], - test::AsTensor(expected, TensorShape({batch_size, 1}))); + test::AsTensor(expected, TensorShape({kBatchSize, 1}))); EXPECT_EQ(outputs.size(), 2); test::ExpectTensorEqual( outputs[1], - test::AsTensor(expected_bytes, TensorShape({batch_size, 1}))); + test::AsTensor(expected_bytes, TensorShape({kBatchSize, 1}))); } INSTANTIATE_TEST_SUITE_P(TfLiteSessionBatchSizeTests, From 982bb8f501111ae975be94ab7a78a5a228c3a630 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 23 Aug 2022 00:01:31 -0700 Subject: [PATCH 6148/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/720a5eb9-bb34-4b41-a807-b0147fe01522 PiperOrigin-RevId: 469380377 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 788b539ebd5..fcb3cc1324f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "4ba076eccbf14b5858e5a0aa26fa518a0ebf254730d6ac98f868ce7d78444616", - git_commit = "ec394c5861072e20e8aa86fe29ed75085f977fe6", + sha256 = "91fef1f149ef38a709bec619d3c1f8c41db21b8f56b9d85d8f4526da020d17a3", + git_commit = "a0f400ddc05e4f0b36f5491d4ccd80ff294f14a4", ) # Import all of TensorFlow Serving's external dependencies. From 50d421a2e201160b7b05222985bfb47b3b3e36e9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 23 Aug 2022 06:01:39 -0700 Subject: [PATCH 6149/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2f075567-f7c4-4cd4-acfd-ca2264cf04cf PiperOrigin-RevId: 469435887 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fcb3cc1324f..a0da2d481c7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "91fef1f149ef38a709bec619d3c1f8c41db21b8f56b9d85d8f4526da020d17a3", - git_commit = "a0f400ddc05e4f0b36f5491d4ccd80ff294f14a4", + sha256 = "758844dd7eeaa21d39bf3b0187779aa9ac9b12318253e441ca4dd65a34aaa70d", + git_commit = "9218bfcdd4555085fd757919dcdbf2262bfa8bfa", ) # Import all of TensorFlow Serving's external dependencies. From 19dd5ce5c66cac92c3f53b3fc00748b0428f06fe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 23 Aug 2022 12:02:00 -0700 Subject: [PATCH 6150/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/fd174859-6a51-4a26-b8fd-3895dce8a2c6 PiperOrigin-RevId: 469519852 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a0da2d481c7..389214f954b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "758844dd7eeaa21d39bf3b0187779aa9ac9b12318253e441ca4dd65a34aaa70d", - git_commit = "9218bfcdd4555085fd757919dcdbf2262bfa8bfa", + sha256 = "af95288661fbe7af80f86002077259dd8f12158fd478e8d1a43e108233c5650f", + git_commit = "dfd984a2ceb258f06e102263633cba5ae9499470", ) # Import all of TensorFlow Serving's external dependencies. From 9e81e7b1bc8e1bd28c3324cf8feee717420f96f4 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 23 Aug 2022 14:03:13 -0700 Subject: [PATCH 6151/8103] BUILD cleanup PiperOrigin-RevId: 469551002 --- tensorflow_serving/tools/docker/tests/BUILD | 2 +- tensorflow_serving/tools/pip_package/BUILD | 2 +- tensorflow_serving/util/BUILD | 2 +- tensorflow_serving/util/net_http/client/testing/BUILD | 2 +- tensorflow_serving/util/net_http/compression/BUILD | 2 +- tensorflow_serving/util/net_http/internal/BUILD | 2 +- tensorflow_serving/util/net_http/internal/testing/BUILD | 2 +- tensorflow_serving/util/net_http/server/internal/BUILD | 2 +- tensorflow_serving/util/net_http/server/public/BUILD | 2 +- tensorflow_serving/util/net_http/server/testing/BUILD | 2 +- tensorflow_serving/util/net_http/socket/testing/BUILD | 2 +- tensorflow_serving/util/test_util/BUILD | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/tensorflow_serving/tools/docker/tests/BUILD b/tensorflow_serving/tools/docker/tests/BUILD index 4d60def5caa..55c754bfdf1 100644 --- a/tensorflow_serving/tools/docker/tests/BUILD +++ b/tensorflow_serving/tools/docker/tests/BUILD @@ -7,7 +7,7 @@ # Tests are local and manual as they require docker and the image to be # installed. -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) sh_library( name = "docker_test_lib", diff --git a/tensorflow_serving/tools/pip_package/BUILD b/tensorflow_serving/tools/pip_package/BUILD index 48daa4f43fe..6b60794a1cf 100644 --- a/tensorflow_serving/tools/pip_package/BUILD +++ b/tensorflow_serving/tools/pip_package/BUILD @@ -1,6 +1,6 @@ # Description: Tensorflow Serving pip package. -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) sh_binary( name = "build_pip_package", diff --git a/tensorflow_serving/util/BUILD b/tensorflow_serving/util/BUILD index 5beb2fb1dee..685ec84a9a4 100644 --- a/tensorflow_serving/util/BUILD +++ b/tensorflow_serving/util/BUILD @@ -9,7 +9,7 @@ package( features = ["-layering_check"], ) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) filegroup( name = "all_files", diff --git a/tensorflow_serving/util/net_http/client/testing/BUILD b/tensorflow_serving/util/net_http/client/testing/BUILD index c54e7a9afcd..702ed5ef1e4 100644 --- a/tensorflow_serving/util/net_http/client/testing/BUILD +++ b/tensorflow_serving/util/net_http/client/testing/BUILD @@ -4,7 +4,7 @@ package( default_visibility = ["//visibility:private"], ) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) cc_binary( name = "evhttp_echo_client", diff --git a/tensorflow_serving/util/net_http/compression/BUILD b/tensorflow_serving/util/net_http/compression/BUILD index ccd0c325eab..f039e3a4b29 100644 --- a/tensorflow_serving/util/net_http/compression/BUILD +++ b/tensorflow_serving/util/net_http/compression/BUILD @@ -7,7 +7,7 @@ package( ], ) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) # C++ lib based on zlib for gzip support cc_library( diff --git a/tensorflow_serving/util/net_http/internal/BUILD b/tensorflow_serving/util/net_http/internal/BUILD index 866eaa9aaf3..ecd7cd2e9df 100644 --- a/tensorflow_serving/util/net_http/internal/BUILD +++ b/tensorflow_serving/util/net_http/internal/BUILD @@ -6,7 +6,7 @@ package( ], ) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) cc_library( name = "fixed_thread_pool", diff --git a/tensorflow_serving/util/net_http/internal/testing/BUILD b/tensorflow_serving/util/net_http/internal/testing/BUILD index d2a710bbaf2..f866a13831b 100644 --- a/tensorflow_serving/util/net_http/internal/testing/BUILD +++ b/tensorflow_serving/util/net_http/internal/testing/BUILD @@ -4,7 +4,7 @@ package( default_visibility = ["//visibility:private"], ) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) cc_binary( name = "net_logging_example", diff --git a/tensorflow_serving/util/net_http/server/internal/BUILD b/tensorflow_serving/util/net_http/server/internal/BUILD index f087499d255..0f0917a9ae5 100644 --- a/tensorflow_serving/util/net_http/server/internal/BUILD +++ b/tensorflow_serving/util/net_http/server/internal/BUILD @@ -6,7 +6,7 @@ package( ], ) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) cc_library( name = "evhttp_server", diff --git a/tensorflow_serving/util/net_http/server/public/BUILD b/tensorflow_serving/util/net_http/server/public/BUILD index e7f96d98f13..cc39fe6b749 100644 --- a/tensorflow_serving/util/net_http/server/public/BUILD +++ b/tensorflow_serving/util/net_http/server/public/BUILD @@ -10,7 +10,7 @@ package( package_group(name = "http_server_clients") -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) cc_library( name = "http_server_api", diff --git a/tensorflow_serving/util/net_http/server/testing/BUILD b/tensorflow_serving/util/net_http/server/testing/BUILD index c65901c2482..1a8240459e2 100644 --- a/tensorflow_serving/util/net_http/server/testing/BUILD +++ b/tensorflow_serving/util/net_http/server/testing/BUILD @@ -4,7 +4,7 @@ package( default_visibility = ["//visibility:private"], ) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) cc_binary( name = "evhttp_echo_server", diff --git a/tensorflow_serving/util/net_http/socket/testing/BUILD b/tensorflow_serving/util/net_http/socket/testing/BUILD index fd1a6e50c9c..3eeca19d3b6 100644 --- a/tensorflow_serving/util/net_http/socket/testing/BUILD +++ b/tensorflow_serving/util/net_http/socket/testing/BUILD @@ -4,7 +4,7 @@ package( default_visibility = ["//visibility:private"], ) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) cc_binary( name = "ev_print_req_server", diff --git a/tensorflow_serving/util/test_util/BUILD b/tensorflow_serving/util/test_util/BUILD index 07f7acce80c..8fd57c090b7 100644 --- a/tensorflow_serving/util/test_util/BUILD +++ b/tensorflow_serving/util/test_util/BUILD @@ -7,7 +7,7 @@ package( features = ["-layering_check"], ) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) cc_library( name = "mock_file_probing_env", From 455722c04844b95fb10c51a4eeef84a5bbf93db8 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 23 Aug 2022 18:01:59 -0700 Subject: [PATCH 6152/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8877498c-a672-4bbc-a8f9-901ba5f9b8e0 PiperOrigin-RevId: 469602600 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 389214f954b..072ee58ae0f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "af95288661fbe7af80f86002077259dd8f12158fd478e8d1a43e108233c5650f", - git_commit = "dfd984a2ceb258f06e102263633cba5ae9499470", + sha256 = "6854d4baca07c40fc2c4355988aaf0be99fa0020ff529818265bc0db60075fe8", + git_commit = "965ed23edfe72553685436add587b25a6e02b354", ) # Import all of TensorFlow Serving's external dependencies. From 4bcfa91f9a054b7bd58031733fd3e6891a97946d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 24 Aug 2022 00:01:43 -0700 Subject: [PATCH 6153/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/48108ffb-1b62-44dd-b4ee-fd71fd4410c8 PiperOrigin-RevId: 469649541 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 072ee58ae0f..d80ad460771 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "6854d4baca07c40fc2c4355988aaf0be99fa0020ff529818265bc0db60075fe8", - git_commit = "965ed23edfe72553685436add587b25a6e02b354", + sha256 = "0ad93916e105dc18068f1742d548f3b6572599d030d93fe9860a611f341099aa", + git_commit = "28e13a93ab3b3fb72f1d144bb3f9b256c0f8ef1f", ) # Import all of TensorFlow Serving's external dependencies. From 09192d0b822eba64bb85401936a4f91ffefb7b8a Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 24 Aug 2022 06:03:40 -0700 Subject: [PATCH 6154/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/adcb8e9e-3bb3-4fee-87d6-8f6ebace34aa PiperOrigin-RevId: 469705496 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d80ad460771..ec7f27841f7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0ad93916e105dc18068f1742d548f3b6572599d030d93fe9860a611f341099aa", - git_commit = "28e13a93ab3b3fb72f1d144bb3f9b256c0f8ef1f", + sha256 = "a4a1185e83f1ff5ec2d94417eb60271978840c55fc3624bd21b2d269c695fff4", + git_commit = "1beca0c5c5f047ab7aecf67509551d4995808def", ) # Import all of TensorFlow Serving's external dependencies. From 8918b8eef65b93db1d8ee08a5709931a5f1b65f4 Mon Sep 17 00:00:00 2001 From: Raviteja Gorijala Date: Wed, 24 Aug 2022 11:07:07 -0700 Subject: [PATCH 6155/8103] Add release notes for tf-serving 2.10.0-rc2 PiperOrigin-RevId: 469774765 --- RELEASE.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/RELEASE.md b/RELEASE.md index 42d9c1ac6bd..91d45eb10ea 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,3 +1,17 @@ +# Release 2.10.0-rc2 + +## Major Features and Improvements + +* No major features or improvements. + +## Breaking Changes + +* No breaking changes + +## Bug Fixes and Other Changes + +* This release is based on TF version 2.10.0-rc2 + # Release 2.10.0-rc1 ## Major Features and Improvements From 928dbe34bafbd837904254e479a2a3e8e3e8a2e2 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 24 Aug 2022 12:01:48 -0700 Subject: [PATCH 6156/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f66e405b-796b-4187-810d-83064e9e9690 PiperOrigin-RevId: 469788865 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index ec7f27841f7..e945b7d2bc1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "a4a1185e83f1ff5ec2d94417eb60271978840c55fc3624bd21b2d269c695fff4", - git_commit = "1beca0c5c5f047ab7aecf67509551d4995808def", + sha256 = "342df65f47b3023128b413152ea9e57bcd2f74fa5fc5f5d4cc242c1cc0012c20", + git_commit = "bbe41abdcb2f7e923489bfa21cfb546b6022f330", ) # Import all of TensorFlow Serving's external dependencies. From 50ac4f5d97ad3e2a9cda3e14995d53c48cca21fa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 24 Aug 2022 18:01:36 -0700 Subject: [PATCH 6157/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/6a0a919d-b508-4aaa-a602-c5db196c6f16 PiperOrigin-RevId: 469870751 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e945b7d2bc1..721d550e784 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "342df65f47b3023128b413152ea9e57bcd2f74fa5fc5f5d4cc242c1cc0012c20", - git_commit = "bbe41abdcb2f7e923489bfa21cfb546b6022f330", + sha256 = "28efc592f609eb2790a4f8734b5ee1888bde2371ab7a5c5cb4f0ba8887a4da25", + git_commit = "16eeb022e6f2b5992bf3789a95012724c94bfaf4", ) # Import all of TensorFlow Serving's external dependencies. From ad6920d1a66b48de5738106959343a2a3ae06b53 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 25 Aug 2022 00:01:39 -0700 Subject: [PATCH 6158/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/f01451b7-4fc7-46d1-98b7-6f22c7bce2fa PiperOrigin-RevId: 469915628 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 721d550e784..b2e61b5b0a6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "28efc592f609eb2790a4f8734b5ee1888bde2371ab7a5c5cb4f0ba8887a4da25", - git_commit = "16eeb022e6f2b5992bf3789a95012724c94bfaf4", + sha256 = "80737ac6172c70eef7e99da4e0ed811c2e51adec76db3a44b634b06e65cb606e", + git_commit = "4ca72f4d4ca74e3b5312a2d7f9c6498ca2f7a74b", ) # Import all of TensorFlow Serving's external dependencies. From fe7cfedbb6f44cbefea8c182a8dccdbbc8033286 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 25 Aug 2022 06:01:40 -0700 Subject: [PATCH 6159/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/ec2047f1-62b6-498c-af11-9e8423c04680 PiperOrigin-RevId: 469970022 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b2e61b5b0a6..479025a3ce8 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "80737ac6172c70eef7e99da4e0ed811c2e51adec76db3a44b634b06e65cb606e", - git_commit = "4ca72f4d4ca74e3b5312a2d7f9c6498ca2f7a74b", + sha256 = "cf17da839dbc678575d0b0c2541da32b330dc0154b647f3f3190745a3a0c495c", + git_commit = "faf1d4e7df11644662f0b350c220292272adf0d0", ) # Import all of TensorFlow Serving's external dependencies. From a0640fcdc9af0223972ce1f985fc4951608b9ffe Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 25 Aug 2022 12:03:23 -0700 Subject: [PATCH 6160/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/a57434a4-635e-43b3-858f-dcda2a78b665 PiperOrigin-RevId: 470049662 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 479025a3ce8..f9fdfbd919d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "cf17da839dbc678575d0b0c2541da32b330dc0154b647f3f3190745a3a0c495c", - git_commit = "faf1d4e7df11644662f0b350c220292272adf0d0", + sha256 = "0a7e0d990465ce8aa3bf70ddfe139387dbbcbb15e313a9cf59e22df4000aebd7", + git_commit = "df0b7dbcaef535b87f4b8be8d0c1916071c96a67", ) # Import all of TensorFlow Serving's external dependencies. From 7284c06c6d1b1988db05678603308eb51da20cef Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 25 Aug 2022 18:01:53 -0700 Subject: [PATCH 6161/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1ec2e78b-8766-4981-bfd9-7f2c0c632f68 PiperOrigin-RevId: 470127072 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f9fdfbd919d..3abcbc07946 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0a7e0d990465ce8aa3bf70ddfe139387dbbcbb15e313a9cf59e22df4000aebd7", - git_commit = "df0b7dbcaef535b87f4b8be8d0c1916071c96a67", + sha256 = "ba78822bd28b106b22f40e70500a5b62527a3dade151795b792602ed812c1b0d", + git_commit = "2fbaf178a267ebc0cee65741f7f1929c1fc22ecf", ) # Import all of TensorFlow Serving's external dependencies. From 53f61e83ac78ce3eda620b6c36130fd870886539 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 26 Aug 2022 00:02:01 -0700 Subject: [PATCH 6162/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/acddaa37-3ffc-4608-8912-85d717d0cc12 PiperOrigin-RevId: 470173793 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3abcbc07946..314a5c11c8f 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "ba78822bd28b106b22f40e70500a5b62527a3dade151795b792602ed812c1b0d", - git_commit = "2fbaf178a267ebc0cee65741f7f1929c1fc22ecf", + sha256 = "bb5cf6f184e1a731f5dab39aab62d27338438100f99ef82dbcffb6761fbb602e", + git_commit = "47c541330813f575057d7af90ef55985baca87eb", ) # Import all of TensorFlow Serving's external dependencies. From 03091eda7d90b47a9c750d8bd4df6212830220bc Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 26 Aug 2022 06:01:51 -0700 Subject: [PATCH 6163/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1e4b9df9-1a21-4be2-a804-3f8a4547b478 PiperOrigin-RevId: 470227727 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 314a5c11c8f..e1eb16bd1f7 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bb5cf6f184e1a731f5dab39aab62d27338438100f99ef82dbcffb6761fbb602e", - git_commit = "47c541330813f575057d7af90ef55985baca87eb", + sha256 = "bd2d2cb74c97fd84d21c7db285182b6a0f8120bb9436600c1774c8fa656e0df8", + git_commit = "2db1bbdd4a0cc19f177d6bff1482136d252802e0", ) # Import all of TensorFlow Serving's external dependencies. From 3f03679719ecd921cf90cacba949bb2dfcc2ef5f Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 26 Aug 2022 12:52:32 -0700 Subject: [PATCH 6164/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/e9729371-6f86-4f58-a64e-2da6600b2aca PiperOrigin-RevId: 470312831 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index e1eb16bd1f7..23e927d5208 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bd2d2cb74c97fd84d21c7db285182b6a0f8120bb9436600c1774c8fa656e0df8", - git_commit = "2db1bbdd4a0cc19f177d6bff1482136d252802e0", + sha256 = "2c13144cdb3c38ccc0bea95807f2fc680c8dcbd3cab99910461060e3245fc7ad", + git_commit = "7634eaf7173693454e2b7bffb607a525a546c695", ) # Import all of TensorFlow Serving's external dependencies. From 65ee36ff92daacff746f03f4ef5e38b22f30c58d Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 26 Aug 2022 18:01:22 -0700 Subject: [PATCH 6165/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5b2678f8-d31b-4b8e-978f-ccaa7575c607 PiperOrigin-RevId: 470372537 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 23e927d5208..7ba6b4e2ad2 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "2c13144cdb3c38ccc0bea95807f2fc680c8dcbd3cab99910461060e3245fc7ad", - git_commit = "7634eaf7173693454e2b7bffb607a525a546c695", + sha256 = "424d8e8b8410679ffb2075404e3a801350b4403b56aa2330e6c0d46762422c59", + git_commit = "f8df5fead899e6b44e93b9d51dbdb3aa5732fde7", ) # Import all of TensorFlow Serving's external dependencies. From 82d935592596bdd10b7cd6b1a45fd96b8e365814 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 27 Aug 2022 00:01:40 -0700 Subject: [PATCH 6166/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/5c271014-c9a8-4665-b873-1eff14279605 PiperOrigin-RevId: 470407398 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7ba6b4e2ad2..cb686b4439c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "424d8e8b8410679ffb2075404e3a801350b4403b56aa2330e6c0d46762422c59", - git_commit = "f8df5fead899e6b44e93b9d51dbdb3aa5732fde7", + sha256 = "8ecaff30fdce0d67e061737fcea5be331f659810bde1ffe5f7346671cf9f3d7c", + git_commit = "408a54e48174a0fc17a5858ada9232969540ec7e", ) # Import all of TensorFlow Serving's external dependencies. From fe076b1c991bf242c6901f33f0bca9e5281fd122 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sat, 27 Aug 2022 06:01:44 -0700 Subject: [PATCH 6167/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/3c035051-697f-4876-a5c7-e9a0eb99ddf3 PiperOrigin-RevId: 470442228 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index cb686b4439c..d84d2b04988 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8ecaff30fdce0d67e061737fcea5be331f659810bde1ffe5f7346671cf9f3d7c", - git_commit = "408a54e48174a0fc17a5858ada9232969540ec7e", + sha256 = "533052a188a47207d83020bd8c396625b815aecafa31ebac91cf97bae7dd44e4", + git_commit = "4b9a55ae0c451d6d6c8c7b438d70dea3651d652d", ) # Import all of TensorFlow Serving's external dependencies. From fb131d770954a1e29a4275672a89ff4b7f1061c9 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 28 Aug 2022 00:01:35 -0700 Subject: [PATCH 6168/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/35cfc633-c500-48c8-88f0-db688bd8a485 PiperOrigin-RevId: 470523117 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index d84d2b04988..6319ebabccb 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "533052a188a47207d83020bd8c396625b815aecafa31ebac91cf97bae7dd44e4", - git_commit = "4b9a55ae0c451d6d6c8c7b438d70dea3651d652d", + sha256 = "1951d30857e8ce316f27348a4e1915f781b260de8cf59d068592f20db83afa60", + git_commit = "42e179c04fcc8cc2995805234825603fe90a0020", ) # Import all of TensorFlow Serving's external dependencies. From 7b2d37b9a6dfdf91ff2982625bb3eadb5fb76aa6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 28 Aug 2022 06:02:32 -0700 Subject: [PATCH 6169/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d0b96fe2-3a33-440b-bddb-6ff53bfc52ab PiperOrigin-RevId: 470555445 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 6319ebabccb..edbe70f7fe3 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "1951d30857e8ce316f27348a4e1915f781b260de8cf59d068592f20db83afa60", - git_commit = "42e179c04fcc8cc2995805234825603fe90a0020", + sha256 = "345d64e144bdf0e741873f112f7062803188ea1692a81980039567e85aa064fd", + git_commit = "0f4e329a4cc59fad5c6320d6c5bf266668d77f6c", ) # Import all of TensorFlow Serving's external dependencies. From 64d00164893ae84964d0a0bd6fc35d562fe8d592 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Sun, 28 Aug 2022 18:01:25 -0700 Subject: [PATCH 6170/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/c9e4f75d-02ad-4763-8695-e639b54ef7cb PiperOrigin-RevId: 470611230 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index edbe70f7fe3..1098811b3f1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "345d64e144bdf0e741873f112f7062803188ea1692a81980039567e85aa064fd", - git_commit = "0f4e329a4cc59fad5c6320d6c5bf266668d77f6c", + sha256 = "5f411827b857f5f8a682c75f9f633d2104c71a6525e6a9321f9729ed48f1f4cb", + git_commit = "db1c47d044becc8ee27a64dd31edb06f3a935254", ) # Import all of TensorFlow Serving's external dependencies. From 4037d4f8300e73b7c0d55712aed027383ad5b8b3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 29 Aug 2022 00:01:35 -0700 Subject: [PATCH 6171/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/941ad6a5-5683-43ec-b803-7b3b491f43c1 PiperOrigin-RevId: 470646254 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 1098811b3f1..3cf522d8fc9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "5f411827b857f5f8a682c75f9f633d2104c71a6525e6a9321f9729ed48f1f4cb", - git_commit = "db1c47d044becc8ee27a64dd31edb06f3a935254", + sha256 = "8226c2c6eb95ccb30b28981a842526a2a4c58631d4946335d76a41ecad1c1e9b", + git_commit = "d1305ddbd8615283531b3f7e5e249f24a9532a76", ) # Import all of TensorFlow Serving's external dependencies. From 72069c32ee63ad9cbc002171a9c19313133228a1 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 29 Aug 2022 06:02:50 -0700 Subject: [PATCH 6172/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/24d76788-307c-430a-a87d-c547525486a1 PiperOrigin-RevId: 470699783 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3cf522d8fc9..fa1c9619262 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "8226c2c6eb95ccb30b28981a842526a2a4c58631d4946335d76a41ecad1c1e9b", - git_commit = "d1305ddbd8615283531b3f7e5e249f24a9532a76", + sha256 = "0c270bdf52f360befc6148be2a140375e2e1b83411923a3c1018f6f6d515087e", + git_commit = "f39e108822366b81b9c26d03351c2684099a2bc6", ) # Import all of TensorFlow Serving's external dependencies. From 8235ed86f9f07123e30ea8830a1454334bc86a2c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 29 Aug 2022 08:01:59 -0700 Subject: [PATCH 6173/8103] BUILD cleanup PiperOrigin-RevId: 470719515 --- tensorflow_serving/apis/BUILD | 2 +- tensorflow_serving/apis/internal/BUILD | 2 +- tensorflow_serving/batching/BUILD | 2 +- tensorflow_serving/batching/test_util/BUILD | 2 +- tensorflow_serving/batching/testdata/BUILD | 2 +- tensorflow_serving/config/BUILD | 2 +- tensorflow_serving/core/BUILD | 2 +- tensorflow_serving/core/test_util/BUILD | 2 +- tensorflow_serving/example/BUILD | 2 +- tensorflow_serving/model_servers/BUILD | 2 +- tensorflow_serving/model_servers/test_util/BUILD | 2 +- tensorflow_serving/resources/BUILD | 2 +- tensorflow_serving/servables/hashmap/BUILD | 2 +- tensorflow_serving/servables/tensorflow/BUILD | 2 +- tensorflow_serving/servables/tensorflow/test_util/BUILD | 2 +- tensorflow_serving/servables/tensorflow/testdata/BUILD | 2 +- tensorflow_serving/session_bundle/BUILD | 2 +- tensorflow_serving/session_bundle/oss/BUILD | 2 +- tensorflow_serving/sources/storage_path/BUILD | 2 +- tensorflow_serving/test_util/BUILD | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/tensorflow_serving/apis/BUILD b/tensorflow_serving/apis/BUILD index 34fda27e67c..b7f8206fefa 100644 --- a/tensorflow_serving/apis/BUILD +++ b/tensorflow_serving/apis/BUILD @@ -8,7 +8,7 @@ package( features = ["-layering_check"], ) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) filegroup( name = "all_files", diff --git a/tensorflow_serving/apis/internal/BUILD b/tensorflow_serving/apis/internal/BUILD index 6416d42000f..5c8ffbe9b8e 100644 --- a/tensorflow_serving/apis/internal/BUILD +++ b/tensorflow_serving/apis/internal/BUILD @@ -7,7 +7,7 @@ package( features = ["-layering_check"], ) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) load("//tensorflow_serving:serving.bzl", "serving_proto_library") diff --git a/tensorflow_serving/batching/BUILD b/tensorflow_serving/batching/BUILD index ae86ca146da..3ff1ea74fcd 100644 --- a/tensorflow_serving/batching/BUILD +++ b/tensorflow_serving/batching/BUILD @@ -5,7 +5,7 @@ package( features = ["-layering_check"], ) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) filegroup( name = "all_files", diff --git a/tensorflow_serving/batching/test_util/BUILD b/tensorflow_serving/batching/test_util/BUILD index eb9995b48fc..d8b380b3467 100644 --- a/tensorflow_serving/batching/test_util/BUILD +++ b/tensorflow_serving/batching/test_util/BUILD @@ -5,7 +5,7 @@ package( features = ["-layering_check"], ) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) filegroup( name = "all_files", diff --git a/tensorflow_serving/batching/testdata/BUILD b/tensorflow_serving/batching/testdata/BUILD index a33d0e732da..5cecf582ef8 100644 --- a/tensorflow_serving/batching/testdata/BUILD +++ b/tensorflow_serving/batching/testdata/BUILD @@ -5,7 +5,7 @@ package( features = ["-layering_check"], ) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) filegroup( name = "matrix_half_plus_two", diff --git a/tensorflow_serving/config/BUILD b/tensorflow_serving/config/BUILD index 8d3a2139ac2..46f75949385 100644 --- a/tensorflow_serving/config/BUILD +++ b/tensorflow_serving/config/BUILD @@ -5,7 +5,7 @@ package( features = ["-layering_check"], ) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) filegroup( name = "all_files", diff --git a/tensorflow_serving/core/BUILD b/tensorflow_serving/core/BUILD index 9a8eac4a774..f46cc18a5ec 100644 --- a/tensorflow_serving/core/BUILD +++ b/tensorflow_serving/core/BUILD @@ -7,7 +7,7 @@ package( features = ["-layering_check"], ) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) filegroup( name = "all_files", diff --git a/tensorflow_serving/core/test_util/BUILD b/tensorflow_serving/core/test_util/BUILD index f90637f1434..e2634f38621 100644 --- a/tensorflow_serving/core/test_util/BUILD +++ b/tensorflow_serving/core/test_util/BUILD @@ -9,7 +9,7 @@ package( features = ["-layering_check"], ) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) filegroup( name = "all_files", diff --git a/tensorflow_serving/example/BUILD b/tensorflow_serving/example/BUILD index b6beae6c47c..3ea144f96fe 100644 --- a/tensorflow_serving/example/BUILD +++ b/tensorflow_serving/example/BUILD @@ -5,7 +5,7 @@ package( features = ["no_layering_check"], ) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) filegroup( name = "all_files", diff --git a/tensorflow_serving/model_servers/BUILD b/tensorflow_serving/model_servers/BUILD index 179d6e205f1..a4989120d19 100644 --- a/tensorflow_serving/model_servers/BUILD +++ b/tensorflow_serving/model_servers/BUILD @@ -12,7 +12,7 @@ package( features = ["-layering_check"], ) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) # Visibility group for clients that link in custom ops, while using the # vanilla TensorFlow ModelServer without any other modifications. Exclusively diff --git a/tensorflow_serving/model_servers/test_util/BUILD b/tensorflow_serving/model_servers/test_util/BUILD index a2d37ebd7d1..0596d4d0ecb 100644 --- a/tensorflow_serving/model_servers/test_util/BUILD +++ b/tensorflow_serving/model_servers/test_util/BUILD @@ -10,7 +10,7 @@ package( features = ["-layering_check"], ) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) filegroup( name = "all_files", diff --git a/tensorflow_serving/resources/BUILD b/tensorflow_serving/resources/BUILD index 9f7f1af4694..d12e83386ed 100644 --- a/tensorflow_serving/resources/BUILD +++ b/tensorflow_serving/resources/BUILD @@ -7,7 +7,7 @@ package( features = ["-layering_check"], ) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) filegroup( name = "all_files", diff --git a/tensorflow_serving/servables/hashmap/BUILD b/tensorflow_serving/servables/hashmap/BUILD index bd0b4880893..170150cbadf 100644 --- a/tensorflow_serving/servables/hashmap/BUILD +++ b/tensorflow_serving/servables/hashmap/BUILD @@ -7,7 +7,7 @@ package( features = ["-layering_check"], ) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) filegroup( name = "all_files", diff --git a/tensorflow_serving/servables/tensorflow/BUILD b/tensorflow_serving/servables/tensorflow/BUILD index 74481e40d8f..52b90a29eff 100644 --- a/tensorflow_serving/servables/tensorflow/BUILD +++ b/tensorflow_serving/servables/tensorflow/BUILD @@ -10,7 +10,7 @@ package( features = ["-layering_check"], ) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) filegroup( name = "all_files", diff --git a/tensorflow_serving/servables/tensorflow/test_util/BUILD b/tensorflow_serving/servables/tensorflow/test_util/BUILD index ca083c1b1ac..9923cf12c41 100644 --- a/tensorflow_serving/servables/tensorflow/test_util/BUILD +++ b/tensorflow_serving/servables/tensorflow/test_util/BUILD @@ -2,7 +2,7 @@ load("//tensorflow_serving:serving.bzl", "serving_proto_library") -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) serving_proto_library( name = "fake_thread_pool_factory_proto", diff --git a/tensorflow_serving/servables/tensorflow/testdata/BUILD b/tensorflow_serving/servables/tensorflow/testdata/BUILD index b395caad1b5..f678cda414f 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/BUILD +++ b/tensorflow_serving/servables/tensorflow/testdata/BUILD @@ -10,7 +10,7 @@ package( ], ) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) exports_files( [ diff --git a/tensorflow_serving/session_bundle/BUILD b/tensorflow_serving/session_bundle/BUILD index 84cad535bf6..f21371cc27e 100644 --- a/tensorflow_serving/session_bundle/BUILD +++ b/tensorflow_serving/session_bundle/BUILD @@ -1,6 +1,6 @@ load("//tensorflow_serving:oss_or_google.bzl", "if_google", "if_oss") -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) package( default_visibility = [ diff --git a/tensorflow_serving/session_bundle/oss/BUILD b/tensorflow_serving/session_bundle/oss/BUILD index 6dfd841af88..02becf99fb5 100644 --- a/tensorflow_serving/session_bundle/oss/BUILD +++ b/tensorflow_serving/session_bundle/oss/BUILD @@ -1,7 +1,7 @@ load("@org_tensorflow//tensorflow/core/platform:build_config.bzl", "tf_proto_library") load("//tensorflow_serving:oss_or_google.bzl", "oss_only_cc_test") -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) package( default_visibility = [ diff --git a/tensorflow_serving/sources/storage_path/BUILD b/tensorflow_serving/sources/storage_path/BUILD index 9f21e96a3e3..4996a6d182e 100644 --- a/tensorflow_serving/sources/storage_path/BUILD +++ b/tensorflow_serving/sources/storage_path/BUILD @@ -9,7 +9,7 @@ package( features = ["-layering_check"], ) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) filegroup( name = "all_files", diff --git a/tensorflow_serving/test_util/BUILD b/tensorflow_serving/test_util/BUILD index 0e6cfd5d4de..5bb5390eb41 100644 --- a/tensorflow_serving/test_util/BUILD +++ b/tensorflow_serving/test_util/BUILD @@ -4,7 +4,7 @@ package(default_visibility = [ "//tensorflow_serving:internal", ]) -licenses(["notice"]) # Apache 2.0 +licenses(["notice"]) filegroup( name = "all_files", From 9d69f52d6de919f61f0ae9b1daec5897743b8fe3 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 29 Aug 2022 12:01:26 -0700 Subject: [PATCH 6174/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/1a19b207-7237-4015-93e7-0f1171583c73 PiperOrigin-RevId: 470779515 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index fa1c9619262..f5cb6516462 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "0c270bdf52f360befc6148be2a140375e2e1b83411923a3c1018f6f6d515087e", - git_commit = "f39e108822366b81b9c26d03351c2684099a2bc6", + sha256 = "7fe38b344c1b2bbf3fab5824ae516d049ffff7e8f8b9df239b1e385ad15f16cb", + git_commit = "9f2210fe3325e7b3b11a7d5c692bcb86793c3800", ) # Import all of TensorFlow Serving's external dependencies. From 894d60601fc6c6c37a3f32da56230a64f5c35504 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 29 Aug 2022 18:01:27 -0700 Subject: [PATCH 6175/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8503580f-2ecf-4048-879e-44d51d3fb4dd PiperOrigin-RevId: 470861932 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f5cb6516462..3566ba584a4 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "7fe38b344c1b2bbf3fab5824ae516d049ffff7e8f8b9df239b1e385ad15f16cb", - git_commit = "9f2210fe3325e7b3b11a7d5c692bcb86793c3800", + sha256 = "c022c7a9a1a718f3feaae2f336cdd84034e6a34a647eb903ce7fdaa0ead8ea7b", + git_commit = "ce1834ae81c4669949a3cb046733fb6e2eabac46", ) # Import all of TensorFlow Serving's external dependencies. From 31204d664d4ff985a526dccfe1f13ffde113deb6 Mon Sep 17 00:00:00 2001 From: Robert Neale Date: Mon, 29 Aug 2022 23:23:27 -0700 Subject: [PATCH 6176/8103] Update TF Text to v2.8.2. PiperOrigin-RevId: 470906398 --- .../tf_text_regression/01/keras_metadata.pb | 2 +- .../tf_text_regression/01/saved_model.pb | Bin 4899007 -> 5935750 bytes .../variables/variables.data-00000-of-00001 | Bin 342 -> 708 bytes .../01/variables/variables.index | Bin 145 -> 145 bytes tensorflow_serving/workspace.bzl | 27 +- third_party/darts_clone/BUILD | 14 + third_party/sentencepiece/BUILD | 96 +++ third_party/sentencepiece/sentencepiece.patch | 808 ++++++++++++++++++ 8 files changed, 940 insertions(+), 7 deletions(-) create mode 100644 third_party/darts_clone/BUILD create mode 100644 third_party/sentencepiece/BUILD create mode 100644 third_party/sentencepiece/sentencepiece.patch diff --git a/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/keras_metadata.pb b/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/keras_metadata.pb index 3229f49919f..0f83d324709 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/keras_metadata.pb +++ b/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/keras_metadata.pb @@ -1,2 +1,2 @@ -ìroot"_tf_keras_model*Ì{"name": "tf_text_ops", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "must_restore_from_config": false, "class_name": "TfTextOps", "config": {"layer was saved without config": true}, "is_graph_network": false, "full_save_spec": {"class_name": "__tuple__", "items": [[{"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [1]}, "float32", "input_1"]}], {}]}, "save_spec": {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [1]}, "float32", "input_1"]}, "keras_version": "2.7.0", "backend": "tensorflow", "model_config": {"class_name": "TfTextOps"}}2 \ No newline at end of file +ìroot"_tf_keras_model*Ì{"name": "tf_text_ops", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "must_restore_from_config": false, "class_name": "TfTextOps", "config": {"layer was saved without config": true}, "is_graph_network": false, "full_save_spec": {"class_name": "__tuple__", "items": [[{"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [1]}, "float32", "input_1"]}], {}]}, "save_spec": {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [1]}, "float32", "input_1"]}, "keras_version": "2.8.0", "backend": "tensorflow", "model_config": {"class_name": "TfTextOps"}}2 \ No newline at end of file diff --git a/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/saved_model.pb b/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/saved_model.pb index f140107dbb58b413f5a636fe01cee317b474d6a6..b0e5bdfbd687908e003cf739c9ab91ffeebd9d55 100644 GIT binary patch delta 282786 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

seH}NnTr3%4;iWP!Lwj3HGK3zvQdp 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 U64Wn~yE{sR;9^S?t%pf8$ zF>%r9uDnmB-+OC5Ki$0GdkqO{)O%cWktVX>Ocq9A1a)c`;&eHAjNzO{nG7#VwdbxmOINOl%#g4 zOB*qj(G-AUUaC9EO~zgd#a^$h1dT#~HZ@8k>;V$)0Y5*(TO2@#x~y$*6r;Dw;TXC! z;KV7(RM_j&+$9S85K-rVhZE@0Fzoc1OE-I7@T?!4*E&w2Pq7W3J{1nafG&(|l=Iku zA+;V<=5*rm3W%mVAXuNuZU`faJ_(iP9~${y!LPCYrJq^o^7^>TpFJJ~SA`hk2*%X+ Q$`#tKs)|n#E5XtI0S!*hIRF3v delta 120 zcmX@YdX0(W0@DI7FF~%diJa*Md>m{-T*aB`d5I;ZMXAMHLR_R;8nR%HdnTa`> zRjEZ>3}CpHkxQC`W3nfsj1;F3TTWtSYEdy4HwTvxdv0n;QD$;6mplje + + #include "bpe_model_trainer.h" +-#include "third_party/absl/container/flat_hash_set.h" ++#include "absl/container/flat_hash_set.h" + #include "util.h" + + namespace sentencepiece { +diff --git a/src/bpe_model_trainer.h b/src/bpe_model_trainer.h +index e011a37..17f6e06 100644 +--- a/src/bpe_model_trainer.h ++++ b/src/bpe_model_trainer.h +@@ -20,7 +20,7 @@ + #include + + #include "sentencepiece_model.pb.h" +-#include "third_party/absl/container/flat_hash_map.h" ++#include "absl/container/flat_hash_map.h" + #include "trainer_interface.h" + + namespace sentencepiece { +diff --git a/src/bpe_model_trainer_test.cc b/src/bpe_model_trainer_test.cc +index 173eb9c..2a43c3a 100644 +--- a/src/bpe_model_trainer_test.cc ++++ b/src/bpe_model_trainer_test.cc +@@ -20,8 +20,8 @@ + #include "sentencepiece_processor.h" + #include "sentencepiece_trainer.h" + #include "testharness.h" +-#include "third_party/absl/strings/str_cat.h" +-#include "third_party/absl/strings/str_join.h" ++#include "absl/strings/str_cat.h" ++#include "absl/strings/str_join.h" + #include "util.h" + + namespace sentencepiece { +diff --git a/src/builder.cc b/src/builder.cc +index 378aaa0..1557a07 100644 +--- a/src/builder.cc ++++ b/src/builder.cc +@@ -18,10 +18,10 @@ + + #include "builder.h" + #include "filesystem.h" +-#include "third_party/absl/strings/str_join.h" +-#include "third_party/absl/strings/str_replace.h" +-#include "third_party/absl/strings/str_split.h" +-#include "third_party/absl/strings/strip.h" ++#include "absl/strings/str_join.h" ++#include "absl/strings/str_replace.h" ++#include "absl/strings/str_split.h" ++#include "absl/strings/strip.h" + + #ifdef ENABLE_NFKC_COMPILE + #include +@@ -36,7 +36,7 @@ + + #include "normalization_rule.h" + #include "normalizer.h" +-#include "third_party/darts_clone/darts.h" ++#include "include/darts.h" + #include "util.h" + + namespace sentencepiece { +diff --git a/src/builder.h b/src/builder.h +index 49d2884..289fab6 100644 +--- a/src/builder.h ++++ b/src/builder.h +@@ -22,7 +22,7 @@ + #include "common.h" + #include "sentencepiece_model.pb.h" + #include "sentencepiece_processor.h" +-#include "third_party/absl/strings/string_view.h" ++#include "absl/strings/string_view.h" + + namespace sentencepiece { + namespace normalizer { +diff --git a/src/builder_test.cc b/src/builder_test.cc +index 4acb7b3..1dee5c7 100644 +--- a/src/builder_test.cc ++++ b/src/builder_test.cc +@@ -18,7 +18,7 @@ + #include "normalizer.h" + #include "sentencepiece_trainer.h" + #include "testharness.h" +-#include "third_party/absl/strings/str_cat.h" ++#include "absl/strings/str_cat.h" + #include "util.h" + + namespace sentencepiece { +diff --git a/src/char_model_trainer_test.cc b/src/char_model_trainer_test.cc +index 8c2e4b7..e8b4979 100644 +--- a/src/char_model_trainer_test.cc ++++ b/src/char_model_trainer_test.cc +@@ -19,8 +19,8 @@ + #include "filesystem.h" + #include "sentencepiece_processor.h" + #include "testharness.h" +-#include "third_party/absl/strings/str_cat.h" +-#include "third_party/absl/strings/str_join.h" ++#include "absl/strings/str_cat.h" ++#include "absl/strings/str_join.h" + #include "util.h" + + namespace sentencepiece { +diff --git a/src/compile_charsmap_main.cc b/src/compile_charsmap_main.cc +index c5a5188..931028b 100644 +--- a/src/compile_charsmap_main.cc ++++ b/src/compile_charsmap_main.cc +@@ -22,8 +22,8 @@ + #include "filesystem.h" + #include "init.h" + #include "sentencepiece_processor.h" +-#include "third_party/absl/flags/flag.h" +-#include "third_party/absl/strings/string_view.h" ++#include "absl/flags/flag.h" ++#include "absl/strings/string_view.h" + + using sentencepiece::normalizer::Builder; + +diff --git a/src/error.cc b/src/error.cc +index a226d98..ab4675d 100644 +--- a/src/error.cc ++++ b/src/error.cc +@@ -20,8 +20,8 @@ + #ifdef _USE_EXTERNAL_ABSL + // Naive workaround to define minloglevel on external absl package. + // We want to define them in other cc file. +-#include "third_party/absl/flags/flag.h" +-#include "third_party/absl/flags/parse.h" ++#include "absl/flags/flag.h" ++#include "absl/flags/parse.h" + ABSL_FLAG(int32, minloglevel, 0, + "Messages logged at a lower level than this don't actually."); + #endif +diff --git a/src/filesystem.cc b/src/filesystem.cc +index 833c8f7..6a169d9 100644 +--- a/src/filesystem.cc ++++ b/src/filesystem.cc +@@ -15,7 +15,7 @@ + #include + + #include "filesystem.h" +-#include "third_party/absl/memory/memory.h" ++#include "absl/memory/memory.h" + #include "util.h" + + #if defined(OS_WIN) && defined(UNICODE) && defined(_UNICODE) +diff --git a/src/filesystem.h b/src/filesystem.h +index e572b4b..dbcce48 100644 +--- a/src/filesystem.h ++++ b/src/filesystem.h +@@ -23,7 +23,7 @@ + + #include "common.h" + #include "sentencepiece_processor.h" +-#include "third_party/absl/strings/string_view.h" ++#include "absl/strings/string_view.h" + + namespace sentencepiece { + namespace filesystem { +diff --git a/src/filesystem_test.cc b/src/filesystem_test.cc +index 790e756..39ece99 100644 +--- a/src/filesystem_test.cc ++++ b/src/filesystem_test.cc +@@ -14,7 +14,7 @@ + + #include "filesystem.h" + #include "testharness.h" +-#include "third_party/absl/strings/str_cat.h" ++#include "absl/strings/str_cat.h" + #include "util.h" + + namespace sentencepiece { +diff --git a/src/init.h b/src/init.h +index 090a2d9..acfda8a 100644 +--- a/src/init.h ++++ b/src/init.h +@@ -16,8 +16,8 @@ + #define INIT_H_ + + #include "common.h" +-#include "third_party/absl/flags/flag.h" +-#include "third_party/absl/flags/parse.h" ++#include "absl/flags/flag.h" ++#include "absl/flags/parse.h" + + ABSL_DECLARE_FLAG(int32, minloglevel); + +diff --git a/src/model_factory.cc b/src/model_factory.cc +index be99501..040c00c 100644 +--- a/src/model_factory.cc ++++ b/src/model_factory.cc +@@ -15,7 +15,7 @@ + #include "bpe_model.h" + #include "char_model.h" + #include "model_factory.h" +-#include "third_party/absl/memory/memory.h" ++#include "absl/memory/memory.h" + #include "unigram_model.h" + #include "word_model.h" + +diff --git a/src/model_interface.cc b/src/model_interface.cc +index c49be1e..22c6378 100644 +--- a/src/model_interface.cc ++++ b/src/model_interface.cc +@@ -16,8 +16,8 @@ + + #include "model_interface.h" + #include "sentencepiece_model.pb.h" +-#include "third_party/absl/memory/memory.h" +-#include "third_party/absl/strings/str_format.h" ++#include "absl/memory/memory.h" ++#include "absl/strings/str_format.h" + #include "util.h" + + namespace sentencepiece { +diff --git a/src/model_interface.h b/src/model_interface.h +index aef5b53..fc14257 100644 +--- a/src/model_interface.h ++++ b/src/model_interface.h +@@ -25,9 +25,9 @@ + #include "normalizer.h" + #include "sentencepiece_model.pb.h" + #include "sentencepiece_processor.h" +-#include "third_party/absl/container/flat_hash_map.h" +-#include "third_party/absl/strings/string_view.h" +-#include "third_party/darts_clone/darts.h" ++#include "absl/container/flat_hash_map.h" ++#include "absl/strings/string_view.h" ++#include "include/darts.h" + #include "util.h" + + namespace sentencepiece { +diff --git a/src/model_interface_test.cc b/src/model_interface_test.cc +index 69ee4e6..26a1e05 100644 +--- a/src/model_interface_test.cc ++++ b/src/model_interface_test.cc +@@ -15,7 +15,7 @@ + #include "model_factory.h" + #include "model_interface.h" + #include "testharness.h" +-#include "third_party/absl/container/flat_hash_map.h" ++#include "absl/container/flat_hash_map.h" + #include "util.h" + + namespace sentencepiece { +diff --git a/src/normalizer.cc b/src/normalizer.cc +index 100b875..1791bd1 100644 +--- a/src/normalizer.cc ++++ b/src/normalizer.cc +@@ -18,11 +18,11 @@ + #include + + #include "common.h" +-#include "third_party/absl/memory/memory.h" +-#include "third_party/absl/strings/match.h" +-#include "third_party/absl/strings/string_view.h" +-#include "third_party/absl/strings/strip.h" +-#include "third_party/darts_clone/darts.h" ++#include "absl/memory/memory.h" ++#include "absl/strings/match.h" ++#include "absl/strings/string_view.h" ++#include "absl/strings/strip.h" ++#include "include/darts.h" + #include "util.h" + + namespace sentencepiece { +diff --git a/src/normalizer.h b/src/normalizer.h +index 622bbd2..1326102 100644 +--- a/src/normalizer.h ++++ b/src/normalizer.h +@@ -24,8 +24,8 @@ + #include "common.h" + #include "sentencepiece_model.pb.h" + #include "sentencepiece_processor.h" +-#include "third_party/absl/strings/string_view.h" +-#include "third_party/darts_clone/darts.h" ++#include "absl/strings/string_view.h" ++#include "include/darts.h" + #include "util.h" + + namespace sentencepiece { +diff --git a/src/pretokenizer_for_training.cc b/src/pretokenizer_for_training.cc +index 049658e..8021511 100644 +--- a/src/pretokenizer_for_training.cc ++++ b/src/pretokenizer_for_training.cc +@@ -14,7 +14,7 @@ + #include + + #include "pretokenizer_for_training.h" +-#include "third_party/absl/strings/str_replace.h" ++#include "absl/strings/str_replace.h" + + namespace sentencepiece { + namespace pretokenizer { +diff --git a/src/pretokenizer_for_training.h b/src/pretokenizer_for_training.h +index 2d3bc82..38beaa6 100644 +--- a/src/pretokenizer_for_training.h ++++ b/src/pretokenizer_for_training.h +@@ -21,7 +21,7 @@ + #include "common.h" + #include "sentencepiece.pb.h" + #include "sentencepiece_processor.h" +-#include "third_party/absl/strings/string_view.h" ++#include "absl/strings/string_view.h" + + namespace sentencepiece { + namespace pretokenizer { +diff --git a/src/pretokenizer_for_training_test.cc b/src/pretokenizer_for_training_test.cc +index 80f4787..c559eb8 100644 +--- a/src/pretokenizer_for_training_test.cc ++++ b/src/pretokenizer_for_training_test.cc +@@ -13,7 +13,7 @@ + // limitations under the License.! + #include "pretokenizer_for_training.h" + #include "testharness.h" +-#include "third_party/absl/strings/str_cat.h" ++#include "absl/strings/str_cat.h" + #include "trainer_interface.h" + + namespace sentencepiece { +diff --git a/src/sentencepiece_processor.cc b/src/sentencepiece_processor.cc +index 1e4e7a0..1ff3990 100644 +--- a/src/sentencepiece_processor.cc ++++ b/src/sentencepiece_processor.cc +@@ -23,14 +23,14 @@ + #include "normalizer.h" + #include "sentencepiece.pb.h" + #include "sentencepiece_processor.h" +-#include "third_party/absl/memory/memory.h" +-#include "third_party/absl/strings/numbers.h" +-#include "third_party/absl/strings/str_cat.h" +-#include "third_party/absl/strings/str_join.h" +-#include "third_party/absl/strings/str_replace.h" +-#include "third_party/absl/strings/str_split.h" +-#include "third_party/absl/strings/string_view.h" +-#include "third_party/absl/strings/strip.h" ++#include "absl/memory/memory.h" ++#include "absl/strings/numbers.h" ++#include "absl/strings/str_cat.h" ++#include "absl/strings/str_join.h" ++#include "absl/strings/str_replace.h" ++#include "absl/strings/str_split.h" ++#include "absl/strings/string_view.h" ++#include "absl/strings/strip.h" + #include "unigram_model.h" + #include "util.h" + +diff --git a/src/sentencepiece_processor.h b/src/sentencepiece_processor.h +index e8bd5f5..e81ebbf 100644 +--- a/src/sentencepiece_processor.h ++++ b/src/sentencepiece_processor.h +@@ -22,7 +22,7 @@ + #include + + #if defined(_USE_INTERNAL_STRING_VIEW) +-#include "third_party/absl/strings/string_view.h" ++#include "absl/strings/string_view.h" + #elif defined(_USE_TF_STRING_VIEW) + #include "absl/strings/string_view.h" + #else +diff --git a/src/sentencepiece_processor_test.cc b/src/sentencepiece_processor_test.cc +index 373e73e..829c3d4 100644 +--- a/src/sentencepiece_processor_test.cc ++++ b/src/sentencepiece_processor_test.cc +@@ -23,10 +23,10 @@ + #include "sentencepiece_processor.h" + #include "sentencepiece_trainer.h" + #include "testharness.h" +-#include "third_party/absl/container/flat_hash_map.h" +-#include "third_party/absl/memory/memory.h" +-#include "third_party/absl/strings/str_cat.h" +-#include "third_party/absl/strings/string_view.h" ++#include "absl/container/flat_hash_map.h" ++#include "absl/memory/memory.h" ++#include "absl/strings/str_cat.h" ++#include "absl/strings/string_view.h" + #include "util.h" + + namespace sentencepiece { +diff --git a/src/sentencepiece_trainer.cc b/src/sentencepiece_trainer.cc +index b9fe64f..47ef33c 100644 +--- a/src/sentencepiece_trainer.cc ++++ b/src/sentencepiece_trainer.cc +@@ -22,12 +22,12 @@ + #include "sentencepiece_model.pb.h" + #include "sentencepiece_trainer.h" + #include "spec_parser.h" +-#include "third_party/absl/flags/flag.h" +-#include "third_party/absl/strings/numbers.h" +-#include "third_party/absl/strings/str_cat.h" +-#include "third_party/absl/strings/str_split.h" +-#include "third_party/absl/strings/string_view.h" +-#include "third_party/absl/strings/strip.h" ++#include "absl/flags/flag.h" ++#include "absl/strings/numbers.h" ++#include "absl/strings/str_cat.h" ++#include "absl/strings/str_split.h" ++#include "absl/strings/string_view.h" ++#include "absl/strings/strip.h" + #include "trainer_factory.h" + #include "util.h" + +diff --git a/src/sentencepiece_trainer_test.cc b/src/sentencepiece_trainer_test.cc +index e44e66b..fc73b1d 100644 +--- a/src/sentencepiece_trainer_test.cc ++++ b/src/sentencepiece_trainer_test.cc +@@ -16,7 +16,7 @@ + #include "sentencepiece_model.pb.h" + #include "sentencepiece_trainer.h" + #include "testharness.h" +-#include "third_party/absl/strings/str_cat.h" ++#include "absl/strings/str_cat.h" + #include "util.h" + + namespace sentencepiece { +diff --git a/src/spec_parser.h b/src/spec_parser.h +index 2c5a95b..263f2bd 100644 +--- a/src/spec_parser.h ++++ b/src/spec_parser.h +@@ -19,8 +19,8 @@ + #include + + #include "sentencepiece_processor.h" +-#include "third_party/absl/strings/ascii.h" +-#include "third_party/absl/strings/str_split.h" ++#include "absl/strings/ascii.h" ++#include "absl/strings/str_split.h" + #include "util.h" + + namespace sentencepiece { +diff --git a/src/spm_decode_main.cc b/src/spm_decode_main.cc +index 3382ddc..9dda65c 100644 +--- a/src/spm_decode_main.cc ++++ b/src/spm_decode_main.cc +@@ -21,8 +21,8 @@ + #include "init.h" + #include "sentencepiece.pb.h" + #include "sentencepiece_processor.h" +-#include "third_party/absl/flags/flag.h" +-#include "third_party/absl/strings/str_split.h" ++#include "absl/flags/flag.h" ++#include "absl/strings/str_split.h" + #include "util.h" + + ABSL_FLAG(std::string, model, "", "model file name"); +diff --git a/src/spm_encode_main.cc b/src/spm_encode_main.cc +index 4d12a38..29b7458 100644 +--- a/src/spm_encode_main.cc ++++ b/src/spm_encode_main.cc +@@ -21,10 +21,10 @@ + #include "init.h" + #include "sentencepiece.pb.h" + #include "sentencepiece_processor.h" +-#include "third_party/absl/container/flat_hash_map.h" +-#include "third_party/absl/flags/flag.h" +-#include "third_party/absl/strings/str_cat.h" +-#include "third_party/absl/strings/str_join.h" ++#include "absl/container/flat_hash_map.h" ++#include "absl/flags/flag.h" ++#include "absl/strings/str_cat.h" ++#include "absl/strings/str_join.h" + #include "trainer_interface.h" + + ABSL_FLAG(std::string, model, "", "model file name"); +diff --git a/src/spm_export_vocab_main.cc b/src/spm_export_vocab_main.cc +index b5d93cb..70a65c1 100644 +--- a/src/spm_export_vocab_main.cc ++++ b/src/spm_export_vocab_main.cc +@@ -20,7 +20,7 @@ + #include "init.h" + #include "sentencepiece_model.pb.h" + #include "sentencepiece_processor.h" +-#include "third_party/absl/flags/flag.h" ++#include "absl/flags/flag.h" + + ABSL_FLAG(std::string, output, "", "Output filename"); + ABSL_FLAG(std::string, model, "", "input model file name"); +diff --git a/src/spm_normalize_main.cc b/src/spm_normalize_main.cc +index 96da360..8c541b8 100644 +--- a/src/spm_normalize_main.cc ++++ b/src/spm_normalize_main.cc +@@ -21,7 +21,7 @@ + #include "sentencepiece_model.pb.h" + #include "sentencepiece_processor.h" + #include "sentencepiece_trainer.h" +-#include "third_party/absl/flags/flag.h" ++#include "absl/flags/flag.h" + + ABSL_FLAG(std::string, model, "", "Model file name"); + ABSL_FLAG(bool, use_internal_normalization, false, +diff --git a/src/spm_train_main.cc b/src/spm_train_main.cc +index baf8dbf..ba1e811 100644 +--- a/src/spm_train_main.cc ++++ b/src/spm_train_main.cc +@@ -18,10 +18,10 @@ + #include "init.h" + #include "sentencepiece_model.pb.h" + #include "sentencepiece_trainer.h" +-#include "third_party/absl/flags/flag.h" +-#include "third_party/absl/strings/ascii.h" +-#include "third_party/absl/strings/str_join.h" +-#include "third_party/absl/strings/str_split.h" ++#include "absl/flags/flag.h" ++#include "absl/strings/ascii.h" ++#include "absl/strings/str_join.h" ++#include "absl/strings/str_split.h" + #include "util.h" + + using sentencepiece::NormalizerSpec; +diff --git a/src/testharness.cc b/src/testharness.cc +index f6b1efe..daf2d14 100644 +--- a/src/testharness.cc ++++ b/src/testharness.cc +@@ -26,7 +26,7 @@ + #include + + #include "common.h" +-#include "third_party/absl/strings/str_cat.h" ++#include "absl/strings/str_cat.h" + #include "util.h" + + namespace sentencepiece { +diff --git a/src/testharness.h b/src/testharness.h +index 9879b06..98317ad 100644 +--- a/src/testharness.h ++++ b/src/testharness.h +@@ -21,9 +21,9 @@ + #include + + #include "common.h" +-#include "third_party/absl/flags/flag.h" +-#include "third_party/absl/flags/parse.h" +-#include "third_party/absl/strings/string_view.h" ++#include "absl/flags/flag.h" ++#include "absl/flags/parse.h" ++#include "absl/strings/string_view.h" + + ABSL_DECLARE_FLAG(std::string, test_tmpdir); + ABSL_DECLARE_FLAG(std::string, test_srcdir); +diff --git a/src/trainer_factory.cc b/src/trainer_factory.cc +index d1d2541..ff594d0 100644 +--- a/src/trainer_factory.cc ++++ b/src/trainer_factory.cc +@@ -14,7 +14,7 @@ + + #include "bpe_model_trainer.h" + #include "char_model_trainer.h" +-#include "third_party/absl/memory/memory.h" ++#include "absl/memory/memory.h" + #include "trainer_factory.h" + #include "unigram_model_trainer.h" + #include "word_model_trainer.h" +diff --git a/src/trainer_interface.cc b/src/trainer_interface.cc +index a3a4b74..70f2f72 100644 +--- a/src/trainer_interface.cc ++++ b/src/trainer_interface.cc +@@ -26,13 +26,13 @@ + #include "normalizer.h" + #include "sentencepiece_processor.h" + #include "sentencepiece_trainer.h" +-#include "third_party/absl/container/flat_hash_map.h" +-#include "third_party/absl/memory/memory.h" +-#include "third_party/absl/strings/numbers.h" +-#include "third_party/absl/strings/str_cat.h" +-#include "third_party/absl/strings/str_format.h" +-#include "third_party/absl/strings/str_join.h" +-#include "third_party/absl/strings/str_split.h" ++#include "absl/container/flat_hash_map.h" ++#include "absl/memory/memory.h" ++#include "absl/strings/numbers.h" ++#include "absl/strings/str_cat.h" ++#include "absl/strings/str_format.h" ++#include "absl/strings/str_join.h" ++#include "absl/strings/str_split.h" + #include "trainer_interface.h" + #include "unicode_script.h" + #include "util.h" +diff --git a/src/trainer_interface.h b/src/trainer_interface.h +index f66d59a..8a654ec 100644 +--- a/src/trainer_interface.h ++++ b/src/trainer_interface.h +@@ -27,7 +27,7 @@ + #include "sentencepiece_model.pb.h" + #include "sentencepiece_processor.h" + #include "sentencepiece_trainer.h" +-#include "third_party/absl/container/flat_hash_map.h" ++#include "absl/container/flat_hash_map.h" + #include "util.h" + + namespace sentencepiece { +diff --git a/src/trainer_interface_test.cc b/src/trainer_interface_test.cc +index 70a51ad..d7f3f0c 100644 +--- a/src/trainer_interface_test.cc ++++ b/src/trainer_interface_test.cc +@@ -16,8 +16,8 @@ + + #include "filesystem.h" + #include "testharness.h" +-#include "third_party/absl/strings/str_cat.h" +-#include "third_party/absl/strings/str_format.h" ++#include "absl/strings/str_cat.h" ++#include "absl/strings/str_format.h" + #include "trainer_interface.h" + #include "util.h" + +diff --git a/src/unicode_script.cc b/src/unicode_script.cc +index 583dc30..11b24dc 100644 +--- a/src/unicode_script.cc ++++ b/src/unicode_script.cc +@@ -14,7 +14,7 @@ + + #include + +-#include "third_party/absl/container/flat_hash_map.h" ++#include "absl/container/flat_hash_map.h" + #include "unicode_script.h" + #include "unicode_script_map.h" + #include "util.h" +diff --git a/src/unicode_script_map.h b/src/unicode_script_map.h +index f2e67e9..f1b8299 100644 +--- a/src/unicode_script_map.h ++++ b/src/unicode_script_map.h +@@ -14,7 +14,7 @@ + + #ifndef UNICODE_SCRIPT_DATA_H_ + #define UNICODE_SCRIPT_DATA_H_ +-#include "third_party/absl/container/flat_hash_map.h" ++#include "absl/container/flat_hash_map.h" + namespace sentencepiece { + namespace unicode_script { + namespace { +diff --git a/src/unicode_script_test.cc b/src/unicode_script_test.cc +index ab33565..e0b1c4d 100644 +--- a/src/unicode_script_test.cc ++++ b/src/unicode_script_test.cc +@@ -14,7 +14,7 @@ + + #include "common.h" + #include "testharness.h" +-#include "third_party/absl/strings/string_view.h" ++#include "absl/strings/string_view.h" + #include "unicode_script.h" + #include "util.h" + +diff --git a/src/unigram_model.cc b/src/unigram_model.cc +index 3b99060..9c72fb9 100644 +--- a/src/unigram_model.cc ++++ b/src/unigram_model.cc +@@ -22,9 +22,9 @@ + #include + #include + +-#include "third_party/absl/memory/memory.h" +-#include "third_party/absl/strings/str_split.h" +-#include "third_party/absl/strings/string_view.h" ++#include "absl/memory/memory.h" ++#include "absl/strings/str_split.h" ++#include "absl/strings/string_view.h" + #include "unigram_model.h" + #include "util.h" + +diff --git a/src/unigram_model.h b/src/unigram_model.h +index 448e489..9062f12 100644 +--- a/src/unigram_model.h ++++ b/src/unigram_model.h +@@ -24,7 +24,7 @@ + #include "freelist.h" + #include "model_interface.h" + #include "sentencepiece_model.pb.h" +-#include "third_party/darts_clone/darts.h" ++#include "include/darts.h" + + namespace sentencepiece { + namespace unigram { +diff --git a/src/unigram_model_test.cc b/src/unigram_model_test.cc +index f93b21c..808e907 100644 +--- a/src/unigram_model_test.cc ++++ b/src/unigram_model_test.cc +@@ -22,8 +22,8 @@ + #include "sentencepiece_model.pb.h" + #include "sentencepiece_processor.h" + #include "testharness.h" +-#include "third_party/absl/strings/str_cat.h" +-#include "third_party/absl/strings/str_join.h" ++#include "absl/strings/str_cat.h" ++#include "absl/strings/str_join.h" + #include "util.h" + + namespace sentencepiece { +diff --git a/src/unigram_model_trainer.cc b/src/unigram_model_trainer.cc +index 9615040..373ec95 100644 +--- a/src/unigram_model_trainer.cc ++++ b/src/unigram_model_trainer.cc +@@ -25,8 +25,8 @@ + #include "normalizer.h" + #include "pretokenizer_for_training.h" + #include "sentencepiece_trainer.h" +-#include "third_party/absl/container/flat_hash_map.h" +-#include "third_party/absl/memory/memory.h" ++#include "absl/container/flat_hash_map.h" ++#include "absl/memory/memory.h" + #include "third_party/esaxx/esa.hxx" // Suffix array library. + #include "unicode_script.h" + #include "unigram_model_trainer.h" +diff --git a/src/unigram_model_trainer.h b/src/unigram_model_trainer.h +index 91fbeb4..f2d6b36 100644 +--- a/src/unigram_model_trainer.h ++++ b/src/unigram_model_trainer.h +@@ -21,7 +21,7 @@ + #include + + #include "sentencepiece_model.pb.h" +-#include "third_party/absl/strings/string_view.h" ++#include "absl/strings/string_view.h" + #include "trainer_interface.h" + #include "unigram_model.h" + #include "util.h" +diff --git a/src/unigram_model_trainer_test.cc b/src/unigram_model_trainer_test.cc +index ffe515e..fdb25f6 100644 +--- a/src/unigram_model_trainer_test.cc ++++ b/src/unigram_model_trainer_test.cc +@@ -16,8 +16,8 @@ + #include "sentencepiece_processor.h" + #include "sentencepiece_trainer.h" + #include "testharness.h" +-#include "third_party/absl/strings/str_cat.h" +-#include "third_party/absl/strings/str_join.h" ++#include "absl/strings/str_cat.h" ++#include "absl/strings/str_join.h" + #include "unigram_model_trainer.h" + #include "util.h" + +diff --git a/src/util.h b/src/util.h +index 0d15863..d4a2d51 100644 +--- a/src/util.h ++++ b/src/util.h +@@ -30,7 +30,7 @@ + + #include "common.h" + #include "sentencepiece_processor.h" +-#include "third_party/absl/strings/string_view.h" ++#include "absl/strings/string_view.h" + + #ifdef SPM_NO_THREADLOCAL + #include +diff --git a/src/util_test.cc b/src/util_test.cc +index 71d006f..231fc96 100644 +--- a/src/util_test.cc ++++ b/src/util_test.cc +@@ -16,7 +16,7 @@ + + #include "filesystem.h" + #include "testharness.h" +-#include "third_party/absl/strings/str_cat.h" ++#include "absl/strings/str_cat.h" + #include "util.h" + + namespace sentencepiece { +diff --git a/src/word_model_trainer.cc b/src/word_model_trainer.cc +index 0b8b062..b057843 100644 +--- a/src/word_model_trainer.cc ++++ b/src/word_model_trainer.cc +@@ -15,8 +15,8 @@ + #include + #include + +-#include "third_party/absl/container/flat_hash_map.h" +-#include "third_party/absl/strings/string_view.h" ++#include "absl/container/flat_hash_map.h" ++#include "absl/strings/string_view.h" + #include "util.h" + #include "word_model.h" + #include "word_model_trainer.h" +diff --git a/src/word_model_trainer_test.cc b/src/word_model_trainer_test.cc +index c4a8bc6..366810f 100644 +--- a/src/word_model_trainer_test.cc ++++ b/src/word_model_trainer_test.cc +@@ -18,8 +18,8 @@ + #include "filesystem.h" + #include "sentencepiece_processor.h" + #include "testharness.h" +-#include "third_party/absl/strings/str_cat.h" +-#include "third_party/absl/strings/str_join.h" ++#include "absl/strings/str_cat.h" ++#include "absl/strings/str_join.h" + #include "util.h" + #include "word_model_trainer.h" + From 03728612b20d69807e304dd043b62013a727100c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 30 Aug 2022 00:01:31 -0700 Subject: [PATCH 6177/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/d8f65b77-dea7-43f0-9ff7-cdd3f8f14b03 PiperOrigin-RevId: 470910910 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 3566ba584a4..616bb709678 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "c022c7a9a1a718f3feaae2f336cdd84034e6a34a647eb903ce7fdaa0ead8ea7b", - git_commit = "ce1834ae81c4669949a3cb046733fb6e2eabac46", + sha256 = "05b4d3e4f7db7b1f8c85f18dbb2f58181c0b29c15a26097137bc11657a891ef0", + git_commit = "578db14cdbff78cfdb0911ca298975fcb5a923bf", ) # Import all of TensorFlow Serving's external dependencies. From 850f8ce17363d5faa66ee8855c773529c4b6ae55 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 30 Aug 2022 06:01:27 -0700 Subject: [PATCH 6178/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/2e287c71-9942-41b4-bcd9-8fac5c238e72 PiperOrigin-RevId: 470968088 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 616bb709678..a6a47046623 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "05b4d3e4f7db7b1f8c85f18dbb2f58181c0b29c15a26097137bc11657a891ef0", - git_commit = "578db14cdbff78cfdb0911ca298975fcb5a923bf", + sha256 = "843a7863363a93592485a108bd17420915b9a76bb55ce47b84acbc9c141cc4a6", + git_commit = "1779838c30099fc451f5554dcfaa5086e05e505a", ) # Import all of TensorFlow Serving's external dependencies. From 982a7b8e0ce4a829eedde87661cff31e169b978e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 30 Aug 2022 12:01:27 -0700 Subject: [PATCH 6179/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/66fd603e-8509-4ce0-89aa-49602b244014 PiperOrigin-RevId: 471054212 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a6a47046623..4a86248a55a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "843a7863363a93592485a108bd17420915b9a76bb55ce47b84acbc9c141cc4a6", - git_commit = "1779838c30099fc451f5554dcfaa5086e05e505a", + sha256 = "944805944adde7f73379347d559ddce50826cf9de863094f14ff05ec4533efe0", + git_commit = "66a194f8a9744925fa939abfbc1202773f55c72a", ) # Import all of TensorFlow Serving's external dependencies. From 776aed989ec8a7c59d80bc3f6c21ca3b674d22ae Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 30 Aug 2022 18:04:34 -0700 Subject: [PATCH 6180/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/412b7aa6-f894-4e81-8fd3-fe8cd7927442 PiperOrigin-RevId: 471136591 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 4a86248a55a..82deee707a1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "944805944adde7f73379347d559ddce50826cf9de863094f14ff05ec4533efe0", - git_commit = "66a194f8a9744925fa939abfbc1202773f55c72a", + sha256 = "b93c77d6e1232e7e5801d1448b1cfb85d498016ab8eecca53c3bad6edfdc0f2d", + git_commit = "08f9615e225b834d1cec8be9456e2ccad7d90937", ) # Import all of TensorFlow Serving's external dependencies. From a2a165c499a5a9a90e89660349439b944aa48ea6 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 31 Aug 2022 00:01:34 -0700 Subject: [PATCH 6181/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/781b4968-98f6-4291-ba70-c3c356bdfc28 PiperOrigin-RevId: 471183532 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 82deee707a1..22679252ce1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b93c77d6e1232e7e5801d1448b1cfb85d498016ab8eecca53c3bad6edfdc0f2d", - git_commit = "08f9615e225b834d1cec8be9456e2ccad7d90937", + sha256 = "b1bf03030c1d92953d5ae1b48dd565d4a9abc81c43a2249102ebddbb10e336e2", + git_commit = "b938435e775149f99d896ced9f1a5d8268eae929", ) # Import all of TensorFlow Serving's external dependencies. From fea6d9d66d512b243dbeca36bcf08d52175d2687 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 31 Aug 2022 06:01:36 -0700 Subject: [PATCH 6182/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/14eeedbd-72db-4c19-b0f7-47d459c49151 PiperOrigin-RevId: 471236524 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 22679252ce1..b563bc5c85b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "b1bf03030c1d92953d5ae1b48dd565d4a9abc81c43a2249102ebddbb10e336e2", - git_commit = "b938435e775149f99d896ced9f1a5d8268eae929", + sha256 = "47bad82750f88850858b7e7123e6609315d93154db6ea708402fd66aedd5aff5", + git_commit = "4af0f9d36bfdaa3bb34f7cddf26d93c7cc611788", ) # Import all of TensorFlow Serving's external dependencies. From 4ed7c5c30d0be43254a1177e8488675dc60d0384 Mon Sep 17 00:00:00 2001 From: Roman Dzhabarov Date: Wed, 31 Aug 2022 11:24:21 -0700 Subject: [PATCH 6183/8103] Replace tensorflow/core/lib/core/blocking_counter in favor of the one from tensorflow/platform. PiperOrigin-RevId: 471304071 --- tensorflow_serving/core/BUILD | 1 + tensorflow_serving/core/basic_manager_test.cc | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/tensorflow_serving/core/BUILD b/tensorflow_serving/core/BUILD index f46cc18a5ec..996f044aa48 100644 --- a/tensorflow_serving/core/BUILD +++ b/tensorflow_serving/core/BUILD @@ -508,6 +508,7 @@ cc_test( "@org_tensorflow//tensorflow/core:lib", "@org_tensorflow//tensorflow/core:protos_all_cc", "@org_tensorflow//tensorflow/core:test", + "@org_tensorflow//tensorflow/core/platform:blocking_counter", ], ) diff --git a/tensorflow_serving/core/basic_manager_test.cc b/tensorflow_serving/core/basic_manager_test.cc index a3c527cee4a..e537979945c 100644 --- a/tensorflow_serving/core/basic_manager_test.cc +++ b/tensorflow_serving/core/basic_manager_test.cc @@ -21,10 +21,10 @@ limitations under the License. #include #include #include "absl/types/optional.h" -#include "tensorflow/core/lib/core/blocking_counter.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/lib/core/status_test_util.h" #include "tensorflow/core/lib/strings/strcat.h" +#include "tensorflow/core/platform/blocking_counter.h" #include "tensorflow/core/platform/null_file_system.h" #include "tensorflow/core/protobuf/error_codes.pb.h" #include "tensorflow_serving/core/servable_state_monitor.h" From cc60ab05c8fdddacbbd80861c259ecd176f38dd7 Mon Sep 17 00:00:00 2001 From: Raviteja Gorijala Date: Wed, 31 Aug 2022 11:39:29 -0700 Subject: [PATCH 6184/8103] Add release notes for tf-serving 2.10.0-rc3 PiperOrigin-RevId: 471308427 --- RELEASE.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/RELEASE.md b/RELEASE.md index 91d45eb10ea..1408be46e5c 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,3 +1,17 @@ +# Release 2.10.0-rc3 + +## Major Features and Improvements + +* No major features or improvements. + +## Breaking Changes + +* No breaking changes + +## Bug Fixes and Other Changes + +* This release is based on TF version 2.10.0-rc3 + # Release 2.10.0-rc2 ## Major Features and Improvements From 08c7a2321f29797608d8f239cd0924325e0c3510 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 31 Aug 2022 12:01:40 -0700 Subject: [PATCH 6185/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/00699a73-c455-4953-9a65-ef1c8a275d83 PiperOrigin-RevId: 471313912 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b563bc5c85b..c2c43a79389 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "47bad82750f88850858b7e7123e6609315d93154db6ea708402fd66aedd5aff5", - git_commit = "4af0f9d36bfdaa3bb34f7cddf26d93c7cc611788", + sha256 = "f64c6e15f941eac171fac1eb900d915288b6852a5aaecba122bfa1f50d739e1b", + git_commit = "41bdbd39e756f0a2d4e6c11fe0d2f197fe58b10e", ) # Import all of TensorFlow Serving's external dependencies. From c7afb99de1dd46828bf79e9107072793f1b07154 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 31 Aug 2022 18:01:31 -0700 Subject: [PATCH 6186/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/06d5f14b-1f3f-404a-a59b-6ea06bdc913f PiperOrigin-RevId: 471402753 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index c2c43a79389..195bf9548e1 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "f64c6e15f941eac171fac1eb900d915288b6852a5aaecba122bfa1f50d739e1b", - git_commit = "41bdbd39e756f0a2d4e6c11fe0d2f197fe58b10e", + sha256 = "bce9e79784932e5a9af652f6281a95d57743618bbec377235138f0b11e27762e", + git_commit = "7cacfe3e13177234944244501d2db39c45f158a0", ) # Import all of TensorFlow Serving's external dependencies. From 342ec71cca6d1c35c9e8d1c8559e5c08443b9170 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 1 Sep 2022 00:01:43 -0700 Subject: [PATCH 6187/8103] Updating TensorFlow to latest passing continuous build. Build status: https://source.cloud.google.com/results/invocations/8b0ed630-bb03-413e-9a21-25d9fb4a8157 PiperOrigin-RevId: 471452399 --- WORKSPACE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 195bf9548e1..f39e930d284 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ workspace(name = "tf_serving") load("//tensorflow_serving:repo.bzl", "tensorflow_http_archive") tensorflow_http_archive( name = "org_tensorflow", - sha256 = "bce9e79784932e5a9af652f6281a95d57743618bbec377235138f0b11e27762e", - git_commit = "7cacfe3e13177234944244501d2db39c45f158a0", + sha256 = "1e06787cb97daaa6e7ef57af102b91a92107b9b38e2dd07468a26cf9b597ccfb", + git_commit = "4ca77ebe3eb0275a54954b27b0e8af78be4473cf", ) # Import all of TensorFlow Serving's external dependencies. From e88506ab6709f2dc3a3bb1601ac4b84c23025611 Mon Sep 17 00:00:00 2001 From: Robert Neale Date: Thu, 1 Sep 2022 00:56:57 -0700 Subject: [PATCH 6188/8103] Update TF Text to v2.9.0. PiperOrigin-RevId: 471460731 --- .../tf_text_regression/01/keras_metadata.pb | 2 +- .../tf_text_regression/01/saved_model.pb | Bin 5935750 -> 6135983 bytes .../variables/variables.data-00000-of-00001 | Bin 708 -> 810 bytes .../01/variables/variables.index | Bin 145 -> 145 bytes tensorflow_serving/workspace.bzl | 6 +++--- third_party/tf_text/tftext.patch | 17 ++++++++++++++--- 6 files changed, 18 insertions(+), 7 deletions(-) diff --git a/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/keras_metadata.pb b/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/keras_metadata.pb index 0f83d324709..ff6889e4926 100644 --- a/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/keras_metadata.pb +++ b/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/keras_metadata.pb @@ -1,2 +1,2 @@ -ìroot"_tf_keras_model*Ì{"name": "tf_text_ops", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "must_restore_from_config": false, "class_name": "TfTextOps", "config": {"layer was saved without config": true}, "is_graph_network": false, "full_save_spec": {"class_name": "__tuple__", "items": [[{"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [1]}, "float32", "input_1"]}], {}]}, "save_spec": {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [1]}, "float32", "input_1"]}, "keras_version": "2.8.0", "backend": "tensorflow", "model_config": {"class_name": "TfTextOps"}}2 \ No newline at end of file +ëroot"_tf_keras_model*Ë{"name": "tf_text_ops", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "must_restore_from_config": false, "class_name": "TfTextOps", "config": {}, "shared_object_id": 0, "is_graph_network": false, "full_save_spec": {"class_name": "__tuple__", "items": [[{"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [1]}, "float32", "input_1"]}], {}]}, "save_spec": {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [1]}, "float32", "input_1"]}, "keras_version": "2.9.0", "backend": "tensorflow", "model_config": {"class_name": "TfTextOps", "config": {}}}2 \ No newline at end of file diff --git a/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/saved_model.pb b/tensorflow_serving/servables/tensorflow/testdata/tf_text_regression/01/saved_model.pb index b0e5bdfbd687908e003cf739c9ab91ffeebd9d55..bcfd8db8995fafa5fef9dc4bdaf2ab3aa43f0492 100644 GIT binary patch delta 1012643 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%0Dtxz7Aw%PxARyloXVH|7RZ4cr}*xNOi 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

-(Fm&0gK*zbjyK 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 z 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